From 6dea8eca5899c97b5c774ff238f08bac1524a4a1 Mon Sep 17 00:00:00 2001 From: Eduard Kuzmenko Date: Fri, 6 Jan 2023 23:41:03 +0400 Subject: [PATCH] Build --- .env | 6 +++--- CHANGELOG.md | 17 +++++++++++++++++ CHANGELOG_ru.md | 17 +++++++++++++++++ public/104.3793e2da2f88ac72ffd9.chunk.js | 2 ++ public/104.3793e2da2f88ac72ffd9.chunk.js.map | 1 + public/104.d9383d4cf03fc631a3a9.chunk.js | 2 -- public/104.d9383d4cf03fc631a3a9.chunk.js.map | 1 - ...unk.js => 231.2cf58745476f33d0c32c.chunk.js} | 2 +- ...ap => 231.2cf58745476f33d0c32c.chunk.js.map} | 2 +- public/301.a3f22008d452affb1ae4.chunk.js.map | 1 - ...unk.js => 301.dc3c5a315285fe24ebd3.chunk.js} | 4 ++-- public/301.dc3c5a315285fe24ebd3.chunk.js.map | 1 + public/333.d7addf177783fe16e44c.chunk.js | 2 ++ public/333.d7addf177783fe16e44c.chunk.js.map | 1 + public/339.0bedc53e7de2dd388b2b.chunk.js | 2 ++ public/339.0bedc53e7de2dd388b2b.chunk.js.map | 1 + public/339.764b22e455094abfa43f.chunk.js | 2 -- public/339.764b22e455094abfa43f.chunk.js.map | 1 - public/392.e76a95678644d519b180.chunk.js | 2 ++ public/392.e76a95678644d519b180.chunk.js.map | 1 + public/392.eb2cde6a1063177ee3ad.chunk.js | 2 -- public/392.eb2cde6a1063177ee3ad.chunk.js.map | 1 - public/408.03880fedecb1e421da3b.chunk.js | 2 -- public/408.03880fedecb1e421da3b.chunk.js.map | 1 - ...unk.js => 436.4f0c85770e373a7fe5e5.chunk.js} | 4 ++-- public/436.4f0c85770e373a7fe5e5.chunk.js.map | 1 + public/436.a3c8c35b715fcb7c4d9f.chunk.js.map | 1 - public/437.77e92ccb32c21ff43a10.bundle.js | 2 -- public/437.77e92ccb32c21ff43a10.bundle.js.map | 1 - public/437.a80d805671a4b222696d.bundle.js | 2 ++ public/437.a80d805671a4b222696d.bundle.js.map | 1 + ...unk.js => 442.7c9b38d200f56e7d3245.chunk.js} | 2 +- public/442.7c9b38d200f56e7d3245.chunk.js.map | 1 + public/442.aee5aa5c25ff95c14b4d.chunk.js.map | 1 - public/508.648a1c3659fa38d09b83.chunk.js.map | 1 - ...unk.js => 508.c1aa5baee5227e17c016.chunk.js} | 2 +- public/508.c1aa5baee5227e17c016.chunk.js.map | 1 + public/51.015549e15aab2a59d3a0.chunk.js | 2 -- public/51.015549e15aab2a59d3a0.chunk.js.map | 1 - public/53.1619c547150ac620cdca.chunk.js | 2 ++ public/53.1619c547150ac620cdca.chunk.js.map | 1 + public/53.3829958682207da0768c.chunk.js | 2 -- public/53.3829958682207da0768c.chunk.js.map | 1 - public/567.2a93821ac1dd3216f099.chunk.js | 2 ++ public/567.2a93821ac1dd3216f099.chunk.js.map | 1 + public/570.d4798b741257c891cc8b.bundle.js | 2 -- public/570.d4798b741257c891cc8b.bundle.js.map | 1 - ...hunk.js => 61.b0e6e1510d2c80059b20.chunk.js} | 2 +- ...map => 61.b0e6e1510d2c80059b20.chunk.js.map} | 2 +- public/63.8c6c3aa1f4320cc408dd.chunk.js | 2 ++ public/63.8c6c3aa1f4320cc408dd.chunk.js.map | 1 + public/63.f3beda66b31880abf426.chunk.js | 2 -- public/63.f3beda66b31880abf426.chunk.js.map | 1 - public/641.17ddd9c6d001de1e2dff.chunk.js | 2 ++ public/641.17ddd9c6d001de1e2dff.chunk.js.map | 1 + public/641.1fc33fe3e0c4c0c41a9e.chunk.js | 2 -- public/641.1fc33fe3e0c4c0c41a9e.chunk.js.map | 1 - public/642.d6b90b5bc53545046507.chunk.js.map | 1 - ...unk.js => 642.e22e19b4ff8bd97e11a6.chunk.js} | 2 +- public/642.e22e19b4ff8bd97e11a6.chunk.js.map | 1 + public/709.03eeac190dc611bf8d97.chunk.js | 2 -- public/709.03eeac190dc611bf8d97.chunk.js.map | 1 - public/709.4571511ea17ae29dc294.chunk.js | 2 ++ public/709.4571511ea17ae29dc294.chunk.js.map | 1 + ...hunk.js => 77.66c57fc849b5ec07a136.chunk.js} | 2 +- public/77.66c57fc849b5ec07a136.chunk.js.map | 1 + public/77.808c5b447b007ee7aa9d.chunk.js.map | 1 - public/774.be0952a2ec87ed053042.chunk.js.map | 1 - ...unk.js => 774.ff0771b7e79241db38a1.chunk.js} | 2 +- public/774.ff0771b7e79241db38a1.chunk.js.map | 1 + public/776.8ab4eee78bc43703a976.chunk.js | 2 -- public/776.8ab4eee78bc43703a976.chunk.js.map | 1 - public/776.f3c4c9ecb5dfb45387d4.chunk.js | 2 ++ public/776.f3c4c9ecb5dfb45387d4.chunk.js.map | 1 + ...unk.js => 781.0e00df9eb08b8690c5dd.chunk.js} | 4 ++-- public/781.0e00df9eb08b8690c5dd.chunk.js.map | 1 + public/781.5b082181115fbfebcf63.chunk.js.map | 1 - public/8.0544e00385e42a07883b.chunk.js | 2 -- public/8.0544e00385e42a07883b.chunk.js.map | 1 - public/8.47c82822a84234c722aa.chunk.js | 2 ++ public/8.47c82822a84234c722aa.chunk.js.map | 1 + public/810.3f514515bc74111bee6d.chunk.js.map | 1 - ...unk.js => 810.6e1c8118d1a5deced189.chunk.js} | 2 +- public/810.6e1c8118d1a5deced189.chunk.js.map | 1 + public/813.8ac136e59ed6ea591cfc.chunk.js | 2 ++ public/813.8ac136e59ed6ea591cfc.chunk.js.map | 1 + public/813.e7782ee52edafa426cd5.chunk.js | 2 -- public/813.e7782ee52edafa426cd5.chunk.js.map | 1 - public/946.5f3daeb8fb456e8f8e99.bundle.js | 2 ++ public/946.5f3daeb8fb456e8f8e99.bundle.js.map | 1 + public/changelogs/en_1.7.0.md | 15 +++++++++++++++ public/changelogs/ru_1.7.0.md | 15 +++++++++++++++ ...crypto.worker.7b5d9830f9811f2a50fe.chunk.js} | 4 ++-- ...pto.worker.7b5d9830f9811f2a50fe.chunk.js.map | 1 + ...pto.worker.a0cf65ddba162cb08d08.chunk.js.map | 1 - public/index.html | 6 +++--- public/main.1fe88778f443685606bb.bundle.js | 2 -- public/main.1fe88778f443685606bb.bundle.js.map | 1 - public/main.2eade49b43eb3f2960e2.css | 4 ++++ public/main.2eade49b43eb3f2960e2.css.map | 1 + public/main.6d6505bae2a8ce439316.bundle.js | 2 ++ public/main.6d6505bae2a8ce439316.bundle.js.map | 1 + public/main.d2eea81d523acd96fbec.css | 4 ---- public/main.d2eea81d523acd96fbec.css.map | 1 - ...mtproto.worker.57e2ed0eb86ffb097616.chunk.js | 2 ++ ...oto.worker.57e2ed0eb86ffb097616.chunk.js.map | 1 + ...mtproto.worker.b6bdf87282369207cefc.chunk.js | 2 -- ...oto.worker.b6bdf87282369207cefc.chunk.js.map | 1 - public/report.html | 4 ++-- ...hunk.js => sw.241e2211cf9f9c1af243.chunk.js} | 4 ++-- public/sw.241e2211cf9f9c1af243.chunk.js.map | 1 + public/sw.c12b91543b047629a922.chunk.js.map | 1 - public/version | 2 +- 113 files changed, 157 insertions(+), 93 deletions(-) create mode 100644 public/104.3793e2da2f88ac72ffd9.chunk.js create mode 100644 public/104.3793e2da2f88ac72ffd9.chunk.js.map delete mode 100644 public/104.d9383d4cf03fc631a3a9.chunk.js delete mode 100644 public/104.d9383d4cf03fc631a3a9.chunk.js.map rename public/{231.071dbf1017e65586295d.chunk.js => 231.2cf58745476f33d0c32c.chunk.js} (96%) rename public/{231.071dbf1017e65586295d.chunk.js.map => 231.2cf58745476f33d0c32c.chunk.js.map} (97%) delete mode 100644 public/301.a3f22008d452affb1ae4.chunk.js.map rename public/{301.a3f22008d452affb1ae4.chunk.js => 301.dc3c5a315285fe24ebd3.chunk.js} (83%) create mode 100644 public/301.dc3c5a315285fe24ebd3.chunk.js.map create mode 100644 public/333.d7addf177783fe16e44c.chunk.js create mode 100644 public/333.d7addf177783fe16e44c.chunk.js.map create mode 100644 public/339.0bedc53e7de2dd388b2b.chunk.js create mode 100644 public/339.0bedc53e7de2dd388b2b.chunk.js.map delete mode 100644 public/339.764b22e455094abfa43f.chunk.js delete mode 100644 public/339.764b22e455094abfa43f.chunk.js.map create mode 100644 public/392.e76a95678644d519b180.chunk.js create mode 100644 public/392.e76a95678644d519b180.chunk.js.map delete mode 100644 public/392.eb2cde6a1063177ee3ad.chunk.js delete mode 100644 public/392.eb2cde6a1063177ee3ad.chunk.js.map delete mode 100644 public/408.03880fedecb1e421da3b.chunk.js delete mode 100644 public/408.03880fedecb1e421da3b.chunk.js.map rename public/{436.a3c8c35b715fcb7c4d9f.chunk.js => 436.4f0c85770e373a7fe5e5.chunk.js} (84%) create mode 100644 public/436.4f0c85770e373a7fe5e5.chunk.js.map delete mode 100644 public/436.a3c8c35b715fcb7c4d9f.chunk.js.map delete mode 100644 public/437.77e92ccb32c21ff43a10.bundle.js delete mode 100644 public/437.77e92ccb32c21ff43a10.bundle.js.map create mode 100644 public/437.a80d805671a4b222696d.bundle.js create mode 100644 public/437.a80d805671a4b222696d.bundle.js.map rename public/{442.aee5aa5c25ff95c14b4d.chunk.js => 442.7c9b38d200f56e7d3245.chunk.js} (97%) create mode 100644 public/442.7c9b38d200f56e7d3245.chunk.js.map delete mode 100644 public/442.aee5aa5c25ff95c14b4d.chunk.js.map delete mode 100644 public/508.648a1c3659fa38d09b83.chunk.js.map rename public/{508.648a1c3659fa38d09b83.chunk.js => 508.c1aa5baee5227e17c016.chunk.js} (98%) create mode 100644 public/508.c1aa5baee5227e17c016.chunk.js.map delete mode 100644 public/51.015549e15aab2a59d3a0.chunk.js delete mode 100644 public/51.015549e15aab2a59d3a0.chunk.js.map create mode 100644 public/53.1619c547150ac620cdca.chunk.js create mode 100644 public/53.1619c547150ac620cdca.chunk.js.map delete mode 100644 public/53.3829958682207da0768c.chunk.js delete mode 100644 public/53.3829958682207da0768c.chunk.js.map create mode 100644 public/567.2a93821ac1dd3216f099.chunk.js create mode 100644 public/567.2a93821ac1dd3216f099.chunk.js.map delete mode 100644 public/570.d4798b741257c891cc8b.bundle.js delete mode 100644 public/570.d4798b741257c891cc8b.bundle.js.map rename public/{61.21ea8f96aad63bd2211c.chunk.js => 61.b0e6e1510d2c80059b20.chunk.js} (99%) rename public/{61.21ea8f96aad63bd2211c.chunk.js.map => 61.b0e6e1510d2c80059b20.chunk.js.map} (95%) create mode 100644 public/63.8c6c3aa1f4320cc408dd.chunk.js create mode 100644 public/63.8c6c3aa1f4320cc408dd.chunk.js.map delete mode 100644 public/63.f3beda66b31880abf426.chunk.js delete mode 100644 public/63.f3beda66b31880abf426.chunk.js.map create mode 100644 public/641.17ddd9c6d001de1e2dff.chunk.js create mode 100644 public/641.17ddd9c6d001de1e2dff.chunk.js.map delete mode 100644 public/641.1fc33fe3e0c4c0c41a9e.chunk.js delete mode 100644 public/641.1fc33fe3e0c4c0c41a9e.chunk.js.map delete mode 100644 public/642.d6b90b5bc53545046507.chunk.js.map rename public/{642.d6b90b5bc53545046507.chunk.js => 642.e22e19b4ff8bd97e11a6.chunk.js} (98%) create mode 100644 public/642.e22e19b4ff8bd97e11a6.chunk.js.map delete mode 100644 public/709.03eeac190dc611bf8d97.chunk.js delete mode 100644 public/709.03eeac190dc611bf8d97.chunk.js.map create mode 100644 public/709.4571511ea17ae29dc294.chunk.js create mode 100644 public/709.4571511ea17ae29dc294.chunk.js.map rename public/{77.808c5b447b007ee7aa9d.chunk.js => 77.66c57fc849b5ec07a136.chunk.js} (97%) create mode 100644 public/77.66c57fc849b5ec07a136.chunk.js.map delete mode 100644 public/77.808c5b447b007ee7aa9d.chunk.js.map delete mode 100644 public/774.be0952a2ec87ed053042.chunk.js.map rename public/{774.be0952a2ec87ed053042.chunk.js => 774.ff0771b7e79241db38a1.chunk.js} (97%) create mode 100644 public/774.ff0771b7e79241db38a1.chunk.js.map delete mode 100644 public/776.8ab4eee78bc43703a976.chunk.js delete mode 100644 public/776.8ab4eee78bc43703a976.chunk.js.map create mode 100644 public/776.f3c4c9ecb5dfb45387d4.chunk.js create mode 100644 public/776.f3c4c9ecb5dfb45387d4.chunk.js.map rename public/{781.5b082181115fbfebcf63.chunk.js => 781.0e00df9eb08b8690c5dd.chunk.js} (84%) create mode 100644 public/781.0e00df9eb08b8690c5dd.chunk.js.map delete mode 100644 public/781.5b082181115fbfebcf63.chunk.js.map delete mode 100644 public/8.0544e00385e42a07883b.chunk.js delete mode 100644 public/8.0544e00385e42a07883b.chunk.js.map create mode 100644 public/8.47c82822a84234c722aa.chunk.js create mode 100644 public/8.47c82822a84234c722aa.chunk.js.map delete mode 100644 public/810.3f514515bc74111bee6d.chunk.js.map rename public/{810.3f514515bc74111bee6d.chunk.js => 810.6e1c8118d1a5deced189.chunk.js} (98%) create mode 100644 public/810.6e1c8118d1a5deced189.chunk.js.map create mode 100644 public/813.8ac136e59ed6ea591cfc.chunk.js create mode 100644 public/813.8ac136e59ed6ea591cfc.chunk.js.map delete mode 100644 public/813.e7782ee52edafa426cd5.chunk.js delete mode 100644 public/813.e7782ee52edafa426cd5.chunk.js.map create mode 100644 public/946.5f3daeb8fb456e8f8e99.bundle.js create mode 100644 public/946.5f3daeb8fb456e8f8e99.bundle.js.map create mode 100644 public/changelogs/en_1.7.0.md create mode 100644 public/changelogs/ru_1.7.0.md rename public/{crypto.worker.a0cf65ddba162cb08d08.chunk.js => crypto.worker.7b5d9830f9811f2a50fe.chunk.js} (99%) create mode 100644 public/crypto.worker.7b5d9830f9811f2a50fe.chunk.js.map delete mode 100644 public/crypto.worker.a0cf65ddba162cb08d08.chunk.js.map delete mode 100644 public/main.1fe88778f443685606bb.bundle.js delete mode 100644 public/main.1fe88778f443685606bb.bundle.js.map create mode 100644 public/main.2eade49b43eb3f2960e2.css create mode 100644 public/main.2eade49b43eb3f2960e2.css.map create mode 100644 public/main.6d6505bae2a8ce439316.bundle.js create mode 100644 public/main.6d6505bae2a8ce439316.bundle.js.map delete mode 100644 public/main.d2eea81d523acd96fbec.css delete mode 100644 public/main.d2eea81d523acd96fbec.css.map create mode 100644 public/mtproto.worker.57e2ed0eb86ffb097616.chunk.js create mode 100644 public/mtproto.worker.57e2ed0eb86ffb097616.chunk.js.map delete mode 100644 public/mtproto.worker.b6bdf87282369207cefc.chunk.js delete mode 100644 public/mtproto.worker.b6bdf87282369207cefc.chunk.js.map rename public/{sw.c12b91543b047629a922.chunk.js => sw.241e2211cf9f9c1af243.chunk.js} (99%) create mode 100644 public/sw.241e2211cf9f9c1af243.chunk.js.map delete mode 100644 public/sw.c12b91543b047629a922.chunk.js.map diff --git a/.env b/.env index af8ce6e6..75d0a379 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ API_ID=1025907 API_HASH=452b0359b988148995f22ff0f4229750 -VERSION=1.6.2 -VERSION_FULL=1.6.2 (272) -BUILD=272 +VERSION=1.7.0 +VERSION_FULL=1.7.0 (273) +BUILD=273 diff --git a/CHANGELOG.md b/CHANGELOG.md index f8d3ee62..1ead3bf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +### 1.7.0 (273) +🎄 Happy New Year to everyone! [WebK](http://web.telegram.org/k) launched its first update of 2023, adding a pack of feaures you can now enjoy on Web! + +📚 [Topics 2.0](https://telegram.org/blog/ultimate-privacy-topics-2-0#topics-2-0) +Admins of **any group** can enable Topics, creating separate spaces within the group to discuss different subjects – with a sleek **two-column layout** to easily navigate chats. + +😶‍🌫️ [Hidden Media](https://telegram.org/blog/hidden-media-zero-storage-profile-pics#hidden-media) +Media hidden with a shimmering spoiler effect is properly displayed in the app – just tap or click to view the image. The next [WebK](http://web.telegram.org/k) update will allow you to send media with this spoiler effect. + +🏴‍☠️ [No-SIM Signup and Login](https://telegram.org/blog/ultimate-privacy-topics-2-0#sign-up-without-a-sim-card) +Users who have an **anonymous number** from [Fragment](https://fragment.com/numbers) can login to their existing account or create a **new account** with the number. + +🔤 [Collectible Usernames](https://telegram.org/blog/topics-in-groups-collectible-usernames#collectible-usernames) +Owners of collectible usernames can now **assign collectibles** to their personal account, groups or channels – and **manage** them within the app. + +Lastly, the app also preserves your **history stack** – if you follow a [t.me](https://t.me) link to another message in a chat, you can return to the **first message** with the 🔽 button. + ### 1.6.0 (244) Today, [WebK](https://web.telegram.org/k) introduces a redesigned **Emoji and Sticker Panel** – try the **collapsible section** for default emoji categories and the **scrollable bar** for your custom emoji sets. diff --git a/CHANGELOG_ru.md b/CHANGELOG_ru.md index 77bae30d..b515e236 100644 --- a/CHANGELOG_ru.md +++ b/CHANGELOG_ru.md @@ -1,3 +1,20 @@ +### 1.7.0 (273) +🎄 [WebK](http://web.telegram.org/k) поздравляет Вас с праздниками! Первое обновление этого года дарит Вам возможность пользоваться уже знакомыми функциями теперь и в браузерах! + +📚 [Темы 2.0](https://telegram.org/blog/ultimate-privacy-topics-2-0/ru#temi-2-0) +Администраторы **любой группы** могут организовать обсуждения по темам. В группы с темами добавлена новая **вертикальная панель** для удобства переключения на другие чаты. + +😶‍🌫️ [Скрытые медиа](https://telegram.org/blog/hidden-media-zero-storage-profile-pics/ru#otpravka-skritih-media) +Приложение научилось отображать медиа, скрытые под искрящейся **полупрозрачной обложкой**. Кликните или коснитесь такого медиа, чтобы увидеть что спрятано внутри. В следующем обновлении [WebK](http://web.telegram.org/k) также научится отправлять подобные медиа. + +🏴‍☠ [Регистрация и вход без сим-карты](https://telegram.org/blog/ultimate-privacy-topics-2-0/ru#registratsiya-bez-sim-karti) +Обладатели **анонимных номеров** с [платформы Fragment](https://fragment.com/numbers) теперь могут **зарегистрироваться** или попасть в уже существующий аккаунт, привязанный к анонимному номеру. + +🔤 [Коллекционные публичные имена](https://telegram.org/blog/topics-in-groups-collectible-usernames/ru#kollektsionnie-publichnie-imena) +Обладатели [коллекционных публичных имен](https://fragment.com/) получили возможность управлять такими именами, включая их привязку к личным аккаунтам, группам или каналам. + +А ещё приложение научилось **возвращать Вас обратно** к исходной позиции в том же чате — если Вы перешли от одного сообщения к другому с помощью ссылки [t.me](https://t.me). Чтобы вернуться обратно, воспользуйтесь кнопкой 🔽. + ### 1.6.0 (244) [WebK](https://web.telegram.org/k) продолжает совершенствоваться и сегодня представляет новую **панель эмодзи, стикеров и GIF**. diff --git a/public/104.3793e2da2f88ac72ffd9.chunk.js b/public/104.3793e2da2f88ac72ffd9.chunk.js new file mode 100644 index 00000000..70edce59 --- /dev/null +++ b/public/104.3793e2da2f88ac72ffd9.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[104],{9104:(e,t,o)=>{o.r(t),o.d(t,{default:()=>a});const a={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","Chat.Service.TopicEdited.Mixed":"%1$@ changed the topic name and icon to %2$@","Chat.Service.TopicEdited.You.Mixed":"You changed the topic name and icon to %2$@","Chat.Service.TopicEdited.Mixed.IconRemoved":'%1$@ changed the topic name to "%1$@" and removed icon',"Chat.Service.TopicEdited.You.Mixed.IconRemoved":'You changed the topic name to "%1$@" and removed icon',"ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","Deactivated.Version.Title":"WebK has updated...","Deactivated.Version.Subtitle":"Another tab is running a newer version of Telegram.\nClick anywhere to reload this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.TimeFormat":"Time Format","General.TimeFormat.h12":"12-hour","General.TimeFormat.h23":"24-hour","ChatBackground.UploadWallpaper":"Upload Wallpaper","ChatBackground.Blur":"Blur Wallpaper Image","Notifications.Sound":"Notification Sound",NewPrivateChat:"New Private Chat","NewPoll.OptionLabel":"Option %d","Message.Context.Selection.Copy":"Copy selected","Message.Context.Selection.Clear":"Clear selection","Message.Context.Selection.Delete":"Delete selected","Message.Context.Selection.Forward":"Forward selected","Message.Context.Selection.SendNow":"Send Now selected","Message.Unsupported.Desktop":"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__","Message.Unsupported.Mobile":"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__","Checkbox.Enabled":"Enabled","Checkbox.Disabled":"Disabled","Error.PreviewSender.CaptionTooLong":"Caption is too long.","PreviewSender.GroupItems":"Group items","PreviewSender.SendAlbum":{one_value:"Send Album",other_value:"Send %d Albums"},"Presence.YourChat":"chat with yourself","Privacy.Devices":{one_value:"%1$d device",other_value:"%1$d devices"},"Privacy.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"Link.Available":"Link is available","Link.Taken":"Link is already taken","Link.Invalid":"Link is invalid","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","TwoStepAuth.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","PaymentInfo.CVV":"CVV Code","PaymentInfo.Card.Title":"Enter your card information","PaymentInfo.Billing.Title":"Enter your billing address","PaymentInfo.Done":"PROCEED TO CHECKOUT","PaymentCard.Error.Invalid":"Invalid card number","PaymentCard.Error.Incomplete":"Incomplete card number","LimitReached.Ok":"OK, GOT IT","Username.Purchase":"**This username is already taken.** However, it is currently available for purchase. [Learn more…]()",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",UsernameAlso:"also %1$s",UsernameHelp:"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\nYou can use **a–z**, **0–9** and underscores. Minimum length is **5** characters.",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"},Months:{one_value:"%1$d month",other_value:"%1$d months"},Years:{one_value:"%1$d year",other_value:"%1$d years"},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",PaymentInvoice:"INVOICE",PaymentTestInvoice:"TEST INVOICE",PaymentReceipt:"Receipt",PaymentCheckout:"Checkout",PaymentTransactionTotal:"Total",PaymentTip:"Tip",PaymentTipOptional:"Tip (Optional)",PaymentCheckoutPay:"PAY %1$s",PaymentCheckoutMethod:"Payment method",PaymentCheckoutProvider:"Payment provider",PaymentCardNumber:"Card Number",PaymentCardSavePaymentInformation:"Save Payment Information",PaymentCardInfo:"Payment info",PaymentCardSavePaymentInformationInfoLine1:"You can save your payment info for future use. It will be stored directly with the payment provider. Telegram has no access to your credit card data.",Done:"Done",PaymentShippingMethod:"Shipping methods",PaymentNoShippingMethod:"Sorry, it is not possible to deliver to your address.",PaymentShippingInfo:"Shipping Information",PaymentShippingAddress:"Shipping address",PaymentShippingAddress1Placeholder:"Address 1 (Street)",PaymentShippingAddress2Placeholder:"Address 2 (Street)",PaymentShippingCityPlaceholder:"City",PaymentShippingStatePlaceholder:"State",PaymentShippingCountry:"Country",PaymentShippingZipPlaceholder:"Postcode",PaymentShippingReceiver:"Receiver",PaymentShippingName:"Full Name",PaymentShippingEmailPlaceholder:"Email",PaymentCheckoutPhoneNumber:"Phone number",PaymentCheckoutShippingMethod:"Shipping method",PaymentShippingSave:"Save Shipping Information",PaymentShippingSaveInfo:"You can save your shipping info for future use.",PaymentInfoHint:"You paid **%1$s** for **%2$s**.",PrivacyPayments:"Payments",PrivacyPaymentsClearInfo:"You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data.",PrivacyPaymentsClear:"Clear Payment and Shipping Info",PrivacyPaymentsClearAlertTitle:"Clear payment info",PrivacyPaymentsClearAlertText:"Are you sure you want to clear your payment and shipping info?",PrivacyPaymentsPaymentInfoCleared:"Payment info cleared.",PrivacyPaymentsShippingInfoCleared:"Shipping info cleared.",PrivacyPaymentsPaymentShippingCleared:"Payment and shipping info cleared.",PrivacyClearShipping:"Shipping info",PrivacyClearPayment:"Payment info",Clear:"Clear",Save:"Save",PaymentCheckoutName:"Name",ClearRecentStickersAlertTitle:"Clear recent stickers",ClearRecentStickersAlertMessage:"Do you want to clear all your recent stickers?",PremiumStickersShort:"Premium",FavoriteStickers:"Favorites",AddToFavorites:"Add to Favorites",AddedToFavorites:"Sticker added to Favorites.",RemovedFromFavorites:"Sticker was removed from Favorites",RemovedFromRecent:"Sticker was removed from Recent",DeleteFromFavorites:"Delete from Favorites",DeleteFromRecent:"Remove from Recent",NewChatsFromNonContacts:"New chats from unknown users",ArchiveAndMute:"Archive and Mute",ArchiveAndMuteInfo:"Automatically archive and mute new chats, groups and channels from non-contacts.",PrivacyVoiceMessages:"Voice Messages",PrivacyVoiceMessagesTitle:"Who can send me voice or video messages?",PrivacyVoiceMessagesInfo:"You can restrict who can send you voice or video messages with granular precision.",PrivacyVoiceMessagesPremiumOnly:"Only subscribers of *Telegram Premium* can restrict receiving voice messages.",EmojiCount:{other_value:"%1$d emoji"},AddEmojiNotFound:"Emoji pack not found.",MessageContainsEmojiPack:"This message contains emoji from %s pack.",MessageContainsEmojiPacks:{other_value:"This message contains emoji from **%d Packs**."},EmojiPackCount:{one_value:"%1$d Emoji Pack",other_value:"%1$d Emoji Packs"},ReactionsAll:"All",EnableSomeReactionsInfo:"Members of the group can use only certain approved emoji as reactions to messages.",EnableAllReactionsInfo:"Members of the group can use any emoji as reactions to messages.",DisableReactionsInfo:"Members of the group can’t add any reactions to messages.",OnlyAllowThisReactions:"Only allow these reactions",AllReactions:"All reactions",SomeReactions:"Some reactions",NoReactions:"No reactions",LimitReached:"Limit Reached",LimitReachedPinDialogs:"You can't pin more than %1$d chats to the top. Unpin some that are currently pinned – or subscribe to **Telegram Premium** to double the limit to **%2$d** chats.",LimitReachedPinDialogsPremium:"Sorry, you can't pin more than %1$d chats to the top. Unpin some that are currently pinned.",LimitReachedPinDialogsLocked:"Sorry, you can't pin more than %1$d chats to the top. Unpin some that are currently pinned. We are working to let you increase this limit in the future.",IncreaseLimit:"Increase Limit",LimitFree:"Free",LimitPremium:"Premium",ActionTTLChanged:"un1 set messages to auto-delete in %1$s",ActionTTLYouChanged:"You set messages to auto-delete in %1$s",ActionTTLChannelChanged:"Messages in this channel will be automatically deleted after %1$s",ActionTTLChannelDisabled:"Messages in this channel will no longer be automatically deleted",ActionTTLDisabled:"un1 disabled the auto-delete timer",ActionTTLYouDisabled:"You disabled the auto-delete timer",UsernamesProfileHeader:"Username order",UsernamesProfileHelp:"Drag and drop links to change the order in which they will be displayed on your info page.",UsernamesChannelHelp:"Drag and drop links to change the order in which they will be displayed on the channel info page.",UsernameLinkEditable:"tap to edit",UsernameLinkActive:"active",UsernameLinkInactive:"not active",UsernameActivateLink:"Activate link",UsernameDeactivateLink:"Deactivate link",UsernameActivateLinkProfileMessage:"Do you want to show this link on your info page?",UsernameDeactivateLinkProfileMessage:"Do you want to hide this link from your info page?",UsernameActivateLinkChannelMessage:"Do you want to show this link on the channel info page?",UsernameDeactivateLinkChannelMessage:"Do you want to hide this link from the channel info page?",Hide:"Hide",Show:"Show",UsernameActivateErrorTitle:"Too many active links",UsernameActivateErrorMessage:"Sorry, you have too many active public links already. Please hide one of your active public links first.",ChannelSignMessages:"Sign Messages",TopicWasCreatedAction:"%s was created",Topics:"Topics",ForumToggleDescription:"The group chat will be divided into topics created by admins or users.",AnonymousNumber:"Anonymous Number",Info:"Info",BotSettings:"Settings",OpenMessage:"VIEW MESSAGE",OpenGroup:"VIEW GROUP",CloseTopic:"Close topic",RestartTopic:"Reopen topic",LimitReachedPinnedTopics:"Sorry, you can't pin more than %d topics to the top.",TopicProfileStatus:"In %s",AccDescrTopic:"Topic",DeleteTopics:{one_value:"Delete topic",other_value:"Delete topics"},DeleteSelectedTopic:"Are you sure you want delete %s?",NewTopic:"New Topic",CreateTopicTitle:"Choose a topic name and icon",CreateGeneralTopicTitle:"Choose topic name",EditTopicHide:"Show in Topics",EditTopicHideInfo:"If the 'General' topic is hidden, group members can pull down in the topic list to view it.","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.SendVoice.PrivacyError":"%@ doesn't accept voice and video messages","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.Group.TopicEdited.Icon":"%1$@ changed topic icon to %2$@","Chat.Service.Group.TopicEdited.Icon.Removed":"%1$@ removed icon","Chat.Service.Group.TopicEdited.Title":'%1$@ changed topic name to "%2$@"',"Chat.Service.Group.TopicEdited.Paused":"%1$@ closed topic","Chat.Service.Group.TopicEdited.Resumed":"%1$@ restarted topic","Chat.Service.Group.TopicEdited.You.Icon":"You changed topic icon to %1$@","Chat.Service.Group.TopicEdited.You.Icon.Removed":"You removed icon","Chat.Service.Group.TopicEdited.You.Title":'You changed topic name to "%1$@"',"Chat.Service.Group.TopicEdited.You.Paused":"You closed topic","Chat.Service.Group.TopicEdited.You.Resumed":"You restarted topic","Chat.Service.Group.TopicEdited.You.Hided":"You hid the general topic","Chat.Service.Group.TopicEdited.You.Unhided":"You unhid the general topic","Chat.Service.Group.TopicEdited.Hided":"%1$@ hid the general topic","Chat.Service.Group.TopicEdited.Unhided":"%1$@ unhid the general topic","Chat.Service.PaymentSent1":"You have successfully transferred **%1$@** to **%2$@** for **%3$@**","Chat.Service.PaymentSent1NoTitle":"You have successfully transferred **%1$@** to **%2$@**","Chat.Service.PaymentSentRecurringInit":"You successfully transferred **%1$@** to **%2$@** for **%3$@** and allowed future recurring payments","Chat.Service.PaymentSentRecurringInitNoTitle":"You successfully transferred **%1$@** to **%2$@** and allowed future recurring payments","Chat.Service.PaymentSentRecurringUsed":"You have just successfully transferred **%1$@** to **%2$@** for **%3$@** via recurrent payments","Chat.Service.PaymentSentRecurringUsedNoTitle":"You have just successfully transferred **%1$@** to **%2$@** via recurrent payments","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","Checkout.2FA.Text":"Saving payment details is only available with 2-Step Verification.","Checkout.NewCard.CardholderNamePlaceholder":"Cardholder Name","Checkout.PasswordEntry.Title":"Payment Confirmation","Checkout.PasswordEntry.Pay":"Pay","Checkout.PasswordEntry.Text":"Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password.","Checkout.PayPrice":"Pay %@","Checkout.WebConfirmation.Title":"Complete Payment","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.","ChannelVisibility.Confirm.MakePrivate.Channel":"If you make this channel private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.","ChannelVisibility.Confirm.MakePrivate.Group":"If you make this group private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.","Context.ViewStickerSet":"View Sticker Set","CreateGroup.NameHolder":"Group Name","CustomEmoji.PremiumAlert":"Subscribe to Telegram Premium to unlock this emoji. [Read More]()","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","ForumTopic.Context.Info":'Group Info"',"ForumTopic.Context.AddMember":'Add Members"',"ForumTopic.Context.ShowAsMessages":'View as Messages"',"ForumTopic.Context.New":"Create Topic","ForumTopic.Name.Placeholder":"Topic Name","ForumTopic.Title.Edit":"Edit Topic","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","Error.AnError":"An error occurred. Please try again later.","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","Message.ReplyActionButtonShowReceipt":"Show Receipt","MessageContext.CopyMessageLink1":"Copy Message Link","Modal.Send":"Send","NewContact.Exception.ShareMyPhoneNumber":"Share My Phone Number","NewContact.Exception.ShareMyPhoneNumber.Desc":"You can make your phone visible to %@.","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$@"',"Payments.Recurrent.Accept":"I accept [Terms of Service]() of **%@**.","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.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","PeerInfo.Phone.AnonymousInfo":"This number is not tied to a SIM card and was acquired on [Fragment]().","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","Text.CopyLabel_About":"Copy About","Text.CopyLabel_Bio":"Copy Bio","Text.CopyLabel_PhoneNumber":"Copy Phone Number","Text.CopyLabel_Username":"Copy Username","Text.CopyLabel_ShareLink":"Copy Share Link","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?","SecureId.Identity.Placeholder.ExpiryDate":"Expiry Date","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","Sticker.Premium.Click.Info":"This pack contains premium stickers like this one. [View Pack]()","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","VoiceChat.Chat.StartNew":"Video chat ended. Start a new one?","VoiceChat.Chat.StartNew.OK":"Start","VoiceChat.Chat.Ended":"Video chat ended.","VoiceChat.Invite.InviteMembers":"Invite members","VoiceChat.Status.Connecting":"Connecting...","VoiceChat.Status.Members":{one_value:"%d participant",other_value:"%d participants"},"VoiceChat.Status.MutedForYou":"muted for you","VoiceChat.Status.Speaking":"speaking","VoiceChat.Status.Listening":"listening","VoiceChat.Status.WantsSpeak":"wants to speak","VoiceChat.Status.Muted":"muted","VoiceChat.Status.You":"This is you","VoiceChat.Video.Stream.Video":"video","VoiceChat.Video.Stream.Screencast":"screen","VoiceChat.Video.Stream.More":"more","VoiceChat.Leave":"Leave","VoiceChat.End.Title":"Leave video chat","VoiceChat.End.Text":"Are you sure you want to leave this video chat?","VoiceChat.End.Third":"End Video Chat","VoiceChat.End.OK":"Leave","VoiceChat.MutePeer":"Mute","VoiceChat.UnmutePeer":"Allow To Speak","VoiceChat.RemovePeer":"Remove","VoiceChat.OpenProfile":"Open Profile","VoiceChat.MuteForMe":"Mute For Me","VoiceChat.UnmuteForMe":"Unmute For Me","VoiceChat.RemovePeer.Confirm.Channel":"Do you want to remove %1$@ from the channel?","VoiceChat.RemovePeer.Confirm":"Are you sure you want to remove %1$@ from the group?","VoiceChat.RemovePeer.Confirm.OK":"Remove"}}}]); +//# sourceMappingURL=104.3793e2da2f88ac72ffd9.chunk.js.map \ No newline at end of file diff --git a/public/104.3793e2da2f88ac72ffd9.chunk.js.map b/public/104.3793e2da2f88ac72ffd9.chunk.js.map new file mode 100644 index 00000000..42c504fa --- /dev/null +++ b/public/104.3793e2da2f88ac72ffd9.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"104.3793e2da2f88ac72ffd9.chunk.js","mappings":"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","sources":["webpack://tweb/./src/lang.ts"],"sourcesContent":["const lang = {\n 'Animations': 'Animations',\n 'AttachAlbum': 'Album',\n 'Appearance.Color.Hex': 'HEX',\n 'Appearance.Color.RGB': 'RGB',\n 'BlockModal.Search.Placeholder': 'Block user...',\n 'DarkMode': 'Dark Mode',\n 'FilterIncludeExcludeInfo': 'Choose chats and types of chats that will\\nappear and never appear in this folder.',\n 'FilterMenuDelete': 'Delete Folder',\n 'FilterHeaderEdit': 'Edit Folder',\n 'FilterAllGroups': 'All Groups',\n 'FilterAllContacts': 'All Contacts',\n 'FilterAllNonContacts': 'All Non-Contacts',\n 'FilterAllChannels': 'All Channels',\n 'FilterAllBots': 'All Bots',\n 'EditContact.OriginalName': 'original name',\n 'EditProfile.FirstNameLabel': 'Name',\n 'EditProfile.BioLabel': 'Bio (optional)',\n 'EditProfile.Username.Label': 'Username (optional)',\n 'EditProfile.Username.Available': 'Username is available',\n 'EditProfile.Username.Taken': 'Username is already taken',\n 'EditProfile.Username.Invalid': 'Username is invalid',\n 'ExceptionModal.Search.Placeholder': 'Add exception...',\n 'Chat.Menu.SelectMessages': 'Select Messages',\n 'Chat.Menu.ClearSelection': 'Clear Selection',\n 'Chat.Menu.Hint': 'To **edit** or **reply**, close this menu.\\nThen tap next to a message.',\n 'Chat.Input.UnpinAll': 'Unpin All Messages',\n 'Chat.Input.Attach.PhotoOrVideo': 'Photo or Video',\n 'Chat.Input.Attach.Document': 'Document',\n 'Chat.Subscribe': 'SUBSCRIBE',\n 'Chat.Selection.LimitToast': 'Max selection count reached.',\n 'Chat.Search.MessagesFound': {\n 'one_value': '%d message found',\n 'other_value': '%d messages found'\n },\n 'Chat.Search.NoMessagesFound': 'No messages found',\n 'Chat.Search.PrivateSearch': 'Private Search',\n 'Chat.Service.TopicEdited.Mixed': '%1$@ changed the topic name and icon to %2$@',\n 'Chat.Service.TopicEdited.You.Mixed': 'You changed the topic name and icon to %2$@',\n 'Chat.Service.TopicEdited.Mixed.IconRemoved': '%1$@ changed the topic name to \\\"%1$@\\\" and removed icon',\n 'Chat.Service.TopicEdited.You.Mixed.IconRemoved': 'You changed the topic name to \\\"%1$@\\\" and removed icon',\n 'ChatList.Main.EmptyPlaceholder.Title': 'Your chats will appear here',\n 'ChatList.Main.EmptyPlaceholder.Subtitle': 'You have %s on Telegram',\n 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts': 'Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts',\n // \"ChatList.Menu.Archived\": \"Archived\",\n 'ChatList.Menu.SwitchTo.Webogram': 'Switch to Old Version',\n 'ChatList.Menu.SwitchTo.Z': 'Switch to Z version',\n 'ChatMigration.From': 'Migrated from %s',\n 'ChatMigration.To': 'Migrated to %s',\n 'ConnectionStatus.ForceReconnect': 'force reconnect',\n 'ConnectionStatus.ReconnectIn': 'Reconnect in %ds, %s',\n 'ConnectionStatus.Reconnect': 'reconnect',\n 'ConnectionStatus.Reconnecting': 'Reconnecting...',\n 'ConnectionStatus.TimedOut': 'Request timed out, %s',\n 'ConnectionStatus.Waiting': 'Waiting for network...',\n 'Contacts.Count': {\n 'one_value': '%d contact',\n 'other_value': '%d contacts'\n },\n 'Deactivated.Title': 'Too many tabs...',\n 'Deactivated.Subtitle': 'Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.',\n 'Deactivated.Version.Title': 'WebK has updated...',\n 'Deactivated.Version.Subtitle': 'Another tab is running a newer version of Telegram.\\nClick anywhere to reload this tab.',\n // \"Drafts\": {\n // \"one_value\": \"%d draft\",\n // \"other_value\": \"%d drafts\",\n // },\n 'General.Keyboard': 'Keyboard',\n 'General.SendShortcut.Enter': 'Send by Enter',\n 'General.SendShortcut.CtrlEnter': 'Send by %s + Enter',\n 'General.SendShortcut.NewLine.ShiftEnter': 'New line by Shift + Enter',\n 'General.SendShortcut.NewLine.Enter': 'New line by Enter',\n 'General.TimeFormat': 'Time Format',\n 'General.TimeFormat.h12': '12-hour',\n 'General.TimeFormat.h23': '24-hour',\n 'ChatBackground.UploadWallpaper': 'Upload Wallpaper',\n 'ChatBackground.Blur': 'Blur Wallpaper Image',\n 'Notifications.Sound': 'Notification Sound',\n 'NewPrivateChat': 'New Private Chat',\n 'NewPoll.OptionLabel': 'Option %d',\n 'Message.Context.Selection.Copy': 'Copy selected',\n 'Message.Context.Selection.Clear': 'Clear selection',\n 'Message.Context.Selection.Delete': 'Delete selected',\n 'Message.Context.Selection.Forward': 'Forward selected',\n 'Message.Context.Selection.SendNow': 'Send Now selected',\n 'Message.Unsupported.Desktop': '__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__',\n 'Message.Unsupported.Mobile': '__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__',\n 'Checkbox.Enabled': 'Enabled',\n 'Checkbox.Disabled': 'Disabled',\n 'Error.PreviewSender.CaptionTooLong': 'Caption is too long.',\n 'PreviewSender.GroupItems': 'Group items',\n 'PreviewSender.SendAlbum': {\n 'one_value': 'Send Album',\n 'other_value': 'Send %d Albums'\n },\n 'Presence.YourChat': 'chat with yourself',\n 'Privacy.Devices': {\n 'one_value': '%1$d device',\n 'other_value': '%1$d devices'\n },\n 'Privacy.SensitiveContent': 'Sensitive Content',\n 'PrivacyModal.Search.Placeholder': 'Add Users or Groups...',\n 'Permissions.NoExceptions': 'No exceptions',\n 'Permissions.ExceptionsCount': {\n 'one_value': '%d exception',\n 'other_value': '%d exceptions'\n },\n 'Link.Available': 'Link is available',\n 'Link.Taken': 'Link is already taken',\n 'Link.Invalid': 'Link is invalid',\n 'StickersTab.SearchPlaceholder': 'Search Stickers',\n 'ForwardedFrom': 'Forwarded from %s',\n 'Popup.Avatar.Title': 'Drag to Reposition',\n 'Popup.Unpin.AllTitle': 'Unpin all messages',\n 'Popup.Unpin.HideTitle': 'Hide pinned messages',\n 'Popup.Unpin.HideDescription': 'Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.',\n 'Popup.Unpin.Hide': 'Hide',\n 'TwoStepAuth.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 'PushNotification.Action.Settings': 'Background alerts settings',\n 'PushNotification.Action.Mute1d.Mobile': 'Mute for 24H',\n 'PushNotification.Action.Settings.Mobile': 'Alerts settings',\n '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 // \"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n // it is from iOS\n 'VoiceChat.DiscussionGroup': 'discussion group',\n 'PaymentInfo.CVV': 'CVV Code',\n 'PaymentInfo.Card.Title': 'Enter your card information',\n 'PaymentInfo.Billing.Title': 'Enter your billing address',\n 'PaymentInfo.Done': 'PROCEED TO CHECKOUT',\n 'PaymentCard.Error.Invalid': 'Invalid card number',\n 'PaymentCard.Error.Incomplete': 'Incomplete card number',\n 'LimitReached.Ok': 'OK, GOT IT',\n 'Username.Purchase': '**This username is already taken.** However, it is currently available for purchase. [Learn more…]()',\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 'UsernameAlso': 'also %1$s',\n 'UsernameHelp': '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\\nYou can use **a–z**, **0–9** and underscores. Minimum length is **5** characters.',\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 'Months': {\n 'one_value': '%1$d month',\n 'other_value': '%1$d months'\n },\n 'Years': {\n 'one_value': '%1$d year',\n 'other_value': '%1$d years'\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 'PaymentInvoice': 'INVOICE',\n 'PaymentTestInvoice': 'TEST INVOICE',\n 'PaymentReceipt': 'Receipt',\n 'PaymentCheckout': 'Checkout',\n 'PaymentTransactionTotal': 'Total',\n 'PaymentTip': 'Tip',\n 'PaymentTipOptional': 'Tip (Optional)',\n 'PaymentCheckoutPay': 'PAY %1$s',\n 'PaymentCheckoutMethod': 'Payment method',\n 'PaymentCheckoutProvider': 'Payment provider',\n 'PaymentCardNumber': 'Card Number',\n 'PaymentCardSavePaymentInformation': 'Save Payment Information',\n 'PaymentCardInfo': 'Payment info',\n 'PaymentCardSavePaymentInformationInfoLine1': 'You can save your payment info for future use. It will be stored directly with the payment provider. Telegram has no access to your credit card data.',\n 'Done': 'Done',\n 'PaymentShippingMethod': 'Shipping methods',\n 'PaymentNoShippingMethod': 'Sorry, it is not possible to deliver to your address.',\n 'PaymentShippingInfo': 'Shipping Information',\n 'PaymentShippingAddress': 'Shipping address',\n 'PaymentShippingAddress1Placeholder': 'Address 1 (Street)',\n 'PaymentShippingAddress2Placeholder': 'Address 2 (Street)',\n 'PaymentShippingCityPlaceholder': 'City',\n 'PaymentShippingStatePlaceholder': 'State',\n 'PaymentShippingCountry': 'Country',\n 'PaymentShippingZipPlaceholder': 'Postcode',\n 'PaymentShippingReceiver': 'Receiver',\n 'PaymentShippingName': 'Full Name',\n 'PaymentShippingEmailPlaceholder': 'Email',\n 'PaymentCheckoutPhoneNumber': 'Phone number',\n 'PaymentCheckoutShippingMethod': 'Shipping method',\n 'PaymentShippingSave': 'Save Shipping Information',\n 'PaymentShippingSaveInfo': 'You can save your shipping info for future use.',\n 'PaymentInfoHint': 'You paid **%1$s** for **%2$s**.',\n 'PrivacyPayments': 'Payments',\n 'PrivacyPaymentsClearInfo': 'You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data.',\n 'PrivacyPaymentsClear': 'Clear Payment and Shipping Info',\n 'PrivacyPaymentsClearAlertTitle': 'Clear payment info',\n 'PrivacyPaymentsClearAlertText': 'Are you sure you want to clear your payment and shipping info?',\n 'PrivacyPaymentsPaymentInfoCleared': 'Payment info cleared.',\n 'PrivacyPaymentsShippingInfoCleared': 'Shipping info cleared.',\n 'PrivacyPaymentsPaymentShippingCleared': 'Payment and shipping info cleared.',\n 'PrivacyClearShipping': 'Shipping info',\n 'PrivacyClearPayment': 'Payment info',\n 'Clear': 'Clear',\n 'Save': 'Save',\n 'PaymentCheckoutName': 'Name',\n 'ClearRecentStickersAlertTitle': 'Clear recent stickers',\n 'ClearRecentStickersAlertMessage': 'Do you want to clear all your recent stickers?',\n 'PremiumStickersShort': 'Premium',\n 'FavoriteStickers': 'Favorites',\n 'AddToFavorites': 'Add to Favorites',\n 'AddedToFavorites': 'Sticker added to Favorites.',\n 'RemovedFromFavorites': 'Sticker was removed from Favorites',\n 'RemovedFromRecent': 'Sticker was removed from Recent',\n 'DeleteFromFavorites': 'Delete from Favorites',\n 'DeleteFromRecent': 'Remove from Recent',\n 'NewChatsFromNonContacts': 'New chats from unknown users',\n 'ArchiveAndMute': 'Archive and Mute',\n 'ArchiveAndMuteInfo': 'Automatically archive and mute new chats, groups and channels from non-contacts.',\n 'PrivacyVoiceMessages': 'Voice Messages',\n 'PrivacyVoiceMessagesTitle': 'Who can send me voice or video messages?',\n 'PrivacyVoiceMessagesInfo': 'You can restrict who can send you voice or video messages with granular precision.',\n 'PrivacyVoiceMessagesPremiumOnly': 'Only subscribers of *Telegram Premium* can restrict receiving voice messages.',\n 'EmojiCount': {\n 'other_value': '%1$d emoji'\n },\n 'AddEmojiNotFound': 'Emoji pack not found.',\n 'MessageContainsEmojiPack': 'This message contains emoji from %s pack.',\n 'MessageContainsEmojiPacks': {\n 'other_value': 'This message contains emoji from **%d Packs**.'\n },\n 'EmojiPackCount': {\n 'one_value': '%1$d Emoji Pack',\n 'other_value': '%1$d Emoji Packs'\n },\n 'ReactionsAll': 'All',\n 'EnableSomeReactionsInfo': 'Members of the group can use only certain approved emoji as reactions to messages.',\n 'EnableAllReactionsInfo': 'Members of the group can use any emoji as reactions to messages.',\n 'DisableReactionsInfo': 'Members of the group can’t add any reactions to messages.',\n 'OnlyAllowThisReactions': 'Only allow these reactions',\n 'AllReactions': 'All reactions',\n 'SomeReactions': 'Some reactions',\n 'NoReactions': 'No reactions',\n 'LimitReached': 'Limit Reached',\n 'LimitReachedPinDialogs': 'You can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned – or subscribe to **Telegram Premium** to double the limit to **%2$d** chats.',\n 'LimitReachedPinDialogsPremium': 'Sorry, you can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned.',\n 'LimitReachedPinDialogsLocked': 'Sorry, you can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned. We are working to let you increase this limit in the future.',\n 'IncreaseLimit': 'Increase Limit',\n 'LimitFree': 'Free',\n 'LimitPremium': 'Premium',\n 'ActionTTLChanged': 'un1 set messages to auto-delete in %1$s',\n 'ActionTTLYouChanged': 'You set messages to auto-delete in %1$s',\n 'ActionTTLChannelChanged': 'Messages in this channel will be automatically deleted after %1$s',\n 'ActionTTLChannelDisabled': 'Messages in this channel will no longer be automatically deleted',\n 'ActionTTLDisabled': 'un1 disabled the auto-delete timer',\n 'ActionTTLYouDisabled': 'You disabled the auto-delete timer',\n 'UsernamesProfileHeader': 'Username order',\n 'UsernamesProfileHelp': 'Drag and drop links to change the order in which they will be displayed on your info page.',\n 'UsernamesChannelHelp': 'Drag and drop links to change the order in which they will be displayed on the channel info page.',\n 'UsernameLinkEditable': 'tap to edit',\n 'UsernameLinkActive': 'active',\n 'UsernameLinkInactive': 'not active',\n 'UsernameActivateLink': 'Activate link',\n 'UsernameDeactivateLink': 'Deactivate link',\n 'UsernameActivateLinkProfileMessage': 'Do you want to show this link on your info page?',\n 'UsernameDeactivateLinkProfileMessage': 'Do you want to hide this link from your info page?',\n 'UsernameActivateLinkChannelMessage': 'Do you want to show this link on the channel info page?',\n 'UsernameDeactivateLinkChannelMessage': 'Do you want to hide this link from the channel info page?',\n 'Hide': 'Hide',\n 'Show': 'Show',\n 'UsernameActivateErrorTitle': 'Too many active links',\n 'UsernameActivateErrorMessage': 'Sorry, you have too many active public links already. Please hide one of your active public links first.',\n 'ChannelSignMessages': 'Sign Messages',\n // 'ChannelSignMessagesInfo': 'Add names of admins to the messages they post',\n 'TopicWasCreatedAction': '%s was created',\n 'Topics': 'Topics',\n 'ForumToggleDescription': 'The group chat will be divided into topics created by admins or users.',\n 'AnonymousNumber': 'Anonymous Number',\n 'Info': 'Info',\n 'BotSettings': 'Settings',\n 'OpenMessage': 'VIEW MESSAGE',\n 'OpenGroup': 'VIEW GROUP',\n 'CloseTopic': 'Close topic',\n 'RestartTopic': 'Reopen topic',\n 'LimitReachedPinnedTopics': 'Sorry, you can\\'t pin more than %d topics to the top.',\n 'TopicProfileStatus': 'In %s',\n 'AccDescrTopic': 'Topic',\n 'DeleteTopics': {\n 'one_value': 'Delete topic',\n 'other_value': 'Delete topics'\n },\n 'DeleteSelectedTopic': 'Are you sure you want delete %s?',\n 'NewTopic': 'New Topic',\n 'CreateTopicTitle': 'Choose a topic name and icon',\n 'CreateGeneralTopicTitle': 'Choose topic name',\n 'EditTopicHide': 'Show in Topics',\n 'EditTopicHideInfo': 'If the \\'General\\' topic is hidden, group members can pull down in the topic list to view it.',\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.SendVoice.PrivacyError': '%@ doesn\\'t accept voice and video messages',\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.Group.TopicEdited.Icon': '%1$@ changed topic icon to %2$@',\n 'Chat.Service.Group.TopicEdited.Icon.Removed': '%1$@ removed icon',\n 'Chat.Service.Group.TopicEdited.Title': '%1$@ changed topic name to \\\"%2$@\\\"',\n 'Chat.Service.Group.TopicEdited.Paused': '%1$@ closed topic',\n 'Chat.Service.Group.TopicEdited.Resumed': '%1$@ restarted topic',\n 'Chat.Service.Group.TopicEdited.You.Icon': 'You changed topic icon to %1$@',\n 'Chat.Service.Group.TopicEdited.You.Icon.Removed': 'You removed icon',\n 'Chat.Service.Group.TopicEdited.You.Title': 'You changed topic name to \\\"%1$@\\\"',\n 'Chat.Service.Group.TopicEdited.You.Paused': 'You closed topic',\n 'Chat.Service.Group.TopicEdited.You.Resumed': 'You restarted topic',\n 'Chat.Service.Group.TopicEdited.You.Hided': 'You hid the general topic',\n 'Chat.Service.Group.TopicEdited.You.Unhided': 'You unhid the general topic',\n 'Chat.Service.Group.TopicEdited.Hided': '%1$@ hid the general topic',\n 'Chat.Service.Group.TopicEdited.Unhided': '%1$@ unhid the general topic',\n 'Chat.Service.PaymentSent1': 'You have successfully transferred **%1$@** to **%2$@** for **%3$@**',\n 'Chat.Service.PaymentSent1NoTitle': 'You have successfully transferred **%1$@** to **%2$@**',\n 'Chat.Service.PaymentSentRecurringInit': 'You successfully transferred **%1$@** to **%2$@** for **%3$@** and allowed future recurring payments',\n 'Chat.Service.PaymentSentRecurringInitNoTitle': 'You successfully transferred **%1$@** to **%2$@** and allowed future recurring payments',\n 'Chat.Service.PaymentSentRecurringUsed': 'You have just successfully transferred **%1$@** to **%2$@** for **%3$@** via recurrent payments',\n 'Chat.Service.PaymentSentRecurringUsedNoTitle': 'You have just successfully transferred **%1$@** to **%2$@** via recurrent payments',\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 'Checkout.2FA.Text': 'Saving payment details is only available with 2-Step Verification.',\n 'Checkout.NewCard.CardholderNamePlaceholder': 'Cardholder Name',\n 'Checkout.PasswordEntry.Title': 'Payment Confirmation',\n 'Checkout.PasswordEntry.Pay': 'Pay',\n 'Checkout.PasswordEntry.Text': 'Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password.',\n 'Checkout.PayPrice': 'Pay %@',\n 'Checkout.WebConfirmation.Title': 'Complete Payment',\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 'ChannelVisibility.Confirm.MakePrivate.Channel': 'If you make this channel private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.',\n 'ChannelVisibility.Confirm.MakePrivate.Group': 'If you make this group private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.',\n 'Context.ViewStickerSet': 'View Sticker Set',\n 'CreateGroup.NameHolder': 'Group Name',\n 'CustomEmoji.PremiumAlert': 'Subscribe to Telegram Premium to unlock this emoji. [Read More]()',\n 'Date.Today': 'Today',\n 'DeleteChat.DeleteGroupForAll': 'Delete for all members',\n 'DeleteChannelForAll': 'Delete for all subscribers',\n 'ForumTopic.Context.Info': 'Group Info\"',\n 'ForumTopic.Context.AddMember': 'Add Members\"',\n 'ForumTopic.Context.ShowAsMessages': 'View as Messages\"',\n 'ForumTopic.Context.New': 'Create Topic',\n 'ForumTopic.Name.Placeholder': 'Topic Name',\n 'ForumTopic.Title.Edit': 'Edit Topic',\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 'Error.AnError': 'An error occurred. Please try again later.',\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 'Message.ReplyActionButtonShowReceipt': 'Show Receipt',\n 'MessageContext.CopyMessageLink1': 'Copy Message Link',\n 'Modal.Send': 'Send',\n 'NewContact.Exception.ShareMyPhoneNumber': 'Share My Phone Number',\n 'NewContact.Exception.ShareMyPhoneNumber.Desc': 'You can make your phone visible to %@.',\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 'Payments.Recurrent.Accept': 'I accept [Terms of Service]() of **%@**.',\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.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 'PeerInfo.Phone.AnonymousInfo': 'This number is not tied to a SIM card and was acquired on [Fragment]().',\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 'Text.CopyLabel_About': 'Copy About',\n 'Text.CopyLabel_Bio': 'Copy Bio',\n 'Text.CopyLabel_PhoneNumber': 'Copy Phone Number',\n 'Text.CopyLabel_Username': 'Copy Username',\n 'Text.CopyLabel_ShareLink': 'Copy Share Link',\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 'SecureId.Identity.Placeholder.ExpiryDate': 'Expiry Date',\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 'Sticker.Premium.Click.Info': 'This pack contains premium stickers like this one. [View Pack]()',\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 'VoiceChat.Chat.StartNew': 'Video chat ended. Start a new one?',\n 'VoiceChat.Chat.StartNew.OK': 'Start',\n 'VoiceChat.Chat.Ended': 'Video chat ended.',\n 'VoiceChat.Invite.InviteMembers': 'Invite members',\n 'VoiceChat.Status.Connecting': 'Connecting...',\n 'VoiceChat.Status.Members': {\n 'one_value': '%d participant',\n 'other_value': '%d participants'\n },\n 'VoiceChat.Status.MutedForYou': 'muted for you',\n 'VoiceChat.Status.Speaking': 'speaking',\n 'VoiceChat.Status.Listening': 'listening',\n 'VoiceChat.Status.WantsSpeak': 'wants to speak',\n 'VoiceChat.Status.Muted': 'muted',\n 'VoiceChat.Status.You': 'This is you',\n 'VoiceChat.Video.Stream.Video': 'video',\n 'VoiceChat.Video.Stream.Screencast': 'screen',\n 'VoiceChat.Video.Stream.More': 'more',\n 'VoiceChat.Leave': 'Leave',\n 'VoiceChat.End.Title': 'Leave video chat',\n 'VoiceChat.End.Text': 'Are you sure you want to leave this video chat?',\n 'VoiceChat.End.Third': 'End Video Chat',\n 'VoiceChat.End.OK': 'Leave',\n 'VoiceChat.MutePeer': 'Mute',\n 'VoiceChat.UnmutePeer': 'Allow To Speak',\n 'VoiceChat.RemovePeer': 'Remove',\n 'VoiceChat.OpenProfile': 'Open Profile',\n 'VoiceChat.MuteForMe': 'Mute For Me',\n 'VoiceChat.UnmuteForMe': 'Unmute For Me',\n 'VoiceChat.RemovePeer.Confirm.Channel': 'Do you want to remove %1$@ from the channel?',\n 'VoiceChat.RemovePeer.Confirm': 'Are you sure you want to remove %1$@ from the group?',\n 'VoiceChat.RemovePeer.Confirm.OK': 'Remove'\n};\n\nexport default lang;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/104.d9383d4cf03fc631a3a9.chunk.js b/public/104.d9383d4cf03fc631a3a9.chunk.js deleted file mode 100644 index 2d233509..00000000 --- a/public/104.d9383d4cf03fc631a3a9.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[104],{9104:(e,t,o)=>{o.r(t),o.d(t,{default:()=>a});const a={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","Deactivated.Version.Title":"WebK has updated...","Deactivated.Version.Subtitle":"Another tab is running a newer version of Telegram.\nClick anywhere to reload this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.TimeFormat":"Time Format","General.TimeFormat.h12":"12-hour","General.TimeFormat.h23":"24-hour","ChatBackground.UploadWallpaper":"Upload Wallpaper","ChatBackground.Blur":"Blur Wallpaper Image","Notifications.Sound":"Notification Sound",NewPrivateChat:"New Private Chat","NewPoll.OptionLabel":"Option %d","Message.Context.Selection.Copy":"Copy selected","Message.Context.Selection.Clear":"Clear selection","Message.Context.Selection.Delete":"Delete selected","Message.Context.Selection.Forward":"Forward selected","Message.Context.Selection.SendNow":"Send Now selected","Message.Unsupported.Desktop":"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__","Message.Unsupported.Mobile":"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__","Checkbox.Enabled":"Enabled","Checkbox.Disabled":"Disabled","Error.PreviewSender.CaptionTooLong":"Caption is too long.","PreviewSender.GroupItems":"Group items","PreviewSender.SendAlbum":{one_value:"Send Album",other_value:"Send %d Albums"},"Presence.YourChat":"chat with yourself","Privacy.Devices":{one_value:"%1$d device",other_value:"%1$d devices"},"Privacy.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"Link.Available":"Link is available","Link.Taken":"Link is already taken","Link.Invalid":"Link is invalid","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","TwoStepAuth.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","PaymentInfo.CVV":"CVV Code","PaymentInfo.Card.Title":"Enter your card information","PaymentInfo.Billing.Title":"Enter your billing address","PaymentInfo.Done":"PROCEED TO CHECKOUT","PaymentCard.Error.Invalid":"Invalid card number","PaymentCard.Error.Incomplete":"Incomplete card number","LimitReached.Ok":"OK, GOT IT",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"},Months:{one_value:"%1$d month",other_value:"%1$d months"},Years:{one_value:"%1$d year",other_value:"%1$d years"},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",PaymentInvoice:"INVOICE",PaymentTestInvoice:"TEST INVOICE",PaymentReceipt:"Receipt",PaymentCheckout:"Checkout",PaymentTransactionTotal:"Total",PaymentTip:"Tip",PaymentTipOptional:"Tip (Optional)",PaymentCheckoutPay:"PAY %1$s",PaymentCheckoutMethod:"Payment method",PaymentCheckoutProvider:"Payment provider",PaymentCardNumber:"Card Number",PaymentCardSavePaymentInformation:"Save Payment Information",PaymentCardInfo:"Payment info",PaymentCardSavePaymentInformationInfoLine1:"You can save your payment info for future use. It will be stored directly with the payment provider. Telegram has no access to your credit card data.",Done:"Done",PaymentShippingMethod:"Shipping methods",PaymentNoShippingMethod:"Sorry, it is not possible to deliver to your address.",PaymentShippingInfo:"Shipping Information",PaymentShippingAddress:"Shipping address",PaymentShippingAddress1Placeholder:"Address 1 (Street)",PaymentShippingAddress2Placeholder:"Address 2 (Street)",PaymentShippingCityPlaceholder:"City",PaymentShippingStatePlaceholder:"State",PaymentShippingCountry:"Country",PaymentShippingZipPlaceholder:"Postcode",PaymentShippingReceiver:"Receiver",PaymentShippingName:"Full Name",PaymentShippingEmailPlaceholder:"Email",PaymentCheckoutPhoneNumber:"Phone number",PaymentCheckoutShippingMethod:"Shipping method",PaymentShippingSave:"Save Shipping Information",PaymentShippingSaveInfo:"You can save your shipping info for future use.",PaymentInfoHint:"You paid **%1$s** for **%2$s**.",PrivacyPayments:"Payments",PrivacyPaymentsClearInfo:"You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data.",PrivacyPaymentsClear:"Clear Payment and Shipping Info",PrivacyPaymentsClearAlertTitle:"Clear payment info",PrivacyPaymentsClearAlertText:"Are you sure you want to clear your payment and shipping info?",PrivacyPaymentsPaymentInfoCleared:"Payment info cleared.",PrivacyPaymentsShippingInfoCleared:"Shipping info cleared.",PrivacyPaymentsPaymentShippingCleared:"Payment and shipping info cleared.",PrivacyClearShipping:"Shipping info",PrivacyClearPayment:"Payment info",Clear:"Clear",Save:"Save",PaymentCheckoutName:"Name",ClearRecentStickersAlertTitle:"Clear recent stickers",ClearRecentStickersAlertMessage:"Do you want to clear all your recent stickers?",PremiumStickersShort:"Premium",FavoriteStickers:"Favorites",AddToFavorites:"Add to Favorites",AddedToFavorites:"Sticker added to Favorites.",RemovedFromFavorites:"Sticker was removed from Favorites",RemovedFromRecent:"Sticker was removed from Recent",DeleteFromFavorites:"Delete from Favorites",DeleteFromRecent:"Remove from Recent",NewChatsFromNonContacts:"New chats from unknown users",ArchiveAndMute:"Archive and Mute",ArchiveAndMuteInfo:"Automatically archive and mute new chats, groups and channels from non-contacts.",PrivacyVoiceMessages:"Voice Messages",PrivacyVoiceMessagesTitle:"Who can send me voice or video messages?",PrivacyVoiceMessagesInfo:"You can restrict who can send you voice or video messages with granular precision.",PrivacyVoiceMessagesPremiumOnly:"Only subscribers of *Telegram Premium* can restrict receiving voice messages.",EmojiCount:{other_value:"%1$d emoji"},AddEmojiNotFound:"Emoji pack not found.",MessageContainsEmojiPack:"This message contains emoji from %s pack.",MessageContainsEmojiPacks:{other_value:"This message contains emoji from **%d Packs**."},EmojiPackCount:{one_value:"%1$d Emoji Pack",other_value:"%1$d Emoji Packs"},ReactionsAll:"All",EnableSomeReactionsInfo:"Members of the group can use only certain approved emoji as reactions to messages.",EnableAllReactionsInfo:"Members of the group can use any emoji as reactions to messages.",DisableReactionsInfo:"Members of the group can’t add any reactions to messages.",OnlyAllowThisReactions:"Only allow these reactions",AllReactions:"All reactions",SomeReactions:"Some reactions",NoReactions:"No reactions",LimitReached:"Limit Reached",LimitReachedPinDialogs:"You can't pin more than %1$d chats to the top. Unpin some that are currently pinned – or subscribe to **Telegram Premium** to double the limit to **%2$d** chats.",LimitReachedPinDialogsPremium:"Sorry, you can't pin more than %1$d chats to the top. Unpin some that are currently pinned.",LimitReachedPinDialogsLocked:"Sorry, you can't pin more than %1$d chats to the top. Unpin some that are currently pinned. We are working to let you increase this limit in the future.",IncreaseLimit:"Increase Limit",LimitFree:"Free",LimitPremium:"Premium",ActionTTLChanged:"un1 set messages to auto-delete in %1$s",ActionTTLYouChanged:"You set messages to auto-delete in %1$s",ActionTTLChannelChanged:"Messages in this channel will be automatically deleted after %1$s",ActionTTLChannelDisabled:"Messages in this channel will no longer be automatically deleted",ActionTTLDisabled:"un1 disabled the auto-delete timer",ActionTTLYouDisabled:"You disabled the auto-delete timer","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.SendVoice.PrivacyError":"%@ doesn't accept voice and video messages","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.PaymentSent1":"You have successfully transferred **%1$@** to **%2$@** for **%3$@**","Chat.Service.PaymentSent1NoTitle":"You have successfully transferred **%1$@** to **%2$@**","Chat.Service.PaymentSentRecurringInit":"You successfully transferred **%1$@** to **%2$@** for **%3$@** and allowed future recurring payments","Chat.Service.PaymentSentRecurringInitNoTitle":"You successfully transferred **%1$@** to **%2$@** and allowed future recurring payments","Chat.Service.PaymentSentRecurringUsed":"You have just successfully transferred **%1$@** to **%2$@** for **%3$@** via recurrent payments","Chat.Service.PaymentSentRecurringUsedNoTitle":"You have just successfully transferred **%1$@** to **%2$@** via recurrent payments","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","Checkout.2FA.Text":"Saving payment details is only available with 2-Step Verification.","Checkout.NewCard.CardholderNamePlaceholder":"Cardholder Name","Checkout.PasswordEntry.Title":"Payment Confirmation","Checkout.PasswordEntry.Pay":"Pay","Checkout.PasswordEntry.Text":"Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password.","Checkout.PayPrice":"Pay %@","Checkout.WebConfirmation.Title":"Complete Payment","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.","Context.ViewStickerSet":"View Sticker Set","CreateGroup.NameHolder":"Group Name","CustomEmoji.PremiumAlert":"Subscribe to Telegram Premium to unlock this emoji. [Read More]()","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","Error.AnError":"An error occurred. Please try again later.","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","Message.ReplyActionButtonShowReceipt":"Show Receipt","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$@"',"Payments.Recurrent.Accept":"I accept [Terms of Service]() of **%@**.","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?","SecureId.Identity.Placeholder.ExpiryDate":"Expiry Date","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","Sticker.Premium.Click.Info":"This pack contains premium stickers like this one. [View Pack]()","Stickers.Recent":"Recent","StickerSet.DontExist":"Sorry, this sticker set doesn't seem to exist.","Text.Context.Copy.Username":"Copy Username","Text.Context.Copy.Hashtag":"Copy Hashtag","Time.TomorrowAt":"tomorrow at %@","TwoStepAuth.SetPasswordHelp":"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.","TwoStepAuth.GenericHelp":"You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account.","TwoStepAuth.ChangePassword":"Change Password","TwoStepAuth.RemovePassword":"Turn Password Off","TwoStepAuth.SetupEmail":"Set Recovery Email","TwoStepAuth.ChangeEmail":"Change Recovery Email","TwoStepAuth.ConfirmEmailCodeDesc":"Please enter the code we've just emailed to %@.","TwoStepAuth.RecoveryTitle":"Email Code","TwoStepAuth.RecoveryCode":"Code","TwoStepAuth.RecoveryCodeInvalid":"Invalid code. Please try again.","TwoStepAuth.RecoveryCodeExpired":"Code Expired","TwoStepAuth.SetupHintTitle":"Password Hint","TwoStepAuth.SetupHintPlaceholder":"Hint","UsernameSettings.ChangeDescription":"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\n\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.","VoiceChat.Chat.StartNew":"Video chat ended. Start a new one?","VoiceChat.Chat.StartNew.OK":"Start","VoiceChat.Chat.Ended":"Video chat ended.","VoiceChat.Invite.InviteMembers":"Invite members","VoiceChat.Status.Connecting":"Connecting...","VoiceChat.Status.Members":{one_value:"%d participant",other_value:"%d participants"},"VoiceChat.Status.MutedForYou":"muted for you","VoiceChat.Status.Speaking":"speaking","VoiceChat.Status.Listening":"listening","VoiceChat.Status.WantsSpeak":"wants to speak","VoiceChat.Status.Muted":"muted","VoiceChat.Status.You":"This is you","VoiceChat.Video.Stream.Video":"video","VoiceChat.Video.Stream.Screencast":"screen","VoiceChat.Video.Stream.More":"more","VoiceChat.Leave":"Leave","VoiceChat.End.Title":"Leave video chat","VoiceChat.End.Text":"Are you sure you want to leave this video chat?","VoiceChat.End.Third":"End Video Chat","VoiceChat.End.OK":"Leave","VoiceChat.MutePeer":"Mute","VoiceChat.UnmutePeer":"Allow To Speak","VoiceChat.RemovePeer":"Remove","VoiceChat.OpenProfile":"Open Profile","VoiceChat.MuteForMe":"Mute For Me","VoiceChat.UnmuteForMe":"Unmute For Me","VoiceChat.RemovePeer.Confirm.Channel":"Do you want to remove %1$@ from the channel?","VoiceChat.RemovePeer.Confirm":"Are you sure you want to remove %1$@ from the group?","VoiceChat.RemovePeer.Confirm.OK":"Remove"}}}]); -//# sourceMappingURL=104.d9383d4cf03fc631a3a9.chunk.js.map \ No newline at end of file diff --git a/public/104.d9383d4cf03fc631a3a9.chunk.js.map b/public/104.d9383d4cf03fc631a3a9.chunk.js.map deleted file mode 100644 index a83a6ae6..00000000 --- a/public/104.d9383d4cf03fc631a3a9.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"104.d9383d4cf03fc631a3a9.chunk.js","mappings":"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","sources":["webpack://tweb/./src/lang.ts"],"sourcesContent":["const lang = {\n 'Animations': 'Animations',\n 'AttachAlbum': 'Album',\n 'Appearance.Color.Hex': 'HEX',\n 'Appearance.Color.RGB': 'RGB',\n 'BlockModal.Search.Placeholder': 'Block user...',\n 'DarkMode': 'Dark Mode',\n 'FilterIncludeExcludeInfo': 'Choose chats and types of chats that will\\nappear and never appear in this folder.',\n 'FilterMenuDelete': 'Delete Folder',\n 'FilterHeaderEdit': 'Edit Folder',\n 'FilterAllGroups': 'All Groups',\n 'FilterAllContacts': 'All Contacts',\n 'FilterAllNonContacts': 'All Non-Contacts',\n 'FilterAllChannels': 'All Channels',\n 'FilterAllBots': 'All Bots',\n 'EditContact.OriginalName': 'original name',\n 'EditProfile.FirstNameLabel': 'Name',\n 'EditProfile.BioLabel': 'Bio (optional)',\n 'EditProfile.Username.Label': 'Username (optional)',\n 'EditProfile.Username.Available': 'Username is available',\n 'EditProfile.Username.Taken': 'Username is already taken',\n 'EditProfile.Username.Invalid': 'Username is invalid',\n 'ExceptionModal.Search.Placeholder': 'Add exception...',\n 'Chat.Menu.SelectMessages': 'Select Messages',\n 'Chat.Menu.ClearSelection': 'Clear Selection',\n 'Chat.Menu.Hint': 'To **edit** or **reply**, close this menu.\\nThen tap next to a message.',\n 'Chat.Input.UnpinAll': 'Unpin All Messages',\n 'Chat.Input.Attach.PhotoOrVideo': 'Photo or Video',\n 'Chat.Input.Attach.Document': 'Document',\n 'Chat.Subscribe': 'SUBSCRIBE',\n 'Chat.Selection.LimitToast': 'Max selection count reached.',\n 'Chat.Search.MessagesFound': {\n 'one_value': '%d message found',\n 'other_value': '%d messages found'\n },\n 'Chat.Search.NoMessagesFound': 'No messages found',\n 'Chat.Search.PrivateSearch': 'Private Search',\n 'ChatList.Main.EmptyPlaceholder.Title': 'Your chats will appear here',\n 'ChatList.Main.EmptyPlaceholder.Subtitle': 'You have %s on Telegram',\n 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts': 'Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts',\n // \"ChatList.Menu.Archived\": \"Archived\",\n 'ChatList.Menu.SwitchTo.Webogram': 'Switch to Old Version',\n 'ChatList.Menu.SwitchTo.Z': 'Switch to Z version',\n 'ChatMigration.From': 'Migrated from %s',\n 'ChatMigration.To': 'Migrated to %s',\n 'ConnectionStatus.ForceReconnect': 'force reconnect',\n 'ConnectionStatus.ReconnectIn': 'Reconnect in %ds, %s',\n 'ConnectionStatus.Reconnect': 'reconnect',\n 'ConnectionStatus.Reconnecting': 'Reconnecting...',\n 'ConnectionStatus.TimedOut': 'Request timed out, %s',\n 'ConnectionStatus.Waiting': 'Waiting for network...',\n 'Contacts.Count': {\n 'one_value': '%d contact',\n 'other_value': '%d contacts'\n },\n 'Deactivated.Title': 'Too many tabs...',\n 'Deactivated.Subtitle': 'Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.',\n 'Deactivated.Version.Title': 'WebK has updated...',\n 'Deactivated.Version.Subtitle': 'Another tab is running a newer version of Telegram.\\nClick anywhere to reload this tab.',\n // \"Drafts\": {\n // \"one_value\": \"%d draft\",\n // \"other_value\": \"%d drafts\",\n // },\n 'General.Keyboard': 'Keyboard',\n 'General.SendShortcut.Enter': 'Send by Enter',\n 'General.SendShortcut.CtrlEnter': 'Send by %s + Enter',\n 'General.SendShortcut.NewLine.ShiftEnter': 'New line by Shift + Enter',\n 'General.SendShortcut.NewLine.Enter': 'New line by Enter',\n 'General.TimeFormat': 'Time Format',\n 'General.TimeFormat.h12': '12-hour',\n 'General.TimeFormat.h23': '24-hour',\n 'ChatBackground.UploadWallpaper': 'Upload Wallpaper',\n 'ChatBackground.Blur': 'Blur Wallpaper Image',\n 'Notifications.Sound': 'Notification Sound',\n 'NewPrivateChat': 'New Private Chat',\n 'NewPoll.OptionLabel': 'Option %d',\n 'Message.Context.Selection.Copy': 'Copy selected',\n 'Message.Context.Selection.Clear': 'Clear selection',\n 'Message.Context.Selection.Delete': 'Delete selected',\n 'Message.Context.Selection.Forward': 'Forward selected',\n 'Message.Context.Selection.SendNow': 'Send Now selected',\n 'Message.Unsupported.Desktop': '__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__',\n 'Message.Unsupported.Mobile': '__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__',\n 'Checkbox.Enabled': 'Enabled',\n 'Checkbox.Disabled': 'Disabled',\n 'Error.PreviewSender.CaptionTooLong': 'Caption is too long.',\n 'PreviewSender.GroupItems': 'Group items',\n 'PreviewSender.SendAlbum': {\n 'one_value': 'Send Album',\n 'other_value': 'Send %d Albums'\n },\n 'Presence.YourChat': 'chat with yourself',\n 'Privacy.Devices': {\n 'one_value': '%1$d device',\n 'other_value': '%1$d devices'\n },\n 'Privacy.SensitiveContent': 'Sensitive Content',\n 'PrivacyModal.Search.Placeholder': 'Add Users or Groups...',\n 'Permissions.NoExceptions': 'No exceptions',\n 'Permissions.ExceptionsCount': {\n 'one_value': '%d exception',\n 'other_value': '%d exceptions'\n },\n 'Link.Available': 'Link is available',\n 'Link.Taken': 'Link is already taken',\n 'Link.Invalid': 'Link is invalid',\n 'StickersTab.SearchPlaceholder': 'Search Stickers',\n 'ForwardedFrom': 'Forwarded from %s',\n 'Popup.Avatar.Title': 'Drag to Reposition',\n 'Popup.Unpin.AllTitle': 'Unpin all messages',\n 'Popup.Unpin.HideTitle': 'Hide pinned messages',\n 'Popup.Unpin.HideDescription': 'Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.',\n 'Popup.Unpin.Hide': 'Hide',\n 'TwoStepAuth.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 'PushNotification.Action.Settings': 'Background alerts settings',\n 'PushNotification.Action.Mute1d.Mobile': 'Mute for 24H',\n 'PushNotification.Action.Settings.Mobile': 'Alerts settings',\n '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 // \"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n // it is from iOS\n 'VoiceChat.DiscussionGroup': 'discussion group',\n 'PaymentInfo.CVV': 'CVV Code',\n 'PaymentInfo.Card.Title': 'Enter your card information',\n 'PaymentInfo.Billing.Title': 'Enter your billing address',\n 'PaymentInfo.Done': 'PROCEED TO CHECKOUT',\n 'PaymentCard.Error.Invalid': 'Invalid card number',\n 'PaymentCard.Error.Incomplete': 'Incomplete card number',\n 'LimitReached.Ok': 'OK, GOT IT',\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 'Months': {\n 'one_value': '%1$d month',\n 'other_value': '%1$d months'\n },\n 'Years': {\n 'one_value': '%1$d year',\n 'other_value': '%1$d years'\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 'PaymentInvoice': 'INVOICE',\n 'PaymentTestInvoice': 'TEST INVOICE',\n 'PaymentReceipt': 'Receipt',\n 'PaymentCheckout': 'Checkout',\n 'PaymentTransactionTotal': 'Total',\n 'PaymentTip': 'Tip',\n 'PaymentTipOptional': 'Tip (Optional)',\n 'PaymentCheckoutPay': 'PAY %1$s',\n 'PaymentCheckoutMethod': 'Payment method',\n 'PaymentCheckoutProvider': 'Payment provider',\n 'PaymentCardNumber': 'Card Number',\n 'PaymentCardSavePaymentInformation': 'Save Payment Information',\n 'PaymentCardInfo': 'Payment info',\n 'PaymentCardSavePaymentInformationInfoLine1': 'You can save your payment info for future use. It will be stored directly with the payment provider. Telegram has no access to your credit card data.',\n 'Done': 'Done',\n 'PaymentShippingMethod': 'Shipping methods',\n 'PaymentNoShippingMethod': 'Sorry, it is not possible to deliver to your address.',\n 'PaymentShippingInfo': 'Shipping Information',\n 'PaymentShippingAddress': 'Shipping address',\n 'PaymentShippingAddress1Placeholder': 'Address 1 (Street)',\n 'PaymentShippingAddress2Placeholder': 'Address 2 (Street)',\n 'PaymentShippingCityPlaceholder': 'City',\n 'PaymentShippingStatePlaceholder': 'State',\n 'PaymentShippingCountry': 'Country',\n 'PaymentShippingZipPlaceholder': 'Postcode',\n 'PaymentShippingReceiver': 'Receiver',\n 'PaymentShippingName': 'Full Name',\n 'PaymentShippingEmailPlaceholder': 'Email',\n 'PaymentCheckoutPhoneNumber': 'Phone number',\n 'PaymentCheckoutShippingMethod': 'Shipping method',\n 'PaymentShippingSave': 'Save Shipping Information',\n 'PaymentShippingSaveInfo': 'You can save your shipping info for future use.',\n 'PaymentInfoHint': 'You paid **%1$s** for **%2$s**.',\n 'PrivacyPayments': 'Payments',\n 'PrivacyPaymentsClearInfo': 'You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data.',\n 'PrivacyPaymentsClear': 'Clear Payment and Shipping Info',\n 'PrivacyPaymentsClearAlertTitle': 'Clear payment info',\n 'PrivacyPaymentsClearAlertText': 'Are you sure you want to clear your payment and shipping info?',\n 'PrivacyPaymentsPaymentInfoCleared': 'Payment info cleared.',\n 'PrivacyPaymentsShippingInfoCleared': 'Shipping info cleared.',\n 'PrivacyPaymentsPaymentShippingCleared': 'Payment and shipping info cleared.',\n 'PrivacyClearShipping': 'Shipping info',\n 'PrivacyClearPayment': 'Payment info',\n 'Clear': 'Clear',\n 'Save': 'Save',\n 'PaymentCheckoutName': 'Name',\n 'ClearRecentStickersAlertTitle': 'Clear recent stickers',\n 'ClearRecentStickersAlertMessage': 'Do you want to clear all your recent stickers?',\n 'PremiumStickersShort': 'Premium',\n 'FavoriteStickers': 'Favorites',\n 'AddToFavorites': 'Add to Favorites',\n 'AddedToFavorites': 'Sticker added to Favorites.',\n 'RemovedFromFavorites': 'Sticker was removed from Favorites',\n 'RemovedFromRecent': 'Sticker was removed from Recent',\n 'DeleteFromFavorites': 'Delete from Favorites',\n 'DeleteFromRecent': 'Remove from Recent',\n 'NewChatsFromNonContacts': 'New chats from unknown users',\n 'ArchiveAndMute': 'Archive and Mute',\n 'ArchiveAndMuteInfo': 'Automatically archive and mute new chats, groups and channels from non-contacts.',\n 'PrivacyVoiceMessages': 'Voice Messages',\n 'PrivacyVoiceMessagesTitle': 'Who can send me voice or video messages?',\n 'PrivacyVoiceMessagesInfo': 'You can restrict who can send you voice or video messages with granular precision.',\n 'PrivacyVoiceMessagesPremiumOnly': 'Only subscribers of *Telegram Premium* can restrict receiving voice messages.',\n 'EmojiCount': {\n 'other_value': '%1$d emoji'\n },\n 'AddEmojiNotFound': 'Emoji pack not found.',\n 'MessageContainsEmojiPack': 'This message contains emoji from %s pack.',\n 'MessageContainsEmojiPacks': {\n 'other_value': 'This message contains emoji from **%d Packs**.'\n },\n 'EmojiPackCount': {\n 'one_value': '%1$d Emoji Pack',\n 'other_value': '%1$d Emoji Packs'\n },\n 'ReactionsAll': 'All',\n 'EnableSomeReactionsInfo': 'Members of the group can use only certain approved emoji as reactions to messages.',\n 'EnableAllReactionsInfo': 'Members of the group can use any emoji as reactions to messages.',\n 'DisableReactionsInfo': 'Members of the group can’t add any reactions to messages.',\n 'OnlyAllowThisReactions': 'Only allow these reactions',\n 'AllReactions': 'All reactions',\n 'SomeReactions': 'Some reactions',\n 'NoReactions': 'No reactions',\n 'LimitReached': 'Limit Reached',\n 'LimitReachedPinDialogs': 'You can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned – or subscribe to **Telegram Premium** to double the limit to **%2$d** chats.',\n 'LimitReachedPinDialogsPremium': 'Sorry, you can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned.',\n 'LimitReachedPinDialogsLocked': 'Sorry, you can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned. We are working to let you increase this limit in the future.',\n 'IncreaseLimit': 'Increase Limit',\n 'LimitFree': 'Free',\n 'LimitPremium': 'Premium',\n 'ActionTTLChanged': 'un1 set messages to auto-delete in %1$s',\n 'ActionTTLYouChanged': 'You set messages to auto-delete in %1$s',\n 'ActionTTLChannelChanged': 'Messages in this channel will be automatically deleted after %1$s',\n 'ActionTTLChannelDisabled': 'Messages in this channel will no longer be automatically deleted',\n 'ActionTTLDisabled': 'un1 disabled the auto-delete timer',\n 'ActionTTLYouDisabled': 'You disabled the auto-delete timer',\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.SendVoice.PrivacyError': '%@ doesn\\'t accept voice and video messages',\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.PaymentSent1': 'You have successfully transferred **%1$@** to **%2$@** for **%3$@**',\n 'Chat.Service.PaymentSent1NoTitle': 'You have successfully transferred **%1$@** to **%2$@**',\n 'Chat.Service.PaymentSentRecurringInit': 'You successfully transferred **%1$@** to **%2$@** for **%3$@** and allowed future recurring payments',\n 'Chat.Service.PaymentSentRecurringInitNoTitle': 'You successfully transferred **%1$@** to **%2$@** and allowed future recurring payments',\n 'Chat.Service.PaymentSentRecurringUsed': 'You have just successfully transferred **%1$@** to **%2$@** for **%3$@** via recurrent payments',\n 'Chat.Service.PaymentSentRecurringUsedNoTitle': 'You have just successfully transferred **%1$@** to **%2$@** via recurrent payments',\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 'Checkout.2FA.Text': 'Saving payment details is only available with 2-Step Verification.',\n 'Checkout.NewCard.CardholderNamePlaceholder': 'Cardholder Name',\n 'Checkout.PasswordEntry.Title': 'Payment Confirmation',\n 'Checkout.PasswordEntry.Pay': 'Pay',\n 'Checkout.PasswordEntry.Text': 'Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password.',\n 'Checkout.PayPrice': 'Pay %@',\n 'Checkout.WebConfirmation.Title': 'Complete Payment',\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 'Context.ViewStickerSet': 'View Sticker Set',\n 'CreateGroup.NameHolder': 'Group Name',\n 'CustomEmoji.PremiumAlert': 'Subscribe to Telegram Premium to unlock this emoji. [Read More]()',\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 'Error.AnError': 'An error occurred. Please try again later.',\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 'Message.ReplyActionButtonShowReceipt': 'Show Receipt',\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 'Payments.Recurrent.Accept': 'I accept [Terms of Service]() of **%@**.',\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 'SecureId.Identity.Placeholder.ExpiryDate': 'Expiry Date',\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 'Sticker.Premium.Click.Info': 'This pack contains premium stickers like this one. [View Pack]()',\n 'Stickers.Recent': 'Recent',\n // \"Stickers.Favorite\": \"Favorite\",\n 'StickerSet.DontExist': 'Sorry, this sticker set doesn\\'t seem to exist.',\n 'Text.Context.Copy.Username': 'Copy Username',\n 'Text.Context.Copy.Hashtag': 'Copy Hashtag',\n 'Time.TomorrowAt': 'tomorrow at %@',\n 'TwoStepAuth.SetPasswordHelp': 'You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.',\n 'TwoStepAuth.GenericHelp': 'You have enabled Two-Step verification.\\nYou\\'ll need the password you set up here to log in to your Telegram account.',\n 'TwoStepAuth.ChangePassword': 'Change Password',\n 'TwoStepAuth.RemovePassword': 'Turn Password Off',\n 'TwoStepAuth.SetupEmail': 'Set Recovery Email',\n 'TwoStepAuth.ChangeEmail': 'Change Recovery Email',\n 'TwoStepAuth.ConfirmEmailCodeDesc': 'Please enter the code we\\'ve just emailed to %@.',\n 'TwoStepAuth.RecoveryTitle': 'Email Code',\n 'TwoStepAuth.RecoveryCode': 'Code',\n 'TwoStepAuth.RecoveryCodeInvalid': 'Invalid code. Please try again.',\n 'TwoStepAuth.RecoveryCodeExpired': 'Code Expired',\n 'TwoStepAuth.SetupHintTitle': 'Password Hint',\n 'TwoStepAuth.SetupHintPlaceholder': 'Hint',\n 'UsernameSettings.ChangeDescription': 'You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\\n\\n\\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.',\n 'VoiceChat.Chat.StartNew': 'Video chat ended. Start a new one?',\n 'VoiceChat.Chat.StartNew.OK': 'Start',\n 'VoiceChat.Chat.Ended': 'Video chat ended.',\n 'VoiceChat.Invite.InviteMembers': 'Invite members',\n 'VoiceChat.Status.Connecting': 'Connecting...',\n 'VoiceChat.Status.Members': {\n 'one_value': '%d participant',\n 'other_value': '%d participants'\n },\n 'VoiceChat.Status.MutedForYou': 'muted for you',\n 'VoiceChat.Status.Speaking': 'speaking',\n 'VoiceChat.Status.Listening': 'listening',\n 'VoiceChat.Status.WantsSpeak': 'wants to speak',\n 'VoiceChat.Status.Muted': 'muted',\n 'VoiceChat.Status.You': 'This is you',\n 'VoiceChat.Video.Stream.Video': 'video',\n 'VoiceChat.Video.Stream.Screencast': 'screen',\n 'VoiceChat.Video.Stream.More': 'more',\n 'VoiceChat.Leave': 'Leave',\n 'VoiceChat.End.Title': 'Leave video chat',\n 'VoiceChat.End.Text': 'Are you sure you want to leave this video chat?',\n 'VoiceChat.End.Third': 'End Video Chat',\n 'VoiceChat.End.OK': 'Leave',\n 'VoiceChat.MutePeer': 'Mute',\n 'VoiceChat.UnmutePeer': 'Allow To Speak',\n 'VoiceChat.RemovePeer': 'Remove',\n 'VoiceChat.OpenProfile': 'Open Profile',\n 'VoiceChat.MuteForMe': 'Mute For Me',\n 'VoiceChat.UnmuteForMe': 'Unmute For Me',\n 'VoiceChat.RemovePeer.Confirm.Channel': 'Do you want to remove %1$@ from the channel?',\n 'VoiceChat.RemovePeer.Confirm': 'Are you sure you want to remove %1$@ from the group?',\n 'VoiceChat.RemovePeer.Confirm.OK': 'Remove'\n};\n\nexport default lang;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/231.071dbf1017e65586295d.chunk.js b/public/231.2cf58745476f33d0c32c.chunk.js similarity index 96% rename from public/231.071dbf1017e65586295d.chunk.js rename to public/231.2cf58745476f33d0c32c.chunk.js index 101e1551..abb43828 100644 --- a/public/231.071dbf1017e65586295d.chunk.js +++ b/public/231.2cf58745476f33d0c32c.chunk.js @@ -1,2 +1,2 @@ "use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[231],{3231:(t,e,a)=>{a.r(e),a.d(e,{default:()=>u});var n=a(279),i=a(4159),o=a(236),r=a(3512),h=a(4874);let d;const s=new h.Z("page-signImport",!0,(()=>{var t,e,h,u;(0,n.y)(s.pageEl.firstElementChild,!0),t=void 0,e=void 0,u=function*(){const{dcId:t,token:e,tgAddr:n}=d;let h;try{r.Z.managers.apiManager.setBaseDcId(t);const n=yield r.Z.managers.apiManager.invokeApi("auth.importWebTokenAuthorization",{api_id:i.Z.id,api_hash:i.Z.hash,web_auth_token:e},{dcId:t,ignoreErrors:!0});"auth.authorization"===n._&&(r.Z.managers.apiManager.setUser(n.user),h=a.e(781).then(a.bind(a,5436)))}catch(t){switch(t.type){case"SESSION_PASSWORD_NEEDED":t.handled=!0,h=a.e(774).then(a.bind(a,9437));break;default:{console.error("authorization import error:",t);const e=o.h.authState._;"authStateSignIn"===e?h=a.e(641).then(a.bind(a,810)):"authStateSignQr"===e&&(h=a.e(776).then(a.bind(a,9709)));break}}}location.hash=(null==n?void 0:n.trim())?"#?tgaddr="+encodeURIComponent(n):"",h&&h.then((t=>t.default.mount()))},new((h=void 0)||(h=Promise))((function(a,n){function i(t){try{r(u.next(t))}catch(t){n(t)}}function o(t){try{r(u.throw(t))}catch(t){n(t)}}function r(t){var e;t.done?a(t.value):(e=t.value,e instanceof h?e:new h((function(t){t(e)}))).then(i,o)}r((u=u.apply(t,e||[])).next())}))}),(t=>{d=t,r.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignImport",data:d})})),u=s}}]); -//# sourceMappingURL=231.071dbf1017e65586295d.chunk.js.map \ No newline at end of file +//# sourceMappingURL=231.2cf58745476f33d0c32c.chunk.js.map \ No newline at end of file diff --git a/public/231.071dbf1017e65586295d.chunk.js.map b/public/231.2cf58745476f33d0c32c.chunk.js.map similarity index 97% rename from public/231.071dbf1017e65586295d.chunk.js.map rename to public/231.2cf58745476f33d0c32c.chunk.js.map index 75317c04..961534a3 100644 --- a/public/231.071dbf1017e65586295d.chunk.js.map +++ b/public/231.2cf58745476f33d0c32c.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"231.071dbf1017e65586295d.chunk.js","mappings":"6KAaA,IAAIA,EAEJ,MAwCMC,EAAO,IAAI,IAAK,mBAAmB,GAAM,K,aAC7C,OAAaA,EAAKC,OAAOC,mBAAmB,G,OAzCb,E,OAAA,E,EAAA,YAC/B,MAAM,KAACC,EAAI,MAAEC,EAAK,OAAEC,GAAUN,EAC9B,IAAIO,EACJ,IACE,oCAA0CH,GAC1C,MAAMI,QAAsB,kCAAwC,mCAAoC,CACtGC,OAAQ,OACRC,SAAU,SACVC,eAAgBN,GACf,CAACD,KAAAA,EAAMQ,cAAc,IAED,uBAApBJ,EAAcK,IACf,gCAAsCL,EAAcM,MACpDP,EAAiB,+BAGnB,MAAMQ,GACN,OAAQA,EAAiBC,MACvB,IAAK,0BACFD,EAAiBE,SAAU,EAC5BV,EAAiB,8BACjB,MAGF,QAAS,CACPW,QAAQC,MAAM,8BAA+BJ,GAC7C,MAAMK,EAAe,gBACD,oBAAjBA,EAAoCb,EAAiB,6BAC/B,oBAAjBa,IAAoCb,EAAiB,+BAC7D,QAKNc,SAASC,MAAOhB,MAAAA,OAAM,EAANA,EAAQiB,QAAS,YAAcC,mBAAmBlB,GAAU,GACzEC,GACDA,EAAekB,MAAMC,GAAMA,EAAEC,QAAQC,W,YApCR,K,qQA2C7BC,IACF7B,EAAO6B,EACP,yCAA+C,YAAa,CAAChB,EAAG,sBAAuBb,KAAAA,OAGzF","sources":["webpack://tweb/./src/pages/pageSignImport.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {putPreloader} from '../components/putPreloader';\nimport App from '../config/app';\nimport {STATE_INIT} from '../config/state';\nimport rootScope from '../lib/rootScope';\nimport {AuthState} from '../types';\nimport Page from './page';\n\nlet data: AuthState.signImport['data'];\n\nconst importWebToken = async() => {\n const {dcId, token, tgAddr} = data;\n let mountPageAfter: Promise<{default: Page}>;\n try {\n rootScope.managers.apiManager.setBaseDcId(dcId);\n const authorization = await rootScope.managers.apiManager.invokeApi('auth.importWebTokenAuthorization', {\n api_id: App.id,\n api_hash: App.hash,\n web_auth_token: token\n }, {dcId, ignoreErrors: true});\n\n if(authorization._ === 'auth.authorization') {\n rootScope.managers.apiManager.setUser(authorization.user);\n mountPageAfter = import('./pageIm');\n // return;\n }\n } catch(err) {\n switch((err as ApiError).type) {\n case 'SESSION_PASSWORD_NEEDED': {\n (err as ApiError).handled = true;\n mountPageAfter = import('./pagePassword');\n break;\n }\n\n default: {\n console.error('authorization import error:', err);\n const defaultState = STATE_INIT.authState._;\n if(defaultState === 'authStateSignIn') mountPageAfter = import('./pageSignIn');\n else if(defaultState === 'authStateSignQr') mountPageAfter = import('./pageSignQR');\n break;\n }\n }\n }\n\n location.hash = tgAddr?.trim() ? '#?tgaddr=' + encodeURIComponent(tgAddr) : '';\n if(mountPageAfter) {\n mountPageAfter.then((m) => m.default.mount());\n }\n};\n\nconst page = new Page('page-signImport', true, () => {\n putPreloader(page.pageEl.firstElementChild, true);\n importWebToken();\n}, (_data: typeof data) => {\n data = _data;\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignImport', data});\n});\n\nexport default page;\n"],"names":["data","page","pageEl","firstElementChild","dcId","token","tgAddr","mountPageAfter","authorization","api_id","api_hash","web_auth_token","ignoreErrors","_","user","err","type","handled","console","error","defaultState","location","hash","trim","encodeURIComponent","then","m","default","mount","_data"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"231.2cf58745476f33d0c32c.chunk.js","mappings":"6KAaA,IAAIA,EAEJ,MAwCMC,EAAO,IAAI,IAAK,mBAAmB,GAAM,K,aAC7C,OAAaA,EAAKC,OAAOC,mBAAmB,G,OAzCb,E,OAAA,E,EAAA,YAC/B,MAAM,KAACC,EAAI,MAAEC,EAAK,OAAEC,GAAUN,EAC9B,IAAIO,EACJ,IACE,oCAA0CH,GAC1C,MAAMI,QAAsB,kCAAwC,mCAAoC,CACtGC,OAAQ,OACRC,SAAU,SACVC,eAAgBN,GACf,CAACD,KAAAA,EAAMQ,cAAc,IAED,uBAApBJ,EAAcK,IACf,gCAAsCL,EAAcM,MACpDP,EAAiB,+BAGnB,MAAMQ,GACN,OAAQA,EAAiBC,MACvB,IAAK,0BACFD,EAAiBE,SAAU,EAC5BV,EAAiB,8BACjB,MAGF,QAAS,CACPW,QAAQC,MAAM,8BAA+BJ,GAC7C,MAAMK,EAAe,gBACD,oBAAjBA,EAAoCb,EAAiB,6BAC/B,oBAAjBa,IAAoCb,EAAiB,+BAC7D,QAKNc,SAASC,MAAOhB,MAAAA,OAAM,EAANA,EAAQiB,QAAS,YAAcC,mBAAmBlB,GAAU,GACzEC,GACDA,EAAekB,MAAMC,GAAMA,EAAEC,QAAQC,W,YApCR,K,qQA2C7BC,IACF7B,EAAO6B,EACP,yCAA+C,YAAa,CAAChB,EAAG,sBAAuBb,KAAAA,OAGzF","sources":["webpack://tweb/./src/pages/pageSignImport.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {putPreloader} from '../components/putPreloader';\nimport App from '../config/app';\nimport {STATE_INIT} from '../config/state';\nimport rootScope from '../lib/rootScope';\nimport {AuthState} from '../types';\nimport Page from './page';\n\nlet data: AuthState.signImport['data'];\n\nconst importWebToken = async() => {\n const {dcId, token, tgAddr} = data;\n let mountPageAfter: Promise<{default: Page}>;\n try {\n rootScope.managers.apiManager.setBaseDcId(dcId);\n const authorization = await rootScope.managers.apiManager.invokeApi('auth.importWebTokenAuthorization', {\n api_id: App.id,\n api_hash: App.hash,\n web_auth_token: token\n }, {dcId, ignoreErrors: true});\n\n if(authorization._ === 'auth.authorization') {\n rootScope.managers.apiManager.setUser(authorization.user);\n mountPageAfter = import('./pageIm');\n // return;\n }\n } catch(err) {\n switch((err as ApiError).type) {\n case 'SESSION_PASSWORD_NEEDED': {\n (err as ApiError).handled = true;\n mountPageAfter = import('./pagePassword');\n break;\n }\n\n default: {\n console.error('authorization import error:', err);\n const defaultState = STATE_INIT.authState._;\n if(defaultState === 'authStateSignIn') mountPageAfter = import('./pageSignIn');\n else if(defaultState === 'authStateSignQr') mountPageAfter = import('./pageSignQR');\n break;\n }\n }\n }\n\n location.hash = tgAddr?.trim() ? '#?tgaddr=' + encodeURIComponent(tgAddr) : '';\n if(mountPageAfter) {\n mountPageAfter.then((m) => m.default.mount());\n }\n};\n\nconst page = new Page('page-signImport', true, () => {\n putPreloader(page.pageEl.firstElementChild, true);\n importWebToken();\n}, (_data: typeof data) => {\n data = _data;\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignImport', data});\n});\n\nexport default page;\n"],"names":["data","page","pageEl","firstElementChild","dcId","token","tgAddr","mountPageAfter","authorization","api_id","api_hash","web_auth_token","ignoreErrors","_","user","err","type","handled","console","error","defaultState","location","hash","trim","encodeURIComponent","then","m","default","mount","_data"],"sourceRoot":""} \ No newline at end of file diff --git a/public/301.a3f22008d452affb1ae4.chunk.js.map b/public/301.a3f22008d452affb1ae4.chunk.js.map deleted file mode 100644 index 125a0b61..00000000 --- a/public/301.a3f22008d452affb1ae4.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"301.a3f22008d452affb1ae4.chunk.js","mappings":"yHAAA,MAuCA,EAvCa,CACX,cAAe,sBACf,mBAAoB,eACpB,0BAA2B,uBAC3B,mBAAoB,oBACpB,kBAAmB,4DACnB,qBAAsB,0CACtB,uBAAwB,yDACxB,sBAAuB,wCACvB,yBAA0B,iDAC1B,uBAAwB,sBACxB,0BAA2B,yDAC3B,0BAA2B,6CAC3B,WAAc,iBAGd,KAAQ,OACR,cAAiB,WACjB,SAAY,YACZ,UAAa,wBACb,SAAY,uBACZ,eAAkB,kBAClB,QAAW,UAGX,mCAAoC,eACpC,aAAc,OACd,2BAA4B,sBAC5B,iBAAkB,gCAClB,iBAAkB,8BAClB,iBAAkB,6DAClB,iBAAkB,mDAClB,kBAAmB,yBACnB,iBAAkB,oBAClB,mBAAsB,eACtB,mBAAsB,eACtB,sBAAyB","sources":["webpack://tweb/./src/langSign.ts"],"sourcesContent":["const lang = {\r\n 'Login.Title': 'Sign in to Telegram',\r\n 'Login.PhoneLabel': 'Phone Number',\r\n 'Login.PhoneLabelInvalid': 'Phone Number Invalid',\r\n 'Login.KeepSigned': 'Keep me signed in',\r\n 'Login.StartText': 'Please confirm your country and\\nenter your phone number.',\r\n 'Login.Code.SentSms': 'We have sent you an SMS\\nwith the code.',\r\n 'Login.Code.SentInApp': 'We have sent you a message in Telegram\\nwith the code.',\r\n 'Login.Code.SentCall': 'We will call you and voice\\nthe code.',\r\n 'Login.Code.SentUnknown': 'Please check everything\\nfor a code (type: %s)',\r\n 'Login.Password.Title': 'Enter Your Password',\r\n 'Login.Password.Subtitle': 'Your account is protected with\\nan additional password',\r\n 'Login.Register.Subtitle': 'Enter your name and add\\na profile picture',\r\n 'PleaseWait': 'Please wait...',\r\n\r\n // * android\r\n 'Code': 'Code',\r\n 'LoginPassword': 'Password',\r\n 'YourName': 'Your Name',\r\n 'FirstName': 'First name (required)',\r\n 'LastName': 'Last name (optional)',\r\n 'StartMessaging': 'Start Messaging',\r\n 'Country': 'Country',\r\n\r\n // * macos\r\n 'Contacts.PhoneNumber.Placeholder': 'Phone Number',\r\n 'Login.Next': 'Next',\r\n 'Login.ContinueOnLanguage': 'Continue in English',\r\n 'Login.QR.Title': 'Log in to Telegram by QR Code',\r\n 'Login.QR.Help1': 'Open Telegram on your phone',\r\n 'Login.QR.Help2': 'Go to **Settings** > **Devices** > **Link Desktop Device**',\r\n 'Login.QR.Help3': 'Point your phone at this screen to confirm login',\r\n 'Login.QR.Cancel': 'Log in by phone Number',\r\n 'Login.QR.Login': 'Log in by QR Code',\r\n 'PHONE_CODE_INVALID': 'Invalid code',\r\n 'PHONE_CODE_EXPIRED': 'Code expired',\r\n 'PASSWORD_HASH_INVALID': 'Incorrect password'\r\n};\r\n\r\nexport default lang;\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/301.a3f22008d452affb1ae4.chunk.js b/public/301.dc3c5a315285fe24ebd3.chunk.js similarity index 83% rename from public/301.a3f22008d452affb1ae4.chunk.js rename to public/301.dc3c5a315285fe24ebd3.chunk.js index 5a19b22e..0065a230 100644 --- a/public/301.a3f22008d452affb1ae4.chunk.js +++ b/public/301.dc3c5a315285fe24ebd3.chunk.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[301],{9301:(e,n,o)=>{o.r(n),o.d(n,{default:()=>i});const i={"Login.Title":"Sign in to Telegram","Login.PhoneLabel":"Phone Number","Login.PhoneLabelInvalid":"Phone Number Invalid","Login.KeepSigned":"Keep me signed in","Login.StartText":"Please confirm your country and\nenter your phone number.","Login.Code.SentSms":"We have sent you an SMS\nwith the code.","Login.Code.SentInApp":"We have sent you a message in Telegram\nwith the code.","Login.Code.SentCall":"We will call you and voice\nthe code.","Login.Code.SentUnknown":"Please check everything\nfor a code (type: %s)","Login.Password.Title":"Enter Your Password","Login.Password.Subtitle":"Your account is protected with\nan additional password","Login.Register.Subtitle":"Enter your name and add\na profile picture",PleaseWait:"Please wait...",Code:"Code",LoginPassword:"Password",YourName:"Your Name",FirstName:"First name (required)",LastName:"Last name (optional)",StartMessaging:"Start Messaging",Country:"Country","Contacts.PhoneNumber.Placeholder":"Phone Number","Login.Next":"Next","Login.ContinueOnLanguage":"Continue in English","Login.QR.Title":"Log in to Telegram by QR Code","Login.QR.Help1":"Open Telegram on your phone","Login.QR.Help2":"Go to **Settings** > **Devices** > **Link Desktop Device**","Login.QR.Help3":"Point your phone at this screen to confirm login","Login.QR.Cancel":"Log in by phone Number","Login.QR.Login":"Log in by QR Code",PHONE_CODE_INVALID:"Invalid code",PHONE_CODE_EXPIRED:"Code expired",PASSWORD_HASH_INVALID:"Incorrect password"}}}]); -//# sourceMappingURL=301.a3f22008d452affb1ae4.chunk.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[301],{9301:(e,n,o)=>{o.r(n),o.d(n,{default:()=>i});const i={"Login.Title":"Sign in to Telegram","Login.PhoneLabel":"Phone Number","Login.PhoneLabelInvalid":"Phone Number Invalid","Login.KeepSigned":"Keep me signed in","Login.StartText":"Please confirm your country and\nenter your phone number.","Login.Code.SentSms":"We have sent you an SMS\nwith the code.","Login.Code.SentInApp":"We have sent you a message in Telegram\nwith the code.","Login.Code.SentCall":"We will call you and voice\nthe code.","Login.Code.SentUnknown":"Please check everything\nfor a code (type: %s)","Login.Password.Title":"Enter Your Password","Login.Password.Subtitle":"Your account is protected with\nan additional password","Login.Register.Subtitle":"Enter your name and add\na profile picture",PleaseWait:"Please wait...",Code:"Code",LoginPassword:"Password",YourName:"Your Name",FirstName:"First name (required)",LastName:"Last name (optional)",StartMessaging:"Start Messaging",Country:"Country","Contacts.PhoneNumber.Placeholder":"Phone Number","Login.Next":"Next","Login.ContinueOnLanguage":"Continue in English","Login.QR.Title":"Log in to Telegram by QR Code","Login.QR.Help1":"Open Telegram on your phone","Login.QR.Help2":"Go to **Settings** > **Devices** > **Link Desktop Device**","Login.QR.Help3":"Point your phone at this screen to confirm login","Login.QR.Cancel":"Log in by phone Number","Login.QR.Login":"Log in by QR Code","PhoneNumber.Code.Fragment.Info":"Get the code in the Anonymous Numbers section on [Fragment](%1$@)",PHONE_CODE_INVALID:"Invalid code",PHONE_CODE_EXPIRED:"Code expired",PASSWORD_HASH_INVALID:"Incorrect password"}}}]); +//# sourceMappingURL=301.dc3c5a315285fe24ebd3.chunk.js.map \ No newline at end of file diff --git a/public/301.dc3c5a315285fe24ebd3.chunk.js.map b/public/301.dc3c5a315285fe24ebd3.chunk.js.map new file mode 100644 index 00000000..e634eb5e --- /dev/null +++ b/public/301.dc3c5a315285fe24ebd3.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"301.dc3c5a315285fe24ebd3.chunk.js","mappings":"yHAAA,MAwCA,EAxCa,CACX,cAAe,sBACf,mBAAoB,eACpB,0BAA2B,uBAC3B,mBAAoB,oBACpB,kBAAmB,4DACnB,qBAAsB,0CACtB,uBAAwB,yDACxB,sBAAuB,wCACvB,yBAA0B,iDAC1B,uBAAwB,sBACxB,0BAA2B,yDAC3B,0BAA2B,6CAC3B,WAAc,iBAGd,KAAQ,OACR,cAAiB,WACjB,SAAY,YACZ,UAAa,wBACb,SAAY,uBACZ,eAAkB,kBAClB,QAAW,UAGX,mCAAoC,eACpC,aAAc,OACd,2BAA4B,sBAC5B,iBAAkB,gCAClB,iBAAkB,8BAClB,iBAAkB,6DAClB,iBAAkB,mDAClB,kBAAmB,yBACnB,iBAAkB,oBAClB,iCAAkC,oEAClC,mBAAsB,eACtB,mBAAsB,eACtB,sBAAyB","sources":["webpack://tweb/./src/langSign.ts"],"sourcesContent":["const lang = {\n 'Login.Title': 'Sign in to Telegram',\n 'Login.PhoneLabel': 'Phone Number',\n 'Login.PhoneLabelInvalid': 'Phone Number Invalid',\n 'Login.KeepSigned': 'Keep me signed in',\n 'Login.StartText': 'Please confirm your country and\\nenter your phone number.',\n 'Login.Code.SentSms': 'We have sent you an SMS\\nwith the code.',\n 'Login.Code.SentInApp': 'We have sent you a message in Telegram\\nwith the code.',\n 'Login.Code.SentCall': 'We will call you and voice\\nthe code.',\n 'Login.Code.SentUnknown': 'Please check everything\\nfor a code (type: %s)',\n 'Login.Password.Title': 'Enter Your Password',\n 'Login.Password.Subtitle': 'Your account is protected with\\nan additional password',\n 'Login.Register.Subtitle': 'Enter your name and add\\na profile picture',\n 'PleaseWait': 'Please wait...',\n\n // * android\n 'Code': 'Code',\n 'LoginPassword': 'Password',\n 'YourName': 'Your Name',\n 'FirstName': 'First name (required)',\n 'LastName': 'Last name (optional)',\n 'StartMessaging': 'Start Messaging',\n 'Country': 'Country',\n\n // * macos\n 'Contacts.PhoneNumber.Placeholder': 'Phone Number',\n 'Login.Next': 'Next',\n 'Login.ContinueOnLanguage': 'Continue in English',\n 'Login.QR.Title': 'Log in to Telegram by QR Code',\n 'Login.QR.Help1': 'Open Telegram on your phone',\n 'Login.QR.Help2': 'Go to **Settings** > **Devices** > **Link Desktop Device**',\n 'Login.QR.Help3': 'Point your phone at this screen to confirm login',\n 'Login.QR.Cancel': 'Log in by phone Number',\n 'Login.QR.Login': 'Log in by QR Code',\n 'PhoneNumber.Code.Fragment.Info': 'Get the code in the Anonymous Numbers section on [Fragment](%1$@)',\n 'PHONE_CODE_INVALID': 'Invalid code',\n 'PHONE_CODE_EXPIRED': 'Code expired',\n 'PASSWORD_HASH_INVALID': 'Incorrect password'\n};\n\nexport default lang;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/333.d7addf177783fe16e44c.chunk.js b/public/333.d7addf177783fe16e44c.chunk.js new file mode 100644 index 00000000..13db0770 --- /dev/null +++ b/public/333.d7addf177783fe16e44c.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[333],{4421:(e,t,s)=>{s.d(t,{Z:()=>a});var n=s(1655),i=s(6724),o=s(5003);const r=new Set(["NO_ENTRY_FOUND","STORAGE_OFFLINE","MIDDLEWARE","NO_AUTO_DOWNLOAD"]);class a{constructor(e=8){this.parallelLimit=e,this.queueId=0,this.queue=[],this.inProcess=new Set,this.lockPromise=null,this.unlockResolve=null,this.log=(0,o.kg)("LL",o.v9.Error),this.processQueue=(0,i.Z)((()=>this._processQueue()),8,!1)}clear(){this.inProcess.clear(),this.queue.length=0}lock(){this.lockPromise||(this.lockPromise=new Promise(((e,t)=>{this.unlockResolve=e})))}unlock(){this.unlockResolve&&(this.unlockResolve(),this.unlockResolve=this.lockPromise=null,this.processQueue())}processItem(e){return t=this,s=void 0,i=function*(){if(!this.lockPromise){this.inProcess.add(e);try{yield this.loadItem(e)}catch(e){r.has(null==e?void 0:e.type)||this.log.error("loadMediaQueue error:",e)}this.inProcess.delete(e),this.processQueue()}},new((n=void 0)||(n=Promise))((function(e,o){function r(e){try{l(i.next(e))}catch(e){o(e)}}function a(e){try{l(i.throw(e))}catch(e){o(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof n?s:new n((function(e){e(s)}))).then(r,a)}l((i=i.apply(t,s||[])).next())}));var t,s,n,i}loadItem(e){return e.load()}getItem(){return this.queue.shift()}addElement(e,t){this.queue[e](t),this.processQueue()}_processQueue(e){if(!(!this.queue.length||this.lockPromise||this.parallelLimit>0&&this.inProcess.size>=this.parallelLimit))do{if(e?(0,n.Z)(this.queue,e):e=this.getItem(),!e)break;this.processItem(e),e=null}while(this.inProcess.size{s.d(t,{Z:()=>n});const n={Á:"A",Ă:"A",Ắ:"A",Ặ:"A",Ằ:"A",Ẳ:"A",Ẵ:"A",Ǎ:"A",Â:"A",Ấ:"A",Ậ:"A",Ầ:"A",Ẩ:"A",Ẫ:"A",Ä:"A",Ǟ:"A",Ȧ:"A",Ǡ:"A",Ạ:"A",Ȁ:"A",À:"A",Ả:"A",Ȃ:"A",Ā:"A",Ą:"A",Å:"A",Ǻ:"A",Ḁ:"A",Ⱥ:"A",Ã:"A",Ꜳ:"AA",Æ:"AE",Ǽ:"AE",Ǣ:"AE",Ꜵ:"AO",Ꜷ:"AU",Ꜹ:"AV",Ꜻ:"AV",Ꜽ:"AY",Ḃ:"B",Ḅ:"B",Ɓ:"B",Ḇ:"B",Ƀ:"B",Ƃ:"B",Ć:"C",Č:"C",Ç:"C",Ḉ:"C",Ĉ:"C",Ċ:"C",Ƈ:"C",Ȼ:"C",Ď:"D",Ḑ:"D",Ḓ:"D",Ḋ:"D",Ḍ:"D",Ɗ:"D",Ḏ:"D",Dz:"D",Dž:"D",Đ:"D",Ƌ:"D",DZ:"DZ",DŽ:"DZ",É:"E",Ĕ:"E",Ě:"E",Ȩ:"E",Ḝ:"E",Ê:"E",Ế:"E",Ệ:"E",Ề:"E",Ể:"E",Ễ:"E",Ḙ:"E",Ë:"E",Ė:"E",Ẹ:"E",Ȅ:"E",È:"E",Ẻ:"E",Ȇ:"E",Ē:"E",Ḗ:"E",Ḕ:"E",Ę:"E",Ɇ:"E",Ẽ:"E",Ḛ:"E",Ꝫ:"ET",Ḟ:"F",Ƒ:"F",Ǵ:"G",Ğ:"G",Ǧ:"G",Ģ:"G",Ĝ:"G",Ġ:"G",Ɠ:"G",Ḡ:"G",Ǥ:"G",Ḫ:"H",Ȟ:"H",Ḩ:"H",Ĥ:"H",Ⱨ:"H",Ḧ:"H",Ḣ:"H",Ḥ:"H",Ħ:"H",Í:"I",Ĭ:"I",Ǐ:"I",Î:"I",Ï:"I",Ḯ:"I",İ:"I",Ị:"I",Ȉ:"I",Ì:"I",Ỉ:"I",Ȋ:"I",Ī:"I",Į:"I",Ɨ:"I",Ĩ:"I",Ḭ:"I",Ꝺ:"D",Ꝼ:"F",Ᵹ:"G",Ꞃ:"R",Ꞅ:"S",Ꞇ:"T",Ꝭ:"IS",Ĵ:"J",Ɉ:"J",Ḱ:"K",Ǩ:"K",Ķ:"K",Ⱪ:"K",Ꝃ:"K",Ḳ:"K",Ƙ:"K",Ḵ:"K",Ꝁ:"K",Ꝅ:"K",Ĺ:"L",Ƚ:"L",Ľ:"L",Ļ:"L",Ḽ:"L",Ḷ:"L",Ḹ:"L",Ⱡ:"L",Ꝉ:"L",Ḻ:"L",Ŀ:"L",Ɫ:"L",Lj:"L",Ł:"L",LJ:"LJ",Ḿ:"M",Ṁ:"M",Ṃ:"M",Ɱ:"M",Ń:"N",Ň:"N",Ņ:"N",Ṋ:"N",Ṅ:"N",Ṇ:"N",Ǹ:"N",Ɲ:"N",Ṉ:"N",Ƞ:"N",Nj:"N",Ñ:"N",NJ:"NJ",Ó:"O",Ŏ:"O",Ǒ:"O",Ô:"O",Ố:"O",Ộ:"O",Ồ:"O",Ổ:"O",Ỗ:"O",Ö:"O",Ȫ:"O",Ȯ:"O",Ȱ:"O",Ọ:"O",Ő:"O",Ȍ:"O",Ò:"O",Ỏ:"O",Ơ:"O",Ớ:"O",Ợ:"O",Ờ:"O",Ở:"O",Ỡ:"O",Ȏ:"O",Ꝋ:"O",Ꝍ:"O",Ō:"O",Ṓ:"O",Ṑ:"O",Ɵ:"O",Ǫ:"O",Ǭ:"O",Ø:"O",Ǿ:"O",Õ:"O",Ṍ:"O",Ṏ:"O",Ȭ:"O",Ƣ:"OI",Ꝏ:"OO",Ɛ:"E",Ɔ:"O",Ȣ:"OU",Ṕ:"P",Ṗ:"P",Ꝓ:"P",Ƥ:"P",Ꝕ:"P",Ᵽ:"P",Ꝑ:"P",Ꝙ:"Q",Ꝗ:"Q",Ŕ:"R",Ř:"R",Ŗ:"R",Ṙ:"R",Ṛ:"R",Ṝ:"R",Ȑ:"R",Ȓ:"R",Ṟ:"R",Ɍ:"R",Ɽ:"R",Ꜿ:"C",Ǝ:"E",Ś:"S",Ṥ:"S",Š:"S",Ṧ:"S",Ş:"S",Ŝ:"S",Ș:"S",Ṡ:"S",Ṣ:"S",Ṩ:"S",ẞ:"SS",Ť:"T",Ţ:"T",Ṱ:"T",Ț:"T",Ⱦ:"T",Ṫ:"T",Ṭ:"T",Ƭ:"T",Ṯ:"T",Ʈ:"T",Ŧ:"T",Ɐ:"A",Ꞁ:"L",Ɯ:"M",Ʌ:"V",Ꜩ:"TZ",Ú:"U",Ŭ:"U",Ǔ:"U",Û:"U",Ṷ:"U",Ü:"U",Ǘ:"U",Ǚ:"U",Ǜ:"U",Ǖ:"U",Ṳ:"U",Ụ:"U",Ű:"U",Ȕ:"U",Ù:"U",Ủ:"U",Ư:"U",Ứ:"U",Ự:"U",Ừ:"U",Ử:"U",Ữ:"U",Ȗ:"U",Ū:"U",Ṻ:"U",Ų:"U",Ů:"U",Ũ:"U",Ṹ:"U",Ṵ:"U",Ꝟ:"V",Ṿ:"V",Ʋ:"V",Ṽ:"V",Ꝡ:"VY",Ẃ:"W",Ŵ:"W",Ẅ:"W",Ẇ:"W",Ẉ:"W",Ẁ:"W",Ⱳ:"W",Ẍ:"X",Ẋ:"X",Ý:"Y",Ŷ:"Y",Ÿ:"Y",Ẏ:"Y",Ỵ:"Y",Ỳ:"Y",Ƴ:"Y",Ỷ:"Y",Ỿ:"Y",Ȳ:"Y",Ɏ:"Y",Ỹ:"Y",Ź:"Z",Ž:"Z",Ẑ:"Z",Ⱬ:"Z",Ż:"Z",Ẓ:"Z",Ȥ:"Z",Ẕ:"Z",Ƶ:"Z",IJ:"IJ",Œ:"OE",ᴀ:"A",ᴁ:"AE",ʙ:"B",ᴃ:"B",ᴄ:"C",ᴅ:"D",ᴇ:"E",ꜰ:"F",ɢ:"G",ʛ:"G",ʜ:"H",ɪ:"I",ʁ:"R",ᴊ:"J",ᴋ:"K",ʟ:"L",ᴌ:"L",ᴍ:"M",ɴ:"N",ᴏ:"O",ɶ:"OE",ᴐ:"O",ᴕ:"OU",ᴘ:"P",ʀ:"R",ᴎ:"N",ᴙ:"R",ꜱ:"S",ᴛ:"T",ⱻ:"E",ᴚ:"R",ᴜ:"U",ᴠ:"V",ᴡ:"W",ʏ:"Y",ᴢ:"Z",á:"a",ă:"a",ắ:"a",ặ:"a",ằ:"a",ẳ:"a",ẵ:"a",ǎ:"a",â:"a",ấ:"a",ậ:"a",ầ:"a",ẩ:"a",ẫ:"a",ä:"a",ǟ:"a",ȧ:"a",ǡ:"a",ạ:"a",ȁ:"a",à:"a",ả:"a",ȃ:"a",ā:"a",ą:"a",ᶏ:"a",ẚ:"a",å:"a",ǻ:"a",ḁ:"a",ⱥ:"a",ã:"a",ꜳ:"aa",æ:"ae",ǽ:"ae",ǣ:"ae",ꜵ:"ao",ꜷ:"au",ꜹ:"av",ꜻ:"av",ꜽ:"ay",ḃ:"b",ḅ:"b",ɓ:"b",ḇ:"b",ᵬ:"b",ᶀ:"b",ƀ:"b",ƃ:"b",ɵ:"o",ć:"c",č:"c",ç:"c",ḉ:"c",ĉ:"c",ɕ:"c",ċ:"c",ƈ:"c",ȼ:"c",ď:"d",ḑ:"d",ḓ:"d",ȡ:"d",ḋ:"d",ḍ:"d",ɗ:"d",ᶑ:"d",ḏ:"d",ᵭ:"d",ᶁ:"d",đ:"d",ɖ:"d",ƌ:"d",ı:"i",ȷ:"j",ɟ:"j",ʄ:"j",dz:"dz",dž:"dz",é:"e",ĕ:"e",ě:"e",ȩ:"e",ḝ:"e",ê:"e",ế:"e",ệ:"e",ề:"e",ể:"e",ễ:"e",ḙ:"e",ë:"e",ė:"e",ẹ:"e",ȅ:"e",è:"e",ẻ:"e",ȇ:"e",ē:"e",ḗ:"e",ḕ:"e",ⱸ:"e",ę:"e",ᶒ:"e",ɇ:"e",ẽ:"e",ḛ:"e",ꝫ:"et",ḟ:"f",ƒ:"f",ᵮ:"f",ᶂ:"f",ǵ:"g",ğ:"g",ǧ:"g",ģ:"g",ĝ:"g",ġ:"g",ɠ:"g",ḡ:"g",ᶃ:"g",ǥ:"g",ḫ:"h",ȟ:"h",ḩ:"h",ĥ:"h",ⱨ:"h",ḧ:"h",ḣ:"h",ḥ:"h",ɦ:"h",ẖ:"h",ħ:"h",ƕ:"hv",í:"i",ĭ:"i",ǐ:"i",î:"i",ï:"i",ḯ:"i",ị:"i",ȉ:"i",ì:"i",ỉ:"i",ȋ:"i",ī:"i",į:"i",ᶖ:"i",ɨ:"i",ĩ:"i",ḭ:"i",ꝺ:"d",ꝼ:"f",ᵹ:"g",ꞃ:"r",ꞅ:"s",ꞇ:"t",ꝭ:"is",ǰ:"j",ĵ:"j",ʝ:"j",ɉ:"j",ḱ:"k",ǩ:"k",ķ:"k",ⱪ:"k",ꝃ:"k",ḳ:"k",ƙ:"k",ḵ:"k",ᶄ:"k",ꝁ:"k",ꝅ:"k",ĺ:"l",ƚ:"l",ɬ:"l",ľ:"l",ļ:"l",ḽ:"l",ȴ:"l",ḷ:"l",ḹ:"l",ⱡ:"l",ꝉ:"l",ḻ:"l",ŀ:"l",ɫ:"l",ᶅ:"l",ɭ:"l",ł:"l",lj:"lj",ſ:"s",ẜ:"s",ẛ:"s",ẝ:"s",ḿ:"m",ṁ:"m",ṃ:"m",ɱ:"m",ᵯ:"m",ᶆ:"m",ń:"n",ň:"n",ņ:"n",ṋ:"n",ȵ:"n",ṅ:"n",ṇ:"n",ǹ:"n",ɲ:"n",ṉ:"n",ƞ:"n",ᵰ:"n",ᶇ:"n",ɳ:"n",ñ:"n",nj:"nj",ó:"o",ŏ:"o",ǒ:"o",ô:"o",ố:"o",ộ:"o",ồ:"o",ổ:"o",ỗ:"o",ö:"o",ȫ:"o",ȯ:"o",ȱ:"o",ọ:"o",ő:"o",ȍ:"o",ò:"o",ỏ:"o",ơ:"o",ớ:"o",ợ:"o",ờ:"o",ở:"o",ỡ:"o",ȏ:"o",ꝋ:"o",ꝍ:"o",ⱺ:"o",ō:"o",ṓ:"o",ṑ:"o",ǫ:"o",ǭ:"o",ø:"o",ǿ:"o",õ:"o",ṍ:"o",ṏ:"o",ȭ:"o",ƣ:"oi",ꝏ:"oo",ɛ:"e",ᶓ:"e",ɔ:"o",ᶗ:"o",ȣ:"ou",ṕ:"p",ṗ:"p",ꝓ:"p",ƥ:"p",ᵱ:"p",ᶈ:"p",ꝕ:"p",ᵽ:"p",ꝑ:"p",ꝙ:"q",ʠ:"q",ɋ:"q",ꝗ:"q",ŕ:"r",ř:"r",ŗ:"r",ṙ:"r",ṛ:"r",ṝ:"r",ȑ:"r",ɾ:"r",ᵳ:"r",ȓ:"r",ṟ:"r",ɼ:"r",ᵲ:"r",ᶉ:"r",ɍ:"r",ɽ:"r",ↄ:"c",ꜿ:"c",ɘ:"e",ɿ:"r",ś:"s",ṥ:"s",š:"s",ṧ:"s",ş:"s",ŝ:"s",ș:"s",ṡ:"s",ṣ:"s",ṩ:"s",ʂ:"s",ᵴ:"s",ᶊ:"s",ȿ:"s",ɡ:"g",ß:"ss",ᴑ:"o",ᴓ:"o",ᴝ:"u",ť:"t",ţ:"t",ṱ:"t",ț:"t",ȶ:"t",ẗ:"t",ⱦ:"t",ṫ:"t",ṭ:"t",ƭ:"t",ṯ:"t",ᵵ:"t",ƫ:"t",ʈ:"t",ŧ:"t",ᵺ:"th",ɐ:"a",ᴂ:"ae",ǝ:"e",ᵷ:"g",ɥ:"h",ʮ:"h",ʯ:"h",ᴉ:"i",ʞ:"k",ꞁ:"l",ɯ:"m",ɰ:"m",ᴔ:"oe",ɹ:"r",ɻ:"r",ɺ:"r",ⱹ:"r",ʇ:"t",ʌ:"v",ʍ:"w",ʎ:"y",ꜩ:"tz",ú:"u",ŭ:"u",ǔ:"u",û:"u",ṷ:"u",ü:"u",ǘ:"u",ǚ:"u",ǜ:"u",ǖ:"u",ṳ:"u",ụ:"u",ű:"u",ȕ:"u",ù:"u",ủ:"u",ư:"u",ứ:"u",ự:"u",ừ:"u",ử:"u",ữ:"u",ȗ:"u",ū:"u",ṻ:"u",ų:"u",ᶙ:"u",ů:"u",ũ:"u",ṹ:"u",ṵ:"u",ᵫ:"ue",ꝸ:"um",ⱴ:"v",ꝟ:"v",ṿ:"v",ʋ:"v",ᶌ:"v",ⱱ:"v",ṽ:"v",ꝡ:"vy",ẃ:"w",ŵ:"w",ẅ:"w",ẇ:"w",ẉ:"w",ẁ:"w",ⱳ:"w",ẘ:"w",ẍ:"x",ẋ:"x",ᶍ:"x",ý:"y",ŷ:"y",ÿ:"y",ẏ:"y",ỵ:"y",ỳ:"y",ƴ:"y",ỷ:"y",ỿ:"y",ȳ:"y",ẙ:"y",ɏ:"y",ỹ:"y",ź:"z",ž:"z",ẑ:"z",ʑ:"z",ⱬ:"z",ż:"z",ẓ:"z",ȥ:"z",ẕ:"z",ᵶ:"z",ᶎ:"z",ʐ:"z",ƶ:"z",ɀ:"z",ff:"ff",ffi:"ffi",ffl:"ffl",fi:"fi",fl:"fl",ij:"ij",œ:"oe",st:"st",ₐ:"a",ₑ:"e",ᵢ:"i",ⱼ:"j",ₒ:"o",ᵣ:"r",ᵤ:"u",ᵥ:"v",ₓ:"x",Ё:"YO",Й:"I",Ц:"TS",У:"U",К:"K",Е:"E",Н:"N",Г:"G",Ш:"SH",Щ:"SCH",З:"Z",Х:"H",Ъ:"",ё:"yo",й:"i",ц:"ts",у:"u",к:"k",е:"e",н:"n",г:"g",ш:"sh",щ:"sch",з:"z",х:"h",ъ:"",Ф:"F",Ы:"I",В:"V",А:"A",П:"P",Р:"R",О:"O",Л:"L",Д:"D",Ж:"ZH",Э:"E",ф:"f",ы:"i",в:"v",а:"a",п:"p",р:"r",о:"o",л:"l",д:"d",ж:"zh",э:"e",Я:"Ya",Ч:"CH",С:"S",М:"M",И:"I",Т:"T",Ь:"",Б:"B",Ю:"YU",я:"ya",ч:"ch",с:"s",м:"m",и:"i",т:"t",ь:"",б:"b",ю:"yu"}},6690:(e,t,s)=>{function n(e){return[...new Set(e)]}s.d(t,{Z:()=>n})},7238:(e,t,s)=>{function n(e){return e.reduce(((e,t)=>(e.push(...t),e)),[])}s.d(t,{Z:()=>n})},7625:(e,t,s)=>{function n(e,t){for(let s=e.length-1;s>=0;--s)t(e[s],s,e)}s.d(t,{Z:()=>n})},6519:(e,t,s)=>{function n(e,t,s,n){if("function"!=typeof s){const e=s;s=t=>t[e]}const i=s(t);if(void 0===n&&-1!==(n=e.indexOf(t))){const t=e[n-1],o=e[n+1];if((!t||s(t)>=i)&&(!o||s(o)<=i))return n;e.splice(n,1)}const o=e.length;if(!o||i<=s(e[o-1]))return e.push(t)-1;if(i>=s(e[0]))return e.unshift(t),0;for(let n=0;ns(e[n]))return e.splice(n,0,t),n;return console.error("wtf",e,t),e.indexOf(t)}s.d(t,{Z:()=>n})},8938:(e,t,s)=>{function n(e){}s.d(t,{Z:()=>n})},3019:(e,t,s)=>{function n(e,t){return new Promise((s=>{const n=new FileReader;n.addEventListener("loadend",(e=>{s(e.target.result)})),n[t](e)}))}s.d(t,{Z:()=>n})},9895:(e,t,s)=>{function n(e,t){const s=e.length;if(s!==t.length)return!1;for(let n=0;nn})},3306:(e,t,s)=>{function n(e){const t=e.length,s=new Uint8Array(Math.ceil(t/2));let n=0;t%2&&(s[n++]=parseInt(e.charAt(0),16));for(let i=n;in})},3692:(e,t,s)=>{function n(e){return e instanceof Uint8Array?e:"string"==typeof e?(new TextEncoder).encode(e):new Uint8Array(e)}s.d(t,{Z:()=>n})},6654:(e,t,s)=>{function n(e,t){return e instanceof Promise?e.then(t):t(e)}s.d(t,{Z:()=>n})},2202:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(2219);let i=0;function o(e){let t;const s=null==e?void 0:e.type;if(s){const e=`${n.Z}_${i++}.${s.split("/")[1]}`;t=["image/jpeg","image/png","image/bmp"].indexOf(s)>=0?"photo"+e:0===s.indexOf("audio/")||["video/ogg"].indexOf(s)>=0?"audio"+e:0===s.indexOf("video/")?"video"+e:"document"+e}else t=`upload-${n.Z}_${i++}`;return t}},3624:(e,t,s)=>{s.d(t,{k:()=>r});var n=s(1655);const i=(0,s(5471).Z)("MIDDLEWARE");class o{constructor(){this.details={cleaned:!1,inner:[],onCleanCallbacks:[]},this.onDestroyCallbacks=[],this.onDestroy=e=>{if(this.destroyed)return e();this.onDestroyCallbacks.push(e)}}clean(){const e=this.details;e.cleaned=!0,e.inner.splice(0,e.inner.length).forEach((e=>e.destroy())),e.onCleanCallbacks.splice(0,e.onCleanCallbacks.length).forEach((e=>e())),this.details={cleaned:!1,inner:[],onCleanCallbacks:[]}}destroy(){this.destroyed=!0,this.clean(),this.onDestroyCallbacks.splice(0,this.onDestroyCallbacks.length).forEach((e=>e())),this.parent&&((0,n.Z)(this.parent.details.inner,this),this.parent=void 0)}get(e){const t=this.details,s=()=>!t.cleaned&&(!e||e());return s.create=()=>{if(!s())throw i;const e=r();return e.parent=this,t.inner.push(e),e},s.onClean=e=>{if(!s())return e();t.onCleanCallbacks.push(e)},s.onDestroy=this.onDestroy,s}}function r(){return new o}},9750:(e,t,s)=>{function n(e,t){const s=t.split(".");let n=e;return s.forEach((e=>{e&&(n=n[e])})),n}s.d(t,{Z:()=>n})},7401:(e,t,s)=>{function n(e,t="asc"){if(!e)return[];const s=e instanceof Map?[...e.keys()]:Object.keys(e).map((e=>+e));return"asc"===t?s.sort(((e,t)=>e-t)):s.sort(((e,t)=>t-e))}s.d(t,{Z:()=>n})},5701:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(6761),i=s(319);function o(e,t,s=!0,o=!0){let r,a,l,c,u=!1;const h=t=>{const s=l,n=c;try{s(e.apply(null,t))}catch(e){console.error("debounce error",e),n(e)}},d=(...e)=>{a||(a=new Promise(((e,t)=>(l=e,c=t)))),r?(clearTimeout(r),u=!0,c(),a=new Promise(((e,t)=>(l=e,c=t)))):s&&(h(e),u=!1);const d=n.Z.setTimeout((()=>{!o||s&&!u||h(e),r===d&&(r=a=l=c=void 0,u=!1)}),t);return r=d,a.catch(i.Z),a};return d.clearTimeout=()=>{r&&(n.Z.clearTimeout(r),c(),r=a=l=c=void 0,u=!1)},d.isDebounced=()=>!!r,d}},252:(e,t,s)=>{s.d(t,{D:()=>n,Z:()=>a});var n,i=s(410),o=s(1655);function r(e,t){if(e.toExponential){const s=e-t;return s<0?-1:s>0?1:0}return function(e,t){const s=e.length;if(s!==t.length){const e=s-t.length;return e<0?-1:e>0?1:0}for(let n=0;n=2)for(let t=0,s=this.slices.length;t=0)return{slice:t,offset:e===t[n]?n:n-1}}if(t&&t.isEnd(n.Top))return{slice:t,offset:t.length}}sliceMe(e,t,s){let i=this.slice,o=0,r=0;if(e){const t=this.findSliceOffset(e);if(!t)return;i=t.slice,o=r=t.offset,i.includes(e)&&(r+=1)}const a=Math.max(r+t,0),l=r+t+s,c=i.slice(a,l),u=t<0?s+t:s,h=Math.abs(t),d=i.length-r>=u||!!i.isEnd(n.Top)&&(c.setEnd(n.Top),!0),f=r-h>=0||!!i.isEnd(n.Bottom)&&(c.setEnd(n.Bottom),!0);return{slice:c,offsetIdOffset:o,fulfilled:n.None|(d&&f?n.Both:(d?n.Top:n.None)|(f?n.Bottom:n.None))}}unshift(...e){let t=this.first;t.length?t.isEnd(n.Bottom)||(t=this.constructSlice(),t.setEnd(n.Bottom),this.slices.unshift(t)):t.setEnd(n.Bottom),t.unshift(...e)}push(...e){let t=this.last;t.length?t.isEnd(n.Top)||(t=this.constructSlice(),t.setEnd(n.Top),this.slices.push(t)):t.setEnd(n.Top),t.push(...e)}delete(e){const t=this.findSlice(e);return!!t&&(t.slice.splice(t.index,1),!0)}deleteSlice(e){(0,o.Z)(this.slices,e)}toJSON(){const e={slices:this.slices.map((e=>({values:e.slice(),isEnd:e.getEnds()})))};return JSON.stringify(e)}static fromJSON(e){const t=JSON.parse(e),s=new a;return t.slices.forEach((e=>{const t=s.insertSlice(e.values)||s.first;e.isEnd.top&&t.setEnd(n.Top),e.isEnd.bottom&&t.setEnd(n.Bottom)})),s}}i.GO&&(i.GO.SlicedArray=a)},8794:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(1507);function i(e){return e.icons.find((e=>e.name===n.BP))}},2566:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2946);function i(e){return e.peer?(0,n.Z)(e.peer):e.user_id.toPeerId()}},7120:(e,t,s)=>{function n(e,t,s,n){if(!e)return!1;if(e.pFlags.deactivated&&"view_messages"!==t)return!1;const i=void 0===s;if(e.pFlags.creator&&i)return!0;if("chatForbidden"===e._||"channelForbidden"===e._||e.pFlags.left&&!e.pFlags.megagroup)return!1;if(!s&&!(s=e.admin_rights||e.banned_rights||e.default_banned_rights))return!1;let o={};switch(s&&(o=s.pFlags),t){case"embed_links":case"send_games":case"send_gifs":case"send_inline":case"send_media":case"send_messages":case"send_polls":case"send_stickers":if(!n&&e.pFlags.left)return!1;if("chatBannedRights"===s._&&o[t])return!1;if("channel"===e._&&!e.pFlags.megagroup&&!o.post_messages)return!1;break;case"delete_messages":case"manage_call":return!!o[t];case"pin_messages":return"chatAdminRights"===s._?o[t]||!!o.post_messages:!o[t];case"change_info":case"invite_users":return"chatAdminRights"===s._?!!o[t]:!o[t];case"change_type":case"delete_chat":return!1;case"manage_topics":case"ban_users":case"change_permissions":return"chatAdminRights"===s._&&!!o.ban_users;case"view_participants":return!("chat"!==e._&&e.pFlags.broadcast&&!e.pFlags.creator&&!e.admin_rights)}return!0}s.d(t,{Z:()=>n})},8050:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(3385);function i(e,t=(0,n.Z)(e.folder_id)){return null==e?void 0:e[t]}},3385:(e,t,s)=>{function n(e=0){return`index_${e}`}s.d(t,{Z:()=>n})},6658:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(7072);function i(e,t,s,i){const o=(0,n.Z)(e,null==t?void 0:t.type);let r;return r="photoSize"===(null==t?void 0:t._)?e.sticker?"image/webp":e.mime_type.startsWith("image/")?e.mime_type:"image/jpeg":e.mime_type||"application/octet-stream",{dcId:e.dc_id,location:o,size:t?t.size:e.size,mimeType:r,fileName:e.file_name,queueId:s,onlyCache:i}}},7072:(e,t,s)=>{function n(e,t){return{_:"inputDocumentFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t}}s.d(t,{Z:()=>n})},7086:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(8801);function i(e){return(0,n.P)(e.location,e)}},1243:(e,t,s)=>{s.d(t,{Z:()=>a});var n=s(6658),i=s(7667),o=s(3114),r=s(7086);function a(e){const{media:t,thumb:s,queueId:a,onlyCache:l}=e;let c;var u;return"document"===t._?c=(0,n.Z)(t,s,a,l):"photo"===t._?c=(0,i.Z)(t,s,a,l):(0,o.Z)(t)&&(c={dcId:0,location:{_:"inputWebFileLocation",access_hash:(u=t).access_hash,url:u.url},size:u.size,mimeType:u.mime_type}),c.downloadId=e.downloadId,{fileName:(0,r.Z)(c),downloadOptions:c}}},6034:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(6848),i=s(5880);function o(e,t){if(typeof e!=typeof t)return!1;if(!(0,i.Z)(e))return!0;if(e._!==t._)return!1;if("draftMessage"===e._&&t._===e._){if(e.reply_to_msg_id!==t.reply_to_msg_id)return!1;if(!(0,n.Z)(e.entities,t.entities))return!1;if(e.message!==t.message)return!1;if(e.pFlags.no_webpage!==t.pFlags.no_webpage)return!1}return!0}},515:(e,t,s)=>{function n(e,t){return e+"_"+t}s.d(t,{Z:()=>n})},3781:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(7082);function i(e){const t=n.t;return e>=t?e:t+e*n.o}},2790:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(7082);function i(e){return function(e,t){const s=n.t;if(e{s.d(t,{o:()=>n,t:()=>i});const n=65536,i=4294967295},6566:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2342);function i(e,t,s){if("inputMessagesFilterEmpty"===e)return t;const i=[];if(!t.length)return i;let o=!0;const r={},a=[],l=[];switch(e){case"inputMessagesFilterPhotos":r.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":r.messageMediaPhoto=!0,r.messageMediaDocument=!0,a.push("video");break;case"inputMessagesFilterVideo":r.messageMediaDocument=!0,a.push("video");break;case"inputMessagesFilterDocument":r.messageMediaDocument=!0,a.push(void 0,"photo","pdf");break;case"inputMessagesFilterVoice":r.messageMediaDocument=!0,a.push("voice");break;case"inputMessagesFilterRoundVoice":r.messageMediaDocument=!0,a.push("round","voice");break;case"inputMessagesFilterRoundVideo":r.messageMediaDocument=!0,a.push("round");break;case"inputMessagesFilterMusic":r.messageMediaDocument=!0,a.push("audio");break;case"inputMessagesFilterUrl":r.url=!0;break;case"inputMessagesFilterChatPhotos":r.avatar=!0;break;default:o=!1}if(!o)return i;for(let e=0,o=t.length;ee.includes(t._)))||(0,n.Z)(o.message))&&(c=!0)}}else r.avatar&&o.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(o.action._)&&(c=!0);if(c&&(i.push(o),i.length>=s))break}return i}},2381:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(8938);function i(e){let t,s=0;for(const i of e)if((0,n.Z)(i),i.message){if(++s>1)break;t=i}return s>1&&(t=void 0),t}},4993:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(1507);function i(e,t){var s;let i;const o=e.reply_to;return!o||t&&!o.pFlags.forum_topic?t&&(i="messageService"===e._&&"messageActionTopicCreate"===(null===(s=e.action)||void 0===s?void 0:s._)?e.mid:n.Ox):i=o.reply_to_top_id||o.reply_to_msg_id,i}},5102:(e,t,s)=>{function n(e){if(!e)return[];const t=e.usernames;return t?t.filter((e=>e.pFlags.active)).map((e=>e.username)):e.username?[e.username]:[]}s.d(t,{Z:()=>n})},7256:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(7419);function i(e){if(e&&!(0,n.Z)(e))return null==e?void 0:e.photo}},7419:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(677);function i(e){const t=null==e?void 0:e.restriction_reason;return!!(t&&e.pFlags.restricted&&(0,n.X)(t))}},7667:(e,t,s)=>{function n(e,t,s,n){const i="document"===e._;if(!t||"photoSizeEmpty"===t._)throw new Error("photoSizeEmpty!");const o=!("photoSize"!==t._&&"photoSizeProgressive"!==t._||!e.access_hash||!e.file_reference),r={_:i?"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:o?t.size:void 0,mimeType:"image/jpeg",queueId:s,onlyCache:n}}s.d(t,{Z:()=>n})},5285:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(6848);function i(e,t){return(0,n.Z)(e,t)}},13:(e,t,s)=>{function n(e){var t;return null===(t=e.video_thumbs)||void 0===t?void 0:t[0]}s.d(t,{Z:()=>n})},8493:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(1507);function i(e){return!e.pFlags.deleted&&e.id.toPeerId()!==n.hj}},3114:(e,t,s)=>{function n(e){return!(!e||"webDocument"!==e._&&"webDocumentNoProxy"!==e._)}s.d(t,{Z:()=>n})},9174:(e,t,s)=>{var n;s.d(t,{Q:()=>n}),function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(n||(n={}))},6875:(e,t,s)=>{s.d(t,{Z:()=>i});const n=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function i(e){for(let t=0;tn.has(e._)&&i!==t&&e._===s._&&e.offset-s.length===s.offset)),-1!==i){const t=e[i];s.length+=t.length,e.splice(i,1)}}while(-1!==i)}}},1379:(e,t,s)=>{function n(e,t){const s=e.slice(0,t.offset),n=function(e){const t="⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿",s=t.length,n=[];for(let i=0;in})},8859:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(2423);const i=new Set(["messageEntityPre","messageEntityCode"]);function o(e,t){let s=-1;return e.find((e=>(i.has(e._)&&(s=e.offset+e.length),t.offset=e.offset&&t.length+t.offset<=e.length+e.offset))))}},7746:(e,t,s)=>{function n(e,t){return e.replace(/[\u2640\u2642\u2764](?!\ufe0f)/g,((e,s,n)=>{if(t){const n=e.length;s+=n,t.forEach((e=>{const t=e.offset+e.length;t===s?e.length+=n:t>s&&(e.offset+=n)}))}return e+"️"}))}s.d(t,{Z:()=>n})},2342:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2423);function i(e){return e?e.match(n.it):null}},6241:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(8859),i=s(1346);function o(e,t){const s=t.filter((t=>!(0,n.Z)(e,t)));e.push(...s),(0,i.Z)(e);for(let t=0;t{s.d(t,{Z:()=>c});var n=s(2423);const i=["abogado","ac","academy","accountants","active","actor","ad","adult","ae","aero","af","ag","agency","ai","airforce","al","allfinanz","alsace","am","amsterdam","an","android","ao","apartments","aq","aquarelle","ar","archi","army","arpa","as","asia","associates","at","attorney","au","auction","audio","autos","aw","ax","axa","az","ba","band","bank","bar","barclaycard","barclays","bargains","bayern","bb","bd","be","beer","berlin","best","bf","bg","bh","bi","bid","bike","bingo","bio","biz","bj","black","blackfriday","bloomberg","blue","bm","bmw","bn","bnpparibas","bo","boo","boutique","br","brussels","bs","bt","budapest","build","builders","business","buzz","bv","bw","by","bz","bzh","ca","cab","cal","camera","camp","cancerresearch","canon","capetown","capital","caravan","cards","care","career","careers","cartier","casa","cash","cat","catering","cc","cd","center","ceo","cern","cf","cg","ch","channel","chat","cheap","christmas","chrome","church","ci","citic","city","ck","cl","claims","cleaning","click","clinic","clothing","club","cm","cn","co","coach","codes","coffee","college","cologne","com","community","company","computer","condos","construction","consulting","contractors","cooking","cool","coop","country","cr","credit","creditcard","cricket","crs","cruises","cu","cuisinella","cv","cw","cx","cy","cymru","cz","dabur","dad","dance","dating","day","dclk","de","deals","degree","delivery","democrat","dental","dentist","desi","design","dev","diamonds","diet","digital","direct","directory","discount","dj","dk","dm","dnp","do","docs","domains","doosan","durban","dvag","dz","eat","ec","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","equipment","er","es","esq","estate","et","eu","eurovision","eus","events","everbank","exchange","expert","exposed","fail","farm","fashion","feedback","fi","finance","financial","firmdale","fish","fishing","fit","fitness","fj","fk","flights","florist","flowers","flsmidth","fly","fm","fo","foo","forsale","foundation","fr","frl","frogans","fund","furniture","futbol","ga","gal","gallery","garden","gb","gbiz","gd","ge","gent","gf","gg","ggee","gh","gi","gift","gifts","gives","gl","glass","gle","global","globo","gm","gmail","gmo","gmx","gn","goog","google","gop","gov","gp","gq","gr","graphics","gratis","green","gripe","gs","gt","gu","guide","guitars","guru","gw","gy","hamburg","hangout","haus","healthcare","help","here","hermes","hiphop","hiv","hk","hm","hn","holdings","holiday","homes","horse","host","hosting","house","how","hr","ht","hu","ibm","id","ie","ifm","il","im","immo","immobilien","in","industries","info","ing","ink","institute","insure","int","international","investments","io","iq","ir","irish","is","it","iwc","jcb","je","jetzt","jm","jo","jobs","joburg","jp","juegos","kaufen","kddi","ke","kg","kh","ki","kim","kitchen","kiwi","km","kn","koeln","kp","kr","krd","kred","kw","ky","kyoto","kz","la","lacaixa","land","lat","latrobe","lawyer","lb","lc","lds","lease","legal","lgbt","li","lidl","life","lighting","limited","limo","link","lk","loans","london","lotte","lotto","lr","ls","lt","ltda","lu","luxe","luxury","lv","ly","ma","madrid","maison","management","mango","market","marketing","marriott","mc","md","me","media","meet","melbourne","meme","memorial","menu","mg","mh","miami","mil","mini","mk","ml","mm","mn","mo","mobi","moda","moe","monash","money","mormon","mortgage","moscow","motorcycles","mov","mp","mq","mr","ms","mt","mu","museum","mv","mw","mx","my","mz","na","nagoya","name","navy","nc","ne","net","network","neustar","new","nexus","nf","ng","ngo","nhk","ni","nico","ninja","nl","no","np","nr","nra","nrw","ntt","nu","nyc","nz","okinawa","om","one","ong","onl","ooo","org","organic","osaka","otsuka","ovh","pa","paris","partners","parts","party","pe","pf","pg","ph","pharmacy","photo","photography","photos","physio","pics","pictures","pink","pizza","pk","pl","place","plumbing","pm","pn","pohl","poker","porn","post","pr","praxi","press","pro","prod","productions","prof","properties","property","ps","pt","pub","pw","py","qa","qpon","quebec","re","realtor","recipes","red","rehab","reise","reisen","reit","ren","rentals","repair","report","republican","rest","restaurant","reviews","rich","rio","rip","ro","rocks","rodeo","rs","rsvp","ru","ruhr","rw","ryukyu","sa","saarland","sale","samsung","sarl","saxo","sb","sc","sca","scb","schmidt","schule","schwarz","science","scot","sd","se","services","sew","sexy","sg","sh","shiksha","shoes","shriram","si","singles","sj","sk","sky","sl","sm","sn","so","social","software","sohu","solar","solutions","soy","space","spiegel","sr","st","style","su","supplies","supply","support","surf","surgery","suzuki","sv","sx","sy","sydney","systems","sz","taipei","tatar","tattoo","tax","tc","td","technology","tel","temasek","tennis","tf","tg","th","tienda","tips","tires","tirol","tj","tk","tl","tm","tn","to","today","tokyo","tools","top","toshiba","town","toys","tp","tr","trade","training","travel","trust","tt","tui","tv","tw","tz","ua","ug","uk","university","uno","uol","us","uy","uz","va","vacations","vc","ve","vegas","ventures","versicherung","vet","vg","vi","viajes","video","villas","vision","vlaanderen","vn","vodka","vote","voting","voto","voyage","vu","wales","wang","watch","webcam","website","wed","wedding","wf","whoswho","wien","wiki","williamhill","wme","work","works","world","ws","wtc","wtf","佛山","集团","在线","한국","ভারত","八卦","موقع","公益","公司","移动","我爱你","москва","қаз","онлайн","сайт","срб","淡马锡","орг","삼성","சிங்கப்பூர்","商标","商店","商城","дети","мкд","中文网","中信","中国","中國","谷歌","భారత్","ලංකා","ભારત","भारत","网店","संगठन","网络","укр","香港","台湾","台灣","手机","мон","الجزائر","عمان","ایران","امارات","بازار","الاردن","بھارت","المغرب","السعودية","مليسيا","شبكة","გე","机构","组织机构","ไทย","سورية","рус","рф","تونس","みんな","グーグル","世界","ਭਾਰਤ","网址","游戏","vermögensberater","vermögensberatung","企业","مصر","قطر","广东","இலங்கை","இந்தியா","新加坡","فلسطين","政务","xxx","xyz","yachts","yandex","ye","yoga","yokohama","youtube","yt","za","zip","zm","zone","zuerich","zw"];function o(e){for(var t=e.length,s=e.split("(").length-1,n=e.split(")").length-1;n>s&&")"===e.charAt(t-1);)e=e.substr(0,t-1),n--,t--;return s>n&&(e=e.replace(/\)+$/,"")),e}var r=s(3447),a=s(671);function l(e){const t=(0,a.N0)(e).replace(/-?fe0f/g,"");if(r.Z.hasOwnProperty(t))return t}function c(e){let t,s=e;const r=[];let a,c=0;for(n.$2.lastIndex=0;t=s.match(n.$2);){if(a=c+t.index,t[3])r.push({_:"messageEntityMention",offset:a+t[1].length,length:t[2].length+t[3].length});else if(t[4])if(n.E.test(t[4]))r.push({_:"messageEntityEmail",offset:a,length:t[4].length});else{let e,s=t[5];const n=t[6];if(n){if(s||"xn--"!==n.substr(0,4)&&-1===i.indexOf(n.toLowerCase())||(s="http://"),s){const n=o(t[4]);n.length!==t[4].length&&(t[4]=n),e=(t[5]?"":s)+t[4]}}else e=(t[5]?"":"http://")+t[4];e&&r.push({_:"messageEntityUrl",offset:a,length:t[4].length})}else if(t[7])r.push({_:"messageEntityLinebreak",offset:a,length:1});else if(t[8]){const e=l(t[8]);e&&r.push({_:"messageEntityEmoji",offset:a,length:t[8].length,unicode:e})}else t[11]?r.push({_:"messageEntityHashtag",offset:a+(t[10]?t[10].length:0),length:t[11].length}):t[13]&&r.push({_:"messageEntityBotCommand",offset:a+(t[11]?t[11].length:0)+(t[12]?t[12].length:0),length:1+t[13].length+(t[14]?1+t[14].length:0),unsafe:!0});s=s.substr(t.index+t[0].length),c+=t.index+t[0].length}return r}},2821:(e,t,s)=>{s.d(t,{Z:()=>a});var n=s(2423),i=s(6875),o=s(8859),r=s(6241);function a(e,t,s){const a=[];let l=!1;const c=e=>(0,o.Z)(t,e)?l=!1:(a.push(e),l=!0),u=[];let h,d=0;for(;h=e.match(n.QB);){const t=d+h.index;u.push(e.substr(0,h.index));const s=h[3]||h[8]||h[11]||h[13];let i;if(d-=s.length,d+=s.length,l=!1,s.match(/^`*$/))u.push(h[0]);else if(h[3])i={_:"messageEntityPre",language:"",offset:t+h[1].length,length:s.length},c(i)&&("\n"===h[5]&&(h[5]="",d-=1),u.push(h[1]+s+h[5]),d-=h[2].length+h[4].length);else if(h[7]){const e=""===h[6];i={_:n.SC[h[7]],offset:t+(e?0:h[6].length),length:s.length},c(i)&&(e?u.push(s):u.push(h[6]+s+h[9]),d-=2*h[7].length+(e?2:0))}else h[11]?(i={_:"messageEntityMentionName",user_id:h[10].toUserId(),offset:t,length:s.length},c(i)&&(u.push(s),d-=h[0].length-s.length)):h[12]&&(i={_:"messageEntityTextUrl",url:h[14],offset:t,length:s.length},c(i)&&(u.push(s),d-=h[12].length-s.length));l||u.push(h[0]),e=e.substr(h.index+h[0].length),d+=h.index+h[0].length}u.push(e);let f=u.join("");f.replace(/\s+/g,"").length||(f=e,a.splice(0,a.length)),(0,r.Z)(t,a),(0,i.Z)(t);let g=f.length;if(!s){f=f.replace(/^\s*/,"");let e=g-f.length;e&&t.forEach((t=>{t.offset=Math.max(0,t.offset-e)})),f=f.replace(/\s*$/,""),e=g-f.length,g=f.length,e&&t.forEach((e=>{e.offset+e.length>g&&(e.length=g-e.offset)}))}return f}},1346:(e,t,s)=>{function n(e){e.sort(((e,t)=>e.offset-t.offset||t.length-e.length))}s.d(t,{Z:()=>n})},2491:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(1379);function i(e,t=[]){return t.forEach((t=>{"messageEntitySpoiler"===t._&&(e=(0,n.Z)(e,t).text)})),e}},7381:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(467),i=s(7238);class o{constructor(e,t=0){this.options=e,this.minChars=t,this.fullTexts=new Map}indexObject(e,t){if(this.options&&t.trim()&&(t=(0,n.gV)(t,this.options)),!t)return this.fullTexts.delete(e),!1;this.fullTexts.set(e,t)}_search(e){const t=[],s=this.fullTexts,n=e.split(" "),i=n.length;return s.forEach(((e,s)=>{let o=!0,r=0;for(let t=0;tthis._search(e))));return s.sort(((e,t)=>e.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars)),new Set(s.map((e=>e.what)))}}}}]); +//# sourceMappingURL=333.d7addf177783fe16e44c.chunk.js.map \ No newline at end of file diff --git a/public/333.d7addf177783fe16e44c.chunk.js.map b/public/333.d7addf177783fe16e44c.chunk.js.map new file mode 100644 index 00000000..eb845220 --- /dev/null +++ b/public/333.d7addf177783fe16e44c.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"333.d7addf177783fe16e44c.chunk.js","mappings":"8IAWA,MACMA,EAAgC,IAAIC,IAAI,CAAC,iBAAkB,kBAAmB,aAAc,qBAOnF,MAAMC,EAWnBC,YAAsBC,EAnBD,GAmBC,KAAAA,cAAAA,EAVf,KAAAC,QAAU,EACP,KAAAC,MAAoC,GACpC,KAAAC,UAAsC,IAAIN,IAE1C,KAAAO,YAA6B,KAC7B,KAAAC,cAA4B,KAE5B,KAAAC,KAAM,QAAO,KAAM,YAI3BC,KAAKC,cAAe,QAAS,IAAMD,KAAKE,iBAAiB,GAAG,GAGvDC,QACLH,KAAKJ,UAAUO,QAEfH,KAAKL,MAAMS,OAAS,EAOfC,OACFL,KAAKH,cAGRG,KAAKH,YAAc,IAAIS,SAAQ,CAACC,EAASC,KACvCR,KAAKF,cAAgBS,MAUlBE,SACDT,KAAKF,gBAETE,KAAKF,gBACLE,KAAKF,cAAgBE,KAAKH,YAAc,KAExCG,KAAKC,gBAGSS,YAAYC,G,qCAC1B,IAAGX,KAAKH,YAAR,CAIAG,KAAKJ,UAAUgB,IAAID,GAMnB,UAIQX,KAAKa,SAASF,GACpB,MAAMG,GACFzB,EAAc0B,IAAKD,MAAAA,OAAG,EAAHA,EAAkBE,OACvChB,KAAKD,IAAIkB,MAAM,wBAAyBH,GAI5Cd,KAAKJ,UAAUsB,OAAOP,GAMtBX,KAAKC,iB,+RAGGY,SAASF,GACjB,OAAOA,EAAKQ,OAGJC,UACR,OAAOpB,KAAKL,MAAM0B,QAGVC,WAAWC,EAA4BC,GAC/CxB,KAAKL,MAAM4B,GAAQC,GACnBxB,KAAKC,eAGGC,cAAcS,GACtB,MAAIX,KAAKL,MAAMS,QAAUJ,KAAKH,aAAgBG,KAAKP,cAAgB,GAAKO,KAAKJ,UAAU6B,MAAQzB,KAAKP,eAIpG,EAAG,CAOD,GANGkB,GACD,OAAiBX,KAAKL,MAAOgB,GAE7BA,EAAOX,KAAKoB,WAGXT,EAGD,MAFAX,KAAKU,YAAYC,GAKnBA,EAAO,WAEDX,KAAKJ,UAAU6B,KAAOzB,KAAKP,eAAiBO,KAAKL,MAAMS,QAI1DsB,KAAKF,GACVxB,KAAKsB,WAAW,OAAQE,GAGnBG,QAAQH,GACbxB,KAAKsB,WAAW,UAAWE,M,gCCjI/B,MAEA,EAF2C,CAAC,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,EAAK,MAAO,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,EAAK,IAAK,EAAK,IAAK,EAAK,GAAI,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAA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","sources":["webpack://tweb/./src/components/lazyLoadQueueBase.ts","webpack://tweb/./src/config/latinizeMap.ts","webpack://tweb/./src/helpers/array/filterUnique.ts","webpack://tweb/./src/helpers/array/flatten.ts","webpack://tweb/./src/helpers/array/forEachReverse.ts","webpack://tweb/./src/helpers/array/insertInDescendSortedArray.ts","webpack://tweb/./src/helpers/assumeType.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./src/helpers/callbackify.ts","webpack://tweb/./src/helpers/getFileNameForUpload.ts","webpack://tweb/./src/helpers/middleware.ts","webpack://tweb/./src/helpers/object/getDeepProperty.ts","webpack://tweb/./src/helpers/object/getObjectKeysAndSort.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/slicedArray.ts","webpack://tweb/./src/helpers/compareValue.ts","webpack://tweb/./src/helpers/long/compareLong.ts","webpack://tweb/./src/lib/appManagers/utils/attachMenuBots/getAttachMenuBotIcon.ts","webpack://tweb/./src/lib/appManagers/utils/chats/getParticipantPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/chats/hasRights.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndex.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndexKey.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileLocation.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadFileNameFromOptions.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadMediaDetails.ts","webpack://tweb/./src/lib/appManagers/utils/webDocs/getWebDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/drafts/draftsAreEqual.ts","webpack://tweb/./src/lib/appManagers/utils/inlineBots/generateQId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/generateMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/getServerMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/clearMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/index.ts","webpack://tweb/./src/lib/appManagers/utils/messages/filterMessagesByInputFilter.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getAlbumText.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageThreadId.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerActiveUsernames.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerPhoto.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isPeerRestricted.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/reactions/reactionsEqual.ts","webpack://tweb/./src/lib/appManagers/utils/stickers/getStickerEffectThumb.ts","webpack://tweb/./src/lib/appManagers/utils/users/canSendToUser.ts","webpack://tweb/./src/lib/appManagers/utils/webDocs/isWebDocument.ts","webpack://tweb/./src/lib/mtproto/connectionStatus.ts","webpack://tweb/./src/lib/richTextProcessor/combineSameEntities.ts","webpack://tweb/./src/lib/richTextProcessor/encodeSpoiler.ts","webpack://tweb/./src/lib/richTextProcessor/spoiler.ts","webpack://tweb/./src/lib/richTextProcessor/findConflictingEntity.ts","webpack://tweb/./src/lib/richTextProcessor/fixEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrl.ts","webpack://tweb/./src/lib/richTextProcessor/mergeEntities.ts","webpack://tweb/./src/config/tld.ts","webpack://tweb/./src/lib/richTextProcessor/checkBrackets.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiUnified.ts","webpack://tweb/./src/lib/richTextProcessor/parseEntities.ts","webpack://tweb/./src/lib/richTextProcessor/parseMarkdown.ts","webpack://tweb/./src/lib/richTextProcessor/sortEntities.ts","webpack://tweb/./src/lib/richTextProcessor/wrapPlainText.ts","webpack://tweb/./src/lib/searchIndex.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport {Middleware} from '../helpers/middleware';\nimport throttle from '../helpers/schedulers/throttle';\nimport {logger, LogTypes} from '../lib/logger';\n\nconst PARALLEL_LIMIT = 8;\nconst IGNORE_ERRORS: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE', 'MIDDLEWARE', 'NO_AUTO_DOWNLOAD']);\n\nexport type LazyLoadElementBase = {\n load: () => Promise,\n middleware?: Middleware\n};\n\nexport default class LazyLoadQueueBase {\n public queueId = 0;\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n protected lockPromise: Promise = null;\n protected unlockResolve: () => void = null;\n\n protected log = logger('LL', LogTypes.Error);\n protected processQueue: () => void;\n\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\n this.processQueue = throttle(() => this._processQueue(), 8, false);\n }\n\n public clear() {\n this.inProcess.clear(); // ацтеки забьются, будет плохо\n\n this.queue.length = 0;\n // unreachable code\n /* for(let item of this.inProcess) {\n this.lazyLoadMedia.push(item);\n } */\n }\n\n public lock() {\n if(this.lockPromise) return;\n\n // const perf = performance.now();\n this.lockPromise = new Promise((resolve, reject) => {\n this.unlockResolve = resolve;\n });\n\n /* if(DEBUG) {\n this.lockPromise.then(() => {\n this.log('was locked for:', performance.now() - perf);\n });\n } */\n }\n\n public unlock() {\n if(!this.unlockResolve) return;\n\n this.unlockResolve();\n this.unlockResolve = this.lockPromise = null;\n\n this.processQueue();\n }\n\n protected async processItem(item: LazyLoadElementBase) {\n if(this.lockPromise) {\n return;\n }\n\n this.inProcess.add(item);\n\n /* if(DEBUG) {\n this.log('will load media', this.lockPromise, item);\n } */\n\n try {\n // await new Promise((resolve) => setTimeout(resolve, 2e3));\n // await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\n // await item.load(item.div);\n await this.loadItem(item);\n } catch(err) {\n if(!IGNORE_ERRORS.has((err as ApiError)?.type)) {\n this.log.error('loadMediaQueue error:', err/* , item */);\n }\n }\n\n this.inProcess.delete(item);\n\n /* if(DEBUG) {\n this.log('loaded media', item);\n } */\n\n this.processQueue();\n }\n\n protected loadItem(item: LazyLoadElementBase) {\n return item.load();\n }\n\n protected getItem() {\n return this.queue.shift();\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\n this.queue[method](el);\n this.processQueue();\n }\n\n protected _processQueue(item?: LazyLoadElementBase) {\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\n\n // console.log('_processQueue start');\n // let added = 0;\n do {\n if(item) {\n indexOfAndSplice(this.queue, item);\n } else {\n item = this.getItem();\n }\n\n if(item) {\n this.processItem(item);\n } else {\n break;\n }\n\n item = null;\n // ++added;\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\n // console.log('_processQueue end, added', added, this.queue.length);\n }\n\n public push(el: LazyLoadElementBase) {\n this.addElement('push', el);\n }\n\n public unshift(el: LazyLoadElementBase) {\n this.addElement('unshift', el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\nconst LatinizeMap: {[k: string]: string} = {'Á': 'A', 'Ă': 'A', 'Ắ': 'A', 'Ặ': 'A', 'Ằ': 'A', 'Ẳ': 'A', 'Ẵ': 'A', 'Ǎ': 'A', 'Â': 'A', 'Ấ': 'A', 'Ậ': 'A', 'Ầ': 'A', 'Ẩ': 'A', 'Ẫ': 'A', 'Ä': 'A', 'Ǟ': 'A', 'Ȧ': 'A', 'Ǡ': 'A', 'Ạ': 'A', 'Ȁ': 'A', 'À': 'A', 'Ả': 'A', 'Ȃ': 'A', 'Ā': 'A', 'Ą': 'A', 'Å': 'A', 'Ǻ': 'A', 'Ḁ': 'A', 'Ⱥ': 'A', 'Ã': 'A', 'Ꜳ': 'AA', 'Æ': 'AE', 'Ǽ': 'AE', 'Ǣ': 'AE', 'Ꜵ': 'AO', 'Ꜷ': 'AU', 'Ꜹ': 'AV', 'Ꜻ': 'AV', 'Ꜽ': 'AY', 'Ḃ': 'B', 'Ḅ': 'B', 'Ɓ': 'B', 'Ḇ': 'B', 'Ƀ': 'B', 'Ƃ': 'B', 'Ć': 'C', 'Č': 'C', 'Ç': 'C', 'Ḉ': 'C', 'Ĉ': 'C', 'Ċ': 'C', 'Ƈ': 'C', 'Ȼ': 'C', 'Ď': 'D', 'Ḑ': 'D', 'Ḓ': 'D', 'Ḋ': 'D', 'Ḍ': 'D', 'Ɗ': 'D', 'Ḏ': 'D', 'Dz': 'D', 'Dž': 'D', 'Đ': 'D', 'Ƌ': 'D', 'DZ': 'DZ', 'DŽ': 'DZ', 'É': 'E', 'Ĕ': 'E', 'Ě': 'E', 'Ȩ': 'E', 'Ḝ': 'E', 'Ê': 'E', 'Ế': 'E', 'Ệ': 'E', 'Ề': 'E', 'Ể': 'E', 'Ễ': 'E', 'Ḙ': 'E', 'Ë': 'E', 'Ė': 'E', 'Ẹ': 'E', 'Ȅ': 'E', 'È': 'E', 'Ẻ': 'E', 'Ȇ': 'E', 'Ē': 'E', 'Ḗ': 'E', 'Ḕ': 'E', 'Ę': 'E', 'Ɇ': 'E', 'Ẽ': 'E', 'Ḛ': 'E', 'Ꝫ': 'ET', 'Ḟ': 'F', 'Ƒ': 'F', 'Ǵ': 'G', 'Ğ': 'G', 'Ǧ': 'G', 'Ģ': 'G', 'Ĝ': 'G', 'Ġ': 'G', 'Ɠ': 'G', 'Ḡ': 'G', 'Ǥ': 'G', 'Ḫ': 'H', 'Ȟ': 'H', 'Ḩ': 'H', 'Ĥ': 'H', 'Ⱨ': 'H', 'Ḧ': 'H', 'Ḣ': 'H', 'Ḥ': 'H', 'Ħ': 'H', 'Í': 'I', 'Ĭ': 'I', 'Ǐ': 'I', 'Î': 'I', 'Ï': 'I', 'Ḯ': 'I', 'İ': 'I', 'Ị': 'I', 'Ȉ': 'I', 'Ì': 'I', 'Ỉ': 'I', 'Ȋ': 'I', 'Ī': 'I', 'Į': 'I', 'Ɨ': 'I', 'Ĩ': 'I', 'Ḭ': 'I', 'Ꝺ': 'D', 'Ꝼ': 'F', 'Ᵹ': 'G', 'Ꞃ': 'R', 'Ꞅ': 'S', 'Ꞇ': 'T', 'Ꝭ': 'IS', 'Ĵ': 'J', 'Ɉ': 'J', 'Ḱ': 'K', 'Ǩ': 'K', 'Ķ': 'K', 'Ⱪ': 'K', 'Ꝃ': 'K', 'Ḳ': 'K', 'Ƙ': 'K', 'Ḵ': 'K', 'Ꝁ': 'K', 'Ꝅ': 'K', 'Ĺ': 'L', 'Ƚ': 'L', 'Ľ': 'L', 'Ļ': 'L', 'Ḽ': 'L', 'Ḷ': 'L', 'Ḹ': 'L', 'Ⱡ': 'L', 'Ꝉ': 'L', 'Ḻ': 'L', 'Ŀ': 'L', 'Ɫ': 'L', 'Lj': 'L', 'Ł': 'L', 'LJ': 'LJ', 'Ḿ': 'M', 'Ṁ': 'M', 'Ṃ': 'M', 'Ɱ': 'M', 'Ń': 'N', 'Ň': 'N', 'Ņ': 'N', 'Ṋ': 'N', 'Ṅ': 'N', 'Ṇ': 'N', 'Ǹ': 'N', 'Ɲ': 'N', 'Ṉ': 'N', 'Ƞ': 'N', 'Nj': 'N', 'Ñ': 'N', 'NJ': 'NJ', 'Ó': 'O', 'Ŏ': 'O', 'Ǒ': 'O', 'Ô': 'O', 'Ố': 'O', 'Ộ': 'O', 'Ồ': 'O', 'Ổ': 'O', 'Ỗ': 'O', 'Ö': 'O', 'Ȫ': 'O', 'Ȯ': 'O', 'Ȱ': 'O', 'Ọ': 'O', 'Ő': 'O', 'Ȍ': 'O', 'Ò': 'O', 'Ỏ': 'O', 'Ơ': 'O', 'Ớ': 'O', 'Ợ': 'O', 'Ờ': 'O', 'Ở': 'O', 'Ỡ': 'O', 'Ȏ': 'O', 'Ꝋ': 'O', 'Ꝍ': 'O', 'Ō': 'O', 'Ṓ': 'O', 'Ṑ': 'O', 'Ɵ': 'O', 'Ǫ': 'O', 'Ǭ': 'O', 'Ø': 'O', 'Ǿ': 'O', 'Õ': 'O', 'Ṍ': 'O', 'Ṏ': 'O', 'Ȭ': 'O', 'Ƣ': 'OI', 'Ꝏ': 'OO', 'Ɛ': 'E', 'Ɔ': 'O', 'Ȣ': 'OU', 'Ṕ': 'P', 'Ṗ': 'P', 'Ꝓ': 'P', 'Ƥ': 'P', 'Ꝕ': 'P', 'Ᵽ': 'P', 'Ꝑ': 'P', 'Ꝙ': 'Q', 'Ꝗ': 'Q', 'Ŕ': 'R', 'Ř': 'R', 'Ŗ': 'R', 'Ṙ': 'R', 'Ṛ': 'R', 'Ṝ': 'R', 'Ȑ': 'R', 'Ȓ': 'R', 'Ṟ': 'R', 'Ɍ': 'R', 'Ɽ': 'R', 'Ꜿ': 'C', 'Ǝ': 'E', 'Ś': 'S', 'Ṥ': 'S', 'Š': 'S', 'Ṧ': 'S', 'Ş': 'S', 'Ŝ': 'S', 'Ș': 'S', 'Ṡ': 'S', 'Ṣ': 'S', 'Ṩ': 'S', 'ẞ': 'SS', 'Ť': 'T', 'Ţ': 'T', 'Ṱ': 'T', 'Ț': 'T', 'Ⱦ': 'T', 'Ṫ': 'T', 'Ṭ': 'T', 'Ƭ': 'T', 'Ṯ': 'T', 'Ʈ': 'T', 'Ŧ': 'T', 'Ɐ': 'A', 'Ꞁ': 'L', 'Ɯ': 'M', 'Ʌ': 'V', 'Ꜩ': 'TZ', 'Ú': 'U', 'Ŭ': 'U', 'Ǔ': 'U', 'Û': 'U', 'Ṷ': 'U', 'Ü': 'U', 'Ǘ': 'U', 'Ǚ': 'U', 'Ǜ': 'U', 'Ǖ': 'U', 'Ṳ': 'U', 'Ụ': 'U', 'Ű': 'U', 'Ȕ': 'U', 'Ù': 'U', 'Ủ': 'U', 'Ư': 'U', 'Ứ': 'U', 'Ự': 'U', 'Ừ': 'U', 'Ử': 'U', 'Ữ': 'U', 'Ȗ': 'U', 'Ū': 'U', 'Ṻ': 'U', 'Ų': 'U', 'Ů': 'U', 'Ũ': 'U', 'Ṹ': 'U', 'Ṵ': 'U', 'Ꝟ': 'V', 'Ṿ': 'V', 'Ʋ': 'V', 'Ṽ': 'V', 'Ꝡ': 'VY', 'Ẃ': 'W', 'Ŵ': 'W', 'Ẅ': 'W', 'Ẇ': 'W', 'Ẉ': 'W', 'Ẁ': 'W', 'Ⱳ': 'W', 'Ẍ': 'X', 'Ẋ': 'X', 'Ý': 'Y', 'Ŷ': 'Y', 'Ÿ': 'Y', 'Ẏ': 'Y', 'Ỵ': 'Y', 'Ỳ': 'Y', 'Ƴ': 'Y', 'Ỷ': 'Y', 'Ỿ': 'Y', 'Ȳ': 'Y', 'Ɏ': 'Y', 'Ỹ': 'Y', 'Ź': 'Z', 'Ž': 'Z', 'Ẑ': 'Z', 'Ⱬ': 'Z', 'Ż': 'Z', 'Ẓ': 'Z', 'Ȥ': 'Z', 'Ẕ': 'Z', 'Ƶ': 'Z', 'IJ': 'IJ', 'Œ': 'OE', 'ᴀ': 'A', 'ᴁ': 'AE', 'ʙ': 'B', 'ᴃ': 'B', 'ᴄ': 'C', 'ᴅ': 'D', 'ᴇ': 'E', 'ꜰ': 'F', 'ɢ': 'G', 'ʛ': 'G', 'ʜ': 'H', 'ɪ': 'I', 'ʁ': 'R', 'ᴊ': 'J', 'ᴋ': 'K', 'ʟ': 'L', 'ᴌ': 'L', 'ᴍ': 'M', 'ɴ': 'N', 'ᴏ': 'O', 'ɶ': 'OE', 'ᴐ': 'O', 'ᴕ': 'OU', 'ᴘ': 'P', 'ʀ': 'R', 'ᴎ': 'N', 'ᴙ': 'R', 'ꜱ': 'S', 'ᴛ': 'T', 'ⱻ': 'E', 'ᴚ': 'R', 'ᴜ': 'U', 'ᴠ': 'V', 'ᴡ': 'W', 'ʏ': 'Y', 'ᴢ': 'Z', 'á': 'a', 'ă': 'a', 'ắ': 'a', 'ặ': 'a', 'ằ': 'a', 'ẳ': 'a', 'ẵ': 'a', 'ǎ': 'a', 'â': 'a', 'ấ': 'a', 'ậ': 'a', 'ầ': 'a', 'ẩ': 'a', 'ẫ': 'a', 'ä': 'a', 'ǟ': 'a', 'ȧ': 'a', 'ǡ': 'a', 'ạ': 'a', 'ȁ': 'a', 'à': 'a', 'ả': 'a', 'ȃ': 'a', 'ā': 'a', 'ą': 'a', 'ᶏ': 'a', 'ẚ': 'a', 'å': 'a', 'ǻ': 'a', 'ḁ': 'a', 'ⱥ': 'a', 'ã': 'a', 'ꜳ': 'aa', 'æ': 'ae', 'ǽ': 'ae', 'ǣ': 'ae', 'ꜵ': 'ao', 'ꜷ': 'au', 'ꜹ': 'av', 'ꜻ': 'av', 'ꜽ': 'ay', 'ḃ': 'b', 'ḅ': 'b', 'ɓ': 'b', 'ḇ': 'b', 'ᵬ': 'b', 'ᶀ': 'b', 'ƀ': 'b', 'ƃ': 'b', 'ɵ': 'o', 'ć': 'c', 'č': 'c', 'ç': 'c', 'ḉ': 'c', 'ĉ': 'c', 'ɕ': 'c', 'ċ': 'c', 'ƈ': 'c', 'ȼ': 'c', 'ď': 'd', 'ḑ': 'd', 'ḓ': 'd', 'ȡ': 'd', 'ḋ': 'd', 'ḍ': 'd', 'ɗ': 'd', 'ᶑ': 'd', 'ḏ': 'd', 'ᵭ': 'd', 'ᶁ': 'd', 'đ': 'd', 'ɖ': 'd', 'ƌ': 'd', 'ı': 'i', 'ȷ': 'j', 'ɟ': 'j', 'ʄ': 'j', 'dz': 'dz', 'dž': 'dz', 'é': 'e', 'ĕ': 'e', 'ě': 'e', 'ȩ': 'e', 'ḝ': 'e', 'ê': 'e', 'ế': 'e', 'ệ': 'e', 'ề': 'e', 'ể': 'e', 'ễ': 'e', 'ḙ': 'e', 'ë': 'e', 'ė': 'e', 'ẹ': 'e', 'ȅ': 'e', 'è': 'e', 'ẻ': 'e', 'ȇ': 'e', 'ē': 'e', 'ḗ': 'e', 'ḕ': 'e', 'ⱸ': 'e', 'ę': 'e', 'ᶒ': 'e', 'ɇ': 'e', 'ẽ': 'e', 'ḛ': 'e', 'ꝫ': 'et', 'ḟ': 'f', 'ƒ': 'f', 'ᵮ': 'f', 'ᶂ': 'f', 'ǵ': 'g', 'ğ': 'g', 'ǧ': 'g', 'ģ': 'g', 'ĝ': 'g', 'ġ': 'g', 'ɠ': 'g', 'ḡ': 'g', 'ᶃ': 'g', 'ǥ': 'g', 'ḫ': 'h', 'ȟ': 'h', 'ḩ': 'h', 'ĥ': 'h', 'ⱨ': 'h', 'ḧ': 'h', 'ḣ': 'h', 'ḥ': 'h', 'ɦ': 'h', 'ẖ': 'h', 'ħ': 'h', 'ƕ': 'hv', 'í': 'i', 'ĭ': 'i', 'ǐ': 'i', 'î': 'i', 'ï': 'i', 'ḯ': 'i', 'ị': 'i', 'ȉ': 'i', 'ì': 'i', 'ỉ': 'i', 'ȋ': 'i', 'ī': 'i', 'į': 'i', 'ᶖ': 'i', 'ɨ': 'i', 'ĩ': 'i', 'ḭ': 'i', 'ꝺ': 'd', 'ꝼ': 'f', 'ᵹ': 'g', 'ꞃ': 'r', 'ꞅ': 's', 'ꞇ': 't', 'ꝭ': 'is', 'ǰ': 'j', 'ĵ': 'j', 'ʝ': 'j', 'ɉ': 'j', 'ḱ': 'k', 'ǩ': 'k', 'ķ': 'k', 'ⱪ': 'k', 'ꝃ': 'k', 'ḳ': 'k', 'ƙ': 'k', 'ḵ': 'k', 'ᶄ': 'k', 'ꝁ': 'k', 'ꝅ': 'k', 'ĺ': 'l', 'ƚ': 'l', 'ɬ': 'l', 'ľ': 'l', 'ļ': 'l', 'ḽ': 'l', 'ȴ': 'l', 'ḷ': 'l', 'ḹ': 'l', 'ⱡ': 'l', 'ꝉ': 'l', 'ḻ': 'l', 'ŀ': 'l', 'ɫ': 'l', 'ᶅ': 'l', 'ɭ': 'l', 'ł': 'l', 'lj': 'lj', 'ſ': 's', 'ẜ': 's', 'ẛ': 's', 'ẝ': 's', 'ḿ': 'm', 'ṁ': 'm', 'ṃ': 'm', 'ɱ': 'm', 'ᵯ': 'm', 'ᶆ': 'm', 'ń': 'n', 'ň': 'n', 'ņ': 'n', 'ṋ': 'n', 'ȵ': 'n', 'ṅ': 'n', 'ṇ': 'n', 'ǹ': 'n', 'ɲ': 'n', 'ṉ': 'n', 'ƞ': 'n', 'ᵰ': 'n', 'ᶇ': 'n', 'ɳ': 'n', 'ñ': 'n', 'nj': 'nj', 'ó': 'o', 'ŏ': 'o', 'ǒ': 'o', 'ô': 'o', 'ố': 'o', 'ộ': 'o', 'ồ': 'o', 'ổ': 'o', 'ỗ': 'o', 'ö': 'o', 'ȫ': 'o', 'ȯ': 'o', 'ȱ': 'o', 'ọ': 'o', 'ő': 'o', 'ȍ': 'o', 'ò': 'o', 'ỏ': 'o', 'ơ': 'o', 'ớ': 'o', 'ợ': 'o', 'ờ': 'o', 'ở': 'o', 'ỡ': 'o', 'ȏ': 'o', 'ꝋ': 'o', 'ꝍ': 'o', 'ⱺ': 'o', 'ō': 'o', 'ṓ': 'o', 'ṑ': 'o', 'ǫ': 'o', 'ǭ': 'o', 'ø': 'o', 'ǿ': 'o', 'õ': 'o', 'ṍ': 'o', 'ṏ': 'o', 'ȭ': 'o', 'ƣ': 'oi', 'ꝏ': 'oo', 'ɛ': 'e', 'ᶓ': 'e', 'ɔ': 'o', 'ᶗ': 'o', 'ȣ': 'ou', 'ṕ': 'p', 'ṗ': 'p', 'ꝓ': 'p', 'ƥ': 'p', 'ᵱ': 'p', 'ᶈ': 'p', 'ꝕ': 'p', 'ᵽ': 'p', 'ꝑ': 'p', 'ꝙ': 'q', 'ʠ': 'q', 'ɋ': 'q', 'ꝗ': 'q', 'ŕ': 'r', 'ř': 'r', 'ŗ': 'r', 'ṙ': 'r', 'ṛ': 'r', 'ṝ': 'r', 'ȑ': 'r', 'ɾ': 'r', 'ᵳ': 'r', 'ȓ': 'r', 'ṟ': 'r', 'ɼ': 'r', 'ᵲ': 'r', 'ᶉ': 'r', 'ɍ': 'r', 'ɽ': 'r', 'ↄ': 'c', 'ꜿ': 'c', 'ɘ': 'e', 'ɿ': 'r', 'ś': 's', 'ṥ': 's', 'š': 's', 'ṧ': 's', 'ş': 's', 'ŝ': 's', 'ș': 's', 'ṡ': 's', 'ṣ': 's', 'ṩ': 's', 'ʂ': 's', 'ᵴ': 's', 'ᶊ': 's', 'ȿ': 's', 'ɡ': 'g', 'ß': 'ss', 'ᴑ': 'o', 'ᴓ': 'o', 'ᴝ': 'u', 'ť': 't', 'ţ': 't', 'ṱ': 't', 'ț': 't', 'ȶ': 't', 'ẗ': 't', 'ⱦ': 't', 'ṫ': 't', 'ṭ': 't', 'ƭ': 't', 'ṯ': 't', 'ᵵ': 't', 'ƫ': 't', 'ʈ': 't', 'ŧ': 't', 'ᵺ': 'th', 'ɐ': 'a', 'ᴂ': 'ae', 'ǝ': 'e', 'ᵷ': 'g', 'ɥ': 'h', 'ʮ': 'h', 'ʯ': 'h', 'ᴉ': 'i', 'ʞ': 'k', 'ꞁ': 'l', 'ɯ': 'm', 'ɰ': 'm', 'ᴔ': 'oe', 'ɹ': 'r', 'ɻ': 'r', 'ɺ': 'r', 'ⱹ': 'r', 'ʇ': 't', 'ʌ': 'v', 'ʍ': 'w', 'ʎ': 'y', 'ꜩ': 'tz', 'ú': 'u', 'ŭ': 'u', 'ǔ': 'u', 'û': 'u', 'ṷ': 'u', 'ü': 'u', 'ǘ': 'u', 'ǚ': 'u', 'ǜ': 'u', 'ǖ': 'u', 'ṳ': 'u', 'ụ': 'u', 'ű': 'u', 'ȕ': 'u', 'ù': 'u', 'ủ': 'u', 'ư': 'u', 'ứ': 'u', 'ự': 'u', 'ừ': 'u', 'ử': 'u', 'ữ': 'u', 'ȗ': 'u', 'ū': 'u', 'ṻ': 'u', 'ų': 'u', 'ᶙ': 'u', 'ů': 'u', 'ũ': 'u', 'ṹ': 'u', 'ṵ': 'u', 'ᵫ': 'ue', 'ꝸ': 'um', 'ⱴ': 'v', 'ꝟ': 'v', 'ṿ': 'v', 'ʋ': 'v', 'ᶌ': 'v', 'ⱱ': 'v', 'ṽ': 'v', 'ꝡ': 'vy', 'ẃ': 'w', 'ŵ': 'w', 'ẅ': 'w', 'ẇ': 'w', 'ẉ': 'w', 'ẁ': 'w', 'ⱳ': 'w', 'ẘ': 'w', 'ẍ': 'x', 'ẋ': 'x', 'ᶍ': 'x', 'ý': 'y', 'ŷ': 'y', 'ÿ': 'y', 'ẏ': 'y', 'ỵ': 'y', 'ỳ': 'y', 'ƴ': 'y', 'ỷ': 'y', 'ỿ': 'y', 'ȳ': 'y', 'ẙ': 'y', 'ɏ': 'y', 'ỹ': 'y', 'ź': 'z', 'ž': 'z', 'ẑ': 'z', 'ʑ': 'z', 'ⱬ': 'z', 'ż': 'z', 'ẓ': 'z', 'ȥ': 'z', 'ẕ': 'z', 'ᵶ': 'z', 'ᶎ': 'z', 'ʐ': 'z', 'ƶ': 'z', 'ɀ': 'z', 'ff': 'ff', 'ffi': 'ffi', 'ffl': 'ffl', 'fi': 'fi', 'fl': 'fl', 'ij': 'ij', 'œ': 'oe', 'st': 'st', 'ₐ': 'a', 'ₑ': 'e', 'ᵢ': 'i', 'ⱼ': 'j', 'ₒ': 'o', 'ᵣ': 'r', 'ᵤ': 'u', 'ᵥ': 'v', 'ₓ': 'x', 'Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'};\n\nexport default LatinizeMap;\n","export default function filterUnique>(arr: T): T {\n return [...new Set(arr)] as T;\n}\n","export default function flatten(arr: T[][]): T[] {\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\n}\n","export default function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","export default function insertInDescendSortedArray(array: Array, element: T, getProperty: K, pos?: number): number;\nexport default function insertInDescendSortedArray(array: Array, element: T, getProperty: (element: T) => number, pos?: number): number;\nexport default function insertInDescendSortedArray(array: Array, element: T, getProperty: K | ((element: T) => T[K]), pos?: number): number {\n if(typeof(getProperty) !== 'function') {\n const property = getProperty;\n getProperty = (element) => element[property];\n }\n\n const sortProperty: number = getProperty(element);\n\n if(pos === undefined) {\n pos = array.indexOf(element);\n if(pos !== -1) {\n const prev = array[pos - 1];\n const next = array[pos + 1];\n if((!prev || getProperty(prev) >= sortProperty) && (!next || getProperty(next) <= sortProperty)) {\n // console.warn('same pos', pos, sortProperty, prev, next);\n return pos;\n }\n\n array.splice(pos, 1);\n }\n }\n\n const len = array.length;\n if(!len || sortProperty <= getProperty(array[len - 1])) {\n return array.push(element) - 1;\n } else if(sortProperty >= getProperty(array[0])) {\n array.unshift(element);\n return 0;\n } else {\n for(let i = 0; i < len; i++) {\n if(sortProperty > getProperty(array[i])) {\n array.splice(i, 0, element);\n return i;\n }\n }\n }\n\n console.error('wtf', array, element);\n return array.indexOf(element);\n}\n","export default function assumeType(x: unknown): asserts x is T {\n return; // ¯\\_(ツ)_/¯\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Awaited} from '../types';\n\nexport default function callbackify, R>(\n smth: T,\n callback: (result: Awaited) => R\n): T extends Promise ? Promise> : R {\n if(smth instanceof Promise) {\n // @ts-ignore\n return smth.then(callback);\n } else {\n return callback(smth as any) 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 tabId from '../config/tabId';\n\nlet uploadId = 0;\nexport default function getFileNameForUpload(file: File | Blob) {\n let fileName: string;\n const mimeType = file?.type;\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\n const ext = `${tabId}_${uploadId++}.${mimeType.split('/')[1]}`;\n\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\n fileName = 'photo' + ext;\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\n fileName = 'audio' + ext;\n } else if(mimeType.indexOf('video/') === 0) {\n fileName = 'video' + ext;\n } else {\n fileName = 'document' + ext;\n }\n } else {\n fileName = `upload-${tabId}_${uploadId++}`;\n }\n\n return fileName;\n}\n","/*\n * 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 './array/indexOfAndSplice';\nimport makeError from './makeError';\n\nexport type Middleware = {\n (): boolean;\n create(): MiddlewareHelper;\n onClean: (callback: VoidFunction) => void;\n onDestroy: (callback: VoidFunction) => void;\n};\n\nconst createDetails = (): {\n cleaned?: boolean,\n inner: MiddlewareHelper[],\n onCleanCallbacks: VoidFunction[]\n} => ({\n cleaned: false,\n inner: [],\n onCleanCallbacks: []\n});\n\nconst MIDDLEWARE_ERROR = makeError('MIDDLEWARE');\n\n// * onClean == cancel promises, etc\n// * onDestroy == destructor\nexport class MiddlewareHelper {\n private details = createDetails();\n private onDestroyCallbacks: VoidFunction[] = [];\n private parent: MiddlewareHelper;\n private destroyed: boolean;\n\n public clean() {\n const details = this.details;\n details.cleaned = true;\n details.inner.splice(0, details.inner.length).forEach((helper) => helper.destroy());\n details.onCleanCallbacks.splice(0, details.onCleanCallbacks.length).forEach((callback) => callback());\n this.details = createDetails();\n }\n\n public destroy() {\n this.destroyed = true;\n this.clean();\n this.onDestroyCallbacks.splice(0, this.onDestroyCallbacks.length).forEach((callback) => callback());\n\n if(this.parent) {\n indexOfAndSplice(this.parent.details.inner, this);\n this.parent = undefined;\n }\n }\n\n public get(additionalCallback?: () => boolean) {\n const details = this.details;\n\n const middleware: Middleware = () => {\n return !details.cleaned && (!additionalCallback || additionalCallback());\n };\n\n middleware.create = () => {\n if(!middleware()) throw MIDDLEWARE_ERROR;\n const helper = getMiddleware();\n helper.parent = this;\n details.inner.push(helper);\n return helper;\n };\n\n middleware.onClean = (callback) => {\n if(!middleware()) return callback();\n details.onCleanCallbacks.push(callback);\n };\n\n middleware.onDestroy = this.onDestroy;\n\n return middleware;\n }\n\n public onDestroy = (callback: VoidFunction) => {\n if(this.destroyed) return callback();\n this.onDestroyCallbacks.push(callback);\n };\n}\n\n// * will change .cleaned and new instance will be created\nexport function getMiddleware() {\n return new MiddlewareHelper();\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","export default function getObjectKeysAndSort(object: {[key: string]: any} | Map, sort: 'asc' | 'desc' = 'asc') {\n if(!object) return [];\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map((i) => +i);\n if(sort === 'asc') return ids.sort((a, b) => a - b);\n else return ids.sort((a, b) => b - a);\n}\n","// * Jolly Cobra's schedulers\n\nimport ctx from '../../environment/ctx';\nimport {AnyFunction, Awaited} from '../../types';\nimport noop from '../noop';\n\nexport type DebounceReturnType = {\n (...args: Parameters): Promise>>;\n clearTimeout(): void;\n isDebounced(): boolean;\n};\n\nexport default function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true\n): DebounceReturnType {\n let waitingTimeout: number;\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\n let hadNewCall = false;\n\n const invoke = (args: Parameters) => {\n const _resolve = resolve, _reject = reject;\n try {\n const result = fn.apply(null, args);\n _resolve(result);\n } catch(err) {\n console.error('debounce error', err);\n // @ts-ignore\n _reject(err);\n }\n };\n\n const debounce = (...args: Parameters) => {\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n\n if(waitingTimeout) {\n clearTimeout(waitingTimeout);\n hadNewCall = true;\n reject();\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n } else if(shouldRunFirst) {\n invoke(args);\n hadNewCall = false;\n }\n\n const _waitingTimeout = ctx.setTimeout(() => {\n // will run if should run last or first but with new call\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\n invoke(args);\n }\n\n // if debounce was called during invoking\n if(waitingTimeout === _waitingTimeout) {\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n }, ms);\n\n waitingTimeout = _waitingTimeout;\n waitingPromise.catch(noop);\n return waitingPromise;\n };\n\n debounce.clearTimeout = () => {\n if(waitingTimeout) {\n ctx.clearTimeout(waitingTimeout);\n reject();\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n };\n\n debounce.isDebounced = () => !!waitingTimeout;\n\n return debounce;\n}\n","/*\n * 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 indexOfAndSplice from './array/indexOfAndSplice';\nimport compareValue from './compareValue';\n\n/**\n * Descend sorted storage\n */\n\ntype ItemType = number | string;\n\nexport enum SliceEnd {\n None = 0,\n Top = 1,\n Bottom = 2,\n Both = SliceEnd.Top | SliceEnd.Bottom\n};\n\nexport interface Slice extends Array {\n // slicedArray: SlicedArray;\n end: SliceEnd;\n\n isEnd: (side: SliceEnd) => boolean;\n setEnd: (side: SliceEnd) => void;\n unsetEnd: (side: SliceEnd) => void;\n getEnds: () => {top: boolean, bottom: boolean, both: boolean};\n\n slice: (from?: number, to?: number) => Slice;\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\n}\n\nexport interface SliceConstructor {\n // new(...items: T[]): Slice;\n new(length: number): Slice;\n}\n\nexport type SliceSerialized = {\n values: Slice,\n isEnd: {\n top: boolean,\n bottom: boolean,\n both: boolean\n }\n};\n\nexport type SlicedArraySerialized = {\n slices: SliceSerialized[]\n};\n\nexport default class SlicedArray {\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\n private sliceConstructor: SliceConstructor;\n\n constructor() {\n // @ts-ignore\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\n\n const first = this.constructSlice();\n // first.setEnd(SliceEnd.Bottom);\n this.slices = [first];\n }\n\n private static getSliceConstructor(slicedArray: SlicedArray) {\n return class Slice extends Array implements Slice {\n // slicedArray: SlicedArray;\n end: SliceEnd = SliceEnd.None;\n\n /* constructor(...items: ItemType[]) {\n super(...items);\n //this.slicedArray = slicedArray;\n } */\n\n isEnd(side: SliceEnd): boolean {\n if((this.end & side) === side) {\n return true;\n }/* else if(!this.slicedArray) {\n return false;\n } */\n\n let isEnd = false;\n if(side === SliceEnd.Top) {\n const slice = slicedArray.last;\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\n } else if(side === SliceEnd.Bottom) {\n const slice = slicedArray.first;\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\n } else if(side === SliceEnd.Both) {\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\n }\n\n if(isEnd) {\n this.setEnd(side);\n }\n\n return isEnd;\n }\n\n getEnds() {\n return {\n top: this.isEnd(SliceEnd.Top),\n bottom: this.isEnd(SliceEnd.Bottom),\n both: this.isEnd(SliceEnd.Both)\n };\n }\n\n setEnd(side: SliceEnd) {\n this.end |= side;\n }\n\n unsetEnd(side: SliceEnd) {\n this.end &= ~side;\n }\n\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\n const ret = super.splice(start, deleteCount, ...items);\n\n if(!this.length) {\n const slices = slicedArray.slices as ItemType[][];\n const idx = slices.indexOf(this);\n if(idx !== -1) {\n if(slices.length === 1) { // left empty slice without ends\n this.unsetEnd(SliceEnd.Both);\n } else { // delete this slice\n slices.splice(idx, 1);\n }\n }\n }\n\n return ret;\n }\n }\n }\n\n public constructSlice(...items: T[]) {\n // const slice = new Slice(this, ...items);\n // can't pass items directly to constructor because first argument is length\n const slice = new this.sliceConstructor(items.length);\n for(let i = 0, length = items.length; i < length; ++i) {\n slice[i] = items[i];\n }\n return slice;\n\n // ! code below will slow execution in 15 times\n /* const self = this;\n const p: Slice = new Proxy(slice, {\n get: function(target, name: any) {\n if(name === 'constructor') {\n const p = new Proxy(Slice, {\n construct: (target, args) => {\n return self.constructSlice(...args);\n }\n });\n\n return p;\n }\n\n return target[name];\n }\n });\n\n return p; */\n\n /*\n var p = slicedArray.constructSlice();\n p.length = 100000;\n p.fill(255);\n\n var a = new Array(100000);\n a.fill(255);\n\n var b = 0;\n var perf = performance.now();\n for(var i = 0; i < p.length; ++i) {\n b += p[i];\n }\n\n console.log('perf 1', performance.now() - perf);\n\n b = 0;\n perf = performance.now();\n for(var i = 0; i < a.length; ++i) {\n b += a[i];\n }\n\n console.log('perf 2', performance.now() - perf);\n */\n }\n\n public insertSlice(slice: T[], flatten = true) {\n if(!slice.length) {\n return;\n }\n\n const first = this.slices[0];\n if(!first.length) {\n first.push(...slice);\n return first;\n }\n\n const lowerBound = slice[slice.length - 1];\n const upperBound = slice[0];\n\n let foundSlice: Slice, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\n foundSlice = this.slices[foundSliceIndex];\n lowerIndex = foundSlice.indexOf(lowerBound);\n upperIndex = foundSlice.indexOf(upperBound);\n\n if(upperIndex !== -1 && -1 !== lowerIndex) {\n break;\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\n break;\n }\n }\n\n if(upperIndex !== -1 && -1 !== lowerIndex) {\n\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\n const sliced = slice.slice(foundSlice.length - upperIndex);\n foundSlice.push(...sliced);\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\n foundSlice.unshift(...sliced);\n } else {\n let insertIndex = 0;\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\n const s = this.slices[insertIndex];\n if(compareValue(slice[0], s[0]) === 1) {\n break;\n }\n }\n\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\n foundSliceIndex = insertIndex;\n }\n\n if(flatten) {\n return this.flatten(foundSliceIndex);\n }\n }\n\n private flatten(foundSliceIndex: number) {\n if(this.slices.length >= 2) {\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\n const prevSlice = this.slices[i];\n const nextSlice = this.slices[i + 1];\n\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\n if(upperIndex !== -1) {\n prevSlice.setEnd(nextSlice.end);\n this.slices.splice(i + 1, 1);\n\n if(i < foundSliceIndex) {\n --foundSliceIndex;\n }\n\n --length; // respect array bounds\n --i; // repeat from the same place\n\n this.insertSlice(nextSlice, false);\n }\n }\n }\n\n return this.slices[foundSliceIndex];\n }\n\n // *\n\n get first() {\n return this.slices[0];\n }\n\n get last() {\n return this.slices[this.slices.length - 1];\n }\n\n get slice() {\n return this.first;\n }\n\n get length() {\n return this.slice.length;\n }\n\n public findSlice(item: T) {\n for(let i = 0, length = this.slices.length; i < length; ++i) {\n const slice = this.slices[i];\n const index = slice.indexOf(item);\n if(index !== -1) {\n return {slice, index};\n }\n }\n\n return undefined;\n }\n\n public findSliceOffset(maxId: T) {\n let slice: Slice;\n for(let i = 0; i < this.slices.length; ++i) {\n let offset = 0;\n slice = this.slices[i];\n if(slice.length < 2) {\n continue;\n }\n\n for(; offset < slice.length; ++offset) {\n if(compareValue(maxId, slice[offset]) >= 0) {\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\n return undefined;\n } */\n\n return {\n slice,\n offset: maxId === slice[offset] ? offset : offset - 1\n };\n }\n }\n }\n\n if(slice && slice.isEnd(SliceEnd.Top)) {\n return {\n slice,\n offset: slice.length\n };\n }\n\n return undefined;\n }\n\n // * https://core.telegram.org/api/offsets\n public sliceMe(offsetId: T, add_offset: number, limit: number) {\n let slice = this.slice;\n let offset = 0;\n let sliceOffset = 0;\n\n if(offsetId) {\n const pos = this.findSliceOffset(offsetId);\n if(!pos) {\n return undefined;\n }\n\n slice = pos.slice;\n offset = sliceOffset = pos.offset;\n\n if(slice.includes(offsetId)) {\n sliceOffset += 1;\n }\n\n /* if(slice.includes(offsetId) && add_offset < 0) {\n add_offset += 1;\n } */\n }\n\n const sliceStart = Math.max(sliceOffset + add_offset, 0);\n const sliceEnd = sliceOffset + add_offset + limit;\n // const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\n // sliceEnd += fixHalfBackLimit;\n\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n const bottomWasMeantToLoad = Math.abs(add_offset);\n\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\n // useful when there is only 1 message in chat on its reopening\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\n\n // if(topFulfilled) sliced.isEnd(SliceEnd.Top);\n // if(bottomFulfilled) sliced.isEnd(SliceEnd.Bottom);\n\n return {\n slice: sliced,\n offsetIdOffset: offset,\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\n };\n }\n\n public unshift(...items: T[]) {\n let slice = this.first;\n if(!slice.length) {\n slice.setEnd(SliceEnd.Bottom);\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\n slice = this.constructSlice();\n slice.setEnd(SliceEnd.Bottom);\n this.slices.unshift(slice);\n }\n\n slice.unshift(...items);\n }\n\n public push(...items: T[]) {\n let slice = this.last;\n if(!slice.length) {\n slice.setEnd(SliceEnd.Top);\n } else if(!slice.isEnd(SliceEnd.Top)) {\n slice = this.constructSlice();\n slice.setEnd(SliceEnd.Top);\n this.slices.push(slice);\n }\n\n slice.push(...items);\n }\n\n public delete(item: T) {\n const found = this.findSlice(item);\n if(found) {\n found.slice.splice(found.index, 1);\n return true;\n }\n\n return false;\n }\n\n public deleteSlice(slice: Slice) {\n indexOfAndSplice(this.slices, slice);\n }\n\n public toJSON() {\n const slices: SlicedArraySerialized['slices'] = this.slices.map((slice) => {\n return {\n values: slice.slice(),\n isEnd: slice.getEnds()\n };\n });\n\n const serialized: SlicedArraySerialized = {\n slices\n };\n\n return JSON.stringify(serialized);\n }\n\n public static fromJSON(json: string) {\n const parsed: SlicedArraySerialized = JSON.parse(json);\n const sliced = new SlicedArray();\n parsed.slices.forEach((slice) => {\n const inserted = sliced.insertSlice(slice.values) || sliced.first;\n if(slice.isEnd.top) inserted.setEnd(SliceEnd.Top);\n if(slice.isEnd.bottom) inserted.setEnd(SliceEnd.Bottom);\n });\n\n return sliced;\n }\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\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","import {AttachMenuBot} from '../../../../layer';\nimport {ATTACH_MENU_BOT_ICON_NAME} from '../../../mtproto/mtproto_config';\n\nexport default function getAttachMenuBotIcon(attachMenuBot: AttachMenuBot) {\n return attachMenuBot.icons.find((icon) => icon.name === ATTACH_MENU_BOT_ICON_NAME);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ChannelParticipant, ChatParticipant} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ?\n getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) :\n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Chat, ChatAdminRights, ChatBannedRights} from '../../../../layer';\nimport {ChatRights} from '../../appChatsManager';\n\n/**\n * Check the user's ability to do an action in chat\n * @param id\n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread\n * @returns\n */\nexport default function hasRights(chat: Exclude, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n if(!chat) return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n // (chat as any).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? !!myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'manage_topics':\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Dialog, ForumTopic} from '../../../../layer';\nimport type {REAL_FOLDER_ID} from '../../../mtproto/mtproto_config';\nimport getDialogIndexKey from './getDialogIndexKey';\n\nexport default function getDialogIndex(\n dialog: Dialog.dialog | ForumTopic.forumTopic,\n indexKey: ReturnType = getDialogIndexKey((dialog as Dialog).folder_id as REAL_FOLDER_ID)\n) {\n return dialog?.[indexKey as 'index_0'];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {DialogFilter} from '../../../../layer';\n\nexport default function getDialogIndexKey(localId: DialogFilter.dialogFilter['localId'] = 0) {\n return `index_${localId}` as const;\n // return filterId !== undefined && filterId > 1 ? `filter_${filterId}` as const : 'main' as const;\n // const indexStr = filterId > 1 ?\n // `index_${filterId}` as const :\n // 'index' as const;\n\n // return indexStr;\n}\n","/*\n * 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 {Document, PhotoSize, VideoSize} from '../../../../layer';\nimport type {DownloadOptions} from '../../../mtproto/apiFileManager';\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\n\nexport default function getDocumentDownloadOptions(doc: Document.document, thumb?: PhotoSize.photoSize | VideoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const inputFileLocation = getDocumentInputFileLocation(doc, thumb?.type);\n\n let mimeType: MTMimeType;\n if(thumb?._ === 'photoSize') {\n mimeType = doc.sticker ? 'image/webp' : (doc.mime_type.startsWith('image/') ? doc.mime_type : 'image/jpeg');\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 * 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} from '../../../../layer';\n\nexport default function getDocumentInputFileLocation(doc: Document.document, 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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\nimport {DownloadOptions} from '../../../mtproto/apiFileManager';\n\nexport default function getDownloadFileNameFromOptions(options: DownloadOptions) {\n return getFileNameByLocation(options.location, options);\n}\n","/*\n * 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 {DownloadMediaOptions, DownloadOptions} from '../../../mtproto/apiFileManager';\nimport getDocumentDownloadOptions from '../docs/getDocumentDownloadOptions';\nimport getPhotoDownloadOptions from '../photos/getPhotoDownloadOptions';\nimport getWebDocumentDownloadOptions from '../webDocs/getWebDocumentDownloadOptions';\nimport isWebDocument from '../webDocs/isWebDocument';\nimport getDownloadFileNameFromOptions from './getDownloadFileNameFromOptions';\n\nexport default function getDownloadMediaDetails(options: DownloadMediaOptions) {\n const {media, thumb, queueId, onlyCache} = options;\n\n let downloadOptions: DownloadOptions;\n if(media._ === 'document') downloadOptions = getDocumentDownloadOptions(media, thumb as any, queueId, onlyCache);\n else if(media._ === 'photo') downloadOptions = getPhotoDownloadOptions(media, thumb as any, queueId, onlyCache);\n else if(isWebDocument(media)) downloadOptions = getWebDocumentDownloadOptions(media);\n\n downloadOptions.downloadId = options.downloadId;\n\n const fileName = getDownloadFileNameFromOptions(downloadOptions);\n return {fileName, downloadOptions};\n}\n","import {WebDocument} from '../../../../layer';\nimport {DownloadOptions} from '../../../mtproto/apiFileManager';\n\nexport default function getWebDocumentDownloadOptions(webDocument: WebDocument): DownloadOptions {\n return {\n dcId: 0,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (webDocument as WebDocument.webDocument).access_hash,\n url: webDocument.url\n },\n size: webDocument.size,\n mimeType: webDocument.mime_type\n };\n}\n","import deepEqual from '../../../../helpers/object/deepEqual';\nimport isObject from '../../../../helpers/object/isObject';\nimport {DraftMessage} from '../../../../layer';\n\nexport default function draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\n if(typeof(draft1) !== typeof(draft2)) {\n return false;\n }\n\n if(!isObject(draft1)) {\n return true;\n }\n\n if(draft1._ !== draft2._) {\n return false;\n }\n\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\n return false;\n }\n\n if(!deepEqual(draft1.entities, draft2.entities)) {\n return false;\n }\n\n if(draft1.message !== draft2.message) {\n return false;\n }\n\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\n return false;\n }\n }\n\n return true;\n}\n","import {MessagesBotResults} from '../../../../layer';\n\nexport default function generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\n return queryId + '_' + resultId;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MESSAGE_ID_OFFSET, MESSAGE_ID_INCREMENT} from '.';\n\nexport default function generateMessageId(messageId: number) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId >= q) {\n return messageId;\n }\n\n return q + (messageId * MESSAGE_ID_INCREMENT);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport clearMessageId from './clearMessageId';\n\n/**\n * * will ignore outgoing offset\n */\nexport default function getServerMessageId(messageId: number) {\n return clearMessageId(messageId, true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MESSAGE_ID_OFFSET, MESSAGE_ID_INCREMENT} from '.';\n\nexport default function clearMessageId(messageId: number, toServer?: boolean) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\n return messageId;\n }\n\n const l = MESSAGE_ID_INCREMENT - 1;\n const used = messageId & l;\n if(used !== l) {\n messageId -= used + 1;\n }\n\n return toServer ? (messageId - q) / MESSAGE_ID_INCREMENT : messageId;\n}\n","export const MESSAGE_ID_INCREMENT = 0x10000;\nexport const MESSAGE_ID_OFFSET = 0xFFFFFFFF;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageMedia, MessageEntity, MessageAction} from '../../../../layer';\nimport matchUrl from '../../../richTextProcessor/matchUrl';\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyInputMessagesFilter, MyMessage} from '../../appMessagesManager';\n\nexport default function filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: Array, limit: number) {\n if(inputFilter === 'inputMessagesFilterEmpty') {\n return history;\n }\n\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [],\n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n // excludeDocTypes.push('video');\n neededDocTypes.push(undefined, 'photo', 'pdf');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = history[i];\n if(!message) continue;\n\n // || (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n\n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc &&\n (\n (neededDocTypes.length && !neededDocTypes.includes(doc.type)) ||\n excludeDocTypes.includes(doc.type)\n )\n ) {\n continue;\n }\n\n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find((e) => goodEntities.includes(e._)) || matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] &&\n message.action &&\n ([\n 'messageActionChannelEditPhoto' as const,\n 'messageActionChatEditPhoto' as const,\n 'messageActionChannelEditVideo' as const,\n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find((flag) => message.pFlags[flag])) {\n found = true;\n } */\n\n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n}\n","import assumeType from '../../../../helpers/assumeType';\nimport {Message} from '../../../../layer';\n\nexport default function getAlbumText(messages: Message.message[]) {\n let foundMessages = 0, message: Message.message;\n for(const m of messages) {\n assumeType(m);\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m;\n }\n }\n\n if(foundMessages > 1) {\n message = undefined;\n }\n\n return message;\n}\n","import {Message} from '../../../../layer';\nimport {GENERAL_TOPIC_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getMessageThreadId(message: Message.message | Message.messageService, isForum?: boolean) {\n let threadId: number;\n const replyTo = message.reply_to;\n if(replyTo && (!isForum || replyTo.pFlags.forum_topic)) {\n threadId = replyTo.reply_to_top_id || replyTo.reply_to_msg_id;\n } else if(isForum) {\n if(message._ === 'messageService' && message.action?._ === 'messageActionTopicCreate') {\n threadId = message.mid;\n } else {\n threadId = GENERAL_TOPIC_ID;\n }\n }\n\n return threadId;\n}\n","import {Chat, User} from '../../../../layer';\n\nexport default function getPeerActiveUsernames(peer: User | Chat) {\n if(!peer) {\n return [];\n }\n\n const usernames = (peer as Chat.channel).usernames;\n if(usernames) {\n return usernames\n .filter((username) => username.pFlags.active)\n // .sort((a, b) => +!!b.pFlags.editable - +!!a.pFlags.editable)\n .map((username) => username.username);\n }\n\n return (peer as Chat.channel).username ? [(peer as Chat.channel).username] : [];\n}\n","import {Chat, ChatPhoto, User, UserProfilePhoto} from '../../../../layer';\nimport isPeerRestricted from './isPeerRestricted';\n\nexport default function getPeerPhoto(peer: User | Chat) {\n if(!peer || isPeerRestricted(peer)) {\n return;\n }\n\n return (peer as User.user | Chat.channel)?.photo as UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto;\n}\n","import {isRestricted} from '../../../../helpers/restrictions';\nimport {Chat, User} from '../../../../layer';\n\nexport default function isPeerRestricted(peer: Chat | User) {\n const restrictionReasons = (peer as Chat.channel)?.restriction_reason;\n return !!(restrictionReasons && (peer as Chat.channel).pFlags.restricted && isRestricted(restrictionReasons));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {PhotoSize, InputFileLocation} from '../../../../layer';\nimport type {DownloadOptions} from '../../../mtproto/apiFileManager';\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n // console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n\n // maybe it's a thumb\n const isPhoto = !!((photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference);\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id,\n location,\n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined,\n mimeType: 'image/jpeg',\n queueId,\n onlyCache\n };\n}\n","import deepEqual from '../../../../helpers/object/deepEqual';\nimport {Reaction} from '../../../../layer';\n\nexport default function reactionsEqual(r1: Reaction, r2: Reaction) {\n return deepEqual(r1, r2);\n}\n","import {MyDocument} from '../../appDocsManager';\n\nexport default function getStickerEffectThumb(doc: MyDocument) {\n return doc.video_thumbs?.[0];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {User} from '../../../../layer';\nimport {REPLIES_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function canSendToUser(user: User.user) {\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n}\n","import {WebDocument} from '../../../../layer';\n\nexport default function isWebDocument(webDocument: any): webDocument is WebDocument {\n return !!(webDocument && (webDocument._ === 'webDocument' || webDocument._ === 'webDocumentNoProxy'));\n}\n","/*\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 ConnectionStatus {\n Connected,\n Connecting,\n Closed,\n TimedOut\n};\n\nexport type ConnectionStatusChange = {\n _: 'networkerStatus',\n status: ConnectionStatus,\n dcId: number,\n name: string,\n isFileNetworker: boolean,\n isFileDownload: boolean,\n isFileUpload: boolean,\n retryAt?: number\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\n\nconst CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n]);\nexport default function combineSameEntities(entities: MessageEntity[]) {\n // entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n // return entities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport spoiler from './spoiler';\n\nexport default function encodeSpoiler(text: string, entity: MessageEntity.messageEntitySpoiler) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const spoilerAfter = spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */;\n const after = text.slice(entity.offset + entity.length);\n text = before + spoilerAfter + after;\n return {text, entityText: spoilerAfter};\n};\n","export default function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n\n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n const char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PASS_CONFLICTING_ENTITIES} from '.';\nimport {MessageEntity} from '../../layer';\n\nconst SINGLE_ENTITIES: Set = new Set(['messageEntityPre', 'messageEntityCode']);\n\nexport default function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n let singleEnd = -1;\n return currentEntities.find((currentEntity) => {\n if(SINGLE_ENTITIES.has(currentEntity._)) {\n singleEnd = currentEntity.offset + currentEntity.length;\n }\n\n if(newEntity.offset < singleEnd && !PASS_CONFLICTING_ENTITIES.has(newEntity._)) {\n return true;\n }\n\n const isConflictingTypes = newEntity._ === currentEntity._ ||\n (!PASS_CONFLICTING_ENTITIES.has(newEntity._) && !PASS_CONFLICTING_ENTITIES.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset &&\n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\n\nexport default function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach((entity) => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n\n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n}\n","import {URL_REG_EXP} from '.';\n\nexport default function matchUrl(text: string) {\n return !text ? null : text.match(URL_REG_EXP);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport findConflictingEntity from './findConflictingEntity';\nimport sortEntities from './sortEntities';\n\nexport default function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter((e) => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\nconst TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\n\nexport default TLD;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n}\n","import Emoji from '../../config/emoji';\nimport {encodeEmoji} from '../../vendor/emoji';\n\nexport default function getEmojiUnified(emojiCode: string) {\n const unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n\n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n\n if(!Emoji.hasOwnProperty(unified)\n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n // console.error('lol', unified);\n return;\n }\n\n return unified;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {EMAIL_REG_EXP, FULL_REG_EXP} from '.';\nimport TLD from '../../config/tld';\nimport {MessageEntity} from '../../layer';\nimport checkBrackets from './checkBrackets';\nimport getEmojiUnified from './getEmojiUnified';\n\nexport default function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n FULL_REG_EXP.lastIndex = 0;\n while((match = raw.match(FULL_REG_EXP))) {\n matchIndex = rawOffset + match.index;\n\n // console.log('parseEntities match:', match);\n\n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(EMAIL_REG_EXP.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n\n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n\n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n\n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n 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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MARKDOWN_ENTITIES, MARKDOWN_REG_EXP} from '.';\nimport {MessageEntity} from '../../layer';\nimport combineSameEntities from './combineSameEntities';\nimport findConflictingEntity from './findConflictingEntity';\nimport mergeEntities from './mergeEntities';\n\nexport default function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(MARKDOWN_REG_EXP)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n // text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n\n newTextParts.push(match[1] + text + match[5]);\n\n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: MARKDOWN_ENTITIES[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n // offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n\n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n}\n","import {MessageEntity} from '../../layer';\n\nexport default function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport encodeSpoiler from './encodeSpoiler';\n\n/**\n * ! This function is still unsafe to use with .innerHTML\n */\nexport default function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n entities.forEach((entity) => {\n if(entity._ === 'messageEntitySpoiler') {\n text = encodeSpoiler(text, entity).text;\n }\n });\n\n return text;\n // if(entities?.length) {\n // entities = entities.filter((entity) => entity._ === 'messageEntitySpoiler');\n // }\n\n // return wrapRichText(text, {\n // entities,\n // noEncoding: true,\n // noTextFormat: true,\n // noLinebreaks: true,\n // noLinks: true\n // }).textContent;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {processSearchText, ProcessSearchTextOptions} from '../helpers/cleanSearchText';\nimport flatten from '../helpers/array/flatten';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n\n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n private _search(query: string) {\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const fullTexts = this.fullTexts;\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' '/* && !badCharsRe.test(fullText[idx - 1]) */)) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n return newFoundObjs;\n }\n\n public search(query: string) {\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const queries = query.split('\\x01');\n const newFoundObjs = flatten(queries.map((query) => this._search(query)));\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n // newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map((o) => o.what));\n\n return newFoundObjs2;\n }\n}\n"],"names":["IGNORE_ERRORS","Set","LazyLoadQueueBase","constructor","parallelLimit","queueId","queue","inProcess","lockPromise","unlockResolve","log","this","processQueue","_processQueue","clear","length","lock","Promise","resolve","reject","unlock","processItem","item","add","loadItem","err","has","type","error","delete","load","getItem","shift","addElement","method","el","size","push","unshift","filterUnique","arr","flatten","reduce","acc","val","forEachReverse","array","callback","i","insertInDescendSortedArray","element","getProperty","pos","property","sortProperty","undefined","indexOf","prev","next","splice","len","console","assumeType","x","readBlobAs","blob","reader","FileReader","addEventListener","e","target","result","bytesCmp","bytes1","bytes2","bytesFromHex","hexString","bytes","Uint8Array","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","callbackify","smth","then","uploadId","getFileNameForUpload","file","fileName","mimeType","ext","split","MIDDLEWARE_ERROR","MiddlewareHelper","details","cleaned","inner","onCleanCallbacks","onDestroyCallbacks","onDestroy","destroyed","clean","forEach","helper","destroy","parent","get","additionalCallback","middleware","create","getMiddleware","onClean","getDeepProperty","object","key","splitted","o","getObjectKeysAndSort","sort","ids","Map","keys","Object","map","a","b","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","args","_resolve","_reject","apply","clearTimeout","_waitingTimeout","catch","isDebounced","SliceEnd","compareValue","val1","val2","toExponential","diff","str1","str2","str1Length","slice","compareLong","SlicedArray","sliceConstructor","getSliceConstructor","first","constructSlice","slices","static","slicedArray","Array","end","None","isEnd","side","Top","last","includes","Bottom","Both","setEnd","getEnds","top","bottom","both","unsetEnd","deleteCount","items","ret","super","idx","insertSlice","lowerBound","upperBound","foundSlice","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","s","prevSlice","nextSlice","findSlice","index","findSliceOffset","maxId","offset","sliceMe","offsetId","add_offset","limit","sliceOffset","sliceStart","max","sliceEnd","topWasMeantToLoad","bottomWasMeantToLoad","abs","topFulfilled","bottomFulfilled","offsetIdOffset","fulfilled","found","deleteSlice","indexOfAndSplice","toJSON","serialized","values","JSON","stringify","json","parsed","parse","inserted","getAttachMenuBotIcon","attachMenuBot","icons","find","icon","name","getParticipantPeerId","participant","peer","user_id","toPeerId","hasRights","chat","action","rights","isThread","pFlags","deactivated","isCheckingRightsForSelf","creator","_","left","megagroup","admin_rights","banned_rights","default_banned_rights","myFlags","post_messages","broadcast","getDialogIndex","dialog","indexKey","folder_id","getDialogIndexKey","localId","getDocumentDownloadOptions","doc","thumb","onlyCache","inputFileLocation","sticker","mime_type","startsWith","dcId","dc_id","location","file_name","getDocumentInputFileLocation","thumbSize","id","access_hash","file_reference","thumb_size","getDownloadFileNameFromOptions","options","getDownloadMediaDetails","media","downloadOptions","webDocument","getPhotoDownloadOptions","isWebDocument","url","downloadId","draftsAreEqual","draft1","draft2","reply_to_msg_id","entities","message","no_webpage","generateQId","queryId","resultId","generateMessageId","messageId","q","getServerMessageId","toServer","l","used","clearMessageId","MESSAGE_ID_INCREMENT","MESSAGE_ID_OFFSET","filterMessagesByInputFilter","inputFilter","history","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","document","goodEntities","totalEntities","getAlbumText","messages","foundMessages","m","getMessageThreadId","isForum","threadId","replyTo","reply_to","forum_topic","mid","reply_to_top_id","getPeerActiveUsernames","usernames","filter","username","active","getPeerPhoto","photo","isPeerRestricted","restrictionReasons","restriction_reason","restricted","photoSize","isDocument","Error","isPhoto","reactionsEqual","r1","r2","getStickerEffectThumb","video_thumbs","canSendToUser","user","deleted","ConnectionStatus","CAN_COMBINE_ENTITIES","combineSameEntities","entity","nextEntityIdx","findIndex","_i","nextEntity","encodeSpoiler","text","before","spoilerAfter","chars","charsLength","out","char","charCodeAt","join","spoiler","after","entityText","SINGLE_ENTITIES","findConflictingEntity","currentEntities","newEntity","singleEnd","currentEntity","fixEmoji","replace","match","string","matchUrl","mergeEntities","newEntities","filtered","checkBrackets","urlLength","urlOpenBrackets","urlCloseBrackets","getEmojiUnified","emojiCode","unified","parseEntities","raw","matchIndex","rawOffset","E","protocol","tld","toLowerCase","balanced","unicode","unsafe","parseMarkdown","noTrim","pushedEntity","pushEntity","newTextParts","language","isSOH","toUserId","newText","sortEntities","wrapPlainText","SearchIndex","minChars","fullTexts","indexObject","searchText","trim","set","_search","query","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","search","queries"],"sourceRoot":""} \ No newline at end of file diff --git a/public/339.0bedc53e7de2dd388b2b.chunk.js b/public/339.0bedc53e7de2dd388b2b.chunk.js new file mode 100644 index 00000000..ae4c6dae --- /dev/null +++ b/public/339.0bedc53e7de2dd388b2b.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[339,813],{2582:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(2325);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,n.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,n.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},8339:(e,t,a)=>{a.r(t),a.d(t,{default:()=>v});var n=a(2582),i=a(4874),s=a(8799),r=a(3512),c=a(503),u=a(1168),o=a(6765),l=a(5565),p=a(2325),m=a(8115),d=a(4494),h=a(279);let g=null;const v=new i.Z("page-signUp",!0,(()=>{return e=void 0,t=void 0,v=function*(){const e=new n.Z({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});e.imageDiv.classList.add("avatar-edit"),e.title.classList.add("fullName");const t=document.createElement("canvas");t.id="canvas-avatar",t.className="avatar-edit-canvas";const i=document.createElement("span");let v;i.className="tgico tgico-cameraadd",e.imageDiv.append(t,i),e.imageDiv.addEventListener("click",(()=>{u.Z.createPopup(o.Z).open(t,(e=>{v=e}))}));const b=t=>{const a=y.value||"",n=w.value||"",i=a||n?(a+" "+n).trim():"";i?(0,l.Z)(e.title,(0,m.Z)(i)):(0,l.Z)(e.title,(0,p.ag)("YourName"))},y=new c.ZP({label:"FirstName",maxLength:70}),w=new c.ZP({label:"LastName",maxLength:64}),L=(0,d.Z)("btn-primary btn-color-primary"),f=new p.ZP.IntlElement({key:"StartMessaging"});return L.append(f.element),e.inputWrapper.append(y.container,w.container,L),y.input.addEventListener("input",b),w.input.addEventListener("input",b),L.addEventListener("click",(function(e){if(y.input.classList.contains("error")||w.input.classList.contains("error"))return!1;if(!y.value.length)return y.input.classList.add("error"),!1;this.disabled=!0;const t=y.value.trim(),n=w.value.trim(),i={phone_number:g.phone_number,phone_code_hash:g.phone_code_hash,first_name:t,last_name:n};f.update({key:"PleaseWait"});const s=(0,h.y)(this);r.Z.managers.apiManager.invokeApi("auth.signUp",i).then((e=>{"auth.authorization"===e._?(r.Z.managers.apiManager.setUser(e.user),new Promise(((e,t)=>{if(!v)return e();v().then((a=>{r.Z.managers.appProfileManager.uploadProfilePhoto(a).then(e,t)}),t)})).finally((()=>{a.e(781).then(a.bind(a,5436)).then((e=>{e.default.mount()}))}))):(f.update({key:e._}),this.removeAttribute("disabled"),s.remove())})).catch((e=>{this.removeAttribute("disabled"),s.remove(),e.type,f.update({key:e.type})}))})),(0,s.Z)(),new Promise((e=>{window.requestAnimationFrame(e)}))},new((i=void 0)||(i=Promise))((function(a,n){function s(e){try{c(v.next(e))}catch(e){n(e)}}function r(e){try{c(v.throw(e))}catch(e){n(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(s,r)}c((v=v.apply(e,t||[])).next())}));var e,t,i,v}),(e=>{g=e,r.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignUp",authCode:e})}))}}]); +//# sourceMappingURL=339.0bedc53e7de2dd388b2b.chunk.js.map \ No newline at end of file diff --git a/public/339.0bedc53e7de2dd388b2b.chunk.js.map b/public/339.0bedc53e7de2dd388b2b.chunk.js.map new file mode 100644 index 00000000..7c18cc14 --- /dev/null +++ b/public/339.0bedc53e7de2dd388b2b.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"339.0bedc53e7de2dd388b2b.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {LangPackKey, i18n} from '../lib/langPack';\n\nexport default class LoginPage {\n public element: HTMLElement;\n public container: HTMLElement;\n public imageDiv: HTMLElement;\n public inputWrapper: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLParagraphElement;\n\n constructor(options: {\n className: string,\n withInputWrapper?: boolean,\n titleLangKey?: LangPackKey,\n subtitleLangKey?: LangPackKey,\n }) {\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\n // this.element = document.createElement('div');\n // this.element.className = 'page-' + options.className;\n\n this.container = document.createElement('div');\n this.container.className = 'container center-align';\n\n this.imageDiv = document.createElement('div');\n this.imageDiv.className = 'auth-image';\n\n this.title = document.createElement('h4');\n if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n this.subtitle = document.createElement('p');\n this.subtitle.className = 'subtitle';\n if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey));\n }\n\n this.container.append(this.imageDiv, this.title, this.subtitle);\n\n if(options.withInputWrapper) {\n this.inputWrapper = document.createElement('div');\n this.inputWrapper.className = 'input-wrapper';\n this.container.append(this.inputWrapper);\n }\n\n this.element.append(this.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 type {CancellablePromise} from '../helpers/cancellablePromise';\nimport type {InputFile} from '../layer';\nimport type {AuthState} from '../types';\nimport LoginPage from './loginPage';\nimport Page from './page';\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\nimport rootScope from '../lib/rootScope';\nimport InputField from '../components/inputField';\nimport PopupElement from '../components/popups';\nimport PopupAvatar from '../components/popups/avatar';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport I18n, {i18n} from '../lib/langPack';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../components/button';\nimport {putPreloader} from '../components/putPreloader';\n\nlet authCode: AuthState.signUp['authCode'] = null;\n\nconst onFirstMount = async() => {\n const page = new LoginPage({\n className: 'page-signUp',\n withInputWrapper: true,\n titleLangKey: 'YourName',\n subtitleLangKey: 'Login.Register.Subtitle'\n });\n\n page.imageDiv.classList.add('avatar-edit');\n\n page.title.classList.add('fullName');\n\n const avatarPreview = document.createElement('canvas');\n avatarPreview.id = 'canvas-avatar';\n avatarPreview.className = 'avatar-edit-canvas';\n\n const addIco = document.createElement('span');\n addIco.className = 'tgico tgico-cameraadd';\n\n page.imageDiv.append(avatarPreview, addIco);\n\n let uploadAvatar: () => CancellablePromise;\n page.imageDiv.addEventListener('click', () => {\n PopupElement.createPopup(PopupAvatar).open(avatarPreview, (_uploadAvatar) => {\n uploadAvatar = _uploadAvatar;\n });\n });\n\n const handleInput = (e: Event) => {\n const name = nameInputField.value || '';\n const lastName = lastNameInputField.value || '';\n\n const fullName = name || lastName ?\n (name + ' ' + lastName).trim() :\n '';\n\n if(fullName) replaceContent(page.title, wrapEmojiText(fullName));\n else replaceContent(page.title, i18n('YourName'));\n };\n\n const sendAvatar = () => new Promise((resolve, reject) => {\n if(!uploadAvatar) {\n // console.log('User has not selected avatar');\n return resolve();\n }\n\n // console.log('invoking uploadFile...');\n uploadAvatar().then((inputFile) => {\n // console.log('uploaded smthn', inputFile);\n\n rootScope.managers.appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\n }, reject);\n });\n\n const nameInputField = new InputField({\n label: 'FirstName',\n maxLength: 70\n });\n\n const lastNameInputField = new InputField({\n label: 'LastName',\n maxLength: 64\n });\n\n const btnSignUp = Button('btn-primary btn-color-primary');\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\n btnSignUp.append(btnI18n.element);\n\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\n\n nameInputField.input.addEventListener('input', handleInput);\n lastNameInputField.input.addEventListener('input', handleInput);\n\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\n return false;\n }\n\n if(!nameInputField.value.length) {\n nameInputField.input.classList.add('error');\n return false;\n }\n\n this.disabled = true;\n\n const name = nameInputField.value.trim();\n const lastName = lastNameInputField.value.trim();\n\n const params = {\n phone_number: authCode.phone_number,\n phone_code_hash: authCode.phone_code_hash,\n first_name: name,\n last_name: lastName\n };\n\n // console.log('invoking auth.signUp with params:', params);\n\n btnI18n.update({key: 'PleaseWait'});\n const preloader = putPreloader(this);\n\n rootScope.managers.apiManager.invokeApi('auth.signUp', params)\n .then((response) => {\n // console.log('auth.signUp response:', response);\n\n switch(response._) {\n case 'auth.authorization': // success\n rootScope.managers.apiManager.setUser(response.user);\n\n sendAvatar().finally(() => {\n import('./pageIm').then((m) => {\n m.default.mount();\n });\n });\n\n break;\n default:\n btnI18n.update({key: response._ as any});\n this.removeAttribute('disabled');\n preloader.remove();\n break;\n }\n\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\n pageAuthCode(Object.assign(code, {phoneNumber})); */\n }).catch((err) => {\n this.removeAttribute('disabled');\n preloader.remove();\n\n switch(err.type) {\n default:\n btnI18n.update({key: err.type});\n break;\n }\n });\n });\n\n blurActiveElement();\n return new Promise((resolve) => {\n window.requestAnimationFrame(resolve);\n });\n};\n\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\n authCode = _authCode;\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\n});\n\nexport default page;\n"],"names":["LoginPage","constructor","options","this","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","page","classList","add","avatarPreview","id","addIco","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","contains","length","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","then","response","_","user","Promise","resolve","reject","inputFile","finally","m","default","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode"],"sourceRoot":""} \ No newline at end of file diff --git a/public/339.764b22e455094abfa43f.chunk.js b/public/339.764b22e455094abfa43f.chunk.js deleted file mode 100644 index caf085c0..00000000 --- a/public/339.764b22e455094abfa43f.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[339,813],{2582:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(2325);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,n.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,n.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},8339:(e,t,a)=>{a.r(t),a.d(t,{default:()=>v});var n=a(4494),i=a(503),s=a(279),r=a(6765),p=a(2325),l=a(2582),u=a(4874),c=a(8799),o=a(5565),m=a(1168),d=a(8115),h=a(3512);let g=null;const v=new u.Z("page-signUp",!0,(()=>{const e=new l.Z({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});e.imageDiv.classList.add("avatar-edit"),e.title.classList.add("fullName");const t=document.createElement("canvas");t.id="canvas-avatar",t.className="avatar-edit-canvas";const u=document.createElement("span");let v;u.className="tgico tgico-cameraadd",e.imageDiv.append(t,u),e.imageDiv.addEventListener("click",(()=>{m.Z.createPopup(r.Z).open(t,(e=>{v=e}))}));const b=t=>{const a=L.value||"",n=y.value||"",i=a||n?(a+" "+n).trim():"";i?(0,o.Z)(e.title,(0,d.Z)(i)):(0,o.Z)(e.title,(0,p.ag)("YourName"))},L=new i.ZP({label:"FirstName",maxLength:70}),y=new i.ZP({label:"LastName",maxLength:64}),Z=(0,n.Z)("btn-primary btn-color-primary"),w=new p.ZP.IntlElement({key:"StartMessaging"});return Z.append(w.element),e.inputWrapper.append(L.container,y.container,Z),L.input.addEventListener("input",b),y.input.addEventListener("input",b),Z.addEventListener("click",(function(e){if(L.input.classList.contains("error")||y.input.classList.contains("error"))return!1;if(!L.value.length)return L.input.classList.add("error"),!1;this.disabled=!0;const t=L.value.trim(),n=y.value.trim(),i={phone_number:g.phone_number,phone_code_hash:g.phone_code_hash,first_name:t,last_name:n};w.update({key:"PleaseWait"});const r=(0,s.y)(this);h.Z.managers.apiManager.invokeApi("auth.signUp",i).then((e=>{"auth.authorization"===e._?(h.Z.managers.apiManager.setUser(e.user),new Promise(((e,t)=>{if(!v)return e();v().then((a=>{h.Z.managers.appProfileManager.uploadProfilePhoto(a).then(e,t)}),t)})).finally((()=>{a.e(781).then(a.bind(a,5436)).then((e=>{e.default.mount()}))}))):(w.update({key:e._}),this.removeAttribute("disabled"),r.remove())})).catch((e=>{this.removeAttribute("disabled"),r.remove(),e.type,w.update({key:e.type})}))})),(0,c.Z)(),new Promise((e=>{window.requestAnimationFrame(e)}))}),(e=>{g=e,h.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignUp",authCode:e})}))}}]); -//# sourceMappingURL=339.764b22e455094abfa43f.chunk.js.map \ No newline at end of file diff --git a/public/339.764b22e455094abfa43f.chunk.js.map b/public/339.764b22e455094abfa43f.chunk.js.map deleted file mode 100644 index a993239b..00000000 --- a/public/339.764b22e455094abfa43f.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"339.764b22e455094abfa43f.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {LangPackKey, i18n} from '../lib/langPack';\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n // this.element = document.createElement('div');\r\n // this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n\r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport type {InputFile} from '../layer';\r\nimport type {AuthState} from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport I18n, {i18n} from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport PopupElement from '../components/popups';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n PopupElement.createPopup(PopupAvatar).open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName ?\r\n (name + ' ' + lastName).trim() :\r\n '';\r\n\r\n if(fullName) replaceContent(page.title, wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n const sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n // console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n // console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n // console.log('uploaded smthn', inputFile);\r\n\r\n rootScope.managers.appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n // console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n // console.log('auth.signUp response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n });\r\n\r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch((err) => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n};\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n"],"names":["LoginPage","constructor","options","this","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","page","classList","add","avatarPreview","id","addIco","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","contains","length","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","then","response","_","user","Promise","resolve","reject","inputFile","finally","m","default","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode"],"sourceRoot":""} \ No newline at end of file diff --git a/public/392.e76a95678644d519b180.chunk.js b/public/392.e76a95678644d519b180.chunk.js new file mode 100644 index 00000000..75cf433b --- /dev/null +++ b/public/392.e76a95678644d519b180.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[392],{6392:(e,t,n)=>{n.r(t),n.d(t,{default:()=>w});var a=n(4755),o=n(4874),r=n(810),s=n(3083),l=n(4489),i=n(2325),u=n(144),h=n(5565),d=n(3512),c=n(1447),p=n(2521),m=n(2738);let E,g,_,b,C=null,v=null,y=null;const f=()=>{setTimeout((()=>{null==_||_.remove(),null==b||b.remove()}),300)},S=new o.Z("page-authCode",!0,(()=>{S.pageEl.querySelector(".input-wrapper").append(g.container);const e=S.pageEl.querySelector(".phone-edit");(0,m.fc)(e,(()=>r.default.mount()))}),(e=>{if(C=e,v){E.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),E.dispatchEvent(e)}else v=S.pageEl.getElementsByClassName("phone")[0],y=S.pageEl.getElementsByClassName("sent-type")[0];const t=C.type.length;let o,r;g||(g=new l.Z({label:"Code",name:(0,u.a)(),length:t,onFill:e=>{(e=>{E.setAttribute("disabled","true");const t={phone_number:C.phone_number,phone_code_hash:C.phone_code_hash,phone_code:e};d.Z.managers.apiManager.invokeApi("auth.signIn",t,{ignoreErrors:!0}).then((e=>{switch(e._){case"auth.authorization":d.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()})),f();break;case"auth.authorizationSignUpRequired":n.e(813).then(n.bind(n,8339)).then((e=>{e.default.mount({phone_number:C.phone_number,phone_code_hash:C.phone_code_hash})})),f()}})).catch((e=>{return t=void 0,a=void 0,r=function*(){let t=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":t=!0,e.handled=!0,yield(yield n.e(774).then(n.bind(n,9437))).default.mount(),setTimeout((()=>{E.value=""}),300);break;case"PHONE_CODE_EXPIRED":E.classList.add("error"),(0,h.Z)(g.label,(0,i.ag)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":E.classList.add("error"),(0,h.Z)(g.label,(0,i.ag)("PHONE_CODE_INVALID"));break;default:g.label.innerText=e.type}t||g.select(),E.removeAttribute("disabled")},new((o=void 0)||(o=Promise))((function(e,n){function s(e){try{i(r.next(e))}catch(e){n(e)}}function l(e){try{i(r.throw(e))}catch(e){n(e)}}function i(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(s,l)}i((r=r.apply(t,a||[])).next())}));var t,a,o,r}))})(e)}}),E=g.input),g.options.length=t,v.innerText=C.phone_number;const m=C.type;switch(m._){case"auth.sentCodeTypeSms":o="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":o="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":o="Login.Code.SentCall";break;case"auth.sentCodeTypeFragmentSms":o="PhoneNumber.Code.Fragment.Info";const e=document.createElement("a");(0,p.Z)(e),e.href=m.url,r=[e];break;default:o="Login.Code.SentUnknown",r=[m._]}return(0,h.Z)(y,(0,i.ag)(o,r)),d.Z.managers.appStateManager.pushToState("authState",{_:"authStateAuthCode",sentCode:e}),(()=>{const e=S.pageEl.querySelector(".auth-image"),t=a.Z.isMobile?100:166;if("auth.sentCodeTypeFragmentSms"===C.type._){e.firstElementChild&&(null==_||_.remove(),_=void 0,e.replaceChildren());const n=document.createElement("div");return n.classList.add("media-sticker-wrapper"),e.append(n),c.Z.loadAnimationAsAsset({container:n,loop:!0,autoplay:!0,width:t,height:t},"jolly_roger").then((e=>(b=e,c.Z.waitForFirstFrame(e)))).then((()=>{}))}return e.firstElementChild&&(null==b||b.remove(),b=void 0,e.replaceChildren()),_=new s.Z(g,t),e.append(_.container),_.load()})()}),(()=>{E.focus()})),w=S}}]); +//# sourceMappingURL=392.e76a95678644d519b180.chunk.js.map \ No newline at end of file diff --git a/public/392.e76a95678644d519b180.chunk.js.map b/public/392.e76a95678644d519b180.chunk.js.map new file mode 100644 index 00000000..f65d93ee --- /dev/null +++ b/public/392.e76a95678644d519b180.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"392.e76a95678644d519b180.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/pageAuthCode.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from '../helpers/mediaSizes';\nimport {AuthSentCode, AuthSentCodeType, AuthSignIn} from '../layer';\nimport Page from './page';\nimport pageSignIn from './pageSignIn';\nimport TrackingMonkey from '../components/monkeys/tracking';\nimport CodeInputField from '../components/codeInputField';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport {randomLong} from '../helpers/random';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport rootScope from '../lib/rootScope';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport setBlankToAnchor from '../lib/richTextProcessor/setBlankToAnchor';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nlet authSentCode: AuthSentCode.authSentCode = null;\n\nlet headerElement: HTMLHeadElement = null;\nlet sentTypeElement: HTMLParagraphElement = null;\nlet codeInput: HTMLInputElement, codeInputField: CodeInputField;\nlet monkey: TrackingMonkey, player: RLottiePlayer;\n\nconst cleanup = () => {\n setTimeout(() => {\n monkey?.remove();\n player?.remove();\n }, 300);\n};\n\nconst submitCode = (code: string) => {\n codeInput.setAttribute('disabled', 'true');\n\n const params: AuthSignIn = {\n phone_number: authSentCode.phone_number,\n phone_code_hash: authSentCode.phone_code_hash,\n phone_code: code\n };\n\n // console.log('invoking auth.signIn with params:', params);\n\n rootScope.managers.apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\n .then((response) => {\n // console.log('auth.signIn response:', response);\n\n switch(response._) {\n case 'auth.authorization':\n rootScope.managers.apiManager.setUser(response.user);\n\n import('./pageIm').then((m) => {\n m.default.mount();\n });\n cleanup();\n break;\n case 'auth.authorizationSignUpRequired':\n // console.log('Registration needed!');\n\n import('./pageSignUp').then((m) => {\n m.default.mount({\n 'phone_number': authSentCode.phone_number,\n 'phone_code_hash': authSentCode.phone_code_hash\n });\n });\n\n cleanup();\n break;\n /* default:\n codeInput.innerText = response._;\n break; */\n }\n }).catch(async(err) => {\n let good = false;\n switch(err.type) {\n case 'SESSION_PASSWORD_NEEDED':\n // console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\n good = true;\n err.handled = true;\n await (await import('./pagePassword')).default.mount(); // lol\n setTimeout(() => {\n codeInput.value = '';\n }, 300);\n break;\n case 'PHONE_CODE_EXPIRED':\n codeInput.classList.add('error');\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\n break;\n case 'PHONE_CODE_EMPTY':\n case 'PHONE_CODE_INVALID':\n codeInput.classList.add('error');\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\n break;\n default:\n codeInputField.label.innerText = err.type;\n break;\n }\n\n if(!good) {\n codeInputField.select();\n }\n\n codeInput.removeAttribute('disabled');\n });\n};\n\nconst onFirstMount = () => {\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\n\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\n attachClickEvent(editButton, () => {\n return pageSignIn.mount();\n });\n};\n\nconst getAnimation = () => {\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\n const size = mediaSizes.isMobile ? 100 : 166;\n if(authSentCode.type._ === 'auth.sentCodeTypeFragmentSms') {\n if(imageDiv.firstElementChild) {\n monkey?.remove();\n monkey = undefined;\n imageDiv.replaceChildren();\n }\n\n const container = document.createElement('div');\n container.classList.add('media-sticker-wrapper');\n imageDiv.append(container);\n return lottieLoader.loadAnimationAsAsset({\n container: container,\n loop: true,\n autoplay: true,\n width: size,\n height: size\n }, 'jolly_roger').then((animation) => {\n player = animation;\n return lottieLoader.waitForFirstFrame(animation);\n }).then(() => {});\n } else {\n if(imageDiv.firstElementChild) {\n player?.remove();\n player = undefined;\n imageDiv.replaceChildren();\n }\n\n monkey = new TrackingMonkey(codeInputField, size);\n imageDiv.append(monkey.container);\n return monkey.load();\n }\n};\n\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authSentCode) => {\n authSentCode = _authCode;\n\n if(!headerElement) {\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\n } else {\n codeInput.value = '';\n\n const evt = document.createEvent('HTMLEvents');\n evt.initEvent('input', false, true);\n codeInput.dispatchEvent(evt);\n }\n\n const CODE_LENGTH = (authSentCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\n if(!codeInputField) {\n codeInputField = new CodeInputField({\n label: 'Code',\n name: randomLong(),\n length: CODE_LENGTH,\n onFill: (code) => {\n submitCode(code);\n }\n });\n\n codeInput = codeInputField.input as HTMLInputElement;\n }\n\n codeInputField.options.length = CODE_LENGTH;\n\n headerElement.innerText = authSentCode.phone_number;\n let key: LangPackKey, args: any[];\n const authSentCodeType = authSentCode.type;\n switch(authSentCodeType._) {\n case 'auth.sentCodeTypeSms':\n key = 'Login.Code.SentSms';\n break;\n case 'auth.sentCodeTypeApp':\n key = 'Login.Code.SentInApp';\n break;\n case 'auth.sentCodeTypeCall':\n key = 'Login.Code.SentCall';\n break;\n case 'auth.sentCodeTypeFragmentSms':\n key = 'PhoneNumber.Code.Fragment.Info';\n const a = document.createElement('a');\n setBlankToAnchor(a);\n a.href = authSentCodeType.url;\n args = [a];\n break;\n default:\n key = 'Login.Code.SentUnknown';\n args = [authSentCodeType._];\n break;\n }\n\n replaceContent(sentTypeElement, i18n(key, args));\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\n\n return getAnimation();\n}, () => {\n codeInput.focus();\n});\n\nexport default page;\n"],"names":["codeInput","codeInputField","monkey","player","authSentCode","headerElement","sentTypeElement","cleanup","setTimeout","remove","page","pageEl","querySelector","append","container","editButton","_authCode","value","evt","document","createEvent","initEvent","dispatchEvent","getElementsByClassName","CODE_LENGTH","type","length","key","args","label","name","onFill","code","setAttribute","params","phone_number","phone_code_hash","phone_code","ignoreErrors","then","response","_","user","m","default","mount","catch","err","good","handled","classList","add","innerText","select","removeAttribute","submitCode","input","options","authSentCodeType","a","createElement","href","url","sentCode","imageDiv","size","firstElementChild","undefined","replaceChildren","loop","autoplay","width","height","animation","load","getAnimation","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/392.eb2cde6a1063177ee3ad.chunk.js b/public/392.eb2cde6a1063177ee3ad.chunk.js deleted file mode 100644 index 4e06597f..00000000 --- a/public/392.eb2cde6a1063177ee3ad.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[392],{6392:(e,t,n)=>{n.r(t),n.d(t,{default:()=>g});var a=n(4755),o=n(4874),s=n(810),r=n(3083),u=n(4489),i=n(2325),l=n(144),h=n(5565),c=n(3512);let p,d=null,E=null,_=null;const b=new o.Z("page-authCode",!0,(()=>{const e=d.type.length,t=new u.Z({label:"Code",name:(0,l.a)(),length:e,onFill:e=>{E(e)}});p=t.input,b.pageEl.querySelector(".input-wrapper").append(t.container),b.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return s.default.mount()}));const o=()=>{setTimeout((()=>{m.remove()}),300)},E=e=>{p.setAttribute("disabled","true");const a={phone_number:d.phone_number,phone_code_hash:d.phone_code_hash,phone_code:e};c.Z.managers.apiManager.invokeApi("auth.signIn",a,{ignoreErrors:!0}).then((e=>{switch(e._){case"auth.authorization":c.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()})),o();break;case"auth.authorizationSignUpRequired":n.e(813).then(n.bind(n,8339)).then((e=>{e.default.mount({phone_number:d.phone_number,phone_code_hash:d.phone_code_hash})})),o()}})).catch((e=>{return a=void 0,o=void 0,r=function*(){let a=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":a=!0,e.handled=!0,yield(yield n.e(774).then(n.bind(n,9437))).default.mount(),setTimeout((()=>{p.value=""}),300);break;case"PHONE_CODE_EXPIRED":p.classList.add("error"),(0,h.Z)(t.label,(0,i.ag)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":p.classList.add("error"),(0,h.Z)(t.label,(0,i.ag)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}a||t.select(),p.removeAttribute("disabled")},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{i(r.next(e))}catch(e){t(e)}}function u(e){try{i(r.throw(e))}catch(e){t(e)}}function i(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(n,u)}i((r=r.apply(a,o||[])).next())}));var a,o,s,r}))},_=b.pageEl.querySelector(".auth-image"),g=a.Z.isMobile?100:166,m=new r.Z(t,g);return _.append(m.container),m.load()}),(e=>{if(d=e,E){p.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),p.dispatchEvent(e)}else E=b.pageEl.getElementsByClassName("phone")[0],_=b.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(E.innerText=d.phone_number,d.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=[d.type._]}(0,h.Z)(_,(0,i.ag)(t,n)),c.Z.managers.appStateManager.pushToState("authState",{_:"authStateAuthCode",sentCode:e})}),(()=>{p.focus()})),g=b}}]); -//# sourceMappingURL=392.eb2cde6a1063177ee3ad.chunk.js.map \ No newline at end of file diff --git a/public/392.eb2cde6a1063177ee3ad.chunk.js.map b/public/392.eb2cde6a1063177ee3ad.chunk.js.map deleted file mode 100644 index 32d10fd1..00000000 --- a/public/392.eb2cde6a1063177ee3ad.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"392.eb2cde6a1063177ee3ad.chunk.js","mappings":"qNAiBA,IAIIA,EAJAC,EAAsC,KAEtCC,EAAiC,KACjCC,EAAwC,KAG5C,MA6GMC,EAAO,IAAI,IAAK,iBAAiB,GA7GlB,KACnB,MAAMC,EAAcJ,EAASK,KAA8CC,OAErEC,EAAiB,IAAI,IAAe,CACxCC,MAAO,OACPC,MAAM,SACNH,OAAQF,EACRM,OAASC,IACPC,EAAWD,MAIfZ,EAAYQ,EAAeM,MAE3BV,EAAKW,OAAOC,cAAc,kBAAkBC,OAAOT,EAAeU,WAE/Cd,EAAKW,OAAOC,cAAc,eAElCG,iBAAiB,SAAS,WACnC,OAAO,qBAGT,MAAMC,EAAU,KACdC,YAAW,KACTC,EAAOC,WACN,MAGCV,EAAcD,IAClBZ,EAAUwB,aAAa,WAAY,QAEnC,MAAMC,EAAqB,CACzBC,aAAczB,EAASyB,aACvBC,gBAAiB1B,EAAS0B,gBAC1BC,WAAYhB,GAKd,kCAAwC,cAAea,EAAQ,CAACI,cAAc,IAC7EC,MAAMC,IAGL,OAAOA,EAASC,GACd,IAAK,qBACH,gCAAsCD,EAASE,MAE/C,8BAAmBH,MAAMI,IACvBA,EAAEC,QAAQC,WAEZhB,IACA,MACF,IAAK,mCAGH,8BAAuBU,MAAMI,IAC3BA,EAAEC,QAAQC,MAAM,CACd,aAAgBnC,EAASyB,aACzB,gBAAmBzB,EAAS0B,qBAIhCP,QAMHiB,OAAYC,IAAQ,O,OAAD,E,OAAA,E,EAAA,YACpB,IAAIC,GAAO,EACX,OAAOD,EAAIhC,MACT,IAAK,0BAEHiC,GAAO,EACPD,EAAIE,SAAU,cACD,+BAA0BL,QAAQC,QAC/Cf,YAAW,KACTrB,EAAUyC,MAAQ,KACjB,KACH,MACF,IAAK,qBACHzC,EAAU0C,UAAUC,IAAI,UACxB,OAAenC,EAAeC,OAAO,QAAK,uBAC1C,MACF,IAAK,mBACL,IAAK,qBACHT,EAAU0C,UAAUC,IAAI,UACxB,OAAenC,EAAeC,OAAO,QAAK,uBAC1C,MACF,QACED,EAAeC,MAAMmC,UAAYN,EAAIhC,KAIrCiC,GACF/B,EAAeqC,SAGjB7C,EAAU8C,gBAAgB,a,YA9BN,K,kRAkClBC,EAAW3C,EAAKW,OAAOC,cAAc,eACrCgC,EAAO,aAAsB,IAAM,IACnC1B,EAAS,IAAI,IAAed,EAAgBwC,GAElD,OADAD,EAAS9B,OAAOK,EAAOJ,WAChBI,EAAO2B,UAG4CC,IAG1D,GAFAjD,EAAWiD,EAEPhD,EAGG,CACLF,EAAUyC,MAAQ,GAElB,MAAMU,EAAMC,SAASC,YAAY,cACjCF,EAAIG,UAAU,SAAS,GAAO,GAC9BtD,EAAUuD,cAAcJ,QAPxBjD,EAAgBE,EAAKW,OAAOyC,uBAAuB,SAAS,GAC5DrD,EAAkBC,EAAKW,OAAOyC,uBAAuB,aAAa,GAUpE,IAAIC,EAAkBC,EACtB,OAFAxD,EAAc0C,UAAY3C,EAASyB,aAE5BzB,EAASK,KAAK0B,GACnB,IAAK,uBACHyB,EAAM,qBACN,MACF,IAAK,uBACHA,EAAM,uBACN,MACF,IAAK,wBACHA,EAAM,sBACN,MACF,QACEA,EAAM,yBACNC,EAAO,CAACzD,EAASK,KAAK0B,IAI1B,OAAe7B,GAAiB,QAAKsD,EAAKC,IAE1C,yCAA+C,YAAa,CAAC1B,EAAG,oBAAqB2B,SAAUT,OAC9F,KACDlD,EAAU4D,WAGZ","sources":["webpack://tweb/./src/pages/pageAuthCode.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport {AuthSentCode, AuthSentCodeType, AuthSignIn} from '../layer';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport {randomLong} from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nconst onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n // console.log('invoking auth.signIn with params:', params);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n // console.log('auth.signIn response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization':\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n // console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then((m) => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n // console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp':\r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall':\r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n"],"names":["codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","type","length","codeInputField","label","name","onFill","code","submitCode","input","pageEl","querySelector","append","container","addEventListener","cleanup","setTimeout","monkey","remove","setAttribute","params","phone_number","phone_code_hash","phone_code","ignoreErrors","then","response","_","user","m","default","mount","catch","err","good","handled","value","classList","add","innerText","select","removeAttribute","imageDiv","size","load","_authCode","evt","document","createEvent","initEvent","dispatchEvent","getElementsByClassName","key","args","sentCode","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/408.03880fedecb1e421da3b.chunk.js b/public/408.03880fedecb1e421da3b.chunk.js deleted file mode 100644 index 97c3d596..00000000 --- a/public/408.03880fedecb1e421da3b.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackChunktweb=this.webpackChunktweb||[]).push([[408],{5814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(4776),n=i(3512),a=i(4762),o=i(410),r=i(8487),d=i(3772),l=i(1655),c=i(7625),h=i(2586),u=i(3013),f=i(3035);const p=new class{constructor(){this.observer=new IntersectionObserver((e=>{for(const t of e){const e=t.target;for(const i in this.byGroups){if(this.intersectionLockedGroups[i])continue;const s=this.byGroups[i].find((t=>t.el===e));if(s){if(t.isIntersecting)this.visible.add(s),this.checkAnimation(s,!1);else{this.visible.delete(s),this.checkAnimation(s,!0);const e=s.animation;e instanceof d.Z&&e.clearCache()}break}}}})),this.visible=new Set,this.overrideIdleGroups=new Set,this.byGroups={},this.byPlayer=new Map,this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,u.Z.addEventListener("play",(({doc:e})=>{"round"===e.type&&(this.videosLocked=!0,this.checkAnimations2())})),u.Z.addEventListener("pause",(()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations2())})),h.Z.addEventListener("change",(e=>{this.checkAnimations2(e)}))}setOverrideIdleGroup(e,t){t?this.overrideIdleGroups.add(e):this.overrideIdleGroups.delete(e)}getAnimations(e){const t=[];for(const i in this.byGroups)for(const s of this.byGroups[i])s.el===e&&t.push(s);return t}removeAnimation(e){const{el:t,animation:i}=e;i.remove(),i instanceof HTMLVideoElement&&a.IS_SAFARI&&setTimeout((()=>{i.src="",i.load()}),1e3);const s=this.byGroups[e.group];s&&((0,l.Z)(s,e),s.length||delete this.byGroups[e.group]),this.observer.unobserve(t),this.visible.delete(e),this.byPlayer.delete(i)}removeAnimationByPlayer(e){const t=this.byPlayer.get(e);t&&this.removeAnimation(t)}addAnimation(e,t="",i,a){var o,r,l,c;if("none"===t||this.byPlayer.has(e))return;i||(e instanceof d.Z?i=e.el[0]:e instanceof s.KZ?i=e.canvas:e instanceof s.LD?i=null!==(o=e.placeholder)&&void 0!==o?o:e:e instanceof HTMLElement&&(i=e));const h={el:i,animation:e,group:t,controlled:a};e instanceof d.Z&&!n.Z.settings.stickers.loop&&e.loop&&(e.loop=n.Z.settings.stickers.loop),(null!==(r=(l=this.byGroups)[c=t])&&void 0!==r?r:l[c]=[]).push(h),this.observer.observe(h.el),this.byPlayer.set(e,h)}checkAnimations(e,t,i,s){if(void 0!==t&&!this.byGroups[t])return;const n=void 0!==t?[t]:Object.keys(this.byGroups);for(const t of n){if(s&&this.intersectionLockedGroups[t])continue;const n=this.byGroups[t];(0,c.Z)(n,(t=>{this.checkAnimation(t,e,i)}))}}checkAnimations2(e){this.checkAnimations(e,void 0,void 0,!0)}checkAnimation(e,t,i){const{el:s,animation:n,group:a}=e;i||!this.lockedGroups[a]&&!(0,r.Z)(s)?e.controlled&&!i||this.removeAnimation(e):t||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():!(n.paused&&this.visible.has(e)&&n.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||h.Z.isIdle&&!this.overrideIdleGroups.has(e.group)||n.play()}getOnlyOnePlayableGroup(){return this.onlyOnePlayableGroup}setOnlyOnePlayableGroup(e=""){this.onlyOnePlayableGroup=e}lockGroup(e){this.lockedGroups[e]=!0}unlockGroup(e){delete this.lockedGroups[e],this.checkAnimations(void 0,e)}refreshGroup(e){const t=this.byGroups[e];(null==t?void 0:t.length)&&(t.forEach((e=>{this.observer.unobserve(e.el)})),(0,f.T2)((()=>{t.forEach((e=>{this.observer.observe(e.el)}))})))}lockIntersectionGroup(e){this.intersectionLockedGroups[e]=!0}unlockIntersectionGroup(e){delete this.intersectionLockedGroups[e],this.refreshGroup(e)}toggleIntersectionGroup(e,t){t?this.lockIntersectionGroup(e):this.unlockIntersectionGroup(e)}};o.GO&&(o.GO.animationIntersector=p);const m=p},3013:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(3512),n=i(3725),a=i(4762),o=i(410),r=i(6669),d=i(5432),l=i(2325),c=i(3719),h=i(8479),u=i(6848),f=i(3699),p=i(7530),m=i(493),g=i(2312),v=i(925),b=i(3241),y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const w=(()=>{try{return a.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();class S extends b.Z{constructor(){super(...arguments),this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=(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=>y(this,void 0,void 0,(function*(){const t=this.mediaDetails.get(e),i=yield this.managers.appDocsManager.getDoc(t.docId);"audio"===i.type&&i.supportsStreaming&&w&&this.handleSafariStreamable(e);const s=yield this.managers.thumbsStorage.getCacheContext(i);e.src=s.url,this.playingMedia===e&&(e.playbackRate=this.playbackRate,"audio"===i.type&&(e.loop=this.loop));const n=this.waitingDocumentsForLoad[i.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[i.id])})),this.onPlay=e=>{const t=e.target,i=this.mediaDetails.get(t),{peerId:s,mid:n}=i,a=this.pip;a&&a.pause();const o=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop(),this.setMedia(t,o);const e=e=>e.mid===n&&e.peerId===s,i=this.listLoader,a=i.getCurrent();if(!a||!e(a)){let t;for(const s of[!1,!0]){const n=i.getPrevious(s);let a=n.findIndex(e);if(-1!==a?t=-(n.length-a):(a=i.getNext(s).findIndex(e),-1!==a&&(t=a+1)),void 0!==t)break}t?this.go(t,!1):this.setTargets({peerId:s,mid:n})}}setTimeout((()=>{this.playingMedia===t&&(this.dispatchEvent("play",this.getPlayingDetails()),this.pauseMediaInOtherTabs())}),0)},this.onPause=e=>{this.dispatchEvent("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(!0).length&&this.next()||(this.stop(),this.dispatchEvent("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,(0,r.Z)(e,"ended"),e===this.playingMedia){const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const i=t.peerId,s=t.isScheduled?this.scheduled:this.media,n=s.get(i);n&&(n.delete(t.mid),n.size||s.delete(i)),e.remove(),this.mediaDetails.delete(e)}this.playingMedia=void 0,this.playingMediaType=void 0}return!0},this.playItem=e=>{const{peerId:t,mid:i}=e,s=this.searchContext.isScheduled;this.getMedia(t,i,s).play(),setTimeout((()=>{this.resolveWaitingForLoadMedia(t,i,s)}),0)},this.go=(e,t)=>{const i=this.listLoader;if(!this.lockedSwitchers&&i)return"audio"===this.playingMediaType?i.goRound(e,t):i.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)}}construct(e){if(this.managers=e,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)}}s.Z.addEventListener("document_downloaded",(e=>{const t=this.waitingDocumentsForLoad[e];if(t)for(const e of t)this.onMediaDocumentLoad(e)})),s.Z.addEventListener("media_play",(()=>{this.skipMediaPlayEvent?this.skipMediaPlayEvent=!1:!this.pause()&&this.pip&&this.pip.pause()}));const t={};["volume","muted","playbackRate","loop","round"].forEach((e=>{const i="_"+e;t[e]={get:()=>this[i],set:t=>{this[i]!==t&&(this[i]=t,!this.playingMedia||"loop"===e&&"audio"!==this.playingMediaType||"round"===e||(this.playingMedia[e]=t),"playbackRate"===e&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=t),this.dispatchPlaybackParams())}}})),Object.defineProperties(this,t)}dispatchPlaybackParams(){this.dispatchEvent("playbackParams",this.getPlaybackParams())}getPlaybackParams(){const{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}=this;return{volume:e,muted:t,playbackRate:i,playbackRates:s,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,i){const{peerId:a,mid:o}=e,r=e.pFlags.is_scheduled?this.scheduled:this.media;let d=r.get(e.peerId);d||r.set(e.peerId,d=new Map);let l=d.get(o);if(l)return l;const c=(0,p.Z)(e);d.set(o,l=document.createElement("round"===c.type||"video"===c.type?"video":"audio")),"round"===c.type&&l.setAttribute("playsinline","true");const h={peerId:a,mid:o,docId:c.id,doc:c,message:e,clean:i,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(l,h),l.volume=1,this.container.append(l),l.addEventListener("play",this.onPlay),l.addEventListener("pause",this.onPause),l.addEventListener("ended",this.onEnded),"audio"!==c.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==s.Z.myId&&l.addEventListener("timeupdate",(()=>{this.managers.appMessagesManager.readMessages(a,[o])}),{once:!0});const u=(0,n.Z)();if(t)u.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let i=t.get(a);i||t.set(a,i=new Map),i.set(o,u)}return u.then((()=>y(this,void 0,void 0,(function*(){if(c.supportsStreaming||(yield this.managers.thumbsStorage.getCacheContext(c)).url)this.onMediaDocumentLoad(l);else{let e=this.waitingDocumentsForLoad[c.id];e||(e=this.waitingDocumentsForLoad[c.id]=new Set),e.add(l),g.Z.downloadMediaURL({media:c})}})))),l}getMedia(e,t,i){const s=(i?this.scheduled:this.media).get(e);return null==s?void 0:s.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,i){const s=i?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=s.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||s.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var i,s;return y(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield(0,v.Z)(t,void 0,!1);const n=(0,p.Z)(e),o=[],r="voice"===n.type||"round"===n.type;let c="",h="";if(null===(i=n.thumbs)||void 0===i?void 0:i.length){const i=n.thumbs[n.thumbs.length-1];if(!i.bytes){const s=yield this.managers.thumbsStorage.getCacheContext(n,i.type);s.url?o.push({src:s.url,sizes:`${i.w}x${i.h}`,type:"image/jpeg"}):g.Z.downloadMediaURL({media:n,thumb:i}).then((()=>{this.playingMedia===t&&s.url&&this.setNewMediadata(e)}))}}else if(r){const t=e.fromId||e.peerId;yield this.managers.appPeersManager.getPeerPhoto(t),c=yield(0,m.Z)(t,!0,!1),h=l.ZP.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!r){const e=n.attributes.find((e=>"documentAttributeAudio"===e._));c=null!==(s=null==e?void 0:e.title)&&void 0!==s?s:n.file_name,h=null==e?void 0:e.performer}o.length||(a.IS_APPLE?d.Z?o.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):o.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}`;o.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})})));const u=new MediaMetadata({title:c,artist:h,artwork:o});navigator.mediaSession.metadata=u}))}setCurrentMediadata(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);this.setNewMediadata(t,e)}getMessageByMedia(e){return this.mediaDetails.get(e).message}getPlayingDetails(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);return{doc:(0,p.Z)(t),message:t,media:e,playbackParams:this.getPlaybackParams()}}pauseMediaInOtherTabs(){this.skipMediaPlayEvent=!0,s.Z.dispatchEvent("media_play")}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!(0,u.Z)(this.searchContext,e)&&(this.searchContext=(0,h.Z)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,i){let s=this.listLoader;s?s.reset():s=this.listLoader=new c.Z({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{this.dispatchEvent("stop"),this.stop()}});const n=void 0===this.searchContext.folderId;t?s.setTargets(t,i,n):s.reverse=n,s.setSearchContext(this.searchContext),s.current=e,s.load(!0),s.load(!1)}getPlaybackMediaTypeFromMessage(e){const t=(0,p.Z)(e);let i="audio";return(null==t?void 0:t.type)&&("voice"===t.type||"round"===t.type?i="voice":"video"===t.type&&(i="video")),i}setMedia(e,t){const i=this.getPlaybackMediaTypeFromMessage(t);this._playbackRate=this.playbackRates[i],this.playingMedia=e,this.playingMediaType=i,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"audio"===i&&(this.playingMedia.loop=this.loop),"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const i=this.playingMedia,s=this.pause();let n;return e?(n=()=>{const e=this.pip;e&&e.pause(),this.pauseMediaInOtherTabs()},e.paused||n(),e.addEventListener("play",n)):this.pauseMediaInOtherTabs(),this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),(t=s)=>{this.toggleSwitchers(!0),i&&(this.mediaDetails.get(i)?this.setMedia(i,this.getMessageByMedia(i)):this.next()||this.previous()),this.playingMedia===e&&(this.playingMedia=void 0,this.playingMediaType=void 0),e&&e.removeEventListener("play",n),t&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}setPictureInPicture(e){this.pip=e;const t=new f.Z;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(),this.pauseMediaInOtherTabs()}))}}const C=new S;o.GO.appMediaPlaybackController=C;const L=C},1784:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(2341),n=i(3910),a=i(2738),o=i(8497),r=i(4668),d=i(130),l=i(4755),c=i(3719),h=i(2312),u=i(4846),f=i(3709),p=i(7530),m=i(4776),g=i(5824),v=i(5128),b=i(4524),y=i(8805),w=i(4332),S=i(1669),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends g.Z{constructor(){let e;super(new c.Z({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:i,peerId:s}=e,n=(0,p.Z)(e);if(n&&(!t||L.isMediaCompatibleForDocumentViewer(n)))return{element:null,mid:i,peerId:s}}}),["delete","forward"]),this.onPrevClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,-1)})),this.onNextClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,1)})),this.onDeleteClick=()=>{const e=this.target;new v.Z(e.peerId,[e.mid],"chat",(()=>{this.target={element:this.content.media},this.close()}))},this.onForwardClick=()=>{const e=this.target;e.mid&&new b.Z({[e.peerId]:[e.mid]},(()=>this.close()))},this.onAuthorClick=e=>C(this,void 0,void 0,(function*(){const{mid:t,peerId:i}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const s=this.searchContext.threadId,n=yield this.getMessageByPeer(i,t);this.close(e).then((()=>C(this,void 0,void 0,(function*(){if(l.Z.isMobile){const e=w.ZP.getTab(S.Z);e&&e.close()}u.Z.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:s?"discussion":void 0,threadId:s})}))))}})),this.onDownloadClick=()=>C(this,void 0,void 0,(function*(){const{peerId:e,mid:t}=this.target,i=yield this.getMessageByPeer(e,t),s=(0,p.Z)(i);s&&h.Z.downloadToDisc({media:s,queueId:u.Z.chat.bubbles.lazyLoadQueue.queueId})})),this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add(g.x+"-caption","spoilers-container");const t=()=>{e&&clearTimeout(e),e=window.setTimeout((()=>{e=void 0,this.content.caption.classList.remove("is-focused")}),800)};this.content.caption.addEventListener("touchstart",(()=>{l.Z.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))})),new y.ZP(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),(0,a.fc)(this.buttons.delete,this.onDeleteClick);const i=[this.btnMenuForward={icon:"forward",text:"Forward",onClick:this.onForwardClick},this.btnMenuDownload={icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},this.btnMenuDelete={icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(i),this.setListeners()}get searchContext(){return this.listLoader.searchContext}setListeners(){super.setListeners(),(0,a.fc)(this.buttons.forward,this.onForwardClick),(0,a.fc)(this.author.container,this.onAuthorClick);const e=t=>{const i=(0,r.Z)(t.target,"A"),s=(0,o.Z)(t.target,"spoiler");if(i instanceof HTMLAnchorElement&&(!s||this.content.caption.classList.contains("is-spoiler-visible"))){const s=i.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return(0,n.Z)(t),this.close().then((()=>{this.content.caption.removeEventListener("click",e,{capture:!0}),i.click()})),!1}};this.content.caption.addEventListener("click",e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?this.managers.appMessagesManager.getScheduledMessageByPeer(e,t):this.managers.appMessagesManager.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let i="";t&&(i=(0,m.ZP)(t,{entities:e.totalEntities})),(0,d.Z)(this.content.caption.firstElementChild,i),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,i=0,s=!1,n=[],a=[]){const o=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return C(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const r=e.mid,d=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,l=(0,p.Z)(e),c=yield this.managers.appPeersManager.noForwards(e.peerId),h="messageService"===e._,u=h||!(yield this.managers.appMessagesManager.canForward(e)),m=(h?c:u)||!(0,f.Z)(e);[this.buttons.forward,this.btnMenuForward.element].forEach((e=>{e.classList.toggle("hide",u)})),this.wholeDiv.classList.toggle("no-forwards",m),[this.buttons.download,this.btnMenuDownload.element].forEach((e=>{e.classList.toggle("hide",m)}));const g=yield this.managers.appMessagesManager.canDeleteMessage(e);[this.buttons.delete,this.btnMenuDelete.element].forEach((e=>{e.classList.toggle("hide",!g)})),this.setCaption(e);const v=o._openMedia.call(this,l,e.date,d,i,t,s,n,a,e);return this.target.mid=r,this.target.peerId=e.peerId,v}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||s.Z.has(e.mime_type)}}},5824:(e,t,i)=>{"use strict";i.d(t,{x:()=>q,Z:()=>Q});var s=i(3725),n=i(4755),a=i(5432),o=i(4762),r=i(5003),d=i(3013),l=i(3910),c=i(3699),h=i(3003),u=i(5322),f=i(7529),p=i(6733),m=i(5157),g=i(7207),v=i(8427),b=i(5701),y=i(3815),w=i(925),S=i(2738);class C extends f.Z{constructor({video:e,play:t=!1,streamable:i=!1,duration:s,onPlaybackRackMenuToggle:n,onPip:a,onPipClose:o}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.onPip=a,this.onPipClose=o,this.listenerSetter=new c.Z,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!(this.video.paused||this.playbackRateButton&&this.playbackRateButton.classList.contains("menu-open")),showOnLeaveToClassName:"media-viewer-caption",ignoreClickClassName:"ckin__controls"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(s),this.setBtnMenuToggle(),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new g.Z(e,i),t.prepend(this.progress.container)}t&&e.play().catch((t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())})).finally((()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)}))}stylePlayer(e){const{wrapper:t,video:i,skin:s,listenerSetter:n}=this;t.classList.add(s);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===s){this.playbackRateButton=this.wrapper.querySelector(".playback-rate"),this.pipButton=this.wrapper.querySelector(".pip");const e=t.querySelectorAll(".toggle"),s=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.textContent=(0,m.Z)(0|i.duration);const c=new v.Z(n),h=t.querySelector(".left-controls");if(c.btn.classList.remove("btn-icon"),h.insertBefore(c.btn,o.parentElement),Array.from(e).forEach((e=>{(0,S.fc)(e,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter})})),this.pipButton){(0,S.fc)(this.pipButton,(()=>{this.video.requestPictureInPicture()}),{listenerSetter:this.listenerSetter});const e=e=>{this.wrapper.style.visibility=e?"hidden":"",this.onPip&&this.onPip(e)},t=20,s=(0,b.Z)(e,t,!1,!0);n.add(i)("enterpictureinpicture",(()=>{s(!0),n.add(i)("leavepictureinpicture",(()=>{const e=n.add(i)("pause",(()=>{clearTimeout(s),this.onPipClose&&this.onPipClose()}),{once:!0}),s=setTimeout((()=>{n.remove(e)}),t)}),{once:!0})})),n.add(i)("leavepictureinpicture",(()=>{s(!1)}))}a.Z||((0,S.fc)(i,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter}),n.add(document)("keydown",(e=>{if(y.Z.overlaysActive>1||document.pictureInPictureElement===i)return;const{key:s,code:n}=e;let a=!0;if("KeyF"===n)this.toggleFullScreen();else if("KeyM"===n)d.Z.muted=!d.Z.muted;else if("Space"===n)this.togglePlay();else if(!e.altKey||"Equal"!==n&&"Minus"!==n)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?a=!1:"ArrowLeft"===s?d.Z.seekBackward({action:"seekbackward"}):d.Z.seekForward({action:"seekforward"});else{const e="Equal"===n?1:-1,t=d.Z.playbackRate,i=C.PLAYBACK_RATES.indexOf(t)+e;i>=0&&i{a.Z||this.toggleFullScreen()})),(0,S.fc)(s,(()=>{this.toggleFullScreen()}),{listenerSetter:this.listenerSetter}),(0,p.Ms)(t,this.onFullScreen.bind(this,s),n),n.add(i)("timeupdate",(()=>{o.textContent=(0,m.Z)(0|i.currentTime)})),n.add(i)("play",(()=>{t.classList.add("played"),a.Z||n.add(i)("play",(()=>{this.hideControls(!0)}))}),{once:!0}),n.add(i)("pause",(()=>{this.showControls(!1)})),n.add(d.Z)("playbackParams",(()=>{this.setPlaybackRateIcon()}))}n.add(i)("play",(()=>{t.classList.add("is-playing")})),n.add(i)("pause",(()=>{t.classList.remove("is-playing")})),i.duration||e?r.textContent=(0,m.Z)(Math.round(i.duration||e)):(0,w.Z)(i).then((()=>{r.textContent=(0,m.Z)(Math.round(i.duration))}))}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!o.IS_MOBILE&&document.pictureInPictureEnabled?``:""}\n \n
\n
\n
`}setBtnMenuToggle(){const e=C.PLAYBACK_RATES.map(((e,t)=>({regularText:e+"x",onClick:()=>{d.Z.playbackRate=e}}))),t=(0,h.Z)(e);t.classList.add("top-left"),(0,u.v)(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;C.PLAYBACK_RATES_ICONS.forEach((t=>{t="tgico-"+t,e.classList.remove(t)}));let t=C.PLAYBACK_RATES.indexOf(d.Z.playbackRate);-1===t&&(t=C.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+C.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(o.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}(0,p.rB)()?(0,p.C8)():(0,p.Dj)(e)}onFullScreen(e){const t=(0,p.rB)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}cleanup(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=this.onPip=void 0}}C.PLAYBACK_RATES=[.5,1,1.5,2],C.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var L=i(3512),E=i(5814),I=i(9331),M=i(2230),P=i(3442),Z=i(3757),k=i(632),T=i(9818),x=i(8497),A=i(6740),_=i(8204),F=i(9171),D=i(5565),R=i(3035),B=i(65),N=i(241),O=i(3241),U=i(1507),H=i(7660),z=i(8580),j=i(1713),G=i(8115),V=i(4421),K=i(2312),W=i(7362),$=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const q="media-viewer";class Q extends O.Z{constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if((0,l.Z)(e),a.Z)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout((()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0}),3e3));const i=this.isZooming();let s=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];i&&n.push("media-viewer-movers"),n.find((e=>{try{if(s=(0,x.Z)(t,e),s)return!0}catch(e){return!1}})),s&&(i||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(y.Z.overlaysActive>1)return;const t=e.key;let i=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):i=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),i&&(0,l.Z)(e)},this.onKeyUp=e=>{y.Z.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(y.Z.overlaysActive>1||(0,x.Z)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&((0,l.Z)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.managers=L.Z.managers,this.log=(0,r.kg)("AMV"),this.preloader=new P.Z,this.preloaderStreamable=new P.Z({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new V.Z,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add(q+"-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const i=document.createElement("div");i.classList.add(q);const s=this.topbar=document.createElement("div");s.classList.add(q+"-topbar",q+"-appear");const n=document.createElement("div");n.classList.add(q+"-topbar-left"),this.buttons["mobile-close"]=(0,M.Z)("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add(q+"-author","no-select");const o=document.createElement("div");this.author.avatarEl=new I.Z,this.author.avatarEl.classList.add(q+"-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add(q+"-name"),this.author.date=document.createElement("div"),this.author.date.classList.add(q+"-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const d=document.createElement("div");d.classList.add(q+"-buttons"),t.concat(["download","zoom","close"]).forEach((e=>{const t=(0,M.Z)(e,{noRipple:!0});this.buttons[e]=t,d.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=(0,M.Z)("zoomout",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnOut,(()=>this.changeZoom(!1))),this.zoomElements.btnIn=(0,M.Z)("zoomin",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnIn,(()=>this.changeZoom(!0))),this.zoomElements.rangeSelector=new B.Z({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(q+"-content"),this.content.container=document.createElement("div"),this.content.container.classList.add(q+"-container"),this.content.media=document.createElement("div"),this.content.media.classList.add(q+"-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),i.append(this.content.main),this.overlaysDiv.append(i),n.append(this.buttons["mobile-close"],this.author.container),s.append(n,d),this.buttons.prev=document.createElement("div"),this.buttons.prev.className=`${q}-switcher ${q}-switcher-left`,this.buttons.prev.innerHTML=``,this.buttons.next=document.createElement("div"),this.buttons.next.className=`${q}-switcher ${q}-switcher-right`,this.buttons.next.innerHTML=``,this.moversContainer=document.createElement("div"),this.moversContainer.classList.add(q+"-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.listLoader.onLoadedMore=()=>{this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length)},this.setNewMover()}get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}setListeners(){(0,S.fc)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach((e=>{(0,S.fc)(e,this.close.bind(this))})),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach((([e,t])=>{t.addEventListener("click",(t=>{(0,l.Z)(t),this.setMoverPromise||this.listLoader.go(e)}))})),(0,S.fc)(this.buttons.zoom,(()=>{this.isZooming()?this.toggleZoom(!1):this.changeZoom(!0)})),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)},a.Z&&new Z.Z({element:this.wholeDiv,onSwipe:(e,t)=>{if(!(0,p.rB)())return Math.abs(e)/N.Z.width>.2||e>125?(e<0?this.buttons.prev.click():this.buttons.next.click(),!0):(Math.abs(t)/N.Z.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!(0,x.Z)(e.target,"media-viewer-caption")})}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const i=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(i),this.zoomElements.rangeSelector.setProgress(i),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const i=-1;this.zoomSwipeHandler=new Z.Z({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(s,n)=>{[s,n]=[s*i,n*i],this.zoomSwipeX+=s-e,this.zoomSwipeY+=n-t,[e,t]=[s,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(i)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=(0,u.Z)({onlyMobile:!0},"bottom-left",e);this.topbar.append(t)}close(e){var t;if(e&&(0,l.Z)(e),this.setMoverAnimationPromise)return Promise.reject();this.navigationItem&&T.Z.removeItem(this.navigationItem),this.lazyLoadQueue.clear();const i=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then((({onAnimationEnd:e})=>e));return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer===this&&(window.appMediaViewer=void 0),this.removeGlobalListeners(),this.zoomSwipeHandler=void 0,i.finally((()=>{this.wholeDiv.remove(),this.toggleOverlay(!1)})),i}toggleOverlay(e){y.Z.isOverlayActive=e,E.Z.checkAnimations2(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),a.Z||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0})}setMoverToTarget(e,t=!1,i=0){return $(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const n=this.content.mover;t||(n.innerHTML="");const a=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(n);const o=0!==i,r=L.Z.settings.animationsEnabled?o?350:200:0;let d,l;e&&(e instanceof I.Z||e.classList.contains("grid-item")?(d=e,l=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(d=(0,x.Z)(e,"attachment"),l=d.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(d=(0,x.Z)(e,"profile-avatars-container"),l=d.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==l.left&&(e=d=l=void 0))),e||(e=this.content.media),l||(d=e.parentElement,l=e.getBoundingClientRect());let c=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const i=(0,x.Z)(d,"scrollable"),s=(0,_.Z)(d,i,!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(c=!0):(d=(e=this.content.media).parentElement,l=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let u,f,p,m="";if(o?(u=1===i?N.Z.width:-h.width,f=h.top):(u=l.left,f=l.top),m+=`translate3d(${u}px,${f}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(n.firstElementChild&&n.firstElementChild.classList.contains("media-viewer-aspecter")){p=n.firstElementChild;const e=p.querySelector(".ckin__player");if(e){const t=e.firstElementChild;p.append(t),e.remove()}p.style.cssText||(n.classList.remove("active"),this.setFullAspect(p,h,l),n.offsetLeft,n.classList.add("active"))}else p=document.createElement("div"),p.classList.add("media-viewer-aspecter"),n.prepend(p);p.style.cssText=`width: ${l.width}px; height: ${l.height}px; transform: scale3d(${h.width/l.width}, ${h.height/l.height}, 1);`}n.style.width=h.width+"px",n.style.height=h.height+"px";const g=l.width/h.width,v=l.height/h.height;o||(m+=`scale3d(${g},${v},1) `);let b=window.getComputedStyle(d).getPropertyValue("border-radius");const y=function(e){const 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}(b);if(b=y.map((e=>parseInt(e)/g+"px")).join(" "),o||(n.style.borderRadius=b),t&&1!==a){const e=N.Z.width/2-l.width/2,t=N.Z.height/2-l.height/2,i=l.left-e,s=l.top-t;this.moversContainer.style.transform=`matrix(${g}, 0, 0, ${v}, ${i}, ${s})`}else n.style.transform=m;let w;c&&(n.style.opacity="0");const S=e.classList.contains("is-out"),C=this.setMoverAnimationPromise=(0,s.Z)(),E={onAnimationEnd:C},M=setTimeout((()=>{C.isFulfilled||C.isRejected||C.resolve()}),1e3);if(C.finally((()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===C&&(this.setMoverAnimationPromise=null),clearTimeout(M)})),t)return e instanceof SVGSVGElement&&(w=n.querySelector("path"),w&&this.sizeTailPath(w,h,g,r,!1,S,b)),e.classList.contains("media-viewer-media")&&n.classList.add("hiding"),this.toggleWholeActive(!1),setTimeout((()=>{n.style.borderRadius=b,n.firstElementChild&&(n.firstElementChild.style.borderRadius=b)}),r/2),setTimeout((()=>{n.innerHTML="",n.classList.remove("moving","active","hiding"),n.style.cssText="display: none;",C.resolve()}),r),n.classList.remove("opening"),E;{let t,i;const s="video, img, .canvas-thumbnail",a=e.matches(s)?e.parentElement:e,r=Array.from(a.querySelectorAll(s));if(r.length){e=r.pop();const t=document.createElement("canvas"),i=t.getContext("2d");e instanceof HTMLImageElement?(t.width=e.naturalWidth,t.height=e.naturalHeight):e instanceof HTMLVideoElement?(t.width=e.videoWidth,t.height=e.videoHeight):e instanceof HTMLCanvasElement&&(t.width=e.width,t.height=e.height),t.className="canvas-thumbnail thumbnail media-photo",i.drawImage(e,0,0),e=t}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const s=Array.from(e.querySelectorAll("img")).pop();s&&(t=new Image,i=s.src,n.append(t))}else if(e instanceof HTMLImageElement)t=new Image,i=e.src;else if(e instanceof HTMLVideoElement)t=(0,H.Z)(),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,i=t+"-mv",{width:s,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+s),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${s} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,i)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,i));const r=o.firstElementChild,d=r.firstElementChild.firstElementChild;if(d instanceof SVGUseElement){let e,t=d.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,((e,t,i,n,o)=>`translate(${t=2!=(t=+t)?s-2/g:2/g}, ${a}) scale(${+n/g}, ${+o/v})`)),d.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const i=b.split(" ").map((e=>parseInt(e)));e=S?(0,F.Z)(0,0,s-9/g,a,...i):(0,F.Z)(9/g,0,s-9/g,a,...i),w.setAttributeNS(null,"d",e)}const l=o.lastElementChild;l.setAttributeNS(null,"width",""+h.width),l.setAttributeNS(null,"height",""+h.height),n.prepend(o)}else e instanceof HTMLCanvasElement&&(t=e);p&&(p.style.borderRadius=b,t&&p.append(t)),t=n.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),p||(t.style.width=h.width+"px",t.style.height=h.height+"px"),i&&(yield(0,A.cj)(t,i))),n.style.display="",(0,R.T2)((()=>{n.classList.add(o?"moving":"active")}))}return n.classList.add("opening"),yield(0,R.d1)(),n.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,c&&(n.style.opacity=""),p&&this.setFullAspect(p,h,l),setTimeout((()=>{n.style.borderRadius="",n.firstElementChild&&(n.firstElementChild.style.borderRadius="")}),0),n.dataset.timeout=""+setTimeout((()=>{n.classList.remove("moving","opening"),p&&(n.querySelector("video"),n.classList.remove("active"),p.style.cssText="",n.offsetLeft),n.classList.add("center","no-transition"),n.classList.add("active"),delete n.dataset.timeout,C.resolve()}),r),w&&this.sizeTailPath(w,h,g,r,!0,S,b),E}))}toggleWholeActive(e){e?this.wholeDiv.classList.add("active"):(this.wholeDiv.classList.add("backwards"),setTimeout((()=>{this.wholeDiv.classList.remove("active")}),0))}setFullAspect(e,t,i){const s=t.width/t.height;let{width:n,height:a}=i;s>0?n=a*s:a=n*s,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,i,s,n,a,o){const r=Date.now(),{width:d,height:l}=t;s/=2;const c=o.split(" ").map((e=>parseInt(e))),h=()=>{const t=Date.now()-r;let o=s?t/s:1;o>1&&(o=1),n&&(o=1-o);const u=c.map((e=>e*o));let f;f=a?(0,F.Z)(0,0,d-9/i*o,l,...u):(0,F.Z)(9/i*o,0,d,l,...u),e.setAttributeNS(null,"d",f),t{const a=t?-s.width:i;return e.replace(n,a+"px")}));e.style.transform=n,setTimeout((()=>{e.remove()}),350)}setNewMover(){const e=document.createElement("div");return e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover?this.content.mover.parentElement.append(e):this.moversContainer.append(e),this.content.mover=e}updateMediaSource(e,t,i){const s=e.tagName.toLowerCase()===i?e:e.querySelector(i);if(s&&!(0,x.Z)(e,"document")){if((0,x.Z)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===i)return void(t.classList.contains("manual")&&t.click());t.remove()}}s.src!==t&&(0,A.ZP)(s,t),s.classList.contains("thumbnail")&&s.parentElement.classList.contains("media-container-aspecter")&&s.classList.remove("thumbnail")}}setAuthorInfo(e,t){const i=e.isPeerId();let s;if(i)s=(0,W.Z)({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1});else{const t=s=document.createElement("span");t.append((0,G.Z)(e)),t.classList.add("peer-title")}const n=this.author.avatarEl,a=this.author.avatarEl=n.cloneNode();return Promise.all([this.author.avatarEl.updateWithOptions({peerId:e||U.NM,peerTitle:i?void 0:""+e}),s]).then((([e,i])=>{this.author.avatarEl===a&&((0,D.Z)(this.author.date,(0,k.OD)(t)),(0,D.Z)(this.author.nameEl,i),n.replaceWith(this.author.avatarEl))}))}_openMedia(e,t,i,s,a,r=!1,c=[],h=[],u){return $(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const f=this.setAuthorInfo(i,t),p="document"===e._,m=p&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(c,h,r),window.appMediaViewer=this),this.listLoader.next.length<10&&setTimeout((()=>{this.listLoader.load(!0)}),0),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const g=this.content.media,v=!a||a===g;v&&(a=g),this.target={element:a};const b=++this.tempId;g.firstElementChild&&(g.innerHTML=""),0!==s?(this.moveTheMover(this.content.mover,1===s),this.setNewMover()):(this.toggleOverlay(!0),this.setGlobalListeners(),yield f,this.wholeDiv.parentElement||(this.pageEl.insertBefore(this.wholeDiv,document.getElementById("main-columns")),this.wholeDiv.offsetLeft),this.toggleWholeActive(!0),o.IS_MOBILE_SAFARI||(this.navigationItem={type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}},T.Z.pushItem(this.navigationItem)));const y=this.content.mover,w=N.Z.width;let S=0;const L=N.Z.height;L<1e6&&!n.Z.isMobile&&(S=120);const E=L-120-S;let I=Promise.resolve();const M=(0,j.Z)(e,g,w,E,!n.Z.isMobile,void 0,!!(p&&e.w&&e.h)).photoSize;if(v){const t=yield this.managers.thumbsStorage.getCacheContext(e,M.type);let i;if(t.downloaded)i=new Image,i.src=t.url;else{const s=(0,z.Z)(e,t,!0);s&&(I=s.loadPromise,i=s.image)}i&&(i.classList.add("thumbnail"),g.append(i))}const P=!(!p||!e.supportsStreaming),Z=P?this.preloaderStreamable:this.preloader,k=()=>this.managers.thumbsStorage.getCacheContext(e,null==M?void 0:M.type);let x;if(m){const t=u&&"gif"!==e.type,i=(0,H.Z)({pip:t});this.wholeDiv.classList.contains("no-forwards")&&i.addEventListener("contextmenu",l.Z);const n=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:s})=>{const n=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,r=y.querySelector("video");r&&r.remove(),i.setAttribute("playsinline","true"),i.addEventListener("timeupdate",(()=>{this.tempId!==b&&i.pause()})),this.addEventListener("setMoverAfter",(()=>{i.src="",i.load()}),{once:!0}),o.IS_SAFARI&&(i.autoplay=!0),"gif"===e.type?(i.muted=!0,i.autoplay=!0,i.loop=!0):e.duration<60&&(i.loop=!0),n.append(i);const c=new Promise((e=>{i.addEventListener("canplay",e,{once:!0})})),h=()=>{"gif"!==e.type&&(i.dataset.ckin="default",i.dataset.overlay="1",Promise.all([c,s]).then((()=>{this.tempId===b&&((this.videoPlayer=new C({video:i,play:!0,streamable:P,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)},onPip:e=>{const s=window.appMediaViewer;if(!e&&s&&s!==this)return this.releaseSingleMedia=void 0,void this.close();this.moversContainer.lastElementChild.classList.toggle("hiding",e),this.toggleWholeActive(!e),this.toggleOverlay(!e),this.toggleGlobalListeners(!e),this.navigationItem&&(e?T.Z.removeItem(this.navigationItem):T.Z.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,d.Z.setPictureInPicture(i)):this.releaseSingleMedia=d.Z.setSingleMedia(i,u))},onPipClose:()=>{this.close()}})).addEventListener("toggleControls",(e=>{this.wholeDiv.classList.toggle("has-video-controls",e)})),this.addEventListener("setMoverBefore",(()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.cleanup(),this.videoPlayer=void 0}),{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1))})))};if(P){s.then((()=>{i.readyState{i.addEventListener("canplay",(()=>{Z.detach(),i.parentElement.classList.remove("is-buffering")}),{once:!0})};i.addEventListener("waiting",(()=>{const t=i.networkState===i.NETWORK_LOADING,s=i.readyState{(0,l.Z)(e)})),e()}this.lazyLoadQueue.unshift({load:()=>$(this,void 0,void 0,(function*(){const o=P?Promise.resolve():K.Z.downloadMediaURL({media:e});return P||s.then((()=>$(this,void 0,void 0,(function*(){(yield k()).url||Z.attach(y,!0,o)})))),Promise.all([o,s]).then((()=>$(this,void 0,void 0,(function*(){if(this.tempId!==b)return void this.log.warn("media viewer changed video");const e=(yield k()).url;i.addEventListener("error",(()=>{4!==i.error.code&&this.log.error("Error "+i.error.code+"; details: "+i.error.message),Z&&Z.detach()}),{once:!0}),a instanceof SVGSVGElement?n.firstElementChild.lastElementChild.append(i):(0,A.ZP)(i,e),t&&(this.releaseSingleMedia=d.Z.setSingleMedia(i,u),this.addEventListener("setMoverBefore",(()=>{this.releaseSingleMedia&&(this.releaseSingleMedia(),this.releaseSingleMedia=void 0)}),{once:!0})),this.updateMediaSource(a,e,"video"),h()})))),o}))})}));x=I.then(n)}else{const t=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>$(this,void 0,void 0,(function*(){const i=p?K.Z.downloadMediaURL({media:e}):K.Z.downloadMediaURL({media:e,thumb:M});return t.then((()=>$(this,void 0,void 0,(function*(){(yield k()).url||this.preloader.attachPromise(i)})))),Promise.all([t,i]).then((()=>$(this,void 0,void 0,(function*(){var e;if(this.tempId!==b)return void this.log.warn("media viewer changed photo");const t=(yield k()).url;if(a instanceof SVGSVGElement){if(this.updateMediaSource(a,t,"img"),this.updateMediaSource(y,t,"img"),n.Z.isMobile){const e=y.querySelectorAll("img");e&&e.length&&e.forEach((e=>{e.classList.remove("thumbnail")}))}}else{const i=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,s="IMG"===(null===(e=i.firstElementChild)||void 0===e?void 0:e.tagName)?i.firstElementChild:null;if(!s||s.src!==t){const e=new Image;e.classList.add("thumbnail"),(0,A.ZP)(e,t,(()=>{this.updateMediaSource(a,t,"img"),s&&(0,R.T2)((()=>{s.remove()})),i.append(e)}))}}})))).catch((e=>{this.log.error(e),this.preloader.attach(y),this.preloader.setManual()})),i}))})}));x=I.then(t)}return this.setMoverPromise=x.catch((()=>{this.setMoverAnimationPromise=null})).finally((()=>{this.setMoverPromise=null}))}))}}},9818:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(410),n=i(4762),a=i(5003),o=i(8799),r=i(3910),d=i(3444),l=i(1655);const c=new class{constructor(){if(this.onPopState=e=>{const t=window.location.hash,i=e.state;if(this.debug&&this.log("popstate",e,this.isPossibleSwipe,t),t!==this.currentHash)if(this.debug&&this.log.warn(`hash changed, new=${t}, current=${this.currentHash}, overridden=${this.overriddenHash}`),i===this.id&&this.overriddenHash&&this.overriddenHash!==t)this.overrideHash(this.overriddenHash);else{if(!i||this.overriddenHash||!t)return this.currentHash=t,void(this.onHashChange&&this.onHashChange());this.overrideHash()}if(i!==this.id&&(this.pushState(),!this.navigations.length))return;const s=this.navigations.pop();s?(this.manual=!this.isPossibleSwipe,this.handleItem(s)):this.pushState()},this.onKeyDown=e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||((0,r.Z)(e),this.back(t.type)))},this.onTouchStart=e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),(0,d.Z)(e)&&(this.isPossibleSwipe=!0,window.addEventListener("touchend",(()=>{setTimeout((()=>{this.isPossibleSwipe=!1}),100)}),{passive:!0,once:!0})))},this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=(0,a.kg)("NC"),this.debug=!0,this.currentHash=window.location.hash,this.overriddenHash="",this.isPossibleSwipe=!1,window.addEventListener("popstate",this.onPopState),window.addEventListener("keydown",this.onKeyDown,{capture:!0,passive:!1}),n.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",this.onTouchStart,e)}history.scrollRestoration="manual",this.pushState()}overrideHash(e=""){e&&"#"!==e[0]?e="#"+e:"#"===e&&(e=""),this.overriddenHash=this.currentHash=e,this.replaceState(),this.pushState()}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||(0,o.Z)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const i=this.navigations[t];if(i.type===e)return{item:i,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}onItemAdded(e){this.debug&&this.log("onItemAdded",e,this.navigations),e.noHistory||this.pushState()}pushItem(e){this.navigations.push(e),this.onItemAdded(e)}unshiftItem(e){this.navigations.unshift(e),this.onItemAdded(e)}spliceItems(e,t,...i){this.navigations.splice(e,t,...i),i.forEach((e=>{this.onItemAdded(e)}))}pushState(){this.debug&&this.log("push"),this.manual=!1,history.pushState(this.id,"")}replaceState(){this.debug&&this.log.warn("replace");const e=location.origin+location.pathname+location.search+this.overriddenHash;history.replaceState(this.id,"",e)}removeItem(e){e&&(0,l.Z)(this.navigations,e)}removeByType(e,t=!1){for(let i=this.navigations.length-1;i>=0&&(this.navigations[i].type!==e||(this.navigations.splice(i,1),!t));--i);}};s.GO.appNavigationController=c;const h=c},5884:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,z:()=>d});var s=i(9893),n=i(8805),a=i(5565),o=i(2325),r=i(3512);class d{constructor(e,t,i=!0,n,a=!0,r=!0,d,l){this.name=e,this.type=t,this.clearable=i,this.autonomous=r,this.onFound=d,this.noIcons=l,this.list=s.default.createChatList(),this.container=document.createElement("div"),n&&(this.container.className=n),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append((0,o.ag)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",a&&s.default.setListClickListener(this.list,d,void 0,r)}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 l{constructor(e,t,i,s,a){this.container=e,this.searchInput=t,this.searchGroups=i,this.onSearch=s,this.noIcons=a,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 n.ZP(this.container),this.listsContainer=this.scrollable.container;for(const 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(const e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,i=""){this.peerId=e,this.threadId=t,this.query!==i&&(this.searchInput.inputField.value=i),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=r.Z.managers.appMessagesManager.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then((t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:i,history:n}=t;n.length&&n[0].mid===this.minMsgId&&n.shift();const r=this.searchGroups.messages;n.forEach((t=>{try{const i=this.peerId?t.fromId:t.peerId;s.default.addDialogAndSetLastMessage({peerId:i,container:this.scrollable,avatarSize:"bigger",meAsSaved:!1,message:t,query:e,noIcons:this.noIcons})}catch(e){console.error("[appSearch] render search result",e)}})),r.toggle(),this.minMsgId=n.length&&n[n.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=n.length,-1===this.foundCount&&(this.foundCount=i,r.nameEl&&(0,a.Z)(r.nameEl,(0,o.ag)(i?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[i])),this.onSearch&&this.onSearch(this.foundCount))})).catch((e=>{console.error("search error",e),this.searchPromise=null}))}}},6360:(e,t,i)=>{"use strict";i.d(t,{Z:()=>fe});var s=i(9893),n=i(5003),a=i(3512),o=i(5884),r=i(6008),d=i(2153),l=i(279),c=i(1405),h=i(8805),u=i(8594),f=i(2325),p=i(8497),m=i(3624),g=i(2894),v=i(4668),b=i(4332),y=i(4755),w=i(4846),S=i(4484),C=i(467),L=i(5432),E=i(1154),I=i(241),M=i(6272),P=i(3003),Z=i(4524),k=i(5128),T=i(7479),x=i(5705),A=i(6054),_=i(3910),F=i(2738),D=i(1784),R=i(8479),B=i(7401),N=i(5953),O=i(3738),U=i(4064),H=i(130),z=i(7030),j=i(2498),G=i(1336),V=i(3785),K=i(2342),W=i(2491),$=i(4776),q=i(5671),Q=i(1604),Y=i(7530),J=i(6566),X=i(177),ee=i(3061),te=i(2566),ie=i(6976),se=i(3416),ne=i(1483),ae=i(3855),oe=i(3699),re=i(296),de=i(9492),le=i(2887),ce=i(319),he=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ue{constructor(e,t,i){this.attachTo=e,this.searchSuper=t,this.listenerSetter=i,this.onGotoClick=()=>{w.Z.setInnerPeer({peerId:this.peerId,lastMsgId:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionForwardBtn):new Z.Z({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionDeleteBtn):new k.Z(this.peerId,[this.mid],"chat")},this.managers=t.managers;L.Z||(0,ie.E)(e,(e=>{let i;this.init&&(this.init(),this.init=null);try{i=(0,p.Z)(e.target,"search-super-item")}catch(e){}if(i){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{he(this,void 0,void 0,(function*(){this.target=i,this.peerId=i.dataset.peerId.toPeerId(),this.mid=+i.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),yield Promise.all(this.buttons.map((e=>he(this,void 0,void 0,(function*(){let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||(yield e.verify())),e.element.classList.toggle("hide",!t)}))))),i.classList.add("menu-open"),(0,ne.Z)(e,this.element),se.Z.openBtnMenu(this.element,(()=>{i.classList.remove("menu-open")}))}))})()}}),i)}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>he(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canForward(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>he(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=(0,P.Z)(this.buttons),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class fe{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new d.Z,this.middleware=(0,m.k)(),this.historyStorage={},this.usedFromHistory={},this.urlsToRevoke=[],this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=(0,n.kg)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},(0,N.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.listenerSetter=new oe.Z,this.searchContextMenu=new ue(this.container,this,this.listenerSetter),this.selection=new A.e(this,this.managers,this.listenerSetter);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const i=this.navScrollable=new h.v7(t);i.container.classList.add("search-super-nav-scrollable");const s=this.nav=document.createElement("nav");s.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=s,i.container.append(s);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const i=document.createElement("span"),s=document.createElement("i");i.append((0,f.ag)(e.name)),i.append(s),t.append(i),(0,c.Z)(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"),L.Z&&(this.swipeHandler=(0,E.Z)({element:this.tabsContainer,onSwipe:(e,t,i)=>{const s=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=s+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{(0,_.Z)(e)};let i=2;const s=()=>{--i||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",s,{once:!0}),s}(this.tabsContainer),this.selectTab(o))}}));for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const i=document.createElement("div");i.classList.add("search-super-content-"+e.type),t.append(i),this.tabsContainer.append(t),this.tabs[e.inputFilter]=i,e.contentTab=i}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new o.z(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.canLoadMediaTab(this.mediaTab)&&this.load(!0)},this.selectTab=(0,r.X)(this.tabsMenu,this.tabsContainer,((e,t,i)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start",startCallback:this.scrollStartCallback});const s=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(s);const n=this.mediaTab;if(this.mediaTab=s,-1!==this.prevTabId&&i&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(s.scroll={scrollTop:n,scrollHeight:0})}if(s.scroll){const e=n.scroll.scrollTop-s.scroll.scrollTop;e&&(s.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||s.contentTab.childElementCount||this.load(!0),this.prevTabId=e}),(()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()}),void 0,i,this.listenerSetter),(0,F.fc)(this.tabsContainer,(e=>{this.selection.isSelecting&&((0,_.Z)(e),this.selection.toggleByElement((0,p.Z)(e.target,"search-super-item")))}),{capture:!0,passive:!1,listenerSetter:this.listenerSetter});const l=(e,t,i,s)=>he(this,void 0,void 0,(function*(){const n=(0,p.Z)(s.target,e);if(!n)return;const a=+n.dataset.mid;if(!a)return void this.log.warn("no messageId by click on target:",n);const o=n.dataset.peerId.toPeerId(),r=Array.from(this.tabs[i].querySelectorAll("."+t)).map((t=>{const i=(0,p.Z)(t,e);return{element:t,mid:+i.dataset.mid,peerId:i.dataset.peerId.toPeerId()}})),d=r.findIndex((e=>e.mid===a&&e.peerId===o)),l=yield this.managers.appMessagesManager.getMessageByPeer(o,a);(new D.Z).setSearchContext(this.copySearchContext(i)).openMedia(l,r[d].element,0,!1,r.slice(0,d),r.slice(d+1))}));(0,F.fc)(this.tabs.inputMessagesFilterPhotoVideo,l.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo"),{listenerSetter:this.listenerSetter}),(0,F.fc)(this.tabs.inputMessagesFilterDocument,l.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument"),{listenerSetter:this.listenerSetter}),this.mediaTab=this.mediaTabs[0],(0,u.ZP)((()=>{this.lazyLoadQueue.lock()}),(()=>{this.lazyLoadQueue.unlockAndRefresh()}),this.listenerSetter)}filterMessagesByType(e,t){return(0,J.Z)(t,e,e.length)}processEmptyFilter({message:e,searchGroup:t}){const i=[],{dom:n}=s.default.addDialogNew({peerId:e.peerId,container:t.list,avatarSize:"bigger",loadPromises:i}),a=s.default.setLastMessageN({dialog:{_:"dialog",peerId:e.peerId},lastMessage:e,dom:n,highlightWord:this.searchContext.query});return i.push(a),Promise.all(i).then(ce.Z)}processPhotoVideoFilter({message:e,promises:t,middleware:i}){return he(this,void 0,void 0,(function*(){const s=(0,Y.Z)(e),n=document.createElement("div");let a;n.classList.add("grid-item");const o=(0,z.Z)(s,200,200);return a="photo"!==s._?yield(yield(0,le.Z)({doc:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,photoSize:o})).thumb:yield(0,de.Z)({photo:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,withoutPreloader:!0,noBlur:!0,size:o}),[a.images.thumb,a.images.full].filter(Boolean).forEach((e=>{e.classList.add("grid-item-media")})),t.push(a.loadPromises.thumb),{element:n,message:e}}))}processDocumentFilter({message:e,inputFilter:t}){return he(this,void 0,void 0,(function*(){const i=(0,Y.Z)(e),s=this.showSender||["voice","round"].includes(i.type),n=yield(0,re.Z)({message:e,withTime:!s,fontWeight:400,voiceAsMusic:!0,showSender:s,searchContext:this.copySearchContext(t),lazyLoadQueue:this.lazyLoadQueue,autoDownloadSize:0});return["audio","voice","round"].includes(i.type)&&n.classList.add("audio-48"),{message:e,element:n}}))}processUrlFilter({message:e,promises:t,middleware:i}){var s;return he(this,void 0,void 0,(function*(){let n=null===(s=e.media)||void 0===s?void 0:s.webpage;if(!n){const t=e.totalEntities?e.totalEntities.find((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._)):null;let i,s,a;if(t)a=e.message.slice(t.offset,t.offset+t.length);else{const t=(0,K.Z)(e.message);if(!t)return;i=t[0]}i="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:i||a,s=i;const o=e.message===i;i.match(/^(ftp|http|https):\/\//)||(s="https://"+i,i=i.includes("@")?i:"https://"+i),s=new URL(s).hostname,n={_:"webPage",url:i,display_url:s,id:"",hash:0},o||(n.description=e.message)}const a=document.createElement("div");a.classList.add("preview"),n.photo?(0,de.Z)({container:a,message:null,photo:n.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,size:(0,z.Z)(n.photo,60,60,!1),loadPromises:t,noBlur:!0}):(a.classList.add("empty"),(0,H.Z)(a,(0,V.Z)(n.title||n.display_url||n.description||n.url,!0)));const o=(0,G.Z)(n),r=(0,j.Z)(n),d=(0,x.Z)((0,$.ZP)(n.url||"")).firstElementChild;if(d instanceof HTMLAnchorElement)try{d.innerText=decodeURIComponent(d.href)}catch(e){}r.firstChild&&r.append("\n"),r.append(d),this.showSender&&r.append("\n",yield(0,q.Z)(e)),o.textContent||o.append((0,W.Z)(n.display_url.split("/",1)[0]));const l=new T.ZP({title:o,titleRight:(0,Q.Z)(e),subtitle:r,havePadding:!0,clickable:!0,noRipple:!0});if(l.applyMediaElement(a,"big"),l.container.innerText.trim().length)return{message:e,element:l.container}}))}performSearchResult(e,t,i=!0){return he(this,void 0,void 0,(function*(){const s=[],n=t.contentTab,a=[],o=this.middleware.get();let r,d=t.inputFilter;yield(0,u.e9)(),"inputMessagesFilterPhotoVideo"===d&&this.searchContext.query.trim()?(d="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===d&&(r=this.searchGroups.messages);const l={elemsToAppend:s,inputFilter:d,message:void 0,middleware:o,promises:a,searchGroup:r};let c;switch(d){case"inputMessagesFilterEmpty":c=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":c=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":c=this.processDocumentFilter;break;case"inputMessagesFilterUrl":c=this.processUrlFilter}if(c){c=c.bind(this);const t=e.map((e=>he(this,void 0,void 0,(function*(){try{return l.message=e,yield c(l)}catch(t){this.log.error("error rendering filter",d,l,e,t)}})))),i=(yield Promise.all(t)).filter(Boolean);s.push(...i.filter(Boolean))}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(s.length){const e=i?"append":"prepend";s.forEach((t=>{var i;const{element:s,message:n}=t,a=this.getMonthContainerByTimestamp(this.groupByMonth?n.date:0,d);s.classList.add("search-super-item"),s.dataset.mid=""+n.mid,s.dataset.peerId=""+n.peerId,a.items[e](s),(null===(i=this.selection)||void 0===i?void 0:i.isSelecting)&&this.selection.toggleElementCheckbox(s,!0)}))}this.afterPerforming("inputMessagesFilterEmpty"===d?1:e.length,n)}}))}afterPerforming(e,t){if(t){const i=t.parentElement;if(Array.from(i.children).slice(1).forEach((e=>{e.remove()})),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),i.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(const e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const i=this.searchContext.query;if(i){const n=(t,n,o=!1)=>{t.map((t=>{if(e.has(t))return;e.add(t);const{dom:i}=s.default.addDialogNew({peerId:t,container:n.list,avatarSize:"abitbigger",autonomous:n.autonomous});return{dom:i,peerId:t}})).filter(Boolean).forEach((({dom:e,peerId:t})=>he(this,void 0,void 0,(function*(){const s=yield this.managers.appPeersManager.getPeer(t);if(o&&(s.participants_count||s.participants)){const s=new RegExp(`(${(0,O.Z)(i)}|${(0,O.Z)((0,C.ZP)(i))})`,"gi");e.titleSpan.innerHTML=e.titleSpan.innerHTML.replace(s,"$1"),e.lastMessageSpan.append(yield(0,X.Z)(t.toChatId()))}else if(t===a.Z.myId)e.lastMessageSpan.append((0,f.ag)("Presence.YourChat"));else{let i=yield this.managers.appPeersManager.getPeerUsername(t);if(i)i="@"+i;else{const e=yield this.managers.appUsersManager.getUser(t);e&&e.phone&&(i="+"+(0,M.u)(e.phone).formatted)}e.lastMessageSpan.textContent=i}})))),n.toggle()},o=e=>{if(t())return e};return Promise.all([this.managers.appUsersManager.getContactsPeerIds(i,!0,void 0,10).then(o).then((e=>{e&&n(e,this.searchGroups.contacts,!0)})),this.managers.appUsersManager.searchContacts(i,20).then(o).then((e=>{if(e&&(n(e.my_results,this.searchGroups.contacts,!0),n(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 f.ZP.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),(0,F.fc)(e,(()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()}))}})),this.managers.appMessagesManager.getConversations(i,0,20,0).then(o).then((e=>{e&&n(e.dialogs.map((e=>e.peerId)),this.searchGroups.contacts,!0)}))])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>ae.Z.getState().then((i=>{t()&&(this.searchGroups.recent.list.innerHTML="",i.recentSearch.slice(0,20).forEach((e=>he(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.searchGroups.recent.list,meAsSaved:!0,avatarSize:"abitbigger",autonomous:!0});t.lastMessageSpan.append(yield e.isUser()?(0,ee.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())):(0,X.Z)(e.toChatId()))})))),i.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())}));return Promise.all([this.managers.appUsersManager.getTopPeers("correspondents").then((e=>{if(!t())return;const i=e.findIndex((e=>e.id===a.Z.myId));-1!==i&&(e=e.slice()).splice(i,1),e.length&&e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:this.searchGroups.people.list,onlyFirstName:!0,avatarSize:"bigger",autonomous:!1,noIcons:this.searchGroups.people.noIcons});t.subtitleEl.remove()})),this.searchGroups.people.setActive()})),e()])}}loadMembers(e){return he(this,void 0,void 0,(function*(){const t=this.searchContext.peerId.toChatId(),i=this.middleware.get();let n;const a=t=>he(this,void 0,void 0,(function*(){if(!this.loadMutex||(yield this.loadMutex,i())){this.membersList||(this.membersList=new g.Z({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1,managers:this.managers}),(0,F.fc)(this.membersList.list,(e=>{const t=(0,v.Z)(e.target,s.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();let n=Promise.resolve();y.Z.isMobile&&(n=b.ZP.toggleSidebar(!1)),n.then((()=>{w.Z.setInnerPeer({peerId:i})}))})),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab));for(const e of t){const t=(0,te.Z)(e);t.isAnyChat()||((yield this.managers.appUsersManager.getUser(t)).pFlags.deleted||this.membersList.add(t))}}}));if(yield this.managers.appChatsManager.isChannel(t)){const s=this.membersList?200:50;n=this.managers.appProfileManager.getChannelParticipants(t,void 0,s,this.nextRates[e.inputFilter]).then((t=>{if(!i())return;const n=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(n?n.childElementCount:0)+t.participants.length,t.participants.length{if(!i())return;this.loaded[e.inputFilter]=!0;const s=t.participants;return"chatParticipantsForbidden"!==s._?a(s.participants):void 0}));return this.loadPromises[e.inputFilter]=n.finally((()=>{i()&&(this.loadPromises[e.inputFilter]=null)}))}))}loadType(e,t,i,s){var n;const a=e.inputFilter;if(this.loadPromises[a])return this.loadPromises[a];if("members"===e.type)return this.loadMembers(e);const o=null!==(n=this.historyStorage[a])&&void 0!==n?n:this.historyStorage[a]=[];if(!("inputMessagesFilterEmpty"!==a||o.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[a]=!0,Promise.resolve();const r=this.loadPromises[a]=Promise.resolve().then((()=>he(this,void 0,void 0,(function*(){var n,d;if(o.length&&this.usedFromHistory[a]this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))));t.push(...this.filterMessagesByType(r,a))}while(n{setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}const l=o.length?o[o.length-1].mid:0,c=yield this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:a},maxId:l,limit:i,nextRate:null!==(n=(d=this.nextRates)[a])&&void 0!==n?n:d[a]=0}));if(o.push(...c.history.map((e=>({mid:e.mid,peerId:e.peerId})))),s()&&((c.history.length{setTimeout((()=>{if(s()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then((()=>{s()&&setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}}),0)})),this.performSearchResult(this.filterMessagesByType(c.history,a),e)})))).catch((e=>{this.log.error("load error:",e)})).finally((()=>{this.loadPromises[a]=null}));return r}canLoadMediaTab(e){const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"inputMessagesFilterEmpty"!==e.inputFilter)),s=i.map((e=>({_:e.inputFilter}))),[n,a]=yield Promise.all([this.managers.appMessagesManager.getSearchCounters(t,s),this.canViewMembers()]);if(!e())return;if(this.loadMutex&&(yield this.loadMutex,!e()))return;let o,r=0;i.forEach((e=>{const t=n.find((t=>t.filter._===e.inputFilter));e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&(void 0===o&&(o=e),++r)}));const d=this.mediaTabsMap.get("members");d.menuTab.classList.toggle("hide",!a),a&&(o=d),this.container.classList.toggle("hide",!o),this.container.parentElement.classList.toggle("search-empty",!o),o&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(o),!1),this.navScrollableContainer.classList.toggle("hide",r<=1))}))}load(e=!1,t=!1){var i;return he(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(yield null!==(i=this.loadFirstTimePromise)&&void 0!==i?i:this.loadFirstTimePromise=this.loadFirstTime(),!n())return;this.loadFirstTimePromise=void 0,this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter((e=>e!==this.mediaTab));if(a=a.filter((e=>this.canLoadMediaTab(e))),s.isUser()&&(0,U.Z)(a,(e=>"members"===e.type)),!a.length)return;const o=t?50:Math.round(3*(I.Z.height/130|0)*1.25),r=a.map((e=>this.loadType(e,t,o,n)));return Promise.all(r).catch((e=>{this.log.error("Load error all promises:",e)}))}))}getMonthContainerByTimestamp(e,t){var i;const s=new Date(1e3*e);s.setHours(0,0,0),s.setDate(1);const n=s.getTime(),a=null!==(i=this.monthContainers[t])&&void 0!==i?i:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const i=document.createElement("div");i.classList.add("search-super-month-name");const o={month:"long"};s.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new f.ZP.IntlDateElement({date:s,options:o}).element;i.append(r),e.append(i);const d=document.createElement("div");d.classList.add("search-super-month-items"),e.append(i,d);const l=(0,B.Z)(a,"desc");let c=0;for(;cl[c]);++c);a[n]={container:e,items:d},(0,S.Z)(e,this.tabs[t],c)}return a[n]}canViewMembers(){return Promise.all([this.searchContext.peerId.isAnyChat(),this.managers.appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()),this.managers.appChatsManager.hasRights(this.searchContext.peerId.toChatId(),"view_participants")]).then((([e,t,i])=>e&&!t&&i))}cleanup(){var e;this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.prevTabId=-1,this.lazyLoadQueue.clear(),this.mediaTabs.forEach((e=>{this.usedFromHistory[e.inputFilter]=-1})),(null===(e=this.selection)||void 0===e?void 0:e.isSelecting)&&this.selection.cancelSelection(),this.middleware.clean(),this.loadFirstTimePromise=void 0,this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach((e=>{e.scroll=void 0}))}cleanupHTML(e=!1){this.urlsToRevoke.length&&(this.urlsToRevoke.forEach((e=>{URL.revokeObjectURL(e)})),this.urlsToRevoke.length=0),this.mediaTabs.forEach((e=>{if(e.contentTab.innerHTML="",this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||(0,l.y)(t,!0);const i=t.querySelector(".content-empty");i&&i.remove()}})),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=(0,R.Z)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:i,historyStorage:s,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:i,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=s?s:{},this.cleanup()}destroy(){var e,t;this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(e=this.swipeHandler)||void 0===e||e.removeListeners(),null===(t=this.selection)||void 0===t||t.cleanup(),this.scrollStartCallback=void 0,this.onChangeTab=void 0,this.selectTab=void 0,this.searchContextMenu=void 0,this.swipeHandler=void 0,this.selection=void 0}}},5644:(e,t,i)=>{"use strict";i.d(t,{Z:()=>x});var s=i(9893),n=i(3512),a=i(8805),o=i(4789),r=i(9807),d=i(2325),l=i(8763),c=i(8497),h=i(8842),u=i(3910),f=i(5565),p=i(5701),m=i(241),g=i(2464),v=i(2738),b=i(6690),y=i(1655),w=i(5953),S=i(4064),C=i(9331),L=i(2353),E=i(2566),I=i(177),M=i(3061),P=i(8493),Z=i(7120),k=i(8050),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x{constructor(e){this.container=document.createElement("div"),this.list=s.default.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="abitbigger",this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.design="round",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(const e in this.tempIds)++this.tempIds[e];this.list=s.default.createChatList(),this.promise=null,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},(0,w.Z)(this,e),this.container.classList.add("selector","selector-"+this.design);const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>T(this,void 0,void 0,(function*(){return this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter((e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t})),this.filterPeerTypeBy&&(e=yield(0,L.Z)(e,(e=>T(this,void 0,void 0,(function*(){if(e.isPeerId()&&!(yield this.managers.appPeersManager.getPeer(e)).deleted)for(const t of this.filterPeerTypeBy)if(yield this.managers.appPeersManager[t](e))return!0;return!0}))))),t(e)})),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?(0,d.$d)(this.input,this.placeholder,void 0,"placeholder"):(0,d.$d)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new g.dw({});e.innerContainer.classList.add("selector-search-section");const 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 a.ZP(t),(0,v.fc)(this.selectedContainer,(e=>{if(this.freezed)return;let t=e.target;if(t=(0,c.Z)(t,"selector-user"),!t)return;const i=t.dataset.key,s=this.chatsContainer.querySelector('[data-peer-id="'+i+'"]');s?(0,v.tH)(s):this.remove(i.toPeerId())})),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const i=new g.dw({name:this.sectionNameLangPackKey,noShadow:!0});i.content.append(this.list),this.chatsContainer.append(i.container),this.scrollable=new a.ZP(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),(0,v.fc)(this.chatsContainer,(e=>{const t=(0,l.Z)(e.target,"data-peer-id");if((0,u.Z)(e),!t)return;if(this.freezed)return;let i=t.dataset.peerId;if(i=i.isPeerId()?i.toPeerId():i,!this.multiSelect)return void this.add(i);this.selected.has(i)?this.remove(i):this.add(i);const s=t.querySelector("input");s.checked=!s.checked}));const n=(0,p.Z)(this.onInput,200,!1,!0);this.input.addEventListener("input",n),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend((0,g.G7)()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout((()=>{const t=this.getMoreResults();e.onFirstRender&&t.then((()=>{e.onFirstRender()}))}),0)}renderSaved(){return T(this,void 0,void 0,(function*(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!(yield this.managers.appUsersManager.testSelfSearch(this.query))||(yield this.renderResultsFunc([n.Z.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=m.Z.height/56*1.25|0,t=this.getTempId("dialogs"),i=this.managers.appMessagesManager.getConversations(this.query,this.offsetIndex,e,this.folderId,!0);this.promise=i;const s=yield i;if(this.tempIds.dialogs!==t)return;this.promise=null;let a=s.dialogs;if(a.length){const e=(0,k.Z)(a[a.length-1])||0;a=a.slice(),(0,S.Z)(a,(e=>e.peerId===n.Z.myId)),this.chatRightsAction&&(a=yield(0,L.Z)(a,(e=>this.filterByRights(e.peerId)))),yield this.renderSaved(),this.offsetIndex=e}if(this.renderResultsFunc(a.map((e=>e.peerId))),s.isEnd){if(!this.loadedWhat.dialogs)return yield this.renderSaved(),this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs();if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return T(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.getPeer(e);return e.isUser()?"send_messages"!==this.chatRightsAction||(0,P.Z)(t):!!(0,Z.Z)(t,this.chatRightsAction)||void 0}))}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"),i=Promise.all([e?this.managers.appUsersManager.getContactsPeerIds(this.query):[],this.query?this.managers.appUsersManager.searchContacts(this.query):void 0]);this.promise=i;const[s,a]=yield i;if(this.tempIds.contacts!==t)return;if(a){let t=e?a.my_results.concat(a.results):a.my_results;this.chatRightsAction&&(t=yield(0,L.Z)(t,(e=>this.filterByRights(e)))),this.peerType.includes("dialogs")||(t=t.filter((e=>e.isUser()))),this.cachedContacts=(0,b.Z)(s.concat(t))}else this.cachedContacts=s.slice();(0,y.Z)(this.cachedContacts,n.Z.myId),this.promise=null}const t=m.Z.height/56*1.25|0,i=this.cachedContacts.splice(0,t);this.renderResultsFunc(i),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=this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount),i=yield t;if(this.tempIds.channelParticipants!==e)return;const s=i.participants.map((e=>(0,E.Z)(e)));(0,y.Z)(s,n.Z.myId),this.renderResultsFunc(s),(this.list.childElementCount>=i.count||i.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){const e=(()=>{const e=[];return!this.peerType.includes("dialogs")||this.loadedWhat.archived||(e.push(this.getMoreDialogs()),this.loadedWhat.archived)?(!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts||e.push(this.getMoreContacts()),this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants&&e.push(this.getMoreChannelParticipants()),e):e})(),t=Promise.all(e);return e.length&&t.then(this.checkForTriggers),t}renderResults(e){return T(this,void 0,void 0,(function*(){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=yield(0,L.Z)(e,(e=>this.managers.appUsersManager.isNonContactUser(e)))),e.forEach((e=>T(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.scrollable,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const i=this.selected.has(e),s=new r.Z;i&&(s.input.checked=!0),t.containerEl.prepend(s.label)}let i;i=e.isAnyChat()?yield(0,I.Z)(e.toChatId()):e===n.Z.myId?(0,d.ag)(this.selfPresence):(0,M.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())),t.lastMessageSpan.append(i)}))))}))}add(e,t,i=!0){var s;if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const n=document.createElement("div");n.classList.add("selector-user","scale-in");const a=new C.Z;return a.classList.add("selector-user-avatar","tgico","avatar-32"),a.isDialog=!0,n.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new h.Z({peerId:e.toPeerId(),dialog:!0}).element),a.updateWithOptions({peerId:e})),t&&("string"==typeof t?n.innerHTML=t:((0,f.Z)(n,t),n.append(t))),n.insertAdjacentElement("afterbegin",a),this.selectedContainer.insertBefore(n,this.input),null===(s=this.onChange)||void 0===s||s.call(this,this.selected.size),i&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),n}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const i=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};n.Z.settings.animationsEnabled?t.addEventListener("animationend",i,{once:!0}):i()}getSelected(){return[...this.selected]}addInitial(e){e.forEach((e=>{this.add(e,void 0,!1)})),window.requestAnimationFrame((()=>{this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center",forceDirection:o.f.Static})}))}}},8448:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>F,ns:()=>_});var s=i(3442),n=i(3013),a=i(4755),o=i(4762),r=i(3512),d=i(3910),l=i(2738),c=i(3725),h=i(3699),u=i(319),f=i(8497),p=i(2325),m=i(3251),g=i(632),v=i(9966),b=i(1507),y=i(4081),w=i(5296),S=i(3228),C=i(5157),L=i(7207),E=i(130),I=i(8115),M=i(5671),P=i(1604),Z=i(7530),k=i(2312),T=i(9492),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function A(e=!0){const t=new s.Z({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}r.Z.addEventListener("messages_media_read",(({mids:e,peerId:t})=>{e.forEach((e=>{const i=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${i}, .media-round.is-unread${i}`)).forEach((e=>{e.classList.remove("is-unread")}))}))}));const _=(e,t)=>{let i,s;const n=!e.classList.contains("search-super-item"),a=(0,f.Z)(e,n?"bubbles-inner":"tabs-tab");if(a){const t=':not([data-is-outgoing="1"])',o=`.audio:not(.is-voice)${t}`;let r;if(r=e.matches(o)?[o]:[`.audio.is-voice${t}`,`.media-round${t}`],n){const e=".bubble:not(.webpage) ";r=r.map((t=>e+t))}const d=r.join(", "),l=Array.from(a.querySelectorAll(d)),c=l.indexOf(e),h=l.map((e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid})));i=h.slice(0,c),s=h.slice(c+1)}return(s.length&&s[0].midt)&&([i,s]=[s.reverse(),i.reverse()]),[i,s]};class F extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new h.Z}render(){var e,t,i;return x(this,void 0,void 0,(function*(){this.classList.add("audio"),this.managers=r.Z.managers,this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=(0,Z.Z)(this.message),h="voice"===s.type,f=!this.voiceAsMusic&&h,F=this.message.pFlags.is_outgoing,D=null===(e=this.message)||void 0===e?void 0:e.uploadingFileName,R=(0,C.Z)(0|s.duration);this.innerHTML='\n
\n
\n
\n
\n
\n
';const B=this.firstElementChild,N=document.createElement("div");N.classList.add("audio-download"),"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),D&&(this.classList.add("is-outgoing"),this.append(N));const O=yield f?function(e){return x(this,void 0,void 0,(function*(){e.classList.add("is-voice");const t=e.message,i=(0,Z.Z)(t);t.pFlags.out&&e.classList.add("is-out");let s=i.attributes.find((e=>"documentAttributeAudio"===e._)).waveform||new Uint8Array([]);s=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let i;try{const s=new DataView(e.buffer);i=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){i=new Uint8Array([])}return i}(s.slice(0,63));const{svg:n,container:o,availW:r}=function(e,t){const i=a.Z.isMobile?16:23,s=a.Z.isMobile?152:190,n=a.Z.isMobile?190:256,o=(0,S.Z)(t/60*n,s,n),r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.classList.add("audio-waveform-bars"),r.setAttributeNS(null,"width",""+o),r.setAttributeNS(null,"height",""+i),r.setAttributeNS(null,"viewBox",`0 0 ${o} ${i}`);const d=Math.max(...e),l=e.length?e.length:100,c=Math.min(o/4|0,l);let h=0;const u=i-4;let f="";for(let t=0,s=0,n=0;t=l){n=n+c-l,n<(c+1)/2&&h\n `,s+=4,h=n<(c+1)/2?0:a}else h{let t=e.audio;const i=()=>{c.style.width=t.currentTime/t.duration*100+"%"};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&i();const s=(0,v.Z)(i);return e.addAudioListener("timeupdate",s),e.addAudioListener("ended",s),e.addAudioListener("play",(()=>{(0,w.cK)((()=>!!t&&(i(),!t.paused)),e)})),e.readyPromise.then((()=>{let e=!1,i=!1;function s(e){let i;if(e instanceof MouseEvent)i=e.offsetX;else{const t=e.target.getBoundingClientRect();i=e.targetTouches[0].pageX-t.left}const s=i/r*t.duration;t.currentTime=s}p.addEventListener("mouseleave",(s=>{e&&(t.play(),e=!1),i=!1})),p.addEventListener("mousemove",(t=>{i=!0,e&&s(t)})),p.addEventListener("mousedown",(i=>{i.preventDefault(),0===i.button&&(t.paused||t.pause(),s(i),e=!0)})),p.addEventListener("mouseup",(s=>{i&&e&&(t.play(),e=!1)})),(0,l.fc)(p,(e=>{(0,d.Z)(e),t.paused||s(e)}))}),u.Z),()=>{p.remove(),p=null,t=null}}}))}(this):function(e){var t;return x(this,void 0,void 0,(function*(){const i=e.withTime,s=e.message,n=(0,Z.Z)(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");o.classList.add("audio-description");const r=n.attributes.find((e=>"documentAttributeAudio"===e._));if(!a){const t=[];(null==r?void 0:r.performer)&&t.push((0,I.Z)(r.performer)),i?t.push((0,g.OD)(s.date)):t.length||t.push((0,y.Z)(n.size)),e.showSender&&t.push(yield(0,M.Z)(s)),o.append(...(0,p.A1)(t," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const d=e.querySelector(".audio-title"),l=new m.I;l.dataset.fontWeight=e.dataset.fontWeight,l.dataset.fontSize=e.dataset.fontSize,l.dataset.sizeType=e.dataset.sizeType,a?l.append(yield(0,M.Z)(s)):(0,E.Z)(l,(0,I.Z)(null!==(t=null==r?void 0:r.title)&&void 0!==t?t:n.file_name)),d.append(l),e.showSender&&d.append((0,P.Z)(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,i=new L.Z(e.audio,n.supportsStreaming);e.addAudioListener("ended",(()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1}));const s=()=>{t||(e.classList.add("audio-show-progress"),t=!0,i&&c.lastChild.replaceWith(i.container))};return e.addAudioListener("play",s),(!e.audio.paused||e.audio.currentTime>0)&&s(),()=>{i.removeListeners(),i.container.remove(),i=null}}}))}(this),U=this.querySelector(".audio-time");U.innerHTML=R;const H=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=n.Z.addMedia(this.message,e),i=this.readyPromise=(0,c.Z)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?i.resolve():this.addAudioListener("canplay",(()=>i.resolve()),{once:!0}),this.onTypeDisconnect=O();const s=()=>(0,C.Z)(0|t.currentTime)+(f?" / "+R:""),a=()=>{U.innerText=s(),B.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&a();const o=(e,i=t.paused)=>{if(e&&(0,d.Z)(e),i){const e=!!this.searchContext;if(n.Z.setSearchContext(this.searchContext||{peerId:b.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,i]=e?_(this,this.message.mid):[];n.Z.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,i)}t.play().catch((()=>{}))}else t.pause()};return(0,l.fc)(B,(e=>o(e)),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",(()=>{B.classList.remove("playing"),U.innerText=R})),this.addAudioListener("timeupdate",(()=>{!t.currentTime&&t.paused||n.Z.isSafariBuffering(t)||(U.innerText=s())})),this.addAudioListener("pause",(()=>{B.classList.remove("playing")})),this.addAudioListener("play",a),o};if(null===(t=s.thumbs)||void 0===t?void 0:t.length){const e=[],t=yield(0,T.Z)({photo:s,message:null,container:B,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});B.style.width=B.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(F)D&&(this.preloader=A(!1),this.preloader.attachPromise(k.Z.getUpload(D)),this.dataset.isOutgoing="1",this.preloader.attach(N,!1));else{let e=this.preloader;const t="audio"!==s.type;H(t);const a=t=>{if(this.audio.src)return;n.Z.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(n.Z.willBePlayed(this.audio),o.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(s.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=A(!1),s=(0,c.Z)();s.notifyAll({done:75,total:100}),s.catch((()=>{this.audio.pause(),n.Z.willBePlayed(void 0)})),s.cancel=()=>{s.cancel=u.Z;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(N,!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=A(),t||(this.readyPromise=(0,c.Z)());const n=()=>{i();const n=k.Z.downloadMediaURL({media:s});return t||n.then((()=>{this.readyPromise.resolve()})),e.attach(N,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.classList.contains("corner-download")?B.append(N):this.append(N),this.classList.add("downloading"),this.readyPromise.then((()=>{this.classList.remove("downloading"),N.classList.add("downloaded"),setTimeout((()=>{N.remove()}),200),n.Z.willBePlayedMedia===this.audio&&(this.audio.play(),n.Z.willBePlayed(void 0))}))};(null===(i=this.audio)||void 0===i?void 0:i.src)||(t?a(!1):(0,l.fc)(B,(()=>{a(!0)}),{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}))}}))}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){setTimeout((()=>{this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter&&(this.listenerSetter.removeAll(),this.listenerSetter=null),this.preloader&&(this.preloader=null))}),100)}}customElements.define("audio-element",F)},9331:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S,C:()=>b});var s=i(3512),n=i(2738),a=i(3910),o=i(1784),r=i(6074);class d extends r.Z{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const s=null==e?void 0:e.photoId;return this.managers.appPhotosManager.getUserPhotos(this.peerId,s,i).then((e=>{const t=e.photos.map((e=>({element:null,photoId:e})));return{count:e.count,items:t}}))}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var l=i(2312),c=i(4846),h=i(5824),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class f extends h.Z{constructor(e){super(new d({peerId:e,managers:s.Z.managers}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>u(this,void 0,void 0,(function*(){l.Z.downloadToDisc({media:yield this.managers.appPhotosManager.getPhoto(this.target.photoId),queueId:c.Z.chat.bubbles.lazyLoadQueue.queueId})})),this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,i=0,s,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return u(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=yield this.managers.appPhotosManager.getPhoto(e),r=a._openMedia.call(this,o,o.date,this.peerId,i,t,!1,s,n);return this.target.photoId=o.id,r}))}}var p=i(5880),m=i(9931),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const v=e=>{Array.from(document.querySelectorAll('avatar-element[data-peer-id="'+e+'"]')).forEach((e=>{e.update()}))};function b(e,t,i,n,a,r){return g(this,void 0,void 0,(function*(){let d=yield s.Z.managers.appProfileManager.getFullPhoto(t);if(!i()||!d)return;const l=()=>Array.from(e.querySelectorAll("img")).find((e=>!e.classList.contains("emoji")))?e:null;if(t.isAnyChat()){const e=!!n,c="inputMessagesFilterChatPhotos";if(!n&&(n=yield s.Z.managers.appMessagesManager.getSearch({peerId:t,inputFilter:{_:c},maxId:0,limit:1}).then((e=>e.history[0])),!i()))return;if(n){n.action.photo.id!==d.id&&(e||(n=s.Z.managers.appMessagesManager.generateFakeAvatarMessage(t,d)));const i=e=>e.map((e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId})));return void(new o.Z).setSearchContext({peerId:t,inputFilter:{_:c}}).openMedia(n,l(),void 0,void 0,a?i(a):void 0,r?i(r):void 0)}}if(d){!(0,p.Z)(n)&&n&&(d=yield s.Z.managers.appPhotosManager.getPhoto(n));const e=e=>e.map((e=>({element:e.element,photoId:e.item})));new f(t).openMedia(d.id,l(),void 0,a?e(a):void 0,r?e(r):void 0)}}))}s.Z.addEventListener("avatar_update",v),s.Z.addEventListener("peer_title_edit",(e=>g(void 0,void 0,void 0,(function*(){(yield s.Z.managers.appAvatarsManager.isAvatarCached(e))||v(e)}))));const y=new Map,w=new Set;class S extends HTMLElement{constructor(){super(...arguments),this.addedToQueue=!1}disconnectedCallback(){var e;const t=y.get(this.peerId);t&&t.has(this)&&(t.delete(this),t.size||y.delete(this.peerId)),null===(e=this.lazyLoadQueue)||void 0===e||e.delete({div:this})}attachClickEvent(){let e=!1;(0,n.fc)(this,(t=>g(this,void 0,void 0,(function*(){if((0,a.Z)(t),e)return;const i=this.peerId;e=!0,yield b(this,this.peerId,(()=>this.peerId===i)),e=!1}))))}updateOptions(e){for(const t in e)this[t]=e[t]}updateWithOptions(e){const t=this.peerId;this.updateOptions(e);const i=this.peerId;if(t!==i){if(this.peerId=i,this.dataset.peerId=""+i,t){const e=y.get(t);e&&(e.delete(this),e.size||y.delete(t))}return this.update()}}r(e=!1){const t=(0,m.Z)(this,this.peerId,this.isDialog,this.peerTitle,e,this.isBig);return this.loadPromises&&(this.loadPromises.push(t),t.finally((()=>{this.loadPromises=void 0}))),t}update(){if(this.lazyLoadQueue){if(!w.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=y.get(this.peerId);return e||(e=new Set,y.set(this.peerId,e)),e.add(this),this.lazyLoadQueue.push({div:this,load:()=>(w.add(this.peerId),this.update())}),this.r(!0)}this.addedToQueue&&this.lazyLoadQueue.delete({div:this})}w.add(this.peerId);const e=this.r();this.addedToQueue&&e.finally((()=>{this.addedToQueue=!1}));const t=y.get(this.peerId);if(t){t.delete(this);const e=Array.from(t);y.delete(this.peerId);for(let t=0,i=e.length;t{"use strict";i.d(t,{Z:()=>o});var s=i(2738),n=i(1168),a=i(6765);class o{constructor(e){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),(0,s.fc)(this.container,(()=>{n.Z.createPopup(a.Z).open(this.canvas,e)}))}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}},4494:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);const a=(e,t={})=>{const i=document.createElement(t.asDiv?"div":"button");return i.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&i.classList.add("rp-square"),(0,n.Z)(i)),t.onlyMobile&&i.classList.add("only-handhelds"),t.disabled&&i.setAttribute("disabled","true"),t.text&&i.append((0,s.ag)(t.text)),i}},8119:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e={})=>(0,s.Z)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e)},2230:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e,t={})=>(0,s.Z)("btn-icon",Object.assign({icon:e||void 0},t))},3003:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(3416),n=i(3910),a=i(2738),o=i(8497),r=i(2325);const d=e=>{if(e.element)return e.element;const{icon:t,text:i,onClick:d,checkboxField:l,noCheckboxClickListener:c}=e,h=document.createElement("div");h.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:"");let u=e.textElement;u||(u=e.textElement=i?(0,r.ag)(i,e.textArgs):document.createElement("span"),e.regularText&&(u.innerHTML=e.regularText)),u.classList.add("btn-menu-item-text"),h.append(u);const f=!!l||!!e.keepOpen;return d&&(0,a.fc)(h,(e=>{(0,n.Z)(e);const t=(0,o.Z)(e.target,"btn-menu");t&&!t.classList.contains("active")||!1!==d(e)&&(f||s.Z.close(),l&&!c&&(l.checked="radio"===l.input.type||!l.checked))}),e.options),l&&h.append(l.label),e.element=h},l=(e,t)=>{const i=document.createElement("div");i.classList.add("btn-menu"),t&&e.forEach((e=>{e.options?e.options.listenerSetter=t:e.options={listenerSetter:t}}));const s=e.map(d);return i.append(...s),i}},5322:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,v:()=>d});var s=i(3416),n=i(3910),a=i(2738),o=i(2230),r=i(3003);const d=(e,t,i,o)=>{((null==i?void 0:i.listenerSetter)?i.listenerSetter.add(e):e.addEventListener.bind(e))(a.pf,(i=>{if(!e.classList.contains("btn-menu-toggle"))return!1;const a=e.querySelector(".btn-menu");if((0,n.Z)(i),e.classList.contains("menu-open"))s.Z.close();else{const e=t&&t(i),n=()=>{s.Z.openBtnMenu(a,o)};e instanceof Promise?e.then(n):n()}}))},l=(e={},t,i,s,n)=>{var a;e.asDiv=!0;const l=null!==(a=e.container)&&void 0!==a?a:(0,o.Z)("more",e);l.classList.add("btn-menu-toggle");const c=(0,r.Z)(i,e.listenerSetter);return c.classList.add(t),d(l,s,e,n),l.append(c),l}},1571:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5296),n=i(2064);class a{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=()=>{const e=this._scrollDelta/this._scrollTails;this._scrollDelta%=this._scrollTails;const t=e>0?Math.floor(e):Math.ceil(e);t&&this.changeTailAndDraw(t),this._onWheelRAF=void 0},this.drawNextPositionAnimated=e=>{var t;let i,s;if(e){const s=e();i=s>=1;const a=-1*(n=s)*(n-2),o=null!==(t=this._nextPositionTail)&&void 0!==t?t:0,r=(this._nextPositionTail=this._nextPositionTails*a)-o;r&&(this._nextPositionLeft-=r,this.changeTailAndDraw(r))}else{const e=this._frames;s=e.shift(),i=!e.length}var n;return s&&this.drawImageData(s),i&&(this._nextPositionLeft=void 0,this._nextPositionTails=void 0,this._nextPositionTail=void 0,this._animatingToNextPosition=void 0),!i};const e=this._tails/this._curve[this._curve.length-1];for(let t=0,i=this._curve.length;t{var s;return e-(null!==(s=i[t-1])&&void 0!==s?s:0)}))}hexToRgb(e){const t=(0,n.oo)(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();t.push(...t.splice(0,e));const i=[];for(let e=0;e({x:(e.x-s[i].x)/t,y:(e.y-s[i].y)/t})));return i.map((e=>n.map(((t,i)=>({x:s[i].x+t.x*e,y:s[i].y+t.y*e})))))}curPosition(e,t){return this.getNextPositions(e,this._tails,[t])[0]}changeTail(e){for(this._tail+=e;this._tail>=this._tails;)this._tail-=this._tails,++this._phase>=this._phases&&(this._phase-=this._phases);for(;this._tail<0;)this._tail+=this._tails,--this._phase<0&&(this._phase+=this._phases)}changeTailAndDraw(e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}getGradientImageData(e){const t=this._hctx.createImageData(this._width,this._height),i=t.data;let s=0;for(let t=0;tthis.hexToRgb(e))),this._hc||(this._hc=document.createElement("canvas"),this._hc.width=this._width,this._hc.height=this._height,this._hctx=this._hc.getContext("2d",{alpha:!1})),this._canvas=e,this._ctx=this._canvas.getContext("2d",{alpha:!1}),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(e){var t,i;if(this._colors.length<2)return;if(e)return this._nextPositionLeft=this._tails+(null!==(t=this._nextPositionLeft)&&void 0!==t?t:0),this._nextPositionTails=this._nextPositionLeft,this._nextPositionTail=void 0,this._animatingToNextPosition=!0,void(0,s.cK)(this.drawNextPositionAnimated.bind(this,e),this);const n=this._tail,a=this._tails;let o;const r=[];for(let e=0,t=this._incrementalCurve.length;ea&&void 0===o&&(o=e,s%=a),r.push(s)}[r.slice(0,o),void 0!==o?r.slice(o):[]].forEach(((e,t,i)=>{const s=e[e.length-1];if(void 0!==s&&s>a&&(e[e.length-1]=+s.toFixed(2)),this._tail=null!=s?s:0,!e.length)return;const n=this.getNextPositions(this._phase,a,e);t!==i.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=n.map((e=>this.getGradientImageData(e)));this._frames.push(...o)})),this._animatingToNextPosition=!0,(0,s.cK)(this.drawNextPositionAnimated,this)}scrollAnimate(e){}cleanup(){this.scrollAnimate(!1)}static createCanvas(e){const t=document.createElement("canvas");return t.width=50,t.height=50,void 0!==e&&(t.dataset.colors=e),t}static create(e){const t=this.createCanvas(e),i=new a;return i.init(t),{gradientRenderer:i,canvas:t}}}},6054:(e,t,i)=>{"use strict";i.d(t,{e:()=>T,Z:()=>x});var s=i(5432),n=i(4494),a=i(2230),o=i(9807),r=i(5128),d=i(4524),l=i(9099),c=i(1962),h=i(9818),u=i(4762),f=i(2325),p=i(8497),m=i(8799),g=i(3910),v=i(6760),b=i(5565),y=i(8487),w=i(144),S=i(2738),C=i(5975),L=i(3241),E=i(5953),I=i(6976),M=(i(6690),i(4846)),P=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Z=e=>[...e.values()].reduce(((e,t)=>e+t.size),0);class k extends L.Z{constructor(e){super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.onMouseDown=e=>{const t=(0,p.Z)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,t))return;const i=new Map;let s,n=t;const a=(e,t=!0)=>{const o=+e.dataset.mid;if(!o||!e.dataset.peerId)return;const r=e.dataset.peerId.toPeerId();(0,y.Z)(n)||(n=e);let d=i.get(r);if(d||i.set(r,d=new Set),d.has(o))return;const l=this.isMidSelected(r,o);if(void 0===s&&(s=!l),d.add(o),s&&!l||!s&&l){const s=Z(i);if(this.toggleByElement&&t){s<2&&(0,C.Z)(e,n)&&(n=e);const t=this.getElementsBetween(n,e);t.length&&t.forEach((e=>{a(e,!1)}))}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===s&&this.toggleByMid)for(const[e,t]of i)for(const i of t)this.toggleByMid(e,i)}};let o=!1;const r=e=>{o||((0,v.Z)(),o=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,s)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",r),void this.listenerSetter.removeManual(document,"mouseup",d,l)):void a(t)},d=e=>{i.size&&(0,S.fc)(window,g.Z,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",r),(0,v.Z)()},l={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",r),this.listenerSetter.add(document)("mouseup",d,l)},this.getElementsBetween=(e,t)=>{if(e===t)return[];const i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),n=(i.top-s.top||i.left-s.left)<0,a=(0,p.Z)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),d=o.indexOf(t);return n||([d,r]=[r,d]),o.slice(r+1,d)},this.cancelSelection=e=>P(this,void 0,void 0,(function*(){e&&(this.doNotAnimate=!0),this.onCancelSelection&&(yield this.onCancelSelection()),this.selectedMids.clear(),this.toggleSelection(),(0,v.Z)(),e&&(this.doNotAnimate=void 0)})),(0,E.Z)(this,e),this.navigationType="multiselect-"+(0,w.a)()}attachListeners(e,t){if(this.listenElement&&this.listenerSetter.removeAll(),this.listenElement=e,this.listenerSetter=t,e)return s.Z?(t.add(e)("touchend",(()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")})),void(0,I.E)(e,(t=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),e.addEventListener("touchend",(e=>{(0,g.Z)(e),document.body.classList.remove("no-select")}),{once:!0,capture:!0}),(0,v.Z)();const i=this.getElementFromTarget(t.target);i&&this.toggleByElement(i)}),t)):void t.add(e)("mousedown",this.onMouseDown)}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const i=!!this.getCheckboxInputFromElement(e);if(t){if(i)return!1;const t=new o.Z({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else i&&(this.getCheckboxInputFromElement(e).parentElement.remove(),(0,l.Z)(e,"is-selected",!1,200));return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){var t;return P(this,void 0,void 0,(function*(){const i=this.selectedMids.size;if(!i&&!e)return;let s=!i,n=!i;const a=!i;for(const[e,t]of this.selectedMids){const i=`${e}_${this.isScheduled?"scheduled":"history"}`,a=yield this.managers.appMessagesManager.cantForwardDeleteMids(i,Array.from(t));if(s=a.cantForward,n=a.cantDelete,s&&n)break}null===(t=this.onUpdateContainer)||void 0===t||t.call(this,s,n,a)}))}toggleSelection(e=!0,t=!1){var i;const n=this.isSelecting,a=this.selectedMids.size;if(this.isSelecting=!!a||t,n===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),s.Z||(this.listenElement.classList.toggle("no-select",this.isSelecting),n&&(0,v.Z)()),(0,m.Z)();const o=!!a||t,r=null===(i=this.onToggleSelection)||void 0===i?void 0:i.call(this,o,!this.doNotAnimate);return u.IS_MOBILE_SAFARI||(o?h.Z.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):h.Z.removeByType(this.navigationType)),t&&(r||Promise.resolve()).then((()=>this.updateContainer(t))),!0}cleanup(){this.doNotAnimate=!0,this.selectedMids.clear(),this.toggleSelection(!1),this.doNotAnimate=void 0}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0),this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),(0,l.Z)(e,"is-selected",t,200)}isMidSelected(e,t){const i=this.selectedMids.get(e);return null==i?void 0:i.has(t)}length(){return Z(this.selectedMids)}toggleMid(e,t,i){let s=this.selectedMids.get(e);return i||void 0===i&&(null==s?void 0:s.has(t))?s&&(s.delete(t),s.size||this.selectedMids.delete(e)):(s||(s=new Set,this.selectedMids.set(e,s)),s.add(t)),!0}deleteSelectedMids(e,t){const i=this.selectedMids.get(e);i&&(t.forEach((e=>{i.delete(e)})),i.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class T extends k{constructor(e,t,i){super({managers:t,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>(0,p.Z)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,i=e.dataset.peerId.toPeerId();this.toggleMid(i,t)&&this.updateElementSelection(e,this.isMidSelected(i,t))},this.toggleByMid=(e,t)=>{const i=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(i)},this.onUpdateContainer=(e,t,i)=>{const s=this.length();(0,b.Z)(this.selectionCountEl,(0,f.ag)("messages",[s])),this.selectionGotoBtn.classList.toggle("hide",1!==s),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if((0,l.Z)(this.searchSuper.navScrollableContainer,"is-selecting",e,t?200:0,(()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)})),(0,l.Z)(this.searchSuper.container,"is-selecting",e,200),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=(0,a.Z)(`close ${e}-cancel`,{noRipple:!0});(0,S.fc)(t,(()=>this.cancelSelection()),{listenerSetter:this.listenerSetter,once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=(0,a.Z)(`message ${e}-goto`);const i={listenerSetter:this.listenerSetter};(0,S.fc)(this.selectionGotoBtn,(()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),M.Z.setInnerPeer({peerId:e,lastMsgId:t})}),i),this.selectionForwardBtn=(0,a.Z)(`forward ${e}-forward`),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),i),this.isPrivate&&(this.selectionDeleteBtn=(0,a.Z)(`delete danger ${e}-delete`),(0,S.fc)(this.selectionDeleteBtn,(()=>{const e=[...this.selectedMids.keys()][0];new r.Z(e,[...this.selectedMids.get(e)],"chat",(()=>{this.cancelSelection()}))}),i)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const s=this.selectionContainer;s.style.opacity="0",this.searchSuper.navScrollableContainer.append(s),s.offsetLeft,s.style.opacity=""}},this.isPrivate=!e.showSender,this.attachListeners(e.container,i)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);return i&&e&&Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach((e=>{this.toggleElementCheckbox(e,this.isSelecting)})),i}}class x extends k{constructor(e,t,i,s){super({managers:s,getElementFromTarget:e=>(0,p.Z)(e,"grouped-item")||(0,p.Z)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,i)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===i&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=i,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const t=this.selectedMids.get(this.chat.peerId);t&&this.getMidsFromGroupContainer(e).forEach((e=>t.delete(e)))}this.bubbles.getBubbleGroupedItems(e).map(this.toggleByElement)}else if(this.toggleMid(this.chat.peerId,t)){if(e.classList.contains("grouped-item")){const t=(0,p.Z)(e,"bubble"),i=this.isGroupedBubbleSelected(t),s=this.isGroupedMidsSelected(t);(s||i)&&this.updateElementSelection(t,s)}this.updateElementSelection(e,this.isMidSelected(this.chat.peerId,t))}},this.toggleByMid=(e,t)=>P(this,void 0,void 0,(function*(){const e=yield this.bubbles.getMountedBubble(t);e&&this.toggleByElement(e.bubble)})),this.onToggleSelection=(e,t)=>P(this,void 0,void 0,(function*(){const{needTranslateX:i,widthFrom:s,widthTo:o}=yield this.chat.input.center(t);(0,l.Z)(this.listenElement,"is-selecting",e,t?200:0,(()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=this.selectionLeft=this.selectionRight=null,this.selectedText=void 0)}));const h=sthis.cancelSelection()),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=(0,n.Z)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append((0,f.ag)("MessageScheduleSend")),(0,S.fc)(this.selectionSendNowBtn,(()=>{new c.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],(()=>{this.cancelSelection()}))}),e)):(this.selectionForwardBtn=(0,n.Z)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append((0,f.ag)("Forward")),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),e)),this.selectionDeleteBtn=(0,n.Z)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append((0,f.ag)("Delete")),(0,S.fc)(this.selectionDeleteBtn,(()=>{new r.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],this.chat.type,(()=>{this.cancelSelection()}))}),e);const i=this.selectionLeft=document.createElement("div");i.classList.add("selection-container-left"),i.append(t,this.selectionCountEl);const s=this.selectionRight=document.createElement("div");s.classList.add("selection-container-right"),s.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==h&&(i.style.transform=`translateX(${-h}px)`,s.style.transform=`translateX(${h}px)`),this.selectionContainer.append(i,s),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",i.style.transform="",s.style.transform=""}}else this.selectionLeft&&void 0!==h&&(this.selectionLeft.style.transform=`translateX(-${h}px)`,this.selectionRight.style.transform=`translateX(${h}px)`)})),this.onUpdateContainer=(e,t,i)=>{(0,b.Z)(this.selectionCountEl,(0,f.ag)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",i),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>P(this,void 0,void 0,(function*(){}))}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);if(i&&e)for(const e in this.bubbles.bubbles){if(this.bubbles.skippedMids.has(+e))continue;const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return i}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const i=super.toggleElementCheckbox(e,t);return i&&e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach((e=>this.toggleElementCheckbox(e,t))),i}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(e))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}getMidsFromGroupContainer(e){const t=this.chat.bubbles.getBubbleGroupedItems(e);return t.length||t.push(e),t.map((e=>+e.dataset.mid))}isGroupedMidsSelected(e){const t=this.getMidsFromGroupContainer(e),i=t.filter((e=>this.isMidSelected(this.chat.peerId,e)));return t.length===i.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!(e.classList.contains("service")||e.classList.contains("is-outgoing")||e.classList.contains("is-error")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}},9807:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1405),n=i(2325),a=i(9750),o=i(3512),r=i(3855);class d{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),this.listenerSetter=e.listenerSetter;const i=this.input=document.createElement("input");if(i.classList.add("checkbox-field-input"),i.type="checkbox",e.name&&(i.id="input-"+e.name),e.checked&&(i.checked=!0),e.stateKey){let t=!1;const s=()=>{if(!t)return;let s;s=e.stateValues?e.stateValues[i.checked?1:0]:i.checked,o.Z.managers.appStateManager.setByKey(e.stateKey,s)};r.Z.getState().then((i=>{t=!0;const s=(0,a.Z)(i,e.stateKey);let n;n=e.stateValues?1===e.stateValues.indexOf(s):s,this.setValueSilently(n)})),e.listenerSetter?e.listenerSetter.add(i)("change",s):i.addEventListener("change",s)}let d;if(e.text?(d=this.span=document.createElement("span"),d.classList.add("checkbox-caption"),(0,n.$d)(d,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(i),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 i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("checkbox-box-check"),i.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"),i.append(s);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,i),t.append(e)}d&&t.append(d),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),(0,s.Z)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},4489:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n extends s.ZP{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let i=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const s=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(s);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===i)return;i=n}))}}},5592:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1168),n=i(8127);function a(e){return new Promise(((t,i)=>{var a;const{button:o,checkbox:r}=e;o.callback=e=>{t(e?!!e.size:void 0)};const d=(0,s.x)(e.buttons||[o]),l=d.find((e=>e.isCancel));l.callback=()=>{i()},e.buttons=d,null!==(a=e.checkboxes)&&void 0!==a||(e.checkboxes=r&&[r]),new n.Z("popup-confirmation",e).show()}))}},5431:(e,t,i)=>{"use strict";i.d(t,{Z:()=>w});var s=i(9976),n=i(3910),a=i(8497),o=i(4668),r=i(5565),d=i(130),l=i(4789),c=i(144),h=i(2325),u=i(8115),f=i(3512),p=i(671),m=i(503),g=i(8805);let v;const b=()=>{v=h.ZP.countriesList.filter((e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)})).sort(((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name)))};let y=()=>{b(),f.Z.addEventListener("language_change",(()=>{b()}))};class w extends m.ZP{constructor(e={}){super(Object.assign({label:"Country",name:(0,c.a)()},e)),this.options=e,this.hidePicker=()=>{void 0===this.hideTimeout&&(this.selectWrapper.classList.remove("active"),this.hideTimeout=window.setTimeout((()=>{this.selectWrapper.classList.add("hide"),this.hideTimeout=void 0}),200))},this.selectCountryByTarget=e=>{var t,i;const s=e.querySelector("[data-default-name]").dataset.defaultName,n=e.querySelector(".phone-code"),a=null==n?void 0:n.innerText,o=a&&a.replace(/\D/g,"");(0,r.Z)(this.input,(0,h.ag)(s)),this.simulateInputEvent(),this.lastCountrySelected=v.find((e=>e.default_name===s)),this.lastCountryCodeSelected=o&&this.lastCountrySelected.country_codes.find((e=>e.country_code===o)),null===(i=(t=this.options).onCountryChange)||void 0===i||i.call(t,this.lastCountrySelected,this.lastCountryCodeSelected),this.hidePicker()},y&&(y(),y=void 0),this.liMap=new Map,this.container.classList.add("input-select");const t=this.selectWrapper=document.createElement("div");t.classList.add("select-wrapper","z-depth-3","hide");const i=document.createElement("span");i.classList.add("arrow","arrow-down"),this.container.append(i);const f=document.createElement("ul");t.appendChild(f),new g.ZP(t);let m=()=>{m=null,v.forEach((t=>{const i=(0,p.Ml)(t.iso2),n=[];for(let a=0,o=Math.min(t.country_codes.length,e.noPhoneCodes?1:1/0);a{if(0!==e.button)return;const t=(0,o.Z)(e.target,"LI");this.selectCountryByTarget(t)})),this.container.appendChild(t)};m(),this.input.addEventListener("focus",(e=>{m?m():v.forEach((e=>{this.liMap.get(e.iso2).forEach((e=>e.style.display=""))})),clearTimeout(this.hideTimeout),this.hideTimeout=void 0,t.classList.remove("hide"),t.offsetWidth,t.classList.add("active"),this.select(),(0,l.Z)({container:(0,a.Z)(this.container,"scrollable-y"),element:this.input,position:"start",margin:4}),setTimeout((()=>{b||(document.addEventListener("mousedown",w,{capture:!0}),b=!0)}),0)}));let b=!1;const w=e=>{(0,a.Z)(e.target,"input-select")||e.target!==this.input&&(this.hidePicker(),document.removeEventListener("mousedown",w,{capture:!0}),b=!1)},S=e=>{const t=e.key;if(e.ctrlKey||"Control"===t)return!1;const i=this.value.toLowerCase(),s=[];v.forEach((e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach((e=>{const i=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");i.length>1&&t.push(i)}));const n=!!t.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(i)));this.liMap.get(e.iso2).forEach((e=>e.style.display=n?"":"none")),n&&s.push(e)})),0===s.length?v.forEach((e=>{this.liMap.get(e.iso2).forEach((e=>e.style.display=""))})):1===s.length&&"Enter"===t&&((0,n.Z)(e),this.selectCountryByTarget(this.liMap.get(s[0].iso2)[0]))};this.input.addEventListener("keyup",S),this.input.addEventListener("keydown",(e=>{"Enter"===e.key&&S(e)})),i.addEventListener("mousedown",(e=>{this.input.matches(":focus")?(this.hidePicker(),this.input.blur()):(e.cancelBubble=!0,e.preventDefault(),this.input.focus())}))}getSelected(){return{country:this.lastCountrySelected,code:this.lastCountryCodeSelected}}selectCountryByIso2(e){this.selectCountryByTarget(this.liMap.get(e)[0])}override(e,t,i){var s,n;(0,r.Z)(this.input,e?(0,h.ag)(e.default_name):i),this.lastCountrySelected=e,this.lastCountryCodeSelected=t,null===(n=(s=this.options).onCountryChange)||void 0===n||n.call(s,this.lastCountrySelected,this.lastCountryCodeSelected)}}},2621:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(187),n=i(8119),a=i(5953),o=i(1507);class r{constructor(e){this._disabled=!1,this.avatarSize=120,this.isChanged=()=>{if(this.uploadAvatar)return!0;let e=0,t=0,i=0;return this.inputFields.forEach((s=>{s.isValid()&&(s.isChanged()&&++e,s.required&&++i),s.required&&++t})),t===i&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},(0,a.Z)(this,e),this.peerId||(this.peerId=o.NM),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=(0,n.Z)({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 s.Z((e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()})),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach((e=>{this.listenerSetter.add(e.input)("input",this.handleChange)})),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach((t=>t.input.toggleAttribute("disabled",e))),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then((()=>{t&&(this.disabled=!1)}),(()=>{this.disabled=!1}))}}},3173:(e,t,i)=>{"use strict";i.d(t,{Yd:()=>Y,Jo:()=>X,ZP:()=>te});var s=i(5432),n=i(4846),a=i(3512),o=i(5814),r=i(6008),d=i(2153),l=i(4332),c=i(5117),h=i(6039),u=i(1080),f=i(8805),p=i(279),m=i(2738);class g{constructor(e){this.managers=e}init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;(0,m.fc)(e,X.onMediaClick);const t=this.scrollable=new f.ZP(this.content,"GIFS"),i=new u.Z(e,Y,t),s=(0,p.y)(this.content,!0);this.managers.appDocsManager.getGifs().then((e=>{e.forEach((e=>{i.add(e)})),s.remove()})),te.addLazyLoadQueueRepeat(i.lazyLoadQueue,i.processInvisibleDiv),this.init=null}onClose(){}}var v=i(6057),b=i(410),y=i(3552),w=i(3607),S=i(4755),C=i(8497),L=i(1507),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const I="GIFS-SEARCH";class M extends y._{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>E(this,void 0,void 0,(function*(){const t=(0,C.Z)(e.target,"gif");if(!t)return;const i=t.dataset.docId;(yield n.Z.chat.input.sendMessageWithDocument(i))?S.Z.isMobile&&l.ZP.onCloseBtnClick():console.warn("got no doc by id:",i)}))}init(){this.container.id="search-gifs-container",this.inputSearch=new w.Z("SearchGifsTitle",(e=>{this.reset(),this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),(0,m.fc)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new u.Z(this.gifsDiv,I,this.scrollable),l.ZP.toggleSidebar(!0).then((()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}))}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",o.Z.checkAnimations(void 0,I),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}search(e,t=!0){return E(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield this.managers.appUsersManager.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=this.managers.appInlineBotsManager.getInlineResults(L.NM,this.gifBotPeerId,e,this.nextOffset);const{results:i,next_offset:s}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=s,t&&(this.gifsDiv.innerHTML=""),i.length?i.forEach((e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)})):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}}))}}var P=i(6787),Z=i(2325),k=i(7625),T=i(130),x=i(8115),A=i(9259),_=i(3541);class F extends y._{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new d.Z,this.inputSearch=new w.Z("StickersTab.SearchPlaceholder",(e=>{this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),(0,A.Z)({listenTo:this.setsDiv,listenerSetter:this.listenerSetter}),(0,m.fc)(this.setsDiv,(e=>{const t=(0,C.Z)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void n.Z.chat.input.sendMessageWithDocument(e)}const i=(0,C.Z)(e.target,"sticker-set");if(!i)return;const s=i.dataset.stickerSet,a=i.dataset.access_hash,o=(0,C.Z)(e.target,"sticker-set-button");o?(e.preventDefault(),e.cancelBubble=!0,o.setAttribute("disabled","true"),this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{this.managers.appStickersManager.toggleStickerSet(e.set).then((t=>{t&&(o.textContent="",o.append((0,Z.ag)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),o.classList.toggle("gray",!!e.set.installed_date))})).finally((()=>{o.removeAttribute("disabled")}))}))):this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{new P.Z(e.set).show()}))}),{listenerSetter:this.listenerSetter}),l.ZP.toggleSidebar(!0).then((()=>{this.renderFeatured()}))}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const i=document.createElement("div");i.classList.add("sticker-set-header");const s=document.createElement("div");s.classList.add("sticker-set-details"),s.innerHTML='
',(0,T.Z)(s.firstElementChild,(0,x.Z)(e.title));const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append((0,Z.ag)("Stickers",[e.count])),s.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append((0,Z.ag)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),i.append(s,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.inputSearch.value||(e=this.filterRendered("",e)).forEach((e=>{this.renderSet(e.set)}))}))}filterRendered(e,t){t=t.slice();const i=Array.from(this.setsDiv.children);return(0,k.Z)(i,(i=>{const s=i.dataset.stickerSet,n=t.findIndex((e=>e.set.id===s));-1!==n?t.splice(n,1):e&&i.dataset.title.toLowerCase().includes(e.toLowerCase())||i.remove()})),o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?this.managers.appStickersManager.searchStickerSets(e,!1).then((t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach((e=>{this.renderSet(e.set)}))})):this.renderFeatured()}}var D,R=i(4668),B=i(8799),N=i(2648),O=i(3910),U=i(6339),H=i(5418),z=i(4762),j=i(3815),G=i(319),V=i(4789),K=i(6802),W=i.n(K),$=i(669),q=i(3299),Q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Y="emoticons-dropdown",J={forceDuration:200,transitionFunction:W()(.42,0,.58,1)};class X extends U.Z{constructor(){super({element:document.getElementById("emoji-dropdown"),ignoreOutClickClassName:"input-message-input"}),this.tabId=-1,this.onSelectTabClick=e=>{if(this.tabId!==e)o.Z.checkAnimations(!0,Y),this.tabId=e,this.searchButton.classList.toggle("hide",this.tabId===this.emojiTab.tabId),this.deleteBtn.classList.toggle("hide",this.tabId!==this.emojiTab.tabId);else{const{tab:e}=this;this.scrollTo(e,e.scrollable.container.firstElementChild)}},this.checkRights=()=>Q(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=n.Z.chat,i=this.tabsEl.children,s=Array.from(i),[a,o]=yield Promise.all([this.managers.appMessagesManager.canSendToPeer(e,t,"send_stickers"),this.managers.appMessagesManager.canSendToPeer(e,t,"send_gifs")]);s[this.stickersTab.tabId+1].toggleAttribute("disabled",!a),s[this.gifsTab.tabId+1].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||(0,N.Z)(r)===this.emojiTab.tabId+1||a&&o||this.selectTab(this.emojiTab.tabId,!1)})),this.addEventListener("open",(()=>Q(this,void 0,void 0,(function*(){var e;s.Z&&(0,B.Z)()&&(yield(0,H.Z)(100)),this.element.parentElement!==n.Z.chat.input.chatInput&&n.Z.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),X.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y);const t=this.tab;null===(e=t.onOpen)||void 0===e||e.call(t)})))),this.addEventListener("opened",(()=>{var e;o.Z.unlockIntersectionGroup(Y),X.lazyLoadQueue.unlockAndRefresh();const t=this.tab;null===(e=t.onOpened)||void 0===e||e.call(t)})),this.addEventListener("close",(()=>{var e;X.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y),o.Z.checkAnimations(!0,Y);const t=this.tab;null===(e=t.onClose)||void 0===e||e.call(t)})),this.addEventListener("closed",(()=>{var e;o.Z.unlockIntersectionGroup(Y),X.lazyLoadQueue.unlock(),X.lazyLoadQueue.refresh(),this.savedRange=void 0;const t=this.tab;null===(e=t.onClosed)||void 0===e||e.call(t)}))}get tab(){return this.tabs[this.tabId]}init(){this.managers=a.Z.managers,this.emojiTab=new h.ZP(this.managers),this.stickersTab=new v.ZP(this.managers),this.gifsTab=new g(this.managers),this.tabs={},[this.emojiTab,this.stickersTab,this.gifsTab].forEach(((e,t)=>{e.tabId=t,this.tabs[t]=e})),this.container=this.element.querySelector(".emoji-container .tabs-container"),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=(0,r.X)(this.tabsEl,this.container,this.onSelectTabClick,(()=>{var e;const{tab:t}=this;null===(e=t.init)||void 0===e||e.call(t),o.Z.checkAnimations(!1,Y)})),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",(()=>{this.tabId===this.stickersTab.tabId?l.ZP.isTabExists(F)||l.ZP.createTab(F).open():l.ZP.isTabExists(M)||l.ZP.createTab(M).open()})),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),(0,m.fc)(this.deleteBtn,(e=>{(0,O.Z)(e);const t=n.Z.chat.input.messageInput;let i=$.Z.getInstance().getSavedRange(t);i||(i=document.createRange(),i.setStartAfter(t.lastChild));const s=i.cloneRange();if(i.collapsed){const{node:e,offset:n}=(0,q.q)(t,i.endContainer,i.endOffset);let a;if(n)a=e;else{if(a=e.previousSibling,!a)return;for(;a.nodeType===a.TEXT_NODE&&!a.nodeValue&&(a=a.previousSibling););if(a.nodeType===a.ELEMENT_NODE&&!a.isContentEditable)return}if(a.nodeType===a.ELEMENT_NODE&&"IMG"===a.tagName)s.selectNode(a);else{const e=[...a.textContent];let t;if(n){let i=0;t=e.find((e=>(i+=e.length,i>=n)))}else t=e.pop()||"";const i=n?n-t.length:a.textContent.length-t.length;s.setStart(a,i)}}s.deleteContents(),n.Z.chat.input.messageInputField.simulateInputEvent()}));const e=z.IS_APPLE_MOBILE&&!1,t=e?this.stickersTab.tabId:this.emojiTab.tabId;if(e&&this.tabsEl.children[1].classList.add("hide"),(0,m.tH)(this.tabsEl.children[t+1]),this.tabs[t].init&&this.tabs[t].init(),!s.Z){let e,t=!1;const i=t=>{e=t};j.Z.addEventListener("change",(s=>{s?t||(document.body.addEventListener("mousemove",i),t=!0):t&&(document.body.removeEventListener("mousemove",i),e&&this.onMouseOut(e))}))}return n.Z.addEventListener("peer_changing",(()=>{this.toggle(!1)})),n.Z.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}getElement(){return this.element}scrollTo(e,t){e.scrollable.scrollIntoViewNew(Object.assign({element:t,axis:"y",position:"start"},J))}static sendDocId(e,t,i){return Q(this,void 0,void 0,(function*(){return(yield n.Z.chat.input.sendMessageWithDocument(e,void 0,t,i))?(ee.container&&(ee.forceClose=!0,ee.toggle(!1)),!0):(console.warn("got no doc by id:",e),!1)}))}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",(()=>{e.lock()})),this.addEventListener("closed",(()=>{const i=e.intersector.getVisible();for(const e of i)t(e);e.intersector.clearVisible()})),this.addEventListener("opened",(()=>{e.unlockAndRefresh()}))}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===n.Z.chat.input.messageInput)return e.getRangeAt(0)}}D=X,X.lazyLoadQueue=new d.Z(1),X.menuOnClick=(e,t,i,s,n)=>{let a=-1;const o=(e,t=!0)=>{if(e===n)return!1;let i=!1;return n&&(n.elements.menuTab.classList.remove("active"),n.menuScroll&&n.menuScroll!==e.menuScroll&&(i=!0,n.menuScroll.container.parentElement.classList.remove("active"),n.menuScroll.scrollIntoViewNew(Object.assign({element:n.menuScroll.container.firstElementChild,forceDirection:t?void 0:V.f.Static,position:"center",axis:"x"},J)))),e.elements.menuTab.classList.add("active"),e.menuScroll&&(e.menuScroll.container.parentElement.classList.add("active"),t&&s.scrollIntoViewNew(Object.assign({element:e.menuScroll.container.parentElement,position:"center",axis:"x"},J))),n&&((e,t)=>{const i=e.menuScroll||s;i&&i.scrollIntoViewNew(Object.assign({element:e.elements.menuTab,position:"center",axis:"x",getElementPosition:t?({elementPosition:e})=>e-106:void 0},J))})(e,i),n=e,!0};let r=!1;const d=new c.Z(i.container,((t,s)=>{if(r)return;if(Math.abs(a-i.container.scrollTop)<=1)return;a=-1;const n=e.getCategoryByContainer(s),d=(0,N.Z)(s);(t||!d&&!n.menuScroll)&&o(n)}));t.addEventListener("click",(t=>{let s=(0,C.Z)(t.target,"menu-horizontal-div-item");if(!s){if(s=(0,C.Z)(t.target,"menu-horizontal-inner"),!s||s.classList.contains("active"))return;s=s.firstElementChild.firstElementChild}const n=(0,N.Z)(s),d=e.getCategoryByMenuTab(s);o(d);let l=0,c=0;if(n>0||d.menuScroll){const e=d.elements.container;c=1,l=e.offsetTop+c}a=l,r=!0,i.scrollIntoViewNew(Object.assign({element:l?d.elements.container:i.container.firstElementChild,position:"start",axis:"y",getElementPosition:l?({elementPosition:e})=>e+c:void 0},J)).finally((()=>{o(d),r=!1}))}));const l=i.onAdditionalScroll?i.onAdditionalScroll.bind(i):G.Z;return i.onAdditionalScroll=()=>{e.content.parentElement.classList.toggle("scrolled-top",!i.scrollTop),l()},{stickyIntersector:d,setActive:o,setActiveStatic:t=>{if(null==n?void 0:n.local)return;e.scrollable.scrollTop=t.elements.container.offsetTop+1;const i=e.menuScroll.container,s=t.elements.menuTab;i.scrollLeft=s.offsetLeft-i.clientWidth/2+s.offsetWidth/2,o(t,!1)}}},X.onMediaClick=(e,t=!1,i)=>Q(void 0,void 0,void 0,(function*(){const s=(0,R.Z)(e.target,"DIV");if(!s)return!1;const n=s.dataset.docId;return!!n&&D.sendDocId(n,t,i)}));const ee=new X;b.GO.emoticonsDropdown=ee;const te=ee},6039:(e,t,i)=>{"use strict";i.d(t,{IA:()=>F,ZP:()=>H,xG:()=>D});var s=i(3173),n=i(3910),a=i(8497),o=i(3035),r=i(5418),d=i(4846),l=i(3512),c=i(671),h=i(279),u=i(8805),f=i(9976),p=i(5432),m=i(8799),g=i(3447),v=i(7746),b=i(8115),y=i(7197),w=i(4776),S=i(2738),C=i(6057),L=i(9405),E=i(2940),I=i(4755),M=i(1273),P=i(9259),Z=i(3699),k=i(4064),T=i(4484),x=i(6787),A=i(2796);const _=new Set;function F(e,t,i=!1,s=!1){var n;const a=document.createElement("span");let r;if(a.classList.add("super-emoji"),s&&!f.Z?r=function(e){return(0,w.ZP)(e,{entities:[(0,y.Z)(e)]})}(e):(e=(0,v.Z)(e),r=(0,b.Z)(e)),a.append(r),a.children.length>1){const e=a.firstElementChild;a.innerHTML="",a.append(e)}if("IMG"===(null===(n=a.firstElementChild)||void 0===n?void 0:n.tagName)){const e=a.firstElementChild,t=e.src;if(!_.has(t)){e.setAttribute("loading","lazy");const i=document.createElement("span");i.classList.add("emoji-placeholder"),l.Z.settings.animationsEnabled&&(e.style.opacity="0",i.style.opacity="1"),e.addEventListener("load",(()=>{(0,o.T2)((()=>{l.Z.settings.animationsEnabled&&(e.style.opacity="",i.style.opacity=""),a.classList.remove("empty"),_.add(t)}))}),{once:!0}),a.append(i)}}return t&&(i?t.prepend(a):t.appendChild(a)),a}function D(e){const t=(0,a.Z)(e,"super-emoji");if(!t)return;const i=t.firstElementChild;return i&&i.classList.contains("custom-emoji")?{emoji:i.dataset.stickerEmoji,docId:i.dataset.docId}:e.nodeType===e.TEXT_NODE?{emoji:e.nodeValue}:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),{emoji:e.getAttribute("alt")||e.innerText})}const R="Emoji.Recent",B=[R,"recent"],N=["",""],O=[["Emoji.SmilesAndPeople","smile"],["Emoji.AnimalsAndNature","animals"],["Emoji.FoodAndDrink","eats"],["Emoji.TravelAndPlaces","car"],["Emoji.ActivityAndSport","sport"],["Emoji.Objects","lamp"],["Emoji.Flags","flag"],["Skin Tones",""]],U=(0,L.C)(42,42);class H extends C.pw{constructor(e){super(e,"super-emojis",(()=>U),16,4,0),this.onCategoryVisibility=({target:e,visible:t})=>{const i=this.categoriesMap.get(e),s=i.elements.renderer,n=[];if(s){n.push(s);const e=new Map;t?(n.push(...i.items.map((({docId:t,element:i})=>{const s=i.firstElementChild;return s.clear(!1),e.set(s.docId,new Set([s])),i}))),s.add(e,void 0,void 0,!1)):(s.clearCanvas(),s.middlewareHelper.clean())}else t&&n.push(...i.items.map((({element:e})=>e)));if(i.elements.items.replaceChildren(...n),s&&!t){const e=new Map;i.items.forEach((({element:t})=>{const i=t.firstElementChild;i.clear(),e.set(i.docId,new Set([i]))})),s.add(e,void 0,!0)}},this.onContentClick=e=>{(0,n.Z)(e);const{target:t}=e;if((0,a.Z)(t,"category-title")){const e=(0,a.Z)(t,"emoji-category"),i=this.categoriesMap.get(e);if(i.local)return;return void new x.Z({id:i.set.id,access_hash:i.set.access_hash},!0).show()}const i=D(t);if(i){if(i.docId&&!l.Z.premium&&this.peerId!==l.Z.myId){const e=document.createElement("a");return e.onclick=()=>{d.Z.openUsername({userName:"premiumbot"}),(0,A.PE)()},void(0,A.bC)({langPackKey:"CustomEmoji.PremiumAlert",langPackArguments:[e]})}d.Z.chat.input.onEmojiSelected(i,!1),p.Z&&(0,m.Z)()}}}init(){super.init(),this.content=document.getElementById("content-emoji");const e=this.content.previousElementSibling,t=this.menu=e.firstElementChild,i=this.menuScroll=new u.v7(e),n=this.scrollable=new u.ZP(this.content,"EMOJI"),a={root:s.ZP.getElement()};this.categoriesIntersector=new E.Z(this.onCategoryVisibility,a),this.menuOnClickResult=s.Jo.menuOnClick(this,t,n,i,void 0);const o=(0,h.y)(this.content,!0),f=new u.v7(void 0);f.container.classList.add("menu-horizontal-inner-scroll");const p=document.createElement("div");p.classList.add("menu-horizontal-inner"),p.append(f.container),function(){let e=new Map([[N,[]],[B,[]]]);for(const t in g.Z){const i=""+g.Z[t],s=O[+i[0]-1];if(!s)continue;let n=e.get(s);n||(n=[],e.set(s,n)),n[+i.slice(1)||0]=t}e.delete(O.pop()),O.unshift(N,B);const t=O.map((([e])=>e)),i=[...e.entries()].sort(((e,i)=>t.indexOf(e[0][0])-t.indexOf(i[0][0])));return e=new Map(i),e}().forEach(((e,[t,i])=>{const s=this.createLocalCategory(t,t,i,!i);s.elements.container.classList.remove("hide"),s.elements.items.classList.add(i?"is-local":"not-local"),e.forEach((e=>{const t=(0,c.zu)(e);this.addEmojiToCategory(s,{emoji:t},!0)}))})),Promise.all([(0,r.Z)(200),this.managers.appEmojiManager.getRecentEmojis("native"),this.managers.appEmojiManager.getRecentEmojis("custom"),this.managers.appEmojiManager.getCustomEmojis()]).then((([e,t,i,n])=>{o.remove();const a=this.categories["Emoji.Recent"],r=this.categories[""];[[a,t],[r,i]].forEach((([e,t])=>{e.limit=32,t.splice(32,t.length-32)}));for(const e of t)this.addEmojiToCategory(a,{emoji:e},!0);this.createRendererForCategory(r);for(const e of i)this.addEmojiToCategory(r,{emoji:"",docId:e},!0);r.elements.container.style.paddingTop=".5rem",O.forEach((([e])=>{const t=this.categories[e];this.toggleLocalCategory(t,!0),e!==R&&""!==e&&(t.menuScroll=f,f.container.append(t.elements.menuTab))})),this.resizeCategories(),a.elements.menuTab.after(p),n.sets.forEach((e=>{this.renderStickerSet(e)})),l.Z.addEventListener("premium_toggle",(()=>{this.toggleCustomCategory()})),l.Z.addEventListener("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),s.ZP.addEventListener("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))})));const c=e=>{for(const t in this.categories){const i=this.categories[t].elements.renderer;i&&(i.ignoreSettingDimensions=e,e||i.setDimensionsFromRect(void 0,!0))}};s.ZP.addEventListener("opened",(()=>{c(!1)})),s.ZP.addEventListener("close",(()=>{c(!0)})),l.Z.addEventListener("stickers_installed",(e=>{!this.categories[e.id]&&e.pFlags.emojis&&this.renderStickerSet(e,!0)})),l.Z.addEventListener("stickers_deleted",(e=>{const t=this.categories[e.id];if(this.deleteCategory(t)){const{renderer:e}=t.elements;e&&e.middlewareHelper.clean()}})),l.Z.addEventListener("emoji_recent",this.postponedEvent((e=>{const t=this.categories[e.docId?"":R],i=e.docId?t=>t.docId===e.docId:t=>t.emoji===e.emoji,s=(0,k.Z)(t.items,i);if(s){if(t.items.unshift(s),this.isCategoryVisible(t)){const{renderer:e}=t.elements;(0,T.Z)(s.element,t.elements.items,e?1:0,-1),null==e||e.forceRender()}}else this.addEmojiToCategory(t,e,!1,!0);0===this.closeScrollTop&&this.menuOnClickResult.setActive(e.docId?this.categories["Emoji.Recent"]:t)}))),d.Z.addEventListener("peer_changed",(()=>{this.toggleCustomCategory()})),this.toggleCustomCategory(),this.menuOnClickResult.setActive(a)})),(0,S.fc)(this.content,this.onContentClick),(0,P.Z)({listenTo:this.content,listenerSetter:new Z.Z}),this.init=null}renderStickerSet(e,t){const i=this.createCategory(e,(0,b.Z)(e.title));this.positionCategory(i,t);const{container:n,menuTabPadding:a}=i.elements;i.elements.items.classList.add("not-local"),i.elements.container.classList.add("is-premium-set"),i.elements.title.classList.add("tgico"),this.createRendererForCategory(i),this.managers.appStickersManager.getStickerSet(e).then((({documents:e})=>{e.forEach((e=>{this.addEmojiToCategory(i,{docId:e.id,emoji:e.stickerEmojiRaw},!0)})),this.onCategoryVisibility({target:i.elements.container,visible:this.isCategoryVisible(i)}),i.setCategoryItemsHeight(),n.classList.remove("hide")})),(0,M.Z)({set:e,container:a,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}get peerId(){return d.Z.chat.peerId}toggleCustomCategory(){const e=this.categories[""],t=l.Z.premium||this.peerId===l.Z.myId;super.toggleLocalCategory(e,!!e.items.length&&t),this.content.classList.toggle("has-premium",t)}toggleLocalCategory(e,t){""!==e.id?super.toggleLocalCategory(e,t):this.toggleCustomCategory()}createRendererForCategory(e){const t=w.KZ.create({animationGroup:s.Yd,customEmojiSize:I.Z.active.esgCustomEmoji});e.elements.renderer=t,e.elements.items.append(t)}addEmojiToCategory(e,t,i,s){let n;if(t.docId){const e=w.LD.create(t.docId),i=document.createElement("span");i.classList.add("super-emoji"),i.append(e),n=i}else n=F(t.emoji,void 0,!1);const a=Object.assign(Object.assign({},t),{element:n});e.items[s?"unshift":"push"](a),i||this.spliceExceed(e)||this.onLocalCategoryUpdate(e)}onClose(){this.closeScrollTop=this.scrollable.scrollTop}}},6057:(e,t,i)=>{"use strict";i.d(t,{pw:()=>_,vT:()=>x,ZP:()=>F});var s=i(3173),n=i(8497),a=i(4755),o=i(2325),r=i(8115),d=i(3512),l=i(5814),c=i(1655),h=i(7009),u=i(2940);class f extends h.Z{constructor(e,t,i){super(e),this.onVisibilityChange=t,this.elementsMap=new Map,this.intersector=new u.Z((e=>{var t;const{target:i,visible:s}=e,n=this.elementsMap.get(i);n.visible=s,s?(n.wasSeen=!0,this.queue.includes(n)||this.queue.push(n)):(0,c.Z)(this.queue,n),null===(t=this.onVisibilityChange)||void 0===t||t.call(this,e),this.setProcessQueueTimeout()}),i)}clear(){super.clear(),this.elementsMap.clear()}observe(e){this.elementsMap.set(e.div,e),super.observe(e)}unobserve(e){this.elementsMap.delete(e.div),super.unobserve(e)}}var p=i(279),m=i(6787),g=i(8805),v=i(4064),b=i(2738),y=i(4484),w=i(319),S=i(2230),C=i(5592),L=i(748),E=i(5975),I=i(7625),M=i(9259),P=i(3699),Z=i(3541),k=i(1273),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x{constructor(e,t,i,s){this.regularLazyLoadQueue=e,this.group=t,this.managers=i,this.options=s,this.animated=new Set,this.checkAnimationContainer=(e,t)=>{l.Z.getAnimations(e).forEach((e=>{t?l.Z.checkAnimation(e,!1):l.Z.removeAnimation(e)}))},this.processVisible=e=>T(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t),s=a.Z.active.esgSticker.width,n=(0,Z.ZP)({doc:i,div:e,width:s,height:s,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0,withLock:!0}).then((({render:e})=>e));return n.then((()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))})),n})),this.processInvisible=e=>T(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t);this.checkAnimationContainer(e,!1),e.textContent="",this.renderSticker(i,e)})),this.lazyLoadQueue=new f(void 0,(({target:e,visible:t})=>{t||this.processInvisible(e)}),s)}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,i){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),t.dataset.docId=""+e.id,e.animated&&this.observeAnimated(t)),(0,Z.ZP)({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:e.animated,loadPromises:i}),t}observeAnimated(e){this.animated.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisible})}unobserveAnimated(e){this.animated.delete(e),this.lazyLoadQueue.delete({div:e})}}class A{constructor(e){var t,i;const s=document.createElement("div");s.classList.add("emoji-category");const n=document.createElement("div");let a,o,r;n.classList.add("category-items"),e.title&&(a=document.createElement("div"),a.classList.add("category-title"),a.append(e.title)),e.noMenuTab||(o=(0,S.Z)(void 0,{noRipple:!0}),o.classList.add("menu-horizontal-div-item"),r=document.createElement("div"),r.classList.add("menu-horizontal-div-item-padding"),o.append(r)),a&&s.append(a),s.append(n),this.elements={container:s,title:a,items:n,menuTab:o,menuTabPadding:r},this.id=e.id,this.items=[],this.getContainerSize=e.getContainerSize,this.getElementMediaSize=e.getElementMediaSize,this.gapX=null!==(t=e.gapX)&&void 0!==t?t:0,this.gapY=null!==(i=e.gapY)&&void 0!==i?i:0}setCategoryItemsHeight(){const{width:e}=this.getContainerSize(),t=this.getElementMediaSize().width;let i=e/t;this.gapX&&(i-1)*this.gapX>e&&--i,i=Math.floor(i);const s=Math.ceil(this.items.length/i);let n=s*t;this.gapY&&(n+=(s-1)*this.gapY),this.elements.items.style.minHeight=n+"px"}}class _{constructor(e,t,i,n,a,o){this.managers=e,this.categoryItemsClassName=t,this.getElementMediaSize=i,this.padding=n,this.gapX=a,this.gapY=o,this.mounted=!1,this.resizeCategories=()=>{for(const[e,t]of this.categoriesMap)t.setCategoryItemsHeight()},this.postponedEvent=e=>(...t)=>{s.ZP.isActive()?this.postponedEvents.push({cb:e,args:t}):e(...t)},this.categories={},this.categoriesMap=new Map,this.categoriesByMenuTabMap=new Map,this.localCategories=[],this.postponedEvents=[]}getCategoryByContainer(e){return this.categoriesMap.get(e)}getCategoryByMenuTab(e){return this.categoriesByMenuTabMap.get(e)}createCategory(e,t,i,s){const n=new A({id:""+e.id,title:t,overflowElement:this.content,getContainerSize:()=>{const{width:e,height:t}=this.content.getBoundingClientRect();return{width:e-this.padding,height:t}},getElementMediaSize:this.getElementMediaSize,gapX:this.gapX,gapY:this.gapY,noMenuTab:s});this.categoryItemsClassName&&n.elements.items.classList.add(this.categoryItemsClassName);const a=n.elements.container;return a.classList.add("hide"),n.set=e,this.categories[e.id]=n,this.categoriesMap.set(a,n),!s&&this.categoriesByMenuTabMap.set(n.elements.menuTab,n),this.categoriesIntersector.observe(a),!s&&this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(a),i||!s&&n.elements.menuTab.classList.add("not-local"),n}positionCategory(e,t){const{menuTab:i,container:s}=e.elements,n=t?this.localCategories.filter((e=>e.mounted)).length:65535;let a=!1;const o=t?this.localCategories.filter((e=>e.menuScroll&&!a?(a=!0,!0):e.mounted&&!e.menuScroll&&e.elements.menuTab)).length:65535;(0,y.Z)(s,this.scrollable.container,n),(0,y.Z)(i,this.menu,o)}isCategoryVisible(e){return this.categoriesIntersector.getVisible().includes(e.elements.container)}toggleLocalCategory(e,t){var i;if(t){const t=this.localCategories.indexOf(e),i=this.localCategories.slice(0,t);let s=0,n=0;i.forEach((e=>{e.mounted?e.elements.menuTab&&!e.menuScroll||++n:(++s,++n)}));const a=t-s,o=t-n;e.elements.menuTab&&(0,y.Z)(e.elements.menuTab,this.menu,o),(0,y.Z)(e.elements.container,this.scrollable.container,a)}else null===(i=e.elements.menuTab)||void 0===i||i.remove(),e.elements.container.remove();e.mounted=t}createLocalCategory(e,t,i,s){const n=this.createCategory({id:e},t&&(0,o.ag)(t),!0,s);return n.local=!0,this.localCategories.push(n),n.elements.title&&n.elements.title.classList.add("disable-hover"),s||(i&&n.elements.menuTab.classList.add("tgico","tgico-"+i),n.elements.menuTabPadding.remove()),this.toggleLocalCategory(n,!1),n}onLocalCategoryUpdate(e){e.setCategoryItemsHeight(),this.toggleLocalCategory(e,!!e.items.length)}deleteCategory(e){return!!e&&(e.elements.container.remove(),e.elements.menuTab.remove(),this.categoriesIntersector.unobserve(e.elements.container),delete this.categories[e.id],this.categoriesMap.delete(e.elements.container),this.categoriesByMenuTabMap.delete(e.elements.menuTab),!0)}spliceExceed(e){if(void 0===e.limit)return!1;const{items:t,limit:i}=e;return t.splice(i,t.length-i).forEach((({element:e})=>{e.remove()})),this.onLocalCategoryUpdate(e),!0}init(){s.ZP.addEventListener("closed",(()=>{this.postponedEvents.forEach((({cb:e,args:t})=>{e(...t)})),this.postponedEvents.length=0}))}}class F extends _{constructor(e){super(e,"super-stickers",(()=>a.Z.active.esgSticker),6,4,4),this.onCategoryVisibility=({target:e,visible:t,entry:i})=>{const s=this.categoriesMap.get(e);s.elements.items.replaceChildren(...t?s.items.map((({element:e})=>e)):[])},this.setTyping=(e=!1)=>{(e||s.ZP.isActive()&&s.ZP.tab===this)&&d.Z.dispatchEvent("choosing_sticker",!e)}}setFavedLimit(e){this.categories.faved.limit=e}categoryAppendStickers(e,t){const{container:i}=e.elements;t.then((t=>{const s=this.isCategoryVisible(e);t.forEach((t=>{const i=this.superStickerRenderer.renderSticker(t);e.items.push({document:t,element:i}),s&&e.elements.items.append(i)})),e.setCategoryItemsHeight(),i.classList.remove("hide")}))}renderStickerSet(e,t=!1){return T(this,void 0,void 0,(function*(){const i=this.createCategory(e,(0,r.Z)(e.title)),{menuTabPadding:n}=i.elements,a=this.managers.appStickersManager.getStickerSet(e);this.categoryAppendStickers(i,a.then((e=>e.documents))),this.positionCategory(i,t),(0,k.Z)({set:e,container:n,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){super.init(),this.content=document.getElementById("content-stickers");const e=this.content.previousElementSibling,t=this.menu=e.firstElementChild,i=this.menuScroll=new g.v7(e);this.scrollable=new g.ZP(this.content,"STICKERS"),this.scrollable.onAdditionalScroll=()=>{this.setTyping()};const o={root:s.ZP.getElement()};this.categoriesIntersector=new u.Z(this.onCategoryVisibility,o);const r=e=>{e.elements.items.replaceChildren(),e.items.forEach((({element:e})=>this.superStickerRenderer.unobserveAnimated(e))),e.items.length=0};this.scrollable.container.addEventListener("click",(e=>{const t=e.target;if((0,n.Z)(t,"category-title")){const e=(0,n.Z)(t,"emoji-category"),i=this.categoriesMap.get(e);if(i.local)return;new m.Z({id:i.set.id,access_hash:i.set.access_hash}).show()}else s.Jo.onMediaClick(e)})),this.menuOnClickResult=s.Jo.menuOnClick(this,t,this.scrollable,i);const l=(0,p.y)(this.content,!0),c=(e,t)=>{e.limit&&(t=t.slice(0,e.limit));const i=new Set(t.map((e=>e.id)));(0,I.Z)(e.items,(t=>{i.has(t.document.id)||this.deleteSticker(e,t.document,!0)})),this.toggleLocalCategory(e,!!t.length),(0,I.Z)(t,((t,i)=>{this.unshiftSticker(e,t,!0,i)})),this.spliceExceed(e),e.elements.container.classList.remove("hide")},h=this.createLocalCategory("faved","FavoriteStickers","savedmessages"),f=this.createLocalCategory("recent","Stickers.Recent","recent");f.limit=20;const v=(0,S.Z)("close",{noRipple:!0});f.elements.title.append(v),(0,b.fc)(v,(()=>{(0,C.Z)({titleLangKey:"ClearRecentStickersAlertTitle",descriptionLangKey:"ClearRecentStickersAlertMessage",button:{langKey:"Clear"}}).then((()=>{this.managers.appStickersManager.clearRecentStickers()}),w.Z)}));const y=this.createLocalCategory("premium","PremiumStickersShort"),Z=document.createElement("span");Z.classList.add("tgico-star","color-premium"),y.elements.menuTab.append(Z);const k=[Promise.all([this.managers.apiManager.getLimit("favedStickers"),this.managers.appStickersManager.getFavedStickersStickers()]).then((([e,t])=>{this.setFavedLimit(e),c(h,t)})),this.managers.appStickersManager.getRecentStickersStickers().then((e=>{c(f,e)})),this.managers.appStickersManager.getAllStickers().then((e=>{for(const t of e.sets)this.renderStickerSet(t)})),this.managers.appStickersManager.getPremiumStickers().then((e=>{const t=e.length;this.toggleLocalCategory(y,d.Z.premium&&!!t),this.categoryAppendStickers(y,Promise.resolve(e)),d.Z.addEventListener("premium_toggle",(e=>{this.toggleLocalCategory(this.categories.premium,e&&!!t)}))}))];Promise.race(k).finally((()=>{l.remove()})),Promise.all(k).finally((()=>{this.mounted=!0,this.setTyping();const e=this.categories.faved,t=this.categories.recent;this.menuOnClickResult.setActive(e.items.length?e:t),d.Z.addEventListener("stickers_installed",(e=>{this.categories[e.id]||this.renderStickerSet(e,!0)}))})),this.superStickerRenderer=new x(s.Jo.lazyLoadQueue,s.Yd,this.managers,o);const T=this.superStickerRenderer.lazyLoadQueue;s.ZP.addLazyLoadQueueRepeat(T,this.superStickerRenderer.processInvisible),d.Z.addEventListener("sticker_updated",(({type:e,document:t,faved:i})=>{const s=this.categories["faved"===e?"faved":"recent"];s&&(i?this.unshiftSticker(s,t):this.deleteSticker(s,t))})),d.Z.addEventListener("stickers_deleted",(({id:e})=>{const t=this.categories[e];this.deleteCategory(t)&&r(t)})),d.Z.addEventListener("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),s.ZP.addEventListener("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))}))),d.Z.addEventListener("stickers_updated",(({type:e,stickers:t})=>{const i=this.categories["faved"===e?"faved":"recent"];i&&c(i,t)})),d.Z.addEventListener("app_config",(()=>{this.managers.apiManager.getLimit("favedStickers").then((e=>{this.setFavedLimit(e)}))})),a.Z.addEventListener("resize",this.resizeCategories),(0,M.Z)({listenTo:this.content,listenerSetter:new P.Z});const A="menu";(0,L.Z)({listenTo:this.content,verifyRecent:e=>!!(0,E.Z)(e,this.categories.recent.elements.items),onOpen:()=>{s.ZP.setIgnoreMouseOut(A,!0)},onClose:()=>{s.ZP.setIgnoreMouseOut(A,!1)}}),this.init=null}deleteSticker(e,t,i){const s=(0,v.Z)(e.items,(e=>e.document.id===t.id));s&&(s.element.remove(),i||this.onLocalCategoryUpdate(e))}unshiftSticker(e,t,i,s){if(void 0!==s){const i=e.items[s];if(i&&i.document.id===t.id)return}let n=(0,v.Z)(e.items,(e=>e.document.id===t.id));n||(n={element:this.superStickerRenderer.renderSticker(t),document:t}),e.items.unshift(n),e.elements.items.prepend(n.element),i||this.spliceExceed(e)}unshiftRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id)}deleteRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id,!0)}onClosed(){this.setTyping(!0)}onOpened(){this.setTyping(),this.resizeCategories()}}},5948:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e){const t=document.createElement("span");return t.classList.add("badge-fake"),(0,s.$d)(t,e?"ScamMessage":"FakeMessage"),t}},1080:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(5814),n=i(3725),a=i(3035),o=i(3512),r=i(8847),d=i(7009),l=i(2940);class c extends d.Z{constructor(e,t){super(e),this.onVisibilityChange=t,this.intersector=new l.Z((e=>{const{target:t,visible:i}=e,s=(0,r.Z)(this.queue,(e=>e.div===t));i&&s.length&&s.forEach((e=>{this.queue.unshift(e)})),this.onVisibilityChange&&this.onVisibilityChange(e),this.setProcessQueueTimeout()}))}observe(e){super.observe(e)}}var h=i(2887),u=i(319),f=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class p{constructor(e,t,i,r=!0){this.element=e,this.group=t,this.scrollable=i,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=(0,n.Z)(),this.timeout=window.setTimeout((()=>{this.timeout=0,this.scrollPromise.resolve()}),150)},this.processInvisibleDiv=e=>this.scrollPromise.then((()=>f(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&(i.classList.remove("hide"),yield(0,a.d1)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t&&(t.remove(),t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)})))})))),this.managers=o.Z.managers,this.lazyLoadQueue=new c(void 0,(({target:e,visible:t})=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)})),r&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){e.querySelector("video")||this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId;return Promise.all([this.managers.appDocsManager.getDoc(t),this.scrollPromise]).then((([t])=>f(this,void 0,void 0,(function*(){const i=(yield(0,h.Z)({doc:t,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0,noPreview:!0})).loadPromise;return i.finally((()=>{const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&i.classList.add("hide"),t&&!t.parentElement&&setTimeout((()=>{t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)}))}),0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)})),i}))))}})}add(e,t=this.element){const i=document.createElement("div");i.classList.add("gif","grid-item"),i.dataset.docId=""+e.id,t.append(i),this.lazyLoadQueue.observe({div:i,load:u.Z}),(0,h.Z)({doc:e,container:i,lazyLoadQueue:null,noInfo:!0,onlyPreview:!0})}}},6008:(e,t,i)=>{"use strict";i.d(t,{X:()=>c});var s=i(426),n=i(3512),a=i(3035),o=i(4789),r=i(5975),d=i(2648),l=i(2738);function c(e,t,i,c,h=200,u,f){const p=(0,s.v)(t,e||"tabs"===t.dataset.animation?"tabs":"navigation",h,c,void 0,f);if(!e)return p;const m=new Proxy(p,{apply:(t,i,s)=>{const n=+s[0],a=void 0===s[1]||s[1],o=e.querySelector(`[data-tab="${n}"]`)||e.children[n];g(o,n,a)}}),g=(s,r,d=!0)=>{return l=this,c=void 0,m=function*(){const l=t.children[r];if(i){const e=i(r,l,d),t=e instanceof Promise?yield e:e;if(void 0!==t&&!t)return}u&&u.scrollIntoViewNew({element:s.parentElement.children[r],position:"center",forceDirection:d?void 0:o.f.Static,forceDuration:h,axis:"x"}),n.Z.settings.animationsEnabled||(d=!1);const c=p.prevId();if(s.classList.contains("active")||r===c)return!1;const f=d?a.T2:e=>e(),m=e.querySelector(b.toLowerCase()+".active");m&&f((()=>{m.classList.remove("active")})),v&&-1!==c&&d&&f((()=>{const e=s.querySelector("i"),t=s.parentElement.children[c].querySelector("i");t.classList.remove("animate"),e.classList.remove("animate");const i=t.parentElement.parentElement.offsetLeft-e.parentElement.parentElement.offsetLeft,n=t.clientWidth/e.clientWidth;e.style.transform=`translate3d(${i}px, 0, 0) scale3d(${n}, 1, 1)`,(0,a.T2)((()=>{e.classList.add("animate"),e.style.transform="none"}))})),f((()=>{s.classList.add("active")})),p(r,d)},new((f=void 0)||(f=Promise))((function(e,t){function i(e){try{n(m.next(e))}catch(e){t(e)}}function s(e){try{n(m.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof f?n:new f((function(e){e(n)}))).then(i,s)}n((m=m.apply(l,c||[])).next())}));var l,c,f,m},v=!e.classList.contains("no-stripe"),b=e.firstElementChild.tagName;return(0,l.fc)(e,(t=>{let i,s=t.target;if(s=(0,r.Z)(s,e),!s)return!1;if(s.dataset.tab){if(i=+s.dataset.tab,-1===i)return!1}else i=(0,d.Z)(s);g(s,i)}),{listenerSetter:f}),m}},503:(e,t,i)=>{"use strict";i.d(t,{I1:()=>C,ZP:()=>I,rf:()=>w});var s=i(3910),n=i(6669),a=i(1544),o=i(8763),r=i(4668),d=i(3299),l=i(9336),c=i(1293),h=i(5565),u=i(669),f=i(130),p=i(2325),m=i(1507),g=i(6241),v=i(6535),b=i(3066),y=i(4776);function w(e,t,i,o){return r=this,l=void 0,h=function*(){const r=[],l=(null==i?void 0:i.some((e=>"messageEntityCustomEmoji"===e._)))?L():void 0,c=(0,b.Z)(t,{entities:i,wrappingForPeerId:o,loadPromises:r,customEmojiRenderer:l});c.querySelectorAll('[contenteditable="false"]').forEach((e=>{e.contentEditable="inherit",e.classList.add("pc")})),r.length&&(yield Promise.all(r)),c.querySelectorAll(".input-selectable").forEach((e=>{e.prepend((0,y.SZ)(!0))}));const h=u.Y?u.Z.getInstance():void 0,f=Array.from(c.querySelectorAll(".custom-emoji-placeholder")).map((e=>(e.dataset.ces="1",e.customEmojiElement))),p=(0,a.Z)(c);null==l||l.disconnectedCallback(),console.log(p);const m=(0,d.Z)(e);if(m.node);else{const t=document.createRange();let i=e.lastChild;i||e.append(i=document.createTextNode("")),t.setStartAfter(i),t.collapse(!0),m.selection.removeAllRanges(),m.selection.addRange(t)}e.addEventListener("input",s.Z,{capture:!0,once:!0}),null==h||h.onBeforeInput({inputType:"insertContent"}),window.document.execCommand("insertHTML",!1,p),Array.from(e.querySelectorAll("[data-ces]")).forEach(((e,t)=>{delete e.dataset.ces;const i=f[t];e.customEmojiElement=i,i.placeholder=e})),e.querySelectorAll(".pc").forEach((e=>{e.contentEditable="false"})),null==h||h.removeExtraBOMs(e),(0,n.Z)(e,"input")},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(r,l||[])).next())}));var r,l,c,h}let S=()=>{document.addEventListener("paste",(e=>{const t=(0,o.Z)(e.target,'contenteditable="true"');if(!t)return;const i=!!t.dataset.noLinebreaks;let s,n;e.preventDefault();let a=(e.originalEvent||e).clipboardData.getData("text/plain"),r=!0,d=(e.originalEvent||e).clipboardData.getData("text/html");const c=e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._&&!i;if(i){const e=/[\r\n]/g;a=a.replace(e,""),d=d.replace(e,"")}const h=(t.dataset.peerId||m.NM).toPeerId();if(d.trim()){d=d.replace(//,""),d=d.replace(//,""),d=d.replace('
',"");const e=d.match(/([\s\S]*)<\/body>/);e&&(d=e[1].trim());const t=(new DOMParser).parseFromString(d,"text/html").body||document.createElement("body");let i=t.firstChild;for(;i;){const e=i.nextSibling;i.nodeType===i.TEXT_NODE&&(i.nodeValue.trim()||i.remove()),i=e}const o=(0,l.Z)(t,!0,!1);if(!!h||(o.entities=o.entities.filter((e=>"messageEntityCustomEmoji"!==e._))),o.value.replace(/\s/g,"").length===a.replace(/\s/g,"").length||o.entities.find((e=>"messageEntityCustomEmoji"===e._))){s=o.value,n=o.entities,r=!1;let e=(0,v.Z)(s);e=e.filter(c),(0,g.Z)(n,e)}}r&&(s=a,n=(0,v.Z)(s),n=n.filter(c)),w(t,s,n,h)})),S=null};var C;function L(){return y.KZ.create({wrappingDraft:!0,isSelectable:!0})}function E(e){const t=Array.from(e.querySelectorAll(".custom-emoji, .custom-emoji-placeholder"));let i=e.querySelector(".custom-emoji-renderer");if(!i&&t.length)i=L(),e.prepend(i);else if(i&&!t.length)return void i.remove();if(!i)return;const s=new Map;t.forEach((e=>{const t=e instanceof y.LD?e:e.customEmojiElement,{docId:i}=t;let n=s.get(i);n||s.set(i,n=new Set),n.add(t)}));for(const[e,t]of s){let s=i.customEmojis.get(e);if(s)for(const e of s)t.has(e)||e.disconnectedCallback();else s=new Set;for(const e of t)s.has(e)||e.connectedCallback()}i.add(s,!1),i.forceRender()}!function(e){e[e.Neutral=0]="Neutral",e[e.Valid=1]="Valid",e[e.Error=2]="Error"}(C||(C={}));class I{constructor(e={}){this.options=e,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=e.required,this.validate=e.validate,void 0!==e.maxLength&&void 0===e.showLengthOn&&(e.showLengthOn=Math.min(40,Math.round(e.maxLength/3)));const{placeholder:t,maxLength:i,showLengthOn:s,name:n,plainText:a,canBeEdited:o=!0,autocomplete:d}=e,h=e.label||e.labelText,f=[];let m;if(a?(this.container.innerHTML=`\n \n `,m=this.container.firstElementChild):(S&&S(),this.container.innerHTML='
',m=this.container.firstElementChild,m.contentEditable=""+!!o,u.Z.getInstance(),m.addEventListener("mousedown",(e=>{var t;const i=document.getSelection();if(!i.isCollapsed)return;const s=(0,r.Z)(e.target,"IMG");if(!s)return;const n=s.getBoundingClientRect(),a=n.left+n.width/2,o=e.clientX>=a,d=document.createRange();d.setStartAfter(o?s:null!==(t=s.previousSibling)&&void 0!==t?t:s),i.removeAllRanges(),i.addRange(d)})),f.push((()=>{(0,c.Z)(m)&&m.replaceChildren(),u.Y&&Array.from(m.querySelectorAll("br:not(.br-not-br)")).forEach((e=>{e.remove()})),(0,y.Cx)(Array.from(m.querySelectorAll(".input-something"))),E(m)}))),m.setAttribute("dir","auto"),e.inputMode&&(m.inputMode=e.inputMode),t&&(0,p.$d)(m,t,void 0,"placeholder"),h||t){const e=document.createElement("div");e.classList.add("input-field-border"),this.container.append(e)}if(h&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const e=this.container.lastElementChild;let t=!1;const n=()=>{const n=m.classList.contains("error"),o=a?m.value.length:[...(0,l.Z)(m,!1,!1).value].length,r=i-o,d=r<0;m.classList.toggle("error",d),d||r<=s?(this.setLabel(),e.append(` (${i-o})`),t||(t=!0)):(n&&!d||t)&&(this.setLabel(),t=!1)};f.push(n)}!e.withLinebreaks&&!a&&(m.dataset.noLinebreaks="1",m.addEventListener("keypress",(e=>{if("Enter"===e.key)return e.preventDefault(),!1}))),f.length&&m.addEventListener("input",(()=>{f.forEach((e=>e()))})),this.input=m}select(){this.value&&(this.options.plainText?this.input.select():function(e){const t=document.createRange();t.selectNodeContents(e);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?(0,f.Z)(this.label,this.options.labelText):this.label.append((0,p.ag)(this.options.label,this.options.labelOptions))}get value(){return this.options.plainText?this.input.value:(0,l.Z)(this.input,!1,!1).value}set value(e){this.setValueSilently(e,!0),this.simulateInputEvent()}simulateInputEvent(){(0,n.Z)(this.input,"input")}setValueSilently(e,t){this.options.plainText?this.input.value=e:((0,h.Z)(this.input,e),E(this.input))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!(0,c.Z)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(e="",t){this.options.plainText||(e=(0,a.Z)((0,b.Z)(e))),t?this.setValueSilently(e,!1):this.value=e}setOriginalValue(e="",t){this.originalValue=e,this.setDraftValue(e,t)}setState(e,t){t?(this.label.textContent="",this.label.append((0,p.ag)(t,this.options.labelOptions))):this.setLabel(),this.input.classList.toggle("error",!!(e&C.Error)),this.input.classList.toggle("valid",!!(e&C.Valid))}setError(e){this.setState(C.Error,e)}}},3607:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;const 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 s.ZP({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const i=document.createElement("i");i.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(i,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}},2153:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(2940),n=i(8847),a=i(4064),o=i(7009),r=i(8594);class d extends o.Z{constructor(e,t){super(e),this.onVisibilityChange=({target:e,visible:t})=>{(0,n.Z)(this.queue,(t=>t.div===e)).forEach((e=>{t&&(e.wasSeen=!0),e.visible=t;const i=this.queue.findIndex((e=>!e.visible));this.queue.splice(Math.max(0,i),0,e)})),this.setProcessQueueTimeout()},this.intersector=new s.Z(this.onVisibilityChange),!t&&(0,r.ZP)((()=>{this.lock()}),(()=>{this.unlockAndRefresh()}))}getItem(){return(0,a.Z)(this.queue,(e=>e.wasSeen))}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return i=this,s=void 0,a=function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}addElement(e,t){var i;return!!super.addElement(e,t)&&(this.observe(t),null!==(i=t.wasSeen)&&void 0!==i||(t.wasSeen=!1),!0)}}},7009:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8847),n=i(4421);class a extends n.Z{constructor(e){super(e),this.queue=[],this.inProcess=new Set}lock(){super.lock(),this.intersector.lock()}unlock(){super.unlock(),this.intersector.unlock()}unlockAndRefresh(){super.unlock(),this.intersector.unlockAndRefresh()}clear(){super.clear(),this.intersector.disconnect()}refresh(){this.intersector.refresh()}loadItem(e){return e.load(e.div)}addElement(e,t){if(this.queue.find((e=>e.div===t.div&&e.load===t.load)))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){var e;null!==(e=this.intersectorTimeout)&&void 0!==e||(this.intersectorTimeout=window.setTimeout((()=>{this.intersectorTimeout=void 0,this.processQueue()}),0))}push(e){super.push(e)}unshift(e){super.unshift(e)}delete(e){(0,s.Z)(this.queue,(t=>t.div===e.div)),this.unobserve(e)}observe(e){this.intersector.observe(e.div)}unobserve(e){this.intersector.unobserve(e.div)}}},7207:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3013),n=i(65);class a extends n.Z{constructor(e,t,i,s){super({step:1e3/60/1e3,min:0,max:1,withTransition:i,useTransform:s},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{const e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let i=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{i=!this.media.paused,i&&this.media.pause()},onMouseUp:e=>{i&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,i=this.media.currentTime;let n=0,a=0;for(let s=0;s=t&&t>=n&&(n=t,a=e.end(s))}const o=this.media.duration?a/this.media.duration:0;this.filledLoad.style.width=100*o+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media&&(this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress)),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}},3251:(e,t,i)=>{"use strict";i.d(t,{I:()=>p});var s=i(3189),n=i(8097),a=i(4755),o=i(3228),r=i(3035);const d=new Map,l=new Set;let c=!1;function h(){c||(c=!0,(0,r.T2)((()=>{c=!1,l.forEach(f),l.clear()})))}function u(e){const t=e.dataset.sizeType;return t?a.Z.active[t].width:e.getBoundingClientRect().width}function f(e){let t=d.get(e);const i=!t;let{text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:f,elementWidth:p}=t||{};if(i){a=e.textContent,r=a.length,l=50,c=l>0&&l/100;let i=e.dataset.fontSize;i&&+i&&(i+="px"),h=`${e.dataset.fontWeight||s.U9} ${i||s.Bf} ${s.bt}`,f=(0,n.Z)(a,h),p=u(e),t={text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:f,elementWidth:p},d.set(e,t)}const m=u(e),g=i||p!==m;if(!i&&g&&(t.elementWidth=p=m),g)if(f>p){e.setAttribute("title",a);let i=a,s=p;for(;i.length>3;){const t=i.length,a=c&&(0,o.Z)(c*t<<0,1,t-2)||Math.max(t+l-1,1),r=i.substr(0,a).replace(/\s*$/,""),d=i.substr(a+1).replace(/^\s*/,"");if(i=r+d,s=(0,n.Z)(i+"…",h),s{for(const[e]of d)l.add(e);h()}),{capture:!0,passive:!0});class p extends HTMLElement{connectedCallback(){d.set(this,null),this.dataset.sizeType?f(this):(l.add(this),h())}disconnectedCallback(){d.delete(this),l.delete(this)}}customElements.define("middle-ellipsis-element",p)},4425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.helpers.onVisibilityClickAdditional=()=>{this.passwordInputField.helpers.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},3083:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const i=e.input;i.addEventListener("blur",(()=>{this.playAnimation(0)})),i.addEventListener("input",(t=>{this.playAnimation(e.value.length)}))}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas[0].style.display="none"),this.animation.canvas[0].style.display=""):t=0;const i=this.needFrame>t?-1:1;this.animation.setDirection(i),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([s.Z.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then((e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),s.Z.waitForFirstFrame(e)))),s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then((e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas[0].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[0].style.display="",this.idleAnimation.play(),this.animation.canvas[0].style.display="none")})),s.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6830:(e,t,i)=>{"use strict";i.d(t,{T:()=>a,Z:()=>o});var s=i(3910),n=i(503);class a{constructor(e,t){this.container=e,this.input=t,this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.Z)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()},t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),e.classList.add("input-field-password"),e.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}class o extends n.ZP{constructor(e={}){super(Object.assign({plainText:!0},e)),this.helpers=new a(this.container,this.input)}}},8261:(e,t,i)=>{"use strict";i.d(t,{Z:()=>F});var s=i(2365),n=i(2166),a=i(5565),o=i(130),r=i(3699),d=i(3035),l=i(4846),c=i(2325),h=i(4776),u=i(3512),f=i(9331),p=i(9807),m=i(5432),g=i(4064),v=i(3910),b=i(2738),y=i(1708),w=i(6074),S=i(7030),C=i(9931),L=i(3757),E=i(9492),I=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class M{constructor(e,t){this.scrollable=e,this.managers=t,this.processItem=e=>I(this,void 0,void 0,(function*(){const t=document.createElement("div");let i;t.classList.add(M.BASE_CLASS+"-avatar","media-container","hide"),this.avatars.append(t),e&&(i="object"!=typeof e?yield this.managers.appPhotosManager.getPhoto(e):e.action.photo);const s=new Image;s.classList.add("avatar-photo"),s.draggable=!1;const n=()=>I(this,void 0,void 0,(function*(){if(i){const e=yield(0,E.Z)({container:t,photo:i,size:(0,S.Z)(i,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach((e=>{e.classList.add("avatar-photo")}))}else{const e=yield this.managers.appPeersManager.getPeerPhoto(this.peerId);yield(0,C.Y)(t,this.peerId,e,"photo_big",s)}t.classList.remove("hide")}));return this.avatars.childElementCount<=3?yield n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.addTab(),e})),this.container=document.createElement("div"),this.container.classList.add(M.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(M.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(M.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(M.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(M.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(M.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(M.BASE_CLASS+"-arrow",M.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.Z;const i=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1),s=1/3;let n=!1,a=!1;(0,b.fc)(this.container,(e=>I(this,void 0,void 0,(function*(){if(a)return void(0,v.Z)(e);if(n)return void(n=!1);if(!i())return;const t=this.container.getBoundingClientRect(),o=e.pageX,r=o-t.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||r>t.width*s&&r{t.push({element:this.avatars.children[i],item:e})}));const i=t.slice(0,this.listLoader.previous.length),s=t.slice(this.listLoader.previous.length+1),n=this.avatars.children[this.listLoader.previous.length];a=!0,(0,f.C)(n,e,(()=>e===this.peerId),this.listLoader.current,i,s),a=!1}else{const e=o>t.right-t.width/2;let i;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,i=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(i),(0,d.T2)((()=>{this.avatars.classList.remove("no-transition")}))}}))),{listenerSetter:this.listenerSetter});const o=()=>{n=!0,document.body.addEventListener(m.Z?"touchend":"click",(e=>{n=!1}),{once:!0})};let l=0,c=0,h=0,u=0;this.swipeHandler=new L.Z({element:this.avatars,onSwipe:(e,t)=>{h=e;let i=c+e*-M.SCALE;return i>0?i=0:ii()?!this.container.classList.contains("is-single")&&!a:(o(),(0,v.Z)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();l=e.width,u=-l*(this.tabs.childElementCount-1),c=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=M.TRANSLATE_TEMPLATE.replace("{x}",c+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(h)/(l/M.SCALE))*(h>=0?1:-1);o(),this.avatars.classList.remove("no-transition"),(0,d.T2)((()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")}))}}),this.intersectionObserver=new IntersectionObserver((e=>{e.forEach((e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)}))}))}setPeer(e){return I(this,void 0,void 0,(function*(){this.peerId=e;const t=yield this.managers.appPeersManager.getPeerPhoto(e);if(!t)return;const i=this.listLoader=new w.Z({loadCount:50,loadMore:(t,s,n)=>{if(!s)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t;return this.managers.appPhotosManager.getUserPhotos(e,i,n).then((e=>({count:e.count,items:e.photos})))}{const t=[];return i.current||t.push(this.managers.appProfileManager.getChatFull(e.toChatId())),t.push(this.managers.appMessagesManager.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:n,backLimit:0})),Promise.all(t).then((e=>I(this,void 0,void 0,(function*(){const t=e.pop();if((0,y.Z)(t),!i.current){const s=e[0],n=(0,g.Z)(t.history,(e=>e.action.photo.id===s.chat_photo.id));i.current=n||(yield this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId,s.chat_photo))}return{count:t.count,items:t.history}}))))}},processItem:this.processItem,onJump:(e,t)=>{const i=this.listLoader.index,s=100*M.SCALE*i;this.avatars.style.transform=M.TRANSLATE_TEMPLATE.replace("{x}",`-${s}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active"),this.tabs.children[i].classList.add("active"),this.loadNearestToTarget(this.avatars.children[i])}});"userProfilePhoto"===t._&&(i.current=t.photo_id),yield this.processItem(i.current),i.load(!0)}))}addTab(){const e=document.createElement("div");e.classList.add(M.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),i=t.indexOf(e);t.slice(Math.max(0,i-3),Math.min(t.length,i+3)).forEach((e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))}))}cleanup(){var e;this.listenerSetter.removeAll(),this.swipeHandler.removeListeners(),null===(e=this.intersectionObserver)||void 0===e||e.disconnect()}}M.BASE_CLASS="profile-avatars",M.SCALE=s.Z?2:1,M.TRANSLATE_TEMPLATE=s.Z?`translate3d({x}, 0, -1px) scale(${M.SCALE})`:"translate({x}, 0)";var P=i(7479),Z=i(2464),k=i(2796),T=i(8210),x=i(7362),A=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const _=(e,t)=>{(0,o.Z)(t.title,e||""),t.container.style.display=e?"":"none"};class F{constructor(e,t,i,n=!0){this.managers=e,this.scrollable=t,this.listenerSetter=i,this.isDialog=n,this.setPeerStatus=(e=!1)=>{const t=this.peerId;if(this.element.classList.toggle("is-me",t===u.Z.myId),t&&(u.Z.myId!==t||!this.isDialog))return l.Z.setPeerStatus(t,this.subtitle,e,!0,(()=>t===this.peerId),!this.isDialog).then((e=>{e&&e()}))},s.Z||this.scrollable.container.classList.add("no-parallax"),i||(this.listenerSetter=new r.Z)}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new Z.dw({noDelimiter:!0}),this.avatar=new f.Z,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 P.ZP({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>A(this,void 0,void 0,(function*(){if("A"===e.target.tagName)return;const t=yield this.managers.appProfileManager.getProfileByPeerId(this.peerId);(0,n.T)(t.about),(0,k.Am)(c.ZP.format("BioCopied",!0))})),listenerSetter:this.listenerSetter}),this.bio.title.classList.add("pre-wrap"),this.username=new P.ZP({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>A(this,void 0,void 0,(function*(){const e=yield this.managers.appPeersManager.getPeer(this.peerId);(0,n.T)("@"+e.username),(0,k.Am)(c.ZP.format("UsernameCopied",!0))})),listenerSetter:this.listenerSetter}),this.phone=new P.ZP({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>A(this,void 0,void 0,(function*(){const e=yield this.managers.appUsersManager.getUser(this.peerId);(0,n.T)("+"+e.phone),(0,k.Am)(c.ZP.format("PhoneCopied",!0))})),listenerSetter:this.listenerSetter}),this.link=new P.ZP({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{(0,n.T)(this.link.title.textContent),(0,k.Am)(c.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),this.location=new P.ZP({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 P.ZP({checkboxField:new p.Z({toggle:!0}),titleLangKey:"Notifications",icon:"unmute",listenerSetter:this.listenerSetter}),e.add(this.notifications.checkboxField.input)("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute(this.peerId)})),e.add(u.Z)("dialog_notify_settings",(e=>A(this,void 0,void 0,(function*(){if(this.peerId===e.peerId){const e=yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}})))),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),s.Z&&this.element.append((0,Z.G7)()),e.add(u.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),e.add(u.Z)("peer_bio_edit",(e=>{e===this.peerId&&this.setMoreDetails(!0)})),e.add(u.Z)("peer_title_edit",(e=>{e===this.peerId&&this.fillUsername()})),e.add(u.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),e.add(u.Z)("contacts_update",(e=>A(this,void 0,void 0,(function*(){this.peerId===e.toPeerId()&&((yield this.managers.appUsersManager.getUser(e)).pFlags.self&&this.isDialog||this.fillUserPhone())})))),e.add(u.Z)("avatar_update",(e=>{this.peerId===e&&this.setAvatar()})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4)}cleanupHTML(){[this.bio,this.phone,this.username,this.location,this.link].forEach((e=>{e.container.style.display="none"})),this.notifications&&(this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0),this.clearSetMoreDetailsTimeout()}canBeDetailed(){return this.peerId!==u.Z.myId||!this.isDialog}setAvatar(){return A(this,void 0,void 0,(function*(){if(this.canBeDetailed()&&(yield this.managers.appPeersManager.getPeerPhoto(this.peerId))){const e=this.avatars;return this.avatars=new M(this.scrollable,this.managers),yield this.avatars.setPeer(this.peerId),this.avatars.info.append(this.name,this.subtitle),this.avatar.remove(),e?e.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),void(s.Z&&this.scrollable.container.classList.add("parallax"))}s.Z&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),yield this.avatar.updateWithOptions({peerId:this.peerId}),this.section.content.prepend(this.avatar,this.name,this.subtitle)}))}fillUsername(){return A(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appPeersManager.getPeerUsername(e);return _(t,this.username)}}))}fillUserPhone(){return A(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appUsersManager.getUser(e);return _(t.phone?(0,T.Z)(t.phone):void 0,this.phone)}}))}fillNotifications(){return A(this,void 0,void 0,(function*(){const e=this.notifications;if(e)if(this.canBeDetailed()){const t=yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1);e.checkboxField.checked=!t}else(0,d.T2)((()=>{e.container.style.display="none"}))}))}fillRows(){return A(this,void 0,void 0,(function*(){const e=this.peerId;yield Promise.all([this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(),(()=>A(this,void 0,void 0,(function*(){const[t]=yield Promise.all([(0,x.Z)({peerId:e,dialog:this.isDialog,withIcons:!0})]);(0,a.Z)(this.name,t)})))(),this.setPeerStatus(!0)])}))}fillProfileElements(){return A(this,void 0,void 0,(function*(){this.cleaned&&(this.cleaned=!1,this.cleanupHTML(),yield Promise.all([this.setAvatar(),this.fillRows()]))}))}_setMoreDetails(e,t){return A(this,void 0,void 0,(function*(){if(_(t.about?(0,h.ZP)(t.about):void 0,this.bio),!e.isUser()){const i=yield this.managers.appChatsManager.getChat(e.toChatId());if(i.username)_("https://t.me/"+i.username,this.link);else{const e=t.exported_invite;"chatInviteExported"===(null==e?void 0:e._)&&_(e.link,this.link)}}const i=t.location;"channelLocation"==(null==i?void 0:i._)&&_(i.address,this.location),this.setMoreDetailsTimeout=window.setTimeout((()=>this.setMoreDetails(!0)),6e4)}))}setMoreDetails(e){return A(this,void 0,void 0,(function*(){this.clearSetMoreDetailsTimeout();const t=this.peerId,i=this.threadId;if(!t||(yield this.managers.appPeersManager.isRestricted(t))||!this.canBeDetailed())return;const s=yield this.managers.acknowledged.appProfileManager.getProfileByPeerId(t,e),n=s.result.then((e=>A(this,void 0,void 0,(function*(){this.peerId!==t||this.threadId!==i||(yield this.managers.appPeersManager.isRestricted(t))||(yield this._setMoreDetails(t,e))}))));s.cached&&(yield n)}))}setPeer(e,t=0){var i;this.peerId===e&&this.threadId===t||(null===(i=this.init)||void 0===i||i.call(this),this.peerId=e,this.threadId=t,this.cleaned=!0)}clearSetMoreDetailsTimeout(){void 0!==this.setMoreDetailsTimeout&&(clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=void 0)}destroy(){var e;this.peerId=this.threadId=void 0,this.clearSetMoreDetailsTimeout(),clearInterval(this.setPeerStatusInterval),null===(e=this.avatars)||void 0===e||e.cleanup()}}},8842:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(3512),n=i(2325),a=i(5565),o=i(1507),r=i(8456),d=i(130),l=i(8115),c=i(493),h=(i(4755),i(5948));i(3541);function u(e,t,i,n,a){return o=this,r=void 0,l=function*(){const t=[],o=yield s.Z.managers.appPeersManager.getPeer(e);if(o.pFlags.verified&&!i&&t.push(function(){const e=document.createElement("span");e.classList.add("verified-icon","tgico");const t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttributeNS(null,"viewBox","0 0 26 26"),t.setAttributeNS(null,"width","26"),t.setAttributeNS(null,"height","26"),t.classList.add("verified-icon-svg");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#verified-icon-background"),i.classList.add("verified-icon-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-icon-check"),s.classList.add("verified-icon-check"),t.append(s,i),e.append(t),e}()),!o.pFlags.fake&&!o.pFlags.scam||n||t.push((0,h.Z)(o.pFlags.scam)),o.pFlags.premium&&!a){const e=o.emoji_status;e&&e._,t.push(function(){const e=document.createElement("span");return e.classList.add("premium-icon","tgico-star"),e}())}return t},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}const f=new WeakMap;s.Z.addEventListener("peer_title_edit",(e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach((e=>{const t=f.get(e);null==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"),e&&this.update(e),f.set(this.element,this)}setOptions(e){if(e)for(const t in e){const i=e[t];"object"!=typeof i&&(this.element.dataset[t]=i?""+("boolean"==typeof i?+i:i):"0"),this[t]=i}}update(e){var t,i,h,f,p,m;return h=this,f=void 0,m=function*(){this.setOptions(e);let h,f=this.fromName;if(void 0!==f)return void 0!==this.limitSymbols&&(f=(0,r.Z)(f,this.limitSymbols,this.limitSymbols)),void(0,d.Z)(this.element,(0,l.Z)(f));if(null!==(t=this.peerId)&&void 0!==t||(this.peerId=o.NM),this.peerId===s.Z.myId&&this.dialog)(0,a.Z)(this.element,(0,n.ag)(this.onlyFirstName?"Saved":"SavedMessages"));else{const e=null!==(i=this.managers)&&void 0!==i?i:s.Z.managers,[t,n]=yield Promise.all([(0,c.Z)(this.peerId,this.plainText,this.onlyFirstName,this.limitSymbols,e),this.withIcons&&u(this.peerId,this.middleware)||this.withPremiumIcon&&u(this.peerId,this.middleware,!0,!0)]);if(null==n?void 0:n.length){const e=document.createElement("span");e.classList.add("peer-title-inner"),h=!0,(0,d.Z)(e,t);const i=document.createDocumentFragment();i.append(e,...n),(0,d.Z)(this.element,i)}else(0,d.Z)(this.element,t)}this.hasInner!==h&&(this.hasInner=h,this.element.classList.toggle("with-icons",h))},new((p=void 0)||(p=Promise))((function(e,t){function i(e){try{n(m.next(e))}catch(e){t(e)}}function s(e){try{n(m.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof p?n:new p((function(e){e(n)}))).then(i,s)}n((m=m.apply(h,f||[])).next())}))}}},6765:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1168),n=i(2325),a=i(2738),o=i(8678),r=i(2312);class d extends s.Z{constructor(){super("popup-avatar",{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),(0,n.$d)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",(e=>{const t=e.target.files[0];t&&(0,o.Z)(t).then((e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=function(e,t){let i,s,n,a={},o=0,r=0,d=0,l=0,c=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,n=new Image,n.src=e.src,n.draggable=!1,n.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),i=document.createElement("div"),i.classList.add("crop-component"),s=document.createElement("div"),s.classList.add("crop-overlay");const a=document.createElement("div");a.classList.add("crop-overlay-color"),i.appendChild(s),e.parentNode.appendChild(i),i.appendChild(n),i.appendChild(e),i.appendChild(a),s.appendChild(n),n.style.maxWidth=e.width+"px",c=e.naturalWidth/e.offsetWidth;const o=e.offsetWidth/2-100,r=e.offsetHeight/2-100;u(200,200),f(o,r),p(o,r),s.addEventListener("mousedown",b,!1),s.addEventListener("touchstart",b,!1),s.addEventListener("wheel",v,!1),document.addEventListener("keypress",g,!1)}function u(e,t){d=e*c,l=t*c,s.style.width=e+"px",s.style.height=t+"px"}function f(e,t){r=t*c,o=e*c,n.style.top=-t+"px",n.style.left=-e+"px"}function p(e,t){s.style.top=t+"px",s.style.left=e+"px"}function m(e){e=e*Math.PI*2;let t,i,a,o,r=Math.floor(s.clientWidth+e),d=Math.floor(s.clientHeight+e),l=n.clientWidth,c=n.clientHeight;r<50||r>l||(t=s.offsetLeft-e/2,i=s.offsetTop-e/2,a=t+r,o=i+d,t<0&&(t=0),i<0&&(i=0),a>l||o>c||(u(r,r),f(t,i),p(t,i)))}function g(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":m(4);break;case"-":m(-4)}}function v(e){e.preventDefault(),m(e.deltaY>0?1:-1)}function b(e){e.preventDefault(),e.stopPropagation(),function(e){a.container_width=s.offsetWidth,a.container_height=s.offsetHeight,a.container_left=s.offsetLeft,a.container_top=s.offsetTop,a.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,a.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",w),document.addEventListener("touchmove",w),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}function y(e){e.preventDefault(),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w)}function w(e){let t,i,o,r,d={x:0,y:0};e.preventDefault(),e.stopPropagation(),d.x=e.pageX||e.touches&&e.touches[0].pageX,d.y=e.pageY||e.touches&&e.touches[0].pageY,t=d.x-(a.mouse_x-a.container_left),i=d.y-(a.mouse_y-a.container_top),o=s.offsetWidth,r=s.offsetHeight,t<0?t=0:t>n.offsetWidth-o&&(t=n.offsetWidth-o),i<0?i=0:i>n.offsetHeight-r&&(i=n.offsetHeight-r),f(t,i),p(t,i)}return e.complete?h():e.onload=h,{crop:function(){t.width=d,t.height=l,t.getContext("2d").drawImage(e,o,r,d,l,0,0,d,l)},removeHandlers:function(){s.removeEventListener("mousedown",b),s.removeEventListener("touchstart",b),s.removeEventListener("wheel",v),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w),document.removeEventListener("keypress",g),i.remove(),s.remove(),n.remove()}}}(this.image,this.canvas),this.input.value=""}}))}),!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",(0,a.fc)(this.btnConfirm,(()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob((e=>{this.blob=e,this.darkenCanvas(),this.resolve()}),"image/jpeg",1)}),{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",(()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()}))}resolve(){this.onCrop((()=>r.Z.upload(this.blob)))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){const e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},6194:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(1168),n=i(8842),a=i(8127);class o{constructor(e,t,i){this.peerId=e,this.peerType=t,this.onSelect=i,this.construct()}construct(){return e=this,t=void 0,o=function*(){let{peerId:e,peerType:t,onSelect:i}=this;const o=new n.Z({peerId:e}).element,r=s.Z.MANAGERS;void 0===t&&(t=yield r.appPeersManager.getDialogType(e));const d=(t,s=p&&!!t.size)=>{let n=r.appChatsManager.leave(e.toChatId());s&&(n=n.then((()=>r.appMessagesManager.flushHistory(e)))),null==i||i(n)},l=t=>{let s;if(e.isUser())s=r.appMessagesManager.flushHistory(e,!1,p?!!t.size:void 0);else{if(!t.size)return d(t);s=r.appChatsManager.delete(e.toChatId())}null==i||i(s)};let c,h,u,f,p;switch(t){case"channel":(yield r.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(c="ChannelDeleteMenu",h="AreYouSureDeleteAndExitChannel",f=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:l}],p=[{text:"DeleteChannelForAll"}]):(c="LeaveChannelMenu",h="ChannelLeaveAlertWithName",u=[o],f=[{langKey:"LeaveChannel",isDanger:!0,callback:d}]);break;case"chat":c="DeleteChatUser",h="AreYouSureDeleteThisChatWithUser",u=[o],f=[{langKey:"DeleteChatUser",isDanger:!0,callback:l}],p=[{text:"DeleteMessagesOptionAlso",textArgs:[new n.Z({peerId:e}).element]}];break;case"saved":c="DeleteChatUser",h="AreYouSureDeleteThisChatSavedMessages",f=[{langKey:"DeleteChatUser",isDanger:!0,callback:l}];break;case"megagroup":case"group":(yield r.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(c="DeleteMegaMenu",h="AreYouSureDeleteAndExit",f=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:l}],p=[{text:"DeleteChat.DeleteGroupForAll"}]):(c="LeaveMegaMenu",h="AreYouSureDeleteAndExitName",u=[o],f=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>d(e,!0)}])}new a.Z("popup-delete-chat",{peerId:e,titleLangKey:c,descriptionLangKey:h,descriptionLangArgs:u,buttons:f,checkboxes:p}).show()},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{d(o.next(e))}catch(e){n(e)}}function r(e){try{d(o.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,r)}d((o=o.apply(e,t||[])).next())}));var e,t,i,o}}},5128:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3512),n=i(1168),a=i(8127),o=i(2325),r=i(8842),d=i(7120),l=i(2353),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class h{constructor(e,t,i,s){this.peerId=e,this.mids=t,this.type=i,this.onConfirm=s,this.construct()}construct(){return c(this,void 0,void 0,(function*(){let{peerId:e,mids:t,type:i,onConfirm:h}=this;const u=new r.Z({peerId:e}).element,f=n.Z.MANAGERS;t=t.slice();const p=(s,n)=>{h&&h(),"scheduled"===i?f.appMessagesManager.deleteScheduledMessages(e,t):f.appMessagesManager.deleteMessages(e,t,!!s.size||n)},m=[{langKey:"Delete",isDanger:!0,callback:p}],g=[];let v,b,y,w;if(1===t.length?v="DeleteSingleMessagesTitle":(v="DeleteMessagesTitle",b=[(0,o.ag)("messages",[t.length])]),y=(yield f.appPeersManager.isMegagroup(e))?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",e===s.Z.myId||"scheduled"===i);else if(e.isUser())g.push({text:"DeleteMessagesOptionAlso",textArgs:[u]});else{const i=yield f.appChatsManager.getChat(e.toChatId()),n=(0,d.Z)(i,"delete_messages");if("chat"===i._){const i=n?t.slice():yield(0,l.Z)(t,(t=>c(this,void 0,void 0,(function*(){return(yield f.appMessagesManager.getMessageByPeer(e,t)).fromId===s.Z.myId}))));i.length&&(i.length===t.length?g.push({text:"DeleteForAll"}):(g.push({text:"DeleteMessagesOption"}),y="DeleteMessagesTextGroup",w=[(0,o.ag)("messages",[i.length])]))}else m[0].callback=e=>p(e,!0)}(0,n.x)(m),new a.Z("popup-delete-chat",{peerId:e,titleLangKey:v,titleLangArgs:b,descriptionLangKey:y,descriptionLangArgs:w,buttons:m,checkboxes:g}).show()}))}}},4524:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(4846),n=i(2995);class a extends n.Z{constructor(e,t,i=!1){super({peerTypes:["dialogs","contacts"],onSelect:i?t:i=>{return n=this,a=void 0,r=function*(){if(t){const e=t(i);e instanceof Promise&&(yield e)}s.Z.setInnerPeer({peerId:i}),s.Z.chat.input.initMessagesForward(e)},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r},placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"}),this.scrollable=this.selector.scrollable,this.attachScrollableListeners(this.scrollable)}}},1168:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C,x:()=>L});var s=i(1405),n=i(5814),a=i(9818),o=i(2325),r=i(8497),d=i(8799),l=i(3699),c=i(2738),h=i(6299),u=i(3910),f=i(3241),p=i(6733),m=i(1655),g=i(3815),v=i(8805),b=i(3624);const y=document.body;let w=y;const S=()=>{w=(0,p.W7)()||y,C.reAppend()};(0,p.Ms)(y,S);class C extends f.Z{constructor(e,t={}){if(super(!1),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=()=>{a.Z.backByItem(this.navigationItem)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),t.title&&(this.title.classList.add("popup-title"),"string"==typeof t.title&&(0,o.$d)(this.title,t.title),this.header.append(this.title)),this.middlewareHelper=(0,b.k)(),this.listenerSetter=new l.Z,this.managers=C.MANAGERS,this.confirmShortcutIsSendShortcut=t.confirmShortcutIsSendShortcut,t.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),(0,c.fc)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=t.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),t.overlayClosable&&(0,c.fc)(this.element,(e=>{(0,r.Z)(e.target,"popup-container")||this.hide()}),{listenerSetter:this.listenerSetter}),t.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==t.withConfirm&&this.btnConfirm.append((0,o.ag)(t.withConfirm)),this.header.append(this.btnConfirm),(0,s.Z)(this.btnConfirm)),this.container.append(this.header),t.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body)),t.scrollable){const e=this.scrollable=new v.ZP(this.body);this.attachScrollableListeners(e),this.body||this.container.insertBefore(e.container,this.header.nextSibling)}let i=this.btnConfirm;const n=this.buttons=t.buttons;if(null==n?void 0:n.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons");const t=n.map((e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),(0,s.Z)(t),e.text?t.innerHTML=e.text:t.append((0,o.ag)(e.langKey,e.langArgs)),(0,c.fc)(t,(()=>{e.callback&&e.callback(),this.destroy()}),{listenerSetter:this.listenerSetter,once:!0}),e.element=t}));if(!i&&2===n.length){const e=n.find((e=>!e.isCancel));e&&(i=e.element)}e.append(...t),this.container.append(e)}this.btnConfirmOnEnter=i,this.element.append(this.container),C.POPUPS.push(this)}attachScrollableListeners(e){const t=e.onAdditionalScroll;e.onAdditionalScroll=()=>{null==t||t(),e.container.classList.toggle("scrolled-top",!e.scrollTop),e.container.classList.toggle("scrolled-bottom",e.isScrolledDown)},e.container.classList.add("scrolled-top","scrolled-bottom","scrollable-y-bordered")}onContentUpdate(){this.scrollable&&this.scrollable.onAdditionalScroll()}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},a.Z.pushItem(this.navigationItem),(0,d.Z)(),w.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.onContentUpdate(),this.withoutOverlay||(g.Z.isOverlayActive=!0,n.Z.checkAnimations2(!0)),setTimeout((()=>{this.element.classList.contains("active")&&this.listenerSetter.add(document.body)("keydown",(e=>{C.POPUPS[C.POPUPS.length-1]===this&&(this.confirmShortcutIsSendShortcut?(0,h.Z)(e):"Enter"===e.key)&&((0,c.tH)(this.btnConfirmOnEnter),(0,u.Z)(e))}))}),0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.middlewareHelper.destroy(),this.withoutOverlay||(g.Z.isOverlayActive=!1),a.Z.removeItem(this.navigationItem),this.navigationItem=void 0,(0,m.Z)(C.POPUPS,this),S(),setTimeout((()=>{var e;this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),null===(e=this.scrollable)||void 0===e||e.destroy(),this.withoutOverlay||n.Z.checkAnimations2(!1)}),150)}static reAppend(){this.POPUPS.forEach((e=>{const{element:t,container:i}=e,s=t.parentElement;s&&s!==w&&w!==i&&w.append(t)}))}static getPopups(e){return this.POPUPS.filter((t=>t instanceof e))}static createPopup(e,...t){return new e(...t)}}C.POPUPS=[];const L=e=>(e.find((e=>e.isCancel))||e.push({langKey:"Cancel",isCancel:!0}),e)},3897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(7298),n=i(1507),a=i(7479),o=i(8127);const r=[{value:3600,langPackKey:"ChatList.Mute.1Hour"},{value:14400,langPackKey:"ChatList.Mute.4Hours"},{value:28800,langPackKey:"ChatList.Mute.8Hours"},{value:86400,langPackKey:"ChatList.Mute.1Day"},{value:259200,langPackKey:"ChatList.Mute.3Days"},{value:-1,langPackKey:"ChatList.Mute.Forever",checked:!0}];class d extends o.Z{constructor(e){let t;super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{this.managers.appMessagesManager.mutePeer(e,-1===t?n.rU:(0,s.Z)(!0)+t)}}],body:!0});const i=(0,a.ZC)(r,(e=>{t=+e}));this.body.append(i),this.show()}}},8127:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(9331),n=i(1168),a=i(2325),o=i(9807),r=i(130);class d extends n.Z{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),Object.assign(Object.assign({overlayClosable:!0},t),{title:!0,buttons:t.buttons&&(0,n.x)(t.buttons)})),this.className=e,t.peerId){const e=new s.Z;e.classList.add("avatar-32"),e.updateWithOptions({isDialog:!0,peerId:t.peerId}),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append((0,a.ag)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const i=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append((0,a.ag)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(0,r.Z)(e,t.description),i.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach((e=>{e.withRipple=!0;const t=new o.Z(e);e.checkboxField=t,i.append(t.label)})),t.buttons.forEach((e=>{if(e.callback){const i=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach((t=>{t.checkboxField.checked&&e.add(t.text)})),i(e)}}}))),this.container.insertBefore(i,this.header.nextElementSibling)}}},2995:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5432),n=i(5644),a=i(1168);class o extends a.Z{constructor(e){super("popup-forward",{closable:!0,overlayClosable:!0,body:!0,title:!0}),this.selector=new n.Z({appendTo:this.body,onChange:()=>{return t=this,i=void 0,n=function*(){const t=this.selector.getSelected(),i=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(i);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),s.Z||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:"abitbigger",peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence,managers:this.managers}),this.title.append(this.selector.input)}}},1962:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8127);class n extends s.Z{constructor(e,t,i){super("popup-delete-chat",{title:`Send Message${t.length>1?"s":""} Now`,description:t.length>1?"Send "+t.length+" messages now?":"Send message now?",buttons:[{langKey:"Send",callback:()=>{i&&i(),this.managers.appMessagesManager.sendScheduledMessages(e,t)}}]}),this.show()}}},6787:(e,t,i)=>{"use strict";i.d(t,{Z:()=>P});var s=i(1168),n=i(3541),a=i(2153),o=i(279),r=i(5814),d=i(4846),l=i(4755),c=i(2325),h=i(4494),u=i(8497),f=i(1656),p=i(2738),m=i(2796),g=i(130),v=i(8115),b=i(748),y=i(9259),w=i(7479),S=i(5565),C=i(3512),L=i(9083),E=i(3173),I=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const M="STICKERS-POPUP";class P extends s.Z{constructor(e,t){super("popup-stickers",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.stickerSetInput=e,this.isEmojis=t,this.onStickersClick=e=>I(this,void 0,void 0,(function*(){const t=(0,u.Z)(e.target,"sticker-set-sticker");if(!t)return;const i=t.dataset.docId;(yield d.Z.chat.input.sendMessageWithDocument(i))&&this.hide()})),this.title.append((0,c.ag)("Loading")),this.updateAdded={},E.ZP.setIgnoreMouseOut("popup",!0),this.addEventListener("close",(()=>{E.ZP.setIgnoreMouseOut("popup",!1),r.Z.setOnlyOnePlayableGroup()})),this.appendTo=this.scrollable.container,this.appendTo.classList.add("is-loading"),(0,o.y)(this.appendTo,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer");const i=(0,h.Z)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(i),this.body.append(this.stickersFooter),(0,y.Z)({listenTo:this.appendTo,listenerSetter:this.listenerSetter});const s=e=>{const t=this.sets.findIndex((t=>t.id===e.id));if(-1===t)return;this.sets[t]=e;const i=this.updateAdded[e.id];null==i||i(!!e.installed_date),this.updateButton()};this.listenerSetter.add(C.Z)("stickers_installed",s),this.listenerSetter.add(C.Z)("stickers_deleted",s),this.loadStickerSet()}createStickerSetElements(e){const t=document.createElement("div");let i,s;t.classList.add("sticker-set"),e&&(i=new w.ZP({title:(0,v.Z)(e.title),subtitle:(0,c.ag)(e.pFlags.emojis?"EmojiCount":"Stickers",[e.count]),buttonRight:!0}),s=e=>{(0,S.Z)(i.buttonRight,(0,c.ag)(e?"Stickers.SearchAdded":"Stickers.SearchAdd")),i.buttonRight.classList.toggle("active",e)},s(!!e.installed_date),t.append(i.container));const n=document.createElement("div");return n.classList.add("sticker-set-stickers"),t.append(n),{container:t,headerRow:i,updateAdded:s,itemsContainer:n}}loadStickerSet(){var e;return I(this,void 0,void 0,(function*(){const t=this.middlewareHelper.get(),i=(Array.isArray(this.stickerSetInput)?this.stickerSetInput:[this.stickerSetInput]).map((e=>this.managers.appStickersManager.getStickerSet(e)));let s=yield Promise.all(i);if(!t())return;let o=s[0];if(1===s.length&&!o)return(0,m.bC)({langPackKey:this.isEmojis?"AddEmojiNotFound":"StickerSet.DontExist"}),void this.hide();s=s.filter(Boolean),o=s[0],this.sets=s.map((e=>e.set));const d=null!==(e=this.isEmojis)&&void 0!==e?e:this.isEmojis=!!o.set.pFlags.emojis;if(!d){(0,p.fc)(this.appendTo,this.onStickersClick,{listenerSetter:this.listenerSetter});const{destroy:e}=(0,b.Z)({listenTo:this.appendTo,isStickerPack:!0,onSend:()=>this.hide()});this.addEventListener("close",e)}r.Z.setOnlyOnePlayableGroup(M);const u=new a.Z,y=[],w=s.map((e=>I(this,void 0,void 0,(function*(){const{container:i,itemsContainer:a,headerRow:o,updateAdded:r}=this.createStickerSetElements(s.length>1?e.set:void 0);let c;o&&(0,p.fc)(o.buttonRight,(()=>{this.managers.appStickersManager.toggleStickerSet(e.set)}),{listenerSetter:this.listenerSetter}),this.updateAdded[e.set.id]=r;const h=e.documents.filter((e=>"document"===(null==e?void 0:e._)));if(d){const e=(0,L.Z)({docIds:h.map((e=>e.id)),loadPromises:y,animationGroup:M,size:l.Z.active.esgCustomEmoji,middleware:t});Array.from(e.children).slice(1).forEach((e=>{const t=document.createElement("span");t.classList.add("super-emoji"),e.replaceWith(t),t.append(e)})),c=[e],a.classList.replace("sticker-set-stickers","super-emojis"),a.classList.add("is-emojis","not-local")}else c=yield Promise.all(h.map((e=>I(this,void 0,void 0,(function*(){const i=document.createElement("div");i.classList.add("sticker-set-sticker");const s=l.Z.active.popupSticker.width;return yield(0,n.ZP)({doc:e,div:i,lazyLoadQueue:u,group:M,play:!0,loop:!0,width:s,height:s,withLock:!0,loadPromises:y,middleware:t}),i})))));return a.append(...c.filter(Boolean)),i})))),S=yield Promise.all(w);yield Promise.all(y);const C=this.button=(0,h.Z)("",{noRipple:!0});this.updateButton(),(0,p.fc)(C,(()=>{const e=(0,f.Z)([C],!0);this.managers.appStickersManager.toggleStickerSets(s.map((e=>e.set))).then((()=>{this.hide()})).catch((()=>{e()}))}),{listenerSetter:this.listenerSetter}),1===s.length?(0,g.Z)(this.title,(0,v.Z)(o.set.title)):(0,g.Z)(this.title,(0,c.ag)("Emoji")),this.stickersFooter.textContent="",this.stickersFooter.append(C),this.appendTo.classList.remove("is-loading"),this.appendTo.textContent="",this.appendTo.append(...S),this.scrollable.onAdditionalScroll()}))}updateButton(){const{sets:e,isEmojis:t}=this;let i,s;if(1===e.length){const n=e[0];s=(0,c.ag)(t?"EmojiCount":"Stickers",[n.count]),i=!n.installed_date}else{const t=e.filter((e=>e.installed_date));let n;e.length===t.length?(i=!1,n=e.length):(i=!0,n=e.length-t.length),s=(0,c.ag)("EmojiPackCount",[n])}this.button.className=i?"btn-primary btn-color-primary":"btn-primary btn-primary-transparent danger",(0,S.Z)(this.button,(0,c.ag)(i?"AddStickersCount":"RemoveStickersCount",[s]))}}},3442:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(9099),n=i(3035),a=i(3910),o=i(2738),r=i(8487),d=i(5953);class l{constructor(e){this.tempId=0,this.detached=!0,this.promise=null,this.isUpload=!1,this.cancelable=!0,this.streamable=!1,this.tryAgainOnFail=!0,this.attachMethod="append",this.onClick=e=>{e&&(0,a.Z)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&(0,d.Z)(this,e),this.isUpload&&(this.tryAgainOnFail=!1)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&(0,o.fc)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,i=Date.now(),s=s=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const a=Date.now()-i;if(!s&&this.cancelable){this.setProgress(100);const e=150;a{t===this.tempId&&this.detach()}),e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),(0,n.T2)((()=>{this.setManual()}))):this.detach();this.promise=e=null};e.then((()=>s(null))).catch((e=>s(e))),e.addNotifyListener&&e.addNotifyListener((e=>{if(t!==this.tempId)return;const i=e.done/e.total*100;this.setProgress(i)}))}attach(e,t=!1,i){this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,i&&this.attachPromise(i);let n=0;(this.detached||this.preloader.parentElement!==e)&&(n=(0,r.Z)(this.preloader)?1:2,this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader)),(0,s.Z)(this.preloader,"is-visible",!0,200,void 0,n),this.cancelable&&t&&this.setProgress(0)}detach(){var e;this.detached||(this.detached=!0,(null===(e=this.preloader)||void 0===e?void 0:e.parentElement)&&(0,s.Z)(this.preloader,"is-visible",!1,200,(()=>{this.preloader.remove()}),1))}setProgress(e){if(this.totalLength||(0,r.Z)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},9931:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m,Y:()=>f});var s=i(4059),n=i(6740),a=i(5565),o=i(130),r=i(9674),d=i(5990),l=i(1507),c=i(3785),h=i(3512),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function f(e,t,i,o,d=new Image,l=!1){return u(this,void 0,void 0,(function*(){const l=yield h.Z.managers.acknowledged.appAvatarsManager.loadAvatar(t,i,o),c=l.result,u=l.cached;let p,m,g;if(d.classList.add("avatar-photo"),u)m=()=>{(0,a.Z)(e,d),e.dataset.color=""};else{const l=h.Z.settings.animationsEnabled;l&&d.classList.add("fade-in");let c=!1;if("photo_big"===o){const s=yield f(e,t,i,"photo_small");p=s.loadPromise,g=s.thumbImage}else if(i.stripped_thumb){g=new Image,e.classList.add("avatar-relative"),g.classList.add("avatar-photo","avatar-photo-thumbnail");const t=(0,s.Z)(i.stripped_thumb);p=(0,n.cj)(g,t).then((()=>{c||(0,a.Z)(e,g)}))}m=()=>{c=!0,g?e.append(d):(0,a.Z)(e,d),setTimeout((()=>{e.childElementCount&&r.Z.mutateElement(d,(()=>{e.dataset.color="",l&&d.classList.remove("fade-in"),g&&g.remove()}))}),l?200:0)}}const v=c.then((e=>(0,n.cj)(d,e))).then(m);return yield p||v,{cached:u,loadPromise:p||v,thumbImage:g}}))}function p(e,t,i,s){(0,o.Z)(e,t),e.dataset.color=i,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled"),s&&e.classList.add(s)}function m(e,t,i=!1,s="",n=!1,a){return u(this,void 0,void 0,(function*(){const o=h.Z.myId;if(t===o&&i)return void p(e,"","","tgico-saved");const r=h.Z.managers;if(t!==l.NM&&t.isUser()){const i=yield r.appUsersManager.getUser(t);if(i&&i.pFlags&&i.pFlags.deleted)return void p(e,"",(0,d.Z)(t),"tgico-deletedaccount")}const u=a?"photo_big":"photo_small",m=yield r.appPeersManager.getPeerPhoto(t),g=!!m,v=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!g||!v||!(yield r.appAvatarsManager.isAvatarCached(t,u))){let n="";if(!t||t===o&&i||(n=(0,d.Z)(t)),t===l.hj)return void p(e,"",n,"tgico-reply_filled");const a=yield s?(0,c.Z)(s):function(e,t=h.Z.managers){var i,s,n,a,o;return s=this,n=void 0,o=function*(){const s=yield t.appPeersManager.getPeer(e);return(0,c.Z)(null!==(i=s.title)&&void 0!==i?i:[s.first_name,s.last_name].filter(Boolean).join(" "))},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}))}(t,r);p(e,a,n,"")}return g?f(e,t,m,u,void 0,n):void 0}))}},279:(e,t,i)=>{"use strict";function s(e,t=!1){const i='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=i,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",i),e.lastElementChild}function n(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,s(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.d(t,{p:()=>n,y:()=>s}),i(410).GO.putPreloader=s},1218:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(9750),n=i(2325),a=i(3855),o=i(3512);class r{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field"),e.alignRight&&t.classList.add("radio-field-right");const i=this.input=document.createElement("input");i.type="radio",i.name="input-radio-"+e.name,e.value&&(i.value=e.value,e.stateKey&&(a.Z.getState().then((t=>{i.checked=(0,s.Z)(t,e.stateKey)===e.value})),i.addEventListener("change",(()=>{o.Z.managers.appStateManager.setByKey(e.stateKey,e.value)}))));const r=this.main=document.createElement("div");r.classList.add("radio-field-main"),e.text?r.innerHTML=e.text:e.langKey&&(0,n.$d)(r,e.langKey),t.append(i,r)}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}}},5133:(e,t,i)=>{"use strict";function s(e,t){const i=document.createElement("form");return e.forEach((e=>{const{container:s,input:n}=e;i.append(s),n.addEventListener("change",(e=>{n.checked&&t(n.value,e)}))})),i}i.d(t,{Z:()=>s})},65:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5077),n=i(3228),a=i(5953);class o{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},(0,a.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const i=this.seek=document.createElement("input");i.classList.add("progress-line__seek"),i.type="range",i.step=""+this.step,i.min=""+this.min,i.max=""+this.max,i.value=""+t,t&&this.setProgress(t);const s=""+this.step,n=s.indexOf(".");this.decimals=-1===n?0:s.length-n-1,this.container.append(this.filled,i)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=(0,s.Z)(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=(0,n.Z)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const i=this.vertical?this.rect.height:this.rect.width,s=(0,n.Z)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,i);let a=this.min+s/i*(this.max-this.min);return a-this.min<(this.max-this.min)/2&&(a-=this.step/10),a=+a.toFixed(this.decimals),a=(0,n.Z)(a,this.min,this.max),this.setProgress(a),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(a),a}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}},1405:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(8497),n=i(9674),a=i(5432),o=i(3512),r=i(5975);let d=0;function l(e,t=(()=>Promise.resolve()),i=null,l=!1,c=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");const h=document.createElement("div");let u;h.classList.add("c-ripple"),e.classList.contains("rp-square")&&h.classList.add("is-square"),e[l?"prepend":"append"](h);const f=(e,s)=>{const o=Date.now(),r=document.createElement("div"),l=d++,c=1e3*+window.getComputedStyle(h).getPropertyValue("--ripple-duration").replace("s","");u=()=>{const e=Date.now()-o,t=()=>{n.Z.mutate((()=>{r.remove()})),i&&i(l)};if(er.classList.add("hiding")),Math.max(i-c/2,0)),setTimeout(t,i)}else r.classList.add("hiding"),setTimeout(t,c/2);a.Z||window.removeEventListener("contextmenu",u),u=null,m=!1},t&&t(l),window.requestAnimationFrame((()=>{const t=h.getBoundingClientRect();r.classList.add("c-ripple__circle");const i=e-t.left,n=s-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(i-t.width/2)+t.width/2,2)),o=i-a/2,d=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=d+"px",h.append(r)}))},p=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==h)&&(c===e||!(0,r.Z)(t.target,c));let m=!1;if(a.Z){const e=()=>{u&&u()};c.addEventListener("touchstart",(t=>{if(!o.Z.settings.animationsEnabled)return;if(t.touches.length>1||m||p(t))return;m=!0;const{clientX:i,clientY:s}=t.touches[0];f(i,s),c.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),c.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else c.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===c.dataset.ripple||p(e))return;if(m)return void(m=!1);const{clientX:t,clientY:i}=e;f(t,i),window.addEventListener("mouseup",u,{once:!0,passive:!0}),window.addEventListener("contextmenu",u,{once:!0,passive:!0})}),{passive:!0})}},7479:(e,t,i)=>{"use strict";i.d(t,{De:()=>m,ZC:()=>g,ZP:()=>f,tG:()=>p});var s=i(9807),n=i(1218),a=i(1405),o=i(5133),r=i(2325),d=i(5565),l=i(130),c=i(2738),h=i(4494);const u=(e,t)=>{!0===t||("string"==typeof t?(0,l.Z)(e,t):e.append(t))};class f{constructor(e={}){this.freezed=!1,e.checkboxFieldOptions&&(e.checkboxField=new s.Z(Object.assign({listenerSetter:e.listenerSetter},e.checkboxFieldOptions)));const t=e.asLink?"a":e.radioField||e.checkboxField?"label":"div";if(this.container=document.createElement(t),this.container.classList.add("row","no-subtitle"),e.noWrap&&this.container.classList.add("no-wrap"),e.subtitle){const t=this.subtitle;if(u(t,e.subtitle),e.noWrap&&t.classList.add("no-wrap"),e.subtitleRight){this.container.append(this.subtitleRow=this.createRow()),this.subtitleRow.classList.add("row-subtitle-row");const i=this.subtitleRight=document.createElement("div");i.classList.add("row-subtitle","row-subtitle-right"),u(i,e.subtitleRight),this.subtitleRow.append(t,i)}}else e.subtitleLangKey&&this.subtitle.append((0,r.ag)(e.subtitleLangKey,e.subtitleLangArgs));let i=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),i=!0),e.checkboxField){this.checkboxField=e.checkboxField;const t=e.checkboxField.label.classList.contains("checkbox-field-toggle");if(t?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(i=!0,this.container.append(this.checkboxField.label)),e.withCheckboxSubtitle&&!t){const t=()=>{(0,d.Z)(this.subtitle,(0,r.ag)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))};e.listenerSetter?e.listenerSetter.add(this.checkboxField.input)("change",t):this.checkboxField.input.addEventListener("change",t)}}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;const i=e.titleRight||e.titleRightSecondary;if(i?(this.container.append(t=this.titleRow=this.createRow()),this.titleRow.classList.add("row-title-row")):t=this.container,this.title=this.createTitle(),e.noWrap&&this.title.classList.add("no-wrap"),e.title?u(this.title,e.title):e.titleLangKey&&this.title.append((0,r.ag)(e.titleLangKey)),t.append(this.title),i){const s=this.titleRight=document.createElement("div");s.classList.add("row-title","row-title-right"),e.titleRightSecondary&&s.classList.add("row-title-right-secondary"),u(s,i),t.append(s)}}e.icon&&(i=!0,this.title.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),i&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&(0,c.fc)(this.container,(t=>{this.freezed||e.clickable(t)}),{listenerSetter:e.listenerSetter}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||(0,a.Z)(this.container,void 0,void 0,!0)),(e.buttonRight||e.buttonRightLangKey)&&(this.buttonRight=e.buttonRight instanceof HTMLElement?e.buttonRight:(0,h.Z)("btn-primary btn-color-primary",{text:e.buttonRightLangKey}),this.container.append(this.buttonRight))}get subtitle(){var e;return null!==(e=this._subtitle)&&void 0!==e?e:this._subtitle=this.createSubtitle()}createRow(){const e=document.createElement("div");return e.classList.add("row-row"),e}createTitle(){const e=document.createElement("div");return e.classList.add("row-title"),e.setAttribute("dir","auto"),e}createSubtitle(){const e=document.createElement("div");return e.classList.add("row-subtitle"),e.setAttribute("dir","auto"),this.title?this.title.after(e):this.container.prepend(e),this.container.classList.remove("no-subtitle"),e}createMedia(e){const t=document.createElement("div");return this.applyMediaElement(t,e)}applyMediaElement(e,t){return this.container.classList.add("row-with-padding"),this.media=e,e.classList.add("row-media"),t&&e.classList.add("row-media-"+t),this.container.append(e),e}}const p=e=>new f({checkboxField:e,listenerSetter:e.listenerSetter}),m=(e,t)=>(0,o.Z)(e.map((e=>({container:e.container,input:e.radioField.input}))),t),g=(e,t)=>{const i="name-"+(8388607*Math.random()|0);let s;const a=e.map((({langPackKey:e,value:t,checked:a})=>{const o=new f({radioField:new n.Z({langKey:e,name:i,value:""+t})});return a&&(s=o.radioField),o})),o=m(a,t);return s&&(s.checked=!0),o}},8805:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>c,v7:()=>h});var s=i(5432),n=i(5003),a=i(4789),o=i(8594),r=i(3910);const d=i(4762).IS_ANDROID?200:24;class l{constructor(e,t="",i=document.createElement("div")){this.el=e,this.container=i,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.setTimeout((()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e))),e.append(this.container))}addScrollListener(){this.addedScrollListener||(this.addedScrollListener=!0,this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}))}removeScrollListener(){this.addedScrollListener&&(this.addedScrollListener=!1,this.container.removeEventListener("scroll",this.onScroll,{capture:!0}))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.addScrollListener(),this.removeHeavyAnimationListener=(0,o.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.cancelMeasure(),this.needCheckAfterAnimation=!0)}),(()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.removeScrollListener(),this.removeHeavyAnimationListener(),this.removeHeavyAnimationListener=void 0)}destroy(){this.removeListeners(),this.onAdditionalScroll=void 0,this.onScrolledTop=void 0,this.onScrolledBottom=void 0}append(e){this.container.append(e)}scrollIntoViewNew(e){return(0,a.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(clearTimeout(this.onScrollMeasure),this.onScrollMeasure=0)}}class c extends l{constructor(e,t="",i=300,s){super(e,t),this.onScrollOffset=i,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,i=this.lastScrollPosition;this.onScrolledTop&&i<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-i<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}setScrollTopSilently(e){this.lastScrollPosition=e,this.ignoreNextScrollEvent(),this.scrollTop=e}ignoreNextScrollEvent(){this.removeHeavyAnimationListener&&(this.removeScrollListener(),this.container.addEventListener("scroll",(e=>{(0,r.Z)(e),this.addScrollListener()}),{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class h extends l{constructor(e,t="",i=300,n=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=i,this.splitCount=n,this.container=a,this.container.classList.add("scrollable-x"),!s.Z){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,(0,r.Z)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},2464:(e,t,i)=>{"use strict";i.d(t,{ir:()=>Yt,dw:()=>ei,ZP:()=>ni,G7:()=>ii,RF:()=>ti});var s=i(4846),n=i(3512),a=i(5884),o=i(9331),r=i(8805),d=i(3607),l=i(3552),c=i(426),h=i(9893),u=i(503),f=i(187),p=i(2325),m=i(8119),g=i(3061),v=i(2738);class b extends l._{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(e,t=!1){this.isGeoChat=t,this.peerIds=e,this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new f.Z((e=>{this.uploadAvatar=e}));const i=new ei({}),n=document.createElement("div");n.classList.add("input-wrapper"),this.groupNameInputField=new u.ZP({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new u.ZP({label:"ChatLocation",name:"location",canBeEdited:!1}),n.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.listenerSetter.add(this.groupNameInputField.input)("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=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.groupNameInputField.value;let t;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;t=this.managers.appChatsManager.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),this.peerIds.length&&this.managers.appChatsManager.inviteToChannel(e,this.peerIds),e)))}else this.nextBtn.disabled=!0,t=this.managers.appChatsManager.createChat(e,this.peerIds.map((e=>e.toUserId()))).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),e)));t&&t.then((e=>{this.close(),s.Z.setInnerPeer({peerId:e.toPeerId(!0)})}))}),{listenerSetter:this.listenerSetter});const a=new ei({name:"Members",nameArgs:[this.peerIds.length]}),o=this.list=h.default.createChatList({new:!0});return a.content.append(o),i.content.append(this.avatarEdit.container,n),this.content.append(this.nextBtn),this.scrollable.append(i.container,a.container),t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(p.ZP.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),Promise.all(this.peerIds.map((e=>{return t=this,i=void 0,n=function*(){const{dom:t}=h.default.addDialogNew({peerId:e,container:this.list,rippleEnabled:!1,avatarSize:"abitbigger"});t.lastMessageSpan.append((0,g.Z)(yield this.managers.appUsersManager.getUser(e)))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})))}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}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,w=i(6360),S=i(632),C=i(410),L=i(5322),E=i(4494),I=i(6024),M=i(7479),P=i(5565),Z=i(144);function k(e){const t=[],i={users:[],chats:[]},s={users:[],chats:[]};return e.forEach((e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueAllowUsers":i.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueDisallowUsers":s.users.push(...e.users)}})),{type:t[0],disallowPeers:s,allowPeers:i}}!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(y||(y={}));const T=y;var x=i(1218),A=i(5670);class _{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],i=this.radioSection.caption;t?t instanceof HTMLElement?(0,P.Z)(i,t):(0,p.$d)(i,t):i.innerHTML="",i.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===T.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===T.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse();const t=e.managers;this.radioSection=new ei({name:e.title,caption:!0}),this.radioRows=new Map;let i=[{type:T.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:T.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:T.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(i=i.filter((t=>!e.skipTypes.includes(t.type))));const s=(0,Z.a)();i.forEach((({type:e,langKey:t})=>{const i=new M.ZP({radioField:new x.Z({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)}));const n=(0,M.De)([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(n),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=ti(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach((i=>{i.row=new M.ZP(i),i.row.container.addEventListener("click",(()=>{a.then((()=>{const t=this.peerIds[i.key];e.tab.slider.createTab(A.Z).open({type:"privacy",skippable:!0,title:i.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),i.row.subtitle.innerHTML="",i.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})}))})),t.append(i.row.container)}))}const a=t.appPrivacyManager.getPrivacy(e.inputKey).then((i=>{const s=k(i);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach((e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map((e=>e.toPeerId()))),t.push(...i.chats.map((e=>e.toPeerId(!0)))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))}))),e.tab.eventListener.addEventListener("destroy",(()=>{return i=this,s=void 0,a=function*(){const i=[];switch(this.type){case T.Everybody:i.push({_:"inputPrivacyValueAllowAll"});break;case T.Contacts:i.push({_:"inputPrivacyValueAllowContacts"});break;case T.Nobody:i.push({_:"inputPrivacyValueDisallowAll"})}if(this.exceptions){const e=[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]];for(const[s,n,a]of e){if(this.exceptions.get(s).row.container.classList.contains("hide"))continue;const e=this.peerIds[s];if(e){const s=this.splitPeersByType(e);s.chats.length&&i.push({_:n,chats:s.chats}),s.users.length&&i.push({_:a,users:yield Promise.all(s.users.map((e=>t.appUsersManager.getUserInput(e))))})}}}t.appPrivacyManager.setPrivacy(e.inputKey,i)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}),{once:!0})}))}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach((e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)})),t}generateStr(e){return e.users.length||e.chats.length?(0,p.v_)([e.users.length?(0,p.ag)("Users",[e.users.length]):null,e.chats.length?(0,p.ag)("Chats",[e.chats.length]):null].filter(Boolean),!1):[(0,p.ag)("PrivacySettingsController.AddUsers")]}}var F=i(2796),D=i(2166),R=i(3910);function B(e={}){const t=document.createElement("a");if(t.classList.add("anchor-copy"),e.mePath){const i="https://t.me/"+e.mePath;t.href=t.innerText=i}return(0,v.fc)(t,(e=>{(0,R.Z)(e),(0,D.T)(t.href),(0,F.bC)({langPackKey:"LinkCopied"})})),t}class N extends I.h{init(){return e=this,t=void 0,s=function*(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e="+"+(yield this.managers.appUsersManager.getSelf()).phone,t=document.createElement("div");t.append((0,p.ag)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),(0,p.ag)("PrivacyPhoneInfo4"),document.createElement("br"),B({mePath:e}));const i=new _({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[t,t,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{n.setRadio(T.Everybody),n.radioSection.container.classList.toggle("hide",e!==T.Nobody)},managers:this.managers}),s="PrivacyPhoneInfo3",n=new _({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:[s,s,""],noExceptions:!0,skipTypes:[T.Nobody],managers:this.managers});this.scrollable.container.insertBefore(n.radioSection.container,i.radioSection.container.nextSibling)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var O=i(8127),U=i(5772),H=i(279);class z extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new ei({captionOld:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=document.createElement("div");(0,U.Z)({emoji:"🥳",div:t,width:160,height:160}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=(0,E.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});(0,v.fc)(n,(e=>{this.close()})),this.slider.sliceTabsUntilTab(At,this),s.append(n),i.append(s),this.scrollable.container.append(e.container)}}var j=i(4489),G=i(4762);function V(e){return!G.IS_MOBILE_SAFARI||!e}var K=i(1656);class W extends l._{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 ei({captionOld:!0,noDelimiter:!0});(0,p.$d)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=document.createElement("div");(0,U.Z)({div:t,width:160,height:160,emoji:"📬"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.codeInputField=new j.Z({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),this.managers.passwordManager.confirmPasswordEmail(""+e).then((e=>{r()})).catch((e=>{switch(e.type){case"CODE_INVALID":n.input.classList.add("error"),(0,P.Z)(n.label,(0,p.ag)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":n.input.classList.add("error"),(0,P.Z)(n.label,(0,p.ag)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)}))}}),a=(0,E.Z)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),o=(0,E.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),r=()=>{this.slider.createTab(z).open()},d=e=>{(0,K.Z)([n.input,a,o],e)};(0,v.fc)(a,(e=>{d(!0),this.managers.passwordManager.cancelPasswordEmail().then((e=>{this.slider.sliceTabsUntilTab(q,this),this.close()}),(()=>{d(!1)}))})),(0,v.fc)(o,(e=>{d(!0);const t=(0,H.y)(o);this.managers.passwordManager.resendPasswordEmail().then((e=>{t.remove(),d(!1)}))})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){V(this.isFirst)&&this.codeInputField.input.focus()}}var $=i(1171);class q extends l._{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new ei({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,U.Z)({div:t,width:160,height:160,emoji:"💌"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.inputField=new u.ZP({name:"recovery-email",label:"RecoveryEmail",plainText:!0});n.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,R.Z)(e),d()})),n.input.addEventListener("input",(e=>{n.input.classList.remove("error")}));const a=(0,E.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,E.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=()=>{this.slider.createTab(z).open()},d=()=>{const e=n.value.trim(),t=(0,$.Z)(e);if(!t||t[0].length!==e.length)return void n.input.classList.add("error");l(!0);const i=(0,H.y)(a);this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then((e=>{r()}),(t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const i=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],s=this.slider.createTab(W);s.state=this.state,s.email=e,s.length=i,s.open()}else console.log("password set error",t);l(!1),i.remove()}))};(0,v.fc)(a,d);const l=e=>{e?(a.setAttribute("disabled","true"),o.setAttribute("disabled","true")):(a.removeAttribute("disabled"),o.removeAttribute("disabled"))};(0,v.fc)(o,(e=>{new O.Z("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{l(!0),(0,H.y)(o),this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then((()=>{r()}),(e=>{l(!1)}))},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){V(this.isFirst)&&this.inputField.input.focus()}}var Q=i(130),Y=i(8115),J=i(4425),X=i(6830),ee=i(3083);class te extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new ei({noDelimiter:!0}),t=document.createElement("div");(0,U.Z)({div:t,width:160,height:160,emoji:"💡"}),e.content.append(t);const i=document.createElement("div");i.classList.add("input-wrapper");const s=this.inputField=new u.ZP({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});s.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,R.Z)(e),s.value?r():d()}));const n=(e,t)=>{e&&(0,R.Z)(e);const i=t?s.value:void 0;if(i&&this.newPassword===i)return void(0,F.Am)(p.ZP.format("PasswordAsHintError",!0));const n=this.slider.createTab(q);n.state=this.state,n.plainPassword=this.plainPassword,n.newPassword=this.newPassword,n.hint=i,n.open()},a=(0,E.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,E.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=e=>n(e,!0),d=e=>n(e,!1);(0,v.fc)(a,r),(0,v.fc)(o,d),i.append(s.container,a,o),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class ie extends l._{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 ei({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const i=this.passwordInputField=new X.Z({name:"re-enter-password",label:"PleaseReEnterPassword"}),s=new ee.Z(i,157),n=(0,E.Z)("btn-primary btn-color-primary",{text:"Continue"});t.append(i.container,n),e.content.append(s.container,t),this.scrollable.container.append(e.container),i.input.addEventListener("keypress",(e=>{if(i.input.classList.contains("error")&&i.setState(u.I1.Neutral),"Enter"===e.key)return o()}));const a=()=>this.newPassword===i.value||(i.setError(),!1),o=e=>{if(e&&(0,R.Z)(e),!a())return;const t=this.slider.createTab(te);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return(0,v.fc)(n,o),s.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class se extends l._{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 ei({noDelimiter:!0}),i=document.createElement("div");i.classList.add("input-wrapper");const s=this.passwordInputField=new X.Z({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?(0,Y.Z)(this.state.hint):void 0}),n=new J.Z(s,157),a=(0,E.Z)("btn-primary btn-color-primary"),o=new p.ZP.IntlElement({key:"Continue"});a.append(o.element),i.append(s.container,a),t.content.append(n.container,i),this.scrollable.container.append(t.container),s.input.addEventListener("keypress",(e=>{if(s.input.classList.contains("error")&&(s.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()}));const r=()=>!!s.value.length||(s.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&(0,R.Z)(e),!r())return;const t=this.slider.createTab(ie);t.state=this.state,t.newPassword=s.value,t.plainPassword=this.plainPassword,t.open()};else{let e;const t=()=>(e||(e=window.setInterval(t,1e4)),this.managers.passwordManager.getState().then((e=>{this.state=e,this.state.hint?(0,Q.Z)(s.label,(0,Y.Z)(this.state.hint)):(0,P.Z)(s.label,(0,p.ag)("LoginPassword"))})));d=i=>{if(!r())return void(0,R.Z)(i);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const d=(0,H.y)(a),l=s.value;this.managers.passwordManager.check(s.value,this.state).then((t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=this.slider.createTab(ne);t.state=this.state,t.plainPassword=l,t.open(),this.slider.removeTabFromHistory(this)}}),(e=>{a.removeAttribute("disabled"),s.input.classList.add("error"),e.type,o.key="PASSWORD_HASH_INVALID",o.update(),d.remove(),s.select(),t()}))},t()}return(0,v.fc)(a,d),n.load()}onOpenAfterTimeout(){V(this.isFirst)&&this.passwordInputField.input.focus()}}class ne extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new ei({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,U.Z)({div:t,width:168,height:168,emoji:"🔐"}),e.content.append(t);const i=e.generateContentElement();if(this.state.pFlags.has_password){(0,p.$d)(e.caption,"TwoStepAuth.GenericHelp");const t=(0,E.Z)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=(0,E.Z)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=(0,E.Z)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});(0,v.fc)(t,(()=>{const e=this.slider.createTab(se);e.state=this.state,e.plainPassword=this.plainPassword,e.open()})),(0,v.fc)(s,(()=>{new O.Z("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{this.managers.passwordManager.updateSettings({currentPassword:this.plainPassword}).then((()=>{this.slider.sliceTabsUntilTab(At,this),this.close()}))},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()})),(0,v.fc)(n,(()=>{const e=this.slider.createTab(q);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{(0,p.$d)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=(0,E.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),(0,v.fc)(s,(e=>{const t=this.slider.createTab(se);t.state=this.state,t.open()}))}this.scrollable.container.append(e.container)}}class ae extends I.h{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new _({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,managers:this.managers})}}class oe extends I.h{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 _({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[T.Nobody],managers:this.managers})}}class re extends I.h{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 _({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class de extends I.h{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 _({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[T.Nobody],managers:this.managers})}}class le extends I.h{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new _({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers});{const e="PrivacySettingsController.P2p.Desc";new _({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}}var ce=i(3003),he=i(8497),ue=i(4064),fe=i(6976),pe=i(1483),me=i(3416);class ge extends I.h{init(){this.header.classList.add("with-border"),this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new M.ZP({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:(0,S.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))});t.container.dataset.hash=""+e.hash;const i=document.createElement("div");return i.classList.add("row-midtitle"),i.innerHTML=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t.subtitle.parentElement.insertBefore(i,t.subtitle),t},t=this.authorizations.slice();{const n=new ei({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=(0,ue.Z)(t,(e=>e.pFlags.current)),o=e(a);if(n.content.append(o.container),t.length){const e=(0,E.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});(0,v.fc)(e,(t=>{new O.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=(0,K.Z)([e],!0);this.managers.apiManager.invokeApi("auth.resetAuthorizations").then((t=>{e.remove(),i.container.remove()}),s).finally((()=>{t()}))}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()})),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const i=new ei({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach((t=>{i.content.append(e(t).container)})),this.scrollable.append(i.container);const s=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&&(0,F.Am)(p.ZP.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new O.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{this.managers.apiManager.invokeApi("account.resetAuthorization",{hash:e}).then((e=>{e&&n.remove()}),s)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=(0,ce.Z)([{icon:"stop",text:"Terminate",onClick:a}]);o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,fe.E)(this.scrollable.container,(e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,pe.Z)(e,o),me.Z.openBtnMenu(o))})),(0,v.fc)(this.scrollable.container,(e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()}))}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var ve=i(2995),be=i(4668),ye=i(8210);class we extends l._{init(){this.header.classList.add("with-border"),this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new ei({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(t),(0,v.fc)(t,(e=>{new ve.Z({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{this.managers.appUsersManager.toggleBlock(e,!0)}})}),{listenerSetter:this.listenerSetter});const i=h.default.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(i);const s=(e,t)=>{return s=this,n=void 0,o=function*(){const{dom:s}=h.default.addDialogNew({peerId:e,container:i,rippleEnabled:!0,avatarSize:"abitbigger",append:t}),n=yield this.managers.appUsersManager.getUser(e);n.pFlags.bot?s.lastMessageSpan.append("@"+n.username):n.phone?s.lastMessageSpan.innerHTML=(0,ye.Z)(n.phone):s.lastMessageSpan.append(n.username?"@"+n.username:(0,g.Z)(n))},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o};for(const e of this.peerIds)s(e,!0);let a;const o=this.menuElement=(0,ce.Z)([{icon:"lockoff",text:"Unblock",onClick:()=>{const e=a.dataset.peerId.toPeerId();this.managers.appUsersManager.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]);o.id="blocked-users-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,fe.E)(this.scrollable.container,(e=>{a=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG),a&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,pe.Z)(e,o),me.Z.openBtnMenu(o))}),this.listenerSetter),this.listenerSetter.add(n.Z)("peer_block",(e=>{const{peerId:t,blocked:n}=e,a=i.querySelector(`[data-peer-id="${t}"]`);n?a||s(t,!1):a&&a.remove()}));let r=!1;this.scrollable.onScrolledBottom=()=>{r||(r=!0,this.managers.appUsersManager.getBlocked(i.childElementCount,50).then((e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||i.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 Se=i(9807);function Ce(e){return"input"+(e[0].toUpperCase()+e.slice(1))}var Le=i(5592),Ee=i(319);class Ie extends I.h{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-voices"),this.setTitle("PrivacyVoiceMessages");const e="PrivacyVoiceMessagesInfo";new _({tab:this,title:"PrivacyVoiceMessagesTitle",inputKey:"inputPrivacyKeyVoiceMessages",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class Me extends I.h{static getInitArgs(e){return{appConfig:e.managers.apiManager.getAppConfig(),globalPrivacy:e.managers.appPrivacyManager.getGlobalPrivacySettings(),contentSettings:e.managers.apiManager.invokeApi("account.getContentSettings")}}init(e){this.header.classList.add("with-border"),this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");const t="Loading";{const e=new ei({noDelimiter:!0,caption:"SessionsInfo"});let i;const s=new M.ZP({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(we);e.peerIds=i,e.open()},listenerSetter:this.listenerSetter});let a;s.freezed=!0;const o={icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:t,clickable:e=>{let t;a.pFlags.has_password?t=this.slider.createTab(se):a.email_unconfirmed_pattern?(t=this.slider.createTab(W),t.email=a.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,this.managers.passwordManager.resendPasswordEmail()):t=this.slider.createTab(ne),t.state=a,t.open()},listenerSetter:this.listenerSetter},r=new M.ZP(o);r.freezed=!0;const d=this.activeSessionsRow=new M.ZP({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.updateActiveSessions()}),{once:!0}),e.open()},listenerSetter:this.listenerSetter});d.freezed=!0,e.content.append(s.container,r.container,d.container),this.scrollable.append(e.container);const l=e=>{e?(0,P.Z)(s.subtitle,(0,p.ag)("PrivacySettingsController.UserCount",[e])):(0,P.Z)(s.subtitle,(0,p.ag)("BlockedEmpty",[e]))};this.listenerSetter.add(n.Z)("peer_block",(()=>{c()}));const c=()=>{this.managers.appUsersManager.getBlocked().then((e=>{s.freezed=!1,l(e.count),i=e.peerIds}))};c(),this.managers.passwordManager.getState().then((e=>{a=e,(0,P.Z)(r.subtitle,(0,p.ag)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),r.freezed=!1})),this.updateActiveSessions()}{const e=new ei({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});e.content.classList.add("privacy-navigation-container");const i={},s=i.inputPrivacyKeyPhoneNumber=new M.ZP({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(N).open()},listenerSetter:this.listenerSetter}),a=i.inputPrivacyKeyStatusTimestamp=new M.ZP({titleLangKey:"LastSeenTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(ae).open()},listenerSetter:this.listenerSetter}),o=i.inputPrivacyKeyProfilePhoto=new M.ZP({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(oe).open()},listenerSetter:this.listenerSetter}),r=i.inputPrivacyKeyPhoneCall=new M.ZP({titleLangKey:"WhoCanCallMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(le).open()},listenerSetter:this.listenerSetter}),d=i.inputPrivacyKeyForwards=new M.ZP({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(re).open()},listenerSetter:this.listenerSetter}),l=i.inputPrivacyKeyChatInvite=new M.ZP({titleLangKey:"WhoCanAddMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(de).open()},listenerSetter:this.listenerSetter}),c=i.inputPrivacyKeyVoiceMessages=new M.ZP({titleLangKey:"PrivacyVoiceMessagesTitle",subtitleLangKey:t,clickable:()=>{n.Z.premium?this.slider.createTab(Ie).open():(0,F.bC)({langPackKey:"PrivacyVoiceMessagesPremiumOnly"})},listenerSetter:this.listenerSetter}),h=e=>{const t=i[e];t&&this.managers.appPrivacyManager.getPrivacy(e).then((e=>{const i=k(e),s=i.type===T.Everybody?"PrivacySettingsController.Everbody":i.type===T.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=i.disallowPeers.users.length+i.disallowPeers.chats.length,a=i.allowPeers.users.length+i.allowPeers.chats.length;t.subtitle.innerHTML="";const o=(0,p.ag)(s);t.subtitle.append(o),(n||a)&&t.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)}))};e.content.append(s.container,a.container,o.container,r.container,d.container,l.container,c.container),this.scrollable.append(e.container);for(const e in i)h(e);n.Z.addEventListener("privacy_update",(e=>{h(Ce(e.key._))}))}const i=[];{const t=new ei({name:"NewChatsFromNonContacts",caption:"ArchiveAndMuteInfo"}),s=new Se.Z({text:"ArchiveAndMute"}),a=new M.ZP({checkboxField:s});let o,r;t.content.append(a.container),this.eventListener.addEventListener("destroy",(()=>{if(r=!0,void 0!==o&&o!==s.checked)return this.managers.appPrivacyManager.setGlobalPrivacySettings({_:"globalPrivacySettings",archive_and_mute_new_noncontact_peers:s.checked})}),{once:!0});const d=Promise.all([e.appConfig,e.globalPrivacy]).then((([e,i])=>{if(r)return;const a=i=>{t.container.classList.toggle("hide",!i&&!e.autoarchive_setting_available)};this.listenerSetter.add(n.Z)("premium_toggle",a),a(n.Z.premium),o=!!i.archive_and_mute_new_noncontact_peers,s.setValueSilently(o)}));i.push(d),this.scrollable.append(t.container)}{const t=new ei({name:"Privacy.SensitiveContent",caption:"PrivacyAndSecurity.SensitiveDesc"});t.container.classList.add("hide");const s=new Se.Z({text:"PrivacyAndSecurity.SensitiveText"}),n=new M.ZP({checkboxField:s});let a;t.content.append(n.container),this.eventListener.addEventListener("destroy",(()=>{if(void 0===a)return;const e=n.checkboxField.checked;return e!==a?this.managers.apiManager.invokeApi("account.setContentSettings",{sensitive_enabled:e}):void 0}),{once:!0});const o=e.contentSettings.then((e=>{e.pFlags.sensitive_can_change&&(a=!!e.pFlags.sensitive_enabled,s.setValueSilently(a),t.container.classList.remove("hide"))}));i.push(o),this.scrollable.append(t.container)}{const e=new ei({name:"PrivacyPayments",caption:"PrivacyPaymentsClearInfo"}),t=()=>{const e={titleLangKey:"PrivacyPaymentsClearAlertTitle",descriptionLangKey:"PrivacyPaymentsClearAlertText",button:{langKey:"Clear"},checkboxes:[{text:"PrivacyClearShipping",checked:!0},{text:"PrivacyClearPayment",checked:!0}]};(0,Le.Z)(e).then((()=>{const[t,s]=e.checkboxes.map((e=>e.checkboxField.checked)),n=(0,K.Z)([i],!0);this.managers.appPaymentsManager.clearSavedInfo(t,s).then((()=>{(t||s)&&(n(),(0,F.bC)({langPackKey:t&&s?"PrivacyPaymentsPaymentShippingCleared":t?"PrivacyPaymentsShippingInfoCleared":"PrivacyPaymentsPaymentInfoCleared"}))}))}),Ee.Z)},i=(0,E.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyPaymentsClear"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}{const e=new ei({name:"FilterChats"}),t=()=>{new O.Z("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=(0,K.Z)([i],!0);this.managers.appDraftsManager.clearAllDrafts().then((()=>{e()}))},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},i=(0,E.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}return Promise.all(i)}updateActiveSessions(){this.managers.apiManager.invokeApi("account.getAuthorizations").then((e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,(0,p.$d)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])}))}}var Pe=i(65),Ze=i(6740);function ke(e){const t=e.getContext("2d"),i=new Array(4).fill(0),s=t.getImageData(0,0,e.width,e.height).data,n=s.length/4;for(let e=0;e0&&(i=Math.min(100,i+5+.1*(100-i))),s=Math.max(0,.65*s),`hsla(${t}, ${i}%, ${s}%, .4)`}var Fe=i(8479),De=i(9674),Re=i(1571),Be=i(2312),Ne=i(3442),Oe=i(6724),Ue=i(6714),He=i(5077),ze=i(3228);class je{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(je.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 u.ZP({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new u.ZP({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=je.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",(()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),i=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(i?u.I1.Neutral:u.I1.Error),e="#"+e,this.hexInputField.setValueSilently(e),i&&this.setColor(e,!1,!0)}));const i=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",(()=>{const e=this.rgbInputField.value.match(i);this.rgbInputField.setState(e?u.I1.Neutral:u.I1.Error),e&&this.setColor((0,Ae.dI)(+e[1],+e[2],+e[3]),!0,!1)})),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){(0,He.Z)(this.elements.box,(()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()}),(e=>{this.saturationHandler(e.x,e.y)}),(()=>{this.onGrabEnd()}))}attachHueListeners(){(0,He.Z)(this.elements.hue,(()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()}),(e=>{this.hueHandler(e.x)}),(()=>{this.onGrabEnd()}))}setColor(e,t=!0,i=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=(0,Ae.cw)(e);else{const t=e.match(/[.?\d]+/g);e=(0,Ae.dI)(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const s=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+s,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,i)}getCurrentColor(){const e=(0,Ae.Y6)(this.hue,this.saturation,this.lightness,this.alpha),t=(0,Ae.t1)(e),i=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:i,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const i=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",i.hex),e&&(this.hexInputField.setValueSilently(i.hex),this.hexInputField.setState(u.I1.Neutral)),t&&(this.rgbInputField.setValueSilently(i.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(u.I1.Neutral)),this.onChange&&this.onChange(i)}hueHandler(e,t=!0){const i=(0,ze.Z)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*i);const s=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*i+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",s),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",s),t&&this.updatePicker()}saturationHandler(e,t,i=!0){const s=this.boxRect.width,n=this.boxRect.height,a=(0,ze.Z)(e-this.boxRect.left,0,s)/s*100,o=(0,ze.Z)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const d=(0,ze.Z)(a,0,100),l=100-d/2,c=100-(0,ze.Z)(o,0,100),h=(0,ze.Z)(c/100*l,0,100);this.saturation=d,this.lightness=h,i&&this.updatePicker()}}je.BASE_CLASS="color-picker";class Ge extends l._{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=(0,Ae.Pi)(e),i=this.theme.background,a=_e(t);i.id="2",i.intensity=0,i.slug="",i.color=e.toLowerCase(),i.highlightningColor=a,this.managers.appStateManager.pushToState("settings",n.Z.settings),s.Z.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=Ue.Z.getTheme();const e=new ei({});this.colorPicker=new je,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new ei({}),i=this.grid=document.createElement("div");i.classList.add("grid"),["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach((e=>{const t=document.createElement("div");t.classList.add("grid-item"),t.dataset.color=e.toLowerCase();const s=document.createElement("div");s.classList.add("grid-item-media"),s.style.backgroundColor=e,t.append(s),i.append(t)})),(0,v.fc)(i,(e=>{const t=(0,he.Z)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const i=t.dataset.color;i&&this.applyColor(i)}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container),this.applyColor=(0,Oe.Z)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,i=t.color?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==i&&(e&&e.classList.remove("active"),i&&i.classList.add("active"))}onOpen(){setTimeout((()=>{const e=this.theme.background,t=(e.color||"").split(",")[0],i=!!t&&!e.slug;i&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(t||"#cccccc"),i||(this.colorPicker.onChange=this.onColorChange)}),0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}var Ve=i(7030),Ke=i(236),We=i(7814),$e=i(9405),qe=i(9492),Qe=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ye extends l._{constructor(){super(...arguments),this.tempId=0,this.clicked=new Set,this.wallPapersByElement=new Map,this.elementsByKey=new Map,this.onUploadClick=()=>{(function(e){const t=document.createElement("input");t.type="file",t.style.display="none",t.accept=e,document.body.append(t);const i=new Promise(((e,i)=>{t.addEventListener("change",(t=>{const s=t.target.files[0];s?e(s):i("NO_FILE_SELECTED")}),{once:!0})})).finally((()=>{t.remove()}));return t.click(),i})("image/x-png,image/png,image/jpeg").then((e=>Qe(this,void 0,void 0,(function*(){if(e.name.endsWith(".png")){const t=document.createElement("img"),i=URL.createObjectURL(e);yield(0,Ze.cj)(t,i,!1);const s="image/jpeg",{blob:n}=yield(0,We.Z)({media:t,size:new $e.c(t.naturalWidth,t.naturalHeight),mimeType:s});e=new File([n],e.name.replace(/\.png$/,".jpg"),{type:s})}const t=yield this.managers.appDocsManager.prepareWallPaperUpload(e),i=this.managers.appDocsManager.uploadWallPaper(t.id),s=Be.Z.getNewDeferredForUpload(e.name,i),n=(0,xe.Z)();n.addNotifyListener=s.addNotifyListener,n.cancel=s.cancel,s.then((e=>{this.clicked.delete(a),this.elementsByKey.delete(a),this.wallPapersByElement.set(r,e);const t=this.getWallPaperKey(e);this.elementsByKey.set(t,r),this.setBackgroundDocument(e).then(n.resolve,n.reject)}),n.reject);const a=this.getWallPaperKey(t);n.catch((()=>{r.remove()}));const o=new Ne.Z({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),r=this.addWallPaper(t,!1);this.clicked.add(a),o.attach(r,!1,n)}))))},this.onResetClick=()=>{const e=Ke.h.settings.themes.find((e=>e.name===this.theme.name));e&&(++this.tempId,this.theme.background=(0,Fe.Z)(e.background),this.managers.appStateManager.pushToState("settings",n.Z.settings),s.Z.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=(0,he.Z)(e.target,"grid-item");if(!t)return;const i=this.wallPapersByElement.get(t);if("wallPaperNoFile"===i._)return void this.setBackgroundDocument(i);const s=this.getWallPaperKey(i);if(this.clicked.has(s))return;this.clicked.add(s);const n=i.document,a=new Ne.Z({cancelable:!0,tryAgainOnFail:!1}),o=()=>Qe(this,void 0,void 0,(function*(){const e=this.setBackgroundDocument(i);(yield this.managers.thumbsStorage.getCacheContext(n)).url&&!this.theme.background.blur||a.attach(t,!0,e)}));a.construct(),(0,v.fc)(t,(e=>{a.preloader.parentElement?(a.onClick(e),a.detach()):o()}),{listenerSetter:this.listenerSetter}),o()},this.saveToCache=(e,t)=>{fetch(t).then((t=>{s.Z.cacheStorage.save("backgrounds/"+e,t)}))},this.setBackgroundDocument=e=>{const t=++this.tempId,i=()=>t===this.tempId,a=e.document,o=(0,xe.Z)();let r;return a?(r=Be.Z.downloadMediaURL({media:a,queueId:s.Z.chat.bubbles?s.Z.chat.bubbles.lazyLoadQueue.queueId:0}),o.addNotifyListener=r.addNotifyListener,o.cancel=r.cancel):r=Promise.resolve(),r.then((()=>Qe(this,void 0,void 0,(function*(){if(!i())return void o.resolve();const t=this.theme.background,r=a=>{let r;const d=this.getColorsFromWallPaper(e);if(a&&!d)r=function(e){const t=document.createElement("img");return(0,Ze.cj)(t,e,!1).then((()=>function(e,t,i){const s=document.createElement("canvas"),n=t/i;return 1===n?(s.width=50,s.height=s.width/n):n>1?(s.height=50,s.width=s.height/n):s.width=s.height=50,s.getContext("2d").drawImage(e,0,0,t,i,0,0,s.width,s.height),ke(s)}(t,t.naturalWidth,t.naturalHeight)))}(a);else{const{canvas:e}=Re.Z.create(d);r=Promise.resolve(ke(e))}r.then((r=>{var l,c,h;if(!i())return void o.resolve();const u=_e(Array.from(r)),f=null!==(l=e.slug)&&void 0!==l?l:"";t.id=e.id,t.intensity=null!==(h=null===(c=e.settings)||void 0===c?void 0:c.intensity)&&void 0!==h?h:0,t.color=d,t.slug=f,t.highlightningColor=u,this.managers.appStateManager.pushToState("settings",n.Z.settings),f&&this.saveToCache(f,a),s.Z.applyCurrentTheme(f,a,!0).then(o.resolve)}))};if(!a)return void r();const d=yield this.managers.thumbsStorage.getCacheContext(a);t.blur?setTimeout((()=>{const{canvas:e,promise:t}=(0,Te.Z)(d.url,12,4);t.then((()=>{i()?r(e.toDataURL()):o.resolve()}))}),200):r(d.url)})))),o},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));e!==t&&(e&&e.classList.remove("active"),t&&t.classList.add("active"))}}get theme(){return Ue.Z.getTheme()}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground");{const e=ti(this.scrollable),i=(0,E.Z)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),s=(0,E.Z)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),a=(0,E.Z)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});(0,v.fc)(i,this.onUploadClick,{listenerSetter:this.listenerSetter}),(0,v.fc)(s,(()=>{this.slider.createTab(Ge).open()}),{listenerSetter:this.listenerSetter}),(0,v.fc)(a,this.onResetClick,{listenerSetter:this.listenerSetter});const o=this.blurCheckboxField=new Se.Z({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur});this.listenerSetter.add(o.input)("change",(()=>Qe(this,void 0,void 0,(function*(){this.theme.background.blur=o.input.checked,yield this.managers.appStateManager.pushToState("settings",n.Z.settings),setTimeout((()=>{const e=t.querySelector(".active");if(!e)return;const i=this.wallPapersByElement.get(e);i.pFlags.pattern||"wallPaperNoFile"===i._||this.setBackgroundDocument(i)}),100)})))),e.append(i,s,a,(0,M.tG)(o).container)}n.Z.addEventListener("background_change",this.setActive),this.managers.appDocsManager.getWallPapers().then((e=>{e.forEach((e=>{this.addWallPaper(e)}))}));const e=ti(this.scrollable),t=this.grid=document.createElement("div");t.classList.add("grid"),(0,v.fc)(t,this.onGridClick,{listenerSetter:this.listenerSetter}),e.append(t)}getColorsFromWallPaper(e){return e.settings?[e.settings.background_color,e.settings.second_background_color,e.settings.third_background_color,e.settings.fourth_background_color].filter(Boolean).map((e=>"#"+e.toString(16))).join(","):""}getWallPaperKey(e){return""+e.id}getWallPaperKeyFromTheme(e){return""+e.background.id}addWallPaper(e,t=!0){const i=this.getColorsFromWallPaper(e),s="wallPaper"===e._;if(s&&e.pFlags.pattern&&!i)return;const n=!!e.pFlags.dark,a=s?e.document:void 0,o=document.createElement("div");o.classList.add("grid-item"),o.dataset.id=""+e.id;const r=this.getWallPaperKey(e);this.wallPapersByElement.set(o,e),this.elementsByKey.set(r,o);const d=document.createElement("div");let l,c;if(d.classList.add("grid-item-media"),s?(c=(0,Ve.Z)(a,200,200),l=(0,qe.Z)({photo:a,message:null,container:d,withoutPreloader:!0,size:c,noFadeIn:e.pFlags.pattern}),e.pFlags.pattern&&d.classList.add("is-pattern"),l.then((({loadPromises:e,images:t})=>Qe(this,void 0,void 0,(function*(){return(yield e.thumb)||e.full,t})))).then((t=>{var i;e.pFlags.pattern&&(n?(t.full.style.display="none",t.thumb&&(t.thumb.style.display="none")):(null===(i=e.settings)||void 0===i?void 0:i.intensity)&&(t.full.style.opacity=""+Math.abs(e.settings.intensity)/100)),De.Z.mutate((()=>{o.append(d)}))}))):o.append(d),e.settings&&void 0!==e.settings.background_color){const{canvas:t}=Re.Z.create(i);t.classList.add("background-colors-canvas"),n&&s?l.then((({loadPromises:i})=>{i.full.then((()=>Qe(this,void 0,void 0,(function*(){const i=yield this.managers.thumbsStorage.getCacheContext(a,c.type);t.style.webkitMaskImage=`url(${i.url})`,t.style.opacity=""+(e.pFlags.dark?100+e.settings.intensity:e.settings.intensity)/100,d.append(t)}))))})):d.append(t)}return this.getWallPaperKeyFromTheme(this.theme)===r&&o.classList.add("active"),this.grid[t?"append":"prepend"](o),o}}var Je=i(8938),Xe=i(2153),et=i(6787),tt=i(6761);var it=i(3731),st=i(62);class nt extends I.Z{init(){return this.header.classList.add("with-border"),this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([this.managers.appReactionsManager.getQuickReaction(),this.managers.appReactionsManager.getAvailableReactions()]).then((([e,t])=>{t=t.filter((e=>!e.pFlags.inactive));const i=new ei,s=t.map((t=>{const i=new x.Z({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),s=new M.ZP({radioField:i,havePadding:!0});return i.main.classList.add("quick-reaction-title"),(0,st.Z)({row:s,doc:t.static_icon,size:"small"}),t.reaction===e.reaction&&i.setValueSilently(!0),s})),n=(0,M.De)(s,(e=>{this.managers.appReactionsManager.setDefaultReaction({_:"reactionEmoji",emoticon:e})}));i.content.append(n),this.scrollable.append(i.container)}))}}var at=i(1273);class ot{constructor(e,t,i,s,n,a=!0){const o="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(o);const r=document.createElement("div");r.classList.add(o+"-details");const d=document.createElement("div");d.classList.add(o+"-name"),(0,p.$d)(d,e);const l=this.valueContainer=document.createElement("div");l.classList.add(o+"-value"),a&&(l.innerHTML=""+i),r.append(d,l),this.range=new Pe.Z({step:t,min:s,max:n},i),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(l.innerText=""+e)}}),this.container.append(r,this.range.container)}}class rt extends I.h{init(){this.header.classList.add("with-border"),this.container.classList.add("general-settings-container"),this.setTitle("General");const e=ti.bind(null,this.scrollable);{const t=e("Settings"),i=new ot("TextSize",1,n.Z.settings.messagesTextSize,12,20);i.onChange=e=>{n.Z.managers.appStateManager.setByKey("settings.messagesTextSize",e)};const s=(0,E.Z)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});(0,v.fc)(s,(()=>{this.slider.createTab(Ye).open()}));const a=new Se.Z({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",listenerSetter:this.listenerSetter});t.append(i.container,s,(0,M.tG)(a).container)}{const t=e("General.Keyboard"),i=document.createElement("form"),s="send-shortcut",n="settings.sendShortcut",a=new M.ZP({radioField:new x.Z({langKey:"General.SendShortcut.Enter",name:s,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new M.ZP({radioField:new x.Z({name:s,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});(0,p.$d)(o.radioField.main,"General.SendShortcut.CtrlEnter",[G.IS_APPLE?"⌘":"Ctrl"]),i.append(a.container,o.container),t.append(i)}if(it.Z){const t=e("DistanceUnitsTitle"),i=document.createElement("form"),s="distance-unit",n="settings.distanceUnit",a=new M.ZP({radioField:new x.Z({langKey:"DistanceUnitsKilometers",name:s,value:"kilometers",stateKey:n})}),o=new M.ZP({radioField:new x.Z({langKey:"DistanceUnitsMiles",name:s,value:"miles",stateKey:n})});i.append(a.container,o.container),t.append(i)}{const t=e("General.TimeFormat"),i=document.createElement("form"),s="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map((([e,t])=>new M.ZP({radioField:new x.Z({langKey:t,name:s,value:e,stateKey:n})}))),r=function(e,t=!0){return function(e,t,i=!0){const s=e;let n;return i||(e=Ee.Z),function i(){e(),n=tt.Z.setTimeout(i,t())}(),e=s,()=>{clearTimeout(n)}}(e,(()=>1e3*(60-(new Date).getSeconds())),t)}((()=>{const e=new Date;a.forEach((([t],i)=>{const s=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[i].subtitle.textContent=s}))}));this.eventListener.addEventListener("destroy",r),i.append(...o.map((e=>e.container))),t.append(i)}{const t=e("Emoji"),i=new Se.Z({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",listenerSetter:this.listenerSetter}),s=new Se.Z({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",listenerSetter:this.listenerSetter});t.append((0,M.tG)(i).container,(0,M.tG)(s).container)}{const e=new ei({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),t=new M.ZP({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{this.slider.createTab(nt).open()},listenerSetter:this.listenerSetter}),i=()=>{this.managers.appReactionsManager.getQuickReaction().then((e=>"availableReaction"===e._?e.static_icon:this.managers.appEmojiManager.getCustomEmojiDocument(e.document_id))).then((e=>{(0,st.Z)({row:t,doc:e,size:"small"})}))};i(),this.listenerSetter.add(n.Z)("quick_reaction",i);const s=new Se.Z({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",listenerSetter:this.listenerSetter}),a=new Se.Z({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",listenerSetter:this.listenerSetter}),o={},r=e.generateContentElement(),d=new Xe.Z,l=(e,t="append")=>{const i=new M.ZP({title:(0,Y.Z)(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new et.Z({id:e.id,access_hash:e.access_hash}).show()},listenerSetter:this.listenerSetter});o[e.id]=i;const s=document.createElement("div");s.classList.add("row-media"),(0,at.Z)({set:e,container:s,group:"GENERAL-SETTINGS",lazyLoadQueue:d,width:36,height:36,autoplay:!0}),i.container.append(s),r[t](i.container)};this.managers.appStickersManager.getAllStickers().then((e=>{(0,Je.Z)(e);for(const t of e.sets)l(t)})),this.listenerSetter.add(n.Z)("stickers_installed",(e=>{o[e.id]||l(e,"prepend")})),this.listenerSetter.add(n.Z)("stickers_deleted",(e=>{o[e.id]&&(o[e.id].container.remove(),delete o[e.id])})),e.content.append(t.container,(0,M.tG)(s).container,(0,M.tG)(a).container),this.scrollable.append(e.container)}}onOpen(){this.init&&(this.init(),this.init=null)}}var dt=i(2621),lt=i(6726);class ct extends l._{static getInitArgs(){return{bioMaxLength:n.Z.managers.apiManager.getLimit("bio"),user:n.Z.managers.appUsersManager.getSelf(),userFull:n.Z.managers.appProfileManager.getProfile(n.Z.myId.toUserId())}}init(e){return t=this,i=void 0,a=function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const t=[],[i,s,a]=yield Promise.all([e.bioMaxLength,e.user,e.userFull]);{const e=ti(this.scrollable,void 0,"Bio.Description"),s=document.createElement("div");s.classList.add("input-wrapper"),this.firstNameInputField=new u.ZP({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new u.ZP({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new u.ZP({label:"EditProfile.BioLabel",name:"bio",maxLength:i}),s.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const a=document.createElement("div");a.classList.add("caption"),(0,p.XZ)({element:a,key:"Bio.Description"}),t.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new dt.Z({peerId:n.Z.myId,inputFields:t,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.append(this.editPeer.avatarEdit.container,s)}{const e=new ei({name:"EditAccount.Username",caption:!0}),i=document.createElement("div");i.classList.add("input-wrapper"),this.usernameInputField=new lt.l({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange(),this.setProfileUrl()},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"},this.managers),i.append(this.usernameInputField.container);const s=e.caption;s.append((0,p.ag)("UsernameSettings.ChangeDescription")),s.append(document.createElement("br"),document.createElement("br"));const n=this.profileUrlContainer=document.createElement("div");n.classList.add("profile-url-container");const a=this.profileUrlAnchor=B();n.append((0,p.ag)("UsernameHelpLink",[a])),s.append(n),t.push(this.usernameInputField),e.content.append(i),this.scrollable.append(e.container)}(0,v.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.managers.appProfileManager.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value);e.push(t.then((()=>{this.close()}),(e=>{console.error("updateProfile error:",e)}))),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))),this.usernameInputField.isValidToChange()&&e.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value)),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter}),this.firstNameInputField.setOriginalValue(s.first_name,!0),this.lastNameInputField.setOriginalValue(s.last_name,!0),this.bioInputField.setOriginalValue(a.about,!0),this.usernameInputField.setOriginalValue(s.username,!0),this.setProfileUrl(),this.editPeer.handleChange()},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a}setProfileUrl(){this.usernameInputField.input.classList.contains("error")||!this.usernameInputField.value.length?this.profileUrlContainer.style.display="none":(this.profileUrlContainer.style.display="",this.profileUrlAnchor.replaceWith(this.profileUrlAnchor=B({mePath:this.usernameInputField.value})))}}var ht=i(7425),ut=i(1507),ft=i(3855),pt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class mt extends I.h{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 ei({name:e.name}),i=new M.ZP({checkboxField:new Se.Z({text:e.typeText,checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),s=new M.ZP({checkboxField:new Se.Z({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});t.content.append(i.container,s.container),this.scrollable.append(t.container);const a={_:e.inputKey},o=this.managers.appNotificationsManager.getNotifySettings(a);(o instanceof Promise?o:Promise.resolve(o)).then((t=>{const o=()=>pt(this,void 0,void 0,(function*(){const e=yield this.managers.appNotificationsManager.isMuted(t);return i.checkboxField.checked=!e,s.checkboxField.checked=t.show_previews,e}));o(),this.eventListener.addEventListener("destroy",(()=>pt(this,void 0,void 0,(function*(){const e=!i.checkboxField.checked,n=s.checkboxField.checked;if(e===(yield this.managers.appNotificationsManager.isMuted(t))&&n===t.show_previews)return;const o=(0,Fe.Z)(t);o._="inputPeerNotifySettings",o.mute_until=e?ut.rU:0,o.show_previews=n,this.managers.appNotificationsManager.updateNotifySettings(a,o)}))),{once:!0}),this.listenerSetter.add(n.Z)("notify_settings",(i=>{const s=Ce(i.peer._);e.inputKey===s&&(t=i.notify_settings,o())}))}))};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new ei({name:"NotificationsOther"}),t=new M.ZP({checkboxField:new Se.Z({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),i=new M.ZP({checkboxField:new Se.Z({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound",listenerSetter:this.listenerSetter}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});ft.Z.getState().then((e=>{i.checkboxField.checked=e.settings.notifications.sound})),e.content.append(t.container,i.container),this.scrollable.append(e.container),this.managers.appNotificationsManager.getContactSignUpNotification().then((e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",(()=>{const i=t.checkboxField.checked;e!==i&&this.managers.appNotificationsManager.setContactSignUpNotification(!i)}),{once:!0})}))}}}class gt extends l._{static getInitArgs(){return{languages1:n.Z.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"web"}),languages2:Promise.resolve([])}}init(e){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const t=new ei({}),i=new Map,s=Promise.all([e.languages1,e.languages2]).then((([e,s])=>{const n=new Set,a=e.map((e=>e.lang_code)),o=(0,Z.a)();e.concat(s).forEach((e=>{if(n.has(e.lang_code))return;n.add(e.lang_code);const t=new M.ZP({radioField:new x.Z({text:e.name,name:o,value:e.lang_code}),subtitle:e.native_name});i.set(e.lang_code,t)}));const r=(0,M.De)([...i.values()],(e=>{p.ZP.getLangPack(e,a.includes(e))}));p.ZP.getCacheLangPack().then((e=>{const t=i.get(e.lang_code);t?t.radioField.setValueSilently(!0):console.error("no row",t,e)})),t.content.append(r)}));return this.scrollable.append(t.container),s}}var vt=i(1447),bt=i(4081),yt=i(6848),wt=i(5701);function St(e,t,i){const s=new ei({name:t}),n="settings.autoDownload."+e+".",a=new Se.Z({text:"AutodownloadContacts",name:"contacts",stateKey:n+"contacts",listenerSetter:i}),o=new Se.Z({text:"AutodownloadPrivateChats",name:"private",stateKey:n+"private",listenerSetter:i}),r=new Se.Z({text:"AutodownloadGroupChats",name:"groups",stateKey:n+"groups",listenerSetter:i}),d=new Se.Z({text:"AutodownloadChannels",name:"channels",stateKey:n+"channels",listenerSetter:i});return s.content.append((0,M.tG)(a).container,(0,M.tG)(o).container,(0,M.tG)(r).container,(0,M.tG)(d).container),s}class Ct extends I.h{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadPhotos");const e=St("photo","AutoDownloadPhotosTitle",this.listenerSetter);this.scrollable.append(e.container)}}class Lt extends I.h{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadFiles");const e=(0,wt.Z)((e=>{this.managers.appStateManager.setByKey("settings.autoDownloadNew.file_size_max",e)}),200,!1,!0),t=St("file","AutoDownloadFilesTitle",this.listenerSetter),i=524288,s=20447232,a=n.Z.settings.autoDownloadNew.file_size_max,o=Math.sqrt(Math.sqrt((a-i)/s)),r=new p.ZP.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[(0,bt.Z)(a)]}),d=new ot("AutoDownloadMaxFileSize",.01,o,0,1,!1);d.onChange=t=>{const n=Math.pow(t,4)*s+i|0;r.compareAndUpdate({args:[(0,bt.Z)(n)]}),e(n)},d.valueContainer.append(r.element),t.content.append(d.container),this.scrollable.append(t.container)}}class Et extends I.h{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadVideos");const e=St("video","AutoDownloadVideosTitle",this.listenerSetter);this.scrollable.append(e.container)}}const It={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class Mt extends I.h{init(){return e=this,t=void 0,s=function*(){this.header.classList.add("with-border"),this.setTitle("DataSettings");{const e=new ei({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield ft.Z.getState(),i=new Se.Z({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,listenerSetter:this.listenerSetter}),s=new M.ZP({checkboxField:i,listenerSetter:this.listenerSetter}),a=()=>{(0,K.Z)([h],(0,yt.Z)(t.settings.autoDownload,Ke.h.settings.autoDownload)&&(0,yt.Z)(t.settings.autoDownloadNew,Ke.h.settings.autoDownloadNew))},o=()=>{this.setAutoDownloadSubtitle(d,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(l,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},r=e=>{const t=this.slider.createTab(e);t.open(),this.listenerSetter.add(t.eventListener)("destroy",(()=>{o(),a()}),{once:!0})},d=new M.ZP({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{r(Ct)},listenerSetter:this.listenerSetter}),l=new M.ZP({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{r(Et)},listenerSetter:this.listenerSetter}),c=new M.ZP({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{r(Lt)},listenerSetter:this.listenerSetter}),h=(0,E.Z)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});(0,v.fc)(h,(()=>{(0,Le.Z)({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then((()=>{const e=n.Z.settings;e.autoDownloadNew=(0,Fe.Z)(Ke.h.settings.autoDownloadNew),e.autoDownload=(0,Fe.Z)(Ke.h.settings.autoDownload),t.settings=e,this.managers.appStateManager.setByKey("settings",e),o(),i.checked=!t.settings.autoDownloadNew.pFlags.disabled}))}));const u=()=>{const e=!i.checked,t=n.Z.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[d,l,c].forEach((t=>{t.container.classList.toggle("is-disabled",e)})),this.managers.appStateManager.setByKey("settings",t),a()};i.input.addEventListener("change",u),u(),o(),e.content.append(s.container,d.container,l.container,c.container,h),this.scrollable.append(e.container)}{const e=new ei({name:"AutoplayMedia"});e.content.append(new M.ZP({checkboxField:new Se.Z({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container,new M.ZP({checkboxField:new Se.Z({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container),this.scrollable.append(e.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}setAutoDownloadSubtitle(e,t,i){let s;const n=[],a=Object.keys(t),o=a.map((e=>t[e]?It[e]:void 0)).filter(Boolean);if(o.length&&0!==i){const e=o.length===a.length;if(void 0!==i?(s=e?"AutoDownloadUpToOnAllChats":"AutoDownloadOnUpToFor",n.push((0,bt.Z)(i))):s=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...(0,p.v_)(o.map((e=>(0,p.ag)(e))),!0,!1)),n.push(e)}}else s="AutoDownloadOff";(0,P.Z)(e.subtitle,(0,p.ag)(s,n))}}var Pt=i(2230),Zt=i(8261),kt=i(6765),Tt=i(1168),xt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class At extends l._{constructor(){super(...arguments),this.buttons={}}init(){return xt(this,void 0,void 0,(function*(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=(0,L.Z)({listenerSetter:this.listenerSetter},"bottom-left",[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new O.Z("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{this.managers.apiManager.logOut()},isDanger:!0}]}).show()}}]);this.buttons.edit=(0,Pt.Z)("edit"),this.header.append(this.buttons.edit,e),this.profile=new Zt.Z(this.managers,this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(n.Z.myId);const t=this.profile.fillProfileElements(),i=(0,E.Z)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});(0,v.fc)(i,(()=>{const e=document.createElement("canvas");Tt.Z.createPopup(kt.Z).open(e,(e=>{e().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))}))}),{listenerSetter:this.listenerSetter}),this.profile.element.lastElementChild.firstElementChild.append(i);const s=()=>xt(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appUsersManager.getSelf();i.classList.toggle("hide","userProfilePhoto"!==(null===(e=t.photo)||void 0===e?void 0:e._))}));s(),this.listenerSetter.add(n.Z)("avatar_update",(e=>{n.Z.myId===e&&s()}));const a=document.createElement("div");a.classList.add("profile-buttons");const o=(e,t,i,s)=>{if(!s){const e=i.getInitArgs;e&&(s=()=>[e(this)])}return{icon:e,text:t,tabConstructor:i,getInitArgs:s,args:null==s?void 0:s()}},r=[o("unmute","AccountSettings.Notifications",mt),o("data","DataSettings",Mt),o("lock","AccountSettings.PrivacyAndSecurity",Me),o("settings","Telegram.GeneralSettingsViewController",rt),o("folder","AccountSettings.Filters",ht.Z)].map((e=>{const{icon:t,text:i,tabConstructor:s,getInitArgs:n}=e;return new M.ZP({titleLangKey:i,icon:t,clickable:()=>xt(this,void 0,void 0,(function*(){const t=e.args?yield e.args:[],i=this.slider.createTab(s);i.open(...t),i instanceof I.h&&n&&i.eventListener.addEventListener("destroyAfter",(t=>{e.args=t.then((()=>n()))}))})),listenerSetter:this.listenerSetter})})),d=gt.getInitArgs();r.push(this.devicesRow=new M.ZP({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>xt(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.authorizations=void 0,this.updateActiveSessions(!0)}),{once:!0}),e.open()})),listenerSetter:this.listenerSetter}),this.languageRow=new M.ZP({titleLangKey:"AccountSettings.Language",titleRightSecondary:(0,p.ag)("LanguageName"),icon:"language",clickable:()=>{this.slider.createTab(gt).open(d)},listenerSetter:this.listenerSetter})),a.append(...r.map((e=>e.container)));const l=new ei;l.content.append(a),this.scrollable.append(this.profile.element,l.container);const c=()=>{h=ct.getInitArgs()};let h;(0,v.fc)(this.buttons.edit,(()=>{this.slider.createTab(ct).open(h)}),{listenerSetter:this.listenerSetter}),c(),this.listenerSetter.add(n.Z)("user_update",(e=>{n.Z.myId.toUserId()===e&&c()})),vt.Z.loadLottieWorkers(),this.updateActiveSessions(),yield t}))}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=this.managers.apiManager.invokeApi("account.getAuthorizations").finally((()=>{this.getAuthorizationsPromise===t&&(this.getAuthorizationsPromise=void 0)}));return t}updateActiveSessions(e){return this.getAuthorizations(e).then((e=>{this.authorizations=e.authorizations,this.devicesRow.titleRight.textContent=""+this.authorizations.length}))}onCloseAfterTimeout(){return this.profile.destroy(),super.onCloseAfterTimeout()}}class _t extends l._{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new f.Z((e=>{this.uploadAvatar=e}));const e=new ei({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new u.ZP({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new u.ZP({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const i=()=>{this.nextBtn.classList.toggle("is-visible",!!this.channelNameInputField.value.length&&!this.channelNameInputField.input.classList.contains("error")&&!this.channelDescriptionInputField.input.classList.contains("error"))};this.channelNameInputField.input.addEventListener("input",i),this.channelDescriptionInputField.input.addEventListener("input",i),this.nextBtn=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,this.managers.appChatsManager.createChannel({title:e,about:t,broadcast:!0}).then((e=>{this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),s.Z.setInnerPeer({peerId:e.toPeerId(!0)}),ni.removeTabFromHistory(this),this.slider.createTab(A.Z).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>this.managers.appChatsManager.inviteToChannel(e,t)})}))}),{listenerSetter:this.listenerSetter}),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 Ft=i(241),Dt=i(709),Rt=i(6272);class Bt extends Tt.Z{constructor(){super("popup-create-contact popup-send-photo popup-new-media",{closable:!0,withConfirm:"Add",title:"AddContactTitle"}),this.construct()}construct(){return e=this,t=void 0,s=function*(){(0,v.fc)(this.btnConfirm,(()=>{const e=this.managers.appUsersManager.importContact(i.value,s.value,n.value);e.then((()=>{this.hide()}),(e=>{"NO_USER"===e.type&&((0,F.bC)({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),d.disabled=!1)})),d.lockWithPromise(e)}),{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const i=new u.ZP({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),s=new u.ZP({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new Dt.Z({required:!0});e.push(i,s,n);const a=()=>{const e=i.value+" "+s.value;d.avatarElem.peerTitle=e,d.avatarElem.update()};this.listenerSetter.add(i.input)("input",a),this.listenerSetter.add(s.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=yield this.managers.appUsersManager.getSelf(),r=(0,Rt.u)(o.phone);r.code&&(n.value="+"+r.code.country_code);const d=new dt.Z({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(i.container,s.container,d.avatarElem),this.container.append(t,n.container),this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var Nt=i(2894),Ot=i(3624);class Ut extends l._{init(){this.container.id="contacts-container";const e=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(e),(0,v.fc)(e,(()=>{Tt.Z.createPopup(Bt)}),{listenerSetter:this.listenerSetter}),this.inputSearch=new d.Z("Search",(e=>{this.openContacts(e)})),this.listenerSetter.add(n.Z)("contacts_update",(e=>{return t=this,i=void 0,n=function*(){const t=yield this.managers.appUsersManager.isContact(e),i=e.toPeerId();t?this.sortedUserList.add(i):this.sortedUserList.delete(i)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})),this.title.replaceWith(this.inputSearch.container),this.middleware=(0,Ot.k)(),this.openContacts()}createList(){const e=new Nt.Z({managers:this.managers}),t=e.list;return t.id="contacts",t.classList.add("contacts-container"),h.default.setListClickListener(t,(()=>{this.close()}),void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!G.IS_MOBILE&&V(!0)&&this.inputSearch.input.focus()}openContacts(e){this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",this.managers.appUsersManager.getContactsPeerIds(e,void 0,"online").then((e=>{if(!t())return;const i=this.sortedUserList=this.createList();let s=()=>{const t=Ft.Z.height/56*1.25|0;e.splice(0,t).forEach((e=>{i.add(e)})),e.length||(s=void 0,this.scrollable.onScrolledBottom=null)};s(),this.scrollable.onScrolledBottom=()=>{s?s():this.scrollable.onScrolledBottom=null},(0,P.Z)(this.scrollable.container,i.list)}))}}class Ht extends l._{init(){if(this.wasFilterId=h.default.filterId,this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!h.default.sortedLists[Ht.filterId]){const e=h.default.createChatList();h.default.generateScrollable(e,{title:void 0,id:Ht.filterId,localId:ut.Zi}).container.append(e),h.default.setListClickListener(e,null,!0)}const e=h.default.scrollables[Ht.filterId];return this.scrollable.container.replaceWith(e.container),h.default.setFilterIdAndChangeTab(Ht.filterId).then((({cached:e,renderPromise:t})=>{if(e)return t}))}onOpenAfterTimeout(){h.default.sortedLists[this.wasFilterId].clear()}onClose(){h.default.setFilterIdAndChangeTab(this.wasFilterId)}onCloseAfterTimeout(){return h.default.sortedLists[Ht.filterId].clear(),super.onCloseAfterTimeout()}}Ht.filterId=ut.Zi;class zt extends l._{constructor(){super(...arguments),this.isLocationWatched=!1}parseDistance(e){return"miles"===n.Z.settings.distanceUnit?e>1609.34?(0,p.ag)("MilesAway",[Math.round(e/1609)]):(0,p.ag)("FootsAway",[Math.round(3.281*e)]):e>=1e3?(0,p.ag)("KMetersAway2",[e/1e3]):(0,p.ag)("MetersAway2",[e])}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,(0,F.Am)("Your position is now being shared. Do not close the page or it will be suspended."),this.managers.appUsersManager.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition((e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,i=e.coords.latitude!==this.latestLocationSaved.latitude,s=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(i||t)&&s&&(this.managers.appUsersManager.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy,!0,2147483647),this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})})))}stopWatching(){this.isLocationWatched&&(this.isLocationWatched=!1,(0,F.Am)("The sharing of your position has been stopped. You will no longer be visible to other users."),this.managers.appUsersManager.getLocated(0,0,0,!1,0))}calculateDistance(e,t,i,s){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((i-e)*n)+Math.cos(e*n)*Math.cos(i*n)*(1-Math.cos((s-t)*n)/2)))}}var jt=i(9818),Gt=i(8842),Vt=i(4159),Kt=i(7487),Wt=i(1405),$t=i(1655),qt=i(2559),Qt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Yt="is-left-column-shown";class Jt extends l.Z{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={}}construct(e){this.managers=e,this.inputSearch=new d.Z("Search");const t=this.sidebarEl.querySelector(".item-main .sidebar-header");t.append(this.inputSearch.container);const i=()=>{this.createTab(Ut).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const a={icon:"archive",text:"ArchivedChats",onClick:()=>{this.createTab(Ht).open()},verify:()=>Qt(this,void 0,void 0,(function*(){return!!(yield this.managers.dialogsStorage.getFolderDialogs(1,!1)).length||!(yield this.managers.dialogsStorage.isDialogsLoaded(1))}))},o=new Se.Z({toggle:!0,checked:"night"===Ue.Z.getTheme().name});o.input.addEventListener("change",(()=>Qt(this,void 0,void 0,(function*(){yield this.managers.appStateManager.setByKey("settings.theme",o.input.checked?"night":"day"),n.Z.dispatchEvent("theme_change")})))),n.Z.addEventListener("theme_change",(()=>{o.setValueSilently("night"===Ue.Z.getTheme().name)}));const r=[{icon:"savedmessages",text:"SavedMessages",onClick:()=>{setTimeout((()=>{s.Z.setPeer({peerId:s.Z.myId})}),0)}},a,{icon:"user",text:"Contacts",onClick:i},it.Z?{icon:"group",text:"PeopleNearby",onClick:()=>{this.createTab(zt).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{this.createTab(At).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:o},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new Se.Z({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=p.ZP.format("TelegramFeaturesUrl",!0);s.Z.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([Kt.Z.set({kz_version:"Z"}),Kt.Z.delete("tgme_sync")]).then((()=>{location.href="https://web.telegram.org/z/"}))},verify:()=>Vt.Z.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Kt.Z.delete("tgme_sync").then((()=>{location.href="https://web.telegram.org/?legacy=1"}))},verify:()=>Vt.Z.isMainDomain}].filter(Boolean);this.toolsBtn=(0,L.Z)({},"bottom-right",r,(e=>Qt(this,void 0,void 0,(function*(){yield Promise.all(r.map((e=>Qt(this,void 0,void 0,(function*(){e.verify&&e.element.classList.toggle("hide",!(yield e.verify()))})))))})))),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn);const l=this.toolsBtn.querySelector(".btn-menu"),c=document.createElement("a");c.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",c.target="_blank",c.rel="noopener noreferrer",c.classList.add("btn-menu-footer"),c.addEventListener(v.pf,(e=>{e.stopPropagation(),me.Z.close()}));const h=document.createElement("span");h.classList.add("btn-menu-footer-text"),h.innerHTML="Telegram Web"+Vt.Z.suffix+" "+Vt.Z.versionFull,c.append(h),l.classList.add("has-footer"),l.append(c),this.newBtnMenu=(0,L.Z)({},"top-left",[{icon:"newchannel",text:"NewChannel",onClick:()=>{this.createTab(_t).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{this.createTab(A.Z).open({type:"chat",skippable:!1,takeOut:e=>this.createTab(b).open(e),title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:i}]),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",t.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",(0,Wt.Z)(this.updateBtn),this.updateBtn.append((0,p.ag)("Update")),(0,v.fc)(this.updateBtn,(()=>{this.updateBtn.classList.contains("is-hidden")||location.reload()})),t.nextElementSibling.append(this.updateBtn),this.inputSearch.input.addEventListener("focus",(()=>this.initSearch()),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",a.element.append(this.archivedCount),n.Z.addEventListener("folder_unread",(e=>{if(1===e.id){const t=e.unreadPeerIds.size;this.archivedCount.innerText=""+(0,qt.Z)(t,1),this.archivedCount.classList.toggle("hide",!t)}})),this.managers.appUsersManager.getTopPeers("correspondents");const u={type:"global-search-focus",onPop:()=>(setTimeout((()=>{this.inputSearch.input.focus()}),0),!1),noHistory:!0};jt.Z.pushItem(u),ft.Z.getState().then((e=>{const t=setInterval((()=>{fetch("version",{cache:"no-cache"}).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((e=>{e!==Vt.Z.versionFull&&(this.hasUpdate=!0,clearInterval(t),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))})).catch(Ee.Z)}),18e5)}))}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new r.ZP(e),i=()=>{(0,v.tH)(this.backBtn)};this.searchGroups={contacts:new a.z("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,i),globalContacts:new a.z("GlobalSearch","contacts",void 0,void 0,void 0,void 0,i),messages:new a.z("SearchMessages","messages"),people:new a.z(!1,"contacts",!0,"search-group-people",!0,!1,i,!0),recent:new a.z("Recent","contacts",!0,"search-group-recent",!0,!0,i)};const s=this.searchSuper=new w.Z({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0,managers:this.managers});e.prepend(s.nav.parentElement.parentElement),t.container.append(s.container),s.setQuery({peerId:"".toPeerId(),folderId:0}),s.selectTab(0),s.load(!0);const n=[];let d="".toPeerId(),l=0,u=0;const f=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===n.length),this.inputSearch.container.classList.toggle("is-picked",!!n.length),n.length?this.inputSearch.input.style.setProperty("--paddingLeft",n[n.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},p=document.createElement("div");p.classList.add("search-helper"),p.addEventListener("click",(e=>{const t=(0,he.Z)(e.target,"selector-user");if(!t)return;const i=t.dataset.key;if(0===i.indexOf("date_")){const[e,t,s]=i.split("_");l=+t,u=+s}else d=i.toPeerId();t.addEventListener("click",(()=>{g(t)})),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),n.push(t),f()})),s.nav.parentElement.append(p);const m=(e,t)=>{const i=document.createElement("div");i.classList.add("selector-user");const s=new o.Z;return s.classList.add("selector-user-avatar","tgico","avatar-30"),s.isDialog=!0,i.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Gt.Z({peerId:e.toPeerId()}).element),s.updateWithOptions({peerId:e})):s.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?i.innerHTML=t:((0,P.Z)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",s),i},g=e=>{0===e.dataset.key.indexOf("date_")?l=u=0:d="".toPeerId(),e.remove(),(0,$t.Z)(n,e),setTimeout((()=>{f(),this.inputSearch.onChange(this.inputSearch.value)}),0)};this.inputSearch.onClear=()=>{n.forEach((e=>{g(e)}))},this.inputSearch.onChange=e=>{if(s.cleanupHTML(),s.setQuery({peerId:d,folderId:d?void 0:0,query:e,minDate:l,maxDate:u}),s.load(!0),p.innerHTML="",s.nav.classList.remove("hide"),!d&&e.trim()){const t=s.middleware.get();Promise.all([this.managers.appMessagesManager.getConversations(e).then((({dialogs:e})=>e.map((e=>e.peerId)))),this.managers.appUsersManager.getContactsPeerIds(e,!0)]).then((e=>{t()&&(new Set(e[0].concat(e[1])).forEach((e=>{p.append(m(e))})),s.nav.classList.toggle("hide",!!p.innerHTML))}))}if(!l&&e.trim()){const t=[];(0,S.fl)(e,t),t.forEach((e=>{p.append(m("date_"+e.minDate+"_"+e.maxDate,e.title))})),s.nav.classList.toggle("hide",!!p.innerHTML)}},s.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",(e=>{const t=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=(0,he.Z)(t,"search-group");if(!i||i.classList.contains("search-group-recent")||i.classList.contains("search-group-people"))return;const s=t.getAttribute("data-peer-id").toPeerId();this.managers.appUsersManager.pushRecentSearch(s)}),{capture:!0});const b=document.createElement("div");b.classList.add("search-group-scrollable"),b.append(this.searchGroups.people.list),this.searchGroups.people.container.append(b),new r.v7(b);let y,C=!0;const L=(0,c.v)(e.parentElement,"zoom-fade",150,(e=>{y&&clearTimeout(y),0!==e||C||(s.selectTab(0,!1),this.inputSearch.onClearClick(),y=window.setTimeout((()=>{y=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")}),150)),C=!1}));L(0);const E="is-visible",I=()=>{this.toolsBtn.classList.remove(E),this.backBtn.classList.add(E),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0);const e="global-search";G.IS_MOBILE_SAFARI||jt.Z.findItemByType(e)||jt.Z.pushItem({onPop:()=>{i()},type:e}),L(1)};this.inputSearch.input.addEventListener("focus",I),I(),(0,v.fc)(this.backBtn,(e=>{this.toolsBtn.classList.add(E),this.backBtn.classList.remove(E),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),jt.Z.removeByType("global-search"),L(0)}));const M=(0,Pt.Z)("close");this.searchGroups.recent.nameEl.append(M),M.addEventListener("click",(()=>{(0,Le.Z)({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then((()=>this.managers.appUsersManager.clearRecentSearch().then((()=>{this.searchGroups.recent.clear()}))))}))}}const Xt="sidebar-left-section";class ei{constructor(e={}){var t;const i=this.container=document.createElement("div");i.classList.add(Xt+"-container");const s=this.innerContainer=document.createElement("div");if(s.classList.add(Xt),e.noShadow&&s.classList.add("no-shadow"),e.fakeGradientDelimiter)s.append(ii()),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 n=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2",Xt+"-name"),(0,p.XZ)({element:t,key:e.name,args:e.nameArgs}),n.append(t)}i.append(s);const a=null!==(t=e.caption)&&void 0!==t?t:e.captionOld;if(a){const t=this.caption=this.generateContentElement();t.classList.add(Xt+"-caption"),e.captionOld||i.append(t),!0!==a&&(0,p.XZ)({element:t,key:a,args:e.captionArgs})}}generateContentElement(){const e=document.createElement("div");return e.classList.add(Xt+"-content"),this.innerContainer.append(e),e}}const ti=(e,t,i)=>{const s=new ei({name:t,caption:i});return e.append(s.container),s.content},ii=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e},si=new Jt;C.GO.appSidebarLeft=si;const ni=si},5670:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3552),n=i(5644),a=i(279),o=i(8119);class r extends s._{init(e){this.container.classList.add("add-members-container"),this.nextBtn=(0,o.Z)({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())),t=this.takeOut(e);this.skippable?this.close():t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()})),this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const t="privacy"===this.peerType;this.selector=new n.Z({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[t?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:t,filterPeerTypeBy:t?["isAnyGroup","isUser"]:void 0,managers:this.managers,design:"square"}),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)}attachToPromise(e){const t=(0,a.p)(this.nextBtn,"arrow_next");e.then((()=>{this.close()}),(()=>{t()}))}}},7425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>y});var s=i(3552),n=i(1447),a=i(2796),o=i(4494),r=i(3512),d=i(534),l=i(7479),c=i(2464),h=i(2325),u=i(3910),f=i(2738),p=i(4484),m=i(8115),g=i(1507),v=i(5565),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class y extends s._{constructor(){super(...arguments),this.filtersRendered={}}static getInitArgs(){return n.Z.loadAnimationFromURLManually("Folders_1")}renderFolder(e,t,i,s){return b(this,void 0,void 0,(function*(){let n,a="";const o=[];if("dialogFilterSuggested"===e._)n=e.filter,a=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&&o.push((0,h.ag)(t))}if(!o.length){const e=yield this.managers.dialogsStorage.getFolderDialogs(n.id);let t=0,i=0,s=0;yield Promise.all(e.map((e=>b(this,void 0,void 0,(function*(){(yield this.managers.appPeersManager.isAnyGroup(e.peerId))?s++:(yield this.managers.appPeersManager.isBroadcast(e.peerId))?i++:t++}))))),t&&o.push((0,h.ag)("Chats",[t])),i&&o.push((0,h.ag)("Channels",[i])),s&&o.push((0,h.ag)("Groups",[s]))}}if(i)n.id!==g.J$&&(0,v.Z)(i.title,(0,m.Z)(n.title)),i.subtitle.textContent="",i.subtitle.append(...(0,h.v_)(o));else if(i=new l.ZP({title:n.id===g.J$?(0,h.ag)("FilterAllChats"):(0,m.Z)(n.title),subtitle:a,clickable:n.id!==g.J$,buttonRightLangKey:"dialogFilterSuggested"===e._?"Add":void 0}),o.length&&i.subtitle.append(...(0,h.v_)(o)),"dialogFilter"===e._){const e=n.id;this.filtersRendered[n.id]||n.id===g.J$||(0,f.fc)(i.container,(()=>b(this,void 0,void 0,(function*(){this.slider.createTab(d.Z).open(yield this.managers.filtersStorage.getFilter(e))}))),{listenerSetter:this.listenerSetter}),this.filtersRendered[n.id]=i}const r=i.container;if(s){const e=n.localId;void 0!==e?(0,p.Z)(r,r.parentElement||t,e):t&&t.append(r)}return i}))}init(e=y.getInitArgs()){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 t=document.createElement("div");t.classList.add("caption"),(0,h.XZ)({element:t,key:"ChatList.Filter.Header"}),this.createFolderBtn=(0,o.Z)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new c.dw({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new c.dw({name:"FilterRecommended"}),this.suggestedSection.container.style.display="none",this.scrollable.append(this.stickerContainer,t,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),(0,f.fc)(this.createFolderBtn,(()=>b(this,void 0,void 0,(function*(){(yield this.canCreateFolder())?this.slider.createTab(d.Z).open():(0,a.Am)("Sorry, you can't create more folders.")}))),{listenerSetter:this.listenerSetter});const i=()=>{this.foldersSection.container.style.display=Object.keys(this.filtersRendered).length?"":"none"};return this.managers.filtersStorage.getDialogFilters().then((e=>b(this,void 0,void 0,(function*(){for(const t of e)t.id!==g.Zi&&(yield this.renderFolder(t,this.foldersSection.content,void 0,!0));this.toggleAllChats(),i()})))),this.listenerSetter.add(r.Z)("filter_update",(e=>b(this,void 0,void 0,(function*(){const t=this.filtersRendered[e.id];t?yield this.renderFolder(e,null,t):e.id!==g.Zi&&(yield this.renderFolder(e,this.foldersSection.content,void 0,!0)),i(),this.getSuggestedFilters()})))),this.listenerSetter.add(r.Z)("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(this.getSuggestedFilters(),t.container.remove(),delete this.filtersRendered[e.id]),i()})),this.listenerSetter.add(r.Z)("filter_order",(e=>{e.filter((e=>!!this.filtersRendered[e])).forEach(((e,t)=>{const i=this.filtersRendered[e].container;(0,p.Z)(i,i.parentElement,t+1)}))})),this.listenerSetter.add(r.Z)("premium_toggle",(()=>{this.toggleAllChats()})),this.loadAnimationPromise=e.then((e=>b(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,n.Z.waitForFirstFrame(t)})))),this.getSuggestedFilters(),this.loadAnimationPromise}onOpenAfterTimeout(){return this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()})),super.onOpenAfterTimeout()}toggleAllChats(){this.filtersRendered[g.J$].container.classList.toggle("hide",!r.Z.premium)}canCreateFolder(){return b(this,void 0,void 0,(function*(){const[e,t]=yield Promise.all([this.managers.apiManager.getLimit("folders"),this.managers.filtersStorage.getDialogFilters()]);return t.filter((e=>!g.DZ.has(e.id))).lengthb(this,void 0,void 0,(function*(){this.suggestedSection.container.style.display=e.length?"":"none",Array.from(this.suggestedSection.content.children).slice(1).forEach((e=>e.remove()));for(const t of e){const e=yield this.renderFolder(t);this.suggestedSection.content.append(e.container);const i=e.buttonRight;(0,f.fc)(i,(s=>b(this,void 0,void 0,(function*(){if((0,u.Z)(s),!(yield this.canCreateFolder()))return void(0,a.Am)("Sorry, you can't create more folders.");i.setAttribute("disabled","true");const n=t.filter;n.includePeerIds=[],n.excludePeerIds=[],n.pinnedPeerIds=[],this.managers.filtersStorage.createDialogFilter(n,!0).then((t=>{t&&e.container.remove()})).finally((()=>{i.removeAttribute("disabled")}))}))),{listenerSetter:this.listenerSetter})}}))))}}},534:(e,t,i)=>{"use strict";i.d(t,{Z:()=>k});var s=i(9893),n=i(1447),a=i(3552),o=i(2796),r=i(503),d=i(2230),l=i(5322),c=i(4494),h=i(5644),u=i(9807),f=i(2325),p=i(2464),m=i(8479),g=i(7625),v=i(130),b=i(8115),y=i(1507),w=i(3512),S=i(2738),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends a._{constructor(){super(...arguments),this.renderResults=e=>C(this,void 0,void 0,(function*(){yield this.managers.appUsersManager.getContacts(),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e,container:this.selector.scrollable,rippleEnabled:!0,avatarSize:"abitbigger"}),i=this.selector.selected.has(e);t.containerEl.append(this.checkbox(i));const n=[];this.dialogsByFilters.forEach(((t,i)=>{if(t.has(e)){const e=document.createElement("span");(0,v.Z)(e,(0,b.Z)(i.title)),n.push(e)}})),(0,f.v_)(n,!1).forEach((e=>{t.lastMessageSpan.append(e)}))}))})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(e,t,i){this.originalFilter=e,this.filter=(0,m.Z)(this.originalFilter),this.type=t,this.editFolderTab=i,this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=(0,d.Z)("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),(0,S.fc)(this.confirmBtn,(()=>C(this,void 0,void 0,(function*(){const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const i of e)i.isPeerId()?t.push(i.toPeerId()):this.filter.pFlags[i]=!0;let i;i="included"===this.type?e=>t.includes(e):e=>!t.includes(e),(0,g.Z)(this.filter.pinnedPeerIds,((e,t)=>{i(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))}));const s="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";(0,g.Z)(this.filter[s],((e,i)=>{t.includes(e)&&(this.filter[s].splice(i,1),this.filter[n].splice(i,1))})),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=yield Promise.all(t.map((e=>this.managers.appPeersManager.getInputPeerById(e)))),this.editFolderTab.setFilter(this.filter,!1),this.close()}))),{listenerSetter:this.listenerSetter});const s=e=>{this.limit=w.Z.premium?e.dialog_filters_chats_limit_premium:e.dialog_filters_chats_limit_default};return this.listenerSetter.add(w.Z)("app_config",s),this.dialogsByFilters=new Map,Promise.all([this.managers.filtersStorage.getDialogFilters().then((e=>C(this,void 0,void 0,(function*(){yield Promise.all(e.filter((e=>!y.DZ.has(e.id))).map((e=>C(this,void 0,void 0,(function*(){const t=(yield this.managers.dialogsStorage.getFolderDialogs(e.id)).map((e=>e.peerId));this.dialogsByFilters.set(e,new Set(t))})))))})))),this.managers.apiManager.getAppConfig().then((e=>{s(e)}))])}checkbox(e){const t=new u.Z({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new p.dw({noDelimiter:!0,name:"FilterChatTypes"});let i;t.container.classList.add("folder-categories"),i="excluded"===this.type?{exclude_muted:{ico:"mute",text:"ChatList.Filter.MutedChats"},exclude_archived:{ico:"archive",text:"ChatList.Filter.Archive"},exclude_read:{ico:"readchats",text:"ChatList.Filter.ReadChats"}}:{contacts:{ico:"newprivate",text:"ChatList.Filter.Contacts"},non_contacts:{ico:"noncontacts",text:"ChatList.Filter.NonContacts"},groups:{ico:"group",text:"ChatList.Filter.Groups"},broadcasts:{ico:"newchannel",text:"ChatList.Filter.Channels"},bots:{ico:"bots",text:"ChatList.Filter.Bots"}};const s=document.createDocumentFragment();for(const e in i){const t=(0,c.Z)("btn-primary btn-transparent folder-category-button",{icon:i[e].ico,text:i[e].text});t.dataset.peerId=e,t.append(this.checkbox()),s.append(t)}t.content.append(s);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new h.Z({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats",managers:this.managers}),this.selector.selected=new Set(n);let a=!1;const r=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=this.limit&&a&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout((()=>{t.checked=!1}),0);const i=f.ZP.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0);return void(0,o.Am)(i)}const n=r(e,i[e]?(0,f.ag)(i[e].text):void 0,s);return i[e]&&n.querySelector("avatar-element").classList.add("tgico-"+i[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const s in e.pFlags)i.hasOwnProperty(s)&&e.pFlags[s]&&(0,S.tH)(t.content.querySelector(`[data-peer-id="${s}"]`))}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}}var E=i(8127),I=i(6848),M=i(3066),P=i(2353),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class k extends a._{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append((0,f.ag)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=(0,d.Z)("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new E.Z("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),this.managers.filtersStorage.updateDialogFilter(this.filter,!0).then((e=>{e&&this.close()})).finally((()=>{e.element.removeAttribute("disabled")}))},isDanger:!0}]}).show()}};this.menuBtn=(0,l.Z)({listenerSetter:this.listenerSetter},"bottom-left",[e]),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=new p.dw({}),i=document.createElement("div");i.classList.add("input-wrapper"),this.nameInputField=new r.ZP({label:"FilterNameHint",maxLength:12}),i.append(this.nameInputField.container),t.content.append(i);const s=(e,t,i,s)=>{const n=new p.dw({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),i.forEach((e=>{const t=(0,c.Z)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(s[e.name]=t),a.append(t)})),n};this.includePeerIds=s("folder-list-included","FilterInclude",[{icon:"add primary",text:"ChatList.Filter.Include.AddChat",withRipple:!0},{text:"ChatList.Filter.Contacts",icon:"newprivate",name:"contacts"},{text:"ChatList.Filter.NonContacts",icon:"noncontacts",name:"non_contacts"},{text:"ChatList.Filter.Groups",icon:"group",name:"groups"},{text:"ChatList.Filter.Channels",icon:"channel",name:"broadcasts"},{text:"ChatList.Filter.Bots",icon:"bots",name:"bots"}],this.flags),this.excludePeerIds=s("folder-list-excluded","FilterExclude",[{icon:"minus primary",text:"ChatList.Filter.Exclude.AddChat",withRipple:!0},{text:"ChatList.Filter.MutedChats",icon:"mute",name:"exclude_muted"},{text:"ChatList.Filter.Archive",icon:"archive",name:"exclude_archived"},{text:"ChatList.Filter.ReadChats",icon:"readchats",name:"exclude_read"}],this.flags),this.scrollable.append(this.stickerContainer,this.caption,t.container,this.includePeerIds.container,this.excludePeerIds.container);const a=this.includePeerIds.container.querySelector(".folder-categories"),h=this.excludePeerIds.container.querySelector(".folder-categories");(0,S.fc)(a.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"included",this)}),{listenerSetter:this.listenerSetter}),(0,S.fc)(h.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"excluded",this)}),{listenerSetter:this.listenerSetter}),(0,S.fc)(this.confirmBtn,(()=>{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?this.managers.filtersStorage.updateDialogFilter(this.filter):this.managers.filtersStorage.createDialogFilter(this.filter),e.then((e=>{e&&this.close()})).catch((e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?(0,o.Am)("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)})).finally((()=>{this.confirmBtn.removeAttribute("disabled")}))):(0,o.Am)("Please choose at least one chat for this folder.")}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.nameInputField.input)("input",(()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()}));const u="edit"===this.type?[this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=n.Z.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_2").then((e=>(this.animation=e,n.Z.waitForFirstFrame(e)))),...u])}onOpenAfterTimeout(){this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()}))}onCreateOpen(){this.setTitle("FilterNew"),this.menuBtn.classList.add("hide"),this.confirmBtn.classList.remove("hide"),this.nameInputField.value="";for(const e in this.flags)this.flags[e].style.display="none"}onEditOpen(){this.setTitle("create"===this.type?"FilterNew":"FilterHeaderEdit"),"edit"===this.type&&(this.menuBtn.classList.remove("hide"),this.confirmBtn.classList.add("hide"));const e=this.filter;this.nameInputField.value=(0,M.Z)(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach((t=>Z(this,void 0,void 0,(function*(){const i=this[t],n=s.default.createChatList({ignoreClick:!0});let a=e[t];const o=e=>Z(this,void 0,void 0,(function*(){return!!(yield this.managers.appMessagesManager.getDialogOnly(e))||!!e.isUser()&&"user"===(yield this.managers.appUsersManager.getUser(e.toUserId()))._})),r=yield(0,P.Z)(a,(e=>o(e)));a.length=0,a.push(...r),a=a.slice();const d=e=>Z(this,void 0,void 0,(function*(){for(let t=0,i=Math.min(a.length,e);td(20)),{listenerSetter:this.listenerSetter}),l.append((0,f.ag)("FilterShowMoreChats",[a.length])),e.append(l)}d(4)}))))}editCheckForChange(){if("edit"===this.type){const e=!(0,I.Z)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){this.container&&Array.from(this.container.querySelectorAll("ul, .load-more")).forEach((e=>e.remove())),t?(this.originalFilter=e,this.filter=(0,m.Z)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){return void 0===e?(this.setFilter({_:"dialogFilter",id:0,title:"",pFlags:{},pinned_peers:[],include_peers:[],exclude_peers:[],pinnedPeerIds:[],includePeerIds:[],excludePeerIds:[]},!0),this.type="create"):(this.setFilter(e,!0),this.type="edit"),super.open().then((()=>{"edit"===this.type?(this.setFilter(this.originalFilter,!0),this.onEditOpen()):this.onCreateOpen()}))}}},4332:(e,t,i)=>{"use strict";i.d(t,{HQ:()=>d,ZP:()=>h});var s=i(4846),n=i(3552),a=i(4755),o=i(1669),r=i(410);const d="is-right-column-shown";class l extends n.Z{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1}construct(e){this.managers=e,a.Z.addEventListener("changeScreen",((e,t)=>{t===a._.medium&&e!==a._.mobile&&this.toggleSidebar(!1)})),a.Z.addEventListener("resize",(()=>{this.setColumnProportion()}))}createSharedMediaTab(){const e=this.createTab(o.Z,!0);return e.slider=this,e}replaceSharedMediaTab(e){const t=this.sharedMediaTab;if(t){const i=this.historyTabIds.indexOf(t);this._selectTab.getFrom()===t.container&&this._selectTab.setFrom(null==e?void 0:e.container),e?(-1!==i&&(this.historyTabIds[i]=e),t.container.classList.contains("active")&&e.container.classList.add("active"),t.container.replaceWith(e.container)):(-1!==i&&this.historyTabIds.splice(i,1),t.container.remove())}else this.tabsContainer.prepend(e.container);this.sharedMediaTab=e}onCloseTab(e,t,i){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,i)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const i=document.body.classList.contains(d);let n;if(void 0!==e?e?i||(n=!0):i&&(n=!0):n=!0,!n)return Promise.resolve();i||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const a=s.Z.selectTab(i?1:2,t);return document.body.classList.toggle(d,e),a}}const c=new l;r.GO.appSidebarRight=c;const h=c},4240:(e,t,i)=>{"use strict";i.d(t,{Z:()=>w});var s=i(3552),n=i(503),a=i(2621),o=i(2464),r=i(7479),d=i(9807),l=i(4494),c=i(8842),h=i(3512),u=i(8127),f=i(1168),p=i(2325),m=i(2738),g=i(1656),v=i(2946),b=i(8210),y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class w extends s._{init(){return y(this,void 0,void 0,(function*(){this.container.classList.add("edit-peer-container","edit-contact-container");const e=!(yield this.managers.appUsersManager.isContact(this.peerId.toUserId()));this.setTitle(e?"AddContactTitle":"Edit");{const t=new o.dw({noDelimiter:!0}),i=[],s=document.createElement("div");if(s.classList.add("input-wrapper"),this.nameInputField=new n.ZP({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new n.ZP({label:"LastName",name:"contact-lastname",maxLength:70}),this.peerId){const t=yield this.managers.appUsersManager.getUser(this.peerId);e?(this.nameInputField.setDraftValue(t.first_name),this.lastNameInputField.setDraftValue(t.last_name)):(this.nameInputField.setOriginalValue(t.first_name),this.lastNameInputField.setOriginalValue(t.last_name))}if(s.append(this.nameInputField.container,this.lastNameInputField.container),i.push(this.nameInputField,this.lastNameInputField),this.editPeer=new a.Z({peerId:this.peerId,inputFields:i,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),this.peerId){const i=document.createElement("div");i.classList.add("avatar-edit"),i.append(this.editPeer.avatarElem);const n=new d.Z({text:"Notifications"});n.input.addEventListener("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute(this.peerId)})),this.listenerSetter.add(h.Z)("notify_settings",(e=>y(this,void 0,void 0,(function*(){if("notifyPeer"!==e.peer._)return;const t=(0,v.Z)(e.peer.peer);if(this.peerId===t){const t=!(yield this.managers.appNotificationsManager.isMuted(e.notify_settings));t!==n.checked&&(n.checked=t)}}))));const a=document.createElement("div");a.classList.add("profile-name"),a.append(new c.Z({peerId:this.peerId}).element);const o=document.createElement("div");if(o.classList.add("profile-subtitle"),o.append((0,p.ag)("EditContact.OriginalName")),t.content.append(i,a,o,s),e){const e=yield this.managers.appUsersManager.getUser(this.peerId),i=new r.ZP({icon:"phone",titleLangKey:e.phone?void 0:"MobileHidden",title:e.phone?(0,b.Z)(e.phone):void 0,subtitleLangKey:e.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:e.phone?void 0:[new c.Z({peerId:this.peerId}).element]});t.content.append(i.container)}else{const e=new r.ZP({checkboxField:n,withCheckboxSubtitle:!0,listenerSetter:this.listenerSetter}),i=!(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1));n.checked=i,t.content.append(e.container)}}else t.content.append(s);this.scrollable.append(t.container),(0,m.fc)(this.editPeer.nextBtn,(()=>y(this,void 0,void 0,(function*(){this.editPeer.nextBtn.disabled=!0,this.managers.appUsersManager.addContact(this.peerId,this.nameInputField.value,this.lastNameInputField.value,(yield this.managers.appUsersManager.getUser(this.peerId)).phone).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}))),{listenerSetter:this.listenerSetter})}if(!e){const e=new o.dw({}),t=(0,l.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});(0,m.fc)(t,(()=>{new u.Z("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:(0,f.x)([{langKey:"Delete",callback:()=>{const e=(0,g.Z)([t],!0);this.managers.appUsersManager.deleteContacts([this.peerId]).then((()=>{this.close()}),(()=>{e()}))},isDanger:!0}])}).show()}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}}))}}},1669:(e,t,i)=>{"use strict";i.d(t,{Z:()=>ee});var s=i(3512),n=i(6360),a=i(3552),o=i(426),r=i(503),d=i(2621),l=i(2464),c=i(7479),h=i(4494),u=i(2166),f=i(144),p=i(279),m=i(1218),g=i(2796),v=i(6726),b=i(6024),y=i(2325),w=i(8127),S=i(8119),C=i(2738),L=i(1656),E=i(9807);class I extends b.h{init(){return e=this,t=void 0,n=function*(){this.container.classList.add("edit-peer-container","group-type-container");const e=yield this.managers.appChatsManager.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new l.dw({name:e?"ChannelType":"GroupType"}),i=(0,f.a)(),n=new c.ZP({radioField:new m.Z({langKey:e?"ChannelPrivate":"MegaPrivate",name:i,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),a=new c.ZP({radioField:new m.Z({langKey:e?"ChannelPublic":"MegaPublic",name:i,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),o=(0,c.De)([n,a],(e=>{const t=[d,M];"public"===e&&t.reverse(),t[0].container.classList.remove("hide"),t[1].container.classList.add("hide"),k()})),r=yield this.managers.appChatsManager.getChat(this.chatId);t.content.append(o);const d=new l.dw({}),b=new c.ZP({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{(0,u.T)(this.chatFull.exported_invite.link),(0,g.Am)(y.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),I=(0,h.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});(0,C.fc)(I,(()=>{new w.Z("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=(0,L.Z)([I],!0);this.managers.appProfileManager.getChatInviteLink(this.chatId,!0).then((t=>{e(),b.title.innerHTML=t}))}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()}),{listenerSetter:this.listenerSetter}),d.content.append(b.container,I);const M=new l.dw({caption:e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup",noDelimiter:!0}),P=document.createElement("div");P.classList.add("input-wrapper");const Z="t.me/",k=()=>{const e=n.radioField.checked&&x!==Z||T.isValidToChange()&&T.input.classList.contains("valid");A.classList.toggle("is-visible",e)},T=new v.l({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:k,peerId:this.chatId.toPeerId(!0),head:Z},this.managers),x=Z+(r.username||"");P.append(T.container),M.content.append(P);const A=(0,S.Z)({icon:"check",className:"is-visible"});this.content.append(A),(0,C.fc)(A,(()=>{(0,p.p)(A);const e=a.radioField.checked?T.getValue():"";this.managers.appChatsManager.migrateChat(this.chatId).then((t=>this.managers.appChatsManager.updateUsername(t,e))).then((()=>{this.close()}))}),{listenerSetter:this.listenerSetter}),(x!==Z?a:n).radioField.checked=!0,T.setOriginalValue(x),this.scrollable.append(t.container,d.container,M.container);{const t=new l.dw({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),i=new E.Z({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.toggleNoForwards(this.chatId,i.checked).then((()=>{e()}))}));const n=()=>{i.setValueSilently(!!r.pFlags.noforwards)};this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&n()})),n(),t.content.append(i.label),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(s,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,i,n}}var M=i(4668),P=i(5565),Z=i(8936),k=i(9893),T=i(8479),x=i(7120),A=i(2946),_=i(2995),F=i(6848),D=i(3061);class R extends b.h{init(){return e=this,t=void 0,s=function*(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new l.dw({name:"UserRestrictionsCanDo"}),i=document.createElement("div");i.classList.add("chatlist-container"),t.content.insertBefore(i,t.title);const s=k.default.createChatList({new:!0});i.append(s);const{dom:n}=k.default.addDialogNew({peerId:this.userId.toPeerId(!1),container:s,rippleEnabled:!0,avatarSize:"abitbigger"});n.lastMessageSpan.append((0,D.Z)(yield this.managers.appUsersManager.getUser(this.userId)));const a=new N({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0},this.managers);e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&(0,F.Z)(this.participant.banned_rights.pFlags,e.pFlags)||this.managers.appChatsManager.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new l.dw({});if("channelParticipantBanned"===this.participant._){const i=(0,h.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});(0,C.fc)(i,(()=>{const t=(0,L.Z)([i],!0);this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}),(()=>{t()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i)}const i=(0,h.Z)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});(0,C.fc)(i,(()=>{(0,L.Z)([i],!0),this.managers.appChatsManager.kickFromChannel(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var B=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class N{constructor(e,t){this.options=e,this.managers=t,this.construct()}construct(){return B(this,void 0,void 0,(function*(){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const e=this.options,t=yield this.managers.appChatsManager.getChat(e.chatId),i=t.default_banned_rights,s=e.participant?function(e,t){if(e.default_banned_rights){t=(0,T.Z)(t);const i=e.default_banned_rights.pFlags;for(const e in i)t.pFlags[e]=i[e]}return t}(t,e.participant.banned_rights):i,n=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const a of this.v){const o=a.flags[0];a.checkboxField=new E.Z({text:a.text,checked:(0,x.Z)(t,o,s),restriction:!0,withRipple:!0}),(e.participant&&i.pFlags[o]||t.username&&(a.flags.includes("pin_messages")||a.flags.includes("change_info")))&&(a.checkboxField.input.disabled=!0,(0,C.fc)(a.checkboxField.label,(e=>{(0,g.Am)(y.ZP.format(n,!0))}),{listenerSetter:e.listenerSetter})),this.toggleWith[o]&&e.listenerSetter.add(a.checkboxField.input)("change",(()=>{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 O extends b.h{init(){return B(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new l.dw({name:"ChannelPermissionsHeader"});e=new N({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content},this.managers),this.eventListener.addEventListener("destroy",(()=>{this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId,e.takeOut())}),{once:!0}),this.scrollable.append(t.container)}{const t=new l.dw({name:"PrivacyExceptions"}),i=new c.ZP({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new _.Z({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout((()=>{n(e)}),0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})},listenerSetter:this.listenerSetter}),n=e=>B(this,void 0,void 0,(function*(){let t;try{t=yield this.managers.appProfileManager.getChannelParticipant(this.chatId,e)}catch(e){return void(0,g.Am)("User is no longer participant")}const i=this.slider.createTab(R);i.participant=t,i.chatId=this.chatId,i.userId=e,i.open()}));t.content.append(i.container);const a=t.generateContentElement();a.classList.add("chatlist-container");const o=k.default.createChatList({new:!0});a.append(o),(0,C.fc)(o,(e=>{const t=(0,M.Z)(e.target,k.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();n(i)}),{listenerSetter:this.listenerSetter});const r=(t,i)=>B(this,void 0,void 0,(function*(){const s=i.banned_rights,n=(yield this.managers.appChatsManager.getChat(this.chatId)).default_banned_rights,a=[];e.v.forEach((e=>{const t=e.flags[0];s.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)}));const o=t.querySelector(".user-last-message");a.length&&(o.innerHTML="",o.append(...(0,y.v_)(a.map((e=>(0,y.ag)(e))),!1))),o.classList.toggle("hide",!a.length)})),d=(e,t)=>{const{dom:i}=k.default.addDialogNew({peerId:(0,A.Z)(e.peer),container:o,rippleEnabled:!0,avatarSize:"abitbigger",append:t});r(i.listEl,e)},h=()=>{(0,P.Z)(i.subtitle,(0,y.ag)(f?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[f]))};let u,f=0;const p=()=>(u=new Z.Z({scrollable:this.scrollable,getPromise:()=>this.managers.appProfileManager.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,o.childElementCount).then((e=>{for(const t of e.participants)d(t,!0);return f=e.count,h(),e.participants.length<50||e.count===o.childElementCount}))}),u.load());this.scrollable.append(t.container),(yield this.managers.appChatsManager.isChannel(this.chatId))?yield p():(h(),this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,p())})))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}var U=i(6194),H=i(5701),z=i(62),j=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class G extends b.h{init(){var e;return j(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield this.managers.appReactionsManager.getActiveAvailableReactions(),i=yield this.managers.appProfileManager.getChatFull(this.chatId),s=yield this.managers.appChatsManager.isBroadcast(this.chatId);let n=null!==(e=i.available_reactions)&&void 0!==e?e:{_:"chatReactionsNone"},a=n,o=new Set("chatReactionsSome"===n._?n.reactions.map((e=>e.emoticon)):[]);const r=e=>e.map((e=>({_:"reactionEmoji",emoticon:e}))),d=()=>s?"EnableReactionsChannelInfo":"chatReactionsAll"===a._?"EnableAllReactionsInfo":"chatReactionsNone"===a._?"DisableReactionsInfo":"EnableSomeReactionsInfo",h=new l.dw({name:s?void 0:"AvailableReactions",caption:d()}),u=new l.dw({name:"OnlyAllowThisReactions"}),f=()=>{var e;const t=null!==(e=a.reactions)&&void 0!==e?e:[];o=new Set(t.map((({emoticon:e})=>e))),m.forEach(((e,t)=>{e.setValueSilently(o.has(t))}))};let p;if(s){p=new E.Z({toggle:!0,checked:"chatReactionsSome"===n._});const e=new c.ZP({checkboxField:p,titleLangKey:"EnableReactions",listenerSetter:this.listenerSetter});h.content.append(e.container),this.listenerSetter.add(p.input)("change",(()=>{let e=!0;p.checked?g.every((e=>!e.checked))?a={_:"chatReactionsSome",reactions:r(t.map((({reaction:e})=>e)))}:"chatReactionsSome"!==a._?a={_:"chatReactionsSome",reactions:r(Array.from(o))}:e=!1:a={_:"chatReactionsNone"},e&&(f(),b())}))}else{const e=[["chatReactionsAll","AllReactions"],["chatReactionsSome","SomeReactions"],["chatReactionsNone","NoReactions"]],t=()=>{u.container.classList.toggle("hide","chatReactionsSome"!==a._)};let i=n._;const s=(0,c.ZC)(e.map((([e,t])=>({langPackKey:t,value:e,checked:n._===e}))),(e=>{i=e,a="chatReactionsAll"===i?{_:i,pFlags:{allow_custom:!0}}:"chatReactionsNone"===i?{_:i}:{_:i,reactions:r(["👍","👎"])},(0,P.Z)(h.caption,(0,y.ag)(d())),f(),b(),t()}));h.content.append(s),t()}const m=new Map,g=t.map((e=>{const t=e.reaction,i=new E.Z({toggle:!0,checked:o.has(t)});m.set(t,i),this.listenerSetter.add(i.input)("change",(()=>{i.checked?(o.add(t),p&&!p.checked&&(p.checked=!0)):(o.delete(t),(null==p?void 0:p.checked)&&!o.size&&(p.checked=!1)),b()}));const s=new c.ZP({checkboxField:i,title:e.title,havePadding:!0,listenerSetter:this.listenerSetter});return(0,z.Z)({row:s,doc:e.static_icon,size:"small"}),u.content.append(s.container),i})),v=()=>j(this,void 0,void 0,(function*(){b.clearTimeout(),"chatReactionsSome"===a._&&(a.reactions=r(Array.from(o))),this.managers.appChatsManager.setChatAvailableReactions(this.chatId,a),n=a})),b=(0,H.Z)(v,3e3,!1,!0);this.eventListener.addEventListener("destroy",(()=>{b.isDebounced()&&v()}),{once:!0}),this.scrollable.append(h.container,u.container)}))}}var V=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class K extends a._{_init(){var e;return V(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.innerHTML="",null!==(e=this.tempId)&&void 0!==e||(this.tempId=0);const t=++this.tempId;this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let i=yield this.managers.appProfileManager.getChatFull(this.chatId,!0);const n=yield this.managers.appChatsManager.getChat(this.chatId),a=yield this.managers.appChatsManager.isBroadcast(this.chatId),o=yield this.managers.appChatsManager.isChannel(this.chatId),u=[],f=e=>{u.push(e)};this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&u.forEach((e=>e()))})),this.listenerSetter.add(s.Z)("chat_full_update",(e=>V(this,void 0,void 0,(function*(){this.chatId===e&&(i=(yield this.managers.appProfileManager.getCachedFullChat(e))||i)}))));const p=this.chatId.toPeerId(!0),m=yield this.managers.appChatsManager.hasRights(this.chatId,"change_type"),g=yield this.managers.appChatsManager.hasRights(this.chatId,"change_permissions");{const e=new l.dw({noDelimiter:!0}),o=[],h=document.createElement("div");if(h.classList.add("input-wrapper"),this.chatNameInputField=new r.ZP({label:a?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new r.ZP({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(n.title),this.descriptionInputField.setOriginalValue(i.about),h.append(this.chatNameInputField.container,this.descriptionInputField.container),o.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new d.Z({peerId:p,inputFields:o,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.content.append(this.editPeer.avatarEdit.container,h),m){const t=new c.ZP({titleLangKey:a?"ChannelType":"GroupType",clickable:()=>{const e=this.slider.createTab(I);e.chatId=this.chatId,e.chatFull=i,e.open(),this.listenerSetter.add(e.eventListener)("destroy",s)},icon:"lock",listenerSetter:this.listenerSetter}),s=()=>{let e;t.subtitle.textContent="",e=a?n.username?"TypePublic":"TypePrivate":n.username?"TypePublicGroup":"TypePrivateGroup",t.subtitle.append((0,y.ag)(e))};s(),e.content.append(t.container)}if(m||g){const s=new c.ZP({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=this.slider.createTab(G);e.chatId=this.chatId,e.open().then((()=>{this.tempId===t&&this.listenerSetter.add(e.eventListener)("destroy",a)}))},listenerSetter:this.listenerSetter}),n=(yield this.managers.appReactionsManager.getAvailableReactions()).filter((e=>!e.pFlags.inactive)).length,a=()=>{var e;const t=null!==(e=i.available_reactions)&&void 0!==e?e:{_:"chatReactionsNone"};if("chatReactionsSome"===t._){const e=t.reactions.length;e===n?(0,P.Z)(s.subtitle,(0,y.ag)("ReactionsAll")):s.subtitle.textContent=e+"/"+n}else(0,P.Z)(s.subtitle,(0,y.ag)("chatReactionsAll"===t._?"ReactionsAll":"Checkbox.Disabled"))};a(),e.content.append(s.container)}if(g&&!a){const t=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],i=new c.ZP({titleLangKey:"ChannelPermissions",clickable:()=>{const e=this.slider.createTab(O);e.chatId=this.chatId,e.open()},icon:"permissions",listenerSetter:this.listenerSetter}),n=()=>V(this,void 0,void 0,(function*(){const e=yield this.managers.appChatsManager.getChatTyped(this.chatId);i.subtitle.innerHTML=t.reduce(((t,i)=>t+ +(0,x.Z)(e,i,e.default_banned_rights)),0)+"/"+t.length}));n(),e.content.append(i.container),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&n()}))}if(this.scrollable.append(e.container),(0,C.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appChatsManager.editPhoto(t,e)))),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}),{listenerSetter:this.listenerSetter}),a&&(yield this.managers.appChatsManager.hasRights(this.chatId,"change_info"))){const t=new E.Z({text:"PeerInfo.SignMessages",checked:!!n.pFlags.signatures});this.listenerSetter.add(t.input)("change",(()=>{const e=t.toggleDisability(!0);this.managers.appChatsManager.toggleSignatures(this.chatId,t.checked).then((()=>{e()}))})),f((()=>{t.setValueSilently(!!n.pFlags.signatures)})),e.content.append((0,c.tG)(t).container)}}if(!a){const e=new l.dw({});if(!a&&m){const t=new E.Z({text:"ChatHistory"});this.listenerSetter.add(t.input)("change",(()=>{const e=t.toggleDisability(!0);this.managers.appChatsManager.togglePreHistoryHidden(this.chatId,!t.checked).then((()=>{e()}))}));const s=()=>{t.setValueSilently(o&&!i.pFlags.hidden_prehistory)};s(),f(s),e.content.append((0,c.tG)(t).container)}e.content.childElementCount&&this.scrollable.append(e.container)}if(yield this.managers.appChatsManager.hasRights(this.chatId,"delete_chat")){const e=new l.dw({}),t=(0,h.Z)("btn-primary btn-transparent danger",{icon:"delete",text:a?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});(0,C.fc)(t,(()=>{new U.Z(p,void 0,(e=>{const i=(0,L.Z)([t],!0);e.then((()=>{this.close()}),(()=>{i()}))}))}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}o||this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{p===e&&(this.chatId=t.toChatId(),this._init())}))}))}init(){return this._init()}}var W=i(8842),$=i(4240),q=i(2230),Q=i(5670),Y=i(8261),J=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const X={};class ee extends a._{constructor(e){super(e,!1),this.threadId=0}init(){this.container.classList.add("shared-media-container","profile-container");const e=(0,h.Z)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t);const i=document.createElement("div");i.className="transition slide-fade";const a=document.createElement("div");a.classList.add("transition-item"),this.title.append((0,y.ag)("Profile")),this.editBtn=(0,q.Z)("edit"),a.append(this.title,this.editBtn);const r=document.createElement("div");r.classList.add("transition-item");const d=this.title.cloneNode();d.append((0,y.ag)("PeerInfo.SharedMedia")),r.append(d),i.append(a,r),this.header.append(i),this.profile=new Y.Z(this.managers,this.scrollable,this.listenerSetter),this.profile.init(),this.scrollable.append(this.profile.element),this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const t=e.top-1;l(t<=56)};const l=e=>{t.classList.toggle("state-back",e),this.searchSuper.container.classList.toggle("is-full-viewport",e),c(+e),e||this.searchSuper.cleanScrollPositions()},c=(0,o.v)(i,"slide-fade",400,null,!1);c(0),(0,C.fc)(this.closeBtn,(e=>{this.closeBtn.firstElementChild.classList.contains("state-back")?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),c(0),t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),{listenerSetter:this.listenerSetter}),(0,C.fc)(this.editBtn,(e=>{let t;t=this.peerId.isAnyChat()?this.slider.createTab(K):this.slider.createTab($.Z),t&&(t instanceof K?t.chatId=this.peerId.toChatId():t.peerId=this.peerId,t.open())}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.Z)("contacts_update",(e=>{this.peerId===e&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("history_multiappend",(e=>{this.renderNewMessages(e)})),this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))})),this.listenerSetter.add(s.Z)("message_sent",(({message:e})=>{this.renderNewMessages(e)})),this.searchSuper=new n.Z({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=>{const t="members"===e.type&&s.Z.settings.animationsEnabled?250:0;setTimeout((()=>{u.classList.toggle("is-hidden","members"!==e.type)}),t)},managers:this.managers}),this.searchSuper.scrollStartCallback=()=>{l(!0)},this.profile.element.append(this.searchSuper.container);const u=(0,S.Z)({icon:"addmember_filled"});this.content.append(u),(0,C.fc)(u,(()=>J(this,void 0,void 0,(function*(){const e=this.peerId,t=this.peerId.toChatId(),i=yield this.managers.appChatsManager.isChannel(t),s=(t,s)=>{let n,a,o,r,d;if(t.length>1)n="AddMembersAlertTitle",a=[(0,y.ag)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map((e=>{const t=document.createElement("b");return t.append(new W.Z({peerId:e}).element),t})),i||(d=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new W.Z({peerId:t[0]}).element),r=[e],i||(d=[{text:"AddOneMemberForwardMessages",textArgs:[new W.Z({peerId:t[0]}).element],checked:!0}])}r.push(new W.Z({peerId:e}).element),new w.Z("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:s}],checkboxes:d}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&(0,g.bC)({langPackKey:"InviteToGroupError"})};if(i){const e=this.slider.createTab(Q.Z);e.open({type:"channel",skippable:!1,takeOut:i=>(s(i,(()=>{const s=this.managers.appChatsManager.inviteToChannel(t,i);s.catch(n),e.attachToPromise(s)})),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new _.Z({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout((()=>{s([e],(i=>{this.managers.appChatsManager.addChatUser(t,e,i.size?void 0:0).catch(n)}))}),0)}})}))),{listenerSetter:this.listenerSetter})}renderNewMessages(e){return J(this,void 0,void 0,(function*(){if(this.init)return;const{peerId:t}=e;if(X[t])for(const i of this.searchSuper.mediaTabs){const s=i.inputFilter,n=X[t][s];if(!n)continue;const a=this.searchSuper.filterMessagesByType([e],s).filter((e=>!n.find((t=>t.mid===e.mid&&t.peerId===e.peerId))));a.length&&(n.unshift(...a.map((e=>({mid:e.mid,peerId:e.peerId})))),this.peerId===t&&-1!==this.searchSuper.usedFromHistory[s]&&(this.searchSuper.usedFromHistory[s]+=a.length,this.searchSuper.performSearchResult(a,i,!1)))}}))}deleteDeletedMessages(e,t){if(!this.init&&X[e]){for(const i of t)for(const t of this.searchSuper.mediaTabs){const s=t.inputFilter,n=X[e][s];if(!n)continue;const a=n.findIndex((e=>e.mid===i));if(-1!==a&&(n.splice(a,1),this.peerId===e)){const t=this.searchSuper.tabs[s].querySelector(`[data-mid="${i}"][data-peer-id="${e}"]`);t&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(t),t.remove()),this.searchSuper.usedFromHistory[s]>=a+1&&--this.searchSuper.usedFromHistory[s]}}this.scrollable.onScroll()}}cleanupHTML(){return J(this,void 0,void 0,(function*(){this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",(yield this.searchSuper.canViewMembers())&&(yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"invite_users")))}))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t=0){var i;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,historyStorage:null!==(i=X[e])&&void 0!==i?i:X[e]={}}),this.profile.setPeer(e,t),!0)}fillProfileElements(){return J(this,void 0,void 0,(function*(){this.peerChanged&&(this.peerChanged=!1,yield this.cleanupHTML(),yield this.toggleEditBtn(),yield this.profile.fillProfileElements())}))}toggleEditBtn(){return J(this,void 0,void 0,(function*(){let e;e=this.peerId.isUser()?this.peerId!==s.Z.myId&&(yield this.managers.appUsersManager.isContact(this.peerId.toUserId())):yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"change_info"),this.editBtn.classList.toggle("hide",!e)}))}loadSidebarMedia(e,t){this.searchSuper.load(e,t)}onOpenAfterTimeout(){this.scrollable.onScroll()}destroy(){this.destroyable=!0,this.onCloseAfterTimeout(),this.profile.destroy(),this.searchSuper.destroy()}}},9099:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512);const n=(e,t,i,a,o,r,d)=>{const{timeout:l,raf:c}=e.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete e.dataset.raf),r&&s.Z.settings.animationsEnabled&&a)return void(e.dataset.raf=""+window.requestAnimationFrame((()=>{delete e.dataset.raf,n(e,t,i,a,o,r-1,d)})));i&&t&&e.classList.add(t);const h=()=>{delete e.dataset.timeout,!i&&t&&e.classList.remove("backwards",t),e.classList.remove("animating"),null==o||o()};if(null==d||d(),!s.Z.settings.animationsEnabled||!a)return e.classList.remove("animating","backwards"),void h();e.classList.add("animating"),e.classList.toggle("backwards",!i),e.dataset.timeout=""+setTimeout(h,a)},a=n},3552:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d,_:()=>a.Z});var s=i(426),n=i(9818),a=i(6024),o=i(1655),r=i(5953);class d{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{n.Z.findItemByType(this.navigationType)?n.Z.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,i)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return this.removeTabFromHistory(e),!1;const s=this.historyTabIds.pop();this.onCloseTab(s,t,i);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof a.Z?n.container:n:this.canHideFirst?-1:0,t),!0},(0,r.Z)(this,e),this.tabs||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=(0,s.v)(this.tabsContainer,"navigation",250),this.canHideFirst||this._selectTab(0)}selectTab(e){var t;if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const i=e instanceof a.Z?e:this.tabs.get(e);return i&&(null===(t=i.onOpen)||void 0===t||t.call(i),i.onOpenAfterTimeout&&setTimeout((()=>{i.onOpenAfterTimeout()}),250)),n.Z.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof a.Z?e.container:e),!0}removeTabFromHistory(e){(0,o.Z)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let i=this.historyTabIds.length-1;i>=0;--i){const s=this.historyTabIds[i];if(s!==t){if(s instanceof e)break;this.removeTabFromHistory(s)}}}getTab(e){return this.historyTabIds.find((t=>t instanceof e))}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,i){var s;i||n.Z.removeByType(this.navigationType,!0);const o=e instanceof a.Z?e:this.tabs.get(e);if(o){try{null===(s=o.onClose)||void 0===s||s.call(o)}catch(e){console.error("tab onClose error",o)}o.onCloseAfterTimeout&&setTimeout((()=>{o.onCloseAfterTimeout()}),280)}}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}createTab(e,t){const i=new e(t?void 0:this,!0);return i.managers=this.managers,i}}},6024:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,h:()=>c});var s=i(3241),n=i(3699),a=i(319),o=i(2325),r=i(2230),d=i(8805);class l{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=(0,r.Z)("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 d.ZP(this.content,void 0,void 0,!0),this.container.append(this.header,this.content),this.slider&&this.slider.addTab(this),this.listenerSetter=new n.Z}close(){return this.slider.closeTab(this)}open(...e){return t=this,i=void 0,n=function*(){if(this.init)try{const t=this.init(...e);this.init=null,t instanceof Promise&&(yield t)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}init(...e){}onOpen(){}onOpenAfterTimeout(){}onClose(){}onCloseAfterTimeout(){var e;this.destroyable&&(this.slider.tabs.delete(this),this.container.remove(),this.scrollable.destroy(),null===(e=this.listenerSetter)||void 0===e||e.removeAll())}setTitle(e){this.title.replaceChildren((0,o.ag)(e))}}class c extends l{constructor(e){super(e),this.eventListener=new s.Z}onClose(){this.eventListener.dispatchEvent("close")}onCloseAfterTimeout(){const e=this.eventListener.dispatchResultableEvent("destroy");return this.eventListener.dispatchEvent("destroyAfter",Promise.all(e).then(a.Z,a.Z)),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}},2894:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(9893),n=i(8594),a=i(8487),o=i(4484),r=i(5565),d=i(3035),l=i(5345),c=i(5953),h=i(3061),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class f extends l.Z{constructor(e){let t;super({getIndex:e.getIndex||(e=>this.managers.appUsersManager.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>u(this,void 0,void 0,(function*(){const t=(0,h.Z)(yield this.managers.appUsersManager.getUser(e.id));(0,r.Z)(e.dom.lastMessageSpan,t)}))),onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;(0,o.Z)(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});return e.dom=t,e},updateElementWith:d.T2,updateListWith:e=>u(this,void 0,void 0,(function*(){return(0,a.Z)(this.list)?(yield(0,n.e9)(),(0,a.Z)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,(0,c.Z)(this,e),this.list=s.default.createChatList(this.createChatListOptions);const i=()=>{t=window.setTimeout((()=>{this.updateList((e=>{e&&i()}))}),f.SORT_INTERVAL)};i()}}f.SORT_INTERVAL=3e4},9259:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(5432),n=i(3910),a=i(2738),o=i(5975),r=i(8497),d=i(8204),l=i(9405),c=i(3624),h=i(3035),u=i(5418),f=i(241),p=i(13),m=i(8115),g=i(4776),v=i(1447),b=i(3772),y=i(3512),w=i(5814),S=i(9099),C=i(3541),L=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let E=!1;function I({listenTo:e,listenerSetter:t,selector:i,findTarget:I}){if(s.Z)return;const M=(t,s)=>{let n;if(I)n=I(t);else{const e=i||".media-sticker-wrapper";n=t.target.closest(e)}return!n||s&&!(0,o.Z)(n,e)?void 0:n},P=y.Z.managers;t.add(e)("mousedown",(e=>{if(E||e.buttons>1||0!==e.button)return;let t=M(e);if(!t)return;const i=t.dataset.docId;if(!i)return;const s="sticker-viewer",y="STICKER-VIEWER",I=w.Z.getOnlyOnePlayableGroup(),Z=(0,c.k)();let k,T;const x=({mediaContainer:e,doc:t,middleware:i,lockGroups:n,isSwitching:o})=>L(this,void 0,void 0,(function*(){const c=(0,p.Z)(t),S=e.getBoundingClientRect(),L=(0,l.C)(t.w,t.h),E=c?280:360,I=(0,l.C)(E,E),M=S.width===S.height?I:L.aspectFitted(I),Z=(0,r.Z)(e,"bubble"),T=!Z||Z.classList.contains("is-out"),x=document.createElement("div");x.classList.add(s+"-transformer");const A=document.createElement("div");A.classList.add(s+"-sticker"),A.style.width=M.width+"px",A.style.height=M.height+"px";const _=document.createElement("div");if(_.classList.add(s+"-emoji"),_.append((0,m.Z)(t.stickerEmojiRaw)),c){const e=(E*C.Vp-E)/3*(T?1:-1);x.classList.add("has-effect"),x.style.setProperty("--translateX",`${e}px`),_.style.setProperty("--translateX",-e+"px")}const F=(0,r.Z)(e,"scrollable"),D=(0,d.Z)(e,F,!0,S);(D.overflow.vertical||D.overflow.horizontal)&&A.classList.add("is-overflow");const R=e.getBoundingClientRect(),B=R.width/M.width,N=R.height/M.height,O=R.left-(f.Z.width-R.width)/2,U=R.top-(f.Z.height-R.height)/2;x.style.transform=`translate(${O}px, ${U}px) scale(${B}, ${N})`,o&&x.classList.add("is-switching"),x.append(A,_),k.append(x);const H=yield(0,C.ZP)({doc:t,div:A,group:y,width:M.width,height:M.height,play:!1,loop:!0,middleware:i,managers:P,needFadeIn:!1,isOut:T,withThumb:!1,relativeEffect:!0,loopEffect:!0}).then((({render:e})=>e));if(!i())return;k.parentElement||document.body.append(k);const z=Array.isArray(H)?H[0]:H,j=z instanceof b.Z?new Promise((e=>z.addEventListener("firstFrame",e,{once:!0}))):Promise.resolve();if(yield Promise.all([j,(0,h.d1)()]),yield(0,u.Z)(0),i()){if(n&&(w.Z.setOnlyOnePlayableGroup(y),w.Z.checkAnimations2(!0)),z instanceof b.Z){const t=e instanceof g.LD?e.player:v.Z.getAnimation(e);if(t){if(z.curFrame=t.curFrame,z.play(),yield new Promise((e=>{let t=0;const i=()=>{2==++t&&(e(),z.removeEventListener("enterFrame",i))};z.addEventListener("enterFrame",i)})),!i())return;z.pause()}}else if(z instanceof HTMLVideoElement){const t=e.querySelector("video");t&&(z.currentTime=t.currentTime)}return{ready:()=>{(z instanceof b.Z||z instanceof HTMLVideoElement)&&z.play(),c&&(0,a.tH)(A)},transformer:x}}})),A=window.setTimeout((()=>L(this,void 0,void 0,(function*(){document.removeEventListener("mousemove",F),k=document.createElement("div"),k.classList.add(s),E=!0;const e=Z.get(),n=yield P.appDocsManager.getDoc(i);if(!e())return;let a;try{if(a=yield x({doc:n,mediaContainer:t,middleware:e,lockGroups:!0}),!a)return}catch(e){return}const{ready:o,transformer:r}=a;T=r,(0,S.Z)(k,"is-visible",!0,200,(()=>{e()&&o()})),document.addEventListener("mousemove",_)}))),125),_=e=>L(this,void 0,void 0,(function*(){const i=M(e,!0);if(!i||t===i)return;const s=i.dataset.docId;if(!s)return;t=i,Z.clean();const n=Z.get(),a=yield P.appDocsManager.getDoc(s);if(!n())return;let o;try{if(o=yield x({doc:a,mediaContainer:t,middleware:n,isSwitching:!0}),!o)return}catch(e){return void console.error("sticker viewer error",e)}const{ready:r,transformer:d}=o,l=T;(0,S.Z)(l,"is-switching",!0,200,(()=>{l.remove()})),T=d,(0,S.Z)(d,"is-switching",!1,200,(()=>{n()&&r()}))})),F=e=>{(0,o.Z)(e.target,t)||D()},D=()=>{clearTimeout(A),Z.clean(),k&&((0,S.Z)(k,"is-visible",!1,200,(()=>{k.remove(),w.Z.setOnlyOnePlayableGroup(I),w.Z.checkAnimations2(!1),E=!1})),(0,a.fc)(document.body,n.Z,{capture:!0,once:!0})),document.removeEventListener("mousemove",F),document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",D,{capture:!0})};document.addEventListener("mousemove",F),document.addEventListener("mouseup",D,{once:!0,capture:!0})}))}},5117:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.container=e,this.handler=t,this.observeHeaders(),this.observeElements()}observeHeaders(){this.headersObserver=new IntersectionObserver((e=>{for(const t of e){const e=t.boundingClientRect,i=t.target.parentElement,s=t.rootBounds;e.bottom=s.top&&e.bottom{const t=e.filter((e=>e.boundingClientRect.tope.boundingClientRect.top-t.boundingClientRect.top))[0];if(!t)return;const i=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,i)}),{root:this.container})}addSentinel(e,t){const i=document.createElement("div");return i.classList.add("sticky_sentinel",t),e.appendChild(i)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}},3757:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3910),n=i(5432),a=i(5953),o=i(3416);const r=e=>e.touches?e.touches[0]:e,d=window;let l=!1;o.Z.addEventListener("toggle",(e=>{l=e}));class c{constructor(e){this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.hadMove=!1,this.xDown=null,this.yDown=null,this.reset=e=>{n.Z?d.removeEventListener("touchmove",this.handleMove,{capture:!0}):(d.removeEventListener("mousemove",this.handleMove),this.setCursorTo.style.cursor=""),this.onReset&&this.hadMove&&this.onReset(),this.xDown=this.yDown=null,this.hadMove=!1},this.handleStart=e=>{return t=this,i=void 0,a=function*(){const t=r(e);if(this.verifyTouchTarget&&!(yield this.verifyTouchTarget(e)))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,n.Z?d.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):d.addEventListener("mousemove",this.handleMove,!1)},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||l)return void this.reset();this.cancelEvent&&(0,s.Z)(e);const t=r(e),i=t.clientX,a=t.clientY,o=this.xDown-i,d=this.yDown-a;if(!this.hadMove){if(!o&&!d)return;this.hadMove=!0,n.Z||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),this.onFirstSwipe&&this.onFirstSwipe()}const c=this.onSwipe(o,d,e);void 0!==c&&c&&this.reset()},(0,a.Z)(this,e),this.setCursorTo=this.element,this.setListeners()}setListeners(){n.Z?(this.element.addEventListener("touchstart",this.handleStart,this.listenerOptions),d.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),d.addEventListener("mouseup",this.reset))}removeListeners(){n.Z?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),d.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),d.removeEventListener("mouseup",this.reset))}setCursor(e){this.cursor=e,!n.Z&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}},709:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2398),n=i(6272),a=i(4762),o=i(503);class r extends o.ZP{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");const 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 i;a.IS_APPLE?i=-.16*e:a.IS_ANDROID&&(i=0),t.style.setProperty("--letter-spacing",i+"px")}const i=this.setValueSilently.bind(this);this.setValueSilently=e=>{i(e),(0,s.Z)(this.input,!0)}}t.addEventListener("input",(()=>{t.classList.remove("error");const i=this.value;let s;Math.abs(i.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+i),this.pasted=!1,this.setLabel();let o,r,d,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(s=(0,n.u)(this.value),o=s.formatted,r=s.country,l=s.leftPattern,d=s.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),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}))}}},2796:(e,t,i)=>{"use strict";i.d(t,{Am:()=>c,PE:()=>l,bC:()=>h});var s=i(5565),n=i(2296),a=i(2325);const o=document.createElement("div");let r;o.classList.add("toast");const d=new n.Z("toast");function l(){d.close(),o.classList.remove("is-visible"),r&&clearTimeout(+r),r=window.setTimeout((()=>{o.remove(),r=void 0}),200)}function c(e,t){d.close(),(0,s.Z)(o,e),o.parentElement||(document.body.append(o),o.offsetLeft),o.classList.add("is-visible"),r&&clearTimeout(+r),d.open(o),r=window.setTimeout(l,3e3),t&&d.addEventListener("toggle",t,{once:!0})}function h(e){c((0,a.ag)(e.langPackKey,e.langPackArguments),e.onClose)}d.addEventListener("toggle",(e=>{e||l()}))},426:(e,t,i)=>{"use strict";i.d(t,{v:()=>c});var s=i(3512),n=i(3725),a=i(8594),o=i(2648),r=i(3910);function d(e,t,i){const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",e.style.filter="",()=>{t.style.transform=t.style.filter=""}}function l(e,t,i){const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.transform=`translate3d(${-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",()=>{t.style.transform=""}}const c=(e,t,i,s,n=!0,a)=>{let o=null;switch(t){case"tabs":o=l;break;case"navigation":o=d}return e.dataset.animation=t,h(e,o,i,s,n,void 0,void 0,a)},h=(e,t,i,d,l=!0,c=!1,h=!0,u)=>{const f=new Map;let p,m=null;if(h){const i=t?"transitionend":"animationend",s=t=>{if((0,r.Z)(t),t.target.parentElement!==e)return;const n=f.get(t.target);null==n||n(),t.target===m&&(!p&&l||(p&&(p.resolve(),p=void 0),d&&d(g.prevId()),e.classList.remove("animating","backwards","disable-hover"),c&&(u?u.removeManual(e,i,s):e.removeEventListener(i,s),m=p=void 0,f.clear())))};u?u.add(e)(i,s):e.addEventListener(i,s)}function g(r,c=!0,u){u&&(m=u),r instanceof HTMLElement&&(r=(0,o.Z)(r));const v=g.prevId();if(r===v)return!1;const b=e.children[r];if(s.Z.settings.animationsEnabled&&-1!==v||(c=!1),!h){const t=e.dataset.timeout;void 0!==t&&clearTimeout(+t),delete e.dataset.timeout}if(!c){if(m)m.classList.remove("active","to","from");else if(b){const e=f.get(b);null==e||e()}return b&&(b.classList.remove("to","from"),b.classList.add("active")),e.classList.remove("animating","backwards","disable-hover"),m=b,void(d&&d(r))}h||(e.dataset.timeout=""+window.setTimeout((()=>{b.classList.remove("to"),m&&m.classList.remove("from"),e.classList.remove("animating","backwards","disable-hover"),delete e.dataset.timeout}),i)),m&&(m.classList.remove("to"),m.classList.add("from")),e.classList.add("animating");const y=v{b.classList.remove("to"),f.delete(b)}))}if(m){let e;const t=m,s=()=>{clearTimeout(e),t.classList.remove("active","from"),w&&(null==w||w()),f.delete(t)};b?(e=window.setTimeout(s,i+100),f.set(t,s)):(e=window.setTimeout(s,i),f.set(t,(()=>{clearTimeout(e),f.delete(t)}))),t.dataset.transitionTimeout=""+e,l&&(p||(p=(0,n.Z)()),(0,a.YW)(p,2*i))}m=b}return g.prevId=()=>m?(0,o.Z)(m):-1,g.getFrom=()=>m,g.setFrom=e=>m=e,g}},6726:(e,t,i)=>{"use strict";i.d(t,{l:()=>o});var s=i(5701),n=i(503);function a(e){return(e.length>=5&&e.length<=32||!e.length)&&/^[a-zA-Z0-9_]*$/.test(e)}class o extends n.ZP{constructor(e,t){super(e),this.managers=t,this.checkUsernameDebounced=(0,s.Z)(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",(()=>{const e=this.getValue();if(e===this.originalValue||!e.length)return this.setState(n.I1.Neutral),void(this.options.onChange&&this.options.onChange());a(e)?this.setState(n.I1.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?this.options.onChange&&this.options.onChange():this.checkUsernameDebounced(e)}))}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){this.checkUsernamePromise||(this.options.peerId?this.checkUsernamePromise=this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(),e):this.checkUsernamePromise=this.managers.appUsersManager.checkUsername(e),this.checkUsernamePromise.then((t=>{this.getValue()===e&&(t?this.setState(n.I1.Valid,this.options.availableText):this.setError(this.options.takenText))}),(t=>{this.getValue()===e&&"USERNAME_INVALID"===t.type&&this.setError(this.options.invalidText)})).then((()=>{this.checkUsernamePromise=void 0,this.options.onChange&&this.options.onChange();const t=this.getValue();t!==e&&this.isValidToChange()&&a(t)&&this.checkUsername(t)})))}}},2940:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver((t=>{if(this.locked)return;const i=[];t.forEach(((e,t)=>{const s=e.target;if(this.items.get(s)===e.isIntersecting)return;this.items.set(s,e.isIntersecting);const n={target:s,visible:e.isIntersecting,entry:e,index:t};i.push(n)})),i.forEach((t=>{e(t)}))}),t)}getVisible(){const e=[];return this.items.forEach(((t,i)=>{t&&e.push(i)})),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}},8427:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3910),n=i(2738),a=i(3013),o=i(65);class r extends o.Z{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&(0,s.Z)(e),a.Z.muted=!a.Z.muted},this.setVolume=()=>{const{volume:e,muted:t}=a.Z;let i;i=!e||t?0:e>.5?3:e>0&&e<.25?1:2,r.ICONS.forEach((e=>this.icon.classList.remove("tgico-"+e))),this.icon.classList.add("tgico-"+r.ICONS[i]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);a.Z.muted=!1,a.Z.volume=t}});const i="player-volume",o=this.btn=document.createElement("div");o.classList.add("btn-icon",i);const d=this.icon=document.createElement("span");d.classList.add(i+"__icon"),o.append(d,this.container),(0,n.fc)(d,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.Z)("playbackParams",this.setVolume),this.setVolume()}}r.ICONS=["volume_off","volume_mute","volume_down","volume_up"]},9083:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4776);function n({docIds:e,loadPromises:t,middleware:i,lazyLoadQueue:n,size:a,animationGroup:o}){const r=" ".repeat(e.length),d=[];return e.forEach(((e,t)=>{d.push({_:"messageEntityCustomEmoji",offset:t,length:1,document_id:e})})),(0,s.ZP)(r,{entities:d,loadPromises:t,animationGroup:o,customEmojiSize:a,middleware:i,lazyLoadQueue:n})}},296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(2341),n=i(467),a=i(632),o=i(2738),r=i(8497),d=i(4081),l=i(319),c=i(2312),h=i(4846),u=i(1243),f=i(7030),p=i(2325),m=i(1507),g=i(2491),v=i(3512),b=i(8448),y=i(3251),w=i(3442),S=i(9492),C=i(5671),L=i(1604),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function I({message:e,withTime:t,fontWeight:i,voiceAsMusic:I,showSender:M,searchContext:P,loadPromises:Z,autoDownloadSize:k,lazyLoadQueue:T,sizeType:x,managers:A=v.Z.managers,cacheContext:_,fontSize:F}){var D;return E(this,void 0,void 0,(function*(){null!=i||(i=500),null!=x||(x=""),null!=F||(F=0);const R=0===k,B=e.media.document||e.media.webpage.document,N=null==e?void 0:e.uploadingFileName;if("audio"===B.type||"voice"===B.type||"round"===B.type){const s=new b.ZP;return s.withTime=t,s.message=e,s.noAutoDownload=R,s.lazyLoadQueue=T,s.loadPromises=Z,I&&(s.voiceAsMusic=I),P&&(s.searchContext=P),M&&(s.showSender=M),s.dataset.fontWeight=""+i,s.dataset.fontSize=""+F,s.dataset.sizeType=x,yield s.render(),s}const O=B.file_name?B.file_name.split("."):"";let U="";U=O.length>1&&Array.isArray(O)?(0,n.ST)(O.pop().split(" ",1)[0].toLowerCase()):"file";const H=document.createElement("div");H.classList.add("document",`ext-${U}`),H.dataset.docId=""+B.id,H.doc=B;const z=document.createElement("div");let j;z.classList.add("document-ico");const G=!!_,V=()=>G?_:A.thumbsStorage.getCacheContext(B);_=yield V();let K=!1;if((null===(D=B.thumbs)||void 0===D?void 0:D.length)||e.pFlags.is_outgoing&&_.url&&"photo"===B.type){H.classList.add("document-with-thumb"),K=!0;const t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(B.type)&&_.url)z.innerHTML=``,t.push(z.firstElementChild);else{performance.now();const e=yield(0,S.Z)({photo:B,message:null,container:z,boxWidth:54,boxHeight:54,loadPromises:Z,withoutPreloader:!0,lazyLoadQueue:T,size:(0,f.Z)(B,54,54,!0),managers:A});z.style.width=z.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 j=document.createElement("span"),j.classList.add("document-ico-text"),j.innerText=U,z.append(j);const W=B.file_name?(0,g.Z)(B.file_name):"Unknown.file";document.createElement("div").classList.add("document-description");const $=document.createElement("span"),q=[(0,d.Z)(B.size)];if(t&&q.push((0,a.OD)(e.date)),M&&q.push(yield(0,C.Z)(e)),!t&&!M){const e=document.createElement("span"),t=(0,d.Z)(B.size);e.append(" / ",t),e.style.visibility="hidden",q.push(e)}H.innerHTML=`\n ${_.downloaded&&!N||!e.mid||!K?"":'
'}\n
\n
\n `;const Q=H.querySelector(".document-name"),Y=new y.I;Y.dataset.fontWeight=""+i,Y.dataset.fontSize=""+F,Y.dataset.sizeType=x,Y.textContent=W,e.mid||H.classList.add("downloaded"),Q.append(Y),M&&Q.append((0,L.Z)(e));const J=H.querySelector(".document-size");if($.append(...(0,p.A1)(q," · ")),J.append($),H.prepend(z),!N&&e.pFlags.is_outgoing&&!e.mid)return H;let X,ee=null;const te=()=>{if(H.classList.remove("downloading"),B.size>m.Iw&&!N)return ee.setManual(),ee.attach(X),ee.preloader.classList.add("manual"),void ee.setDownloadFunction(se);if(B.size<=m.Iw&&H.classList.add("downloaded"),X){if(X!==z){const e=X;setTimeout((()=>{e.remove()}),200)}X=null}ee&&(ee=null)},ie=e=>{H.classList.add("downloading");const t=document.createElement("span"),i=(0,d.Z)(B.size);t.style.position="absolute",t.style.left="0",e.then(te,l.Z).finally((()=>{$.style.visibility="",t.remove()}));const s=e=>(0,d.Z)(e);let n=s(0);$.style.visibility="hidden",t.append(n," / ",i),$.parentElement.append(t),e.addNotifyListener((e=>{const t=s(e.done);n.replaceWith(t),n=t}))},se=e=>{var t;const i=!e||e.isTrusted,n=H.doc;let a;const o=h.Z.chat.bubbles?h.Z.chat.bubbles.lazyLoadQueue.queueId:void 0;if(i)if("pdf"===n.type){const e=!ee||ee.detached;a=c.Z.downloadMediaURL({media:n,queueId:o}),e&&a.then((()=>{setTimeout((()=>E(this,void 0,void 0,(function*(){const e=(yield V()).url;window.open(e)}))),v.Z.settings.animationsEnabled?250:0)}))}else a=s.Z.has(n.mime_type)&&(null===(t=n.thumbs)||void 0===t?void 0:t.length)?c.Z.downloadMediaURL({media:n,queueId:o}):c.Z.downloadToDisc({media:n,queueId:o});else a=c.Z.downloadToDisc({media:n,queueId:o},!0);a.catch((()=>{H.classList.remove("downloading")})),X&&(ee.attach(X,!0,a),ie(a))},{fileName:ne}=(0,u.Z)({media:B,downloadId:"1"});if(yield A.apiFileManager.isDownloading(ne)){X=H.querySelector(".document-download")||z;const e=c.Z.downloadToDisc({media:B},!0);ee=new w.Z,ee.attach(X,!1,e),ee.setDownloadFunction(se),ie(e)}else if(!_.downloaded||N)if(X=H.querySelector(".document-download")||z,ee=new w.Z({isUpload:!!N}),N){const e=c.Z.getUpload(N);ee.attachPromise(e),ee.attach(X),ie(e)}else ee.construct(),ee.setManual(),ee.attach(X),ee.setDownloadFunction(se),void 0!==k&&k>=B.size&&(0,o.tH)(ee.preloader);return(0,o.fc)(H,(e=>{(0,r.Z)(e.target,"time")||(ee?ee.onClick(e):se(e))})),H}))}v.Z.addEventListener("document_downloading",(e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach((e=>{e.querySelector(".preloader-container.manual")&&(0,o.tH)(e)}))}))},8210:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6272);function n(e){return"+"+(0,s.u)(e).formatted}},177:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2575),n=i(2325),a=i(3512);function o(e,t=a.Z.managers){var i,o,r,d,l,c;return r=this,d=void 0,c=function*(){const a=yield t.appChatsManager.getChat(e);if("chatForbidden"===a._)return(0,n.ag)("YouWereKicked");const r=yield t.appProfileManager.getCachedFullChat(e);let d;d=r?"channelFull"===r._?r.participants_count:null===(i=r.participants.participants)||void 0===i?void 0:i.length:a.participants_count||(null===(o=a.participants)||void 0===o?void 0:o.participants.length),d=d||1;const l=a.pFlags.broadcast?"Peer.Status.Subscribers":"Peer.Status.Member";return(0,n.ag)(l,[(0,s.Z)(d)])},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(r,d||[])).next())}))}},493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(8456),n=i(2325),a=i(8115),o=i(3512);function r(e,t=!1,i=!1,r,d=o.Z.managers){return l=this,c=void 0,u=function*(){e||(e=o.Z.myId);let l="";if(e.isUser()){const t=yield d.appUsersManager.getUser(e.toUserId());t.first_name&&(l+=t.first_name),!t.last_name||i&&l||(l+=" "+t.last_name),l=l?l.trim():t.pFlags.deleted?n.ZP.format(i?"Deleted":"HiddenName",!0):t.username}else l=(yield d.appChatsManager.getChat(e.toChatId())).title,i&&(l=l.split(" ")[0]);return void 0!==r&&(l=(0,s.Z)(l,r,r)),t?l:(0,a.Z)(l)},new((h=void 0)||(h=Promise))((function(e,t){function i(e){try{n(u.next(e))}catch(e){t(e)}}function s(e){try{n(u.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof h?n:new h((function(e){e(n)}))).then(i,s)}n((u=u.apply(l,c||[])).next())}));var l,c,h,u}},3061:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(632),n=i(2325),a=i(1507);function o(e){var t;if(!e)return document.createElement("span");let i,o;switch(e.id){case a.hj.toUserId():i="Peer.RepliesNotifications";break;case a.yF.toUserId():i="Peer.ServiceNotifications";break;default:if(e.pFlags.bot){i="Bot";break}if(e.pFlags.support){i="SupportStatus";break}switch(null===(t=e.status)||void 0===t?void 0:t._){case"userStatusRecently":i="Lately";break;case"userStatusLastWeek":i="WithinAWeek";break;case"userStatusLastMonth":i="WithinAMonth";break;case"userStatusOffline":{const t=e.status.was_online,n=new Date,a=(n.getTime()/1e3|0)-t;if(a<60)i="Peer.Status.justNow";else if(a<3600)i="Peer.Status.minAgo",o=[a/60|0];else if(a<86400&&n.getDate()===new Date(1e3*t).getDate())i="LastSeen.HoursAgo",o=[a/3600|0];else{i="Peer.Status.LastSeenAt";const{dateEl:e,timeEl:n}=(0,s.rz)(t);o=[e,n]}break}case"userStatusOnline":i="Online";break;default:i="ALongTimeAgo"}}return(0,n.ag)(i,o)}},5886:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(1655),n=i(632),a=i(2614),o=i(130),r=i(8939),d=i(5180),l=i(2946),c=i(2325),h=i(8115),u=i(2491),f=i(4776),p=i(3512),m=i(493),g=i(3591);function v(e){const t=e.action,{onclick:i,url:s}=(0,g.Z)(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!i)return document.createElement("span");const n=document.createElement("a");return n.href=s,n.setAttribute("onclick",i+"(this)"),n}var b=i(496),y=i(7362),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function S(e,t){return w(this,void 0,void 0,(function*(){const i=yield(0,b.Z)(e,void 0,void 0,t);if(t)return i;const s=document.createElement("i");return s.dataset.savedFrom=e.peerId+"_"+e.mid,s.dir="auto",s.append(i),s}))}function C(e,t){return i=this,g=void 0,C=function*(){try{return yield function(e,t){var i;return w(this,void 0,void 0,(function*(){const g=t?void 0:document.createElement("span"),b="action"in e&&e.action;if(b.message){const e=b.message;return t?(0,u.Z)(e):((0,o.Z)(g,(0,f.ZP)(e,{noLinebreaks:!0})),g)}{let o,u,w=b._;const C=p.Z.managers,L=(e,t)=>t?(0,m.Z)(e,t):(0,y.Z)({peerId:e});switch(b._){case"messageActionPhoneCall":w+="."+b.type,u=[(0,r.Z)(b.duration,t)];break;case"messageActionGroupCall":w+="."+b.type,u=[],w.endsWith("You")||e.pFlags.post||u.push(L(e.fromId,t)),void 0!==b.duration?u.push((0,r.Z)(b.duration,t)):u.push(v(e));break;case"messageActionInviteToGroupCall":{const i=[e.fromId,b.users[0].toPeerId()];let n="Chat.Service.VoiceChatInvitation";const a=p.Z.myId;i[0]===a?n+="ByYou":i[1]===a&&(n+="ForYou"),(0,s.Z)(i,a),o=n,u=i.map((e=>L(e,t))),u.push(v(e));break}case"messageActionGroupCallScheduled":{const i=new Date,s=new Date(1e3*b.schedule_date),a=(s.getTime()-i.getTime())/864e5,r=new Date(i);r.setDate(r.getDate()+1);const d=yield C.appPeersManager.isBroadcast(e.peerId);o=d?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",u=[];const l=p.Z.myId;let h;e.fromId===l?o+="You":d||u.push(L(e.fromId,t));const f=[];a<1&&s.getDate()===i.getDate()?h="TodayAtFormattedWithToday":a<2&&s.getDate()===r.getDate()?h="Time.TomorrowAt":(h="formatDateAtTime",f.push(new c.ZP.IntlDateElement({date:s,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),f.push((0,n.mr)(s));const m=(0,c.ag)(h,f);u.push(m);break}case"messageActionChatCreate":{const i=p.Z.myId;e.fromId===i?w+="You":u=[L(e.fromId,t)];break}case"messageActionPinMessage":{const i=e.peerId,s=yield C.appMessagesManager.getMessageByPeer(i,e.reply_to_mid);u=[L(e.fromId,t)],s?u.push(S(s,t)):(o="ActionPinnedNoText",e.reply_to_mid&&C.appMessagesManager.fetchMessageReplyTo(e));break}case"messageActionChatJoinedByRequest":{const i=yield C.appPeersManager.isBroadcast(e.peerId);e.pFlags.out?o=i?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(o=i?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",u=[L(e.fromId,t)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":u=[L(e.fromId,t)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":u=[],"messageActionChatEditTitle"===b._&&u.push(L(e.fromId,t)),u.push(t?b.title:(0,a.Z)((0,h.Z)(b.title)));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const i=b.users||[b.user_id];if(u=[L(e.fromId,t)],i.length>1){const e=(0,c.v_)(yield Promise.all(i.map((e=>L(e.toPeerId(),t)))),!1,t);if(t)u.push(...e);else{const t=document.createElement("span");t.append(...e),u.push(t)}}else u.push(L(i[0].toPeerId(),t));break}case"messageActionBotAllowed":{const e=(0,f.ZP)(b.domain,{entities:[{_:"messageEntityUrl",length:b.domain.length,offset:0}]});u=[(0,a.Z)(e)];break}case"messageActionPaymentSent":{const s=b.pFlags.recurring_init,n=b.pFlags.recurring_used;if(o=n?"Chat.Service.PaymentSentRecurringUsedNoTitle":s?"Chat.Service.PaymentSentRecurringInitNoTitle":"Chat.Service.PaymentSent1NoTitle",u=[(0,d.Z)(b.total_amount,b.currency),L(e.peerId,t)],e.reply_to_mid){const a=yield C.appMessagesManager.getMessageByPeer((null===(i=e.reply_to)||void 0===i?void 0:i.reply_to_peer_id)?(0,l.Z)(e.reply_to.reply_to_peer_id):e.peerId,e.reply_to_mid);a?(o=n?"Chat.Service.PaymentSentRecurringUsed":s?"Chat.Service.PaymentSentRecurringInit":"Chat.Service.PaymentSent1",u.push(S(a,t).then((e=>(e instanceof HTMLElement&&e.classList.add("is-receipt-link"),e))))):C.appMessagesManager.fetchMessageReplyTo(e)}break}case"messageActionSetMessagesTTL":{u=[];const i=yield C.appPeersManager.isBroadcast(e.peerId);if(b.period){let s;if(i?o="ActionTTLChannelChanged":e.fromId===p.Z.myId?o="ActionTTLYouChanged":(o="ActionTTLChanged",u.push(L(e.fromId,t))),b.period>1814400){let e;const i=[],a=31536e3;b.period>=a?(e="Years",i.push(b.period/a|0)):(e="Months",i.push(b.period/(30*n.s2)|0)),s=t?c.ZP.format(e,!0,i):(0,c.ag)(e,i)}else s=(0,r.Z)(b.period,t);u.push(s)}else i?o="ActionTTLChannelDisabled":e.fromId===p.Z.myId?o="ActionTTLYouDisabled":(o="ActionTTLDisabled",u.push(L(e.fromId,t)));break}default:o=c.Hz[w]||`[${b._}]`}o||(o=c.Hz[w],void 0===o&&(o="["+w+"]"));const E=u&&(yield Promise.all(u));return t?c.ZP.format(o,!0,E):(0,c.$d)(g,o,E)}}))}(e,t)}catch(e){return console.error("wrapMessageActionTextNewUnsafe error:",e),t?"":document.createElement("span")}},new((b=void 0)||(b=Promise))((function(e,t){function s(e){try{a(C.next(e))}catch(e){t(e)}}function n(e){try{a(C.throw(e))}catch(e){t(e)}}function a(t){var i;t.done?e(t.value):(i=t.value,i instanceof b?i:new b((function(e){e(i)}))).then(s,n)}a((C=C.apply(i,g||[])).next())}));var i,g,b,C}},496:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(8938),n=i(5705),a=i(677),o=i(3738),r=i(8456),d=i(5381),l=i(2325),c=i(1346),h=i(8115),u=i(2491),f=i(4776),p=i(3512),m=i(5886);function g(e,t=e.message,i,g,v,b){var y,w,S,C,L,E;return S=this,C=void 0,E=function*(){const S=[];let C=!1;const L=(e,t)=>{if(e){if(void 0===t&&C)return;t=g?l.ZP.format(e,!0):(0,l.ag)(e)}if(g)S.push(t);else{const e=document.createElement("span");"string"==typeof t?e.innerHTML=t:e.append(t),S.push(e)}},E=p.Z.managers.appMessagesManager,I=(0,d.Z)(e);let M=null!==(y=e.totalEntities)&&void 0!==y?y:e.entities;if(e.media&&!I){(0,s.Z)(e);let n=!0;if(e.grouped_id){if(i){const t=yield E.getMidsByMessage(e);if(i.length===t.length){for(const e of t)if(!i.includes(e)){n=!1;break}}else n=!1}if(n){const i=yield E.getAlbumText(e.grouped_id);t=i.message,M=i.totalEntities,b||(L("AttachAlbum"),C=!0)}}else n=!1;if(!n&&!b||!t){const i=e.media;switch(i._){case"messageMediaPhoto":L("AttachPhoto");break;case"messageMediaDice":L(void 0,g?i.emoticon:(0,h.Z)(i.emoticon));break;case"messageMediaVenue":t=i.title,L("AttachLocation");break;case"messageMediaGeo":L("AttachLocation");break;case"messageMediaGeoLive":L("AttachLiveLocation");break;case"messageMediaPoll":const e="📊 "+(i.poll.question||"poll");L(void 0,g?e:(0,h.Z)(e));break;case"messageMediaContact":L("AttachContact");break;case"messageMediaGame":{const e="🎮 "+i.game.title;L(void 0,g?e:(0,h.Z)(e));break}case"messageMediaDocument":{const e=i.document;if("video"===e.type)L("AttachVideo");else if("voice"===e.type)L("AttachAudio");else if("gif"===e.type)L("AttachGif");else if("round"===e.type)L("AttachRound");else if("sticker"===e.type){const i=S.length;if(e.stickerEmojiRaw){const t=e.stickerEmojiRaw+" ";L(void 0,g?t:(0,h.Z)(t))}L("AttachSticker");const s=S.splice(i,2);if(g)S.push(s[0]+s[1]);else{const e=window.document.createElement("span");e.append(...s),S.push(e)}t=""}else if("audio"===e.type){const t=e.attributes.find((e=>"documentAttributeAudio"===e._&&(e.title||e.performer))),i="🎵 "+(t?[t.title,t.performer].filter(Boolean).join(" - "):e.file_name);L(void 0,g?i:(0,h.Z)(i))}else L(void 0,g?e.file_name:(0,h.Z)(e.file_name));break}case"messageMediaInvoice":"messageExtendedMediaPreview"===(null===(w=i.extended_media)||void 0===w?void 0:w._)?L(void 0,g?i.description:(0,h.Z)(i.description)):L(void 0,g?i.title:(0,h.Z)(i.title));break;case"messageMediaUnsupported":L(l.nK)}}const a=S.length;for(let e=1;e{"use strict";i.d(t,{Z:()=>n});var s=i(8842);function n(e){return t=this,i=void 0,a=function*(){const t=new s.Z;return yield t.update(e),t.element},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9492:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(2830),n=i(4755),a=i(3512),o=i(3442),r=i(6705),d=i(8580),l=i(1713),c=i(7030),h=i(2312),u=i(3114),f=i(7660),p=i(319),m=i(1507),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function v({photo:e,message:t,container:i,boxWidth:b,boxHeight:y,withTail:w,isOut:S,lazyLoadQueue:C,middleware:L,size:E,withoutPreloader:I,loadPromises:M,autoDownloadSize:P,noBlur:Z,noThumb:k,noFadeIn:T,blurAfter:x,managers:A=a.Z.managers}){return g(this,void 0,void 0,(function*(){const _={loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null},F="document"===e._,D=(0,u.Z)(e);if(!e.sizes&&!e.thumbs&&!D)return b&&y&&!E&&F&&(0,l.Z)(e,i,b,y,void 0,t),_;let R=0===P;E||(void 0===b&&(b=n.Z.active.regular.width),void 0===y&&(y=n.Z.active.regular.height)),i.classList.add("media-container");let B,N,O=i,U=!0,H=Promise.resolve();const z=F&&"image/gif"===e.mime_type&&!E;if(b&&y&&!E){const s=(0,l.Z)(e,i,b,y,void 0,t,void 0,z?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:m.Pt}:void 0);if(E=s.photoSize,U=s.isFit,N=yield A.thumbsStorage.getCacheContext(e,E.type),!U&&!D){O=document.createElement("div"),O.classList.add("media-container-aspecter"),O.style.width=s.size.width+"px",O.style.height=s.size.height+"px";const n=(0,d.Z)(e,N,!Z,!0);if(n){H=n.loadPromise;const e=n.image;e.classList.add("media-photo"),i.append(e)}else(yield v({container:i,message:t,photo:e,boxWidth:0,boxHeight:0,size:E,lazyLoadQueue:C,isOut:S,loadPromises:M,middleware:L,withoutPreloader:I,withTail:w,autoDownloadSize:P,noBlur:Z,noThumb:!0,blurAfter:!0,managers:A})).images.full.classList.add("media-photo","thumbnail");i.classList.add("media-container-fitted"),i.append(O)}}else E||(E=(0,c.Z)(e,b,y,!0)),N=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);if(!k&&!D){const t=(0,d.Z)(e,N,!Z);t&&(H=Promise.all([H,t.loadPromise]),_.loadPromises.thumb=_.loadPromises.full=H,B=_.images.thumb=t.image,B.classList.add("media-photo"),O.append(B))}if(_.aspecter=O,"photoSizeEmpty"===(null==E?void 0:E._)&&F||(null==E?void 0:E.bytes))return _;let j;"videoSize"===(null==E?void 0:E._)?(j=_.images.full=(0,f.Z)(),j.autoplay=!0,j.loop=!0,j.muted=!0,j.classList.add("media-photo")):(j=_.images.full=new Image,j.classList.add("media-photo"));const G=(B||!N.downloaded)&&a.Z.settings.animationsEnabled&&!T;let V;const K=null==t?void 0:t.uploadingFileName;I||(N.downloaded&&!K||(V=new o.Z({attachMethod:"prepend",isUpload:!!K})),K&&(V.attachPromise(h.Z.getUpload(K)),V.attach(i),R=void 0));const W=e=>(0,s.Z)(i,j,e,G,O,B),$=e=>g(this,void 0,void 0,(function*(){if(!L||L()){if(x){const t=(0,r.Z)(e,12);return t.promise.then((()=>W(t.canvas.toDataURL())))}return W(e)}}));let q;const Q=E.w>=150&&E.h>=150||R,Y=()=>g(this,void 0,void 0,(function*(){R&&!I&&V&&(V.construct(),V.setManual());const t=(()=>{const t=z&&!E;return h.Z.downloadMediaURL({media:e,thumb:E,queueId:null==C?void 0:C.queueId,onlyCache:t?void 0:R})})(),s=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);V&&!s.downloaded&&!I&&Q&&V.attach(i,!1,t),R=void 0;const n=t.then($);return n.catch(p.Z),{download:t,render:n}}));return V&&V.setDownloadFunction(Y),N.downloaded?H=q=(yield Y()).render:C?C.push({div:i,load:()=>Y().then((({download:e})=>e))}):q=(yield Y()).render,M&&H&&M.push(H),yield H,_.loadPromises.thumb=H,_.loadPromises.full=q||Promise.resolve(),_.preloader=V,_}))}},5671:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2291),n=i(2325),a=i(3512),o=i(8842);function r(e){return t=this,i=void 0,d=function*(){const t=document.createElement("span");t.classList.add("sender-title");const i=e.fromId===a.Z.myId&&e.peerId!==a.Z.myId;if(t.append(i?(0,n.ag)("FromYou"):new o.Z(Object.assign(Object.assign({},(0,s.Z)(e)),{dialog:e.peerId===a.Z.myId})).element),(yield a.Z.managers.appPeersManager.isAnyGroup(e.peerId))||i){const i=new o.Z({peerId:e.peerId}).element;t.append(" ➝ ",i)}return t},new((r=void 0)||(r=Promise))((function(e,s){function n(e){try{o(d.next(e))}catch(e){s(e)}}function a(e){try{o(d.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r((function(e){e(i)}))).then(n,a)}o((d=d.apply(t,i||[])).next())}));var t,i,r,d}},1604:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(632);function n(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append((0,s.zM)(new Date(1e3*e.date))),t}},3541:(e,t,i)=>{"use strict";i.d(t,{Vp:()=>F,ZP:()=>B,_2:()=>N,_i:()=>R});var s=i(5269),n=i(3725),a=i(3910),o=i(2738),r=i(7660),d=i(8497),l=i(6740),c=i(1046),h=i(1185),u=i(5471),f=i(9405),p=i(4755),m=i(925),g=i(3174),v=i(6724),b=i(9674),y=i(2312),w=i(4846),S=i(2790),C=i(7030),L=i(13),E=i(1447),I=i(3512),M=i(7730),P=i(671),Z=i(5814),k=i(6787),T=i(2796),x=i(6775),A=i(645),_=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const F=1.49,D={},R={};function B({doc:e,div:t,middleware:i,loadStickerMiddleware:d,lazyLoadQueue:m,exportLoad:v,group:w,play:S,onlyThumb:B,emoji:N,width:O,height:U,withThumb:H,loop:z,loadPromises:j,needFadeIn:G,needUpscale:V,skipRatio:K,static:W,managers:$=I.Z.managers,fullThumb:q,isOut:Q,noPremium:Y,withLock:J,relativeEffect:X,loopEffect:ee,isCustomEmoji:te,syncedVideo:ie}){var se;return _(this,void 0,void 0,(function*(){t=Array.isArray(t)?t:[t],te&&(N=e.stickerEmojiRaw);const ne=e.sticker;if(1===ne&&(W=!0),!O&&!U){const t=p.Z.active,i=N?t.emojiSticker:e.animated?t.animatedSticker:t.staticSticker,s=(0,f.C)(e.w,e.h).aspectFitted(i);O=s.width,U=s.height}let ae;2===ne&&E.Z.loadLottieWorkers(),t.forEach((t=>{t.dataset.docId=""+e.id,N&&(t.dataset.stickerEmoji=N),t.classList.add("media-sticker-wrapper")}));const oe=(t=(null==ae?void 0:ae.type))=>_(this,void 0,void 0,(function*(){return ae=yield $.thumbsStorage.getCacheContext(e,t)})),re=!W&&(2===ne||3===ne),de=(0,L.Z)(e);void 0!==Q&&de&&!Q&&t.forEach((e=>e.classList.add("reflect-x")));const le=de&&J;if(le){const i=D[e.id];t.forEach((e=>{e.classList.add("is-premium-sticker","tgico-premium_lock"),i&&e.style.setProperty("--lock-url",`url(${i})`)}))}if(W&&1!==ne){const t=(0,C.Z)(e,O,U,!1);yield oe(t.type)}else yield oe(null==q?void 0:q.type);const ce=N&&!te?(0,P.tB)(N):-1,he=ae.downloaded&&!G,ue=re,fe=2===ne||3===ne?yield $.appDocsManager.getLottieCachedThumb(e.id,ce):void 0,pe={render:void 0,load:void 0};let me=(0,n.Z)(),ge=!1;if(((null===(se=e.thumbs)||void 0===se?void 0:se.length)||fe)&&!t[0].firstElementChild&&(!he||ue||B)&&!1!==H){let n=fe||e.thumbs[0];const a=(e,t)=>{e.childElementCount?me.resolve():(t.classList.add("media-sticker","thumbnail"),b.Z.mutateElement(e,(()=>{e.append(t),me.resolve()})))};if("url"in n)ge=!0,t.forEach((e=>{const t=new Image;(0,l.ZP)(t,n.url,(()=>a(e,t)))}));else if("bytes"in n){if("photoPathSize"===n._){n.bytes.length||(n=e.thumbs.find((e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length}))||n);const i=function(e){let t="M";for(let i=0,s=e.length;i=192?t+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[s-128-64]:(s>=128?t+=",":s>=64&&(t+="-"),t+=""+(63&s))}return t+="z",t}(n.bytes),s="http://www.w3.org/2000/svg",a=document.createElementNS(s,"svg");a.classList.add("rlottie-vector","media-sticker","thumbnail"),a.setAttributeNS(null,"viewBox",`0 0 ${e.w||512} ${e.h||512}`);const o=document.createElementNS(s,"path");o.setAttributeNS(null,"d",i),I.Z.settings.animationsEnabled&&!te&&o.setAttributeNS(null,"fill","url(#g)"),a.append(o),t.forEach(((e,t)=>e.append(t>0?a.cloneNode(!0):a))),ge=!0,me.resolve()}else if(ce<=0){const o=()=>{t.forEach((t=>{const i=new Image,s=(0,h.Z)(e,n,!0);(0,l.ZP)(i,s,(()=>a(t,i)))}))};s.Z||e.pFlags.stickerThumbConverted||ae.url?(ge=!0,o()):(ge=!0,M.Z.convert("main-"+e.id,n.bytes).then((s=>{$.appDocsManager.saveWebPConvertedStrippedThumb(e.id,s),n.bytes=s,e.pFlags.stickerThumbConverted=!0,i&&!i()||t[0].childElementCount?me.resolve():o()})).catch((()=>me.resolve())))}}else if((2===ne&&ce<=0||3===ne)&&(H||B)){const s=()=>_(this,void 0,void 0,(function*(){if(t[0].childElementCount||i&&!i())return void me.resolve();const s=(e,t,s)=>{e.childElementCount||i&&!i()?me.resolve():s?(0,l.ZP)(t,s,(()=>a(e,t))):a(e,t)};yield oe(),t.forEach((t=>{if(ae.url)s(t,new Image,ae.url);else if("bytes"in n){const i=(0,c.Z)(e,n,!0);i.loadPromise.then((()=>s(t,i.image,"")))}else y.Z.downloadMediaURL({media:e,thumb:n}).then((e=>_(this,void 0,void 0,(function*(){return s(t,new Image,e)}))))}))}));if(m&&B)return m.push({div:t[0],load:s}),me.resolve(),pe;s(),n.url&&(ge=!0)}}if(j&&ge&&j.push(me),B)return pe;const ve=(0,u.Z)("MIDDLEWARE"),be=()=>_(this,void 0,void 0,(function*(){if(i&&!i())throw ve;if(2===ne&&!W)return y.Z.downloadMedia({media:e,queueId:null==m?void 0:m.queueId,thumb:q}).then((s=>_(this,void 0,void 0,(function*(){if(i&&!i())throw ve;const n=yield E.Z.loadAnimationWorker({container:t[0],loop:!(N&&!te)&&z,autoplay:S,animationData:s,width:O,height:U,name:"doc"+e.id,needUpscale:V,skipRatio:K,toneIndex:ce,sync:te},w,null!=d?d:i),a=le?()=>{var i,s;const a=null!==(i=D[s=e.id])&&void 0!==i?i:D[s]=function(e){var t;const i=e.getContext("2d"),s=20*(null!==(t=e.dpr)&&void 0!==t?t:1),n=s,a=s,o=(e.width-n)/2,r=e.height-a-0,d=i.getImageData(o,r,n,a).data;let l=0,c=0,h=0,u=0;for(let e=0;ee.style.setProperty("--lock-url",`url(${a})`)))}:void 0;return n.addEventListener("firstFrame",(()=>{const i=n.canvas[0];(!1!==H||te)&&(0,g.O)(e,i,ce),le&&a(),te||t.forEach(((e,t)=>{((e,t)=>{const i=e.firstElementChild;!1!==G&&(G=(G||!i||"svg"===i.tagName)&&I.Z.settings.animationsEnabled);const s=()=>{i&&i!==t&&"DIV"!==i.tagName&&i.remove()};G?b.Z.mutate((()=>{t&&t.classList.add("fade-in"),i&&i.classList.add("fade-out"),(t||i).addEventListener("animationend",(()=>{b.Z.mutate((()=>{t&&t.classList.remove("fade-in"),s()}))}),{once:!0})})):i&&b.Z.mutate(s)})(e,n.canvas[t])}))}),{once:!0}),N&&$.appStickersManager.preloadAnimatedEmojiStickerAnimation(N),n}))));if(W||3===ne){const s=re&&ie,n=s?A.Z.generateName(""+e.id,0,0,void 0,void 0):void 0,a=R[n];if(a)return a;const o=(s?t.slice(0,1):t).map((()=>{let e;if(W)e=new Image;else{const t=e=(0,r.Z)();if(t.muted=!0,S&&(t.autoplay=!0),z&&(t.loop=!0),z&&"number"==typeof z){let i=0,s=0;function n(){i>this.currentTime&&++s===z&&(this.autoplay=!1,this.loop=!1,this.pause(),t.removeEventListener("timeupdate",n)),i=this.currentTime}t.addEventListener("timeupdate",n)}}return e.classList.add("media-sticker"),e})),c=t.map(((e,t)=>e.firstElementChild!==o[t]&&e.firstElementChild));!1!==G&&(G=(G||!he||(W?c[0]:!c[0]||"svg"===c[0].tagName))&&I.Z.settings.animationsEnabled),G&&o.forEach((e=>e.classList.add("fade-in")));const h=new Promise(((n,a)=>_(this,void 0,void 0,(function*(){const r=()=>_(this,void 0,void 0,(function*(){if(i&&!i())return void a(ve);const r=o.length,d=[];let h;yield oe(),t.forEach(((t,u)=>{const f=o[u];f&&(h=(0,l.cj)(f,ae.url)),h.then((()=>((t,o,l)=>{b.Z.mutateElement(t,(()=>{if(!i||i())if(o){if(o){const t=O*window.devicePixelRatio,i=U*window.devicePixelRatio;if(!(0,g.k)(e,ce,t,i)){const s=document.createElement("canvas");s.width=t,s.height=i,s.getContext("2d").drawImage(o,0,0,s.width,s.height),(0,g.O)(e,s,ce)}}s?n(o):(t.append(o),G?(l&&l.classList.add("fade-out"),o.addEventListener("animationend",(()=>{o.classList.remove("fade-in"),null==l||l.remove()}),{once:!0})):null==l||l.remove(),re&&Z.Z.addAnimation(o,w),d.push(o)===r&&n(d))}else s&&re||null==l||l.remove();else a(ve)}))})(t,f,c[u])))}))}));if(yield oe(),ae.url)r();else{let t;if(1!==ne&&W){const i=(0,C.Z)(e,O,U,!1);t=y.Z.downloadMediaURL({media:e,thumb:i,queueId:null==m?void 0:m.queueId})}else t=y.Z.downloadMediaURL({media:e,queueId:null==m?void 0:m.queueId});t.then(r,a)}}))));return n&&(R[n]=h,d&&h.finally((()=>{d()||delete R[n]}))),h}}));if(v&&(1===v&&(!he||re)||2===v))return pe.load=be,pe;const ye=!m||he&&!re?be():(m.push({div:t[0],load:be}),Promise.resolve());return he&&W&&(me=ye,j&&j.push(me)),2===ne&&de&&void 0!==Q&&!Y&&function({container:e,doc:t,managers:i,middleware:s,isOut:n,width:r,loadPromise:d,relativeEffect:l,loopEffect:c}){i.appStickersManager.preloadSticker(t.id,!0);let h=!1;(0,o.fc)(e,(i=>_(this,void 0,void 0,(function*(){if((0,a.Z)(i),h){const e=document.createElement("a");return e.onclick=()=>{(0,T.PE)(),new k.Z(t.stickerSetInput).show()},void(0,T.bC)({langPackKey:"Sticker.Premium.Click.Info",langPackArguments:[e]})}h=!0,yield d;const{animationDiv:o,stickerPromise:u}=(0,x.Z)({doc:t,middleware:s,side:n?"right":"left",size:r*F,target:e,play:!0,fullThumb:(0,L.Z)(t),relativeEffect:l,loopEffect:c});void 0===n||n||o.classList.add("reflect-x"),u.then((e=>{e.addEventListener("destroy",(()=>{h=!1}))}))}))))}({container:t[0],doc:e,managers:$,middleware:i,isOut:Q,width:O,loadPromise:ye,relativeEffect:X,loopEffect:ee}),pe.render=ye,pe}))}function N({event:e,container:t,managers:i,peerId:s,middleware:n}){var o,r;return _(this,void 0,void 0,(function*(){(0,a.Z)(e);const l=(0,d.Z)(t,"bubble"),c=t.dataset.stickerEmoji,h=t.classList.contains("custom-emoji")?void 0:E.Z.getAnimation(t);if(null==h?void 0:h.paused){const e=yield i.appStickersManager.getAnimatedEmojiSoundDocument(c);if(e){const i=document.createElement("audio");i.style.display="none",t.parentElement.append(i);try{const t=yield y.Z.downloadMediaURL({media:e});i.src=t,i.play(),yield(0,m.Z)(i,void 0,!0),i.addEventListener("ended",(()=>{i.src="",i.remove()}),{once:!0})}catch(e){}}h.autoplay=!0,h.restart()}if(!s.isUser())return;const u=yield i.appStickersManager.getAnimatedEmojiSticker(c,!0);if(!u)return;const f=null!==(o=(r=t).emojiData)&&void 0!==o?o:r.emojiData={a:[],v:1},p=t.sendInteractionThrottled=(0,v.Z)((()=>{if(!f.a.length)return;const e=f.a[0].t;f.a.forEach((t=>{t.t=(t.t-e)/1e3}));const s=(0,d.Z)(t,"bubble");i.appMessagesManager.setTyping(w.Z.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:(0,S.Z)(+s.dataset.mid),emoticon:c,interaction:{_:"dataJSON",data:JSON.stringify(f)}},!0),f.a.length=0}),1e3,!1),g=l?l.classList.contains("is-out"):void 0,{animationDiv:b}=(0,x.Z)({doc:u,middleware:n,side:g?"right":"left",size:360,target:t,play:!0,withRandomOffset:!0});void 0===g||g||b.classList.add("reflect-x"),e.isTrusted&&(f.a.push({i:1,t:Date.now()}),p())}))}},6775:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u});var s=i(2131),n=i(8938),a=i(8487),o=i(5471),r=i(3624),d=i(9966),l=i(241),c=i(4846),h=i(3541);function u({size:e,doc:t,middleware:i,target:u,side:f,skipRatio:p,play:m,managers:g,fullThumb:v,withRandomOffset:b,relativeEffect:y,loopEffect:w}){var S;const C=document.createElement("div");let L;C.classList.add("emoji-animation"),C.style.width=e+"px",C.style.height=e+"px";const E=()=>{I.clean(),null==L||L.remove(),C.remove(),c.Z.chat.bubbles.scrollable.container.removeEventListener("scroll",x)},I=null!==(S=null==i?void 0:i.create())&&void 0!==S?S:(0,r.k)();i=I.get();const M=(0,h.ZP)({div:C,doc:t,middleware:i,withThumb:!1,needFadeIn:!1,loop:!!w,width:e,height:e,play:m,group:"none",skipRatio:p,managers:g,fullThumb:v}).then((({render:e})=>e)).then((e=>{if((0,n.Z)(e),!i())throw e.remove(),(0,o.Z)("MIDDLEWARE");return L=e,L.addEventListener("enterFrame",(e=>{(w||e!==L.maxFrame)&&(0,a.Z)(u)||E()})),s.Z&&L.addEventListener("firstFrame",(()=>{navigator.vibrate(100)}),{once:!0}),L})),P=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},Z=b?P(16):0,k=b?P(4):0,T=()=>{if(!(0,a.Z)(u))return void E();const t=u.getBoundingClientRect(),i=t.width/200,s="center"===f?0:16*("right"===f?1:-1)*i,n="center"===f?0:0*i,o="right"===f?t.right:t.left,r=t.top,d=("center"===f?(t.width-e)/2:"right"===f?-e:0)+s+Z,c=(t.height-e)/2+n+k,h=o+d,p=r+c;p<=-e||p>=l.Z.height?E():y?("center"!==f?C.style[f]=-1*Math.abs(s)+"px":C.style.left=d+"px",C.style.top=c+"px"):(C.style.top=p+"px",C.style.left=h+"px")},x=(0,d.Z)(T);return c.Z.chat.bubbles.scrollable.container.addEventListener("scroll",x),T(),y?(C.classList.add("is-relative"),u.parentElement.append(C)):c.Z.emojiAnimationContainer.append(C),{animationDiv:C,stickerPromise:M}}},5772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(3541);function a({emoji:e,div:t,width:i,height:a,managers:o=s.Z.managers}){return r=this,d=void 0,c=function*(){const s=yield o.appStickersManager.getAnimatedEmojiSticker(e);if(!s)throw t.classList.add("media-sticker-wrapper"),new Error("no sticker");return(0,n.ZP)({doc:s,div:t,emoji:e,width:i,height:a,loop:!1,play:!0})},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(r,d||[])).next())}));var r,d,l,c}},1273:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(7660),n=i(6740),a=i(2312),o=i(1447),r=i(3512),d=i(5814),l=i(3541),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({set:e,lazyLoadQueue:t,container:i,group:h,autoplay:u,width:f,height:p,managers:m=r.Z.managers}){var g;return c(this,void 0,void 0,(function*(){if(null===(g=e.thumbs)||void 0===g?void 0:g.length)return i.classList.add("media-sticker-wrapper"),void t.push({div:i,load:()=>c(this,void 0,void 0,(function*(){const t=yield m.appStickersManager.getStickerSetThumbDownloadOptions(e),r=a.Z.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return r.then((t=>{o.Z.loadAnimationWorker({container:i,loop:!0,autoplay:u,animationData:t,width:f,height:p,needUpscale:!0,name:"setThumb"+e.id},h)}));{let t;return e.pFlags.videos?(t=(0,s.Z)(),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),r.then((s=>{(0,n.ZP)(t,URL.createObjectURL(s),(()=>{i.append(t),e.pFlags.videos&&d.Z.addAnimation(t,h)}))}))}}))});let r;r=e.thumb_document_id?m.appEmojiManager.getCustomEmojiDocument(e.thumb_document_id):m.appStickersManager.getStickerSet(e).then((e=>e.documents[0]));const v=yield r;"documentEmpty"!==v._&&(0,l.ZP)({doc:v,div:i,group:h,lazyLoadQueue:t,managers:m,width:f,height:p})}))}},62:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3541);function n({doc:e,row:t,size:i,managers:n}){const a=t.media,o=t.createMedia("small");a&&o.classList.add("hide");const r=a?[]:void 0,d="small"===i?32:48,l=(0,s.ZP)({div:o,doc:e,width:d,height:d,loadPromises:r,managers:n}).then((({render:e})=>e));return r&&Promise.all(r).then((()=>{o.classList.remove("hide"),a.remove()})),l}},2887:(e,t,i)=>{"use strict";i.d(t,{Z:()=>x});var s=i(4762),n=i(5296),a=i(3725),o=i(3910),r=i(2738),d=i(7660),l=i(8487),c=i(6740),h=i(8580),u=i(5471),f=i(4755),p=i(319),m=i(925),g=i(3035),v=i(6724),b=i(9674),y=i(5157),w=i(2312),S=i(4846),C=i(1507),L=i(3512),E=i(5814),I=i(3013),M=i(8448),P=i(3442),Z=i(9492),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let T=0;function x({doc:e,container:t,message:i,boxWidth:x,boxHeight:A,withTail:_,isOut:F,middleware:D,lazyLoadQueue:R,noInfo:B,group:N,onlyPreview:O,noPreview:U,withoutPreloader:H,loadPromises:z,noPlayButton:j,photoSize:G,videoSize:V,searchContext:K,autoDownload:W,managers:$=L.Z.managers}){var q;return k(this,void 0,void 0,(function*(){const Q=null==W?void 0:W.video;let Y=0===Q;const J=!(x&&A),X=("video"!==e.type||e.size<=52428800&&!J)&&("gif"===e.type?L.Z.settings.autoPlay.gifs:L.Z.settings.autoPlay.videos);let ee,te;if(!B){ee=document.createElement("span"),ee.classList.add("video-time"),t.append(ee);let i=!1;"gif"!==e.type?(ee.innerText=(0,y.Z)(e.duration,!1),j||"round"===e.type||(X&&!Y?ee.classList.add("tgico","can-autoplay"):i=!0)):(ee.innerText="GIF",X||j||(i=!0,Y=void 0)),i&&(te=document.createElement("span"),te.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(te))}const ie={};if("image/gif"===e.mime_type){const s=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:H,loadPromises:z,autoDownloadSize:Q,size:G,managers:$});return ie.thumb=s,ie.loadPromise=s.loadPromises.full,ie}let se;const ne=(0,d.Z)();if(ne.classList.add("media-video"),ne.muted=!0,"round"===e.type){const s=document.createElement("div");s.classList.add("media-round","z-depth-1"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,s.message=i;const a=f.Z.active.round,d=a.width/2,c=3.5,h=d-2*c;s.innerHTML=`\n \n `;const u=s.firstElementChild.firstElementChild;T||(T=2*Math.PI*h),u.style.strokeDasharray=T+" "+T,u.style.strokeDashoffset=""+T,ee.classList.add("tgico"),i.pFlags.media_unread&&s.classList.add("is-unread");const p=document.createElement("canvas");p.width=p.height=e.w,s.prepend(p,ee),s.append(ne),t.append(s);const m=p.getContext("2d"),b=()=>{const e=s.message,t=I.Z.addMedia(e,!Y),i=()=>{(S.Z.chat.setPeerPromise||Promise.resolve()).finally((()=>{(0,l.Z)(t)||(t.removeEventListener("play",h),t.removeEventListener("timeupdate",c),t.removeEventListener("pause",f),t.removeEventListener("ended",b))}))},a=()=>{m.drawImage(t,0,0);const e=T-t.currentTime/t.duration*T;return u.style.strokeDashoffset=""+e,!t.paused},d=()=>{t.duration&&((0,l.Z)(t)?(t.paused&&a(),ee.innerText=(0,y.Z)(t.duration-t.currentTime,!1)):i())},c=(0,v.Z)((()=>{(0,g.T2)(d)}),1e3,!1),h=()=>{ne.classList.add("hide"),s.classList.remove("is-paused"),(0,n.cK)(a,p),se&&se.preloader&&se.preloader.classList.contains("manual")&&se.onClick()},f=()=>{(0,l.Z)(t)?s.classList.add("is-paused"):i()},b=()=>{ne.classList.remove("hide"),s.classList.add("is-paused"),ne.currentTime=0,ee.innerText=(0,y.Z)(t.duration,!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",h),t.addEventListener("timeupdate",c),t.addEventListener("pause",f),t.addEventListener("ended",b),(0,r.fc)(p,(i=>{if((0,o.Z)(i),se&&!se.detached&&se.onClick(),t.paused){const i=!!K;if(I.Z.setSearchContext(K||{peerId:C.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=i?(0,M.ns)(s,e.mid):[];I.Z.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()})),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(a(),d(),ne.classList.add("hide")):f():h()};i.pFlags.is_outgoing?(s.onLoad=b,s.dataset.isOutgoing="1"):b()}else ne.autoplay=!0;let ae,oe;if(i){if(ae=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:!0,loadPromises:z,autoDownloadSize:null==W?void 0:W.photo,size:G,managers:$}),ie.thumb=ae,!X&&"gif"!==e.type||O)return ie.loadPromise=ae.loadPromises.full,ie;if(_){const e=(ae.images.thumb||ae.images.full).parentElement;ne.width=+e.getAttributeNS(null,"width"),ne.height=+e.getAttributeNS(null,"height"),e.append(ne)}}else if(!U){const i=(0,h.Z)(e,{},!0);if(i){const e=i.image;e.classList.add("media-poster"),t.append(e),ie.thumb={loadPromises:{thumb:i.loadPromise,full:Promise.resolve()},images:{thumb:e,full:null},preloader:null,aspecter:null},null==z||z.push(i.loadPromise),ie.loadPromise=i.loadPromise}}if(O)return ie;!ne.parentElement&&t&&((null==ae?void 0:ae.aspecter)||t).append(ne);const re=()=>k(this,void 0,void 0,(function*(){return oe=yield $.thumbsStorage.getCacheContext(e,null==V?void 0:V.type)}));yield re();const de=null==i?void 0:i.uploadingFileName;de?(se=new P.Z({attachMethod:"prepend",isUpload:!0}),se.attachPromise(w.Z.getUpload(de)),se.attach(t,!1),Y=void 0):oe.downloaded||e.supportsStreaming||H?e.supportsStreaming&&(se=new P.Z({cancelable:!1,attachMethod:"prepend"})):se=new P.Z({attachMethod:"prepend"});const le=(0,a.Z)();if(ne.addEventListener("error",(e=>{4!==ne.error.code&&console.error("Error "+ne.error.code+"; details: "+ne.error.message),se&&!de&&se.detach(),le.isFulfilled||le.resolve()}),{once:!0}),"video"===e.type){const e=()=>{ne.duration&&(ee.innerText=(0,y.Z)(ne.duration-ne.currentTime,!1))},t=(0,v.Z)((()=>{(0,g.T2)(e)}),1e3,!1);ne.addEventListener("timeupdate",t),te&&ne.addEventListener("timeupdate",(()=>{b.Z.mutateElement(te,(()=>{te.remove()}))}),{once:!0})}ne.muted=!0,ne.loop=!0,ne.autoplay=!0;let ce=Y&&(null===(q=null==ae?void 0:ae.preloader)||void 0===q?void 0:q.loadFunc);const he=()=>k(this,void 0,void 0,(function*(){se&&Y&&!H&&(se.construct(),se.setManual()),yield re();let n=Promise.resolve();if(se&&!de||H)if(oe.downloaded||e.supportsStreaming)e.supportsStreaming&&(Y?n=Promise.reject((0,u.Z)("NO_AUTO_DOWNLOAD")):!oe.downloaded&&se&&(se.attach(t,!1,null),ne.addEventListener(s.IS_SAFARI?"timeupdate":"canplay",(()=>{se.detach()}),{once:!0})));else{const i=n=w.Z.downloadMediaURL({media:e,queueId:null==R?void 0:R.queueId,onlyCache:Y,thumb:V});se&&se.attach(t,!1,i)}return!Y&&ce&&(ce(),ce=null),Y=void 0,n.then((()=>k(this,void 0,void 0,(function*(){!D||D()?("round"===e.type&&I.Z.resolveWaitingForLoadMedia(i.peerId,i.mid,i.pFlags.is_scheduled),yield re(),(0,m.Z)(ne).then((()=>{N&&E.Z.addAnimation(ne,N),se&&!de&&se.detach(),le.resolve()}),(e=>{console.error("video load error",e),le.reject(e)})),(0,c.ZP)(ne,oe.url)):le.resolve()}))),p.Z),{download:n,render:Promise.all([n,le])}}));return se&&!de&&se.setDownloadFunction(he),"gif"!==e.type||X?ie.loadPromise=R?(R.push({div:t,load:()=>he().then((({render:e})=>e))}),Promise.resolve()):(yield he()).render:(0,r.fc)(t,(e=>{(0,o.Z)(e),te.remove(),he()}),{capture:!0,once:!0}),ie.thumb&&(yield ie.thumb.loadPromises.thumb),ie}))}f.Z.addEventListener("changeScreen",((e,t)=>{if(t===f._.mobile||e===f._.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=f.Z.active.round.width,i=t/2,s=i-7;T=2*Math.PI*s,e.forEach((e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+i),n.setAttributeNS(null,"cy",""+i),n.setAttributeNS(null,"r",""+s),n.style.strokeDasharray=T+" "+T,n.style.strokeDashoffset=""+T}))}}))},2498:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(4776);function a(e){const t=(0,s.Z)(e.description||"",150,180);return(0,n.ZP)(t)}},1336:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(4776);function a(e){let t=e.title||e.author||e.site_name||"";return t=(0,s.Z)(t,80,100),(0,n.ZP)(t,{noLinks:!0,noLinebreaks:!0})}},7445:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s={AED:{code:"AED",title:"United Arab Emirates Dirham",symbol:"AED",native:"د.إ.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"367",max_amount:"3673030"},AFN:{code:"AFN",title:"Afghan Afghani",symbol:"AFN",native:"؋",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8729",max_amount:"87299487"},ALL:{code:"ALL",title:"Albanian Lek",symbol:"ALL",native:"Lek",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"11842",max_amount:"118421187"},AMD:{code:"AMD",title:"Armenian Dram",symbol:"AMD",native:"դր.",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"40943",max_amount:"409436718"},ARS:{code:"ARS",title:"Argentine Peso",symbol:"ARS",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"14705",max_amount:"147059002"},AUD:{code:"AUD",title:"Australian Dollar",symbol:"AU$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"153",max_amount:"1536825"},AZN:{code:"AZN",title:"Azerbaijani Manat",symbol:"AZN",native:"ман.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"169",max_amount:"1699858"},BAM:{code:"BAM",title:"Bosnia & Herzegovina Convertible Mark",symbol:"BAM",native:"KM",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1990677"},BDT:{code:"BDT",title:"Bangladeshi Taka",symbol:"BDT",native:"৳",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"10009",max_amount:"100094046"},BGN:{code:"BGN",title:"Bulgarian Lev",symbol:"BGN",native:"лв.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1993315"},BND:{code:"BND",title:"Brunei Dollar",symbol:"BND",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"142",max_amount:"1421883"},BOB:{code:"BOB",title:"Bolivian Boliviano",symbol:"BOB",native:"Bs",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"683",max_amount:"6832607"},BRL:{code:"BRL",title:"Brazilian Real",symbol:"R$",native:"R$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"539",max_amount:"5397799"},BYN:{code:"BYN",title:"Belarusian ruble",symbol:"BYN",native:"BYN",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"249",max_amount:"2495801"},CAD:{code:"CAD",title:"Canadian Dollar",symbol:"CA$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"136",max_amount:"1366860"},CHF:{code:"CHF",title:"Swiss Franc",symbol:"CHF",native:"CHF",thousands_sep:"'",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"97",max_amount:"976705"},CLP:{code:"CLP",title:"Chilean Peso",symbol:"CLP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"963",max_amount:"9637495"},CNY:{code:"CNY",title:"Chinese Renminbi Yuan",symbol:"CN¥",native:"CN¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"709",max_amount:"7094102"},COP:{code:"COP",title:"Colombian Peso",symbol:"COP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"452870",max_amount:"4528700000"},CRC:{code:"CRC",title:"Costa Rican Colón",symbol:"CRC",native:"₡",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"62506",max_amount:"625061070"},CZK:{code:"CZK",title:"Czech Koruna",symbol:"CZK",native:"Kč",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"2497",max_amount:"24975029"},DKK:{code:"DKK",title:"Danish Krone",symbol:"DKK",native:"kr",thousands_sep:"",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"755",max_amount:"7555990"},DOP:{code:"DOP",title:"Dominican Peso",symbol:"DOP",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5275",max_amount:"52757308"},DZD:{code:"DZD",title:"Algerian Dinar",symbol:"DZD",native:"د.ج.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"14035",max_amount:"140353307"},EGP:{code:"EGP",title:"Egyptian Pound",symbol:"EGP",native:"ج.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1953",max_amount:"19537405"},ETB:{code:"ETB",title:"Ethiopian Birr",symbol:"ETB",native:"ብር",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5224",max_amount:"52247069"},EUR:{code:"EUR",title:"Euro",symbol:"€",native:"€",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"101",max_amount:"1016045"},GBP:{code:"GBP",title:"British Pound",symbol:"£",native:"£",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"89",max_amount:"894445"},GEL:{code:"GEL",title:"Georgian Lari",symbol:"GEL",native:"GEL",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"283",max_amount:"2830234"},GTQ:{code:"GTQ",title:"Guatemalan Quetzal",symbol:"GTQ",native:"Q",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"778",max_amount:"7781323"},HKD:{code:"HKD",title:"Hong Kong Dollar",symbol:"HK$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"784",max_amount:"7849750"},HNL:{code:"HNL",title:"Honduran Lempira",symbol:"HNL",native:"L",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"2441",max_amount:"24413729"},HRK:{code:"HRK",title:"Croatian Kuna",symbol:"HRK",native:"kn",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"764",max_amount:"7648805"},HUF:{code:"HUF",title:"Hungarian Forint",symbol:"HUF",native:"Ft",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"42685",max_amount:"426850229"},IDR:{code:"IDR",title:"Indonesian Rupiah",symbol:"IDR",native:"Rp",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"1523370",max_amount:"15233700000"},ILS:{code:"ILS",title:"Israeli New Sheqel",symbol:"₪",native:"₪",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"354",max_amount:"3543350"},INR:{code:"INR",title:"Indian Rupee",symbol:"₹",native:"₹",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8155",max_amount:"81555550"},ISK:{code:"ISK",title:"Icelandic Króna",symbol:"ISK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"142",max_amount:"1425603"},JMD:{code:"JMD",title:"Jamaican Dollar",symbol:"JMD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"15013",max_amount:"150131044"},JPY:{code:"JPY",title:"Japanese Yen",symbol:"¥",native:"¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"144",max_amount:"1443065"},KES:{code:"KES",title:"Kenyan Shilling",symbol:"KES",native:"Ksh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12075",max_amount:"120750271"},KGS:{code:"KGS",title:"Kyrgyzstani Som",symbol:"KGS",native:"KGS",thousands_sep:" ",decimal_sep:"-",symbol_left:!1,space_between:!0,exp:2,min_amount:"8018",max_amount:"80182898"},KRW:{code:"KRW",title:"South Korean Won",symbol:"₩",native:"₩",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"1431",max_amount:"14315201"},KZT:{code:"KZT",title:"Kazakhstani Tenge",symbol:"KZT",native:"₸",thousands_sep:" ",decimal_sep:"-",symbol_left:!0,space_between:!1,exp:2,min_amount:"47186",max_amount:"471867112"},LBP:{code:"LBP",title:"Lebanese Pound",symbol:"LBP",native:"ل.ل.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"150999",max_amount:"1509998778"},LKR:{code:"LKR",title:"Sri Lankan Rupee",symbol:"LKR",native:"රු.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"35546",max_amount:"355469651"},MAD:{code:"MAD",title:"Moroccan Dirham",symbol:"MAD",native:"د.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1093",max_amount:"10938136"},MDL:{code:"MDL",title:"Moldovan Leu",symbol:"MDL",native:"MDL",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1926",max_amount:"19264439"},MNT:{code:"MNT",title:"Mongolian Tögrög",symbol:"MNT",native:"MNT",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"322444",max_amount:"3224442056"},MUR:{code:"MUR",title:"Mauritian Rupee",symbol:"MUR",native:"MUR",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"4453",max_amount:"44535174"},MVR:{code:"MVR",title:"Maldivian Rufiyaa",symbol:"MVR",native:"MVR",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1546",max_amount:"15460397"},MXN:{code:"MXN",title:"Mexican Peso",symbol:"MX$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"2012",max_amount:"20122860"},MYR:{code:"MYR",title:"Malaysian Ringgit",symbol:"MYR",native:"RM",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"463",max_amount:"4632502"},MZN:{code:"MZN",title:"Mozambican Metical",symbol:"MZN",native:"MTn",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"6382",max_amount:"63829729"},NGN:{code:"NGN",title:"Nigerian Naira",symbol:"NGN",native:"₦",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"43203",max_amount:"432039828"},NIO:{code:"NIO",title:"Nicaraguan Córdoba",symbol:"NIO",native:"C$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"3556",max_amount:"35566412"},NOK:{code:"NOK",title:"Norwegian Krone",symbol:"NOK",native:"kr",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"1069",max_amount:"10690975"},NPR:{code:"NPR",title:"Nepalese Rupee",symbol:"NPR",native:"नेरू",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12954",max_amount:"129546657"},NZD:{code:"NZD",title:"New Zealand Dollar",symbol:"NZ$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"174",max_amount:"1746220"},PAB:{code:"PAB",title:"Panamanian Balboa",symbol:"PAB",native:"B/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"98",max_amount:"988722"},PEN:{code:"PEN",title:"Peruvian Nuevo Sol",symbol:"PEN",native:"S/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"390",max_amount:"3902208"},PHP:{code:"PHP",title:"Philippine Peso",symbol:"PHP",native:"₱",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5862",max_amount:"58627496"},PKR:{code:"PKR",title:"Pakistani Rupee",symbol:"PKR",native:"₨",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"22642",max_amount:"226426805"},PLN:{code:"PLN",title:"Polish Złoty",symbol:"PLN",native:"zł",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"493",max_amount:"4932350"},PYG:{code:"PYG",title:"Paraguayan Guaraní",symbol:"PYG",native:"₲",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"6977",max_amount:"69772317"},QAR:{code:"QAR",title:"Qatari Riyal",symbol:"QAR",native:"ر.ق.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"364",max_amount:"3640989"},RON:{code:"RON",title:"Romanian Leu",symbol:"RON",native:"RON",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"502",max_amount:"5028645"},RSD:{code:"RSD",title:"Serbian Dinar",symbol:"RSD",native:"дин.",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"11918",max_amount:"119184990"},RUB:{code:"RUB",title:"Russian Ruble",symbol:"RUB",native:"₽",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"7128",max_amount:"71281218"},SAR:{code:"SAR",title:"Saudi Riyal",symbol:"SAR",native:"ر.س.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"375",max_amount:"3756546"},SEK:{code:"SEK",title:"Swedish Krona",symbol:"SEK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1109",max_amount:"11094972"},SGD:{code:"SGD",title:"Singapore Dollar",symbol:"SGD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"143",max_amount:"1430495"},THB:{code:"THB",title:"Thai Baht",symbol:"฿",native:"฿",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3780",max_amount:"37800497"},TJS:{code:"TJS",title:"Tajikistani Somoni",symbol:"TJS",native:"TJS",thousands_sep:" ",decimal_sep:";",symbol_left:!1,space_between:!0,exp:2,min_amount:"975",max_amount:"9753854"},TRY:{code:"TRY",title:"Turkish Lira",symbol:"TRY",native:"TL",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1854",max_amount:"18543598"},TTD:{code:"TTD",title:"Trinidad and Tobago Dollar",symbol:"TTD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"672",max_amount:"6722681"},TWD:{code:"TWD",title:"New Taiwan Dollar",symbol:"NT$",native:"NT$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3173",max_amount:"31738502"},TZS:{code:"TZS",title:"Tanzanian Shilling",symbol:"TZS",native:"TSh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"233199",max_amount:"2331999890"},UAH:{code:"UAH",title:"Ukrainian Hryvnia",symbol:"UAH",native:"₴",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"3633",max_amount:"36338830"},UGX:{code:"UGX",title:"Ugandan Shilling",symbol:"UGX",native:"USh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"3816",max_amount:"38166726"},USD:{code:"USD",title:"United States Dollar",symbol:"$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"100",max_amount:1e6},UYU:{code:"UYU",title:"Uruguayan Peso",symbol:"UYU",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"4080",max_amount:"40801205"},UZS:{code:"UZS",title:"Uzbekistani Som",symbol:"UZS",native:"UZS",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1089058",max_amount:"10890583014"},VND:{code:"VND",title:"Vietnamese Đồng",symbol:"₫",native:"₫",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"23862",max_amount:"238625000"},YER:{code:"YER",title:"Yemeni Rial",symbol:"YER",native:"ر.ي.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"25030",max_amount:"250300677"},ZAR:{code:"ZAR",title:"South African Rand",symbol:"ZAR",native:"R",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1789",max_amount:"17894299"}}},3447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a,i:()=>s});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const a=n},3189:(e,t,i)=>{"use strict";i.d(t,{Bf:()=>n,U9:()=>a,bt:()=>s});const s='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif',n="16px",a="400"},356:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="undefined"!=typeof ImageBitmap},5296:(e,t,i)=>{"use strict";i.d(t,{Kx:()=>r,cK:()=>d,jt:()=>l});var s=i(3035),n=i(3725);const a=new Map;function o(e){return a.get(e)}function r(e){const t=o(e);t&&(t.isCancelled=!0,t.deferred.resolve())}function d(e,t,i){return i||(i=function(e){r(e);const t={isCancelled:!1,deferred:(0,n.Z)()};return a.set(e,t),t.deferred.then((()=>{o(e)===t&&a.delete(e)})),t}(t)),(0,s.T2)((()=>{i.isCancelled||(e()?d(e,t,i):i.deferred.resolve())})),i.deferred}function l(e){(0,s.T2)((()=>{e()&&l(e)}))}},2353:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function n(e,t){return s(this,void 0,void 0,(function*(){const i=e.map(((e,i,n)=>s(this,void 0,void 0,(function*(){if(yield t(e,i,n))return e}))));return(yield Promise.all(i)).filter(Boolean)}))}},8847:(e,t,i)=>{"use strict";function s(e,t){const i=[];let s=-1;for(;-1!==(s=e.findIndex(t));)i.push(e.splice(s,1)[0]);return i}i.d(t,{Z:()=>s})},5916:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId,this.assetName=e;try{const i=this.createAudio();i.autoplay=!0,i.src="assets/audio/"+e,i.loop=t,i.play()}catch(t){console.error("playSound",e,t)}}playSoundIfDifferent(e,t){this.assetName!==e&&this.playSound(e,t)}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){this.audio&&this.audio.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,i){const s=++this.tempId;setTimeout((()=>{this.tempId===s&&this.playSound(e,t)}),i)}}},8678:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3019);function n(e){return(0,s.Z)(e,"readAsDataURL")}},6705:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(3725),n=i(8594),a=i(3035);const o=[];let r=!1;function d(e,t="push"){if(!e.items.length)return Promise.resolve([]);const i=e.promise=(0,s.Z)();return o[t](e),l(),i}function l(){r||function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),i=[];return new Promise(((s,o)=>{const r=()=>{return d=this,l=void 0,h=function*(){const d=performance.now();do{yield(0,n.e9)();const s=e.process.apply(e.context,t.shift());let a;if(s instanceof Promise)try{a=yield s}catch(e){return void o(e)}else a=s;i.push(a)}while(t.length>0&&performance.now()-d<6);t.length>0?(0,a.T2)(r):s(i)},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(d,l||[])).next())}));var d,l,c,h};(0,a.T2)(r)})).then(e.promise.resolve,e.promise.reject)}(o.shift()).finally((()=>{r=!1,o.length&&l()}))}var c=i(6663);let h,u;function f(e,t,i,s=document.createElement("canvas")){s.width=e.width,s.height=e.height;const n=s.getContext("2d",{alpha:!1});return c.Z?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,s.width+4*t,s.height+4*t)):(n.drawImage(e,0,0),u(n,0,0,s.width,s.height,t,i)),s}h=c.Z?Promise.resolve():i.e(77).then(i.bind(i,7077)).then((e=>{u=e.default}));const p=new Map;function m(e,t=2,i=2){if(!e)throw"no dataUri for blur: "+e;p.size>150&&p.clear();const s=document.createElement("canvas");s.className="canvas-thumbnail";let n=p.get(e);if(n)s.width=n.canvas.width,s.height=n.canvas.height,n.promise.then((()=>{s.getContext("2d").drawImage(n.canvas,0,0,s.width,s.height)}));else{const a=new Promise((n=>{h.then((()=>{const a=new Image;a.onload=()=>{d({items:[[a,t,i,s]],context:null,process:f},"unshift").then((()=>{n()}))},a.src=e}))}));p.set(e,n={canvas:s,promise:a})}return Object.assign(Object.assign({},n),{canvas:s})}},4059:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(4762),n=i(3306);const a=(0,n.Z)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),o=(0,n.Z)("ffd9");function r(e,t=!1){let i,n;return t?i=e instanceof Uint8Array?e:new Uint8Array(e):(i=new Uint8Array(a.concat(Array.from(e.slice(3)),o)),i[164]=e[1],i[166]=e[2]),n=t?s.IS_SAFARI?"image/png":"image/webp":"image/jpeg",function(e,t="image/jpeg"){return`data:${t};base64,${btoa(String.fromCharCode(...e))}`}(i,n)}},9897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(410),n=i(9405);function a(e,t,i,s,a=!0){if(ei/s?r=t*i/e|0:(o=e*s/t|0,o>i&&(r=r*i/o|0,o=i)),a&&o>=e&&r>=t&&(o=e,r=t),(0,n.C)(o,r)}s.GO.calcImageInBox=a},8097:(e,t,i)=>{"use strict";let s;function n(e,t){if(!s){const e=document.createElement("canvas");s=e.getContext("2d",{alpha:!1})}return s.font!==t&&(s.font=t),s.measureText(e).width}i.d(t,{Z:()=>n})},7814:(e,t,i)=>{"use strict";function s(e){return new Promise((t=>{var i,s,n;const a=document.createElement("canvas"),o=null!==(i=e.size)&&void 0!==i?i:e.mediaSize.aspectFitted(e.boxSize);a.width=o.width*window.devicePixelRatio,a.height=o.height*window.devicePixelRatio,a.getContext("2d").drawImage(e.media,0,0,a.width,a.height),a.toBlob((e=>{t({blob:e,size:o})}),null!==(s=e.mimeType)&&void 0!==s?s:"image/jpeg",null!==(n=e.quality)&&void 0!==n?n:1)}))}i.d(t,{Z:()=>s})},467:(e,t,i)=>{"use strict";i.d(t,{ST:()=>r,ZP:()=>d,gV:()=>l});var s=i(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,a=/^\s+|\s$/g,o={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function r(e){return e.replace(n,"").replace(a,"")}function d(e,t=!0){return l(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function l(e,t={}){const i=t.includeTag&&"%"===e.charAt(0),n=e;return t.clearBadChars&&(e=r(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),i&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=o[e];return null!=t?t:e}))}(n)),e}},2166:(e,t,i)=>{"use strict";function s(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)}i.d(t,{T:()=>s})},3416:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(4755),a=i(2296);class o extends a.Z{constructor(){super("menu",!0),this.onMouseMove=e=>{const t=this.element.getBoundingClientRect(),{clientX:i,clientY:s}=e,n=i>=t.right?i-t.right:t.left-i,a=s>=t.bottom?s-t.bottom:t.top-s;(n>=100||a>=100)&&this.close()},n.Z.addEventListener("resize",(()=>{this.element&&this.close()}))}isOpened(){return!!this.element}close(){this.element&&(this.element.classList.remove("active"),this.element.parentElement.classList.remove("menu-open")),super.close(),s.Z||window.removeEventListener("mousemove",this.onMouseMove)}openBtnMenu(e,t){super.open(e),this.element.classList.add("active"),this.element.parentElement.classList.add("menu-open"),t&&this.addEventListener("toggle",t,{once:!0}),s.Z||window.addEventListener("mousemove",this.onMouseMove)}}const r=new o},632:(e,t,i)=>{"use strict";i.d(t,{OD:()=>h,fl:()=>S,mr:()=>u,rz:()=>c,s2:()=>r,xE:()=>f,zM:()=>l});var s=i(410),n=i(2325);const a=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],r=86400,d=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),i=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-i);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/r+1)/7)};function l(e){const t=new Date,i=t.getTime()/1e3|0,s=e.getTime()/1e3|0,a={};return i-s{const i=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+i+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):a[e.getMonth()])+i+e.getFullYear()+(t.noTime?"":", "+s)},p=2013,m=new RegExp("20[0-9]{1,2}"),g=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),v=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),b=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"),w=[31,29,31,30,31,30,31,31,30,31,30,31];function S(e,t){const i=e.trim().toLowerCase();if(i.length<3)return;if(0==="today".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-1;return void t.push({title:"Today",minDate:a,maxDate:o})}if(0==="yesterday".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime()-864e5;e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:a,maxDate:o})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let i=0;i<7;i++)if(t.setDate(t.getDate()+1),0===P(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(i);if(s>=0){const e=new Date,i=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>i&&e.setTime(e.getTime()-6048e5);const a=e.getFullYear(),o=e.getMonth(),r=e.getDate();e.setFullYear(a,o,r),e.setHours(0,0,0);const d=e.getTime();e.setFullYear(a,o,r+1),e.setHours(0,0,0);const l=e.getTime()-1;return void t.push({title:P(d),minDate:d,maxDate:l})}let n;if(null===(n=b.exec(i)))if(null===(n=y.exec(i)))if(null===(n=m.exec(i))){if(null!==(n=g.exec(i))){const e=n[1],i=n[2],s=k(e);if(s>=0){const e=+i;if(e>0&&e<=31)return void L(t,e-1,s);if(e>=p)return void C(t,s,e)}}if(null!==(n=v.exec(i))){const e=n[1],i=k(n[2]);if(i>=0){const s=+e;if(s>0&&s<=31)return void L(t,s-1,i);s>=p&&C(t,i,s)}}}else{let e=+i;const s=(new Date).getFullYear();if(e=e;i--){const e=new Date;e.setFullYear(i,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(i+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+i,minDate:s,maxDate:n})}}else if(e<=s){const i=new Date;i.setFullYear(e,0,1),i.setHours(0,0,0);const s=i.getTime();i.setFullYear(e+1,0,1),i.setHours(0,0,0);const n=i.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],i=n[3],s=n[5];if(!n[2]===n[4])return;const a=parseInt(e),o=parseInt(i)-1;let r=parseInt(s);r>=10&&r<=99&&(r+=2e3);const d=(new Date).getFullYear();if(Z(a-1,o)&&r>=p&&r<=d){const e=new Date;e.setFullYear(r,o,a),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(r,o,a+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:M(i),minDate:i,maxDate:s})}}else{const e=n[1],i=n[3],s=parseInt(e),a=parseInt(i);if(s>0&&s<=31){if(a>=p&&s<=12)return void C(t,s-1,a);a<=12&&L(t,s-1,a-1)}else s>=p&&a<=12&&C(t,a-1,s)}}function C(e,t,i){const s=(new Date).getFullYear(),n=Date.now();if(i>=p&&i<=s){const s=new Date;s.setFullYear(i,t,1),s.setHours(0,0,0);const a=s.getTime();if(a>n)return;s.setMonth(s.getMonth()+1);const o=s.getTime()-1;e.push({title:E(a),minDate:a,maxDate:o})}}function L(e,t,i){if(Z(t,i)){const n=(new Date).getFullYear(),a=Date.now();for(let o=n;o>=p;o--){if(1===i&&28===t&&((s=o)%4!=0||s%100==0)&&s%400!=0)continue;const r=new Date;r.setFullYear(o,i,t+1),r.setHours(0,0,0);const d=r.getTime();if(d>a)continue;r.setFullYear(o,i,t+2),r.setHours(0,0,0);const l=r.getTime()-1;o===n?e.push({title:I(d),minDate:d,maxDate:l}):e.push({title:M(d),minDate:d,maxDate:l})}}var s}function E(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function I(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getDate()}function M(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function P(e){const t=new Date(e);return o[t.getDay()]}function Z(e,t){return t>=0&&t<12&&e>=0&&e{"use strict";i.d(t,{E:()=>c,s:()=>l});var s=i(5432),n=i(4762),a=i(3416),o=i(3910);let r=!1,d=0;function l(){d&&clearTimeout(d),d=window.setTimeout((()=>{d=0,r=!1}),400),r=!0}function c(e,t,i){const d=i?i.add(e):e.addEventListener.bind(e),l=i?i.removeManual.bind(i,e):e.removeEventListener.bind(e);if(n.IS_APPLE&&s.Z){let i;const s={capture:!0},n=()=>{clearTimeout(i),l("touchmove",n,s),l("touchend",n,s),l("touchcancel",n,s)};d("touchstart",(l=>{l.touches.length>1?n():(d("touchmove",n,s),d("touchend",n,s),d("touchcancel",n,s),i=window.setTimeout((()=>{r?n():(t(l.touches[0]),n(),a.Z.isOpened()&&e.addEventListener("touchend",o.Z,{once:!0}))}),400))}))}else d("contextmenu",s.Z?i=>{t(i),a.Z.isOpened()&&e.addEventListener("touchend",o.Z,{once:!0})}:t)}},5077:(e,t,i)=>{"use strict";function s(e,t,i,s){const n=e=>{i({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),s&&s({x:t.pageX,y:t.pageY,event:t})},o=i=>{0===i.button?(t({x:i.pageX,y:i.pageY,event:i}),n(i),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),i({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},d=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",l,{passive:!1,once:!0}),s&&s({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},l=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",d,{passive:!1,once:!0})};return e.addEventListener("touchstart",l,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",l),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",d)}}i.d(t,{Z:()=>s})},6760:(e,t,i)=>{"use strict";function s(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}i.d(t,{Z:()=>s})},2738:(e,t,i)=>{"use strict";i.d(t,{EN:()=>r,fc:()=>o,pf:()=>a,tH:()=>d});var s=i(5432),n=i(6669);const a=s.Z?"mousedown":"click";function o(e,t,i={}){const s=i.listenerSetter?i.listenerSetter.add(e):e.addEventListener.bind(e);i.touchMouseDown=!0,s(a,t,i)}function r(e,t,i){e.removeEventListener(a,t,i)}function d(e){(0,n.Z)(e,a)}},7529:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(3241),a=i(5953),o=i(8497);class r extends n.Z{constructor(){super(!1),this.hideControls=(e=!1)=>{if(e)return void(this.hideControlsTimeout||(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3)));clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0;const t=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!t||this.controlsLocked)return}else if(!t)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.hideControlsTimeout?(clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.element.classList.contains("show-controls");if(void 0===e)t?this.hideControls():this.showControls();else{if(e===t)return;!1===e?this.hideControls():this.showControls()}},this.hideControlsTimeout=0}setup(e){(0,a.Z)(this,e);const{listenerSetter:t,element:i}=this;s.Z?t.add(i)("click",(e=>{this.ignoreClickClassName&&(0,o.Z)(e.target,this.ignoreClickClassName)||this.toggleControls()})):(t.add(i)("mousemove",(()=>{this.showControls()})),t.add(i)("mouseenter",(()=>{this.showControls(!1)})),t.add(i)("mouseleave",(e=>{e.relatedTarget&&this.showOnLeaveToClassName&&(0,o.Z)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()})))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}},748:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(6787),n=i(4846),a=i(3512),o=i(3003),r=i(2353),d=i(3416),l=i(3699),c=i(3624),h=i(1483),u=i(6976),f=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))},p=i(8497),m=i(3173),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function v(e){const{listenTo:t,isStickerPack:i,verifyRecent:v,appendTo:b,onOpen:y,onClose:w,onSend:S}=e;let C,L;const E=e=>g(this,void 0,void 0,(function*(){const t=yield a.Z.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!t.cached)return!1;const i=(yield t.result).some((e=>e.id===L.id));return e?!i:i}));return function({buttons:e,findElement:t,listenTo:i,appendTo:s,filterButtons:n,onOpen:a,onClose:p}){null!=s||(s=document.body);const m=new l.Z,g=new l.Z,v=(0,c.k)();let b;(0,u.E)(i,(e=>{const i=t(e);if(!i)return;let s=b;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),s&&s.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0),(()=>{f(this,void 0,void 0,(function*(){yield null==a?void 0:a(i);const t=yield w();if(!t)return;s=t.element;const{cleanup:n,destroy:o}=t;(0,h.Z)(e,s),d.Z.openBtnMenu(s,(()=>{null==p||p(),n(),setTimeout((()=>{o()}),300)}))}))})()}),m);const y=()=>{g.removeAll(),v.clean()},w=()=>f(this,void 0,void 0,(function*(){y(),e.forEach((e=>e.element=void 0));const t=n||(e=>(0,r.Z)(e,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i}))),i=yield t(e);if(!i.length)return;const a=b=(0,o.Z)(i,g);return a.classList.add("contextmenu"),s.append(a),{element:a,cleanup:y,destroy:()=>{a.remove()}}}));return{element:b,destroy:()=>{y(),m.removeAll()}}}({listenTo:t,appendTo:b,findElement:e=>C=(0,p.Z)(e.target,"media-sticker-wrapper"),onOpen:()=>g(this,void 0,void 0,(function*(){return L=yield a.Z.managers.appDocsManager.getDoc(C.dataset.docId),null==y?void 0:y()})),onClose:w,buttons:[{icon:"stickers",text:"Context.ViewStickerSet",onClick:()=>new s.Z(L.stickerSetInput).show(),verify:()=>!i},{icon:"favourites",text:"AddToFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(L.id,!1),verify:()=>E(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(L.id,!0),verify:()=>E(!1)},{icon:"delete",text:"DeleteFromRecent",onClick:()=>a.Z.managers.appStickersManager.saveRecentSticker(L.id,!0),verify:()=>{var e;return null!==(e=null==v?void 0:v(C))&&void 0!==e&&e}},{icon:"mute",text:"Chat.Send.WithoutSound",onClick:()=>(null==S||S(),m.Jo.sendDocId(L.id,!1,!0)),verify:()=>!(!n.Z.chat.peerId||n.Z.chat.peerId===a.Z.myId)},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:()=>n.Z.chat.input.scheduleSending((()=>n.Z.chat.input.sendMessageWithDocument(L))),verify:()=>!!n.Z.chat.peerId}]})}},7660:(e,t,i)=>{"use strict";function s(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}i.d(t,{Z:()=>s})},8222:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3512);const n=new class{constructor(){this.cache={},s.Z.addEventListener("theme_change",(()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(const 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)}}},6669:(e,t,i)=>{"use strict";function s(e,t){const i=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(i)}i.d(t,{Z:()=>s})},1544:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4056);function n(e){return Array.from(e.childNodes).map((e=>e.nodeType===e.TEXT_NODE?(0,s.Z)(e.textContent):e.outerHTML)).join("")}},5975:(e,t,i)=>{"use strict";function s(e,t){if(!e)return null;if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}i.d(t,{Z:()=>s})},8763:(e,t,i)=>{"use strict";function s(e,t){return e.closest(`[${t}]`)}i.d(t,{Z:()=>s})},4668:(e,t,i)=>{"use strict";function s(e,t){return e.closest(t)}i.d(t,{Z:()=>s})},6733:(e,t,i)=>{"use strict";function s(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function n(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function a(e,t,i){const s=i?i.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach((e=>{s(e,t,!1)}))}function o(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!o()}i.d(t,{C8:()=>n,Dj:()=>s,Ms:()=>a,W7:()=>o,rB:()=>r})},3299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n,q:()=>a});var s=i(5975);function n(e,t){const i=document.getSelection(),n=i[t?"anchorNode":"focusNode"],o=i[t?"anchorOffset":"focusOffset"];return(0,s.Z)(n,e)||n===e?Object.assign(Object.assign({},a(e,n,o)),{selection:i}):{selection:i}}function a(e,t,i){if(t===e){const s=e.childNodes,n=s.length;n&&i>=n?i=((t=s[n-1]).textContent||t.alt||"").length:(t=s[i],i=0)}return{node:t,offset:i}}},9041:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d,o:()=>n});var s=i(6854);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"], [style*="strikethrough"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},a=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]),o=new RegExp(s.Z,"g");function r(e,t,i,s){const a=e.parentElement;for(const e in n){const o=n[e],r=a.closest(o.match+', [contenteditable="true"]');null===(null==r?void 0:r.getAttribute("contenteditable"))&&("messageEntityTextUrl"===o.entityName?i.push({_:o.entityName,url:r.href,offset:s.offset,length:t.length}):"messageEntityMentionName"===o.entityName?i.push({_:o.entityName,offset:s.offset,length:t.length,user_id:r.dataset.follow.toUserId()}):i.push({_:o.entityName,offset:s.offset,length:t.length}))}}function d(e,t,i,s,n,l,c={offset:0}){if(e.nodeType===e.TEXT_NODE){let t=e.nodeValue;return t=t.replace(o,""),t?s===e?i.push(t.substr(0,n)+""+t.substr(n)):i.push(t):s===e&&i.push(""),l&&t.length&&e.parentNode&&r(e,t,l,c),void(c.offset+=t.length)}if(e.nodeType!==e.ELEMENT_NODE)return;const h=s===e,u=a.has(e.tagName);if(u&&(i.length||"BR"===e.tagName))t.push(i.join("")),i.length=0,++c.offset;else{const t=e.dataset.stickerEmoji||e.alt,s=e.dataset.stickerEmoji;t&&l&&r(e,t,l,c),s&&l&&l.push({_:"messageEntityCustomEmoji",document_id:e.dataset.docId,offset:c.offset,length:t.length}),t&&(i.push(t),c.offset+=t.length)}h&&!n&&i.push("");const f=e.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let m=e.firstChild;for(;m;)d(m,t,i,s,n,l,c),m=m.nextSibling;if(h&&n&&i.push(""),f&&e.nextSibling&&(i.push(" "),++c.offset,void 0!==p))for(let e=p,t=l.length;e{"use strict";i.d(t,{Z:()=>r});var s=i(410),n=i(6875),a=i(1346),o=i(9041);function r(e,t=!0,i=!0){const s=[],r=[],{node:d,offset:l}=!(e instanceof DocumentFragment)&&i&&function(e){const t=window.getSelection();let i,s;if(null==t?void 0:t.rangeCount){const n=t.getRangeAt(0),a=n.startOffset;if(n.startContainer&&n.startContainer==n.endContainer&&a==n.endOffset){const t=a-1,o=e.childNodes;if(n.startContainer===e&&o[t]){i=o[t],s=0;for(let e=0;e{"use strict";i.d(t,{Z:()=>n});var s=i(8204);function n({overflowElement:e,overflowRect:t,selector:i,extraSize:n,elements:a}){null!=t||(t=e.getBoundingClientRect()),null!=a||(a=Array.from(e.querySelectorAll(i))),n&&(t={top:t.top-n,right:t.right+n,bottom:t.bottom+n,left:t.left-n});const o=[],r=[],d=[];let l=!1;for(const i of a){const n=i.getBoundingClientRect(),a=(0,s.Z)(i,e,!1,n,t);let c;a?(l=!0,c=r):c=l?d:o,c.push({element:i,rect:n,visibleRect:a})}return{invisibleTop:o,visible:r,invisibleBottom:d}}},8204:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(241);function n(e,t,i,n=e.getBoundingClientRect(),a=t.getBoundingClientRect()){let{top:o,right:r,bottom:d,left:l}=a;if(i){const e=t.querySelector(".sticky");e&&(o=e.getBoundingClientRect().bottom)}if(n.top>=d||n.bottom<=o||n.right<=l||n.left>=r)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},h=s.Z.width,u=s.Z.height;return{rect:{top:n.topr&&r!==h?(c.right=!0,++c.horizontal,r):n.right,bottom:n.bottom>d&&d!==u?(c.bottom=!0,++c.vertical,d):n.bottom,left:n.left{"use strict";i.d(t,{Z:()=>r});var s=i(3757),n=i(3910),a=i(8497),o=i(3444);function r(e){let t=!1;return new s.Z(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!(0,a.Z)(t.target,"progress-line")&&!(0,o.Z)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(i,s,a)=>{if(!t&&Math.abs(s)>20)return!0;if(Math.abs(i)>Math.abs(s))(0,n.Z)(a),t=!0;else if(!t&&Math.abs(s)>Math.abs(i))return!0;return e.onSwipe(i,s,a)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}},1154:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6976),n=i(2416);function a(e){return(0,n.Z)(Object.assign(Object.assign({},e),{onSwipe:(t,i,n)=>{if(Math.abs(t)>50)return e.onSwipe(t,i,n),(0,s.s)(),!0}}))}},5705:(e,t,i)=>{"use strict";function s(e){if(e instanceof DocumentFragment)return e;const t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}i.d(t,{Z:()=>s})},2614:(e,t,i)=>{"use strict";function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},8487:(e,t,i)=>{"use strict";function s(e){return null==e?void 0:e.isConnected}i.d(t,{Z:()=>s})},1293:(e,t,i)=>{"use strict";function s(e){return e.isContentEditable||"INPUT"!==e.tagName?!e.textContent.trim()&&!e.querySelector(".emoji, .custom-emoji, .custom-emoji-placeholder"):!e.value.trim()}i.d(t,{Z:()=>s})},6299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(4762);function a(e){if("Enter"===e.key&&!n.IS_MOBILE&&!e.isComposing){if("enter"===s.Z.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=n.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(n.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},3444:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e){return s.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},2398:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5432);function n(e,t=!1,i=!0){if(!s.Z||t&&("INPUT"===document.activeElement.tagName||document.activeElement.isContentEditable))if(i&&e.focus(),e instanceof HTMLInputElement){const t=e.value.length;e.selectionStart=t,e.selectionEnd=t}else{const t=document.createRange();t.selectNodeContents(e),t.collapse(!1);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}}window.placeCaretAtEnd=n},4484:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2648);function n(e,t,i,n){return void 0===n&&(n=e.parentElement===t?(0,s.Z)(e):-1),n!==i&&(-1!==n&&ni?t.insertBefore(e,t.children[i]):t.append(e):t.prepend(e),!0)}},6740:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>o,cj:()=>r});var s=i(925);const n={},a=(e,t)=>{e instanceof HTMLImageElement||e instanceof HTMLVideoElement?e.src=t:e instanceof SVGImageElement?e.setAttributeNS(null,"href",t):e.style.backgroundImage="url("+t+")"};function o(e,t,i,o=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(null==i||i());const r=e instanceof HTMLVideoElement;if(n[t]&&o||r)e&&a(e,t),i&&(r?(0,s.Z)(e).then(i):null==i||i());else{const s=e instanceof HTMLImageElement,o=s?e:new Image;o.src=t;const r=()=>{!s&&e&&a(e,t),n[t]=!0,null==i||i(),o.removeEventListener("error",d)},d=e=>{console.error("Render image from url failed:",e,t,o),o.removeEventListener("load",r),null==i||i()};o.addEventListener("load",r,{once:!0}),o.addEventListener("error",d,{once:!0})}}function r(e,t,i){return new Promise((s=>{o(e,t,s,i)}))}},2830:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9674),n=i(6740);function a(e,t,i,a,o=e,r){return a&&t.classList.add("fade-in"),(0,n.cj)(t,i).then((()=>s.Z.mutateElement(e,(()=>{o.append(t),a?t.addEventListener("animationend",(()=>{s.Z.mutate((()=>{t.classList.remove("fade-in"),null==r||r.remove()}))}),{once:!0}):null==r||r.remove()}))))}},5565:(e,t,i)=>{"use strict";function s(e,t){if("string"==typeof t)return void(e.innerHTML=t);const i=e.firstChild;i?e.lastChild===i?i.replaceWith(t):(e.textContent="",e.append(t)):e.append(t)}i.d(t,{Z:()=>s})},669:(e,t,i)=>{"use strict";i.d(t,{Y:()=>m,Z:()=>g});var s=i(4762),n=i(5003),a=i(4776),o=i(3699),r=i(6854),d=i(3228),l=i(5975),c=i(2648);function h(e,t,i,s){let n;if(e===i)n=t-s;else if(e.parentElement===i.parentElement)n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0);else{const t=[];let s=e.parentElement;do{t.push(s)}while(s=s.parentElement);s=i.parentElement;do{if(t.includes(s))break}while(s=s.parentElement);const a=s;e=(0,l.Z)(e,a),i=(0,l.Z)(i,a),n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0)}return(0,d.Z)(n,-1,1)}window.compareNodes=h;var u=i(3299),f=i(2398);const p=new RegExp(`[^${r.Z}]`),m=!1;class g{constructor(){this.saveSelectionOnChange=e=>{const t=document.activeElement;this.saveRangeForElement(t)},this.onFocusOut=e=>{this.lastNode=this.lastOffset=void 0},this.onSelectionChange=e=>{var t;const{input:i}=this;if(!i)return void this.setSelectionClassName(document.getSelection());let s=this.getCaretPosN();for(;;){const{node:e,offset:n,selection:a,move:o}=s;if((null==e?void 0:e.nodeValue)!==r.Z||!this.lastNode)break;const d=h(e,n,this.lastNode,this.lastOffset)<0;void 0!==d&&(a.isCollapsed?this.superMove(i,s,d,!0):a.modify(a.isCollapsed?"move":"extend",d?"backward":"forward","character")),this.log("selectionchange",e,n,this.lastNode,this.lastOffset,e===this.lastNode,(0,c.Z)(this.getFiller(e)),(0,c.Z)(this.getFiller(this.lastNode)),d,a,document.getSelection(),document.getSelection().getRangeAt(0),null==e?void 0:e.parentNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode),s=this.getCaretPosN(),this.lastNode=e,this.lastOffset=n;break}this.lastNode=this.lastOffset=void 0,this.setSelectionClassName(s.selection,i)},this.onBeforeInput=e=>{var t;const{input:i,log:s}=this;if(!i)return;const n=this.addInputCallback.bind(this,i),a=this.getCaretPosN();let{node:o,offset:d,selection:l,move:c}=a;if(s("beforeinput",e,o,d,l,a),this.lastNode=this.lastOffset=void 0,e.inputType.startsWith("delete")){if(n((()=>{this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.fixInsertedLineBreaks(i)})),(null==o?void 0:o.nodeValue)===r.Z&&l.isCollapsed&&e.inputType.includes("deleteContent")){const t=e.inputType.includes("Backward"),s=d===r.Z.length&&t||!d&&!t;this.superMove(i,a,t,s)}}else{if(e.inputType.startsWith("insert")){if(null===(t=null==o?void 0:o.classList)||void 0===t?void 0:t.contains("input-something")){o=o.previousSibling.firstChild;const e=l.getRangeAt(0);e.setStart(o,0),e.setEnd(o,0),e.collapse(!0);const t=this.getCaretPosN();o=t.node,l=t.selection,d=t.offset}if(o&&o.textContent===r.Z&&d===r.Z.length){l.modify("move","backward","character");const e=this.getCaretPosN();o=e.node,l=e.selection,d=e.offset}e.inputType;{o&&o.nodeType===o.ELEMENT_NODE&&(o=o.firstChild,s.warn("fixing focus on span"));const t=(null==o?void 0:o.nodeValue)===r.Z;if(s("inserting line break",t,o,`"${null==o?void 0:o.nodeValue}"`,(null==o?void 0:o.parentElement)?Array.from(o.parentElement.childNodes).slice():[]),t){const e=o.parentElement;e.classList.replace("input-filler","input-filler-text"),e.childNodes.length,n((()=>{e.childNodes.length>1?(s("inserting line break, remove"),o=Array.from(e.childNodes).find((e=>e.nodeValue===r.Z)),e.t=o):o.nodeValue!==r.Z&&(s("inserting line break, deleteData"),o.deleteData(o.nodeValue.indexOf(r.Z),r.Z.length)),this.fixInsertedLineBreaks(i)}))}else"insertLineBreak"===e.inputType&&n((()=>{this.fixInsertedLineBreaks(i)}))}return}"historyUndo"===e.inputType?n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.removeEmptyTextNodes(i),this.fixBuggedCaret()})):"historyRedo"===e.inputType&&n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),i.querySelectorAll(".input-something:not([contenteditable])").forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(i),this.fixBuggedCaret()}))}},this.onKeyDown=e=>{var t;const i=e.key;if("ArrowDown"===i||"ArrowUp"===i)this.lastNode=this.lastOffset=void 0;else{const{node:e,offset:t}=this.getCaretPosN();this.lastNode=e,this.lastOffset=t,this.lastNode===this.input&&(this.lastNode=this.lastOffset=void 0)}this.log("keydown",this.lastNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode,this.lastOffset,this.getCaretPosN(),e)},this.log=(0,n.kg)("RICH-INPUT"),this.listenerSetter=new o.Z,this.savedRanges=new WeakMap,this.listenerSetter.add(document)("selectionchange",this.saveSelectionOnChange),m&&(this.listenerSetter.add(document)("focusout",this.onFocusOut),this.listenerSetter.add(document)("selectionchange",this.onSelectionChange),this.listenerSetter.add(document)("beforeinput",this.onBeforeInput),this.listenerSetter.add(document)("keydown",this.onKeyDown,{capture:!0}),s.IS_FIREFOX&&(this.inputCaptureCallbacks=[],this.listenerSetter.add(document)("input",(()=>{this.inputCaptureCallbacks.forEach((e=>e())),this.inputCaptureCallbacks.length=0}),{capture:!0})))}get input(){const e=document.getSelection(),{anchorNode:t}=e;if(t)return(t.closest?t:t.parentElement).closest('[contenteditable="true"]')}saveRangeForElement(e){e&&(e.isContentEditable||"INPUT"===e.tagName)&&document.getSelection().rangeCount&&this.savedRanges.set(e,document.getSelection().getRangeAt(0))}findPreviousSmthIndex(e,t,i){const s=Array.from(null!=i?i:e.querySelectorAll(".input-something")),n=s.findIndex((e=>h(e,0,t,0)>=0));return-1===n?s.length-1:Math.max(0,n-1)}superMove(e,t,i,s){var n,a;const{node:o,offset:d,move:l}=t,c=e.querySelectorAll(".input-something"),h=this.findPreviousSmthIndex(e,o,c),u=document.createRange();u[i?"setEnd":"setStart"](o,d),s&&l(i);const f=this.getCaretPosN();if((null===(n=f.node)||void 0===n?void 0:n.nodeValue)===r.Z&&(!s||o===this.lastNode)){const t=this.findPreviousSmthIndex(e,f.node,c);let n=!s;for(;;){const s=this.getCaretPosN(),d=this.findPreviousSmthIndex(e,s.node,c);u[i?"setStart":"setEnd"](s.node,s.offset);const f=u.toString(),m=!p.test(f);if(this.log("test cursor",f,m,t,d),!m||(null===(a=s.node)||void 0===a?void 0:a.nodeValue)!==r.Z||d!==t||!d&&!s.offset||!(d{e.classList.add("br-not-br")}))}fixBuggedCaret(){const e=document.getSelection(),t=e.getRangeAt(0);e.removeAllRanges(),e.addRange(t)}addInputCallback(e,t,i=!0){const n=()=>{this.log("input modify callback"),t()};i&&s.IS_FIREFOX?this.inputCaptureCallbacks.push(n):this.listenerSetter.add(e)("input",n,{once:!0,capture:i})}removeExtraBOMs(e){const t=e=>{var t;return null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-something")};e.querySelectorAll(".input-filler").forEach((e=>{var i;const{previousSibling:s,nextSibling:n}=e;let o=!1;!(null===(i=null==n?void 0:n.classList)||void 0===i?void 0:i.contains("input-filler"))&&(0,a.Hc)(n)&&(o=t(s)||t(n)),o||(this.log.warn("removing empty bom node",e),e.remove())}))}getFiller(e){return e&&e.nodeType===e.TEXT_NODE&&e.parentElement!==this.input?e.parentElement:e}getCaretPosN(){const e=(0,u.Z)(this.input);return Object.assign(Object.assign({},e),{move:this.move.bind(this,e.selection)})}removeEmptyTextNodes(e){const{log:t}=this,i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:t=>t.parentElement!==e||t.nodeValue?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT});let s;for(;s=i.nextNode();)t.warn("removing empty text node",s),s.remove()}removePossibleBOMSiblings(e,t){[e,t].forEach((e=>{var t;(null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-filler"))&&e.remove()}))}removePossibleBOMSiblingsByNode(e){const{previousSibling:t,nextSibling:i}=e;this.removePossibleBOMSiblings(t,i)}processEmptiedFillers(e){e.querySelectorAll(".input-filler-text").forEach((e=>{var t;this.removeExtraBOMs(e);let i=!0;if(e.textContent)p.test(e.textContent)||e.querySelector(".input-something")?i=!1:e.classList.replace("input-filler-text","input-filler");else{e.classList.replace("input-filler-text","input-filler");const i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE));i?i.insertData(0,r.Z):(null===(t=e.t)||void 0===t?void 0:t.nodeValue)?e.append(e.t):e.append(document.createTextNode(r.Z))}i&&this.removePossibleBOMSiblingsByNode(e)}))}processFilledFillers(e){e.querySelectorAll(".input-filler").forEach((e=>{if(e.textContent!==r.Z){e.classList.replace("input-filler","input-filler-text");const t=e.t,i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE&&e.nodeValue.includes(r.Z)));if(i&&!(null==t?void 0:t.nodeValue)){const e=i.nodeValue.indexOf(r.Z);-1!==e&&i.deleteData(e,r.Z.length)}}}))}setSelectionClassName(e,t){if(e.rangeCount){const i=e.getRangeAt(0);t?Array.from(t.querySelectorAll(".input-selectable")).forEach((e=>{e.classList.toggle("selection",!i.collapsed&&i.intersectsNode(e))})):Array.from(document.querySelectorAll(".input-selectable.selection")).forEach((e=>e.classList.remove("selection")))}}move(e,t){const{focusNode:i,focusOffset:s}=e;e.modify("extend",t?"backward":"forward","character"),t?e.collapseToStart():e.collapseToEnd();const{focusNode:n,focusOffset:a}=e;this.log("moving cursor",t,i,i.nodeType===i.ELEMENT_NODE?i:i.parentElement,s,n,n.nodeType===n.ELEMENT_NODE?n:n.parentElement,a)}prepareApplyingMarkdown(){const{input:e}=this,t=e.querySelectorAll(".input-filler"),i=e.querySelectorAll(".input-something");return i.forEach((e=>{e.contentEditable="inherit"})),()=>{t.forEach((e=>{e.contentEditable="inherit"})),i.forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(e)}}static getInstance(){var e;return null!==(e=this.INSTANCE)&&void 0!==e?e:this.INSTANCE=new g}}},130:(e,t,i)=>{"use strict";function s(e,t){e.setAttribute("dir","auto"),"string"==typeof t?t?e.innerHTML=t:e.textContent="":e.replaceChildren(t)}i.d(t,{Z:()=>s})},1656:(e,t,i)=>{"use strict";function s(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>s(e,!t)}i.d(t,{Z:()=>s})},2648:(e,t,i)=>{"use strict";function s(e,t){if(!e.parentNode)return-1;if(t)return Array.from(e.parentNode.childNodes).indexOf(e);let i=0;for(;null!==(e=e.previousElementSibling);)++i;return i}i.d(t,{Z:()=>s})},6339:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(2738),n=i(5975),a=i(3241),o=i(5432),r=i(5953),d=i(9818),l=i(8497),c=i(3512);class h extends a.Z{constructor(e){super(!1),this.onClickOut=e=>{const t=e.target;(0,n.Z)(t,this.element)||Array.from(this.ignoreButtons).some((e=>(0,n.Z)(t,e)||t===e))||!(this.ignoreMouseOut.size<=1)||this.ignoreOutClickClassName&&(0,l.Z)(t,this.ignoreOutClickClassName)||this.toggle(!1)},this.onMouseOut=e=>{if(!this.isActive())return;if(this.clearTimeout("toggle"),this.ignoreMouseOut.size)return;const t=e.toElement;t&&(0,n.Z)(t,this.element)||this.setTimeout("toggle",(()=>{this.toggle(!1)}),200)},this.toggle=e=>{return t=this,i=void 0,a=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())return;const i=o.Z||!c.Z.settings.animationsEnabled?0:200;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"),this.dispatchEvent("openAfterLayout"),d.Z.pushItem(this.navigationItem={type:"dropdown",onPop:()=>{this.toggle(!1)}}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.forceClose=!1,this.dispatchEvent("opened")}),i)}else this.dispatchEvent("close"),this.ignoreMouseOut.clear(),this.ignoreButtons.clear(),this.element.classList.remove("active"),d.Z.removeItem(this.navigationItem),(0,s.EN)(window,this.onClickOut,{capture:!0}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")}),i)},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a},(0,r.Z)(this,e),this.forceClose=!1,this.inited=!1,this.ignoreMouseOut=new Set,this.ignoreButtons=new Set,this.timeouts={}}attachButtonListener(e,t){let i=!0;o.Z?(0,s.fc)(e,(()=>{i?(i=!1,this.toggle(!0)):this.toggle()}),{listenerSetter:t}):(t.add(e)("mouseover",(s=>{i&&(t.add(e)("mouseout",(e=>{this.clearTimeout("toggle"),this.onMouseOut(e)})),i=!1),this.setTimeout("toggle",(()=>{this.toggle(!0)}),200)})),(0,s.fc)(e,(()=>{const t="click",i=!this.ignoreMouseOut.has(t);i&&!this.ignoreMouseOut.size&&(this.ignoreButtons.add(e),setTimeout((()=>{(0,s.fc)(window,this.onClickOut,{capture:!0})}),0)),this.setIgnoreMouseOut(t,i),this.toggle(i)}),{listenerSetter:t}))}clearTimeout(e){void 0!==this.timeouts[e]&&(clearTimeout(this.timeouts[e]),delete this.timeouts[e])}setTimeout(e,t,i){this.clearTimeout(e),this.timeouts[e]=window.setTimeout((()=>{this.clearTimeout(e),t()}),i)}init(){o.Z||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||this.clearTimeout("toggle")})}isActive(){return this.element.classList.contains("active")}setIgnoreMouseOut(e,t){t?this.ignoreMouseOut.add(e):this.ignoreMouseOut.delete(e)}}},4789:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,f:()=>s});var s,n=i(8594),a=i(3035),o=i(5296),r=i(3512),d=i(8487);function l(e){var t,i,o;if(null!==(t=e.margin)&&void 0!==t||(e.margin=0),null!==(i=e.maxDistance)&&void 0!==i||(e.maxDistance=1500),null!==(o=e.axis)&&void 0!==o||(e.axis="y"),r.Z.settings.animationsEnabled&&0!==e.forceDuration||(e.forceDirection=s.Static),e.forceDirection===s.Static)return e.forceDuration=0,c(e);const d=(0,a.AD)().then((()=>c(e)));return"y"===e.axis?(0,n.YW)(d):d}function c(e){const{element:t,container:i,getNormalSize:s,getElementPosition:n,transitionFunction:a,axis:r,margin:l,position:f,forceDirection:p,maxDistance:m,forceDuration:g}=e;if(!(0,d.Z)(t))return(0,o.Kx)(i),Promise.resolve();const v="y"===r?"top":"left",b="y"===r?"bottom":"right",y="y"===r?"height":"width",w="y"===r?"scrollHeight":"scrollWidth",S="y"===r?"scrollHeight":"offsetWidth",C="y"===r?"scrollTop":"scrollLeft",L=t.getBoundingClientRect(),E=i.getBoundingClientRect?i.getBoundingClientRect():document.body.getBoundingClientRect(),I=L[v]-E[v],M=n?n({elementRect:L,containerRect:E,elementPosition:I}):I,P=t[S],Z=s?s({rect:E}):E[y];let k=i[C];const T=i[w];let x;switch(f){case"start":x=M-l;break;case"end":x=L[b]-E[b]+l;break;case"nearest":case"center":if(Pm?(k=i.scrollTop+=x-m,x=m):x<-m&&(k=i.scrollTop+=x+m,x=-m)),x<0){const e=-k;x=Math.max(x,e)}else if(x>0){const e=T-(k+Z);x=Math.min(x,e)}const A=i[C]+x,_=Math.abs(x),F=null!=g?g:250+_/1500*350,D=Date.now(),R=null!=a?a:_<500?u:h,B=()=>F?Math.min((Date.now()-D)/F,1):1,N=()=>{const e=B(),t=R(e),s=x*(1-t);return i[C]=Math.round(A-s),e<1};if(!F||!x)return(0,o.Kx)(i),N(),Promise.resolve();if(e.startCallback){const t=T-Math.round(A+i["y"===r?"offsetHeight":"offsetWidth"]);e.startCallback({scrollSize:T,scrollPosition:k,distanceToEnd:t,path:x,duration:F,containerRect:E,elementRect:L,getProgress:B})}return(0,o.cK)(N,i)}function h(e){return 1-Math.pow(1-e,5)}function u(e){return 1-Math.pow(1-e,3.5)}!function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(s||(s={}))},8801:(e,t,i)=>{"use strict";i.d(t,{P:()=>n});const s="_";function n(e,t){const i=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(i?"."+i:i)}},1708:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7625);function n(e){(0,s.Z)(e.history,((t,i,s)=>{t.action.photo||(s.splice(i,1),void 0!==e.count&&--e.count)}))}},4081:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e,t="auto"){if(0===e)return(0,s.ag)("FileSize.B",[0]);const i="auto"===t,n=Math.floor(Math.log(e)/Math.log(1024)),a="auto"===t?Math.max(0,n-1):t,o=Math.max(0,a),r=(e/Math.pow(1024,n)).toFixed(o);return(0,s.ag)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][n],[i?r:parseFloat(r)])}},8939:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325);const n={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks",mm:"Months",y:"Years"};function a(e,t){const i=function(e,t=2){e||(e=1);const i=[],s=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let n=1;s.forEach(((t,a)=>{if(n=Math.round(n*t.m),e=0;--e)0===a[e].duration&&a.splice(e,1);return a}(e,2);if(t){const e=i.map((e=>s.ZP.format(n[e.type],!0,[e.duration])));return(0,s.v_)(e,!1,t)}const a=i.map((e=>(0,s.ag)(n[e.type],[e.duration]))),o=document.createElement("span");return o.append(...(0,s.v_)(a,!1)),o}},6272:(e,t,i)=>{"use strict";i.d(t,{u:()=>r});var s=i(2325);const n=new Map;let a=0;const o=(e,t,i="")=>{i=t.country_code+i,a=Math.max(a,i.length),n.set(i,{country:e,code:t})};function r(e){e=e||"",n.size||s.ZP.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((i=>{o(e,t,i)})):o(e,t)}))}));let t=e.replace(/\D/g,"");const i=t.slice(0,a);let r;for(let e=i.length-1;e>=0&&(r=n.get(i.slice(0,e+1)),!r);--e);if(!r)return{formatted:t,country:void 0,code:void 0,leftPattern:""};const d=r.country,l=r.code.patterns||[],c=t.slice(r.code.country_code.length);let h="",u=0,f="";for(let e=l.length-1;e>=0;--e){h=l[e];const t=h.replace(/ /g,"");let i=0;for(let e=0,s=Math.min(c.length,t.length);eu&&(u=i,f=h)}h=f||h,h=h.replace(/\d/g,"X"),h=r.code.country_code+" "+h,h.split("").forEach(((e,i)=>{" "===e&&" "!==t[i]&&t.length>i&&(t=t.slice(0,i)+" "+t.slice(i))}));let p=h&&h.length>t.length?h.slice(t.length):"";return p&&(p=p.replace(/X/g,"‒")),{formatted:t,country:d,code:r.code,leftPattern:p}}},645:(e,t,i)=>{"use strict";i.d(t,{M:()=>s,Z:()=>n});class s{constructor(){this.cache=new Map}static createCache(){const e={frames:new Map,framesNew:new Map,framesURLs:new Map,clearCache:()=>{e.framesNew.forEach((e=>{var t,i;null===(i=(t=e).close)||void 0===i||i.call(t)})),e.frames.clear(),e.framesNew.clear(),e.framesURLs.clear()},counter:0};return e}getCache(e){let t=this.cache.get(e);return t||this.cache.set(e,t=s.createCache()),++t.counter,t}releaseCache(e){const t=this.cache.get(e);t&&!--t.counter&&this.cache.delete(e)}getCacheCounter(e){const t=this.cache.get(e);return null==t?void 0:t.counter}generateName(e,t,i,s,n){return[e,t,i,s?"colored":"",n||""].filter(Boolean).join("-")}}const n=new s},9171:(e,t,i)=>{"use strict";function s(e,t,i,s,n,a,o){return[e,",",t," ",i," ",s,",",n," ",a,",",o].join("")}function n(e,t,i,n,a,o,r,d){const l=[];return l.push("M"+(e+i/2)+","+t),l.push("H"+(e+i-o)),o>0&&l.push("A"+s(o,o,0,0,1,e+i,t+o)),l.push("V"+(t+n-r)),r>0&&l.push("A"+s(r,r,0,0,1,e+i-r,t+n)),l.push("H"+(e+d)),d>0&&l.push("A"+s(d,d,0,0,1,e+0,t+n-d)),l.push("V"+(t+a)),a>0&&l.push("A"+s(a,a,0,0,1,e+a,t+0)),l.push("Z"),l.join(" ")}i.d(t,{Z:()=>n}),i(410).GO.generatePathData=n},1046:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(6740),n=i(1185),a=i(6705);function o(e,t,i){const o=(0,n.Z)(e,t,!1);let r,d;if(i){const e=(0,a.Z)(o);r=e.canvas,d=e.promise}else r=new Image,d=(0,s.cj)(r,o);return r.classList.add("thumbnail"),{image:r,loadPromise:d}}},1185:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4059);function n(e,t,i=!1){return(0,s.Z)(t.bytes,i)}},8580:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1507),n=i(1046);function a(e,t,i,a=!1){const o=["video","gif"].includes(e.type);if(!t.downloaded||o||a){if("document"===e._&&t.downloaded&&!a&&(!o||t.type!==s.Pt))return null;const r=e.sizes||e.thumbs,d=(null==r?void 0:r.length)?r.find((e=>"photoStrippedSize"===e._)):null;if(d&&"bytes"in d)return(0,n.Z)(e,d,i)}return null}},6074:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(7625),n=i(5953);class a{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,(0,n.Z)(this,e)}setTargets(e,t,i){this.previous=e,this.next=t,this.reverse=i}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 i,s;if(e>0){if(i=this.next.splice(0,e),s=i.pop(),!s)return;void 0!==this.current&&i.unshift(this.current),this.previous.push(...i)}else{if(i=this.previous.splice(Math.max(0,this.previous.length+e),-e),s=i.shift(),!s)return;void 0!==this.current&&i.push(this.current),this.next.unshift(...i)}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 i=e>0?Math.max(0,e-this.next.length):Math.min(0,e+this.previous.length),s=this.go(e,!i&&t);return{item:i?void 0:s,leftLength:i}}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,i=e?this.loadPromiseDown:this.loadPromiseUp;return i||(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),i=this.loadMore(t,e,this.loadCount).then((t=>{return n=this,a=void 0,r=function*(){if((e?this.loadPromiseDown:this.loadPromiseUp)!==i)return;t.items.length{const t=this.processItem?this.processItem(e):e;t&&n.push(t)}));const a=yield Promise.all(n);e?this.reverse?this.previous.unshift(...a):this.next.push(...a):this.reverse?this.next.push(...a):this.previous.unshift(...a),this.onLoadedMore&&this.onLoadedMore()},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}),(()=>{})).then((()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null})),e?this.loadPromiseDown=i:this.loadPromiseUp=i,i)}}},3699:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(){this.listeners=new Set}add(e){return(t,i,s)=>{const n={element:e,event:t,callback:i,options:s};return this.addManual(n),n}}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,i,s){let n;for(const a of this.listeners)if(a.element===e&&a.event===t&&a.callback===i&&a.options===s){n=a;break}n&&this.remove(n)}removeAll(){this.listeners.forEach((e=>{this.remove(e)}))}}},9405:(e,t,i)=>{"use strict";i.d(t,{C:()=>a,c:()=>n});var s=i(9897);class n{constructor(e=0,t=e){this.width=e,this.height=t}aspect(e,t){return(0,s.Z)(this.width,this.height,e.width,e.height,t)}aspectFitted(e){return this.aspect(e,!0)}aspectCovered(e){return this.aspect(e,!1)}}function a(e,t){return new n(e,t)}},4755:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,_:()=>s});var s,n=i(410),a=i(3241),o=i(9405);!function(e){e[e.mobile=0]="mobile",e[e.medium=1]="medium",e[e.large=2]="large"}(s||(s={}));const r=(0,o.C)(20,20),d=(0,o.C)(36,36),l=(0,o.C)(18,18);class c extends a.Z{constructor(){super(),this.screenSizes=[{key:s.mobile,value:600},{key:s.medium,value:1275},{key:s.large,value:1680}],this.sizes={handhelds:{regular:(0,o.C)(270,270),webpage:(0,o.C)(270,200),album:(0,o.C)(270,0),esgSticker:(0,o.C)(68,68),animatedSticker:(0,o.C)(180,180),staticSticker:(0,o.C)(180,180),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(240,0),round:(0,o.C)(200,200),documentName:(0,o.C)(200,0),invoice:(0,o.C)(270,270),extendedInvoice:(0,o.C)(270,270),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(68,68)},desktop:{regular:(0,o.C)(420,340),webpage:(0,o.C)(420,340),album:(0,o.C)(420,0),esgSticker:(0,o.C)(72,72),animatedSticker:(0,o.C)(200,200),staticSticker:(0,o.C)(200,200),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(330,0),round:(0,o.C)(280,280),documentName:(0,o.C)(240,0),invoice:(0,o.C)(320,320),extendedInvoice:(0,o.C)(420,340),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(80,80)}},this.isMobile=!1,this.handleResize=()=>{const e=window.innerWidth;let t=this.screenSizes[0].key;for(let i=this.screenSizes.length-1;i>=0;--i)if(this.screenSizes[i].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame((()=>{this.handleResize(),this.rAF=0}))})),this.handleResize()}}const h=new c;n.GO.mediaSizes=h;const u=h},3624:(e,t,i)=>{"use strict";i.d(t,{A:()=>a,k:()=>o});var s=i(1655);const n=(0,i(5471).Z)("MIDDLEWARE");class a{constructor(){this.details={cleaned:!1,inner:[],onCleanCallbacks:[]},this.onDestroyCallbacks=[],this.onDestroy=e=>{if(this.destroyed)return e();this.onDestroyCallbacks.push(e)}}clean(){const e=this.details;e.cleaned=!0,e.inner.splice(0,e.inner.length).forEach((e=>e.destroy())),e.onCleanCallbacks.splice(0,e.onCleanCallbacks.length).forEach((e=>e())),this.details={cleaned:!1,inner:[],onCleanCallbacks:[]}}destroy(){this.destroyed=!0,this.clean(),this.onDestroyCallbacks.splice(0,this.onDestroyCallbacks.length).forEach((e=>e())),this.parent&&((0,s.Z)(this.parent.details.inner,this),this.parent=void 0)}get(e){const t=this.details,i=()=>!t.cleaned&&(!e||e());return i.create=()=>{if(!i())throw n;const e=new a;return e.parent=this,t.inner.push(e),e},i.onClean=e=>{if(!i())return e();t.onCleanCallbacks.push(e)},i.onDestroy=this.onDestroy,i}}function o(){return new a}},8631:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});const s=(0,i(5471).Z)("MIDDLEWARE");function n(e,t=s){return i=>{if(!(i instanceof Promise)){if(i instanceof Error)throw i;return i}return i.then((i=>{if(!e())throw t;return i}))}}},3228:(e,t,i)=>{"use strict";function s(e,t,i){return ei?i:e}i.d(t,{Z:()=>s})},2559:(e,t,i)=>{"use strict";function s(e,t=2){if(0===e)return"0";const i=t<0?0:t,s=Math.floor(Math.log(e)/Math.log(1e3));return parseFloat((e/Math.pow(1e3,s)).toFixed(i))+["","K","M","B","T"][s]}i.d(t,{Z:()=>s})},2575:(e,t,i)=>{"use strict";function s(e,t=" "){const i=e.toString().split(".");return i[0]=i[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),i.join(".")}i.d(t,{Z:()=>s})},925:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e,t=e.HAVE_METADATA,i){return new Promise(((n,a)=>{if(e.readyState>=t)return void n();const o=s.IS_APPLE_MOBILE&&!i?"loadeddata":"canplay",r="error",d=()=>{e.removeEventListener(r,l),n()},l=t=>{e.removeEventListener(o,d),a(t)};e.addEventListener(o,d,{once:!0}),e.addEventListener(r,l,{once:!0})}))}},2296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(9818),n=i(5432),a=i(4762),o=i(3910),r=i(2738),d=i(5975),l=i(3241);class c extends l.Z{constructor(e,t){super(!1),this.navigationType=e,this.withOverlay=t,this.onClick=e=>{var t;this.element&&(0,d.Z)(e.target,this.element)||((null===(t=this.listenerOptions)||void 0===t?void 0:t.capture)&&(0,o.Z)(e),this.close())},this.listenerOptions=t?{}:{capture:!0}}close(){var e;this.element&&(null===(e=this.overlay)||void 0===e||e.remove(),this.element=void 0,this.dispatchEvent("toggle",!1)),n.Z||window.removeEventListener("contextmenu",this.onClick,this.listenerOptions),document.removeEventListener(r.pf,this.onClick,this.listenerOptions),a.IS_MOBILE_SAFARI||s.Z.removeByType(this.navigationType)}open(e){this.close(),a.IS_MOBILE_SAFARI||s.Z.pushItem({type:this.navigationType,onPop:e=>{this.close()}}),this.element=e,!this.overlay&&this.withOverlay&&(this.overlay=document.createElement("div"),this.overlay.classList.add("btn-menu-overlay"),this.overlay.addEventListener(r.pf,(e=>{(0,o.Z)(e),this.onClick(e)}))),this.overlay&&this.element.parentElement.insertBefore(this.overlay,this.element),n.Z||window.addEventListener("contextmenu",this.onClick,Object.assign(Object.assign({},this.listenerOptions),{once:!0})),document.addEventListener(r.pf,this.onClick,this.listenerOptions),this.dispatchEvent("toggle",!0)}}},5180:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7445);function n(e,t,i){const n=(e=+e)<0,a=s.Z[t];if(!a)throw new Error("CURRENCY_WRAP_INVALID");const o=e/Math.pow(10,a.exp);let r=a.exp;"IRR"==t&&Math.floor(o)==o&&(r=0);let d=function(e,t,i,s){e=(e+"").replace(/[^0-9+\-Ee.]/g,"");var n=isFinite(+e)?+e:0,a=isFinite(+t)?Math.abs(t):0,o=void 0===s?",":s,r=void 0===i?".":i,d="";return d=(a?function(e,t){var i=Math.pow(10,t);return""+Math.round(e*i)/i}(n,a):""+Math.round(n)).split("."),d[0].length>3&&(d[0]=d[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,o)),(d[1]||"").length{"use strict";i.d(t,{Z:()=>n});var s=i(4755);function n({pageX:e,pageY:t},i,n,a){const o=Array.from(i.children).find((e=>e.classList.contains("btn-menu-item")&&!e.classList.contains("hide")))||i,{scrollWidth:r}=o,{scrollHeight:d}=i,l=document.body.getBoundingClientRect(),c=l.width,h=l.height;let u=8,f=8,p=8,m=8;a&&(a.top&&a.top,a.right&&(f+=a.right),a.bottom&&(p+=a.bottom),a.left&&(m+=a.left)),n=s.Z.isMobile?"right":"left";let g="top";const v=h-d-p,b=c-r-f,y=m,w={x:{left:e,right:Math.min(b,e-r)},intermediateX:"right"===n?y:b,y:{top:t,bottom:t-d},intermediateY:v},S={left:w.x.left+r+f<=c,right:w.x.right>=m},C={top:w.y.top+d+p<=h,bottom:w.y.bottom-p>=p};{const e=S[n]?w.x[n]:(n="center",w.intermediateX);i.style.left=e+"px"}{const e=C[g]?w.y[g]:(g="center",w.intermediateY);i.style.top=e+"px"}return i.className=i.className.replace(/(top|center|bottom)-(left|center|right)/g,""),i.classList.add(("center"===g?g:"bottom")+"-"+("center"===n?n:"left"===n?"right":"left")),{width:r,height:d}}},677:(e,t,i)=>{"use strict";i.d(t,{RP:()=>a,X:()=>o});const s=new Set(["all","web","webk"]),n=new Set;function a(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function o(e){return!!a(e)}},3174:(e,t,i)=>{"use strict";i.d(t,{O:()=>o,k:()=>a});var s=i(3512);const n={};function a(e,t,i,s){const a=e.id+"-"+t,o=n[a];return o&&o.width>=i&&o.height>=s}function o(e,t,i){return o=this,r=void 0,l=function*(){const o=e.id+"-"+i,{width:r,height:d}=t;if(a(e,i,r,d))return;const l=n[o]={width:r,height:d},c=yield s.Z.managers.appDocsManager.getLottieCachedThumb(e.id,i);if(n[o]!==l)return;if(c&&c.w>=r&&c.h>=d)return;const h=new Promise((e=>{t.toBlob((t=>e(t)))})),u=yield h;n[o]===l&&s.Z.managers.appDocsManager.saveLottiePreview(e.id,u,r,d,i)},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}},9966:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3035);function n(e){return function(e,t){let i,s=!1;return(...n)=>{i=n,s||(s=!0,e((()=>{s=!1,t(...i)})))}}(s.T2,e)}},8936:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5953);class n{constructor(e){this.loading=!1,this.loaded=!1,(0,s.Z)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then((e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()}),(()=>{this.promise=void 0,this.loading=!1}))))}}},3719:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3781),n=i(2790),a=i(3512),o=i(7625),r=i(1708),d=i(6074),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class c extends d.Z{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{const a=t?0:i;let o=null==e?void 0:e.mid;var d;return void 0===o&&(o=this.searchContext.maxId),t||(d=o,1,o=(0,s.Z)((0,n.Z)(d)+1)),this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:i,backLimit:a})).then((e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(0,r.Z)(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history})))},processItem:t=>l(this,void 0,void 0,(function*(){if((yield this.filterMids([t.mid])).length)return e.processItem(t)}))})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const i=i=>i.peerId===e&&t.has(i.mid),s=(e,t,s)=>{i(e)&&s.splice(t,1)};(0,o.Z)(this.previous,s),(0,o.Z)(this.next,s),this.current&&i(this.current)&&(this.current=void 0,this.onEmptied&&this.onEmptied())},this.onHistoryMultiappend=e=>l(this,void 0,void 0,(function*(){if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;if(e.peerId!==this.searchContext.peerId)return;const t=yield this.filterMids([e.mid]),i=(yield Promise.all(t.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)},null!==(t=this.managers)&&void 0!==t||(this.managers=a.Z.managers),a.Z.addEventListener("history_delete",this.onHistoryDelete),a.Z.addEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.addEventListener("message_sent",this.onMessageSent),e.isInner||(this.otherSideLoader=new c(Object.assign(Object.assign({},e),{isInner:!0})))}filterMids(e){return l(this,void 0,void 0,(function*(){const t=`${this.searchContext.peerId}_${this.searchContext.isScheduled?"scheduled":"history"}`;return yield this.managers.appMessagesManager.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(e){let t=this.previous;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.previous)),t}getNext(e){let t=this.next;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.next)),t}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 i;let s;if(null===(i=this.otherSideLoader)||void 0===i?void 0:i.current){if(s=this.otherSideLoader.goUnsafe(e,t),s.item)return s.item;if(!((e=s.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(s=this.goUnsafe(e,t),!s.item){if(this.loadedAllUp&&this.loadedAllDown)return this.goToOtherEnd(e);this.otherSideLoader&&(e=s.leftLength,s=this.otherSideLoader.goUnsafe(e,t),s.item&&this.unsetCurrent(e>0))}return null==s?void 0:s.item}setLoaded(e,t){var i;const s=super.setLoaded(e,t);if(s&&this.otherSideLoader&&t&&!1!==(null===(i=this.searchContext)||void 0===i?void 0:i.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 s}cleanup(){this.reset(),a.Z.removeEventListener("history_delete",this.onHistoryDelete),a.Z.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0,this.otherSideLoader&&(this.otherSideLoader.cleanup(),this.otherSideLoader=void 0)}}},9674:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(3035),n=i(3725),a=i(410),o=i(8487);const r=new class{constructor(){this.promises={},this.raf=s.T2.bind(null),this.scheduled=!1}do(e,t){let i=this.promises[e];return i||(this.scheduleFlush(),i=this.promises[e]=(0,n.Z)()),void 0!==t&&i.then((()=>t())),i}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const i=(0,o.Z)(e),s=i?this.mutate():Promise.resolve();return void 0!==t&&(i?s.then((()=>t())):t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf((()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}})))}};a.GO&&(a.GO.sequentialDom=r);const d=r},1713:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(1507),n=i(7030),a=i(9405),o=i(3114);function r(e,t,i,r,d=!0,l,c,h){const u=(0,o.Z)(e);let f;h||(h=(0,n.Z)(e,i,r,void 0,c));const p="document"===e._;f=p||u?(0,a.C)(e.w||h.w||512,e.h||h.h||512):(0,a.C)(h.w||100,h.h||100);let m=(0,a.C)(i,r);m=f=f.aspect(m,d);let g=!0;return(!p||["video","gif"].includes(e.type)||u)&&(m.width<200&&m.height<200&&(m=f=f.aspectCovered((0,a.C)(200,200))),l&&(l.message||l.reply_to_mid||l.media.webpage||l.replies&&l.replies.pFlags.comments&&l.replies.channel_id.toChatId()!==s.IA)&&m.width<320&&(m=(0,a.C)(320,m.height),g=!1),g&&m.width<120&&l&&(m=(0,a.C)(120,m.height),g=!1)),t.style.width=m.width+"px",t.style.height=m.height+"px",{photoSize:h,size:f,isFit:g}}},5345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,s:()=>h});var s=i(5003),n=i(6519),a=i(3624),o=i(8631),r=i(5953),d=i(5418),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let c=0;class h{constructor(e){var t;(0,r.Z)(this,e),this.queue=[],null!==(t=this.middlewareHelper)&&void 0!==t||(this.middlewareHelper=(0,a.k)());const i="BATCH-PROCESSOR-"+ ++c;this.log?this.log=this.log.bindPrefix(i):this.log=(0,s.kg)(i)}get queuePromise(){return this.promise}clear(){this.log("clear"),this.queue.length=0,this.promise=void 0,this.middlewareHelper.clean()}addToQueue(e){return this.queue.push(e),this.setQueue()}setQueue(){if(!this.queue.length)return Promise.resolve();if(this.promise)return this.promise;const e=this.middlewareHelper.get(),t=this.log.bindPrefix("queue"),i=(0,o.Z)(e,this.possibleError),s=()=>l(this,void 0,void 0,(function*(){t("start");const e=this.queue.splice(0,this.queue.length),n=performance.now(),a=e.map((e=>(e.then((e=>{t("render item time",performance.now()-n,e)})),e))),o=yield i(Promise.all(a));if(yield i(this.process(o,i,t)),t("queue rendered"),this.queue.length)return t("have new items to render"),s();t("end")}));t("setting pause");const n=this.promise=i((0,d.Z)(0)).then(s,(e=>{throw t("pause has been cleared"),e})).finally((()=>{this.promise===n&&(this.promise=void 0)}));return n}}class u{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),(0,r.Z)(this,e),this.elements=new Map,this.sorted=[],this.middleware=(0,a.k)(),this.batchProcessor=new h({log:this.log,process:(e,t,i)=>l(this,void 0,void 0,(function*(){const i=e.map((e=>this.update(e.id,e)));yield t(Promise.all(i))}))})}clear(){this.batchProcessor.clear(),this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach((e=>{this.update(e.id)})),this.onSort&&this.sorted.forEach(((e,t)=>{this.onSort(e,t)}))}updateList(e){const t=this.middleware.get();this.updateListWith((i=>{if(!t()||void 0!==i&&!i)return e(!1);this._updateList(),e(!0)}))}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e){return l(this,void 0,void 0,(function*(){if(this.get(e))return;const t={id:e,index:0};this.elements.set(e,t);const i=Promise.resolve(this.onElementCreate(t));return this.batchProcessor.addToQueue(i)}))}delete(e,t){const i=this.elements.get(e);if(!i)return!1;this.elements.delete(e);const s=this.sorted.indexOf(i);if(-1!==s&&this.sorted.splice(s,1),this.onDelete)if(t)this.onDelete(i);else{const e=this.middleware.get();this.updateElementWith((()=>{e()&&this.onDelete(i)}))}return!0}update(e,t=this.get(e)){var i;return l(this,void 0,void 0,(function*(){if(!t)return;if(t.index=yield this.getIndex(t),this.get(e)!==t)return;null===(i=this.onUpdate)||void 0===i||i.call(this,t);const s=(0,n.Z)(this.sorted,t,"index");this.onSort(t,s)}))}}},6854:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="\ufeff"},4056:(e,t,i)=>{"use strict";function s(e){return e.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,(e=>"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";")).replace(/([^\#-~| |!])/g,(e=>"&#"+e.charCodeAt(0)+";")).replace(//g,">")}i.d(t,{Z:()=>s})},3738:(e,t,i)=>{"use strict";function s(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}i.d(t,{Z:()=>s})},8456:(e,t,i)=>{"use strict";function s(e,t,i=t+10){return(e=e.trim()).length>i&&(e=e.slice(0,t)+"..."),e}i.d(t,{Z:()=>s})},5157:(e,t,i)=>{"use strict";function s(e,t=!1){const i=parseInt(e+"",10),s=Math.floor(i/3600);let n=Math.floor((i-3600*s)/60),a=i-3600*s-60*n;return s&&(t=!0),n<10&&(n=t?"0"+n:n),a<10&&(a="0"+a),(s?s+":":"")+n+":"+a}i.d(t,{Z:()=>s})},241:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1352);const n=new class{constructor(){if(s.kC)return;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}}},8594:(e,t,i)=>{"use strict";i.d(t,{YW:()=>f,ZP:()=>v,e9:()=>g,gp:()=>m});var s=i(3725),n=i(410),a=i(5418);const o=new(i(3241).Z),r="start",d="end";let l=!1,c=(0,s.Z)(),h=0;c.resolve();const u=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function f(e,t){l||(c=(0,s.Z)(),o.dispatchEvent(r),l=!0,n.ZP&&u("start")),++h,n.ZP&&u("attach promise, length:",h,t);const i=[void 0!==t?(0,a.Z)(t):void 0,e.finally((()=>{}))].filter(Boolean),d=performance.now(),f=c;return Promise.race(i).then((()=>{c!==f||c.isFulfilled||(--h,n.ZP&&u("promise end, length:",h,performance.now()-d),h<=0&&p())})),c}function p(){c.isFulfilled||(l=!1,h=0,o.dispatchEvent(d),c.resolve(),n.ZP&&u("end"))}function m(){p()}function g(){return c}function v(e,t,i){l&&e();const s=i?i.add(o):o.addEventListener.bind(o),n=i?i.removeManual.bind(i,o):o.removeEventListener.bind(o);return s(r,e),s(d,t),()=>{n(d,t),n(r,e)}}window.dispatchHeavyAnimationEvent=f},9893:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AppDialogsManager:()=>qe,DIALOG_LIST_ELEMENT_TAG:()=>Ve,default:()=>Ye});var s=i(9331),n=i(3512),a=i(3003),o=i(6194),r=i(2325),d=i(4668),l=i(8127),c=i(7425),h=i(2464),u=i(2796),f=i(3897),p=i(1483),m=i(3416),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class v{constructor(e){this.managers=e,this.onArchiveClick=()=>g(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getDialogOnly(this.selectedId);e&&this.managers.appMessagesManager.editPeerFolders([e.peerId],+!e.folder_id)})),this.onPinClick=()=>{this.managers.appMessagesManager.toggleDialogPin(this.selectedId,this.filterId).catch((e=>g(this,void 0,void 0,(function*(){if("PINNED_DIALOGS_TOO_MUCH"===e.type)if(this.filterId>=1)(0,u.bC)({langPackKey:"PinFolderLimitReached"});else{const e=yield this.managers.apiManager.getConfig();new l.Z("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{h.ZP.createTab(c.Z).open()}}],descriptionLangKey:"PinToTopLimitReached2",descriptionLangArgs:[(0,r.ag)("Chats",[e.pinned_dialogs_count_max])]}).show()}}))))},this.onUnmuteClick=()=>{this.managers.appMessagesManager.togglePeerMute(this.selectedId,!1)},this.onMuteClick=()=>{new f.Z(this.selectedId)},this.onUnreadClick=()=>g(this,void 0,void 0,(function*(){const e=this.selectedId,t=yield this.managers.appMessagesManager.getDialogOnly(e);t&&(t.unread_count?(this.managers.appMessagesManager.readHistory(e,t.top_message),this.managers.appMessagesManager.markDialogUnread(e,!0)):this.managers.appMessagesManager.markDialogUnread(e))})),this.onDeleteClick=()=>{new o.Z(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=(0,d.Z)(e.target,Ve)}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{g(this,void 0,void 0,(function*(){this.filterId=Ye.filterId,this.selectedId=t.dataset.peerId.toPeerId(),this.dialog=yield this.managers.appMessagesManager.getDialogOnly(this.selectedId),yield Promise.all(this.buttons.map((e=>g(this,void 0,void 0,(function*(){const t=yield e.verify();e.element.classList.toggle("hide",!t)}))))),this.buttons[this.buttons.length-1].element.lastChild.replaceWith((0,r.ag)(yield this.managers.appPeersManager.getDeleteButtonText(this.selectedId))),t.classList.add("menu-open"),(0,p.Z)(e,this.element),m.Z.openBtnMenu(this.element,(()=>{t.classList.remove("menu-open"),this.selectedId=this.dialog=this.filterId=void 0}))}))})()}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>g(this,void 0,void 0,(function*(){return!(yield this.managers.appMessagesManager.isDialogUnread(this.dialog))}))},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>this.managers.appMessagesManager.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>g(this,void 0,void 0,(function*(){var e;return!(this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}))},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>g(this,void 0,void 0,(function*(){var e;return this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}))},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>g(this,void 0,void 0,(function*(){return this.selectedId!==n.Z.myId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>g(this,void 0,void 0,(function*(){return this.selectedId!==n.Z.myId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId))}))},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.selectedId!==n.Z.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.selectedId!==n.Z.myId},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!0}],this.element=(0,a.Z)(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var b=i(6008),y=i(1405),w=i(8805),S=i(632),C=i(4762),L=i(5003),E=i(4846),I=i(4494),M=i(9099),P=i(410),Z=i(8842),k=i(1447),T=i(9492),x=i(534),A=i(2738),_=i(4484),F=i(5565),D=i(4159),R=i(3442),B=i(7487),N=i(9174),O=i(3910),U=i(490);class H{constructor(e,t){this.managers=e,this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=e=>{Promise.all([B.Z.get("dc"),n.Z.managers.rootScope.getConnectionStatus()]).then((([t,i])=>{t||(t=D.Z.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const s=i["NET-"+t],n=s&&(e||s.status)===N.Q.Connected;this.connecting&&n&&this.managers.apiUpdatesManager.forceGetDifference(),n&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=s&&(e||s.status)===N.Q.TimedOut,this.connecting=!n,this.retryAt=s&&s.retryAt,P.ZP&&this.log("connecting",this.connecting),this.setState()}))},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,(0,F.Z)(this.statusEl,(0,r.ag)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{if(U.Z.deactivatedReason)return;const e=H.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",(()=>this.managers.networkerFactory.forceReconnect()));this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,i=()=>{const i=Date.now();e.innerText=""+Math.round((t-i)/1e3),i>t&&clearInterval(s)},s=setInterval(i,1e3);i();const n=this.getA("ConnectionStatus.Reconnect",(()=>this.managers.networkerFactory.forceReconnectTimeout()));this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");P.ZP&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame((()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout),this.setStateTimeout=window.setTimeout((()=>{(0,M.Z)(this.statusContainer,"is-shown",this.connecting||this.updating,200),this.setStateTimeout=0,P.ZP&&this.log("setState: isShown:",this.connecting||this.updating)}),e)}))},this.log=(0,L.kg)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=(0,I.Z)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new R.Z({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),t.prepend(this.statusContainer),n.Z.addEventListener("connection_status_change",(e=>{this.setConnectionStatus()})),n.Z.addEventListener("state_synchronizing",(e=>{e||(this.updating=!0,P.ZP&&this.log("updating",this.updating),this.setState())})),n.Z.addEventListener("state_synchronized",(e=>{P.ZP&&this.log("state_synchronized",e),e||(this.updating=!1,P.ZP&&this.log("updating",this.updating),this.setState())})),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,H.CHANGE_STATE_DELAY+1e3)}getA(e,t){const i=document.createElement("a");return i.classList.add("force-reconnect"),i.append((0,r.ag)(e)),(0,A.fc)(i,(e=>{(0,O.Z)(e),t()})),i}}H.CHANGE_STATE_DELAY=1e3;var z,j=i(6740),G=i(3035),V=i(2894),K=i(5432),W=i(1154),$=i(241),q=i(8487);!function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(z||(z={}));var Q=i(5345),Y=i(5701),J=i(1507),X=i(5296),ee=i(8222);function te(e,t,i,s){return e>=s?t+i:function(e,t){return-t/2*(Math.cos(Math.PI*e)-1)}(e/s,i)+t}var ie=i(4755);function se(e,t,i,s,n,a,o,r){const d=e.canvas.dpr;if(d&&(t*=d,i*=d,s*=d,n*=d),"number"==typeof a)d&&(a*=d),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]?d?a[t]*d:a[t]:e[t]}e.beginPath(),e.moveTo(t+a.tl,i),e.lineTo(t+s-a.tr,i),e.quadraticCurveTo(t+s,i,t+s,i+a.tr),e.lineTo(t+s,i+n-a.br),e.quadraticCurveTo(t+s,i+n,t+s-a.br,i+n),e.lineTo(t+a.bl,i+n),e.quadraticCurveTo(t,i+n,t,i+n-a.bl),e.lineTo(t,i+a.tl),e.quadraticCurveTo(t,i,t+a.tl,i),e.closePath(),o&&e.fill(),r&&e.stroke()}const ne=window.devicePixelRatio,ae=20*ne,oe=2.5*ne,re=2*ne,de=1*ne;var le=i(6818),ce=i(9818),he=i(3013),ue=i(130),fe=i(4332),pe=i(1168),me=i(7030),ge=i(8115),ve=i(496),be=i(5381),ye=i(7530),we=i(2291),Se=i(5772),Ce=i(3385),Le=i(2554),Ee=i(8050),Ie=i(6976),Me=i(3725),Pe=i(7362),Ze=i(8631),ke=i(2312),Te=i(2059),xe=i(2493),Ae=i(319);var _e=i(3228);class Fe{constructor(){this.font="30pt Helvetica",this.currTime=Date.now(),this.diffTime=0,this.spread=0,this.paused=!1,this.pausedTime=0,this.pauseInterval=850,this.lightSource=0,this.inc=.032,this.lightSpread=.55,this.animations=["slide","slide","slide","slide"],this.currentAnimationIndex=0}keepTime(){this.diffTime=Date.now()-this.currTime,this.currTime=Date.now()}cycleAnimation(){++this.currentAnimationIndex,this.currentAnimationIndex>=this.animations.length&&(this.currentAnimationIndex=0)}animate(){const e=this.animations[this.currentAnimationIndex];return"glow"===e?this.animateGlow():"slide"===e?this.animateSlide():void console.log("unknown animation type: "+String(e))}animateGlow(){var e=68;return()=>{var t=this.diffTime/(1e3/60)*10;return this.paused?Date.now()-this.pausedTime>800&&(e=68,this.cycleAnimation(),this.paused=!1):(e=parseInt(""+(e+t)))>=255&&(this.paused=!0,this.pausedTime=Date.now()),"rgb("+e+","+e+","+e+")"}}animateSlide(){var e,t,i,s=this.ctx.createLinearGradient(0,0,this.canvas.width,0),n=this.inc*(this.diffTime/(1e3/60));if(this.paused){if(Date.now()-this.pausedTime>this.pauseInterval)return this.lightSource=-.6,this.cycleAnimation(),this.paused=!1,this.animateSlide()}else this.lightSource+=n,this.lightSource>1+this.lightSpread&&(this.paused=!0,this.pausedTime=Date.now());i=(0,_e.Z)(this.lightSource,0,1),e=(0,_e.Z)(this.lightSource-this.lightSpread,0,1),t=(0,_e.Z)(this.lightSource+this.lightSpread,0,1);const a=ee.Z.getProperty("background-color-true"),o=ee.Z.getProperty("surface-color");return s.addColorStop(e,a),s.addColorStop(i,o),s.addColorStop(t,a),s}settings(e={}){var t,i,s,n,a,o;this.canvas=null!==(t=e.canvas)&&void 0!==t?t:document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.font=null!==(i=e.font)&&void 0!==i?i:this.font,this.lightSpread=null!==(s=e.lightSpread)&&void 0!==s?s:this.lightSpread,this.inc=null!==(n=e.inc)&&void 0!==n?n:this.inc,this.animations=null!==(a=e.animations)&&void 0!==a?a:this.animations,this.text=null!==(o=e.text)&&void 0!==o?o:this.text,this.fillStyle=e.fillStyle,this.canvas.classList.add("shimmer-canvas")}on(){const{width:e,height:t}=this.canvas;this.keepTime(),this.ctx.clearRect(0,0,e,t),this.font&&(this.ctx.font=this.font),this.ctx.fillStyle=this.animate(),this.ctx.fillRect(0,0,e,t),this.fillStyle&&(this.ctx.fillStyle=this.fillStyle,this.ctx.fillRect(0,0,e,t)),this.text&&this.ctx.fillText(this.text,50,50)}}class De{constructor(){this.onThemeChange=()=>{this.stopAnimation(),this.startAnimation()},this.onResize=()=>{const{canvas:e}=this,{width:t,height:i,dpr:s}=e;this.updateCanvasSize(),e.width===t&&e.height===i&&e.dpr===s||(this.stopAnimation(),this.startAnimation())},this.shimmer=new Fe,this.tempId=0,this.canvas=document.createElement("canvas"),this.canvas.classList.add("dialogs-placeholder-canvas"),this.ctx=this.canvas.getContext("2d"),this.generatedValues=[],this.avatarSize=54,this.marginVertical=9,this.lineHeight=10,this.lineBorderRadius=6,this.lineMarginVertical=8,this.statusWidth=24}attach({container:e,rect:t,getRectFrom:i,onRemove:s,blockScrollable:n}){const{canvas:a}=this;this.onRemove=s,this.getRectFrom=i||e,(this.blockScrollable=n)&&(n.container.style.overflowY="hidden"),this.updateCanvasSize(t),this.startAnimation(),e.append(a)}detach(e){this.detachTime||(this.availableLength=e,this.detachTime=Date.now(),n.Z.settings.animationsEnabled||this.remove())}remove(){this.stopAnimation(),this.canvas.parentElement&&(this.canvas.remove(),this.onRemove&&(this.onRemove(),this.onRemove=void 0),this.blockScrollable&&(this.blockScrollable.container.style.overflowY="",this.blockScrollable=void 0))}updateCanvasSize(e=this.getRectFrom.getBoundingClientRect()){const{canvas:t}=this,i=t.dpr=window.devicePixelRatio;t.width=e.width*i,t.height=e.height*i,t.style.width=e.width+"px",t.style.height=e.height+"px"}renderDetachAnimationFrame(){const{canvas:e,ctx:t,detachTime:i,length:s,availableLength:a}=this;if(!i)return;if(!n.Z.settings.animationsEnabled)return void this.remove();const{width:o}=e;t.globalCompositeOperation="destination-out";const r=Date.now()-i;let d=!0;for(let e=0;e=a?15*(a-1):15*e);if(i<=0){d=!1;continue}const n=te(i,0,1,150);t.beginPath(),t.rect(0,this.dialogHeight*e,o,this.dialogHeight),t.fillStyle=`rgba(0, 0, 0, ${n})`,t.fill(),n<1&&(d=!1)}t.globalCompositeOperation="source-over",d&&this.remove()}renderFrame(){this.shimmer.on(),this.renderDetachAnimationFrame()}startAnimation(){const{canvas:e,shimmer:t}=this,i=++this.tempId,s=this.createPattern();t.settings({canvas:e,fillStyle:s});const a=()=>this.tempId===i;this.renderFrame(),(0,X.jt)((()=>!!a()&&(n.Z.settings.animationsEnabled&&this.renderFrame(),a()))),n.Z.addEventListener("theme_change",this.onThemeChange),ie.Z.addEventListener("resize",this.onResize)}stopAnimation(){++this.tempId,n.Z.removeEventListener("theme_change",this.onThemeChange),ie.Z.removeEventListener("resize",this.onResize)}createPattern(){const{canvas:e,ctx:t}=this,i=document.createElement("canvas"),s=i.getContext("2d"),n=e.dpr;i.dpr=n,i.width=e.width,i.height=e.height,s.fillStyle=ee.Z.getProperty("surface-color"),s.fillRect(0,0,i.width,i.height),s.fillStyle="#000",s.globalCompositeOperation="destination-out";const a=this.dialogHeight=(this.avatarSize+2*this.marginVertical)*n,o=this.length=Math.ceil(e.height/a);for(let e=0;e{})).finally((()=>{e[t]===s&&delete e[t]}));const n=(0,Ze.Z)((()=>e[t]===s));return{deferred:s,middleware:n}}class We extends Q.Z{constructor(e,t,i,s,n){super({getIndex:t=>e.dialogsStorage.getDialogIndex(t.id,this.indexKey),onDelete:e=>{var t;e.dom.listEl.remove(),null===(t=this.onListLengthChange)||void 0===t||t.call(this)},onSort:(e,t)=>{var i;const s=e.dom.listEl.parentElement!==this.list;(0,_.Z)(e.dom.listEl,this.list,t),s&&(null===(i=this.onListLengthChange)||void 0===i||i.call(this))},onElementCreate:e=>Ge(this,void 0,void 0,(function*(){const t=[],{dom:i}=Qe.addListDialog({peerId:e.id,loadPromises:t,isBatch:!0});return e.dom=i,yield Promise.all(t),e})),updateElementWith:G.TR,log:t}),this.managers=e,this.list=i,this.indexKey=s,this.onListLengthChange=n}clear(){this.list.replaceChildren(),super.clear()}}class $e extends je.ZP{constructor({peerId:e,rippleEnabled:t=!0,onlyFirstName:i=!1,meAsSaved:n=!0,avatarSize:a="bigger",autonomous:o,lazyLoadQueue:r,loadPromises:d,fromName:l,noIcons:c}){var h;super({clickable:!0,noRipple:!t,havePadding:!0,title:!0,titleRightSecondary:!0,subtitle:!0,subtitleRight:!0,noWrap:!0,asLink:!0});const u=new s.Z,f={bigger:54,abitbigger:42,small:32}[a];u.classList.add("dialog-avatar","avatar-"+f),u.updateWithOptions({loadPromises:d,lazyLoadQueue:r,isDialog:!!n,peerId:e,peerTitle:l});const p=this.container,m=this.title;m.classList.add("user-title"),this.titleRow.classList.add("dialog-title");const g=new Z.Z,v=g.update({peerId:e,fromName:l,dialog:n,onlyFirstName:i,plainText:!1,withIcons:!c});null==d||d.push(v),m.append(g.element),m.classList.add("tgico");const b=this.subtitle,y=this.container;y.classList.add("chatlist-chat","chatlist-chat-"+a),o||(y.href="#"+e),"bigger"===a?this.container.classList.add("row-big"):"small"===a&&this.container.classList.add("row-small"),this.applyMediaElement(u,a),y.dataset.peerId=""+e;const w=document.createElement("span");w.classList.add("message-status","sending-status");const S=document.createElement("span");S.classList.add("message-time");const C=document.createElement("div");C.className="dialog-subtitle-badge badge badge-22";const L=this.titleRight;L.classList.add("dialog-title-details"),L.append(w,S),this.subtitleRow.classList.add("dialog-subtitle");const I=this.dom={avatarEl:u,captionDiv:p,titleSpan:g.element,titleSpanContainer:m,statusSpan:w,lastTimeSpan:S,unreadBadge:C,lastMessageSpan:b,containerEl:y,listEl:y,subtitleEl:this.subtitleRow};o||(y.dialogDom=I,(null===(h=E.Z.chat)||void 0===h?void 0:h.peerId)===e&&Qe.setDialogActive(y,!0))}}class qe{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.scroll=null,this.log=(0,L.kg)("DIALOGS",L.v9.Log|L.v9.Error|L.v9.Warn|L.v9.Debug),this.placeholders={},this.sortedLists={},this.scrollables={},this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.offsets={top:0,bottom:0},this.initedListeners=!1,this.loadedDialogsAtLeastOnce=!1,this.onTabChange=()=>(this.scroll=this.scrollables[this.filterId],this.scroll.loadedAll.top=!0,this.scroll.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0,this.sortedList=this.sortedLists[this.filterId],this.onChatsScroll()),this._onListLengthChange=()=>{if(!this.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId!==J.J$)return;const e=this.chatList,t=e.childElementCount,i=e.parentElement.parentElement,s=e.parentElement.nextElementSibling,n=!!s.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;i.classList.add("with-contacts");const a=new h.dw({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),this.managers.appUsersManager.getContactsPeerIds(void 0,void 0,"online").then((e=>{let t=!1;const i=()=>{t&&a.container.classList.toggle("hide",!s.list.childElementCount),this.updateContactsLength(!0)},s=new V.Z({avatarSize:"abitbigger",createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:i,managers:this.managers});this.loadContacts=()=>{const t=$.Z.height/60|0;(0,Ne.Z)(e.splice(0,t),this.verifyPeerIdForContacts).then((e=>{e.forEach((e=>{s.add(e)}))})),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>Ge(this,void 0,void 0,(function*(){if(e.isAnyChat())return;const t=yield this.verifyPeerIdForContacts(e),i=s.has(e);!i&&t?s.add(e):i&&!t&&s.delete(e)}));const n=s.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,i()})),s.append(a.container)},this.verifyPeerIdForContacts=e=>Ge(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.appPeersManager.isContact(e),this.managers.appMessagesManager.getDialogOnly(e)]);return t&&!i})),this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout((()=>{this.sliceTimeout=void 0,this.chatList.childElementCount&&!this.processContact&&(0,G.TR)((()=>{const e=performance.now(),t=this.scroll.scrollTop,i=this.chatList.firstElementChild,s=this.scroll.container.getBoundingClientRect(),n=i.getBoundingClientRect(),a=Array.from(this.scroll.splitUp.children);let o=this.scroll.splitUp.offsetTop;o&&t{const t=e.dataset.peerId.toPeerId();this.deleteDialog(t)})),this.setOffsets(),this.scroll.scrollTop=c.offsetTop-u,this.log("slice time",performance.now()-e)}))}),200)},this.onChatsScrollTop=()=>this.onChatsScroll("top"),this.onChatsScroll=(e="bottom")=>(this.scroll.loadedAll[e]&&this.loadContacts&&this.loadContacts(),this.log("onChatsScroll",e),this.loadDialogs(e))}start(){const e=this.managers=(0,Le.Z)();this.contextMenu=new v(e),this.stateMiddlewareHelper=new He.A,this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=(0,Y.Z)(this._onListLengthChange,100,!1,!0);const t=document.createElement("div");t.classList.add("connection-status-bottom"),t.append(this.folders.container),K.Z&&(0,W.Z)({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e>0?t+1:t-1)}}),this.allChatsIntlElement=new r.ZP.IntlElement({key:"FilterAllChatsShort"}),n.Z.addEventListener("premium_toggle",(e=>Ge(this,void 0,void 0,(function*(){e||(yield this.managers.filtersStorage.isFilterIdAvailable(this.filterId))||s((0,Ue.Z)(this.filtersRendered[J.J$].menu),!1)})))),n.Z.addEventListener("state_cleared",(()=>{const e=J.DZ.has(this.filterId);Be.Z.getState().then((t=>Ge(this,void 0,void 0,(function*(){this.loadedDialogsAtLeastOnce=!1,this.showFiltersPromise=void 0,e&&(this.sortedList.clear(),this.onTabChange()),this.onStateLoaded(t)}))))})),this.setFilterId(J.J$,J.J$),this.addFilter({id:J.J$,title:"",localId:J.J$});const i=new w.v7(this.folders.menuScrollContainer);t.prepend(this.folders.menuScrollContainer);const s=this.selectTab=(0,b.X)(this.folders.menu,this.folders.container,((e,t)=>Ge(this,void 0,void 0,(function*(){const i=e;if(e=+t.dataset.filterId||J.J$,-1!==this.filterId&&!J.DZ.has(e)&&!(yield this.managers.filtersStorage.isFilterIdAvailable(e)))return!1;const n=this.filterId;if(C.IS_MOBILE_SAFARI||(i?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{s(0),this.filtersNavigationItem=void 0}},ce.Z.spliceItems(1,0,this.filtersNavigationItem)):this.filtersNavigationItem&&(ce.Z.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),n===e)return;this.sortedLists[e].clear();const a=this.setFilterIdAndChangeTab(e).then((({cached:e,renderPromise:t})=>{if(e)return t}));return-1!==n?a:void 0}))),(()=>{for(const e in this.sortedLists)if(+e!==this.filterId){this.sortedLists[e].clear();const t=this.placeholders[e];t&&t.remove()}}),void 0,i);Be.Z.getState().then((e=>(he.Z.setPlaybackParams(e.playbackParams),he.Z.addEventListener("playbackParams",(e=>{this.managers.appStateManager.pushToState("playbackParams",e)})),this.onStateLoaded(e)))),ie.Z.addEventListener("resize",(()=>{this.changeFiltersAllChatsKey()})),new H(this.managers,this.chatsContainer),this.chatsContainer.append(t),setTimeout((()=>{k.Z.loadLottieWorkers()}),200),pe.Z.MANAGERS=n.Z.managers=e,ke.Z.construct(e),h.ZP.construct(e),fe.ZP.construct(e),Te.ZP.construct(e),xe.Z.construct(e),E.Z.construct(e),this.sortedList=this.sortedLists[this.filterId],this.scroll=this.scrollables[this.filterId]}get chatList(){return this.sortedList.list}setFilterId(e,t){this.filterId=e,this.indexKey=(0,Ce.Z)(J.DZ.has(e)?e:t)}setFilterIdAndChangeTab(e){return Ge(this,void 0,void 0,(function*(){return this.filterId=e,this.indexKey=yield this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),this.onTabChange()}))}setOnlineStatus(e,t){const i="is-online",s=e.classList.contains(i);!s&&t&&e.classList.add(i),(0,M.Z)(e,"is-visible",t,250,t?void 0:()=>{e.classList.remove(i)},t&&!s?2:0)}initListeners(){n.Z.addEventListener("user_update",(e=>Ge(this,void 0,void 0,(function*(){var t;const i=e.toPeerId(),s=this.getDialogDom(i);if(s&&i!==n.Z.myId&&!(yield this.managers.appUsersManager.isBot(e))){const i="userStatusOnline"===(null===(t=(yield this.managers.appUsersManager.getUser(e)).status)||void 0===t?void 0:t._);this.setOnlineStatus(s.avatarEl,i)}})))),n.Z.addEventListener("chat_update",(e=>Ge(this,void 0,void 0,(function*(){const t=e.toPeerId(!0),i=yield this.managers.appMessagesManager.getDialogOnly(t);i&&this.processDialogForCallStatus(i)})))),n.Z.addEventListener("folder_unread",(e=>{this.setFilterUnreadCount(e.id)})),n.Z.addEventListener("contacts_update",(e=>{var t;null===(t=this.processContact)||void 0===t||t.call(this,e.toPeerId())})),n.Z.addEventListener("dialog_flush",(({dialog:e})=>{e&&(this.setLastMessageN({dialog:e,setUnread:!0}),this.validateDialogForFilter(e),this.setFiltersUnreadCount())})),n.Z.addEventListener("dialogs_multiupdate",(e=>{var t;for(const[i,s]of e)this.updateDialog(s),null===(t=this.processContact)||void 0===t||t.call(this,i.toPeerId()),this.validateDialogForFilter(s)})),n.Z.addEventListener("dialog_drop",(({peerId:e})=>{var t;this.deleteDialog(e),null===(t=this.processContact)||void 0===t||t.call(this,e)})),n.Z.addEventListener("dialog_unread",(({dialog:e})=>{e&&(this.setUnreadMessagesN({dialog:e}),this.validateDialogForFilter(e))})),n.Z.addEventListener("dialog_notify_settings",(e=>{this.validateDialogForFilter(e),this.setUnreadMessagesN({dialog:e})})),n.Z.addEventListener("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{var s;t?this.sortedList.delete(i):this.updateDialog(e),null===(s=this.processContact)||void 0===s||s.call(this,i)})),E.Z.addEventListener("peer_changed",(e=>{for(const t of this.lastActiveElements)t.dataset.peerId.toPeerId()!==e&&this.setDialogActive(t,!1);Array.from(document.querySelectorAll(`[data-autonomous="0"] .chatlist-chat[data-peer-id="${e}"]`)).forEach((e=>{this.setDialogActive(e,!0)}))})),n.Z.addEventListener("filter_update",(e=>Ge(this,void 0,void 0,(function*(){if(J.DZ.has(e.id))return;if(!this.filtersRendered[e.id])return void this.addFilter(e);if(e.id===this.filterId){const e=yield this.managers.dialogsStorage.getCachedDialogs(!0);yield this.validateListForFilter();for(let t=0,i=e.length;t{const t=this.filtersRendered[e.id];t&&(t.container.remove(),t.menu.remove(),delete this.sortedLists[e.id],delete this.scrollables[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange(),this.filterId===e.id&&this.selectTab(0,!1))})),n.Z.addEventListener("filter_order",(e=>Ge(this,void 0,void 0,(function*(){e=e.slice(),(0,Oe.Z)(e,J.Zi);const t=this.folders.menu,i=yield Promise.all(e.map((e=>Ge(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),this.managers.filtersStorage.getFilter(e)]);return{indexKey:t,filter:i}})))));e.forEach(((e,s)=>{const{indexKey:n,filter:a}=i[s],o=this.filtersRendered[e];this.sortedLists[e].indexKey=n,(0,_.Z)(o.menu,t,a.localId),(0,_.Z)(o.container,this.folders.container,a.localId)})),this.indexKey=yield this.managers.dialogsStorage.getDialogIndexKeyByFilterId(this.filterId)})))),n.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>Ge(this,void 0,void 0,(function*(){const i=yield this.managers.appMessagesManager.getDialogOnly(e);i&&(t.length?this.setTyping(i):this.unsetTyping(i))}))))}setDialogActive(e,t){const i=e.dialogDom;e.classList.toggle("active",t),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==i?void 0:i.callIcon)&&i.callIcon.setActive(t)}onStateLoaded(e){return Ge(this,void 0,void 0,(function*(){this.stateMiddlewareHelper.clean();const t=this.stateMiddlewareHelper.get(),i=e.filtersArr,s=i.length>J.DZ.size,n=e=>{for(const t of e)this.addFilter(t)};let a;s?n(i):a=this.managers.filtersStorage.getDialogFilters().then(n),this.doNotRenderChatList=!0;const o=this.onChatsScroll(),r=(0,Ze.Z)(t);try{yield r(o)}catch(e){}s||this.selectTab(0,!1),a&&(yield r(a)),this.doNotRenderChatList=void 0,this.filterId=-1,this.selectTab(0,!1),this.initedListeners||(this.initListeners(),this.initedListeners=!0),s&&this.showFiltersPromise&&(yield r(this.showFiltersPromise)),this.managers.appNotificationsManager.getNotifyPeerTypeSettings(),yield(yield r(o)).renderPromise.catch(Ae.Z),this.managers.appMessagesManager.fillConversations()}))}getOffsetIndex(e){return{index:this.scroll.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){if(void 0!==e.migratedTo||!this.testDialogForFilter(e))return!1;const t=this.getOffsetIndex("top"),i=this.getOffsetIndex("bottom");if(!t.index&&!i.index)return!0;const s=(0,Ee.Z)(e,this.indexKey);return(!t.index||s<=t.index)&&(!i.index||s>=i.index)}deleteDialog(e){this.sortedList.delete(e)}updateDialog(e){if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e.peerId);if(!this.sortedList.has(e.peerId)&&this.loadedDialogsAtLeastOnce)return void this.sortedList.add(e.peerId);const t=this.getDialogDom(e.peerId);t&&(this.setLastMessageN({dialog:e,dom:t,setUnread:!0}),this.sortedList.update(e.peerId))}setFilterUnreadCount(e){var t;return Ge(this,void 0,void 0,(function*(){const i=null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!i)return;const{unreadUnmutedCount:s,unreadCount:n}=yield this.managers.dialogsStorage.getFolderUnreadCount(e);i.classList.toggle("badge-gray",!s);const a=e===J.J$?s:n;i.innerText=a?""+a:""}))}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}validateListForFilter(){return Ge(this,void 0,void 0,(function*(){this.sortedList.getAll().forEach((e=>Ge(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getDialogOnly(e.id);this.testDialogForFilter(t)||this.deleteDialog(e.id)}))))}))}validateDialogForFilter(e){this.getDialogDom(e.peerId)&&(this.testDialogForFilter(e)||this.deleteDialog(e.peerId))}testDialogForFilter(e){return!(!e||(J.DZ.has(this.filterId)?this.filterId!==e.folder_id:void 0===(0,Ee.Z)(e,this.indexKey)))}generateScrollable(e,t){const i=t.id,s=new w.ZP(null,"CL",500);s.container.addEventListener("scroll",this.onChatsRegularScroll),s.container.dataset.filterId=""+i,s.onScrolledTop=this.onChatsScrollTop,s.onScrolledBottom=this.onChatsScroll,s.setVirtualContainer(e);const n=new We(this.managers,this.log,e,(0,Ce.Z)(t.localId),this.onListLengthChange);return this.scrollables[i]=s,this.sortedLists[i]=n,s}addFilter(e){if(e.id===J.Zi)return;const t=this.folders.menu,i=this.filtersRendered[e.id];if(i)return(0,_.Z)(i.menu,t,e.localId),void(0,_.Z)(i.container,this.folders.container,e.localId);const s=document.createElement("div");s.classList.add("menu-horizontal-div-item");const n=document.createElement("span"),a=document.createElement("span");a.classList.add("text-super"),e.id===J.J$?a.append(this.allChatsIntlElement.element):(0,ue.Z)(a,(0,ge.Z)(e.title));const o=document.createElement("div");o.classList.add("badge","badge-20","badge-primary");const r=document.createElement("i");n.append(a,o,r),(0,y.Z)(s),s.append(n),s.dataset.filterId=""+e.id,(0,_.Z)(s,t,e.localId);const d=this.createChatList(),l=this.generateScrollable(d,e);l.container.classList.add("tabs-tab","chatlist-parts");const c=document.createElement("div");c.classList.add("chatlist-top");const h=document.createElement("div");h.classList.add("chatlist-bottom"),c.append(d),l.container.append(c,h);const u=l.container;(0,_.Z)(l.container,this.folders.container,e.localId),this.setListClickListener(d,null,!0),this.filtersRendered[e.id]={menu:s,container:u,unread:o,title:a},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){let e=this.showFiltersPromise;return null!=e?e:e=this.showFiltersPromise=(0,Re.Z)(0).then((()=>{if(this.showFiltersPromise!==e)return;const t=Object.keys(this.filtersRendered).length>1,i=!this.folders.menuScrollContainer.classList.contains("hide");t!==i&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!i&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0}))}loadDialogs(e){const t=this.log.bindPrefix("load-"+(i=1e3,s=9999,i=Math.ceil(i),s=Math.floor(s),Math.floor(Math.random()*(s-i+1))+i));var i,s;if(t("try",e),this.loadDialogsPromise||this.loadDialogsRenderPromise)return this.loadDialogsPromise;if(this.scroll.loadedAll[e])return Promise.resolve({cached:!0,renderPromise:Promise.resolve()});t.warn("start",e);const n=(0,ze.Z)("MIDDLEWARE"),a=(0,Me.Z)(),o=new Promise(((i,s)=>Ge(this,void 0,void 0,(function*(){const{chatList:r,filterId:d,indexKey:l}=this;let c=$.Z.height/72*1.25|0,h=0;const u=this.doNotRenderChatList,{index:f}=this.getOffsetIndex(e);if(f)if("top"===e){const e=yield this.managers.dialogsStorage.getFolderDialogs(d,!0),t=e.findIndex((e=>(0,Ee.Z)(e,l)<=f)),i=Math.max(0,t-c);c=t-i,h=(0,Ee.Z)(e[i],l)+1}else h=f;let p=this.placeholders[d];try{const i=this.managers.acknowledged.appMessagesManager.getConversations("",h,c,d,!0);if(!(r.childElementCount||p||this.loadedDialogsAtLeastOnce&&(yield i).cached)){p=this.placeholders[d]=new De;const e=d===J.Zi?this.chatsContainer:this.folders.container;p.attach({container:r.parentElement,getRectFrom:e,onRemove:()=>{delete this.placeholders[d]},blockScrollable:this.scroll}),a.resolve(!1)}const s=yield i,f=yield s.result;if(this.loadDialogsRenderPromise!==o||u)throw n;a.resolve(s.cached),"bottom"===e?f.isEnd&&(this.scroll.loadedAll[e]=!0):f.isTopEnd&&(this.scroll.loadedAll[e]=!0);const m=f.dialogs.length;if(t(`will render ${m} dialogs`),m){const t=("top"===e?f.dialogs.slice().reverse():f.dialogs).map((e=>this.sortedList.add(e.peerId)));if(yield Promise.all(t).catch(),this.loadDialogsRenderPromise!==o)throw n}const g=f.dialogs["top"===e?0:m-1];g&&(this.offsets[e]=(0,Ee.Z)(g,l)),this.loadedDialogsAtLeastOnce=!0,this.onListLengthChange(),t("getDialogs "+c+" dialogs by offset:",h,f,r.childElementCount),setTimeout((()=>{this.scroll.onScroll()}),0),p&&p.detach(r.childElementCount)}catch(e){return"MIDDLEWARE"!==(null==e?void 0:e.type)&&t.error(e),s(e),void a.reject(e)}i()})))).finally((()=>{this.loadDialogsRenderPromise===o?(t("end"),this.loadDialogsRenderPromise=void 0):t("has been cleared")}));this.loadDialogsRenderPromise=o;const r=this.loadDialogsPromise=a.then((e=>({cached:e,renderPromise:o}))).finally((()=>{this.loadDialogsPromise===r&&(this.loadDialogsPromise=void 0)}));return r}generateEmptyPlaceholder(e){const t="empty-placeholder",i=document.createElement("div");i.classList.add(t,t+"-"+e.classNameType);const s=document.createElement("div");s.classList.add(t+"-header"),(0,r.$d)(s,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&(0,r.$d)(n,e.subtitle,e.subtitleArgs),i.append(s,n),{container:i,header:s,subtitle:n}}checkIfPlaceholderNeeded(){if(this.filterId===J.Zi)return;const e=this.chatList,t=e.parentElement;let i=Array.from(t.children).find((e=>e.matches(".empty-placeholder")));const s=this.scroll.loadedAll.bottom&&!e.childElementCount;if(s&&i)return;if(!s)return void(i&&(t.classList.remove("with-placeholder"),i.remove()));let n,a;if(this.filterId){n=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:a="folder"}),i=n.container;const e=document.createElement("div"),t="📂",s=128;(0,Se.Z)({div:e,emoji:t,width:s,height:s}),i.prepend(e);const o=(0,I.Z)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});(0,A.fc)(o,(()=>Ge(this,void 0,void 0,(function*(){h.ZP.createTab(x.Z).open(yield this.managers.filtersStorage.getFilter(this.filterId))})))),i.append(o)}else{n=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:a="dialogs"}),i=n.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new r.ZP.IntlElement({element:n.subtitle}),Promise.all([this.updateContactsLength(!1),(0,j.cj)(e,"assets/img/EmptyChats.svg"),(0,G.AD)()]).then((([e])=>{i.classList.add("visible"),t.classList.toggle("has-contacts",!!e)})),i.prepend(e)}t.append(i),t.classList.add("with-placeholder"),t.dataset.placeholderType=a}updateContactsLength(e){var t;return null!==(t=this.updateContactsLengthPromise)&&void 0!==t?t:this.updateContactsLengthPromise=this.managers.appUsersManager.getContacts().then((t=>{const i=this.emptyDialogsPlaceholderSubtitle;if(i){let e,s;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",s=[(0,r.ag)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",s=[]),i.compareAndUpdate({key:e,args:s})}return e&&this.chatList.parentElement.classList.toggle("has-contacts",!!t.length),this.updateContactsLengthPromise=void 0,t.length}))}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,i=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),i.replaceChildren(),this.loadContacts=void 0,this.processContact=void 0}setOffsets(){return Ge(this,void 0,void 0,(function*(){const e=this.chatList,t=yield this.getDialogFromElement(e.firstElementChild),i=yield this.getDialogFromElement(e.lastElementChild),s=this.indexKey;this.offsets.top=(0,Ee.Z)(t,s),this.offsets.bottom=(0,Ee.Z)(i,s)}))}getDialogFromElement(e){return this.managers.appMessagesManager.getDialogOnly(e.dataset.peerId.toPeerId())}setListClickListener(e,t,i=!1,s=!1,n=!1){let a;const o=(n?E.Z.setInnerPeer:E.Z.setPeer).bind(E.Z);e.dataset.autonomous=""+ +s,e.addEventListener("mousedown",(e=>{if(0!==e.button)return;this.log("dialogs click list");const i=e.target,n=(0,d.Z)(i,Ve);if(!n)return;const r=n.dataset.peerId.toPeerId();if(e.ctrlKey||e.metaKey)return window.open(n.href||"#"+r,"_blank"),void(0,O.Z)(e);if(s){const e=a===n;a&&!e&&a.classList.remove("active"),n&&(n.classList.add("active"),a=n,this.lastActiveElements.add(n))}if(n){t&&t();const e=+n.dataset.mid||void 0;o({peerId:r,lastMsgId:e})}else o()}),{capture:!0}),e.addEventListener("click",(e=>{0===e.button&&(0,O.Z)(e)}),{capture:!0}),P.ZP&&e.addEventListener("dblclick",(e=>{const t=(0,d.Z)(e.target,Ve);if(t){const e=t.dataset.peerId.toPeerId();this.log("debug dialog:",this.managers.appMessagesManager.getDialogByPeerId(e))}})),i&&(0,Ie.E)(e,this.contextMenu.onContextMenu)}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessageN(e){return this.setLastMessage(e.dialog,e.lastMessage,e.dom,e.highlightWord,e.isBatch,e.setUnread).catch(Ae.Z)}setLastMessage(e,t,i,s,a=!1,o=!1){var d;return Ge(this,void 0,void 0,(function*(){if(!i&&!(i=this.getDialogDom(e.peerId)))return;const{deferred:l,middleware:c}=Ke(i,"setLastMessagePromise");let h;if(!t&&("draftMessage"===(null===(d=e.draft)||void 0===d?void 0:d._)&&(h=e.draft),!(t=e.topMessage)||t.mid!==e.top_message)){const i=this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);t=yield c(i)}if(o&&this.setUnreadMessagesN({dialog:e,dom:i,isBatch:a,setLastMessagePromise:l}),!t)return i.lastMessageSpan.textContent="",i.lastTimeSpan.textContent="",delete i.listEl.dataset.mid,void l.resolve();const u=e.peerId,f=t&&(0,be.Z)(t);{let e;const a=[];if(t&&!h&&!f){const i=(0,ye.Z)(t),s=new Set(["video","gif","round"]);if(i&&("photo"===i._||s.has(i.type))){const n=(0,me.Z)(i,20,20);if("photoSizeEmpty"!==n._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),"round"===i.type&&e.classList.add("is-round"),a.push((0,T.Z)({photo:i,message:t,container:e,withoutPreloader:!0,size:n}).then((()=>e))),s.has(i.type))){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}if(h){const e=document.createElement("span");e.classList.add("danger"),e.append((0,r.ag)("Draft"),": "),a.unshift(e)}else if(u.isAnyChat()&&u!==t.fromId&&!t.action){const e=document.createElement("span");if(e.classList.add("primary-text"),t.fromId===n.Z.myId)e.append((0,r.ag)("FromYou")),a.unshift(e);else{const i=c((0,Pe.Z)({peerId:t.fromId,onlyFirstName:!0})).then((t=>(e.prepend(t),e)),Ae.Z);a.unshift(i)}e.append(": ")}const o=!!e&&!!(null==t?void 0:t.message);let d;if(d=s&&t.message?yield c((0,ve.Z)(t,void 0,void 0,!1,s,o)):h?yield c((0,ve.Z)(h)):t?yield c((0,ve.Z)(t,void 0,void 0,!1,void 0,o)):document.createDocumentFragment(),a.length){const e=yield c(Promise.all(a));d.prepend(...e)}(0,F.Z)(i.lastMessageSpan,d)}if(t||h){const e=h?Math.max(h.date,t.date||0):t.date;(0,F.Z)(i.lastTimeSpan,(0,S.zM)(new Date(1e3*e)))}else i.lastTimeSpan.textContent="";null===o||o||(i.listEl.dataset.mid=""+t.mid),l.resolve()}))}setUnreadMessagesN(e){return this.setUnreadMessages(e.dialog,e.dom,e.isBatch,e.setLastMessagePromise).catch((()=>{}))}setUnreadMessages(e,t=this.getDialogDom(e.peerId),i=!1,s){var a;return Ge(this,void 0,void 0,(function*(){if(!t)return;const{deferred:o,middleware:r}=Ke(t,"setUnreadMessagePromise"),d=yield r(this.managers.appNotificationsManager.isPeerLocalMuted(e.peerId,!0)),l=t.listEl.classList.contains("is-muted");let c;if("draftMessage"!==(null===(a=e.draft)||void 0===a?void 0:a._)){const t=yield r(this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.top_message));t&&t.pFlags.out&&t.peerId!==n.Z.myId&&(c=t)}const h=yield r(this.managers.filtersStorage.getFilter(this.filterId));let u;u=h?-1!==h.pinnedPeerIds.indexOf(e.peerId):!!e.pFlags.pinned;const f=yield r(this.managers.appMessagesManager.isDialogUnread(e)),p=u||f;if(s)try{yield r(s)}catch(e){}const m=i?0:200;d!==l&&(0,M.Z)(t.listEl,"is-muted",d,m),function(e,t,i){let s;if((null==t?void 0:t.pFlags.out)&&(s=t.error?"sendingerror":t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!s)return void(e.textContent="");const n="tgico-"+s,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(t.statusSpan,c);const g=(0,q.Z)(t.unreadBadge);p&&!g&&t.subtitleEl.append(t.unreadBadge);const v=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),b=t.mentionsBadge&&(0,q.Z)(t.mentionsBadge);if(v&&(t.mentionsBadge||(t.mentionsBadge=document.createElement("div"),t.mentionsBadge.className="dialog-subtitle-badge badge badge-22 mention mention-badge",t.mentionsBadge.innerText="@",t.subtitleEl.insertBefore(t.mentionsBadge,t.lastMessageSpan.nextSibling))),(0,M.Z)(t.unreadBadge,"is-visible",p,m,p?void 0:()=>{t.unreadBadge.remove()},g?0:2),t.mentionsBadge&&(0,M.Z)(t.mentionsBadge,"is-visible",v,m,v?void 0:()=>{t.mentionsBadge.remove(),delete t.mentionsBadge},b?0:2),!p)return void o.resolve();u?t.unreadBadge.classList.add("tgico-chatspinned","tgico"):t.unreadBadge.classList.remove("tgico-chatspinned","tgico");let y=!0,w=!1;e.unread_mentions_count&&1===e.unread_count?(t.unreadBadge.innerText="@",w=!0):f?t.unreadBadge.innerText=""+(e.unread_count||" "):(t.unreadBadge.innerText="",y=!1),t.unreadBadge.classList.toggle("unread",y),t.unreadBadge.classList.toggle("mention",w),o.resolve()}))}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialog(e){return Ge(this,void 0,void 0,(function*(){if("object"!=typeof e){const t=yield this.managers.appMessagesManager.getDialogOnly(e);if(!t){const t=e||J.NM;return{peerId:t,peer:yield this.managers.appPeersManager.getOutputPeer(t),pFlags:{}}}return t}return e}))}setCallStatus(e,t){let{callIcon:i,listEl:s}=e;if(!i&&t){const{canvas:t,startAnimation:n}=e.callIcon=i=function(e=!1){const t=document.createElement("canvas");t.width=t.height=ae;const i=t.getContext("2d"),s=(ae-(3*re+2*oe))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=te((Date.now()-n)%1e3,0,1,1e3);i.clearRect(0,0,ae,ae),i.fillStyle=e&&!ie.Z.isMobile?ee.Z.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=o>=.5?e%2?2-2*o:2*(o-.5):e%2?2*o:1-2*o;let n=4+8*t;n*=ne,se(i,s+e*re+e*oe,(ae-n)/2,re,n,de,!0)}return!0};return{canvas:t,startAnimation:()=>{(0,X.jt)(o),o()},setActive:t=>{e=t,o()}}}(s.classList.contains("active"));t.classList.add("dialog-group-call-icon"),s.append(t),n()}i&&(0,M.Z)(e.callIcon.canvas,"is-visible",t,200,t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},t?2:0)}addListDialog(e){e.autonomous=!1;const t=this.addDialogNew(e);if(t){const i=this.getDialog(e.peerId).then((i=>{const{peerId:s}=i,a=[];return s.isUser()||a.push(this.processDialogForCallStatus(i,t.dom)),s!==n.Z.myId&&s.isUser()&&a.push(this.managers.appUsersManager.getUser(s).then((e=>{var i;"userStatusOnline"===(null===(i=e.status)||void 0===i?void 0:i._)&&this.setOnlineStatus(t.dom.avatarEl,!0)}))),a.push(this.setLastMessageN({dialog:i,dom:t.dom,isBatch:e.isBatch,setUnread:!0})),Promise.all(a)}));e.loadPromises&&e.loadPromises.push(i)}return t}processDialogForCallStatus(e,t){return Ge(this,void 0,void 0,(function*(){if(!le.Z)return;if(t||(t=this.getDialogDom(e.peerId)),!t)return;const i=yield this.managers.appChatsManager.getChat(e.peerId.toChatId());this.setCallStatus(t,!(!i.pFlags.call_active||!i.pFlags.call_not_empty))}))}addDialogAndSetLastMessage(e){const{peerId:t,message:i,query:s}=e,n=this.addDialogNew(Object.assign(Object.assign(Object.assign({},e),(0,we.Z)(i)),{peerId:t}));return this.setLastMessage({_:"dialog",peerId:t},i,n.dom,s),i.peerId!==t&&(n.dom.listEl.dataset.peerId=""+i.peerId),n}addDialogNew(e){const t=new $e(Object.assign({autonomous:!!e.container,avatarSize:"bigger"},e));if(e.container){const i=e.append?"prepend":"append";e.container[i](t.container)}return t}addDialog(e,t,i=!0,n=!1,a=!0,o=!0,r=54,d=!!t,l,c,h,u){var f;const p=new s.Z;p.classList.add("dialog-avatar","avatar-"+r),p.updateWithOptions({loadPromises:c,lazyLoadQueue:l,isDialog:!!a,peerId:e,peerTitle:h});const m=document.createElement("div");m.classList.add("user-caption");const g=document.createElement("span");g.classList.add("user-title");const v=new Z.Z,b=v.update({peerId:e,fromName:h,dialog:a,onlyFirstName:n,plainText:!1,withIcons:!u});c&&c.push(b),g.append(v.element),g.classList.add("tgico");const w=document.createElement("span");w.classList.add("user-last-message"),w.setAttribute("dir","auto");const S=document.createElement(Ve);S.classList.add("chatlist-chat"),d||(S.href="#"+e),i&&(0,y.Z)(S),S.append(p,m),S.dataset.peerId=""+e;const C=document.createElement("span");C.classList.add("message-status","sending-status");const L=document.createElement("span");L.classList.add("message-time");const I=document.createElement("div");I.className="dialog-subtitle-badge badge badge-22";const M=document.createElement("p");M.classList.add("dialog-title");const P=document.createElement("span");P.classList.add("dialog-title-details"),P.append(C,L),M.append(g,P);const k=document.createElement("p");k.classList.add("dialog-subtitle"),k.append(w),m.append(M,k);const T={avatarEl:p,captionDiv:m,titleSpan:v.element,titleSpanContainer:g,statusSpan:C,lastTimeSpan:L,unreadBadge:I,lastMessageSpan:w,containerEl:S,listEl:S,subtitleEl:k};return t&&t[o?"append":"prepend"](S),d||(S.dialogDom=T,(null===(f=E.Z.chat)||void 0===f?void 0:f.peerId)===e&&this.setDialogActive(S,!0)),{dom:T}}setTyping(e){return Ge(this,void 0,void 0,(function*(){const t=this.getDialogDom(e.peerId);if(!t)return;const i=t.lastMessageSpan.querySelector(".peer-typing-container"),s=yield E.Z.getPeerTyping(e.peerId,i);!i&&s&&((0,F.Z)(t.lastMessageSpan,s),t.lastMessageSpan.classList.add("user-typing"))}))}unsetTyping(e){const t=this.getDialogDom(e.peerId);t&&(t.lastMessageSpan.classList.remove("user-typing"),this.setLastMessageN({dialog:e,lastMessage:null,dom:t,setUnread:null}))}}const Qe=new qe;P.GO.appDialogsManager=Qe;const Ye=Qe},2312:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(3725),n=i(2202),a=i(3512),o=i(410),r=i(319),d=i(1243),l=i(7086),c=i(1655),h=i(5471),u=i(8801),f=i(6658),p=i(7667),m=i(3855);const g=new class{constructor(){this.downloads={},this.progress={}}construct(e){this.managers=e,a.Z.addEventListener("download_progress",(e=>{var t;const i=this.downloads[e.fileName];(null===(t=null==i?void 0:i.main)||void 0===t?void 0:t.notifyAll)&&(this.progress[e.fileName]=e,i.main.notifyAll(e))}))}getNewDeferred(e,t){const i=(0,s.Z)();let n=this.downloads[e];if(n){const e=n.main;["cancel","addNotifyListener","notify","notifyAll"].forEach((t=>{e[t]&&(i[t]=e[t].bind(e))}))}else n=this.downloads[e]={main:i},i.cancel=()=>{const t=(0,h.Z)("DOWNLOAD_CANCELED");this.managers.apiFileManager.cancelDownload(e),i.reject(t),i.cancel=r.Z},i.catch((()=>{this.clearDownload(e,t)})).finally((()=>{delete this.progress[e]}));return"disc"===t&&i.catch(r.Z).finally((()=>{this.clearDownload(e,t)})),n[t]=i}getNewDeferredForUpload(e,t){const i=this.getNewDeferred(e);return t.then(i.resolve,i.reject),i.finally((()=>{this.clearDownload(e)})),i}clearDownload(e,t){const i=this.downloads[e];if(!i)return;delete i[t];const s=Object.keys(i).length;(!s||i.main&&1===s)&&delete this.downloads[e]}getUpload(e){let t=this.getDownload(e);return t||(t=this.getNewDeferred(e),this.managers.appMessagesManager.getUploadPromise(e).then(t.resolve,t.reject),t)}d(e,t,i){let s=this.getDownload(e,i);return s||(s=this.getNewDeferred(e,i),t().then(s.resolve,s.reject),s)}download(e){const t=(0,l.Z)(e);return this.d(t,(()=>this.managers.apiFileManager.download(e)),"blob")}downloadMedia(e,t="blob",i){const{downloadOptions:s,fileName:n}=(0,d.Z)(e);return this.d(n,(()=>{let s;return s="url"===t?this.managers.apiFileManager.downloadMediaURL:"void"===t?this.managers.apiFileManager.downloadMediaVoid:this.managers.apiFileManager.downloadMedia,i?i.then((()=>s(e))):s(e)}),t)}downloadMediaURL(e){return this.downloadMedia(e,"url")}downloadMediaVoid(e){return this.downloadMedia(e,"void")}upload(e,t,i){return t||(t=(0,n.Z)(e)),i||(i=this.managers.apiFileManager.upload({file:e,fileName:t})),this.getNewDeferredForUpload(t,i)}getDownload(e,t){const i=this.downloads[e];return i&&i[t]}downloadToDisc(e,t){const i=e.media,s="document"===i._;s||e.thumb||(e.thumb=i.sizes.slice().pop());const n=""+(2147483647*Math.random()|0),a=`download/${n}`;e.downloadId=n;const o=m.Z.pingServiceWorkerWithIframe(),d=this.downloadMedia(e,"disc",o);if(t)return d;const l=document.createElement("iframe");l.hidden=!0,o.then((()=>{l.src=a,document.body.append(l)}));let h,g=!1;const v=()=>{g||(g=!0,h=l,(0,c.Z)(d.listeners,v))};return d.addNotifyListener(v),d.then((t=>{if(!t)return;const n=URL.createObjectURL(t),a=s?(0,f.Z)(i):(0,p.Z)(i,e.thumb),o=e.media.file_name||(0,u.P)(a.location);!function(e,t,i){const s=document.createElement("a");s.href=e,s.download=t,s.target="_blank",s.style.position="absolute",s.style.top="1px",s.style.left="1px",document.body.append(s);try{const e=document.createEvent("MouseEvents");e.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),s.dispatchEvent(e)}catch(t){console.error("Download click error",t);try{s.click()}catch(t){window.open(e,"_blank")}}setTimeout((()=>{s.remove(),i&&i()}),100)}(n,a.fileName||o,(()=>{URL.revokeObjectURL(n)}))})).catch(r.Z).finally((()=>{g||v(),setTimeout((()=>{null==h||h.remove()}),1e3)})),d}};o.GO&&(o.GO.appDownloadManager=g);const v=g},4846:(e,t,i)=>{"use strict";i.d(t,{Z:()=>Ar});var s=i(5814),n=i(2464),a=i(4332),o=i(4755),r=i(5003),d=i(3512),l=i(3241),c=i(5432),h=i(1655),u=i(6519),f=i(4484),p=i(9331),m=i(1507),g=i(7625);class v{constructor(e,t,i){this.container=document.createElement("div"),this.container.classList.add("bubbles-group"),this.chat=e,this.groups=t,this.items=[],this.dateTimestamp=i,this.offset=0}createAvatar(e){if(this.avatarLoadPromise)return this.avatarLoadPromise;if("messageService"===e._)return;this.avatarContainer=document.createElement("div"),this.avatarContainer.classList.add("bubbles-group-avatar-container"),++this.offset;const t=e.fwd_from,i=e.fwdFromId,s=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===i,n=this.chat.peerId;this.avatar=new p.Z,this.avatar.classList.add("bubbles-group-avatar","user-avatar","avatar-40");const a=(t&&(n===d.Z.myId||n===m.hj)||s?i:e.fromId)||m.NM,o=this.avatar.updateWithOptions({lazyLoadQueue:this.chat.bubbles.lazyLoadQueue,peerId:a,peerTitle:!i&&t&&t.from_name?t.from_name:void 0});return this.avatarLoadPromise=o,this.avatarContainer.append(this.avatar),this.container.append(this.avatarContainer),this.avatarLoadPromise}get firstTimestamp(){return this.firstItem.timestamp}get firstMid(){return this.firstItem.mid}get firstItem(){return this.items[this.items.length-1]}get lastTimestamp(){return this.lastItem.timestamp}get lastMid(){return this.lastItem.mid}get lastItem(){return this.items[0]}updateClassNames(){const e=this.items,t=e.length;if(!t)return;const i=e[t-1].bubble;if(1===e.length)return void i.classList.add("is-group-first","is-group-last");i.classList.remove("is-group-last"),i.classList.add("is-group-first");for(let i=1,s=t-1;i{this.mountItem(e,s-1-i,t)})),e&&this.updateClassNames(),this.onItemMount()}mountItem(e,t=this.items.indexOf(e),i=this.offset){e.mounted||((0,f.Z)(e.bubble,this.container,i+t),e.mounted=!0)}unmountItem(e){e.mounted&&(e.bubble.remove(),e.mounted=!1,this.onItemUnmount())}onItemMount(){if(this.mounted)return;const e=this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp/1e3),t=this.groups.groups.filter((e=>e.dateTimestamp===this.dateTimestamp)),i=t.length,s=t.indexOf(this),n=t.slice(s+1).reduce(((e,t)=>e+(t.mounted?0:1)),0);(0,f.Z)(this.container,e.container,ds+i-1-s-n),this.mounted=!0}onItemUnmount(){this.mounted&&(this.items.length?this.updateClassNames():(this.container.remove(),this.chat.bubbles.deleteEmptyDateGroups(),this.mounted=!1))}}class b{constructor(e){this.chat=e,this.itemsArr=[],this.itemsMap=new Map,this.groups=[],this.newGroupDiff=121,this.sortItemsKey="scheduled"===e.type?"timestamp":"mid",this.sortGroupsKey="scheduled"===e.type?"lastTimestamp":"lastMid",this.sortGroupItemsKey="groupMid"}removeItem(e){var t;null===(t=e.group)||void 0===t||t.removeItem(e),this.removeItemFromCache(e)}removeAndUnmountBubble(e){const t=this.getItemByBubble(e);if(!t)return e.parentElement&&e.remove(),!1;const i=this.itemsArr,s=i.indexOf(t),n=this.getSiblingsAtIndex(s,i),a=t.group;this.removeItem(t);const o=new Set;a&&(a.unmountItem(t),o.add(a));const[r,d]=n;if(r&&d&&this.canItemsBeGrouped(r,d)&&r.group!==d.group){const e=d.group;this.f(d.group.items),e.onItemUnmount(),o.add(r.group),this.groupUngrouped()}return this.mountUnmountGroups(Array.from(o)),!0}mountUnmountGroups(e){const[t,i]=function(e,t){const i=[],s=[];for(let t=0,a=e.length;t{e.onItemUnmount()})),t.forEach((e=>{e.mount(!0)}))}f(e,t=0,i=e.length){for(;ts.add(e)))}}return s}cleanup(){this.itemsArr=[],this.groups=[],this.itemsMap.clear()}}var y=i(1168),w=i(2738),S=i(2325),C=i(503);class L extends y.Z{constructor(e,t,i={}){if(super("popup-date-picker",Object.assign({body:!0,overlayClosable:!0,buttons:i.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],title:!0},i)),this.onPick=t,this.options=i,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const i=+t.dataset.timestamp;this.selectedDate=new Date(i),this.setTitle(),this.setTimeTitle()},this.minDate=i.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",(a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&s&&s(+o[1]),o="0"+o[0]),t.setValueSilently(o),i(o.length)}))};this.hoursInputField=new C.ZP({plainText:!0}),this.minutesInputField=new C.ZP({plainText:!0}),i(23,this.hoursInputField,(e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()}),(e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)})),i(59,this.minutesInputField,(e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()})),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),(0,w.fc)(this.btnConfirm,(()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()}),{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const s=document.createElement("div");s.classList.add("popup-centerer"),s.append(this.container),this.element.append(s),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=i.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),i.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e;const t=[],i=new Date;i.setHours(0,0,0,0);const s={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===i.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const s={month:"short",day:"numeric"};n.getFullYear()!==i.getFullYear()&&(s.year="numeric"),t.push(new S.ZP.IntlDateElement({date:n,options:s}).element)}t.push(new S.ZP.IntlDateElement({date:n,options:s}).element),this.btnConfirm.firstChild.replaceWith((0,S.ag)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new S.ZP.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const i=document.createElement("button");return i.classList.add("btn-icon","date-picker-month-date"),e&&i.setAttribute("disabled","true"),t&&i.append(t),i}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&o.Z.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new S.ZP.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const i=new Date,s=i.getDay();1!==s&&i.setHours(-24*(s-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new S.ZP.IntlDateElement({date:i,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),i.setDate(i.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{p&&!p()||(f.forEach((e=>e.remove())),o&&o.classList.toggle("is-round",u))})),h}))}class Q extends z{constructor(e,t){super(e,((e,i="",s)=>W(this,void 0,void 0,(function*(){this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const n=yield q({title:e,titleEl:this.title,subtitle:i,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s,animationGroup:t});this.container.classList.toggle("is-media",n),n?this.content.prepend(this.mediaEl):this.mediaEl.remove()})))),this.className=e,this.animationGroup=t}}function Y(e,t,i,s,n){const a=new Q("reply",i),o=a.fill(e,t,s);if(n){const e=(0,N.Z)(n,!1),[t,i,s]=(0,B.oo)(e);a.container.style.setProperty("--override-color",`${t}, ${i}, ${s}`),a.container.classList.add("is-overriding-color")}return{container:a.container,fillPromise:o}}const J="stacked-avatars";class X{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add(J),this.container.style.setProperty("--avatar-size",e.avatarSize+"px")}render(e,t){const i=this.container.children;(e=e.slice().reverse()).length>3&&(e=e.slice(-3)),e.forEach(((e,s)=>{let n=i[s];n||(n=document.createElement("div"),n.classList.add("stacked-avatars-avatar-container"));let a=n.firstElementChild;a||(a=new p.Z,a.classList.add("avatar-"+this.avatarSize,"stacked-avatars-avatar"),a.updateOptions({isDialog:!1,loadPromises:t})),a.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e}),a.parentNode||n.append(a),n.parentNode||this.container.append(n)})),Array.from(i).slice(e.length).forEach((e=>e.remove()))}}d.Z.addEventListener("replies_updated",(e=>{Array.from(document.querySelectorAll(`replies-element[data-post-key="${e.peerId}_${e.mid}"]`)).forEach((t=>{t.message=e,t.render()}))}));class ee extends HTMLElement{constructor(){super(),this.updated=!1,this.managers=d.Z.managers}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t;this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),this.stackedAvatars||(this.stackedAvatars=new X({lazyLoadQueue:this.lazyLoadQueue,avatarSize:30}),this.stackedAvatars.container.classList.add("replies-footer-avatars")),t=this.stackedAvatars.container,this.stackedAvatars.render(e.recent_repliers.map((e=>(0,F.Z)(e))),this.loadPromises)):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.prepend(t),this.text||(this.text=new S.ZP.IntlElement);const i=this.text;if(e?e.replies?i.compareAndUpdate({key:"Comments",args:[e.replies]}):i.compareAndUpdate({key:"LeaveAComment"}):i.compareAndUpdate({key:"ViewInChat"}),e){let t=!1;e.replies&&void 0!==e.read_max_id&&void 0!==e.max_id&&(t=e.read_max_id${(null==e?void 0:e.replies)?(0,_.Z)(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId,this.message.mid),this.managers.appMessagesManager.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define("replies-element",ee);const te=()=>{const e=document.createElement("i");return e.classList.add("edited"),(0,S.$d)(e,"EditedMessage"),e},ie=()=>(0,S.ag)("SponsoredMessage");var se;!function(e){e.setTime=e=>{var t;const{chatType:i,message:s}=e,n=new Date(1e3*s.date),a=[];let o,r;const d=!!s.pFlags.sponsored,l=!("action"in s)&&!d,c=d?void 0:(0,x.mr)(n);if(l){if(s.views){const e=s.post_author||(null===(t=s.fwd_from)||void 0===t?void 0:t.post_author),i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=(0,_.Z)(s.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),a.push(i,n),e){const t=document.createElement("span");(0,A.Z)(t,(0,D.Z)(e)),t.insertAdjacentHTML("beforeend",", "),a.push(t)}}if(s.edit_date&&"scheduled"!==i&&!s.pFlags.edit_hide&&a.unshift(o=te()),"pinned"!==i&&s.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),a.unshift(e)}}else d&&a.push(r=ie());c&&a.push(c);let h=d?void 0:(0,x.xE)(n);l&&(h+=(s.edit_date&&!s.pFlags.edit_hide?`\nEdited: ${(0,x.xE)(new Date(1e3*s.edit_date))}`:"")+(s.fwd_from?`\nOriginal: ${(0,x.xE)(new Date(1e3*s.fwd_from.date))}`:""));const u=document.createElement("span");u.classList.add("time","tgico"),u.append(...a);const f=document.createElement("div");f.classList.add("inner","tgico"),h&&(f.title=h);let p=a;return o&&(p[p.indexOf(o)]=te()),r&&(p[p.indexOf(r)]=ie()),p=p.map((e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e)),c&&(p[p.length-1]=(0,x.mr)(n)),f.append(...p),u.append(f),u},e.renderReplies=({bubble:e,bubbleContainer:t,message:i,messageDiv:s,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new ee;return r.message=i,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},e.setReply=({chat:e,bubble:t,bubbleContainer:i,message:s})=>{return n=this,a=void 0,r=function*(){const n=!i;n&&(i=t.querySelector(".bubble-content"));const a=n?i.querySelector(".reply"):null;if(!s.reply_to_mid)return null==a||a.remove(),void t.classList.remove("is-reply");const o=s.reply_to.reply_to_peer_id?(0,F.Z)(s.reply_to.reply_to_peer_id):e.peerId,r=yield d.Z.managers.appMessagesManager.getMessageByPeer(o,s.reply_to_mid);let l,c;if(r){const e=r.fwdFromId;c=s.fwdFromId&&s.fwdFromId===e?s.fwdFromId:r.fromId||e,l=new R.Z({peerId:c,dialog:!1,onlyFirstName:!1,plainText:!1}).element}else d.Z.managers.appMessagesManager.fetchMessageReplyTo(s),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:s.reply_to_mid,mid:s.mid}),l=(0,S.ag)("Loading");const{container:h,fillPromise:u}=Y(l,void 0,e.animationGroup,r,e.isAnyGroup?c:void 0);return yield u,a?(a.classList.contains("floating-part")&&h.classList.add("floating-part"),a.replaceWith(h)):i.append(h),t.classList.add("is-reply"),h},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}}(se||(se={}));var ne=i(2153),ae=i(3699),oe=i(8448),re=i(4789),de=i(8594),le=i(3035),ce=i(3725),he=i(410),ue=i(252),fe=i(8497),pe=i(4668),me=i(2796);function ge(e,t,i){const s=e.getBoundingClientRect(),n="center"===i?Math.ceil(s.left+(s.right-s.left)/2+1):Math.ceil(s.left+1),a="bottom"===t?Math.floor(s.top+s.height-1):Math.ceil(s.top+1);return document.elementFromPoint(n,a)}he.GO.getElementByPoint=ge;var ve=i(3624),be=i(3910),ye=i(5705);function we(e){e.style.display="none",e.offsetLeft,e.style.display=""}var Se=i(2648),Ce=i(5296),Le=i(8938),Ee=i(5701);const Ie=2147483646;var Me,Pe=i(241),Ze=i(6272),ke=i(1784),Te=i(9099),xe=i(2416),Ae=i(8763),_e=i(5975),Fe=i(8939),De=i(993),Re=i(4494),Be=i(8204),Ne=i(2575),Oe=i(9931);class Ue extends y.Z{constructor(e,t){super("popup-join-chat-invite",{closable:!0,overlayClosable:!0,body:!0,buttons:(0,y.x)([{langKey:t.pFlags.request_needed?"RequestJoin.Button":t.pFlags.broadcast?"JoinByPeekChannelTitle":"JoinByPeekGroupTitle",callback:()=>{this.managers.appChatsManager.importChatInvite(e).then((e=>{const t=e.toPeerId(!0);Ar.setInnerPeer({peerId:t})}),(e=>{"INVITE_REQUEST_SENT"===e.type&&(0,me.bC)({langPackKey:"RequestToJoinSent"})}))}}])}),this.hash=e,this.chatInvite=t,this.construct()}construct(){return e=this,t=void 0,s=function*(){this.header.remove();const{chatInvite:e,managers:t,hash:i}=this,s=new p.Z;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===e.photo._?(e.photo=yield t.appPhotosManager.savePhoto(e.photo),(0,G.Z)({container:s,message:null,photo:e.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):(0,Oe.Z)(s,m.NM,!1,e.title);const n=document.createElement("div");n.classList.add("chat-title"),(0,A.Z)(n,(0,D.Z)(e.title));const a=e.pFlags.broadcast,o=(0,S.ag)(a?"Subscribers":"Members",[(0,Ne.Z)(e.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,n,o),e.pFlags.request_needed){const e=document.createElement("div");(0,S.$d)(e,a?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}!function(e){e[e.MESSAGE=0]="MESSAGE",e[e.PRIVATE_POST=1]="PRIVATE_POST",e[e.STICKER_SET=2]="STICKER_SET",e[e.JOIN_CHAT=3]="JOIN_CHAT",e[e.VOICE_CHAT=4]="VOICE_CHAT",e[e.USER_PHONE_NUMBER=5]="USER_PHONE_NUMBER",e[e.INVOICE=6]="INVOICE",e[e.EMOJI_SET=7]="EMOJI_SET"}(Me||(Me={}));var He=i(5285),ze=i(6654),je=i(9083),Ge=i(6775),Ve=i(9405),Ke=i(319);class We extends HTMLElement{constructor(){super(),this.classList.add("reaction"),this.managers=d.Z.managers}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e,t){this.type=e,this.classList.add("reaction-"+e),this.middleware=t}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("reaction-sticker"),this.append(this.stickerContainer));const i=this.reactionCount;if(!e&&!t){const e=i.reaction;if("reactionEmoji"===e._){const t=this.managers.appReactionsManager.getReaction(e.emoticon);(0,ze.Z)(t,(e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive"),this.renderDoc(null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon)}))}else if("reactionCustomEmoji"===e._){this.stickerContainer.classList.add("is-custom");const t=(0,je.Z)({docIds:[e.document_id],size:(0,Ve.C)(22,22)});this.stickerContainer.append(t)}}}renderDoc(e){const t="inline"===this.type?14:22,i=this.wrapStickerPromise=(0,V.ZP)({div:this.stickerContainer,doc:e,width:t,height:t,static:!0,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)).finally((()=>{this.wrapStickerPromise===i&&(this.wrapStickerPromise=void 0)}))}renderCounter(){var e;const t=this.reactionCount,i="inline"===this.type?2:4;if(t.count>=i||"block"===this.type&&!this.canRenderAvatars){this.counter||(this.counter=document.createElement("inline"===this.type?"i":"span"),this.counter.classList.add("reaction-counter"));const e=(0,_.Z)(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 X({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map((e=>(0,F.Z)(e.peer_id))))))}setIsChosen(e=void 0!==this.reactionCount.chosen_order){"inline"!==this.type&&(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&(0,Te.Z)(this,"is-chosen",e,this.isConnected?300:0)}fireAroundAnimation(){const e=this.reactionCount.reaction;"reactionEmoji"===e._&&(0,ze.Z)(this.managers.appReactionsManager.getReaction(e.emoticon),(e=>{const t="inline"===this.type?28:40,i=document.createElement("div");i.classList.add("reaction-sticker-activate"),Promise.all([(0,V.ZP)({div:i,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)),(0,Ge.Z)({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1,managers:this.managers,middleware:this.middleware}).stickerPromise.catch(Ke.Z)]).then((([e,t])=>{const s=()=>{e.remove(),i.remove(),this.stickerContainer.classList.remove("has-animation")};if(!t)return void s();const n=()=>{(0,le.T2)(s)};e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then((()=>{setTimeout(n,1e3)})):n())})),e.addEventListener("firstFrame",(()=>{this.stickerContainer.append(i),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()}),{once:!0})}))}))}}customElements.define("reaction-element",We);const $e=new Map;class qe extends HTMLElement{constructor(){super(),this.classList.add("reactions"),this.sorted=[],this.middlewareHelpers=new Map,this.managers=d.Z.managers}connectedCallback(){let e=$e.get(this.key);e||$e.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=$e.get(this.key);e.delete(this),e.size||$e.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,i,s=this.isPlaceholder){void 0!==this.key&&this.disconnectedCallback(),this.middleware!==i&&i.onDestroy((()=>{this.middlewareHelpers.clear()})),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.middleware=i,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.middleware)}update(e,t){this.message=e,this.render(t)}render(e){const t=this.message.reactions,i=!(!t||!t.results.length);if(this.classList.toggle("has-no-reactions",!i),!i&&!this.sorted.length)return;this.managers.appReactionsManager.getAvailableReactions();const s=i?t.results:[];s.sort(((e,t)=>{var i,s;return t.count-e.count||(null!==(i=e.chosen_order)&&void 0!==i?i:0)-(null!==(s=t.chosen_order)&&void 0!==s?s:0)})),(0,g.Z)(this.sorted,((e,t,i)=>{const n=e.reactionCount.reaction;s.some((e=>(0,He.Z)(e.reaction,n)))||(this.middlewareHelpers.get(e).destroy(),this.middlewareHelpers.delete(e),i.splice(t,1),e.remove())}));const n=s.reduce(((e,t)=>e+t.count),0),a=t&&(!!t.pFlags.can_see_list||this.message.peerId.isUser())&&n<4;if(this.sorted=s.map(((e,i)=>{let s=this.sorted.find((t=>(0,He.Z)(t.reactionCount.reaction,e.reaction)));if(!s){const e=this.middleware.create();s=new We,s.init(this.type,e.get()),this.middlewareHelpers.set(s,e)}(0,f.Z)(s,this,i);const n=t.recent_reactions?t.recent_reactions.filter((t=>(0,He.Z)(t.reaction,e.reaction))):[];return s.reactionCount=Object.assign({},e),s.setCanRenderAvatars(a),s.render(this.isPlaceholder),s.renderCounter(),s.renderAvatars(n),s.setIsChosen(),s})),!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===Ar.chat.peerId&&e.forEach((e=>{const t=this.sorted.find((t=>(0,He.Z)(t.reactionCount.reaction,e.reaction)));null==t||t.fireAroundAnimation()}))}}customElements.define("reactions-element",qe);var Qe=i(5418);class Ye{constructor(e,t,i){this.scrollable=e,this.query=t,this.reverse=i}get container(){return this.scrollable.container}getSaved(){return{scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,clientHeight:this.clientHeight}}findElements(){if(!this.query)return[];const{container:e}=this,t=e.getBoundingClientRect(),i=Array.from(e.querySelectorAll(this.query)),s=[];for(const n of i){const i=n.getBoundingClientRect();if((0,Be.Z)(n,e,void 0,i,t))s.push({element:n,rect:i});else if(s.length)break}if(!s.length){const e=i[0];e&&s.push({element:e,rect:e.getBoundingClientRect()})}return s}replaceSaved(e,t){if(!this.elements)return;const i=this.elements.findIndex((({element:t})=>e===t));-1!==i&&(this.elements[i].element=t)}findAndSetElements(){this.elements=this.findElements()}save(){this.findAndSetElements(),this._save()}_save(){const{scrollTop:e,scrollHeight:t,clientHeight:i}=this.container;this.scrollHeight=t,this.scrollTop=e,this.clientHeight=i,this.scrollHeightMinusTop=this.reverse?t-e:e}onRestore(e){k.IS_SAFARI&&e&&we(this.container)}setScrollTop(e,t){this.scrollable.setScrollTopSilently(this.scrollTop=e),this.onRestore(t)}restore(e){var t;const{scrollTop:i,scrollHeight:s}=this.scrollable;if(this.scrollHeight=s,!this.elements.length)return void this._restore(e);let n;if(n=this.elements[this.elements.length-1],!(null===(t=null==n?void 0:n.element)||void 0===t?void 0:t.parentElement)&&(this.findAndSetElements(),n=this.elements[this.elements.length-1],!n))return void this._restore(e);const{element:a,rect:o}=n,r=a.getBoundingClientRect().bottom-o.bottom;this.setScrollTop(i+r,e)}_restore(e){const{scrollHeightMinusTop:t,scrollable:i}=this,s=this.scrollHeight,n=this.reverse?s-t:t;this.setScrollTop(n,e)}}he.GO&&(he.GO.ScrollSaver=Ye);var Je=i(7401),Xe=i(4881);class et{constructor(e){this.observing=new Map,this.observingQueue=new Map,this.freezedObservingNew=!1,this.observer=new IntersectionObserver((e=>{const t=this.observing;for(let i=0,s=e.length;ie+t),t)}var Lt=i(8097);const Et=function(e){const t={},i={};return s=>{var n,a;const o="_"+s;return null!==(n=(a="string"==typeof s?t:i)[o])&&void 0!==n?n:a[o]=e(s)}};function It(e){return e.replace(/\D/g,"")}const Mt={visa:/^4/,mastercard:/^(51|52|53|54|55|222|23|24|25|26|27)/,amex:/^(34|37)/,discover:/^(60|64|65)/,diners:/^(30|38|39)/,diners14:/^(36)/,jcb:/^(35)/,unionpay:/^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,elo:/^(5067|509|636368|627780)/,mir:/^(220[0-4])/},Pt={visa:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mastercard:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},amex:{minLength:15,maxLength:15,cvcMaxLength:4,cvcMinLength:3},unionpay:{minLength:13,maxLength:19,cvcMaxLength:3,cvcMinLength:null},diners:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},diners14:{minLength:14,maxLength:14,cvcMaxLength:3,cvcMinLength:null},discover:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},jcb:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},elo:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mir:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},unknown:{minLength:16,maxLength:16,cvcMaxLength:4,cvcMinLength:3}},Zt=Et(((e="")=>{const t=Object.keys(Mt),i=It(e);let s,n=0;return t.forEach((e=>{const t=Mt[e],a=i.match(t);if(a){const t=a[0];t&&t.length>n&&(s=e,n=t.length)}})),s||"unknown"}));function kt(e=""){return"diners14"===(t=Zt(e))?"diners":t;var t}var Tt=i(2398),xt=i(6740),At=i(1656),_t=i(7298),Ft=i(9807),Dt=i(279),Rt=i(7479),Bt=i(7362);function Nt(e,t,i){const s=new Array(e);return s.fill(t),i?s.map(i):s}const Ot="0".charCodeAt(0)-"0".charCodeAt(0),Ut=/[0-9]/g;function Ht(e){return String.fromCharCode(e.charCodeAt(0)-Ot)}function zt(e){return e.replace(Ut,Ht)}function jt(e,t){return{type:"optional",result:e,consumed:t}}function Gt(e,t,i){return{type:"required",result:e,consumed:t,partial:i}}function Vt(e,t){return i=>{const s=new RegExp("^".concat(e.source.replace(/^\^/,""))),n=i.match(s),a=t?jt:Gt;if(n){const e=n[0];return a(e,n.index+e.length)}return a("",i.length)}}const Kt=Vt(/1[0-2]|0?[1-9]|0/),Wt={digit:function(e){return Vt(/[0-9]/)(zt(e))},capitalCharacter:function(e){const t=Vt(/\w/)(e);return t.result?Gt(t.result.toUpperCase(),t.consumed):t},month:e=>{const t=Kt(zt(e)),i=It(t.result);return["0","1"].includes(t.result)&&1===e.length||"0"===t.result&&e.length>=2?Gt(t.result,e.length,!0):Gt(1===i.length?"0"+i:i,t.consumed)},formattingCharacter:e=>t=>{const i=e===t[0]?1:0;return function(e,t){return{type:"formatting",result:e,consumed:t}}(e,i)},optionalPattern:e=>t=>{const i=Vt(e,!0)(t);return i.result?i:jt("",0)}},$t=Wt.digit,qt=Wt.capitalCharacter,Qt=Wt.formattingCharacter(" "),Yt=Wt.optionalPattern(/\d\d/),Jt=[$t,$t,$t,$t,Qt,$t,$t,$t,$t,$t,$t,Qt,$t,$t,$t,$t,$t],Xt=[$t,$t,$t,$t,Qt,$t,$t,$t,$t,$t,$t,Qt,$t,$t,$t,$t],ei=new Set(["DZ","AR","AM","AU","AT","AZ","PT","BD","BY","BE","BA","BR","BN","BG","CA","IC","CN","CO","HR","CY","CZ","DK","EC","GB","EE","FO","FI","FR","GE","DE","GR","GL","GU","GG","NL","HU","IN","ID","IL","IT","JP","JE","KZ","KR","FM","KG","LV","LI","LT","LU","MK","MG","PT","MY","MH","MQ","YT","MX","MN","ME","NL","NZ","GB","NO","PK","PH","PL","FM","PT","PR","RE","RU","SA","SF","RS","SG","SK","SI","ZA","ES","LK","SX","VI","VI","SE","CH","TW","TJ","TH","TU","TN","TR","TM","VI","UA","GB","US","UY","UZ","VA","VN","GB","FM"]),ti=Et((e=>{const t=[];for(let i=0,s=0;i[Wt.month,Wt.formattingCharacter("/"),$t,$t,Yt],cardCvc:e=>ii.cardCvcFromBrand(Zt(e)),cardCvcFromBrand:Et((e=>{const t=Pt[e],{cvcMinLength:i,cvcMaxLength:s}=t,n=Nt(i||s,$t);if(i&&i{switch(e){case"US":return Nt(5,$t);case"CA":return k.IS_ANDROID?null:[qt,qt,qt,Qt,qt,qt,qt];default:const t=Nt(10,Wt.optionalPattern(/\d/));return ei.has(e)&&(t[0]=$t),t}}))},si=ii;function ni(e){return Ct(e.map((e=>e.length)),0)}const ai=new RegExp("‎","g");function oi(e){return e?{type:"invalid",code:e}:null}function ri(e,t={}){const{sanitized:i,minLength:s}=function(e){const t=It(e),i=Zt(e);return{sanitized:t,brand:i,minLength:Pt[i].minLength}}(e);return function(e,t,i){return e.length>=t?function(e){const t="0".charCodeAt(0),i=e.length%2;let s=0;for(let n=e.length-1;n>=0;--n){const a=i===n%2;let o=e.charCodeAt(n)-t;a&&(o*=2),o>9&&(o-=9),s+=o}return!(s%10)}(e)||"mir"===Zt(e)?null:oi("invalid"):i?null:oi("incomplete")}(i,s,t.ignoreIncomplete)}function di(e,t={}){const i=e.replace(ai,"").split(/ ?\/ ?/),[s,n=""]=i,[a,o]=[s,n].map((e=>+e)),r=2===n.length?o%100:o;return n.length<2||3===n.length?t.ignoreIncomplete?null:oi("incomplete"):oi(function(e,t,i){const s=new Date(Date.now()),n=e<100?s.getFullYear()%100:s.getFullYear(),a=s.getMonth()+1;return isNaN(e)||isNaN(t)?(null==i?void 0:i.ignoreIncomplete)?null:"incomplete":e-n<0?"invalid_expiry_year_past":e-n>50?"invalid_expiry_year":!(e-n)&&t{hi.set(i.contentWindow,t)}}}window.addEventListener("message",(e=>{const t=hi.get(e.source);t&&t(JSON.parse(e.data))}));class fi extends y.Z{constructor(e,t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,title:"Checkout.WebConfirmation.Title"}),this.url=e,this.openPathAfter=t,this.d()}d(){const{iframe:e,onMount:t}=ui(this.url,(e=>{"web_app_open_tg_link"===e.eventType&&(this.dispatchEvent("finish"),this.hide(),this.openPathAfter&&Ar.openUrl("https://t.me"+e.eventData.path_full))}));this.body.append(e),this.show(),t()}}var pi=i(6830);class mi extends C.ZP{constructor(e){super(e),this.options=e,this.onKeyDown=e=>{var t,i;this.lastKeyDown=e.key,null===(i=(t=this.options).onKeyDown)||void 0===i||i.call(t,e)},this.onInput=()=>{var e,t;const i=this.value,s="Backspace"===this.lastKeyDown&&(this.lastTransformed&&this.lastTransformed.value.length||0)-i.length==1,n=this.lastTransformed=function(e){const{value:t,getPattern:i,deleting:s,input:n}=e,a=!s&&!!t.length,o=function(e,t,i={},s){const n=e(t);if(!n)return{value:t,selection:null,autocorrectComplete:!!t};const a=n.length,o=[],r=[];let d=0,l=0,c=0===i.selectionStart?0:null,h=0===i.selectionEnd?0:null;const u=e=>{e>0&&(null===c&&l+1>=i.selectionStart&&(c=ni(o)+(s?r.length:0)),null===h&&l+1>=i.selectionEnd&&(h=ni(o)+(s?r.length:0)),l+=e)};for(;d=t.length)break;r.push(a),++d,u(c)}}return s&&o.push(...r),{value:o.join(""),selection:{selectionStart:null===c||t.length&&i.selectionStart===t.length?ni(o):c,selectionEnd:null===h||t.length&&i.selectionEnd===t.length?ni(o):h},autocorrectComplete:d===a}}(i,t,{selectionStart:n?n.selectionStart:0,selectionEnd:n?n.selectionEnd:0},a),{value:r,selection:d}=o;return{value:r,meta:{autocorrectComplete:o.autocorrectComplete,empty:!r},selection:d}}({value:i,getPattern:this.options.formatMethod,deleting:s,input:this.input}),a=n.value;a!==i&&(this.setValueSilently(a),n.selection&&(this.input.selectionStart=n.selection.selectionStart,this.input.selectionEnd=n.selection.selectionEnd)),this.validateNew(a,{ignoreIncomplete:!0}),null===(t=(e=this.options).onChange)||void 0===t||t.call(e,n)},this.onBlur=()=>{var e;const t=null===(e=this.lastTransformed)||void 0===e?void 0:e.value;t&&this.validateNew(t)},this.validate=()=>this.validateNew(),this.input.addEventListener("keydown",this.onKeyDown),this.input.addEventListener("input",this.onInput),this.input.addEventListener("blur",this.onBlur)}update(){this.onInput()}validateNew(e,t,i){var s,n,a,o,r;let d;if(void 0===e&&(e=null!==(n=null===(s=this.lastTransformed)||void 0===s?void 0:s.value)&&void 0!==n?n:""),void 0===t&&(t={}),d=this.options.validateMethod?null===(o=(a=this.options).validateMethod)||void 0===o?void 0:o.call(a,e,t):function(e,t,i={}){return e.meta.autocorrectComplete||i.ignoreIncomplete?null:oi("incomplete")}(this.lastTransformed,0,t),null==d?void 0:d.code){const e=null===(r=this.options.errorKeys)||void 0===r?void 0:r[d.code];return!i&&this.setState(C.I1.Error,e),!1}return!i&&this.setState(C.I1.Neutral),!0}}function gi(e,t){const i=()=>{const i=e.every((e=>"validateNew"in e?e.validateNew(void 0,void 0,!0):e.isValid()));t(i)};return e.forEach((e=>{if(e instanceof mi){const t=e.options.onChange;e.options.onChange=(...e)=>{null==t||t(...e),i()},"update"in e&&e.update()}else e.input.addEventListener("input",i)})),{validate:i}}function vi(e,t){let i,s;return(e||t)&&(e&&(i=new ci.Z({noPhoneCodes:!0,onCountryChange:()=>{null==s||s.update()},required:!0,autocomplete:"country"})),t&&(s=new mi({label:"PaymentShippingZipPlaceholder",plainText:!0,inputMode:"numeric",autocomplete:"postal-code",formatMethod:()=>{const{country:e}=i.getSelected(),t=null==e?void 0:e.iso2;return si.postalCodeFromCountry(t&&t.toUpperCase())}}))),{countryInputField:i,postcodeInputField:s}}const bi=new Set(["stripe","smartglocal"]);class yi extends y.Z{constructor(e,t){if(super("popup-payment popup-payment-card",{closable:!0,overlayClosable:!0,body:!0,scrollable:bi.has(e.native_provider),title:"PaymentCardInfo"}),this.paymentForm=e,this.savedCard=t,bi.has(e.native_provider))this.d();else{const{iframe:t,onMount:i}=ui(e.url,(t=>{if("payment_form_submit"!==t.eventType)return;const i=t.eventData,s={title:i.title,save:!1};this.dispatchEvent("finish",{token:i.credentials,card:s}),this.hide(),e.pFlags.can_save_credentials&&(0,li.Z)({titleLangKey:"PaymentCardSavePaymentInformation",descriptionLangKey:"PaymentCardSavePaymentInformationInfoLine1",button:{langKey:"Save"}}).then((()=>{s.save=!0}),Ke.Z)}));this.body.append(t),this.show(),i()}}d(){const e=this.savedCard,t=new n.dw({name:"PaymentInfo.Card.Title",noDelimiter:!0,noShadow:!0}),i=JSON.parse(this.paymentForm.native_params.data);let s,a,o=0;const r=new mi({label:"PaymentCardNumber",plainText:!0,inputMode:"numeric",autocomplete:"cc-number",formatMethod:si.cardNumber,validateMethod:ri,errorKeys:{invalid:"PaymentCard.Error.Invalid",incomplete:"PaymentCard.Error.Incomplete"},onChange:e=>{(e=>{if(s===e)return;const t=++o;s=e;const i=Zi(e);if(!i)return void(a&&(a.remove(),a=void 0));const n=new Image;n.classList.add("input-field-icon"),(0,xt.cj)(n,i,!1).then((()=>{o===t&&(a?a.replaceWith(n):r.container.append(n),a=n)}))})(kt(e.value)),c.update()}});let d;i.need_cardholder_name&&(d=new C.ZP({label:"Checkout.NewCard.CardholderNamePlaceholder",maxLength:255,required:!0,autocomplete:"cc-name"}));const l=new mi({label:"SecureId.Identity.Placeholder.ExpiryDate",plainText:!0,inputMode:"numeric",autocomplete:"cc-exp",formatMethod:si.cardExpiry,validateMethod:di});l.input.addEventListener("input",(()=>{let e=l.value;if(e.length<5)return;const t=e.split("/");4===t[1].length&&(e=[t[0],t[1].slice(2)].join("/"),l.setValueSilently(e))}),{capture:!0});const c=new mi({labelText:"CVC",plainText:!0,inputMode:"numeric",autocomplete:"cc-csc",name:"cvc",formatMethod:()=>si.cardCvc(r.value)}),h=(new pi.T(c.container,c.input),[r,l,c,d].filter(Boolean));h.forEach((e=>{const t=t=>{if(!e.value&&"Backspace"===t.key){const t=h[h.indexOf(e)-1];t&&(0,Tt.Z)(t.input,!0)}};if(e instanceof mi){e.options.onKeyDown=t;const i=e.options.onChange;e.options.onChange=t=>{if(null==i||i(t),document.activeElement===e.input&&t.meta.autocorrectComplete)for(let t=h.indexOf(e),i=h.length;te.container))));const v=!!this.paymentForm.pFlags.can_save_credentials,b=new Ft.Z({text:"PaymentCardSavePaymentInformation",checked:!!v}),y=new Rt.ZP({checkboxField:b,subtitleLangKey:v?"PaymentCardSavePaymentInformationInfoLine1":"Checkout.2FA.Text"});v||y.container.classList.add("is-disabled"),(p||t).content.append(y.container),this.scrollable.append(...[t,p].filter(Boolean).map((e=>e.container)));const w=ki({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,n=function*(){const e={cardNumber:r.value,expiryFull:l.value,expiryMonth:l.value.split("/")[0],expiryYear:l.value.split("/")[1],cvc:c.value,cardholderName:null==d?void 0:d.value,country:null==m?void 0:m.value,zip:null==g?void 0:g.value,save:null==b?void 0:b.checked},t=this.paymentForm.native_provider;let s;if("stripe"===t){const t=new URL("https://api.stripe.com/v1/tokens");t.search=new URLSearchParams({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvc,"card[address_zip]":e.zip,"card[address_country]":e.country,"card[name]":e.cardholderName}).toString();const n=yield fetch(t.toString(),{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Bearer ${i.publishable_key}`}});s=yield n.json()}else if("smartglocal"===t){const t={card:{number:e.cardNumber.replace(/[^\d]+/g,""),expiration_month:e.expiryMonth,expiration_year:e.expiryYear,security_code:e.cvc.replace(/[^\d]+/g,"")}},n="https://tgb.smart-glocal.com/cds/v1/tokenize/card",a=yield fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","X-PUBLIC-TOKEN":i.public_token},body:JSON.stringify(t)});s={type:"card",token:(yield a.json()).data.token}}this.dispatchEvent("finish",{token:s,card:e}),this.hide()},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}});gi([r,d,l,c,m,g].filter(Boolean),(e=>{w.disabled=!e})),e&&(r.value=e.cardNumber,l.value=e.expiryFull,c.value=e.cvc,d&&(d.value=e.cardholderName),m&&(m.value=e.country),g&&(g.value=e.zip)),this.body.append(this.btnConfirmOnEnter=w),this.show(),r.validateNew(void 0,void 0,!0)||(0,Tt.Z)(r.input)}}class wi extends y.Z{constructor(e,t){super("popup-payment popup-payment-card-confirmation",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"Checkout.PasswordEntry.Title"});const i=new n.dw({noDelimiter:!0,noShadow:!0,caption:"Checkout.PasswordEntry.Text",captionArgs:[e]}),s=new pi.Z({labelText:t.hint});i.content.append(s.container),this.scrollable.append(i.container);const a=()=>{o.disabled=!s.value,s.setState(C.I1.Neutral)};s.input.addEventListener("input",a);const o=ki({key:"Checkout.PasswordEntry.Pay",onClick:()=>{return e=this,i=void 0,a=function*(){try{const e=yield this.managers.passwordManager.getInputCheckPassword(s.value,t),i=yield this.managers.apiManager.invokeApi("account.getTmpPassword",{password:e,period:60});this.dispatchEvent("finish",i),this.hide()}catch(e){throw"PASSWORD_HASH_INVALID"===e.type&&(e.handled=!0,s.setError("PASSWORD_HASH_INVALID")),e}},new((n=void 0)||(n=Promise))((function(t,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(e){var i;e.done?t(e.value):(i=e.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(e,i||[])).next())}));var e,i,n,a}});this.body.append(this.btnConfirmOnEnter=o),a(),this.show(),(0,Tt.Z)(s.input)}}var Si=i(1171),Ci=i(709);class Li extends y.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingInfo"}),this.paymentForm=e,this.inputInvoice=t,this.focus=i,this.d()}d(){const e=this.paymentForm.invoice,t=this.paymentForm.saved_info;let i,s,a,o,r,d,l,c,h,u,f;if(e.pFlags.shipping_address_requested){i=new n.dw({name:"PaymentShippingAddress",noDelimiter:!0,noShadow:!0}),s=new C.ZP({label:"PaymentShippingAddress1Placeholder",maxLength:64,required:!0}),a=new C.ZP({label:"PaymentShippingAddress2Placeholder",maxLength:64}),o=new C.ZP({label:"PaymentShippingCityPlaceholder",maxLength:64,required:!0}),r=new C.ZP({label:"PaymentShippingStatePlaceholder",maxLength:64});const e=vi(!0,!0);d=e.countryInputField,l=e.postcodeInputField,i.content.append(...[s,a,o,r,d,l].filter(Boolean).map((e=>e.container)))}if([e.pFlags.name_requested,e.pFlags.email_requested,e.pFlags.phone_requested].includes(!0)){c=new n.dw({name:"PaymentShippingReceiver",noDelimiter:!0,noShadow:!0});const t=()=>{const e=u.value,t=(0,Si.Z)(e);return!(!t||t[0].length!==e.length)},i=()=>!!f.value.match(/\d/);e.pFlags.name_requested&&(h=new C.ZP({label:"PaymentShippingName",maxLength:256,required:!0})),e.pFlags.email_requested&&(u=new C.ZP({label:"PaymentShippingEmailPlaceholder",maxLength:64,required:!0,validate:t})),e.pFlags.phone_requested&&(f=new Ci.Z({required:!0,validate:i})),c.content.append(...[h,u,f].filter(Boolean).map((e=>e.container)))}const p=new Ft.Z({text:"PaymentShippingSave",checked:!0}),m=new Rt.ZP({checkboxField:p,subtitleLangKey:"PaymentShippingSaveInfo"});(c||i).content.append(m.container),this.scrollable.append(...[i,c].filter(Boolean).map((e=>e.container)));const g=ki({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,n=function*(){const e=d&&d.getSelected().country,t={_:"paymentRequestedInfo",shipping_address:e&&{_:"postAddress",street_line1:s.value,street_line2:a.value,city:o.value,state:r.value,country_iso2:null==e?void 0:e.iso2,post_code:l.value},name:null==h?void 0:h.value,email:null==u?void 0:u.value,phone:null==f?void 0:f.value};try{const e=yield this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice,t,null==p?void 0:p.checked);this.dispatchEvent("finish",{shippingAddress:t,requestedInfo:e}),this.hide()}catch(e){const t={ADDRESS_STREET_LINE1_INVALID:s,ADDRESS_STREET_LINE2_INVALID:a,ADDRESS_COUNTRY_INVALID:d,ADDRESS_CITY_INVALID:o,ADDRESS_STATE_INVALID:r,ADDRESS_POSTCODE_INVALID:l,REQ_INFO_NAME_INVALID:h,REQ_INFO_EMAIL_INVALID:u,REQ_INFO_PHONE_INVALID:f}[e.type];throw t&&(t.setError(),e.handled=!0),e}},new((i=void 0)||(i=Promise))((function(s,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,i,n}});if(this.body.append(this.btnConfirmOnEnter=g),t){const e=t.shipping_address;e&&(s.value=e.street_line1,a.value=e.street_line2,o.value=e.city,r.value=e.state,d.selectCountryByIso2(e.country_iso2),l.value=e.post_code),t.name&&h&&(h.value=t.name),t.email&&u&&(u.value=t.email),t.phone&&f&&(f.value=t.phone)}const{validate:v}=gi([s,a,o,r,d,l,h,u,f].filter(Boolean),(e=>{g.disabled=!e}));let b;v(),this.show(),b=this.focus?{name:h,email:u,phone:f}[this.focus]:s,b&&(0,Tt.Z)(b.input)}}var Ei=i(1218);class Ii extends y.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping-methods",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingMethod"}),this.paymentForm=e,this.requestedInfo=t,this.shippingOption=i,this.d()}d(){const e=new n.dw({name:"PaymentCheckoutShippingMethod",noDelimiter:!0,noShadow:!0}),t=this.requestedInfo.shipping_options.map((e=>new Rt.ZP({radioField:new Ei.Z({text:e.title,name:"shipping-method",value:e.id}),subtitle:(0,yt.Z)(Ct(e.prices.map((({amount:e})=>+e)),0),this.paymentForm.invoice.currency)})));let i;const s=(0,Rt.De)(t,(e=>{i=e}));this.shippingOption?t.find((e=>e.radioField.input.value===this.shippingOption.id)).radioField.checked=!0:t[0].radioField.checked=!0,e.content.append(s),this.scrollable.append(e.container);const a=ki({key:"PaymentInfo.Done",onClick:()=>{this.dispatchEvent("finish",this.requestedInfo.shipping_options.find((e=>e.id===i))),this.hide()}});this.body.append(this.btnConfirmOnEnter=a),this.show()}}var Mi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Pi=["amex","card","diners","discover","jcb","mastercard","visa","unionpay","mir","logo"];function Zi(e){if(Pi.includes(e))return`assets/img/${e}.svg`}function ki(e){var t,i;const s=null!==(t=e.textEl)&&void 0!==t?t:new S.ZP.IntlElement({key:null!==(i=e.key)&&void 0!==i?i:"PaymentInfo.Done"}),n=s.key,a=(0,Re.Z)("btn-primary btn-color-primary payment-item-pay");return a.append(s.element),(0,w.fc)(a,(()=>Mi(this,void 0,void 0,(function*(){const t=e.onClick();if(!(t instanceof Promise))return;const i=(0,Dt.y)(a),o=(0,At.Z)([a],!0);s.compareAndUpdate({key:"PleaseWait"});try{yield t}catch(e){e.handled||console.error("payment button error",e),o(),s.compareAndUpdate({key:n}),i.remove()}})))),a}class Ti extends y.Z{constructor(e,t,i,s){super("popup-payment",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.message=e,this.inputInvoice=t,this.paymentForm=i,this.isReceipt=s,this.tipButtonsMap=new Map,this.d().catch((e=>{console.error("payment popup error",e),this.hide()}))}d(){var e,t,i;return Mi(this,void 0,void 0,(function*(){this.element.classList.add("is-loading"),this.show();let s=!1;const n=()=>{s||(s=!0,Te&&Te.hide(),this.hide())};let{paymentForm:a,message:o}=this;o&&this.listenerSetter.add(d.Z)("payment_sent",(({peerId:e,mid:t})=>{o.peerId===e&&o.mid===t&&n()}));const r=null==o?void 0:o.media,l=null!==(e=this.isReceipt)&&void 0!==e?e:r?!!r.receipt_msg_id||"messageExtendedMedia"===(null===(t=r.extended_media)||void 0===t?void 0:t._):"payments.paymentReceipt"===a._,c=r?r.pFlags.test:a.invoice.pFlags.test,h=r?r.photo:a.photo,u=r?r.title:a.title,f=r?r.description:a.description;(0,S.$d)(this.title,l?"PaymentReceipt":"PaymentCheckout"),c&&this.title.append(" (Test)");const m="payment-item",g=document.createElement("div");g.classList.add(m);const v=m+"-details",b=document.createElement("div");let y;b.classList.add(v),h&&(y=document.createElement("div"),y.classList.add(v+"-photo","media-container-contain"),(0,G.Z)({photo:h,container:y,boxWidth:100,boxHeight:100,size:{_:"photoSizeEmpty",type:""}}),b.append(y));const C=v+"-lines",L=document.createElement("div");L.classList.add(C);const E=document.createElement("div");E.classList.add(C+"-title");const I=document.createElement("div");I.classList.add(C+"-description");const M=document.createElement("div");M.classList.add(C+"-bot-name"),L.append(E,I,M),(0,A.Z)(E,(0,D.Z)(u)),(0,A.Z)(I,(0,D.Z)(f));const P=new R.Z;M.append(P.element),b.append(L),g.append(b),this.scrollable.append(g);const Z=document.createElement("div");Z.classList.add(m+"-preloader-container"),(0,Dt.y)(Z,!0),this.scrollable.container.append(Z);const k=this.inputInvoice;a||(a=l?yield this.managers.appPaymentsManager.getPaymentReceipt(o.peerId,r.receipt_msg_id||k.msg_id):yield this.managers.appPaymentsManager.getPaymentForm(k),this.paymentForm=a);let T=a.saved_info||a.info;const x=null===(i=a.saved_credentials)||void 0===i?void 0:i[0];let[_,F,B]=yield Promise.all([!l&&T&&this.managers.appPaymentsManager.validateRequestedInfo(k,T),x&&this.managers.passwordManager.getState(),(0,Bt.Z)({peerId:a.provider_id.toPeerId()})]);yield P.update({peerId:a.bot_id.toPeerId()}),Z.remove(),this.element.classList.remove("is-loading");const N=(e,t)=>(0,yt.Z)(e,H,t),{invoice:U}=a,H=U.currency,z=U.pFlags.recurring&&!l;yield P.update({peerId:a.bot_id.toPeerId()});const j=z?yield(0,Bt.Z)({peerId:a.bot_id.toPeerId()}):void 0;Z.remove(),this.element.classList.remove("is-loading");const V=()=>{const e=document.createElement("div");e.classList.add(K+"-price");const t=document.createElement("span"),i=document.createElement("span");return e.append(t,i),{label:e,left:t,right:i}},K=m+"-prices",W=document.createElement("div");W.classList.add(K);const $=e=>e.map((e=>{const{amount:t,label:i}=e,s=V();s.left.textContent=i;const n=N(t);return s.right.textContent=n,s.label})),q=$(U.prices);let Q=()=>0,Y=0;const J=()=>{const e=N(te+Q()+Y);ee.right.textContent=e,X.compareAndUpdate({key:"PaymentCheckoutPay",args:[e]})},X=new S.ZP.IntlElement,ee=V();ee.label.classList.add("is-total"),(0,S.$d)(ee.left,"PaymentTransactionTotal");const te=Ct(U.prices.map((({amount:e})=>+e)),0),ie=void 0!==U.max_tip_amount&&!l||!!a.tip_amount;if(ie){const e=m+"-tips",t=wt.Z[H];Q=()=>+i().replace(/\D/g,"");const i=()=>r.value,s=()=>{const e=(0,Lt.Z)(i(),`500 ${St.Bf} ${St.bt}`);r.style.width=e+"px"},n=e=>{e=Math.min(+e,+U.max_tip_amount);const t=N(e,!0);r.value=t,document.activeElement===r&&(0,Tt.Z)(r),g&&g();const i=this.tipButtonsMap.get(e);i&&i.classList.add("active"),s(),J()},o=V();(0,S.$d)(o.left,l?"PaymentTip":"PaymentTipOptional");const r=document.createElement("input");r.type="tel",r.classList.add("input-clear",e+"-input"),o.right.append(r),l?o.label.classList.add("disable-hover"):o.label.style.cursor="text",o.label.addEventListener("mousedown",(e=>{(0,_e.Z)(e.target,r)||(0,Tt.Z)(r)}));const d=r instanceof HTMLInputElement?1:2,c=()=>{f?--f:(f=d,(0,Tt.Z)(r))},h=()=>{setTimeout((()=>{f=d,(0,Tt.Z)(r),document.addEventListener("selectionchange",c)}),0)},u=()=>{r.addEventListener("focus",h,{once:!0}),document.removeEventListener("selectionchange",c)};let f;r.addEventListener("focusout",u),u(),r.addEventListener("input",(()=>{n(Q())}));const p=[t.symbol,t.space_between?" ":""];let g;if(t.symbol_left||p.reverse(),o.right[t.symbol_left?"prepend":"append"](p.join("")),q.push(o.label),l)n(a.tip_amount);else{const t=document.createElement("div");t.classList.add(e);const i=e+"-tip",s=U.suggested_tip_amounts.map((e=>{const t=(0,Re.Z)(i,{noRipple:!0});return t.textContent=N(e),this.tipButtonsMap.set(+e,t),t}));g=()=>{const e=t.querySelector(".active");e&&e.classList.remove("active")},(0,w.fc)(t,(e=>{const t=(0,fe.Z)(e.target,i);if(!t)return;let s=0;if(t.classList.contains("active"))t.classList.remove("active");else{g(),t.classList.add("active");for(const[e,i]of this.tipButtonsMap)if(i===t){s=e;break}}n(s)})),n(0),t.append(...s),q.push(t)}}else J();q.push(ee.label),W.append(...q),g.append(W);const se=(e,t)=>Mi(this,void 0,void 0,(function*(){const i=document.createElement("img");i.classList.add("media-photo"),yield(0,xt.cj)(i,Zi(t));let s=e.media;s?(0,O.Z)(s,i):(s=e.createMedia("small"),s.classList.add("media-container-cover"),s.append(i))})),ne=e=>{e.titleLangKey&&(e.subtitleLangKey=e.titleLangKey),e.noWrap=!0;const t=new Rt.ZP(e);return t.container.classList.add(m+"-row"),e.titleLangKey&&t.subtitle.classList.add("hide"),t},ae=(e,t)=>{if(e.title.textContent=t,!t){const t=S.ZP.weakMap.get(e.subtitle.firstElementChild);e.title.append((0,S.ag)(t.key))}e.subtitle.classList.toggle("hide",!t)},oe=e=>{let t,i,s;"title"in e?(t=e.title.split(" ").shift(),i=e.title,s=e.icon):(t=kt(e.cardNumber),i=t+" *"+e.cardNumber.split(" ").pop()),ce.title.classList.remove("tgico","tgico-card_outline"),se(ce,s||t.toLowerCase()),ae(ce,i)},re=()=>{new yi(a,de).addEventListener("finish",(({token:e,card:t})=>{le=e,de=t,oe(t)}))};let de,le;const ce=ne({titleLangKey:"PaymentCheckoutMethod",clickable:l?void 0:re,icon:"card_outline"});ce.container.classList.add(m+"-method-row"),x?oe(x):a.credentials_title&&oe({title:a.credentials_title});const he=ne({title:B,subtitleLangKey:"PaymentCheckoutProvider"}),ue=new p.Z;let pe,ge,ve,be,ye,we,Se,Ce;ue.classList.add("avatar-32"),he.createMedia("small").append(ue),ue.updateWithOptions({peerId:a.provider_id.toPeerId()});const Le=U.pFlags.shipping_address_requested?e=>{if(!e)return ye.subtitle.classList.add("hide"),void(0,O.Z)(ye.title,(0,S.ag)("PaymentShippingAddress"));const t=e.shipping_address;ae(pe,[t.city,t.street_line1,t.street_line2].filter(Boolean).join(", ")),ye.container.classList.toggle("hide",!_&&!l)}:void 0,Ee=e=>{Le&&Le(e),ge&&ae(ge,e.name),ve&&ae(ve,e.email),be&&ae(be,e.phone&&"+"+(0,Ze.u)(e.phone).formatted)};if(l||(Se=e=>{new Li(a,k,e).addEventListener("finish",(({shippingAddress:e,requestedInfo:t})=>{_=t,T=a.saved_info=e,Ee(e)}))}),U.pFlags.shipping_address_requested){const e=e=>{const i=new Ye(this.scrollable,void 0,!0);if(i.save(),t&&t.forEach((e=>e.remove())),!e)return Y=0,J(),i.restore(),void this.onContentUpdate();we=e,ae(ye,e.title),Y=Ct(e.prices.map((({amount:e})=>+e)),0),t=$(e.prices);let s=ee.label;ie&&(s=s.previousElementSibling,l||(s=s.previousElementSibling)),t.forEach((e=>s.parentElement.insertBefore(e,s))),J(),i.restore(),this.onContentUpdate()};let t;pe=ne({icon:"location",titleLangKey:"PaymentShippingAddress",clickable:!l&&Se.bind(null,void 0)}),ye=ne({icon:"shipping",titleLangKey:"PaymentCheckoutShippingMethod",clickable:!l&&(Ce=()=>{new Ii(a,_,we).addEventListener("finish",(t=>{e(t)}))})}),ye.container.classList.add("hide");const i=a.shipping;i&&e(i)}U.pFlags.name_requested&&(ge=ne({icon:"newprivate",titleLangKey:"PaymentCheckoutName",clickable:!l&&Se.bind(null,"name")})),U.pFlags.email_requested&&(ve=ne({icon:"mention",titleLangKey:"PaymentShippingEmailPlaceholder",clickable:!l&&Se.bind(null,"email")})),U.pFlags.phone_requested&&(be=ne({icon:"phone",titleLangKey:"PaymentCheckoutPhoneNumber",clickable:!l&&Se.bind(null,"phone")})),T&&Ee(T);const Ie=[ce,he,pe,ye,ge,ve,be].filter(Boolean),Me=z&&new Ft.Z({text:"Payments.Recurrent.Accept",textArgs:[(0,ot.ZP)(U.recurring_terms_url),j]}),Pe=z&&ne({checkboxField:Me}),ke=z?[document.createElement("hr"),Pe.container]:[];let Te,xe;this.scrollable.append(...[document.createElement("hr"),...Ie.map((e=>e.container)),...ke].filter(Boolean));const Ae=()=>{Fe.disabled=!(!Me||Me.checked)};let Fe;Fe=ki(l?{onClick:()=>this.hide(),key:"Done"}:{onClick:()=>{const e=U.pFlags.name_requested&&!(null==T?void 0:T.name)?"name":U.pFlags.email_requested&&!(null==T?void 0:T.email)?"email":U.pFlags.phone_requested&&!(null==T?void 0:T.phone)?"phone":void 0;if(U.pFlags.shipping_address_requested){if(!_)return void Se();if(!we)return void Ce()}else if(e)return void Se(e);return de||xe?Promise.resolve().then((()=>Mi(this,void 0,void 0,(function*(){const e=xe?{_:"inputPaymentCredentialsSaved",id:x.id,tmp_password:xe.tmp_password}:{_:"inputPaymentCredentials",data:{_:"dataJSON",data:JSON.stringify(le.token?le:{type:le.type,id:le.id})},pFlags:{save:de.save||void 0}};try{const t=yield this.managers.appPaymentsManager.sendPaymentForm(k,a.form_id,null==_?void 0:_.id,null==we?void 0:we.id,e,Q());"payments.paymentResult"===t._?n():(Te=new fi(t.url,!r.extended_media),Te.addEventListener("finish",(()=>{Te=void 0,n()})),yield new Promise(((e,t)=>{Te.addEventListener("close",(()=>{if(Te=void 0,s)e();else{const e=new Error("payment not finished");e.handled=!0,t(e)}}))})))}catch(e){throw"BOT_PRECHECKOUT_TIMEOUT"===e.type?((0,me.bC)({langPackKey:"Error.AnError"}),e.handled=!0):"TMP_PASSWORD_INVALID"===e.type&&(F=xe=void 0,(0,w.tH)(Fe),e.handled=!0),e}})))):x?void Promise.resolve(null!=F?F:this.managers.passwordManager.getState()).then((e=>{new wi(x.title,e).addEventListener("finish",(e=>{F=void 0,xe=e,(0,w.tH)(Fe);const t=e.valid_until-(0,_t.Z)(!0)-5;setTimeout((()=>{xe===e&&(xe=void 0)}),1e3*t)}))})):void re()},textEl:X}),Ae(),Me&&Me.input.addEventListener("change",Ae),this.body.append(this.btnConfirmOnEnter=Fe),this.onContentUpdate()}))}}var xi=i(8487),Ai=i(13),_i=i(9259),Fi=i(3228);class Di{constructor(e,t,i,s,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=i,this.spacing=s,this.maxHeight=n,this.count=e.length,this.ratios=Di.countRatios(e),this.proportions=Di.countProportions(this.ratios),this.averageRatio=Ct(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find((e=>e>2))?new Ri(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:14}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:13},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:7}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),i=this.maxWidth-t-this.spacing,s=Math.min(this.maxHeight,Math.round(Math.min(i/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:i,height:s},sides:13},{geometry:{x:i+this.spacing,y:0,width:t,height:s},sides:7}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),i=e-t-this.spacing,s=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],i*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-s);return[{geometry:{x:0,y:0,width:n,height:e},sides:13},{geometry:{x:n+this.spacing,y:0,width:s,height:i},sides:3},{geometry:{x:n+this.spacing,y:i+this.spacing,width:s,height:t},sides:6}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=(this.maxWidth-this.spacing)/2,s=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(i/this.ratios[1],i/this.ratios[2]))),n=e-i-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:i,height:s},sides:12},{geometry:{x:i+this.spacing,y:t+this.spacing,width:n,height:s},sides:6}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),s=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),i*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),i*this.ratios[3])),a=e-s-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,i);return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:s,height:o},sides:12},{geometry:{x:s+this.spacing,y:t+this.spacing,width:a,height:o},sides:4},{geometry:{x:s+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:6}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),i=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),s=Math.round(i/this.ratios[1]),n=Math.round(i/this.ratios[2]),a=e-s-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,i));return[{geometry:{x:0,y:0,width:t,height:e},sides:13},{geometry:{x:t+this.spacing,y:0,width:o,height:s},sides:3},{geometry:{x:t+this.spacing,y:s+this.spacing,width:o,height:n},sides:2},{geometry:{x:t+this.spacing,y:s+n+2*this.spacing,width:o,height:a},sides:6}]}static countRatios(e){return e.map((e=>e.w/e.h))}static countProportions(e){return e.map((e=>e>1.2?"w":e<.8?"n":"q")).join("")}}class Ri{constructor(e,t,i,s,n,a=4*i/3){this.averageRatio=t,this.maxWidth=i,this.minWidth=s,this.spacing=n,this.maxHeight=a,this.ratios=Ri.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map((e=>t>1.1?(0,Fi.Z)(e,1,2.75):(0,Fi.Z)(e,.6667,1)))}layout(){const e=new Array(this.count),t=[],i=(e,t)=>{const i=Ct(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/i},s=e=>{const s=[];let n=0;for(const t of e)s.push(i(n,t)),n+=t;t.push({lineCounts:e,heights:s})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||s([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const i=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||i>3||s([e,t,i])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let i=1;i!==this.count-e-t;++i){const n=this.count-e-t-i;e>3||t>3||i>3||n>3||s([e,t,i,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:i}=e,s=i.length,o=Ct(t,0)+this.spacing*(s-1),r=Math.min(...t),d=(Math.max(...t),r{for(let e=1;e!==s;++e)if(i[e-1]>i[e])return 1.5;return 1})(),c=Math.abs(o-this.maxHeight)*d*l;(!n||c2&e.sides)),s=i.geometry.width+i.geometry.x,n=t.find((e=>4&e.sides)),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=s+"px",o.style.height=a+"px";const r=o.children;t.forEach((({geometry:t,sides:i},n)=>{let d;if(d=r[n],d||(d=document.createElement("div"),o.append(d)),d.classList.add("album-item","grouped-item"),d.style.width=t.width/s*100+"%",d.style.height=t.height/a*100+"%",d.style.top=t.y/a*100+"%",d.style.left=t.x/s*100+"%",8&i&&1&i&&(d.style.borderTopLeftRadius="inherit"),8&i&&4&i&&(d.style.borderBottomLeftRadius="inherit"),2&i&&1&i&&(d.style.borderTopRightRadius="inherit"),2&i&&4&i&&(d.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),d.append(e)}}))}function Ni({messages:e,attachmentDiv:t,middleware:i,uploading:s,lazyLoadQueue:n,isOut:a,chat:r,loadPromises:l,autoDownload:c,managers:h=d.Z.managers}){const u=[];for(const t of e){const e=(0,lt.Z)(t),i="photo"===e._?(0,H.Z)(e,480,480):{w:e.w,h:e.h};u.push({size:i,media:e,message:t})}Bi({container:t,items:u.map((e=>({w:e.size.w,h:e.size.h}))),maxWidth:o.Z.active.album.width,minWidth:100,spacing:2,forMedia:!0}),u.forEach(((e,s)=>{const{size:o,media:r,message:d}=e,u=t.children[s];u.dataset.mid=""+d.mid,u.dataset.peerId=""+d.peerId;const f=u.firstElementChild;let p;p="photo"===r._?(0,G.Z)({photo:r,message:d,container:f,boxWidth:0,boxHeight:0,isOut:a,lazyLoadQueue:n,middleware:i,size:o,loadPromises:l,autoDownloadSize:c.photo,managers:h}):(0,K.Z)({doc:d.media.document,container:f,message:d,boxWidth:0,boxHeight:0,withTail:!1,isOut:a,lazyLoadQueue:n,middleware:i,loadPromises:l,autoDownload:c,managers:h}),p&&l&&l.push(p)}))}var Oi=i(296),Ui=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))},Hi=i(3552),zi=i(9893);class ji extends Hi._{init(e){return t=this,i=void 0,n=function*(){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);const t=yield this.managers.appPollsManager.getPoll(e.media.poll.id);this.setTitle(t.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");(0,A.Z)(i,(0,D.Z)(t.poll.question));const s=t.results.results.map((e=>e.voters/t.results.total_voters*100));Ki(s);const n=document.createDocumentFragment();t.results.results.forEach(((i,o)=>{if(!i.voters)return;const r=document.createElement("hr"),d=t.poll.answers[o],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");(0,A.Z)(c,(0,D.Z)(d.text));const h=document.createElement("div");h.innerText=Math.round(s[o])+"%",l.append(c,h);const u=zi.default.createChatList();u.classList.add("poll-results-voters"),zi.default.setListClickListener(u,(()=>{a.ZP.onCloseBtnClick()}),void 0,!0),u.style.minHeight=48*Math.min(i.voters,4)+"px",n.append(r,l,u);let f,p=4,m=!1,g=Math.max(0,i.voters-4);const v=()=>{m||(m=!0,this.managers.appPollsManager.getVotes(e,d.option,f,p).then((e=>{e.votes.forEach((e=>{const{dom:t}=zi.default.addDialogNew({peerId:e.user_id.toPeerId(!1),container:u,rippleEnabled:!1,meAsSaved:!1,avatarSize:"small"});t.lastMessageSpan.parentElement.remove()})),f&&(g=Math.max(0,g-e.votes.length),g&&b.lastElementChild.replaceWith((0,S.ag)("PollResults.LoadMore",[Math.min(20,g)]))),f=e.next_offset,p=20,g&&e.votes.length||b.remove()})).finally((()=>{m=!1})))},b=(0,Re.Z)("poll-results-more btn btn-primary btn-transparent",{icon:"down"});b.addEventListener("click",v),b.append((0,S.ag)("PollResults.LoadMore",[Math.min(20,g)])),n.append(b),v()})),this.resultsDiv.append(i,n),a.ZP.toggleSidebar(!0).then((()=>{}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}var Gi=i(5157);let Vi=0;const Ki=e=>{const t=e.reduce(((e,t)=>e+Math.round(t)),0);if(t>100){const i=t-100,s=e.length;for(let t=0;t=.5&&si&&(i=s,t=n)}if(-1===t)return;e[t]+=1-i}}};d.Z.addEventListener("poll_update",(({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach((i=>{i.isClosed=!!e.pFlags.closed,i.performResults(t,e.chosenIndexes)}))})),o.Z.addEventListener("resize",(()=>{Ji.setMaxLength(),Ji.resizePolls()})),o.Z.addEventListener("changeScreen",(()=>{Ji.setMaxLength()}));const Wi=(e,t,i)=>{e.classList.remove("active"),clearTimeout(i),setTimeout((()=>{t(),e.remove(),$i===e&&qi===t&&Qi===i&&($i=qi=null,Qi=0)}),200)};let $i,qi,Qi,Yi=!1;class Ji extends HTMLElement{constructor(){super(...arguments),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=Pe.Z.width<=360?Pe.Z.width-120:o.Z.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){this.MAX_LENGTH&&Array.from(document.querySelectorAll("poll-element.is-voted")).forEach((e=>{e.svgLines.forEach(((t,i)=>{e.setLineProgress(i,1)}))}))}render(){return e=this,t=void 0,s=function*(){Vi||(Vi=document.getElementById("poll-line").getTotalLength(),Ji.setMaxLength());const{poll:e,results:t}=this.message.media;let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),e.pFlags&&(this.isPublic=!!e.pFlags.public_voters,this.isQuiz=!!e.pFlags.quiz,this.isClosed=!!e.pFlags.closed,this.isMultiple=!!e.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const s=this.isMultiple?'':"",n=e.answers.map(((e,t)=>`\n
\n
\n
\n \n \n \n ${s}\n
\n
\n
\n \n \n
\n `)).join("");if(this.innerHTML=`\n
\n
\n
\n
\n
\n ${n}`,(0,A.Z)(this.firstElementChild,(0,D.Z)(e.question)),Array.from(this.querySelectorAll(".poll-answer-text")).forEach(((t,i)=>{(0,A.Z)(t,(0,D.Z)(e.answers[i].text))})),this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append((0,S.ag)(i)),this.isQuiz&&(this.classList.add("is-quiz"),e.close_period&&e.close_date)){const t=document.createElement("div");t.classList.add("poll-time"),this.descDiv.append(t);const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("poll-quiz-timer"),this.quizTimer=i;const s=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",""+s),i.append(o),this.descDiv.append(i);const r=1e3*e.close_period,l=1e3*(e.close_date-(yield d.Z.managers.timeManager.getServerTimeOffset()));this.quizInterval=window.setInterval((()=>{const e=Date.now(),i=(l-e)/r,s=(l-e)/1e3+1|0;t.innerHTML=(0,Gi.Z)(s),s<=5&&(t.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+i*a,o.style.strokeDasharray=`${a} ${a}`,e>=l&&(clearInterval(this.quizInterval),t.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout((()=>{this.managers.appPollsManager.getResults(this.message)}),3e3))}),1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const 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((0,S.ag)("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=>{(0,be.Z)(e),a.ZP.isTabExists(ji)||a.ZP.createTab(ji).open(this.message)})),(0,T.Z)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append((0,S.ag)("Chat.Poll.SubmitVote")),(0,T.Z)(this.sendVoteBtn),e.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),(0,w.fc)(this.sendVoteBtn,(e=>{(0,be.Z)(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=!(e.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(t,e.chosenIndexes,!1),r&&(this.setVotersCount(t),(0,w.fc)(this,this.clickHandler))},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),(0,w.fc)(t,(i=>{(0,be.Z)(i),t.classList.add("active"),((e,t,i)=>{$i&&Wi($i,qi,Qi);const s=document.createElement("div");s.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),s.append(n),(0,A.Z)(a,(0,ot.ZP)(e,{entities:t})),Ar.chat.bubbles.container.append(s),s.offsetLeft,s.classList.add("active"),$i=s,qi=i,Qi=window.setTimeout((()=>{Wi(s,i,Qi)}),c.Z?5e3:7e3),Yi||(Yi=!0,Ar.addEventListener("peer_changed",(()=>{$i&&Wi($i,qi,Qi)})))})(e.solution,e.solution_entities,(()=>{t.classList.remove("active")}))})),this.sentVote){const i=e.results.find((e=>e.pFlags.correct));i&&!i.pFlags.chosen&&(0,w.tH)(t)}}}clickHandler(e){const t=(0,fe.Z)(e.target,"poll-answer");if(!t)return;(0,be.Z)(e);const i=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(i);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(i)}else this.sendVotes([i])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter(((t,i)=>e.includes(i)));return t.forEach((e=>{e.classList.add("is-voting")})),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=this.managers.appPollsManager.sendVote(this.message,e).then((()=>{t.forEach((e=>{e.classList.remove("is-voting")})),this.classList.remove("disable-hover")})).catch((()=>{this.sentVote=!1})).finally((()=>{this.sendVotePromise=null}))}performResults(e,t,i=!0){var s,n;if(d.Z.settings.animationsEnabled||(i=!1),this.isQuiz&&((null===(s=e.results)||void 0===s?void 0:s.length)||this.isClosed)){this.answerDivs.forEach(((t,i)=>{t.classList.toggle("is-correct",!!e.results[i].pFlags.correct)})),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(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"),(0,O.Z)(this.typeDiv,(0,S.ag)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?(0,w.fc)(this,this.clickHandler):(0,w.EN)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map((t=>e.total_voters?t.voters/e.total_voters*100:0));this.classList.toggle("no-transition",!i),i&&(0,Te.Z)(this,"",!this.isRetracted,340),(0,le.T2)((()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,i),this.percents=t,this.isRetracted=!1}))}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));const t=(e.recent_voters||[]).map((e=>e.toPeerId())),i=new X({avatarSize:16});i.render(t),(0,O.Z)(this.avatarsDiv,i.container)}if(this.isMultiple){const t=!!this.chosenIndexes.length,i=this.isClosed||t,s=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",i),this.viewResults.classList.toggle("hide",s),this.votersCountDiv.classList.toggle("hide",!i||!s)}}setResults(e,t,i){this.svgLines.forEach((e=>e.style.display="")),this.answerDivs.forEach(((e,i)=>{e.classList.toggle("is-chosen",t.includes(i))}));const s=Math.max(...e);if(this.maxPercents=e.map((e=>e/s)),this.isRetracted)this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,-1)}));else{const e=()=>{this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,1)}))};i?(0,le.T2)(e):e()}let n;e=e.slice(),Ki(e);const a=t=>{e.forEach(((e,i)=>{const s=n(e,t);this.numberDivs[i].innerText=s+"%"}))};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),i)for(let e=9,t=0;e>=0;--e,++t)setTimeout((()=>{a(e)}),34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),i)for(let e=0;e<10;++e)setTimeout((()=>{a(e)}),34*e);else a(9);if(this.isRetracted){i&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach((e=>e.style.display="none"))};i?setTimeout((()=>{this.classList.remove("is-retracting"),e()}),340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let i;const s=[t];i=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",(0,O.Z)(this.votersCountDiv,(0,S.ag)(i,s))}setLineProgress(e,t){const i=this.svgLines[e];-1===t?(i.style.strokeDasharray="",i.style.strokeDashoffset=""):(i.style.strokeDasharray=t*this.maxPercents[e]*Ji.MAX_LENGTH+", 485.9",i.style.strokeDashoffset=""+t*Ji.MAX_OFFSET)}}Ji.MAX_OFFSET=-46.5,Ji.MAX_LENGTH=0,customElements.define("poll-element",Ji);new RegExp("^[^A-Za-zÀ-ÖØ-öø-ʸ̀-֐ࠀ-῿Ⰰ-﬜﷾-﹯﻽-￿]*[֑-߿יִ-﷽ﹰ-ﻼ]");const Xi=new RegExp("[֑-߿יִ-﷽ﹰ-ﻼ]");class es{constructor(e,t){this.width=e,this.height=t;const i=this.canvas=document.createElement("canvas"),s=this.dpr=window.devicePixelRatio;i.width=e*s,i.height=t*s,i.classList.add("canvas-thumbnail","canvas-dots"),this.paused=!0,this.autoplay=!0,this.tempId=0,this.context=i.getContext("2d")}prepare(){let e=Math.round(this.width*this.height/(35*(k.IS_MOBILE?2:1)));e=Math.min(k.IS_MOBILE?1e3:2200,e);const t=this.dots=new Array(e);for(let i=0;i=.8?1:.5)*this.dpr,a=new Path2D;return a.arc(t,i,n,0,2*Math.PI,!1),{x:t,y:i,opacity:s,radius:n,mOpacity:s,adding:null!=e?e:Math.random()>=.5,counter:0,path:a}}draw(){const{context:e,canvas:t,dots:i}=this;e.clearRect(0,0,t.width,t.height),e.fillStyle="#fff";for(let t=0,s=i.length;t=1&&(i[t]=this.generateDot(s.adding))):s.mOpacity>=1&&(s.adding=!1)}}remove(){this.pause()}pause(){this.paused||(this.paused=!0,++this.tempId)}renderFirstFrame(){this.dots||this.prepare(),this.draw()}play(){if(!this.paused)return;this.paused=!1;const e=++this.tempId;this.dots||this.prepare(),(0,Ce.jt)((()=>this.tempId===e&&!this.paused&&(this.draw(),!0)))}}var ts=i(5345),is=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const ss=new Set(["messageActionHistoryClear","messageActionChatCreate"]),ns=new Set;De.Z&&ns.add("messageActionPhoneCall");const as=void 0;let os=as,rs=0;const ds=3,ls=new Error("peer changed"),cs={1:96,2:90,3:84,4:72,5:60,6:48,7:36},hs=Object.keys(cs).length;function us(e){return Math.max(...e)}class fs{constructor(e,t){let i;this.chat=e,this.managers=t,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.bubblesNewByGroupedId={},this.bubblesNew={},this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middlewareHelper=(0,ve.k)(),this.replyFollowHistory=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.renderingMessages=new Set,this.bubblesToEject=new Set,this.bubblesToReplace=new Map,this.setPeerTempId=0,this.renderNewPromises=new Set,this.extendedMediaMessages=new Set,this.unreadedObserverCallback=e=>{if(e.isIntersecting){const t=e.target,i=this.unreaded.get(t);this.onUnreadedInViewport(t,i)}},this.viewsObserverCallback=e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.observer.unobserve(e.target,this.viewsObserverCallback),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this;e&&e.random_id&&(delete e.random_id,this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(),e.random_id))}}},this.stickerEffectObserverCallback=e=>{if(e.isIntersecting){this.observer.unobserve(e.target,this.stickerEffectObserverCallback);const t=e.target.querySelector(".attachment");(0,de.e9)().then((()=>{(0,xi.Z)(t)&&(0,w.tH)(t)}))}},this.onBubblesMouseMove=e=>is(this,void 0,void 0,(function*(){const t=(0,fe.Z)(e.target,"bubble-content");if(!t||this.chat.selection.isSelecting||(0,fe.Z)(e.target,"service")||(0,fe.Z)(e.target,"bubble-beside-button"))this.unhoverPrevious();else{const e=(0,fe.Z)(t,"bubble");if(!this.chat.selection.canSelectBubble(e))return void this.unhoverPrevious();let{hoverBubble:i,hoverReaction:s}=this;if(e===i)return;if(this.unhoverPrevious(),i=this.hoverBubble=e,s=this.hoverReaction,s)s.dataset.loaded&&this.setHoverVisible(s,!0);else{s=this.hoverReaction=document.createElement("div"),s.classList.add("bubble-hover-reaction");const i=document.createElement("div");i.classList.add("bubble-hover-reaction-sticker"),s.append(i),t.append(s);let n=yield this.chat.getMessage(+e.dataset.mid);if("message"!==(null==n?void 0:n._))return void this.unhoverPrevious();n=yield this.managers.appMessagesManager.getGroupsFirstMessage(n);const a=this.getMiddleware((()=>this.hoverReaction===s));Promise.all([this.managers.appReactionsManager.getAvailableReactionsByMessage(n),(0,Qe.Z)(400)]).then((([e])=>{const t=e[0];t?(0,V.ZP)({div:i,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:this.chat.animationGroup,withThumb:!1,needFadeIn:!1}).then((({render:e})=>e)).then((e=>{(0,Le.Z)(e),e.addEventListener("firstFrame",(()=>{a()&&(s.dataset.loaded="1",this.setHoverVisible(s,!0))}),{once:!0}),(0,w.fc)(s,(e=>{(0,be.Z)(e),this.managers.appReactionsManager.sendReaction(n,t),this.unhoverPrevious()}),{listenerSetter:this.listenerSetter})}),Ke.Z):s.remove()}))}}})),this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>is(this,void 0,void 0,(function*(){var t;let i=e.target,s=null;try{s=(0,fe.Z)(i,"bubble")}catch(e){}if(!s&&!this.chat.selection.isSelecting){const e=(0,fe.Z)(i,"user-avatar");if(!e)return;const t=e.dataset.peerId.toPeerId();return void(t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,me.Am)(S.ZP.format("HidAccount",!0)))}if(s.classList.contains("is-date")&&(0,fe.Z)(i,"bubble-content")){if(s.classList.contains("is-fake")&&(s=s.previousElementSibling),s.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages)if(this.dateMessages[e].div===s){y.Z.createPopup(L,new Date(+e),this.onDatePick).show();break}return}if(!c.Z&&(0,fe.Z)(i,"time"))return void this.chat.selection.toggleByElement(s);if(this.chat.selection.isSelecting&&e.isTrusted){if(s.classList.contains("service")&&void 0===s.dataset.mid)return;return(0,be.Z)(e),c.Z&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement((0,fe.Z)(i,"grouped-item")||s)}const n=(0,fe.Z)(i,"contact");if(n)return void this.chat.appImManager.setInnerPeer({peerId:n.dataset.peerId.toPeerId()});const a=(0,fe.Z)(i,"bubble-call");if(a)return void this.chat.appImManager.callUser(this.peerId.toUserId(),a.dataset.type);if((0,fe.Z)(i,"is-buy")){(0,be.Z)(e);const t=yield this.chat.getMessage(+s.dataset.mid);if(!t)return;return void new Ti(t,yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(t.peerId,t.mid))}const o=(0,pe.Z)(i,"REACTION-ELEMENT");if(o){if((0,be.Z)(e),o.classList.contains("is-inactive"))return;const t=o.parentElement,i=t.getReactionCount(o),s=t.getMessage();return void this.managers.appReactionsManager.sendReaction(s,i.reaction)}const r=(0,Ae.Z)(i,"data-sticker-emoji");if(r&&1===r.parentElement.querySelectorAll("[data-sticker-emoji]").length&&s.classList.contains("emoji-big"))return void(0,V._2)({event:e,container:r,managers:this.managers,middleware:this.getMiddleware(),peerId:this.peerId});if((0,fe.Z)(i,"replies")){const e=+s.dataset.mid;if(this.peerId===m.hj){const t=yield this.chat.getMessage(e),i=(0,F.Z)(t.reply_to.reply_to_peer_id),s=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread(i,n,s)}else{const t=yield this.chat.getMessage(e),i=yield this.managers.appMessagesManager.getMessageWithReplies(t),s=i.replies;s&&this.managers.appMessagesManager.getDiscussionMessage(this.peerId,i.mid).then((e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})}))}return}const d=(0,fe.Z)(i,"is-via");if(d){const t=d.querySelector(".peer-title");if(i===t||(0,_e.Z)(i,t)){const i=t.innerText+" ";return this.managers.appDraftsManager.setDraft(this.peerId,this.chat.threadId,i),void(0,be.Z)(e)}}const l=(0,fe.Z)(i,"peer-title")||(0,pe.Z)(i,"AVATAR-ELEMENT")||(0,Ae.Z)(i,"data-saved-from");if(l&&l!==s){i=l||i;const e=i.dataset.peerId||i.getAttribute("peer")||i.peerId,t=i.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,n]=t.split("_");if(i.classList.contains("is-receipt-link")){const t=yield this.managers.appMessagesManager.getMessageByPeer(e.toPeerId(),+n);if(t){const e=yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId,+s.dataset.mid);new Ti(t,e,void 0,!0)}}else this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+n})}else{const t=e.toPeerId();t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,me.Am)(S.ZP.format("HidAccount",!0))}return}if(s.classList.contains("sticker")&&i.parentElement.classList.contains("attachment")){const e=+s.dataset.mid,i=null===(t=(yield this.chat.getMessage(e)).media)||void 0===t?void 0:t.document;return void((null==i?void 0:i.stickerSetInput)&&new I.Z(i.stickerSetInput).show())}const h=(0,fe.Z)(i,"document-with-thumb");if("IMG"===i.tagName&&!i.classList.contains("emoji")&&!i.classList.contains("document-thumb")||i.classList.contains("album-item")||"VIDEO"===i.tagName&&!s.classList.contains("round")||h&&!h.querySelector(".preloader-container")||i.classList.contains("canvas-thumbnail")){const t=(0,fe.Z)(i,"album-item")||(0,fe.Z)(i,"document-container"),n=(t||s).querySelector(".preloader-container");if(n)return(0,w.tH)(n),void(0,be.Z)(e);(0,be.Z)(e);const a=+(t||s).dataset.mid,o=yield this.chat.getMessage(a);if(!o)return void this.log.warn("no message by messageId:",a);const r="webpage",d=s.classList.contains(r),l=h?e=>ke.Z.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),c=[],u=d?[a]:(yield Promise.all(Object.keys(this.bubbles).map((e=>+e)).map((e=>is(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e),i=(0,lt.Z)(t);return i&&l(i)&&e})))))).filter(Boolean).sort(((e,t)=>e-t));u.forEach((e=>{let t;h?t=".document-container":(t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img");const i=Array.from(this.bubbles[e].querySelectorAll(t)),s=new Set;if(h)i.forEach((e=>{c.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})}));else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");i.forEach((i=>{if(t&&!(0,fe.Z)(i,"media-container-aspecter"))return;const n=(0,fe.Z)(i,"album-item"),a=n||i.parentElement;s.has(a)||(s.add(a),c.push({element:i,mid:n?+n.dataset.mid:e,peerId:this.peerId}))}))}})),c.sort(((e,t)=>e.mid-t.mid));const f=c.findIndex((e=>e.mid===a));return he.ZP&&this.log("open mediaViewer single with ids:",u,f,c),c[f]?void(new ke.Z).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:h?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!d,isScheduled:"scheduled"===this.chat.type}).openMedia(o,c[f].element,0,!0,c.slice(0,f),c.slice(f+1)):void this.log("no target for media viewer!",i)}if(-1===["IMG","DIV","SPAN"].indexOf(i.tagName)&&(i=(0,pe.Z)(i,"DIV")),-1!==["DIV","SPAN"].indexOf(i.tagName)){if(i.classList.contains("goto-original")){const e=s.dataset.savedFrom,[t,i]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+i})}if(i.classList.contains("forward")){const e=+s.dataset.mid,t=yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,e);return void new E.Z({[this.peerId]:yield this.managers.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!(0,fe.Z)(e.target,"reply")}catch(e){}if(t&&s.classList.contains("is-reply")){const e=+s.dataset.mid;this.replyFollowHistory.push(e);const t=yield this.chat.getMessage(e),i=t.reply_to.reply_to_peer_id?(0,F.Z)(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:i,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}})),this.onScroll=(e,t,i)=>{var s,n,a,o,r;if(this.isHeavyAnimationInProgress){if(null===(s=this.sliceViewportDebounced)||void 0===s||s.clearTimeout(),this.scrolledDown&&!e)return}else null===(n=this.chat.topbar.pinnedMessage)||void 0===n||n.setCorrectIndexThrottled(this.scrollable.lastScrollDirection),null===(a=this.sliceViewportDebounced)||void 0===a||a.call(this),this.setStickyDateManually();if(t&&t.distanceToEnd<300&&this.scrolledDown)return;const d=i?0:null!==(o=null==t?void 0:t.distanceToEnd)&&void 0!==o?o:this.scrollable.getDistanceToEnd();(0!==this.scrollable.lastScrollDirection&&d>0||t||i)&&(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!==(r=null==t?void 0:t.duration)&&void 0!==r?r:0))),d<300&&(i||this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.container.classList.add("scrolled-down"),this.scrolledDown=!0):this.container.classList.contains("scrolled-down")&&(this.container.classList.remove("scrolled-down"),this.scrolledDown=!1)},this.processBatch=(...e)=>is(this,void 0,void 0,(function*(){var t,i,s;let[n,a,o]=e;const r=e=>e.filter((e=>e&&this.bubbles[e.bubble.dataset.mid]===e.bubble));n=r(n),o("messages rendered");const d=null===(t=n[0])||void 0===t?void 0:t.reverse,{groups:l,avatarPromises:c}=this.groupBubbles(n.filter((e=>e.updatePosition))),h=n.reduce(((e,t)=>{const i=performance.now(),s=t.promises.slice(),n=s.map((e=>is(this,void 0,void 0,(function*(){return yield e,performance.now()-i}))));return Promise.all(n).then((e=>{o.groupCollapsed("media message time",performance.now()-i,t,e),e.forEach(((e,t)=>{o("media message time",e,t,s[t])})),o.groupEnd()})),e.push(...t.promises),e}),[]);h.push(...c),o("media promises to call",h,n,this.isHeavyAnimationInProgress),yield a(Promise.all([...h,this.setUnreadDelimiter()])),yield a((0,le.AD)()),o("media promises end"),n=r(n);const{restoreScroll:u,scrollSaver:f}=this.prepareToSaveScroll(d);null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this),this.ejectBubbles();for(const[e,t]of this.bubblesToReplace){if(f&&f.replaceSaved(t,e),!n.find((t=>t.bubble===e)))continue;const i=this.bubbleGroups.getItemByBubble(e);i?(i.mounted=!1,l.includes(i.group)||l.push(i.group)):this.log.error("NO ITEM BY BUBBLE",e),this.bubblesToReplace.delete(e)}this.chat.selection.isSelecting&&n.forEach((({bubble:e})=>{this.chat.selection.toggleElementCheckbox(e,!0)})),n.forEach((({message:e,bubble:t,updatePosition:i})=>{e.pFlags.local&&i&&this.chatInner[e.pFlags.sponsored?"append":"prepend"](t)})),this.bubbleGroups.mountUnmountGroups(l),null===(s=this.updatePlaceholderPosition)||void 0===s||s.call(this),null==u||u()})),this.onDatePick=e=>{const t=this.peerId;this.managers.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then((e=>{var i;(null===(i=null==e?void 0:e.messages)||void 0===i?void 0:i.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")}))},this.log=this.chat.log,this.listenerSetter=new ae.Z,this.constructBubbles(),this.batchProcessor=new ts.s({log:this.log,process:this.processBatch,possibleError:ls}),this.bubbleGroups=new b(this.chat),this.preloader=new M.Z({cancelable:!1}),this.lazyLoadQueue=new ne.Z(void 0,!0),this.lazyLoadQueue.queueId=++rs,this.listenerSetter.add(d.Z)("history_update",(({storageKey:e,sequential:t,message:i})=>is(this,void 0,void 0,(function*(){if(this.chat.messagesStorageKey!==e||"scheduled"===this.chat.type)return;const{mid:s}=i,n=this.bubbles[s];if(!n)return;if(this.renderNewPromises.size&&(yield Promise.all(Array.from(this.renderNewPromises))),this.messagesQueuePromise&&(yield this.messagesQueuePromise),this.bubbles[s]!==n)return;const a=this.bubbleGroups.getItemByBubble(n);if(!a)return;if(a.mid===s)return;if(t){const e=a.group,o=this.bubbleGroups.createItem(n,i),r=this.bubbleGroups.itemsArr.slice();(0,h.Z)(r,a);const l=this.bubbleGroups.findGroupSiblingByItem(o,r);if(e===(null==l?void 0:l.group)||e===this.bubbleGroups.getLastGroup()&&1===e.items.length&&o.dateTimestamp===a.dateTimestamp||this.peerId===d.Z.myId&&t&&o.dateTimestamp===a.dateTimestamp)return void this.bubbleGroups.changeBubbleMid(n,s)}this.bubbleGroups.removeAndUnmountBubble(n);const{groups:o}=this.groupBubbles([{bubble:n,message:i}]);this.bubbleGroups.mountUnmountGroups(o),this.scrollingToBubble&&this.scrollToEnd()})))),this.listenerSetter.add(d.Z)("dialog_flush",(({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map((e=>+e)))})),this.listenerSetter.add(d.Z)("message_sent",(e=>is(this,void 0,void 0,(function*(){const{storageKey:t,tempId:i,tempMessage:s,mid:n,message:a}=e;if(this.chat.messagesStorageKey!==t)return;const o=this.bubbles,r=o[i];if(r){const e=o[i];o[n]=e,e.dataset.mid=""+n,delete o[i],(0,le.T2)((()=>{const t=+e.dataset.mid;o[t]===e&&e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===d.Z.myId&&"scheduled"!==this.chat.type||!this.unreadOut.has(t)?"is-read":"is-sent"))}))}if(this.unreadOut.has(i)&&(this.unreadOut.delete(i),this.unreadOut.add(n)),"scheduled"===this.chat.type&&(Date.now()/1e3|0)>=s.date-10&&this.deleteMessagesByIds([n]),!r)return;let l,c;const h=a.grouped_id;if(h){l=yield this.managers.appMessagesManager.getMessagesByAlbum(h);const e=l.map((({mid:e})=>e));if(!e.length||us(e)!==n||o[n]!==r)return;if(o[n]!==r)return;c=Array.from(r.querySelectorAll(".grouped-item")).map((e=>+e.dataset.mid))}else l=[a],c=[i];const u=Array.from(r.querySelectorAll("reactions-element"));u.length&&u.forEach((e=>{e.changeMessage(a)})),l.forEach(((e,t)=>{var i,n,a,o,l;if(!e)return;const u=c[t],f=e.mid,p=r.querySelector(`.document-container[data-mid="${f}"]`)||r;if("message"!==e._)return;if(e.replies){const t=r.querySelector("replies-element");t&&(t.message=e,t.init())}const m=null!==(i=e.media)&&void 0!==i?i:{},g=m.document,v=m.poll,b=m.webpage;if(g){const t=p.querySelector(`.document-container[data-mid="${u}"] .document`);if(t){const i=(0,fe.Z)(t,"document-container");!(null===(o=null===(a=null===(n=s.media)||void 0===n?void 0:n.document)||void 0===a?void 0:a.thumbs)||void 0===o?void 0:o.length)&&(null===(l=g.thumbs)||void 0===l?void 0:l.length)&&(0,de.e9)().then((()=>is(this,void 0,void 0,(function*(){const i=t.querySelector(".time"),s=yield(0,Oi.Z)({message:e,fontSize:d.Z.settings.messagesTextSize});t.replaceWith(s),i&&(s.querySelector(".document")||s).append(i)})))),i&&(i.dataset.mid=""+f)}const i=p.querySelector(`audio-element[data-mid="${u}"], .document[data-doc-id="${u}"], .media-round[data-mid="${u}"]`);i&&(i instanceof oe.ZP||i.classList.contains("media-round")?(i.dataset.mid=""+e.mid,delete i.dataset.isOutgoing,i.message=e,i.onLoad(!0)):(i.dataset.docId=""+g.id,i.doc=g))}else if(v){const t=p.querySelector("poll-element");t&&(t.message=e,t.setAttribute("poll-id",""+v.id),t.setAttribute("message-id",""+f))}else b&&!p.querySelector(".web")&&(0,de.e9)().then((()=>{this.safeRenderMessage(e,!0,p),this.scrollToBubbleIfLast(p)}));if(h){const e=p.querySelector(`.grouped-item[data-mid="${u}"]`)||p;e&&(e.dataset.mid=""+f)}}))})))),this.listenerSetter.add(d.Z)("message_edit",(({storageKey:e,message:t})=>is(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t.mid];i&&(yield(0,de.e9)(),this.bubbles[t.mid]===i&&this.safeRenderMessage(t,!0,i))})))),this.listenerSetter.add(d.Z)("message_error",(({storageKey:e,tempId:t})=>is(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t];i&&(yield(0,de.e9)(),this.bubbles[t]===i&&(i.classList.remove("is-outgoing"),i.classList.add("is-error")))})))),this.listenerSetter.add(d.Z)("album_edit",(({peerId:e,messages:t,deletedMids:i})=>{if(e!==this.peerId)return;const s=t.map((({mid:e})=>e)),n=us(s.concat(Array.from(i))),a=this.bubbles[n];if(!a)return;const o=us(s),r=t.find((e=>e.mid===o));this.safeRenderMessage(r,!0,a)})),"scheduled"!==this.chat.type&&this.listenerSetter.add(d.Z)("messages_reactions",(e=>is(this,void 0,void 0,(function*(){let t;const i=e.map((({message:e,changedResults:t})=>is(this,void 0,void 0,(function*(){if(this.peerId!==e.peerId)return;const i=yield this.getMountedBubble(e.mid,e);return i?{bubble:i.bubble,message:e,changedResults:t}:void 0}))));(yield Promise.all(i)).filter(Boolean).forEach((({bubble:e,message:i,changedResults:s})=>{t||(t=this.createScrollSaver(!1),t.save());const n=i.peerId+"_"+i.mid,a=$e.get(n);if(a)for(const e of a)e.update(i,s);else{if(!i.reactions||!i.reactions.results.length)return;this.appendReactionsElementToBubble(e,i,i,s)}})),t&&t.restore()})))),this.listenerSetter.add(d.Z)("messages_downloaded",(({peerId:e,mids:t})=>is(this,void 0,void 0,(function*(){const i=this.getMiddleware();yield(0,de.e9)(),i()&&t.forEach((t=>{this.needUpdate;const i=[];(0,g.Z)(this.needUpdate,((s,n)=>{s.replyMid===t&&s.replyToPeerId===e&&(this.needUpdate.splice(n,1)[0],i.push(s))})),i.forEach((({mid:e,replyMid:t,replyToPeerId:i})=>is(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(!t)return;const i=yield this.chat.getMessage(e);se.setReply({chat:this.chat,bubble:t,message:i})}))))}))})))),(0,_i.Z)({listenTo:this.scrollable.container,listenerSetter:this.listenerSetter,findTarget:e=>{const t=e.target;return t.closest(".attachment.media-sticker-wrapper")||(0,fe.Z)(t,"attachment")&&t.closest(".custom-emoji")}}),(0,w.fc)(this.scrollable.container,this.onBubblesClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.scrollable.container)("mousedown",(e=>{if(0!==e.button)return;const t=(0,pe.Z)(e.target,"CODE");return t?((0,be.Z)(e),i=t,(0,it.T)(i.textContent),void(0,me.bC)({langPackKey:"TextCopied"})):void 0;var i})),this.stickyIntersector=new Z.Z(this.scrollable.container,((e,t)=>{for(const i in this.dateMessages){const s=this.dateMessages[i];if(s.container===t){const t=s.div;t.classList.toggle("is-sticky",e),e&&(this.previousStickyDate=t);break}}this.previousStickyDate})),k.IS_SAFARI||(this.sliceViewportDebounced=(0,Ee.Z)(this.sliceViewport.bind(this),3e3,!1,!0)),(0,de.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),i=this.getMiddleware()}),(()=>{this.isHeavyAnimationInProgress=!1,(null==i?void 0:i())&&this.lazyLoadQueue.unlockAndRefresh(),i=null}),this.listenerSetter)}constructBubbles(){const e=this.container=document.createElement("div");e.classList.add("bubbles","scrolled-down"),(this.chatInner=document.createElement("div")).classList.add("bubbles-inner"),this.setScroll(),e.append(this.scrollable.container)}attachContainerListeners(){const e=this.container;if(this.chat.contextMenu.attachTo(e),this.chat.selection.attachListeners(e,new ae.Z),he.ZP&&this.listenerSetter.add(e)("dblclick",(e=>is(this,void 0,void 0,(function*(){const t=(0,fe.Z)(e.target,"grouped-item")||(0,fe.Z)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",yield this.chat.getMessage(e)),this.highlightBubble(t)}})))),"pinned"!==this.chat.type&&"scheduled"!==this.chat.type)if(k.IS_MOBILE){if(c.Z){const t="is-gesturing-reply",i=64,s=.75*i;let n,a,o=!1;(0,xe.Z)({element:e,verifyTouchTarget:e=>is(this,void 0,void 0,(function*(){return!(this.chat.selection.isSelecting||!(yield this.chat.canSend())||(n=(0,fe.Z)(e.target,"bubble"),n&&((0,Te.Z)(n,t,!0,250),n.offsetLeft,a?(a.classList.remove("is-visible"),a.style.opacity=""):(a=document.createElement("span"),a.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),n.append(a)),!n))})),onSwipe:(e,t)=>{o=e>=s,o&&!a.classList.contains("is-visible")&&a.classList.add("is-visible"),a.style.opacity=""+Math.min(1,e/s);const r=-Math.max(0,Math.min(i,e));n.style.transform=`translateX(${r}px)`,(0,pt.s)()},onReset:()=>{const e=n;(0,Te.Z)(e,t,!1,250,(()=>{a.parentElement===e&&(a.classList.remove("is-visible"),a.remove())})),(0,le.T2)((()=>{if(e.style.transform="",o){const{mid:t}=e.dataset;this.chat.input.initMessageReply(+t),o=!1}}))},listenerOptions:{capture:!0}})}}else this.listenerSetter.add(e)("dblclick",(e=>is(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting||!(yield this.chat.canSend()))return;const t=e.target,i=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(i&&!i.classList.contains("bubble-first")){const e=+i.dataset.mid;if((yield this.chat.getMessage(e)).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}))))}constructPeerHelpers(){this.listenerSetter.add(d.Z)("history_append",(({storageKey:e,message:t})=>is(this,void 0,void 0,(function*(){e===this.chat.messagesStorageKey&&(d.Z.settings.animationsEnabled&&(this.updateGradient=!0),this.scrollable.loadedAll.bottom?this.renderNewMessage(t,!0):this.chat.setMessageId())})))),this.listenerSetter.add(d.Z)("history_multiappend",(e=>{this.peerId===e.peerId&&this.renderNewMessage(e)})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{e===this.peerId&&this.deleteMessagesByIds(Array.from(t))})),this.listenerSetter.add(d.Z)("dialog_unread",(({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),(0,de.e9)().then((()=>{this.updateUnreadByDialog()})))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{e.has(this.peerId)&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{this.peerId===e.peerId&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("chat_update",(e=>is(this,void 0,void 0,(function*(){this.peerId===e.toPeerId(!0)&&this.chatInner.classList.contains("has-rights")!==(yield this.chat.canSend())&&(yield Promise.all([this.finishPeerChange(),this.chat.input.finishPeerChange()])).forEach((e=>e()))})))),this.listenerSetter.add(d.Z)("settings_updated",(({key:e})=>is(this,void 0,void 0,(function*(){if("settings.emoji.big"===e){const e=this.getMiddleware(),t=(0,Je.Z)(this.bubbles,"desc").map((e=>is(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji"))return{bubble:t,message:yield this.chat.getMessage(e)}})))),i=yield Promise.all(t);if(!e())return;i.filter(Boolean).forEach((({bubble:e,message:t})=>{this.bubbles[t.mid]===e&&this.safeRenderMessage(t,!0,e)}))}})))),this.listenerSetter.add(d.Z)("messages_views",(e=>{(0,le.T2)((()=>{let t;for(const{peerId:i,views:s,mid:n}of e){if(this.peerId!==i)continue;const e=this.bubbles[n];if(!e)continue;const a=Array.from(e.querySelectorAll(".post-views"));if(!a.length)continue;const o=(0,_.Z)(s,1);let r=!1;a.forEach((e=>{(r||e.textContent!==o)&&(t||(t=this.createScrollSaver(!0),t.save()),r=!0,e.textContent=o)}))}t&&t.restore()}))})),this.observer=new et({root:this.scrollable.container}),this.sendViewCountersDebounced=(0,Ee.Z)((()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.managers.appMessagesManager.incrementMessageViews(this.peerId,e)}),1e3,!1,!0)}get peerId(){return this.chat.peerId}get messagesQueuePromise(){return this.batchProcessor.queuePromise}createScrollSaver(e=!0){return new Ye(this.scrollable,".bubble:not(.is-date)",e)}createResizeObserver(){if(!("ResizeObserver"in window)||this.resizeObserver)return;const e=this.scrollable.container;let t=0,i=!1,s=!1,n=0,a=0,o=0;const r=()=>{const r=e.offsetHeight,d=this.scrollable.isScrolledDown;r===t||s&&d||(a+=t-r),a&&this.scrollable.setScrollTopSilently(this.scrollable.scrollTop+Math.round(a)),t=r,n=0,o=0,a=0,i=!1,s=!1},d=e=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(e?r:()=>{o=window.requestAnimationFrame(r)})};(this.resizeObserver=new ResizeObserver((e=>{if(s)return void d(!1);const o=e[0].contentRect.height;if(!t)return void(t=o);const r=t-o;let l=r+a;const c=l%1;if(l-=c,!i&&(i=!0,r<0&&this.scrollable.isScrolledDown))return a=-r,s=!0,void d(!1);if(n+=l,l){const e=this.scrollable.scrollTop+l;this.scrollable.setScrollTopSilently(e)}d(!1),a=c,t=o}))).observe(e)}destroyResizeObserver(){const e=this.resizeObserver;e&&(e.disconnect(),this.resizeObserver=void 0)}setReactionsHoverListeners(){this.listenerSetter.add(mt.Z)("toggle",this.unhoverPrevious),this.listenerSetter.add(ft.Z)("change",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.container)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){e.parentElement&&e.parentElement.classList.toggle("hover-reaction-visible",t),(0,Te.Z)(e,"is-visible",t,200,t?void 0:()=>{e.remove()},2)}setStickyDateManually(){}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=ut.Z.getFocusPromise().then((()=>is(this,void 0,void 0,(function*(){if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map((e=>+e)));t>=e&&(t=Math.max((yield this.chat.getHistoryMaxId())||0,t))}this.unreaded.forEach(((e,i)=>{e<=t&&this.onUnreadedInViewport(i,e)}));const i=[];for(const e of this.unreadedSeen)dt(yield this.chat.getMessage(e))&&i.push(e);return this.managers.appMessagesManager.readMessages(this.peerId,i),this.unreadedSeen.clear(),he.ZP&&this.log("will readHistory by maxId:",t),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch((e=>{this.log.error("readHistory err:",e),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)})).finally((()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())}))}))))}constructPinnedHelpers(){this.listenerSetter.add(d.Z)("peer_pinned_messages",(e=>{const{peerId:t,mids:i,pinned:s}=e;t===this.peerId&&i&&(s||this.deleteMessagesByIds(i))}))}constructScheduledHelpers(){const e=()=>is(this,void 0,void 0,(function*(){this.chat.topbar.setTitle((yield this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size)}));this.listenerSetter.add(d.Z)("scheduled_new",(t=>{t.peerId===this.peerId&&(this.renderNewMessage(t),e())})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:t,mids:i})=>{t===this.peerId&&(this.deleteMessagesByIds(i),e())}))}onGoDownClick(){return is(this,void 0,void 0,(function*(){if(!this.replyFollowHistory.length)return void this.chat.setMessageId();const e=this.getMiddleware(),t=this.replyFollowHistory.slice(),i=yield Promise.all(t.map((e=>this.chat.getMessage(e))));if(!e())return;t.forEach(((e,t)=>{const s=i[t],n=this.bubbles[e];let a=!0;if(n){const e=n.getBoundingClientRect();a=Pe.Z.height/2>e.top}else s&&(a=!1);a&&this.replyFollowHistory.splice(this.replyFollowHistory.indexOf(e),1)})),this.replyFollowHistory.sort(((e,t)=>t-e));const s=this.replyFollowHistory.pop();this.chat.setMessageId(s)}))}getBubbleByPoint(e){let t=ge(this.scrollable.container,e,"center");return t&&(t=(0,fe.Z)(t,"bubble")),t}getGroupedBubble(e){return is(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getMidsByAlbum(e);for(const e of t)if(this.bubbles[e]&&!this.skippedMids.has(e))return{bubble:this.bubbles[e],mid:e}}))}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t){return is(this,void 0,void 0,(function*(){if(void 0===t&&(t=yield this.chat.getMessage(e)),!t)return;const i=t.grouped_id;if(i){const t=yield this.getGroupedBubble(i);if(t)return t.bubble=t.bubble.querySelector(`.document-container[data-mid="${e}"]`)||t.bubble,t}const s=this.bubbles[e];return s?{bubble:s,mid:e}:void 0}))}findNextMountedBubbleByMsgId(e,t){const i=(0,Je.Z)(this.bubbles,t?"desc":"asc");let s;s=t?t=>te{var t;return!!s(e)&&!!(null===(t=this.bubbles[e])||void 0===t?void 0:t.parentElement)}));return this.bubbles[n]}loadMoreHistory(e,t=!1){if(!this.peerId||this.chat.setPeerPromise||this.isHeavyAnimationInProgress||e&&(this.getHistoryTopPromise||this.scrollable.loadedAll.top)||!e&&(this.getHistoryBottomPromise||this.scrollable.loadedAll.bottom))return;const i=Object.keys(this.bubbles).map((e=>+e)).filter((e=>e>0&&!this.skippedMids.has(e))).sort(((e,t)=>e-t));i.length||i.push(0),e?(he.ZP&&this.log("Will load more (up) history by id:",i[0],"maxId:",i[i.length-1],t),this.getHistory1(i[0],!0,void 0,void 0,t)):(he.ZP&&this.log("Will load more (down) history by id:",i[i.length-1],t),this.getHistory1(i[i.length-1],!1,!0,void 0,t))}setScroll(){this.scrollable&&this.destroyScrollable(),this.scrollable=new P.ZP(null,"IM",300),this.setLoaded("top",!1,!1),this.setLoaded("bottom",!1,!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),c.Z}updateUnreadByDialog(){return is(this,void 0,void 0,(function*(){const e=yield this.chat.getHistoryStorage(),t=this.peerId===d.Z.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(this.unreadOut.delete(e),t.classList.contains("is-outgoing")||t.classList.contains("is-error"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}}}))}destroyBubble(e,t=+e.dataset.mid){e.middlewareHelper.destroy(),this.bubbles[t]===e&&delete this.bubbles[t],this.skippedMids.delete(t),this.firstUnreadBubble===e&&(this.firstUnreadBubble=null),this.bubbleGroups.removeAndUnmountBubble(e),this.observer&&(this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.observer.unobserve(e,this.viewsObserverCallback),this.viewsMids.delete(t),this.observer.unobserve(e,this.stickerEffectObserverCallback))}deleteMessagesByIds(e,t=!0,i){let n=!1;e.forEach((e=>{const t=this.bubbles[e];t&&(this.destroyBubble(t,e),n=!0)})),n&&(this.scrollable.ignoreNextScrollEvent(),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),s.Z.checkAnimations(!1,this.chat.animationGroup),this.deleteEmptyDateGroups(),i||this.scrollable.onScroll())}pollExtendedMediaMessages(){const e=Array.from(this.extendedMediaMessages);return this.managers.appMessagesManager.getExtendedMedia(this.peerId,e)}setExtendedMediaMessagesPollInterval(){!this.pollExtendedMediaMessagesPromise&&this.extendedMediaMessages.size&&(this.pollExtendedMediaMessagesPromise=(0,Qe.Z)(3e4).then((()=>this.pollExtendedMediaMessages())).then((()=>this.setExtendedMediaMessagesPollInterval())))}setTopPadding(e=this.getMiddleware()){let t,i=!1;if(!this.isTopPaddingSet&&"scheduled"!==this.chat.type){const{clientHeight:e,scrollHeight:s}=this.scrollable.container;i=e===s,i&&(t=this.chatInner,t.style.paddingTop=e+"px",this.scrollable.setScrollTopSilently(s),this.isTopPaddingSet=!0)}return{isPaddingNeeded:i,unsetPadding:i?()=>{e()&&i&&(t.style.paddingTop="",this.isTopPaddingSet=!1)}:void 0}}renderNewMessage(e,t){const i=this._renderNewMessage(e,t);return this.renderNewPromises.add(i),i.catch(Ke.Z).finally((()=>{this.renderNewPromises.delete(i)})),i}_renderNewMessage(e,t){return is(this,void 0,void 0,(function*(){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const i=this.getMiddleware();t.then((()=>is(this,void 0,void 0,(function*(){if(!i())return;const t=yield this.chat.getMessage(e.mid);i()&&this.renderNewMessage(t)}))))}return}if(this.chat.threadId){const t=null==e?void 0:e.reply_to;if(!t||(t.reply_to_top_id||t.reply_to_msg_id)!==this.chat.threadId)return}if(this.bubbles[e.mid])return;t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const i=this.getMiddleware(),{isPaddingNeeded:s,unsetPadding:n}=this.setTopPadding(i),a=this.performHistoryResult({history:[e]},!1);return t&&a.then((()=>{if(!i())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[e.mid]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();s&&a.then(n)})),a}))}getLastBubble(){var e;const t=this.bubbleGroups.getLastGroup();return null===(e=null==t?void 0:t.lastItem)||void 0===e?void 0:e.bubble}scrollToBubble(e,t,i,s){const n=(0,fe.Z)(e,"bubble");let a;if(e.parentElement||this.log.error("element is not connected",n),n&&"end"!==t){const e=this.bubbleGroups.getItemByBubble(n);e&&e.group.firstItem===e&&(0,Se.Z)(e.group.container)===(this.stickyIntersector?ds:1)&&(a=e.group.container.parentElement)}const r=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper"),d=this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:i,forceDuration:s,axis:"y",getNormalSize:r?({rect:e})=>{let t=Pe.Z.height;return t-=this.container.offsetTop,t-=o.Z.isMobile||Pe.Z.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{if(this.onScroll(!0,e),this.updateGradient){const{gradientRenderer:t}=this.chat;null==t||t.toNextPosition(e.getProgress),this.updateGradient=void 0}}});return i===re.f.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),d}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return is(this,void 0,void 0,(function*(){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();if(yield this.scrollToBubble(e,"end",void 0,void 0),!t())return;this.scrollingToBubble=void 0}}))}scrollToBubbleIfLast(e){return is(this,void 0,void 0,(function*(){if(this.getLastBubble()===e)return this.scrollToEnd()}))}highlightBubble(e){const t="highlightTimeout";e.dataset[t]&&(clearTimeout(+e.dataset[t]),e.classList.remove("is-highlighted"),e.offsetWidth),e.classList.add("is-highlighted"),e.dataset[t]=""+setTimeout((()=>{e.classList.remove("is-highlighted"),delete e.dataset[t]}),2e3)}createDateBubble(e,t=new Date(1e3*e)){let i;const s=new Date;s.setHours(0,0,0,0);const n="scheduled"===this.chat.type;if(s.getTime()===t.getTime())i=(0,S.ag)(n?"Chat.Date.ScheduledForToday":"Date.Today");else if(n&&e===Ie)i=(0,S.ag)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};t.getFullYear()!==s.getFullYear()&&(e.year="numeric"),i=new S.ZP.IntlDateElement({date:t,options:e}).element,n&&(i=(0,S.ag)("Chat.Date.ScheduledFor",[i]))}const a=document.createElement("div");a.className="bubble service is-date";const o=document.createElement("div");o.classList.add("bubble-content");const r=document.createElement("div");return r.classList.add("service-msg"),r.append(i),o.append(r),a.append(o),a}getDateForDateContainer(e){const t=new Date(1e3*e);return t.setHours(0,0,0),{date:t,dateTimestamp:t.getTime()}}getDateContainerByTimestamp(e){var t;const{date:i,dateTimestamp:s}=this.getDateForDateContainer(e);let n=this.dateMessages[s];if(n)return n;const a=this.createDateBubble(e,i),o=this.createDateBubble(e,i);o.classList.add("is-fake");const r=document.createElement("section");r.className="bubbles-date-group",r.append(a,o),n=this.dateMessages[s]={div:a,container:r,firstTimestamp:i.getTime()};const d=(0,Je.Z)(this.dateMessages,"asc"),l=d.length;let c,h=0;for(;hthis.setPeerTempId===o,c=(0,gt.Z)(l,ls);e||(yield c(this.chat.onChangePeer(c)));const h=this.chat.type;("scheduled"===h||this.chat.isRestricted)&&(i=0);const u=yield c(this.chat.getHistoryStorage()),f="pinned"===h?yield c(this.managers.appMessagesManager.getPinnedMessagesMaxId(t)):null!==(a=u.maxId)&&void 0!==a?a:0,p=void 0!==i;let g,v,b,y=0;if(!p)if(e||(v=this.chat.appImManager.getChatSavedPosition(this.chat)),v);else if(f){y=yield c(this.managers.appMessagesManager.getReadMaxIdIfUnread(t,this.chat.threadId));const s=yield c(this.managers.appMessagesManager.getDialogOnly(t));if(!y||e||s&&1===s.unread_count)i=f;else{const e=u.history.findSliceOffset(y);e&&e.slice.isEnd(ue.D.Bottom)&&(b=e.slice[e.offset-25]||e.slice[0]||y),g=!p,i=y}}const w=i!==f;if(void 0===n&&(yield c(this.chat.isStartButtonNeeded()))&&(n=m.gZ),e){const e=yield c(this.getMountedBubble(i));if(e)return p?(this.scrollToBubble(e.bubble,"center"),this.highlightBubble(e.bubble),this.chat.dispatchEvent("setPeer",i,!1)):f&&!w&&(this.scrollToEnd(),this.chat.dispatchEvent("setPeer",i,!0)),void 0!==n&&this.chat.input.setStartParam(n),null}else this.peerId&&(this.lazyLoadQueue.queueId=++rs,this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)),this.replyFollowHistory.length=0,this.passEntities={messageEntityBotCommand:(yield c(this.managers.appPeersManager.isAnyGroup(t)))||this.chat.isBot};he.ZP&&d("setPeer peerId:",t,u,i,f);const S=null!=b?b:w||"scheduled"===h||this.chat.isRestricted?0:f;let C=0;if(e){const e=this.getBubbleByPoint("bottom");e&&(C=+e.dataset.mid),C<=0&&(C=Math.max(...Object.keys(this.bubbles).map((e=>+e))))}else this.isFirstLoad=!0,this.destroyResizeObserver();const L=this.chatInner,E=this.emptyPlaceholderBubble;this.cleanup();const I=this.chatInner=document.createElement("div");e?(I.className=L.className,I.classList.remove("disable-hover","is-scrolling")):I.classList.add("bubbles-inner"),this.lazyLoadQueue.lock();const M=e||f&&w||p,P=C>0&&(!i||Cthis.performHistoryResult({history:v.mids},!0))),cached:!0,waitPromise:Promise.resolve()}:yield c(this.getHistory1(i,!0,w,S)),this.setPeerCached=T.cached,d.warn("got history");const{promise:x,cached:A}=T;A||e||(yield c(this.chat.finishPeerChange(p,w,i,n)),this.scrollable.container.textContent="",this.preloader.attach(this.container)),s.Z.lockGroup(this.chat.animationGroup);const _=c(x).then((()=>is(this,void 0,void 0,(function*(){d.warn("promise fulfilled");const a=M?yield c(i?this.getMountedBubble(i):{bubble:this.getLastBubble()}):void 0;A&&!e&&(d.warn("finishing peer change"),yield c(this.chat.finishPeerChange(p,w,i,n)),d.warn("finished peer change")),this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),this.setPeerCached=void 0;const o=this.scrollable;if(o.lastScrollDirection=0,o.lastScrollPosition=0,(0,O.Z)(o.container,I),E&&this.cleanupPlaceholders(E),this.attachPlaceholderOnRender&&this.attachPlaceholderOnRender(),!p&&"chat"===this.chat.type&&this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndex(0),this.container.classList.toggle("has-groups",!!Object.keys(this.dateMessages).length),d.warn("mounted chat",this.chatInner===I,this.chatInner.parentElement,performance.now()-r),s.Z.unlockGroup(this.chat.animationGroup),s.Z.checkAnimations(!1,this.chat.animationGroup),this.lazyLoadQueue.unlock(),v)o.setScrollTopSilently(v.top);else if(M){let t;if(Z)o.setScrollTopSilently(99999);else if(k){const e=this.setTopPadding();e.isPaddingNeeded&&(t=e.unsetPadding),o.setScrollTopSilently(0)}let s,n=g&&this.firstUnreadBubble||(null==a?void 0:a.bubble);if((null==n?void 0:n.parentElement)||(n=this.findNextMountedBubbleByMsgId(i,!1)||this.findNextMountedBubbleByMsgId(i,!0)),n){const t=this.getLastBubble(),i=g?"start":w||p||t!==n?"center":"end";s="end"===i&&t===n&&e?this.scrollToEnd():this.scrollToBubble(n,i,e?void 0:re.f.Static),!g&&p&&this.highlightBubble(n)}t&&(s||Promise.resolve()).then((()=>{t()}))}else o.setScrollTopSilently(99999);this.onRenderScrollSet(),this.onScroll();const l=Promise.all([_,(0,de.e9)()]);if(l.then((()=>{o.checkForTriggers()})),this.chat.dispatchEvent("setPeer",i,!w),Promise.all([this.setFetchReactionsInterval(l),this.setFetchHistoryInterval({afterSetPromise:l,lastMsgId:i,samePeer:e,savedPosition:v,topMessage:f})]).then((()=>{d("scrolledAllDown:",o.loadedAll.bottom),o.loadedAll.bottom&&f&&!this.unreaded.size&&this.onScrolledAllDown()})),"chat"===h){const e=yield c(this.managers.appMessagesManager.getDialogOnly(t));(null==e?void 0:e.pFlags.unread_mark)&&this.managers.appMessagesManager.markDialogUnread(t,!0)}})))).catch((e=>{throw d.error("getHistory promise error:",e),l()||this.preloader.detach(),e}));return{cached:A,promise:_}}))}setFetchReactionsInterval(e){return is(this,void 0,void 0,(function*(){const t=this.getMiddleware();if(this.chat.isChannel){const i=()=>is(this,void 0,void 0,(function*(){if(!t())return;const e=[];for(const t in this.bubbles){let i=yield this.chat.getMessage(+t);"message"===(null==i?void 0:i._)&&(i=yield this.managers.appMessagesManager.getGroupsFirstMessage(i),e.push(i.mid))}(e.length?this.managers.appReactionsManager.getMessagesReactions(this.peerId,e):Promise.resolve()).then((()=>{setTimeout(i,1e4)}))}));Promise.all([e,(0,de.e9)(),(0,Qe.Z)(500)]).then((()=>{i()}))}}))}setFetchHistoryInterval({lastMsgId:e,topMessage:t,afterSetPromise:i,savedPosition:s,samePeer:n}){return is(this,void 0,void 0,(function*(){const e=this.getMiddleware(),t=this.peerId,a=yield this.managers.appMessagesManager.isFetchIntervalNeeded(t);if(!s&&!a)return;if(yield i,!e())return;if(this.setLoaded("bottom",!1),this.scrollable.checkForTriggers(),!a)return;const o=()=>{this.fetchNewPromise=new Promise((i=>is(this,void 0,void 0,(function*(){e()&&(yield this.managers.appMessagesManager.isFetchIntervalNeeded(t))?this.managers.appMessagesManager.getNewHistory(t,this.chat.threadId).then((t=>{if(!e()||!t)return void i();const{isBottomEnd:s}=t;this.scrollable.loadedAll.bottom&&this.scrollable.loadedAll.bottom!==s&&(this.setLoaded("bottom",s),this.onScroll()),setTimeout(o,3e4),i()})):i()})))).finally((()=>{this.fetchNewPromise=void 0}))};n?setTimeout(o,3e4):o()}))}onScrolledAllDown(){return is(this,void 0,void 0,(function*(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=yield this.chat.getHistoryMaxId();this.managers.appMessagesManager.readHistory(this.peerId,e,this.chat.threadId,!0)}}))}finishPeerChange(){return is(this,void 0,void 0,(function*(){const[e,t,i]=yield Promise.all([this.chat.isChannel,this.chat.canSend(),this.chat.isAnyGroup]);return()=>{this.chatInner.classList.toggle("has-rights",t),this.container.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",i),this.chatInner.classList.toggle("is-channel",e),this.createResizeObserver()}}))}renderMessagesQueue(e){return this.batchProcessor.addToQueue(e)}ejectBubbles(){for(const e of this.bubblesToEject)e.remove();this.bubblesToEject.clear()}groupBubbles(e){let t;"scheduled"===this.chat.type&&(t=new Set,e.forEach((({bubble:e,message:i})=>{const s=this.bubbleGroups.getItemByBubble(e),n=null==s?void 0:s.group;n&&s.message.date!==i.date&&(this.bubbleGroups.removeItem(s),t.add(n))}))),e.forEach((({bubble:e,message:t})=>{this.bubbleGroups.prepareForGrouping(e,t)}));const i=this.bubbleGroups.groupUngrouped(),s=Array.from(i).map((e=>{if(e.avatar)return;const t=e.firstItem;return t&&this.chat.isAvatarNeeded(t.message)?e.createAvatar(t.message):void 0})).filter(Boolean);if(t)for(const e of t)i.add(e);return{groups:[...i],avatarPromises:s}}getMiddleware(e){return this.middlewareHelper.get(e)}safeRenderMessage(e,t,i,s=!0,n){return is(this,void 0,void 0,(function*(){if(!e||this.renderingMessages.has(e.mid)||this.bubbles[e.mid]&&!i)return;const a=this.getMiddleware().create(),o=a.get();let r;try{this.renderingMessages.add(e.mid);const d=document.createElement("div");d.middlewareHelper=a,d.dataset.mid=""+e.mid,d.dataset.peerId=""+e.peerId,d.dataset.timestamp=""+e.date,i&&(i.middlewareHelper.destroy(),this.skippedMids.delete(e.mid),this.bubblesToEject.add(i),this.bubblesToReplace.delete(i),this.bubblesToReplace.set(d,i),this.bubbleGroups.changeBubbleByBubble(i,d)),i=this.bubbles[e.mid]=d;let l=this.renderMessage(e,t,i,o);n&&(l=n(l,i));const c=l.then((e=>e&&o()?Object.assign(Object.assign({},e),{updatePosition:s}):void 0));if(this.renderMessagesQueue(c.catch((()=>{}))),r=yield c,!o())return;r||this.skippedMids.add(+e.mid)}catch(e){this.log.error("renderMessage error:",e)}return o()?(this.renderingMessages.delete(e.mid),r):void 0}))}renderMessage(e,t=!1,i,n){var a,r,l;return is(this,void 0,void 0,(function*(){const c="message"===e._,h=c&&e.grouped_id;let u,f;const g=h?yield this.managers.appMessagesManager.getMessagesByAlbum(h):void 0,v="pinned"!==this.chat.type;if(h&&v){u=g.map((e=>e.mid));const t=us(u);if(e.mid!==t)return}c&&(f=h?g[0]:e);const b=this.chat.isOurMessage(e),y=document.createElement("div");y.classList.add("message","spoilers-container");const C=document.createElement("div");C.classList.add("bubble-content-wrapper");const L=document.createElement("div");L.classList.add("bubble-content"),i.classList.add("bubble"),C.append(L),i.append(C);const I=!b&&!e.pFlags.out&&(e.pFlags.unread||dt(e));I&&this.observer&&(this.observer.observe(i,this.unreadedObserverCallback),this.unreaded.set(i,e.mid));const M=[],P={bubble:i,promises:M,message:e,reverse:t};if(!("messageService"!==e._||e.action&&ns.has(e.action._))){const t=e.action;if(t){const e=t._;if(ss.has(e)||S.Hz.hasOwnProperty(e)&&!S.Hz[e])return}i.className="bubble service",L.innerHTML="";const s=document.createElement("div");if(s.classList.add("service-msg"),t){let i;if("messageActionChannelMigrateFrom"===t._){const e=new R.Z;i=e.update({peerId:t.chat_id.toPeerId(!0),middleware:n}),s.append((0,S.ag)("ChatMigration.From",[e.element]))}else if("messageActionChatMigrateTo"===t._){const e=new R.Z;i=e.update({peerId:t.channel_id.toPeerId(!0),middleware:n}),s.append((0,S.ag)("ChatMigration.To",[e.element]))}else s.append(yield(0,rt.Z)(e))}return L.append(s),e.pFlags.is_single&&i.classList.add("is-group-last"),P}let Z,x,_=c&&e.media,F=!0;if(c){if(h&&v){const e=(0,bt.Z)(g);Z=e.message,x=e.totalEntities}else Z=e.message,x=e.totalEntities;const t=null==_?void 0:_.document;t&&("sticker"===(null==t?void 0:t.type)?Z=x=void 0:["video","gif"].includes(t.type)||(F=!1))}else"messageActionPhoneCall"===e.action._&&(_={_:"messageMediaCall",action:e.action});let B,O=0;if(x&&!_){const e=x.filter((e=>"messageEntityEmoji"===e._)),t=Z.replace(/\s/g,"").length;if(e.reduce(((e,t)=>e+t.length),0)===t){O=Math.min(hs,e.length),B=o.Z.active.customEmoji;const t=cs[O];t&&(B=(0,Ve.C)(t,t),i.style.setProperty("--emoji-size",t+"px"))}}null!=B||(B=this.chat.appImManager.customEmojiSize);const U=(0,ot.ZP)(Z,{entities:x,passEntities:this.passEntities,loadPromises:M,lazyLoadQueue:this.lazyLoadQueue,customEmojiSize:B,middleware:n,animationGroup:this.chat.animationGroup});let H=!0,z=!1;if(O){if(d.Z.settings.emoji.big){const e=1===O&&!x.find((e=>"messageEntityCustomEmoji"===e._))&&(yield this.managers.appStickersManager.getAnimatedEmojiSticker(Z));if(1===O&&!_&&e)_={_:"messageMediaDocument",document:e};else{const e=document.createElement("div");e.classList.add("attachment","spoilers-container"),(0,A.Z)(e,U),L.append(e)}i.classList.add("is-message-empty","emoji-big"),z=!0,H=!1,F=!1}i.classList.add("can-have-big-emoji")}F&&(0,A.Z)(y,U);const j=(W=Z,Xi.test(W));var W;const $=se.setTime({chatType:this.chat.type,message:e,reactionsMessage:f});if(y.append($),L.prepend(y),j&&$.classList.add("is-block"),c&&e.views){if(i.classList.add("channel-post"),!(null===(a=e.fwd_from)||void 0===a?void 0:a.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),L.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.observer&&this.observer.observe(i,this.viewsObserverCallback)}const q=c&&e.reply_markup;let Q="replyInlineMarkup"===(null==q?void 0:q._)&&q.rows;if(Q&&(Q=Q.filter((e=>e.buttons.length))),Q){const t=document.createElement("div");t.classList.add("reply-markup"),Q.forEach((i=>{const s=i.buttons,n=document.createElement("div");n.classList.add("reply-markup-row"),s.forEach((t=>{let i,s=(0,ot.ZP)(t.text,{noLinks:!0,noLinebreaks:!0});switch(t._){case"keyboardButtonUrl":{const e=(0,ot.ZP)(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=(0,ye.Z)(e).firstElementChild,i.classList.add("is-link");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline"),(0,w.fc)(i,(i=>{(0,be.Z)(i);const s=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.managers.appInlineBotsManager.checkSwitchReturn(s).then((e=>e||new Promise(((e,t)=>{const i=new E.Z({[this.peerId]:[]},(t=>{e(t)}),!0);i.addEventListener("close",(()=>{t()}))})))),n.then((e=>{const i=this.peerId===e?this.chat.threadId:void 0;this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchInlineQuery(e,i,s,t.query)}))}));break;case"keyboardButtonBuy":{const e="messageMediaInvoice"===_._?_:void 0;if(null==e?void 0:e.extended_media)break;i=document.createElement("button"),i.classList.add("is-buy"),(null==e?void 0:e.receipt_msg_id)&&(s=(0,S.ag)("Message.ReplyActionButtonShowReceipt"));break}default:i=document.createElement("button")}if(!i)return;i.classList.add("reply-markup-button","rp","tgico");const a=document.createElement("span");a.classList.add("reply-markup-button-text"),"string"==typeof s?a.insertAdjacentHTML("beforeend",s):a.append(s),(0,T.Z)(i),i.append(a),n.append(i)})),n.childElementCount&&t.append(n)}));const s=!!t.childElementCount;s&&(0,w.fc)(t,(t=>{let i=t.target;if(i.classList.contains("reply-markup-button")||(i=(0,fe.Z)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline")||i.classList.contains("is-buy"))return;(0,be.Z)(t);const s=(0,Se.Z)(i),n=Q[(0,Se.Z)(i.parentElement)];if(!n.buttons||!n.buttons[s])return void this.log.warn("no such button",n,s,e);const a=n.buttons[s];this.managers.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,a).then((e=>{"string"==typeof e.message&&e.message.length&&(0,me.Am)((0,ot.ZP)(e.message,{noLinks:!0,noLinebreaks:!0}))}))})),s&&(i.classList.add("with-reply-markup"),C.append(t))}const Y=e.pFlags.is_outgoing;if(b){(e.pFlags.unread||Y)&&this.unreadOut.add(e.mid);let t="";t=e.error?"is-error":Y?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}Y&&!e.error&&i.classList.add("is-outgoing");const J=c&&(yield this.managers.appMessagesManager.getMessageWithCommentReplies(e)),X=!!J&&e.mid>0;X&&i.classList.add("with-replies");const ee=c&&e.fwd_from,te=c&&e.fwdFromId,ie=this.chat.isOutMessage(e);let ne=L;const ae=!(e.viaBotId||e.fromId!==d.Z.myId&&e.pFlags.out);if(_){let t=document.createElement("div");t.classList.add("attachment"),Z||i.classList.add("is-message-empty");let a=!1;switch(_._){case"messageMediaPhoto":{const s=_.photo;if(Z||(H=!1),ae&&i.classList.add("hide-name"),i.classList.add("photo"),v&&h&&1!==u.length){i.classList.add("is-album","is-grouped"),Ni({messages:g,attachmentDiv:t,middleware:this.getMiddleware(),isOut:b,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:M,autoDownload:this.chat.autoDownload});break}const n=!k.IS_ANDROID&&H&&!X&&!1;n&&i.classList.add("with-media-tail"),(0,G.Z)({photo:s,message:e,container:t,withTail:n,isOut:ie,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:M,autoDownloadSize:this.chat.autoDownload.photo});break}case"messageMediaWebPage":{a=!0;const t=_.webpage;if("webPage"!==t._)break;i.classList.add("webpage");const s=document.createElement("div");s.classList.add("web");const n=document.createElement("div");let r,l;n.classList.add("quote");const c=t.photo;(c||t.document)&&(r=document.createElement("div"),r.classList.add("preview-resizer"),l=document.createElement("div"),l.classList.add("preview"),r.append(l));const h=document.createElement("div");h.classList.add("quote-text");const u=t.document;if(u)if("gif"===u.type||"video"===u.type||"round"===u.type){const t="round"===u.type?o.Z.active.round:o.Z.active.webpage;"round"===u.type?(i.classList.add("round"),l.classList.add("is-round")):i.classList.add("video"),(0,K.Z)({doc:u,container:l,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:ie,group:this.chat.animationGroup,loadPromises:M,autoDownload:this.chat.autoDownload,noInfo:e.mid<0})}else{const t=yield(0,Oi.Z)({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:M,sizeType:"documentName",searchContext:{useSearch:!1,peerId:this.peerId,inputFilter:{_:"inputMessagesFilterEmpty"}},fontSize:d.Z.settings.messagesTextSize});l.append(t),l.classList.add("preview-with-document"),h.classList.add("has-document")}let f;if(r&&h.append(r),t.site_name){const e=(0,ot.ZP)(t.url),i=(0,ye.Z)(e).firstElementChild;i.classList.add("webpage-name");const s=document.createElement("strong");(0,A.Z)(s,(0,D.Z)(t.site_name)),i.textContent="",i.append(s),h.append(i),f=i}const p=(0,at.Z)(t);if(p.textContent){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("strong");(0,A.Z)(t,p),e.append(t),h.append(e),f=e}const m=(0,nt.Z)(t);if(m.textContent){const e=document.createElement("div");e.classList.add("text"),(0,A.Z)(e,m),h.append(e),f=e}if(n.append(h),c&&!u){i.classList.add("photo");const t=c.sizes[c.sizes.length-1];let s=!1;t.w===t.h&&f?(i.classList.add("is-square-photo"),s=!0,(0,st.Z)(c,l,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),(0,G.Z)({photo:c,message:e,container:l,boxWidth:s?0:o.Z.active.webpage.width,boxHeight:s?0:o.Z.active.webpage.height,isOut:ie,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:M,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}s.append(n),y.insertBefore(s,$);break}case"messageMediaDocument":{const s=_.document;if(s.sticker){i.classList.add("sticker"),H=!1,z=!0,s.animated&&i.classList.add("sticker-animated");const e=o.Z.active,a=i.classList.contains("emoji-big"),d=a?e.emojiSticker:s.animated?e.animatedSticker:e.staticSticker;(0,st.Z)(s,t,d.width,d.height),L.style.minWidth=t.style.width,L.style.minHeight=t.style.height,(0,V.ZP)({doc:s,div:t,middleware:n,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,emoji:a?Z:void 0,withThumb:!0,loadPromises:M,isOut:ie,noPremium:null===(r=null==_?void 0:_.pFlags)||void 0===r?void 0:r.nopremium}),((0,Ai.Z)(s)||a)&&(I||Y)&&this.observer.observe(i,this.stickerEffectObserverCallback)}else if("video"===s.type||"gif"===s.type||"round"===s.type){const a="round"===s.type;if(a&&(z=!0),!a&&Z||(H=!1),ae&&i.classList.add("hide-name"),i.classList.add(a?"round":"video"),v&&h&&1!==u.length)i.classList.add("is-album","is-grouped"),Ni({messages:g,attachmentDiv:t,middleware:n,isOut:b,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:M,autoDownload:this.chat.autoDownload});else{const r=!k.IS_ANDROID&&!k.IS_APPLE&&!a&&H&&!X&&!1;r&&i.classList.add("with-media-tail"),(0,K.Z)({doc:s,container:t,message:e,boxWidth:o.Z.active.regular.width,boxHeight:o.Z.active.regular.height,withTail:r,isOut:ie,lazyLoadQueue:this.lazyLoadQueue,middleware:n,group:this.chat.animationGroup,loadPromises:M,autoDownload:this.chat.autoDownload,searchContext:a?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,noInfo:e.mid<0})}}else{const t=yield function({albumMustBeRenderedFull:e,message:t,bubble:i,messageDiv:s,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,useSearch:l,sizeType:c,managers:h,fontWeight:u,fontSize:f,richTextFragment:p}){return Ui(this,void 0,void 0,(function*(){let l;const m=e?yield n.getMidsByMid(t.mid):[t.mid],g=m.map(((e,t)=>Ui(this,void 0,void 0,(function*(){const i=yield n.getMessage(e),s=yield(0,Oi.Z)({message:i,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,sizeType:c,managers:h,fontWeight:u,fontSize:f}),g=document.createElement("div");g.classList.add("document-container"),g.dataset.mid=""+e,g.dataset.peerId=""+i.peerId;const v=document.createElement("div");if(v.classList.add("document-wrapper"),i.message){const e=document.createElement("div");e.classList.add("document-message"),(0,A.Z)(e,p),v.append(e)}if(m.length>1){const e=document.createElement("div");e.classList.add("document-selection"),g.append(e),g.classList.add("grouped-item"),0===t&&(l=v)}return v.append(s),g.append(v),g})))),v=yield Promise.all(g);return s.append(...v),m.length>1&&i.classList.add("is-multiple-documents","is-grouped"),l}))}({albumMustBeRenderedFull:v,message:e,bubble:i,messageDiv:y,chat:this.chat,loadPromises:M,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===s.type||"audio"===s.type?{peerId:this.peerId,inputFilter:{_:"voice"===s.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,sizeType:"documentName",fontSize:d.Z.settings.messagesTextSize,richTextFragment:U});t&&(ne=t);const n=y.lastElementChild.querySelector(".document-message, .document, .audio");n&&n.append($),i.classList.remove("is-message-empty"),y.classList.add((["photo","pdf"].includes(s.type)?"document":s.type||"document")+"-message"),a=!0}break}case"messageMediaCall":{const e=_.action,t=document.createElement("div");t.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const s=e.pFlags.video?"video":"voice";t.dataset.type=s;const n=document.createElement("div");n.classList.add("bubble-call-title"),(0,S.$d)(n,ie?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((0,Fe.Z)(e.duration));else{let t;switch(e.reason._){case"phoneCallDiscardReasonBusy":t="Call.StatusBusy";break;case"phoneCallDiscardReasonMissed":t="Chat.Service.Call.Missed";break;default:t="Chat.Service.Call.Cancelled"}o.classList.add("is-reason"),(0,S.$d)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),t.append(n,o),a=!0,i.classList.remove("is-message-empty"),y.classList.add("call-message"),y.append(t);break}case"messageMediaContact":{const e=_,t=document.createElement("div");t.classList.add("contact"),t.dataset.peerId=""+e.user_id,a=!0;const s=document.createElement("div");s.className="contact-details";const n=document.createElement("div");n.className="contact-name",n.append((0,D.Z)([e.first_name,e.last_name].filter(Boolean).join(" ")));const o=document.createElement("div");o.className="contact-number",o.textContent=e.phone_number?"+"+(0,Ze.u)(e.phone_number).formatted:"Unknown phone number",t.append(s),s.append(n,o);const r=new p.Z;r.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId()}),r.classList.add("contact-avatar","avatar-54"),t.prepend(r),i.classList.remove("is-message-empty"),y.classList.add("contact-message"),y.append(t);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e,t=d.Z.managers){const i=new Ji;return i.message=e,i.managers=t,i.setAttribute("peer-id",""+e.peerId),i.setAttribute("poll-id",e.media.poll.id),i.setAttribute("message-id",""+e.mid),i.render(),i}(e);y.prepend(t),y.classList.add("poll-message");break}case"messageMediaInvoice":{const a=_.pFlags.test,r=_.extended_media,d="messageExtendedMedia"===(null==r?void 0:r._),l="messageExtendedMediaPreview"===(null==r?void 0:r._);let c=d?r.media.photo||r.media.document:_.photo;const h=(0,yt.Z)(_.total_amount,_.currency);let u,f;if(r){if(l&&(u=document.createElement("span"),u.classList.add("extended-media-buy","tgico-premium_lock"),t.classList.add("is-buy"),(0,S.$d)(u,"Checkout.PayPrice",[h]),void 0!==r.video_duration)){const e=document.createElement("span");e.classList.add("video-time"),e.textContent=(0,Gi.Z)(r.video_duration,!1),t.append(e)}}else{u=document.createElement(c?"span":"div");const e=document.createDocumentFragment(),t=(0,S.ag)(_.receipt_msg_id?"PaymentReceipt":a?"PaymentTestInvoice":"PaymentInvoice");t.classList.add("text-uppercase");const i=" ‎",s=document.createElement("span");if(s.classList.add("text-bold"),s.textContent=h+i,e.append(s,t),a&&_.receipt_msg_id){const t=document.createElement("span");t.classList.add("text-uppercase","pre-wrap"),t.append(i+"(Test)"),e.append(t)}(0,A.Z)(u,e)}if(l&&(r.thumb.w=r.w,r.thumb.h=r.h,c={_:"photo",access_hash:"",pFlags:{},date:0,dc_id:0,file_reference:[],id:0,sizes:[r.thumb]}),c){const s=r?o.Z.active.extendedInvoice:o.Z.active.invoice;"document"===c._?((0,K.Z)({doc:c,container:t,withTail:!1,isOut:ie,lazyLoadQueue:this.lazyLoadQueue,middleware:n,loadPromises:M,boxWidth:s.width,boxHeight:s.height,group:this.chat.animationGroup,message:e}),i.classList.add("video")):((0,G.Z)({photo:c,container:t,withTail:!1,isOut:ie,lazyLoadQueue:this.lazyLoadQueue,middleware:n,loadPromises:M,boxWidth:s.width,boxHeight:s.height,message:d?e:void 0}),i.classList.add("photo")),u&&(r||u.classList.add("video-time"),t.append(u))}else t=void 0;if(l){const{mid:i}=e;this.extendedMediaMessages.add(i),n.onClean((()=>{this.extendedMediaMessages.delete(i),s.Z.removeAnimationByPlayer(r)})),this.setExtendedMediaMessagesPollInterval();const{width:a,height:o}=t.style,r=new es(parseInt(a),parseInt(o));r.renderFirstFrame(),t.append(r.canvas),s.Z.addAnimation(r,this.chat.animationGroup,r.canvas,!0)}r||(f=document.createElement("div"),f.classList.add("bubble-primary-color"),(0,A.Z)(f,(0,D.Z)(_.title)));const p=d?void 0:(0,D.Z)(_.description);y.prepend(...[f,!c&&u,p].filter(Boolean)),p?i.classList.remove("is-message-empty"):H=!1,i.classList.add("is-invoice");break}default:t=void 0,i.classList.remove("is-message-empty"),y.append((0,S.ag)(S.nK),$),this.log.warn("unrecognized media type:",_._,e)}!a&&t&&L.append(t)}z&&i.classList.add("just-media");let oe="";const re=e.fromId!==d.Z.myId&&this.chat.isAnyGroup||e.viaBotId||e.pFlags.sponsored;if(re||ee||e.reply_to_mid){let t,s;const a="peerChannel"===(null===(l=e.from_id)||void 0===l?void 0:l._)&&e.fromId===te,o=ee&&!ee.from_id;e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+(yield this.managers.appUsersManager.getUser(e.viaBotId)).username,s.classList.add("peer-title"),i.classList.add("must-have-name"));const r=te||ee;let h,u;if(o?(t=document.createElement("span"),(0,A.Z)(t,(0,D.Z)(ee.from_name)),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new R.Z({peerId:te||e.fromId,withPremiumIcon:!r,middleware:n}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&c&&(h=yield se.setReply({chat:this.chat,bubble:i,bubbleContainer:L,message:e})),r)if(this.peerId===d.Z.myId||a||i.classList.add("forwarded"),e.savedFrom&&(oe=e.savedFrom,t.dataset.savedFrom=oe),u=document.createElement("div"),t.dataset.peerId=""+te,this.peerId!==d.Z.myId&&this.peerId!==m.hj&&!a||z){const e=[t];if(z){const t=document.createElement("br");t.classList.add("hide-ol"),e.unshift(t)}u.append((0,S.ag)("ForwardedFrom",[e]))}else u.style.color=(0,N.Z)(te,!1),u.classList.add("colored-name"),u.append(t);else if(!e.viaBotId)if(!z&&re){u=document.createElement("div"),u.append(t);const i=yield this.managers.appPeersManager.getPeer(e.fromId),s=null==i?void 0:i.pFlags;s&&(s.scam||s.fake)&&u.append((0,tt.Z)(s.scam)),b||(u.style.color=(0,N.Z)(e.fromId,!1),u.classList.add("colored-name")),u.dataset.peerId=""+e.fromId}else i.classList.add("hide-name");if(e.viaBotId){u?u.append(" "):u=document.createElement("div");const e=document.createElement("span");e.append((0,S.ag)("ViaBot")," ",s),e.classList.add("is-via"),u.append(e)}u?(u.classList.add("name"),z?(ne.append(ne=document.createElement("div")),ne.classList.add("name-with-reply","floating-part")):u.classList.add("floating-part"),ne.append(u),z&&h&&ne.append(h)):z&&h&&h.classList.add("floating-part")}else i.classList.add("hide-name");if("pinned"===this.chat.type&&(oe=`${this.chat.peerId}_${e.mid}`),J&&J.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),oe&&("pinned"===this.chat.type||ee.saved_from_msg_id)&&this.peerId!==m.hj){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),L.append(e),i.dataset.savedFrom=oe,i.classList.add("with-beside-button")}return i.classList.add(ie?"is-out":"is-in"),X&&(se.renderReplies({bubble:i,bubbleContainer:L,message:J,messageDiv:y,loadPromises:M,lazyLoadQueue:this.lazyLoadQueue})?H=!0:i.classList.add("with-beside-replies")),c&&this.appendReactionsElementToBubble(i,e,f),H&&(i.classList.add("can-have-tail"),L.append(ps())),P}))}appendReactionsElementToBubble(e,t,i,s){if(this.peerId.isUser(),!(null==i?void 0:i.reactions)||!i.reactions.results.length)return;const n=new qe;if(n.init(i,"block",e.middlewareHelper.get()),n.render(s),e.classList.contains("is-message-empty"))e.querySelector(".bubble-content-wrapper").append(n);else{const s=e.querySelector(".message");if(e.classList.contains("is-multiple-documents")){const e=s.lastElementChild;let a=e.querySelector(".document-message"),o=a&&a.querySelector(".time");o||(o=se.setTime({chatType:this.chat.type,message:t,reactionsMessage:i})),n.append(o),a||(a=document.createElement("div"),a.classList.add("document-message"),e.querySelector(".document-wrapper").prepend(a)),a.append(n)}else{const t=Array.from(e.querySelectorAll(".time")).pop();n.append(t),s.append(n)}}}prepareToSaveScroll(e){if(!this.chatInner.parentElement)return{};const t=this.log.bindPrefix("prepareToSaveScroll");t("save");const i=this.createScrollSaver(e);if(i.save(),this.getRenderedLength()&&!this.chat.setPeerPromise){const e=this.getViewportSlice();this.deleteViewportSlice(e,!0)}return{restoreScroll:()=>{t("restore"),i.restore(e),this.onRenderScrollSet(i.getSaved())},scrollSaver:i}}performHistoryResult(e,t){var i;return is(this,void 0,void 0,(function*(){let s=e.history;s=s.slice(),this.needReflowScroll&&(we(this.scrollable.container),this.needReflowScroll=!1);const n=yield Promise.all(s.map((e=>"number"==typeof e?this.chat.getMessage(e):e))),a=[];if(!this.scrollable.loadedAll.bottom||!this.scrollable.loadedAll.top){let t=e.isEnd;if(!t){const e=yield this.chat.getHistoryStorage(),i=e.history.first,n=e.history.last;t={top:!1,bottom:!1,both:!1},!i.isEnd(ue.D.Bottom)||i.length&&!s.includes(i[0])||(t.bottom=!0),!n.isEnd(ue.D.Top)||n.length&&!s.includes(n[n.length-1])||(t.top=!0)}if(!t.bottom&&this.setPeerOptions){const{lastMsgId:e,topMessage:i}=this.setPeerOptions;this.setPeerOptions=void 0,e&&!this.bubbles[i]&&e!==i||(t.bottom=!0)}t.top&&a.push(this.setLoaded("top",!0)),t.bottom&&a.push(this.setLoaded("bottom",!0))}yield Promise.all(a);const o=n.map((e=>e?e.pFlags.local?this.processLocalMessageRender(e):this.safeRenderMessage(e,t):void 0));yield Promise.all(o),yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this))}))}onRenderScrollSet(e){const t="has-sticky-dates";if(this.container.classList.contains(t)||this.preloader.detached&&(null!=e||(e={scrollHeight:this.scrollable.scrollHeight,clientHeight:this.scrollable.container.clientHeight}),e.scrollHeight===e.clientHeight))this.willScrollOnLoad=void 0;else{const e=this.getMiddleware(),i=()=>{e()&&this.container.classList.add(t)};this.willScrollOnLoad?i():setTimeout(i,600)}}requestHistory(e,t,i){return"chat"===this.chat.type||"discussion"===this.chat.type?this.managers.acknowledged.appMessagesManager.getHistory(this.peerId,e,t,i,this.chat.threadId):"pinned"===this.chat.type?this.managers.acknowledged.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:i}).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.history.map((e=>e.mid))})))}))):"scheduled"===this.chat.type?this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.slice().reverse()})))}))):void 0}animateAsLadder(e,t,i,s,n){return is(this,void 0,void 0,(function*(){const a=this.log.bindPrefix("ladder");if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return a.warn("will be delayed"),void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,i,s,n));if(!Object.keys(this.bubbles).length)return void a.warn("no bubbles");let o,r=(0,Je.Z)(this.bubbles,"desc");i&&t.length&&(r=r.filter((e=>!t.includes(e)))),o=s?n||Math.max(...r):e||Math.max(...r);const d=r.slice(r.findIndex((e=>o>e))),l=i?[]:[o],c=i?[]:r.slice(0,r.findIndex((e=>o>=e))).reverse();he.ZP&&a("targeting mid:",o,n,e,d.map((e=>(0,ct.Z)(e))),c.map((e=>(0,ct.Z)(e))));const h=[];this.chatInner.classList.add("zoom-fading");const u=i?10:40,f=i?0:1,p=(e,t=0)=>{const i=(0,ce.Z)();let s=0;return e.forEach(((n,o)=>{const r=this.bubbles[n];if(!r||this.skippedMids.has(n))return void a.warn("no bubble by mid:",n);s=(o+t||.1)*u;const d=r.lastElementChild,l=[d],c=this.bubbleGroups.getItemByBubble(r);if(c&&c.group.avatar&&c.group.lastItem===c&&l.push(c.group.avatar),l.forEach((e=>{e.classList.add("zoom-fade","can-zoom-fade"),e.style.transitionDelay=s+"ms"})),o===e.length-1){const e=t=>{t.target===d&&(i.resolve(),d.removeEventListener("transitionend",e))};d.addEventListener("transitionend",e)}h.push(...l)})),e.length||i.resolve(),{lastMsDelay:s,animationPromise:i}},m=p(d,f),g=p(l),v=p(c,f),b=[m.animationPromise,g.animationPromise,v.animationPromise],y=[m.lastMsDelay,g.lastMsDelay,v.lastMsDelay];let w;return this.onAnimateLadder&&(yield this.onAnimateLadder()),(0,le.T2)((()=>{this.setStickyDateManually(),h.forEach((e=>{e.classList.remove("zoom-fade")}))})),(d.length||l.length||c.length)&&(w=Promise.all(b),(0,de.YW)(w,Math.max(...y)+200).then((()=>{(0,le.T2)((()=>{h.forEach((e=>{e.style.transitionDelay="",e.classList.remove("can-zoom-fade")})),this.chatInner.classList.remove("zoom-fading")}))}))),w}))}renderEmptyPlaceholder(e,t,i,s){return is(this,void 0,void 0,(function*(){const i="empty-bubble-placeholder";let n,a;if(t.classList.add(i,i+"-"+e),"group"===e?n=(0,S.ag)("GroupEmptyTitle1"):"saved"===e?n=(0,S.ag)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?n=(0,S.ag)("NoMessages"):"noScheduledMessages"===e?n=(0,S.ag)("NoScheduledMessages"):"restricted"===e&&(n=document.createElement("span"),n.innerText=yield this.managers.appPeersManager.getRestrictionReasonText(this.peerId)),n.classList.add("center",i+"-title"),s.push(n),"group"===e)s.push((0,S.ag)("GroupEmptyTitle2")),a=[(0,S.ag)("GroupDescription1"),(0,S.ag)("GroupDescription2"),(0,S.ag)("GroupDescription3"),(0,S.ag)("GroupDescription4")];else if("saved"===e)a=[(0,S.ag)("ChatYourSelfDescription1"),(0,S.ag)("ChatYourSelfDescription2"),(0,S.ag)("ChatYourSelfDescription3"),(0,S.ag)("ChatYourSelfDescription4")];else if("greeting"===e){const e=(0,S.ag)("NoMessagesGreetingsDescription");e.classList.add("center",i+"-subtitle");const t=document.createElement("div");t.classList.add(i+"-sticker");const n=this.getMiddleware();yield this.managers.appStickersManager.getGreetingSticker().then((e=>is(this,void 0,void 0,(function*(){if(!n())return;const i=[];return yield(0,V.ZP)({doc:e,div:t,middleware:n,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,withThumb:!0,loadPromises:i}),(0,w.fc)(t,(e=>{(0,be.Z)(e),vt.Jo.onMediaClick({target:e.target})})),Promise.all(i)})))),s.push(e,t)}a&&(s.push(...a.map((e=>{const t=document.createElement("span");return t.classList.add(i+"-list-item"),t.append(e),t}))),"group"===e?a.forEach((e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)})):"saved"===e&&a.forEach((e=>{const t=document.createElement("span");t.classList.add(i+"-list-bullet"),t.innerText="•",e.prepend(t)}))),s.length>1&&t.classList.add("has-description"),s.forEach((e=>e.classList.add(i+"-line")))}))}processLocalMessageRender(e,t,i=this.getMiddleware()){return is(this,void 0,void 0,(function*(){const s=!!e.pFlags.sponsored,n=(0,gt.Z)(i);return this.safeRenderMessage(e,!s,void 0,!1,(i=>is(this,void 0,void 0,(function*(){const{bubble:a}=yield n(i);if(!a)return i;a.message=e,a.classList.add("is-group-last","is-group-first");const o=()=>{this.updatePlaceholderPosition===o&&(this.updatePlaceholderPosition=void 0),u[f](a)};s||(a.classList.add("bubble-first"),a.classList.remove("can-have-tail","is-in"));const r=[],l=this.chat.isBot;let c,u=this.container,f="append";if(this.chat.isRestricted)c=this.renderEmptyPlaceholder("restricted",a,e,r);else if(s){let i,s,n,o;a.classList.add("avoid-selection"),a.style.order="999999";const r=this.sponsoredMessage=e.sponsoredMessage,d=(0,F.Z)(r.from_id);r.channel_post?(i="OpenChannelPost",s=(0,ht.Z)(r.channel_post)):r.start_param||l?(i="Chat.Message.ViewBot",n=r.start_param):i=(yield this.managers.appPeersManager.isAnyGroup(d))?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new Ue(r.chat_invite_hash,r.chat_invite)}:r.chat_invite_hash?()=>{const e={_:Me.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{this.chat.appImManager.setInnerPeer({peerId:d,lastMsgId:s,startParam:n})};const c=(0,Re.Z)("btn-primary btn-primary-transparent bubble-view-button",{text:i});this.observer.observe(c,this.viewsObserverCallback),o&&(0,w.fc)(c,o),a.querySelector(".bubble-content").prepend(c),u=this.chatInner,f="append",t=!1}else if(l&&"message"===e._){const e=document.createElement("b");e.append((0,S.ag)("BotInfoTitle")),r.push(e,"\n\n"),u=this.chatInner,f="prepend"}else c=this.chat.isAnyGroup&&(yield n(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator?this.renderEmptyPlaceholder("group",a,e,r):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",a,e,r):d.Z.myId===this.peerId?this.renderEmptyPlaceholder("saved",a,e,r):this.peerId.isUser()&&!l&&(yield n(this.chat.canSend()))&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",a,e,r):this.renderEmptyPlaceholder("noMessages",a,e,r);c&&(yield c),r.length&&a.querySelector(".message, .service-msg").prepend(...r);const p=!!this.messagesQueueOnRenderAdditional,m=this.setPeerCached&&!p;if(m){const e=a.firstElementChild;e.classList.add("no-transition"),this.chat.setPeerPromise&&this.chat.setPeerPromise.catch(Ke.Z).finally((()=>{e.classList.remove("no-transition")}))}if(void 0!==t||m||(t=!0),p||t?(this.updatePlaceholderPosition=o,this.onAnimateLadder=()=>{if(this.onAnimateLadder=void 0,!this.messagesQueuePromise)return(0,le.AD)()}):this.chat.setPeerPromise?this.attachPlaceholderOnRender=()=>{this.attachPlaceholderOnRender=void 0,o()}:this.updatePlaceholderPosition=o,!p&&t){yield n((0,de.e9)());const t=(0,Je.Z)(this.bubbles);(0,h.Z)(t,e.mid),this.animateAsLadder(e.mid,t,!1,0,0)}return a.middlewareHelper.onDestroy((()=>{this.emptyPlaceholderBubble===a&&(this.emptyPlaceholderBubble=void 0)})),this.emptyPlaceholderBubble=a,i}))))}))}generateLocalMessageId(e=0){const t=("scheduled"===this.chat.type?-1:0)+e,i=-Math.abs(t);return{id:i,mid:-Math.abs((0,ht.Z)(i))}}generateLocalFirstMessage(e,t,i=0){return is(this,void 0,void 0,(function*(){const{id:s,mid:n}=this.generateLocalMessageId(i);let a={_:e?"messageService":"message",date:0,id:s,mid:n,peer_id:yield this.managers.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),(0,Le.Z)(a),t&&t(a),a=(yield this.managers.appMessagesManager.saveMessages([a],{storage:new Map}))[0],a.mid=n,a}))}getViewportSlice(){return(0,Xe.Z)({overflowElement:this.scrollable.container,selector:".bubbles-date-group .bubble:not(.is-date)",extraSize:2*Math.max(700,Pe.Z.height)})}deleteViewportSlice(e,t){const{invisibleTop:i,invisibleBottom:s}=e,n=i.concat(s);if(!n.length)return;i.length&&(this.setLoaded("top",!1),this.getHistoryTopPromise=void 0),s.length&&(this.setLoaded("bottom",!1),this.getHistoryBottomPromise=void 0);const a=n.map((({element:e})=>+e.dataset.mid));let o;t||(o=this.createScrollSaver(!!i.length),o.save()),this.deleteMessagesByIds(a,!1,!0),o?o.restore():i.length&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop)}sliceViewport(e){if(k.IS_SAFARI||this.isHeavyAnimationInProgress&&!e)return;const t=this.getViewportSlice();this.deleteViewportSlice(t)}setLoaded(e,t,i=!0){return is(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll[e]!==t)return this.log.bindPrefix("setLoaded")("change",e,t),this.scrollable.loadedAll[e]=t,this.scrollable.onScroll(),i?!this.chat.isRestricted&&("bottom"===e&&this.chat.isBroadcast&&this.toggleSponsoredMessage(t),"top"===e&&t&&this.chat.isBot)?this.renderBotPlaceholder():this.checkIfEmptyPlaceholderNeeded():void 0}))}toggleSponsoredMessage(e){return is(this,void 0,void 0,(function*(){const t=this.log.bindPrefix("sponsored");t("checking");const{mid:i}=this.generateLocalMessageId(1);if(e){const e=this.getMiddleware((()=>this.scrollable.loadedAll.bottom&&this.getSponsoredMessagePromise===i)),i=this.getSponsoredMessagePromise=this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId()).then((i=>is(this,void 0,void 0,(function*(){if(!e())return;const s=i.messages[0];if(!s)return void t("no message");const n=this.generateLocalFirstMessage(!1,(e=>{e.message=s.message,e.from_id=s.from_id,e.entities=s.entities,e.pFlags.sponsored=!0,e.sponsoredMessage=s}),1);return Promise.all([n,this.getHistoryTopPromise,this.messagesQueuePromise]).then((([i])=>{if(e())return t("rendering",i),this.performHistoryResult({history:[i]},!1)}))})))).finally((()=>{this.getSponsoredMessagePromise===i&&(this.getSponsoredMessagePromise=void 0)}))}else t("clearing rendered",i),this.getSponsoredMessagePromise=void 0,this.deleteMessagesByIds([i])}))}renderBotPlaceholder(){return is(this,void 0,void 0,(function*(){const e=this.log.bindPrefix("bot placeholder"),t=this.getMiddleware(),i=yield this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());e("getting profile, cached:",i.cached);const s=i.result.then((s=>is(this,void 0,void 0,(function*(){var n;if(!t())return;if(!(null===(n=s.bot_info)||void 0===n?void 0:n.description))return e.warn("no description"),this.checkIfEmptyPlaceholderNeeded();const a=yield this.generateLocalFirstMessage(!1,(e=>{const t=s.bot_info;e.message=t.description,t.description_document&&(e.media={_:"messageMediaDocument",document:t.description_document}),t.description_photo&&(e.media={_:"messageMediaPhoto",photo:t.description_photo})}));return t()?(e("rendering"),{renderPromise:this.processLocalMessageRender(a,!i.cached).then((()=>{e("done")}))}):void 0}))));if(i.cached)return s}))}checkIfEmptyPlaceholderNeeded(){return is(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderBubble&&(this.chat.isRestricted||!(yield this.chat.getHistoryStorage()).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=yield this.generateLocalFirstMessage(!0);return{renderPromise:this.processLocalMessageRender(e)}}}))}getHistory1(e,t,i,s,n){const a=this.getMiddleware(n?void 0:()=>(t?this.getHistoryTopPromise:this.getHistoryBottomPromise)===r),o=this.getHistory(e,t,i,s,n,a),r=o.then((e=>e&&(e.waitPromise||e.promise)));return t?this.getHistoryTopPromise=r:this.getHistoryBottomPromise=r,r.then((()=>{a()&&(t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0,n||"chat"===this.chat.type&&setTimeout((()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)}),0))})),o}getHistory(e=0,t=!1,i=!1,s=0,n=!1,a){return is(this,void 0,void 0,(function*(){const o=this.peerId,r=this.chat.isBroadcast,l=Math.min(30,Pe.Z.height/40|0);let c=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;if(void 0!==os){if(!os)return{cached:!1,promise:Promise.resolve(),waitPromise:Promise.resolve()};Object.keys(this.bubbles).length>0&&--os}let h,u=0;if(i&&(u=c,t||(c=0)),s&&!i)if("pinned"===this.chat.type)h=[s];else{const t=(yield this.chat.getHistoryStorage()).history.slice;if(t.length=0;--e){const t=yield this.chat.getMessage(h[e]);if(!(null==t?void 0:t.grouped_id))break;h.splice(e,1)}e=h[h.length-1]||e}}let f,p=yield this.requestHistory(e,c,u);const m=(null==h?void 0:h.length)&&!p.cached,g=this.isFirstLoad&&u&&!p.cached||m;m&&(f=p.result,p={cached:!0,result:Promise.resolve({history:h})}),this.isFirstLoad=!1;const v=e=>is(this,void 0,void 0,(function*(){var t;if(null===(t=e.isEnd)||void 0===t?void 0:t.top){if("discussion"===this.chat.type){const t=yield this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId,this.chat.threadId);t&&e.history.push(t);const i=yield this.chat.getMidsByMid(this.chat.threadId);e.history.push(...i.reverse())}yield this.managers.appProfileManager.getProfileByPeerId(o)}})),b=e=>(0,de.e9)().then((()=>v(e))).then((()=>(!m&&s&&e.history.unshift(s),this.performHistoryResult(e,t)))),y=e=>{const t=Promise.resolve(e).then((e=>{if(a&&!a())throw ls;if(!n)return b(e);this.scrollable.onScroll()}),(e=>{throw this.log.error("getHistory error:",e),e}));return t};let w,S;if(p.cached){if(n)return this.scrollable.onScroll(),null;S=!0,w=b(yield p.result)}else S=!1,w=y(p.result);const C=m?y(f):w;if(g&&d.Z.settings.animationsEnabled){let i=m?2:1;this.messagesQueueOnRenderAdditional=()=>{this.log("messagesQueueOnRenderAdditional"),--i||(this.messagesQueueOnRenderAdditional=void 0,this.animateAsLadder(s,h,m,u,e).then((()=>{setTimeout((()=>{this.loadMoreHistory(t,!0)}),0)})))}}else this.messagesQueueOnRenderAdditional=void 0;return n?null:{cached:S,promise:w,waitPromise:C}}))}setUnreadDelimiter(){return is(this,void 0,void 0,(function*(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=yield this.chat.getHistoryMaxId();let t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter((e=>!this.bubbles[e].classList.contains("is-out"))).map((e=>+e)).sort(((e,t)=>e-t)).find((e=>e>t)),t&&this.bubbles[t])){const i=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==i&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e&&i.classList.add("is-first-unread"),this.firstUnreadBubble=i,this.attachedUnreadBubble=!0}}))}deleteEmptyDateGroups(){const e=this.stickyIntersector?ds:1;let t=!1;for(const i in this.dateMessages){const s=this.dateMessages[i];s.container.childElementCount===e&&(s.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(s.container,s.div),delete this.dateMessages[i],t=!0)}t&&(Object.keys(this.dateMessages).length||this.container.classList.remove("has-groups"),this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function ps(){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}var ms=i(3003),gs=i(5128),vs=i(8127);class bs{constructor(e,t,i,s){this.peerId=e,this.mid=t,this.unpin=i,this.onConfirm=s,this.construct()}construct(){return e=this,t=void 0,s=function*(){const{peerId:e,mid:t,unpin:i,onConfirm:s}=this;let n,a,o;const r=[],l=[],c=y.Z.MANAGERS,h=yield c.appPeersManager.canPinMessage(e),u=(n,a,o)=>{setTimeout((()=>{let n;n=i&&!t?h?c.appMessagesManager.unpinAllMessages(e):c.appMessagesManager.hidePinnedMessages(e):c.appMessagesManager.updatePinnedMessage(e,t,i,o,a),s&&n.then(s)}),300)};if(i){let i="UnpinMessage";t?(n="UnpinMessageAlertTitle",a="Chat.Confirm.Unpin"):h?(n="Popup.Unpin.AllTitle",a="Chat.UnpinAllMessagesConfirmation",o=[""+((yield c.appMessagesManager.getPinnedMessagesCount(e))||1)]):(n="Popup.Unpin.HideTitle",a="Popup.Unpin.HideDescription",i="Popup.Unpin.Hide"),r.push({langKey:i,isDanger:!0,callback:u})}else{n="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(r.push({langKey:t,callback:e=>u(0,!1,!e.size)}),(yield c.appChatsManager.isBroadcast(e.toChatId()))?a="PinMessageAlertChannel":(a="PinMessageAlert",l.push({text:"PinNotify",checked:!0}))):(a="PinMessageAlertChat",e===d.Z.myId?r.push({langKey:t,callback:u}):(r.push({langKey:t,callback:e=>u(0,!e.size)}),l.push({text:"PinAlsoFor",textArgs:[new R.Z({peerId:e}).element],checked:!0})))}(0,y.x)(r),new vs.Z("popup-delete-chat",{peerId:e,titleLangKey:n,descriptionLangKey:a,descriptionLangArgs:o,buttons:r,checkboxes:l}).show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var ys=i(1962);function ws(e=window.getSelection()){if(!(null==e?void 0:e.rangeCount))return!0;const t=e.getRangeAt(0);return!(!t.collapsed&&t.START_TO_END)}var Ss=i(2312),Cs=i(1447),Ls=i(671),Es=i(3174);function Is(e,t,i){return d.Z.managers.appStickersManager.preloadAnimatedEmojiSticker(e).then((({doc:s})=>{if(s)return Ss.Z.downloadMedia({media:s}).then((n=>{return a=this,r=void 0,l=function*(){const a=o.Z.active.emojiSticker,r=(0,Ls.tB)(e),d=yield Cs.Z.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:a.width,height:null!=i?i:a.height,name:"doc"+s.id,autoplay:!1,loop:!1,toneIndex:r},"none");d.addEventListener("firstFrame",(()=>{(0,Es.O)(s,d.canvas[0],r),d.remove()}),{once:!0})},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,r||[])).next())}));var a,r,d,l}))}))}var Ms=i(5772);class Ps extends vs.Z{constructor(e,t,i,s){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{a.isValid()&&(s&&s(),this.managers.appMessagesManager.reportMessages(e,t,i,a.value).then((e=>{e&&(0,me.bC)({langPackKey:"ReportSentInfo"})})))}}],body:!0});const n=document.createElement("div");(0,Ms.Z)({div:n,emoji:Ps.STICKER_EMOJI,width:100,height:100}).then((({render:e})=>e)).finally((()=>{this.show()})),this.header.append(n);const a=new C.ZP({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});a.input.addEventListener("input",(()=>{this.buttons[0].element.toggleAttribute("disabled",!a.isValid())})),this.body.append(a.container)}}Ps.STICKER_EMOJI="👮‍♀️";class Zs extends vs.Z{constructor(e,t,i){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const s=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"],["ReportChatPersonalDetails","inputReportReasonPersonalDetails"],["ReportChatIllegalDrugs","inputReportReasonIllegalDrugs"]];s.forEach((e=>{const t=(0,Re.Z)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)}));const n=Is(Ps.STICKER_EMOJI);(0,w.fc)(this.body,(a=>{const o=(0,fe.Z)(a.target,"btn-primary"),r=s[(0,Se.Z)(o)][1];n.then((()=>{this.hide(),new Ps(e,t,r,i)}))}),{listenerSetter:this.listenerSetter}),this.buttonsEl.style.marginTop=".5rem",this.show()}}class ks extends vs.Z{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[(0,S.ag)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(S.ZP.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}],scrollable:!0}),this.scrollable.append(this.description),this.show()}}var Ts=i(6008),xs=i(8936),As=i(3061),_s=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Fs extends y.Z{constructor(e){super("popup-reacted-list",{closable:!0,overlayClosable:!0,body:!0}),this.message=e,this.init()}init(){return _s(this,void 0,void 0,(function*(){const e=this.middlewareHelper.get(),t=yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message);if(!e())return;const i=yield this.managers.appMessagesManager.canViewMessageReadParticipants(t);if(!e())return;const s=new qe,a=Object.assign(Object.assign({},t),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},t.reactions),{pFlags:{},recent_reactions:[]})});a.reactions.results=a.reactions.results.map((e=>Object.assign(Object.assign({},e),{chosen_order:void 0,pFlags:{}}))),s.init(a,"block",this.middlewareHelper.get()),s.render(),s.classList.add("no-stripe"),s.classList.remove("has-no-reactions"),s.append(this.btnClose),this.header.append(s);const o=document.createElement("div");o.classList.add("tabs-container"),o.dataset.animation="tabs";const r=new Map;let d=!1;if(a.reactions.results.length){const e=this.createFakeReaction("reactions",a.reactions.results.reduce(((e,t)=>e+t.count),0));s.prepend(e),a.reactions.results.unshift(e.reactionCount),d=!0}let l=!1;if(i)try{const i=yield this.managers.appMessagesManager.getMessageReadParticipants(t.peerId,t.mid);if(!e())return;if(!i.length)throw"";const n=this.createFakeReaction("checks",i.length);s.prepend(n),a.reactions.results.unshift(n.reactionCount),l=!0}catch(e){}a.reactions.results.forEach((i=>{const s=new P.ZP(void 0);s.container.classList.add("tabs-tab");const a=new n.dw({noShadow:!0,noDelimiter:!0}),d=zi.default.createChatList({dialogSize:72});zi.default.setListClickListener(d,(()=>{this.hide()}),void 0,!1,!0),a.content.append(d),s.container.append(a.container);const l="checks"!==i.reaction,c="checks"===i.reaction;["checks","reactions"].includes(i.reaction)&&(i.reaction=void 0);const h=(0,Ve.C)(24,24);let u;const f=new xs.Z({scrollable:s,getPromise:()=>_s(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(t,void 0,i.reaction,u,l,c);return u=s.nextOffset,yield Promise.all(s.combined.map((({peerId:t,reaction:i})=>_s(this,void 0,void 0,(function*(){const{dom:s}=zi.default.addDialogNew({peerId:t,autonomous:!0,container:d,avatarSize:"abitbigger",rippleEnabled:!1,meAsSaved:!1});if(i){const t=document.createElement("div");if(t.classList.add("reacted-list-reaction-icon"),"reactionEmoji"===i._){const s=yield this.managers.appReactionsManager.getReactionCached(i.emoticon);(0,V.ZP)({doc:s.static_icon,div:t,width:24,height:24,middleware:e})}else"reactionCustomEmoji"===i._&&t.append((0,je.Z)({docIds:[i.document_id],size:h,middleware:e}));s.listEl.append(t)}(0,O.Z)(s.lastMessageSpan,(0,As.Z)(yield this.managers.appUsersManager.getUser(t.toUserId())))}))))),!u}))});r.set(s.container,f),o.append(s.container)})),this.body.append(o);const c=(0,Ts.X)(s,o,((e,t)=>{if(e===s.childElementCount-1)return!1;const i=s.children[e],n=c.prevId();-1!==n&&s.children[n].setIsChosen(!1),i.setIsChosen(!0),r.get(t).load()}),void 0,void 0,void 0,this.listenerSetter);c(0,!1),this.show()}))}createFakeReaction(e,t){const i=new We;i.init("block",this.middlewareHelper.get()),i.reactionCount={_:"reactionCount",count:t,reaction:e},i.setCanRenderAvatars(!1),i.renderCounter();const s=document.createElement("div");return s.classList.add("reaction-counter","reaction-sticker-icon","tgico-"+e),i.prepend(s),i}}const Ds="btn-menu-reactions-reaction",Rs=!k.IS_SAFARI;class Bs{constructor(e,t,i){this.managers=e,this.type=t,this.onScroll=()=>{this.reactionsMap.forEach(((e,t)=>{this.onScrollProcessItem(t,e)}))},this.onMouseMove=e=>{var t;const i=(0,fe.Z)(e.target,Ds);if(!i)return;const s=this.reactionsMap.get(i);if(!s)return;if(!(null===(t=s.appear)||void 0===t?void 0:t.paused))return;const n=s.select;n&&n.paused&&(n.autoplay=!0,n.restart())};const n=this.widthContainer=document.createElement("div");n.classList.add("btn-menu-reactions-container"),n.classList.add("btn-menu-reactions-container-"+t);const a=this.container=document.createElement("div");a.classList.add("btn-menu-reactions");const o=this.scrollable="vertical"===t?new P.ZP(void 0):new P.v7(void 0);a.append(o.container),o.onAdditionalScroll=this.onScroll,o.setListeners(),o.container.classList.add("no-scrollbar"),this.reactionsMap=new Map,this.animationGroup=`CHAT-MENU-REACTIONS-${Date.now()}`,s.Z.setOverrideIdleGroup(this.animationGroup,!0),c.Z||a.addEventListener("mousemove",this.onMouseMove),(0,w.fc)(a,(e=>{const t=(0,fe.Z)(e.target,Ds);if(!t)return;const i=this.reactionsMap.get(t);i&&this.managers.appReactionsManager.sendReaction(this.message,i.reaction)})),n.append(a),this.middleware=null!=i?i:(0,ve.k)()}init(e){this.message=e;const t=this.middleware.get(),i=this.managers.appReactionsManager.getAvailableReactionsByMessage(e);(0,ze.Z)(i,(e=>{if(!t()||!e.length)return;e.forEach((e=>{e.pFlags.premium&&!d.Z.premium||this.renderReaction(e)}));const s=()=>{this.container.classList.add("is-visible")};i instanceof Promise?(0,le.T2)(s):s()}))}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),s.Z.setOverrideIdleGroup(this.animationGroup,!1),s.Z.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return d.Z.settings.animationsEnabled&&!k.IS_MOBILE}renderReaction(e){const t=document.createElement("div");t.classList.add(Ds);const i=document.createElement("div");i.classList.add(Ds+"-scale");const s=document.createElement("div");let n;s.classList.add(Ds+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(Ds+"-select","hide"));const a={selectWrapper:n,appearWrapper:s,reaction:{_:"reactionEmoji",emoticon:e.reaction}};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=26*(c.Z?1:1.25),d={width:r,height:r,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:o};if(this.canUseAnimations()){let t=!0;(0,V.ZP)(Object.assign({doc:e.appear_animation,div:s,play:!0},d)).then((({render:e})=>e)).then((e=>{(0,Le.Z)(e),a.appear=e,e.addEventListener("enterFrame",(o=>{e.maxFrame===o&&i.then((e=>{(0,Le.Z)(e),s.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)}),Ke.Z)}))}),Ke.Z);const i=(0,V.ZP)(Object.assign({doc:e.select_animation,div:n},d)).then((({render:e})=>e)).then((e=>((0,Le.Z)(e),Cs.Z.waitForFirstFrame(e)))).catch(Ke.Z)}else delete d.needFadeIn,delete d.withThumb,(0,V.ZP)(Object.assign({doc:e.static_icon,div:s},d));i.append(s),n&&i.append(n),t.append(i),this.scrollable.append(t)}onScrollProcessItem(e,t){const i=e.firstElementChild,s=(0,Be.Z)(e,this.scrollable.container);let n;if(s)if(s.overflow.left||s.overflow.right){const e=Math.abs(s.rect.left-s.rect.right);n="scale("+Math.min(Math.pow(e,2)/Math.pow(34,2),1)+")"}else n="";else{if(!t.appearWrapper.classList.contains("hide")||!t.appear)return;t.select&&t.select.stop(),t.appear.stop(),t.appear.autoplay=!0,t.appearWrapper.classList.remove("hide"),t.selectWrapper.classList.add("hide"),n=""}Rs&&(i.style.transform=n)}}var Ns=i(1483),Os=i(2353),Us=i(6690),Hs=i(3709),zs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class js{constructor(e,t){this.chat=e,this.managers=t,this.onContextMenu=e=>{let t,i;try{i=(0,fe.Z)(e.target,"bubble-content-wrapper"),t=i?i.parentElement:(0,fe.Z)(e.target,"bubble")}catch(e){}if(!t||t.classList.contains("bubble-first"))return;let s=this.element;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),s&&s.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+t.dataset.mid;n&&(()=>{zs(this,void 0,void 0,(function*(){const a=this.isSponsored=n<0;if(this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!ws(),this.isAnchorTarget="A"===this.target.tagName&&("_blank"===this.target.target||this.target.classList.contains("anchor-url")),this.isUsernameTarget="A"===this.target.tagName&&this.target.classList.contains("mention"),this.chat.selection.isSelecting&&!i){if(a)return;const e=yield this.chat.getMidsByMid(n);if(e.length>1){const t=this.chat.selection.isMidSelected(this.peerId,n)?n:e.find((e=>this.chat.selection.isMidSelected(this.peerId,e)));t&&(n=t)}}this.isOverBubble=!!i;const o=(0,fe.Z)(this.target,"grouped-item");this.isTargetAGroupedItem=!!o,this.mid=o?+o.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=t.message||(yield this.chat.getMessage(this.mid)),this.noForwards=!a&&!(yield this.managers.appMessagesManager.canForward(this.message)),this.viewerPeerId=void 0,this.canOpenReactedList=void 0;const r=yield this.init();if(!r)return;s=r.element;const{cleanup:d,destroy:l,menuPadding:c,reactionsMenu:h,reactionsMenuPosition:u}=r;let f=!1;if(h){const e="is-visible";if(f=h.container.classList.contains(e),f&&h.container.classList.remove(e),"horizontal"===u){const e=s.offsetWidth,t=(e-8)/34%1,i=.65;if(t{h&&h.container.classList.remove("is-visible"),this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,d(),setTimeout((()=>{l()}),300)})),f&&h.container.classList.add("is-visible")}))})()},this.onSendScheduledClick=()=>zs(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,w.tH)(this.chat.selection.selectionSendNowBtn):new ys.Z(this.peerId,yield this.chat.getMidsByMid(this.mid))})),this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onFaveStickerClick=e=>{const t=this.message.media.document.id;this.managers.appStickersManager.faveSticker(t,e)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>zs(this,void 0,void 0,(function*(){if(ws()){const e=this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort(((e,t)=>e-t)):[this.mid],t=(yield Promise.all(e.map((e=>zs(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);return(null==t?void 0:t.message)?t.message+"\n":""})))))).join("");(0,it.T)(t)}else document.execCommand("copy")})),this.onCopyAnchorLinkClick=()=>{(0,it.T)(this.target.href)},this.onCopyLinkClick=()=>zs(this,void 0,void 0,(function*(){let e;const{peerId:t,mid:i}=this,s=this.chat.threadId;"discussion"===this.chat.type&&(e=yield this.managers.appMessagesManager.getMessageByPeer(t,s));const n=yield this.managers.appPeersManager.getPeerUsername(e?e.fromId:t),a=(0,ct.Z)(i);let o,r="https://t.me/";n?(r+=n+"/"+(e?(0,ct.Z)(e.fwd_from.channel_post):a),e&&(r+="?comment="+a),o="LinkCopied"):(r+="c/"+t.toChatId()+"/"+a,e&&(r+="?thread="+(0,ct.Z)(e.mid)),o="LinkCopiedPrivateInfo"),(0,me.Am)(S.ZP.format(o,!0)),(0,it.T)(r)})),this.onPinClick=()=>{new bs(this.peerId,this.mid)},this.onUnpinClick=()=>{new bs(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.managers.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.managers.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>zs(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting)(0,w.tH)(this.chat.selection.selectionForwardBtn);else{const e=this.peerId,t=this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid);new E.Z({[e]:t})}})),this.onSelectClick=()=>{this.chat.selection.toggleByElement((0,fe.Z)(this.target,"grouped-item")||(0,fe.Z)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>zs(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,w.tH)(this.chat.selection.selectionDeleteBtn):new gs.Z(this.peerId,this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid),this.chat.type)})),this.listenerSetter=new ae.Z,this.attachListenerSetter=new ae.Z,this.middleware=(0,ve.k)()}attachTo(e){this.attachListenerSetter.removeAll(),c.Z?(0,w.fc)(e,(e=>{this.chat.selection.isSelecting||(this.chat.log("touchend",e),!e.target.closest([".name",".peer-title",".reply",".document","audio-element","avatar-element","a",".bubble-beside-button","replies-element","[data-saved-from]:not(.bubble)","poll-element",".attachment",".reply-markup-button"].join(", "))&&((0,be.Z)(e),this.onContextMenu(e)))}),{listenerSetter:this.attachListenerSetter}):(0,pt.E)(e,this.onContextMenu,this.attachListenerSetter)}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup(),this.attachListenerSetter.removeAll()}filterButtons(e){return zs(this,void 0,void 0,(function*(){return this.isSponsored?e.filter((e=>e.isSponsored)):(0,Os.Z)(e,(e=>zs(this,void 0,void 0,(function*(){let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||c.Z,t=yield e.verify()),!!t}))))}))}setButtons(){const e=e=>zs(this,void 0,void 0,(function*(){var t;const i=null===(t=this.message.media)||void 0===t?void 0:t.document;if(!(null==i?void 0:i.sticker))return!1;const s=yield this.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!s.cached)return!1;const n=(yield s.result).some((e=>e.id===i.id));return e?!n:n}));this.buttons=[{icon:"send2",text:"MessageScheduleSend",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&!this.message.pFlags.is_outgoing},{icon:"send2",text:"Message.Context.Selection.SendNow",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&this.isSelected&&!this.chat.selection.selectionSendNowBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"schedule",text:"MessageScheduleEditTime",onClick:()=>{this.chat.input.scheduleSending((()=>{(0,Le.Z)(this.message),this.managers.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)}),new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>zs(this,void 0,void 0,(function*(){return(yield this.chat.canSend())&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type}))},{icon:"favourites",text:"AddToFavorites",onClick:this.onFaveStickerClick.bind(this,!1),verify:()=>e(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:this.onFaveStickerClick.bind(this,!0),verify:()=>e(!1)},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>zs(this,void 0,void 0,(function*(){return(yield this.managers.appMessagesManager.canEditMessage(this.message,"text"))&&!!this.chat.input.messageInput}))},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(this.noForwards||!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!this.noForwards&&!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>zs(this,void 0,void 0,(function*(){if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids){const i=`${e}_${"scheduled"===this.chat.type?"scheduled":"history"}`;for(const e of t)if((yield this.managers.appMessagesManager.getMessageFromStorage(i,e)).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:()=>{(0,it.T)(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{(0,it.T)(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>zs(this,void 0,void 0,(function*(){return(yield this.managers.appPeersManager.isChannel(this.peerId))&&!this.message.pFlags.is_outgoing}))},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>zs(this,void 0,void 0,(function*(){return!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))&&"scheduled"!==this.chat.type}))},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>zs(this,void 0,void 0,(function*(){return this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))}))},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{Ss.Z.downloadToDisc({media:(0,lt.Z)(this.message)})},verify:()=>{var e,t;if(!(0,Hs.Z)(this.message)||this.noForwards)return!1;let i=!1;if(null===(e=this.message.media)||void 0===e?void 0:e.photo)i=!0;else{if(!(null===(t=this.message.media)||void 0===t?void 0:t.document))return!1;i=!0}let s=!!c.Z;return i&&(s||(s=!!((0,fe.Z)(this.target,"document")||(0,fe.Z)(this.target,"audio")||(0,fe.Z)(this.target,"media-sticker-wrapper")||(0,fe.Z)(this.target,"media-photo")||(0,fe.Z)(this.target,"media-video")))),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:()=>zs(this,void 0,void 0,(function*(){var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return(yield this.managers.appMessagesManager.canEditMessage(this.message,"poll"))&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}))},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>!(this.noForwards||"scheduled"===this.chat.type||this.message.pFlags.is_outgoing&&this.message.fromId!==m.yF||"messageService"===this.message._)},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.chat.selection.selectionForwardBtn&&this.isSelected&&!this.chat.selection.selectionForwardBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"flag",text:"ReportChat",onClick:()=>{new Zs(this.peerId,[this.mid])},verify:()=>zs(this,void 0,void 0,(function*(){return!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&(yield this.managers.appPeersManager.isChannel(this.peerId))})),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{onClick:()=>{if(this.viewerPeerId)this.chat.appImManager.setInnerPeer({peerId:this.viewerPeerId});else{if(!this.canOpenReactedList)return!1;new Fs(this.message)}},verify:()=>zs(this,void 0,void 0,(function*(){var e,t;return!this.peerId.isUser()&&(!!(null===(t=null===(e=this.message.reactions)||void 0===e?void 0:e.recent_reactions)||void 0===t?void 0:t.length)||(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)))})),notDirect:()=>!0,localName:"views"},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>zs(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(this.message)}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"info",text:"Chat.Message.Sponsored.What",onClick:()=>{new ks},verify:()=>!1,isSponsored:!0},{text:"Loading",onClick:()=>{this.emojiInputsPromise.then((e=>{new I.Z(e,!0).show()}))},verify:()=>!!this.getUniqueCustomEmojisFromMessage(this.message).length,notDirect:()=>!0,localName:"emojis"}]}getUniqueCustomEmojisFromMessage(e){const t=[],i=e.entities;if(i){const e=i.filter((e=>"messageEntityCustomEmoji"===e._));t.push(...e.map((e=>e.document_id)))}const s=e.reactions;if(s){const e=s.results.filter((e=>"reactionCustomEmoji"===e.reaction._));t.push(...e.map((e=>e.reaction.document_id)))}return(0,Us.Z)(t)}init(){return zs(this,void 0,void 0,(function*(){this.cleanup(),this.setButtons();const e=yield this.filterButtons(this.buttons);if(!e.length)return;const t=this.element=(0,ms.Z)(e,this.listenerSetter);t.id="bubble-contextmenu",t.classList.add("contextmenu");const i=e.find((e=>"views"===e.localName));if(i){const e=this.message.reactions,t=null==e?void 0:e.recent_reactions,s=!!(null==t?void 0:t.length),n=(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message))?(yield this.managers.appPeersManager.getPeer(this.peerId)).participants_count:void 0,a=e?e.results.reduce(((e,t)=>e+t.count),0):void 0;i.element.classList.add("tgico-"+(s?"reactions":"checks"));const o=new S.ZP.IntlElement({key:s?void 0===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted":"NobodyViewed",args:s?void 0===n?[a]:[n,n]:void 0,element:i.textElement});let r;r=s?void 0===n?(0,S.ag)("Chat.Context.ReactedFast",[a]):(0,S.ag)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):(0,S.ag)("Loading"),r.classList.add("btn-menu-item-text-fake"),i.element.append(r);const d=22,l=3,c=1.125;o.element.style.visibility="hidden",o.element.style.paddingRight=s?c*Math.min(l,t.length)+"rem":"1rem";const h=this.middleware.get();this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message).then((e=>{if(!h())return;r&&r.remove();const a=e.combined,u=void 0===n?e.reactionsCount:s?a.filter((e=>e.reaction)).length:a.length;let f;if(1===a.length)f=new R.Z({peerId:a[0].peerId,onlyFirstName:!0,dialog:!1}).element,(!s||e.readParticipants.length<=1)&&(this.viewerPeerId=a[0].peerId);else if(s){const e=u===a.length||void 0===n;f=(0,S.ag)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[u]:[u,a.length])}else a.length?f=(0,S.ag)("MessageSeen",[a.length]):o.element.style.visibility="";if(f&&(f.style.paddingRight=c*Math.min(l,u)+"rem",f.classList.add("btn-menu-item-text-fake"),i.element.append(f)),a.length){const e=new X({avatarSize:d});e.render(t?t.map((e=>(0,F.Z)(e.peer_id))):a.map((e=>e.peerId))),i.element.append(e.container),this.canOpenReactedList=!0}}))}let s,n,a;if(!("message"!==this.message._||this.chat.selection.isSelecting||this.message.pFlags.is_outgoing||this.message.pFlags.is_scheduled||this.message.pFlags.local)){a=k.IS_APPLE||c.Z?"horizontal":"vertical",n=this.reactionsMenu=new Bs(this.managers,a,this.middleware),n.init(yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message));const e=44,t=0,i=0;s="vertical"===a?{top:t,left:e}:{top:e,right:i,left:t}}const o=e.find((e=>"emojis"===e.localName));if(o){o.element.classList.add("is-multiline"),o.element.parentElement.insertBefore(document.createElement("hr"),o.element);const e=()=>{null!=s||(s={}),s.bottom=24},t=this.getUniqueCustomEmojisFromMessage(this.message),i=this.emojiInputsPromise=(0,ce.Z)();yield this.managers.appEmojiManager.getCachedCustomEmojiDocuments(t).then((s=>zs(this,void 0,void 0,(function*(){const n=t=>zs(this,void 0,void 0,(function*(){const s=new Map;t.forEach((e=>{e&&!s.has(e.stickerSetInput.id)&&s.set(e.stickerSetInput.id,e.stickerSetInput)}));const n=[...s.values()];if(i.resolve(n),1===s.size){const t=yield this.managers.acknowledged.appStickersManager.getStickerSet(n[0]),i=t.result.then((e=>{const t=(0,S.ag)("MessageContainsEmojiPack",[(0,D.Z)(e.set.title)]);(0,O.Z)(o.textElement,t)}));return t.cached?i:void e()}(0,O.Z)(o.textElement,(0,S.ag)("MessageContainsEmojiPacks",[s.size]))}));if(!s.some((e=>!e)))return n(s);e(),this.managers.appEmojiManager.getCustomEmojiDocuments(t).then(n)}))))}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove(),n&&n.widthContainer.remove()},menuPadding:s,reactionsMenu:n,reactionsMenuPosition:a}}))}}var Gs=i(4329),Vs=i.n(Gs),Ks=i(9043);class Ws{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=(0,ms.Z)(this.sendMenuButtons,e.listenerSetter),this.sendMenu.classList.add("menu-send",e.openSide),(0,pt.E)(e.onContextElement,(t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!e.verify())})),(0,be.Z)(t),mt.Z.openBtnMenu(this.sendMenu))}),e.listenerSetter)}setPeerId(e){this.type=e===d.Z.myId?"reminder":"schedule"}}var $s=i(1293),qs=i(9336),Qs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ys extends y.Z{constructor(e){super("popup-create-poll popup-new-media",{closable:!0,withConfirm:"Create",body:!0,title:"NewPoll"}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,i=(0,pe.Z)(t,"LABEL"),s=(0,$s.Z)(t);s||(t.parentElement.classList.add("is-filled"),i.classList.remove("hidden-widget"),i.firstElementChild.removeAttribute("disabled")),!i.nextElementSibling&&!s&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,i=(0,pe.Z)(t,"LABEL"),s=(0,Se.Z)(i);this.correctAnswers&&this.correctAnswers[0][0]===s&&(this.correctAnswers=void 0),i.remove(),this.optionInputFields.splice(s,1),this.optionInputFields.forEach(((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1),S.ZP.weakMap.get(e.label.firstElementChild).update()})),this.handleChange()},this.construct()}construct(){return Qs(this,void 0,void 0,(function*(){if(this.questionInputField=new C.ZP({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 Ws({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const e=document.createElement("hr"),t=document.createElement("div");t.classList.add("caption"),(0,S.$d)(t,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const s=document.createElement("div");s.classList.add("caption"),(0,S.$d)(s,"Settings"),(yield this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))||(this.anonymousCheckboxField=new Ft.Z({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new Ft.Z({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new Ft.Z({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",(()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)})),this.listenerSetter.add(this.quizCheckboxField.input)("change",(()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map((t=>{t.classList.toggle("radio-field",e)})),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),n.forEach((t=>t.classList.toggle("hide",!e))),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()})),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const n=[],a=document.createElement("div");a.classList.add("caption"),(0,S.$d)(a,"AccDescrQuizExplanation");const o=document.createElement("hr"),r=document.createElement("div");r.classList.add("poll-create-questions"),this.quizSolutionField=new C.ZP({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"),(0,S.$d)(d,"AddAnExplanationInfo"),r.append(this.quizSolutionField.container,d),n.push(o,a,r),n.forEach((e=>e.classList.add("hide"))),this.body.parentElement.insertBefore(e,this.body),this.body.append(t,this.questions,document.createElement("hr"),s,i,...n),(0,w.fc)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new P.ZP(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}))}getFilledAnswers(){return Array.from(this.questions.children).map(((e,t)=>{const i=e.querySelector(".input-field-input");return i instanceof HTMLInputElement?i.value:(0,qs.Z)(i,!1,!1).value})).filter((e=>!!e.trim()))}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const i=this.getFilledAnswers();if(i.length<2)return!1;if(i.find((e=>e.length>100)))return!1;const{value:s}=(0,qs.Z)(this.quizSolutionField.input,!1,!1);return!(s.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){return Qs(this,void 0,void 0,(function*(){const t=this.questionInputField.value,i=this.getFilledAnswers(),{value:s,entities:n}=(0,qs.Z)(this.quizSolutionField.input,!0,!1);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:i.map(((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])}))),id:void 0},r=yield this.chat.managers.appPollsManager.getInputMediaPoll(o,this.correctAnswers,s,n);this.chat.managers.appMessagesManager.sendOther(this.chat.peerId,r,Object.assign({},this.chat.getMessageSendingParams())),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}))}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,i=new C.ZP({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(i.input)("input",this.onInput);const s=new Ei.Z({text:"",name:"question"});s.main.append(i.container),(0,w.fc)(i.input,be.Z,{listenerSetter:this.listenerSetter}),s.label.classList.add("hidden-widget"),s.input.disabled=!0,this.quizCheckboxField.input.checked||s.label.classList.remove("radio-field"),this.listenerSetter.add(s.input)("change",(()=>{if(s.input.checked){const e=(0,Se.Z)(s.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}}));const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),i.container.append(n),(0,w.fc)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(s.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(i)}}var Js=i(7814);function Xs(e){let t,i;return e instanceof HTMLVideoElement?(t=e.videoWidth,i=e.videoHeight):(t=e.naturalWidth,i=e.naturalHeight),(0,Js.Z)({media:e,mediaSize:(0,Ve.C)(t,i),boxSize:(0,Ve.C)(320,240),quality:.9})}var en=i(9897),tn=i(2341);function sn(e){const t=e.src;return fetch(t).then((e=>e.arrayBuffer())).then((e=>{const t=new Uint8Array(e);let i=0;for(let e=0,s=t.length;e{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.isContentEditable)return;this.input.focus(),(0,Tt.Z)(this.input)}},this.attachFile=e=>{const t=this.willAttach,i=this.shouldCompress(e.type),s={};s.file=e;const n=document.createElement("div");n.classList.add("popup-item"),s.itemDiv=n;const a=i?this.attachMedia(s,n):this.attachDocument(s,n);return t.sendFileDetails.push(s),a},this.construct(i)}construct(e){return rn(this,void 0,void 0,(function*(){this.willAttach={type:e,sendFileDetails:[],group:!1};const t=yield this.managers.apiManager.getConfig();if(this.captionLengthMax=t.caption_length_max,(0,w.fc)(this.btnConfirm,(()=>this.send()),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new Ws({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.ZP(null);i.container.append(this.mediaContainer),this.inputField=new C.ZP({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:this.captionLengthMax,withLinebreaks:!0}),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=[],dn=void 0})),dn=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 Ft.Z({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",(()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()}))):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find((e=>tn.Z.has(e.type)));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new Ft.Z({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",(()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()}))):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!t)}addFiles(e){const t=e.filter((e=>!this.files.find((t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size))));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));let t=this.inputField.value;if(t.length>this.captionLengthMax)return void(0,me.Am)(S.ZP.format("Error.PreviewSender.CaptionTooLong",!0));this.hide();const i=this.willAttach;i.isMedia="media"===i.type||void 0;const{sendFileDetails:s,isMedia:n}=i,{peerId:a,input:o}=this.chat;s.forEach((e=>{e.itemDiv=void 0}));const{length:r}=s,d=this.chat.getMessageSendingParams();this.iterate((e=>{t&&e.length!==r&&(this.managers.appMessagesManager.sendText(a,t,Object.assign(Object.assign({},d),{clearDraft:!0})),t=void 0);const s=Object.assign(Object.assign({},i),{sendFileDetails:e});this.managers.appMessagesManager.sendAlbum(a,s.sendFileDetails.map((e=>e.file)),Object.assign(Object.assign(Object.assign({},d),{caption:t,isMedia:n,clearDraft:!0}),s)),t=void 0})),o.replyToMsgId=this.chat.threadId,o.onMessageSent()}attachMedia(e,t){return rn(this,void 0,void 0,(function*(){t.classList.add("popup-item-media");const i=e.file;let s;if(i.type.startsWith("video/")){const n=(0,nn.Z)(),a=document.createElement("source");a.src=e.objectURL=yield on.Z.invoke("createObjectURL",i),n.autoplay=!0,n.controls=!1,n.muted=!0,n.addEventListener("timeupdate",(()=>{n.pause()}),{once:!0}),s=(0,an.Z)(n).then((()=>rn(this,void 0,void 0,(function*(){e.width=n.videoWidth,e.height=n.videoHeight,e.duration=Math.floor(n.duration);const i=n.webkitAudioDecodedByteCount;void 0!==i&&(e.noSound=!i),t.append(n);const s=yield function(e){return new Promise(((t,i)=>{e.onseeked=()=>{e.onseeked=()=>{Xs(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=i,e.currentTime=Math.min(e.duration,1)}))}(n);e.thumb=Object.assign({url:yield on.Z.invoke("createObjectURL",s.blob)},s)})))),n.append(a)}else{const n=new Image;s=new Promise((s=>{n.onload=()=>{e.width=n.naturalWidth,e.height=n.naturalHeight,t.append(n),"image/gif"===i.type?(e.noSound=!0,Promise.all([sn(n).then((t=>{e.duration=Math.ceil(t)})),Xs(n).then((t=>rn(this,void 0,void 0,(function*(){e.thumb=Object.assign({url:yield on.Z.invoke("createObjectURL",t.blob)},t)}))))]).then((()=>{s()}))):s()}})),n.src=e.objectURL=yield on.Z.invoke("createObjectURL",i)}return s}))}attachDocument(e,t){return rn(this,void 0,void 0,(function*(){t.classList.add("popup-item-document");const i=e.file,s=i.type.startsWith("image/"),n=i.type.startsWith("audio/");(s||n||i.size<2e7)&&(e.objectURL=yield on.Z.invoke("createObjectURL",i));const a={_:"document",file:i,file_name:i.name||"",size:i.size,type:s?"photo":"doc"};let o;e.objectURL&&(o={url:e.objectURL,downloaded:i.size,type:m.Pt});const r=yield(0,Oi.Z)({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:a}},cacheContext:o});return new Promise((i=>{const n=()=>{t.append(r),i()};if(s){const t=new Image;t.src=e.objectURL,t.onload=()=>{e.width=t.naturalWidth,e.height=t.naturalHeight,n()},t.onerror=n}else n()}))}))}shouldCompress(e){return"media"===this.willAttach.type&&tn.Z.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),this.addEventListener("close",(()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)})),this.show())}setTitle(){const{willAttach:e,title:t,files:i}=this;let s;const n=[];if("document"===e.type)s="PreviewSender.SendFile",n.push(i.length);else{let e=0,t=0,a=0;i.forEach((i=>{i.type.startsWith("image/")?++e:i.type.startsWith("video/")?++t:++a})),[e,t,a].filter((e=>e>0)).length>1?(s="PreviewSender.SendFile",n.push(i.length)):e?(s="PreviewSender.SendPhoto",n.push(e)):t&&(s="PreviewSender.SendVideo",n.push(t))}(0,O.Z)(t,(0,S.ag)(s,n))}appendMediaToContainer(e,t){if(this.shouldCompress(t.file.type)){const i=(0,en.Z)(t.width,t.height,380,320);e.style.width=i.width+"px",e.style.height=i.height+"px"}this.mediaContainer.append(e)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach((t=>e([t])));const i=t.length;for(let s=0;s{i.innerHTML="",e.length&&(this.setTitle(),this.iterate((e=>{if(this.shouldCompress(e[0].file.type)&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map((e=>e.itemDiv))),Bi({container:t,items:e.map((e=>({w:e.width,h:e.height}))),maxWidth:380,minWidth:100,spacing:4}),i.append(t)}else e.forEach((e=>{this.appendMediaToContainer(e.itemDiv,e)}))})))})).then((()=>{this.onRender()}))}}var hn=i(6057);const un="keydown",fn="active",pn=["ArrowUp","ArrowDown"],mn=["ArrowLeft","ArrowRight"];function gn({list:e,type:t,onSelect:i,once:s,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?pn.concat(mn):"x"===t?mn:pn);let r;const d=()=>r||e.querySelector(".active")||e.firstElementChild,l=(e,i)=>{if(r===e)return;let s=!1;r&&(s=!0,r.classList.remove(fn)),r=e,r&&(r.classList.add(fn),s&&f&&i&&(0,re.Z)({container:f,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},c=(t,i)=>{let s;return s=i?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,s};let h;h="xy"===t?(t,i)=>"ArrowUp"===i||"ArrowDown"===i?((t,i)=>{const s=i?"nextElementSibling":"previousElementSibling",n=i?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[s]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[s]||e[n]}return o})(t,"ArrowDown"===i):c(t,"ArrowRight"===i):(e,t)=>c(e,"ArrowRight"===t||"ArrowDown"===t);let u=i=>{const s=i.key;if(o.has(s)){if((0,be.Z)(i),e.childElementCount>1){let e=d();e=h(e,s),l(e,!0)}}else("Enter"===s||"xy"!==t&&"Tab"===s)&&((0,be.Z)(i),g(d()))};const f=(0,fe.Z)(e,"scrollable");e.classList.add("navigable-list");const p=t=>{const i=(0,_e.Z)(t.target,e);i&&l(i,!1)},m=t=>{(0,be.Z)(t);const i=(0,_e.Z)(t.target,e);i&&(l(i,!1),g(d()))},g=e=>{return t=this,n=void 0,o=function*(){const t=yield i(e);(void 0!==t?!t:s)&&y()},new((a=void 0)||(a=Promise))((function(e,i){function s(e){try{d(o.next(e))}catch(e){i(e)}}function r(e){try{d(o.throw(e))}catch(e){i(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(t,n||[])).next())}));var t,n,a,o};let v=!1;const b=()=>{v||(v=!0,document.addEventListener(un,u,{capture:!0,passive:!1}),e.addEventListener("mousemove",p,{passive:!0}),(0,w.fc)(e,m))},y=()=>{v&&(v=!1,document.removeEventListener(un,u,{capture:!0}),e.removeEventListener("mousemove",p),(0,w.EN)(e,m))},S=()=>{a||l(e.firstElementChild,!1)};if(a){const e=u;u=t=>{a.has(t.key)&&((0,be.Z)(t),document.removeEventListener(un,u,{capture:!0}),u=e,document.addEventListener(un,u,{capture:!0,passive:!1}),a=void 0,S())}}else S();return b(),{attach:b,detach:y,resetTarget:S}}var vn=i(9818),bn=i(5953);class yn extends l.Z{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:i,resetTarget:s}=gn({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=i,this.resetTarget=s,k.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},vn.Z.pushItem(this.navigationItem)),this.addEventListener("hidden",(()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",i(),this.navigationItem&&(vn.Z.removeItem(this.navigationItem),this.navigationItem=void 0)}),{once:!0})},(0,bn.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("autocomplete-helper","z-depth-1"),e.appendTo.append(this.container),this.attachNavigation(),this.controller&&this.controller.addHelper(this)}toggleListNavigation(e){e?this.attach&&this.attach():this.detach&&this.detach()}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1,i){if(this.init)return;if(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden===e)return void(e||this.dispatchEvent("visible"));this.hidden=e,e?(this.navigationItem&&(vn.Z.removeItem(this.navigationItem),this.navigationItem=void 0),!t&&this.controller&&this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller&&this.controller.hideOtherHelpers(this),this.dispatchEvent("visible"));const s=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),(0,Te.Z)(this.container,"is-visible",!e,d.Z.settings.animationsEnabled&&!i?300:0,(()=>{this.hidden&&this.dispatchEvent("hidden")}),s)}}class wn extends yn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>{return t=this,i=void 0,n=function*(){return!(yield vt.Jo.onMediaClick({target:e},!0))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},waitForKey:["ArrowUp","ArrowDown"]}),this.chat=i,this.managers=s,this.container.classList.add("stickers-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0),d.Z.dispatchEvent("choosing_sticker",!0)})),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0,this.listenerSetter.removeAll(),this.listenerSetter=void 0),d.Z.dispatchEvent("choosing_sticker",!1)}))}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),Is(e),this.managers.appStickersManager.getStickersByEmoticon(e).then((e=>{if(!t())return;this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();let s;this.lazyLoadQueue.clear(),s=e.length?new Promise((t=>{const s=[];e.forEach((e=>{i.append(this.superStickerRenderer.renderSticker(e,void 0,s))})),Promise.all(s).finally(t)})):Promise.resolve(),s.then((()=>{this.list.replaceWith(i),this.list=i,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},o.Z.addEventListener("changeScreen",this.onChangeScreen),this.listenerSetter=new ae.Z,(0,_i.Z)({listenTo:this.container,listenerSetter:this.listenerSetter})),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.ZP(this.container),this.lazyLoadQueue=new ne.Z,this.superStickerRenderer=new hn.vT(this.lazyLoadQueue,this.chat.animationGroup,this.managers)}}var Sn=i(2230),Cn=i(5322);const Ln=()=>{const e=new Date;return e.setHours(0,0,0,0),e},En=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class In extends L{constructor(e,t,i){var s;if(super((s=e).getTime()>En().getTime()?new Date:s,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Ln(),maxDate:En(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0,title:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),i){const e=(0,Re.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),(0,w.fc)(e,(()=>{t(Ie),this.hide()}))}}}var Mn=i(8119),Pn=i(8799),Zn=i(6760),kn=i(6299),Tn=i(6039);class xn extends yn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"x",onSelect:e=>{i.onEmojiSelected((0,Tn.xG)(e),!0)}}),this.managers=s,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new P.v7(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollLeft=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach((e=>{(0,Tn.IA)(e,this.list,!1,!0)}))),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const i=this.controller.getMiddleware();this.managers.appEmojiManager.getBothEmojiKeywords().then((()=>{return s=this,n=void 0,o=function*(){if(!i())return;const s=e.replace(/^:/,""),n=yield this.managers.appEmojiManager.searchEmojis(s);i()&&this.render(n,":"!==t)},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o}))}}class An extends yn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"y",onSelect:s}),this.className=i,this.container.classList.add(An.BASE_CLASS,i)}init(){this.list=document.createElement("div"),this.list.classList.add(An.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new P.ZP(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach((e=>{const t=An.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=An.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const i=document.createElement("div");i.classList.add(t,e.className),i.dataset.peerId=""+e.peerId;const s=new p.Z;s.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),s.updateWithOptions({isDialog:!1,peerId:e.peerId});const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?(0,A.Z)(n,(0,D.Z)(e.name)):n.append(new R.Z({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),i.append(s,n),e.description){const s=document.createElement("div");s.classList.add(t+"-description",e.className+"-description"),(0,A.Z)(s,(0,D.Z)(e.description)),i.append(s)}return i}}An.BASE_CLASS="autocomplete-peer-helper",An.BASE_CLASS_LIST_ELEMENT=An.BASE_CLASS+"-list-element";var _n=i(5082);function Fn(e,t,i){const s=[].concat(t.bot_info);let n;void 0!==i&&(n=new _n.Z({ignoreCase:!0}));const a=new Map;let o;if(s.forEach((t=>{t.commands&&t.commands.forEach((({command:i,description:s},o)=>{const r="/"+i;a.set(i,{peerId:t.user_id?t.user_id.toPeerId(!1):e,command:i,name:r,description:s,index:o}),n&&n.indexObject(i,r)}))})),n){const e=n.search(i);o=Array.from(e).map((e=>a.get(e)))}else o=[...a.values()];return o=o.sort(((e,t)=>a.get(e.command).index-a.get(t.command).index)),o}class Dn extends An{constructor(e,t,i,s){super(e,t,"commands-helper",(e=>{const t=e.querySelector(`.${An.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return i.getReadyToSend((()=>{i.messageInput.innerHTML=t,i.sendMessage(!0)}))})),this.managers=s}checkQuery(e,t){return i=this,s=void 0,a=function*(){if(!(yield this.managers.appUsersManager.isBot(t)))return!1;const i=this.controller.getMiddleware();return this.managers.appProfileManager.getProfileByPeerId(t).then((s=>{if(!i())return;const n=Fn(t,s,e);this.render(n)})),!0},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class Rn{constructor(){this.helpers=new Set,this.middleware=(0,ve.k)()}toggleListNavigation(e){for(const t of this.helpers)t.toggleListNavigation(e)}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach((t=>{t!==e&&t.toggle(!0,!0)})),e||this.middleware.clean()}}var Bn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Nn extends An{constructor(e,t,i,s){super(e,t,"mentions-helper",(e=>{const t=e.dataset.peerId.toUserId();Promise.resolve(s.appUsersManager.getUser(t)).then((e=>{let t,s="";e.username?s="@"+e.username:(s=e.first_name||e.last_name,t={_:"messageEntityMentionName",length:s.length,offset:0,user_id:e.id}),s+=" ",i.insertAtCaret(s,t)}))})),this.managers=s}checkQuery(e,t,i){const s=e.trim();if(e.length!==s.length)return!1;const n=this.controller.getMiddleware();return this.managers.appProfileManager.getMentions(t&&t.toChatId(),s,i).then((e=>Bn(this,void 0,void 0,(function*(){if(!n())return;const t=s.slice(1).toLowerCase(),i=e.map((e=>Bn(this,void 0,void 0,(function*(){const i=yield this.managers.appUsersManager.getUser(e);if(!i.username||i.username.toLowerCase()!==t)return{peerId:e,description:i.username?"@"+i.username:void 0}}))));this.render((yield Promise.all(i)).filter(Boolean))})))),!0}}var On=i(5494),Un=i(6339),Hn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class zn extends Un.Z{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;(0,_e.Z)(t,this.element)||t===this.btnHover||((0,be.Z)(e),this.toggle(!1))},(0,bn.Z)(this,e),this.element.classList.add(zn.BASE_CLASS),this.element.style.display="none",this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(d.Z)("history_reply_markup",(({peerId:e})=>Hn(this,void 0,void 0,(function*(){this.peerId===e&&(this.checkAvailability()&&this.isActive()&&(yield this.render()),(0,de.e9)().then((()=>{this.checkForceReply()})))}))))}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",(()=>Hn(this,void 0,void 0,(function*(){yield this.render(),c.Z&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",(()=>{this.listenerSetter.remove(this.touchListener)}),{once:!0}))})))),(0,w.fc)(this.element,(e=>{const t=(0,fe.Z)(e.target,"btn");if(!t)return;const i=t.dataset.type,{peerId:s}=this;"keyboardButtonRequestPhone"===i?(0,li.Z)({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then((()=>{this.managers.appMessagesManager.sendContact(s,d.Z.myId)})):this.managers.appMessagesManager.sendText(s,t.dataset.text),this.toggle(!1)}),{listenerSetter:this.listenerSetter}),super.init()}checkForceReply(){return Hn(this,void 0,void 0,(function*(){const e=yield this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}))}getReplyMarkup(){var e;return Hn(this,void 0,void 0,(function*(){return null!==(e=(yield this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}))}render(e){return Hn(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup()),this.element.textContent="";for(const t of e.rows){const e=document.createElement("div");e.classList.add(zn.BASE_CLASS+"-row");for(const i of t.buttons){const t=document.createElement("button");t.classList.add(zn.BASE_CLASS+"-button","btn"),(0,A.Z)(t,(0,D.Z)(i.text)),t.dataset.text=i.text,t.dataset.type=i._,e.append(t)}this.element.append(e)}}))}checkAvailability(e){var t;return Hn(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup());const i="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",i),i&&this.toggle(!1),!i}))}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}zn.BASE_CLASS="reply-keyboard";var jn=i(1080),Gn=i(8678),Vn=i(2830),Kn=i(515);const Wn="INLINE-HELPER";class $n extends yn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:i,queryId:s}=this.list.dataset;return this.chat.input.getReadyToSend((()=>{const n=(0,Kn.Z)(s,e.dataset.resultId);this.managers.appInlineBotsManager.sendInlineResult(t.toPeerId(),i,n,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{clearDraft:!0})),this.chat.input.onMessageSent(!0,!0)}))}}),this.chat=i,this.managers=s,this._checkQuery=(e,t,i)=>{return s=this,n=void 0,r=function*(){const s=this.controller.getMiddleware(),n=yield this.managers.appUsersManager.resolveUsername(t);if(!s())throw"PEER_CHANGED";if("user"!==n._)throw"NOT_A_BOT";const a=this.managers.appInlineBotsManager.getInlineResults(e,n.id,i).then((t=>{if(!s())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();i.dataset.peerId=""+e,i.dataset.botId=""+n.id,i.dataset.queryId=""+t.query_id;const a=new jn.Z(null,Wn,this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],d=!!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=d?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),i.append(t),d)t.classList.add("grid-item");else{n.classList.add("empty"),(0,A.Z)(n,(0,D.Z)([...e.title.trim()][0]));const s=document.createElement("div");s.classList.add("inline-helper-result-title"),(0,A.Z)(s,(0,D.Z)(e.title));const a=document.createElement("div");a.classList.add("inline-helper-result-description"),(0,A.Z)(a,(0,ot.ZP)(e.description,{noCommands:!0,noLinks:!0})),t.append(s,a);const o=document.createElement("div");o.classList.add("inline-helper-separator"),i.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let i;n?(i=document.createElement("div"),n.append(i)):i=t,i.classList.add("media-container"),d&&i.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>Ss.Z.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then((e=>{const t=new Image;t.classList.add("media-photo"),(0,Gn.Z)(e).then((e=>{(0,Vn.Z)(i,t,e,!0)}))}))})}}else{const i=e.document||e.photo;if(["sticker","gif"].includes(null==i?void 0:i.type)&&d)(0,Le.Z)(i),"gif"===i.type?a.add(i,t):"sticker"===i.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(i,t,r),i.animated&&this.superStickerRenderer.observeAnimated(t));else if(i){const e=d?48:void 0;d&&t.classList.add("no-border-radius"),(0,G.Z)({photo:i,container:d?t:n,boxWidth:e,boxHeight:e,middleware:s,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then((()=>{if(!s())return void a.clear();i.classList.toggle("is-gallery",d),i.classList.toggle("super-stickers",d),this.container.classList.toggle("is-gallery",d);const r=this.list.parentElement;if(r.textContent="",t.switch_pm){const i=(0,Re.Z)("btn-primary btn-secondary btn-primary-transparent primary");(0,A.Z)(i,(0,D.Z)(t.switch_pm.text)),(0,w.fc)(i,(i=>{this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)})),r.append(i)}r.append(this.list=i),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=a,a.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},o.Z.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0}))}));return{user:n,renderPromise:a}},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function o(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,o)}d((r=r.apply(s,n||[])).next())}));var s,n,a,r},this.container.classList.add("inline-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)})),this.checkQuery=(0,Ee.Z)(this._checkQuery,200,!0,!0),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)}))}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new P.ZP(this.container),this.lazyLoadQueue=new ne.Z,this.superStickerRenderer=new hn.vT(this.lazyLoadQueue,Wn,this.managers)}}var qn=i(8090),Qn=i(3013),Yn=i(5133);class Jn extends An{constructor(e,t,i){super(e,void 0,"bot-commands",(e=>{const i=e.querySelector(`.${An.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return t.getReadyToSend((()=>{t.messageInput.innerHTML=i,t.sendMessage(!0),this.toggle(!0)}))})),this.managers=i}setUserId(e,t){var i;if(this.userId!==e||!(null===(i=this.list)||void 0===i?void 0:i.childElementCount))return this.userId=e,(0,ze.Z)(this.managers.appProfileManager.getProfile(e),(i=>{if(!t())return;const s=Fn(e.toPeerId(!1),i),n=50*s.length+8+24;this.container.style.setProperty("--height",n+"px"),this.render(s)}));this.toggle(!1)}}var Xn=i(8479),ea=(i(1544),i(7197)),ta=i(6241),ia=i(6535),sa=i(2821),na=i(3066);function aa(e){return t=this,i=void 0,n=function*(){return{cached:e.cached,result:e.cached?yield e.result:e.result}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}function oa(e){return e.then(aa)}var ra=i(177),da=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class la{constructor(e,t,i){this.managers=e,this.onReady=t,this.onChange=i,this.middleware=(0,ve.k)(),this.listenerSetter=new ae.Z,this.construct()}construct(){this.container=document.createElement("div"),this.container.classList.add("new-message-send-as-container"),this.closeBtn=document.createElement("div"),this.closeBtn.classList.add("new-message-send-as-close","new-message-send-as-avatar","tgico-close");const e=[{text:"SendMessageAsTitle",onClick:void 0}];let t;const i=e=>{e&&(t=this.avatar);const i=this.avatar!==t,s=!e&&i?2:0;(0,Te.Z)(this.closeBtn,"is-visible",e,300,void 0,s),i||(0,Te.Z)(t,"is-visible",!e,300,void 0,s)};(0,Cn.Z)({noRipple:!0,listenerSetter:this.listenerSetter,container:this.container},"top-right",e,(()=>{i(!0)}),(()=>{i(!1)})),e[0].element.classList.add("btn-menu-item-header"),this.btnMenu=this.container.firstElementChild,this.btnMenu.classList.add("scrollable","scrollable-y"),this.container.append(this.closeBtn)}updateButtons(e){return da(this,void 0,void 0,(function*(){const t=e.map(((e,t)=>da(this,void 0,void 0,(function*(){const i=document.createElement("div"),s=document.createElement("div");return s.classList.add("btn-menu-item-subtitle"),e.isUser()?s.append((0,S.ag)("Chat.SendAs.PersonalAccount")):e===this.peerId?s.append((0,S.ag)("VoiceChat.DiscussionGroup")):s.append(yield(0,ra.Z)(e.toChatId())),i.append(new R.Z({peerId:e}).element,s),{onClick:t?()=>da(this,void 0,void 0,(function*(){const t=this.peerId;this.changeSendAsPeerId(e);const i=this.middleware.get(),s=()=>{if(this.sendAsPeerId!==e||!i())return;const t=this.sendAsPeerIds.slice();(0,h.Z)(t,e),t.unshift(e),this.updateButtons(t)};d.Z.settings.animationsEnabled?setTimeout(s,250):s(),this.managers.appMessagesManager.saveDefaultSendAs(t,e)})):void 0,textElement:i}})))),i=yield Promise.all(t),s=(0,ms.Z)(i);i.forEach(((t,i)=>{const s=e[i],n=new p.Z;n.classList.add("avatar-26","btn-menu-item-icon"),n.updateWithOptions({peerId:s}),i||n.classList.add("active"),t.element.prepend(n)})),Array.from(this.btnMenu.children).slice(1).forEach((e=>e.remove())),this.btnMenu.append(...Array.from(s.children))}))}updateAvatar(e,t){return da(this,void 0,void 0,(function*(){const i=this.avatar;if(i&&i.peerId===e)return;i||(t=!0);const s=t?0:2,n=t?0:300,a=this.avatar=new p.Z;a.classList.add("new-message-send-as-avatar","avatar-30"),yield a.updateWithOptions({isDialog:!1,peerId:e}),(0,Te.Z)(a,"is-visible",!0,n,void 0,s),i&&(0,Te.Z)(i,"is-visible",!1,n,(()=>{i.remove()}),s),this.container.append(a)}))}changeSendAsPeerId(e,t){return this.sendAsPeerId=e,this.onChange(e),this.updateAvatar(e,t)}getDefaultSendAs(){return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((e=>({cached:e.cached,result:e.result.then((e=>e.default_send_as?(0,F.Z)(e.default_send_as):void 0))})))}updateManual(e){return da(this,void 0,void 0,(function*(){const t=this.peerId;if(this.updatingPromise||!(yield this.managers.appPeersManager.isChannel(t)))return;const i=this.middleware.get((()=>!this.updatingPromise||this.updatingPromise===l)),{container:s}=this,n=t.toChatId(),a=(yield oa(this.getDefaultSendAs())).result,o=e;a instanceof Promise&&(e=void 0);const r=o&&!e,l=this.updatingPromise=(0,ze.Z)(a,(t=>da(this,void 0,void 0,(function*(){if(!i()||void 0===t)return;if(yield this.changeSendAsPeerId(t,e),!i())return;this.managers.appChatsManager.getSendAs(n).then((e=>{if(!i())return;const s=e.filter((e=>!e.pFlags.premium_required)).map((e=>e.peer)).map((e=>(0,F.Z)(e)));this.sendAsPeerIds=s.slice(),(0,h.Z)(s,t),s.unshift(t),this.updateButtons(s)}));const a=()=>{this.onReady(s,e),this.addedListener||(this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.update()})),this.addedListener=!0)};if(!r)return a;a()}))));return l.finally((()=>{this.updatingPromise===l&&(this.updatingPromise=void 0)})),r?void 0:l}))}update(e){return this.updateManual(e).then((e=>e&&e()))}setPeerId(e){this.middleware.clean(),this.updatingPromise=void 0,this.peerId=e}destroy(){this.container.remove(),this.setPeerId(),this.listenerSetter.removeAll()}}var ca=i(669),ha=i(6854);const ua=new RegExp(`(${ha.Z})|(
)`,"g");class fa extends C.ZP{constructor(e){super(e),this.input.addEventListener("input",(()=>{this.updateInnerHTML(),this.onFakeInput()})),e.placeholder&&(0,S.$d)(this.inputFake,e.placeholder,void 0,"placeholder"),this.input.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.contentEditable="true",this.inputFake.className=this.input.className+" input-field-input-fake"}onFakeInput(e=!0){const{scrollHeight:t}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===t)return;const s=Math.round(50*Math.log(Math.abs(t-i)));this.input.style.transitionDuration=`${s}ms`,e&&(this.input.style.height=t?t+"px":"");const n="is-changing-height";(0,Te.Z)(this.input,n,!0,s,(()=>{this.input.classList.remove(n)}))}updateInnerHTML(e=this.input.innerHTML){e=e.replace(//,"").replace(/().+?\/custom-emoji-element>/g,"$1"),ca.Y&&(e=e.replace(ua,"")),this.inputFake.innerHTML=e}setValueSilently(e,t){super.setValueSilently(e,t),this.updateInnerHTML(),t||this.onFakeInput()}}var pa=i(9041);function ma(e){const t={};e.forEach((e=>t[e]=!1));const i=window.getSelection();if(!i.isCollapsed){const s=i.getRangeAt(0),n=s.commonAncestorContainer,a=document.createTreeWalker((n.nodeType===n.ELEMENT_NODE?n:n.parentElement).closest('[contenteditable="true"]'),NodeFilter.SHOW_ELEMENT,{acceptNode:e=>s.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let o;for(;o=a.nextNode();)for(const i of e){if(t[i])continue;const e=pa.o[i];o.matches(e.match)&&(t[i]=!0)}}return t}var ga=i(6034),va=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const ba="Posting media content isn't allowed in this group.";class ya{constructor(e,t,i){this.chat=e,this.appImManager=t,this.managers=i,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&(0,be.Z)(e),this.recordCanceled=!0,this.recorder.stop(),Ks.Z.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>va(this,void 0,void 0,(function*(){const{peerId:i}=this.chat,s=this.chat.bubbles.getMiddleware(),n=d.Z.myId!==i&&i.isUser()&&(yield this.managers.appUsersManager.isUserOnlineVisible(i));new In(t,(t=>{s()&&(t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout((()=>{s()&&(y.Z.getPopups(I.Z).forEach((e=>e.hide())),this.appImManager.openScheduled(i))}),0))}),n).show()})),this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,i)=>{(0,be.Z)(e);let s=this.messageInput.innerHTML;if(s&&s!==i){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const i=this.messageInput.innerHTML;if(s===i){if(++e>2)break}else e=0;s=i}while(s!==i);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace",KeyP:"spoiler"};this.appImManager.markupTooltip&&(t.KeyK="link");const i=e.code,s=t[i];if(!ws(document.getSelection())&&s&&("KeyK"===i?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(s),(0,be.Z)(e)),"KeyZ"===i){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:i,entities:s,caretPos:n}=(0,qs.Z)(this.messageInputField.input),a=(0,sa.Z)(i,s,!0),o=(0,ta.Z)(s,(0,ia.Z)(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=(!(null===(t=this.editMessage)||void 0===t?void 0:t.media)||"messageMediaWebPage"===this.editMessage.media._)&&o.filter((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._));if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=i.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=this.managers.appWebPagesManager.getWebPage(t).then((i=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===i._?(this.setTopInfo("webpage",(()=>{}),i.site_name||i.title||"Webpage",i.description||i.url||""),delete this.noWebPage,this.willSendWebPage=i):this.willSendWebPage&&this.onHelperCancel())}))}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(i.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"})),this.botCommands&&this.botCommands.toggle(!0)}else this.lastTimeType&&this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"}),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide(),document.activeElement===this.messageInput&&setTimeout((()=>{document.activeElement===this.messageInput&&this.resetCurrentFontFormatting()}),0);this.botCommands&&this.updateBotCommandsToggle(),this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(i,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{const i=e.docId?{_:"messageEntityCustomEmoji",document_id:e.docId,length:e.emoji.length,offset:0}:(0,ea.Z)(e.emoji);this.insertAtCaret(e.emoji,i,t)},this.onBtnSendClick=e=>va(this,void 0,void 0,(function*(){if((0,be.Z)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{const e=this.chat.peerId.isAnyChat();if(e&&!(yield this.chat.canSend("send_media")))return void(0,me.Am)(ba);this.chatInput.classList.add("is-locked"),(0,Pn.Z)();let t=!1;if(!e){const e=yield this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());(null==e?void 0:e.pFlags.voice_messages_forbidden)&&((0,me.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Bt.Z)({peerId:this.chat.peerId})]}),t=!0)}if(t)return void this.chatInput.classList.remove("is-locked");this.recorder.start().then((()=>{this.releaseMediaPlayback=Qn.Z.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),Ks.Z.setKeepAlive(!0);const e=()=>{new vs.Z("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{(0,w.tH)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",(t=>{(0,fe.Z)(t.target,"chat-input")||(0,fe.Z)(t.target,"popup-cancel-record")||((0,be.Z)(t),e())}),{capture:!0,passive:!1}),vn.Z.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout((()=>{e()}),0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,i=t.context.createAnalyser();t.connect(i),i.fftSize=32;const s=new Uint8Array(i.frequencyBinCount),n=255*s.length,a=()=>{if(!this.recording)return;i.getByteFrequencyData(s);let e=0;s.forEach((t=>{e+=t}));const t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;const o=Date.now()-this.recordStartTime,r=o%1e3,d=(0,Gi.Z)(o/1e3)+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=d,(0,le.T2)(a)};a()})).catch((e=>{switch(e.name){case"NotAllowedError":(0,me.Am)("Please allow access to your microphone");break;case"NotReadableError":(0,me.Am)(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),(0,me.Am)(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")}))}})),this.onHelperCancel=(e,t)=>va(this,void 0,void 0,(function*(){if(e&&(0,be.Z)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(yield 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=this.getCurrentInputAsDraft();if(t&&delete t.pFlags.no_webpage,!(0,ga.Z)(t,Object.assign(Object.assign({},e),{_:"draftMessage"})))return void new vs.Z("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()})),this.onHelperClick=e=>{if((0,be.Z)(e),(0,fe.Z)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&c.Z&&!e.container.classList.contains("active")&&mt.Z.openBtnMenu(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new ae.Z}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input","hide"),this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapperWrapper=document.createElement("div"),this.rowsWrapperWrapper.classList.add("rows-wrapper-wrapper"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper"),this.rowsWrapperWrapper.append(this.rowsWrapper);const e=ps();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const i=this.fakeSelectionWrapper=document.createElement("div");i.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,i),this.chatInput.append(this.inputContainer),this.goDownBtn=(0,Mn.Z)({icon:"arrow_down",className:"bubbles-corner-button chat-secondary-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),(0,w.fc)(this.goDownBtn,(e=>{(0,be.Z)(e),this.chat.bubbles.onGoDownClick()}),{listenerSetter:this.listenerSetter});const s=this.controlContainer=document.createElement("div");s.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(s)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=(0,Sn.Z)(""),this.replyElements.cancelBtn=(0,Sn.Z)("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(s=!0,this.canToggleHideAuthor()),t=()=>{s=!1},i=this.forwardElements={};let s=!1;const n=[i.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new Ft.Z({checked:!0})},i.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new Ft.Z({checked:!1})},i.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new Ft.Z({checked:!0})},i.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new Ft.Z({checked:!1})},i.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],a=i.container=(0,ms.Z)(n,this.listenerSetter),o=Array.from(a.children);if([{elements:o.slice(0,2),onChange:(e,t)=>{const n=!!+e;s&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=S.ZP.weakMap.get(e),s=i.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=s,t.update()}}},{elements:o.slice(2,4),onChange:e=>{const t=!!+e;let s;s=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?i.hideSender:i.showSender:t?i.showSender:i.hideSender,s.checkboxField.checked=!0}}].forEach((e=>{const t=(0,Yn.Z)(e.elements.map((e=>({container:e,input:e.querySelector("input")}))),e.onChange),i=document.createElement("hr");t.append(i),a.append(t)})),a.append(i.changePeer.element),c.Z||(this.forwardHover=new Un.Z({element:a})),i.modifyArgs=n.slice(0,-1),this.replyElements.container.append(a),i.modifyArgs.forEach(((e,t)=>{const{input:i}=e.checkboxField;i.type="radio",i.name=t<2?"author":"caption",i.value=""+ +!(t%2)})),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.btnToggleEmoticons=(0,Sn.Z)("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=(0,Mn.Z)({icon:"mention",className:"bubbles-corner-button chat-secondary-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),(0,w.fc)(this.goMentionBtn,(e=>{(0,be.Z)(e);const t=this.chat.bubbles.getMiddleware();this.managers.appMessagesManager.goToNextMention(this.chat.peerId).then((e=>{t()&&e&&this.chat.setMessageId(e)}))}),{listenerSetter:this.listenerSetter}),this.btnScheduled=(0,Sn.Z)("scheduled btn-scheduled float hide",{noRipple:!0}),(0,w.fc)(this.btnScheduled,(e=>{this.appImManager.openScheduled(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("scheduled_new",(({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e})=>{this.chat.peerId===e&&this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((e=>{this.btnScheduled.classList.toggle("hide",!e.length)}))})),this.btnToggleReplyMarkup=(0,Sn.Z)("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new zn({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,managers:this.managers,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",(()=>this.btnToggleReplyMarkup.classList.add("active"))),this.listenerSetter.add(this.replyKeyboard)("close",(()=>this.btnToggleReplyMarkup.classList.remove("active"))),this.botCommands=new Jn(this.rowsWrapper,this,this.managers),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const e=document.createElement("div");e.classList.add("new-message-bot-commands-icon-scale");const t=this.botCommandsIcon=document.createElement("div");t.classList.add("animated-menu-icon","animated-menu-close-icon"),e.append(t),this.botCommandsToggle.append(e),(0,w.fc)(this.botCommandsToggle,(e=>{(0,be.Z)(e),t.classList.contains("state-back")?(this.botCommands.toggle(!0),t.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),t.classList.add("state-back"))}),{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",(()=>{t.classList.add("state-back")})),this.botCommands.addEventListener("hiding",(()=>{t.classList.remove("state-back")}))}this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...tn.Z].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"poll",text:"Poll",onClick:()=>{y.Z.createPopup(Ys,this.chat).show()},verify:e=>e.isAnyChat()&&this.chat.canSend("send_polls")}],this.attachMenu=(0,Cn.Z)({noRipple:!0,listenerSetter:this.listenerSetter},"top-left",this.attachMenuButtons),this.attachMenu.classList.add("attach-file","tgico-attach"),this.attachMenu.classList.remove("tgico-more"),this.recordTimeEl=document.createElement("div"),this.recordTimeEl.classList.add("record-time"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.multiple=!0,this.fileInput.style.display="none",this.newMessageWrapper.append(...[this.botCommandsToggle,this.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new Rn,this.stickersHelper=new wn(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.emojiHelper=new xn(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.commandsHelper=new Dn(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.mentionsHelper=new Nn(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.inlineHelper=new $n(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=(0,Sn.Z)("binfilled btn-circle btn-record-cancel chat-secondary-button"),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=(0,Sn.Z)("none btn-circle 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 Ws({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),vt.ZP.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(vt.ZP)("open",this.onEmoticonsOpen),this.listenerSetter.add(vt.ZP)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(d.Z)("settings_updated",(()=>{var e;(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),null===(e=this.messageInputField)||void 0===e||e.onFakeInput()})),this.listenerSetter.add(d.Z)("draft_updated",(({peerId:e,threadId:t,draft:i,force:s})=>{this.chat.threadId===t&&this.chat.peerId===e&&this.setDraft(i,!0,s)})),this.listenerSetter.add(this.appImManager)("peer_changing",(e=>{this.chat===e&&this.saveDraft()})),this.listenerSetter.add(this.appImManager)("chat_changing",(({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)})),"scheduled"===this.chat.type?this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e,mids:t})=>{this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()})):(this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{this.chat.peerId===e&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{e.has(this.chat.peerId)&&(this.startParam===m.gZ?this.setStartParam():this.center(!0))})));try{this.recorder=new(Vs())({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=>{const t=e.target.files;t.length&&(y.Z.createPopup(cn,this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")}),!1),(0,w.fc)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&((0,w.fc)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.setRecording(!1),this.chatInput.classList.remove("is-locked"),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(vn.Z.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:i}=this.chat,s=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});Ks.Z.decode(e,!0).then((e=>{Ks.Z.setKeepAlive(!1),this.managers.appMessagesManager.sendFile(t,a,{isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:s,threadId:i,clearDraft:!0}),this.onMessageSent(!1,!0)}))}),(0,w.fc)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),(0,w.fc)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=(0,Ee.Z)((()=>this.saveDraft()),2500,!1,!0),this.botStartBtn=(0,Re.Z)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append((0,S.ag)("BotStart")),(0,w.fc)(this.botStartBtn,(()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=(0,At.Z)([this.botStartBtn],!0),i=this.chat.peerId,s=this.chat.bubbles.getMiddleware((()=>this.chat.peerId===i&&this.startParam===e&&this.toggleBotStartBtnDisability===t));this.managers.appMessagesManager.startBot(i.toUserId(),void 0,e).then((()=>{s()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())}))}),{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn)}constructPinnedHelpers(){this.pinnedControlBtn=(0,Re.Z)("btn-primary btn-transparent text-bold chat-input-control-button",{icon:"unpin"}),this.controlContainer.append(this.pinnedControlBtn),this.listenerSetter.add(this.pinnedControlBtn)("click",(()=>{const e=this.chat.peerId;new bs(e,0,!0,(()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}))})),this.chatInput.classList.add("type-pinned")}_center(e,t){if(!e&&!this.inputContainer.classList.contains("is-centering"))return;if(e===this.fakeWrapperTo)return;const i=e||this.fakeWrapperTo,s=!!e,n=this.fakeWrapperTo;let a,o="",r="";const d=i.getBoundingClientRect(),l=this.fakeRowsWrapper.getBoundingClientRect(),c=l.width,h=d.width;if(c!==h){const e=h/c,t=(c-h)/2;if(a=d.left-l.left-t,s&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=16;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=e;const u=t?200:0;return(0,Te.Z)(this.inputContainer,"is-centering",s,u),(0,Te.Z)(this.rowsWrapperWrapper,"is-centering-to-control",!!(s&&e&&e.classList.contains("chat-input-control")),u),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(e&&e.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:c,widthTo:h}}center(e=!1){return va(this,void 0,void 0,(function*(){return this._center(yield this.getNeededFakeContainer(),e)}))}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}getNeededFakeContainer(e=this.startParam){return va(this,void 0,void 0,(function*(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==e||!(yield this.chat.canSend())||"pinned"===this.chat.type||(yield this.chat.isStartButtonNeeded())?this.controlContainer:void 0}))}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){return va(this,void 0,void 0,(function*(){if(!this.goDownUnreadBadge)return;const e=yield this.managers.appMessagesManager.getDialogOnly(this.chat.peerId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",yield this.managers.appNotificationsManager.isPeerLocalMuted(this.chat.peerId,!0)),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!(!(null==e?void 0:e.unread_mentions_count)||!e.unread_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}))}getCurrentInputAsDraft(){const{value:e,entities:t}=(0,qs.Z)(this.messageInputField.input,!0,!1);let i;return(e.length||this.replyToMsgId)&&(i={_:"draftMessage",date:(0,_t.Z)(!0),message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),i}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const e=this.getCurrentInputAsDraft();this.managers.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,e)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.classList.add("hide"),this.goDownBtn.classList.add("hide")),(0,Zn.Z)(),this.lastTimeType=0,this.startParam=void 0,this.toggleBotStartBtnDisability&&(this.toggleBotStartBtnDisability(),this.toggleBotStartBtnDisability=void 0),this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,i=!1){return va(this,void 0,void 0,(function*(){if(!i&&!(0,$s.Z)(this.messageInput)||"scheduled"===this.chat.type)return!1;if(!e&&!(e=yield this.managers.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId)))return i&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then((()=>{(0,le.T2)((()=>{this.onMessageSent()}))}))),!1;const s=function(e,t,i){const s=(0,ia.Z)(e.message),n=e.entities||[],a=(0,ta.Z)(n.slice(),s);return(0,na.Z)(e.message,{entities:a,wrappingForPeerId:t,loadPromises:void 0})}(e,this.chat.peerId),n=this.getCurrentInputAsDraft();return!((0,ga.Z)(e,n)&&this.replyToMsgId===e.reply_to_msg_id||(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(s,t,t),0))}))}createSendAs(){if(this.sendAsPeerId=void 0,"chat"===this.chat.type||"discussion"===this.chat.type){let e=!0;this.sendAs=new la(this.managers,((e,t)=>{let i=0;e.parentElement||(this.newMessageWrapper.prepend(e),i=2),this.updateOffset("as",!0,t,i)}),(t=>{this.sendAsPeerId=t,e?e=!1:this.getPlaceholderKey().then((e=>{this.updateMessageInputPlaceholder(e)}))}))}else this.sendAs=void 0;return this.sendAs}finishPeerChange(e){return va(this,void 0,void 0,(function*(){const t=this.chat.peerId,{forwardElements:i,btnScheduled:s,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,botCommandsToggle:d}=this,l=this.sendAs,c=this.createSendAs(),[h,u,f,p,m,g,v,b,y]=yield Promise.all([this.managers.appPeersManager.isBroadcast(t),this.managers.appPeersManager.canPinMessage(t),this.managers.appPeersManager.isBot(t),this.chat.canSend(),this.getNeededFakeContainer(e),oa(this.managers.acknowledged.appProfileManager.getProfileByPeerId(t)),s?oa(this.managers.acknowledged.appMessagesManager.getScheduledMessages(t)):void 0,c?(c.setPeerId(this.chat.peerId),c.updateManual(!0)):void 0,this.filterAttachMenuButtons()]),w=this.messageInput?yield this.getPlaceholderKey():void 0;return()=>{var c;if(r.classList.remove("hide"),o.classList.toggle("is-broadcast",h),o.classList.remove("hide"),null===(c=this.messageInputField)||void 0===c||c.onFakeInput(),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",u),i&&(this.forwardWasDroppingAuthor=!1,i.showCaption.checkboxField.setValueSilently(!0),i.showSender.checkboxField.setValueSilently(!0)),s&&v){s.classList.add("hide");const e=this.chat.bubbles.getMiddleware();(0,ze.Z)(v.result,(t=>{e()&&t&&s.classList.toggle("hide",!t.length)}))}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),d&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),d.remove(),f)){const e=this.chat.bubbles.getMiddleware(),t=g.result;(0,ze.Z)(t,(i=>{e()&&this.updateBotCommands(i,!(t instanceof Promise))}))}l&&l.destroy(),b&&b(),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput?(this.updateMessageInput(p,w,y),this.messageInput.dataset.peerId=""+t):this.pinnedControlBtn&&this.pinnedControlBtn.append((0,S.ag)(u?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow")),this.startParam=e,this._center(m,!1)}}))}updateOffset(e,t,i,s){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,(0,Te.Z)(this.newMessageWrapper,"has-offset",t,i?0:300,void 0,s)}updateBotCommands(e,t){var i,s;this.hasBotCommands=!!(null===(s=null===(i=e.bot_info)||void 0===i?void 0:i.commands)||void 0===s?void 0:s.length),this.updateBotCommandsToggle(t)}updateBotCommandsToggle(e){const{botCommandsToggle:t,hasBotCommands:i}=this,s=!!i&&this.isInputEmpty();if(!i){if(!t.parentElement)return;t.remove()}const n=s,a=t.parentElement?0:2;t.parentElement||this.newMessageWrapper.prepend(t),this.updateOffset("commands",n,e,a)}getPlaceholderKey(){return va(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=this.chat;let i;return i=t?"Comment":(yield this.managers.appPeersManager.isBroadcast(e))?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==d.Z.myId||(yield this.managers.appMessagesManager.isAnonymousSending(e))?"SendAnonymously":"Message",i}))}updateMessageInputPlaceholder(e){const t=S.ZP.weakMap.get(this.messageInput);t&&t.compareAndUpdate({key:e})}filterAttachMenuButtons(){if(!this.attachMenuButtons)return;const{peerId:e,threadId:t}=this.chat;return(0,Os.Z)(this.attachMenuButtons,(i=>i.verify(e,t)))}updateMessageInput(e,t,i){const{chatInput:s,attachMenu:n,messageInput:a}=this,{peerId:o,threadId:r}=this.chat;s.classList.contains("is-hidden")!==!e&&(s.classList.add("no-transition"),s.classList.toggle("is-hidden",!e),s.offsetLeft,s.classList.remove("no-transition")),this.updateMessageInputPlaceholder(t),this.attachMenuButtons&&this.attachMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!i.includes(e))})),e?(a.contentEditable="true",this.setDraft(void 0,!1),a.innerHTML||this.messageInputField.onFakeInput()):a.contentEditable="inherit",n&&(n.toggleAttribute("disabled",!i.length),n.classList.toggle("btn-disabled",!i.length)),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new fa({placeholder:"Message",name:"message",withLinebreaks:!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(),qn.T&&(0,qn.Z)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",(e=>{const t=e.key;if((0,kn.Z)(e))(0,be.Z)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else(0,Tt.Z)(this.messageInput)})),c.Z&&(0,w.fc)(this.messageInput,(e=>{if(vt.ZP.isActive())return vt.ZP.toggle(!1),(0,Pn.Z)(),void(0,be.Z)(e);this.appImManager.selectTab(1)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",(()=>{this.checkAutocomplete()})),"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.listenerSetter.add(this.messageInput)("focusin",(()=>{this.chat.bubbles.scrollable.loadedAll.bottom&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)}))}applyMarkdown(e,t){const i={link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null)},s=e=>{i[e]=()=>{const t=(n.includes(e)?n:[e]).filter((e=>l[e]));return(0,h.Z)(t,e)||t.push(e),t.length?document.execCommand("fontName",!1,"markup-"+t.join("-")):this.resetCurrentFontFormatting()}},n=["bold","italic","underline","strikethrough","spoiler"];if(n.forEach((e=>{s(e)})),s("monospace"),!i[e])return!1;const a=i[e],o=[],r=ca.Z.getInstance().prepareApplyingMarkdown(),d=this.listenerSetter.add(this.messageInput)("input",be.Z,{capture:!0,passive:!1});o.push(document.execCommand("styleWithCSS",!1,"true"));const l=ma(Object.keys(i));return l.monospace&&"link"===e&&o.push(this.resetCurrentFormatting()),o.push("function"==typeof a?a():document.execCommand(a,!1,null)),o.push(document.execCommand("styleWithCSS",!1,"false")),r(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),this.listenerSetter.remove(d),this.messageInputField.simulateInputEvent(),!0}resetCurrentFormatting(){return document.execCommand("removeFormat",!1,null)}resetCurrentFontFormatting(){return document.execCommand("fontName",!1,"Roboto")}insertAtCaret(e,t,i=!0){ca.Z.getInstance().makeFocused(this.messageInput);const{value:s,caretPos:n,entities:a}=(0,qs.Z)(this.messageInput),o=n>=0?n:s.length,r=s.substr(0,o),d=(s.substr(o),i?r.match(ya.AUTO_COMPLETE_REG_EXP):null),l=d?d.index+(d[0].length-d[2].length):r.length;if(r.slice(0,l),i&&-1!==n){const e=d[2],t=document.getSelection();let i=0;for(;t.toString()!==e;){if(++i>=1e4)throw new Error("lolwhat");t.modify("extend","backward","character")}}(0,C.rf)(this.messageInput,e,t?[t]:void 0,this.chat.peerId)}checkAutocomplete(e,t,i){return va(this,void 0,void 0,(function*(){if(void 0===e){const s=(0,qs.Z)(this.messageInputField.input,!0,!0);e=s.value,t=s.caretPos,i=s.entities}if(-1===t&&(t=e.length),void 0===i){const t=(0,sa.Z)(e,i,!0);i=(0,ta.Z)(i,(0,ia.Z)(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const s=e.match(ya.AUTO_COMPLETE_REG_EXP);let n;if(s){const t=i[0];let a=s[2];const o=a[0];if(this.stickersHelper&&d.Z.settings.stickers.suggest&&(yield 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("@"===o){const e=this.chat.threadId?(0,ct.Z)(this.chat.threadId):void 0;(yield this.mentionsHelper.checkQuery(a,this.chat.peerId.isUser()?m.NM:this.chat.peerId,e))&&(n=this.mentionsHelper)}else s[1]||"/"!==o?d.Z.settings.emoji.suggest&&(a=a.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!a||(n=this.emojiHelper,this.emojiHelper.checkQuery(a,o))):(yield this.commandsHelper.checkQuery(a,this.chat.peerId))&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}))}checkInlineAutocomplete(e,t){let i=!1;if(!t){const s=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(s){const n=s[1],a=e.slice(s[0].length);i=s[0].length===e.length,t=this.inlineHelper,this.btnPreloader?(0,Te.Z)(this.btnPreloader,"show",!0,400):(this.btnPreloader=(0,Sn.Z)("none btn-preloader float show disable-hover",{noRipple:!0}),(0,Dt.y)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,n,a).then((({user:e,renderPromise:t})=>{i&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then((()=>{(0,Te.Z)(this.btnPreloader,"show",!1,400)}))})).catch(Ke.Z)}}return i||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&(0,Te.Z)(this.btnPreloader,"show",!1,400),t}setRecording(e){this.recording!==e&&((0,Te.Z)(this.chatInput,"is-recording",e,200),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=(0,Xn.Z)(this.forwarding),t=this.helperFunc;this.clearHelper(),this.updateSendBtn();let i=!1;new E.Z(e,(()=>{i=!0})).addEventListener("close",(()=>{this.helperWaitingForward=!1,i||t()}))}clearInput(e=!0,t=!0,i=""){return va(this,void 0,void 0,(function*(){if(document.activeElement===this.messageInput&&k.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),(0,On.Z)(e),this.messageInputField.setValueSilently(i),(0,On.Z)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(i);c.Z||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let s=!1;e&&(s=yield this.setDraft(void 0,!1)),!s&&t&&this.onMessageInput()}))}isInputEmpty(){return(0,$s.Z)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach((t=>{this.btnSend.classList.toggle(t,e===t)})),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t)}getValueAndEntities(e){const{entities:t,value:i}=(0,qs.Z)(this.messageInput,!0,!1),s=(0,ia.Z)(i);return{value:i,totalEntities:(0,ta.Z)(t,s)}}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const{totalEntities:i}=this.getValueAndEntities(this.messageInput);let s=0;i.filter((e=>{if("messageEntityEmoji"===e._||"messageEntityCustomEmoji"===e._){const t=e.offset+e.length;return!(t<=s||(s=t,0))}return!1})).forEach((e=>{const t="messageEntityEmoji"===e._?{emoji:(0,Ls.zu)(e.unicode)}:{docId:e.document_id,emoji:""};this.managers.appEmojiManager.pushRecentEmoji(t)})),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:i}=this;if("scheduled"===i.type&&!e&&!t)return void this.scheduleSending();const{peerId:s}=i,{noWebPage:n}=this,a=this.chat.getMessageSendingParams(),{value:o,entities:r}=(0,qs.Z)(this.messageInputField.input,!0,!1);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new gs.Z(s,[t],i.type);this.managers.appMessagesManager.editMessage(e,o,{entities:r,noWebPage:n}),this.onMessageSent()}else o.trim()&&(this.managers.appMessagesManager.sendText(s,o,Object.assign(Object.assign({entities:r},a),{noWebPage:n,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,clearDraft:!0})),"scheduled"===this.chat.type?this.onMessageSent(!0):this.onMessageSent(!1,!1));if(this.forwarding){const e=(0,Xn.Z)(this.forwarding);for(const t in e)this.managers.appMessagesManager.forwardMessages(s,t.toPeerId(),e[t],Object.assign(Object.assign({},a),{dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()})).catch((e=>va(this,void 0,void 0,(function*(){"VOICE_MESSAGES_FORBIDDEN"===e.type&&(0,me.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Bt.Z)({peerId:s})]})}))));o||this.onMessageSent()}}sendMessageWithDocument(e,t=!1,i=!1,s=!1){return va(this,void 0,void 0,(function*(){const n="sticker"===(e=yield this.managers.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!(yield this.chat.canSend(n))?((0,me.Am)(ba),!1):"scheduled"!==this.chat.type||t?!(!e||e.sticker&&(0,Ai.Z)(e)&&!d.Z.premium||(this.managers.appMessagesManager.sendFile(this.chat.peerId,e,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{isMedia:!0,clearDraft:i||void 0,silent:s})),this.onMessageSent(i,!0),"sticker"===e.type&&this.managers.appStickersManager.saveRecentSticker(e.id),0)):(this.scheduleSending((()=>this.sendMessageWithDocument(e,!0,i,s))),!1)}))}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||(0,pe.Z)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){return va(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);let i=(0,na.Z)(t.message,{entities:t.totalEntities,wrappingForPeerId:this.chat.peerId});const s=()=>va(this,void 0,void 0,(function*(){const n=yield(0,j.Z)(t,void 0,[t.mid]);this.setTopInfo("edit",s,(0,S.ag)("AccDescrEditing"),n,i,t),this.editMsgId=e,this.editMessage=t,i=void 0}));s()}))}initMessagesForward(e){const t=()=>va(this,void 0,void 0,(function*(){const i=Object.keys(e).map((e=>e.toPeerId())),s=new Set;let n=0,a=0;const o=i.map((t=>va(this,void 0,void 0,(function*(){const i=e[t],o=i.map((e=>va(this,void 0,void 0,(function*(){var i;const n=yield this.managers.appMessagesManager.getMessageByPeer(t,e);!(null===(i=n.fwd_from)||void 0===i?void 0:i.from_name)||n.fromId||n.fwdFromId?s.add("P"+n.fromId):s.add("N"+n.fwd_from.from_name),n.media&&n.message&&++a}))));yield Promise.all(o),n+=i.length}))));yield Promise.all(o);const r=s.size>2,l=[...s].map((e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===d.Z.myId?(0,S.ag)("Chat.Accessory.Forward.You"):new R.Z({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e})),{forwardElements:c}=this;(0,pe.Z)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!a);const h=c.hideCaption.checkboxField.checked;a&&h?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const u=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",f=(0,S.ag)(u,[n]),p=document.createDocumentFragment();let m,g;if(l.length<3?p.append(...(0,S.v_)(l,!1)):p.append(l[0],(0,S.ag)("AndOther",[l.length-1])),1===i.length){const t=i[0],s=e[t];if(m=yield this.managers.appMessagesManager.getMessageByPeer(t,s[0]),g=!!m.grouped_id,g){const e=yield this.managers.appMessagesManager.getMidsByMessage(m);(e.length!==n||e.find((e=>!s.includes(e))))&&(g=!1)}}const v=document.createDocumentFragment();if(g||1===n){const t=e[i[0]],s=yield(0,j.Z)(m,void 0,t);v.append(p,": ",s)}else v.append((0,S.ag)("Chat.Accessory.Forward.From"),": ",p);const b=this.setTopInfo("forward",t,f,v);c.modifyArgs.forEach(((e,t)=>{const s=e.textElement,n=S.ZP.weakMap.get(s);n.args=[t<2?i.length:a],n.update()})),this.forwardHover&&this.forwardHover.attachButtonListener(b,this.listenerSetter),this.forwarding=e}));t()}initMessageReply(e){return va(this,void 0,void 0,(function*(){if(this.replyToMsgId===e)return;let t=yield this.chat.getMessage(e);const i=()=>{let s;t?s=new R.Z({peerId:t.fromId,dialog:!1}).element:(s=(0,S.ag)("Loading"),this.managers.appMessagesManager.reloadMessages(this.chat.peerId,e).then((s=>{this.replyToMsgId===e&&(t=s,t?i():this.clearHelper("reply"))}))),this.setTopInfo("reply",i,s,t&&t.message,void 0,t),this.replyToMsgId=e};i()}))}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.replyToMsgId=void 0,this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(vn.Z.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){const e="is-toggling-helper";(0,Te.Z)(this.chat.container,e,!0,150,(()=>{this.chat.container.classList.remove(e)}))}setInputValue(e,t=!0,i=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),(0,le.T2)((()=>{i&&(0,Tt.Z)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight}))}setTopInfo(e,t,i="",s="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,d=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=(0,Sn.Z)(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const{container:l}=Y(i,s,this.chat.animationGroup,a);return d?r.replaceWith(l):o.insertBefore(l,o.lastElementChild),"webpage"===e&&(l.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),k.IS_MOBILE||vn.Z.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout((()=>{this.updateSendBtn()}),0),l}}ya.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;var wa=i(6054);const Sa="pinned-container";class Ca{constructor(e){this.floating=!1,(0,bn.Z)(this,e);const{divAndCaption:t,className:i}=this;t.container.classList.add(Sa,"hide"),t.title.classList.add(Sa+"-title"),t.subtitle.classList.add(Sa+"-subtitle"),t.content.classList.add(Sa+"-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add(Sa+"-close",`pinned-${i}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add(Sa+"-wrapper"),(0,T.Z)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add(Sa+"-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){(0,w.fc)(e,(e=>{(0,be.Z)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then((e=>{e&&this.toggle(!0)}))}),{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const i=(this.floating||o.Z.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",i),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",i),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}isVisible(){return!this.divAndCaption.container.classList.contains("hide")}isFloating(){return this.divAndCaption.container.classList.contains("is-floating")}fill(e,t,i){this.divAndCaption.container.dataset.peerId=""+i.peerId,this.divAndCaption.container.dataset.mid=""+i.mid,this.divAndCaption.fill(e,t,i),this.topbar.setUtilsWidth()}}var La,Ea=i(7207),Ia=i(8427);class Ma extends Ca{constructor(e,t,i){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new z("pinned-audio",((e,t)=>{(0,O.Z)(this.divAndCaption.title,e),(0,O.Z)(this.divAndCaption.subtitle,t)})),onClose:()=>{Qn.Z.stop()},floating:!0}),this.topbar=e,this.chat=t,this.managers=i,this.onPlaybackParams=e=>{this.fasterEl.classList.toggle("active",e.playbackRate>1),this.repeatEl.classList.remove("tgico-audio_repeat","tgico-audio_repeat_single"),this.repeatEl.classList.add(e.loop?"tgico-audio_repeat_single":"tgico-audio_repeat"),this.repeatEl.classList.toggle("active",e.loop||e.round)},this.onPause=()=>{this.toggleEl.classList.remove("flip-icon")},this.onStop=()=>{this.toggle(!0)},this.onMediaPlay=({doc:e,message:t,media:i,playbackParams:s})=>{var n,a;let o,r;const d="voice"!==e.type&&"round"!==e.type;if(d){const t=e.attributes.find((e=>"documentAttributeAudio"===e._));o=(0,D.Z)(null!==(a=null==t?void 0:t.title)&&void 0!==a?a:e.file_name),r=(null==t?void 0:t.performer)?(0,D.Z)(t.performer):(0,S.ag)("AudioUnknownArtist")}else o=new R.Z({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,r=(0,x.OD)(t.date);this.fasterEl.classList.toggle("hide",d),this.repeatEl.classList.toggle("hide",!d),this.onPlaybackParams(s),this.volumeSelector.setVolume(),this.progressLine.setMedia(i),this.fill(o,r,t),this.toggleEl.classList.toggle("flip-icon",!i.paused),this.toggle(!1)},this.divAndCaption.border.remove();const s=(0,Sn.Z)("fast_rewind active",{noRipple:!0}),n=(0,Sn.Z)("fast_forward active",{noRipple:!0}),a=(e,t)=>{(0,w.fc)(e,(e=>{(0,be.Z)(e),t()}),{listenerSetter:this.topbar.listenerSetter})};a(s,(()=>{Qn.Z.previous()})),a(n,(()=>{Qn.Z.next()})),this.toggleEl=(0,Sn.Z)("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),a(this.toggleEl,(()=>{Qn.Z.toggle()})),this.wrapper.prepend(this.wrapper.firstElementChild,s,this.toggleEl,n),this.volumeSelector=new Ia.Z(this.listenerSetter,!0);const o=document.createElement("div");o.classList.add("progress-line-container"),o.append(this.volumeSelector.container);const r=document.createElement("div");r.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(r),this.volumeSelector.btn.append(o),this.repeatEl=(0,Sn.Z)("audio_repeat",{noRipple:!0}),a(this.repeatEl,(()=>{const e=Qn.Z.getPlaybackParams();e.round?e.loop?(Qn.Z.round=!1,Qn.Z.loop=!1):Qn.Z.loop=!Qn.Z.loop:Qn.Z.round=!0}));const d=this.fasterEl=(0,Sn.Z)("playback_2x",{noRipple:!0});a(d,(()=>{Qn.Z.playbackRate=d.classList.contains("active")?1:1.75})),this.wrapperUtils.prepend(this.volumeSelector.btn,d,this.repeatEl);const l=document.createElement("div");l.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new Ea.Z(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),l.append(this.progressLine.container),this.wrapper.insertBefore(l,this.wrapperUtils),this.topbar.listenerSetter.add(Qn.Z)("play",this.onMediaPlay),this.topbar.listenerSetter.add(Qn.Z)("pause",this.onPause),this.topbar.listenerSetter.add(Qn.Z)("stop",this.onStop),this.topbar.listenerSetter.add(Qn.Z)("playbackParams",this.onPlaybackParams);const c=Qn.Z.getPlayingDetails();c&&(this.onMediaPlay(c),this.onPlaybackParams(c.playbackParams))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}!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"}(La||(La={}));const Pa="pinned-message-border";class Za{constructor(){this.drawRect=(e,t,i,s,n)=>`M${e},${t+n}a${n},${n},0,0,1,${i},0v${s-2*n}a${n},${n},0,0,1,${-i},0Z`,this.getClipPath=(e,t,i)=>{let s="";if(2===i)s=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let i;return e<=1?i=La.ONE:2===e?i=La.TWO:3===e?i=La.THREE:4===e?i=La.FOUR:e>3&&(i=La.MORE),i},this.getMarkHeight=(e,t)=>{let i;return e<=1?i=La.ONE:2===e?i=La.TWO:3===e?i=La.THREE:4===e?i=La.FOUR:e>3&&(i=La.MORE),i},this.getMarkTranslateY=(e,t,i)=>1===i?0:2===i?e?t+1:0:3===i?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,i,s)=>t<=4||e<=1?0:e>=t-2?s-La.ONE-i:(e-2)*i+1*e,this.getTrackHeight=(e,t)=>e<=3?La.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add(Pa),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className=Pa+"-wrapper-1",this.border.classList.remove(Pa+"-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const i=this.getBarHeight(e,t),s=this.getMarkHeight(e,t),n=this.getTrackHeight(e,i),a=`clipPath_${e}`,o=this.getClipPath(a,i,e),r=this.getMarkTranslateY(t,i,e),d=this.getTrackTranslateY(t,e,i,n);return this.border.classList.toggle(Pa+"-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=Pa+"-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${d}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(Pa+"-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${s}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var ka=i(6724),Ta=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class xa{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=xa.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const i=document.createElement("div"),s=!Object.keys(this.rows).length&&!t;return i.className=xa.BASE_CLASS+"-row"+(s?"":" is-hiding hide"),this.rows[e]={element:i,new:!0},this.container.append(i),i}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout((()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)}),xa.DURATION)}setNewRow(e,t=!1){const i=this.rows[e];i.new&&(t?(i.element.classList.remove("hide"),i.element.offsetLeft):i.element.classList.remove("is-hiding","hide"),delete i.new),this.clearRows(e)}animate(e,t,i=e>t,s=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!s)return this.setNewRow(e);const o=["from-top","from-bottom"];i||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}xa.DURATION=200,xa.BASE_CLASS="animated-super";class Aa{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=Aa.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=Aa.BASE_CLASS+"-decimal";const i=document.createElement("div");i.className=Aa.BASE_CLASS+"-decimal-placeholder";const s=new xa;return s.container.className=Aa.BASE_CLASS+"-decimal-wrapper",t.append(i,s.container),this.container.append(t),this.decimals[e]={container:t,placeholder:i,animatedSuper:s}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout((()=>{this.decimals.splice(t,this.decimals.length-t).forEach((e=>{e.container.remove()}))}),xa.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach((t=>{const i=+t.placeholder.innerText||0;t.animatedSuper.getRow(Aa.EMPTY_INDEX,!0),t.animatedSuper.animate(Aa.EMPTY_INDEX,i,this.reverse?ethis.previousNumber,!0)})),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map((e=>+e));Array.from(""+e).map((e=>+e)).forEach(((i,s)=>{var n;const a=this.getDecimal(s),o=a.animatedSuper.getRow(i,!0),r=null!==(n=t[s])&&void 0!==n?n:Aa.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+i,a.animatedSuper.animate(i,r,this.reverse?ethis.previousNumber,!0)})),this.hideLeft(e),this.previousNumber=e}}Aa.EMPTY_INDEX=-1,Aa.BASE_CLASS="animated-counter";class _a{constructor(e,t,i){this.topbar=e,this.chat=t,this.managers=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.listenerSetter=new ae.Z,this.log=(0,r.kg)("PM"),this.debug=!0,this.isStatic=!1;const s=new Q("pinned-message",t.animationGroup);this.pinnedMessageContainer=new Ca({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:s,onClose:()=>Ta(this,void 0,void 0,(function*(){return(yield i.appPeersManager.canPinMessage(this.chat.peerId))?new bs(this.chat.peerId,this.pinnedMid,!0):new bs(this.chat.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new Za,s.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new xa,s.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new xa,this.animatedMedia.container.classList.add("pinned-message-media-container"),s.content.prepend(this.animatedMedia.container),this.animatedCounter=new Aa(!0),s.title.append((0,S.ag)("PinnedMessage")," ",this.animatedCounter.container);const n=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(n),s.container.prepend(n),this.btnOpen=(0,Sn.Z)("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),(0,w.fc)(this.btnOpen,(e=>{(0,be.Z)(e),this.topbar.openPinned(!0)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e})=>{e===this.chat.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))})),this.listenerSetter.add(d.Z)("peer_pinned_hidden",(({peerId:e})=>{e===this.chat.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)})),this.setPinnedMessage=(0,Ee.Z)((()=>this._setPinnedMessage()),100,!0,!0),this.setCorrectIndexThrottled=(0,ka.Z)(this.setCorrectIndex.bind(this),100,!1),this.isStatic="discussion"===this.chat.type}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;const t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const i=t.dataset.mid;t&&void 0!==i&&this.testMid(+i,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let i=this.mids.findIndex((t=>t<=e));if(-1===i||this.isNeededMore(i)){if(!(this.loadedTop&&ei))return;this.pinnedIndex=i,this.pinnedMid=this.mids.find((t=>t<=e))||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>_a.LOAD_COUNT&&(!this.loadedBottom&&e<=_a.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=_a.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return Ta(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{const i=this.debug?this.log.bindPrefix("getCurrentIndex"):void 0;i&&i("start",e,t);let s=!1;const n=[this.managers.appMessagesManager.getSearch({peerId:this.chat.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:_a.LOAD_COUNT,backLimit:_a.LOAD_COUNT}).then((e=>(s=!0,e)))];if(!this.pinnedMaxMid){const e=this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId).then((e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))}));n.push(e)}const a=(yield Promise.all(n))[0];let o=a.history.findIndex((t=>t.mid<=e));-1===o&&(o=a.history.length),this.offsetIndex=a.offset_id_offset?a.offset_id_offset-o:0,this.mids=a.history.map((e=>e.mid)).slice(),this.count=a.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,i&&i("result",e,a,o,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.log.error("getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new ae.Z,function(e,t,i,s){if(c.Z){let t;const n={passive:!0};s.add(e)("touchstart",(i=>{i.touches.length>1?o():(t=i.touches[0].clientY,s.add(e)("touchmove",a,n),s.add(e)("touchend",o,n))}),n);const a=e=>{const s=e.touches[0].clientY,n=s{s.removeManual(e,"touchmove",a,n),s.removeManual(e,"touchend",o,n)}}else s.add(e)("wheel",(e=>{const t=e.deltaY>0;!t||i()}),{passive:!0})}(this.chat.bubbles.scrollable.container,0,(()=>{this.unsetScrollDownListener()}),this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return Ta(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.log("handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield(0,de.e9)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.log("handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.log.error("handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return Ta(this,void 0,void 0,(function*(){(yield this.chat.getMessage(e))&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then((()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)})))}))}_setPinnedMessage(){return Ta(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,i=yield this.chat.getMessage(this.pinnedMid),s=0===t;this.animatedCounter.container.classList.toggle("is-last",s),s||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.log("setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],d=yield q({title:void 0,titleEl:null,subtitle:i.message,subtitleEl:a,message:i,mediaEl:o,loadPromises:r,animationGroup:this.chat.animationGroup});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",d),this.animatedSubtitle.animate(t,this.wasPinnedIndex),d?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+i.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}_a.LOAD_COUNT=50,_a.LOAD_OFFSET=5;var Fa=i(6194),Da=i(2995),Ra=i(4240),Ba=i(6818),Na=i(3897),Oa=i(7120),Ua=i(2059),Ha=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class za{constructor(e,t,i){this.chat=e,this.appSidebarRight=t,this.managers=i,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&(0,be.Z)(e),(()=>{Ha(this,void 0,void 0,(function*(){const e=yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);t&&this.menuButtons[this.menuButtons.length-1].element.lastChild.replaceWith((0,S.ag)(e));const i=this.buttonsToVerify.concat(t?this.menuButtons:[]);(yield Promise.all(i.map((e=>Ha(this,void 0,void 0,(function*(){return{result:yield e.verify(),button:e}})))))).forEach((({button:e,result:t})=>{e.element.classList.toggle("hide",!t)}))}))})()},this.verifyVideoChatButton=e=>Ha(this,void 0,void 0,(function*(){var t;if(!Ba.Z||this.peerId.isUser())return!1;const i=Ua.ZP.groupCall,s=this.peerId.toChatId();if((null==i?void 0:i.chatId)===s)return!1;if(e&&((yield this.managers.appPeersManager.isBroadcast(this.peerId))&&"group"===e||(yield this.managers.appPeersManager.isAnyGroup(this.peerId))&&"broadcast"===e))return!1;const n=yield this.managers.appChatsManager.getChatTyped(s);return(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)||(0,Oa.Z)(n,"manage_call")})),this.verifyCallButton=e=>Ha(this,void 0,void 0,(function*(){if(!De.Z||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),i=yield this.managers.appProfileManager.getCachedFullUser(t);return!!i&&!!("voice"===e?i.pFlags.phone_calls_available:i.pFlags.video_calls_available)})),this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onMuteClick=()=>{new Na.Z(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",o.Z.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===o._.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),k.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame((()=>{k.IS_SAFARI&&e&&this.chatUtils.classList.remove("hide");const t=this.chatUtils.getBoundingClientRect().width;this.chat.log("utils width:",t),this.container.style.setProperty("--utils-width",t+"px"),this.setUtilsRAF=0}))},this.setFloating=()=>{const e=[this.chatAudio,this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer].filter(Boolean).reduce(((e,t)=>{const i=t.isFloating();return this.container.classList.toggle(`is-pinned-${t.className}-floating`,i),t.isVisible()?e+ +i:e}),0);this.container.dataset.floating=""+e},this.setPeerStatusManual=(e=!1)=>Ha(this,void 0,void 0,(function*(){if(!this.subtitle)return;const t=this.peerId;return this.chat.appImManager.setPeerStatus(t,this.subtitle,e,!1,(()=>t===this.peerId))})),this.setPeerStatus=e=>this.setPeerStatusManual(e).then((e=>{e&&e()})),this.listenerSetter=new ae.Z,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar","hide"),this.container.dataset.floating="0",this.btnBack=(0,Sn.Z)("left sidebar-close-button",{noRipple:!0}),this.chatInfoContainer=document.createElement("div"),this.chatInfoContainer.classList.add("chat-info-container"),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const i=document.createElement("div");i.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),i.append(this.title);const s=document.createElement("div");s.classList.add("bottom"),this.subtitle&&s.append(this.subtitle),t.append(i,s),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new Ma(this,this.chat,this.managers),this.menuButtons.length&&(this.btnMore=(0,Cn.Z)({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(o.Z)("changeScreen",this.onChangeScreen),(0,w.fc)(this.container,(e=>{const t=(0,fe.Z)(e.target,"pinned-container");if((0,Pn.Z)(),t){if((0,be.Z)(e),(0,fe.Z)(e.target,"progress-line"))return;const i=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(i);else{const e=t.dataset.peerId.toPeerId(),s=Qn.Z.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:i,type:s.isScheduled?"scheduled":s.threadId?"discussion":void 0,threadId:s.threadId})}}else o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir)?r():(0,pe.Z)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains(a.HQ)):this.appSidebarRight.toggleSidebar(!0)}),{listenerSetter:this.listenerSetter});const r=e=>{if(e&&(0,be.Z)(e),o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);vn.Z.back(e?"im":"chat")}};(0,w.fc)(this.btnBack,r,{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:()=>o.Z.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>Ha(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.managers.appMessagesManager.togglePeerMute(this.peerId)},verify:()=>Ha(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1))}))},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})}))},verify:()=>Ha(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null==e?void 0:e.linked_chat_id)}))},{icon:"phone",text:"Call",onClick:this.onCallClick.bind(this,"voice"),verify:this.verifyCallButton.bind(this,"voice")},{icon:"videocamera",text:"VideoCall",onClick:this.onCallClick.bind(this,"video"),verify:this.verifyCallButton.bind(this,"video")},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),on.Z.getState().then((t=>{if(t.chatContextMenuHintWasShown)return;const i=e.toggleByElement.bind(e);e.toggleByElement=t=>Ha(this,void 0,void 0,(function*(){this.managers.appStateManager.pushToState("chatContextMenuHintWasShown",!0),(0,me.Am)((0,S.ag)("Chat.Menu.Hint")),e.toggleByElement=i,e.toggleByElement(t)}))}))},verify:()=>!this.chat.selection.isSelecting&&!!this.chat.bubbles.getRenderedLength()},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(Ra.Z)){const e=this.appSidebarRight.createTab(Ra.Z);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>Ha(this,void 0,void 0,(function*(){return this.peerId.isUser()&&!(yield this.managers.appPeersManager.isContact(this.peerId))}))},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new Da.Z({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise(((i,s)=>{new vs.Z("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new R.Z({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{i(),this.managers.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{s()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()})),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>Ha(this,void 0,void 0,(function*(){return d.Z.myId!==this.peerId&&this.peerId.isUser()&&(yield this.managers.appPeersManager.isContact(this.peerId))&&!!(yield this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone}))},{icon:"lock",text:"BlockUser",onClick:()=>{new vs.Z("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new R.Z({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!0).then((e=>{e&&(0,me.bC)({langPackKey:"UserBlocked"})}))}}]}).show()},verify:()=>Ha(this,void 0,void 0,(function*(){var e;if(!this.peerId.isUser())return!1;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==d.Z.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"lockoff",text:"Unblock",onClick:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!1).then((e=>{e&&(0,me.bC)({langPackKey:"UserUnblocked"})}))},verify:()=>Ha(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"delete danger",text:"Delete",onClick:()=>{new Fa.Z(this.peerId)},verify:()=>Ha(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&!!(yield this.managers.appMessagesManager.getDialogOnly(this.peerId))}))}],this.btnSearch=(0,Sn.Z)("search"),this.attachClickEvent(this.btnSearch,(e=>{this.chat.initSearch()}),!0)}attachClickEvent(e,t,i){(0,w.fc)(e,(e=>{(0,be.Z)(e),!i&&(0,Pn.Z)(),t(e)}),{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructAvatar(){const e=new p.Z;return e.isDialog=!0,e.classList.add("avatar-42","person-avatar"),e}get peerId(){return this.chat.peerId}constructPeerHelpers(){return this.avatarElement=this.constructAvatar(),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new _a(this,this.chat,this.managers),this.btnJoin=(0,Re.Z)("btn-primary btn-color-primary chat-join hide"),this.btnCall=(0,Sn.Z)("phone"),this.btnGroupCall=(0,Sn.Z)("videochat"),this.btnPinned=(0,Sn.Z)("pinlist"),this.btnMute=(0,Sn.Z)("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,(()=>Ha(this,void 0,void 0,(function*(){const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let i;i=(yield this.managers.appChatsManager.isChannel(t))?this.managers.appChatsManager.joinChannel(t):this.managers.appChatsManager.addChatUser(t,d.Z.myId),i.finally((()=>{e()&&this.btnJoin.removeAttribute("disabled")}))})))),this.listenerSetter.add(d.Z)("chat_update",(e=>Ha(this,void 0,void 0,(function*(){var t;if(this.peerId===e.toPeerId(!0)){const i=yield this.managers.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(t=null==i?void 0:i.pFlags)||void 0===t?void 0:t.left)),this.setUtilsWidth(),this.verifyButtons()}})))),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{e.peerId===this.peerId&&this.setMutedState()})),this.listenerSetter.add(d.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.verifyButtons()})),this.pinnedMessage&&this.chat.addEventListener("setPeer",((e,t)=>{const i=this.chat.bubbles.getMiddleware();on.Z.getState().then((s=>{i()&&(this.pinnedMessage.hidden=!!s.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))}))})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}constructPinnedHelpers(){this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t})=>{e===this.peerId&&t&&this.setTitle()}))}constructDiscussionHelpers(){this.pinnedMessage=new _a(this,this.chat,this.managers)}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),this.pinnedMessage&&this.pinnedMessage.destroy(),this.chatAudio&&this.chatAudio.destroy(),delete this.chatAudio,delete this.pinnedMessage}cleanup(){this.chat.peerId||this.container.classList.add("hide")}finishPeerChange(e){return Ha(this,void 0,void 0,(function*(){const e=this.peerId;let t;this.avatarElement&&(t=this.constructAvatar());const[i,s,n,a,o,r,d]=yield Promise.all([this.managers.appPeersManager.isBroadcast(e),this.managers.appPeersManager.isAnyChat(e),e.isAnyChat()?this.managers.appChatsManager.getChat(e.toChatId()):void 0,t?t.updateWithOptions({peerId:e}):void 0,this.setTitleManual(),this.setPeerStatusManual(!0),on.Z.getState()]);return()=>{var a;if(this.btnMute&&this.btnMute.classList.toggle("hide",!i),this.btnJoin&&(s&&!this.chat.isRestricted?((0,O.Z)(this.btnJoin,(0,S.ag)(i?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(a=null==n?void 0:n.pFlags)||void 0===a?void 0:a.left))):this.btnJoin.classList.add("hide")),t&&(this.avatarElement.replaceWith(t),this.avatarElement=t),this.setUtilsWidth(),this.verifyButtons(),this.pinnedMessage)if("chat"===this.chat.type){if(this.chat.wasAlreadyUsed){const e=new _a(this,this.chat,this.managers);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}this.pinnedMessage.hidden=!!d.hiddenPinnedMessages[e]}else"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage());o(),r&&r(),this.setMutedState(),this.container.classList.remove("hide")}}))}setTitleManual(e){return Ha(this,void 0,void 0,(function*(){const t=this.peerId,i=()=>this.peerId===t;let s;if("pinned"===this.chat.type)s=void 0===e?(0,S.ag)("Loading"):(0,S.ag)("PinnedMessagesCount",[e]),void 0===e&&this.managers.appMessagesManager.getSearchCounters(t,[{_:"inputMessagesFilterPinned"}],!1).then((e=>{if(!i())return;const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}}));else if("scheduled"===this.chat.type)s=(0,S.ag)(t===d.Z.myId?"Reminders":"ScheduledMessages");else if("discussion"===this.chat.type){if(void 0===e){const s=yield this.managers.acknowledged.appMessagesManager.getHistory(t,0,1,0,this.chat.threadId);if(!i())return;if(s.cached){const t=yield s.result;if(!i())return;e=t.count}else s.result.then((e=>{i()&&this.setTitle(e.count)}))}s=void 0===e?(0,S.ag)("Loading"):(0,S.ag)("Chat.Title.Comments",[e])}else if("chat"===this.chat.type&&([s]=yield Promise.all([(0,Bt.Z)({peerId:t,dialog:!0,withIcons:!0})]),!i()))return;return()=>{(0,O.Z)(this.title,s)}}))}setTitle(e){this.setTitleManual(e).then((e=>e()))}setMutedState(){return Ha(this,void 0,void 0,(function*(){if(!this.btnMute)return;const e=this.peerId,t=yield this.managers.appNotificationsManager.isPeerLocalMuted(e,!1);(yield this.managers.appPeersManager.isBroadcast(e))?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}))}}var ja=i(5884),Ga=i(3607);class Va extends Hi._{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(e,t,i,s){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new Ga.Z("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=(0,Sn.Z)("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const n=document.createElement("div");n.classList.add("chatlist-container"),this.scrollable.container.replaceWith(n),this.appSearch=new ja.Z(n,this.inputSearch,{messages:new ja.z("Chat.Search.PrivateSearch","messages")}),this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,s):(this.query=s,this.peerId=e,this.threadId=t,this.onDatePick=i,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&(0,w.fc)(this.btnPickDate,(()=>{y.Z.createPopup(L,new Date,this.onDatePick).show()})),s&&this.appSearch.searchInput.inputField.setValueSilently(s),a.ZP.toggleSidebar(!0))}}class Ka{constructor(e,t,i){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{(0,be.Z)(e),y.Z.createPopup(L,new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=(0,pe.Z)(e.target,zi.DIALOG_LIST_ELEMENT_TAG);t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.container.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{(0,be.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{(0,be.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),(0,T.Z)(this.backBtn);const s=this.listenerSetter=new ae.Z,n=(e,t)=>{(0,w.fc)(e,t,{listenerSetter:s})};n(this.backBtn,(()=>{this.destroy()})),this.inputSearch=new Ga.Z("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new ja.z(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new ja.Z(this.results,this.inputSearch,{messages:this.searchGroup},(e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):((0,O.Z)(this.foundCountEl,this.inputSearch.value?(0,S.ag)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))})),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.container.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),(0,T.Z)(this.footer),this.foundCountEl=document.createElement("span"),this.foundCountEl.classList.add("chat-search-count"),this.dateBtn=document.createElement("button"),this.dateBtn.classList.add("btn-icon","tgico-calendar"),this.controls=document.createElement("div"),this.controls.classList.add("chat-search-controls"),this.upBtn=document.createElement("button"),this.upBtn.classList.add("btn-icon","tgico-up"),this.downBtn=document.createElement("button"),this.downBtn.classList.add("btn-icon","tgico-down"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"),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(),i&&this.setQuery(i),k.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},vn.Z.pushItem(this.navigationItem))}destroy(){this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.listenerSetter.removeAll(),this.chat.bubbles.container.classList.remove("search-results-active"),this.chat.search=void 0,vn.Z.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),i=+e.dataset.mid||void 0,s=(0,Se.Z)(e);s===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),s?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active");const n=this.chat.setPeer(t,i);this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then((()=>{this.selectedIndex=s,(0,O.Z)(this.foundCountEl,(0,S.ag)("Of",[s+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()})).finally((()=>{this.setPeerPromise=null}))}}var Wa=i(1571),$a=i(6848),qa=i(356);class Qa{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find((t=>(0,$a.Z)(t.options,e)));return t||(t=new Qa,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.image=document.createElement("img");return t.crossOrigin="anonymous",this.renderImageFromUrlPromise=(0,xt.cj)(t,e,!1).then((()=>qa.Z?createImageBitmap(t,{resizeWidth:1440,resizeHeight:2960}).then((e=>(this.imageBitmap=e,t))):t))}cleanup(e){var t;this.canvases.delete(e),this.canvases.size||((0,h.Z)(Qa.INSTANCES,this),this.objectUrl&&(null===(t=this.imageBitmap)||void 0===t||t.close(),URL.revokeObjectURL(this.objectUrl)))}fillCanvas(e){const t=e.getContext("2d"),{width:i,height:s}=e,n=this.imageBitmap||this.image;let a=n.width,o=n.height;const r=(500+Pe.Z.height/2.5)*e.dpr;a*=r/o,o=r,this.options.mask?(t.fillStyle="#000",t.fillRect(0,0,i,s),t.globalCompositeOperation="destination-out"):t.globalCompositeOperation="source-over";const d=e=>{for(let s=0;s0){let e=l;do{d(e-=o)}while(e>=0)}const c=s-1;for(let e=l+o;ei.resize(e,t))))}}Qa.INSTANCES=[];var Ya=i(6714),Ja=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Xa extends l.Z{constructor(e,t){super(),this.appImManager=e,this.managers=t,this.type="chat",this.animationGroup=`chat-${Math.round(65535*Math.random())}`,this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=(0,r.kg)("CHAT",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.peerId=m.NM,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0,this.sharedMediaTabs=[]}setBackground(e,t){const i=Ya.Z.getTheme();let s;if(i.background.color&&!i.background.slug&&!i.background.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=i.background.color,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const n=++this.backgroundTempId,a=this.gradientRenderer,o=this.patternRenderer,r=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const l=i.background.intensity&&i.background.intensity/100,c=!!l&&l<0;let h,u,f,p=null==s?void 0:s.firstElementChild;if(!s)if(s=document.createElement("div"),s.classList.add("chat-background-item"),e)if(l){s.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();h=this.patternRenderer=Qa.getInstance({url:e,width:t.width,height:t.height,mask:c}),p=this.patternCanvas=h.createCanvas(),p.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas"),c&&s.classList.add("is-dark")}else i.background.slug&&s.classList.add("is-image");else i.background.color&&s.classList.add("is-color");const m=i.background.color;if(m){const{canvas:e,gradientRenderer:t}=Wa.Z.create(m);f=this.gradientRenderer=t,u=this.gradientCanvas=e,u.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),d.Z.settings.animationsEnabled&&f.scrollAnimate(!0)}h&&(c?u:p).style.setProperty("--opacity-max",""+Math.abs(l)*(c?.5:1));const g=new Promise((i=>{const d=()=>{if(this.backgroundTempId!==n)return h&&h.cleanup(p),void(f&&f.cleanup());const e=this.backgroundEl.lastElementChild;if(e===s)return void i();const d=[u,p].filter(Boolean);d.length&&s.append(...d),this.backgroundEl.append(s),(0,Te.Z)(s,"is-visible",!0,t?0:200,e?()=>{o&&o.cleanup(r),a&&a.cleanup(),e.remove()}:null,2),i()};h?h.renderToCanvas(p).then((()=>{this.backgroundTempId===n&&d()})):e?(0,xt.ZP)(s,e,d):d()}));return this.setBackgroundPromise=Promise.race([(0,Qe.Z)(500),g])}setType(e){this.type=e}init(){this.topbar=new za(this,a.ZP,this.managers),this.bubbles=new fs(this,this.managers),this.input=new ya(this,this.appImManager,this.managers),this.contextMenu=new js(this,this.managers),this.selection=new wa.Z(this,this.bubbles,this.input,this.managers),"chat"===this.type?(this.topbar.constructUtils(),this.topbar.constructPeerHelpers()):"pinned"===this.type?this.topbar.constructPinnedHelpers():"discussion"===this.type&&(this.topbar.constructUtils(),this.topbar.constructDiscussionHelpers()),this.topbar.construct(),this.input.construct(),"chat"===this.type?(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()):"pinned"===this.type?(this.bubbles.constructPinnedHelpers(),this.input.constructPinnedHelpers()):"scheduled"===this.type?(this.bubbles.constructScheduledHelpers(),this.input.constructPeerHelpers()):"discussion"===this.type&&(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()),"scheduled"===this.type||c.Z||this.bubbles.setReactionsHoverListeners(),this.bubbles.attachContainerListeners(),this.container.classList.add("type-"+this.type),this.container.append(this.topbar.container,this.bubbles.container,this.input.chatInput),this.bubbles.listenerSetter.add(d.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer(t)})),this.bubbles.listenerSetter.add(d.Z)("dialog_drop",(e=>{e.peerId===this.peerId&&this.appImManager.setPeer()})),this.bubbles.listenerSetter.add(this.appImManager)("chat_changing",(({to:e})=>{const t=e!==this,i=()=>{var e;null===(e=this.bubbles.observer)||void 0===e||e.toggleObservingNew(t),s.Z.toggleIntersectionGroup(this.animationGroup,t),t&&s.Z.checkAnimations(t,this.animationGroup)};t?i():setTimeout((()=>{i()}),400)}))}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.destroySharedMediaTab(),this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),this.contextMenu&&this.contextMenu.destroy(),this.selection&&this.selection.attachListeners(void 0,void 0),this.cleanupBackground(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.topbar.cleanup(),this.selection.cleanup()}onChangePeer(e){return Ja(this,void 0,void 0,(function*(){const{peerId:t}=this,i=a.ZP.getTab(Va);i&&i.close();const[s,n,o,r,d,l,c,h]=yield e(Promise.all([this.managers.appPeersManager.noForwards(t),this.managers.appPeersManager.isRestricted(t),this._isAnyGroup(t),this.setAutoDownloadMedia(),this.managers.appPeersManager.isMegagroup(t),this.managers.appPeersManager.isBroadcast(t),this.managers.appPeersManager.isChannel(t),this.managers.appPeersManager.isBot(t)]));this.noForwards=s,this.isRestricted=n,this.isAnyGroup=o,this.isMegagroup=d,this.isBroadcast=l,this.isChannel=c,this.isBot=h,this.container.classList.toggle("no-forwards",this.noForwards),this.sharedMediaTab=a.ZP.createSharedMediaTab(),this.sharedMediaTabs.push(this.sharedMediaTab),this.sharedMediaTab.setPeer(t,this.threadId),this.input.clearHelper(),this.selection.cleanup()}))}setPeer(e,t,i){e?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const s=this.peerId===e;if(s){if(this.setPeerPromise)return}else this.appImManager.dispatchEvent("peer_changing",this),this.peerId=e||m.NM,this.messagesStorageKey=`${this.peerId}_${"scheduled"===this.type?"scheduled":"history"}`;if(!e)return a.ZP.toggleSidebar(!1),this.cleanup(!0),this.bubbles.setPeer(!1,e),this.appImManager.dispatchEvent("peer_changed",e),a.ZP.replaceSharedMediaTab(),this.destroySharedMediaTab(),void(this.sharedMediaTab=void 0);this.peerChanged=s;const n=this.bubbles.setPeer(s,e,t,i),o=this.setPeerPromise=n.then((e=>e.promise)).catch(Ke.Z).finally((()=>{this.setPeerPromise===o&&(this.setPeerPromise=null)}));return n}destroySharedMediaTab(e=this.sharedMediaTab){e&&((0,h.Z)(this.sharedMediaTabs,e),e.destroy())}setAutoDownloadMedia(){return Ja(this,void 0,void 0,(function*(){this.autoDownload=yield function(e){return t=this,i=void 0,n=function*(){let t,i=0,s=0,n=0;const a=d.Z.settings,o=d.Z.managers.appPeersManager;return!a.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?(yield o.isContact(e))?"contacts":"private":(yield o.isBroadcast(e))?"channels":"groups",a.autoDownload.photo[t]&&(i=a.autoDownloadNew.photo_size_max),a.autoDownload.video[t]&&(s=a.autoDownloadNew.video_size_max),a.autoDownload.file[t]&&(n=a.autoDownloadNew.file_size_max)),{photo:i,video:s,file:n}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}(this.peerId)}))}setMessageId(e){return this.setPeer(this.peerId,e)}finishPeerChange(e,t,i,s){return Ja(this,void 0,void 0,(function*(){if(this.peerChanged)return;const t=this.peerId;this.peerChanged=!0,this.wasAlreadyUsed=!0;const i=this.bubbles.getMiddleware();this.cleanup(!1);const n=this.sharedMediaTab;n.loadSidebarMedia(!0);const o=Promise.all([this.topbar.finishPeerChange(e),this.bubbles.finishPeerChange(),this.input.finishPeerChange(s)]),[r]=yield Promise.all([o,n.fillProfileElements()]);i()&&(r.forEach((e=>{e()})),a.ZP.replaceSharedMediaTab(n),this.sharedMediaTabs.filter((e=>e!==n)).forEach((e=>this.destroySharedMediaTab(e))),this.log.setPrefix("CHAT-"+t+"-"+this.type),this.appImManager.dispatchEvent("peer_changed",t))}))}getMessage(e){return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey,e)}getMidsByMid(e){return Ja(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.getMidsByMessage(yield this.getMessage(e))}))}getHistoryStorage(e){return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId,e?void 0:this.threadId).then((e=>Object.assign(Object.assign({},e),{history:ue.Z.fromJSON(e.historySerialized)})))}getHistoryMaxId(){return this.getHistoryStorage().then((e=>e.maxId))}_isAnyGroup(e){return Ja(this,void 0,void 0,(function*(){return e===d.Z.myId||e===m.hj||(yield this.managers.appPeersManager.isAnyGroup(e))}))}initSearch(e){if(this.peerId)if(o.Z.isMobile)this.search?this.search.setQuery(e):this.search=new Ka(this.topbar,this,e);else{let t=a.ZP.getTab(Va);t||(t=a.ZP.createTab(Va)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.managers.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return Promise.all([this.managers.appPeersManager.isBot(this.peerId),this.managers.appMessagesManager.getDialogOnly(this.peerId),this.getHistoryStorage(!0)]).then((([e,t,i])=>e&&!t&&!i.history.length))}getMessageSendingParams(){return{threadId:this.threadId,replyToMsgId:this.input.replyToMsgId,scheduleDate:this.input.scheduleDate,sendSilent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}isOurMessage(e){return e.fromId===d.Z.myId||!!e.pFlags.out&&this.isMegagroup}isOutMessage(e){const t=e.fwd_from;return!(!this.isOurMessage(e)||t&&this.peerId===d.Z.myId)}isAvatarNeeded(e){return this.isAnyGroup&&!this.isOutMessage(e)}}var eo=i(2342),to=i(6637);class io{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,c.Z){if(e&&(0,be.Z)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools"),["bold","italic","underline","strikethrough","monospace","spoiler","link"].forEach((t=>{const i=(0,Sn.Z)(t,{noRipple:!0});e.append(this.buttons[t]=i),"link"!==t?i.addEventListener("mousedown",(e=>{(0,be.Z)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()})):(0,w.fc)(i,(e=>{(0,be.Z)(e),this.showLinkEditor(),this.cancelClosening()}))})),this.linkBackButton=(0,Sn.Z)("left",{noRipple:!0}),this.linkInput=document.createElement("input"),(0,S.$d)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",(e=>{const t=!this.linkInput.value.length||!!(0,eo.Z)(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))})),this.linkInput.addEventListener("input",(e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")})),this.linkBackButton.addEventListener("mousedown",(e=>{(0,be.Z)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()})),this.linkApplyButton=(0,Sn.Z)("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",(e=>{this.applyLink(e)}));const i=document.createElement("div");i.classList.add("markup-tooltip-link-apply-container");const s=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");s.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(s,this.buttons.link),i.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,i),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",(()=>{this.hide()}))}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout((()=>{this.linkInput.focus()}),200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){(0,be.Z)(e),this.resetSelection();let t=this.linkInput.value;t&&!(0,to.Z)(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout((()=>{this.hide()}),0)}isLinkValid(){return!this.linkInput.value.length||!!(0,eo.Z)(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,vn.Z.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout((()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")}),200))}getActiveMarkupButton(){const e=new Set,t=Object.keys(this.buttons),i=ma(t);return t.forEach((t=>{i[t]&&e.add(this.buttons[t])})),[...e]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const i=this.buttons[t];i.classList.toggle("active",e.includes(i))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),i=document.body.getBoundingClientRect(),s=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=(0,Be.Z)(void 0,this.appImManager.chat.input.messageInput,!1,s).rect.top+-1*i.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,d=n.left,l=n.left+n.width-Math.min(n.width,o.width);let c;if(e){const e=this.container.getBoundingClientRect();c=(0,Fi.Z)(e.left,d,l)}else{const e=s.left+(s.width-o.width)/2;c=(0,Fi.Z)(e,d,l)}this.container.style.transform=`translate3d(${c}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),ws())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"),k.IS_MOBILE||vn.Z.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){c.Z&&!k.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",(e=>{(0,be.Z)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()}),{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",(e=>{if(document.activeElement===this.linkInput)return;const t=this.appImManager.chat.input.messageInput;if(document.activeElement!==t)return void this.hide();const i=document.getSelection();if(ws(i))this.hide();else if(c.Z)if(k.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=i.getRangeAt(0),this.setMouseUpEvent()}else this.container&&this.container.classList.contains("is-visible")?this.setTooltipPosition():t.matches(":active")?this.setMouseUpEvent():this.show()})),document.addEventListener("beforeinput",(e=>{"historyRedo"!==e.inputType&&"historyUndo"!==e.inputType||e.target.addEventListener("input",(()=>this.setActiveMarkupButton()),{once:!0})})))}}var so=i(9171);class no{constructor(e,t){let i;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(i=document.createElement("div"),i.classList.add("drop-icon","tgico-"+t.icon));const s=document.createElement("div");let n;s.classList.add("drop-header"),s.append((0,S.ag)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append((0,S.ag)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,i,s,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",`${e.width}`),this.svg.setAttributeNS(null,"height",`${e.height}`);const t=10,i=e.width-t,s=e.height-t,n=(0,so.Z)(5,5,i,s,t,t,t,t);this.path.setAttributeNS(null,"d",n)}}var ao=i(7922);function oo(e){e.forEach((e=>e.classList.add("no-transition"))),(0,le.d1)().then((()=>{e.forEach((e=>e.classList.remove("no-transition")))}))}var ro=i(490),lo=i(2831),co=i(2207);class ho{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:i,minRadius:s,speed:n}=this,a=i-s;e[t]=s+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:i,N:s}=this;for(let n=0;n=1&&(s[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,i,s,n,a,o,r){if(n.getContext){const d=n.getContext("2d");d.beginPath(),d.moveTo(i,s),d.lineTo(e,s);const{radius:l,radiusNext:c,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const i=this.progress[n],s=(t-(l[n]*(1-i)+c[n]*i))*r+o*(1-r);d.lineTo(e,s)}else{const a=this.progress[n-1],u=l[n-1]*(1-a)+c[n-1]*a,f=this.progress[n],p=(i-e)/h*(n-1),m=(i-e)/h*n,g=p+(m-p)/2,v=(t-u)*r+o*(1-r),b=(t-(l[n]*(1-f)+c[n]*f))*r+o*(1-r);d.bezierCurveTo(g,v,g,b,m,b),n===h&&d.lineTo(i,s)}a(d),d.fill(),d.closePath()}}}class uo{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,i,s,n,a)=>{t.fillStyle=uo.getGradientFromType(t,e,i,s,n,a)}}static getGradientFromType(e,t,i,s,n,a){const o=e.createLinearGradient(i,s,n,a);return t===co.Z.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===co.Z.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===co.Z.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===co.Z.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,i,s){}}class fo{constructor(){this.handleDevicePixelRatioChanged=e=>{this.setSize(),this.forceUpdate()},this.handleResize=()=>{this.resizeHandler&&(clearTimeout(this.resizeHandler),this.resizeHandler=null),this.resizing=!0,this.resizeCanvas(),this.resizeHandler=window.setTimeout((()=>{this.resizing=!1,this.invokeDraw()}),250)},this.handleFocus=()=>{this.focused=!0,this.invokeDraw()},this.handleBlur=()=>{this.focused=!1},this.invokeDraw=()=>{this.raf||this.draw()},this.draw=(e=!1)=>{if(this.raf=null,!this.mounted)return;const{lbd:t,lbd1:i,lbd2:s,scale:n,left:a,top:o,right:r,bottom:d,currentState:l,previousState:c,focused:h,resizing:u,canvas:f}=this;if(!h&&!u&&this.progressToState>=1)return;let p=Date.now()-this.lastUpdateTime;p>20&&(p=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*p,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:g,progressToState:v}=this,b=6*g*n,y=6*g*n;f.getContext("2d").clearRect(0,0,f.width,f.height),t.minRadius=0,t.maxRadius=(2+2*m)*n,i.minRadius=0,i.maxRadius=(3+9*m)*n,s.minRadius=0,s.maxRadius=(3+9*m)*n,t.update(m,.3),i.update(m,.7),s.update(m,.7);for(let e=0;e<2;e++){if(0===e&&!c)continue;let n=1,h=null;0===e?(n=1-v,h=c):(n=c?v:1,l.update(d-o,r-a,p,m),h=l);const u=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,d)},g=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,d)};i.draw(a,o-b,r,d,f,u,o,1),s.draw(a,o-y,r,d,f,u,o,1),t.draw(a,o,r,d,f,g,o,1)}e||(this.raf=requestAnimationFrame((()=>this.draw())))},this.setCurrentState=(e,t)=>{const{currentState:i,states:s}=this;(null==i?void 0:i.stateId)!==e&&(this.previousState=t?i:null,this.currentState=s.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[co.Z.UNMUTED,new uo(co.Z.UNMUTED)],[co.Z.MUTED,new uo(co.Z.MUTED)],[co.Z.MUTED_BY_ADMIN,new uo(co.Z.MUTED_BY_ADMIN)],[co.Z.CONNECTING,new uo(co.Z.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(co.Z.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 ho(3),this.lbd1=new ho(7),this.lbd2=new ho(8),this.setAmplitude(this.amplitude),this.draw())}componentWillUnmount(){this.mounted=!1,window.removeEventListener("resize",this.handleResize),this.media.addEventListener("change",this.handleDevicePixelRatioChanged);const{canvas:e}=this;e.getContext("2d").clearRect(0,0,e.width,e.height)}setSize(){this.scale=window.devicePixelRatio,this.top=20*this.scale,this.right=(this.mounted?this.container.offsetWidth:1261)*this.scale,this.bottom=(this.mounted?this.container.offsetHeight:68)*this.scale,this.left=0*this.scale,this.setCanvasSize()}setCanvasSize(){this.canvas.width=this.right,this.canvas.height=this.bottom}resizeCanvas(){this.scale=window.devicePixelRatio,this.right=this.container.offsetWidth*this.scale,this.forceUpdate(),this.invokeDraw()}setAmplitude(e){const{amplitude:t}=this;this.animateToAmplitude=e,this.animateAmplitudeDiff=(e-t)/250,this.animateAmplitudeDiff2=(e-t)/120}forceUpdate(){this.setCanvasSize()}render(e){const t=this.container=document.createElement("div");t.classList.add(e);const i=this.canvas=document.createElement("canvas");return i.classList.add(e+"-canvas"),t.append(i),t}}var po=i(8222);class mo{constructor(e,t){this.item=e,(0,bn.Z)(this,t)}play(e){return this.item.playPart(this,e)}}class go{constructor(e,t){this.icon=e,this.autoplay=!1,(0,bn.Z)(this,t),this.parts=this.parts.map((e=>this.createPart(e)))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:i,canvas:s,width:n,height:a}=this.icon;return t=Cs.Z.loadAnimationAsAsset({container:i,canvas:s,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then((e=>Cs.Z.waitForFirstFrame(e))).then((e=>{this.player=e,this.onLoadForColor&&(this.onLoadForColor(),this.onLoadForColor=void 0),this.onLoadForPart&&(this.onLoadForPart(),this.onLoadForPart=void 0)})),this.loadPromise=t,this.icon.loadPromises.set(this.name,t),t}createPart(e){return new mo(this,e)}getPart(e){return e instanceof mo?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 vo{constructor(e){(0,bn.Z)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:i}=this;this.container.style.width=t+"px",this.container.style.height=i+"px";const s=this.canvas=document.createElement("canvas");s.classList.add("rlottie"),s.width=t,s.height=i,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(Ke.Z)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new go(this,e);return this.items.set(e.name,t),t}playPart(e,t,i){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,i)});const s=e.getPart(t);e.player.playPart({from:d.Z.settings.animationsEnabled&&!this.skipAnimation?s.startFrame:s.endFrame,to:s.endFrame,callback:i})}static generateEqualParts(e,t){return new Array(e).fill(0).map(((e,i)=>{const s=i*t;return{startFrame:s,endFrame:s+t-1}}))}}class bo extends vo{constructor(e){super({width:e.width,height:e.height}),(0,bn.Z)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const i=this.getPart(e),s=void 0!==t&&this.getColor&&this.getColor(t),n=i.item;n.initFrame=i.endFrame,n.color=s;const a=[...this.items.values()].map((e=>e.load()));return Promise.all(a).then(Ke.Z)}setState(e,t,i){this.loaded||this.load(e,t);let s=!1,n=!1;return void 0!==e?s=this.setPartState(e,t,i):void 0!==t&&(n=this.setColorState(t)),s||n}setPartState(e,t,i){const{partState:s}=this;return s===e?void 0!==t&&this.setColorState(t):(void 0!==t&&this.setColorState(t,!1),this.partState=e,this.getPart(e,s).play(i),!0)}setColorState(e,t=!0){const{colorState:i}=this;if(i===e||!this.getColor)return!1;this.colorState=e;const s=this.getItem(),n=this.getColor(e,i),a=()=>{s.player.setColor(n,t)};return s.player?a():s.onLoadForColor=a,!0}destroy(){this.items.forEach((e=>{e.loadPromise.then((()=>{e.player.remove()}))}))}}class yo extends bo{constructor(){super({width:36,height:36,getPart:(e,t)=>{const i=Wo;let s;switch(e){case i.HAND:s=t===i.MUTED?"muted-to-hand":"unmuted-to-hand";break;case i.MUTED:s=t===i.HAND?"hand-to-muted":"mute";break;case i.UNMUTED:s="unmute"}return this.getItem().getPart(s)}}),this.container.classList.add("group-call-microphone-icon-container"),this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}var wo=i(6733);class So extends bo{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const i=Ko;let s;switch(e){case i.HAND:s=3;break;case i.MUTED:s=t===i.HAND?0:2;break;case i.UNMUTED:s=1}return this.getItem().getPart(s)},getColor:e?(e,t)=>function(e){const t=Ko;let 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 s=po.Z.getProperty("gc-"+i+"-text-color");return(0,B.oo)(s)}(e):void 0}),this.colored=e,this.container.classList.add("group-call-participant-muted-icon-container");const t=vo.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=Ko;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}const Co="group-call-participant-status";class Lo{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add(Co+"-container")}setState(e,t){const i=Ko,s=this.withIcons.filter((e=>!!t[e])).map((e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),i=document.createElement("i");return i.classList.add(Co+"-icon",Co+"-icon-"+e,t),i}));let n,a;if(e===i.MUTED_FOR_ME)n=(0,S.ag)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===i.UNMUTED)n=(0,S.ag)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===i.HAND)n=(0,S.ag)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!s.length)return void(0,A.Z)(this.container,(0,D.Z)(t.about));n=(0,S.ag)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add(Co,a),o.append(...s,n),(0,O.Z)(this.container,o)}}var Eo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Io extends ts.Z{constructor(e){super({getIndex:e=>Eo(this,void 0,void 0,(function*(){return(yield this.instance.getParticipantByPeerId(e.id)).date})),onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>Eo(this,void 0,void 0,(function*(){const t=yield this.instance.getParticipantByPeerId(e.id),i=$o(t);e.mutedIcon.setState(i),e.status.setState(i,t)})),onSort:(e,t)=>{(0,f.Z)(e.dom.listEl,this.list,t)},onElementCreate:e=>{const{dom:t}=zi.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});t.listEl.classList.add("group-call-participant");const i=new So(!0),s=new Lo(["presentation","video"]);return(0,O.Z)(t.lastMessageSpan,s.container),t.listEl.append(i.container),e.mutedIcon=i,e.status=s,e.dom=t,e},updateElementWith:le.T2}),this.instance=e,this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=zi.default.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach((e=>{this.onElementDestroy(e)}))}onElementDestroy(e){e.mutedIcon.destroy()}}var Mo=i(7529);function Po(e){const t=document.createElement("canvas");t.classList.add("call-video-blur"),t.width=16,t.height=16;const i=t.getContext("2d",{alpha:!1});i.filter="blur(2px)";const s=()=>{i.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return(0,Ce.jt)((()=>(s(),t.isConnected))),s(),t}const Zo="group-call-participant-video";class ko{constructor(e,t,i){this.managers=e,this.instance=t,this.source=i,this.container=document.createElement("div"),this.container.classList.add(Zo+"-container"),this.info=document.createElement("div"),this.info.classList.add(Zo+"-info"),this.left=document.createElement("div"),this.left.classList.add(Zo+"-info-left"),this.right=document.createElement("div"),this.right.classList.add(Zo+"-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(Zo+"-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,i){let s;e.pFlags.self?(s=(0,S.ag)("VoiceChat.Status.You"),s.classList.add("peer-title")):(this.peerTitle=new R.Z({peerId:(0,F.Z)(e.peer)}),s=this.peerTitle.element),this.groupCallParticipantMutedIcon=new So(!1),this.groupCallParticipantStatus=new Lo([t]),this.left.append(s,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),i.classList.add(Zo,"call-video"),i.paused&&i.play();const n=Po(i);n.classList.add(Zo+"-blur"),this.container.prepend(n,i),this.updateParticipant(e)}updateParticipant(e){const t=$o(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class To extends Mo.Z{constructor(e){super(),(0,bn.Z)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:i}=this;i.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),i.add(this.instance)("pinned",(e=>{this.participantsElements.forEach((t=>{t.forEach((t=>{this.setElementDisplay(t,e)}))}))})),(0,w.fc)(this.container,(e=>{const t=(0,fe.Z)(e.target,"group-call-participant-video-container");if(!t)return;const i=this.containers.get(t);this.instance.pinnedSource!==i.source?this.instance.pinSource(i.source):this.instance.unpinAll()}),{listenerSetter:i}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:i,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const i=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!i);const s=e.source===t;e.setPinned(s)}updateParticipant(e){const t=(0,F.Z)(e.peer),i=["video","presentation"],s=i.some((t=>!!e[t]));let n=this.participantsElements.get(t);(s||n)&&(n||this.participantsElements.set(t,n=new Map),i.forEach((i=>{let s=n.get(i);const a=e[i];if(!!a!=!!s){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,i);if(!t)return;const{video:a,source:o}=t;s=new ko(this.managers,this.instance,o),this.containers.set(s.container,s),this.setElementDisplay(s,this.instance.pinnedSource),n.set(i,s),s.setParticipant(e,i,a),this.container.prepend(s.container)}else n.delete(i),s.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(s.container),s.destroy());this._onLengthChange()}else s&&s.updateParticipant(e)})))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){return t=this,i=void 0,n=function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}destroy(){this.containers.forEach((e=>{e.destroy()}))}}var xo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ao{constructor(e){this.onOpenProfileClick=()=>{const e=y.Z.getPopups(Yo)[0];e&&e.hide(),Ar.setInnerPeer({peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.instance.editParticipant(this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.managers.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>xo(this,void 0,void 0,(function*(){(0,li.Z)({peerId:this.targetPeerId,title:new R.Z({peerId:this.targetPeerId}).element,descriptionLangKey:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new R.Z({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then((()=>{this.managers.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)}),Ke.Z)}))}];const{listenerSetter:t}=e;this.managers=e.managers,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=(0,ms.Z)(this.buttons,t),this.element.classList.add("group-call-participant-menu","night"),(0,pt.E)(e.onContextElement,(e=>xo(this,void 0,void 0,(function*(){const t=(0,fe.Z)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==i&&i.append(this.element),(0,be.Z)(e);const s=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=yield this.instance.getParticipantByPeerId(s),this.participant.pFlags.self||(this.canManageCall=yield this.managers.appChatsManager.hasRights(this.chatId,"manage_call"),yield(0,Os.Z)(this.buttons,(e=>xo(this,void 0,void 0,(function*(){const t=yield e.verify(s);return e.element.classList.toggle("hide",!t),t})))),(0,Ns.Z)(e.touches?e.touches[0]:e,this.element,"right"),mt.Z.openBtnMenu(this.element))}))),t),t.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=(0,F.Z)(t.peer);this.targetPeerId===e&&mt.Z.close()}}));let i=document.body;(0,wo.Ms)(document.body,(()=>{const e=(0,wo.rB)();i=e?y.Z.getPopups(Yo)[0].getContainer():document.body,e||mt.Z.close()}),t)}}class _o{constructor(e){(0,bn.Z)(this,e);const t="group-call-participants",i=new P.ZP(void 0);i.container.classList.add(t+"-scrollable");const s=this.container=document.createElement("div");s.classList.add(t);const n=this.sortedList=new Io(this.instance),{instance:a,listenerSetter:o}=this;this.contextMenu=new Ao(Object.assign(Object.assign({},e),{onContextElement:n.list,listenerSetter:o,instance:a})),this.groupCallParticipantsVideo=new To(Object.assign(Object.assign({},e),{appendTo:i.container,displayPinned:!1})),i.append(n.list),s.append(i.container),e.appendTo.append(s),o.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),new xs.Z({scrollable:i,getPromise:()=>this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then((({participants:e,isEnd:t})=>(e.forEach((e=>{this.updateParticipant(e)})),t)))}),this.setInstance(a)}updateParticipant(e){const t=(0,F.Z)(e.peer),i=this.sortedList.has(t);e.pFlags.left?i&&this.sortedList.delete(t):i?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){return xo(this,void 0,void 0,(function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))}))}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class Fo{constructor(e){this.appendTo=e,this.descriptionIntl=new S.ZP.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description")}detach(){this.descriptionIntl.element.remove()}update(e){const{state:t}=e;let i,s;t===co.Z.CONNECTING?i="VoiceChat.Status.Connecting":(i="VoiceChat.Status.Members",s=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:i,args:s}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class Do{constructor(e){this.appendTo=e,this.peerTitle=new R.Z({peerId:0})}update(e){const{peerTitle:t,appendTo:i}=this,s=e.groupCall,n=e.chatId.toPeerId(!0);s.title?(0,A.Z)(i,(0,D.Z)(s.title)):(t.peerId!==n&&(t.peerId=n,t.update()),t.element.parentElement!==i&&i.append(t.element))}}var Ro=i(2820);function Bo(e,t,i){const s=e+"-button",n=document.createElement("div");n.classList.add(s,"call-button","rp-overflow"),i.icon&&n.classList.add("tgico-"+i.icon),i.noRipple||(0,T.Z)(n),i.isDanger&&n.classList.add(s+"-red"),i.isConfirm&&n.classList.add(s+"-green"),i.callback&&(0,w.fc)(n,i.callback,{listenerSetter:t});let a=n;if(i.text){const e=document.createElement("div");e.classList.add(s+"-container","call-button-container");const t="string"==typeof i.text?(0,S.ag)(i.text):i.text;t.classList.add(s+"-text","call-button-text"),e.append(n,t),a=e}return a}var No=i(3757);const Oo="movable-element",Uo="movable-element-resize-handler";class Ho extends l.Z{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},(0,bn.Z)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add(Oo),this.addResizeHandlers(),this.setSwipeHandler(),o.Z.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove(Oo),this.handlers&&this.handlers.forEach((e=>{e.remove()}))}destroy(){o.Z.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map((e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add(Uo,Uo+"-side-"+e),this.element.append(t),t}))}setSwipeHandler(){let e,t,i,s,n;const a=this.swipeHandler=new No.Z({element:this.element,onSwipe:(a,o,r)=>{if(a*=-1,o*=-1,n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,s=Math.abs(a)*(e?1:-1),o=n.includes("e")?Pe.Z.width-t:i+t;this.width=Math.min(o,i+s)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,i=Math.abs(o)*(t?1:-1),a=n.includes("s")?Pe.Z.height-e:s+e;this.height=Math.min(a,s+i)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+i-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+s-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return!1;const i=(0,fe.Z)(t,Uo);return i?(n=i.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,i=this.width,s=this.height}})}setPositionToCenter(){this.top=Pe.Z.height/2-this.height/2,this.left=Pe.Z.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=(0,Fi.Z)(this.width,this.minWidth,Pe.Z.width),this.height=(0,Fi.Z)(this.height,this.minHeight,Pe.Z.height)}fixPosition(){this.top=(0,Fi.Z)(this.top,0,Pe.Z.height-this.height),this.left=(0,Fi.Z)(this.left,0,Pe.Z.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:i,height:s}=this;return{top:e,left:t,width:i,height:s}}set state(e){const{top:t,left:i,width:s,height:n}=e;this.top=t,this.left=i,this.width=s,this.height=n,this.onResize()}}var zo,jo=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i};class Go{constructor(e){zo.set(this,void 0),(0,bn.Z)(this,e),this.toggleMovable(!c.Z),this.listenerSetter.add(o.Z)("changeScreen",((e,t)=>{t!==o._.mobile&&e!==o._.mobile||this.toggleMovable(!c.Z)}))}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)}(this,zo,"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=jo(this,zo,new Ho(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(),jo(this,zo,void 0,"f")}}}function Vo(e,t,i){return t.forEach((t=>{t.classList.toggle(e,i)})),()=>Vo(e,t,!i)}zo=new WeakMap;var Ko,Wo;function $o(e){const t=Ko;return e.pFlags.muted_by_you?t.MUTED_FOR_ME:void 0!==e.raise_hand_rating?t.HAND:e.pFlags.muted?e.pFlags.can_self_unmute?t.MUTED:t.MUTED_BY_ADMIN:t.UNMUTED}!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_FOR_ME=2]="MUTED_FOR_ME",e[e.MUTED_BY_ADMIN=3]="MUTED_BY_ADMIN",e[e.HAND=4]="HAND"}(Ko||(Ko={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(Wo||(Wo={}));let qo={width:420,height:640};const Qo="group-call";class Yo extends y.Z{constructor(){super("popup-group-call",{body:!0,withoutOverlay:!0,closable:!0,title:!0}),this.onFullScreenClick=()=>{(0,wo.Dj)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=Vo.bind(null,"btn-disabled"),this.onVideoClick=()=>{const e=this.toggleDisability([this.btnVideo],!0);this.instance.toggleVideoSharing().finally((()=>{e()}))},this.onScreenClick=()=>{const e=this.toggleDisability([this.btnScreen],!0);this.instance.toggleScreenSharing().finally((()=>{e()}))},this.onMuteClick=()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},this.onLeaveClick=()=>{return e=this,t=void 0,s=function*(){const e=e=>{this.instance.hangUp(e)};(yield this.managers.appChatsManager.hasRights(this.instance.chatId,"manage_call"))?new vs.Z("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=(0,wo.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations2(e),Ya.Z.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=(0,wo.rB)(),i=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,s=(t||!!(i&&i.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;s&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach((e=>{e.style.opacity="0"})),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",s),this.btnInvite.classList.toggle("hide",s),this.btnShowColumn.classList.toggle("hide",!s),a&&a.forEach((e=>{e.style.opacity=""}))},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},this.videosCount=0,this.container.classList.add(Qo,"night");const e=this.instance=Ua.ZP.groupCall,{listenerSetter:t}=this;if(!k.IS_APPLE_MOBILE){const e=this.btnFullScreen=(0,Sn.Z)("fullscreen"),i=this.btnFullScreen2=(0,Sn.Z)("fullscreen group-call-cfs"),s=this.btnExitFullScreen=(0,Sn.Z)("smallscreen");(0,w.fc)(e,this.onFullScreenClick,{listenerSetter:t}),(0,w.fc)(i,this.onFullScreenClick,{listenerSetter:t}),(0,w.fc)(s,(()=>{(0,wo.C8)()}),{listenerSetter:t}),(0,wo.Ms)(this.container,this.onFullScreenChange,t)}this.btnInvite=(0,Sn.Z)("adduser");const i=this.btnShowColumn=(0,Sn.Z)("rightpanel group-call-only-big");(0,w.fc)(i,this.toggleRightColumn,{listenerSetter:t});const n=document.createElement("div");n.classList.add("group-call-header-info"),this.title.classList.add("group-call-header-title");const a=document.createElement("div");a.classList.add("group-call-header-subtitle"),n.append(this.title,a),this.header.classList.add("group-call-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const o=this.header.cloneNode(!1),r=n.cloneNode(!1),l=this.title.cloneNode(!1);r.append(l);const c=(0,Sn.Z)("rightpanel");o.append(...[c,r,this.btnFullScreen2].filter(Boolean)),(0,w.fc)(c,this.toggleRightColumn,{listenerSetter:t}),this.body.prepend(o);const h=new P.ZP(void 0);h.container.classList.add("group-call-big-video-container"),this.container.append(h.container),this.groupCallTitle=new Do(this.title),this.groupCallDescription=new Fo(a),this.groupCallBodyHeaderDescription=new Fo(l),this.constructButtons(),this.groupCallParticipantsVideo=new To({appendTo:h.container,instance:e,listenerSetter:t,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()},managers:this.managers}),this.groupCallParticipants=new _o({appendTo:this.body,instance:e,listenerSetter:t,managers:this.managers}),this.movablePanel=new Go({listenerSetter:t,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,fe.Z)(t,"chatlist")||(0,fe.Z)(t,"group-call-button")||(0,fe.Z)(t,"btn-icon")||(0,fe.Z)(t,"group-call-participants-video-container")||(0,wo.rB)())}},onResize:()=>this.toggleBigLayout(),previousState:qo}),t.add(e)("state",(()=>{this.updateInstance()})),t.add(d.Z)("group_call_update",(e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()})),t.add(e)("pinned",(()=>{this.setHasPinned()})),t.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",(()=>{const{movablePanel:e}=this;qo=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=Bo.bind(null,Qo,this.listenerSetter),i=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),s=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});s.classList.toggle("hide",!Ro.Z);const n=t({noRipple:!0,callback:(0,ka.Z)(this.onMuteClick,600,!0)});n.classList.add("group-call-microphone-button");const a=this.groupCallMicrophoneIcon=new yo;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!Ro.Z);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(i,s,n,o,r),this.container.append(e)}getContainer(){return this.container}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===co.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,wo.C8)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const i=function(e,t){const i=Wo;return t.pFlags.can_self_unmute?t.pFlags.muted?i.MUTED:i.UNMUTED:i.HAND}(0,e);this.container.dataset.micState=i===Wo.HAND?"hand":i===Wo.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(i)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var Jo=i(9078),Xo=i(3335);class er{constructor(e){this.appendTo=e,this.container=document.createElement("div"),this.container.classList.add("call-description")}detach(){void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0),this.container.remove(),this.state=void 0}update(e){const{connectionState:t}=e;if(this.state===t)return;let i;if(this.state=t,t===Xo.Z.CONNECTED){i=document.createElement("span"),i.classList.add("call-description-duration");const t=()=>{i.innerText=(0,Gi.Z)(e.duration,!0)};this.interval=window.setInterval(t,1e3),t()}else{let s;switch(t){case Xo.Z.PENDING:s=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case Xo.Z.REQUESTING:s="Call.StatusRequesting";break;case Xo.Z.EXCHANGING_KEYS:s="VoipExchangingKeys";break;case Xo.Z.CLOSED:s=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:s="Call.StatusConnecting"}i=(0,S.ag)(s),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===Xo.Z.CONNECTED),(0,O.Z)(this.container,i),this.container.parentElement||this.appendTo.append(this.container)}}class tr extends bo{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 ir="call",sr={width:400,height:580};let nr=Object.assign({},sr);class ar extends y.Z{constructor(e){super("popup-call",{withoutOverlay:!0,closable:!0}),this.instance=e,this.onFullScreenClick=()=>{(0,wo.Dj)(this.container)},this.onFullScreenChange=()=>{const e=(0,wo.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations(e),Ya.Z.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},this.videoContainers={};const{container:t,listenerSetter:i}=this;t.classList.add(ir,"night");const n=document.createElement("div");n.classList.add("call-avatar");const a=this.peerId=this.instance.interlocutorUserId.toPeerId(),o=new p.Z;o.classList.add("avatar-full"),o.updateWithOptions({isBig:!0,peerId:a}),n.append(o);const r=new R.Z({peerId:a}).element;r.classList.add("call-title");const d=document.createElement("div");d.classList.add("call-subtitle"),this.description=new er(d);const l=this.emojisSubtitle=document.createElement("div");l.classList.add("call-emojis"),t.append(n,r,d),k.IS_MOBILE?this.header.append(l):(this.btnFullScreen=(0,Sn.Z)("fullscreen"),this.btnExitFullScreen=(0,Sn.Z)("smallscreen hide"),(0,w.fc)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:i}),(0,w.fc)(this.btnExitFullScreen,(()=>(0,wo.C8)()),{listenerSetter:i}),(0,wo.Ms)(this.container,this.onFullScreenChange,i),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(l)),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 c=(0,S.ag)("VoipUserMicrophoneIsOff",[new R.Z({peerId:a,onlyFirstName:!0,limitSymbols:18}).element]);c.classList.add("call-party-state-text");const h=new tr(!1,!0);h.setState(!1,!1),this.partyMutedState.append(h.container,c),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=Bo.bind(null,ir,this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),i.add(e)("state",(()=>{this.updateInstance()})),i.add(e)("mediaState",(()=>{this.updateInstance()})),this.movablePanel=new Go({listenerSetter:i,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,fe.Z)(t,"call-button")||(0,fe.Z)(t,"btn-icon")||(0,wo.rB)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?nr:Object.assign({},sr)});const u=this.movablePanel.movable;u&&this.listenerSetter.add(u)("resize",(()=>{this.resizeVideoContainers()}));const f=this.controlsHover=new Mo.Z;f.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),f.showControls(!1),this.addEventListener("close",(()=>{const{movablePanel:e}=this;nr=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=Vo.bind(null,"btn-disabled"),i=this.btnVideo=this.makeButton({text:"Call.Camera",icon:"videocamera_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleVideoSharing().finally(e)}}),s=this.btnScreen=this.makeButton({text:"Call.Screen",icon:"sharescreen_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleScreenSharing().finally(e)}});Ro.Z||(s.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new S.ZP.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new tr(!0,!0);n.firstElementChild.append(a.container),e.append(i,s,n),this.container.append(e)}constructSecondButtons(){const e=this.secondButtonsRow=document.createElement("div");e.classList.add("call-buttons","is-second"),this.declineI18nElement=new S.ZP.IntlElement({key:"Call.Decline"});const t=this.btnDecline=this.makeButton({text:this.declineI18nElement.element,icon:"endcall_filled",callback:()=>{this.instance.hangUp("phoneCallDiscardReasonHangup")},isDanger:!0}),i=this.btnAccept=this.makeButton({text:"Call.Accept",icon:"phone_filled",callback:()=>{this.instance.acceptCall()},isConfirm:!0});e.append(t,i),this.container.append(e)}createVideoContainer(e){const t=document.createElement("div");t.classList.add("call-video-container"),e.classList.add("call-video"),e.paused&&e.play(),(0,w.fc)(t,(()=>{if(!t.classList.contains("small"))return;const e=Object.values(this.videoContainers).find((e=>!e.classList.contains("small")));e.classList.add("small"),e.style.cssText=t.style.cssText,t.classList.remove("small"),t.style.cssText="",this.resizeVideoContainers()}));const i=Po(e);return i.classList.add("call-video-blur"),t.append(i,e),t}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===Xo.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,wo.C8)(),this.btnVideo.classList.add("disabled"),void this.hide();const i=!e.isOutgoing&&t===Xo.Z.PENDING;this.declineI18nElement.compareAndUpdate({key:t===Xo.Z.PENDING?"Call.Decline":"Call.End"}),this.btnAccept.classList.toggle("disable",!i),this.btnAccept.classList.toggle("hide-me",!i),this.container.classList.toggle("two-button-rows",i);const s=e.isMuted,n=()=>{this.btnMute.firstElementChild.classList.toggle("active",s)},a=this.microphoneIcon.getItem().player;this.microphoneIcon.setState(!s,!s,n),a||n(),this.muteI18nElement.compareAndUpdate({key:s?"VoipUnmute":"Call.Mute"});const o=e.isSharingVideo;this.btnVideo.firstElementChild.classList.toggle("active",o);const r=e.isSharingScreen;this.btnScreen.firstElementChild.classList.toggle("active",r);const d=e.getMediaState("output");(0,Te.Z)(this.partyMutedState,"is-visible",!!(null==d?void 0:d.muted),300);const l=this.videoContainers,c=Object.assign({},l);["input","output"].forEach((t=>{const i=e.getMediaState(t),s=e.getVideoElement(t),n=!!(s&&s.videoWidth&&s.videoHeight);!s||n||s.dataset.hasPromise||(s.dataset.hasPromise="1",(0,an.Z)(s).then((()=>{delete s.dataset.hasPromise,this.updateInstance()})));const a=!!s&&n&&!(!i||"active"!==i.videoState&&"active"!==i.screencastState);let o=l[t];a&&s&&!o&&(o=l[t]=this.createVideoContainer(s),this.container.append(o)),!a&&o&&(o.remove(),delete l[t])}));{const e=l.input,t=l.output;Object.keys(c).length!==Object.keys(l).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(l).length),!this.emojisSubtitle.textContent&&t{(0,O.Z)(this.emojisSubtitle,(0,D.Z)(e.join("")))})),this.setDescription()}resizeVideoContainers(){Object.values(this.videoContainers).forEach((e=>{if(e.classList.contains("small")){const t=e.querySelector("video"),i=this.movablePanel.state,s=240,n=240,a=t.videoHeight>t.videoWidth,o=a?n:s,r=1/3*((0,wo.rB)()?65535:a?i.height:i.width),d=a?t.videoWidth/t.videoHeight:1,l=a?1:t.videoHeight/t.videoWidth;e.style.width=r*d+"px",e.style.height=r*l+"px",e.style.maxWidth=o*d+"px",e.style.maxHeight=o*l+"px"}else e.style.cssText=""}))}setDescription(){this.description.update(this.instance)}}var or=i(2069),rr=i(9585),dr=i(2493);class lr{constructor(e){this.managers=e,this.onState=()=>{this.updateInstance(this.instance)};const t=this.listenerSetter=new ae.Z;t.add(dr.Z)("instance",(({instance:e})=>{this.instance||this.updateInstance(e)})),t.add(dr.Z)("accepting",(e=>{this.instance!==e&&this.updateInstance(e)})),t.add(Ua.ZP)("instance",(e=>{this.updateInstance(e)})),t.add(d.Z)("group_call_update",(e=>{const t=Ua.ZP.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)})),t.add(rr.Z.ANALYSER_LISTENER)("amplitude",(({amplitudes:e,type:t})=>{const{weave:i}=this;if(!e.length||!i)return;let s=0;for(let t=0;ts?n:s}i.setAmplitude(s)}))}clearCurrentInstance(){this.instance&&(this.center.textContent="",this.currentDescription&&(this.currentDescription.detach(),this.currentDescription=void 0),this.instance=void 0,this.instanceListenerSetter.removeAll())}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0);const t=this.instance!==e;t&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new ae.Z,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof Jo.Z?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof Jo.Z)));const i=this.instance.isMuted,s=e instanceof Jo.Z?e.state:function(e,t){switch(e){case Xo.Z.CLOSING:case Xo.Z.CLOSED:return co.Z.CLOSED;case Xo.Z.CONNECTED:return t?co.Z.MUTED:co.Z.UNMUTED;default:return co.Z.CONNECTING}}(e.connectionState,i),{weave:n}=this;n.componentDidMount();const a=s===co.Z.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),(0,Te.Z)(document.body,"is-calling",!a,250,a?()=>{n.componentWillUnmount(),this.clearCurrentInstance()}:void 0)),a||(n.setCurrentState(s,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!i))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof Jo.Z)return this.groupCallTitle.update(e);(0,O.Z)(this.center,new R.Z({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header","topbar-call-container");const i=document.createElement("div");i.classList.add("topbar-call-left");const s=this.groupCallMicrophoneIconMini=new tr,n=(0,Sn.Z)();n.append(s.container),i.append(n);const a=(0,ka.Z)((()=>{this.instance.toggleMuted()}),600,!0);(0,w.fc)(n,(e=>{(0,be.Z)(e),a()}),{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add("topbar-call-center"),this.groupCallTitle=new Do(o),this.groupCallDescription=new Fo(i),this.callDescription=new er(i);const r=document.createElement("div");r.classList.add("topbar-call-right");const d=(0,Sn.Z)("endcall_filled");r.append(d),(0,w.fc)(d,(e=>{(0,be.Z)(e);const{instance:t}=this;t&&(t instanceof Jo.Z?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))}),{listenerSetter:e}),(0,w.fc)(t,(()=>{if(this.instance instanceof Jo.Z){if(y.Z.getPopups(Yo).length)return;(new Yo).show()}else if(this.instance instanceof or.Z){if(y.Z.getPopups(ar).find((e=>e.getCallInstance()===this.instance)))return;new ar(this.instance).show()}}),{listenerSetter:e}),t.append(i,o,r);const l=this.weave=new fo,c=l.render("topbar-call-weave");t.prepend(c),document.getElementById("column-center").prepend(t),l.componentDidMount()}}var cr=i(2614),hr=i(6009),ur=i(493),fr=i(2131),pr=i(6702),mr=i(7746),gr=i(2491),vr=i(1722),br=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const yr=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=fr.Z,this.faviconEl=document.head.querySelector('link[rel="icon"]'),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{const e=["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map((()=>{}));Promise.all(e).then((e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&pr.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?pr.default.subscribe():pr.default.unsubscribe())}pr.default.setSettings(this.settings)})),on.Z.getState().then((e=>{this.settings.nosound=!e.settings.notifications.sound}))},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)}}construct(e){this.managers=e,navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.setAppBadge=navigator.setAppBadge&&navigator.setAppBadge.bind(navigator),this.setAppBadge&&this.setAppBadge(0),this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),this.topMessagesDeferred=(0,ce.Z)(),ro.Z.addEventListener("deactivated",(()=>{this.stop()})),ro.Z.addEventListener("activated",(()=>{this.stopped&&this.start()})),ut.Z.addEventListener("change",(e=>{this.stopped||(e||this.clear(),this.toggleToggler())})),d.Z.addEventListener("notification_reset",(e=>{this.soundReset(e)})),d.Z.addEventListener("notification_cancel",(e=>{this.cancel(e)})),this.setAppBadge&&d.Z.addEventListener("folder_unread",(e=>{0===e.id&&this.setAppBadge(e.unreadUnmutedPeerIds.size)})),pr.default.addEventListener("push_init",(e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):pr.default.subscribe()})),pr.default.addEventListener("push_subscribe",(e=>{this.registerDevice(e)})),pr.default.addEventListener("push_unsubscribe",(e=>{this.unregisterDevice(e)})),d.Z.addEventListener("dialogs_multiupdate",(()=>{this.topMessagesDeferred.resolve()}),{once:!0}),pr.default.addEventListener("push_notification_click",(e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void this.managers.apiManager.invokeApi("account.updateDeviceLocked",{period:86400}).then((()=>{}));const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then((()=>br(this,void 0,void 0,(function*(){e.custom.channel_id&&!(yield this.managers.appChatsManager.hasChat(e.custom.channel_id))||t.isUser()&&!(yield this.managers.appUsersManager.hasUser(t))||Ar.setInnerPeer({peerId:t,lastMsgId:(0,ht.Z)(+e.custom.msg_id)})}))))}))}buildNotification({message:e,fwdCount:t,peerReaction:i,peerTypeNotifySettings:s}){return br(this,void 0,void 0,(function*(){const n=e.peerId,a=n.isAnyChat(),o={},r=yield this.managers.appPeersManager.getPeerString(n);let d;if(s.show_previews)if("message"===e._&&e.fwd_from&&t>1)d=S.ZP.format("Notifications.Forwarded",!0,[t]);else{d=yield(0,j.Z)(e,void 0,void 0,!0);const t=null==i?void 0:i.reaction;if("reactionEmoji"===(null==t?void 0:t._)){const e="Notification.Contact.Reacted",i=[(0,mr.Z)(t.emoticon),d];d=S.ZP.format(e,!0,i)}}else d=S.ZP.format("Notifications.New",!0);i&&(o.noIncrement=!0,o.silent=!0);const l=i?(0,F.Z)(i.peer_id):e.fromId;o.title=yield(0,ur.Z)(n,!0,void 0,void 0,this.managers),a&&l!==e.peerId&&(o.title=(yield(0,ur.Z)(l,!0,void 0,void 0,this.managers))+" @ "+o.title),o.title=(0,gr.Z)(o.title),o.onclick=()=>{Ar.setInnerPeer({peerId:n,lastMsgId:e.mid})},o.message=d,o.key="msg"+e.mid,o.tag=r,o.silent=!0;const c=yield this.managers.appPeersManager.getPeerPhoto(n);c?this.managers.appAvatarsManager.loadAvatar(n,c,"photo_small").then((t=>{(e.pFlags.unread||i)&&(o.image=t,this.notify(o))})):this.notify(o)}))}toggleToggler(e=ut.Z.isIdle){if(k.IS_MOBILE)return;const t=e=>{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=S.ZP.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const i=t.getContext("2d");i.beginPath(),i.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),i.fillStyle="#3390ec",i.fill();let s=24,n=""+e;e<10?s=22:e<100?s=20:(n="99+",s=16),s*=window.devicePixelRatio,i.font=`700 ${s}px ${St.bt}`,i.textBaseline="middle",i.textAlign="center",i.fillStyle="white",i.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)}),1e3):t()}setFavicon(e="assets/img/favicon.ico"){if(this.prevFavicon===e)return;const t=this.faviconEl.cloneNode();t.href=e,this.faviconEl.parentNode.replaceChild(t,this.faviconEl),this.faviconEl=t,this.prevFavicon=e}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),e.noIncrement||++this.notificationsCount,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,i=e.key||"k"+t;this.notificationsShown[i]=!0;const s=(0,_t.Z)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=s),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let n;if("Notification"in window){try{if(e.tag)for(const t in this.notificationsShown){const i=this.notificationsShown[t];"boolean"!=typeof i&&i.tag===e.tag&&(i.hidden=!0)}n=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void pr.default.setLocalNotificationsDisabled()}n.onclick=()=>{n.close(),vr.Z.focus(),this.clear(),e.onclick&&e.onclick()},n.onclose=()=>{n.hidden||(delete this.notificationsShown[i],this.clear())},n.show&&n.show(),this.notificationsShown[i]=n,k.IS_MOBILE||setTimeout((()=>{this.hide(i)}),8e3)}}getLocalSettings(){return this.settings}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}testSound(e){const t=(0,_t.Z)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(s),s.addEventListener("ended",(()=>{s.remove()}),{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,pr.default.hidePushNotifications()}start(){if(this.updateLocalSettings(),d.Z.addEventListener("settings_updated",this.updateLocalSettings),pr.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}registerDevice(e){if(this.registeredDevice&&(0,$a.Z)(this.registeredDevice,e))return!1;this.managers.apiManager.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then((()=>{this.registeredDevice=e}),(e=>{e.handled=!0}))}unregisterDevice(e){if(!this.registeredDevice)return!1;this.managers.apiManager.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then((()=>{this.registeredDevice=!1}),(e=>{e.handled=!0}))}};he.GO&&(he.GO.uiNotificationsManager=yr);const wr=yr;var Sr=i(2423),Cr=i(3591),Lr=i(236),Er=i(5936),Ir=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function Mr(e,t=!1){return Ir(this,void 0,void 0,(function*(){const i=[],s=(e,n)=>Ir(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise(((e,i)=>{t.readEntries((t=>Ir(this,void 0,void 0,(function*(){for(const e of t)yield s(e,n);e()}))))}))}else if(e)if(t)i.push(e.type);else{const t=n.getAsFile(),s=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise(((i,s)=>e.file(i,(e=>i(t)))));if(!s)return;i.push(s)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let s=0;s{(0,be.Z)(null);let i,s,n=t.href;const a=new URL(n),o=a.host.match(/(.+?)\.t(?:elegram)?\.me/);o&&(a.pathname=o[1]+("/"===a.pathname?"":a.pathname),n=a.toString()),e.noPathnameParams||(i=new URL(n).pathname.split("/").slice(1)),e.noUriParams||(s=(0,Pr.Z)(n));const r=e.callback({pathnameParams:i,uriParams:s},t);return void 0===r&&r}}var kr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Tr extends l.Z{constructor(){super(...arguments),this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.tabId=-1,this.chats=[],this.cacheStorage=new Er.Z("cachedFiles"),this.onHashChange=e=>{try{this.onHashChangeUnsafe(e)}catch(e){this.log.error("hash change error",e)}},this.onHashChangeUnsafe=e=>{const t=location.hash;e||vn.Z.replaceState();const i=t.split("?"),s=(0,Pr.Z)(t,i);if(this.log("hashchange",t,i[0],s),t)if(s.tgaddr)this.openUrl(s.tgaddr);else switch(i[0]){default:s.p=i[0].slice(1);case"#/im":{if(!Object.keys(s).length)break;const e=s.p,t=void 0!==s.post?(0,ht.Z)(+s.post):void 0;"@"===e[0]?this.openUsername({userName:e,lastMsgId:t}):this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}},this.setSettings=()=>{const{messagesTextSize:e}=d.Z.settings;this.customEmojiSize=(0,Ve.C)(e+4,e+4),document.documentElement.style.setProperty("--messages-text-size",e+"px"),this.customEmojiSize&&(document.querySelectorAll("middle-ellipsis-element").forEach((t=>{t.disconnectedCallback(),t.dataset.fontSize=""+e,t.title&&(t.textContent=t.title),t.connectedCallback()})),document.querySelectorAll(".chat custom-emoji-renderer-element").forEach((e=>{e.forceRenderAfterSize=!0}))),document.body.classList.toggle("animation-level-0",!d.Z.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",d.Z.settings.animationsEnabled),this.chatsSelectTabDebounced=(0,Ee.Z)((()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)}),d.Z.settings.animationsEnabled?250:0,!1,!0),Cs.Z.setLoop(d.Z.settings.stickers.loop),s.Z.checkAnimations2(!1);for(const e of this.chats)e.setAutoDownloadMedia();S.ZP.setTimeFormat(d.Z.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>kr(this,void 0,void 0,(function*(){const i=ln();if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&(0,be.Z)(e)}const s=yield Mr(e);if(((yield this.canDrag())||i)&&s.length){if(i)return void i.addFiles(s);const e=this.chat.input;e.willAttachType=t||(tn.Z.has(s[0].type)?"media":"document"),y.Z.createPopup(cn,this.chat,s,e.willAttachType)}}))}get myId(){return d.Z.myId}get chat(){return this.chats[this.chats.length-1]}construct(e){this.managers=e;const{apiUpdatesManager:t}=e;t.attach(S.ZP.lastRequestedLangCode),Qn.Z.construct(e),wr.construct(e),wr.start(),this.log=(0,r.kg)("IM",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.backgroundPromises={},Lr.h.settings.themes.forEach((e=>{if(e.background.slug){const t="assets/img/"+e.background.slug+".svg"+(k.IS_FIREFOX?"?1":"");this.backgroundPromises[e.background.slug]=Promise.resolve(t)}})),this.selectTab(0),ut.Z.addEventListener("change",(e=>{this.offline=e,this.updateStatus(),e?clearInterval(this.updateStatusInterval):this.updateStatusInterval=window.setInterval((()=>this.updateStatus()),5e4)})),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.emojiAnimationContainer=document.createElement("div"),this.emojiAnimationContainer.classList.add("emoji-animation-container"),this.appendEmojiAnimationContainer(o.Z.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),vn.Z.onHashChange=this.onHashChange,this.setSettings(),d.Z.addEventListener("settings_updated",this.setSettings);const i=e=>{document.body.classList.toggle("is-premium",e)};d.Z.addEventListener("premium_toggle",i),i(d.Z.premium),(0,de.ZP)((()=>{s.Z.setOnlyOnePlayableGroup("lock"),s.Z.checkAnimations2(!0)}),(()=>{s.Z.setOnlyOnePlayableGroup(),s.Z.checkAnimations2(!1)})),k.IS_FIREFOX&&on.Z.oldVersion&&-1===(0,hr.Z)(on.Z.oldVersion,"1.4.3")?this.deleteFilesIterative((e=>"image/svg+xml"===e.headers.get("Content-Type"))).then((()=>{this.applyCurrentTheme()})):this.applyCurrentTheme(),o.Z.addEventListener("changeScreen",((e,t)=>{document.body.classList.contains(n.ir)&&document.body.classList.contains(a.HQ)&&a.ZP.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)})),o.Z.addEventListener("resize",(()=>{const e=this.chatsContainer.getBoundingClientRect();Qa.resizeInstances(e.width,e.height).then((()=>{}))})),this.addEventListener("peer_changing",(e=>{this.saveChatPosition(e)})),d.Z.addEventListener("theme_change",(()=>{this.applyCurrentTheme()})),d.Z.addEventListener("choosing_sticker",(e=>{this.setChoosingStickerTyping(!e)})),d.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>{var i;const s=this.chat;if(!s||s.peerId!==e||ft.Z.isOverlayActive||o.Z.activeScreen===o._.mobile&&1!==this.tabId)return;const n=t.find((e=>"sendMessageEmojiInteraction"===e.action._));if("sendMessageEmojiInteraction"===(null===(i=null==n?void 0:n.action)||void 0===i?void 0:i._)){const t=n.action,i=s.bubbles.bubbles[(0,ht.Z)(n.action.msg_id)];if(i&&i.classList.contains("emoji-big")&&(0,Be.Z)(i,s.bubbles.scrollable.container)){const s=i.querySelector(".media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)");JSON.parse(t.interaction.data).a.forEach((e=>{setTimeout((()=>{(0,w.tH)(s)}),1e3*e.t)})),this.managers.appMessagesManager.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}));const l=e=>{const t="version"===e,i=new y.Z("popup-instance-deactivated",{overlayClosable:!0}),s=document.createElement("div");s.classList.add("instance-deactivated-container"),i.container.replaceWith(s);const n=document.createElement("div");n.classList.add("header"),n.append((0,S.ag)(t?"Deactivated.Version.Title":"Deactivated.Title"));const a=document.createElement("div");a.classList.add("subtitle"),a.append((0,S.ag)(t?"Deactivated.Version.Subtitle":"Deactivated.Subtitle")),s.append(n,a),document.body.classList.add("deactivated");const o=t?()=>{vr.Z.reload()}:()=>{document.body.classList.add("deactivated-backwards"),ro.Z.activateInstance(),setTimeout((()=>{document.body.classList.remove("deactivated","deactivated-backwards")}),333)};i.addEventListener("close",o),i.show()};ro.Z.addEventListener("deactivated",l),ro.Z.deactivatedReason&&l(ro.Z.deactivatedReason),this.addEventListener("chat_changing",(({to:e})=>{this.toggleChatGradientAnimation(e)})),d.Z.addEventListener("service_notification",(e=>{(0,li.Z)({button:{langKey:"OK",isCancel:!0},description:(0,ot.ZP)(e.message)})})),d.Z.addEventListener("payment_sent",(({peerId:e,mid:t,receiptMessage:i})=>kr(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageByPeer(e,t);if(!s)return;const n=i.action;(0,me.bC)({langPackKey:"PaymentInfoHint",langPackArguments:[(0,yt.Z)(n.total_amount,n.currency),(0,D.Z)(s.media.title)]})})))),window.onSpoilerClick=e=>{const t=(0,fe.Z)(e.target,"spoiler"),i=(0,fe.Z)(t,"spoilers-container")||t.parentElement,s="is-spoiler-visible",n=i.classList.contains(s);n||((0,be.Z)(e),"click"!==w.pf&&window.addEventListener("click",be.Z,{capture:!0,once:!0}));const a=n?0:2;a&&i.classList.add("will-change");const o=i.dataset.spoilerTimeout;null!==o&&(clearTimeout(+o),delete i.dataset.spoilerTimeout),(0,Te.Z)(i,s,!0,200,(()=>{i.dataset.spoilerTimeout=""+window.setTimeout((()=>{(0,Te.Z)(i,s,!1,200,(()=>{i.classList.remove("will-change"),delete i.dataset.spoilerTimeout}))}),5e3)}),a)},d.Z.addEventListener("sticker_updated",(({type:e,faved:t})=>{"faved"===e?(0,me.bC)({langPackKey:t?"AddedToFavorites":"RemovedFromFavorites"}):t||(0,me.bC)({langPackKey:"RemovedFromRecent"})})),on.Z.addEventListener("notificationBuild",(e=>{(this.chat.peerId!==e.message.peerId||ut.Z.isIdle)&&wr.buildNotification(e)})),this.addEventListener("peer_changed",(e=>kr(this,void 0,void 0,(function*(){document.body.classList.toggle("has-chat",!!e),this.emojiAnimationContainer.textContent="",this.overrideHash(e),on.Z.updateTabState("chatPeerIds",this.chats.map((e=>e.peerId)).filter(Boolean))})))),ao.Z.setToCache("chatPositions",{}),(De.Z||Ba.Z)&&(this.topbarCall=new lr(e)),De.Z&&(dr.Z.addEventListener("instance",(({instance:e})=>{const t=new ar(e);e.addEventListener("acceptCallOverride",(()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then((()=>(dr.Z.dispatchEvent("accepting",e),!0))).catch((()=>!1)))),t.addEventListener("close",(()=>{const t=dr.Z.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")}),{once:!0}),t.show()})),dr.Z.addEventListener("incompatible",(e=>kr(this,void 0,void 0,(function*(){(0,me.bC)({langPackKey:"VoipPeerIncompatible",langPackArguments:[yield(0,Bt.Z)({peerId:e.toPeerId()})]})}))))),ro.Z.activateInstance();const c=()=>{lo.default.setAuthorized(!0)};setInterval(c,x.s2),c(),Zr({name:"showMaskedAlert",callback:(e,t)=>{const i=t.href,s=t.cloneNode(!0);s.className="anchor-url",s.innerText=i,s.removeAttribute("onclick"),new vs.Z("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[s],buttons:[{langKey:"Open",callback:()=>{s.click()}}]}).show()}}),Zr({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:i}=e;this.managers.appMessagesManager.sendText(this.chat.peerId,"/"+t+(i?"@"+i:""))}}),Zr({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),[["addstickers",Me.STICKER_SET],["addemoji",Me.EMOJI_SET]].forEach((([e,t])=>{Zr({name:e,callback:({pathnameParams:e})=>{if(!e[1])return;const i={_:t,set:e[1]};this.processInternalLink(i)}}),Zr({name:e,protocol:"tg",callback:({uriParams:e})=>{const i=this.makeLink(t,e);this.processInternalLink(i)}})})),Zr({name:"invoice",callback:({pathnameParams:e})=>{const t={_:Me.INVOICE,slug:e.length>1?e[1]:e[0].slice(1)};this.processInternalLink(t)}}),Zr({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:Me.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),Ba.Z&&Zr({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Me.VOICE_CHAT,e);this.processInternalLink(t)}}),Zr({name:"im",callback:({pathnameParams:e,uriParams:t})=>kr(this,void 0,void 0,(function*(){let i;i=Sr.kO.test(e[0])?{_:Me.USER_PHONE_NUMBER,phone:e[0].slice(1)}:"c"===e[0]?{_:Me.PRIVATE_POST,channel:e[1],post:e[2],thread:"thread"in t&&t.thread,comment:t.comment}:{_:Me.MESSAGE,domain:e[0],post:e[1],comment:t.comment,start:"start"in t?t.start:void 0},this.processInternalLink(i)}))}),Zr({name:"resolve",protocol:"tg",callback:({uriParams:e})=>{let t;e.phone?t=this.makeLink(Me.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(t=this.makeLink(Me.MESSAGE,e)),this.processInternalLink(t)}}),Zr({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Me.PRIVATE_POST,e);this.processInternalLink(t)}}),Zr({name:"invoice",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Me.INVOICE,e);this.processInternalLink(t)}}),["joinchat","join"].forEach((e=>{Zr({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Me.JOIN_CHAT,e);this.processInternalLink(t)}})})),this.onHashChange(!0),this.attachKeydownListener()}deleteFilesIterative(e){return this.cacheStorage.timeoutOperation((t=>{const i=performance.now();return t.keys().then((i=>{const s=i.map((i=>t.match(i).then((t=>e(t)))));return Promise.all(s).then((e=>(e.map(((e,s)=>{if(!e)return;const n=i[s];return t.delete(n)})),Promise.all(e.filter(Boolean)))))})).then((()=>{this.log("deleted files",performance.now()-i)}))}))}toggleChatGradientAnimation(e){this.chats.forEach((t=>{t.gradientRenderer&&t.gradientRenderer.scrollAnimate(d.Z.settings.animationsEnabled&&t===e)}))}appendEmojiAnimationContainer(e){const t=e===o._.mobile?this.columnEl:document.body;this.emojiAnimationContainer.parentElement!==t&&t.append(this.emojiAnimationContainer)}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",(t=>{var i;const s=t.key,n=document.getSelection().isCollapsed;if(ft.Z.isOverlayActive||e.has(s))return;const a=t.target,r=this.chat;if((!(s.startsWith("Arrow")||t.shiftKey&&"Shift"===s)||n)&&("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===a.tagName)){if(!t.altKey||"ArrowUp"!==s&&"ArrowDown"!==s){if("ArrowUp"===s&&"scheduled"!==this.chat.type){if(r.input.editMsgId||!r.input.isInputEmpty())return;this.managers.appMessagesManager.getFirstMessageToEdit(r.peerId,r.threadId).then((e=>{e&&(r.input.initMessageEditing(e.mid),(0,be.Z)(t))}))}else if("ArrowDown"===s)return}else(0,be.Z)(t),this.managers.dialogsStorage.getNextDialog(this.chat.peerId,"ArrowDown"===s,zi.default.filterId).then((e=>{e&&this.setPeer({peerId:e.peerId})}));if((null===(i=null==r?void 0:r.input)||void 0===i?void 0:i.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==a.tagName&&!a.isContentEditable&&!c.Z&&(!o.Z.isMobile||1===this.tabId)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),(0,Tt.Z)(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 kr(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case Me.MESSAGE:{const t=e.post?(0,ht.Z)(+e.post):void 0,i=e.comment?(0,ht.Z)(+e.comment):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:i,startParam:e.start});break}case Me.PRIVATE_POST:{const t=e.channel.toChatId(),i=t.toPeerId(!0);if((yield this.managers.appChatsManager.getChat(t)).deleted)try{yield this.managers.appChatsManager.resolveChannel(t)}catch(e){throw(0,me.bC)({langPackKey:"LinkNotFound"}),e}const s=(0,ht.Z)(+e.post),n=e.thread?(0,ht.Z)(+e.thread):void 0;n?this.openThread(i,s,n):this.setInnerPeer({peerId:i,lastMsgId:s,threadId:n});break}case Me.EMOJI_SET:case Me.STICKER_SET:new I.Z({id:e.set},e._===Me.EMOJI_SET).show();break;case Me.JOIN_CHAT:this.managers.appChatsManager.checkChatInvite(e.invite).then((t=>{t.chat&&this.managers.appChatsManager.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new Ue(e.invite,t):this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})}),(e=>{"INVITE_HASH_EXPIRED"===e.type&&(0,me.Am)((0,S.ag)("InviteExpired"))}));break;case Me.VOICE_CHAT:Ba.Z&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case Me.USER_PHONE_NUMBER:this.managers.appUsersManager.resolvePhone(e.phone).then((e=>{this.setInnerPeer({peerId:e.id.toPeerId(!1)})})).catch((e=>{"PHONE_NOT_OCCUPIED"===e.type&&(0,me.bC)({langPackKey:"Alert.UserDoesntExists"})}));break;case Me.INVOICE:this.managers.appPaymentsManager.getInputInvoiceBySlug(e.slug).then((e=>{this.managers.appPaymentsManager.getPaymentForm(e).then((t=>{new Ti(void 0,e,t)}))}));break;default:this.log.warn("Not supported internal link:",e)}}))}openUrl(e){const{url:t,onclick:i}=(0,Cr.Z)(e);if(!i)return;const s=document.createElement("a");s.href=t,window[i](s)}openUsername(e){const{userName:t,lastMsgId:i,threadId:s,commentId:n,startParam:a}=e;return this.managers.appUsersManager.resolveUsername(t).then((e=>{const t="user"===e._,o=e.id.toPeerId(!t);return s?this.openThread(o,i,s):n?this.openComment(o,i,n):this.setInnerPeer({peerId:o,lastMsgId:i,startParam:a})}),(e=>{"USERNAME_NOT_OCCUPIED"===e.type?(0,me.bC)({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&(0,me.bC)({langPackKey:"Alert.UserDoesntExists"})}))}openThread(e,t,i){return this.managers.appMessagesManager.reloadMessages(e,i).then((s=>(s?this.managers.appMessagesManager.generateThreadServiceStartMessage(s):t=void 0,this.setInnerPeer({peerId:e,lastMsgId:t,threadId:i,type:"discussion"}))))}openComment(e,t,i){return this.managers.appMessagesManager.getDiscussionMessage(e,t).then((e=>this.openThread(e.peerId,i,e.mid)))}callUser(e,t){return kr(this,void 0,void 0,(function*(){dr.Z.getCallByUserId(e)||((yield this.managers.appProfileManager.getProfile(e)).pFlags.phone_calls_private?(0,Bt.Z)({peerId:e.toPeerId()}).then((e=>(0,li.Z)({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[e],button:{langKey:"OK",isCancel:!0}}))):(yield this.discardCurrentCall(e.toPeerId()),dr.Z.startCallInternal(e,"video"===t)))}))}discardCurrentCall(e,t,i){return Ua.ZP.groupCall&&Ua.ZP.groupCall!==t?this.discardGroupCallConfirmation(e):dr.Z.currentCall&&dr.Z.currentCall!==i?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return kr(this,void 0,void 0,(function*(){const t=dr.Z.currentCall;t&&(yield Promise.all([(0,Bt.Z)({peerId:t.interlocutorUserId.toPeerId(!1)}),(0,Bt.Z)({peerId:e})]).then((([t,i])=>(0,li.Z)({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return kr(this,void 0,void 0,(function*(){const t=Ua.ZP.groupCall;t&&(yield Promise.all([(0,Bt.Z)({peerId:t.chatId.toPeerId(!0)}),(0,Bt.Z)({peerId:e})]).then((([t,i])=>(0,li.Z)({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),Ua.ZP.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return kr(this,void 0,void 0,(function*(){const i=e.toChatId(),s=this.managers.appChatsManager.hasRights(i,"manage_call");if(t&&"groupCallDiscarded"===(yield this.managers.appGroupCallsManager.getGroupCallFull(t))._){if(!s)return void(0,me.bC)({langPackKey:"VoiceChat.Chat.Ended"});yield(0,li.Z)({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}(()=>{kr(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getChatFull(i);let t;if(e.call)t=e.call;else{if(!s)return;t=yield this.managers.appGroupCallsManager.createGroupCall(i)}Ua.ZP.joinGroupCall(i,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=Ya.Z.getTheme();if(t.background.slug){const i=Lr.h.settings.themes.find((e=>e.name===t.name));return this.getBackground(t.background.slug).then((t=>this.setBackground(t,e)),(()=>(t.background=(0,Xn.Z)(i.background),this.setCurrentBackground(!0))))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=this.cacheStorage.getFile("backgrounds/"+e).then((e=>URL.createObjectURL(e)))}setBackground(e,t=!0){this.lastBackgroundUrl=e;const i=this.chats.map((t=>t.setBackground(e)));return i[i.length-1].then((()=>{t&&d.Z.dispatchEvent("background_change")}))}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,i=e.peerId+(e.threadId?"_"+e.threadId:""),s=ao.Z.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!t.getRenderedLength())delete s[i],this.log("deleted chat position");else{t.sliceViewport(!0);const e=t.scrollable.scrollTop,n={mids:(0,Je.Z)(t.bubbles,"desc").filter((e=>e>0&&!t.skippedMids.has(e))),top:e};s[i]=n,this.log("saved chat position:",n)}ao.Z.set({chatPositions:s},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),i=ao.Z.getFromCache("chatPositions");return i&&i[t]}applyCurrentTheme(e,t,i){return t&&(this.backgroundPromises[e]=Promise.resolve(t)),Ya.Z.setTheme(),this.setCurrentBackground(void 0===i?!!e:i)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&oo([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),d.Z.settings.animationsEnabled&&!1!==t&&(0,de.YW)((0,Qe.Z)(400),400);const i=(0,Se.Z)(this.prevTab);(0,Se.Z)(e)>i&&vn.Z.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),(0,Pn.Z)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),c.Z||this.attachDragAndDropListeners(),this.markupTooltip=new io(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let i=!1;const s=(r,d)=>kr(this,void 0,void 0,(function*(){if(d===i)return;const l=r.dataTransfer.types,c=l.contains?l.contains("Files"):l.indexOf("Files")>=0,h=ln(),u=yield Mr(r,!0);if(!c||!(yield this.canDrag())&&!h)return void(n=0);const f=h?o:a,p=h?t:e;if(d&&!p.length){const e=c&&!u.length,t=u.filter((e=>tn.Z.has(e))).length;this.log("drag files",u),h?(h.appendDrops(f),(u.length||e)&&p.push(new no(f,{header:"Preview.Dragging.AddItems",headerArgs:[u.length],onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}}))):((u.length||e)&&p.push(new no(f,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}})),(t||e)&&p.push(new no(f,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"media")}})),this.chat.container.append(f))}(0,Te.Z)(f,"is-visible",d,200,(()=>{d||(p.forEach((e=>{e.destroy()})),p.length=0)})),d?p.forEach((e=>{e.setPath()})):n=0,document.body.classList.toggle("is-dragging",d),i=d}));let n=0;document.body.addEventListener("dragenter",(e=>{n++})),document.body.addEventListener("dragover",(e=>{s(e,!0),(0,be.Z)(e)})),document.body.addEventListener("dragleave",(e=>{n--,0===n&&s(e,!1)}));const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){return kr(this,void 0,void 0,(function*(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||ft.Z.isOverlayActive||!(yield e.canSend("send_media")))}))}overrideHash(e){return kr(this,void 0,void 0,(function*(){let t;if(e){const i=yield this.managers.appPeersManager.getPeerUsername(e);t=i?"@"+i:""+e}vn.Z.overrideHash(t)}))}selectTab(e,t){var i;!1===t&&oo([n.ZP.sidebarEl,this.columnEl,a.ZP.sidebarEl]),document.body.classList.toggle(n.ir,0===e);const s=this.tabId;-1!==s&&this.overrideHash(e>0?null===(i=this.chat)||void 0===i?void 0:i.peerId:void 0),this.log("selectTab",e,s);let r=d.Z.settings.animationsEnabled?(0,le.d1)():Promise.resolve();if(-1!==s&&s!==e&&d.Z.settings.animationsEnabled&&!1!==t&&o.Z.activeScreen!==o._.large){const e=100+(o.Z.isMobile?250:200);r=(0,Qe.Z)(e),(0,de.YW)(r,e)}this.tabId=e,(0,Pn.Z)(),o.Z.isMobile&&2===s&&e<2&&document.body.classList.remove(a.HQ),-1!==s&&e>s&&(e<2||!vn.Z.findItemByType("im"))&&vn.Z.pushItem({type:"im",onPop:e=>{this.setPeer({},e)}});const l=window.onImTabChange;return l&&l(e),r}updateStatus(){return this.managers.appUsersManager.updateMyOnlineStatus(this.offline)}createNewChat(){const e=new Xa(this,this.managers);return this.chats.length&&e.setBackground(this.lastBackgroundUrl,!0),this.chats.push(e),e}spliceChats(e,t=!0,i,s){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&this.dispatchEvent("peer_changing",this.chat),s||(s=this.chats.splice(e,this.chats.length-e));const o=this.chat;this.dispatchEvent("chat_changing",{from:n,to:o});for(let e=0;e1&&s.slice(0,-1).forEach((e=>{e.container.remove()})),this.chatsSelectTab(o.container,i),t){this.dispatchEvent("peer_changed",o.peerId);const e=a.ZP.getTab(Va);null==e||e.close(),a.ZP.replaceSharedMediaTab(o.sharedMediaTab)}s.forEach((e=>{e.beforeDestroy()})),setTimeout((()=>{s.forEach((e=>{e.destroy()}))}),350)}setPeer(e={},t){var i;return kr(this,void 0,void 0,(function*(){this.init&&(this.init(),this.init=null),null!==(i=e.peerId)&&void 0!==i||(e.peerId=m.NM);const{peerId:s,lastMsgId:a}=e,r=this.chat,d=this.chats.indexOf(r);if(s){if(d>0&&r.peerId&&r.peerId!==s){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===s)return void this.spliceChats(0,!0,!0,t);{const i=this.setPeer(e);return this.spliceChats(0,!1,!1,t),i}}}else{if(d>0)return void this.spliceChats(d,void 0,t);if(o.Z.activeScreen===o._.medium)return void this.selectTab(+!this.tabId,t)}if(s===r.peerId&&o.Z.activeScreen<=o._.medium&&document.body.classList.contains(n.ir))return this.selectTab(1,t),!1;if(s||o.Z.activeScreen!==o._.mobile){const i=yield r.setPeer(s,a,e.startParam),n=(null==i?void 0:i.cached)?i.promise:Promise.resolve();s&&Promise.all([n,r.setBackgroundPromise]).then((()=>{setTimeout((()=>{setTimeout((()=>{this.chatsSelectTab(this.chat.container)}),0),this.selectTab(1,t)}),0)}))}return s?void 0:(this.selectTab(0,t),!1)}))}setInnerPeer(e){var t;const{peerId:i}=e;if(i===m.NM||!i)return;e.threadId&&(e.type="discussion");const s=null!==(t=e.type)&&void 0!==t?t:e.type="chat",n=this.chats.findIndex((e=>e.peerId===i&&e.type===s));if(-1!==n)return this.spliceChats(n+1),this.setPeer(e);const a=this.chat;let o=a;return a.inited&&(o=this.createNewChat()),s&&(o.setType(s),e.threadId&&(o.threadId=e.threadId)),this.dispatchEvent("chat_changing",{from:a,to:o}),this.setPeer(e)}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let i="peer-typing";switch(t.classList.add(i),t.dataset.action=e._,e._){case"sendMessageTypingAction":i+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=i+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":i+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":i+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":i+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=i+"-eye",t.append(e)}}return t.classList.add(i),t}getPeerTyping(e,t){return kr(this,void 0,void 0,(function*(){const i=e.isUser();if(i&&(yield this.managers.appUsersManager.isBot(e)))return;const s=yield this.managers.appProfileManager.getPeerTypings(e);if(!(null==s?void 0:s.length))return;const n=s[0],a={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.User.EnjoyingAnimations"},chat:{sendMessageTypingAction:"Peer.Activity.Chat.TypingText",sendMessageUploadAudioAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.Chat.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.Chat.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.Chat.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.Chat.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.Chat.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.Chat.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.Chat.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.Chat.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.Chat.EnjoyingAnimations"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},o=i?a.private:s.length>1?a.multi:a.chat;let r=n.action;if(s.length>1){const e={};s.forEach((t=>{const i=t.action._;void 0===e[i]&&(e[i]=0),++e[i]})),Object.keys(e).length>1&&(r={_:"sendMessageTypingAction"})}const d=o[r._];if(!d)return;let l,c;if(e.isAnyChat()){const e=new R.Z;l=e.update({peerId:n.userId.toPeerId(!1),onlyFirstName:!0}),c=[e.element,s.length-1],yield l}t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===r._||"sendMessageEmojiInteractionSeen"===r._);let h=t.firstElementChild;if(h?h.dataset.action!==r._&&h.replaceWith(this.getTypingElement(r)):(h=this.getTypingElement(r),t.prepend(h)),"sendMessageEmojiInteractionSeen"===r._){c?c.pop():c=[];const e=(0,cr.Z)((0,D.Z)(r.emoticon));c.push(e)}const u=(0,S.ag)(d,c);return u.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(u):t.append(u),t}))}getChatStatus(e){return kr(this,void 0,void 0,(function*(){const t=yield this.getPeerTyping(e.toPeerId(!0));if(t)return{cached:!0,result:Promise.resolve(t)};const i=yield this.managers.acknowledged.appProfileManager.getChatFull(e),s=Promise.resolve(i.result).then((t=>kr(this,void 0,void 0,(function*(){var i,s;const n=t.participants_count||(null===(s=null===(i=t.participants)||void 0===i?void 0:i.participants)||void 0===s?void 0:s.length)||1;let a=yield(0,ra.Z)(e);if(n<2)return a;const o=yield this.managers.appProfileManager.getOnlines(e);if(o>1){const e=document.createElement("span");e.append(...(0,S.v_)([a,(0,S.ag)("OnlineCount",[(0,Ne.Z)(o)])],!1)),a=e}return a}))));return{cached:i.cached,result:s}}))}getUserStatus(e,t){var i;return kr(this,void 0,void 0,(function*(){const s={cached:!0,result:Promise.resolve(void 0)},n=yield this.managers.appUsersManager.getUser(e);if(!n||n.pFlags.self&&!t)return s;const a=(0,As.Z)(n);if(!n.pFlags.bot){let t=yield this.getPeerTyping(e.toPeerId());if(t||"userStatusOnline"!==(null===(i=n.status)||void 0===i?void 0:i._)||(t=document.createElement("span"),t.classList.add("online"),t.append(a)),t)return s.result=Promise.resolve(t),s}return s.result=Promise.resolve(a),s}))}getPeerStatus(e,t){return kr(this,void 0,void 0,(function*(){if(!e)return;let i;return i=e.isAnyChat()?this.getChatStatus(e.toChatId()):this.getUserStatus(e.toUserId(),t),i}))}setPeerStatus(e,t,i,s,n,a){return kr(this,void 0,void 0,(function*(){if(!i){const i=t.querySelector(".peer-typing-container");if(i&&(yield this.getPeerTyping(e,i)))return}const o=yield this.getPeerStatus(e,a);if(!n())return;const r=()=>kr(this,void 0,void 0,(function*(){const e=o&&(yield o.result);if(n())return()=>(0,O.Z)(t,e||d)})),d=s?"‎":"";return!o||o.cached?yield r():i?()=>(t.textContent=d,r().then((e=>e&&e()))):void 0}))}setChoosingStickerTyping(e){this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"})}}const xr=new Tr;he.GO&&(he.GO.appImManager=xr);const Ar=xr},3709:(e,t,i)=>{"use strict";function s(e){var t;return e&&!e.pFlags.is_outgoing&&!e.pFlags.noforwards&&!(null===(t=e.media)||void 0===t?void 0:t.extended_media)}i.d(t,{Z:()=>s})},7530:(e,t,i)=>{"use strict";function s(e){var t;if(!e)return;let i;if(e.action)i=e.action.photo;else if(e.media){let s=e.media;s.webpage?s=s.webpage:"messageExtendedMedia"===(null===(t=s.extended_media)||void 0===t?void 0:t._)&&(s=s.extended_media.media),i=s.photo||s.document}return i}i.d(t,{Z:()=>s})},2291:(e,t,i)=>{"use strict";function s(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}i.d(t,{Z:()=>s})},5381:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(677);function n(e){return!(!e.restriction_reason||!(0,s.X)(e.restriction_reason))}},5990:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});const s=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],n=["red","green","yellow","blue","violet","pink","cyan","orange"],a=[0,7,4,1,6,3,5];function o(e,t=!0){if(!e)return"";const i=a[Math.abs(+e)%7];return(t?n:s)[i]}},7030:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9897),n=i(1507);function a(e,t=0,i=0,a=!1,o=!1){window.devicePixelRatio>1&&(t*=2,i*=2);let r=e.sizes||e.thumbs,d={_:"photoSizeEmpty",type:n.Pt};if(o&&r&&"photo"!==e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:n.Pt})),null==r?void 0:r.length){for(let e=0,n=r.length;e=t||a.height>=i)break}a&&"photoSizeEmpty"===d._&&"photoStrippedSize"===r[0]._&&(d=r[0])}return d}},3075:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5953),n=i(5003),a=i(6752);class o{constructor(e){var t;(0,s.Z)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||(0,n.kg)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=(0,n.kg)("RTCPeerConnection")),t("constructor");const i=new RTCPeerConnection(e);return i.addEventListener("track",(e=>{t("ontrack",e)})),i.addEventListener("signalingstatechange",(()=>{t("onsignalingstatechange",i.signalingState)})),i.addEventListener("connectionstatechange",(()=>{t("onconnectionstatechange",i.connectionState)})),i.addEventListener("negotiationneeded",(()=>{t("onnegotiationneeded",i.signalingState)})),i.addEventListener("icecandidate",(e=>{t("onicecandidate",e)})),i.addEventListener("iceconnectionstatechange",(()=>{t("oniceconnectionstatechange",i.iceConnectionState)})),i.addEventListener("datachannel",(()=>{t("ondatachannel")})),i.log=t,{connection:i}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,i){i||(i=(0,n.kg)("RTCDataChannel"));const s=e.createDataChannel("data",t);return s.addEventListener("message",(e=>{i("onmessage",e)})),s.addEventListener("open",(()=>{i("onopen")})),s.addEventListener("close",(()=>{i("onclose")})),s.log=i,s}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new a.ZP(this.connection))}appendStreamToConference(){return this.streamManager.appendToConference(this.description)}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.streamManager.stop()}negotiate(){return this.negotiating||(this.negotiating=this.negotiateInternal().finally((()=>{this.negotiating=void 0})))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}},2069:(e,t,i)=>{"use strict";i.d(t,{Z:()=>N});var s=i(6761),n=i(4762),a=i(5953),o=i(5701),r=i(671),d=i(5003),l=i(3855),c=i(3075),h=i(3773);function u(e){const t=(0,h.Z)(e,e.media[0]),i={"@type":"InitialSetup",fingerprints:[t.fingerprint],ufrag:t.ufrag,pwd:t.pwd,audio:void 0,video:void 0,screencast:void 0},s=e=>""+e;for(const t of e.media){const n=t.mediaType;if("application"===n||!t.isSending)continue;const a=i["video"===n&&i.video?"screencast":n]={},o=(0,h.Z)(e,t);a.ssrc=s(o.source),o.sourceGroups&&(a.ssrcGroups=o.sourceGroups.map((e=>({semantics:e.semantics,ssrcs:e.sources.map(s)}))));const r=a.rtpExtensions=[];t.attributes.get("extmap").forEach((e=>{r.push({id:+e.key,uri:e.value})}));const d=new Map,l=e=>{let t=d.get(e);return t||d.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach((e=>{const t=+e.key,i=l(t),s=e.value.split("/"),[n,a,o]=s;i.name=n,i.clockrate=+a,i.channels=o?+o:0})),t.attributes.get("rtcp-fb").forEach((e=>{const t=+e.key;l(t).feedbackTypes=e.lines.map((e=>{const t=e.split(" "),[i,s]=t;return{type:i,subtype:s||""}}))})),t.attributes.get("fmtp").forEach((e=>{const t=+e.key,i=l(t).parameters={},s=e.value.split(";");for(const e of s){const[t,s]=e.split("=");i[t]=s}})),a.payloadTypes=Array.from(d.values())}return i}var f=i(9124);class p extends c.Z{constructor(e){super(e)}negotiateInternal(){return e=this,t=void 0,s=function*(){const{connection:e,call:t}=this;if(!e.localDescription&&!e.remoteDescription&&!t.isOutgoing)return;let i;if(t.offerReceived){t.offerReceived=!1;const s=i=yield e.createAnswer();this.log("[sdp] local",s.type,s.sdp),yield e.setLocalDescription(s),this.log("[InitialSetup] send 2")}else{const s=i=yield e.createOffer();this.log("[sdp] local",s.sdp),yield e.setLocalDescription(s),t.offerSent=!0,this.log("[InitialSetup] send 0")}const s=u((0,f.DV)(i.sdp));t.sendCallSignalingData(s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var m=i(8500),g=i(2493),v=i(3335),b=i(1677),y=i(49),w=i(6752),S=i(4903);const C="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var L=i(3692),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class I{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return t=(0,S.Z)(...e),C.digest("SHA-256",(0,L.Z)(t)).then((e=>new Uint8Array(e)));var t}encryptPrepared(e){return E(this,void 0,void 0,(function*(){const t={counter:0,bytes:new Uint8Array(16+e.length)},i=(this.isOutgoing?0:8)+("Signaling"===this.type?128:0),s=this.p2pKey,n=yield this.concatSHA256([s.subarray(i+88,i+88+32),e]),a=t.bytes;for(let e=0;e<16;++e)a[e]=n[e+8];const o=yield this.prepareAesKeyIv(s,a,i),r=yield this.aesProcessCtr(e,e.length,o,!0);return t.bytes=new Uint8Array([...t.bytes.subarray(0,16),...r]),t}))}encryptRawPacket(e){const t=++this.counter,i=new ArrayBuffer(4);new DataView(i).setUint32(0,t>>>0,!1);const s=new Uint8Array([...new Uint8Array(i),...e]);return this.encryptPrepared(s)}prepareAesKeyIv(e,t,i){return E(this,void 0,void 0,(function*(){const[s,n]=yield Promise.all([this.concatSHA256([t.subarray(0,16),e.subarray(i,i+36)]),this.concatSHA256([e.subarray(40+i,40+i+36),t.subarray(0,16)])]);return{key:new Uint8Array([...s.subarray(0,8),...n.subarray(8,24),...s.subarray(24,32)]),iv:new Uint8Array([...n.subarray(0,4),...s.subarray(8,16),...n.subarray(24,28)])}}))}aesProcessCtr(e,t,i,s=!0){return E(this,void 0,void 0,(function*(){const t=yield C.importKey("raw",i.key,{name:"AES-CTR"},!1,[s?"encrypt":"decrypt"]),n=yield C[s?"encrypt":"decrypt"]({name:"AES-CTR",counter:i.iv,length:8*i.iv.length},t,e);return new Uint8Array(n)}))}constTimeIsDifferent(e,t,i){let s=!0;for(let n=0;n134217728)return;const{isOutgoing:t,type:i}=this,s=(t?8:0)+("Signaling"===i?128:0),n=this.p2pKey,a=e.subarray(0,16),o=e.subarray(16),r=e.length-16,d=yield this.prepareAesKeyIv(n,a,s),l=yield this.aesProcessCtr(o,r,d,!1),c=yield this.concatSHA256([n.subarray(88+s,88+s+32),l]);if(this.constTimeIsDifferent(c.subarray(8),a,16))return;const h=new DataView(l.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),l.slice(4))}))}}var M=i(630);class P{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="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",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));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",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="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",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));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",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}}class Z{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="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+=A(l),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);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+=A(l),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="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+=A(h),r+="\na=rtcp-mux",r+=_(l),r+=F(i,n,a,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${l.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(l),r+=F(i,n,a,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}class k{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="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+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);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+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="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+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);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+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}function T(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function x(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function A(e){let t=[];for(let i=0;i{const{type:i,subtype:s}=e;t.push(`a=rtcp-fb:${n} ${[i,s].join(" ")}`)})),l){const e=[];Object.getOwnPropertyNames(l).forEach((t=>{e.push(`${t}=${l[t]}`)})),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function F(e,t,i,s){let n=[];return i&&i.length>0?i.forEach((t=>{t&&t.ssrcs.length>0&&(n.push(`a=ssrc-group:${t.semantics} ${t.ssrcs.join(" ")}`),t.ssrcs.forEach((t=>{n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`)})))})):t&&n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`),n.join("\n")}class D{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:i,sdpMid:s,foundation:n,component:a,protocol:o,priority:r,address:d,type:l,relAddress:c,generation:h,tcpType:u,networkId:f,networkCost:p,username:m}=e;if(t)return{candidate:t,sdpMLineIndex:i,sdpMid:s};throw"no sdpString"}static generateOffer(e){return T()?Z.generateOffer(e):x()?k.generateOffer(e):P.generateOffer(e)}static generateAnswer(e){return T()?Z.generateAnswer(e):x()?k.generateAnswer(e):P.generateAnswer(e)}}var R=i(9585),B=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class N extends m.Z{constructor(e){super(),this.log=(0,d.kg)("CALL"),this.protocol||(this.protocol={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}),(0,a.Z)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",(e=>{this.log("state",v.Z[e]),e===v.Z.CLOSED&&this.cleanup()}));const t=this.streamManager=new R.Z(b.iK);t.direction="sendrecv",t.types.push("screencast"),this.isOutgoing||(t.locked=!0,t.canCreateConferenceEntry=!1);let i={"@type":"MediaState",type:"input",lowBattery:!1,muted:!0,screencastState:"inactive",videoRotation:0,videoState:"inactive"};const s=this;i=new Proxy(i,{set:function(e,t,n){return e[t]=n,s.setMediaState(i),s.sendMediaState(),!0}}),this.mediaStates={input:i},this.sendMediaState=(0,o.Z)(this._sendMediaState.bind(this),0,!1,!0)}get connectionState(){const{_connectionState:e,connectionInstance:t}=this;if(void 0!==e)return e;if(t){const{iceConnectionState:e}=t.connection;return"closed"===e?v.Z.CLOSED:"connected"===e||n.IS_SAFARI&&"completed"===e?v.Z.CONNECTED:v.Z.CONNECTING}return v.Z.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(v.Z.CLOSED-e+1);return t+=2147483647e3-(e===v.Z.PENDING&&this.isOutgoing?0:this.createdAt),t}getVideoElement(e){if("input"===e)return this.elements.get("main");{const e=this.getMediaState("output");if(!e)return;const t="active"===e.videoState?"video":"active"===e.screencastState?"screencast":void 0;if(!t)return;const i=this.description.findEntry((e=>e.type===t));if(!i)return;return this.elements.get(""+i.recvEntry.source)}}startScreenSharingInternal(){return B(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 B(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return B(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 B(this,void 0,void 0,(function*(){const e=this.getMediaState("input");e.videoState=e.screencastState="inactive";const{streamManager:t,description:i}=this,s=t.inputStream.getVideoTracks()[0];s&&((0,y.Z)(s),t.appendToConference(i))}))}toggleVideoSharing(){return B(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===v.Z.CLOSING||e===v.Z.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=s.Z.setTimeout((()=>{this.hangUpTimeout=void 0,this.hangUp(t)}),e)}clearHangUpTimeout(){void 0!==this.hangUpTimeout&&(clearTimeout(this.hangUpTimeout),this.hangUpTimeout=void 0)}setPhoneCall(e){this.call=e;const{id:t}=e;if(this.id!==t){const e=this.id;this.id=t,this.dispatchEvent("id",t,e)}}acceptCall(){var e;return B(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(v.Z.EXCHANGING_KEYS);const i=this.call;this.requestInputSource(!0,!!i.pFlags.video,!1);const s=i.g_a_hash;this.managers.appCallsManager.generateDh().then((e=>B(this,void 0,void 0,(function*(){return this.dh={g_a_hash:s,b:e.a,g_b:e.g_a,g_b_hash:e.g_a_hash,p:e.p},this.managers.apiManager.invokeApi("phone.acceptCall",{peer:yield this.managers.appCallsManager.getCallInput(this.id),protocol:this.protocol,g_b:this.dh.g_b})})))).then((e=>B(this,void 0,void 0,(function*(){yield this.managers.appCallsManager.savePhonePhoneCall(e)})))).catch((e=>{this.log.error("accept call error",e),this.hangUp("phoneCallDiscardReasonHangup")}))}))}joinCall(){this.log("joinCall"),this.getEmojisFingerprint(),this.overrideConnectionState();const{isOutgoing:e,encryptionKey:t,streamManager:i}=this,s=function(e){const t=[];return e.connections.forEach((e=>{switch(e._){case"phoneConnectionWebrtc":{const{ip:i,ipv6:s,port:n,username:a,password:o}=e,r=[];e.pFlags.turn?(i&&r.push(`turn:${i}:${n}`),s&&r.push(`turn:[${s}]:${n}`)):e.pFlags.stun&&(i&&r.push(`stun:${i}:${n}`),s&&r.push(`stun:[${s}]:${n}`)),r.length>0&&t.push({urls:r,username:a,credential:o});break}}})),{iceServers:t,iceTransportPolicy:e.pFlags.p2p_allowed?"all":"relay"}}(this.call);if(this.log("joinCall configuration",s),!s)return;const n=this.connectionInstance=new p({call:this,streamManager:i,log:this.log.bindPrefix("connection")}),a=n.createPeerConnection(s);a.addEventListener("iceconnectionstatechange",(()=>{const e=this.connectionState;void 0===this.connectedAt&&e===v.Z.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 I(e,t),this.decryptor=new I(!e,t),this.log("currentCall",this),e&&n.appendStreamToConference(),this.createDataChannel(),this.processDecryptQueue()}createDataChannelEntry(){const e=this.description.createEntry("application");e.setDirection("sendrecv"),e.sendEntry=e.recvEntry=e}createDataChannel(){if(this.connectionInstance.dataChannel)return;const e=this.connectionInstance.createDataChannel({id:0,negotiated:!0});e.addEventListener("message",(e=>{this.applyDataChannelData(JSON.parse(e.data))})),e.addEventListener("open",(()=>{this.sendMediaState()}))}applyDataChannelData(e){"MediaState"===e["@type"]?(e.type="output",this.log("got output media state",e),this.setMediaState(e)):this.log.error("unknown data channel data:",e)}_sendMediaState(){const{connectionInstance:e}=this;if(!e)return;const t=Object.assign({},this.getMediaState("input"));delete t.type,this.log("sendMediaState",t),e.sendDataChannelData(t)}sendCallSignalingData(e){return B(this,void 0,void 0,(function*(){const t=JSON.stringify(e),i=(new TextEncoder).encode(t),{bytes:s}=yield this.encryptor.encryptRawPacket(i);this.log("sendCallSignalingData",this.id,t),yield this.managers.apiManager.invokeApi("phone.sendSignalingData",{peer:yield this.managers.appCallsManager.getCallInput(this.id),data:s})}))}sendIceCandidate(e){this.log("sendIceCandidate",e);const{candidate:t,sdpMLineIndex:i}=e;if(0!==i)return;const s=function(e){if(!e||!e.startsWith("candidate:"))return;const t=e;e=e.substr("candidate:".length);const[i,s,n,a,o,r,...d]=e.split(" "),l={sdpString:t,foundation:i,component:s,protocol:n,priority:a,address:{ip:o,port:r}};for(let e=0;e(this.getEmojisFingerprintPromise=void 0,this.emojisFingerprint=e.map((e=>(0,r.zu)(e))))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return B(this,void 0,void 0,(function*(){this.connectionInstance.appendStreamToConference();const e=this.connectionInstance.connection;let t=yield e.createAnswer();this.log("[sdp] local",t.type,t.sdp),yield e.setLocalDescription(t),e.getTransceivers().filter((e=>"recvonly"===e.direction)).forEach((e=>{const t=this.connectionInstance.description.getEntryByMid(e.mid);t.transceiver=t.recvEntry.transceiver=e,e.direction="sendrecv"}));const i=this.description,s=i.entries.map((e=>e.mid)),n={type:"offer",sdp:i.generateSdp({bundle:s,entries:i.entries.filter((e=>s.includes(e.mid))),isAnswer:!0})};yield e.setRemoteDescription(n),t=yield e.createAnswer(),yield e.setLocalDescription(t);const a=u((0,f.DV)(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 B(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(v.Z.CLOSED),this.connectionInstance&&this.connectionInstance.closeConnectionAndStream(!0),e&&!t)){let t=!1;for(const e in this.mediaStates){const i=this.mediaStates[e];t="active"===i.videoState||"active"===i.screencastState||t}yield this.managers.appCallsManager.discardCall(this.id,this.duration,e,t)}}))}performCodec(e){const t=e.payloadTypes.map((e=>Object.assign(Object.assign({},e),{"rtcp-fbs":e.feedbackTypes})));return{"rtp-hdrexts":e.rtpExtensions,"payload-types":t}}setDataToDescription(e){this.description.setData({transport:{pwd:e.pwd,ufrag:e.ufrag,fingerprints:e.fingerprints,"rtcp-mux":!0},audio:this.performCodec(e.audio),video:e.video?this.performCodec(e.video):void 0,screencast:e.screencast?this.performCodec(e.screencast):void 0})}filterNotVP8(e){this.isOutgoing||[e.video,e.screencast].filter(Boolean).forEach((e=>{const t=e.payloadTypes,i=t.findIndex((e=>"VP8"===e.name)),s=t[i],n=t.findIndex((e=>{var t;return+(null===(t=e.parameters)||void 0===t?void 0:t.apt)===s.id}));e.payloadTypes=[t[i],t[n]]}))}applyCallSignalingData(e){return B(this,void 0,void 0,(function*(){this.log("applyCallSignalingData",this,e);const{connection:t,description:i}=this.connectionInstance;switch(e["@type"]){case"InitialSetup":{this.log("[sdp] InitialSetup",e),this.filterNotVP8(e),this.setDataToDescription(e);const s=e=>e.map((e=>({_:"groupCallParticipantVideoSourceGroup",semantics:e.semantics,sources:e.ssrcs.map((e=>+e))})));[(0,w.z_)("audio",+e.audio.ssrc),e.video?(0,w.z_)("video",s(e.video.ssrcGroups)):void 0,e.screencast?(0,w.z_)("screencast",s(e.screencast.ssrcGroups)):void 0].filter(Boolean).forEach((e=>{let t=i.getEntryBySource(e.source);if(t)return;const s=i.findFreeSendRecvEntry(e.type,!1);t=new w.Lp(s.mid,e.type),t.setDirection("sendrecv"),s.recvEntry=t,i.setEntrySource(t,e.sourceGroups||e.source)})),this.createDataChannelEntry();const n=this.offerSent;this.offerSent=!1;const a=i.entries.map((e=>e.mid)),o={type:n?"answer":"offer",sdp:i.generateSdp({bundle:a,entries:i.entries.filter((e=>a.includes(e.mid))),isAnswer:!n})};this.log("[sdp] remote",o.sdp),yield t.setRemoteDescription(o),yield this.tryToReleaseCandidates(),n||(yield this.doTheMagic());break}case"Candidates":for(const t of e.candidates){const e=D.generateCandidate(t);e.sdpMLineIndex=0;const i=new RTCIceCandidate(e);this.candidates.push(i)}yield this.tryToReleaseCandidates();break;default:this.log.error("unrecognized signaling data",e)}}))}tryToReleaseCandidates(){return B(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 B(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 B(this,void 0,void 0,(function*(){const{encryptor:e}=this;if(!e)return void this.log.warn("got encrypted signaling data before the encryption key");if(!this.decryptQueue.length)return;const t=this.decryptQueue.slice();this.decryptQueue.length=0;for(const i of t){const t=yield e.decryptRawPacket(i);if(!t)continue;const s=(new TextDecoder).decode(t);try{const e=JSON.parse(s);this.log("[update] updateNewCallSignalingData",e),this.applyCallSignalingData(e)}catch(e){this.log.error("wrong signaling data",s),this.hangUp("phoneCallDiscardReasonDisconnect"),g.Z.dispatchEvent("incompatible",this.interlocutorUserId)}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e),this.processDecryptQueue()}}},8500:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(3241),n=i(319),a=i(9125),o=i(9337),r=i(382),d=i(5424);function l(){const e={main:{},screen:{}};return t=>{return i=this,s=void 0,a=function*(){const{isScreen:i,constraints:s}=t,n=e[i?"screen":"main"];let a=n[s.audio?"audio":"video"];a||(a=(i?r.Z:d.Z)(s,t.muted),s.audio&&!n.audio&&(n.audio=a.finally((()=>n.audio=void 0))),s.video&&!n.video&&(n.video=a.finally((()=>n.video=void 0))));try{return yield a}catch(e){throw e}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}window.getStreamCached=l;var c=i(312),h=i(49),u=i(9585);class f extends s.Z{constructor(){super(!1);const e=this.player=document.createElement("div");e.classList.add("call-player"),e.style.display="none",document.body.append(e),this.elements=new Map;const t=this.audio=new Audio;t.autoplay=!0,t.volume=1,this.player.append(t),this.elements.set("audio",t),this.fixSafariAudio(),this.getStream=l()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(n.Z)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,i){const{streamManager:s}=this;if(s){const i=!e||this.isSharingAudio,s=!t||this.isSharingVideo;if(i&&s)return Promise.resolve()}const n={audio:e&&(0,a.Z)(),video:t&&(0,c.Z)()};return this.getStream({constraints:n,muted:i}).then((e=>{this.onInputStream(e)}))}requestScreen(){return this.getStream({isScreen:!0,constraints:(0,o.Z)(!0)}).then((e=>{this.onInputStream(e)}))}getElement(e){return this.elements.get(""+e)}cleanup(){this.player.textContent="",this.player.remove(),this.elements.clear(),this.streamManager.stop(),super.cleanup()}onTrack(e){this.tryAddTrack({stream:e.streams[0],track:e.track,type:"output"})}saveInputVideoStream(e,t){const i=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:i,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:i,source:s}){s||(s=u.Z.getSource(e,i)),this.log("tryAddTrack",e,t,i,s);const a="output"===i,{player:o,elements:r,streamManager:d}=this,l=t.kind,c="video"===l,h=c?s:l;let f=r.get(h);c&&t.addEventListener("ended",(()=>{this.log("[track] onended"),r.delete(h)}),{once:!0}),a&&d.addTrack(e,t,i);const p=c?e:d.outputStream;if(f)f.paused&&f.play().catch(n.Z),f.srcObject=p;else{if(f=document.createElement(l),f.autoplay=!0,f.srcObject=p,f.volume=1,"undefined"!==f.sinkId){const{outputDeviceId:e}=this;e&&f.setSinkId(e)}c?(f.setAttribute("playsinline","true"),f.muted=!0):o.appendChild(f),r.set(h,f)}return s}setMuted(e){this.streamManager.inputStream.getAudioTracks().forEach((t=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=void 0===e?!t.enabled:!e)}))}onInputStream(e){if(this.isClosing)e.getTracks().forEach((e=>{(0,h.Z)(e)}));else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:i}=this;t.addStream(e,"input"),i&&t.appendToConference(i)}}}},3335:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),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"}(s||(s={}));const n=s},2493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(5916);let n;var a=i(410),o=i(993),r=i(1655),d=i(6519),l=i(9895),c=i(3241),h=i(7298),u=i(5003),f=i(3855),p=i(1507),m=i(3512),g=i(2069),v=i(3335),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const y=45e3;class w extends c.Z{construct(e){this.managers=e,this.log=(0,u.kg)("CC"),o.Z&&(this.audioAsset=null!=n?n:n=new s.Z(["call_busy.mp3","call_connect.mp3","call_end.mp3","call_incoming.mp3","call_outgoing.mp3","voip_failed.mp3"]),this.tempId=0,this.instances=new Map,this.sortedInstances=[],m.Z.addEventListener("call_update",(e=>b(this,void 0,void 0,(function*(){var t;let i=this.instances.get(e.id);switch(i&&i.setPhoneCall(e),e._){case"phoneCallDiscarded":i&&i.hangUp(null===(t=e.reason)||void 0===t?void 0:t._,!0);break;case"phoneCallAccepted":i&&i.confirmCall();break;case"phoneCallRequested":i||(i=this.createCallInstance({isOutgoing:!1,interlocutorUserId:e.admin_id}),i.overrideConnectionState(v.Z.PENDING),i.setPhoneCall(e),i.setHangUpTimeout(y,"phoneCallDiscardReasonMissed"));break;case"phoneCall":{if(!i||i.encryptionKey)break;const t=i.dh.g_a=e.g_a_or_b,s=i.dh,n=yield f.Z.invokeCrypto("sha256",t);if(!(0,l.Z)(s.g_a_hash,n)){this.log.error("Incorrect g_a_hash",s.g_a_hash,n);break}const{key:a,key_fingerprint:o}=yield this.managers.appCallsManager.computeKey(t,s.b,s.p);if(e.key_fingerprint!==o){this.log.error("Incorrect key fingerprint",e.key_fingerprint,o,t,s),i.hangUp("phoneCallDiscardReasonDisconnect");break}i.encryptionKey=a,i.joinCall();break}}})))),m.Z.addEventListener("call_signaling",(({callId:e,data:t})=>{const i=this.instances.get(e);(null==i?void 0:i.id)===e&&i.onUpdatePhoneCallSignalingData(t)})))}get currentCall(){return this.sortedInstances[0]}getCallByUserId(e){for(const[t,i]of this.instances)if(i.interlocutorUserId===e)return i}createCallInstance(e){const t=new g.Z(Object.assign({managers:this.managers},e));return t.addEventListener("state",(e=>{const i=this.currentCall;e===v.Z.CLOSED?(this.instances.delete(t.id),(0,r.Z)(this.sortedInstances,t)):(0,d.Z)(this.sortedInstances,t,"sortIndex"),e===v.Z.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const s=void 0!==t.connectedAt;e===v.Z.EXCHANGING_KEYS||e===v.Z.CONNECTING&&s?t.setHangUpTimeout(y,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),i!==t&&i||(e===v.Z.CLOSED?t.isOutgoing||t.wasTryingToJoin?t.wasTryingToJoin&&!s?this.audioAsset.playSound("voip_failed.mp3"):this.audioAsset.playSound("phoneCallDiscardReasonBusy"===t.discardReason?"call_busy.mp3":"call_end.mp3"):this.audioAsset.stopSound():e===v.Z.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===v.Z.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===v.Z.CONNECTING?t.duration&&this.audioAsset.playSound("voip_connecting.mp3",!0):this.audioAsset.stopSound())})),t.addEventListener("id",((e,i)=>{void 0!==i&&this.instances.delete(i);const s=!!this.currentCall;this.instances.set(e,t),void 0===i&&this.dispatchEvent("instance",{instance:t,hasCurrent:s})})),t}startCallInternal(e,t){return b(this,void 0,void 0,(function*(){this.log("p2pStartCallInternal",e,t);const i=yield this.managers.appProfileManager.getProfile(e);if(!i)return;const{video_calls_available:s}=i.pFlags,n=this.createCallInstance({isOutgoing:!0,interlocutorUserId:e});n.requestInputSource(!0,!(!t||!s),!1),n.overrideConnectionState(v.Z.REQUESTING),n.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:p.NM,date:(0,h.Z)(!0),id:--this.tempId,participant_id:e,protocol:n.protocol,pFlags:{video:t||void 0}}),this.managers.appCallsManager.generateDh().then((i=>b(this,void 0,void 0,(function*(){return n.dh=i,this.managers.appCallsManager.requestCall(e,n.protocol,n.dh.g_a_hash,t&&s)})))).then((e=>{n.overrideConnectionState(v.Z.PENDING),n.setPhoneCall(e),n.setHangUpTimeout(y,"phoneCallDiscardReasonHangup")}))}))}}const S=new w;a.GO&&(a.GO.callsController=S);const C=S},1677:(e,t,i)=>{"use strict";i.d(t,{KM:()=>s,iK:()=>n});const s=50,n=100},9078:(e,t,i)=>{"use strict";i.d(t,{Z:()=>T});var s=i(4762),n=i(1655),a=i(5953),o=i(6724),r=i(5003),d=i(1507),l=i(3512),c=i(8500),h=i(7625),u=i(3075),f=i(8479),p=i(6752),m=i(9124),g=i(4373),v=i(3773),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class y extends u.Z{constructor(e){super(e),this.negotiateThrottled=(0,o.Z)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||super.createPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0})}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=super.createDataChannel();return e.addEventListener("open",(()=>{this.maybeUpdateRemoteVideoConstraints()})),e.addEventListener("close",(()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)})),e}createDescription(){return this.description?this.description:super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,i){return b(this,void 0,void 0,(function*(){const{groupCall:s,description:n}=this,a=s.id,o=t.map((t=>{const i=function(e,t){const i=(0,v.Z)(e,t),s=t.mediaType,n={source:i.source,sourceGroups:i.sourceGroups,type:s};i.fingerprint.setup="active";const a={fingerprints:[i.fingerprint],pwd:i.pwd,ssrc:i.source,"ssrc-groups":i.sourceGroups||[],ufrag:i.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(a)},source:i.source,media:t,sourceGroups:i.sourceGroups,entry:n}}(e,t);return this.sources[i.entry.type]=i.entry,i})),r=o.find((e=>"audio"===e.media.mediaType)),d=o.find((e=>"video"===e.media.mediaType));let{source:c,params:u}=r||{};const f=d||r,p={audio:r,video:d};if(n.entries.forEach((e=>{if("sendonly"===e.direction){const t=p[e.type];if(!t)return;n.setEntrySource(e,t.sourceGroups||t.source),n.setEntryPeerId(e,l.Z.myId)}})),u!==f.params){const e=JSON.parse(f.params.data);c?e.ssrc=c:delete e.ssrc,u={_:"dataJSON",data:JSON.stringify(e)}}const m=yield this.managers.appGroupCallsManager.joinGroupCall(a,u,i),g=JSON.parse(m.params.data);return g.audio=g.audio||s.connections.main.description.audio,n.setData(g),function(e,t){["audio","video"].filter((e=>t[e])).map((e=>[t[e],e])).forEach((([t,i])=>{const s=e.find((e=>e.mediaType===i));if(!s)return;const n=(e=>{const t={};return e.attributes.get("extmap").forEach((e=>{const i=e.key.split("/",1)[0];t[i]=e.value})),t})(s);(0,h.Z)(t["rtp-hdrexts"],((e,t,s)=>{n[e.id]!==e.uri&&(s.splice(t,1),console.log("[sdp] filtered extmap:",e,t,i))}))}))}(t,g),g}))}negotiateInternal(){return b(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,i="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,s=this.log.bindPrefix("startNegotiation");s("start");const n=yield e.createOffer({iceRestart:!1});i&&this.dataChannel&&t.createEntry("application").setDirection("sendrecv");const{sdp:a,offer:o}=function(e){const{offer:t,data:i}=e,s=(0,m.DV)(t.sdp);let n=!1;if(e.skipAddingMulticast||(n=(0,m.e6)(s)||n),(0,h.Z)(s.media,((e,t,a)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,r=o.mediaLineParts,d=(r.ids,o.toString()),l=i[e.mediaType]["payload-types"].map((e=>""+e.id));if(d!==(0,g.Px)(e.mediaType,void 0,l)){const o=(0,v.Z)(s,e),d=Object.assign({},i);d.transport=(0,f.Z)(d.transport),d.transport.ufrag=o.ufrag,d.transport.pwd=o.pwd,d.transport.fingerprints=[o.fingerprint],d.transport.candidates=[];const l=new p.Lp(o.mid,r.type);l.setPort(r.port),o.source&&l.setSource(o.sourceGroups||o.source),l.setDirection(e.direction);const c=(new g.DY).addSsrcEntry(l,d).finalize(),h=(0,m.DV)(c).media[0];a[t]=h,n=!0}})),n){const e=s.toString();t.sdp=e}return{offer:t,sdp:s}}({offer:n,data:t});s("[sdp] setLocalDescription",o.sdp),yield e.setLocalDescription(o);const r=a.media.filter((e=>"application"!==e.mediaType&&e.isSending));if(i)try{yield this.invokeJoinGroupCall(a,r,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],l=a.bundle;(0,h.Z)(l,((e,i,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(i,1),d.push(n))}));const c=a.media.map((e=>{const i=e.mid;let s=t.getEntryByMid(i);return s||(s=new p.Lp(i,e.mediaType),s.setDirection("inactive")),s})),u={type:"answer",sdp:t.generateSdp({bundle:l,entries:c,isAnswer:!0})};d.forEach((e=>{t.deleteEntry(e)})),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,u.sdp),yield e.setRemoteDescription(u),s("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then((()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1})),"presentation"===this.options.type&&e.then((()=>{this.connection.getTransceivers().find((e=>{var t,i;"video"===(null===(i=null===(t=e.sender)||void 0===t?void 0:t.track)||void 0===i?void 0:i.kind)&&e.sender.setParameters(Object.assign(Object.assign({},e.sender.getParameters()),{degradationPreference:"maintain-resolution"}))}))})),e)}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:i}=t;e.onStageEndpoints.push(i),e.constraints[i]={minHeight:180,maxHeight:720}}this.sendDataChannelData(e),e.onStageEndpoints.length?this.updateConstraintsInterval||(this.updateConstraintsInterval=window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this),5e3)):this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}addInputVideoStream(e){this.groupCall.saveInputVideoStream(e,this.type),this.streamManager.addStream(e,"input"),this.appendStreamToConference()}}var w=i(2207),S=i(9337),C=i(382),L=i(5424),E=i(312),I=i(49),M=i(9585),P=i(2946),Z=i(2059),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class T extends c.Z{constructor(e){super(),(0,a.Z)(this,e),this.log||(this.log=(0,r.kg)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=(0,o.Z)((()=>{this.dispatchEvent("pinned",this.pinnedSource)}),0,!1),this.addEventListener("state",(e=>{e===w.Z.CLOSED&&this.cleanup()}))}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return w.Z.CLOSED;if("connected"===e||s.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?w.Z.MUTED:w.Z.UNMUTED:w.Z.MUTED_BY_ADMIN}return w.Z.CONNECTING}get participants(){return this.managers.appGroupCallsManager.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==w.Z.UNMUTED}get isClosing(){const{state:e}=this;return e===w.Z.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){(0,n.Z)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),(0,n.Z)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return k(this,void 0,void 0,(function*(){return d.NM===e?this.participant:(yield this.participants).get(e)}))}toggleMuted(){return this.requestAudioSource(!0).then((()=>this.changeUserMuted(d.NM)))}changeUserMuted(e,t){return k(this,void 0,void 0,(function*(){const i=yield this.getParticipantByPeerId(e);return d.NM===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(i,{muted:t})}))}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let i;i=e.pFlags.self?"video"===t?"main":"presentation":e[t].source_groups[0].sources[0];const s=this.getElement(i);if(!s)return;const n=s.cloneNode();return n.srcObject=s.srcObject,{video:n,source:i}}createConnectionInstance(e){return this.connections[e.type]=new y(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type),managers:this.managers},e))}changeRaiseHand(e){return this.editParticipant(this.participant,{raiseHand:e})}startScreenSharingInternal(){return k(this,void 0,void 0,(function*(){try{const e="presentation",t=yield(0,C.Z)((0,S.Z)()),i=new M.Z,s=this.createConnectionInstance({streamManager:i,type:e,options:{type:e}});s.createPeerConnection().addEventListener("negotiationneeded",(()=>{s.negotiate()})),t.getVideoTracks()[0].addEventListener("ended",(()=>{this.connections.presentation&&this.stopScreenSharing()}),{once:!0}),s.createDescription(),s.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){var e;return null!==(e=this.startScreenSharingPromise)&&void 0!==e?e:this.startScreenSharingPromise=this.startScreenSharingInternal().finally((()=>{this.startScreenSharingPromise=void 0}))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,this.managers.appGroupCallsManager.saveApiParticipant(this.id,this.participant),this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id)):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return k(this,void 0,void 0,(function*(){const e={video:(0,E.Z)()};try{const t=yield(0,L.Z)(e,!1);this.connections.main.addInputVideoStream(t),yield this.editParticipant(this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){var e;return null!==(e=this.startVideoSharingPromise)&&void 0!==e?e:this.startVideoSharingPromise=this.startVideoSharingInternal().finally((()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return k(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&((0,I.Z)(t),e.streamManager.appendToConference(e.description),yield this.editParticipant(this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,i=!1){return k(this,void 0,void 0,(function*(){for(const e in this.connections)this.connections[e].closeConnectionAndStream(!t);if(this.dispatchEvent("state",this.state),!i&&!t){const t=e||(this.joined?this.connections.main.sources.audio.source:void 0);this.managers.appGroupCallsManager.hangUp(this.id,t)}}))}tryAddTrack(e){const{description:t}=this,i=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+i);this.getParticipantByPeerId(e.peerId).then((e=>{e&&l.Z.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:e})}))}return i}editParticipant(e,t){return k(this,void 0,void 0,(function*(){if(Object.keys(t).length){if(e){const i=e.pFlags.self;if(i&&void 0!==t.muted&&!this.isSharingAudio&&(delete t.muted,!Object.keys(t).length))return;const s=t.muted;void 0!==s&&e.pFlags.self&&(s?e.pFlags.muted=!0:e.pFlags.can_self_unmute&&delete e.pFlags.muted),void 0!==t.raiseHand&&(t.raiseHand?e.raise_hand_rating="1":delete e.raise_hand_rating),i&&(void 0!==t.videoStopped&&(t.videoStopped?delete e.video:e.video=(0,Z.KR)(this.connections.main.sources.video)),!e.pFlags.muted&&e.pFlags.can_self_unmute&&this.setMuted(!1),this.dispatchEvent("state",this.state))}return this.managers.appGroupCallsManager.editParticipant(this.id,e,t)}}))}onParticipantUpdate(e,t){const i=this.connections.main,{connection:s,description:n}=i,a=(0,P.Z)(e.peer),o=!!e.pFlags.left,r=this.participantsSsrcs.get(a)||[];if(e.presentation&&!o){const{source:t}=(0,Z._f)(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,i.sources.audio.source!==e.source&&this.hangUp();let s=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(s=!0):(this.stopScreenSharing(),this.stopVideoSharing(),s=!0),s&&this.setMuted(!0),void(t!==a&&this.dispatchEvent("state",this.state))}const d=o?[]:(0,Z.s$)(e);o?this.participantsSsrcs.delete(a):this.participantsSsrcs.set(a,d);const l=new Set;r.forEach((e=>{const t=e.source;if(!d.find((e=>e.source===t))){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),l.add(e.type))}})),d.forEach((e=>{let t=n.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),l.add(t.type)):(t=n.createEntry(e.type),n.setEntrySource(t,e.sourceGroups||e.source),n.setEntryPeerId(t,a),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(s,{direction:"recvonly"}),l.add(t.type))})),l.size&&(l.has("video")&&(i.updateConstraints=!0),i.negotiateThrottled())}}},2207:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),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"}(s||(s={}));const n=s},2059:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>L,KR:()=>w,_f:()=>y,s$:()=>b});var s=i(5916);let n;var a=i(410),o=i(3241),r=i(5003),d=i(3512),l=i(9078),c=i(2207),h=i(1677),u=i(9585),f=i(9125),p=i(5424),m=i(312),g=i(6752),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function b(e){var t,i;return[y(0,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&y(0,"audio",e.video.audio_source),e.video&&y(0,"video",e.video.source_groups,e.video.endpoint),(null===(i=e.presentation)||void 0===i?void 0:i.audio_source)&&y(0,"audio",e.presentation.audio_source),e.presentation&&y(0,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)}function y(e,t,i,s){return(0,g.z_)(t,i,s)}function w(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}class S extends o.Z{construct(e){this.managers=e,this.audioAsset=null!=n?n:n=new s.Z(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"]),this.log=(0,r.kg)("GCC"),d.Z.addEventListener("group_call_update",(e=>{const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&(t.groupCall=e,"groupCallDiscarded"===e._&&t.hangUp(!1,!1,!0))})),d.Z.addEventListener("group_call_participant",(({groupCallId:e,participant:t})=>{const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.onParticipantUpdate(t)}))}get groupCall(){return this.currentGroupCall}setCurrentGroupCall(e){this.currentGroupCall=e,e&&this.dispatchEvent("instance",e)}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}joinGroupCall(e,t,i=!0,s,n){return v(this,void 0,void 0,(function*(){let a;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${i} rejoin=${s}`),a=s?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return i=this,s=void 0,a=function*(){const i={audio:(0,f.Z)(),video:t&&(0,m.Z)()},s=new u.Z(h.iK);try{const t=yield(0,p.Z)(i,e);s.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,i),s.inputStream=new MediaStream}return s},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}(i,n),this.joinGroupCallInternal(e,t,a,i,s,n)}))}joinGroupCallInternal(e,t,i,s,n=!1,a){return v(this,void 0,void 0,(function*(){const o=this.log.bindPrefix("joinGroupCallInternal");o("start",t);const r="main";let{currentGroupCall:h}=this;if(!h||!n){h=new l.Z({chatId:e,id:t,managers:this.managers}),h.fixSafariAudio(),h.addEventListener("state",(e=>{this.currentGroupCall===h&&e===c.Z.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),d.Z.dispatchEvent("chat_update",h.chatId))})),h.groupCall=yield this.managers.appGroupCallsManager.getGroupCallFull(t);const u=h.createConnectionInstance({streamManager:i,type:r,options:{type:r,isMuted:s,joinVideo:a,rejoin:n}}),f=u.createPeerConnection();return f.addEventListener("negotiationneeded",(()=>{u.negotiate()})),f.addEventListener("track",(e=>{o("ontrack",e),h.onTrack(e)})),f.addEventListener("iceconnectionstatechange",(()=>{h.dispatchEvent("state",h.state);const{iceConnectionState:e}=f;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":case"completed":case"disconnected":case"new":break;case"closed":case"failed":h.hangUp();break;case"connected":h.joined||(h.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.managers.appGroupCallsManager.getGroupCallParticipants(t))}})),u.createDescription(),u.createDataChannel(),u.appendStreamToConference(),this.setCurrentGroupCall(h),o("set currentGroupCall",t,h),this.startConnectingSound(),u.negotiate()}h.handleUpdateGroupCallParticipants=!1,h.updatingSdp=!1,o("update currentGroupCall",t,h)}))}}const C=new S;a.GO&&(a.GO.groupCallController=C);const L=C},9125:(e,t,i)=>{"use strict";function s(){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}i.d(t,{Z:()=>s})},9337:(e,t,i)=>{"use strict";function s(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}i.d(t,{Z:()=>s})},382:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e){return t=this,i=void 0,n=function*(){const t=yield navigator.mediaDevices.getDisplayMedia(e);return t.getVideoTracks()[0].contentHint="text",t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5424:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e,t){return i=this,s=void 0,a=function*(){const i=yield navigator.mediaDevices.getUserMedia(e);return i.getTracks().forEach((e=>{e.enabled=!t})),i},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}window.getStream=s},312:(e,t,i)=>{"use strict";function s(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}i.d(t,{Z:()=>s})},3773:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8957);function n(e,t){const i=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!i.fingerprint){const t=e.session.lines.find((e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}));i.fingerprint=t.parsed.value}const n=function(e){const t=e.map((e=>{const[t,...i]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:i.map((e=>(0,s.Fk)(+e)))}}));return t.length?t:void 0}(i["ssrc-group"]),[a,o]=i.fingerprint.split(" ",2),r=i.ssrc&&(0,s.Fk)(+i.ssrc.split(" ",1)[0]);return{raw:i,ufrag:i["ice-ufrag"],pwd:i["ice-pwd"],fingerprint:{fingerprint:o,setup:i.setup,hash:a},source:r,sourceGroups:n,mid:i.mid}}},49:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6669);function n(e){e.stop(),(0,s.Z)(e,"ended")}},6752:(e,t,i)=>{"use strict";i.d(t,{Lp:()=>o,ZP:()=>d,z_:()=>r});var s=i(1655),n=i(5953),a=i(4373);class o{constructor(e,t){this.mid=e,this.type=t,this.port=a._D}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((0,a.pl)(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 r(e,t,i){let s;if(Array.isArray(t)){if(!t[0])return;s=t,t=s[0].sources[0]}return{endpoint:i,type:e,source:t,sourceGroups:s}}class 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(0,n.Z)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,i=new o(t,e);return this.entries.push(i),this.entriesByMid.set(t,i),i}deleteEntry(e){(0,s.Z)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let i=this.entriesByPeerId.get(t);i||this.entriesByPeerId.set(t,i=new Set),i.add(e)}findEntry(e){return this.entries.find(e)}findFreeSendRecvEntry(e,t){let i=this.entries.find((i=>"sendrecv"===i.direction&&i.type===e&&!(t?i.sendEntry:i.recvEntry)));return i||(i=this.createEntry(e),i.setDirection("sendrecv")),i}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return a.DY.fromConference(Object.assign({conference:this},e))}}},9124:(e,t,i)=>{"use strict";i.d(t,{e6:()=>de,DV:()=>oe});var s,n,a=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},o=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class r{constructor(e,t){s.set(this,void 0),n.set(this,void 0),a(this,s,e,"f"),a(this,n,t,"f")}get session(){return o(this,s,"f")}get media(){return o(this,n,"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,i){const s=e.split(t),n=[];for(;i>0&&s.length;)n.push(s.shift()),--i;return s.length&&n.push(s.join(t)),n}s=new WeakMap,n=new WeakMap;var l,c,h,u=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},f=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class p{constructor(e,t){l.set(this,void 0),c.set(this,void 0),h.set(this,void 0),u(this,l,new Set,"f"),u(this,c,e,"f"),u(this,h,t,"f")}generate(){const e=f(this,c,"f"),t=f(this,h,"f"),i=f(this,l,"f"),s=t-e+1;let n=Math.floor(e+s*Math.random()),a=0;for(;i.has(n);)if(n=s)return null;return i.add(n),n}add(e){f(this,l,"f").add(e)}}l=new WeakMap,c=new WeakMap,h=new WeakMap;var m,g,v=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},b=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class y{constructor(e,t){m.set(this,void 0),g.set(this,void 0),v(this,m,e,"f"),v(this,g,t,"f")}get key(){return b(this,m,"f")}get value(){return b(this,g,"f")}}m=new WeakMap,g=new WeakMap;var w,S,C,L,E=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},I=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class M{constructor(e,t,i,s){w.set(this,void 0),S.set(this,void 0),C.set(this,void 0),L.set(this,void 0),E(this,w,e,"f"),E(this,S,t,"f"),E(this,C,i,"f"),E(this,L,s,"f")}get type(){return I(this,w,"f")}get port(){return I(this,S,"f")}get protocol(){return I(this,C,"f")}get ids(){return I(this,L,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}w=new WeakMap,S=new WeakMap,C=new WeakMap,L=new WeakMap;var P,Z,k,T,x=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},A=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class _{constructor(e,t){if(P.set(this,void 0),Z.set(this,void 0),k.set(this,void 0),T.set(this,void 0),x(this,P,e,"f"),"string"==typeof t){if(x(this,Z,t,"f"),"m"===e){const e=t.split(" ");x(this,k,new M(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=d(t,":",1);t=e[0],x(this,T,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof M?(x(this,k,t,"f"),x(this,Z,t.toString(),"f")):t instanceof y&&(x(this,T,t,"f"),x(this,Z,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return A(this,P,"f")}get value(){return A(this,Z,"f")}get parsed(){return A(this,T,"f")}get mediaLineParts(){return A(this,k,"f")}toString(){return`${this.key}=${this.value}`}}P=new WeakMap,Z=new WeakMap,k=new WeakMap,T=new WeakMap;var F,D,R,B,N,O,U=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},H=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class z{constructor(e,t,i=":",s=!1){F.set(this,void 0),D.set(this,void 0),R.set(this,void 0),B.set(this,void 0),N.set(this,void 0),O.set(this,void 0),U(this,F,e,"f"),U(this,D,t,"f"),U(this,R,i,"f"),U(this,N,s,"f"),U(this,B,s?new Map:null,"f"),U(this,O,s?[]:null,"f")}get lines(){return H(this,D,"f")}get value(){return H(this,N,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!H(this,N,"f")}get key(){return H(this,F,"f")}get keys(){return z.fill(this),H(this,O,"f")}forEach(e){z.fill(this),H(this,B,"f").forEach(e)}get(e){return z.fill(this),H(this,B,"f").get(e)||new z(e,[],":",!0)}static fill(e){if(null!==H(e,B,"f"))return;const t=new Map;e.lines.forEach((i=>{const[s,n]=d(i,H(e,R,"f"),1),a=t.get(s)||[];t.set(s,[...a,n||""])}));const i=U(e,B,z.makeAttributes(t),"f");U(e,O,Array.from(i.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach(((e,i)=>{t.set(i,new z(i,e))})),t}}F=new WeakMap,D=new WeakMap,R=new WeakMap,B=new WeakMap,N=new WeakMap,O=new WeakMap;var j,G,V=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},K=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class W{constructor(e){j.set(this,void 0),G.set(this,void 0),V(this,j,e,"f"),V(this,G,new Map,"f"),W.fillAttributes(this)}get(e){return K(this,G,"f").get(e)||new z(e,[]," ",!0)}static fillAttributes(e){const t=new Map;K(e,j,"f").forEach((e=>{if("a"===e.key){const{key:i,value:s}=e.parsed;let n=t.get(i);n||(n=[],t.set(i,n)),n.push(s||"")}})),t.forEach(((t,i)=>{K(e,G,"f").set(i,new z(i,t," ",!1))}))}}j=new WeakMap,G=new WeakMap;var $,q,Q,Y,J=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},X=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ee{constructor(e){$.set(this,void 0),q.set(this,void 0),Q.set(this,void 0),Y.set(this,void 0),J(this,$,e,"f"),J(this,q,e[0],"f"),J(this,Q,J(this,Y,null,"f"),"f")}get lines(){return X(this,$,"f")}get mediaLine(){return X(this,q,"f")}get mediaLineParts(){return X(this,q,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!X(this,Y,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",J(this,Y,t,"f")}return X(this,Y,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return X(this,Q,"f")||J(this,Q,new W(this.lines),"f"),X(this,Q,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const i in e){const s=this.attributes.get(i),n=!e[i];t[i]=s?n?s.lines:s.value:n?[]:void 0}return t}}$=new WeakMap,q=new WeakMap,Q=new WeakMap,Y=new WeakMap;var te,ie,se=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},ne=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ae{constructor(e){te.set(this,void 0),ie.set(this,void 0),se(this,te,e,"f"),se(this,ie,e.filter((e=>"o"===e.key)).map((e=>e.value.split(" ")[1]))[0],"f")}get lines(){return ne(this,te,"f")}get sessionId(){return ne(this,ie,"f")}}function oe(e){function t(){i?n.push(new ee(s)):i=new ae(s)}let i=null,s=[];const n=[];return e.split(/\r?\n/).forEach((e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const i=re(e);"m"===i.key&&(t(),s=[]),s.push(i)}})),t(),new r(i,n)}function re(e){const t=d(e,"=",1);return new _(t[0],t[1])}function de(e){let t;return e.media.forEach(((i,s)=>{if("video"===i.mediaType&&i.isSending&&!i.attributes.get("ssrc-group").get("SIM").exists){t||(t=new p(2,4294967295));const n=i.attributes.get("ssrc-group").get("FID").value.split(" "),a=i.lines;n.forEach((e=>t.add(+e)));const o=[n[0],t.generate(),t.generate()],r=[n[1],t.generate(),t.generate()];a.push(re("a=ssrc-group:SIM "+o.join(" ")));const d=i.attributes.get("ssrc").get(n[0]).lines;o.forEach(((e,t)=>{const i=r[t];t>0&&(a.push(re("a=ssrc-group:FID "+e+" "+i)),d.forEach((t=>{a.push(re("a=ssrc:"+e+" "+t))})),d.forEach((e=>{a.push(re("a=ssrc:"+i+" "+e))})))})),e.media[s]=new ee(a)}})),!!t}te=new WeakMap,ie=new WeakMap},4373:(e,t,i)=>{"use strict";i.d(t,{DY:()=>c,Px:()=>l,_D:()=>o,pl:()=>r});var s=i(4762),n=i(630),a=i(8957);const o="9";function r(e){return"screencast"===e?"video":e}function d(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function l(e,t=o,i){const s=d(e);return`m=${r(e)} ${t} ${s} ${i.join(" ")}`}class c extends n.Z{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(` generation ${e.generation}`),t.join("")}(e))}addHeader(e,t){const i=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed",`a=group:BUNDLE ${i}`,"a=ice-options:trickle","a=msid-semantic:WMS *")}addTransport(e,t){this.add(`a=ice-ufrag:${e.ufrag}`,`a=ice-pwd:${e.pwd}`,"a=ice-options:trickle");for(const t of e.fingerprints)this.add(`a=fingerprint:${t.hash} ${t.fingerprint}`,`a=setup:${t.setup}`);if(!t&&e.candidates)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:i,sourceGroups:s}=e;const n=(0,a.h)(e.source);t+=n,i+=n;const o=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${i}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${i}`)};return(()=>{this.add(`a=msid:${t} ${i}`)})(),(null==s?void 0:s.length)?s.forEach((e=>{if(e.sources.length){const t=e.sources.map(a.h);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(o)}})):o(n),this}addSsrcEntry(e,t,i){const s=(...e)=>this.add(...e),{type:n,mid:a,direction:o,port:c}=e,h=t.transport,u="application"===n,f=u?void 0:t[n],p="inactive"===o;if(e.shouldBeSkipped(i))return s(`m=${r(n)} 0 ${d(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive",`a=mid:${a}`);const m=u?[{id:5e3}]:f["payload-types"],g=m.map((e=>e.id));s(l(n,c,g),"c=IN IP4 0.0.0.0",`a=rtcp:${c} IN IP4 0.0.0.0`),h["rtcp-mux"]&&s("a=rtcp-mux"),s(`a=mid:${a}`);let v=o;if("sendrecv"===o||!i||p||u||(v="sendonly"===o?"recvonly":"sendonly"),s(`a=${v}`),this.addTransport(h),u)s(`a=sctpmap:${m[0].id} webrtc-datachannel 256`);else{const e=f["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach((e=>{s(`a=extmap:${e.id} ${e.uri}`)})),m.forEach((e=>{s(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?`/${e.channels}`:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const i=[];for(const e in t)i.push(`${e}=${t[e]}`);s(`a=fmtp:${e.id} ${i.join(";")}`)}const i=e["rtcp-fbs"];(null==i?void 0:i.length)&&i.forEach((t=>{s(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)}))}))}return!e.source||"sendonly"!==v&&"sendrecv"!==v||this.addSsrc(e),this}addConference(e){const{conference:t,entries:i,bundle:n,isAnswer:a}=e;this.addHeader(t.sessionId,n),s.IS_FIREFOX&&this.addTransport(t.transport);for(const e of i)this.addSsrcEntry((a?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,a);return this}static fromConference(e){return(new c).addConference(e).finalize()}}},9585:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3241),n=i(5003),a=i(1677),o=i(49),r=i(4373),d=i(8957);class l{constructor(e,t){const i=this.streamSource=e.createMediaStreamSource(t),s=this.analyser=e.createAnalyser();this.gain=e.createGain(),s.minDecibels=-100,s.maxDecibels=-30,s.smoothingTimeConstant=.05,s.fftSize=1024,i.connect(s)}}class c{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:i,track:s,source:n,type:a}=e,o=t.analyser;if(!o)return;const r=new Uint8Array(o.frequencyBinCount);return o.getByteFrequencyData(r),{type:a,source:n,stream:i,track:s,value:(0,d.UN)(r)}},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,a.KM).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),c.ANALYSER_LISTENER.dispatchEvent("amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.inputStream=new MediaStream,this.counter=0,this.log=(0,n.kg)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0,this.types=["audio","video"]}addStream(e,t){e.getTracks().forEach((i=>{this.addTrack(e,i,t)}))}addTrack(e,t,i){this.log("addTrack",i,t,e);const{context:s,items:n,inputStream:a,outputStream:o}=this,r=t.kind,d=c.getSource(e,i);switch(i){case"input":a?a.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)}),{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find((t=>"input"===t.type&&t.kind===e))}static getSource(e,t){return"input"===t?e.source||e.id:""+(0,d.Fk)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let i=!1;for(let s=0,n=t.length;!i&&s[e,n])),o=t.getTracks();for(const[t,n]of a){let a=e.findEntry((e=>e.direction===i&&e.type===t));if(!a){if(!s)continue;a=e.createEntry(t)}let{transceiver:d}=a;d||(d=a.createTransceiver(e.connection,n)),a.direction!==d.direction&&(d.direction=a.direction);const l=(0,r.pl)(t),c=o.findIndex((e=>e.kind===l)),h=-1!==c?o.splice(c,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=>{(0,o.Z)(e)}))}catch(e){this.log.error(e)}}}c.ANALYSER_LISTENER=new s.Z},630:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{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}}},8957:(e,t,i)=>{"use strict";function s(e){return e<<0}function n(e){return e>>>0}function a(e,t=3){if(!e)return 0;const{length:i}=e;let s=0;for(let t=0;ts,UN:()=>a,h:()=>n})},3785:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(8115),n=i(1229),a=i(7197);const o=new RegExp(`(^${n.Z})`);function r(e,t=!1){if(!e)return"";const i=e.trim().split(" ");if(!i[0])return"";const n=[],r=i[0].match(o),d=(null==r?void 0:r[0])||i[0][0];if(r&&n.push((0,a.Z)(d)),t||1===i.length)return(0,s.Z)(d,void 0,n);const l=i[1].match(o),c=(null==l?void 0:l[0])||i[1][0];return l&&n.push(Object.assign(Object.assign({},(0,a.Z)(c)),{offset:c.length})),(0,s.Z)(d+c,void 0,n)}},7197:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(671);function n(e){return{_:"messageEntityEmoji",offset:0,length:e.length,unicode:(0,s.w1)(e).join("-").replace(/-?fe0f/g,"")}}},1171:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2423);function n(e){return e?e.match(s.E):null}},3066:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(4776);function a(e,t={}){if(!e)return(0,n.ZP)("");let i=t.entities;return i&&!s.Z.premium&&t.wrappingForPeerId!==s.Z.myId&&(i=i.filter((e=>"messageEntityCustomEmoji"!==e._))),(0,n.ZP)(e,Object.assign(Object.assign({},t),{entities:i,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}))}},8115:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6535),n=i(4776);function a(e,t=!1,i){return e?(null!=i||(i=(0,s.Z)(e).filter((e=>"messageEntityEmoji"===e._))),(0,n.ZP)(e,{entities:i,wrappingDraft:t})):(0,n.ZP)("")}},4776:(e,t,i)=>{"use strict";i.d(t,{LD:()=>A,KZ:()=>_,SZ:()=>j,ZP:()=>z,Cx:()=>V,Hc:()=>G});var s=i(2423),n=i(3447),a=i(9976),o=i(8479),r=i(4056),d=i(1379),l=i(6535);function c(e){return e.target="_blank",e.rel="noopener noreferrer",e}var h=i(3591);const u={};a.Z&&(u[""]=!0,[["14","🫱🏻"]].forEach((([e,t])=>{u[e]=function(e){const t=document.createElement("span");t.classList.add("emoji"),document.body.appendChild(t),t.innerText=e;const i=t.offsetWidth;t.innerText="❤️";const s=t.offsetWidth;return document.body.removeChild(t),Math.abs(i-s)<5}(t)})));const f=u;var p=i(2738),m=i(3512),g=i(4755),v=i(3541),b=i(3772),y=i(5814),w=i(2153),S=i(393),C=i(8938),L=i(319),E=i(8497),I=i(4881),M=i(3624),P=i(5565),Z=i(6854),k=i(645);const T=new ResizeObserver((e=>{for(const t of e)t.target.parentElement.setDimensionsFromRect(t.contentRect)})),x=new w.Z;class A extends HTMLElement{constructor(){super(),this.paused=!0,this.classList.add("custom-emoji")}get docId(){return this.dataset.docId}static create(e){const t=new A;return t.dataset.docId=""+e,t}get isConnected(){var e,t;return null!==(t=null===(e=this.placeholder)||void 0===e?void 0:e.isConnected)&&void 0!==t?t:super.isConnected}connectedCallback(){this.player&&y.Z.addAnimation(this,this.renderer.animationGroup)}disconnectedCallback(){this.isConnected||this.clear()}clear(e=!0){var t;if(this.clean)return;this.clean=!0,this.pause();const{syncedPlayer:i}=this;if(i&&i.pausedElements.delete(this),null===(t=this.middlewareHelper)||void 0===t||t.clean(),this.renderer){const t=this.renderer.customEmojis.get(this.docId);(null==t?void 0:t.delete(this))&&!t.size&&(this.renderer.customEmojis.delete(this.docId),this.renderer.playersSynced.delete(t)),e&&(this.renderer.isSelectable?this.replaceChildren(j(!0)):this.replaceChildren())}this.player&&y.Z.removeAnimationByPlayer(this),x&&x.delete({div:this}),this.elements=this.renderer=this.player=this.syncedPlayer=void 0}pause(){this.paused||(this.paused=!0,this.player instanceof HTMLVideoElement&&!this.syncedPlayer&&(this.renderer.lastPausedVideo=this.player,this.player.pause()),this.syncedPlayer&&!this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.add(this),this.syncedPlayer.player&&this.syncedPlayer.pausedElements.size===this.syncedPlayer.middlewares.size&&this.syncedPlayer.player.pause()))}play(){var e;this.paused&&(this.paused=!1,this.player instanceof HTMLVideoElement&&(this.player.currentTime=(null===(e=this.renderer.lastPausedVideo)||void 0===e?void 0:e.currentTime)||this.player.currentTime,this.player.play().catch(L.Z)),this.syncedPlayer&&this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.delete(this),this.syncedPlayer.pausedElements.size!==this.syncedPlayer.middlewares.size&&this.player.play()))}remove(){this.clear()}get autoplay(){return!0}}class _ extends HTMLElement{constructor(){super(),this.classList.add("custom-emoji-renderer"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("custom-emoji-canvas"),this.context=this.canvas.getContext("2d"),this.append(this.canvas),this.playersSynced=new Map,this.clearedElements=new WeakSet,this.customEmojis=new Map,this.animationGroup="EMOJI",this.isCanvasClean=!1}connectedCallback(){R.has(this)||(T.observe(this.canvas),R.add(this),this.connectedCallback=void 0)}disconnectedCallback(){var e;this.isConnected||(T.unobserve(this.canvas),this.customEmojis.forEach((e=>{e.forEach((e=>{e.clear()}))})),R.delete(this),this.playersSynced.clear(),null===(e=this.middlewareHelper)||void 0===e||e.clean(),this.customEmojis.clear(),this.disconnectedCallback=this.lastPausedVideo=void 0)}getOffsets(e=new Map){if(!this.playersSynced.size)return e;const t=(0,E.Z)(this,"scrollable")||this.offsetParent;if(!t)return e;const i=t.getBoundingClientRect(),s=this.getBoundingClientRect();for(const n of this.playersSynced.keys()){const a=Array.from(n),o=this.isSelectable?a.map((e=>e.placeholder)):a,{visible:r}=(0,I.Z)({overflowElement:t,overflowRect:i,elements:o,extraSize:2.5*this.size.height}),d=r.map((({rect:e})=>({top:e.top-s.top,left:e.left-s.left,width:e.width})));d.length&&e.set(n,d)}return e}clearCanvas(){if(this.isCanvasClean)return;const{context:e,canvas:t}=this;e.clearRect(0,0,t.width,t.height),this.isCanvasClean=!0}render(e){const{context:t,canvas:i,isDimensionsSet:s}=this;s||this.setDimensionsFromRect(void 0,!1),this.isCanvasClean=!1;const{width:n,height:a,dpr:o}=i;for(const[i,s]of e){const e=this.playersSynced.get(i),a=N.get(e)||(e instanceof HTMLVideoElement?e:void 0);if(!a)continue;const r=a instanceof ImageData;let d,l;e instanceof HTMLVideoElement?(d=this.size.width*o,l=this.size.height*o):(d=a.width,l=a.height);const c=Math.round(s[0].width*o);c!==d&&(d=c,l=c);const h=n-d;this.clearedElements.has(i)||this.isSelectable||(this.isSelectable?i.forEach((e=>{var t;null!==(t=e.lastChildWas)&&void 0!==t||(e.lastChildWas=e.lastChild),(0,P.Z)(e,e.firstChild)})):i.forEach((e=>{e.replaceChildren()})),this.clearedElements.add(i)),s.forEach((({top:e,left:i})=>{e=Math.round(e*o),(i=Math.round(i*o))<0||i>h||(r?t.putImageData(a,i,e):t.drawImage(a,i,e,d,l))}))}}checkForAnyFrame(){for(const e of this.playersSynced.values())if(N.has(e)||e instanceof HTMLVideoElement)return!0;return!1}remove(){super.remove()}setDimensionsFromRect(e=this.lastRect,t=!0){const{canvas:i}=this,{dpr:s}=i;if(this.lastRect!==e&&(this.lastRect=e),!e||!s||this.ignoreSettingDimensions)return;const{width:n,height:a}=e,o=Math.floor(Math.round(n*s)),r=Math.floor(Math.round(a*s));i.width===o&&i.height===r||(i.width=o,i.height=r,this.isDimensionsSet=!0,this.isCanvasClean=!0,(this.forceRenderAfterSize||this.isSelectable&&t)&&(this.forceRenderAfterSize=void 0,this.forceRender()))}forceRender(){this.isDimensionsSet&&(O(new Set([this]))||this.clearCanvas())}add(e,t,i,s){const n=this;if(e.forEach(((t,i)=>{let s=this.customEmojis.get(i);s?this.clearedElements.delete(s):this.customEmojis.set(i,s=new Set);for(const e of t)s.has(e)?t.delete(e):(e.clean=!1,e.renderer=n,e.elements=s,e.middlewareHelper=this.middlewareHelper.get().create(),s.add(e),e.lastChildWas&&!e.lastChildWas.parentNode&&e.append(e.lastChildWas));t.size||e.delete(i)})),!e.size)return;const a=!(t||!1===t||!x),o=Array.from(e.keys()),r=m.Z.managers,d=this.middlewareHelper.get(),l=this.size;return r.appEmojiManager.getCachedCustomEmojiDocuments(o).then((c=>{if(d&&!d())return;const h=[],u=(o,c)=>{const h=o.id,u=e.get(h),f=n.customEmojis.get(h),p=2===o.sticker,m="video/webm"===o.mime_type&&!S.Z,g=(p||3===o.sticker&&this.isSelectable)&&!i&&!m,w=[],E=Array.from(u),I=(0,v.ZP)({div:E,doc:o,width:l.width,height:l.height,loop:!0,play:F,managers:r,isCustomEmoji:!0,group:"none",loadPromises:w,middleware:d,exportLoad:a||!1===t?2:1,needFadeIn:!1,loadStickerMiddleware:g&&d?d.create().get((()=>!!P.middlewares.size)):void 0,static:m,onlyThumb:i,withThumb:null!=s?s:!n.clearedElements.has(f)&&void 0,syncedVideo:this.isSelectable});c&&I.then((()=>c.push(...w)));const M={elements:u};if(1===o.sticker||i||m)return this.isSelectable&&(M.onRender=()=>Promise.all(w).then((()=>{d&&!d()||E.forEach((e=>{const{placeholder:t}=e;t.src=e.firstElementChild.src}))}))),I.then((e=>Object.assign(Object.assign({},e),M)));let P;M.onRender=e=>Promise.all(w).then((()=>{var t;if(d&&!d()||!o.animated)return;const i=Array.isArray(e)?e:[e],s=Array.isArray(i)?i[0]:i;if((0,C.Z)(s),E.forEach(((e,t)=>{const s=i[t]||i[0];e.player=s,P&&(e.syncedPlayer=P,e.paused?e.syncedPlayer.pausedElements.add(e):s.paused&&s.play()),e.isConnected&&y.Z.addAnimation(e,e.renderer.animationGroup)})),(s instanceof b.Z||s instanceof HTMLVideoElement&&this.isSelectable)&&(P.player=s,n.playersSynced.set(f,s)),s instanceof b.Z?(s.group=n.animationGroup,null!==(t=s.overrideRender)&&void 0!==t||(s.overrideRender=e=>{N.set(s,e)})):HTMLVideoElement,g){const e=(0,b.a)(this.size.width,this.size.height);n.canvas.dpr=e,U()}}));const Z=[h,l.width,l.height].join("-");if(g){P=B.get(Z),P||(P={player:void 0,middlewares:new Set,pausedElements:new Set,key:Z},B.set(Z,P));for(const e of u){const t=e.middlewareHelper.get();P.middlewares.add(t),t.onClean((()=>{var i,s;if(P.middlewares.delete(t),!P.middlewares.size){if(P.player){const t=N.get(P.player);if(t&&(null===(s=(i=t).close)||void 0===s||s.call(i),N.delete(P.player)),N.delete(P.player),P.player instanceof b.Z)P.player.overrideRender=L.Z,P.player.remove();else if(P.player instanceof HTMLVideoElement){const t=k.Z.generateName(""+e.docId,0,0,void 0,void 0);delete v._i[t]}P.player=void 0}B.get(P.key)===P&&B.delete(P.key)&&!B.size&&H()}}))}}return I.then((e=>Object.assign(Object.assign({},e),M)))},f=[],p=c.map(((e,t)=>{if(e)return u(e,h);f.push(o[t])})).filter(Boolean),m=f.length?r.appEmojiManager.getCustomEmojiDocuments(f).then((e=>d&&!d()?[]:e.filter(Boolean).map((e=>u(e))))):Promise.resolve([]),g=e=>Promise.all(e).then((e=>{const t=e.map((({load:e,onRender:t,elements:i})=>{if(!e)return;const s=()=>e().then(t);if(!a)return s();i.forEach((e=>{x.push({div:e,load:()=>(i.forEach((e=>{x.delete({div:e})})),s())})}))}));return Promise.all(t)})),w=()=>{if(d&&!d())return;const e=g(p),t=m.then((e=>g(e)));return Promise.all([e,t])};return t?t.push({div:n.canvas,load:w}):w(),Promise.all(p).then((()=>Promise.all(h))).then((()=>{}))}))}static create(e){const t=new _;t.animationGroup=e.animationGroup,t.size=e.customEmojiSize||g.Z.active.customEmoji,t.isSelectable=e.isSelectable,e.wrappingDraft&&(t.contentEditable="false",t.style.height="inherit");let i=e.middleware;return i?(t.middlewareHelper=i.create(),i=t.middlewareHelper.get(),i.onDestroy((()=>{var e;null===(e=t.disconnectedCallback)||void 0===e||e.call(t)}))):t.middlewareHelper=(0,M.k)(),t}}const F=!0;let D;const R=new Set,B=new Map,N=new Map,O=(e=R)=>{const t=Array.from(e).filter((e=>e.isConnected&&e.checkForAnyFrame()&&!e.ignoreSettingDimensions));if(!t.length)return!1;const i=t.map((e=>{const t=[...e.playersSynced.values()].reduce(((e,t)=>e+ +!!t.paused),0);if(e.playersSynced.size===t)return;const i=e.getOffsets();return i.size?[e,i]:void 0})).filter(Boolean);for(const[e]of i)e.clearCanvas();for(const[e,t]of i)e.render(t);return!0},U=()=>{D||(D=window.setInterval(O,16.666666666666668),O())},H=()=>{D&&(clearInterval(D),D=void 0)};function z(e,t={}){var i,u,m,g,v,b,y,w;const S=document.createDocumentFragment();if(!e)return S;const C=null!==(i=t.nasty)&&void 0!==i?i:t.nasty={i:0,usedLength:0,text:e},L=(e,i)=>{const s=document.createElement("span");return t.wrappingDraft&&(s.contentEditable="false"),s.classList.add("input-something"),s.append(e),(F||S).append(s),e.classList.add("input-selectable"),!i&&e.append(j(!0)),I.add(s),s};t.isSelectable||(t.isSelectable=t.wrappingDraft);const E=null!==(u=t.customEmojis)&&void 0!==u?u:t.customEmojis=new Map,I=null!==(m=t.customWraps)&&void 0!==m?m:t.customWraps=new Set,M=null!==(g=t.entities)&&void 0!==g?g:t.entities=(0,l.Z)(C.text),P=null!==(v=t.passEntities)&&void 0!==v?v:t.passEntities={},Z=null!==(b=t.contextSite)&&void 0!==b?b:t.contextSite="Telegram",k="Telegram"!==Z,T=C.text.length,x=M.length;let F;for(;C.i=T){if("messageEntityCaret"!==e._)continue}else e.offset+e.length>T&&(e=(0,o.Z)(e),e.length=T-e.offset);e.length&&(C.lastEntity=e);let i=M[C.i+1];const l=e.offset,u=l+e.length,m=Math.min(u,null!==(y=null==i?void 0:i.offset)&&void 0!==y?y:65535),g=C.text.slice(l,u);let v=C.text.slice(l,m);C.usedLengthv.length&&b?b:S,t.voodoo)return S}var D;if(C.lastEntity&&(C.usedLength=C.lastEntity.offset+C.lastEntity.length),C.usedLength{const t=document.createElement("span");return t.classList.add(e?"input-filler2":"input-filler"),t.textContent=Z.Z,t};function G(e){var t;if((null==e?void 0:e.textContent)!==Z.Z||"false"===(null===(t=null==e?void 0:e.getAttribute)||void 0===t?void 0:t.call(e,"contenteditable"))){if(!e||e.textContent!==Z.Z||e.firstElementChild)return 2;if(e.nodeType===e.ELEMENT_NODE)return 1}return 0}function V(e){const t=(e,t,i)=>{const s=G(t);2===s?e[i](j()):1===s&&t.appendChild(document.createTextNode(Z.Z))};for(const i of e){const{previousSibling:e,nextSibling:s}=i;t(i,e,"before"),t(i,s,"after")}}window.wrapRichText=z},1447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(5814),n=i(410),a=i(5418),o=i(5003),r=i(3772),d=i(7328),l=i(3241);class c extends l.Z{constructor(e){super(),this.worker=e,this.worker.onerror=e=>{try{this.dispatchEvent("workerError",e),this.cleanup(),this.terminate()}catch(e){}},this.worker.onmessage=e=>{this.dispatchEvent(e.data.queryMethodListener,...e.data.queryMethodArguments)}}postMessage(e){this.worker.postMessage(e)}terminate(){this.worker.terminate()}sendQuery(e,t){this.worker.postMessage({queryMethod:e.shift(),queryMethodArguments:e},d.Z?t:void 0)}}var h=i(8975),u=i(3855);const f="undefined"!=typeof WebAssembly;var p=i(5471),m=i(4159);const g=new class{constructor(){this.loadPromise=f?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=m.Z.threads,this.players={},this.playersByCacheName={},this.workers=[],this.curWorkerNum=0,this.log=(0,o.kg)("LOTTIE",o.v9.Error),this.onPlayerLoaded=(e,t,i)=>{const s=this.players[e];s?(this.log.debug("onPlayerLoaded"),s.onLoad(t,i)):this.log.warn("onPlayerLoaded on destroyed player:",e,t)},this.onFrame=(e,t,i)=>{const s=this.players[e];s?(void 0!==s.clamped&&i instanceof Uint8ClampedArray&&(s.clamped=i),s.renderFrame(i,t)):this.log.warn("onFrame on destroyed player:",e,t)},this.onPlayerError=(e,t)=>{const i=this.players[e];i&&s.Z.getAnimations(i.el[0]).forEach((e=>{s.Z.removeAnimation(e)}))}}getAnimation(e){for(const t in this.players)if(this.players[t].el.includes(e))return this.players[t];return null}setLoop(e){for(const t in this.players){const i=this.players[t];i.loop=e,i.autoplay=i._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise(((e,t)=>{let s=this.workersLimit;for(let n=0;n{this.log("worker #"+n+" ready"),o.addEventListener("frame",this.onFrame),o.addEventListener("loaded",this.onPlayerLoaded),o.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),e(),this.loaded=!0)}),{once:!0}),o.addEventListener("workerError",(e=>{t("rlottie load error: "+e.message),this.loaded=!1}),{once:!0})}}))}makeAssetUrl(e){return"assets/tgs/"+e+".json"}loadAnimationAsAsset(e,t){return this.loadAnimationFromURL(e,this.makeAssetUrl(t))}loadAnimationDataFromURL(e){return f?(this.loadLottieWorkers(),fetch(e).then((e=>e.headers&&"application/octet-stream"!==e.headers.get("content-type")?e.blob():e.arrayBuffer().then((e=>u.Z.invokeCrypto("gzipUncompress",e))).then((e=>(0,h.Z)(e,"")))))):this.loadPromise}loadAnimationFromURLManually(e){const t=this.makeAssetUrl(e);return this.loadAnimationDataFromURL(t).then((e=>i=>this.loadAnimationFromURLNext(e,i,t)))}loadAnimationFromURL(e,t){return this.loadAnimationDataFromURL(t).then((i=>this.loadAnimationFromURLNext(i,e,t)))}loadAnimationFromURLNext(e,t,i){const s=Object.assign(t,{animationData:e,needUpscale:!0});return s.name||(s.name=i),this.loadAnimationWorker(s)}waitForFirstFrame(e){return Promise.race([new Promise((t=>{e.addEventListener("firstFrame",t,{once:!0})})),(0,a.Z)(2500)]).then((()=>e))}loadAnimationWorker(e,t=e.group||"",i){return n=this,a=void 0,d=function*(){if(!f)return this.loadPromise;if(this.loaded||(yield this.loadLottieWorkers()),i&&!i())throw(0,p.Z)("MIDDLEWARE");if(e.sync){const t=r.Z.CACHE.generateName(e.name,e.width,e.height,e.color,e.toneIndex),i=this.playersByCacheName[t];if(null==i?void 0:i.size)return Promise.resolve(i.entries().next().value[0])}const n=Array.isArray(e.container)?e.container:[e.container];if(e.width&&e.height||(e.width=parseInt(n[0].style.width),e.height=parseInt(n[0].style.height)),!e.width||!e.height)throw new Error("No size for sticker!");e.group=t;const a=this.initPlayer(n,e);return s.Z.addAnimation(a,t),a},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{r(d.next(e))}catch(e){t(e)}}function s(e){try{r(d.throw(e))}catch(e){t(e)}}function r(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}r((d=d.apply(n,a||[])).next())}));var n,a,o,d}onDestroy(e){delete this.players[e]}destroyWorkers(){f&&(this.workers.forEach(((e,t)=>{e.terminate(),this.log("worker #"+t+" terminated")})),this.log("workers destroyed"),this.workers.length=0,this.curWorkerNum=0,this.loaded=!1,this.loadPromise=void 0)}initPlayer(e,t){var i,s;const n=new r.Z({el:e,worker:this.workers[this.curWorkerNum++],options:t}),{reqId:a,cacheName:o}=n;this.players[a]=n;const d=o?null!==(i=(s=this.playersByCacheName)[o])&&void 0!==i?i:s[o]=new Set:void 0;return o&&d.add(n),this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),n.addEventListener("destroy",(()=>{this.onDestroy(a),d.delete(n)&&!d.size&&delete this.playersByCacheName[o]})),n.loadFromData(t.animationData),n}};n.GO.lottieLoader=g;const v=g},3772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,a:()=>h});var s=i(7328),n=i(8189),a=i(4762),o=i(3241),r=i(4755),d=i(3228),l=i(356),c=i(645);function h(e,t,i){let s=(0,d.Z)(window.devicePixelRatio,1,2);return s>1&&!i&&(e>90&&t>90?!a.IS_APPLE&&r.Z.isMobile&&(s=1):(e>60&&t>60||a.IS_ANDROID)&&(s=Math.max(1.5,s-1.5))),s}class u extends o.Z{constructor({el:e,worker:t,options:i}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.playedTimes=0,this.reqId=++u.reqId,this.el=e,this.worker=t;for(const e in i)this.hasOwnProperty(e)&&(this[e]=i[e]);let o;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=i.initFrame,this.color=i.color,this.inverseColor=i.inverseColor,this.name=i.name,this.skipFirstFrameRendering=i.skipFirstFrameRendering,this.toneIndex=i.toneIndex,this.raw=void 0!==this.color,this.name&&(this.cacheName=u.CACHE.generateName(this.name,this.width,this.height,this.color,this.toneIndex)),void 0!==i.skipRatio?o=i.skipRatio:(a.IS_ANDROID||a.IS_APPLE_MOBILE||a.IS_APPLE&&!a.IS_SAFARI&&!n.Z)&&this.width<100&&this.height<100&&!i.needUpscale&&(o=.5),this.skipDelta=void 0!==o?1/o|0:1;const r=h(this.width,this.height,i.needUpscale);this.width=Math.round(this.width*r),this.height=Math.round(this.height*r),i.noCache||(a.IS_APPLE&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=this.el.map((()=>{const e=document.createElement("canvas");return e.classList.add("rlottie"),e.width=this.width,e.height=this.height,e.dpr=r,e}))),this.contexts=this.canvas.map((e=>e.getContext("2d"))),l.Z&&!this.raw||(this.imageData=new ImageData(this.width,this.height),s.Z&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4))),this.name?this.cache=u.CACHE.getCache(this.cacheName):this.cache=c.M.createCache()}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&this.cache.counter>1||this.cache.clearCache())}sendQuery(e,t){this.worker.sendQuery([e.shift(),this.reqId,...e],t)}loadFromData(e){this.sendQuery(["loadFromData",e,this.width,this.height,this.toneIndex,void 0!==this.color])}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(e=!0){this.paused||(this.paused=!0,e&&(clearTimeout(this.rafId),this.rafId=void 0))}resetCurrentFrame(){var e;return this.curFrame=null!==(e=this.initFrame)&&void 0!==e?e:1===this.direction?this.minFrame:this.maxFrame}stop(e=!0){this.pause();const t=this.resetCurrentFrame();e&&this.requestFrame(t)}restart(){this.stop(!1),this.play()}setSpeed(e){this.speed!==e&&(this.speed=e,this.paused||this.setMainLoop())}setDirection(e){this.direction!==e&&(this.direction=e,this.paused||this.setMainLoop())}remove(){this.pause(),this.sendQuery(["destroy"]),this.cacheName&&u.CACHE.releaseCache(this.cacheName),this.dispatchEvent("destroy"),this.cleanup()}applyColor(e){const[t,i,s]=this.color;for(let n=0,a=e.length;n{let n=this.cache.framesNew.get(t);if(e instanceof Uint8ClampedArray?s>0&&(n=this.canvas[0]):n=e,!n){const e=document.createElement("canvas");e.width=i.canvas.width,e.height=i.canvas.height,e.getContext("2d").putImageData(this.imageData,0,0),this.cache.framesNew.set(t,e),n=e}this.overrideRender&&this.renderedFirstFrame?this.overrideRender(n||this.imageData):n?(i.clearRect(0,0,n.width,n.height),i.drawImage(n,0,0)):i.putImageData(this.imageData,0,0),this.renderedFirstFrame||(this.renderedFirstFrame=!0)})),this.dispatchEvent("enterFrame",t)}catch(e){console.error("RLottiePlayer renderFrame error:",e,this.width,this.height),this.autoplay=!1,this.pause()}}renderFrame(e,t){if(this.cachingDelta&&(t%this.cachingDelta||!t)&&(e instanceof Uint8ClampedArray&&!this.cache.frames.has(t)?this.cache.frames.set(t,new Uint8ClampedArray(e)):l.Z&&e instanceof ImageBitmap&&!this.cache.framesNew.has(t)&&this.cache.framesNew.set(t,e)),this.frInterval){const i=Date.now()-this.frThen;if(i<0){const s=this.frInterval>-i?-i%this.frInterval:this.frInterval;return this.rafId&&clearTimeout(this.rafId),void(this.rafId=window.setTimeout((()=>{this.renderFrame2(e,t)}),s))}}this.renderFrame2(e,t)}requestFrame(e){const t=this.cache.frames.get(e),i=this.cache.framesNew.get(e);i?this.renderFrame(i,e):t?this.renderFrame(t,e):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery(["renderFrame",e],this.clamped?[this.clamped.buffer]:void 0))}onLap(){return++this.playedTimes===this.loop&&(this.loop=!1),!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:e,maxFrame:t}=this,i=this.curFrame+e>t?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=e;return this.requestFrame(i),!(i+e>t)||this.onLap()}mainLoopBackwards(){const{skipDelta:e,minFrame:t}=this,i=this.curFrame-et?1:-1,callback:s})}playToFrame(e){this.pause();const{frame:t,speed:i,callback:s,direction:n}=e;this.setDirection(void 0===n?this.curFrame>t?-1:1:n),void 0!==i&&this.setSpeed(i);const a=[this.curFrame,t];-1===this.direction&&a.reverse(),this.loop=!1,this.setMinMax(a[0],a[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s&&(this.playToFrameOnFrameCallback=e=>{e===t&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(e,t){this.color=e,t&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(e){this.inverseColor=e}setMinMax(e=0,t=this.frameCount-1){this.minFrame=e,this.maxFrame=t}onLoad(e,t){return i=this,s=void 0,a=function*(){this.frameCount=e,this.fps=t,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=(0,d.Z)(this.initFrame,this.minFrame,this.maxFrame));const i=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const e=60/t;this.skipDelta=this.skipDelta/e|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(i),this.dispatchEvent("ready"),this.addEventListener("enterFrame",(()=>{this.dispatchEvent("firstFrame"),this.canvas[0].parentNode||!this.el||this.overrideRender||this.el.forEach(((e,t)=>e.append(this.canvas[t]))),this.frameListener=()=>{if(this.paused||!this.currentMethod)return;const e=Date.now();this.frThen=e+this.frInterval,this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener),"none"===this.group&&this.autoplay&&this.play()}),{once:!0})},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}u.CACHE=c.Z,u.reqId=0},4874:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(1447),n=i(6008),a=i(410),o=i(4789),r=i(2648);const d=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=(0,n.X)(null,this.scrollableDiv.querySelector(".tabs-container"),null,(()=>{var e;(null===(e=this.page)||void 0===e?void 0:e.onShown)&&this.page.onShown()}))}setPage(e){if(e.isAuthPage){this.pagesDiv.style.display="";const t=(0,r.Z)(e.pageEl);if(this.pageId===t)return;this.selectTab(t),-1!==this.pageId&&t>1&&s.Z.loadLottieWorkers(),this.pageId=t,this.scrollableDiv&&(0,o.Z)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",e.pageEl.style.display="",this.pageId=-1;this.page=e}};a.GO.pagesManager=d;const l=d;class c{constructor(e,t,i,s,n){this.isAuthPage=t,this.onFirstMount=i,this.onMount=s,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+e)}mount(...e){return t=this,i=void 0,n=function*(){if(this.onMount&&this.onMount(...e),!this.installed){if(this.onFirstMount)try{const t=this.onFirstMount(...e);t instanceof Promise&&(yield t)}catch(e){console.error("PAGE MOUNT ERROR:",e)}this.installed=!0}l.setPage(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}},671:(e,t,i)=>{"use strict";function s(e){return r(o(e)).join("-")}i.d(t,{Ml:()=>l,N0:()=>s,tB:()=>d,w1:()=>r,zu:()=>c});const n=/\uFE0F/g,a=String.fromCharCode(8205),o=e=>e.indexOf(a)<0?e.replace(n,""):e;function r(e){const t=[];let i=0,s=0,n=0;for(;n55296&&i<=56319?s=i:t.push(i.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}function d(e){const t=e.match(/[\uDFFB-\uDFFF]/);return t?5-(57343-t[0].charCodeAt(0)):0}function l(e){return String.fromCharCode(55356,56741+e.charCodeAt(0),55356,56741+e.charCodeAt(1))}function c(e){return e.split("-").reduce(((e,t)=>e+String.fromCodePoint(parseInt(t,16))),"")}},4329:function(e){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function i(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=e,i.c=t,i.d=function(e,t,s){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(s,n,function(t){return e[t]}.bind(null,n));return s},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=0)}([function(e,t,i){"use strict";(function(t){var i=t.AudioContext||t.webkitAudioContext,s=function(e){if(!s.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};s.isRecordingSupported=function(){return i&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},s.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},s.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],i=0;i{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},s.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then((e=>(this.stream=e,this.audioContext.createMediaStreamSource(e))))},s.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},s.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise(((t,i)=>{var s=i=>{switch(i.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=i.data.samplePosition,e(i.data.page);break;case"done":this.encoder.removeEventListener("message",s),this.finish()}};this.encoder.addEventListener("message",s),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))}))},s.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise(((e,i)=>{var s=i=>{"flushed"===i.data.message&&(t.removeEventListener("message",s),this.onpause(),e())};t.addEventListener("message",s),t.postMessage({command:"flush"})}))}return this.onpause(),Promise.resolve()}},s.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},s.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then((()=>this.initSourceNode(e))).then((e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)}))},s.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise((t=>{var i=s=>{"done"===s.data.message&&(e.removeEventListener("message",i),t())};e.addEventListener("message",i),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})}))}return Promise.resolve()},s.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},s.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},s.prototype.streamPage=function(e){this.ondataavailable(e)},s.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,i){return e.set(i,t),t+i.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},s.prototype.ondataavailable=function(){},s.prototype.onpause=function(){},s.prototype.onresume=function(){},s.prototype.onstart=function(){},s.prototype.onstop=function(){},e.exports=s}).call(this,i(1))},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i}])},6802:e=>{var t=.1,i="function"==typeof Float32Array;function s(e,t){return 1-3*t+3*e}function n(e,t){return 3*t-6*e}function a(e){return 3*e}function o(e,t,i){return((s(t,i)*e+n(t,i))*e+a(t))*e}function r(e,t,i){return 3*s(t,i)*e*e+2*n(t,i)*e+a(t)}function d(e){return e}e.exports=function(e,s,n,a){if(!(0<=e&&e<=1&&0<=n&&n<=1))throw new Error("bezier x values must be in [0, 1] range");if(e===s&&n===a)return d;for(var l=i?new Float32Array(11):new Array(11),c=0;c<11;++c)l[c]=o(c*t,e,n);return function(i){return 0===i||1===i?i:o(function(i){for(var s=0,a=1;10!==a&&l[a]<=i;++a)s+=t;--a;var d=s+(i-l[a])/(l[a+1]-l[a])*t,c=r(d,e,n);return c>=.001?function(e,t,i,s){for(var n=0;n<4;++n){var a=r(t,i,s);if(0===a)return t;t-=(o(t,i,s)-e)/a}return t}(i,d,e,n):0===c?d:function(e,t,i,s,n){var a,r,d=0;do{(a=o(r=t+(i-t)/2,s,n)-e)>0?i=r:t=r}while(Math.abs(a)>1e-7&&++d<10);return r}(i,s,s+t,e,n)}(i),s,a)}}}}]); -//# sourceMappingURL=408.03880fedecb1e421da3b.chunk.js.map \ No newline at end of file diff --git a/public/408.03880fedecb1e421da3b.chunk.js.map b/public/408.03880fedecb1e421da3b.chunk.js.map deleted file mode 100644 index bdfa4c58..00000000 --- a/public/408.03880fedecb1e421da3b.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"408.03880fedecb1e421da3b.chunk.js","mappings":"6NAwUA,MAAMA,EAAuB,IAlStB,MAaLC,cACEC,KAAKC,SAAW,IAAIC,sBAAsBC,IAGxC,IAAI,MAAMC,KAASD,EAAS,CAC1B,MAAME,EAASD,EAAMC,OAErB,IAAI,MAAMC,KAASN,KAAKO,SAAU,CAChC,GAAGP,KAAKQ,yBAAyBF,GAC/B,SAGF,MAAMG,EAAYT,KAAKO,SAASD,GAA6BI,MAAMC,GAAMA,EAAEC,KAAOP,IAClF,GAAII,EAAJ,CAIA,GAAGL,EAAMS,eACPb,KAAKc,QAAQC,IAAIN,GACjBT,KAAKgB,eAAeP,GAAW,OAM1B,CACLT,KAAKc,QAAQG,OAAOR,GACpBT,KAAKgB,eAAeP,GAAW,GAE/B,MAAMS,EAAaT,EAAUA,UAC1BS,aAAsB,KAEvBA,EAAWC,aAQf,YAKNnB,KAAKc,QAAU,IAAIM,IAEnBpB,KAAKqB,mBAAqB,IAAID,IAC9BpB,KAAKO,SAAW,GAChBP,KAAKsB,SAAW,IAAIC,IACpBvB,KAAKwB,aAAe,GACpBxB,KAAKyB,qBAAuB,GAE5BzB,KAAKQ,yBAA2B,GAChCR,KAAK0B,cAAe,EAEpB,qBAA4C,QAAQ,EAAEC,IAAAA,MACpC,UAAbA,EAAIC,OACL5B,KAAK0B,cAAe,EACpB1B,KAAK6B,uBAIT,qBAA4C,SAAS,KAChD7B,KAAK0B,eACN1B,KAAK0B,cAAe,EACpB1B,KAAK6B,uBAIT,qBAAgC,UAAWC,IACzC9B,KAAK6B,iBAAiBC,MAInBC,qBAAqBzB,EAAe0B,GACtCA,EAAUhC,KAAKqB,mBAAmBN,IAAIT,GACpCN,KAAKqB,mBAAmBJ,OAAOX,GAG/B2B,cAAcC,GACnB,MAAMC,EAAyB,GAC/B,IAAI,MAAM7B,KAASN,KAAKO,SACtB,IAAI,MAAM6B,KAAUpC,KAAKO,SAASD,GAC7B8B,EAAOxB,KAAOsB,GACfC,EAAME,KAAKD,GAKjB,OAAOD,EAGFG,gBAAgBF,GACrB,MAAM,GAACxB,EAAE,UAAEH,GAAa2B,EAExB3B,EAAU8B,SAGP9B,aAAqB+B,kBAAoB,EAAAC,WAC1CC,YAAW,KACTjC,EAAUkC,IAAM,GAChBlC,EAAUmC,SACT,KAGL,MAAMtC,EAAQN,KAAKO,SAAS6B,EAAO9B,OAChCA,KACD,OAAiBA,EAAO8B,GACpB9B,EAAMuC,eACD7C,KAAKO,SAAS6B,EAAO9B,QAIhCN,KAAKC,SAAS6C,UAAUlC,GACxBZ,KAAKc,QAAQG,OAAOmB,GACpBpC,KAAKsB,SAASL,OAAOR,GAGhBsC,wBAAwBX,GAC7B,MAAMY,EAAOhD,KAAKsB,SAAS2B,IAAIb,GAC5BY,GACDhD,KAAKsC,gBAAgBU,GAIlBE,aACLzC,EACAH,EAA4B,GAC5B6C,EACAC,G,YAEA,GAAa,SAAV9C,GAAoBN,KAAKsB,SAAS+B,IAAI5C,GACvC,OAGE0C,IACC1C,aAAqB,IACtB0C,EAAiB1C,EAAUG,GAAG,GACtBH,aAAqB,KAC7B0C,EAAiB1C,EAAU6C,OACnB7C,aAAqB,KAC7B0C,EAAsC,QAArB,EAAA1C,EAAU8C,mBAAW,QAAI9C,EAClCA,aAAqB+C,cAC7BL,EAAiB1C,IAIrB,MAAMuC,EAAsB,CAC1BpC,GAAIuC,EACJ1C,UAAWA,EACXH,MAAAA,EACA8C,WAAAA,GAGC3C,aAAqB,MAClB,4BAAoCA,EAAUgD,OAChDhD,EAAUgD,KAAO,6BAIqB,QAA1C,KAACzD,KAAKO,UAAQ,EAACD,UAA2B,aAAM,IAAI+B,KAAKW,GACzDhD,KAAKC,SAASyD,QAAQV,EAAKpC,IAC3BZ,KAAKsB,SAASqC,IAAIlD,EAAWuC,GAGxBY,gBACLC,EACAvD,EACAwD,EACAC,GAIA,QAAaC,IAAV1D,IAAwBN,KAAKO,SAASD,GAEvC,OAGF,MAAM2D,OAAmBD,IAAV1D,EAAqC,CAACA,GAAS4D,OAAOC,KAAKnE,KAAKO,UAE/E,IAAI,MAAMD,KAAS2D,EAAQ,CACzB,GAAGF,GAAuB/D,KAAKQ,yBAAyBF,GACtD,SAGF,MAAM8D,EAAapE,KAAKO,SAASD,IAEjC,OAAe8D,GAAa3D,IAC1BT,KAAKgB,eAAeP,EAAWoD,EAASC,OAKvCjC,iBAAiBgC,GACtB7D,KAAK4D,gBAAgBC,OAASG,OAAWA,GAAW,GAG/ChD,eAAeoB,EAAuByB,EAAmBC,GAC9D,MAAM,GAAClD,EAAE,UAAEH,EAAS,MAAEH,GAAS8B,EAE5B0B,IAAa9D,KAAKwB,aAAalB,MAAW,OAAQM,GAC/CwB,EAAOgB,aAAcU,GACvB9D,KAAKsC,gBAAgBF,GAMtByB,GACA7D,KAAKyB,sBAAwBzB,KAAKyB,uBAAyBnB,GAC3DG,aAAqB+B,kBAAoBxC,KAAK0B,aAE3CjB,EAAU4D,QAEZ5D,EAAU6D,UAEJ7D,EAAU4D,QAClBrE,KAAKc,QAAQuC,IAAIjB,IACjB3B,EAAU8D,WACRvE,KAAKyB,sBAAwBzB,KAAKyB,uBAAyBnB,GAC3D,aAAyBN,KAAKqB,mBAAmBgC,IAAIjB,EAAO9B,QAG9DG,EAAU+D,OAIPC,0BACL,OAAOzE,KAAKyB,qBAGPiD,wBAAwBpE,EAA4B,IACzDN,KAAKyB,qBAAuBnB,EAGvBqE,UAAUrE,GACfN,KAAKwB,aAAalB,IAAS,EAGtBsE,YAAYtE,UACVN,KAAKwB,aAAalB,GACzBN,KAAK4D,qBAAgBI,EAAW1D,GAG3BuE,aAAavE,GAClB,MAAM8D,EAAapE,KAAKO,SAASD,IAC7B8D,MAAAA,OAAU,EAAVA,EAAYvB,UAIhBuB,EAAWU,SAASrE,IAClBT,KAAKC,SAAS6C,UAAUrC,EAAUG,QAGpC,SAAQ,KACNwD,EAAWU,SAASrE,IAClBT,KAAKC,SAASyD,QAAQjD,EAAUG,WAK/BmE,sBAAsBzE,GAC3BN,KAAKQ,yBAAyBF,IAAS,EAGlC0E,wBAAwB1E,UACtBN,KAAKQ,yBAAyBF,GACrCN,KAAK6E,aAAavE,GAGb2E,wBAAwB3E,EAA2B4E,GACrDA,EAAMlF,KAAK+E,sBAAsBzE,GAC/BN,KAAKgF,wBAAwB1E,KAKtC,OAAmB,0BAAsCR,GACzD,W,ofCvSA,MAAMqF,EAAwB,MAC5B,IACE,OAAO,EAAA1C,YAAc2C,UAAUC,UAAUC,MAAM,mBAAmB,GAAK,GACvE,MAAMC,GACN,OAAO,IAJmB,GA4BvB,MAAMC,UAAmC,IAAhD,c,oBAOU,KAAAC,MAAoD,IAAIlE,IACxD,KAAAmE,UAAiD,IAAInE,IACrD,KAAAoE,aAAoD,IAAIpE,IAIxD,KAAAqE,oBAA0E,IAAIrE,IAC9E,KAAAsE,6BAAkF,IAAItE,IACtF,KAAAuE,wBAAoE,GAkBpE,KAAAC,cAAmD,CACzDC,MAAO,EACPC,MAAO,EACPC,MAAO,GAmHF,KAAAC,aAAe,CAACC,EAAoCX,EAAQzF,KAAKqG,gBACnEZ,IACDA,EAAMa,YAAcC,KAAKC,IAAI,EAAGf,EAAMa,aAAeF,EAAQK,YA7K/C,OAiLX,KAAAC,YAAc,CAACN,EAAoCX,EAAQzF,KAAKqG,gBAClEZ,IACDA,EAAMa,YAAcC,KAAKI,IAAIlB,EAAMmB,SAAUnB,EAAMa,aAAeF,EAAQK,YAnL5D,OAuLX,KAAAI,OAAS,CAACT,EAAoCX,EAAQzF,KAAKqG,gBAC7DZ,IACDA,EAAMa,YAAcF,EAAQU,WA6GxB,KAAAC,oBAA4BtB,GAA4B,EAAD,gCAC7D,MAAMW,EAAUpG,KAAK2F,aAAa1C,IAAIwC,GAChC9D,QAAY3B,KAAKgH,SAASC,eAAeC,OAAOd,EAAQe,OAC9C,UAAbxF,EAAIC,MAAoBD,EAAIyF,mBAAqBjC,GAClDnF,KAAKqH,uBAAuB5B,GAI9B,MAAM6B,QAAqBtH,KAAKgH,SAASO,cAAcC,gBAAgB7F,GACvE8D,EAAM9C,IAAM2E,EAAaG,IAEtBzH,KAAKqG,eAAiBZ,IACvBA,EAAMiC,aAAe1H,KAAK0H,aAEV,UAAb/F,EAAIC,OACL6D,EAAMhC,KAAOzD,KAAKyD,OAKtB,MAAME,EAAM3D,KAAK8F,wBAAwBnE,EAAIgG,IAC1ChE,IACDA,EAAI1C,OAAOwE,GAEP9B,EAAIiE,aACC5H,KAAK8F,wBAAwBnE,EAAIgG,QAyMtC,KAAAE,OAAUC,IAChB,MAAMrC,EAAQqC,EAAEzH,OACV+F,EAAUpG,KAAK2F,aAAa1C,IAAIwC,IAChC,OAACsC,EAAM,IAAEC,GAAO5B,EAIhB6B,EAAMjI,KAAKiI,IACdA,GACDA,EAAI3D,QAGN,MAAM4D,EAAUlI,KAAKmI,kBAAkB1C,GAGvC,GADsBzF,KAAKqG,eACNZ,EAAO,CAC1BzF,KAAKoI,OACLpI,KAAKqI,SAAS5C,EAAOyC,GAErB,MAAMI,EAAUpG,GAAuBA,EAAQ8F,MAAQA,GAAO9F,EAAQ6F,SAAWA,EAC3EQ,EAAavI,KAAKuI,WAClBC,EAAUD,EAAWE,aAC3B,IAAID,IAAYF,EAAOE,GAAU,CAC/B,IAAIE,EAEJ,IAAI,MAAMC,IAAiB,EAAC,GAAO,GAAO,CACxC,MAAMC,EAAWL,EAAWM,YAAYF,GAExC,IAAIG,EAAMF,EAASG,UAAUT,GAW7B,IAVY,IAATQ,EACDJ,IAAeE,EAAS/F,OAASiG,IAGjCA,EADaP,EAAWS,QAAQL,GACrBI,UAAUT,IACT,IAATQ,IACDJ,EAAaI,EAAM,SAIL9E,IAAf0E,EACD,MAIDA,EACD1I,KAAKiJ,GAAGP,GAAY,GAEpB1I,KAAKkJ,WAAW,CAACnB,OAAAA,EAAQC,IAAAA,KAM/BtF,YAAW,KACN1C,KAAKqG,eAAiBZ,IAIzBzF,KAAKmJ,cAAc,OAAQnJ,KAAKoJ,qBAChCpJ,KAAKqJ,2BACJ,IAGG,KAAAC,QAAWxB,IAYjB9H,KAAKmJ,cAAc,UAGb,KAAAI,QAAWzB,IACjB,IAAIA,EAAE0B,UACJ,OAGFxJ,KAAKsJ,QAAQxB,GAIb,MAAMS,EAAavI,KAAKuI,YACrBvI,KAAKyJ,kBACJzJ,KAAK0J,QAASnB,EAAWC,SAAYD,EAAWoB,KAAK9G,SACtD0F,EAAWS,SAAQ,GAAMnG,QACzB7C,KAAK2J,SACN3J,KAAKoI,OACLpI,KAAKmJ,cAAc,UAmChB,KAAA3E,KAAO,IACLxE,KAAK4J,QAAO,GAGd,KAAAtF,MAAQ,IACNtE,KAAK4J,QAAO,GAGd,KAAAxB,KAAO,CAAC3C,EAAQzF,KAAKqG,gBAC1B,IAAIZ,EACF,OAAO,EAUT,GAPIA,EAAMpB,QACRoB,EAAMnB,QAGRmB,EAAMa,YAAc,GACpB,OAAcb,EAAO,SAElBA,IAAUzF,KAAKqG,aAAc,CAC9B,MAAMD,EAAUpG,KAAK2F,aAAa1C,IAAIwC,GACtC,GAAGW,MAAAA,OAAO,EAAPA,EAASyD,MAAO,CACjBpE,EAAM9C,IAAM,GACZ,MAAMoF,EAAS3B,EAAQ2B,OACjB+B,EAAI1D,EAAQ2D,YAAc/J,KAAK0F,UAAY1F,KAAKyF,MAChDuE,EAAUF,EAAE7G,IAAI8E,GACnBiC,IACDA,EAAQ/I,OAAOmF,EAAQ4B,KAEnBgC,EAAQpC,MACVkC,EAAE7I,OAAO8G,IAIbtC,EAAMlD,SAENvC,KAAK2F,aAAa1E,OAAOwE,GAG3BzF,KAAKqG,kBAAerC,EACpBhE,KAAKiK,sBAAmBjG,EAG1B,OAAO,GAGF,KAAAkG,SAAYlH,IACjB,MAAM,OAAC+E,EAAM,IAAEC,GAAOhF,EAChB+G,EAAc/J,KAAKmK,cAAcJ,YACzB/J,KAAKoK,SAASrC,EAAQC,EAAK+B,GAMnCvF,OAEN9B,YAAW,KACT1C,KAAKqK,2BAA2BtC,EAAQC,EAAK+B,KAC5C,IAGE,KAAAd,GAAK,CAACpG,EAAgByH,KAC3B,MAAM/B,EAAavI,KAAKuI,WACxB,IAAGvI,KAAKyJ,iBAAoBlB,EAI5B,MAA6B,UAA1BvI,KAAKiK,iBACC1B,EAAWgC,QAAQ1H,EAAQyH,GAE3B/B,EAAWU,GAAGpG,EAAQyH,IAY1B,KAAAE,YAAcxK,KAAKyK,qBAAqBxE,GAAUjG,KAAK4J,QAAO,EAAM3D,KACpE,KAAAyE,aAAe1K,KAAKyK,qBAAqBxE,GAAUjG,KAAK4J,QAAO,EAAO3D,KACtE,KAAA0E,YAAc3K,KAAKyK,qBAAqBxE,GAAUjG,KAAKoI,KAAKnC,KAC5D,KAAA2E,oBAAsB5K,KAAKyK,qBAAoB,CAACxE,EAAOG,IAAYpG,KAAKmG,aAAaC,EAASH,KAC9F,KAAA4E,mBAAqB7K,KAAKyK,qBAAoB,CAACxE,EAAOG,IAAYpG,KAAK0G,YAAYN,EAASH,KAC5F,KAAA6E,cAAgB9K,KAAKyK,qBAAoB,CAACxE,EAAOG,IAAYpG,KAAK6G,OAAOT,EAASH,KAClF,KAAA8E,YAAc/K,KAAKyK,qBAAqBxE,GAAUA,GAASjG,KAAK2J,SAChE,KAAAqB,gBAAkBhL,KAAKyK,qBAAqBxE,GAAUA,EAAQjG,KAAKiL,YAAYhF,GAASjG,KAAK4I,aAE7F,KAAAe,KAAO,IACL3J,KAAKiJ,GAAG,GAGV,KAAAL,SAAW,KAChB,IAAG5I,KAAKiL,YAAYjL,KAAKqG,cAIzB,OAAOrG,KAAKiJ,IAAI,IA/qBlBiC,UAAUlE,GAOR,GANAhH,KAAKgH,SAAWA,EAChBhH,KAAKmL,UAAYC,SAASC,cAAc,OAExCrL,KAAKmL,UAAUG,MAAMC,QAAU,iBAC/BH,SAASI,KAAKC,OAAOzL,KAAKmL,WAEvB/F,UAAUsG,aAAc,CACzB,MAAMC,EAAwE,CAC5EnH,KAAMxE,KAAKwK,YACXlG,MAAOtE,KAAK0K,aACZtC,KAAMpI,KAAK2K,YACXiB,aAAc5L,KAAK4K,oBACnBiB,YAAa7L,KAAK6K,mBAClBiB,OAAQ9L,KAAK8K,cACbiB,cAAe/L,KAAKgL,gBACpBgB,UAAWhM,KAAK+K,aAGlB,IAAI,MAAMkB,KAAUN,EAClB,IACEvG,UAAUsG,aAAaQ,iBAAiBD,EAA8BN,EAAQM,IAC9E,MAAM1G,GACN4G,QAAQC,KAAK,wCAAyCH,IAK5D,qBAA2B,uBAAwB9E,IACjD,MAAMxD,EAAM3D,KAAK8F,wBAAwBqB,GACzC,GAAGxD,EACD,IAAI,MAAM8B,KAAS9B,EACjB3D,KAAK+G,oBAAoBtB,MAK/B,qBAA2B,cAAc,KACpCzF,KAAKqM,mBACNrM,KAAKqM,oBAAqB,GAIxBrM,KAAKsE,SAAWtE,KAAKiI,KACvBjI,KAAKiI,IAAI3D,WAIb,MAAMgI,EAAuD,GAChD,CACX,SACA,QACA,eACA,OACA,SAEGxH,SAASyH,IACZ,MAAMC,EAAQ,IAAMD,EACpBD,EAAWC,GAAO,CAChBtJ,IAAK,IAAMjD,KAAKwM,GAChB7I,IAAM8I,IACDzM,KAAKwM,KAAUC,IAKlBzM,KAAKwM,GAAQC,GACVzM,KAAKqG,cAAyB,SAARkG,GAA4C,UAA1BvM,KAAKiK,kBAAyC,UAARsC,IAE/EvM,KAAKqG,aAAakG,GAAOE,GAGhB,iBAARF,QAAoDvI,IAA1BhE,KAAKiK,mBAChCjK,KAAK+F,cAAc/F,KAAKiK,kBAAoBwC,GAG9CzM,KAAK0M,+BAIXxI,OAAOyI,iBAAiB3M,KAAMsM,GAGxBI,yBACN1M,KAAKmJ,cAAc,iBAAkBnJ,KAAK4M,qBAGrCA,oBACL,MAAM,OAACC,EAAM,MAAEC,EAAK,aAAEpF,EAAY,cAAE3B,EAAa,KAAEtC,EAAI,MAAEiG,GAAS1J,KAClE,MAAO,CACL6M,OAAAA,EACAC,MAAAA,EACApF,aAAAA,EACA3B,cAAAA,EACAtC,KAAAA,EACAiG,MAAAA,GAIGqD,kBAAkBC,GACvBhN,KAAK+F,cAAgBiH,EAAOjH,cAC5B/F,KAAKiN,QAAUD,EAAOH,OACtB7M,KAAKkN,OAASF,EAAOF,MACrB9M,KAAKmN,cAAgBH,EAAOtF,aAC5B1H,KAAKoN,MAAQJ,EAAOvJ,KACpBzD,KAAKqN,OAASL,EAAOtD,MAqBhB4D,SAASpF,EAA0BqF,EAAmB1D,GAC3D,MAAM,OAAC9B,EAAM,IAAEC,GAAOE,EAGhB4B,EADgB5B,EAAQsF,OAAOC,aACbzN,KAAK0F,UAAY1F,KAAKyF,MAC9C,IAAIuE,EAAUF,EAAE7G,IAAIiF,EAAQH,QACxBiC,GACFF,EAAEnG,IAAIuE,EAAQH,OAAQiC,EAAU,IAAIzI,KAGtC,IAAIkE,EAAQuE,EAAQ/G,IAAI+E,GACxB,GAAGvC,EACD,OAAOA,EAGT,MAAM9D,GAAM,OAAoBuG,GAChC8B,EAAQrG,IAAIqE,EAAKvC,EAAQ2F,SAASC,cAA2B,UAAb1J,EAAIC,MAAiC,UAAbD,EAAIC,KAAmB,QAAU,UAIzF,UAAbD,EAAIC,MACL6D,EAAMiI,aAAa,cAAe,QAIpC,MAAMtH,EAAwB,CAC5B2B,OAAAA,EACAC,IAAAA,EACAb,MAAOxF,EAAIgG,GACXhG,IAAAA,EACAuG,QAAAA,EACA2B,MAAAA,EACAE,YAAa7B,EAAQsF,OAAOC,cAG9BzN,KAAK2F,aAAahC,IAAI8B,EAAOW,GAG7BX,EAAMoH,OAAS,EAGf7M,KAAKmL,UAAUM,OAAOhG,GAEtBA,EAAMkI,iBAAiB,OAAQ3N,KAAK6H,QACpCpC,EAAMkI,iBAAiB,QAAS3N,KAAKsJ,SACrC7D,EAAMkI,iBAAiB,QAAS3N,KAAKuJ,SAErB,UAAb5H,EAAIC,OAAoBsG,MAAAA,OAAO,EAAPA,EAASsF,OAAOI,eAAgB1F,EAAQ2F,SAAW,UAC5EpI,EAAMkI,iBAAiB,cAAc,KACnC3N,KAAKgH,SAAS8G,mBAAmBC,aAAahG,EAAQ,CAACC,MACtD,CAACgG,MAAM,IAiBZ,MAAMC,GAAW,SACjB,GAAGV,EACDU,EAASC,cACJ,CACL,MAAMC,EAAIjG,EAAQsF,OAAOC,aAAezN,KAAK6F,6BAA+B7F,KAAK4F,oBACjF,IAAIwI,EAAiBD,EAAElL,IAAI8E,GACvBqG,GACFD,EAAExK,IAAIoE,EAAQqG,EAAiB,IAAI7M,KAGrC6M,EAAezK,IAAIqE,EAAKiG,GAoB1B,OAjBAA,EAASI,MAAK,IAAW,EAAD,gCAItB,GAAG1M,EAAIyF,0BAA4BpH,KAAKgH,SAASO,cAAcC,gBAAgB7F,IAAM8F,IACnFzH,KAAK+G,oBAAoBtB,OACpB,CACL,IAAI9B,EAAM3D,KAAK8F,wBAAwBnE,EAAIgG,IACvChE,IACFA,EAAM3D,KAAK8F,wBAAwBnE,EAAIgG,IAAM,IAAIvG,KAGnDuC,EAAI5C,IAAI0E,GACR,qBAAoC,CAACA,MAAO9D,UAIzC8D,EAGF2E,SAASrC,EAAgBC,EAAa+B,GAC3C,MAAMD,GAAKC,EAAc/J,KAAK0F,UAAY1F,KAAKyF,OAAOxC,IAAI8E,GAC1D,OAAO+B,MAAAA,OAAC,EAADA,EAAG7G,IAAI+E,GAmCRX,uBAAuB5B,GAC7BA,EAAMkI,iBAAiB,QAAQ,KAM7B,MAAMrH,EAAcb,EAAMa,YAG1Bb,EAAMkI,iBAAiB,YAAY,KACjClI,EAAMa,YAAcb,EAAMmB,SAAW,EAErCnB,EAAMkI,iBAAiB,YAAY,KACjClI,EAAMa,YAAcA,EAIhBb,EAAMpB,QACRoB,EAAMjB,SAEP,CAACwJ,MAAM,MACT,CAACA,MAAM,OAIP3D,2BAA2BtC,EAAgBC,EAAa+B,GAC7D,MAAMoE,EAAIpE,EAAc/J,KAAK6F,6BAA+B7F,KAAK4F,oBAC3DoE,EAAUmE,EAAElL,IAAI8E,GACtB,IAAIiC,EACF,OAGF,MAAMsE,EAAUtE,EAAQ/G,IAAI+E,GACzBsG,IACDA,EAAQJ,UACRlE,EAAQ/I,OAAO+G,GAEXgC,EAAQpC,MACVuG,EAAElN,OAAO8G,IAQRwG,kBAAkB9I,GAEvB,QAASA,EAAM+I,gBAGTC,mBAAmBhJ,EAAyBgH,GAElDhH,EAAM+I,gBAAkB/B,EAGZiC,gBAAgBxG,EAA0B7B,EAAerG,KAAKqG,c,iDAC1E,GAAG+E,SAASuD,wBACV,aAGI,OAAYtI,OAAcrC,GAAW,GAE3C,MAAMrC,GAAM,OAAoBuG,GAE1B0G,EAAwB,GAExBC,EAAuB,UAAblN,EAAIC,MAAiC,UAAbD,EAAIC,KAC5C,IAAIkN,EAAQ,GAAIC,EAAS,GAEzB,GAAa,QAAV,EAAApN,EAAIqN,cAAM,eAAEnM,OAAQ,CACrB,MAAM+E,EAAOjG,EAAIqN,OAAOrN,EAAIqN,OAAOnM,OAAS,GAC5C,IAAK+E,EAAqCqH,MAAO,CAC/C,MAAM3H,QAAqBtH,KAAKgH,SAASO,cAAcC,gBAAgB7F,EAAKiG,EAAKhG,MAE9E0F,EAAaG,IACdmH,EAAQvM,KAAK,CACXM,IAAK2E,EAAaG,IAClByH,MAAO,GAAItH,EAA6BuG,KAAMvG,EAA6BuH,IAC3EvN,KAAM,eAGS,qBAAoC,CAAC6D,MAAO9D,EAAKyN,MAAOxH,IAChEyG,MAAK,KACTrO,KAAKqG,eAAiBA,GAAiBiB,EAAaG,KAIvDzH,KAAK0O,gBAAgBxG,YAItB,GAAG2G,EAAS,CACjB,MAAM9G,EAASG,EAAQ2F,QAAU3F,EAAQH,aACjB/H,KAAKgH,SAASqI,gBAAgBC,aAAavH,GAqBnE+G,QAAc,OAAa/G,GAAQ,GAAM,GACzCgH,EAAS,YAAyB,UAAbpN,EAAIC,KAAmB,cAAgB,eAAe,GAG7E,IAAIiN,EAAS,CACX,MAAMU,EAAY5N,EAAI6N,WAAW9O,MAAM6O,GAA8B,2BAAhBA,EAAUE,IAC/DX,EAAwB,QAAhB,EAAAS,MAAAA,OAAS,EAATA,EAAWT,aAAK,QAAInN,EAAI+N,UAChCX,EAASQ,MAAAA,OAAS,EAATA,EAAWI,UAGlBf,EAAQ/L,SACP,EAAA+M,SACE,IACDhB,EAAQvM,KAAK,CACXM,IAAK,8CACLuM,MAAO,UACPtN,KAAM,cAGRgN,EAAQvM,KAAK,CACXM,IAAK,kCACLuM,MAAO,UACPtN,KAAM,cAIV,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,KAAKkD,SAAS8C,IACzC,MAAMsH,EAAQ,GAAGtH,KAAQA,IACzBgH,EAAQvM,KAAK,CACXM,IAAK,6BAA6BuM,QAClCA,MAAAA,EACAtN,KAAM,kBAMd,MAAMiO,EAAW,IAAIC,cAAc,CACjChB,MAAAA,EACAC,OAAAA,EACAH,QAAAA,IAGFxJ,UAAUsG,aAAamE,SAAWA,KAG7BE,sBACL,MAAM,aAAC1J,GAAgBrG,KACvB,IAAIqG,EAAc,OAClB,MAAM6B,EAAUlI,KAAKmI,kBAAkB9B,GACvCrG,KAAK0O,gBAAgBxG,EAAS7B,GAGxB8B,kBAAkB1C,GAExB,OADgBzF,KAAK2F,aAAa1C,IAAIwC,GACvByC,QAQVkB,oBACL,MAAM,aAAC/C,GAAgBrG,KACvB,IAAIqG,EACF,OAGF,MAAM6B,EAAUlI,KAAKmI,kBAAkB9B,GACvC,MAAO,CACL1E,KAAK,OAAoBuG,GACzBA,QAAAA,EACAzC,MAAOY,EACP2J,eAAgBhQ,KAAK4M,qBAqGlBvD,wBACLrJ,KAAKqM,oBAAqB,EAC1B,kBAAwB,cAOnBzC,OAAOpF,EAAgBiB,EAAQzF,KAAKqG,cACzC,QAAIZ,SAIQzB,IAATQ,IACDA,EAAOiB,EAAMpB,QAGZoB,EAAMpB,SAAWG,IAIjBA,EACDiB,EAAMjB,OAENiB,EAAMnB,SAGD,IA+EDmG,oBAAoBwF,GAK1B,OAJ4C7J,IAC1C6J,EAAGjQ,KAAKiI,IAAK7B,IA2BV6E,YAAYxF,GACjB,OAAGA,MAAAA,OAAK,EAALA,EAAOa,aAAc,IACtBb,EAAMa,YAAc,EACpBtG,KAAK4J,QAAO,EAAMnE,IACX,GAMJyK,aAAazK,GAClBzF,KAAKmQ,kBAAoB1K,EAGpB2K,iBAAiBC,GACtB,QAAG,OAAUrQ,KAAKmK,cAAekG,KAIjCrQ,KAAKmK,eAAgB,OAAKkG,IACnB,GAGFC,mBACL,OAAOtQ,KAAKmK,cAGPjB,WAAWV,EAAoB+H,EAAoB5G,GACxD,IAAIpB,EAAavI,KAAKuI,WAClBA,EAiBFA,EAAWiI,QAhBXjI,EAAavI,KAAKuI,WAAa,IAAI,IAAiB,CAClDkI,UAAW,GACXC,aAAc,EACdC,YAAczI,IACZlI,KAAKsN,SAASpF,GAAS,GAChB,CAACH,OAAQG,EAAQH,OAAQC,IAAKE,EAAQF,MAE/C4I,OAAQ,CAAC5N,EAAM6N,KACb7Q,KAAKkK,SAASlH,IAEhB8N,UAAW,KACT9Q,KAAKmJ,cAAc,QACnBnJ,KAAKoI,UAOX,MAAM2I,OAA0C/M,IAAhChE,KAAKmK,cAAc6G,SAChCT,EACDhI,EAAWW,WAAWqH,EAAM5G,EAAMoH,GAElCxI,EAAWwI,QAAUA,EAGvBxI,EAAW6H,iBAAiBpQ,KAAKmK,eACjC5B,EAAWC,QAAUA,EAErBD,EAAW3F,MAAK,GAChB2F,EAAW3F,MAAK,GAGVqO,gCAAgC/I,GACtC,MAAMvG,GAAM,OAAoBuG,GAChC,IAAIgJ,EAA+B,QASnC,OARGvP,MAAAA,OAAG,EAAHA,EAAKC,QACU,UAAbD,EAAIC,MAAiC,UAAbD,EAAIC,KAC7BsP,EAAY,QACS,UAAbvP,EAAIC,OACZsP,EAAY,UAITA,EAGF7I,SAAS5C,EAAyByC,GACvC,MAAMgJ,EAAYlR,KAAKiR,gCAAgC/I,GAEvDlI,KAAKmN,cAAgBnN,KAAK+F,cAAcmL,GAExClR,KAAKqG,aAAeZ,EACpBzF,KAAKiK,iBAAmBiH,EACxBlR,KAAKqG,aAAawG,OAAS7M,KAAK6M,OAChC7M,KAAKqG,aAAayG,MAAQ9M,KAAK8M,MAC/B9M,KAAKqG,aAAaqB,aAAe1H,KAAK0H,aAErB,UAAdwJ,IACDlR,KAAKqG,aAAa5C,KAAOzD,KAAKyD,MAG7B,iBAAkB2B,WACnBpF,KAAK0O,gBAAgBxG,GAIlBiJ,eAAe1L,EAA0ByC,GAC9C,MAAM7B,EAAerG,KAAKqG,aAEpB+K,EAAapR,KAAKsE,QAExB,IAAIuD,EAyBJ,OAxBGpC,GACDoC,EAAS,KACP,MAAMI,EAAMjI,KAAKiI,IACdA,GACDA,EAAI3D,QAGNtE,KAAKqJ,yBAGH5D,EAAMpB,QACRwD,IAGFpC,EAAMkI,iBAAiB,OAAQ9F,IAE/B7H,KAAKqJ,wBAGPrJ,KAAKkQ,kBAAalM,GACfyB,EAAOzF,KAAKqI,SAAS5C,EAAOyC,GAC1BlI,KAAKqG,kBAAerC,EACzBhE,KAAKqR,iBAAgB,GAEd,CAACC,EAAaF,KACnBpR,KAAKqR,iBAAgB,GAElBhL,IACErG,KAAK2F,aAAa1C,IAAIoD,GACvBrG,KAAKqI,SAAShC,EAAcrG,KAAKmI,kBAAkB9B,IAEnDrG,KAAK2J,QAAU3J,KAAK4I,YAKrB5I,KAAKqG,eAAiBZ,IACvBzF,KAAKqG,kBAAerC,EACpBhE,KAAKiK,sBAAmBjG,GAGvByB,GACDA,EAAM8L,oBAAoB,OAAQ1J,GAQjCyJ,GACDtR,KAAKwE,QAKJ6M,gBAAgBG,GACrBxR,KAAKyJ,iBAAmB+H,EAGnBC,oBAAoBxL,GACzBjG,KAAKiI,IAAMhC,EAIX,MAAMyL,EAAiB,IAAI,IAC3BA,EAAe3Q,IAAIkF,EAAnByL,CAA0B,yBAAyB,KAC9C1R,KAAKiI,MAAQhC,IAIhBjG,KAAKiI,SAAMjE,EAKX0N,EAAeC,eACd,CAAC3D,MAAM,IAEV0D,EAAe3Q,IAAIkF,EAAnByL,CAA0B,QAAS5J,IAC9B9H,KAAKqG,eAAiBJ,GACvBjG,KAAKsE,QAGPtE,KAAKqJ,4BAUX,MAAMuI,EAA6B,IAAIpM,EACvC,gCAA4CoM,EAC5C,W,ohBC97Be,MAAMC,UAAuB,IAU1C9R,cA4BE,IAAI+R,EA3BJC,MAAM,IAAI,IAAiB,CACzBpB,YAAc3N,IACZ,MAAMgP,EAAqD,gCAArChS,KAAKmK,cAAc8H,YAAYxC,GAC/C,IAACzH,EAAG,OAAED,GAAU/E,EAChByC,GAA8B,OAAoBzC,GAExD,GAAIyC,KAEDuM,GAAkBH,EAAeK,mCAAmCzM,IAIvE,MAAO,CAACvD,QAAS,KAAqB8F,IAAAA,EAAKD,OAAAA,MAE3C,CAAC,SAAU,YA8GjB,KAAAoK,YAAoB9R,GAAqC,EAAD,gCACtDL,KAAKoS,gBAAgBpS,KAAKqS,iBAAiBhS,EAAO0H,OAAQ1H,EAAO2H,KAAM3H,EAAO6B,SAAU,MAG1F,KAAAoQ,YAAoBjS,GAAqC,EAAD,gCACtDL,KAAKoS,gBAAgBpS,KAAKqS,iBAAiBhS,EAAO0H,OAAQ1H,EAAO2H,KAAM3H,EAAO6B,QAAS,MAGzF,KAAAqQ,cAAgB,KACd,MAAMlS,EAASL,KAAKK,OACpB,IAAI,IAAoBA,EAAO0H,OAAQ,CAAC1H,EAAO2H,KAAM,QAAQ,KAC3DhI,KAAKK,OAAS,CAAC6B,QAASlC,KAAKwS,QAAQ/M,OACrCzF,KAAKyS,YAIT,KAAAC,eAAiB,KACf,MAAMrS,EAASL,KAAKK,OACjBA,EAAO2H,KAER,IAAI,IAAa,CACf,CAAC3H,EAAO0H,QAAS,CAAC1H,EAAO2H,OACxB,IACMhI,KAAKyS,WAKlB,KAAAE,cAAsB7K,GAAkB,EAAD,gCACrC,MAAM,IAACE,EAAG,OAAED,GAAU/H,KAAKK,OAC3B,GAAG2H,GAAOA,IAAQ4K,OAAOC,iBAAkB,CACzC,MAAMC,EAAW9S,KAAKmK,cAAc2I,SAC9B5K,QAAgBlI,KAAKqS,iBAAiBtK,EAAQC,GACpDhI,KAAKyS,MAAM3K,GAEVuG,MAAK,IAAW,EAAD,gCACd,GAAG,aAAqB,CACtB,MAAM0E,EAAM,YAAuB,KAChCA,GACDA,EAAIN,QAIR,iBAA0B,CACxB1K,OAAQG,EAAQH,OAChBiL,UAAWhL,EACXpG,KAAMkR,EAAW,kBAAe9O,EAChC8O,SAAAA,aAMR,KAAAG,gBAAkB,IAAW,EAAD,gCAC1B,MAAM,OAAClL,EAAM,IAAEC,GAAOhI,KAAKK,OACrB6H,QAAgBlI,KAAKqS,iBAAiBtK,EAAQC,GAC9CvC,GAAQ,OAAoByC,GAC9BzC,GACJ,mBAAkC,CAACA,MAAAA,EAAOyN,QAAS,4CAtKnDlT,KAAKuI,WAAWuI,UAAY,KAC1B9Q,KAAKyS,SAOPzS,KAAKwS,QAAQW,QAAU/H,SAASC,cAAc,OAC9CrL,KAAKwS,QAAQW,QAAQC,UAAUrS,IAAI,IAAyB,WAAY,sBAGxE,MAAMsS,EAAoB,KACrBvB,GACDwB,aAAaxB,GAGfA,EAAiByB,OAAO7Q,YAAW,KACjCoP,OAAiB9N,EACjBhE,KAAKwS,QAAQW,QAAQC,UAAU7Q,OAAO,gBACrC,MAELvC,KAAKwS,QAAQW,QAAQxF,iBAAiB,cAAc,KAC9C,eAEJ3N,KAAKwS,QAAQW,QAAQC,UAAUrS,IAAI,cAEhC+Q,IACDwB,aAAaxB,GACbA,OAAiB9N,GAGnBoH,SAASuC,iBAAiB,WAAY0F,EAAmB,CAACrF,MAAM,QAGxC,IAAI,KAAWhO,KAAKwS,QAAQW,SACpCK,mBAAqBH,EAGvCrT,KAAKyT,SAAShI,OAAOzL,KAAKwS,QAAQW,UAElC,QAAiBnT,KAAK0T,QAAQzS,OAAQjB,KAAKuS,eAE3C,MAAMmB,EAAmC,CAAC1T,KAAK2T,eAAiB,CAC9DC,KAAM,UACNC,KAAM,UACNC,QAAS9T,KAAK0S,gBACb1S,KAAK+T,gBAAkB,CACxBH,KAAM,WACNC,KAAM,+BACNC,QAAS9T,KAAKiT,iBACbjT,KAAKgU,cAAgB,CACtBJ,KAAM,gBACNC,KAAM,SACNC,QAAS9T,KAAKuS,gBAGhBvS,KAAKiU,iBAAiBP,GAItB1T,KAAKkU,eAlFH/J,oBACF,OAAOnK,KAAKuI,WAAW4B,cAoFf+J,eACRnC,MAAMmC,gBACN,QAAiBlU,KAAK0T,QAAQS,QAASnU,KAAK0S,iBAC5C,QAAiB1S,KAAKoU,OAAOjJ,UAAWnL,KAAK2S,eAE7C,MAAM0B,EAAkBvM,IACtB,MAAMwM,GAAI,OAAUxM,EAAEzH,OAAQ,KACxBkU,GAAU,OAAgBzM,EAAEzH,OAAQ,WAC1C,GAAGiU,aAAaE,qBAAuBD,GAAWvU,KAAKwS,QAAQW,QAAQC,UAAUqB,SAAS,uBAAwB,CAChH,MAAMC,EAAUJ,EAAEK,aAAa,WAC/B,IAAID,GAAWA,EAAQE,SAAS,mBAC9B,OAUF,OAPA,OAAY9M,GAEZ9H,KAAKyS,QAAQpE,MAAK,KAChBrO,KAAKwS,QAAQW,QAAQ5B,oBAAoB,QAAS8C,EAAgB,CAACQ,SAAS,IAC5EP,EAAEQ,YAGG,IAIX9U,KAAKwS,QAAQW,QAAQxF,iBAAiB,QAAS0G,EAAgB,CAACQ,SAAS,IAejExC,iBAAiBtK,EAAgBC,GACzC,OAAOhI,KAAKmK,cAAcJ,YAAc/J,KAAKgH,SAAS8G,mBAAmBiH,0BAA0BhN,EAAQC,GAAOhI,KAAKgH,SAAS8G,mBAAmBuE,iBAAiBtK,EAAQC,GAgEtKgN,WAAW9M,GACjB,MAAMiL,EAAWjL,EAA4BA,QAC7C,IAAI+M,EAA2C,GAC5C9B,IACD8B,GAAO,QAAa9B,EAAS,CAC3B+B,SAAWhN,EAA4BiN,kBAK3C,OAAanV,KAAKwS,QAAQW,QAAQiC,kBAAmBH,GACrDjV,KAAKwS,QAAQW,QAAQC,UAAUxJ,OAAO,QAASuJ,GAI1C/C,iBAAiBC,GAGtB,OAFArQ,KAAKuI,WAAW6H,iBAAiBC,GAE1BrQ,KAGIoS,UAAUlK,EAAoB7H,EAAsBgV,EAAY,EAAGtE,GAAU,EACxFuE,EAA0C,GAAIC,EAA0C,I,6GACxF,GAAGvV,KAAKwV,gBAAiB,OAAOxV,KAAKwV,gBAErC,MAAMxN,EAAME,EAAQF,IACd6F,EAAU3F,EAA4BuN,WAAavN,EAAQ2F,OAAU3F,EAA4BuN,SAASC,UAAYxN,EAAQ2F,OAC9HpI,GAAQ,OAAoByC,GAE5ByN,QAAmB3V,KAAKgH,SAASqI,gBAAgBsG,WAAWzN,EAAQH,QACpE6N,EAAiC,mBAAd1N,EAAQuH,EAC3BoG,EAAqBD,WAA4B5V,KAAKgH,SAAS8G,mBAAmBgI,WAAW5N,IAC7F6N,GAAuBH,EAAmBD,EAAaE,MAAwB,OAAoB3N,GACzG,CAAClI,KAAK0T,QAAQS,QAASnU,KAAK2T,eAAezR,SAAS4C,SAASkR,IAC3DA,EAAO5C,UAAUxJ,OAAO,OAAQiM,MAGlC7V,KAAKyT,SAASL,UAAUxJ,OAAO,cAAemM,GAE9C,CAAC/V,KAAK0T,QAAQuC,SAAUjW,KAAK+T,gBAAgB7R,SAAS4C,SAASkR,IAC7DA,EAAO5C,UAAUxJ,OAAO,OAAQmM,MAGlC,MAAMG,QAAyBlW,KAAKgH,SAAS8G,mBAAmBoI,iBAAiBhO,GACjF,CAAClI,KAAK0T,QAAQzS,OAAQjB,KAAKgU,cAAc9R,SAAS4C,SAASkR,IACzDA,EAAO5C,UAAUxJ,OAAO,QAASsM,MAGnClW,KAAKgV,WAAW9M,GAChB,MAAMoG,EAAU,EAAM6H,WAAU,UAAC1Q,EAAOyC,EAAQkO,KAAMvI,EAAQwH,EAAWhV,EAAQ0Q,EAASuE,EAAaC,EAAarN,GAIpH,OAHAlI,KAAKK,OAAO2H,IAAMA,EAClBhI,KAAKK,OAAO0H,OAASG,EAAQH,OAEtBuG,KAGF+H,0CAA0C5Q,GAC/C,MAAmB,UAAZA,EAAMgK,GAAiB,QAA+BhK,EAAM6Q,c,sPC3QxD,MAAMC,UAAoB,IAoBvCxW,aAAY,MAACkG,EAAK,KAAEzB,GAAO,EAAK,WAAEgS,GAAa,EAAK,SAAE5P,EAAQ,yBAAE6P,EAAwB,MAAEC,EAAK,WAAEC,IAuC/F,GA9BA5E,QAEA/R,KAAKiG,MAAQA,EACbjG,KAAK4W,QAAUxL,SAASC,cAAc,OACtCrL,KAAK4W,QAAQxD,UAAUrS,IAAI,gBAE3Bf,KAAKyW,yBAA2BA,EAChCzW,KAAK0W,MAAQA,EACb1W,KAAK2W,WAAaA,EAElB3W,KAAK0R,eAAiB,IAAI,IAE1B1R,KAAK6W,MAAM,CACT3U,QAASlC,KAAK4W,QACdlF,eAAgB1R,KAAK0R,eACrBoF,gBAAiB,MACP9W,KAAKiG,MAAM5B,QAAYrE,KAAK+W,oBAAuB/W,KAAK+W,mBAAmB3D,UAAUqB,SAAS,cAExGuC,uBAAwB,uBACxBC,qBAAsB,mBAGxBhR,EAAMiR,WAAWC,aAAanX,KAAK4W,QAAS3Q,GAC5CjG,KAAK4W,QAAQQ,YAAYnR,GAEzBjG,KAAKqX,KAAO,UAEZrX,KAAKsX,YAAY1Q,GACjB5G,KAAKiU,mBAEY,YAAdjU,KAAKqX,KAAoB,CAC1B,MAAME,EAAWvX,KAAK4W,QAAQY,cAAc,qCAC5CxX,KAAKyX,SAAW,IAAI,IAAkBxR,EAAOuQ,GAC7Ce,EAASG,QAAQ1X,KAAKyX,SAAStM,WAG9B3G,GACeyB,EAAMzB,OACdmT,OAAOpS,IACG,oBAAbA,EAAIqS,OACL3R,EAAM6G,OAAQ,EACd7G,EAAM1B,UAAW,EACjB0B,EAAMzB,WAEPqT,SAAQ,KACT7X,KAAK4W,QAAQxD,UAAUxJ,OAAO,cAAe5J,KAAKiG,MAAM5B,WAKtDiT,YAAYQ,GAClB,MAAM,QAAClB,EAAO,MAAE3Q,EAAK,KAAEoR,EAAI,eAAE3F,GAAkB1R,KAE/C4W,EAAQxD,UAAUrS,IAAIsW,GAEtB,MAAMpC,EAAOjV,KAAK+X,gBAElB,IAAIC,EAEJ,GAHApB,EAAQqB,mBAAmB,YAAahD,GAG5B,YAAToC,EAAoB,CACrBrX,KAAK+W,mBAAqB/W,KAAK4W,QAAQY,cAAc,kBACrDxX,KAAKkY,UAAYlY,KAAK4W,QAAQY,cAAc,QAE5C,MAAM5N,EAASgN,EAAQuB,iBAAiB,WAClCC,EAAmBxB,EAAQY,cAAc,eACzCa,EAAczB,EAAQY,cAAc,iBAC1CQ,EAAepB,EAAQY,cAAc,kBACrCQ,EAAaM,aAAc,EAAAC,EAAA,GAA0B,EAAjBtS,EAAMW,UAE1C,MAAM4R,EAAiB,IAAI,IAAe9G,GAEpC+G,EAAe7B,EAAQY,cAAc,kBAU3C,GATAgB,EAAeE,IAAItF,UAAU7Q,OAAO,YACpCkW,EAAatB,aAAaqB,EAAeE,IAAKL,EAAYM,eAE1DC,MAAMC,KAAKjP,GAAQ9E,SAASkR,KAC1B,QAAiBA,GAAQ,KACvBhW,KAAK8Y,eACJ,CAACpH,eAAgB1R,KAAK0R,oBAGxB1R,KAAKkY,UAAW,EACjB,QAAiBlY,KAAKkY,WAAW,KAC/BlY,KAAKiG,MAAM8S,4BACV,CAACrH,eAAgB1R,KAAK0R,iBAEzB,MAAMgF,EAASzO,IACbjI,KAAK4W,QAAQtL,MAAM0N,WAAa/Q,EAAM,SAAU,GAC7CjI,KAAK0W,OACN1W,KAAK0W,MAAMzO,IAITgR,EAAe,GACfC,GAAe,EAAAC,EAAA,GAASzC,EAAOuC,GAAc,GAAO,GAE1DvH,EAAe3Q,IAAIkF,EAAnByL,CAA0B,yBAAyB,KACjDwH,GAAa,GAEbxH,EAAe3Q,IAAIkF,EAAnByL,CAA0B,yBAAyB,KACjD,MAMM0H,EAAW1H,EAAe3Q,IAAIkF,EAAnByL,CAA0B,SAN3B,KACd4B,aAAa+F,GACVrZ,KAAK2W,YACN3W,KAAK2W,eAGoD,CAAC3I,MAAM,IAC9DqL,EAAU3W,YAAW,KACzBgP,EAAenP,OAAO6W,KACrBH,KACF,CAACjL,MAAM,OAGZ0D,EAAe3Q,IAAIkF,EAAnByL,CAA0B,yBAAyB,KACjDwH,GAAa,MAIb,OACF,QAAiBjT,GAAO,KACtBjG,KAAK8Y,eACJ,CAACpH,eAAgB1R,KAAK0R,iBAEzBA,EAAe3Q,IAAIqK,SAAnBsG,CAA6B,WAAY5J,IACvC,GAAGwR,EAAA,iBAAgC,GAAKlO,SAASuD,0BAA4B1I,EAC3E,OAGF,MAAM,IAACsG,EAAG,KAAEgN,GAAQzR,EAEpB,IAAI0R,GAAO,EACX,GAAY,SAATD,EACDvZ,KAAKyZ,wBACA,GAAY,SAATF,EACR3H,EAAA,SAAoCA,EAAA,aAC/B,GAAY,UAAT2H,EACRvZ,KAAK8Y,kBACA,IAAGhR,EAAE4R,QAAoB,UAATH,GAA6B,UAATA,GAQjC3C,EAAQxD,UAAUqB,SAAS,qBAAgC,cAARlI,GAA+B,eAARA,EAIlFiN,GAAO,EAHI,cAARjN,EAAqBqF,EAAA,eAAwC,CAAC3F,OAAQ,iBACpE2F,EAAA,cAAuC,CAAC3F,OAAQ,oBAVO,CAC5D,MAAMlL,EAAe,UAATwY,EAAmB,GAAK,EAC9B7R,EAAekK,EAAA,eAEf+H,EADMpD,EAAYqD,eAAeC,QAAQnS,GACzB3G,EACnB4Y,GAAW,GAAKA,EAAUpD,EAAYqD,eAAe/W,SACtD+O,EAAA,eAA0C2E,EAAYqD,eAAeD,IASzE,OAAGH,IACD,EAAAM,EAAA,GAAYhS,IACL,QAFT,MAOJ4J,EAAe3Q,IAAIkF,EAAnByL,CAA0B,YAAY,KAChC,KACF1R,KAAKyZ,uBAIT,QAAiBrB,GAAkB,KACjCpY,KAAKyZ,qBACJ,CAAC/H,eAAgB1R,KAAK0R,kBAEzB,QAAsBkF,EAAS5W,KAAK+Z,aAAaC,KAAKha,KAAMoY,GAAmB1G,GAE/EA,EAAe3Q,IAAIkF,EAAnByL,CAA0B,cAAc,KACtC2G,EAAYC,aAAc,EAAAC,EAAA,GAA6B,EAApBtS,EAAMK,gBAG3CoL,EAAe3Q,IAAIkF,EAAnByL,CAA0B,QAAQ,KAChCkF,EAAQxD,UAAUrS,IAAI,UAElB,KACF2Q,EAAe3Q,IAAIkF,EAAnByL,CAA0B,QAAQ,KAChC1R,KAAKia,cAAa,QAGrB,CAACjM,MAAM,IAEV0D,EAAe3Q,IAAIkF,EAAnByL,CAA0B,SAAS,KACjC1R,KAAKka,cAAa,MAGpBxI,EAAe3Q,IAAI6Q,EAAA,EAAnBF,CAA+C,kBAAkB,KAC/D1R,KAAKma,yBAITzI,EAAe3Q,IAAIkF,EAAnByL,CAA0B,QAAQ,KAChCkF,EAAQxD,UAAUrS,IAAI,iBAGxB2Q,EAAe3Q,IAAIkF,EAAnByL,CAA0B,SAAS,KACjCkF,EAAQxD,UAAU7Q,OAAO,iBAGxB0D,EAAMW,UAAYkR,EACnBE,EAAaM,aAAc,EAAAC,EAAA,GAAShS,KAAKmD,MAAMzD,EAAMW,UAAYkR,KAEjE,EAAAsC,EAAA,GAAYnU,GAAOoI,MAAK,KACtB2J,EAAaM,aAAc,EAAAC,EAAA,GAAShS,KAAKmD,MAAMzD,EAAMW,cAKjDkS,aACR9Y,KAAKiG,MAAMjG,KAAKiG,MAAM5B,OAAS,OAAS,WAGlC0T,gBACN,MAAMV,EAAOrX,KAAKqX,KAClB,GAAY,YAATA,EACD,MAAO,0BACUA,iFACHA,gEACAA,mJAGkBA,oVAQAA,gGACvB,EAAAgD,WAAajP,SAASkP,wBAA0B,2BAA2BjD,gEAAqE,2CACzHA,uHAO1BpD,mBACR,MAAMP,EAA4C6C,EAAYqD,eAAeW,KAAI,CAACC,EAAM1R,KAC/E,CAEL2R,YAAaD,EAAO,IACpB1G,QAAS,KACPlC,EAAA,eAA0C4I,OAI1CE,GAAU,OAAWhH,GAC3BgH,EAAQtH,UAAUrS,IAAI,aACtB,OACEf,KAAK+W,mBACL/W,KAAKyW,yBAA2B,KAC9BzW,KAAKyW,0BAAyB,SAC5BzS,OACJA,EACAhE,KAAKyW,yBAA2B,KAC9BzW,KAAKyW,0BAAyB,SAC5BzS,GAENhE,KAAK+W,mBAAmBtL,OAAOiP,GAE/B1a,KAAKma,sBAGGA,sBACR,MAAMpD,EAAqB/W,KAAK+W,mBAChCR,EAAYoE,qBAAqB7V,SAAS8V,IACxCA,EAAY,SAAWA,EACvB7D,EAAmB3D,UAAU7Q,OAAOqY,MAGtC,IAAI9R,EAAMyN,EAAYqD,eAAeC,QAAQjI,EAAA,iBACjC,IAAT9I,IAAYA,EAAMyN,EAAYqD,eAAeC,QAAQ,IAExD9C,EAAmB3D,UAAUrS,IAAI,SAAWwV,EAAYoE,qBAAqB7R,IAGrE2Q,mBACR,MAAMrX,EAASpC,KAAK4W,QAGpB,GAAG,EAAAiE,gBAAiB,CAClB,MAAM5U,EAAQjG,KAAKiG,MAGnB,OAFAA,EAAM6U,6BACN7U,EAAM8U,mBAIJ,WAyBF,WAdA,QAAkB3Y,GAkBZ2X,aAAa3B,GACrB,MAAM4C,GAAS,UACfhb,KAAK4W,QAAQxD,UAAUxJ,OAAO,mBAAoBoR,GAC9CA,GAKF5C,EAAiBhF,UAAU7Q,OAAO,oBAClC6V,EAAiBhF,UAAUrS,IAAI,qBAC/BqX,EAAiB1K,aAAa,QAAS,sBANvC0K,EAAiBhF,UAAU7Q,OAAO,qBAClC6V,EAAiBhF,UAAUrS,IAAI,oBAC/BqX,EAAiB1K,aAAa,QAAS,gBAQpCuN,UACLlJ,MAAMkJ,UACNjb,KAAK0R,eAAeC,YACpB3R,KAAKyX,SAASyD,kBACdlb,KAAKyW,yBAA2BzW,KAAK0W,WAAQ1S,GA/WhC,EAAA4V,eAAiB,CAAC,GAAK,EAAG,IAAK,GAC/B,EAAAe,qBAAuB,CAAC,cAAe,cAAe,cAAe,e,giBC6BtF,MASaQ,EAAyB,eAEvB,MAAMC,UAIV,IAmETrb,YACYwI,EACV8S,GAEAtJ,OAAM,GAHI,KAAAxJ,WAAAA,EA9DF,KAAA6L,OAA6E,GAC7E,KAAA5B,QAAgG,GAChG,KAAAkB,QAAwH,GAIxH,KAAA4H,OAAS,EACT,KAAAC,UAAkC,KAClC,KAAAC,oBAA4C,KAO5C,KAAAC,aAAc,EAId,KAAAC,OAAStQ,SAASuQ,eAAe,cAejC,KAAAC,aAKN,GAGM,KAAAC,gBAAkB,EAClB,KAAAC,gBAAkB,EAClB,KAAAC,WAAa,EACb,KAAAC,WAAa,EA2Rb,KAAAC,aAAe,CAACxP,EAAQzM,KAAK4b,aAAaM,cAAczP,SA5VzC,IA8VpBA,IACDzM,KAAK+b,WAAa,EAClB/b,KAAKgc,WAAa,GAGpBhc,KAAKmc,gBAAgB7Q,MAAM8Q,UAAY,UAAU3P,YAAgBA,MAAUzM,KAAK+b,eAAe/b,KAAKgc,cAEpGhc,KAAK4b,aAAaS,OAAOjJ,UAAUxJ,OAAO,WApWvB,KAoWmC6C,GACtDzM,KAAK4b,aAAaU,MAAMlJ,UAAUxJ,OAAO,WApWtB,IAoWkC6C,GAErDzM,KAAKuc,WAxWkB,IAwWP9P,IAmFlB,KAAAqH,QAAWhM,IACT,GAAG9H,KAAKwc,yBAA0B,OAElC,MAAMnc,EAASyH,EAAEzH,OACjB,GAAsB,MAAnBA,EAAOoc,QAAiB,OAG3B,IAFA,EAAA3C,EAAA,GAAYhS,GAET,IAYD,OAXG9H,KAAK0c,0BACNpJ,aAAatT,KAAK0c,2BAElB1c,KAAKyT,SAASL,UAAUrS,IAAI,4BAG9Bf,KAAK0c,0BAA4BnJ,OAAO7Q,YAAW,KACjD1C,KAAKyT,SAASL,UAAU7Q,OAAO,uBAC/BvC,KAAK0c,0BAA4B,IAChC,MAKL,MAAMC,EAAY3c,KAAK2c,YACvB,IAAIC,EAAqB,KACzB,MAAMC,EAAa,CAAC,eAAgB,uBAAwB,sBAAuB,uBAAwB,kBACxGF,GACDE,EAAWxa,KAAK,uBAGlBwa,EAAWnc,MAAMoJ,IACf,IAEE,GADA8S,GAAQ,EAAAE,EAAA,GAAgBzc,EAAQyJ,GAC7B8S,EAAO,OAAO,EACjB,MAAMrX,GAAM,OAAO,MAGiBqX,IAAWD,GAAiC,QAAnBtc,EAAOoc,SAAwC,UAAnBpc,EAAOoc,UAClGzc,KAAKyS,SAID,KAAAsK,UAAajV,IAEnB,GAAGwR,EAAA,iBAAgC,EACjC,OAGF,MAAM/M,EAAMzE,EAAEyE,IAEd,IAAIiN,GAAO,EACA,eAARjN,EACDvM,KAAK0T,QAAQ/J,KAAKmL,QACF,cAARvI,EACRvM,KAAK0T,QAAQnD,KAAKuE,QACF,MAARvI,GAAuB,MAARA,EACpBvM,KAAKgd,aACNhd,KAAKid,WAAmB,MAAR1Q,GAGlBiN,GAAO,GAGN1R,EAAEoV,SAAWpV,EAAEqV,WAChBnd,KAAKgd,aAAc,GAGlBxD,IACD,EAAAM,EAAA,GAAYhS,IAIR,KAAAsV,QAAWtV,IACdwR,EAAA,iBAAgC,GAI9BxR,EAAEoV,SAAWpV,EAAEqV,UAClBnd,KAAKgd,aAAc,EAEhBhd,KAAK2c,aACN3c,KAAKic,iBAKH,KAAAoB,QAAWvV,IACjB,KAAGwR,EAAA,iBAAgC,IAAM,EAAAwD,EAAA,GAAgBhV,EAAEzH,OAAQ,0BAA4BL,KAAKgd,gBAIpG,EAAAlD,EAAA,GAAYhS,GAET9H,KAAKgd,aAAa,CACnB,MAAMM,EAAcxV,EAAEyV,OAAS,EAE/Bvd,KAAKid,aAAaK,KAncpBtd,KAAKgH,SAAWwW,EAAA,WAEhBxd,KAAKyd,KAAM,EAAAC,EAAA,IAAO,OAClB1d,KAAKub,UAAY,IAAI,IACrBvb,KAAKwb,oBAAsB,IAAI,IAAqB,CAClDmC,YAAY,EACZnH,YAAY,IAEdxW,KAAKub,UAAUrQ,YACflL,KAAKwb,oBAAoBtQ,YACzBlL,KAAK4d,cAAgB,IAAI,IAEzB5d,KAAKyT,SAAWrI,SAASC,cAAc,OACvCrL,KAAKyT,SAASL,UAAUrS,IAAIoa,EAAyB,UAErDnb,KAAK6d,YAAczS,SAASC,cAAc,OAC1CrL,KAAK6d,YAAYzK,UAAUrS,IAAI,YAE/B,MAAM+c,EAAU1S,SAASC,cAAc,OACvCyS,EAAQ1K,UAAUrS,IAAIoa,GAEtB,MAAM4C,EAAS/d,KAAK+d,OAAS3S,SAASC,cAAc,OACpD0S,EAAO3K,UAAUrS,IAAIoa,EAAyB,UAAWA,EAAyB,WAElF,MAAM6C,EAAa5S,SAASC,cAAc,OAC1C2S,EAAW5K,UAAUrS,IAAIoa,EAAyB,gBAElDnb,KAAK0T,QAAQ,iBAAkB,OAAW,QAAS,CAACuK,YAAY,IAGhEje,KAAKoU,OAAOjJ,UAAYC,SAASC,cAAc,OAC/CrL,KAAKoU,OAAOjJ,UAAUiI,UAAUrS,IAAIoa,EAAyB,UAAW,aACxE,MAAM+C,EAAc9S,SAASC,cAAc,OAE3CrL,KAAKoU,OAAO+J,SAAW,IAAI,IAC3Bne,KAAKoU,OAAO+J,SAAS/K,UAAUrS,IAAIoa,EAAyB,WAAY,aAExEnb,KAAKoU,OAAOgK,OAAShT,SAASC,cAAc,OAC5CrL,KAAKoU,OAAOgK,OAAOhL,UAAUrS,IAAIoa,EAAyB,SAE1Dnb,KAAKoU,OAAOgC,KAAOhL,SAASC,cAAc,OAC1CrL,KAAKoU,OAAOgC,KAAKhD,UAAUrS,IAAIoa,EAAyB,SAExD+C,EAAYzS,OAAOzL,KAAKoU,OAAOgK,OAAQpe,KAAKoU,OAAOgC,MAEnDpW,KAAKoU,OAAOjJ,UAAUM,OAAOzL,KAAKoU,OAAO+J,SAAUD,GAGnD,MAAMG,EAAajT,SAASC,cAAc,OAC1CgT,EAAWjL,UAAUrS,IAAIoa,EAAyB,YAElDE,EAAWiD,OAAO,CAAC,WAAY,OAAQ,UAAUxZ,SAAS8S,IACxD,MAAM5B,GAAS,OAAW4B,EAAM,CAAC2G,UAAU,IAC3Cve,KAAK0T,QAAQkE,GAAQ5B,EACrBqI,EAAW5S,OAAOuK,MAGpBhW,KAAK0T,QAAQ8K,KAAKpL,UAAUrS,IAAI,WAGhCf,KAAK4b,aAAazQ,UAAYC,SAASC,cAAc,OACrDrL,KAAK4b,aAAazQ,UAAUiI,UAAUrS,IAAI,kBAE1Cf,KAAK4b,aAAaS,QAAS,OAAW,UAAW,CAACkC,UAAU,KAC5D,QAAiBve,KAAK4b,aAAaS,QAAQ,IAAMrc,KAAKid,YAAW,KACjEjd,KAAK4b,aAAaU,OAAQ,OAAW,SAAU,CAACiC,UAAU,KAC1D,QAAiBve,KAAK4b,aAAaU,OAAO,IAAMtc,KAAKid,YAAW,KAEhEjd,KAAK4b,aAAaM,cAAgB,IAAI,IAAc,CAClDuC,KA7JY,GA8JZ9X,IA5JiB,GA6JjBH,IA5JiB,EA6JjBkY,gBAAgB,GA/JK,GAiKvB1e,KAAK4b,aAAaM,cAAchI,eAChClU,KAAK4b,aAAaM,cAAcyC,YAAY,CAC1CC,QAAS5e,KAAKic,aACd4C,UAAW,IAAM7e,KAAKic,iBAGxBjc,KAAK4b,aAAazQ,UAAUM,OAAOzL,KAAK4b,aAAaS,OAAQrc,KAAK4b,aAAaM,cAAc/Q,UAAWnL,KAAK4b,aAAaU,OAE1Htc,KAAKyT,SAAShI,OAAOzL,KAAK4b,aAAazQ,WAGvCnL,KAAKwS,QAAQsM,KAAO1T,SAASC,cAAc,OAC3CrL,KAAKwS,QAAQsM,KAAK1L,UAAUrS,IAAIoa,EAAyB,YAEzDnb,KAAKwS,QAAQrH,UAAYC,SAASC,cAAc,OAChDrL,KAAKwS,QAAQrH,UAAUiI,UAAUrS,IAAIoa,EAAyB,cAE9Dnb,KAAKwS,QAAQ/M,MAAQ2F,SAASC,cAAc,OAC5CrL,KAAKwS,QAAQ/M,MAAM2N,UAAUrS,IAAIoa,EAAyB,UAE1Dnb,KAAKwS,QAAQrH,UAAUM,OAAOzL,KAAKwS,QAAQ/M,OAE3CzF,KAAKwS,QAAQsM,KAAKrT,OAAOzL,KAAKwS,QAAQrH,WACtC2S,EAAQrS,OAAOzL,KAAKwS,QAAQsM,MAC5B9e,KAAK6d,YAAYpS,OAAOqS,GAGxBE,EAAWvS,OAAOzL,KAAK0T,QAAQ,gBAAiB1T,KAAKoU,OAAOjJ,WAC5D4S,EAAOtS,OAAOuS,EAAYK,GAE1Bre,KAAK0T,QAAQnD,KAAOnF,SAASC,cAAc,OAC3CrL,KAAK0T,QAAQnD,KAAKqK,UAAY,GAAGO,cAAmCA,kBACpEnb,KAAK0T,QAAQnD,KAAKwO,UAAY,2BAA2B5D,yBAEzDnb,KAAK0T,QAAQ/J,KAAOyB,SAASC,cAAc,OAC3CrL,KAAK0T,QAAQ/J,KAAKiR,UAAY,GAAGO,cAAmCA,mBACpEnb,KAAK0T,QAAQ/J,KAAKoV,UAAY,2BAA2B5D,yBAEzDnb,KAAKmc,gBAAkB/Q,SAASC,cAAc,OAC9CrL,KAAKmc,gBAAgB/I,UAAUrS,IAAIoa,EAAyB,WAE5Dnb,KAAKyT,SAAShI,OAAOzL,KAAK6d,YAAa7d,KAAK0T,QAAQnD,KAAMvQ,KAAK0T,QAAQ/J,KAAM3J,KAAK+d,OAAQ/d,KAAKmc,iBAI/Fnc,KAAKuI,WAAWyW,aAAe,KAC7Bhf,KAAK0T,QAAQnD,KAAK6C,UAAUxJ,OAAO,QAAS5J,KAAKuI,WAAWK,SAAS/F,QACrE7C,KAAK0T,QAAQ/J,KAAKyJ,UAAUxJ,OAAO,QAAS5J,KAAKuI,WAAWoB,KAAK9G,SAGnE7C,KAAKif,cA1IH5e,aACF,OAAOL,KAAKuI,WAAWC,QAGrBnI,WAAOoM,GACTzM,KAAKuI,WAAWC,QAAUiE,EAwIlByH,gBACR,QAAiBlU,KAAK0T,QAAQuC,SAAUjW,KAAKiT,iBAC7C,CAACjT,KAAK0T,QAAQjB,MAAOzS,KAAK0T,QAAQ,gBAAiB1T,KAAKwb,oBAAoBD,WAAWzW,SAASlE,KAC9F,QAAiBA,EAAIZ,KAAKyS,MAAMuH,KAAKha,UAGtC,CAAC,EAAE,EAAGA,KAAK0T,QAAQnD,MAAO,CAAC,EAAGvQ,KAAK0T,QAAQ/J,OAAmC7E,SAAQ,EAAEoa,EAAYlJ,MAEnGA,EAAOrI,iBAAiB,SAAU7F,KAChC,EAAAgS,EAAA,GAAYhS,GACT9H,KAAKwV,iBAERxV,KAAKuI,WAAWU,GAAGiW,UAIvB,QAAiBlf,KAAK0T,QAAQ8K,MAAM,KAC/Bxe,KAAK2c,YAAa3c,KAAKuc,YAAW,GAEnCvc,KAAKid,YAAW,MAMpBjd,KAAKyT,SAAS9F,iBAAiB,QAAS3N,KAAK8T,SAE7C9T,KAAKuI,WAAWqI,OAAS,CAAC5N,EAAM6N,KAC3BA,EAAO7Q,KAAKsS,YAAYtP,GACtBhD,KAAKmS,YAAYnP,IAGrB,KACoB,IAAI,IAAa,CACpCd,QAASlC,KAAKyT,SACd0L,QAAS,CAACC,EAAOC,KACf,KAAG,UAMH,OADiB9Y,KAAK+Y,IAAIF,GAASG,EAAA,QACrB,IAAMH,EAAQ,KAGvBA,EAAQ,EACTpf,KAAK0T,QAAQnD,KAAKuE,QAElB9U,KAAK0T,QAAQ/J,KAAKmL,SAGb,IAGSvO,KAAK+Y,IAAID,GAASE,EAAA,SACrB,IAAMF,EAAQ,OAC3Brf,KAAKyS,SACE,IAKX+M,kBAAoBC,GAEyB,UAAvCA,EAAIpf,OAAuBoc,WAAuB,EAAAK,EAAA,GAAgB2C,EAAIpf,OAAQ,0BAUhFkc,WAAWmD,GACnB,MAAMC,EAAY3f,KAAK2c,YAKvB,IAJG3c,KAAK4b,aAAaM,cAAc0D,WAAa5f,KAAKgd,eACnD0C,GAAS,GAGRC,IAAcD,EAAQ,YAEX1b,IAAX0b,IACDA,GAAUC,GAGZ3f,KAAK0T,QAAQ8K,KAAKpL,UAAUxJ,OAAO,WAAY8V,GAC/C1f,KAAK4b,aAAazQ,UAAUiI,UAAUxJ,OAAO,aAAc8V,GAC3D,MAAMG,EAAYH,EAAS1f,KAAK4b,aAAaM,cAAczP,MAAQ,EAQnE,GAPAzM,KAAKic,aAAa4D,GAClB7f,KAAK4b,aAAaM,cAAc4D,YAAYD,GAEzC7f,KAAK+f,aACN/f,KAAK+f,YAAYC,cAAaN,QAAiB1b,GAG9C0b,EAAQ,CACT,GAAI1f,KAAKigB,iBAuBPjgB,KAAKigB,iBAAiB/L,mBAvBG,CACzB,IAAIgM,EAAmBC,EACvB,MAAMC,GAAc,EACpBpgB,KAAKigB,iBAAmB,IAAI,IAAa,CACvC/d,QAASlC,KAAKmc,gBACdkE,aAAc,KACZH,EAAYC,EAAY,EACxBngB,KAAKmc,gBAAgB/I,UAAUrS,IAAI,kBAErCoe,QAAS,CAACC,EAAOC,MACdD,EAAOC,GAAS,CAACD,EAAQgB,EAAYf,EAAQe,GAC9CpgB,KAAK+b,YAAcqD,EAAQc,EAC3BlgB,KAAKgc,YAAcqD,EAAQc,GAC1BD,EAAWC,GAAa,CAACf,EAAOC,GAEjCrf,KAAKic,gBAEPqE,QAAS,KACPtgB,KAAKmc,gBAAgB/I,UAAU7Q,OAAO,kBAExCge,OAAQ,SAMZvgB,KAAK4b,aAAaM,cAAc4D,YAAYD,QACnCH,GACT1f,KAAKigB,iBAAiB/E,kBAIhB+B,WAAWlc,GACnBf,KAAK4b,aAAaM,cAAcsE,YAzVlB,IAyV2Czf,EAAM,GAAK,IACpEf,KAAKic,eAkBGU,YACR,OAAO3c,KAAK4b,aAAazQ,UAAUiI,UAAUqB,SAAS,cAG9CR,iBAAiBP,GACzB,MAAM+M,GAAgB,OAAiB,CAACxC,YAAY,GAAO,cAAevK,GAC1E1T,KAAK+d,OAAOtS,OAAOgV,GAGdhO,MAAM3K,G,MAKX,GAJGA,IACD,EAAAgS,EAAA,GAAYhS,GAGX9H,KAAKwc,yBAA0B,OAAOkE,QAAQC,SAE9C3gB,KAAK4gB,gBACNC,EAAA,aAAmC7gB,KAAK4gB,gBAG1C5gB,KAAK4d,cAAckD,QAEnB,MAAMxS,EAAUtO,KAAK+gB,iBAA4B,QAAX,EAAA/gB,KAAKK,cAAM,eAAE6B,SAAS,GAAMmM,MAAK,EAAE2S,eAAAA,KAAoBA,IAyB7F,OAvBAhhB,KAAKuI,WAAWiI,QACfxQ,KAAKuI,WAAqC0S,SAAYjb,KAAKuI,WAAqC0S,UACjGjb,KAAKwV,gBAAkB,KACvBxV,KAAKsb,QAAU,EACX/H,OAAe0N,iBAAmBjhB,OACnCuT,OAAe0N,oBAAiBjd,GASnChE,KAAKkhB,wBAELlhB,KAAKigB,sBAAmBjc,EAExBsK,EAAQuJ,SAAQ,KACd7X,KAAKyT,SAASlR,SACdvC,KAAKmhB,eAAc,MAGd7S,EAGC6S,cAAcC,GACtB9H,EAAA,kBAAiC8H,EACjCthB,EAAA,mBAAsCshB,GAG9BC,sBAAsBD,GAC3BA,EAAQphB,KAAKshB,qBACXthB,KAAKkhB,wBAGFA,wBACLlhB,KAAKigB,kBACNjgB,KAAKigB,iBAAiB/E,kBAGxB3H,OAAOhC,oBAAoB,UAAWvR,KAAK+c,WAC3CxJ,OAAOhC,oBAAoB,QAASvR,KAAKod,SACzC7J,OAAOhC,oBAAoB,QAASvR,KAAKqd,QAAS,CAACxI,SAAS,IAGpDyM,qBACLthB,KAAK2c,aACN3c,KAAKigB,iBAAiB/L,eAGxBX,OAAO5F,iBAAiB,UAAW3N,KAAK+c,WACxCxJ,OAAO5F,iBAAiB,QAAS3N,KAAKod,SAClC,KAAoB7J,OAAO5F,iBAAiB,QAAS3N,KAAKqd,QAAS,CAACkE,SAAS,EAAO1M,SAAS,IAsGnFkM,iBAAiB1gB,EAAqBmhB,GAAU,EAAOnM,EAAY,G,yCACjFrV,KAAKmJ,cAAc,kBAEnB,MAAMyT,EAAQ5c,KAAKwS,QAAQoK,MAEvB4E,IACF5E,EAAMmC,UAAY,IAIpB,MAAMc,EAAY7f,KAAK2c,aAAe6E,EAAyBxhB,KAAK4b,aAAaM,cAAczP,MAxiBxE,EAyiBezM,KAAKyhB,sBAAsB7E,GAEjE,MAAM8E,EAA0B,IAAdrM,EAEZsM,EAAQnE,EAAA,6BAAwCkE,EAAY,IAAM,IAAO,EAY/E,IAAIE,EAEAC,EACDxhB,IACEA,aAAkB,KAAiBA,EAAO+S,UAAUqB,SAAS,cAC9DmN,EAAavhB,EACbwhB,EAAOxhB,EAAOyhB,yBACNzhB,aAAkB0hB,iBAAmB1hB,EAAOsY,yBAAyBqJ,yBAC7EJ,GAAa,EAAA9E,EAAA,GAAgBzc,EAAQ,cACrCwhB,EAAOD,EAAWE,yBACVzhB,EAAO+S,UAAUqB,SAAS,4BAClCmN,GAAa,EAAA9E,EAAA,GAAgBzc,EAAQ,6BACrCwhB,EAAOD,EAAWE,wBAGfN,GAAWnhB,EAAOyhB,wBAAwBG,OAASJ,EAAKI,OACzD5hB,EAASuhB,EAAaC,OAAO7d,KAK/B3D,IACFA,EAASL,KAAKwS,QAAQ/M,OAGpBoc,IACFD,EAAavhB,EAAOsY,cACpBkJ,EAAOxhB,EAAOyhB,yBAGhB,IAAII,GAAc,EAClB,GAAG7hB,IAAWL,KAAKwS,QAAQ/M,QAAUpF,EAAO+S,UAAUqB,SAAS,0BAA2B,CACxF,MAAM0N,GAAkB,EAAArF,EAAA,GAAgB8E,EAAY,cAC9CQ,GAAc,EAAAC,EAAA,GAAeT,EAAYO,GAAiB,IAE7DX,GAAaY,GAAiD,IAAlCA,EAAYE,SAASC,UAAsD,IAApCH,EAAYE,SAASE,YAIjFJ,GAAkD,IAAlCA,EAAYE,SAASC,UAAsD,IAApCH,EAAYE,SAASE,aACpFN,GAAc,IAHdN,GADAvhB,EAASL,KAAKwS,QAAQ/M,OACFkT,cACpBkJ,EAAOxhB,EAAOyhB,yBAMlB,MAAMW,EAAgBziB,KAAKwS,QAAQ/M,MAAMqc,wBAEzC,IACIG,EACAS,EA6BAC,EA/BAvG,EAAY,GAgChB,GA5BGsF,GACDO,EAAqB,IAAd5M,EAAkBkK,EAAA,SAAoBkD,EAAcG,MAC3DF,EAAMD,EAAcC,MAEpBT,EAAOJ,EAAKI,KACZS,EAAMb,EAAKa,KAWbtG,GAAa,eAAe6F,OAAUS,UAYnCriB,aAAkBwiB,kBAAoBxiB,aAAkBmC,kBAAuC,QAAnBnC,EAAOoc,QAAmB,CACvG,GAAGG,EAAMxH,mBAAqBwH,EAAMxH,kBAAkBhC,UAAUqB,SAAS,yBAA0B,CACjGkO,EAAW/F,EAAMxH,kBAEjB,MAAMhT,EAASugB,EAASnL,cAAc,iBACtC,GAAGpV,EAAQ,CACT,MAAM6D,EAAQ7D,EAAOgT,kBACrBuN,EAASlX,OAAOxF,GAChB7D,EAAOG,SAGLogB,EAASrX,MAAMC,UACjBqR,EAAMxJ,UAAU7Q,OAAO,UACvBvC,KAAK8iB,cAAcH,EAAUF,EAAeZ,GACvCjF,EAAMmG,WACXnG,EAAMxJ,UAAUrS,IAAI,gBAGtB4hB,EAAWvX,SAASC,cAAc,OAClCsX,EAASvP,UAAUrS,IAAI,yBACvB6b,EAAMlF,QAAQiL,GAGhBA,EAASrX,MAAMC,QAAU,UAAUsW,EAAKe,oBAAoBf,EAAKmB,gCAAgCP,EAAcG,MAAQf,EAAKe,UAAUH,EAAcO,OAASnB,EAAKmB,cAGpKpG,EAAMtR,MAAMsX,MAAQH,EAAcG,MAAQ,KAC1ChG,EAAMtR,MAAM0X,OAASP,EAAcO,OAAS,KAI5C,MAAMC,EAASpB,EAAKe,MAAQH,EAAcG,MACpCM,EAASrB,EAAKmB,OAASP,EAAcO,OACvCtB,IACFtF,GAAa,WAAW6G,KAAUC,SAGpC,IAAIC,EAAe5P,OAAO6P,iBAAiBxB,GAAYyB,iBAAiB,iBACxE,MAAMC,EC9tBK,SAA2BC,GACxC,MAAMC,EAAWD,EAAIE,MAAM,KAC3B,GAAuB,IAApBD,EAAS3gB,OAAc,CACpB2gB,EAAS,KAAIA,EAAS,GAAK,OAC/B,IAAI,IAAIE,EAAIF,EAAS3gB,OAAQ6gB,EAAI,IAAKA,EACpCF,EAASE,GAAKF,EAASE,EAAI,IAAMF,EAAS,IAAM,MAIpD,OAAOA,EDqtBcG,CAAkBR,GAOrC,GANAA,EAAeG,EAAW/I,KAAKqJ,GAAOC,SAASD,GAAKX,EAAU,OAAMa,KAAK,KACrEpC,IACF9E,EAAMtR,MAAM6X,aAAeA,GAI1B3B,GAAyB,IAAd3B,EAAiB,CAG7B,MAAMkE,EAAaxE,EAAA,QAAmB,EAAIsC,EAAKe,MAAQ,EACjDoB,EAAYzE,EAAA,SAAoB,EAAIsC,EAAKmB,OAAS,EAClDf,EAAOJ,EAAKI,KAAO8B,EACnBrB,EAAMb,EAAKa,IAAMsB,EACvBhkB,KAAKmc,gBAAgB7Q,MAAM8Q,UAAY,UAAU6G,YAAiBC,MAAWjB,MAASS,UAEtF9F,EAAMtR,MAAM8Q,UAAYA,EAS1B,IAAI6H,EANJ/B,IAAgBtF,EAAMtR,MAAM4Y,QAAU,KAOtC,MAAMC,EAAQ9jB,EAAO+S,UAAUqB,SAAS,UAElCxG,EAAWjO,KAAKwc,0BAA2B,SAC3C4H,EAAM,CAACpD,eAAgB/S,GAEvBoL,EAAU3W,YAAW,KACrBuL,EAASoW,aAAgBpW,EAASqW,YACpCrW,EAASC,YAEV,KAYH,GAVAD,EAAS4J,SAAQ,KACf7X,KAAKmJ,cAAc,iBAEhBnJ,KAAKwc,2BAA6BvO,IACnCjO,KAAKwc,yBAA2B,MAGlClJ,aAAa+F,MAGXmI,EA+KF,OAlCGnhB,aAAkBkkB,gBACnBN,EAAOrH,EAAMpF,cAAc,QAExByM,GACDjkB,KAAKwkB,aAAaP,EAAMxB,EAAeQ,EAAQtB,GAAO,EAAOwC,EAAOhB,IAIrE9iB,EAAO+S,UAAUqB,SAAS,uBAC3BmI,EAAMxJ,UAAUrS,IAAI,UAGtBf,KAAKykB,mBAAkB,GAIvB/hB,YAAW,KACTka,EAAMtR,MAAM6X,aAAeA,EAExBvG,EAAMxH,oBACNwH,EAAMxH,kBAAkC9J,MAAM6X,aAAeA,KAE/DxB,EAAQ,GAEXjf,YAAW,KACTka,EAAMmC,UAAY,GAClBnC,EAAMxJ,UAAU7Q,OAAO,SAAU,SAAU,UAC3Cqa,EAAMtR,MAAMC,QAAU,iBAEtB0C,EAASC,YACRyT,GAEH/E,EAAMxJ,UAAU7Q,OAAO,WAEhB6hB,EA/KI,CACX,IAAIM,EACA/hB,EAGJ,MAAMgiB,EAAW,gCACXC,EAAYvkB,EAAOwkB,QAAQF,GAAYtkB,EAAOsY,cAAgBtY,EAC9DykB,EAAWlM,MAAMC,KAAK+L,EAAUzM,iBAAiBwM,IACvD,GAAGG,EAASjiB,OAAQ,CAClBxC,EAASykB,EAASC,MAClB,MAAMzhB,EAAS8H,SAASC,cAAc,UAChCgF,EAAU/M,EAAO0hB,WAAW,MAC/B3kB,aAAkBwiB,kBACnBvf,EAAOsf,MAAQviB,EAAO4kB,aACtB3hB,EAAO0f,OAAS3iB,EAAO6kB,eACf7kB,aAAkBmC,kBAC1Bc,EAAOsf,MAAQviB,EAAO8kB,WACtB7hB,EAAO0f,OAAS3iB,EAAO+kB,aACf/kB,aAAkBglB,oBAC1B/hB,EAAOsf,MAAQviB,EAAOuiB,MACtBtf,EAAO0f,OAAS3iB,EAAO2iB,QAGzB1f,EAAOsX,UAAY,yCACnBvK,EAAQiV,UAAUjlB,EAAgD,EAAG,GACrEA,EAASiD,EAIX,GAAsB,QAAnBjD,EAAOoc,SAAwC,mBAAnBpc,EAAOoc,QAA8B,CAClE,MACM8I,EADS3M,MAAMC,KAAKxY,EAAO8X,iBAAiB,QAC7B4M,MAClBQ,IACDb,EAAe,IAAIc,MACnB7iB,EAAM4iB,EAAM5iB,IACZia,EAAMnR,OAAOiZ,SAIV,GAAGrkB,aAAkBwiB,iBAC1B6B,EAAe,IAAIc,MACnB7iB,EAAMtC,EAAOsC,SACR,GAAGtC,aAAkBmC,iBAC1BkiB,GAAe,EAAAe,EAAA,KACff,EAAa/hB,IAAMtC,EAAOsC,SACrB,GAAGtC,aAAkBkkB,cAAe,CACzC,MAAMmB,EAASrlB,EAAOslB,QAAQD,OACxBE,EAAYF,EAAS,OAErB,MAAC9C,EAAK,OAAEI,GAAUP,EAElBoD,EAASza,SAAS0a,gBAAgB,6BAA8B,OACtED,EAAOE,eAAe,KAAM,QAAS,GAAKnD,GAC1CiD,EAAOE,eAAe,KAAM,SAAU,GAAK/C,GAG3C6C,EAAOE,eAAe,KAAM,UAAW,OAAOnD,KAASI,KACvD6C,EAAOE,eAAe,KAAM,sBAAuB,iBAEnDF,EAAO5N,mBAAmB,YAAa5X,EAAO+U,kBAAkB4Q,UAAUC,QAAQP,EAAQE,IAC1FC,EAAO5N,mBAAmB,YAAa5X,EAAO6lB,iBAAiBF,UAAUC,QAAQP,EAAQE,IAGzF,MAAMO,EAAON,EAAOzQ,kBACdgR,EAAMD,EAAK/Q,kBAAkBA,kBACnC,GAAGgR,aAAeC,cAAe,CAC/B,IAmBIC,EAnBAlK,EAAYgK,EAAIG,eAAe,KAAM,aACzCnK,EAAYA,EAAU6J,QAAQ,mDAAmD,CAAC3gB,EAAOkhB,EAAGC,EAAGC,EAAIC,IAU1F,aAPLH,EADO,IADTA,GAAKA,GAEC5D,EAAS,EAAIK,EAEb,EAAIA,MAGND,aAEmC0D,EAAKzD,OAAY0D,EAAKzD,OAE/DkD,EAAIL,eAAe,KAAM,YAAa3J,GAGtC6H,EAAOkC,EAAK/Q,kBAAkB8Q,iBAI9B,MAAMU,EAAuCzD,EAAaM,MAAM,KAAKlJ,KAAKsM,GAAMhD,SAASgD,KAC/EP,EAAPnC,GAAW,EAAA2C,EAAA,GAAiB,EAAG,EAAGlE,EAAQ,EAAIK,EAAQD,KAAW4D,IAC3D,EAAAE,EAAA,GAAiB,EAAI7D,EAAQ,EAAGL,EAAQ,EAAIK,EAAQD,KAAW4D,GACxE3C,EAAK8B,eAAe,KAAM,IAAKO,GAGjC,MAAMS,EAAgBlB,EAAOK,iBAC7Ba,EAAchB,eAAe,KAAM,QAAS,GAAKtD,EAAcG,OAC/DmE,EAAchB,eAAe,KAAM,SAAU,GAAKtD,EAAcO,QAEhEpG,EAAMlF,QAAQmO,QACNxlB,aAAkBglB,oBAC1BX,EAAerkB,GAGdsiB,IACDA,EAASrX,MAAM6X,aAAeA,EAE3BuB,GACD/B,EAASlX,OAAOiZ,IAIpBA,EAAe9H,EAAMpF,cAAc,cAChCkN,aAAwB7B,mBACzB6B,EAAatR,UAAUrS,IAAI,aACvB4hB,IACF+B,EAAapZ,MAAMsX,MAAQH,EAAcG,MAAQ,KACjD8B,EAAapZ,MAAM0X,OAASP,EAAcO,OAAS,MAGlDrgB,UACK,EAAAqkB,EAAA,IAA0BtC,EAAc/hB,KAYlDia,EAAMtR,MAAM2b,QAAU,IAEtB,SAAQ,KACNrK,EAAMxJ,UAAUrS,IAAI2gB,EAAY,SAAW,aAyG/C,OA5DA9E,EAAMxJ,UAAUrS,IAAI,iBAKd,UAON6b,EAAMtR,MAAM8Q,UAAY,eAAeqG,EAAcR,UAAUQ,EAAcC,0BAE7ER,IAAgBtF,EAAMtR,MAAM4Y,QAAU,IAEnCvB,GACD3iB,KAAK8iB,cAAcH,EAAUF,EAAeZ,GAK9Cnf,YAAW,KACTka,EAAMtR,MAAM6X,aAAe,GAExBvG,EAAMxH,oBACNwH,EAAMxH,kBAAkC9J,MAAM6X,aAAe,MAE/D,GAEHvG,EAAM+I,QAAQtM,QAAU,GAAK3W,YAAW,KACtCka,EAAMxJ,UAAU7Q,OAAO,SAAU,WAE9BogB,IACE/F,EAAMpF,cAAc,SACrBoF,EAAMxJ,UAAU7Q,OAAO,UACvBogB,EAASrX,MAAMC,QAAU,GACpBqR,EAAMmG,YAOfnG,EAAMxJ,UAAUrS,IAAI,SAAU,iBAM9B6b,EAAMxJ,UAAUrS,IAAI,iBACb6b,EAAM+I,QAAQtM,QAErBpL,EAASC,YACRyT,GAEAsC,GACDjkB,KAAKwkB,aAAaP,EAAMxB,EAAeQ,EAAQtB,GAAO,EAAMwC,EAAOhB,GAG9DiB,KAGCK,kBAAkBrD,GACvBA,EACDphB,KAAKyT,SAASL,UAAUrS,IAAI,WAE5Bf,KAAKyT,SAASL,UAAUrS,IAAI,aAC5B2B,YAAW,KACT1C,KAAKyT,SAASL,UAAU7Q,OAAO,YAC9B,IAIGugB,cAAcH,EAA0BF,EAAwBZ,GAQxE,MAAMqF,EAAazE,EAAcG,MAAQH,EAAcO,OAEvD,IAAI,MAACJ,EAAK,OAAEI,GAAUnB,EAInBqF,EAAa,EACdtE,EAAQI,EAASkE,EAEjBlE,EAASJ,EAAQsE,EAKnBvE,EAASrX,MAAMC,QAAU,UAAUqX,gBAAoBI,2BAAgCP,EAAcG,MAAQA,MAAUH,EAAcO,OAASA,SAItIwB,aAAaP,EAAsBpC,EAAeoB,EAAgBtB,EAAewF,EAAkBhD,EAAgBhB,GAC3H,MAAMiE,EAAQC,KAAKC,OACb,MAAC1E,EAAK,OAAEI,GAAUnB,EACxBF,GAAgB,EAEhB,MAAMiF,EAAKzD,EAAaM,MAAM,KAAKlJ,KAAKsM,GAAMhD,SAASgD,KAEjDpI,EAAO,KACX,MAAM8I,EAAOF,KAAKC,MAAQF,EAE1B,IAAI3P,EAAWkK,EAAQ4F,EAAO5F,EAAQ,EACnClK,EAAW,IAAGA,EAAW,GACzB0P,IAAS1P,EAAW,EAAIA,GAE3B,MAAM+P,EAAwCZ,EAAGrM,KAAKsM,GAAMA,EAAIpP,IAEhE,IAAI6O,EACMA,EAAPnC,GAAW,EAAA2C,EAAA,GAAiB,EAAG,EAAGlE,EAAS,EAAIK,EAASxL,EAAWuL,KAAWwE,IACxE,EAAAV,EAAA,GAAiB,EAAI7D,EAASxL,EAAU,EAAGmL,EAA4CI,KAAWwE,GAC3GvD,EAAK8B,eAAe,KAAM,IAAKO,GAE5BiB,EAAO5F,IAAO,QAAQlD,IAI3BA,IAGQgD,sBAAsB7E,GAC9B,GAAGA,EAAMxJ,UAAUqB,SAAS,UAAW,CAErC,MAAMoN,EAAO7hB,KAAKwS,QAAQ/M,MAAMqc,wBAChClF,EAAMtR,MAAM8Q,UAAY,eAAeyF,EAAKI,UAAUJ,EAAKa,WAC3D9F,EAAMxJ,UAAU7Q,OAAO,UAClBqa,EAAMmG,WACXnG,EAAMxJ,UAAU7Q,OAAO,kBAIjBklB,aAAa7K,EAAoB8K,GAAS,GAClD,MAAMC,EAAUpI,EAAA,QAEhBvf,KAAKyhB,sBAAsB7E,GAG3BA,EAAMxJ,UAAUrS,IAAI,UAEjB6b,EAAM+I,QAAQtM,SACf/F,cAAcsJ,EAAM+I,QAAQtM,SAG9B,MAAMwI,EAAOjF,EAAMkF,wBAEb8F,EAAehL,EAAMtR,MAAM8Q,UAAU6J,QAAQ,uBAAuB,CAAC3gB,EAAOuiB,KAChF,MAAMrB,EAAIkB,GAAU7F,EAAKe,MAAQ+E,EAGjC,OAAOriB,EAAM2gB,QAAQ4B,EAAIrB,EAAI,SAI/B5J,EAAMtR,MAAM8Q,UAAYwL,EAExBllB,YAAW,KACTka,EAAMra,WACL,KAGK0c,cACR,MAAM6I,EAAW1c,SAASC,cAAc,OAWxC,OAVAyc,EAAS1U,UAAUrS,IAAI,sBACvB+mB,EAASxc,MAAM2b,QAAU,OAEtBjnB,KAAKwS,QAAQoK,MACG5c,KAAKwS,QAAQoK,MACrBjE,cAAclN,OAAOqc,GAE9B9nB,KAAKmc,gBAAgB1Q,OAAOqc,GAGvB9nB,KAAKwS,QAAQoK,MAAQkL,EAGpBC,kBAAkB1nB,EAAqBoH,EAAagV,GAE5D,MAAM7b,EAAKP,EAAOoc,QAAQuL,gBAAkBvL,EAAUpc,EAASA,EAAOmX,cAAciF,GACpF,GAAG7b,KAAO,EAAAkc,EAAA,GAAgBzc,EAAQ,YAAa,CAC7C,IAAG,EAAAyc,EAAA,GAAgBzc,EAAQ,cAAe,CAExC,MAAMkb,EAAYlb,EAAOsY,cAAcA,cAAcnB,cAAc,wBACnE,GAAG+D,EAAW,CACZ,GAAe,UAAZkB,EAMD,YALGlB,EAAUnI,UAAUqB,SAAS,WAC9B8G,EAAUzG,SAOdyG,EAAUhZ,UAIV3B,EAAwB+B,MAAQ8E,IAClC,EAAAuf,EAAA,IAAmBpmB,EAAI6G,GAItB7G,EAAGwS,UAAUqB,SAAS,cAAgB7T,EAAG+X,cAAcvF,UAAUqB,SAAS,6BAC3E7T,EAAGwS,UAAU7Q,OAAO,cAQhB0lB,cAAcpa,EAAyBqa,GAC/C,MAAMC,EAAWta,EAAOsa,WACxB,IAAIC,EACJ,GAAGD,EACDC,GAAmB,OAAc,CAC/BrgB,OAAQ8F,EACRwa,QAAQ,EACRC,eAAe,EACfC,WAAW,QAER,CACL,MAAMzZ,EAAQsZ,EAAmBhd,SAASC,cAAc,QACxDyD,EAAMrD,QAAO,EAAA+c,EAAA,GAAc3a,IAC3BiB,EAAMsE,UAAUrS,IAAI,cAGtB,MAAM0nB,EAAYzoB,KAAKoU,OAAO+J,SACxBuK,EAAY1oB,KAAKoU,OAAO+J,SAAYsK,EAAUE,YAEpD,OAAOjI,QAAQkI,IAAI,CAChB5oB,KAAKoU,OAAO+J,SAA2B0K,kBAAkB,CACxD9gB,OAAQ8F,GAAoB,KAC5Bib,UAAWX,OAAWnkB,EAAY,GAAK6J,IAGzCua,IACC/Z,MAAK,EAAEoB,EAAGX,MACR9O,KAAKoU,OAAO+J,WAAauK,KAI5B,EAAAK,EAAA,GAAe/oB,KAAKoU,OAAOgC,MAAM,QAAmB8R,KACpD,EAAAa,EAAA,GAAe/oB,KAAKoU,OAAOgK,OAAQtP,GACnC2Z,EAAUO,YAAYhpB,KAAKoU,OAAO+J,cAItBhI,WACd1Q,EACAyiB,EACAra,EACAwH,EACAhV,EACA0Q,GAAU,EACVuE,EAA4B,GAC5BC,EAA4B,GAC5BrN,G,yCAGA,GAAGlI,KAAKwV,gBAAiB,OAAOxV,KAAKwV,gBAMrC,MAAMyT,EAAmBjpB,KAAKioB,cAAcpa,EAAQqa,GAE9CgB,EAAyB,aAAZzjB,EAAMgK,EACnB0Z,EAAUD,GAAczjB,EAAM6Q,YAAe,CAAC,QAAS,OAAgC1B,SAASnP,EAAM7D,OAA+C,IAAtC6D,EAAM6Q,UAAUuD,QAAQ,WAE1I7Z,KAAKyb,cAGNzb,KAAKyb,aAAc,EACnBzb,KAAKuI,WAAWW,WAAWoM,EAAaC,EAAaxE,GACpDwC,OAAe0N,eAAiBjhB,MAShCA,KAAKuI,WAAWoB,KAAK9G,OAAS,IAC/BH,YAAW,KACT1C,KAAKuI,WAAW3F,MAAK,KACpB,GAML5C,KAAK0T,QAAQnD,KAAK6C,UAAUxJ,OAAO,QAAS5J,KAAKuI,WAAWK,SAAS/F,QACrE7C,KAAK0T,QAAQ/J,KAAKyJ,UAAUxJ,OAAO,QAAS5J,KAAKuI,WAAWoB,KAAK9G,QAEjE,MAAMsI,EAAYnL,KAAKwS,QAAQ/M,MACzB2jB,GAAwB/oB,GAAUA,IAAW8K,EAChDie,IAAsB/oB,EAAS8K,GAElCnL,KAAKK,OAAS,CAAC6B,QAAS7B,GACxB,MAAMib,IAAWtb,KAAKsb,OAEnBnQ,EAAUiK,oBACXjK,EAAU4T,UAAY,IAKQ,IAAd1J,GAEhBrV,KAAKynB,aAAaznB,KAAKwS,QAAQoK,MAAqB,IAAdvH,GACtCrV,KAAKif,gBAELjf,KAAKmhB,eAAc,GACnBnhB,KAAKshB,2BACC2H,EAEFjpB,KAAKyT,SAASkF,gBAChB3Y,KAAK0b,OAAOvE,aAAanX,KAAKyT,SAAUrI,SAASuQ,eAAe,iBAC3D3b,KAAKyT,SAASsP,YAGrB/iB,KAAKykB,mBAAkB,GAEnB,EAAA4E,mBACFrpB,KAAK4gB,eAAiB,CACpBhf,KAAM,QACN0nB,MAAQC,IACN,GAAGvpB,KAAKwc,yBACN,OAAO,EAGTxc,KAAKyS,UAIToO,EAAA,WAAiC7gB,KAAK4gB,kBAM1C,MAAMhE,EAAQ5c,KAAKwS,QAAQoK,MAErB4M,EAAWjK,EAAA,QAGjB,IAAIkK,EAAU,EACd,MAAMC,EAAUnK,EAAA,SACbmK,EAAU,MAAYC,EAAA,aACvBF,EAAU,KAEZ,MAAMG,EAAYF,EAAU,IAAMD,EAClC,IAAII,EAA6BnJ,QAAQxS,UACzC,MAAMtG,GAAO,EAAAkiB,EAAA,GAAkBrkB,EAAO0F,EAAWqe,EAAUI,GAAWD,EAAA,gBAAoC3lB,KAAcklB,GAAczjB,EAAM0I,GAAK1I,EAAM0J,IAAI4a,UAC3J,GAAGX,EAAsB,CACvB,MAAM9hB,QAAqBtH,KAAKgH,SAASO,cAAcC,gBAAgB/B,EAAOmC,EAAKhG,MACnF,IAAIooB,EACJ,GAAG1iB,EAAa2iB,WACdD,EAAM,IAAIxE,MACVwE,EAAIrnB,IAAM2E,EAAaG,QAClB,CACL,MAAMyiB,GAAW,EAAAC,EAAA,GAAyB1kB,EAAO6B,GAAc,GAC5D4iB,IACDL,EAAeK,EAASE,YACxBJ,EAAME,EAAS3E,OAIhByE,IACDA,EAAI5W,UAAUrS,IAAI,aAClBoK,EAAUM,OAAOue,IASrB,MAAM5iB,KAAgC8hB,IAAczjB,EAAM2B,mBACpDmU,EAAYnU,EAAoBpH,KAAKwb,oBAAsBxb,KAAKub,UAEhE/T,EAAkB,IACfxH,KAAKgH,SAASO,cAAcC,gBAAgB/B,EAAOmC,MAAAA,OAAI,EAAJA,EAAMhG,MAGlE,IAAI4T,EACJ,GAAG2T,EAAS,CAKV,MAAMkB,EAAgBniB,GAA0B,QAAfzC,EAAM7D,KACjCqE,GAED,EAAAwf,EAAA,GAAY,CAACxd,IAAKoiB,IAEpBrqB,KAAKyT,SAASL,UAAUqB,SAAS,gBAClCxO,EAAM0H,iBAAiB,cAAemM,EAAA,GAGxC,MAAMnW,EAAM,IAAM3D,KAAK+gB,iBAAiB1gB,GAAQ,EAAOgV,GAAWhH,MAAK,EAAE2S,eAAAA,MAKvE,MAAMsJ,EAAM1N,EAAMxH,mBAAqBwH,EAAMxH,kBAAkBhC,UAAUqB,SAAS,yBAA2BmI,EAAMxH,kBAAoBwH,EAGjI2N,EAAa3N,EAAMpF,cAAc,SACpC+S,GACDA,EAAWhoB,SAKb0D,EAAMyH,aAAa,cAAe,QAGlCzH,EAAM0H,iBAAiB,cAAc,KAChC3N,KAAKsb,SAAWA,GACjBrV,EAAM3B,WAIVtE,KAAK2N,iBAAiB,iBAAiB,KACrC1H,EAAMtD,IAAM,GACZsD,EAAMrD,SACL,CAACoL,MAAM,IAEP,EAAAvL,YAGDwD,EAAM1B,UAAW,GAGD,QAAfkB,EAAM7D,MACPqE,EAAM6G,OAAQ,EACd7G,EAAM1B,UAAW,EACjB0B,EAAMxC,MAAO,GACLgC,EAAMmB,SAAW,KACzBX,EAAMxC,MAAO,GAIf6mB,EAAI7e,OAAOxF,GAGX,MAAMukB,EAAiB,IAAI9J,SAASxS,IAClCjI,EAAM0H,iBAAiB,UAAWO,EAAS,CAACF,MAAM,OAG9Cyc,EAAe,KACD,QAAfhlB,EAAM7D,OACPqE,EAAM0f,QAAQ+E,KAAO,UACrBzkB,EAAM0f,QAAQgF,QAAU,IAExBjK,QAAQkI,IAAI,CAAC4B,EAAgBxJ,IAAiB3S,MAAK,KAC9CrO,KAAKsb,SAAWA,KAMJtb,KAAK+f,YAAc,IAAIxJ,EAAY,CAChDtQ,MAAAA,EACAzB,MAHW,EAIXgS,WAAYpP,EACZqP,yBAA2BmU,IACzB5qB,KAAKyT,SAASL,UAAUxJ,OAAO,iBAAkBghB,IAEnDlU,MAAQzO,IACN,MAAM4iB,EAAoBtX,OAAe0N,eACzC,IAAIhZ,GAAO4iB,GAAoBA,IAAqB7qB,KAGlD,OAFAA,KAAK8qB,wBAAqB9mB,OAC1BhE,KAAKyS,QAIOzS,KAAKmc,gBAAgB+J,iBAC7B9S,UAAUxJ,OAAO,SAAU3B,GACjCjI,KAAKykB,mBAAmBxc,GACxBjI,KAAKmhB,eAAelZ,GACpBjI,KAAKqhB,uBAAuBpZ,GAEzBjI,KAAK4gB,iBACH3Y,EAAK4Y,EAAA,aAAmC7gB,KAAK4gB,gBAC3CC,EAAA,WAAiC7gB,KAAK4gB,iBAG1CyJ,IACEpiB,GAGDjI,KAAK8qB,oBAAmB,GACxB9qB,KAAK8qB,wBAAqB9mB,EAE1B4N,EAAA,sBAA+C3L,IAE/CjG,KAAK8qB,mBAAqBlZ,EAAA,iBAA0C3L,EAAOiC,KAIjFyO,WAAY,KAIV3W,KAAKyS,YAGF9E,iBAAiB,kBAAmBod,IACzC/qB,KAAKyT,SAASL,UAAUxJ,OAAO,qBAAsBmhB,MAGvD/qB,KAAK2N,iBAAiB,kBAAkB,KACtC3N,KAAKyT,SAASL,UAAU7Q,OAAO,sBAC/BvC,KAAK+f,YAAY9E,UACjBjb,KAAK+f,iBAAc/b,IAClB,CAACgK,MAAM,IAEPhO,KAAK2c,aACN3c,KAAK+f,YAAYC,cAAa,SAQtC,GAAG5Y,EAAmB,CACpB4Z,EAAe3S,MAAK,KACfpI,EAAM+kB,WAAa/kB,EAAMglB,kBAE1B1P,EAAU2P,OAAOtO,GAAO,MAQ5B,MAAMuO,EAAgB,KACpBllB,EAAM0H,iBAAiB,WAAW,KAEhC4N,EAAU6P,SACVnlB,EAAM0S,cAAcvF,UAAU7Q,OAAO,kBACpC,CAACyL,MAAM,KAGZ/H,EAAM0H,iBAAiB,WAAW,KAChC,MAAM0d,EAAUplB,EAAMqlB,eAAiBrlB,EAAMslB,gBACvCC,EAAiBvlB,EAAM+kB,WAAa/kB,EAAMglB,iBAG7CI,GAAWG,IACZL,IAGA5P,EAAU2P,OAAOtO,GAAO,GAGxB3W,EAAM0S,cAAcvF,UAAUrS,IAAI,oBAInCf,KAAKyT,SAASL,UAAUqB,SAAS,gBAClCxO,EAAM0H,iBAAiB,eAAgB7F,KACrC,EAAAgS,EAAA,GAAYhS,MAIhBqjB,IAmEFnrB,KAAK4d,cAAc6N,QAAQ,CAAC7oB,KA/Df,IAAW,EAAD,gCAKrB,MAAM0L,EAAwBlH,EAAoBsZ,QAAQxS,UAAYwd,EAAA,mBAAoC,CAACjmB,MAAAA,IAuD3G,OArDI2B,GACF4Z,EAAe3S,MAAK,IAAW,EAAD,uCACjB7G,KAAmBC,KAE5B8T,EAAU2P,OAAOtO,GAAO,EAAMtO,QAKpCoS,QAAQkI,IAAI,CAACta,EAAS0S,IAAiB3S,MAAK,IAAW,EAAD,gCACpD,GAAGrO,KAAKsb,SAAWA,EAEjB,YADAtb,KAAKyd,IAAIrR,KAAK,8BAIhB,MAAM3E,SAAaD,KAAmBC,IAEtCxB,EAAM0H,iBAAiB,SAAS,KACN,IAArB1H,EAAM0lB,MAAMpS,MACbvZ,KAAKyd,IAAIkO,MAAM,SAAW1lB,EAAM0lB,MAAMpS,KAAO,cAAgBtT,EAAM0lB,MAAMzjB,SAGxEqT,GACDA,EAAU6P,WAEX,CAACpd,MAAM,IAEP3N,aAAkBkkB,cAEnB+F,EAAIlV,kBAAkB8Q,iBAAiBza,OAAOxF,IAG9C,EAAA+gB,EAAA,IAAmB/gB,EAAOwB,GAKzB4iB,IACDrqB,KAAK8qB,mBAAqBlZ,EAAA,iBAA0C3L,EAAOiC,GAE3ElI,KAAK2N,iBAAiB,kBAAkB,KACnC3N,KAAK8qB,qBACN9qB,KAAK8qB,qBACL9qB,KAAK8qB,wBAAqB9mB,KAE3B,CAACgK,MAAM,KAGZhO,KAAK+nB,kBAAkB1nB,EAAQoH,EAAK,SAEpCgjB,SAGKnc,UAOXkH,EAAkBqU,EAAaxb,KAAK1K,OAC/B,CACL,MAAMA,EAAM,IAAM3D,KAAK+gB,iBAAiB1gB,GAAQ,EAAOgV,GAAWhH,MAAK,EAAE2S,eAAAA,MAqEvEhhB,KAAK4d,cAAc6N,QAAQ,CAAC7oB,KAhEf,IAAW,EAAD,gCACrB,MAAMgpB,EAAqB1C,EAAawC,EAAA,mBAAoC,CAACjmB,MAAAA,IAAUimB,EAAA,mBAAoC,CAACjmB,MAAAA,EAAO2J,MAAOxH,IA4D1I,OA1DAoZ,EAAe3S,MAAK,IAAW,EAAD,uCACjB7G,KAAmBC,KAC5BzH,KAAKub,UAAUsQ,cAAcD,QAKjClL,QAAQkI,IAAI,CAAC5H,EAAgB4K,IAAqBvd,MAAK,IAAW,EAAD,gC,MAC/D,GAAGrO,KAAKsb,SAAWA,EAEjB,YADAtb,KAAKyd,IAAIrR,KAAK,8BAMhB,MAAM3E,SAAaD,KAAmBC,IACtC,GAAGpH,aAAkBkkB,eAInB,GAHAvkB,KAAK+nB,kBAAkB1nB,EAAQoH,EAAK,OACpCzH,KAAK+nB,kBAAkBnL,EAAOnV,EAAK,OAEhCkiB,EAAA,WAAqB,CACtB,MAAMmC,EAAOlP,EAAMzE,iBAAiB,OACjC2T,GAAQA,EAAKjpB,QACdipB,EAAKhnB,SAASklB,IACZA,EAAI5W,UAAU7Q,OAAO,qBAItB,CACL,MAAM+nB,EAAM1N,EAAMxH,mBAAqBwH,EAAMxH,kBAAkBhC,UAAUqB,SAAS,yBAA2BmI,EAAMxH,kBAAoBwH,EACjImP,EAA+C,SAAd,QAArB,EAAAzB,EAAIlV,yBAAiB,eAAEqH,SAAoB6N,EAAIlV,kBAAwC,KACzG,IAAI2W,GAAaA,EAAUppB,MAAQ8E,EAAM,CACvC,MAAM8d,EAAQ,IAAIC,MAClBD,EAAMnS,UAAUrS,IAAI,cAIpB,EAAAimB,EAAA,IAAmBzB,EAAO9d,GAAK,KAC7BzH,KAAK+nB,kBAAkB1nB,EAAQoH,EAAK,OAEjCskB,IACD,SAAQ,KACNA,EAAUxpB,YAId+nB,EAAI7e,OAAO8Z,aAMhB5N,OAAOpS,IACRvF,KAAKyd,IAAIkO,MAAMpmB,GACfvF,KAAKub,UAAU2P,OAAOtO,GACtB5c,KAAKub,UAAUyQ,eAGVJ,UAMXpW,EAAkBqU,EAAaxb,KAAK1K,GAGtC,OAAO3D,KAAKwV,gBAAkBA,EAAgBmC,OAAM,KAClD3X,KAAKwc,yBAA2B,QAC/B3E,SAAQ,KACT7X,KAAKwV,gBAAkB,c,sHEv5C7B,MAAMqL,EAA0B,IAjPzB,MAWL9gB,cAaE,GAUM,KAAAksB,WAAcnkB,IACpB,MAAMokB,EAAO3Y,OAAO4Y,SAASD,KACvBvkB,EAAaG,EAAEskB,MAErB,GADApsB,KAAKqsB,OAASrsB,KAAKyd,IAAI,WAAY3V,EAAG9H,KAAKssB,gBAAiBJ,GACzDA,IAASlsB,KAAKusB,YAGf,GAFAvsB,KAAKqsB,OAASrsB,KAAKyd,IAAIrR,KAAK,qBAAqB8f,cAAiBlsB,KAAKusB,2BAA2BvsB,KAAKwsB,kBAEpG7kB,IAAO3H,KAAK2H,IAAM3H,KAAKwsB,gBAAkBxsB,KAAKwsB,iBAAmBN,EAClElsB,KAAKysB,aAAazsB,KAAKwsB,oBAClB,KAAG7kB,GAAyB3H,KAAKwsB,iBAAkBN,EAMxD,OAHAlsB,KAAKusB,YAAcL,OACnBlsB,KAAK0sB,cAAgB1sB,KAAK0sB,gBAH1B1sB,KAAKysB,eAST,GAAG9kB,IAAO3H,KAAK2H,KACb3H,KAAK2sB,aAED3sB,KAAK4sB,YAAY/pB,QACnB,OAIJ,MAAMG,EAAOhD,KAAK4sB,YAAY7H,MAC1B/hB,GAKJhD,KAAK6sB,QAAU7sB,KAAKssB,gBACpBtsB,KAAK8sB,WAAW9pB,IALdhD,KAAK2sB,aASD,KAAA5P,UAAajV,IACnB,MAAM9E,EAAOhD,KAAK4sB,YAAY5sB,KAAK4sB,YAAY/pB,OAAS,GACpDG,IACS,WAAV8E,EAAEyE,KAAqBvJ,EAAK+pB,WAAW/pB,EAAK+pB,cAC7C,OAAYjlB,GACZ9H,KAAKgtB,KAAKhqB,EAAKpB,SAIX,KAAAqrB,aAAgBnlB,IACnBA,EAAEolB,QAAQrqB,OAAS,IACtB7C,KAAKqsB,OAASrsB,KAAKyd,IAAI,eAEpB,OAAoB3V,KACrB9H,KAAKssB,iBAAkB,EAEvB/Y,OAAO5F,iBAAiB,YAAY,KAClCjL,YAAW,KACT1C,KAAKssB,iBAAkB,IACtB,OACF,CAAC/K,SAAS,EAAMvT,MAAM,OAhF3BhO,KAAK4sB,YAAc,GACnB5sB,KAAK2H,GAAK0f,KAAKC,MACftnB,KAAK6sB,QAAS,EACd7sB,KAAKyd,KAAM,QAAO,MAClBzd,KAAKqsB,OAAQ,EACbrsB,KAAKusB,YAAchZ,OAAO4Y,SAASD,KACnClsB,KAAKwsB,eAAiB,GACtBxsB,KAAKssB,iBAAkB,EAEvB/Y,OAAO5F,iBAAiB,WAAY3N,KAAKisB,YACzC1Y,OAAO5F,iBAAiB,UAAW3N,KAAK+c,UAAW,CAAClI,SAAS,EAAM0M,SAAS,IAEzE,EAAA8H,iBAAkB,CACnB,MAAM8D,EAAU,CAAC5L,SAAS,GAC1BhO,OAAO5F,iBAAiB,aAAc3N,KAAKitB,aAAcE,GAG3DC,QAAQC,kBAAoB,SAE5BrtB,KAAK2sB,YAmGAF,aAAaP,EAAe,IAC9BA,GAAoB,MAAZA,EAAK,GAAYA,EAAO,IAAMA,EACxB,MAATA,IAAcA,EAAO,IAE7BlsB,KAAKwsB,eAAiBxsB,KAAKusB,YAAcL,EACzClsB,KAAKstB,eACLttB,KAAK2sB,YAGCG,WAAW9pB,GACjB,MAAMwW,EAAOxW,EAAKsmB,QAAOtpB,KAAK6sB,aAAiB7oB,GAC/ChE,KAAKqsB,OAASrsB,KAAKyd,IAAI,wBAAyBza,EAAMhD,KAAK4sB,cAC/C,IAATpT,EACDxZ,KAAKutB,SAASvqB,GACLA,EAAKwqB,cACd,SAGFxtB,KAAK6sB,QAAS,EAGTY,eAAe7rB,GACpB,IAAI,IAAI8hB,EAAI1jB,KAAK4sB,YAAY/pB,OAAS,EAAG6gB,GAAK,IAAKA,EAAG,CACpD,MAAM1gB,EAAOhD,KAAK4sB,YAAYlJ,GAC9B,GAAG1gB,EAAKpB,OAASA,EACf,MAAO,CAACoB,KAAAA,EAAM0qB,MAAOhK,IAKpBsJ,KAAKprB,GACV,GAAGA,EAAM,CACP,MAAMwiB,EAAMpkB,KAAKytB,eAAe7rB,GAChC,GAAGwiB,EAED,YADApkB,KAAK2tB,WAAWvJ,EAAIphB,KAAMohB,EAAIsJ,OAKlCN,QAAQJ,OAGHW,WAAW3qB,EAAsB0qB,EAAQ1tB,KAAK4sB,YAAY/S,QAAQ7W,IACvEhD,KAAK6sB,QAAS,EAGd7sB,KAAK4sB,YAAYgB,OAAOF,EAAO,GAC/B1tB,KAAK8sB,WAAW9pB,GAIV6qB,YAAY7qB,GAClBhD,KAAKqsB,OAASrsB,KAAKyd,IAAI,cAAeza,EAAMhD,KAAK4sB,aAE7C5pB,EAAK8qB,WACP9tB,KAAK2sB,YAIFY,SAASvqB,GACdhD,KAAK4sB,YAAYvqB,KAAKW,GACtBhD,KAAK6tB,YAAY7qB,GAGZ+qB,YAAY/qB,GACjBhD,KAAK4sB,YAAYnB,QAAQzoB,GACzBhD,KAAK6tB,YAAY7qB,GAGZgrB,YAAYN,EAAe7qB,KAAmBorB,GACnDjuB,KAAK4sB,YAAYgB,OAAOF,EAAO7qB,KAAWorB,GAC1CA,EAAMnpB,SAAS9B,IACbhD,KAAK6tB,YAAY7qB,MAIb2pB,YACN3sB,KAAKqsB,OAASrsB,KAAKyd,IAAI,QACvBzd,KAAK6sB,QAAS,EACdO,QAAQT,UAAU3sB,KAAK2H,GAAI,IAGtB2lB,eACLttB,KAAKqsB,OAASrsB,KAAKyd,IAAIrR,KAAK,WAE5B,MAAM3E,EAAM0kB,SAAS+B,OAAS/B,SAASgC,SAAWhC,SAASiC,OAASpuB,KAAKwsB,eACzEY,QAAQE,aAAattB,KAAK2H,GAAI,GAAIF,GAG7B4mB,WAAWrrB,GACZA,IAIJ,OAAiBhD,KAAK4sB,YAAa5pB,GAG9BsrB,aAAa1sB,EAA8B2sB,GAAS,GACzD,IAAI,IAAI7K,EAAI1jB,KAAK4sB,YAAY/pB,OAAS,EAAG6gB,GAAK,IAC/B1jB,KAAK4sB,YAAYlJ,GACtB9hB,OAASA,IACf5B,KAAK4sB,YAAYgB,OAAOlK,EAAG,IAExB6K,MAL4C7K,MAcvD,6BAAyC7C,EACzC,W,2GC/PO,MAAM2N,EAKXzuB,YACS6X,EACAhW,EACC6sB,GAAY,EACpB7T,EACA8T,GAAY,EACLC,GAAa,EACbC,EACAC,GAPA,KAAAjX,KAAAA,EACA,KAAAhW,KAAAA,EACC,KAAA6sB,UAAAA,EAGD,KAAAE,WAAAA,EACA,KAAAC,QAAAA,EACA,KAAAC,QAAAA,EAEP7uB,KAAK8uB,KAAO,2BACZ9uB,KAAKmL,UAAYC,SAASC,cAAc,OACrCuP,IAAW5a,KAAKmL,UAAUyP,UAAYA,GAEtChD,IACD5X,KAAKoe,OAAShT,SAASC,cAAc,OACrCrL,KAAKoe,OAAOhL,UAAUrS,IAAI,sBACN,iBAAX,GACPf,KAAKoe,OAAO3S,QAAO,QAAKmM,IAE1B5X,KAAKmL,UAAUM,OAAOzL,KAAKoe,SAG7Bpe,KAAKmL,UAAUiI,UAAUrS,IAAI,eAAgB,gBAAkBa,GAC/D5B,KAAKmL,UAAUM,OAAOzL,KAAK8uB,MAC3B9uB,KAAKmL,UAAUG,MAAM2b,QAAU,OAE5ByH,GACD,+BAAuC1uB,KAAK8uB,KAAMF,OAAS5qB,EAAW2qB,GAI1E7N,QACE9gB,KAAKmL,UAAUG,MAAM2b,QAAU,OAE5BjnB,KAAKyuB,YACNzuB,KAAK8uB,KAAK/P,UAAY,IAI1BgQ,YACE/uB,KAAKmL,UAAUG,MAAM2b,QAAU,GAGjCrd,SACK5J,KAAK8uB,KAAKE,kBACXhvB,KAAK+uB,YAEL/uB,KAAK8gB,SAOI,MAAMmO,EAiBnBlvB,YACSoL,EACA+jB,EACAC,EACAC,EACAP,GAJA,KAAA1jB,UAAAA,EACA,KAAA+jB,YAAAA,EACA,KAAAC,aAAAA,EACA,KAAAC,SAAAA,EACA,KAAAP,QAAAA,EArBD,KAAAQ,SAAW,EACX,KAAAC,aAAe,EACf,KAAAC,YAAc,EAEd,KAAAC,cAA+B,KAC/B,KAAAC,cAAwB,EAExB,KAAAC,MAAQ,GAER,KAAAC,eAAiC,KAGjC,KAAA7c,SAAW,EAWjB9S,KAAK4vB,WAAa,IAAI,KAAW5vB,KAAKmL,WACtCnL,KAAK2vB,eAAiB3vB,KAAK4vB,WAAWzkB,UACtC,IAAI,MAAMuY,KAAK1jB,KAAKmvB,aAClBnvB,KAAK2vB,eAAelkB,OAAOzL,KAAKmvB,aAAazL,GAAsBvY,WAGlEnL,KAAKmvB,aAAaU,UACnB7vB,KAAK4vB,WAAWE,oBAAoB9vB,KAAKmvB,aAAaU,SAASf,MAGjE9uB,KAAKkvB,YAAYa,SAAYtjB,IAM3BzM,KAAK0vB,MAAQjjB,EACbzM,KAAKwQ,OAAM,GACXxQ,KAAKgwB,cAGPhwB,KAAK4vB,WAAWK,iBAAmB,KAC7BjwB,KAAK0vB,MAAMQ,SAEXlwB,KAAKyvB,gBACPzvB,KAAKyvB,cAAgBlc,OAAO7Q,YAAW,KACrC1C,KAAKgwB,aACLhwB,KAAKyvB,cAAgB,IACpB,MAKFjf,MAAMoY,GAAM,GACdA,IACD5oB,KAAKkvB,YAAYziB,MAAQ,GACzBzM,KAAK0vB,MAAQ,GACb1vB,KAAK+H,YAAS/D,EACdhE,KAAK8S,SAAW,GAGlB9S,KAAKqvB,SAAW,EAChBrvB,KAAKsvB,aAAe,EACpBtvB,KAAKuvB,YAAc,EAEnB,IAAI,MAAM7L,KAAK1jB,KAAKmvB,aAClBnvB,KAAKmvB,aAAazL,GAAsB5C,QAG1C9gB,KAAKwvB,cAAgB,KAGhBW,YAAYpoB,EAAiB+K,EAAW,EAAG4c,EAAQ,IACxD1vB,KAAK+H,OAASA,EACd/H,KAAK8S,SAAWA,EAEb9S,KAAK0vB,QAAUA,IAChB1vB,KAAKkvB,YAAYkB,WAAW3jB,MAAQijB,GAGtC1vB,KAAKkvB,YAAYmB,MAAMC,QAGlBN,aACL,GAAGhwB,KAAKwvB,cAAe,OAAOxvB,KAAKwvB,cAEnC,MAAME,EAAQ1vB,KAAK0vB,MAEnB,IAAIA,EAAMQ,OAER,YADAlwB,KAAKovB,UAAYpvB,KAAKovB,SAAS,IAIjC,IAAwB,IAArBpvB,KAAKuvB,YAAqBvvB,KAAKsvB,aAAetvB,KAAKuvB,WACpD,OAAO7O,QAAQxS,UAGjB,MAAMqiB,EAAQvwB,KAAKqvB,UAAY,EAE/B,OAAOrvB,KAAKwvB,cAAgB,0CAAgD,CAC1EznB,OAAQ/H,KAAK+H,OACb2nB,MAAAA,EACAzd,YAAa,CAACxC,EAAG,4BACjB8gB,MAAAA,EACAC,MAAO,GACP1d,SAAU9S,KAAK8S,WACdzE,MAAMoiB,IAGP,GAFAzwB,KAAKwvB,cAAgB,KAElBxvB,KAAKkvB,YAAYziB,QAAUijB,EAC5B,OAKF,MAAM,MAACgB,EAAK,QAAEtD,GAAWqD,EAEtBrD,EAAQvqB,QAAUuqB,EAAQ,GAAGplB,MAAQhI,KAAKqvB,UAC3CjC,EAAQuD,QAGV,MAAMC,EAAc5wB,KAAKmvB,aAAaU,SAEtCzC,EAAQtoB,SAASoD,IACf,IACE,MAAMH,EAAS/H,KAAK+H,OAASG,EAAQ2F,OAAS3F,EAAQH,OACtD,qCAA6C,CAC3CA,OAAAA,EACAoD,UAAWnL,KAAK4vB,WAChBiB,WAAY,SACZC,WAAW,EACX5oB,QAAAA,EACAwnB,MAAAA,EACAb,QAAS7uB,KAAK6uB,UAEhB,MAAMtpB,GACN4G,QAAQwf,MAAM,mCAAoCpmB,OAItDqrB,EAAYhnB,SAEZ5J,KAAKqvB,SAAWjC,EAAQvqB,QAAUuqB,EAAQA,EAAQvqB,OAAS,GAAGmF,KAErC,IAAtBhI,KAAKsvB,cACNtvB,KAAKsvB,YAAc,GAErBtvB,KAAKsvB,aAAelC,EAAQvqB,QAEJ,IAArB7C,KAAKuvB,aACNvvB,KAAKuvB,WAAamB,EAEfE,EAAYxS,SACb,OAAewS,EAAYxS,QAAQ,QAAKsS,EAAQ,4BAA8B,8BAA+B,CAACA,KAGhH1wB,KAAKovB,UAAYpvB,KAAKovB,SAASpvB,KAAKuvB,gBAErC5X,OAAOpS,IACR4G,QAAQwf,MAAM,eAAgBpmB,GAC9BvF,KAAKwvB,cAAgB,W,y8BCtI3B,MAAMuB,GASJhxB,YACUixB,EACAC,EACAvf,GAFA,KAAAsf,SAAAA,EACA,KAAAC,YAAAA,EACA,KAAAvf,eAAAA,EAyGF,KAAAwf,YAAc,KACpBC,EAAA,eAA0B,CACxBppB,OAAQ/H,KAAK+H,OACbiL,UAAWhT,KAAKgI,IAChB8K,SAAU9S,KAAKixB,YAAY9mB,cAAc2I,YAIrC,KAAAJ,eAAiB,KACpB1S,KAAKixB,YAAYG,UAAUC,aAC5B,QAAmBrxB,KAAKixB,YAAYG,UAAUE,qBAE9C,IAAI,IAAa,CACf,CAACtxB,KAAK+H,QAAS,CAAC/H,KAAKgI,QAKnB,KAAAupB,cAAgB,KACtBvxB,KAAKixB,YAAYG,UAAUI,gBAAgBxxB,KAAKK,SAG1C,KAAAoxB,sBAAwB,KAC9BzxB,KAAKixB,YAAYG,UAAUM,mBAGrB,KAAAnf,cAAgB,KACnBvS,KAAKixB,YAAYG,UAAUC,aAC5B,QAAmBrxB,KAAKixB,YAAYG,UAAUO,oBAE9C,IAAI,IAAoB3xB,KAAK+H,OAAQ,CAAC/H,KAAKgI,KAAM,SArInDhI,KAAKgH,SAAWiqB,EAAYjqB,SAkDzB,MAGD,EAAA4qB,GAAA,GAA0BZ,GAnDLlpB,IAMrB,IAAI9E,EALDhD,KAAK6xB,OACN7xB,KAAK6xB,OACL7xB,KAAK6xB,KAAO,MAId,IACE7uB,GAAO,EAAA8Z,EAAA,GAAgBhV,EAAEzH,OAAQ,qBACjC,MAAMyH,IAER,GAAI9E,EAAJ,CAGA,GADG8E,aAAagqB,YAAYhqB,EAAEiqB,iBAC3B/xB,KAAKkC,QAAQkR,UAAUqB,SAAS,UACjC,OAAO,EAEN3M,aAAagqB,aAAYhqB,EAAEkqB,cAAe,GAEnC,MAAW,GAAD,gCAClBhyB,KAAKK,OAAS2C,EACdhD,KAAK+H,OAAS/E,EAAK2iB,QAAQ5d,OAAOkqB,WAClCjyB,KAAKgI,KAAOhF,EAAK2iB,QAAQ3d,IACzBhI,KAAKkyB,WAAajB,EAAYG,UAAUe,cAAcnyB,KAAK+H,OAAQ/H,KAAKgI,WAElE0Y,QAAQkI,IAAI5oB,KAAK0T,QAAQ6G,KAAUvE,GAAW,GAAD,gCACjD,IAAIwD,EAGFA,IADCxZ,KAAKkyB,aAAelc,EAAOoc,kBAGrBpc,EAAO1N,eAAe0N,EAAO1N,WAGtC0N,EAAO9T,QAAQkR,UAAUxJ,OAAO,QAAS4P,SAG3CxW,EAAKoQ,UAAUrS,IAAI,cAEnB,EAAAsxB,GAAA,GAAavqB,EAAG9H,KAAKkC,SACrBowB,GAAA,cAAkCtyB,KAAKkC,SAAS,KAC9Cc,EAAKoQ,UAAU7Q,OAAO,oBAI1BqhB,MAM0DlS,GAItDmgB,OACN7xB,KAAK0T,QAAU,CAAC,CACdE,KAAM,UACNC,KAAM,UACNC,QAAS9T,KAAK0S,eACdpK,OAAQ,IAAW,GAAD,gCAAC,OAAAtI,KAAKgH,SAAS8G,mBAAmBgI,iBAAiB9V,KAAKgH,SAAS8G,mBAAmBuE,iBAAiBrS,KAAK+H,OAAQ/H,KAAKgI,UACxI,CACD4L,KAAM,UACNC,KAAM,oCACNC,QAAS9T,KAAK0S,eACdpK,OAAQ,IAAMtI,KAAKkyB,aAChBlyB,KAAKixB,YAAYG,UAAUE,oBAAoBle,UAAUqB,SAAS,QACrE2d,eAAe,GACd,CACDxe,KAAM,UACNC,KAAM,uBACNC,QAAS9T,KAAKkxB,YACdkB,eAAe,GACd,CACDxe,KAAM,SACNC,KAAM,yBACNC,QAAS9T,KAAKuxB,eACb,CACD3d,KAAM,SACNC,KAAM,kCACNC,QAAS9T,KAAKyxB,sBACdnpB,OAAQ,IAAMtI,KAAKkyB,WACnBE,eAAe,GACd,CACDxe,KAAM,gBACNC,KAAM,SACNC,QAAS9T,KAAKuS,cACdjK,OAAQ,IAAW,GAAD,gCAAC,OAAAtI,KAAKgH,SAAS8G,mBAAmBoI,uBAAuBlW,KAAKgH,SAAS8G,mBAAmBuE,iBAAiBrS,KAAK+H,OAAQ/H,KAAKgI,UAC9I,CACD4L,KAAM,gBACNC,KAAM,mCACNC,QAAS9T,KAAKuS,cACdjK,OAAQ,IAAMtI,KAAKkyB,aAAelyB,KAAKixB,YAAYG,UAAUO,mBAAmBve,UAAUqB,SAAS,QACnG2d,eAAe,IAGjBpyB,KAAKkC,SAAU,OAAWlC,KAAK0T,SAC/B1T,KAAKkC,QAAQkR,UAAUrS,IAAI,qBAAsB,eACjDqK,SAASuQ,eAAe,cAAclQ,OAAOzL,KAAKkC,UA+CvC,MAAMqwB,GAsEnBxyB,YAAYotB,GArEL,KAAAqF,KAAiD,GAUhD,KAAAC,WAAa,EAEb,KAAA7U,cAAgB,IAAI,IACrB,KAAA8U,YAAa,SAEb,KAAAC,eAAwF,GACxF,KAAAC,gBAAgE,GAChE,KAAAC,aAAyB,GAGzB,KAAAC,UAA0BpS,QAAQxS,UAEjC,KAAA6kB,UAA0D,GAC1D,KAAAC,aAAoE,GACpE,KAAAC,OAAwD,GACxD,KAAAC,aAAc,EACd,KAAAC,WAAY,EAEZ,KAAA1V,KAAM,EAAAC,EAAA,IAAO,gBAGb,KAAA0V,gBAOH,GAIE,KAAAC,aAA+D,IAAI9xB,IAUnE,KAAA+xB,YAAc,EACd,KAAAC,cAAgB,EAChB,KAAAC,eAAiB,EAEjB,KAAAC,YAAc,EAmRb,KAAAC,kBAAoB,KAC1B1zB,KAAKmL,UAAUiI,UAAUrS,IAAI,YAGvB,KAAA4yB,gBAAkB,KACxB3zB,KAAKmL,UAAUiI,UAAU7Q,OAAO,aA1QhC,EAAAqxB,EAAA,GAAW5zB,KAAMmtB,GAEjBntB,KAAKmL,UAAYC,SAASC,cAAc,OACxCrL,KAAKmL,UAAUiI,UAAUrS,IAAI,gBAE7Bf,KAAK0R,eAAiB,IAAI,KAC1B1R,KAAK6zB,kBAAoB,IAAI9C,GAAkB/wB,KAAKmL,UAAWnL,KAAMA,KAAK0R,gBAC1E1R,KAAKoxB,UAAY,IAAI,IAAgBpxB,KAAMA,KAAKgH,SAAUhH,KAAK0R,gBAE/D,MAAMoiB,EAAyB9zB,KAAK8zB,uBAAyB1oB,SAASC,cAAc,OACpFyoB,EAAuB1gB,UAAUrS,IAAI,+BAAgC,6BAA8B,UAEnG,MAAMgzB,EAAgB/zB,KAAK+zB,cAAgB,IAAI,KAAYD,GAC3DC,EAAc5oB,UAAUiI,UAAUrS,IAAI,+BAEtC,MAAMizB,EAAMh0B,KAAKg0B,IAAM5oB,SAASC,cAAc,OAC9C2oB,EAAI5gB,UAAUrS,IAAI,oBAAqB,uBACvCf,KAAKi0B,SAAWD,EAEhBD,EAAc5oB,UAAUM,OAAOuoB,GAE/B,IAAI,MAAME,KAAYl0B,KAAKm0B,UAAW,CACpC,MAAMC,EAAUhpB,SAASC,cAAc,OACvC+oB,EAAQhhB,UAAUrS,IAAI,4BACtB,MAAMszB,EAAOjpB,SAASC,cAAc,QAC9BqY,EAAItY,SAASC,cAAc,KAEjCgpB,EAAK5oB,QAAO,QAAKyoB,EAAStc,OAC1Byc,EAAK5oB,OAAOiY,GAEZ0Q,EAAQ3oB,OAAO4oB,IAEf,EAAAC,EAAA,GAAOF,GAEPp0B,KAAKi0B,SAASxoB,OAAO2oB,GAErBp0B,KAAKqzB,aAAa1vB,IAAIuwB,EAAStyB,KAAMsyB,GAErCA,EAASE,QAAUA,EAMrB,IAAIG,EAHJv0B,KAAKw0B,cAAgBppB,SAASC,cAAc,OAC5CrL,KAAKw0B,cAAcphB,UAAUrS,IAAI,8BAA+B,kBAG7D,MACDf,KAAKy0B,cAAe,EAAAC,EAAA,GAAe,CACjCxyB,QAASlC,KAAKw0B,cACdrV,QAAS,CAACC,EAAOC,EAAOvX,KACtB,MAAM6sB,EAAS30B,KAAK40B,UAAUD,SACxBE,EAAWjc,MAAMC,KAAK7Y,KAAKi0B,SAASY,UAC1C,IAAI/rB,EACJ,GAAGsW,EAAQ,GACT,IAAI,IAAIsE,EAAIiR,EAAS,EAAGjR,EAAImR,EAAShyB,SAAU6gB,EAC7C,IAAImR,EAASnR,GAAGtQ,UAAUqB,SAAS,QAAS,CAC1C3L,EAAM4a,EACN,YAIJ,IAAI,IAAIA,EAAIiR,EAAS,EAAGjR,GAAK,IAAKA,EAChC,IAAImR,EAASnR,GAAGtQ,UAAUqB,SAAS,QAAS,CAC1C3L,EAAM4a,EACN,WAKK1f,IAAR8E,IACDyrB,EC5YG,SAAyBppB,GACtC,MAAM2pB,EAAehtB,KACnB,EAAAgS,EAAA,GAAYhS,IAGd,IAAIitB,EAAU,EACd,MAAM9kB,EAAK,OACH8kB,GACJ5pB,EAAUoG,oBAAoB,YAAaujB,EAAa,CAACjgB,SAAS,KAOtE,OAHA1J,EAAUwC,iBAAiB,YAAamnB,EAAa,CAACjgB,SAAS,EAAM0M,SAAS,IAC9EpW,EAAUwC,iBAAiB,WAAYsC,EAAI,CAACjC,MAAM,IAE3CiC,ED6XkB+kB,CAAgBh1B,KAAKw0B,eACpCx0B,KAAK40B,UAAU9rB,QAMvB,IAAI,MAAMorB,KAAYl0B,KAAKm0B,UAAW,CACpC,MAAMhpB,EAAYC,SAASC,cAAc,OACzCF,EAAUiI,UAAUrS,IAAI,0BAA4BmzB,EAAStyB,KAAM,YAEnE,MAAM4Q,EAAUpH,SAASC,cAAc,OACvCmH,EAAQY,UAAUrS,IAAI,wBAA0BmzB,EAAStyB,MAEzDuJ,EAAUM,OAAO+G,GAEjBxS,KAAKw0B,cAAc/oB,OAAON,GAE1BnL,KAAKwyB,KAAK0B,EAASjiB,aAAeO,EAElC0hB,EAASe,WAAaziB,EAGxBxS,KAAKmL,UAAUM,OAAOqoB,EAAwB9zB,KAAKw0B,eAInDx0B,KAAKk1B,iBAAmB,IAAI,KAAY,EAAO,YAAY,GAE3Dl1B,KAAK4vB,WAAWK,iBAAmB,KAC9BjwB,KAAKk0B,SAASe,YAAcj1B,KAAKm1B,gBAAgBn1B,KAAKk0B,WAEvDl0B,KAAK4C,MAAK,IAKd5C,KAAK40B,WAAY,EAAAQ,EAAA,GAAep1B,KAAKi0B,SAAUj0B,KAAKw0B,eAAe,CAAC7sB,EAAI0tB,EAAYC,KAClF,GAAGt1B,KAAKyyB,YAAc9qB,IAAO3H,KAAKu1B,WAMhC,YALAv1B,KAAK4vB,WAAW4F,kBAAkB,CAChCtzB,QAASlC,KAAKmL,UACdsqB,SAAU,QACVC,cAAe11B,KAAK21B,sBAKxB,MAAMC,EAAc51B,KAAKm0B,UAAUxsB,GAChC3H,KAAK61B,aACN71B,KAAK61B,YAAYD,GAGnB,MAAME,EAAe91B,KAAKk0B,SAO1B,GANAl0B,KAAKk0B,SAAW0B,GAEO,IAApB51B,KAAKyyB,WAAoB6C,GAC1Bt1B,KAAK0zB,oBAGJ1zB,KAAKu1B,WACNv1B,KAAKu1B,YAAa,MACb,CACL,MAAMQ,EAAY/1B,KAAKmL,UAAU4qB,UACjC,IAAIC,EAAYh2B,KAAK4vB,WAAWoG,UAYhC,GAXGA,EAAYD,IACb/1B,KAAK4vB,WAAW4F,kBAAkB,CAChCtzB,QAASlC,KAAKmL,UACdsqB,SAAU,QACVC,cAAe11B,KAAK21B,sBAEtBK,EAAYD,GAGdD,EAAaG,OAAS,CAACD,UAAWA,EAAWE,aAAcl2B,KAAK4vB,WAAWsG,mBAEjDlyB,IAAvB4xB,EAAYK,OAAsB,CACnC,MAAMpU,EAAO7hB,KAAKmL,UAAU2W,wBACtBqU,EAAQn2B,KAAKmL,UAAUwN,cAAcmJ,wBACrCyF,EAAO1F,EAAK4E,EAAI0P,EAAM1P,EAEzBuP,EAAYzO,IACbqO,EAAYK,OAAS,CAACD,UAAWzO,EAAM2O,aAAc,IAIzD,GAAGN,EAAYK,OAAQ,CACrB,MAAM1O,EAAOuO,EAAaG,OAAOD,UAAYJ,EAAYK,OAAOD,UAI7DzO,IAKDqO,EAAYX,WAAW3pB,MAAM8Q,UAAY,cAAcmL,UAatC,IAApBvnB,KAAKyyB,WAAqBmD,EAAYX,WAAWjG,mBAElDhvB,KAAK4C,MAAK,GAGZ5C,KAAKyyB,UAAY9qB,KAChB,KACD3H,KAAK4vB,WAAWwG,gBAGYpyB,IAAzBhE,KAAKk0B,SAAS+B,SACfj2B,KAAKk0B,SAASe,WAAW3pB,MAAM8Q,UAAY,GAC3Cpc,KAAK4vB,WAAWoG,UAAYh2B,KAAKk0B,SAAS+B,OAAOD,WAGhDzB,IACDA,IACAA,OAAevwB,GAGjBhE,KAAK2zB,yBACJ3vB,EAAW+vB,EAAe/zB,KAAK0R,iBAElC,QAAiB1R,KAAKw0B,eAAgB1sB,IACjC9H,KAAKoxB,UAAUC,eAChB,EAAAvX,EAAA,GAAYhS,GACZ9H,KAAKoxB,UAAUI,iBAAgB,EAAA1U,EAAA,GAAgBhV,EAAEzH,OAAQ,yBAE1D,CAACwU,SAAS,EAAM0M,SAAS,EAAO7P,eAAgB1R,KAAK0R,iBAExD,MAAM2kB,EAAe,CAAMzb,EAAmB0b,EAAyBrkB,EAAoCnK,IAAkB,GAAD,gCAC1H,MAAMzH,GAAS,EAAAyc,EAAA,GAAgBhV,EAAEzH,OAA0Bua,GAC3D,IAAIva,EAAQ,OAEZ,MAAM2H,GAAO3H,EAAOslB,QAAQ3d,IAC5B,IAAIA,EAEF,YADAhI,KAAKyd,IAAIrR,KAAK,mCAAoC/L,GAIpD,MAAM0H,EAAS1H,EAAOslB,QAAQ5d,OAAOkqB,WAE/BsE,EAAW3d,MAAMC,KAAK7Y,KAAKwyB,KAAKvgB,GAAakG,iBAAiB,IAAMme,IAAoC/b,KAAK3Z,IACjH,MAAM41B,GAAc,EAAA1Z,EAAA,GAAgBlc,EAAIga,GACxC,MAAO,CACL1Y,QAAStB,EACToH,KAAMwuB,EAAY7Q,QAAQ3d,IAC1BD,OAAQyuB,EAAY7Q,QAAQ5d,OAAOkqB,eAKjCnpB,EAAMytB,EAAQxtB,WAAW/F,GAASA,EAAKgF,MAAQA,GAAOhF,EAAK+E,SAAWA,IAEtEG,QAAgBlI,KAAKgH,SAAS8G,mBAAmBuE,iBAAiBtK,EAAQC,IAChF,IAAI,KACHoI,iBAAiBpQ,KAAKy2B,kBAAkBxkB,IACxCG,UAAUlK,EAASquB,EAAQztB,GAAK5G,QAAS,GAAG,EAAOq0B,EAAQG,MAAM,EAAG5tB,GAAMytB,EAAQG,MAAM5tB,EAAM,QAGjG,QAAiB9I,KAAKwyB,KAAKmE,8BAA+BN,EAAarc,KAAK,KAAM,YAAa,YAAa,iCAAkC,CAACtI,eAAgB1R,KAAK0R,kBACpK,QAAiB1R,KAAKwyB,KAAKoE,4BAA6BP,EAAarc,KAAK,KAAM,sBAAuB,kBAAmB,+BAAgC,CAACtI,eAAgB1R,KAAK0R,iBAchL1R,KAAKk0B,SAAWl0B,KAAKm0B,UAAU,IAE/B,EAAA0C,EAAA,KAAuB,KACrB72B,KAAK4d,cAAc1Y,UAClB,KACDlF,KAAK4d,cAAckZ,qBAClB92B,KAAK0R,gBAWHqlB,qBAAqBlH,EAAiBjuB,GAC3C,OAAO,EAAAo1B,EAAA,GAA4Bp1B,EAAMiuB,EAAUA,EAAShtB,QAGtDo0B,oBAAmB,QAAC/uB,EAAO,YAAE0oB,IACnC,MAAMoC,EAA+B,IAC/B,IAACkE,GAAOC,EAAA,qBAA+B,CAC3CpvB,OAAQG,EAAQH,OAChBoD,UAAWylB,EAAY9B,KACvB+B,WAAY,SACZmC,aAAAA,IAGIoE,EAAwBD,EAAA,wBAAkC,CAC9D9O,OAAQ,CACN5Y,EAAG,SACH1H,OAAQG,EAAQH,QAElBsvB,YAAanvB,EACbgvB,IAAAA,EACAI,cAAet3B,KAAKmK,cAAculB,QAIpC,OADAsD,EAAa3wB,KAAK+0B,GACX1W,QAAQkI,IAAIoK,GAAc3kB,KAAKkpB,GAAA,GAG1BC,yBAAwB,QAACtvB,EAAO,SAAEuvB,EAAQ,WAAE/E,I,0CACxD,MAAMjtB,GAAQ,EAAAiyB,EAAA,GAAoBxvB,GAE5BoiB,EAAMlf,SAASC,cAAc,OAInC,IAAIssB,EAHJrN,EAAIlX,UAAUrS,IAAI,aAIlB,MAAM6G,GAAO,EAAAgwB,EAAA,GAAgBnyB,EAAO,IAAK,KAoCzC,OAlCEkyB,EADa,UAAZlyB,EAAMgK,cACgB,QAAU,CAC/B9N,IAAK8D,EACLyC,QAAAA,EACAiD,UAAWmf,EACXuN,SAAU,EACVC,UAAW,EACXla,cAAe5d,KAAK4d,cACpB8U,WAAAA,EACAqF,aAAa,EACbC,kBAAkB,EAClBC,cAAc,EACdlO,UAAWniB,KACTwH,YAEY,QAAU,CACxB8oB,MAAOzyB,EACPyC,QAAAA,EACAiD,UAAWmf,EACXuN,SAAU,EACVC,UAAW,EACXla,cAAe5d,KAAK4d,cACpB8U,WAAAA,EACAsF,kBAAkB,EAClBG,QAAQ,EACRvwB,KAAAA,IAIJ,CAAC+vB,EAAQS,OAAOhpB,MAAOuoB,EAAQS,OAAOC,MAAMC,OAAOC,SAASzzB,SAASygB,IACnEA,EAAMnS,UAAUrS,IAAI,sBAGtB02B,EAASp1B,KAAKs1B,EAAQ3E,aAAa5jB,OAE5B,CAAClN,QAASooB,EAAKpiB,QAAAA,MAGVswB,uBAAsB,QAACtwB,EAAO,YAAE+J,I,0CAC5C,MAAM7G,GAAW,EAAAssB,EAAA,GAAoBxvB,GAC/BurB,EAAazzB,KAAKyzB,YAAe,CAAC,QAAS,SAAkC7e,SAASxJ,EAASxJ,MAE/F0oB,QAAY,QAAa,CAC7BpiB,QAAAA,EACAuwB,UAAWhF,EACXiF,WAAY,IACZC,cAAc,EACdlF,WAAAA,EACAtpB,cAAenK,KAAKy2B,kBAAkBxkB,GACtC2L,cAAe5d,KAAK4d,cACpBgb,iBAAkB,IAOpB,MAJI,CAAC,QAAS,QAAS,SAAkChkB,SAASxJ,EAASxJ,OACzE0oB,EAAIlX,UAAUrS,IAAI,YAGb,CAACmH,QAAAA,EAAShG,QAASooB,MAGduO,kBAAiB,QAAC3wB,EAAO,SAAEuvB,EAAQ,WAAE/E,I,gDACjD,IAAIoG,EAA6D,QAAlD,EAAA5wB,EAAQzC,aAA0C,eAAEqzB,QAEnE,IAAIA,EAAS,CACX,MAAMC,EAAS7wB,EAAQiN,cAAgBjN,EAAQiN,cAAczU,MAAMoH,GAAmB,qBAARA,EAAE2H,GAAoC,yBAAR3H,EAAE2H,IAAgC,KAC9I,IAAIhI,EAAauxB,EAAqBC,EAEtC,GAAIF,EAQFE,EAAS/wB,EAAQA,QAAQwuB,MAAMqC,EAAOG,OAAQH,EAAOG,OAASH,EAAOl2B,YAR3D,CACV,MAAMyC,GAAQ,EAAA6zB,EAAA,GAASjxB,EAAQA,SAC/B,IAAI5C,EACF,OAGFmC,EAAMnC,EAAM,GAMZmC,EADe,0BAAdsxB,MAAAA,OAAM,EAANA,EAAQtpB,GACHspB,EAAOtxB,IAGPA,GAAOwxB,EAGfD,EAAcvxB,EAEd,MAAM2xB,EAAOlxB,EAAQA,UAAYT,EAC7BA,EAAInC,MAAM,4BACZ0zB,EAAc,WAAavxB,EAC3BA,EAAMA,EAAImN,SAAS,KAAOnN,EAAM,WAAaA,GAG/CuxB,EAAc,IAAIK,IAAIL,GAAaM,SAEnCR,EAAU,CACRrpB,EAAG,UACHhI,IAAAA,EACAuxB,YAAAA,EACArxB,GAAI,GACJukB,KAAM,GAGJkN,IACFN,EAAQS,YAAcrxB,EAAQA,SAIlC,MAAMsxB,EAAapuB,SAASC,cAAc,OAC1CmuB,EAAWpmB,UAAUrS,IAAI,WAItB+3B,EAAQZ,OACG,QAAU,CACpB/sB,UAAWquB,EACXtxB,QAAS,KACTgwB,MAAOY,EAAQZ,MACfL,SAAU,EACVC,UAAW,EACXE,kBAAkB,EAClBpa,cAAe5d,KAAK4d,cACpB8U,WAAAA,EACA9qB,MAAM,EAAAgwB,EAAA,GAAgBkB,EAAQZ,MAAsB,GAAI,IAAI,GAC5DlF,aAAcyE,EACdU,QAAQ,KAGVqB,EAAWpmB,UAAUrS,IAAI,UACzB,EAAA04B,EAAA,GAAaD,GAAY,EAAAE,EAAA,GAAgBZ,EAAQhqB,OAASgqB,EAAQE,aAAeF,EAAQS,aAAeT,EAAQrxB,KAAK,KAGvH,MAAMqH,GAAQ,OAAiBgqB,GAEzBa,GAAmB,OAAuBb,GAE1CxkB,GADY,EAAAslB,EAAA,IAAuB,EAAAC,EAAA,IAAaf,EAAQrxB,KAAO,KACjD2N,kBACpB,GAAGd,aAAaE,kBACd,IACEF,EAAEwlB,UAAYC,mBAAmBzlB,EAAE0lB,MACnC,MAAMz0B,IAKPo0B,EAAiBM,YAClBN,EAAiBluB,OAAO,MAG1BkuB,EAAiBluB,OAAO6I,GAErBtU,KAAKyzB,YACNkG,EAAiBluB,OAAO,WAAY,OAAiBvD,IAGnD4G,EAAMwJ,aAERxJ,EAAMrD,QAAO,EAAAyuB,EAAA,GAAcpB,EAAQE,YAAYvV,MAAM,IAAK,GAAG,KAG/D,MAAM0W,EAAM,IAAI,KAAI,CAClBrrB,MAAAA,EACAsrB,YAAY,OAAalyB,GACzBmyB,SAAUV,EACVW,aAAa,EACb5L,WAAW,EACXnQ,UAAU,IAKZ,GAFA4b,EAAII,kBAAkBf,EAAY,OAE/BW,EAAIhvB,UAAU2uB,UAAU5J,OAAOrtB,OAChC,MAAO,CAACqF,QAAAA,EAAShG,QAASi4B,EAAIhvB,cAIrBqvB,oBAAoB3K,EAAiBqE,EAA+BzoB,GAAS,G,0CACxF,MAAMgvB,EAAwD,GACxDC,EAA8BxG,EAASe,WACvCwC,EAA2B,GAC3B/E,EAAa1yB,KAAK0yB,WAAWzvB,MACnC,IAII2tB,EAJA3e,EAAciiB,EAASjiB,kBAErB,UAGa,kCAAhBA,GAAqDjS,KAAKmK,cAAculB,MAAMQ,QAC/Eje,EAAc,2BACd2e,EAAc5wB,KAAKk1B,iBACnBwF,EAAejvB,OAAOmlB,EAAYzlB,YACV,6BAAhB8G,IACR2e,EAAc5wB,KAAKmvB,aAAaU,UAGlC,MAAM1C,EAAoC,CACxCsN,cAAAA,EACAxoB,YAAAA,EACA/J,aAASlE,EACT0uB,WAAAA,EACA+E,SAAAA,EACA7G,YAAAA,GAGF,IAAI+J,EAGJ,OAAO1oB,GACL,IAAK,2BACH0oB,EAAkB36B,KAAKi3B,mBACvB,MAGF,IAAK,gCACH0D,EAAkB36B,KAAKw3B,wBACvB,MAGF,IAAK,2BACL,IAAK,gCACL,IAAK,2BACL,IAAK,8BACHmD,EAAkB36B,KAAKw4B,sBACvB,MAGF,IAAK,yBACHmC,EAAkB36B,KAAK64B,iBAS3B,GAAG8B,EAAiB,CAClBA,EAAkBA,EAAgB3gB,KAAKha,MAGvC,MAAM46B,EAA8B/K,EAAStV,KAAUrS,GAAY,GAAD,gCAChE,IAEE,OADAilB,EAAQjlB,QAAUA,QACLyyB,EAAgBxN,GAC7B,MAAM5nB,GACNvF,KAAKyd,IAAIkO,MAAM,yBAA0B1Z,EAAakb,EAASjlB,EAAS3C,SAItEs1B,SAAiBna,QAAQkI,IAAIgS,IAAUtC,OAAOC,SACpDkC,EAAcp4B,QAAQw4B,EAAQvC,OAAOC,UAWvC,GARG3H,GAAeA,EAAY9B,KAAKE,mBACjC4B,EAAY7B,YAGX/uB,KAAK8yB,WACN2E,EAASp1B,KAAKrC,KAAK8yB,YAGlB2E,EAAS50B,eACJ6d,QAAQkI,IAAI6O,GACd/E,KAFN,CAQA,GAAG+H,EAAc53B,OAAQ,CACvB,MAAMi4B,EAASrvB,EAAS,SAAW,UACnCgvB,EAAc31B,SAASsB,I,MACrB,MAAM,QAAClE,EAAO,QAAEgG,GAAW9B,EAKrB20B,EAAiB/6B,KAAKg7B,6BAA6Bh7B,KAAKuzB,aAAerrB,EAAQkO,KAAO,EAAGnE,GAC/F/P,EAAQkR,UAAUrS,IAAI,qBACtBmB,EAAQyjB,QAAQ3d,IAAM,GAAKE,EAAQF,IACnC9F,EAAQyjB,QAAQ5d,OAAS,GAAKG,EAAQH,OACtCgzB,EAAe9M,MAAM6M,GAAQ54B,IAEZ,QAAd,EAAAlC,KAAKoxB,iBAAS,eAAEC,cACjBrxB,KAAKoxB,UAAU6J,sBAAsB/4B,GAAS,MAMpDlC,KAAKk7B,gBAAgC,6BAAhBjpB,EAA6C,EAAI4d,EAAShtB,OAAQ63B,OAIjFQ,gBAAgBr4B,EAAgBoyB,GACtC,GAAGA,EAAY,CACb,MAAMkG,EAASlG,EAAWtc,cAO1B,GANAC,MAAMC,KAAKsiB,EAAOtG,UAAU6B,MAAM,GAAG5xB,SAASs2B,IAC5CA,EAAM74B,aAKJM,IAAWoyB,EAAWjG,kBAAmB,CAC3C,MAAM1E,EAAMlf,SAASC,cAAc,OACnCif,EAAIwP,UAAY,kCAChBxP,EAAIlX,UAAUrS,IAAI,kBAAmB,cAAe,gBAAiB,aAErEo6B,EAAO1vB,OAAO6e,KAKZ+Q,YACN,MAAMC,EAA+B,IAAIl6B,IACnCsxB,EAAa1yB,KAAK0yB,WAAWzvB,MAEnC,IAAI,MAAMygB,KAAK1jB,KAAKmvB,aAAc,CAChC,MAAM7uB,EAAQN,KAAKmvB,aAAazL,GAChC1jB,KAAKwyB,KAAK+I,yBAAyB9vB,OAAOnL,EAAM6K,WAChD7K,EAAMwgB,QAGR,MAAM4O,EAAQ1vB,KAAKmK,cAAculB,MACjC,GAAGA,EAAO,CACR,MAAM8L,EAAa,CAACZ,EAAmBt6B,EAAoBm7B,GAAmB,KAC5Eb,EAAQrgB,KAAKxS,IACX,GAAGuzB,EAAgBj4B,IAAI0E,GACrB,OAGFuzB,EAAgBv6B,IAAIgH,GAEpB,MAAM,IAACmvB,GAAOC,EAAA,qBAA+B,CAC3CpvB,OAAQA,EACRoD,UAAW7K,EAAMwuB,KACjB+B,WAAY,aACZlC,WAAYruB,EAAMquB,aAGpB,MAAO,CAACuI,IAAAA,EAAKnvB,OAAAA,MACZuwB,OAAOC,SAASzzB,SAAQ,EAAOoyB,IAAAA,EAAKnvB,OAAAA,KAAY,GAAD,gCAChD,MAAM2zB,QAAa17B,KAAKgH,SAASqI,gBAAgBssB,QAAQ5zB,GACzD,GAAG0zB,IAAqBC,EAAKE,oBAAsBF,EAAKG,cAAe,CACrE,MAAMC,EAAS,IAAIC,OAAO,KAAI,EAAAC,EAAA,GAAatM,OAAU,EAAAsM,EAAA,IAAa,EAAAC,EAAA,IAAgBvM,OAAY,MAC9FwH,EAAIgF,UAAUnd,UAAYmY,EAAIgF,UAAUnd,UAAUkH,QAAQ6V,EAAQ,aAClE5E,EAAIiF,gBAAgB1wB,aAAa,EAAA2wB,EAAA,GAAqBr0B,EAAOs0B,kBACxD,GAAGt0B,IAAWyV,EAAA,OACnB0Z,EAAIiF,gBAAgB1wB,QAAO,QAAK,0BAC3B,CACL,IAAI6wB,QAAiBt8B,KAAKgH,SAASqI,gBAAgBktB,gBAAgBx0B,GACnE,GAAIu0B,EAMFA,EAAW,IAAMA,MANL,CACZ,MAAME,QAAax8B,KAAKgH,SAASy1B,gBAAgBC,QAAQ30B,GACtDy0B,GAAQA,EAAKG,QACdL,EAAW,KAAM,EAAAM,EAAA,GAAkBJ,EAAKG,OAAOE,WAMnD3F,EAAIiF,gBAAgB7jB,YAAcgkB,QAItCh8B,EAAMsJ,UAGFkzB,EAAaC,IACjB,GAAIrK,IAMJ,OAAOqK,GAGT,OAAOrc,QAAQkI,IAAI,CACjB5oB,KAAKgH,SAASy1B,gBAAgBO,mBAAmBtN,GAAO,OAAM1rB,EAAW,IACxEqK,KAAKyuB,GACLzuB,MAAM4uB,IACFA,GACDzB,EAAWyB,EAAUj9B,KAAKmvB,aAAa8N,UAAU,MAIrDj9B,KAAKgH,SAASy1B,gBAAgBS,eAAexN,EAAO,IACnDrhB,KAAKyuB,GACLzuB,MAAM4uB,IACL,GAAGA,IACDzB,EAAWyB,EAASE,WAAYn9B,KAAKmvB,aAAa8N,UAAU,GAC5DzB,EAAWyB,EAASrC,QAA4E56B,KAAKmvB,aAAaiO,gBAElHp9B,KAAKmvB,aAAaiO,eAAejyB,UAAUiI,UAAUrS,IAAI,YAEtDf,KAAKmvB,aAAaiO,eAAehf,OAAO8H,mBAAqBlmB,KAAKmvB,aAAaiO,eAAehf,OAAOhJ,mBACtGpV,KAAKmvB,aAAaiO,eAAehf,OAAO8H,iBAAiB3jB,SAGxDvC,KAAKmvB,aAAaiO,eAAetO,KAAKE,kBAAoB,GAAG,CAC9D,MAAMqO,EAAWjyB,SAASC,cAAc,OACxCgyB,EAASjqB,UAAUrS,IAAI,2BACvB,MAAMu8B,EAAc,IAAI,iBAAiB,CACvC/wB,IAAK,uBAEP8wB,EAAS5xB,OAAO6xB,EAAYp7B,SAC5BlC,KAAKmvB,aAAaiO,eAAehf,OAAO3S,OAAO4xB,IAC/C,QAAiBA,GAAU,KACzB,MAAME,EAAUv9B,KAAKmvB,aAAaiO,eAAejyB,UAAUiI,UAAUxJ,OAAO,YAC5E0zB,EAAY/wB,IAAMgxB,EAAU,qBAAuB,qBACnDD,EAAYE,gBAMpBx9B,KAAKgH,SAAS8G,mBAAmB2vB,iBAAiB/N,EAAO,EAAG,GAAI,GAC/DrhB,KAAKyuB,GACLzuB,MAAM5B,IACFA,GACD+uB,EAAW/uB,EAAMixB,QAAQnjB,KAAK+L,GAAMA,EAAEve,SAAS/H,KAAKmvB,aAAa8N,UAAU,QAI5E,GAAIj9B,KAAKmK,cAAcpC,QAAW/H,KAAKmK,cAAcwzB,QA6DrD,OAAOjd,QAAQxS,UA7D+C,CACnE,MAAM0vB,EAAqB,CAAC7O,GAAY,IAC/B,gBAA2B1gB,MAAM+d,IAClCsG,MAIJ1yB,KAAKmvB,aAAa0O,OAAO/O,KAAK/P,UAAY,GAE1CqN,EAAM0R,aAAapH,MAAM,EAAG,IAAI5xB,SAAciD,GAAW,GAAD,gCACtD,MAAM,IAACmvB,GAAOC,EAAA,qBAA+B,CAC3CpvB,OAAQA,EACRoD,UAAWnL,KAAKmvB,aAAa0O,OAAO/O,KACpCgC,WAAW,EACXD,WAAY,aACZlC,YAAY,IAGduI,EAAIiF,gBAAgB1wB,aAAc1D,EAAOg2B,UACvC,EAAAC,GAAA,SAA0Bh+B,KAAKgH,SAASy1B,gBAAgBC,QAAQ30B,EAAOk2B,cACvE,EAAA7B,EAAA,GAAqBr0B,EAAOs0B,kBAG5BjQ,EAAM0R,aAAaj7B,OAEbksB,GACR/uB,KAAKmvB,aAAa0O,OAAO9O,YAFzB/uB,KAAKmvB,aAAa0O,OAAO/c,YAO/B,OAAOJ,QAAQkI,IAAI,CACjB5oB,KAAKgH,SAASy1B,gBAAgByB,YAAY,kBAAkB7vB,MAAM8vB,IAChE,IAAIzL,IAAc,OAElB,MAAM5pB,EAAMq1B,EAAMp1B,WAAW2yB,GAASA,EAAK/zB,KAAO6V,EAAA,UACtC,IAAT1U,IACDq1B,EAAQA,EAAMzH,SACR9I,OAAO9kB,EAAK,GAGjBq1B,EAAMt7B,QACPs7B,EAAMr5B,SAAS42B,IACb,MAAM,IAACxE,GAAOC,EAAA,qBAA+B,CAC3CpvB,OAAQ2zB,EAAK/zB,GACbwD,UAAWnL,KAAKmvB,aAAaiP,OAAOtP,KACpCxG,eAAe,EACfuI,WAAY,SACZlC,YAAY,EACZE,QAAS7uB,KAAKmvB,aAAaiP,OAAOvP,UAGpCqI,EAAImH,WAAW97B,YAInBvC,KAAKmvB,aAAaiP,OAAOrP,eAG3B6O,OAKQU,YAAYpK,G,0CACxB,MAAMvsB,EAAK3H,KAAKmK,cAAcpC,OAAOs0B,WAC/B3J,EAAa1yB,KAAK0yB,WAAWzvB,MACnC,IAAIqL,EAEJ,MAAMiwB,EAA2B1C,GAA2D,GAAD,gCACzF,IAAG77B,KAAK8yB,kBACA9yB,KAAK8yB,UAEPJ,KAHN,CAQI1yB,KAAKw+B,cACPx+B,KAAKw+B,YAAc,IAAI,IAAe,CACpC5gB,cAAe5d,KAAK4d,cACpB6gB,eAAe,EACfz3B,SAAUhH,KAAKgH,YAEjB,QAAiBhH,KAAKw+B,YAAY1P,MAAOhnB,IACvC,MAAM42B,GAAK,EAAAC,EAAA,GAAU72B,EAAEzH,OAAQ,EAAAu+B,yBAC/B,IAAIF,EACF,OAGF,MAAM32B,EAAS22B,EAAG/Y,QAAQ5d,OAAOkqB,WACjC,IAAI3jB,EAAwBoS,QAAQxS,UACjCyb,EAAA,aACDrb,EAAU,oBAA8B,IAG1CA,EAAQD,MAAK,KACX8iB,EAAA,eAA0B,CAACppB,OAAAA,UAG/BmsB,EAASe,WAAWxpB,OAAOzL,KAAKw+B,YAAY1P,MAC5C9uB,KAAKk7B,gBAAgB,EAAGhH,EAASe,aAGnC,IAAI,MAAM4J,KAAehD,EAAc,CACrC,MAAM9zB,GAAS,EAAA+2B,GAAA,GAAqBD,GACjC92B,EAAOg3B,qBAIS/+B,KAAKgH,SAASy1B,gBAAgBC,QAAQ30B,IACjDyF,OAAOwxB,SAIfh/B,KAAKw+B,YAAYz9B,IAAIgH,SAIzB,SAAS/H,KAAKgH,SAASi4B,gBAAgBC,UAAUv3B,GAAK,CACpD,MAAMw3B,EAAcn/B,KAAKw+B,YAAmB,IAAL,GACvClwB,EAAUtO,KAAKgH,SAASo4B,kBAAkBC,uBAAuB13B,OAAI3D,EAAWm7B,EAAYn/B,KAAK+yB,UAAUmB,EAASjiB,cAAc5D,MAAMwtB,IACtI,IAAInJ,IACF,OAGF,MAAM5D,EAAOoF,EAASe,WAAW7f,kBAOjC,OANApV,KAAK+yB,UAAUmB,EAASjiB,cAAgB6c,EAAOA,EAAKE,kBAAoB,GAAK6M,EAAaA,aAAah5B,OAEpGg5B,EAAaA,aAAah5B,OAASs8B,IACpCn/B,KAAKizB,OAAOiB,EAASjiB,cAAe,GAG/BssB,EAAmB1C,EAAaA,sBAGzCvtB,EAAUtO,KAAKgH,SAASo4B,kBAAkBE,YAAY33B,GAAI0G,MAAMkxB,IAC9D,IAAI7M,IACF,OAIF1yB,KAAKizB,OAAOiB,EAASjiB,cAAe,EACpC,MAAM4pB,EAAgB0D,EAA+B1D,aACrD,MAAsB,8BAAnBA,EAAapsB,EAIT8uB,EAAmB1C,EAAaA,mBAJvC,KAQJ,OAAO77B,KAAKgzB,aAAakB,EAASjiB,aAAe3D,EAAQuJ,SAAQ,KAC3D6a,MAIJ1yB,KAAKgzB,aAAakB,EAASjiB,aAAe,YAItCutB,SAAStL,EAA+BuL,EAAmBhvB,EAAmBiiB,G,MACpF,MAAM9wB,EAAOsyB,EAASjiB,YAEtB,GAAGjS,KAAKgzB,aAAapxB,GACnB,OAAO5B,KAAKgzB,aAAapxB,GAG3B,GAAqB,YAAlBsyB,EAAStyB,KACV,OAAO5B,KAAKs+B,YAAYpK,GAG1B,MAAM9G,EAAmC,QAAzB,EAAAptB,KAAK2yB,eAAe/wB,UAAK,QAAK5B,KAAK2yB,eAAe/wB,GAAQ,GAE1E,KAAY,6BAATA,GAAwCwrB,EAAQvqB,SAC7C7C,KAAKkzB,cACPlzB,KAAKq7B,YACLr7B,KAAKkzB,aAAc,GAGjBlzB,KAAKmK,cAAculB,MAAMQ,QAAWlwB,KAAKmK,cAAcpC,QAAW/H,KAAKmK,cAAcwzB,UAEvF,OADA39B,KAAKizB,OAAOrxB,IAAQ,EACb8e,QAAQxS,UAInB,MAAMI,EAAUtO,KAAKgzB,aAAapxB,GAAQ8e,QAAQxS,UAAUG,MAAK,IAAW,GAAD,gC,QAEzE,GAAG+e,EAAQvqB,QAAU7C,KAAK4yB,gBAAgBhxB,GAAQwrB,EAAQvqB,SAAW48B,EAAU,CAC7E,MAAM5P,EAAkB,GACxB,IAAI6P,EAAOn5B,KAAKC,IAAI,EAAGxG,KAAK4yB,gBAAgBhxB,IACxC+9B,EAAe,EAEnB,EAAG,CACD,MAAMC,EAAMxS,EAAQsJ,MAAMgJ,EAAMA,EAAOjvB,GACvCivB,GAAQE,EAAI/8B,OACZ88B,GAAgBC,EAAI/8B,OAEpB,MAAMg9B,QAA4Bnf,QAAQkI,IAAIgX,EAAIrlB,KAAKulB,GAAM9/B,KAAKgH,SAAS8G,mBAAmBuE,iBAAiBytB,EAAE/3B,OAAQ+3B,EAAE93B,QAE3H6nB,EAASxtB,QAAQrC,KAAK+2B,qBAAqB8I,EAAqBj+B,UAC1D+9B,EAAelvB,GAAaivB,EAAOtS,EAAQvqB,QAWnD,OAFA7C,KAAK4yB,gBAAgBhxB,GAAQ89B,EAEtB1/B,KAAKw6B,oBAAoB3K,EAAUqE,GAAUrc,SAAQ,KAC1DnV,YAAW,KACT1C,KAAK4vB,WAAWmQ,qBACf,MAKP,MAAMxP,EAAQnD,EAAQvqB,OAASuqB,EAAQA,EAAQvqB,OAAS,GAAGmF,IAAM,EAE3DyE,QAAczM,KAAKgH,SAAS8G,mBAAmBkyB,UAAU,OAAD,wBACzDhgC,KAAKmK,eAAa,CACrB8H,YAAa,CAACxC,EAAG7N,GACjB2uB,MAAAA,EACAC,MAAO/f,EACPwvB,SAA6B,QAArB,KAAEjgC,KAAK+yB,WAAUnxB,UAAI,UAAJA,GAAU,KAKrC,GAFAwrB,EAAQ/qB,QAAQoK,EAAM2gB,QAAQ7S,KAAKulB,IAAM,CAAE93B,IAAK83B,EAAE93B,IAAKD,OAAQ+3B,EAAE/3B,YAE7D2qB,OAMDjmB,EAAM2gB,QAAQvqB,OAAS4N,QAA8CzM,IAAhChE,KAAKmK,cAAc6G,WAA2BvE,EAAMyzB,WAAczzB,EAAM2gB,QAAQvqB,SAAW4J,EAAMikB,SAGvI1wB,KAAKizB,OAAOrxB,IAAQ,GAGtB5B,KAAK+yB,UAAUnxB,GAAQ6K,EAAMyzB,WAE1BT,GA4BH,OAxBAz/B,KAAK4yB,gBAAgBhxB,GAAQwrB,EAAQvqB,OAEjC7C,KAAKizB,OAAOrxB,IACd0M,EAAQD,MAAK,KACX3L,YAAW,KACT,GAAIgwB,KAED1yB,KAAKk0B,WAAaA,EAAU,CAC7B,MAAM5lB,EAAUtO,KAAK4C,MAAK,GAAM,GAC7B0L,GACDA,EAAQD,MAAK,KACPqkB,KAEJhwB,YAAW,KACT1C,KAAK4vB,WAAWmQ,qBACf,SAIR,MAKA//B,KAAKw6B,oBAAoBx6B,KAAK+2B,qBAAqBtqB,EAAM2gB,QAASxrB,GAAOsyB,QAE/Evc,OAAOpS,IACRvF,KAAKyd,IAAIkO,MAAM,cAAepmB,MAC7BsS,SAAQ,KACT7X,KAAKgzB,aAAapxB,GAAQ,QAG5B,OAAO0M,EAGD6mB,gBAAgBjB,GACtB,MAAMjiB,EAAciiB,EAASjiB,YAC7B,OAAQjS,KAAKizB,OAAOhhB,IAAiBjS,KAAK2yB,eAAe1gB,IAAgBjS,KAAK4yB,gBAAgB3gB,GAAejS,KAAK2yB,eAAe1gB,GAAapP,OAGlIs9B,gB,0CACZ,MAAMzN,EAAa1yB,KAAK0yB,WAAWzvB,MAC7B8E,EAAS/H,KAAKmK,cAAcpC,OAClC,IAAI/H,KAAKwzB,cACP,OAGF,MAAMW,EAAYn0B,KAAKm0B,UAAUmE,QAAQpE,GAAsC,6BAAzBA,EAASjiB,cACzDmuB,EAAUjM,EAAU5Z,KAAK2Z,IAAa,CAAEzkB,EAAGykB,EAASjiB,iBAEnDouB,EAAUC,SAAwB5f,QAAQkI,IAAI,CACnD5oB,KAAKgH,SAAS8G,mBAAmByyB,kBAAkBx4B,EAAQq4B,GAC3DpgC,KAAKsgC,mBAGP,IAAI5N,IACF,OAGF,GAAG1yB,KAAK8yB,kBACA9yB,KAAK8yB,WAEPJ,KACF,OAIJ,IAAI8N,EACA9P,EAAQ,EACZyD,EAAUrvB,SAASovB,IACjB,MAAMuM,EAAUJ,EAAS3/B,MAAMggC,GAAMA,EAAEpI,OAAO7oB,IAAMykB,EAASjiB,cAE7DiiB,EAASE,QAAQhhB,UAAUxJ,OAAO,QAAS62B,EAAQ/P,OACnDwD,EAASE,QAAQhhB,UAAU7Q,OAAO,UAG/Bk+B,EAAQ/P,aACY1sB,IAAlBw8B,IACDA,EAAgBtM,KAGhBxD,MAIN,MAAMiQ,EAAa3gC,KAAKqzB,aAAapwB,IAAI,WACzC09B,EAAWvM,QAAQhhB,UAAUxJ,OAAO,QAAS02B,GAE1CA,IACDE,EAAgBG,GAGlB3gC,KAAKmL,UAAUiI,UAAUxJ,OAAO,QAAS42B,GACzCxgC,KAAKmL,UAAUwN,cAAcvF,UAAUxJ,OAAO,gBAAiB42B,GAC5DA,IACDxgC,KAAKu1B,YAAa,EAClBv1B,KAAK40B,UAAU50B,KAAKm0B,UAAUta,QAAQ2mB,IAAgB,GAGtDxgC,KAAK8zB,uBAAuB1gB,UAAUxJ,OAAO,OAAQ8mB,GAAS,OAIrD9tB,KAAK2rB,GAAS,EAAOkR,GAAW,G,gDAC3C,MAAM13B,EAAS/H,KAAKmK,cAAcpC,OAClC/H,KAAKyd,IAAI,OAAQ8Q,EAAQxmB,EAAQ/H,KAAKgzB,cACtC,MAAMN,EAAa1yB,KAAK0yB,WAAWzvB,MAEnC,GAAGjD,KAAKmzB,UAAW,CAEjB,SADgC,QAA1B,EAACnzB,KAAK4gC,4BAAoB,QAAzB5gC,KAAK4gC,qBAAyB5gC,KAAKmgC,iBACtCzN,IACF,OAGF1yB,KAAK4gC,0BAAuB58B,EAC5BhE,KAAKmzB,WAAY,EAGnB,IAAI0N,EAAStS,EAAS,CAACvuB,KAAKk0B,UAAYl0B,KAAKm0B,UAAUmE,QAAQwI,GAAMA,IAAM9gC,KAAKk0B,WAShF,GARA2M,EAASA,EAAOvI,QAAQpE,GACfl0B,KAAKm1B,gBAAgBjB,KAG3BnsB,EAAOg2B,WACR,EAAAgD,EAAA,GAAcF,GAAS3M,GAA+B,YAAlBA,EAAStyB,QAG3Ci/B,EAAOh+B,OACT,OAGF,MAAM4N,EAAYgvB,EAAW,GAAKl5B,KAAKmD,MAAsC,GAA/B6V,EAAA,SAAoB,IAAM,GAAS,MAE3EkY,EAA2BoJ,EAAOtmB,KAAK2Z,GACpCl0B,KAAKw/B,SAAStL,EAAUuL,EAAUhvB,EAAWiiB,KAGtD,OAAOhS,QAAQkI,IAAI6O,GAAU9f,OAAOpS,IAClCvF,KAAKyd,IAAIkO,MAAM,2BAA4BpmB,SAIxCy1B,6BAA6B9S,EAAmBtmB,G,MACrD,MAAMwU,EAAO,IAAIiR,KAAiB,IAAZa,GACtB9R,EAAK4qB,SAAS,EAAG,EAAG,GACpB5qB,EAAK6qB,QAAQ,GACb,MAAMC,EAAgB9qB,EAAK+qB,UACrBC,EAAuC,QAA1B,EAAAphC,KAAKozB,gBAAgBxxB,UAAK,QAAK5B,KAAKozB,gBAAgBxxB,GAAQ,GAC/E,KAAKs/B,KAAiBE,GAAa,CACjC,MAAMj2B,EAAYC,SAASC,cAAc,OACzCF,EAAUyP,UAAY,qBAEtB,MAAMhD,EAAOxM,SAASC,cAAc,OACpCuM,EAAKxE,UAAUrS,IAAI,2BAEnB,MAAMosB,EAAsC,CAC1CkU,MAAO,QAGNjrB,EAAKkrB,iBAAkB,IAAIja,MAAOia,gBACnCnU,EAAQoU,KAAO,WAGjB,MAAMC,EAAc,IAAI,qBAAqB,CAC3CprB,KAAAA,EACA+W,QAAAA,IACCjrB,QACH0V,EAAKnM,OAAO+1B,GAEZr2B,EAAUM,OAAOmM,GAEjB,MAAMqW,EAAQ7iB,SAASC,cAAc,OACrC4iB,EAAM7a,UAAUrS,IAAI,4BAEpBoK,EAAUM,OAAOmM,EAAMqW,GAEvB,MAAMwT,GAAiB,EAAAC,EAAA,GAAqBN,EAAY,QACxD,IAAI1d,EAAI,EACR,KAAMA,EAAI+d,EAAe5+B,UAEpBq+B,EADOO,EAAe/d,MADQA,GAOnC0d,EAAWF,GAAiB,CAAC/1B,UAAAA,EAAW8iB,MAAAA,IACxC,EAAA0T,EAAA,GAAuBx2B,EAAWnL,KAAKwyB,KAAK5wB,GAAO8hB,GAGrD,OAAO0d,EAAWF,GAGbZ,iBACL,OAAO5f,QAAQkI,IAAI,CACjB5oB,KAAKmK,cAAcpC,OAAOg3B,YAC1B/+B,KAAKgH,SAASi4B,gBAAgB2C,YAAY5hC,KAAKmK,cAAcpC,OAAOs0B,YACpEr8B,KAAKgH,SAASi4B,gBAAgB4C,UAAU7hC,KAAKmK,cAAcpC,OAAOs0B,WAAY,uBAC7EhuB,MAAK,EAAE0wB,EAAW6C,EAAaC,KACzB9C,IAAc6C,GAAeC,IAIjC5mB,U,MACLjb,KAAKgzB,aAAe,GACpBhzB,KAAKizB,OAAS,GACdjzB,KAAKkzB,aAAc,EACnBlzB,KAAK+yB,UAAY,GACjB/yB,KAAKmzB,WAAY,EACjBnzB,KAAKyyB,WAAa,EAElBzyB,KAAK4d,cAAckD,QAEnB9gB,KAAKm0B,UAAUrvB,SAASovB,IACtBl0B,KAAK4yB,gBAAgBsB,EAASjiB,cAAgB,MAG/B,QAAd,EAAAjS,KAAKoxB,iBAAS,eAAEC,cACjBrxB,KAAKoxB,UAAUM,kBAUjB1xB,KAAK0yB,WAAW7oB,QAChB7J,KAAK4gC,0BAAuB58B,EAC5BhE,KAAK8hC,uBACL9hC,KAAKw+B,iBAAcx6B,EAGd89B,uBACL9hC,KAAKm0B,UAAUrvB,SAASovB,IACtBA,EAAS+B,YAASjyB,KAIf+9B,YAAYC,GAAU,GACxBhiC,KAAK6yB,aAAahwB,SACnB7C,KAAK6yB,aAAa/tB,SAAS2C,IACzB4xB,IAAI4I,gBAAgBx6B,MAEtBzH,KAAK6yB,aAAahwB,OAAS,GAG7B7C,KAAKm0B,UAAUrvB,SAASiO,IAStB,GARAA,EAAIkiB,WAAWlW,UAAY,GAExB/e,KAAKwzB,gBAENxzB,KAAKmL,UAAUiI,UAAUrS,IAAI,QAC7Bf,KAAKmL,UAAUwN,cAAcvF,UAAUrS,IAAI,iBAG7B,UAAbgS,EAAInR,OAIH5B,KAAK2yB,eAAe5f,EAAId,aAAc,CACxC,MAAMkpB,EAASpoB,EAAIkiB,WAAWtc,cAE1BwiB,EAAO3jB,cAAc,gBACvB,EAAA0qB,EAAA,GAAa/G,GAAQ,GAIvB,MAAMgH,EAAQhH,EAAO3jB,cAAc,kBAChC2qB,GACDA,EAAM5/B,aAiBZvC,KAAKozB,gBAAkB,GACvBpzB,KAAKk1B,iBAAiBpU,QACtB9gB,KAAK4vB,WAAWoG,UAAY,EActBS,kBAAkB2L,GACxB,MAAM/xB,GAAU,EAAAgyB,EAAA,GAAKriC,KAAKmK,eAG1B,OAFAkG,EAAQ4B,YAAc,CAACxC,EAAG2yB,GAC1B/xB,EAAQ4vB,SAAWjgC,KAAK+yB,UAAUqP,GAC3B/xB,EAGFiyB,UAAS,OAACv6B,EAAM,MAAE2nB,EAAK,SAAE5c,EAAQ,eAAE6f,EAAc,SAAE3hB,EAAQ,QAAE2sB,EAAO,QAAE4E,IAS3EviC,KAAKmK,cAAgB,CACnBpC,OAAAA,EACA2nB,MAAOA,GAAS,GAChBzd,YAAa,CAACxC,EAAGzP,KAAKk0B,SAASjiB,aAC/Ba,SAAAA,EACA9B,SAAAA,EACA2sB,QAAAA,EACA4E,QAAAA,GAGFviC,KAAK2yB,eAAiBA,MAAAA,EAAAA,EAAkB,GAExC3yB,KAAKib,UAGAnX,U,QACL9D,KAAK0R,eAAeC,YACpB3R,KAAK4vB,WAAW9rB,UACC,QAAjB,EAAA9D,KAAKy0B,oBAAY,SAAEvZ,kBACL,QAAd,EAAAlb,KAAKoxB,iBAAS,SAAEnW,UAEhBjb,KAAK21B,yBAAsB3xB,EAC3BhE,KAAK61B,iBAAc7xB,EACnBhE,KAAK40B,eAAY5wB,EACjBhE,KAAK6zB,uBAAoB7vB,EACzBhE,KAAKy0B,kBAAezwB,EACpBhE,KAAKoxB,eAAYptB,K,mmBE/kDN,MAAMw+B,EAuDnBziC,YAAYotB,GAtDL,KAAAhiB,UAAYC,SAASC,cAAc,OACnC,KAAAyjB,KAAO,2BAIN,KAAA2T,eAAiBr3B,SAASC,cAAc,OAQzC,KAAAq3B,SAAW,IAAIthC,IAEf,KAAAuhC,SAAU,EAET,KAAA3xB,SAAW,EACX,KAAA4xB,YAAc,EAGd,KAAAlT,MAAQ,GAGR,KAAAmT,WAAkG,GAElG,KAAAvH,gBAA+B,IAAIl6B,IAInC,KAAA0hC,SAAmC,CAAC,WAGpC,KAAAC,aAAc,EACd,KAAAtE,eAAgB,EAChB,KAAA5N,WAAgC,aAChC,KAAAmS,YAAa,EAGb,KAAAC,QAA+D,GAK/D,KAAAC,aAA4B,oBAE5B,KAAAC,gBAAiB,EAMjB,KAAAC,OAA6B,QAoK7B,KAAAC,QAAU,KAChB,MAAM52B,EAAQzM,KAAKqwB,MAAM5jB,MACzB,GAAGzM,KAAK0vB,QAAUjjB,EAAO,EACpBzM,KAAK8iC,SAASluB,SAAS,aAAe5U,KAAK8iC,SAASluB,SAAS,cAC9D5U,KAAKsjC,eAAiB,MAGrBtjC,KAAK8iC,SAASluB,SAAS,aACxB5U,KAAKgR,SAAW,EAChBhR,KAAK4iC,YAAc,GAGrB,IAAI,MAAMlf,KAAK1jB,KAAKijC,UAEhBjjC,KAAKijC,QAAQvf,GAGjB1jB,KAAK8uB,KAAO,2BAEZ9uB,KAAKsO,QAAU,KACftO,KAAK6iC,WAAa,GAClB7iC,KAAK0vB,MAAQjjB,EACbzM,KAAKs7B,gBAAgBxa,QACrB9gB,KAAKmjC,gBAAiB,EAGtBnjC,KAAKujC,mBAqLT,KAAAxD,iBAAmB,KACjB//B,KAAK4vB,WAAWmQ,qBA/VhB,OAAW//B,KAAMmtB,GAEjBntB,KAAKmL,UAAUiI,UAAUrS,IAAI,WAAY,YAAcf,KAAKojC,QAE5D,MAAMI,GAAKxjC,KAAKyjC,mBAAqBzjC,KAAK0jC,eAAe1pB,KAAKha,MA4C9D,GA3CAA,KAAKyjC,kBAA0BE,GAAY,EAAD,gCA8BxC,OA7BG3jC,KAAKmjC,iBACNnjC,KAAK4vB,WAAWgU,QAAQ5a,YAAYhpB,KAAK8uB,MACzC9uB,KAAK4vB,WAAWE,oBAAoB9vB,KAAK8uB,MACzC9uB,KAAKmjC,gBAAiB,GAGxBQ,EAAUA,EAAQrL,QAAQvwB,IACxB,MAAM87B,GAAe7jC,KAAKs7B,gBAAgBj4B,IAAI0E,GAE9C,OADG87B,GAAa7jC,KAAKs7B,gBAAgBv6B,IAAIgH,GAClC87B,KAGN7jC,KAAK8jC,mBACNH,QAAgB,OAAYA,GAAe57B,GAAW,EAAD,gCACnD,GAAGA,EAAOogB,oBACWnoB,KAAKgH,SAASqI,gBAAgBssB,QAAQ5zB,IAChDi3B,QACP,IAAI,MAAMlE,KAAU96B,KAAK8jC,iBACvB,SAAS9jC,KAAKgH,SAASqI,gBAAgByrB,GAAQ/yB,GAC7C,OAAO,EAMf,OAAO,QAIJy7B,EAAEG,MAGX3jC,KAAKqwB,MAAQjlB,SAASC,cAAc,SACpCrL,KAAKqwB,MAAMjd,UAAUrS,IAAI,yBACtBf,KAAKuD,aACN,QAAMvD,KAAKqwB,MAAOrwB,KAAKuD,iBAAaS,EAAW,gBAE/C,QAAMhE,KAAKqwB,MAAO,qBAAiBrsB,EAAW,eAGhDhE,KAAKqwB,MAAMzuB,KAAO,OAEf5B,KAAK+iC,YAAa,CACnB,MAAMgB,EAAU,IAAI,KAAe,IACnCA,EAAQC,eAAe5wB,UAAUrS,IAAI,2BACrC,MAAMkjC,EAAe74B,SAASC,cAAc,OAC5C44B,EAAa7wB,UAAUrS,IAAI,6BAE3Bf,KAAKkkC,kBAAoB94B,SAASC,cAAc,OAChDrL,KAAKkkC,kBAAkB9wB,UAAUrS,IAAI,mBAErCf,KAAKkkC,kBAAkBz4B,OAAOzL,KAAKqwB,OACnC4T,EAAax4B,OAAOzL,KAAKkkC,mBACzBlkC,KAAKmkC,mBAAqB,IAAI,KAAWF,IAIzC,QAAiBjkC,KAAKkkC,mBAAoBp8B,IACxC,GAAG9H,KAAK2iC,QAAS,OACjB,IAAItiC,EAASyH,EAAEzH,OAGf,GAFAA,GAAS,OAAgBA,EAAQ,kBAE7BA,EAAQ,OAEZ,MAAM0H,EAAS1H,EAAOslB,QAAQpZ,IACxBmyB,EAAK1+B,KAAKyiC,eAAejrB,cAAc,kBAAoBzP,EAAS,MACtE22B,GAGF,QAAmBA,GAFnB1+B,KAAKuC,OAAOwF,EAAOkqB,eAMvB8R,EAAQvxB,QAAQ/G,OAAOw4B,GACvBjkC,KAAKmL,UAAUM,OAAOs4B,EAAQ54B,WAGhCnL,KAAKyiC,eAAervB,UAAUrS,IAAI,sBAElC,MAAMgjC,EAAU,IAAI,KAAe,CACjCnsB,KAAM5X,KAAKokC,uBACXC,UAAU,IAEZN,EAAQvxB,QAAQ/G,OAAOzL,KAAK8uB,MAC5B9uB,KAAKyiC,eAAeh3B,OAAOs4B,EAAQ54B,WACnCnL,KAAK4vB,WAAa,IAAI,KAAW5vB,KAAKyiC,gBACtCziC,KAAK4vB,WAAWE,oBAAoB9vB,KAAK8uB,OAEzC,QAAiB9uB,KAAKyiC,gBAAiB36B,IACrC,MAAMzH,GAAS,OAAgByH,EAAEzH,OAAQ,gBAGzC,IAFA,OAAYyH,IAERzH,EAAQ,OACZ,GAAGL,KAAK2iC,QAAS,OAEjB,IAAIp2B,EAAuBlM,EAAOslB,QAAQ5d,OAG1C,GAFAwE,EAAMA,EAAI4b,WAAa5b,EAAI0lB,WAAa1lB,GAEpCvM,KAAK+iC,YAEP,YADA/iC,KAAKe,IAAIwL,GAKRvM,KAAK0iC,SAASr/B,IAAIkJ,GACnBvM,KAAKuC,OAAOgK,GAEZvM,KAAKe,IAAIwL,GAGX,MAAM+3B,EAAWjkC,EAAOmX,cAAc,SACtC8sB,EAASC,SAAWD,EAASC,WAG/B,MAAMC,GAAiB,OAASxkC,KAAKqjC,QAAS,KAAK,GAAO,GAC1DrjC,KAAKqwB,MAAM1iB,iBAAiB,QAAS62B,GAErCxkC,KAAK4vB,WAAWK,iBAAmB,KACjCjwB,KAAKujC,kBAGPvjC,KAAK4vB,WAAWzkB,UAAUuM,SAAQ,WAElC1X,KAAKmL,UAAUM,OAAOzL,KAAKyiC,gBAC3BziC,KAAKykC,SAASh5B,OAAOzL,KAAKmL,WAG1BzI,YAAW,KACT,MAAMgiC,EAAoB1kC,KAAKujC,iBAC5BpW,EAAQwX,eACTD,EAAkBr2B,MAAK,KACrB8e,EAAQwX,qBAGX,GAiCSC,c,yCAET5kC,KAAKgjC,YACLhjC,KAAK4iC,aACY,IAAlB5iC,KAAKgR,WACLhR,KAAK8iC,SAASluB,SAAS,YACrB5U,KAAK0vB,eAAe1vB,KAAKgH,SAASy1B,gBAAgBoI,eAAe7kC,KAAK0vB,gBAElE1vB,KAAKyjC,kBAAkB,CAAC,eAI1BqB,UAAUljC,GAKhB,YAJ0BoC,IAAvBhE,KAAKijC,QAAQrhC,KACd5B,KAAKijC,QAAQrhC,GAAQ,KAGd5B,KAAKijC,QAAQrhC,GAGVmjC,iB,yCACZ,GAAG/kC,KAAKsO,QAAS,OAAOtO,KAAKsO,QAE7B,GAAGtO,KAAK6iC,WAAWnF,SAAW19B,KAAK6iC,WAAWmC,SAC5C,OAIF,MAAMC,EAAY,WAAoB,GAAK,KAAO,EAE5C3pB,EAAStb,KAAK8kC,UAAU,WACxBx2B,EAAUtO,KAAKgH,SAAS8G,mBAAmB2vB,iBAAiBz9B,KAAK0vB,MAAO1vB,KAAK4iC,YAAaqC,EAAWjlC,KAAKgR,UAAU,GAC1HhR,KAAKsO,QAAUA,EACf,MAAM7B,QAAc6B,EACpB,GAAGtO,KAAKijC,QAAQvF,UAAYpiB,EAC1B,OAGFtb,KAAKsO,QAAU,KAEf,IAAIovB,EAAUjxB,EAAMixB,QACpB,GAAGA,EAAQ76B,OAAQ,CACjB,MAAMqiC,GAAiB,OAAexH,EAAQA,EAAQ76B,OAAS,KAAO,EAEtE66B,EAAUA,EAAQhH,SAClB,OAAcgH,GAASpX,GAAKA,EAAEve,SAAW,WAEtC/H,KAAKmlC,mBACNzH,QAAgB,OAAYA,GAAUpX,GAAMtmB,KAAKolC,eAAe9e,EAAEve,iBAG9D/H,KAAK4kC,cAEX5kC,KAAK4iC,YAAcsC,EAKrB,GAFAllC,KAAKyjC,kBAAkB/F,EAAQnjB,KAAK8N,GAAWA,EAAOtgB,UAEnD0E,EAAM44B,MAAO,CACd,IAAIrlC,KAAK6iC,WAAWnF,QAOlB,aANM19B,KAAK4kC,cAEX5kC,KAAK6iC,WAAWnF,SAAU,EAC1B19B,KAAK4iC,YAAc,EACnB5iC,KAAKgR,SAAW,EAEThR,KAAK+kC,iBAIZ,GAFA/kC,KAAK6iC,WAAWmC,UAAW,GAEvBhlC,KAAK6iC,WAAW5F,SAClB,OAAOj9B,KAAKslC,sBAMNF,eAAer9B,G,yCAC3B,MAAM2zB,QAA0B17B,KAAKgH,SAASqI,gBAAgBssB,QAAQ5zB,GACtE,OAAGA,EAAOg2B,SACyB,kBAA1B/9B,KAAKmlC,mBAAwC,OAAczJ,MAC1D,OAAUA,EAAmB17B,KAAKmlC,wBAArC,KAKKG,kB,yCACZ,GAAGtlC,KAAKsO,QAAS,OAAOtO,KAAKsO,QAE7B,GAAGtO,KAAK6iC,WAAW5F,SACjB,OAGF,MAAMsI,EAAiBvlC,KAAK8iC,SAASluB,SAAS,YAE9C,IAAI5U,KAAKsjC,eAAgB,CAQvB,MAAMhoB,EAAStb,KAAK8kC,UAAU,YACxBx2B,EAAUoS,QAAQkI,IAAI,CAC1B2c,EAAiBvlC,KAAKgH,SAASy1B,gBAAgBO,mBAAmBh9B,KAAK0vB,OAAS,GAChF1vB,KAAK0vB,MAAQ1vB,KAAKgH,SAASy1B,gBAAgBS,eAAel9B,KAAK0vB,YAAS1rB,IAG1EhE,KAAKsO,QAAUA,EACf,MAAOg1B,EAAgBkC,SAAsBl3B,EAC7C,GAAGtO,KAAKijC,QAAQhG,WAAa3hB,EAC3B,OAGF,GAAGkqB,EAAc,CAEf,IAAIC,EAAgBF,EAAiBC,EAAarI,WAAW7e,OAAOknB,EAAa5K,SAAW4K,EAAarI,WAEtGn9B,KAAKmlC,mBACNM,QAAsB,OAAYA,GAAgB19B,GAAW/H,KAAKolC,eAAer9B,MAG/E/H,KAAK8iC,SAASluB,SAAS,aACzB6wB,EAAgBA,EAAcnN,QAAQvwB,GAAWA,EAAOg2B,YAG1D/9B,KAAKsjC,gBAAiB,OAAaA,EAAehlB,OAAOmnB,SACpDzlC,KAAKsjC,eAAiBA,EAAe5M,SAE5C,OAAiB12B,KAAKsjC,eAAgB,UACtCtjC,KAAKsO,QAAU,KAIjB,MAAM22B,EAAY,WAAoB,GAAK,KAAO,EAC5CS,EAAM1lC,KAAKsjC,eAAe1V,OAAO,EAAGqX,GAC1CjlC,KAAKyjC,kBAAkBiC,GAGnB1lC,KAAKsjC,eAAezgC,SACtB7C,KAAK6iC,WAAW5F,UAAW,MASjB0I,6B,yCACZ,GAAG3lC,KAAKsO,QAAS,OAAOtO,KAAKsO,QAE7B,GAAGtO,KAAK6iC,WAAW+C,oBACjB,OAGF,MAEMtqB,EAAStb,KAAK8kC,UAAU,uBACxBx2B,EAAUtO,KAAKgH,SAASo4B,kBAAkBC,uBAAuBr/B,KAAK+H,OAAOs0B,WAAY,CAAC5sB,EAAG,4BAA6Bo2B,EAAG7lC,KAAK0vB,OAHtH,GAGyI1vB,KAAK8uB,KAAKE,mBAC/J6M,QAAqBvtB,EAC3B,GAAGtO,KAAKijC,QAAQ2C,sBAAwBtqB,EACtC,OAGF,MAAMqoB,EAAU9H,EAAaA,aAAathB,KAAKskB,IACtC,OAAqBA,MAE9B,OAAiB8E,EAAS,UAC1B3jC,KAAKyjC,kBAAkBE,IAEpB3jC,KAAK8uB,KAAKE,mBAAqB6M,EAAanL,OAASmL,EAAaA,aAAah5B,OAfhE,MAgBhB7C,KAAK6iC,WAAW+C,qBAAsB,MAQlCrC,iBACN,MAmCM9L,EAnCM,MACV,MAAMA,EAA2B,GAejC,OAAIz3B,KAAK8iC,SAASluB,SAAS,YAAkD5U,KAAK6iC,WAAWmC,WAC3FvN,EAASp1B,KAAKrC,KAAK+kC,kBAEf/kC,KAAK6iC,WAAWmC,YAKlBhlC,KAAK8iC,SAASluB,SAAS,cAAe5U,KAAK8iC,SAASluB,SAAS,YAAgB5U,KAAK6iC,WAAW5F,UAC/FxF,EAASp1B,KAAKrC,KAAKslC,mBAGlBtlC,KAAK8iC,SAASluB,SAAS,yBAA2B5U,KAAK6iC,WAAW+C,qBACnEnO,EAASp1B,KAAKrC,KAAK2lC,8BAGdlO,GAZIA,GAeIx0B,GACXqL,EAAUoS,QAAQkI,IAAI6O,GAK5B,OAJGA,EAAS50B,QACVyL,EAAQD,KAAKrO,KAAK+/B,kBAGbzxB,EAGKo1B,cAAcC,G,0CAItB3jC,KAAK8iC,SAASluB,SAAS,YAAc5U,KAAK6iC,WAAW5F,WACvD0G,QAAgB,OAAYA,GAAU57B,GAC7B/H,KAAKgH,SAASy1B,gBAAgBqJ,iBAAiB/9B,MAI1D47B,EAAQ7+B,SAAciD,GAAW,EAAD,gCAC9B,MAAM,IAACmvB,GAAO,uBAA+B,CAC3CnvB,OAAQA,EACRoD,UAAWnL,KAAK4vB,WAChB6O,cAAez+B,KAAKy+B,cACpB5N,WAAY7wB,KAAK6wB,aAGnB,GAAG7wB,KAAK+iC,YAAa,CACnB,MAAML,EAAW1iC,KAAK0iC,SAASr/B,IAAI0E,GAC7Bg+B,EAAgB,IAAI,IAEvBrD,IAEDqD,EAAc1V,MAAMkU,SAAU,GAGhCrN,EAAIV,YAAY9e,QAAQquB,EAAcC,OAGxC,IAAI3H,EAEFA,EADCt2B,EAAOg3B,kBACW,OAAqBh3B,EAAOs0B,YACvCt0B,IAAW,UACN,QAAK/H,KAAKkjC,eAEV,aAA0BljC,KAAKgH,SAASy1B,gBAAgBC,QAAQ30B,EAAOk2B,aAGtF/G,EAAIiF,gBAAgB1wB,OAAO4yB,WAIxBt9B,IAAIwL,EAAsBuC,EAA8BmnB,GAAS,G,MAItE,GAFAj2B,KAAK0iC,SAAS3hC,IAAIwL,IAEdvM,KAAK+iC,YAEP,YADA/iC,KAAK+vB,SAAS/vB,KAAK0iC,SAAS96B,MAI3B5H,KAAK0vB,MAAMQ,SACZlwB,KAAKqwB,MAAM5jB,MAAQ,GACnBzM,KAAKqjC,WAGP,MAAM/Y,EAAMlf,SAASC,cAAc,OACnCif,EAAIlX,UAAUrS,IAAI,gBAAiB,YAEnC,MAAMod,EAAW,IAAI,IAqCrB,OApCAA,EAAS/K,UAAUrS,IAAI,uBAAwB,QAAS,aACxDod,EAAS8nB,UAAW,EAEpB3b,EAAI3E,QAAQpZ,IAAM,GAAKA,EACpBA,EAAI4b,kBACQnkB,IAAV8K,IACDA,EAAQ,IAAI,IAAU,CAAC/G,OAAQwE,EAAI0lB,WAAY5J,QAAQ,IAAOnmB,SAGhEic,EAAS0K,kBAAkB,CACzB9gB,OAAQwE,KAITuC,IACoB,iBAAZ,EACPwb,EAAIvL,UAAYjQ,IAEhB,OAAewb,EAAKxb,GACpBwb,EAAI7e,OAAOqD,KAIfwb,EAAI4b,sBAAsB,aAAc/nB,GAExCne,KAAKkkC,kBAAkB/sB,aAAamT,EAAKtqB,KAAKqwB,OAEjC,QAAb,EAAArwB,KAAK+vB,gBAAQ,mBAAG/vB,KAAK0iC,SAAS96B,MAE3BquB,GACDj2B,KAAKmkC,mBAAmB3O,kBAAkB,CACxCtzB,QAASlC,KAAKqwB,MACdoF,SAAU,WAIPnL,EAGF/nB,OAAOgK,GACZ,IAAIvM,KAAK+iC,YAAa,OAEtB,MAAMzY,EAAMtqB,KAAKkkC,kBAAkB1sB,cAAc,cAAcjL,OAC/D+d,EAAIlX,UAAU7Q,OAAO,YAChB+nB,EAAI6b,YACT7b,EAAIlX,UAAUrS,IAAI,aAElB,MAAMigB,EAAiB,KACrBhhB,KAAK0iC,SAASzhC,OAAOsL,GACrB+d,EAAI/nB,SACJvC,KAAK+vB,UAAY/vB,KAAK+vB,SAAS/vB,KAAK0iC,SAAS96B,OAG5C,+BACD0iB,EAAI3c,iBAAiB,eAAgBqT,EAAgB,CAAChT,MAAM,IAE5DgT,IAIGolB,cACL,MAAO,IAAIpmC,KAAK0iC,UAGX2D,WAAWC,GAChBA,EAAOxhC,SAAS2H,IACdzM,KAAKe,IAAI0L,OAAOzI,GAAW,MAG7BuP,OAAOgzB,uBAAsB,KAC3BvmC,KAAKmkC,mBAAmB3O,kBAAkB,CACxCtzB,QAASlC,KAAKqwB,MACdoF,SAAU,SACV+Q,eAAgB,mB,snBCnSxB,SAASC,EAA2BC,GAAiB,GACnD,MAAMnrB,EAAY,IAAI,IAAqB,CAACoC,YAAY,EAAM+oB,eAAAA,IAQ9D,OAPAnrB,EAAUrQ,YAENw7B,IACFnrB,EAAUorB,OAAO5gB,eAAe,KAAM,IAAK,MAC3CxK,EAAUqrB,YAAc,cAGnBrrB,EAzUT,qBAA2B,uBAAuB,EAAEsrB,KAAAA,EAAM9+B,OAAAA,MACxD8+B,EAAK/hC,SAASkD,IACZ,MAAM8+B,EAAO,cAAc9+B,qBAAuBD,MACjD6Q,MAAMC,KAAKzN,SAAS+M,iBAAiB,0BAA0B2uB,4BAA+BA,MAA4BhiC,SAASiiC,IAClIA,EAAK3zB,UAAU7Q,OAAO,sBAwUrB,MAAMykC,EAAmB,CAACC,EAAqBC,KACpD,IAAI32B,EAAmB5G,EAEvB,MAAMw9B,GAAaF,EAAO7zB,UAAUqB,SAAS,qBACvCtJ,GAAY,OAAgB87B,EAASE,EAAyB,gBAAb,YACvD,GAAGh8B,EAAW,CACZ,MAAM27B,EAAO,+BACPM,EAAoB,wBAAwBN,IAClD,IAAIO,EAOJ,GAHEA,EAHEJ,EAAOpiB,QAAQuiB,GAGL,CAACA,GAFD,CAAC,kBAAkBN,IAAQ,eAAeA,KAKrDK,EAAW,CACZ,MAAMG,EAAS,yBACfD,EAAYA,EAAU9sB,KAAKzQ,GAAMw9B,EAASx9B,IAG5C,MAAM6a,EAAW0iB,EAAUvjB,KAAK,MAE1BgB,EAAWlM,MAAMC,KAAK1N,EAAUgN,iBAAiBwM,IACjD7b,EAAMgc,EAASjL,QAAQotB,GAEvBM,EAA0BziB,EAASvK,KAAKrY,IAAY,CAAE6F,OAAQ7F,EAAQyjB,QAAQ5d,OAAOkqB,WAAYjqB,KAAM9F,EAAQyjB,QAAQ3d,QAE7HuI,EAAOg3B,EAAW7Q,MAAM,EAAG5tB,GAC3Ba,EAAO49B,EAAW7Q,MAAM5tB,EAAM,GAUhC,OANIa,EAAK9G,QAAU8G,EAAK,GAAG3B,IAAMk/B,GAAe32B,EAAK1N,QAAU0N,EAAKA,EAAK1N,OAAS,GAAGmF,IAAMk/B,MACxF32B,EAAM5G,GAAQ,CAACA,EAAKoH,UAAWR,EAAKQ,YAKhC,CAACR,EAAM5G,IAGD,MAAM69B,UAAqBhkC,YAA1C,c,oBAIS,KAAAi1B,UAAW,EACX,KAAAE,cAAe,EAEf,KAAAlF,YAAa,EAMZ,KAAA/hB,eAAiB,IAAI,IAKhB+1B,S,mDACXznC,KAAKoT,UAAUrS,IAAI,SACnBf,KAAKgH,SAAW,aAEhBhH,KAAK2lB,QAAQ3d,IAAM,GAAKhI,KAAKkI,QAAQF,IACrChI,KAAK2lB,QAAQ5d,OAAS,GAAK/H,KAAKkI,QAAQH,OAExC,MAAMpG,GAAM,OAAoB3B,KAAKkI,SAC/Bw/B,EAA2B,UAAb/lC,EAAIC,KAClBiN,GAAW7O,KAAK24B,cAAgB+O,EAChCC,EAAa3nC,KAAKkI,QAAQsF,OAAOo6B,YACjCC,EAAgC,QAAZ,EAAA7nC,KAAKkI,eAAO,eAAE2/B,kBAElCC,GAAc,OAAwB,EAAfnmC,EAAIiF,UAEjC5G,KAAK+e,UAAY,wOAQjB,MAAMnV,EAAS5J,KAAKoV,kBAEd2yB,EAAc38B,SAASC,cAAc,OAC3C08B,EAAY30B,UAAUrS,IAAI,kBAEI,UAAbY,EAAIC,MAAoB5B,KAAKkI,SAAWlI,KAAKkI,QAAQsF,OAAOI,cAE3E5N,KAAKoT,UAAUrS,IAAI,aAGlB8mC,IACD7nC,KAAKoT,UAAUrS,IAAI,eACnBf,KAAKyL,OAAOs8B,IAGd,MAAMC,QAAoBn5B,EA9T9B,SAAgCo5B,G,yCAC9BA,EAAQ70B,UAAUrS,IAAI,YAEtB,MAAMmH,EAAU+/B,EAAQ//B,QAClBvG,GAAM,OAAoBuG,GAE7BA,EAAQsF,OAAO06B,KAChBD,EAAQ70B,UAAUrS,IAAI,UAGxB,IAAIonC,EAAYxmC,EAAI6N,WAAW9O,MAAM6O,GAA8B,2BAAhBA,EAAUE,IAA6E04B,UAAY,IAAIC,WAAW,IACrKD,EAhHK,SAAwBA,GACxBA,aAAoBC,aACvBD,EAAW,IAAIC,WAAWD,IAG5B,MACME,EAD6B,EAAlBF,EAAStlC,OACI,EAAI,EAClC,IAAIwlC,EACF,OAAO,IAAID,WAAW,IAGxB,IAAIE,EACJ,IACE,MAAMC,EAAW,IAAIC,SAASL,EAASM,QACvCH,EAAS,IAAIF,WAAWC,GACxB,IAAI,IAAI3kB,EAAI,EAAGA,EAAI2kB,EAAY3kB,IAAK,CAClC,MAAMglB,EAAgB,EAAJhlB,EAAQ,EAAI,EACxBilB,EAAe,EAAJjlB,EAAQ,EACnBjX,EAAQ87B,EAASK,UAAUF,GAAW,GAC5CJ,EAAO5kB,GAAMjX,GAASk8B,EAAY,IAEpC,MAAMpjC,GACN+iC,EAAS,IAAIF,WAAW,IAY1B,OAAOE,EA8EIO,CAAeV,EAASzR,MAAM,EAAG,KAE5C,MAAM,IAACoS,EAAK39B,UAAW49B,EAAY,OAAEC,GA7EvC,SAA4Bb,EAAsBvhC,GAChD,MAGMqiC,EAAe,aAAsB,GAAK,GAG1CC,EAAO,aAAsB,IAAM,IACnCC,EAAO,aAAsB,IAAM,IACnCH,GAAS,OAAMpiC,EAAW,GAAKuiC,EAAMD,EAAMC,GAE3CL,EAAM19B,SAAS0a,gBAAgB,6BAA8B,OACnEgjB,EAAI11B,UAAUrS,IAAI,uBAClB+nC,EAAI/iB,eAAe,KAAM,QAAS,GAAKijB,GACvCF,EAAI/iB,eAAe,KAAM,SAAU,GAAKkjB,GACxCH,EAAI/iB,eAAe,KAAM,UAAW,OAAOijB,KAAUC,KAIrD,MAAMG,EAAY7iC,KAAKC,OAAO2hC,GACxBkB,EAASlB,EAAStlC,OAASslC,EAAStlC,OAAS,IAC7CymC,EAAW/iC,KAAKI,IAAKqiC,EAAS,EAA0B,EAAGK,GAEjE,IAAIE,EAAW,EACf,MAAMC,EAAWP,EArBI,EAuBrB,IAAIh0B,EAAO,GACX,IAAI,IAAIyO,EAAI,EAAG+lB,EAAO,EAAGC,EAAO,EAAGhmB,EAAI2lB,IAAU3lB,EAAG,CAClD,MAAMjX,EAAQ07B,EAASzkB,IAAM,EAC7B,GAAIgmB,EAAOJ,GAAaD,EAAQ,CAC9BK,EAAOA,EAAOJ,EAAWD,EACtBK,GAAQJ,EAAW,GAAK,GACtBC,EAAW98B,IAAO88B,EAAW98B,GAGlC,MAAMk9B,EAAYpjC,KAAKC,KAAM+iC,EAAWC,GAAcJ,EAAY,GAAK,IAAOA,EAAY,GAhCzE,GAqCjBn0B,GAHU,oBACCw0B,SAAYR,EAAeU,wBAA0CA,mCAIhFF,GAAQG,EAGNL,EADCG,GAAQJ,EAAW,GAAK,EACd,EAEA78B,OAGV88B,EAAW98B,IAAO88B,EAAW98B,GAEhCi9B,GAAQJ,EAIZ,MAAMn+B,EAAYC,SAASC,cAAc,OAKzC,OAJAF,EAAUiI,UAAUrS,IAAI,kBACxBoK,EAAUM,OAAOq9B,GAEjBA,EAAI7wB,mBAAmB,YAAahD,GAC7B,CAAC6zB,IAAAA,EAAK39B,UAAAA,EAAW69B,OAAAA,GAgBuBa,CAAmB1B,EAAUxmC,EAAIiF,UAE1EkjC,EAAmBf,EAAapgB,WAAU,GAChDmhB,EAAiB12B,UAAUrS,IAAI,uBAC/BgoC,EAAa31B,UAAUrS,IAAI,6BAE3B,MAAMgpC,EAAoB3+B,SAASC,cAAc,OACjD0+B,EAAkB32B,UAAUrS,IAAI,4BAChCgpC,EAAkBt+B,OAAOs9B,EAAce,GAEvC,MAAME,EAAU5+B,SAASC,cAAc,OACvC2+B,EAAQ52B,UAAUrS,IAAI,cACtBknC,EAAQx8B,OAAOs+B,EAAmBC,GAElC,IAAIvyB,EAAWqxB,EAiFf,MA/Ee,KACb,IAAI5iC,EAAQ+hC,EAAQ/hC,MAEpB,MAQM+jC,EAAe,KACnBH,EAAiBx+B,MAAMsX,MAAS1c,EAAMI,YAAcJ,EAAMU,SAAW,IAAO,OAG1EV,EAAM7B,QAAW6B,EAAMI,YAAc,GAAKJ,EAAMI,cAAgBJ,EAAMU,WACxEqjC,IAGF,MAAMC,GAAsB,OAAgBD,GAqD5C,OApDAhC,EAAQkC,iBAAiB,aAAcD,GACvCjC,EAAQkC,iBAAiB,QAASD,GAClCjC,EAAQkC,iBAAiB,QAnBJ,MACnB,SAAc,MACRjkC,IACJ+jC,KACQ/jC,EAAM7B,SACb4jC,MAgBLA,EAAQmC,aAAa/7B,MAAK,KACxB,IAAIuR,GAAY,EAAOyqB,GAAY,EAiCnC,SAASC,EAAMxiC,GACb,IAAIyiC,EACJ,GAAGziC,aAAagqB,WACdyY,EAAUziC,EAAEyiC,YACP,CACL,MAAM1oB,EAAQ/Z,EAAEzH,OAAuByhB,wBACvCyoB,EAAUziC,EAAE0iC,cAAc,GAAGC,MAAQ5oB,EAAKI,KAG5C,MAAMyoB,EAAYH,EAAUvB,EAAqB9iC,EAAMU,SACvDV,EAAMI,YAAcokC,EA1CtBjzB,EAAS9J,iBAAiB,cAAe7F,IACpC8X,IACD1Z,EAAM1B,OACNob,GAAY,GAEdyqB,GAAY,KAEd5yB,EAAS9J,iBAAiB,aAAc7F,IACtCuiC,GAAY,EACTzqB,GAAW0qB,EAAMxiC,MAEtB2P,EAAS9J,iBAAiB,aAAc7F,IACtCA,EAAEiqB,iBACc,IAAbjqB,EAAEkO,SACD9P,EAAM7B,QACR6B,EAAM5B,QAGRgmC,EAAMxiC,GACN8X,GAAY,MAEdnI,EAAS9J,iBAAiB,WAAY7F,IACjCuiC,GAAazqB,IACd1Z,EAAM1B,OACNob,GAAY,OAGhB,QAAiBnI,GAAW3P,KAC1B,OAAYA,GACR5B,EAAM7B,QAAQimC,EAAMxiC,QAezB,KAEI,KACL2P,EAASlV,SACTkV,EAAW,KACXvR,EAAQ,UAsN0BykC,CAAiB3qC,MA/MzD,SAAyBioC,G,+CACvB,MAAMxP,EAAWwP,EAAQxP,SAEnBvwB,EAAU+/B,EAAQ//B,QAClBvG,GAAM,OAAoBuG,GAE1B2G,EAAuB,UAAblN,EAAIC,MAAiC,UAAbD,EAAIC,KACtCgpC,EAAgBx/B,SAASC,cAAc,OAC7Cu/B,EAAcx3B,UAAUrS,IAAI,qBAE5B,MAAM8pC,EAAiBlpC,EAAI6N,WAAW9O,MAAMomC,GAAoB,2BAAXA,EAAKr3B,IAE1D,IAAIZ,EAAS,CACX,MAAMi8B,EAA2B,IAC9BD,MAAAA,OAAc,EAAdA,EAAgBl7B,YACjBm7B,EAAMzoC,MAAK,OAAcwoC,EAAel7B,YAGvC8oB,EACDqS,EAAMzoC,MAAK,QAAmB6F,EAAQkO,OAC7B00B,EAAMjoC,QACfioC,EAAMzoC,MAAK,OAAYV,EAAIiG,OAG1BqgC,EAAQxU,YACTqX,EAAMzoC,WAAW,OAAiB6F,IAGpC0iC,EAAcn/B,WAAU,QAAiBq/B,EAAO,QAQlD7C,EAAQhwB,mBAAmB,YALd,wJAOb,MAAM8yB,EAAU9C,EAAQzwB,cAAc,gBAEhCwzB,EAAmB,IAAI,IAC7BA,EAAiBrlB,QAAQ+S,WAAauP,EAAQtiB,QAAQ+S,WACtDsS,EAAiBrlB,QAAQslB,SAAWhD,EAAQtiB,QAAQslB,SACpDD,EAAiBrlB,QAAQulB,SAAWjD,EAAQtiB,QAAQulB,SACjDr8B,EACDm8B,EAAiBv/B,aAAa,OAAiBvD,KAE/C,OAAa8iC,GAAkB,OAAmC,QAArB,EAAAH,MAAAA,OAAc,EAAdA,EAAgB/7B,aAAK,QAAInN,EAAI+N,YAG5Eq7B,EAAQt/B,OAAOu/B,GAEZ/C,EAAQxU,YACTsX,EAAQt/B,QAAO,OAAavD,IAG9B,MAAMijC,EAAclD,EAAQzwB,cAAc,mBAuC1C,OAtCA2zB,EAAY1/B,OAAOm/B,GAEJ,KACb,IAAIQ,GAAW,EAEXC,EAAe,IAAI,IAAkBpD,EAAQ/hC,MAAOvE,EAAIyF,mBAE5D6gC,EAAQkC,iBAAiB,SAAS,KAChClC,EAAQ70B,UAAU7Q,OAAO,uBAEzB4oC,EAAYG,UAAUtiB,YAAY4hB,GAClCQ,GAAW,KAGb,MAAMvjC,EAAS,KACTujC,IACFnD,EAAQ70B,UAAUrS,IAAI,uBACtBqqC,GAAW,EAERC,GACDF,EAAYG,UAAUtiB,YAAYqiB,EAAalgC,aAWrD,OANA88B,EAAQkC,iBAAiB,OAAQtiC,KAE7BogC,EAAQ/hC,MAAM7B,QAAU4jC,EAAQ/hC,MAAMI,YAAc,IACtDuB,IAGK,KACLwjC,EAAanwB,kBACbmwB,EAAalgC,UAAU5I,SACvB8oC,EAAe,UAoH4CE,CAAUvrC,MAEjEwrC,EAAexrC,KAAKwX,cAAc,eACxCg0B,EAAazsB,UAAY+oB,EAEzB,MAAMhL,EAAS98B,KAAK88B,OAAUvvB,IAC5BvN,KAAK88B,YAAS94B,EAEd,MAAMkC,EAAQlG,KAAKkG,MAAQ,aAAoClG,KAAKkI,QAASqF,GAEvE68B,EAAepqC,KAAKoqC,cAAe,SACtCpqC,KAAKkG,MAAM8kB,YAAchrB,KAAKkG,MAAMulC,kBAAmBrB,EAAal8B,UAErElO,KAAKmqC,iBAAiB,WAAW,IAAMC,EAAal8B,WAAW,CAACF,MAAM,IAGxEhO,KAAK0rC,iBAAmB1D,IAExB,MAAM2D,EAAa,KAAM,OAA6B,EAApBzlC,EAAMI,cAAoBuI,EAAW,MAAQi5B,EAAe,IAExFjgC,EAAS,KACb2jC,EAAa1R,UAAY6R,IACzB/hC,EAAOwJ,UAAUxJ,OAAO,WAAY1D,EAAM7B,WAGxC6B,EAAM7B,QAAW6B,EAAMI,YAAc,GAAKJ,EAAMI,cAAgBJ,EAAMU,WACxEiB,IAGF,MAAMiR,EAAa,CAAChR,EAAWzD,EAAS6B,EAAM7B,UAG5C,GAFAyD,IAAK,OAAYA,GAEdzD,EAAQ,CACT,MAAMunC,IAAqB5rC,KAAKmK,cAChC,GAAG,qBAA4CnK,KAAKmK,eAAiB,CACnEpC,OAAQ,KACRkK,YAAa,CAACxC,EAAG,4BACjBo8B,WAAW,IACT,CACF,MAAOt7B,EAAM5G,GAASiiC,EAAwB5E,EAAiBhnC,KAAMA,KAAKkI,QAAQF,KAAzC,GACzC,eAAsC,CAACD,OAAQ/H,KAAKkI,QAAQH,OAAQC,IAAKhI,KAAKkI,QAAQF,KAAMuI,EAAM5G,GAGpGzD,EAAM1B,OAAOmT,OAAM,cAEnBzR,EAAM5B,SAsBV,OAlBA,QAAiBsF,GAAS9B,GAAMgR,EAAWhR,IAAI,CAAC4J,eAAgB1R,KAAK0R,iBAErE1R,KAAKmqC,iBAAiB,SAAS,KAC7BvgC,EAAOwJ,UAAU7Q,OAAO,WACxBipC,EAAa1R,UAAYgO,KAG3B9nC,KAAKmqC,iBAAiB,cAAc,MAC7BjkC,EAAMI,aAAeJ,EAAM7B,QAAW,sBAA6C6B,KACxFslC,EAAa1R,UAAY6R,QAG3B3rC,KAAKmqC,iBAAiB,SAAS,KAC7BvgC,EAAOwJ,UAAU7Q,OAAO,cAG1BvC,KAAKmqC,iBAAiB,OAAQtiC,GAEvBiR,GAGT,GAAa,QAAV,EAAAnX,EAAIqN,cAAM,eAAEnM,OAAQ,CACrB,MAAMipB,EAAsB,GACtB6L,QAAgB,OAAU,CAC9BO,MAAOv2B,EACPuG,QAAS,KACTiD,UAAWvB,EACXiuB,SAAU,GACVC,UAAW,GACX9E,aAAchzB,KAAKgzB,aACnBgF,kBAAkB,EAClBpa,cAAe5d,KAAK4d,gBAEtBhU,EAAO0B,MAAMsX,MAAQhZ,EAAO0B,MAAM0X,OAAS,GACxC2U,EAAQS,OAAOhpB,OAAO0c,EAAKzpB,KAAKs1B,EAAQS,OAAOhpB,OAC/CuoB,EAAQS,OAAOC,MAAMvM,EAAKzpB,KAAKs1B,EAAQS,OAAOC,MAEjDr4B,KAAKoT,UAAUrS,IAAI,oBACnB+qB,EAAKhnB,SAASklB,GAAQA,EAAI5W,UAAUrS,IAAI,iBAG1C,GAAI4mC,EA2HME,IACR7nC,KAAKub,UAAYkrB,GAA2B,GAC5CzmC,KAAKub,UAAUsQ,cAAc,cAA6Bgc,IAC1D7nC,KAAK2lB,QAAQgiB,WAAa,IAC1B3nC,KAAKub,UAAU2P,OAAO6c,GAAa,QA/HrB,CACd,IAAIxsB,EAAkCvb,KAAKub,UAE3C,MAAMuwB,EAA4B,UAAbnqC,EAAIC,KACzBk7B,EAAOgP,GAEP,MAAMloB,EAAKmoB,IACT,GAAG/rC,KAAKkG,MAAMvD,IACZ,OAGF,+BAAsD3C,KAAKkI,QAAQH,OAAQ/H,KAAKkI,QAAQF,IAAKhI,KAAKkI,QAAQsF,OAAOC,cAEjH,MAAMu+B,EAAiB,KAClBD,IACD,iBAAwC/rC,KAAKkG,OAE1C,EAAAzD,YAAczC,KAAKkG,MAAM3B,WAC1BvE,KAAKkG,MAAM3B,UAAW,KAO5B,GAFAynC,KAEIzwB,EACF,GAAG5Z,EAAIyF,kBAAmB,CAGxB,IAAI6kC,EAFJjsC,KAAKoT,UAAUrS,IAAI,mBAGnB,MAAM8G,EAAS,KACb,MAAM0T,EAAYkrB,GAA2B,GACvCx4B,GAAW,SACjBA,EAASi+B,UAAU,CAACC,KAAM,GAAIC,MAAO,MACrCn+B,EAAS0J,OAAM,KACb3X,KAAKkG,MAAM5B,QACX,sBAAwCN,MAE1CiK,EAASo+B,OAAS,KAChBp+B,EAASo+B,OAAS,IAClB,MAAM9mC,EAAM,IAAI+mC,MACf/mC,EAAY3D,KAAO,WACpBqM,EAAS0S,OAAOpb,IAElBgW,EAAU2P,OAAO6c,GAAa,EAAO95B,GAErCg+B,EAAgBjsC,KAAKmqC,iBAAiB,SAAS,KAC7Cl8B,EAASo+B,WACR,CAACr+B,MAAM,IAEVg+B,KAOIO,EAAoBvsC,KAAKmqC,iBAAiB,OAAQtiC,GACxD7H,KAAKoqC,aAAa/7B,MAAK,KACrBrO,KAAK0R,eAAenP,OAAOgqC,GAC3BvsC,KAAK0R,eAAenP,OAAO0pC,UAExB,CACL1wB,EAAYkrB,IAERsF,IACF/rC,KAAKoqC,cAAe,UAGtB,MAAMxnC,EAAO,KACXopC,IAEA,MAAM/1B,EAAW,qBAAoC,CAACxQ,MAAO9D,IAS7D,OAPIoqC,GACF91B,EAAS5H,MAAK,KACZrO,KAAKoqC,aAAal8B,aAItBqN,EAAU2P,OAAO6c,GAAa,EAAO9xB,GAC9B,CAACA,SAAAA,IAGVsF,EAAUixB,oBAAoB5pC,GAC9BA,IAID5C,KAAKoT,UAAUqB,SAAS,mBACzB7K,EAAO6B,OAAOs8B,GAEd/nC,KAAKyL,OAAOs8B,GAGd/nC,KAAKoT,UAAUrS,IAAI,eAEnBf,KAAKoqC,aAAa/7B,MAAK,KACrBrO,KAAKoT,UAAU7Q,OAAO,eACtBwlC,EAAY30B,UAAUrS,IAAI,cAC1B2B,YAAW,KACTqlC,EAAYxlC,WACX,KAIA,wBAAiDvC,KAAKkG,QACvDlG,KAAKkG,MAAM1B,OACX,sBAAwCR,SAMhC,QAAV,EAAAhE,KAAKkG,aAAK,eAAEvD,OACXmpC,EACDloB,GAAE,IAEF,QAAiBha,GAAQ,KACvBga,GAAE,KACD,CAAC5V,MAAM,EAAM6G,SAAS,EAAM0M,SAAS,EAAO7P,eAAgB1R,KAAK0R,sBAYxEy4B,uBACF,OAAOnqC,KAAK0R,eAAe3Q,IAAIf,KAAKkG,OAGtCumC,uBACE/pC,YAAW,KACN1C,KAAK0sC,cAIL1sC,KAAK0rC,mBACN1rC,KAAK0rC,mBACL1rC,KAAK0rC,iBAAmB,MAGvB1rC,KAAKoqC,cACNpqC,KAAKoqC,aAAazpB,SAGjB3gB,KAAK0R,iBACN1R,KAAK0R,eAAeC,YACpB3R,KAAK0R,eAAiB,MAGrB1R,KAAKub,YACNvb,KAAKub,UAAY,SAElB,MAIPoxB,eAAeC,OAAO,gBAAiBpF,I,2GCvsBxB,MAAMqF,UAAoE,IAIvF9sC,YAAYotB,GACVpb,MAAM,OAAD,wBACAob,GAAO,CACV2f,SAAU,CAAC7F,EAAQp2B,EAAOJ,KACxB,GAAGzQ,KAAK+H,OAAOg3B,cAAgBluB,EAAO,OAAO6P,QAAQxS,QAAQ,CAACwiB,MAAO,EAAGzC,MAAO,KAE/E,MAAMsC,EAAQ0W,MAAAA,OAAM,EAANA,EAAQ8F,QACtB,OAAO/sC,KAAKgH,SAASgmC,iBAAiBC,cAAcjtC,KAAK+H,OAAQwoB,EAAO9f,GAAWpC,MAAM5B,IACvF,MAAMwhB,EAAQxhB,EAAMygC,OAAO3yB,KAAKwyB,IACvB,CAAC7qC,QAAS,KAAqB6qC,QAAAA,MAGxC,MAAO,CAACrc,MAAOjkB,EAAMikB,MAAOzC,MAAAA,UAKlCjuB,KAAKmtC,aAAc,EACnBntC,KAAK+H,OAASolB,EAAQplB,Q,wUClBX,MAAMqlC,UAA6B,IAGhDrtC,YAAYgI,GACVgK,MAAM,IAAI86B,EAAiB,CAAC9kC,OAAAA,EAAQf,SAAUwW,EAAA,aAAsB,IAmBtE,KAAArL,YAAe9R,IACbL,KAAKoS,UAAU/R,EAAO0sC,QAAS1sC,EAAO6B,SAAU,IAGlD,KAAAoQ,YAAejS,IACbL,KAAKoS,UAAU/R,EAAO0sC,QAAS1sC,EAAO6B,QAAS,IAGjD,KAAA+Q,gBAAkB,IAAW,EAAD,gCAC1ByY,EAAA,iBAAkC,CAChCjmB,YAAazF,KAAKgH,SAASgmC,iBAAiBK,SAASrtC,KAAKK,OAAO0sC,SACjE75B,QAASie,EAAA,0CA5BXnxB,KAAK+H,OAASA,EAEd/H,KAAKiU,iBAAiB,CAAC,CACrBL,KAAM,WACNC,KAAM,+BACNC,QAAS9T,KAAKiT,mBAShBjT,KAAKkU,eAkBM9B,UAAU26B,EAA4B1sC,EAAsBgV,EAAY,EAAGC,EAAgDC,G,6GACtI,GAAGvV,KAAKwV,gBAAiB,OAAOxV,KAAKwV,gBAErC,MAAM0iB,QAAcl4B,KAAKgH,SAASgmC,iBAAiBK,SAASN,GACtD3oB,EAAM,EAAMjO,WAAU,UAAC+hB,EAAOA,EAAM9hB,KAAMpW,KAAK+H,OAAQsN,EAAWhV,GAAQ,EAAOiV,EAAaC,GAGpG,OAFAvV,KAAKK,OAAO0sC,QAAU7U,EAAMvwB,GAErByc,M,8TCzCX,MAAMkpB,EAAkBvlC,IACrB6Q,MAAMC,KAAKzN,SAAS+M,iBAAiB,gCAAkCpQ,EAAS,OAA2BjD,SAASiiC,IAEnHA,EAAKvJ,aAWF,SAAe+P,EACpBltC,EACA0H,EACA2qB,EACAxqB,EACAoN,EACAC,G,yCAEA,IAAI2iB,QAAc1a,EAAA,0CAAkDzV,GACpE,IAAI2qB,MAAiBwF,EACnB,OAGF,MAAMsV,EAAY,IACH50B,MAAMC,KAAKxY,EAAO8X,iBAAiB,QAAQzX,MAAMspB,IAASA,EAAI5W,UAAUqB,SAAS,WAChFpU,EAAS,KAGzB,GAAG0H,EAAOg3B,YAAa,CACrB,MAAM0O,IAAevlC,EACf+J,EAAc,gCACpB,IAAI/J,IACFA,QAAgBsV,EAAA,wCAAgD,CAC9DzV,OAAAA,EACAkK,YAAa,CAACxC,EAAGwC,GACjBse,MAAO,EACPC,MAAO,IACNniB,MAAM5B,GAGAA,EAAM2gB,QAAQ,MAGnBsF,KACF,OAIJ,GAAGxqB,EAAS,CAEWA,EAAQ+D,OAAOisB,MACpBvwB,KAAOuwB,EAAMvwB,KACvB8lC,IACFvlC,EAAUsV,EAAA,wDAAgEzV,EAAQmwB,KAMtF,MAAMsL,EAAKkC,GAA4BA,EAAInrB,KAAK3Z,IAAO,CACrDsB,QAAStB,EAAGsB,QACZ8F,IAAMpH,EAAGoC,KAAgCgF,IACzCD,OAASnH,EAAGoC,KAAgC+E,WAU9C,YAPA,IAAI,KACHqI,iBAAiB,CAChBrI,OAAAA,EACAkK,YAAa,CAACxC,EAAGwC,KAElBG,UAAUlK,EAASslC,SAAaxpC,OAAWA,EAAWsR,EAAckuB,EAAEluB,QAAetR,EAAWuR,EAAciuB,EAAEjuB,QAAevR,IAMpI,GAAGk0B,EAAO,GACJ,EAAAwV,EAAA,GAASxlC,IAAYA,IACvBgwB,QAAc1a,EAAA,qCAA6CtV,IAG7D,MAAMs7B,EAAKkC,GAA4BA,EAAInrB,KAAK3Z,IAAO,CACrDsB,QAAStB,EAAGsB,QACZ6qC,QAASnsC,EAAGoC,SAGd,IAAIoqC,EAAqBrlC,GAAQqK,UAC/B8lB,EAAMvwB,GACN6lC,SACAxpC,EACAsR,EAAckuB,EAAEluB,QAAetR,EAC/BuR,EAAciuB,EAAEjuB,QAAevR,OAxFrCwZ,EAAA,mBAA2B,gBAAiB8vB,GAC5C9vB,EAAA,mBAA2B,mBAAyBzV,GAAW,2CAClDyV,EAAA,4CAAoDzV,KAC7DulC,EAAevlC,QA0FnB,MAAM4lC,EAA6C,IAAIpsC,IACjDqsC,EAAoB,IAAIxsC,IAEf,MAAMysC,UAAsBrqC,YAA3C,c,oBAOU,KAAAsqC,cAAe,EAEvBrB,uB,MAGE,MAAM9oC,EAAMgqC,EAAU1qC,IAAIjD,KAAK+H,QAC5BpE,GAAOA,EAAIN,IAAIrD,QAChB2D,EAAI1C,OAAOjB,MACP2D,EAAIiE,MACN+lC,EAAU1sC,OAAOjB,KAAK+H,SAIR,QAAlB,EAAA/H,KAAK4d,qBAAa,SAAE3c,OAAO,CAACqpB,IAAKtqB,OAG5B+tC,mBACL,IAAI1iB,GAAU,GACd,QAAiBrrB,MAAY8H,GAAM,kCAEjC,IADA,EAAAgS,EAAA,GAAYhS,GACTujB,EAAS,OAEZ,MAAMtjB,EAAS/H,KAAK+H,OACpBsjB,GAAU,QACJkiB,EAAiBvtC,KAAMA,KAAK+H,QAAQ,IAAM/H,KAAK+H,SAAWA,IAChEsjB,GAAU,OAIP2iB,cAAc7gB,GACnB,IAAI,MAAMzJ,KAAKyJ,EAEbntB,KAAK0jB,GAAKyJ,EAAQzJ,GAIfmF,kBAAkBsE,GAQvB,MAAM8gB,EAAYjuC,KAAK+H,OACvB/H,KAAKguC,cAAc7gB,GACnB,MAAM+gB,EAAYluC,KAAK+H,OAEvB,GAAGkmC,IAAcC,EAAjB,CAOA,GAHAluC,KAAK+H,OAAkFmmC,EACvFluC,KAAK2lB,QAAQ5d,OAAS,GAAKmmC,EAExBD,EAAW,CACZ,MAAMtqC,EAAMgqC,EAAU1qC,IAAIgrC,GACvBtqC,IACDA,EAAI1C,OAAOjB,MACP2D,EAAIiE,MACN+lC,EAAU1sC,OAAOgtC,IAKvB,OAAOjuC,KAAKw9B,UAGN5Z,EAAEuqB,GAAY,GACpB,MAAM7/B,GAAU,EAAA8/B,EAAA,GAASpuC,KAAMA,KAAK+H,OAAQ/H,KAAKimC,SAAUjmC,KAAK8oB,UAAWqlB,EAAWnuC,KAAKquC,OAW3F,OARGruC,KAAKgzB,eACNhzB,KAAKgzB,aAAa3wB,KAAKiM,GAEvBA,EAAQuJ,SAAQ,KACd7X,KAAKgzB,kBAAehvB,MAIjBsK,EAGFkvB,SACL,GAAGx9B,KAAK4d,cAAe,CACrB,IAAIgwB,EAAKvqC,IAAIrD,KAAK+H,QAAS,CACzB,GAAG/H,KAAK8tC,aAAc,OACtB9tC,KAAK8tC,cAAe,EAEpB,IAAInqC,EAAMgqC,EAAU1qC,IAAIjD,KAAK+H,QAgB7B,OAfIpE,IACFA,EAAM,IAAIvC,IACVusC,EAAUhqC,IAAI3D,KAAK+H,OAAQpE,IAG7BA,EAAI5C,IAAIf,MAERA,KAAK4d,cAAcvb,KAAK,CACtBioB,IAAKtqB,KACL4C,KAAM,KACJgrC,EAAK7sC,IAAIf,KAAK+H,QACP/H,KAAKw9B,YAITx9B,KAAK4jB,GAAE,GACN5jB,KAAK8tC,cACb9tC,KAAK4d,cAAc3c,OAAO,CAACqpB,IAAKtqB,OAIpC4tC,EAAK7sC,IAAIf,KAAK+H,QAEd,MAAMuG,EAAUtO,KAAK4jB,IAElB5jB,KAAK8tC,cACNx/B,EAAQuJ,SAAQ,KACd7X,KAAK8tC,cAAe,KAIxB,MAAMnqC,EAAMgqC,EAAU1qC,IAAIjD,KAAK+H,QAC/B,GAAGpE,EAAK,CACNA,EAAI1C,OAAOjB,MACX,MAAM0lC,EAAM9sB,MAAMC,KAAKlV,GACvBgqC,EAAU1sC,OAAOjB,KAAK+H,QAGtB,IAAI,IAAI2b,EAAI,EAAG7gB,EAAS6iC,EAAI7iC,OAAQ6gB,EAAI7gB,IAAU6gB,EAChDgiB,EAAIhiB,GAAG8Z,SAIX,OAAOlvB,GAIXq+B,eAAeC,OAAO,iBAAkBiB,I,8EC7PzB,MAAMS,EAKnBvuC,YAAYgwB,GACV/vB,KAAKmL,UAAYC,SAASC,cAAc,OACxCrL,KAAKmL,UAAUiI,UAAUrS,IAAI,eAE7Bf,KAAKsD,OAAS8H,SAASC,cAAc,UACrCrL,KAAKsD,OAAO8P,UAAUrS,IAAI,sBAE1Bf,KAAK4T,KAAOxI,SAASC,cAAc,QACnCrL,KAAK4T,KAAKR,UAAUrS,IAAI,QAAS,mBAEjCf,KAAKmL,UAAUM,OAAOzL,KAAKsD,OAAQtD,KAAK4T,OAExC,QAAiB5T,KAAKmL,WAAW,KAC/B,gBAAyB,KAAayf,KAAK5qB,KAAKsD,OAAQysB,MAIrDjP,QACO9gB,KAAKsD,OAAO0hB,WAAW,MAC/BupB,UAAU,EAAG,EAAGvuC,KAAKsD,OAAOsf,MAAO5iB,KAAKsD,OAAO0f,W,qECjBvD,MA2BA,EA3Be,CAACpI,EAAmBuS,EAAyB,MAC1D,MAAMnX,EAA4B5K,SAASC,cAAc8hB,EAAQqhB,MAAQ,MAAQ,UAuBjF,OAtBAx4B,EAAO4E,UAAYA,GAAauS,EAAQvZ,KAAO,UAAYuZ,EAAQvZ,KAAO,IAEtEuZ,EAAQ5O,WACP4O,EAAQshB,cACTz4B,EAAO5C,UAAUrS,IAAI,cAGvB,OAAOiV,IAGNmX,EAAQlP,YACTjI,EAAO5C,UAAUrS,IAAI,kBAGpBosB,EAAQuhB,UACT14B,EAAOtI,aAAa,WAAY,QAG/Byf,EAAQtZ,MACTmC,EAAOvK,QAAO,QAAK0hB,EAAQtZ,OAGtBmC,I,2DCnCT,MAKA,EALqB,CAACmX,EAAwG,MAC7G,OAAO,mCAAqCA,EAAQvS,UAAY,IAAMuS,EAAQvS,UAAY,IAAKuS,I,2DCDhH,MASA,EATmB,CAACvS,EAAoBuS,EAAuE,MAC9F,OAAO,WAAY,OAAF,QAC9BvZ,KAAMgH,QAAa5W,GAChBmpB,K,mGCkBP,MAAMwhB,EAAkBxhB,IACtB,GAAGA,EAAQjrB,QAAS,OAAOirB,EAAQjrB,QAEnC,MAAM,KAAC0R,EAAI,KAAEC,EAAI,QAAEC,EAAO,cAAEiyB,EAAa,wBAAE6I,GAA2BzhB,EAChEvsB,EAAKwK,SAASC,cAAc,OAClCzK,EAAGga,UAAY,6BAA+BhH,EAAO,UAAYA,EAAO,IAGxE,IAAIi7B,EAAc1hB,EAAQ0hB,YACtBA,IACFA,EAAc1hB,EAAQ0hB,YAAch7B,GAAO,QAAKA,EAAMsZ,EAAQ2hB,UAAY1jC,SAASC,cAAc,QAC9F8hB,EAAQ1S,cAAao0B,EAAY9vB,UAAYoO,EAAQ1S,cAG1Do0B,EAAYz7B,UAAUrS,IAAI,sBAC1BH,EAAG6K,OAAOojC,GAEV,MAAME,IAAahJ,KAAmB5Y,EAAQ4hB,SA8B9C,OA3BAj7B,IAAW,QAAiBlT,GAAsDkH,KAChF,OAAYA,GAEZ,MAAMknC,GAAO,OAAgBlnC,EAAEzH,OAAQ,YACpC2uC,IAASA,EAAK57B,UAAUqB,SAAS,YAMtB,IAFCX,EAAQhM,KAMnBinC,GACF,YAGChJ,IAAkB6I,IACnB7I,EAAcxB,QAAuC,UAA7BwB,EAAc1V,MAAMzuB,OAA2BmkC,EAAcxB,YAEtEpX,EAAQA,SAExB4Y,GACDnlC,EAAG6K,OAAOs6B,EAAcC,OAGnB7Y,EAAQjrB,QAAUtB,GAwB3B,EArBmB,CAAC8S,EAAkChC,KACpD,MAAM9Q,EAAKwK,SAASC,cAAc,OAClCzK,EAAGwS,UAAUrS,IAAI,YAEd2Q,GACDgC,EAAQ5O,SAASmqC,IACZA,EAAE9hB,QACH8hB,EAAE9hB,QAAQzb,eAAiBA,EAE3Bu9B,EAAE9hB,QAAU,CAACzb,eAAAA,MAKnB,MAAMuc,EAAQva,EAAQ6G,IAAIo0B,GAI1B,OAFA/tC,EAAG6K,UAAUwiB,GAENrtB,I,2GCpFT,MAyBMsuC,EAA0B,CAACtuC,EAAiBuuC,EAA4ChiB,EAA8BiiB,OAC9GjiB,MAAAA,OAAO,EAAPA,EAASzb,gBAAiByb,EAAQzb,eAAe3Q,IAAIH,GAAMA,EAAG+M,iBAAiBqM,KAAKpZ,IAG5F,MAAmBkH,IAErB,IAAIlH,EAAGwS,UAAUqB,SAAS,mBAAoB,OAAO,EAGrD,MAAM46B,EAAazuC,EAAG4W,cAAc,aAGpC,IAFA,OAAY1P,GAETlH,EAAGwS,UAAUqB,SAAS,aACvB,gBACK,CACL,MAAM6zB,EAAS6G,GAAUA,EAAOrnC,GAC1B8iB,EAAO,KACX,gBAAkCykB,EAAYD,IAG7C9G,aAAkB5nB,QACnB4nB,EAAOj6B,KAAKuc,GAEZA,SAOR,EAvDyB,CACvBuC,EAMK,GACLmiB,EACA57B,EACAy7B,EACAC,K,MAEAjiB,EAAQqhB,OAAQ,EAChB,MAAMx4B,EAA0B,QAAjB,EAAAmX,EAAQhiB,iBAAS,SAAI,OAAW,OAAQgiB,GACvDnX,EAAO5C,UAAUrS,IAAI,mBAErB,MAAM2Z,GAAU,OAAWhH,EAASyZ,EAAQzb,gBAI5C,OAHAgJ,EAAQtH,UAAUrS,IAAIuuC,GACtBJ,EAAwBl5B,EAAQm5B,EAAQhiB,EAASiiB,GACjDp5B,EAAOvK,OAAOiP,GACP1E,I,qECrBM,MAAMu5B,EA8CnBxvC,cA7CiB,KAAAyvC,OAJL,GAKK,KAAAC,QALL,GAQK,KAAAC,OAAS,GACT,KAAAC,aAAe,GAGf,KAAAC,OAAS,CACxB,EAAG,IAAM,GAAM,IAAM,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GACvE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,GAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,GAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAGzD,KAAAC,WAAa,CAC5B,CAACrpB,EAAG,GAAMC,EAAG,IACb,CAACD,EAAG,GAAMC,EAAG,IACb,CAACD,EAAG,IAAMC,EAAG,KACb,CAACD,EAAG,IAAMC,EAAG,IACb,CAACD,EAAG,GAAMC,EAAG,IACb,CAACD,EAAG,GAAMC,EAAG,IACb,CAACD,EAAG,IAAMC,EAAG,KACb,CAACD,EAAG,IAAMC,EAAG,KAEE,KAAAqpB,QAAU9vC,KAAK6vC,WAAWhtC,OAiGnC,KAAAwa,QAAWvV,IACd9H,KAAK+vC,2BAIR/vC,KAAKgwC,cAAgBloC,EAAEyV,YACCvZ,IAArBhE,KAAKiwC,cACNjwC,KAAKiwC,YAAc1J,sBAAsBvmC,KAAKkwC,gBAU1C,KAAAA,YAAc,KACpB,MAAMzjC,EAAQzM,KAAKgwC,aAAehwC,KAAK2vC,aACvC3vC,KAAKgwC,cAAgBhwC,KAAK2vC,aAC1B,MAAMpoB,EAAO9a,EAAQ,EAAIlG,KAAK4pC,MAAM1jC,GAASlG,KAAK6pC,KAAK3jC,GACpD8a,GACDvnB,KAAKqwC,kBAAkB9oB,GAEzBvnB,KAAKiwC,iBAAcjsC,GAGb,KAAAssC,yBAA4BC,I,MAClC,IAAIpE,EAAexkC,EACnB,GAAG4oC,EAAa,CACd,MAAM9jC,EAAQ8jC,IACdpE,EAAO1/B,GAAS,EAChB,MAAM+jC,GAA0C,GCpKrB3pB,EDoKcpa,ICnK5Boa,EAAI,GDoKX4pB,EAAyC,QAAtB,EAAAzwC,KAAK0wC,yBAAiB,QAAI,EAE7CnpB,GADOvnB,KAAK0wC,kBAAoB1wC,KAAK2wC,mBAAqBH,GAC5CC,EACjBlpB,IACDvnB,KAAK4wC,mBAAqBrpB,EAC1BvnB,KAAKqwC,kBAAkB9oB,QAEpB,CACL,MAAMspB,EAAS7wC,KAAK8wC,QACpBnpC,EAAKkpC,EAAOlgB,QACZwb,GAAQ0E,EAAOhuC,OC/Kd,IAA0BgkB,ED6L7B,OAXGlf,GACD3H,KAAK+wC,cAAcppC,GAGlBwkC,IACDnsC,KAAK4wC,uBAAoB5sC,EACzBhE,KAAK2wC,wBAAqB3sC,EAC1BhE,KAAK0wC,uBAAoB1sC,EACzBhE,KAAK+vC,8BAA2B/rC,IAG1BmoC,GArIR,MAAM5kB,EAAOvnB,KAAK0vC,OAAS1vC,KAAK4vC,OAAO5vC,KAAK4vC,OAAO/sC,OAAS,GAE5D,IAAI,IAAI6gB,EAAI,EAAG7gB,EAAS7C,KAAK4vC,OAAO/sC,OAAQ6gB,EAAI7gB,IAAU6gB,EACxD1jB,KAAK4vC,OAAOlsB,GAAK1jB,KAAK4vC,OAAOlsB,GAAK6D,EAGpCvnB,KAAKgxC,kBAAoBhxC,KAAK4vC,OAAOr1B,KAAI,CAACsM,EAAGnD,EAAGgiB,K,MAC9C,OAAO7e,GAAe,QAAV,EAAA6e,EAAIhiB,EAAI,UAAE,QAAI,MAItButB,SAASC,GACf,MAAM5I,GAAS,QAAS4I,GACxB,MAAO,CAACttB,EAAG0kB,EAAO,GAAI6I,EAAG7I,EAAO,GAAI2G,EAAG3G,EAAO,IAGxC8I,aAAazgB,GACnB,MAAM0gB,EAAYrxC,KAAK6vC,WAAWnZ,QAClC2a,EAAUhvC,QAAQgvC,EAAUzjB,OAAO,EAAG+C,IAEtC,MAAM2X,EAA2B,GACjC,IAAI,IAAI5kB,EAAI,EAAGA,EAAI2tB,EAAUxuC,OAAQ6gB,GAAK,EACxC4kB,EAAOjmC,KAAKgvC,EAAU3tB,IAExB,OAAO4kB,EAGDgJ,iBAAiBC,EAAeC,EAAkBC,GACxD,MAAMC,EAAM1xC,KAAKoxC,aAAaG,GAC9B,IAAIE,EAAM,IAAuB,IAAjBA,EAAM5uC,OACpB,MAAO,CAAC6uC,GAGV,MACMC,EADU3xC,KAAKoxC,eAAeG,EAAQvxC,KAAK8vC,SACvBv1B,KAAI,CAACq3B,EAAS9oC,KAC/B,CACL0d,GAAIorB,EAAQprB,EAAIkrB,EAAI5oC,GAAK0d,GAAKgrB,EAC9B/qB,GAAImrB,EAAQnrB,EAAIirB,EAAI5oC,GAAK2d,GAAK+qB,MAalC,OATkBC,EAAMl3B,KAAK9N,GACpBklC,EAAUp3B,KAAI,CAACs3B,EAAU/oC,KACvB,CACL0d,EAAGkrB,EAAI5oC,GAAK0d,EAAIqrB,EAASrrB,EAAI/Z,EAC7Bga,EAAGirB,EAAI5oC,GAAK2d,EAAIorB,EAASprB,EAAIha,QAQ7BqlC,YAAYP,EAAeQ,GAEjC,OADkB/xC,KAAKsxC,iBAAiBC,EAAOvxC,KAAK0vC,OAAQ,CAACqC,IAC5C,GAGXC,WAAWzqB,GAGjB,IAFAvnB,KAAKiyC,OAAS1qB,EAERvnB,KAAKiyC,OAASjyC,KAAK0vC,QACvB1vC,KAAKiyC,OAASjyC,KAAK0vC,SACd1vC,KAAKkyC,QAAUlyC,KAAK8vC,UACvB9vC,KAAKkyC,QAAUlyC,KAAK8vC,SAIxB,KAAM9vC,KAAKiyC,MAAQ,GACjBjyC,KAAKiyC,OAASjyC,KAAK0vC,SACd1vC,KAAKkyC,OAAS,IACjBlyC,KAAKkyC,QAAUlyC,KAAK8vC,SAgBlBO,kBAAkB9oB,GACxBvnB,KAAKgyC,WAAWzqB,GAChB,MAAM4qB,EAASnyC,KAAK8xC,YAAY9xC,KAAKkyC,OAAQlyC,KAAKiyC,OAClDjyC,KAAKoyC,aAAaD,GA8CZE,qBAAqBhB,GAC3B,MAAM1pC,EAAK3H,KAAKsyC,MAAMC,gBAAgBvyC,KAAKwvC,OAAQxvC,KAAKyvC,SAClD+C,EAAS7qC,EAAG8qC,KAElB,IAAIvZ,EAAS,EACb,IAAI,IAAIzS,EAAI,EAAGA,EAAIzmB,KAAKyvC,UAAWhpB,EAAG,CACpC,MACMisB,EADejsB,EAAIzmB,KAAKyvC,QACS,GACjCkD,EAAmBD,EAAkBA,EAE3C,IAAI,IAAIlsB,EAAI,EAAGA,EAAIxmB,KAAKwvC,SAAUhpB,EAAG,CACnC,MAEMosB,EAFepsB,EAAIxmB,KAAKwvC,OAES,GAGjCqD,EAAc,IAFGtsC,KAAKusC,KAAKF,EAAkBA,EAAkBD,GAG/DI,EAAQF,EAAcA,EAAc,GAAM,EAC1CG,EAAWzsC,KAAK0sC,IAAIF,GACpBG,EAAW3sC,KAAK4sC,IAAIJ,GAEpBK,EAAS7sC,KAAKC,IAAI,EAAKD,KAAKI,IAAI,EAAK,GAAMisC,EAAkBM,EAAWR,EAAkBM,IAC1FK,EAAS9sC,KAAKC,IAAI,EAAKD,KAAKI,IAAI,EAAK,GAAMisC,EAAkBI,EAAWN,EAAkBQ,IAEhG,IAAII,EAAc,EAEd1vB,EAAI,EACJutB,EAAI,EACJlC,EAAI,EAER,IAAI,IAAIvrB,EAAI,EAAGA,EAAI1jB,KAAKuzC,QAAQ1wC,OAAQ6gB,IAAK,CAC3C,MAGM8vB,EAAYJ,EAHH/B,EAAU3tB,GAAG8C,EAItBitB,EAAYJ,EAHHhC,EAAU3tB,GAAG+C,EAK5B,IAAIorB,EAAWtrC,KAAKC,IAAI,EAAK,GAAMD,KAAKusC,KAAKU,EAAYA,EAAYC,EAAYA,IACjF5B,GAAWA,EAAWA,EAAWA,EACjCyB,GAAezB,EAEfjuB,GAAKiuB,EAAW7xC,KAAKuzC,QAAQ7vB,GAAGE,EAAI,IACpCutB,GAAKU,EAAW7xC,KAAKuzC,QAAQ7vB,GAAGytB,EAAI,IACpClC,GAAK4C,EAAW7xC,KAAKuzC,QAAQ7vB,GAAGurB,EAAI,IAGtCuD,EAAOtZ,KAAYtV,EAAI0vB,EAAc,IACrCd,EAAOtZ,KAAYiY,EAAImC,EAAc,IACrCd,EAAOtZ,KAAY+V,EAAIqE,EAAc,IACrCd,EAAOtZ,KAAY,KAGvB,OAAOvxB,EAGDopC,cAAcppC,GACpB3H,KAAKsyC,MAAMoB,aAAa/rC,EAAI,EAAG,GAC/B3H,KAAK2zC,KAAKruB,UAAUtlB,KAAK4zC,IAAK,EAAG,EAAG5zC,KAAKwvC,OAAQxvC,KAAKyvC,SAGhD2C,aAAaf,GACnBrxC,KAAK+wC,cAAc/wC,KAAKqyC,qBAAqBhB,IAyBxCxf,KAAKjxB,GACVZ,KAAK8wC,QAAU,GACf9wC,KAAKkyC,OAAS,EACdlyC,KAAKiyC,MAAQ,EACbjyC,KAAKgwC,aAAe,OACIhsC,IAArBhE,KAAKiwC,cACN4D,qBAAqB7zC,KAAKiwC,aAC1BjwC,KAAKiwC,iBAAcjsC,GAGrB,MAAM8vC,EAASlzC,EAAG+T,aAAa,eAAe8O,MAAM,KAAK1S,UACzD/Q,KAAKuzC,QAAUO,EAAOv5B,KAAKw5B,GAClB/zC,KAAKixC,SAAS8C,KAGnB/zC,KAAK4zC,MACP5zC,KAAK4zC,IAAMxoC,SAASC,cAAc,UAClCrL,KAAK4zC,IAAIhxB,MAAQ5iB,KAAKwvC,OACtBxvC,KAAK4zC,IAAI5wB,OAAShjB,KAAKyvC,QACvBzvC,KAAKsyC,MAAQtyC,KAAK4zC,IAAI5uB,WAAW,KAAM,CAACgvB,OAAO,KAGjDh0C,KAAKi0C,QAAUrzC,EACfZ,KAAK2zC,KAAO3zC,KAAKi0C,QAAQjvB,WAAW,KAAM,CAACgvB,OAAO,IAClDh0C,KAAKw9B,SAGAA,SACL,GAAGx9B,KAAKuzC,QAAQ1wC,OAAS,EAAG,CAC1B,MAAMkxC,EAAQ/zC,KAAKuzC,QAAQ,GAG3B,OAFAvzC,KAAK2zC,KAAKO,UAAY,OAAOH,EAAMnwB,MAAMmwB,EAAM5C,MAAM4C,EAAM9E,UAC3DjvC,KAAK2zC,KAAKQ,SAAS,EAAG,EAAGn0C,KAAKwvC,OAAQxvC,KAAKyvC,SAI7C,MAAMiC,EAAM1xC,KAAK8xC,YAAY9xC,KAAKkyC,OAAQlyC,KAAKiyC,OAC/CjyC,KAAKoyC,aAAaV,GAGb0C,eAAe7D,G,QACpB,GAAGvwC,KAAKuzC,QAAQ1wC,OAAS,EACvB,OAGF,GAAG0tC,EAMD,OALAvwC,KAAK4wC,kBAAoB5wC,KAAK0vC,QAAgC,QAAtB,EAAA1vC,KAAK4wC,yBAAiB,QAAI,GAClE5wC,KAAK2wC,mBAAqB3wC,KAAK4wC,kBAC/B5wC,KAAK0wC,uBAAoB1sC,EACzBhE,KAAK+vC,0BAA2B,OAChC,QAAc/vC,KAAKswC,yBAAyBt2B,KAAKha,KAAMuwC,GAAcvwC,MAIvE,MAAM+xC,EAAO/xC,KAAKiyC,MACZoC,EAAQr0C,KAAK0vC,OAEnB,IAAI4E,EAEJ,MAAM7C,EAAkB,GACxB,IAAI,IAAI/tB,EAAI,EAAG7gB,EAAS7C,KAAKgxC,kBAAkBnuC,OAAQ6gB,EAAI7gB,IAAU6gB,EAAG,CACtE,MAAM6wB,EAAMv0C,KAAKgxC,kBAAkBttB,GACnC,IAAIjX,GAAqB,QAAZ,EAAAglC,EAAM/tB,EAAI,UAAE,QAAIquB,GAAQwC,GAEjC9nC,EAAM+nC,QAAQ,GAAKH,QAA4BrwC,IAAnBswC,IAC9BA,EAAiB5wB,EACjBjX,GAAS4nC,GAGX5C,EAAMpvC,KAAKoK,GAMb,CAH0BglC,EAAM/a,MAAM,EAAG4d,QACCtwC,IAAnBswC,EAA+B7C,EAAM/a,MAAM4d,GAAkB,IAEhDxvC,SAAQ,CAAC2sC,EAAO3oC,EAAK2rC,KACvD,MAAMC,EAAOjD,EAAMA,EAAM5uC,OAAS,GAOlC,QANYmB,IAAT0wC,GAAsBA,EAAOL,IAC9B5C,EAAMA,EAAM5uC,OAAS,IAAM6xC,EAAKF,QAAQ,IAG1Cx0C,KAAKiyC,MAAQyC,MAAAA,EAAAA,EAAQ,GAEjBjD,EAAM5uC,OACR,OAGF,MAAMwuC,EAAYrxC,KAAKsxC,iBAAiBtxC,KAAKkyC,OAAQmC,EAAO5C,GACzD3oC,IAAS2rC,EAAO5xC,OAAS,KACrB7C,KAAKkyC,QAAUlyC,KAAK8vC,UACvB9vC,KAAKkyC,QAAUlyC,KAAK8vC,SAIxB,MAAMlQ,EAAMyR,EAAU92B,KAAKm3B,GAClB1xC,KAAKqyC,qBAAqBX,KAGnC1xC,KAAK8wC,QAAQzuC,QAAQu9B,MAGvB5/B,KAAK+vC,0BAA2B,GAChC,QAAc/vC,KAAKswC,yBAA0BtwC,MAKxC20C,cAAcvtB,IAgBdnM,UACLjb,KAAK20C,eAAc,GAIdt+B,oBAAoBy9B,GACzB,MAAMxwC,EAAS8H,SAASC,cAAc,UAOtC,OANA/H,EAAOsf,MAjZG,GAkZVtf,EAAO0f,OAlZG,QAmZIhf,IAAX8vC,IACDxwC,EAAOqiB,QAAQmuB,OAASA,GAGnBxwC,EAGF+S,cAAcy9B,GACnB,MAAMxwC,EAAStD,KAAK40C,aAAad,GAC3Be,EAAmB,IAAItF,EAG7B,OAFAsF,EAAiBhjB,KAAKvuB,GAEf,CAACuxC,iBAAAA,EAAkBvxC,OAAAA,M,wlBEjY9B,MAAMwxC,EAAoBv6B,GACjB,IAAIA,EAAI+rB,UAAUyO,QAAO,CAACC,EAAKnuB,IAAMmuB,EAAMnuB,EAAEjf,MAAM,GAK5D,MAAMqtC,UAAqB,IA+BzBl1C,YAAYotB,GAWVpb,OAAM,GAvCD,KAAAmjC,aAAyC,IAAI3zC,IAC7C,KAAA8vB,aAAc,EAyFb,KAAA8jB,YAAertC,IAErB,MAAM5F,GAAU,EAAA4a,EAAA,GAAgBhV,EAAEzH,OAAQL,KAAKo1C,uBAC/C,GAAgB,IAAbttC,EAAEkO,OACH,OAGF,GAAGhW,KAAKq1C,eAAiBr1C,KAAKq1C,aAAavtC,EAAG5F,GAC5C,OAGF,MAAM0rC,EAAqC,IAAIrsC,IAC/C,IAAI+zC,EAaAC,EAAcrzC,EAElB,MAAMszC,EAAiB,CAACtzC,EAAsBuzC,GAAe,KAC3D,MAAMztC,GAAO9F,EAAQyjB,QAAQ3d,IAC7B,IAAIA,IAAQ9F,EAAQyjB,QAAQ5d,OAAQ,OACpC,MAAMA,EAAS7F,EAAQyjB,QAAQ5d,OAAOkqB,YAElC,EAAAyjB,EAAA,GAAQH,KACVA,EAAcrzC,GAGhB,IAAIyzC,EAAU/H,EAAK3qC,IAAI8E,GAKvB,GAJI4tC,GACF/H,EAAKjqC,IAAIoE,EAAQ4tC,EAAU,IAAIv0C,KAG9Bu0C,EAAQtyC,IAAI2E,GACb,OAGF,MAAMkqB,EAAalyB,KAAKmyB,cAAcpqB,EAAQC,GAQ9C,QAPiBhE,IAAdsxC,IAEDA,GAAapjB,GAGfyjB,EAAQ50C,IAAIiH,GAERstC,IAAcpjB,IAAiBojB,GAAapjB,EAAa,CAC3D,MAAM0jB,EAAad,EAAiBlH,GACpC,GAAG5tC,KAAKwxB,iBAAmBikB,EAAc,CACpCG,EAAa,IACX,EAAAC,EAAA,GAAc3zC,EAASqzC,KACxBA,EAAcrzC,GAIlB,MAAM4zC,EAAkB91C,KAAK+1C,mBAAmBR,EAAarzC,GAE1D4zC,EAAgBjzC,QACjBizC,EAAgBhxC,SAAS5C,IACvBszC,EAAetzC,GAAS,MAK9B,GAAIlC,KAAKk1C,aAAattC,KAQZ5H,KAAKwxB,iBACbxxB,KAAKwxB,gBAAgBtvB,QARrB,GAAkB,IAAf0zC,GAAoB51C,KAAKg2C,YAC1B,IAAI,MAAOjuC,EAAQ8+B,KAAS+G,EAC1B,IAAI,MAAM5lC,KAAO6+B,EACf7mC,KAAKg2C,YAAYjuC,EAAQC,KAWrC,IAAIiuC,GAAoB,EACxB,MAAMC,EAAepuC,IACfmuC,KACF,EAAAvkB,EAAA,KACAukB,GAAoB,GAYtB,MAAM/zC,EAAUlC,KAAKm2C,qBAAqBruC,EAAEzH,QAC5C,GAAI6B,EAKJ,OAAGlC,KAAKo2C,wBAA0Bp2C,KAAKo2C,sBAAsBtuC,EAAG5F,EAASozC,IACvEt1C,KAAK0R,eAAe2kC,aAAar2C,KAAKs2C,cAAe,YAAaJ,QAClEl2C,KAAK0R,eAAe2kC,aAAajrC,SAAU,UAAWyT,EAAW03B,SAInEf,EAAetzC,IAGX2c,EAAa/W,IACd8lC,EAAKhmC,OACN,QAAiB2L,OAAQuG,EAAA,EAAa,CAACjF,SAAS,EAAM7G,MAAM,EAAMuT,SAAS,IAG7EvhB,KAAK0R,eAAe2kC,aAAar2C,KAAKs2C,cAAe,YAAaJ,IAIlE,EAAAxkB,EAAA,MAGI6kB,EAA0B,CAACvoC,MAAM,GACvChO,KAAK0R,eAAe3Q,IAAIf,KAAKs2C,cAA7Bt2C,CAA4C,YAAak2C,GACzDl2C,KAAK0R,eAAe3Q,IAAIqK,SAAxBpL,CAAkC,UAAW6e,EAAW03B,IAGlD,KAAAR,mBAAqB,CAACS,EAAoB9B,KAChD,GAAG8B,IAAU9B,EACX,MAAO,GAGT,MAAM+B,EAAYD,EAAM10B,wBAClB40B,EAAWhC,EAAK5yB,wBAEhB60B,GADcF,EAAU/zB,IAAMg0B,EAASh0B,KAAS+zB,EAAUx0B,KAAOy0B,EAASz0B,MAClD,EAExBkZ,GAAS,EAAAre,EAAA,GAAgB05B,EAAOx2C,KAAK42C,8BAC3C,IAAIzb,EACF,MAAO,GAGT,MAAMrW,EAAWlM,MAAMC,KAAKsiB,EAAOhjB,iBAAiBnY,KAAK62C,6BACzD,IAAIC,EAAahyB,EAASjL,QAAQ28B,GAC9BO,EAAYjyB,EAASjL,QAAQ66B,GAUjC,OARIiC,KACDI,EAAWD,GAAc,CAACA,EAAYC,IAG3BjyB,EAAS4R,MAAMogB,EAAa,EAAGC,IAkIxC,KAAArlB,gBAAwBslB,GAA2B,EAAD,gCACpDA,IAAch3C,KAAKg3C,cAAe,GACrCh3C,KAAKi3C,0BAA2Bj3C,KAAKi3C,qBACrCj3C,KAAKk1C,aAAap0B,QAClB9gB,KAAKk3C,mBACL,EAAAxlB,EAAA,KACGslB,IAAch3C,KAAKg3C,kBAAehzC,OAtVrC,EAAA4vB,EAAA,GAAW5zB,KAAMmtB,GAEjBntB,KAAKm3C,eAAiB,gBAAiB,EAAAC,EAAA,KAGlCC,gBAAgBf,EAA4B5kC,GAQjD,GAPG1R,KAAKs2C,eACNt2C,KAAK0R,eAAeC,YAGtB3R,KAAKs2C,cAAgBA,EACrBt2C,KAAK0R,eAAiBA,EAElB4kC,EAIJ,OAAG,KACD5kC,EAAe3Q,IAAIu1C,EAAnB5kC,CAAkC,YAAY,KACxC1R,KAAKqxB,cACTrxB,KAAKs3C,aCvGR/jC,OAAOgkC,aACDhkC,OAAOgkC,eAAeC,WAErBpsC,SAASgmB,UAEVhmB,SAASgmB,UAAUqmB,cAAc5jC,KAGnC,YDkGH,EAAA+d,EAAA,GAA0B0kB,GAAgBxuC,IACxC,GAAG9H,KAAKqxB,aAAgBrxB,KAAK03C,uBAAyB13C,KAAK03C,uBAAyB,OAGpFtsC,SAASI,KAAK4H,UAAUrS,IAAI,aAC5Bu1C,EAAc3oC,iBAAiB,YAAa7F,KAC1C,EAAAgS,EAAA,GAAYhS,GACZsD,SAASI,KAAK4H,UAAU7Q,OAAO,eAG9B,CAACyL,MAAM,EAAM6G,SAAS,KAEzB,EAAA6c,EAAA,KAEA,MAAMxvB,EAAUlC,KAAKm2C,qBAAqBruC,EAAEzH,QACzC6B,GACDlC,KAAKwxB,gBAAgBtvB,KAEtBwP,SAKLA,EAAe3Q,IAAIu1C,EAAnB5kC,CAAkC,YAAa1R,KAAKm1C,aAuK5CwC,0BAA0Bz1C,GAClC,OAAOlC,KAAKmyB,cAAcjwB,EAAQyjB,QAAQ5d,OAAOkqB,YAAa/vB,EAAQyjB,QAAQ3d,KAGtE4vC,eAAe11C,EAAsB6jC,GAC7C7jC,EAAQwV,QAAQquB,EAAcC,OAGzB/K,sBAAsB/4B,EAAsB6oB,GACjD,MAAM8sB,IAAgB73C,KAAK83C,4BAA4B51C,GACvD,GAAG6oB,EAAM,CACP,GAAG8sB,EACD,OAAO,EAGT,MAAM9R,EAAgB,IAAI,IAAc,CACtCnuB,KAAM1V,EAAQyjB,QAAQ3d,IACtB0B,OAAO,IAIN1J,KAAKqxB,aACHrxB,KAAK23C,0BAA0Bz1C,KAChC6jC,EAAc1V,MAAMkU,SAAU,EAC9BriC,EAAQkR,UAAUrS,IAAI,gBAI1Bf,KAAK43C,eAAe11C,EAAS6jC,QACrB8R,IACR73C,KAAK83C,4BAA4B51C,GAASyW,cAAcpW,UACxD,OAAcL,EAAS,eAAe,EAAO,MAG/C,OAAO,EAGC41C,4BAA4B51C,G,MACpC,MAA8C,WAAd,QAAzB,EAAAA,EAAQkT,yBAAiB,eAAEqH,UAChCva,EAAQkT,kBAAkBA,kBAGd2iC,gBAAgBC,GAAiB,G,+CAC/C,MAAMpwC,EAAO5H,KAAKk1C,aAAattC,KAC/B,IAAIA,IAASowC,EAAgB,OAE7B,IAAIC,GAAerwC,EACjBswC,GAActwC,EAChB,MAAMuwC,GAAYvwC,EAClB,IAAI,MAAOG,EAAQ8+B,KAAS7mC,KAAKk1C,aAAc,CAC7C,MAAMkD,EAAiC,GAAGrwC,KAAU/H,KAAK+J,YAAc,YAAc,YAC/E6Z,QAAU5jB,KAAKgH,SAAS8G,mBAAmBuqC,sBAAsBD,EAAYx/B,MAAMC,KAAKguB,IAI9F,GAHAoR,EAAcr0B,EAAEq0B,YAChBC,EAAat0B,EAAEs0B,WAEZD,GAAeC,EAAY,MAGV,QAAtB,EAAAl4C,KAAKs4C,yBAAiB,mBAAGL,EAAaC,EAAYC,MAG7CjB,gBAAgBqB,GAAmB,EAAMP,GAAiB,G,MAC/D,MAAMQ,EAAex4C,KAAKqxB,YACpBzpB,EAAO5H,KAAKk1C,aAAattC,KAG/B,GAFA5H,KAAKqxB,cAAgBzpB,GAAQowC,EAE1BQ,IAAiBx4C,KAAKqxB,YAAa,OAAO,EAE7CrxB,KAAKmJ,cAAc,SAAUnJ,KAAKqxB,aAY9B,MACFrxB,KAAKs2C,cAAcljC,UAAUxJ,OAAO,YAAa5J,KAAKqxB,aAEnDmnB,IAED,EAAA9mB,EAAA,OAaJ,EAAA+mB,EAAA,KAEA,MAAMC,IAAa9wC,GAAQowC,EACrBW,EAAqC,QAAtB,EAAA34C,KAAK44C,yBAAiB,yBAAGF,GAAW14C,KAAKg3C,cAmB9D,OAjBI,EAAA3tB,mBACCqvB,EACD73B,EAAA,WAAiC,CAC/Bjf,KAAM5B,KAAKm3C,eACX7tB,MAAO,KACLtpB,KAAK0xB,qBAIT7Q,EAAA,eAAqC7gB,KAAKm3C,iBAI3Ca,IACAW,GAAgBj4B,QAAQxS,WAAWG,MAAK,IAAMrO,KAAK+3C,gBAAgBC,MAG/D,EAYF/8B,UACLjb,KAAKg3C,cAAe,EACpBh3C,KAAKk1C,aAAap0B,QAClB9gB,KAAKk3C,iBAAgB,GACrBl3C,KAAKg3C,kBAAehzC,EAGZ60C,uBAAuB32C,EAAsBgwB,GACrDlyB,KAAKi7B,sBAAsB/4B,GAAS,GACtBlC,KAAK83C,4BAA4B51C,GACzCqiC,QAAUrS,EAEhBlyB,KAAKk3C,kBACLl3C,KAAK+3C,mBACL,OAAc71C,EAAS,cAAegwB,EAAY,KAG7CC,cAAcpqB,EAAgBC,GACnC,MAAMrE,EAAM3D,KAAKk1C,aAAajyC,IAAI8E,GAClC,OAAOpE,MAAAA,OAAG,EAAHA,EAAKN,IAAI2E,GAGXnF,SACL,OAAOiyC,EAAiB90C,KAAKk1C,cAGrB4D,UAAU/wC,EAAgBC,EAAa+wC,GAC/C,IAAIp1C,EAAM3D,KAAKk1C,aAAajyC,IAAI8E,GAqChC,OApCGgxC,QAA0B/0C,IAAb+0C,IAA0Bp1C,MAAAA,OAAG,EAAHA,EAAKN,IAAI2E,IAC9CrE,IACDA,EAAI1C,OAAO+G,GAEPrE,EAAIiE,MACN5H,KAAKk1C,aAAaj0C,OAAO8G,KAuBzBpE,IACFA,EAAM,IAAIvC,IACVpB,KAAKk1C,aAAavxC,IAAIoE,EAAQpE,IAGhCA,EAAI5C,IAAIiH,KAGH,EAMFgxC,mBAAmBjxC,EAAgB8+B,GACxC,MAAMljC,EAAM3D,KAAKk1C,aAAajyC,IAAI8E,GAC9BpE,IAIJkjC,EAAK/hC,SAASkD,IACZrE,EAAI1C,OAAO+G,MAGTrE,EAAIiE,MACN5H,KAAKk1C,aAAaj0C,OAAO8G,GAG3B/H,KAAK+3C,kBACL/3C,KAAKk3C,oBAIF,MAAM+B,UAAwBhE,EASnCl1C,YAAoBkxB,EAA6BjqB,EAAuB0K,GACtEK,MAAM,CACJ/K,SAAAA,EACAquC,aAAc,CAACvtC,EAAGzH,MAAaA,GAAUL,KAAKqxB,YAC9C8kB,qBAAuB91C,IAAW,EAAAyc,EAAA,GAAgBzc,EAAQ,qBAC1D+0C,sBAAuB,oBACvBwB,6BAA8B,WAC9BC,2BAA4B,uBAPZ,KAAA5lB,YAAAA,EAqCb,KAAAO,gBAAmBtvB,IACxB,MAAM8F,GAAO9F,EAAQyjB,QAAQ3d,IACvBD,EAAS7F,EAAQyjB,QAAQ5d,OAAOkqB,WAElCjyB,KAAK84C,UAAU/wC,EAAQC,IAI3BhI,KAAK64C,uBAAuB32C,EAASlC,KAAKmyB,cAAcpqB,EAAQC,KAG3D,KAAAguC,YAAc,CAACjuC,EAAgBC,KACpC,MAAM9F,EAAUlC,KAAKixB,YAAYiD,SAASe,WAAWzd,cAAc,oCAAoCzP,iBAAsBC,OAC7HhI,KAAKwxB,gBAAgBtvB,IAGb,KAAAo2C,kBAAoB,CAACL,EAAsBC,EAAqBC,KACxE,MAAMt1C,EAAS7C,KAAK6C,UACpB,EAAAkmB,EAAA,GAAe/oB,KAAKk5C,kBAAkB,QAAK,WAAY,CAACr2C,KACxD7C,KAAKm5C,iBAAiB/lC,UAAUxJ,OAAO,OAAmB,IAAX/G,GAC/C7C,KAAKsxB,oBAAoBle,UAAUxJ,OAAO,OAAQquC,GAClDj4C,KAAK2xB,oBAAsB3xB,KAAK2xB,mBAAmBve,UAAUxJ,OAAO,OAAQsuC,IAGpE,KAAAU,kBAAoB,CAACF,EAAmBpjB,KAchD,IAbA,OAAct1B,KAAKixB,YAAY6C,uBAAwB,eAAgB4kB,EAAUpjB,EAAU,IAAM,GAAG,KAC9Ft1B,KAAKqxB,cACPrxB,KAAKo5C,mBAAmB72C,SACxBvC,KAAKo5C,mBACHp5C,KAAKsxB,oBACLtxB,KAAK2xB,mBACL,KACF3xB,KAAKs3C,kBAAetzC,OAIxB,OAAchE,KAAKixB,YAAY9lB,UAAW,eAAgButC,EAAU,KAEjE14C,KAAKqxB,cACFrxB,KAAKo5C,mBAAoB,CAC3B,MAAMC,EAAa,yBACnBr5C,KAAKo5C,mBAAqBhuC,SAASC,cAAc,OACjDrL,KAAKo5C,mBAAmBhmC,UAAUrS,IAAIs4C,EAAa,cAEnD,MAAMC,GAAY,OAAW,SAASD,WAAqB,CAAC96B,UAAU,KACtE,QAAiB+6B,GAAW,IAAMt5C,KAAK0xB,mBAAmB,CAAChgB,eAAgB1R,KAAK0R,eAAgB1D,MAAM,IAEtGhO,KAAKk5C,iBAAmB9tC,SAASC,cAAc,OAC/CrL,KAAKk5C,iBAAiB9lC,UAAUrS,IAAIs4C,EAAa,UAEjDr5C,KAAKm5C,kBAAmB,OAAW,WAAWE,UAE9C,MAAME,EAAyC,CAAC7nC,eAAgB1R,KAAK0R,iBACrE,QAAiB1R,KAAKm5C,kBAAkB,KACtC,MAAMpxC,EAAS,IAAI/H,KAAKk1C,aAAa/wC,QAAQ,GACvC6D,EAAM,IAAIhI,KAAKk1C,aAAajyC,IAAI8E,IAAS,GAC/C/H,KAAK0xB,kBAELP,EAAA,eAA0B,CAACppB,OAAAA,EAAQiL,UAAWhL,MAC7CuxC,GAEHv5C,KAAKsxB,qBAAsB,OAAW,WAAW+nB,cACjD,QAAiBr5C,KAAKsxB,qBAAqB,KACzC,MAAMkoB,EAAwC,GAC9C,IAAI,MAAOC,EAAY5S,KAAS7mC,KAAKk1C,aACnCsE,EAAIC,GAAc7gC,MAAMC,KAAKguB,GAAM6S,MAAK,CAACplC,EAAG26B,IAAM36B,EAAI26B,IAGxD,IAAI,IAAauK,GAAK,KACpBx5C,KAAK0xB,uBAEN6nB,GAEAv5C,KAAK25C,YACN35C,KAAK2xB,oBAAqB,OAAW,iBAAiB0nB,aACtD,QAAiBr5C,KAAK2xB,oBAAoB,KACxC,MAAM5pB,EAAS,IAAI/H,KAAKk1C,aAAa/wC,QAAQ,GAC7C,IAAI,IAAoB4D,EAAQ,IAAI/H,KAAKk1C,aAAajyC,IAAI8E,IAAU,QAAQ,KAC1E/H,KAAK0xB,uBAEN6nB,IAGLv5C,KAAKo5C,mBAAmB3tC,UAAU,CAChC6tC,EACAt5C,KAAKk5C,iBACLl5C,KAAKm5C,iBACLn5C,KAAKsxB,oBACLtxB,KAAK2xB,oBACL2G,OAAOC,UAET,MAAMqhB,EAAoB55C,KAAKo5C,mBAC/BQ,EAAkBtuC,MAAM4Y,QAAU,IAClClkB,KAAKixB,YAAY6C,uBAAuBroB,OAAOmuC,GAE1CA,EAAkB72B,WACvB62B,EAAkBtuC,MAAM4Y,QAAU,KA3HtClkB,KAAK25C,WAAa1oB,EAAYwC,WAC9BzzB,KAAKq3C,gBAAgBpmB,EAAY9lB,UAAWuG,GAavCwlC,gBAAgBqB,GAAmB,EAAMP,GAAiB,GAC/D,MAAM5zB,EAAMrS,MAAMmlC,gBAAgBqB,EAAkBP,GASpD,OAPG5zB,GAAOm0B,GACS3/B,MAAMC,KAAK7Y,KAAKixB,YAAYuD,cAAcrc,iBAAiB,uBACnErT,SAAS5C,IAChBlC,KAAKi7B,sBAAsB/4B,EAASlC,KAAKqxB,gBAItCjN,GAyGI,MAAMy1B,UAAsB5E,EAUzCl1C,YACU+5C,EACAC,EACA1pB,EACRrpB,GAEA+K,MAAM,CACJ/K,SAAAA,EACAmvC,qBAAuB91C,IAAW,EAAAyc,EAAA,GAAgBzc,EAAQ,kBAAmB,EAAAyc,EAAA,GAAgBzc,EAAQ,UACrGg1C,aAAc,CAACvtC,EAAGzH,OAGHL,KAAKk1C,aAAattC,OAC3BE,EAAEzH,OAAuB+S,UAAUqB,SAAS,YAC5C3M,EAAEzH,OAAuB+S,UAAUqB,SAAS,uBAC9CpU,GAIJ+1C,sBAAuB,CAACtuC,EAAG5F,EAASozC,MACtBxtC,EAAEzH,SAAW6B,IACrB4F,EAAEzH,OAAuB+S,UAAUqB,SAAS,4BAChCzQ,IAAdsxC,IACCt1C,KAAKk1C,aAAattC,MAGvB8vC,qBAAsB,KAAO13C,KAAK85C,KAAKzpB,MAAM2pB,UAC7C5E,sBAAuB,SACvBwB,6BAA8B,gBAC9BC,2BAA4B,qDAC5B9sC,YAA2B,cAAd+vC,EAAKl4C,OA7BZ,KAAAk4C,KAAAA,EACA,KAAAC,QAAAA,EACA,KAAA1pB,MAAAA,EAwEH,KAAAmB,gBAAmByoB,IACxB,IAAIj6C,KAAKk6C,gBAAgBD,GAAS,OAElC,MAAMjyC,GAAOiyC,EAAOt0B,QAAQ3d,IAG5B,GADkBiyC,EAAO7mC,UAAUqB,SAAS,cAC5C,CACE,IAAIzU,KAAKm6C,wBAAwBF,GAAS,CACxC,MAAMt2C,EAAM3D,KAAKk1C,aAAajyC,IAAIjD,KAAK85C,KAAK/xC,QACzCpE,GAEY3D,KAAKo6C,0BAA0BH,GACvCn1C,SAASkD,GAAQrE,EAAI1C,OAAO+G,KAIdhI,KAAK+5C,QAAQM,sBAAsBJ,GAAQ1/B,IAAIva,KAAKwxB,sBAK7E,GAAIxxB,KAAK84C,UAAU94C,KAAK85C,KAAK/xC,OAAQC,GAArC,CAKA,GADsBiyC,EAAO7mC,UAAUqB,SAAS,gBAC9B,CAChB,MAAM6lC,GAAiB,EAAAx9B,EAAA,GAAgBm9B,EAAQ,UACzCM,EAAoBv6C,KAAKm6C,wBAAwBG,GACjDE,EAAwBx6C,KAAKw6C,sBAAsBF,IAEtCE,GAAyBD,IAE1Cv6C,KAAK64C,uBAAuByB,EAAgBE,GAIhDx6C,KAAK64C,uBAAuBoB,EAAQj6C,KAAKmyB,cAAcnyB,KAAK85C,KAAK/xC,OAAQC,MAGjE,KAAAguC,YAAc,CAAMjuC,EAAgBC,IAAgB,EAAD,gCAC3D,MAAMyyC,QAAgBz6C,KAAK+5C,QAAQW,iBAAiB1yC,GACjDyyC,GACDz6C,KAAKwxB,gBAAgBipB,EAAQR,WA0DvB,KAAArB,kBAAoB,CAAMF,EAAmBpjB,IAAqB,EAAD,gCACzE,MAAM,eAACqlB,EAAc,UAAEC,EAAS,QAAEC,SAAiB76C,KAAK85C,KAAKzpB,MAAMyqB,OAAOxlB,IAE1E,OAAct1B,KAAKs2C,cAAe,eAAgBoC,EAAUpjB,EAAU,IAAM,GAAG,KACzEt1B,KAAKqxB,cACPrxB,KAAK+6C,sBAAsBx4C,SAC3BvC,KAAK+6C,sBACH/6C,KAAKo5C,mBACLp5C,KAAKg7C,oBACLh7C,KAAKsxB,oBACLtxB,KAAK2xB,mBACL3xB,KAAKi7C,cACLj7C,KAAKk7C,eACL,KACFl7C,KAAKs3C,kBAAetzC,MAUxB,MAAMm3C,EAAoBP,EAAYC,OAAU72C,EAA6B,EAAjB22C,EAC5D,GAAG36C,KAAKqxB,aACN,IAAIrxB,KAAKo5C,mBAAoB,CAC3Bp5C,KAAK+6C,sBAAwB3vC,SAASC,cAAc,OACpDrL,KAAK+6C,sBAAsB3nC,UAAUrS,IAAI,qBAAsB,qBAK/Df,KAAKo5C,mBAAqBhuC,SAASC,cAAc,OACjDrL,KAAKo5C,mBAAmBhmC,UAAUrS,IAAI,uBAEtC,MAAMw4C,EAAyC,CAAC7nC,eAAgB1R,KAAK0R,gBAC/D4nC,GAAY,OAAW,QAAS,CAAC/6B,UAAU,KACjD,QAAiB+6B,GAAW,IAAMt5C,KAAK0xB,mBAAmB,CAAC1jB,MAAM,EAAM0D,eAAgB1R,KAAK0R,iBAE5F1R,KAAKk5C,iBAAmB9tC,SAASC,cAAc,OAC/CrL,KAAKk5C,iBAAiB9lC,UAAUrS,IAAI,6BAEd,cAAnBf,KAAK85C,KAAKl4C,MACX5B,KAAKg7C,qBAAsB,OAAO,2EAA4E,CAACpnC,KAAM,UACrH5T,KAAKg7C,oBAAoBvvC,QAAO,QAAK,yBACrC,QAAiBzL,KAAKg7C,qBAAqB,KACzC,IAAI,IAAah7C,KAAK85C,KAAK/xC,OAAQ,IAAI/H,KAAKk1C,aAAajyC,IAAIjD,KAAK85C,KAAK/xC,UAAU,KAC/E/H,KAAK0xB,uBAEN6nB,KAEHv5C,KAAKsxB,qBAAsB,OAAO,oEAAqE,CAAC1d,KAAM,YAC9G5T,KAAKsxB,oBAAoB7lB,QAAO,QAAK,aACrC,QAAiBzL,KAAKsxB,qBAAqB,KACzC,MAAMkoB,EAAwC,GAC9C,IAAI,MAAOC,EAAY5S,KAAS7mC,KAAKk1C,aACnCsE,EAAIC,GAAc7gC,MAAMC,KAAKguB,GAAM6S,MAAK,CAACplC,EAAG26B,IAAM36B,EAAI26B,IAGxD,IAAI,IAAauK,GAAK,KACpBx5C,KAAK0xB,uBAEN6nB,IAGLv5C,KAAK2xB,oBAAqB,OAAO,0EAA2E,CAAC/d,KAAM,WACnH5T,KAAK2xB,mBAAmBlmB,QAAO,QAAK,YACpC,QAAiBzL,KAAK2xB,oBAAoB,KACxC,IAAI,IAAoB3xB,KAAK85C,KAAK/xC,OAAQ,IAAI/H,KAAKk1C,aAAajyC,IAAIjD,KAAK85C,KAAK/xC,SAAU/H,KAAK85C,KAAKl4C,MAAM,KACtG5B,KAAK0xB,uBAEN6nB,GAEH,MAAMt3B,EAAOjiB,KAAKi7C,cAAgB7vC,SAASC,cAAc,OACzD4W,EAAK7O,UAAUrS,IAAI,4BACnBkhB,EAAKxW,OAAO6tC,EAAWt5C,KAAKk5C,kBAE5B,MAAMkC,EAAQp7C,KAAKk7C,eAAiB9vC,SAASC,cAAc,OAC3D+vC,EAAMhoC,UAAUrS,IAAI,6BACpBq6C,EAAM3vC,UAAU,CACdzL,KAAKg7C,oBACLh7C,KAAKsxB,oBACLtxB,KAAK2xB,oBACL2G,OAAOC,eAEgBv0B,IAAtBm3C,IACDl5B,EAAK3W,MAAM8Q,UAAY,eAAe++B,OACtCC,EAAM9vC,MAAM8Q,UAAY,cAAc++B,QAGxCn7C,KAAKo5C,mBAAmB3tC,OAAOwW,EAAMm5B,GAGrCp7C,KAAK+6C,sBAAsBzvC,MAAM4Y,QAAU,IAC3ClkB,KAAK+6C,sBAAsBtvC,OAAyBzL,KAAKo5C,oBACzDp5C,KAAKqwB,MAAMgrB,eAAe5vC,OAAOzL,KAAK+6C,uBAEjC/6C,KAAK+6C,sBAAsBh4B,WAEhC/iB,KAAK+6C,sBAAsBzvC,MAAM4Y,QAAU,GAC3CjC,EAAK3W,MAAM8Q,UAAY,GACvBg/B,EAAM9vC,MAAM8Q,UAAY,SAElBpc,KAAKi7C,oBAAuCj3C,IAAtBm3C,IAC9Bn7C,KAAKi7C,cAAc3vC,MAAM8Q,UAAY,eAAe++B,OACpDn7C,KAAKk7C,eAAe5vC,MAAM8Q,UAAY,cAAc++B,WAI9C,KAAA7C,kBAAoB,CAACL,EAAsBC,EAAqBC,MACxE,EAAApvB,EAAA,GAAe/oB,KAAKk5C,kBAAkB,QAAK,WAAY,CAACl5C,KAAK6C,YAC7D7C,KAAKg7C,qBAAuBh7C,KAAKg7C,oBAAoBM,gBAAgB,WAAYnD,GACjFn4C,KAAKsxB,qBAAuBtxB,KAAKsxB,oBAAoBgqB,gBAAgB,WAAYrD,GACjFj4C,KAAK2xB,oBAAsB3xB,KAAK2xB,mBAAmB2pB,gBAAgB,WAAYpD,IAGvE,KAAAjB,kBAAoB,IAAW,EAAD,oCAnQjCW,eAAeqC,EAAqBlU,GACzCA,EAAcC,MAAM5yB,UAAUrS,IAAI,0BAE/Bk5C,EAAO7mC,UAAUqB,SAAS,sBAC3BwlC,EAAOziC,cAAc,4BAA4B/L,OAAOs6B,EAAcC,OAEtEj0B,MAAM6lC,eAAeqC,EAAQlU,GAI1BmR,gBAAgBqB,GAAmB,EAAMP,GAAiB,GAC/D,MAAM5zB,EAAMrS,MAAMmlC,gBAAgBqB,EAAkBP,GAEpD,GAAG5zB,GAAOm0B,EACR,IAAI,MAAMvwC,KAAOhI,KAAK+5C,QAAQA,QAAS,CACrC,GAAG/5C,KAAK+5C,QAAQwB,YAAYl4C,KAAK2E,GAC/B,SAGF,MAAMiyC,EAASj6C,KAAK+5C,QAAQA,QAAQ/xC,GACpChI,KAAKi7B,sBAAsBgf,EAAQj6C,KAAKqxB,aAI5C,OAAOjN,EAGF6W,sBAAsBgf,EAAqBlvB,GAChD,IAAI/qB,KAAKk6C,gBAAgBD,GAAS,OAElC,MAAM71B,EAAMrS,MAAMkpB,sBAAsBgf,EAAQlvB,GAQhD,OAPG3G,GACiB61B,EAAO7mC,UAAUqB,SAAS,eAE1CzU,KAAK+5C,QAAQM,sBAAsBJ,GAAQn1C,SAAS9B,GAAShD,KAAKi7B,sBAAsBj4B,EAAM+nB,KAI3F3G,EAkDFuzB,0BAA0Bz1C,GAC/B,MAAMs5C,EAAYt5C,EAAQkR,UAAUqB,SAAS,cAC7C,OAAO1C,MAAM4lC,0BAA0Bz1C,MAAcs5C,GAAax7C,KAAKw6C,sBAAsBt4C,IAGrFi4C,wBAAwBF,GAChC,MAAMwB,EAAuBz7C,KAAK83C,4BAA4BmC,GAC9D,OAAOwB,MAAAA,OAAoB,EAApBA,EAAsBlX,QAGrB6V,0BAA0BE,GAClC,MAAMx1B,EAAW9kB,KAAK85C,KAAKC,QAAQM,sBAAsBC,GAKzD,OAJIx1B,EAASjiB,QACXiiB,EAASziB,KAAKi4C,GAGTx1B,EAASvK,KAAKrY,IAAaA,EAAQyjB,QAAQ3d,MAG1CwyC,sBAAsBF,GAC9B,MAAMzT,EAAO7mC,KAAKo6C,0BAA0BE,GACtCpF,EAAerO,EAAKvO,QAAQtwB,GAAQhI,KAAKmyB,cAAcnyB,KAAK85C,KAAK/xC,OAAQC,KAC/E,OAAO6+B,EAAKhkC,SAAWqyC,EAAaryC,OAG5Bi1C,4BAA4BmC,GAgBpC,OAAOA,EAAO7mC,UAAUqB,SAAS,sBAC/BwlC,EAAOziC,cAAc,eACrBzF,MAAM+lC,4BAA4BmC,GAG/BC,gBAAgBD,GACrB,QAAQA,EAAO7mC,UAAUqB,SAAS,YAC/BwlC,EAAO7mC,UAAUqB,SAAS,gBAC1BwlC,EAAO7mC,UAAUqB,SAAS,aAC1BwlC,EAAO7mC,UAAUqB,SAAS,iBAC1BwlC,EAAO7mC,UAAUqB,SAAS,uB,mGE3zBlB,MAAMinC,EAMnB37C,YAAYotB,EAAgC,IAC1C,MAAM6Y,EAAQhmC,KAAKgmC,MAAQ56B,SAASC,cAAc,SAClD26B,EAAM5yB,UAAUrS,IAAI,kBAEjBosB,EAAQwuB,aACT3V,EAAM5yB,UAAUrS,IAAI,8BAGnBosB,EAAQzjB,OACTs8B,EAAM5yB,UAAUrS,IAAI,wBAGnBosB,EAAQuhB,UACT1uC,KAAK47C,kBAAiB,GAGxB57C,KAAK0R,eAAiByb,EAAQzb,eAE9B,MAAM2e,EAAQrwB,KAAKqwB,MAAQjlB,SAASC,cAAc,SAWlD,GAVAglB,EAAMjd,UAAUrS,IAAI,wBACpBsvB,EAAMzuB,KAAO,WACVurB,EAAQvV,OACTyY,EAAM1oB,GAAK,SAAWwlB,EAAQvV,MAG7BuV,EAAQoX,UACTlU,EAAMkU,SAAU,GAGfpX,EAAQ0uB,SAAU,CACnB,IAAI5oB,GAAS,EACb,MAAMlD,EAAW,KACf,IAAIkD,EACF,OAGF,IAAIxmB,EAEFA,EADC0gB,EAAQ2uB,YACD3uB,EAAQ2uB,YAAYzrB,EAAMkU,QAAU,EAAI,GAExClU,EAAMkU,QAGhB,sCAA4CpX,EAAQ0uB,SAAUpvC,IAGhE,eAA2B4B,MAAM+d,IAC/B6G,GAAS,EACT,MAAM8oB,GAAa,OAAgB3vB,EAAOe,EAAQ0uB,UAClD,IAAItX,EAEFA,EADCpX,EAAQ2uB,YAC6C,IAA5C3uB,EAAQ2uB,YAAYjiC,QAAQkiC,GAE5BA,EAGZ/7C,KAAKg8C,iBAAiBzX,MAGrBpX,EAAQzb,eAAgByb,EAAQzb,eAAe3Q,IAAIsvB,EAA3BlD,CAAkC,SAAU4C,GAClEM,EAAM1iB,iBAAiB,SAAUoiB,GAGxC,IAAIsE,EAWJ,GAVGlH,EAAQtZ,MACTwgB,EAAOr0B,KAAKq0B,KAAOjpB,SAASC,cAAc,QAC1CgpB,EAAKjhB,UAAUrS,IAAI,qBACnB,QAAMszB,EAAMlH,EAAQtZ,KAAMsZ,EAAQ2hB,WAElC9I,EAAM5yB,UAAUrS,IAAI,4BAGtBilC,EAAMv6B,OAAO4kB,GAEVlD,EAAQvjB,OAAQ,CACjBo8B,EAAM5yB,UAAUrS,IAAI,yBAEpB,MAAM6I,EAASwB,SAASC,cAAc,OACtCzB,EAAOwJ,UAAUrS,IAAI,mBACrBilC,EAAMv6B,OAAO7B,OACR,CACL,MAAMqyC,EAAM7wC,SAASC,cAAc,OACnC4wC,EAAI7oC,UAAUrS,IAAI,gBAElB,MAAMm7C,EAAW9wC,SAAS0a,gBAAgB,6BAA8B,OACxEo2B,EAAS9oC,UAAUrS,IAAI,sBACvBm7C,EAASn2B,eAAe,KAAM,UAAW,aACzC,MAAMK,EAAMhb,SAAS0a,gBAAgB,6BAA8B,OACnEM,EAAIL,eAAe,KAAM,OAAQ,UACjCK,EAAIL,eAAe,KAAM,IAAK,MAC9Bm2B,EAASzwC,OAAO2a,GAEhB,MAAM+1B,EAAK/wC,SAASC,cAAc,OAClC8wC,EAAG/oC,UAAUrS,IAAI,2BAEjB,MAAMq7C,EAAShxC,SAASC,cAAc,OACtC+wC,EAAOhpC,UAAUrS,IAAI,uBAErBk7C,EAAIxwC,OAAO2wC,EAAQD,EAAID,GAEvBlW,EAAMv6B,OAAOwwC,GAGZ5nB,GACD2R,EAAMv6B,OAAO4oB,GAGZlH,EAAQkvB,YACTrW,EAAM5yB,UAAUrS,IAAI,kBAAmB,iBACvC,OAAOilC,OAAOhiC,OAAWA,GAAW,IAE5BmpB,EAAQmvB,WAChBtW,EAAM5yB,UAAUrS,IAAI,gBAIpBwjC,cACF,OAAOvkC,KAAKqwB,MAAMkU,QAGhBA,YAAQA,GAKVvkC,KAAKg8C,iBAAiBzX,GAEtB,MAAMgY,EAAQ,IAAIC,MAAM,SAAU,CAACzC,SAAS,EAAMp8B,YAAY,IAC9D3d,KAAKqwB,MAAMlnB,cAAcozC,GAGpBP,iBAAiBzX,GACtBvkC,KAAKqwB,MAAMkU,QAAUA,EAGhBqX,iBAAiBa,GAEtB,OADAz8C,KAAKgmC,MAAM5yB,UAAUxJ,OAAO,oBAAqB6yC,GAC1C,IAAMz8C,KAAK47C,kBAAkBa,M,0DCnKzB,MAAMC,UAAuB,KAC1C38C,YAAYotB,GAIVpb,MAAM,OAAD,QACHwW,WAAW,GACR4E,IAGL,MAAMkD,EAAQrwB,KAAKqwB,MACnBA,EAAMzuB,KAAO,MACbyuB,EAAM3iB,aAAa,WAAY,IAC/B2iB,EAAMssB,aAAe,MAErB,IAAIC,EAAa,EACjB58C,KAAKqwB,MAAM1iB,iBAAiB,SAAU7F,IACpC9H,KAAKqwB,MAAMjd,UAAU7Q,OAAO,SAC5BvC,KAAK68C,WAEL,MAAMpwC,EAAQzM,KAAKyM,MAAMwZ,QAAQ,MAAO,IAAIyQ,MAAM,EAAGvJ,EAAQtqB,QAC7D7C,KAAKg8C,iBAAiBvvC,GAEtB,MAAM5J,EAAS7C,KAAKyM,MAAM5J,OAC1B,GAAGA,IAAWsqB,EAAQtqB,OACpBsqB,EAAQ2vB,OAAO98C,KAAKyM,YACf,GAAG5J,IAAW+5C,EACnB,OAGFA,EAAa/5C,Q,qECvBJ,SAASk6C,EAAkB5vB,GACxC,OAAO,IAAIzM,SAAwB,CAACxS,EAASyS,K,MAC3C,MAAM,OAAC3K,EAAM,SAAEsuB,GAAYnX,EAC3BnX,EAAOgnC,SAAYr5C,IACjBuK,EAAQvK,IAAQA,EAAIiE,UAAO5D,IAG7B,MAAM0P,GAAU,OAAgByZ,EAAQzZ,SAAW,CAACsC,IAC9CinC,EAAevpC,EAAQhT,MAAMsV,GAAWA,EAAOknC,WACrDD,EAAaD,SAAW,KACtBr8B,KAGFwM,EAAQzZ,QAAUA,EACA,QAAlB,EAAAyZ,EAAQgwB,kBAAU,QAAlBhwB,EAAQgwB,WAAe7Y,GAAY,CAACA,IAEpC,IAAI,IAAU,qBAAsBnX,GAASpC,Y,yLCTjD,IAAIqyB,EACJ,MAAMC,EAAe,KACnBD,EAAY,2BACHE,IAAW,MAAC,QAAe,QAAd,EAAAA,EAAQ9vC,cAAM,eAAE+vC,WACrC7D,MAAK,CAACplC,EAAG26B,KAAO36B,EAAEsD,MAAQtD,EAAEkpC,cAAcC,cAAcxO,EAAEr3B,MAAQq3B,EAAEuO,iBAGvE,IAAI3rB,EAAO,KACTwrB,IACA,qBAA2B,mBAAmB,KAC5CA,QAIW,MAAMK,UAA0B,KAS7C39C,YAAmBotB,EAGf,IACFpb,MAAM,OAAD,QACHi0B,MAAO,UACPpuB,MAAM,UACHuV,IAPY,KAAAA,QAAAA,EA+MZ,KAAAwwB,WAAa,UACM35C,IAArBhE,KAAK49C,cACR59C,KAAK69C,cAAczqC,UAAU7Q,OAAO,UACpCvC,KAAK49C,YAAcrqC,OAAO7Q,YAAW,KACnC1C,KAAK69C,cAAczqC,UAAUrS,IAAI,QACjCf,KAAK49C,iBAAc55C,IAClB,OAGE,KAAA85C,sBAAyBz9C,I,QAC9B,MAAM09C,EAAc19C,EAAOmX,cAA2B,uBAAuBmO,QAAQo4B,YAC/EC,EAAc39C,EAAOmX,cAA2B,eAChDymC,EAAYD,MAAAA,OAAW,EAAXA,EAAalkB,UACzBokB,EAAcD,GAAaA,EAAUh4B,QAAQ,MAAO,KAE1D,OAAejmB,KAAKqwB,OAAO,QAAK0tB,IAChC/9C,KAAKm+C,qBACLn+C,KAAKo+C,oBAAsBhB,EAAU18C,MAAMggC,GAAMA,EAAE8c,eAAiBO,IACpE/9C,KAAKq+C,wBAA0BH,GAAel+C,KAAKo+C,oBAAoBE,cAAc59C,MAAM69C,GAAiBA,EAAaC,eAAiBN,IAE9G,QAA5B,KAAAl+C,KAAKmtB,SAAQsxB,uBAAe,gBAAGz+C,KAAKo+C,oBAAqBp+C,KAAKq+C,yBAC9Dr+C,KAAK29C,cA1NF9rB,IACDA,IACAA,OAAO7tB,GAGThE,KAAK0+C,MAAQ,IAAIn9C,IAEjBvB,KAAKmL,UAAUiI,UAAUrS,IAAI,gBAE7B,MAAM88C,EAAgB79C,KAAK69C,cAAgBzyC,SAASC,cAAc,OAClEwyC,EAAczqC,UAAUrS,IAAI,iBAAkB,YAAa,QAE3D,MAAM49C,EAAYvzC,SAASC,cAAc,QACzCszC,EAAUvrC,UAAUrS,IAAI,QAAS,cACjCf,KAAKmL,UAAUM,OAAOkzC,GAEtB,MAAMC,EAAaxzC,SAASC,cAAc,MAC1CwyC,EAAczmC,YAAYwnC,GAEX,IAAI,KAAWf,GAE9B,IAAIgB,EAAa,KACfA,EAAa,KAEbzB,EAAUt4C,SAAS47B,IACjB,MAAMoe,GAAQ,QAAgBpe,EAAEqe,MAE1BC,EAA8B,GACpC,IAAI,IAAIt7B,EAAI,EAAG7gB,EAAS0D,KAAKI,IAAI+5B,EAAE4d,cAAcz7C,OAAQsqB,EAAQ8xB,aAAe,EAAIC,EAAAA,GAAWx7B,EAAI7gB,IAAU6gB,EAAG,CAC9G,MAAMw6B,EAAcxd,EAAE4d,cAAc56B,GAC9Bgb,EAAKtzB,SAASC,cAAc,MAE5BssB,GAAU,OAAcmnB,GAC9B,GAAG,IAAoB,CACrB,MAAMK,EAAY/zC,SAASC,cAAc,SACzC,OAAa8zC,EAAWxnB,GACxB+G,EAAGjzB,OAAO0zC,QAEV,OAAazgB,EAAI/G,GAGnB,MAAM/2B,GAAK,QAAK8/B,EAAE8c,cAIlB,GAHA58C,EAAG+kB,QAAQo4B,YAAcrd,EAAE8c,aAC3B9e,EAAGjzB,OAAO7K,IAENusB,EAAQ8xB,aAAc,CACxB,MAAM5qB,EAAOjpB,SAASC,cAAc,QACpCgpB,EAAKjhB,UAAUrS,IAAI,cACnBszB,EAAKyF,UAAY,IAAMokB,EAAYM,aACnC9f,EAAGtnB,YAAYid,GAGjB2qB,EAAM38C,KAAKq8B,GACXkgB,EAAWnzC,OAAOizB,GAGpB1+B,KAAK0+C,MAAM/6C,IAAI+8B,EAAEqe,KAAMC,MAGzBJ,EAAWjxC,iBAAiB,aAAc7F,IACxC,GAAgB,IAAbA,EAAEkO,OACH,OAGF,MAAM3V,GAAS,OAAUyH,EAAEzH,OAAQ,MACnCL,KAAK89C,sBAAsBz9C,MAI7BL,KAAKmL,UAAUiM,YAAYymC,IAG7BgB,IAEA7+C,KAAKqwB,MAAM1iB,iBAAiB,SAAU7F,IACjC+2C,EACDA,IAEAzB,EAAUt4C,SAAS47B,IACjB1gC,KAAK0+C,MAAMz7C,IAAIy9B,EAAEqe,MAAMj6C,SAAS45B,GAAOA,EAAGpzB,MAAM2b,QAAU,QAI9D3T,aAAatT,KAAK49C,aAClB59C,KAAK49C,iBAAc55C,EAEnB65C,EAAczqC,UAAU7Q,OAAO,QAC1Bs7C,EAAc1X,YACnB0X,EAAczqC,UAAUrS,IAAI,UAE5Bf,KAAKo/C,UAEL,OAAiB,CAEfj0C,WAAW,OAAgBnL,KAAKmL,UAAW,gBAC3CjJ,QAASlC,KAAKqwB,MACdoF,SAAU,QACV4pB,OAAQ,IAGV38C,YAAW,KACL48C,IACFl0C,SAASuC,iBAAiB,YAAawnC,EAAa,CAACtgC,SAAS,IAC9DyqC,GAA2B,KAE5B,MAGL,IAAIA,GAA2B,EAC/B,MAAMnK,EAAertC,KAChB,OAAgBA,EAAEzH,OAAQ,iBAG1ByH,EAAEzH,SAAWL,KAAKqwB,QAIrBrwB,KAAK29C,aACLvyC,SAASmG,oBAAoB,YAAa4jC,EAAa,CAACtgC,SAAS,IACjEyqC,GAA2B,IASvBC,EAAcz3C,IAClB,MAAMyE,EAAMzE,EAAEyE,IACd,GAAGzE,EAAEoV,SAAmB,YAAR3Q,EAAmB,OAAO,EAG1C,MAAMizC,EAASx/C,KAAKyM,MAAMub,cACpBnD,EAAyB,GAC/Bu4B,EAAUt4C,SAAS47B,IACjB,MAAM+e,EAAQ,CACZ/e,EAAE9oB,KACF8oB,EAAE8c,aACF9c,EAAEqe,MAGJU,EAAMnnB,OAAOC,SAASzzB,SAAS8S,IAC7B,MAAM8nC,EAAO9nC,EAAK6L,MAAM,KAAK6U,QAAQqnB,GAAS,KAAKC,KAAKD,KAAOplC,KAAKolC,GAASA,EAAK,KAAI77B,KAAK,IACxF47B,EAAK78C,OAAS,GACf48C,EAAMp9C,KAAKq9C,MAIf,MAAMlmC,IAASimC,EAAMnnB,OAAOC,SAAS73B,MAAM6iB,IAA+C,IAAvCA,EAAIyE,cAAcnO,QAAQ2lC,KAE7Ex/C,KAAK0+C,MAAMz7C,IAAIy9B,EAAEqe,MAAMj6C,SAAS45B,GAAOA,EAAGpzB,MAAM2b,QAAUzN,EAAO,GAAK,SACnEA,GAAMqL,EAAQxiB,KAAKq+B,MAYQ,IAAnB7b,EAAQhiB,OACnBu6C,EAAUt4C,SAAS47B,IACjB1gC,KAAK0+C,MAAMz7C,IAAIy9B,EAAEqe,MAAMj6C,SAAS45B,GAAOA,EAAGpzB,MAAM2b,QAAU,QAEjC,IAAnBpC,EAAQhiB,QAAwB,UAAR0J,KAChC,OAAYzE,GACZ9H,KAAK89C,sBAAsB99C,KAAK0+C,MAAMz7C,IAAI4hB,EAAQ,GAAGk6B,MAAM,MAI/D/+C,KAAKqwB,MAAM1iB,iBAAiB,QAAS4xC,GACrCv/C,KAAKqwB,MAAM1iB,iBAAiB,WAAY7F,IACzB,UAAVA,EAAEyE,KACHgzC,EAAWz3C,MAIf62C,EAAUhxC,iBAAiB,aAAc7F,IACpC9H,KAAKqwB,MAAMxL,QAAQ,WACpB7kB,KAAK29C,aACL39C,KAAKqwB,MAAMwvB,SAEX/3C,EAAEkqB,cAAe,EACjBlqB,EAAEiqB,iBACF/xB,KAAKqwB,MAAMC,YAKV8V,cACL,MAAO,CAACkX,QAASt9C,KAAKo+C,oBAAqB7kC,KAAMvZ,KAAKq+C,yBA2BjDyB,oBAAoBf,GACzB/+C,KAAK89C,sBAAsB99C,KAAK0+C,MAAMz7C,IAAI87C,GAAM,IAG3C/8C,SAASs7C,EAAsB/jC,EAAuBwmC,G,SAC3D,OAAe//C,KAAKqwB,MAAOitB,GAAU,QAAKA,EAAQE,cAAuBuC,GACzE//C,KAAKo+C,oBAAsBd,EAC3Bt9C,KAAKq+C,wBAA0B9kC,EACH,QAA5B,KAAAvZ,KAAKmtB,SAAQsxB,uBAAe,gBAAGz+C,KAAKo+C,oBAAqBp+C,KAAKq+C,4B,wFC7QnD,MAAM2B,EAenBjgD,YAAYotB,GAHJ,KAAA8yB,WAAY,EACZ,KAAApvB,WAAa,IAmEd,KAAAqvB,UAAY,KACjB,GAAGlgD,KAAKmgD,aACN,OAAO,EAGT,IAAIC,EAAgB,EAAGC,EAAiB,EAAGC,EAAsB,EAiBjE,OAhBAtgD,KAAKugD,YAAYz7C,SAASsrB,IACrBA,EAAWowB,YACTpwB,EAAW8vB,eACVE,EAGDhwB,EAAWqwB,YACVH,GAIHlwB,EAAWqwB,YACVJ,KAICA,IAAmBC,GAAuBF,EAAgB,GAG5D,KAAAM,aAAe,KACpB1gD,KAAK2gD,QAAQvtC,UAAUxJ,OAAO,aAAc5J,KAAKkgD,eAlFjD,OAAWlgD,KAAMmtB,GAEjBntB,KAAK+H,SAAL/H,KAAK+H,OAAW,MAEZ/H,KAAK2gD,QAEE3gD,KAAK2gD,QAAQvtC,UAAUqB,SAAS,gBACzCzU,KAAK0gD,aAAe,KAClB1gD,KAAK2gD,QAAQrF,gBAAgB,YAAat7C,KAAKkgD,aAAelgD,KAAK0uC,YAHrE1uC,KAAK2gD,SAAU,OAAa,CAAC/sC,KAAM,UAOjCuZ,EAAQyzB,gBACV5gD,KAAK6gD,WAAaz1C,SAASC,cAAc,kBACzCrL,KAAK6gD,WAAWztC,UAAUrS,IAAI,qBAAsB,UAAYf,KAAK6wB,YACrE7wB,KAAK6gD,WAAWh4B,kBAAkB,CAAC9gB,OAAQ/H,KAAK+H,SAE5ColB,EAAQ2zB,kBACV9gD,KAAK+gD,WAAa,IAAI,KAAYC,IAChChhD,KAAKmgD,aAAea,EACpBhhD,KAAK0gD,eACL1gD,KAAK6gD,WAAWt+C,YAGlBvC,KAAK+gD,WAAW51C,UAAUM,OAAOzL,KAAK6gD,cAI1C7gD,KAAKugD,YAAYz7C,SAASsrB,IACxBpwB,KAAK0R,eAAe3Q,IAAIqvB,EAAWC,MAAnCrwB,CAA0C,QAASA,KAAK0gD,iBAG1D1gD,KAAK0gD,eAGIhS,eACT,OAAO1uC,KAAKigD,UAGHvR,aAASjiC,GAClBzM,KAAKigD,UAAYxzC,EACjBzM,KAAKugD,YAAYz7C,SAASsrB,GAAeA,EAAWC,MAAMirB,gBAAgB,WAAY7uC,KACtFzM,KAAK0gD,eAGAO,gBAAgB3yC,EAAuB4yC,GAAkB,GAC9DlhD,KAAK0uC,UAAW,EAChBpgC,EAAQD,MAAK,KACR6yC,IACDlhD,KAAK0uC,UAAW,MAEjB,KACD1uC,KAAK0uC,UAAW,Q,sMC9EP,MAAMyS,EAKnBphD,YAAoBiH,GAAA,KAAAA,SAAAA,EAIpB6qB,OACE7xB,KAAKwS,QAAUpH,SAASuQ,eAAe,gBACvC,MAAMylC,EAAgBphD,KAAKwS,QAAQ4C,mBACnC,QAAiBgsC,EAAeC,EAAkBhrB,cAElD,MAAMJ,EAASj2B,KAAK4vB,WAAa,IAAI,KAAW5vB,KAAKwS,QAAS,QACxD8uC,EAAU,IAAI,IAAYF,EAAeG,EAAuBtrB,GAChE1a,GAAY,EAAA2mB,EAAA,GAAaliC,KAAKwS,SAAS,GAE7CxS,KAAKgH,SAASC,eAAeu6C,UAAUnzC,MAAMozC,IAC3CA,EAAK38C,SAASnD,IACZ2/C,EAAQvgD,IAAIY,MAGd4Z,EAAUhZ,YAGZ,0BAAyC++C,EAAQ1jC,cAAe0jC,EAAQI,qBAExE1hD,KAAK6xB,KAAO,KAGdud,Y,+WCzBF,MAAMuS,EAAqC,cAE5B,MAAMC,UAAmB,IAAxC,c,oBAIU,KAAAC,WAAa,GACb,KAAAC,WAAY,EAmCZ,KAAAC,YAAoBj6C,GAA+B,EAAD,gCACxD,MAAMzH,GAAS,EAAAyc,EAAA,GAAgBhV,EAAEzH,OAAQ,OACzC,IAAIA,EAAQ,OAEZ,MAAM2hD,EAAS3hD,EAAOslB,QAAQxe,aACrBgqB,EAAA,qCAAgD6wB,IACpDr4B,EAAA,YACD,uBAGFxd,QAAQC,KAAK,oBAAqB41C,MAtC/BnwB,OACL7xB,KAAKmL,UAAUxD,GAAK,wBAEpB3H,KAAKiiD,YAAc,IAAI,IAAY,mBAAoBx1C,IACrDzM,KAAKwQ,QACLxQ,KAAKouB,OAAO3hB,MAGdzM,KAAK8O,MAAMka,YAAYhpB,KAAKiiD,YAAY92C,WAExCnL,KAAKkiD,QAAU92C,SAASC,cAAc,OACtCrL,KAAKkiD,QAAQ9uC,UAAUrS,IAAI,iBAC3B,QAAiBf,KAAKkiD,QAASliD,KAAK+hD,YAAa,CAACrwC,eAAgB1R,KAAK0R,iBAEvE1R,KAAK4vB,WAAWnkB,OAAOzL,KAAKkiD,SAE5BliD,KAAKshD,QAAU,IAAI,IAAYthD,KAAKkiD,QAASP,EAAgB3hD,KAAK4vB,YAGlE,oBAA8B,GAAMvhB,MAAK,KACvCrO,KAAKouB,OAAO,IAAI,GAEhBpuB,KAAK4vB,WAAWK,iBAAmB,KACjCjwB,KAAKouB,OAAOpuB,KAAKiiD,YAAYx1C,OAAO,OAmBnC2iC,UACLpvC,KAAK4vB,WAAWK,iBAAmB,OAG9BkyB,sBAKL,OAJAniD,KAAKwQ,QACLxQ,KAAKkiD,QAAQnjC,UAAY,GACzBjf,EAAA,uBAAqCkE,EAAW29C,GAChD3hD,KAAKiiD,YAAY1/C,SACVwP,MAAMowC,sBAGP3xC,QACNxQ,KAAKwvB,cAAgB,KACrBxvB,KAAK6hD,WAAa,GAClB7hD,KAAK8hD,WAAY,EACjB9hD,KAAKshD,QAAQxgC,QAGFsN,OAAOsB,EAAe0yB,GAAY,G,yCAC7C,IAAGpiD,KAAKwvB,gBAAiBxvB,KAAK8hD,UAA9B,CAEI9hD,KAAKqiD,eACPriD,KAAKqiD,oBAAsBriD,KAAKgH,SAASy1B,gBAAgB6lB,gBAAgB,QAAQ36C,GAAGsqB,UAAS,IAG/F,IACEjyB,KAAKwvB,cAAgBxvB,KAAKgH,SAASu7C,qBAAqBC,iBAAiB,KAAcxiD,KAAKqiD,aAAc3yB,EAAO1vB,KAAK6hD,YACtH,MAAM,QAACjnB,EAAO,YAAE6nB,SAAqBziD,KAAKwvB,cAE1C,GAAGxvB,KAAKiiD,YAAYx1C,QAAUijB,EAC5B,OAGF1vB,KAAKwvB,cAAgB,KACrBxvB,KAAK6hD,WAAaY,EACfL,IACDpiD,KAAKkiD,QAAQnjC,UAAY,IAGxB6b,EAAQ/3B,OACT+3B,EAAQ91B,SAASwjC,IACC,yBAAbA,EAAO74B,GAAgC64B,EAAOl9B,UAC/CpL,KAAKshD,QAAQvgD,IAAIunC,EAAOl9B,aAI5BpL,KAAK8hD,WAAY,EAGnB9hD,KAAK4vB,WAAWwG,WAChB,MAAM7wB,GAGN,MAFAvF,KAAKwvB,cAAgB,KACrBrjB,QAAQwf,MAAM,sBAAuBpmB,GAC/BA,Q,yEC1GG,MAAMm9C,UAAuB,IAKnC7wB,OACL7xB,KAAKmL,UAAUxD,GAAK,qBACpB3H,KAAKmL,UAAUiI,UAAUrS,IAAI,sBAE7Bf,KAAK4d,cAAgB,IAAI,IAEzB5d,KAAKiiD,YAAc,IAAI,IAAY,iCAAkCx1C,IACnEzM,KAAKouB,OAAO3hB,MAGdzM,KAAK8O,MAAMka,YAAYhpB,KAAKiiD,YAAY92C,WAExCnL,KAAK2iD,QAAUv3C,SAASC,cAAc,OACtCrL,KAAK2iD,QAAQvvC,UAAUrS,IAAI,gBAC3Bf,KAAK4vB,WAAWnkB,OAAOzL,KAAK2iD,UAE5B,OAA6B,CAACC,SAAU5iD,KAAK2iD,QAASjxC,eAAgB1R,KAAK0R,kBAE3E,QAAiB1R,KAAK2iD,SAAU76C,IAC9B,MAAM+6C,GAAU,EAAA/lC,EAAA,GAAgBhV,EAAEzH,OAAQ,uBAC1C,GAAGwiD,EAAS,CACV,MAAM17C,EAAQ07C,EAAQl9B,QAAQxe,MAE9B,YADAgqB,EAAA,qCAAgDhqB,GAIlD,MAAM9G,GAAS,EAAAyc,EAAA,GAAgBhV,EAAEzH,OAAQ,eACzC,IAAIA,EAAQ,OAEZ,MAAMsH,EAAKtH,EAAOslB,QAAQm9B,WACpBC,EAAc1iD,EAAOslB,QAAQo9B,YAE7B/sC,GAAS,EAAA8G,EAAA,GAAgBhV,EAAEzH,OAAQ,sBACtC2V,GACDlO,EAAEiqB,iBACFjqB,EAAEkqB,cAAe,EAEjBhc,EAAOtI,aAAa,WAAY,QAEhC1N,KAAKgH,SAASg8C,mBAAmBC,cAAc,CAACt7C,GAAAA,EAAIo7C,YAAAA,IAAc10C,MAAMgqB,IACtEr4B,KAAKgH,SAASg8C,mBAAmBE,iBAAiB7qB,EAAK10B,KAAK0K,MAAM80C,IAC7DA,IACDntC,EAAOsC,YAAc,GACrBtC,EAAOvK,QAAO,QAAK4sB,EAAK10B,IAAIy/C,eAAiB,uBAAyB,uBACtEptC,EAAO5C,UAAUxJ,OAAO,SAAUyuB,EAAK10B,IAAIy/C,oBAE5CvrC,SAAQ,KAET7B,EAAOqtC,gBAAgB,mBAI3BrjD,KAAKgH,SAASg8C,mBAAmBC,cAAc,CAACt7C,GAAAA,EAAIo7C,YAAAA,IAAc10C,MAAMgqB,IACtE,IAAI,IAAcA,EAAK10B,KAAKonB,YAG/B,CAACrZ,eAAgB1R,KAAK0R,iBAEzB,oBAA8B,GAAMrD,MAAK,KACvCrO,KAAKsjD,oBAIFnB,sBAGL,OAFAniD,KAAK2iD,QAAQ5jC,UAAY,GACzBjf,EAAA,uBAAqCkE,EAAW,mBACzC+N,MAAMowC,sBAGRoB,UAAU5/C,GAEf,MAAM2mB,EAAMlf,SAASC,cAAc,OACnCif,EAAIlX,UAAUrS,IAAI,eAElB,MAAMyiD,EAASp4C,SAASC,cAAc,OACtCm4C,EAAOpwC,UAAUrS,IAAI,sBAErB,MAAMqF,EAAUgF,SAASC,cAAc,OACvCjF,EAAQgN,UAAUrS,IAAI,uBACtBqF,EAAQ2Y,UAAY,wCAEpB,EAAA0a,EAAA,GAAarzB,EAAQgP,mBAAmB,EAAAoT,EAAA,GAAc7kB,EAAImL,QAE1D,MAAM20C,EAAWr4C,SAASC,cAAc,OACxCo4C,EAASrwC,UAAUrS,IAAI,qBACvB0iD,EAASh4C,QAAO,QAAK,WAAY,CAAC9H,EAAI+sB,SACtCtqB,EAAQqF,OAAOg4C,GAEf,MAAMztC,EAAS5K,SAASC,cAAc,UACtC2K,EAAO5C,UAAUrS,IAAI,cAAe,oBAAqB,sBACzDiV,EAAOvK,QAAO,QAAK9H,EAAIy/C,eAAiB,uBAAyB,uBAG9Dz/C,EAAIy/C,gBACLptC,EAAO5C,UAAUrS,IAAI,QAKvByiD,EAAO/3C,OAAOrF,EAAS4P,GAEvB,MAAM0tC,EAAct4C,SAASC,cAAc,OAC3Cq4C,EAAYtwC,UAAUrS,IAAI,wBAE1B,MAAM2vB,EAAQnqB,KAAKI,IAAI,EAAGhD,EAAI+sB,OAC9B,IAAI,IAAIhN,EAAI,EAAGA,EAAIgN,IAAShN,EAAG,CAC7B,MAAMigC,EAAav4C,SAASC,cAAc,OAC1Cs4C,EAAWvwC,UAAUrS,IAAI,uBAEzB2iD,EAAYj4C,OAAOk4C,GAGrB3jD,KAAKgH,SAASg8C,mBAAmBC,cAAct/C,GAAK0K,MAAM1K,IAGxD,IAAI,IAAI+f,EAAI,EAAGA,EAAIgN,IAAShN,EAAG,CAC7B,MAAM4G,EAAMo5B,EAAY7uB,SAASnR,GAC3B/hB,EAAMgC,EAAIigD,UAAUlgC,GACb,kBAAV/hB,EAAI8N,IAIP,QAAY,CACV9N,IAAAA,EACA2oB,IAAAA,EACA1M,cAAe5d,KAAK4d,cACpBtd,MAAO,kBAGPkE,MAAM,EACNf,MAAM,EACNmf,MAAO,GACPI,OAAQ,GACR6gC,UAAU,QA8BhBv5B,EAAI3E,QAAQm9B,WAAa,GAAKn/C,EAAIgE,GAClC2iB,EAAI3E,QAAQo9B,YAAc,GAAKp/C,EAAIo/C,YACnCz4B,EAAI3E,QAAQ7W,MAAQnL,EAAImL,MAExBwb,EAAI7e,OAAO+3C,EAAQE,GAEnB1jD,KAAK2iD,QAAQl3C,OAAO6e,GAGfg5B,iBACL,OAAOtjD,KAAKgH,SAASg8C,mBAAmBc,sBAAsBz1C,MAAM01C,IAC/D/jD,KAAKiiD,YAAYx1C,QAIpBs3C,EAAc/jD,KAAKgkD,eAAe,GAAID,IAC1Bj/C,SAASnB,IACnB3D,KAAKujD,UAAU5/C,EAAIA,WAKjBqgD,eAAet0B,EAAeq0B,GACpCA,EAAcA,EAAYrtB,QAE1B,MAAM7B,EAAWjc,MAAMC,KAAK7Y,KAAK2iD,QAAQ9tB,UAczC,OAbA,EAAAovB,EAAA,GAAepvB,GAAUj0B,IACvB,MAAM+G,EAAK/G,EAAG+kB,QAAQm9B,WAChBp1B,EAAQq2B,EAAYh7C,WAAWm7C,GAAYA,EAAQvgD,IAAIgE,KAAOA,KAEtD,IAAX+lB,EACDq2B,EAAYn2B,OAAOF,EAAO,GACjBgC,GAAU9uB,EAAG+kB,QAAQ7W,MAAMkZ,cAAcpT,SAAS8a,EAAM1H,gBACjEpnB,EAAG2B,YAIPzC,EAAA,uBAAqCkE,EAAW,mBAEzC+/C,EAGF31B,OAAOsB,GACZ,OAAIA,EAIG1vB,KAAKgH,SAASg8C,mBAAmBmB,kBAAkBz0B,GAAO,GAAOrhB,MAAM01C,IACzE/jD,KAAKiiD,YAAYx1C,QAAUijB,IAM9Bq0B,EAAc/jD,KAAKgkD,eAAet0B,EAAOq0B,IAC7Bj/C,SAASnB,IACnB3D,KAAKujD,UAAU5/C,EAAIA,WAZd3D,KAAKsjD,kB,qbCpMX,MAAM/B,EAA4C,qBAenD6C,EAAwC,CAC5CC,cAAe,IACfC,mBAHa,IAAa,IAAM,EAAK,IAAM,IAMtC,MAAMjD,UAA0B,IAqBrCthD,cACEgS,MAAM,CACJ7P,QAASkJ,SAASuQ,eAAe,kBACjC4oC,wBAAyB,wBAfrB,KAAAC,OAAS,EAuPT,KAAAC,iBAAoB98C,IAC1B,GAAG3H,KAAKwkD,QAAU78C,EAMlB7H,EAAA,mBAAqC,EAAMyhD,GAE3CvhD,KAAKwkD,MAAQ78C,EACb3H,KAAK0kD,aAAatxC,UAAUxJ,OAAO,OAAQ5J,KAAKwkD,QAAUxkD,KAAK2kD,SAASH,OACxExkD,KAAK4kD,UAAUxxC,UAAUxJ,OAAO,OAAQ5J,KAAKwkD,QAAUxkD,KAAK2kD,SAASH,WAVrE,CACE,MAAM,IAACzxC,GAAO/S,KACdA,KAAK6kD,SAAS9xC,EAAKA,EAAI6c,WAAWzkB,UAAUiK,qBAWxC,KAAA0vC,YAAc,IAAW,kCAC/B,MAAM,OAAC/8C,EAAM,SAAE+K,GAAYqe,EAAA,OACrB0D,EAAW70B,KAAK+kD,OAAOlwB,SACvBmwB,EAAepsC,MAAMC,KAAKgc,IAEzBowB,EAAiBC,SAAqBxkC,QAAQkI,IAAI,CACvD5oB,KAAKgH,SAAS8G,mBAAmBq3C,cAAcp9C,EAAQ+K,EAAU,iBACjE9S,KAAKgH,SAAS8G,mBAAmBq3C,cAAcp9C,EAAQ+K,EAAU,eAGnEkyC,EAAahlD,KAAKolD,YAAYZ,MAAQ,GAAGlJ,gBAAgB,YAAa2J,GACtED,EAAahlD,KAAKqlD,QAAQb,MAAQ,GAAGlJ,gBAAgB,YAAa4J,GAElE,MAAM9jC,EAASphB,KAAK+kD,OAAOvtC,cAAc,YACtC4J,IAAU,EAAAkkC,EAAA,GAAWlkC,KAAaphB,KAAK2kD,SAASH,MAAQ,GAAQS,GAAoBC,GACrFllD,KAAK40B,UAAU50B,KAAK2kD,SAASH,OAAO,MAlQtCxkD,KAAK2N,iBAAiB,QAAQ,IAAW,kC,MACpC,MAEE,EAAA8qC,EAAA,aACK,EAAAn0C,EAAA,GAAM,MAIbtE,KAAKkC,QAAQyW,gBAAkBwY,EAAA,wBAChCA,EAAA,8BAAyCnxB,KAAKkC,SAGhDlC,KAAKulD,WAAavlD,KAAKwlD,eAEvBnE,EAAkBzjC,cAAc1Y,OAEhCpF,EAAA,wBAA2CyhD,GAE3C,MAAMxuC,EAAM/S,KAAK+S,IACP,QAAV,EAAAA,EAAIo8B,cAAM,sBAGZnvC,KAAK2N,iBAAiB,UAAU,K,MAC9B7N,EAAA,0BAA6CyhD,GAC7CF,EAAkBzjC,cAAckZ,mBAIhC,MAAM/jB,EAAM/S,KAAK+S,IACL,QAAZ,EAAAA,EAAI0yC,gBAAQ,oBAGdzlD,KAAK2N,iBAAiB,SAAS,K,MAC7B0zC,EAAkBzjC,cAAc1Y,OAIhCpF,EAAA,wBAA2CyhD,GAC3CzhD,EAAA,mBAAqC,EAAMyhD,GAE3C,MAAMxuC,EAAM/S,KAAK+S,IACN,QAAX,EAAAA,EAAIq8B,eAAO,oBAGbpvC,KAAK2N,iBAAiB,UAAU,K,MAE9B7N,EAAA,0BAA6CyhD,GAC7CF,EAAkBzjC,cAAc8nC,SAChCrE,EAAkBzjC,cAAc+nC,UAIhC3lD,KAAKulD,gBAAavhD,EAElB,MAAM+O,EAAM/S,KAAK+S,IACL,QAAZ,EAAAA,EAAI6yC,gBAAQ,oBAIL7yC,UACT,OAAO/S,KAAKwyB,KAAKxyB,KAAKwkD,OAGjB3yB,OACL7xB,KAAKgH,SAAWwW,EAAA,WAChBxd,KAAK2kD,SAAW,IAAI,KAAS3kD,KAAKgH,UAClChH,KAAKolD,YAAc,IAAI,KAAYplD,KAAKgH,UACxChH,KAAKqlD,QAAU,IAAIlE,EAAQnhD,KAAKgH,UAEhChH,KAAKwyB,KAAO,GACZ,CAACxyB,KAAK2kD,SAAU3kD,KAAKolD,YAAaplD,KAAKqlD,SAASvgD,SAAQ,CAACiO,EAAKjK,KAC5DiK,EAAIyxC,MAAQ17C,EACZ9I,KAAKwyB,KAAK1pB,GAAOiK,KAGnB/S,KAAKmL,UAAYnL,KAAKkC,QAAQsV,cAAc,oCAC5CxX,KAAK+kD,OAAS/kD,KAAKkC,QAAQsV,cAAc,eACzCxX,KAAK40B,WAAY,EAAAQ,EAAA,GAAep1B,KAAK+kD,OAAQ/kD,KAAKmL,UAAWnL,KAAKykD,kBAAkB,K,MAClF,MAAM,IAAC1xC,GAAO/S,KACN,QAAR,EAAA+S,EAAI8e,YAAI,iBACR/xB,EAAA,mBAAqC,EAAOyhD,MAG9CvhD,KAAK0kD,aAAe1kD,KAAKkC,QAAQsV,cAAc,sBAC/CxX,KAAK0kD,aAAa/2C,iBAAiB,SAAS,KACvC3N,KAAKwkD,QAAUxkD,KAAKolD,YAAYZ,MAC7B,iBAA4B9B,IAC9B,eAA0BA,GAAgB93B,OAGxC,iBAA4Bg3B,IAC9B,eAA0BA,GAAYh3B,UAK5C5qB,KAAK4kD,UAAY5kD,KAAKkC,QAAQsV,cAAc,uBAC5C,QAAiBxX,KAAK4kD,WAAY98C,KAChC,EAAAgS,EAAA,GAAYhS,GACZ,MAAMuoB,EAAQc,EAAA,0BAEd,IAAI00B,EAAQ,kBAA+BC,cAAcz1B,GACrDw1B,IACFA,EAAQz6C,SAASqsC,cACjBoO,EAAME,cAAc11B,EAAMib,YAG5B,MAAM0a,EAAWH,EAAMI,aAEvB,GAAGJ,EAAMK,UAAW,CAClB,MAAM,KAACC,EAAI,OAAEjtB,IAAU,OAAa7I,EAAOw1B,EAAMO,aAAcP,EAAMQ,WACrE,IAAIC,EACJ,GAAGptB,EACDotB,EAAeH,MACV,CAEL,GADAG,EAAeH,EAAKI,iBAChBD,EACF,OAGF,KAAMA,EAAaE,WAAaF,EAAaG,YAAcH,EAAaI,YAAcJ,EAAeA,EAAaC,mBAIlH,GAAGD,EAAaE,WAAaF,EAAaK,eAAkBL,EAA6BM,kBACvF,OAIJ,GAAGN,EAAaE,WAAaF,EAAaK,cAAkD,QAAjCL,EAAqB7pC,QAC9EupC,EAASa,WAAWP,OACf,CACL,MAAMzyC,EAAO,IAAIyyC,EAAahuC,aAC9B,IAAIwoB,EACJ,GAAG5H,EAAQ,CACT,IAAIr2B,EAAS,EACbi+B,EAAIjtB,EAAKnT,MAAMmT,IAAUhR,GAAUgR,EAAKhR,OAAQA,GAAUq2B,UAE1D4H,EAAIjtB,EAAKkR,OAAS,GAGpB,MAAM+hC,EAAY5tB,EAASA,EAAS4H,EAAEj+B,OAASyjD,EAAahuC,YAAYzV,OAASi+B,EAAEj+B,OACnFmjD,EAASe,SAAST,EAAcQ,IAIpCd,EAASgB,iBAET71B,EAAA,uDA0BF,MAAM81B,EAAiB,EAAApsC,kBAAmB,EAEpCqsC,EAAcD,EAAiBjnD,KAAKolD,YAAYZ,MAAQxkD,KAAK2kD,SAASH,MAW5E,GATGyC,GACAjnD,KAAK+kD,OAAOlwB,SAAS,GAAmBzhB,UAAUrS,IAAI,SAGzD,QAAmBf,KAAK+kD,OAAOlwB,SAASqyB,EAAc,IACnDlnD,KAAKwyB,KAAK00B,GAAar1B,MACxB7xB,KAAKwyB,KAAK00B,GAAar1B,QAGrB,IAAoB,CACtB,IAAIs1B,EAAgCC,GAAyB,EAC7D,MAAMlR,EAAepuC,IACnBq/C,EAAqBr/C,GAEvBwR,EAAA,mBAAgC,UAAW+tC,IACtCA,EACGD,IACFh8C,SAASI,KAAKmC,iBAAiB,YAAauoC,GAC5CkR,GAAyB,GAEnBA,IACRh8C,SAASI,KAAK+F,oBAAoB,YAAa2kC,GAC5CiR,GACDnnD,KAAKsnD,WAAWH,OAYxB,OANAh2B,EAAA,mBAA8B,iBAAiB,KAC7CnxB,KAAK4J,QAAO,MAEdunB,EAAA,mBAA8B,eAAgBnxB,KAAK8kD,aACnD9kD,KAAK8kD,cAEE/yC,MAAM8f,OAGR01B,aACL,OAAOvnD,KAAKkC,QAGP2iD,SAAS9xC,EAAmB7Q,GACjC6Q,EAAI6c,WAAW4F,kBAAkB,OAAD,QAC9BtzB,QAASA,EACTslD,KAAM,IACN/xB,SAAU,SACP2uB,IA4MA/tC,iBAAuBlP,EAAcsgD,EAAsBC,G,yCAChE,aAASv2B,EAAA,qCAAgDhqB,OAAOnD,EAAWyjD,EAAYC,KAGlFC,GAAkBx8C,YACnBw8C,GAAkBC,YAAa,EAE/BD,GAAkB/9C,QAAO,KAGpB,IAEPuC,QAAQC,KAAK,oBAAqBjF,IAC3B,MAIJ0gD,uBAAuBjqC,EAAyC8jC,GACrE1hD,KAAK2N,iBAAiB,SAAS,KAC7BiQ,EAAc1Y,UAGhBlF,KAAK2N,iBAAiB,UAAU,KAC9B,MAAMm6C,EAAOlqC,EAAcmqC,YAAYC,aAEvC,IAAI,MAAM19B,KAAOw9B,EACfpG,EAAoBp3B,GAGtB1M,EAAcmqC,YAAYE,kBAG5BjoD,KAAK2N,iBAAiB,UAAU,KAC9BiQ,EAAckZ,sBAIXgvB,gBACL,OAAO9lD,KAAKwlD,gBAAkBxlD,KAAKulD,WAG7BC,eACN,MAAM0C,EAAM98C,SAASmsC,eACrB,GAAG2Q,EAAIC,YAAc/8C,SAASg9C,gBAAkBj3B,EAAA,0BAC9C,OAAO+2B,EAAIG,WAAW,I,IAnfZ,EAAAzqC,cAAgB,IAAI,IAAc,GAgSlC,EAAA0qC,YAAc,CAC1BC,EACAvZ,EACApf,EACA44B,EACAC,KAEA,IAAIC,GAAY,EAEhB,MAeM35B,EAAY,CAAChc,EAAqBkjB,GAAS,KAC/C,GAAGljB,IAAQ01C,EACT,OAAO,EAGT,IAAIjlB,GAAI,EAmCR,OAlCGilB,IACDA,EAAQ3jC,SAASsP,QAAQhhB,UAAU7Q,OAAO,UACvCkmD,EAAQD,YAAcC,EAAQD,aAAez1C,EAAIy1C,aAClDhlB,GAAI,EAEJilB,EAAQD,WAAWr9C,UAAUwN,cAAcvF,UAAU7Q,OAAO,UAC5DkmD,EAAQD,WAAWhzB,kBAAkB,OAAD,QAClCtzB,QAASumD,EAAQD,WAAWr9C,UAAUiK,kBACtCoxB,eAAgBvQ,OAASjyB,EAAY,WACrCyxB,SAAU,SACV+xB,KAAM,KACHpD,MAKTrxC,EAAI+R,SAASsP,QAAQhhB,UAAUrS,IAAI,UAEhCgS,EAAIy1C,aACLz1C,EAAIy1C,WAAWr9C,UAAUwN,cAAcvF,UAAUrS,IAAI,UACrDk1B,GAAUuyB,EAAWhzB,kBAAkB,OAAD,QACpCtzB,QAAS6Q,EAAIy1C,WAAWr9C,UAAUwN,cAClC8c,SAAU,SACV+xB,KAAM,KACHpD,KAIJqE,GAjDe,EAAC11C,EAAqBywB,KACxC,MAAM1D,EAAI/sB,EAAIy1C,YAAcA,EACzB1oB,GACDA,EAAEtK,kBAAkB,OAAD,QACjBtzB,QAAS6Q,EAAI+R,SAASsP,QACtBqB,SAAU,SACV+xB,KAAM,IACNmB,mBAAoBnlB,EAAI,EAAEolB,gBAAAA,KACjBA,EAAkB,SACvB5kD,GACDogD,KAwCLyE,CAAY91C,EAAKywB,GAGnBilB,EAAU11C,GAEH,GAeT,IAAI+1C,GAAqB,EACzB,MAAMC,EAAoB,IAAI,IAAkBn5B,EAAWzkB,WAAW,CAAC69C,EAAO3oD,KAC5E,GAAGyoD,EACD,OAKF,GAAGviD,KAAK+Y,IAAIopC,EAAW94B,EAAWzkB,UAAU6qB,YAAc,EACxD,OAEA0yB,GAAY,EAGd,MAAM31C,EAAMw1C,EAAUU,uBAAuB5oD,GACvC6oD,GAAQ,EAAA5D,EAAA,GAAWjlD,IACrB2oD,IAAUE,IAASn2C,EAAIy1C,aAI3Bz5B,EAAUhc,MAGZi8B,EAAKrhC,iBAAiB,SAAU7F,IAC9B,IAAIzH,GAAS,EAAAyc,EAAA,GAAgBhV,EAAEzH,OAAuB,4BACtD,IAAIA,EAAQ,CAEV,GADAA,GAAS,EAAAyc,EAAA,GAAgBhV,EAAEzH,OAAuB,0BAC9CA,GAAUA,EAAO+S,UAAUqB,SAAS,UACtC,OAGFpU,EAASA,EAAO+U,kBAAkBA,kBAGpC,MAAM8zC,GAAQ,EAAA5D,EAAA,GAAWjlD,GAEnB0S,EAAMw1C,EAAUY,qBAAqB9oD,GAMxC0uB,EAAUhc,GAKb,IAAIgjB,EAAY,EAAGqzB,EAAmB,EACtC,GAAGF,EAAQ,GAAKn2C,EAAIy1C,WAAY,CAC9B,MAAMtmD,EAAU6Q,EAAI+R,SAAS3Z,UAC7Bi+C,EAAmB,EACnBrzB,EAAY7zB,EAAQ6zB,UAAYqzB,EAGlCV,EAAW3yB,EAEX+yB,GAAqB,EACrBl5B,EAAW4F,kBAAkB,OAAD,QAC1BtzB,QAAS6zB,EAAYhjB,EAAI+R,SAAS3Z,UAAYykB,EAAWzkB,UAAUiK,kBACnEqgB,SAAU,QACV+xB,KAAM,IACNmB,mBAAoB5yB,EAAY,EAAE6yB,gBAAAA,KAAqBA,EAAkBQ,OAAmBplD,GACzFogD,IACFvsC,SAAQ,KACTkX,EAAUhc,GACV+1C,GAAqB,QAIzB,MAAMx0C,EAAIsb,EAAWpc,mBAAqBoc,EAAWpc,mBAAmBwG,KAAK4V,GAAc2H,EAAA,EAM3F,OALA3H,EAAWpc,mBAAqB,KAC9B+0C,EAAU/1C,QAAQmG,cAAcvF,UAAUxJ,OAAO,gBAAiBgmB,EAAWoG,WAC7E1hB,KAGK,CAACy0C,kBAAAA,EAAmBh6B,UAAAA,EAAWs6B,gBAvFbt2C,IACvB,GAAG01C,MAAAA,OAAO,EAAPA,EAASa,MACV,OAGFf,EAAU34B,WAAWoG,UAAYjjB,EAAI+R,SAAS3Z,UAAU4qB,UAAY,EACpE,MAAMjsB,EAAIy+C,EAAUC,WAAWr9C,UACzBrD,EAAIiL,EAAI+R,SAASsP,QACvBtqB,EAAEy/C,WAAazhD,EAAEib,WAAajZ,EAAE0/C,YAAc,EAAI1hD,EAAEq+B,YAAc,EAClEpX,EAAUhc,GAAK,MAiFL,EAAAsjB,aAAe,CAAMvuB,EAAoC2/C,GAAa,EAAOC,IAAqB,oCAC9G,MAAMrnD,GAAS,EAAAs+B,EAAA,GAAU72B,EAAEzH,OAAuB,OAClD,IAAIA,EAAQ,OAAO,EAEnB,MAAM8G,EAAQ9G,EAAOslB,QAAQxe,MAC7B,QAAIA,GAEG,EAAKsiD,UAAUtiD,EAAOsgD,EAAYC,MAoD7C,MAAMC,GAAoB,IAAItG,EAC9B,uBAAmCsG,GACnC,a,8WC9gBA,MAAM+B,EAA0B,IAAItoD,IAC7B,SAASuoD,EAAY7K,EAAe3zC,EAAyBuM,GAAU,EAAOkyC,GAAQ,G,MAK3F,MAAMzK,EAAY/zC,SAASC,cAAc,QAGzC,IAAIw+C,EAiBJ,GAnBA1K,EAAU/rC,UAAUrS,IAAI,eAGrB6oD,IAAU,IACXC,EC1CW,SAAyB/K,GACtC,OAAO,EAAAjlB,EAAA,IAAailB,EAAO,CACzB5pC,SAAU,EAAC,EAAA40C,EAAA,GAAwBhL,MDwC7BiL,CAAgBjL,IAEtBA,GAAQ,EAAAkL,EAAA,GAASlL,GACjB+K,GAAM,EAAArhC,EAAA,GAAcs2B,IAUtBK,EAAU1zC,OAAOo+C,GAEd1K,EAAUtqB,SAAShyB,OAAS,EAAG,CAChC,MAAM2zC,EAAQ2I,EAAU/pC,kBACxB+pC,EAAUpgC,UAAY,GACtBogC,EAAU1zC,OAAO+qC,GAGnB,GAA4C,SAAd,QAA3B,EAAA2I,EAAU/pC,yBAAiB,eAAEqH,SAAmB,CACjD,MAAM8I,EAAQ45B,EAAU/pC,kBAElB3N,EAAM8d,EAAM5iB,IAClB,IAAI+mD,EAAWrmD,IAAIoE,GAAM,CACvB8d,EAAM7X,aAAa,UAAW,QAC9B,MAAMnK,EAAc6H,SAASC,cAAc,QAC3C9H,EAAY6P,UAAUrS,IAAI,qBAEvByc,EAAA,+BACD+H,EAAMja,MAAM4Y,QAAU,IACtB3gB,EAAY+H,MAAM4Y,QAAU,KAG9BqB,EAAM5X,iBAAiB,QAAQ,MAC7B,SAAQ,KACH6P,EAAA,+BACD+H,EAAMja,MAAM4Y,QAAU,GACtB3gB,EAAY+H,MAAM4Y,QAAU,IAG9Bi7B,EAAU/rC,UAAU7Q,OAAO,SAE3BmnD,EAAW3oD,IAAI0G,QAEhB,CAACuG,MAAM,IAEVmxC,EAAU1zC,OAAOlI,IAWrB,OALG4H,IACEuM,EAASvM,EAAUuM,QAAQynC,GACzBh0C,EAAUiM,YAAY+nC,IAGtBA,EAGF,SAAS8K,EAAoB/nD,GAClC,MAAMgoD,GAAa,EAAAptC,EAAA,GAAgB5a,EAAS,eAC5C,IAAIgoD,EAAY,OAEhB,MAAM90C,EAAoB80C,EAAW90C,kBACrC,OAAGA,GAAqBA,EAAkBhC,UAAUqB,SAAS,gBACpD,CAACqqC,MAAO1pC,EAAkBuQ,QAAQwkC,aAAchjD,MAAOiO,EAAkBuQ,QAAQxe,OAErFjF,EAAQskD,WAAatkD,EAAQukD,UAAkB,CAAC3H,MAAO58C,EAAQwkD,YAC3C,SAApBxkD,EAAQua,UAAuBva,EAAQkR,UAAUqB,SAAS,UAAYvS,EAAQkT,oBAC/ElT,EAAUA,EAAQkT,mBAGb,CAAC0pC,MAAO58C,EAAQyS,aAAa,QAAUzS,EAAQ43B,YAI1D,MAAMswB,EAAmD,eACnDC,EAAsD,CAACD,EAAiB,UAExEE,EAA6D,CADH,GAC4B,IACtFC,EAAiD,CACrD,CAAC,wBAAyB,SAC1B,CAAC,yBAA0B,WAC3B,CAAC,qBAAsB,QACvB,CAAC,wBAAyB,OAC1B,CAAC,yBAA0B,SAC3B,CAAC,gBAAiB,QAElB,CAAC,cAAe,QAChB,CAAC,aAAqB,KAiClBC,GAAqB,OAAc,GAAI,IAK9B,MAAMC,UAAiB,KAGpC1qD,YAAYiH,GACV+K,MACE/K,EACA,gBACA,IAAMwjD,GACN,GACA,EACA,GAII,KAAAE,qBAAuB,EAAErqD,OAAAA,EAAQS,QAAAA,MACvC,MAAM6pD,EAAW3qD,KAAK4qD,cAAc3nD,IAAI5C,GAIlCwqD,EAAWF,EAAS7lC,SAAS+lC,SAC7BC,EAA6B,GACnC,GAAGD,EAAU,CACXC,EAAYzoD,KAAKwoD,GACjB,MAAME,EAAiE,IAAIxpD,IACxET,GACDgqD,EAAYzoD,QAAQsoD,EAAS18B,MAAM1T,KAAI,EAAEpT,MAAAA,EAAOjF,QAAAA,MAO9C,MAAM8oD,EAAqB9oD,EAAQkT,kBAKnC,OAJA41C,EAAmBlqC,OAAM,GAEzBiqC,EAAapnD,IAAIqnD,EAAmB7jD,MAAO,IAAI/F,IAAI,CAAC4pD,KAE7C9oD,MAGT2oD,EAAS9pD,IAAIgqD,OAAqD/mD,OAAWA,GAAW,KAExF6mD,EAASI,cACTJ,EAASK,iBAAiBrhD,cAEpB/I,GACRgqD,EAAYzoD,QAAQsoD,EAAS18B,MAAM1T,KAAI,EAAErY,QAAAA,KAAaA,KAMxD,GAFAyoD,EAAS7lC,SAASmJ,MAAMk9B,mBAAmBL,GAExCD,IAAa/pD,EAAS,CACvB,MAAMiqD,EAAiE,IAAIxpD,IAC3EopD,EAAS18B,MAAMnpB,SAAQ,EAAE5C,QAAAA,MACvB,MAAM8oD,EAAqB9oD,EAAQkT,kBACnC41C,EAAmBlqC,QACnBiqC,EAAapnD,IAAIqnD,EAAmB7jD,MAAO,IAAI/F,IAAI,CAAC4pD,QAGhCH,EAAS9pD,IAAIgqD,OAAqD/mD,GAAW,KAkU/F,KAAAonD,eAAkBtjD,KACxB,EAAAgS,EAAA,GAAYhS,GAEZ,MAAM,OAACzH,GAAUyH,EAEjB,IAAG,EAAAgV,EAAA,GAAgBzc,EAAQ,kBAAmB,CAC5C,MAAM8K,GAAY,EAAA2R,EAAA,GAAgBzc,EAAQ,kBACpCsqD,EAAW3qD,KAAK4qD,cAAc3nD,IAAIkI,GACxC,GAAGw/C,EAASrB,MACV,OAIF,YADA,IAAI,IAAc,CAAC3hD,GAAIgjD,EAAShnD,IAAIgE,GAAIo7C,YAAa4H,EAAShnD,IAAIo/C,cAAc,GAAMh4B,OAIxF,MAAM+zB,EAAQmL,EAAoB5pD,GAClC,GAAIy+C,EAAJ,CAIA,GAAGA,EAAM33C,QAAUqW,EAAA,WAAqBxd,KAAK+H,SAAWyV,EAAA,OAAgB,CACtE,MAAMlJ,EAAIlJ,SAASC,cAAc,KASjC,OARAiJ,EAAEI,QAAU,KACVyc,EAAA,eAA0B,CAACk6B,SAAU,gBACrC,gBAEF,EAAAC,EAAA,IAAS,CACPC,YAAa,2BACbC,kBAAmB,CAACl3C,KAKxB6c,EAAA,6BAAwC2tB,GAAO,GAC5C,MACD,EAAArG,EAAA,OArUG5mB,OACL9f,MAAM8f,OAEN7xB,KAAKwS,QAAUpH,SAASuQ,eAAe,iBAEvC,MAAM8vC,EAAczrD,KAAKwS,QAAQk5C,uBAC3B1c,EAAOhvC,KAAKgvC,KAAOyc,EAAYr2C,kBAC/BozC,EAAaxoD,KAAKwoD,WAAa,IAAI,KAAYiD,GAE/CE,EAAc3rD,KAAK4vB,WAAa,IAAI,KAAW5vB,KAAKwS,QAAS,SAE7Do5C,EAAgD,CAACC,KAAMlE,EAAA,iBAC7D3nD,KAAK8rD,sBAAwB,IAAI,IAAsB9rD,KAAK0qD,qBAAsBkB,GAExE5rD,KAAK+rD,kBAAoB,iBAA8B/rD,KAAMgvC,EAAM2c,EAAanD,OAAYxkD,GAAtG,MAEMuX,GAAY,EAAA2mB,EAAA,GAAaliC,KAAKwS,SAAS,GAEvCgU,EAAI,IAAI,UAAYxiB,GAC1BwiB,EAAErb,UAAUiI,UAAUrS,IAAI,gCAE1B,MAAMirD,EAAqB5gD,SAASC,cAAc,OAClD2gD,EAAmB54C,UAAUrS,IAAI,yBACjCirD,EAAmBvgD,OAAO+a,EAAErb,WAvJhC,WACE,IAAI8gD,EAAsD,IAAI1qD,IAAI,CAChE,CAAC+oD,EAA8B,IAC/B,CAACD,EAAuB,MAG1B,IAAI,MAAMvL,KAAS,IAAO,CACxB,MACMp7B,EAAI,GADM,IAAMo7B,GAEhB6L,EAAWJ,GAAkB7mC,EAAE,GAAK,GAC1C,IAAIinC,EAAU,SAEd,IAAI7gD,EAAImiD,EAAOhpD,IAAI0nD,GACf7gD,IACFA,EAAI,GACJmiD,EAAOtoD,IAAIgnD,EAAU7gD,IAGvBA,GAAG4Z,EAAEgT,MAAM,IAAM,GAAKooB,EAGxBmN,EAAOhrD,OAAOspD,EAAiBxlC,OAC/BwlC,EAAiB9+B,QAAQ6+B,EAA8BD,GACvD,MAAM6B,EAAQ3B,EAAiBhwC,KAAI,EAAE5S,KAAQA,IACvCxH,EAAU,IAAI8rD,EAAO9rD,WAAWu5C,MAAK,CAACplC,EAAG26B,IAAMid,EAAMryC,QAAQvF,EAAE,GAAG,IAAM43C,EAAMryC,QAAQo1B,EAAE,GAAG,MAGjG,OAFAgd,EAAS,IAAI1qD,IAAIpB,GAEV8rD,EA8HLE,GAAUrnD,SAAQ,CAACsnD,GAASC,EAAkBz4C,MAC5C,MAAM+2C,EAAW3qD,KAAKssD,oBAAoBD,EAAkBA,EAAkBz4C,GAAOA,GACrF+2C,EAAS7lC,SAAS3Z,UAAUiI,UAAU7Q,OAAO,QAC7CooD,EAAS7lC,SAASmJ,MAAM7a,UAAUrS,IAAI6S,EAAO,WAAa,aAE1Dw4C,EAAOtnD,SAASynD,IAKd,MAAMzN,GAAQ,QAAoByN,GAiBlCvsD,KAAKwsD,mBAAmB7B,EAAU,CAAC7L,MAAAA,IAAQ,SAQ/Cp+B,QAAQkI,IAAI,EACV,EAAAtkB,EAAA,GAAM,KACNtE,KAAKgH,SAASylD,gBAAgBC,gBAAgB,UAC9C1sD,KAAKgH,SAASylD,gBAAgBC,gBAAgB,UAC9C1sD,KAAKgH,SAASylD,gBAAgBE,oBAC7Bt+C,MAAK,EAAEoB,EAAGouB,EAAQ+uB,EAAcC,MACjCtxC,EAAUhZ,SAEV,MAAMuqD,EAAiB9sD,KAAK+sD,WAAW3C,gBACjC4C,EAAuBhtD,KAAK+sD,WAAWE,IAE7C,CAAC,CAACH,EAAgBjvB,GAAkB,CAACmvB,EAAsBJ,IAAwB9nD,SAAQ,EAAE6lD,EAAU9sB,MACrG8sB,EAASn6B,MAzKS,GA0KlBqN,EAAOjQ,OA1KW,GA0KeiQ,EAAOh7B,OA1KtB,OA6KpB,IAAI,MAAMi8C,KAASjhB,EACjB79B,KAAKwsD,mBAAmBM,EAAgB,CAAChO,MAAAA,IAAQ,GAGnD9+C,KAAKktD,0BAA0BF,GAC/B,IAAI,MAAM7lD,KAASylD,EACjB5sD,KAAKwsD,mBAAmBQ,EAAsB,CAAClO,MAAO,GAAI33C,MAAAA,IAAQ,GAEpE6lD,EAAqBloC,SAAS3Z,UAAUG,MAAM6hD,WAAa,QAE3D5C,EAAiBzlD,SAAQ,EAAE6C,MACzB,MAAMgjD,EAAW3qD,KAAK+sD,WAAWplD,GACjC3H,KAAKotD,oBAAoBzC,GAAU,GAEhChjD,IAAOyiD,GAxO8C,KAwO3BziD,IAC3BgjD,EAASnC,WAAahiC,EACtBA,EAAErb,UAAUM,OAAOk/C,EAAS7lC,SAASsP,aAIzCp0B,KAAKqtD,mBAELP,EAAehoC,SAASsP,QAAQk5B,MAAMtB,GAEtCa,EAAKA,KAAK/nD,SAASnB,IACjB3D,KAAKutD,iBAAiB5pD,MAGxB6Z,EAAA,mBAA2B,kBAAkB,KAC3Cxd,KAAKwtD,0BAGPhwC,EAAA,mBAA2B,eAAgBxd,KAAKytD,gBAAgB9lD,IAC9D,MAAMgjD,EAAW3qD,KAAK+sD,WAAWplD,GAC9BgjD,IACD3qD,KAAK0tD,iBAAiB/C,GAAU,GAEhChD,EAAA,oBAAmC,mBAAmB,KACpD3nD,KAAK+rD,kBAAkB1C,gBAAgBsB,KACtC,CAAC38C,MAAM,SAId,MAAM2/C,EAAmBC,IACvB,IAAI,MAAMjmD,KAAM3H,KAAK+sD,WAAY,CAC/B,MACMlC,EADW7qD,KAAK+sD,WAAWplD,GACPmd,SAAS+lC,SAChCA,IACDA,EAASgD,wBAA0BD,EAC/BA,GACF/C,EAASiD,2BAAsB9pD,GAAW,MAMlD2jD,EAAA,oBAAmC,UAAU,KAC3CgG,GAAgB,MAGlBhG,EAAA,oBAAmC,SAAS,KAC1CgG,GAAgB,MAGlBnwC,EAAA,mBAA2B,sBAAuB7Z,KAC5C3D,KAAK+sD,WAAWppD,EAAIgE,KAAOhE,EAAI6J,OAAO4+C,QACxCpsD,KAAKutD,iBAAiB5pD,GAAK,MAI/B6Z,EAAA,mBAA2B,oBAAqB7Z,IAC9C,MAAMgnD,EAAW3qD,KAAK+sD,WAAWppD,EAAIgE,IACrC,GAAG3H,KAAK+tD,eAAepD,GAAW,CAChC,MAAM,SAACE,GAAYF,EAAS7lC,SACzB+lC,GACDA,EAASK,iBAAiBrhD,YAKhC2T,EAAA,mBAA2B,eAAgBxd,KAAKytD,gBAAgB3O,IAC9D,MAAM6L,EAAW3qD,KAAK+sD,WAAWjO,EAAM33C,MA3SiB,GA2SgBijD,GAElE9hD,EAA0Cw2C,EAAM33C,MAASnE,GAASA,EAAKmE,QAAU23C,EAAM33C,MAASnE,GAASA,EAAK87C,QAAUA,EAAMA,MAC9H38C,GAAQ,EAAA4+B,EAAA,GAAc4pB,EAAS18B,MAAO3lB,GAC5C,GAAGnG,GAED,GADAwoD,EAAS18B,MAAMxC,QAAQtpB,GACpBnC,KAAKguD,kBAAkBrD,GAAW,CACnC,MAAM,SAACE,GAAYF,EAAS7lC,UAC5B,EAAA6c,EAAA,GAAuBx/B,EAAMD,QAASyoD,EAAS7lC,SAASmJ,MAAO48B,EAAW,EAAI,GAAI,GAClFA,MAAAA,GAAAA,EAAUoD,oBAGZjuD,KAAKwsD,mBAAmB7B,EAAU7L,GAAO,GAAO,GAGvB,IAAxB9+C,KAAKkuD,gBACNluD,KAAK+rD,kBAAkBh9B,UAAU+vB,EAAM33C,MAAQnH,KAAK+sD,WAAW3C,gBAAmBO,OAItFx5B,EAAA,mBAA8B,gBAAgB,KAC5CnxB,KAAKwtD,0BAGPxtD,KAAKwtD,uBAELxtD,KAAK+rD,kBAAkBh9B,UAAU+9B,OAGnC,QAAiB9sD,KAAKwS,QAASxS,KAAKorD,iBACpC,OAA6B,CAACxI,SAAU5iD,KAAKwS,QAASd,eAAgB,IAAI,MAC1E1R,KAAK6xB,KAAO,KAGN07B,iBAAiB5pD,EAA4B+T,GACnD,MAAMizC,EAAW3qD,KAAKmuD,eAAexqD,GAAK,EAAA6kB,EAAA,GAAc7kB,EAAImL,QAC5D9O,KAAK0tD,iBAAiB/C,EAAUjzC,GAChC,MAAM,UAACvM,EAAS,eAAEijD,GAAkBzD,EAAS7lC,SAC7C6lC,EAAS7lC,SAASmJ,MAAM7a,UAAUrS,IAAI,aACtC4pD,EAAS7lC,SAAS3Z,UAAUiI,UAAUrS,IAAI,kBAC1C4pD,EAAS7lC,SAAShW,MAAMsE,UAAUrS,IAAI,SAEtCf,KAAKktD,0BAA0BvC,GAEf3qD,KAAKgH,SAASg8C,mBAAmBC,cAAct/C,GACvD0K,MAAK,EAAEu1C,UAAAA,MACbA,EAAU9+C,SAASsG,IACjBpL,KAAKwsD,mBAAmB7B,EAAU,CAACxjD,MAAOiE,EAASzD,GAAIm3C,MAAQ1zC,EAA+BijD,kBAAkB,MAOlHruD,KAAK0qD,qBAAqB,CAACrqD,OAAQsqD,EAAS7lC,SAAS3Z,UAAWrK,QAASd,KAAKguD,kBAAkBrD,KAEhGA,EAAS2D,yBACTnjD,EAAUiI,UAAU7Q,OAAO,YAG7B,OAAoB,CAClBoB,IAAAA,EACAwH,UAAWijD,EACX9tD,MAAO,KACPsd,cAAe,mBACfgF,MAAO,GACPI,OAAQ,GACRze,UAAU,IAIFwD,aACV,OAAOopB,EAAA,cAGDq8B,uBACN,MAAM7C,EAAW3qD,KAAK+sD,WAAWE,IAC3BsB,EAAa/wC,EAAA,WAAqBxd,KAAK+H,SAAWyV,EAAA,OACxDzL,MAAMq7C,oBAAoBzC,IAAYA,EAAS18B,MAAMprB,QAAU0rD,GAC/DvuD,KAAKwS,QAAQY,UAAUxJ,OAAO,cAAe2kD,GAGrCnB,oBAAoBzC,EAA4B7pD,GA7XI,KA8XzD6pD,EAAShjD,GAKZoK,MAAMq7C,oBAAoBzC,EAAU7pD,GAJlCd,KAAKwtD,uBAODN,0BAA0BvC,GAChC,MAAME,EAAW,YAAkC,CACjD2D,eAAgB,KAChBC,gBAAiB9kC,EAAA,0BAGnBghC,EAAS7lC,SAAS+lC,SAAWA,EAC7BF,EAAS7lC,SAASmJ,MAAMxiB,OAAOo/C,GAGzB2B,mBAAmB7B,EAA4B7L,EAA+C4P,EAAiBh3C,GACrH,IAAIxV,EACJ,GAAG48C,EAAM33C,MAAO,CACd,MAAM6jD,EAAqB,YAA0BlM,EAAM33C,OACrDktB,EAAOjpB,SAASC,cAAc,QACpCgpB,EAAKjhB,UAAUrS,IAAmB,eAClCszB,EAAK5oB,OAAOu/C,GACZ9oD,EAAUmyB,OAEVnyB,EAAUynD,EAAY7K,EAAMA,WAAwD96C,GAAW,GAGjG,MAAMhB,EAAI,+BACL87C,GAAK,CACR58C,QAAAA,IAGFyoD,EAAS18B,MAAMvW,EAAU,UAAY,QAAQ1U,GACzC0rD,GAAU1uD,KAAK2uD,aAAahE,IAC9B3qD,KAAK4uD,sBAAsBjE,GAoDxBvb,UACLpvC,KAAKkuD,eAAiBluD,KAAK4vB,WAAWoG,a,wKEllB3B,MAAM64B,UAA4B,IAG/C9uD,YACE+uD,EACUC,EACV5hC,GAEApb,MAAM+8C,GAHI,KAAAC,mBAAAA,EAJJ,KAAAC,YAAiD,IAAIztD,IAS3DvB,KAAK+nD,YAAc,IAAI,KAAuB/kD,I,MAC5C,MAAM,OAAC3C,EAAM,QAAES,GAAWkC,EAEpBisD,EAAYjvD,KAAKgvD,YAAY/rD,IAAI5C,GACvC4uD,EAAUnuD,QAAUA,EAEjBA,GACDmuD,EAAUC,SAAU,EAChBlvD,KAAKmvD,MAAMv6C,SAASq6C,IACtBjvD,KAAKmvD,MAAM9sD,KAAK4sD,KAGlB,EAAAG,EAAA,GAAiBpvD,KAAKmvD,MAAOF,GAGR,QAAvB,EAAAjvD,KAAK+uD,0BAAkB,mBAAG/rD,GAC1BhD,KAAKqvD,2BACJliC,GAGErM,QACL/O,MAAM+O,QACN9gB,KAAKgvD,YAAYluC,QAYZpd,QAAQ9C,GACbZ,KAAKgvD,YAAYrrD,IAAI/C,EAAG0pB,IAAK1pB,GAC7BmR,MAAMrO,QAAQ9C,GAGTkC,UAAUlC,GACfZ,KAAKgvD,YAAY/tD,OAAOL,EAAG0pB,KAC3BvY,MAAMjP,UAAUlC,I,ucCrBb,MAAM0uD,EAIXvvD,YACUwvD,EACAjvD,EACA0G,EACAmmB,GAHA,KAAAoiC,qBAAAA,EACA,KAAAjvD,MAAAA,EACA,KAAA0G,SAAAA,EACA,KAAAmmB,QAAAA,EANF,KAAAqiC,SAA6B,IAAIpuD,IAwDjC,KAAAquD,wBAA0B,CAACvtD,EAAsBpB,KAEvChB,EAAA,gBAAmCoC,GAC3C4C,SAAS1C,IACXtB,EAGFhB,EAAA,iBAAoCsC,GAAQ,GAF5CtC,EAAA,kBAAqCsC,OAOnC,KAAAstD,eAAuBxtD,GAAyB,EAAD,gCACrD,MAAMiF,EAAQjF,EAAQyjB,QAAQxe,MACxBxF,QAAY3B,KAAKgH,SAASC,eAAeC,OAAOC,GAEhDS,EAAO+hB,EAAA,0BAIPrb,GAAU,QAAY,CAC1B3M,IAAAA,EACA2oB,IAAKpoB,EACL0gB,MAAOhb,EACPob,OAAQpb,EACRgW,cAAe,KACftd,MAAON,KAAKM,MACZ6tC,WAAW,EACX3pC,MAAM,EACNf,MAAM,EACNogD,UAAU,IACTx1C,MAAK,EAAEo5B,OAAAA,KAAYA,IAWtB,OATAn5B,EAAQD,MAAK,KAEXrO,KAAKyvD,wBAAwBvtD,EAASlC,KAAK4d,cAAcmqC,YAAYpoC,UAAUzd,OAO1EoM,KAGF,KAAAqhD,iBAAyBztD,GAAyB,EAAD,gCACtD,MAAMiF,EAAQjF,EAAQyjB,QAAQxe,MACxBxF,QAAY3B,KAAKgH,SAASC,eAAeC,OAAOC,GAItDnH,KAAKyvD,wBAAwBvtD,GAAS,GAEtCA,EAAQoW,YAAc,GACtBtY,KAAK4vD,cAAcjuD,EAAKO,MAtGxBlC,KAAK4d,cAAgB,IAAIixC,OAAoB7qD,GAAW,EAAE3D,OAAAA,EAAQS,QAAAA,MAC5DA,GACFd,KAAK2vD,iBAAiBtvD,KAEvB8sB,GAGErM,QACL9gB,KAAK4d,cAAckD,QAGd8uC,cAAcjuD,EAAiBO,EAAuB8wB,GAqB3D,OApBI9wB,KACFA,EAAUkJ,SAASC,cAAc,QACzB+H,UAAUrS,IAAI,YAAa,iBACnCmB,EAAQyjB,QAAQxe,MAAQ,GAAKxF,EAAIgG,GAE9BhG,EAAI6tD,UACLxvD,KAAK6vD,gBAAgB3tD,KAKF,QAAY,CACjCP,IAAAA,EACA2oB,IAAKpoB,EACL0b,cAAe5d,KAAKuvD,qBACpBjvD,MAAON,KAAKM,MACZ6tC,UAAWxsC,EAAI6tD,SACfx8B,aAAAA,IAGK9wB,EAGF2tD,gBAAgB3tD,GACrBlC,KAAKwvD,SAASzuD,IAAImB,GAClBlC,KAAK4d,cAAcla,QAAQ,CACzB4mB,IAAKpoB,EACLU,KAAM5C,KAAK0vD,iBAIRI,kBAAkB5tD,GACvBlC,KAAKwvD,SAASvuD,OAAOiB,GACrBlC,KAAK4d,cAAc3c,OAAO,CAACqpB,IAAKpoB,KA+D7B,MAAM6tD,EAuBXhwD,YAAYotB,G,QAUV,MAAMhiB,EAAYC,SAASC,cAAc,OACzCF,EAAUiI,UAAUrS,IAAI,kBAExB,MAAMktB,EAAQ7iB,SAASC,cAAc,OAGrC,IAAIyD,EAOAslB,EAAsBg6B,EAT1BngC,EAAM7a,UAAUrS,IAAI,kBAGjBosB,EAAQre,QACTA,EAAQ1D,SAASC,cAAc,OAC/ByD,EAAMsE,UAAUrS,IAAI,kBACpB+N,EAAMrD,OAAO0hB,EAAQre,QAInBqe,EAAQ6iC,YACV57B,GAAU,YAAWpwB,EAAW,CAACua,UAAU,IAC3C6V,EAAQhhB,UAAUrS,IAAI,4BAEtBqtD,EAAiBhjD,SAASC,cAAc,OACxC+iD,EAAeh7C,UAAUrS,IAAI,oCAE7BqzB,EAAQ3oB,OAAO2iD,IAGdt/C,GAAO3D,EAAUM,OAAOqD,GAC3B3D,EAAUM,OAAOwiB,GAEjBjuB,KAAK8kB,SAAW,CACd3Z,UAAAA,EACA2D,MAAAA,EACAmf,MAAAA,EACAmG,QAAAA,EACAg6B,eAAAA,GAEFpuD,KAAK2H,GAAKwlB,EAAQxlB,GAClB3H,KAAKiuB,MAAQ,GAEbjuB,KAAKiwD,iBAAmB9iC,EAAQ8iC,iBAChCjwD,KAAKkwD,oBAAsB/iC,EAAQ+iC,oBACnClwD,KAAKmwD,KAAmB,QAAZ,EAAAhjC,EAAQgjC,YAAI,QAAI,EAC5BnwD,KAAKowD,KAAmB,QAAZ,EAAAjjC,EAAQijC,YAAI,QAAI,EAGvB9B,yBACL,MAAO1rC,MAAOytC,GAAkBrwD,KAAKiwD,mBAC/BK,EAActwD,KAAKkwD,sBAAsBttC,MAE/C,IAAI2tC,EAAcF,EAAiBC,EAChCtwD,KAAKmwD,OAASI,EAAc,GAAKvwD,KAAKmwD,KAAOE,KAAkBE,EAClEA,EAAchqD,KAAK4pC,MAAMogB,GAEzB,MAAMC,EAAOjqD,KAAK6pC,KAAKpwC,KAAKiuB,MAAMprB,OAAS0tD,GAC3C,IAAIvtC,EAASwtC,EAAOF,EACjBtwD,KAAKowD,OAAMptC,IAAWwtC,EAAO,GAAKxwD,KAAKowD,MAE1CpwD,KAAK8kB,SAASmJ,MAAM3iB,MAAMmlD,UAAYztC,EAAS,MAI5C,MAAM0tC,EAmBX3wD,YACYiH,EACA2pD,EACAT,EACAzmC,EACA0mC,EACAC,GALA,KAAAppD,SAAAA,EACA,KAAA2pD,uBAAAA,EACA,KAAAT,oBAAAA,EACA,KAAAzmC,QAAAA,EACA,KAAA0mC,KAAAA,EACA,KAAAC,KAAAA,EAbF,KAAA3V,SAAU,EAyIV,KAAA4S,iBAAmB,KAC3B,IAAI,MAAOliD,EAAWw/C,KAAa3qD,KAAK4qD,cACtCD,EAAS2D,0BA4CH,KAAAb,eAAqBx9C,GACtB,IAAI2gD,KACNjJ,EAAA,cACD3nD,KAAK6wD,gBAAgBxuD,KAAK,CAAC4N,GAAAA,EAAI2gD,KAAAA,IAE/B3gD,KAAM2gD,IA7KV5wD,KAAK+sD,WAAa,GAClB/sD,KAAK4qD,cAAgB,IAAIrpD,IACzBvB,KAAK8wD,uBAAyB,IAAIvvD,IAClCvB,KAAK+wD,gBAAkB,GACvB/wD,KAAK6wD,gBAAkB,GAGlB5H,uBAAuB99C,GAC5B,OAAOnL,KAAK4qD,cAAc3nD,IAAIkI,GAGzBg+C,qBAAqB/0B,GAC1B,OAAOp0B,KAAK8wD,uBAAuB7tD,IAAImxB,GAG/B+5B,eAAerL,EAAwBh0C,EAAuCkiD,EAAmBhB,GACzG,MAAMrF,EAAqB,IAAIoF,EAAoB,CACjDpoD,GAAI,GAAKm7C,EAAWn7C,GACpBmH,MAAAA,EACAqT,gBAAiBniB,KAAKwS,QACtBy9C,iBAAkB,KAChB,MAAM,MAACrtC,EAAK,OAAEI,GAAUhjB,KAAKwS,QAAQsP,wBACrC,MAAO,CAACc,MAAOA,EAAQ5iB,KAAKypB,QAASzG,OAAAA,IAEvCktC,oBAAqBlwD,KAAKkwD,oBAC1BC,KAAMnwD,KAAKmwD,KACXC,KAAMpwD,KAAKowD,KACXJ,UAAAA,IAGChwD,KAAK2wD,wBACNhG,EAAS7lC,SAASmJ,MAAM7a,UAAUrS,IAAIf,KAAK2wD,wBAG7C,MAAMxlD,EAAYw/C,EAAS7lC,SAAS3Z,UAepC,OAdAA,EAAUiI,UAAUrS,IAAI,QAExB4pD,EAAShnD,IAAMm/C,EACf9iD,KAAK+sD,WAAWjK,EAAWn7C,IAAMgjD,EACjC3qD,KAAK4qD,cAAcjnD,IAAIwH,EAAWw/C,IACjCqF,GAAahwD,KAAK8wD,uBAAuBntD,IAAIgnD,EAAS7lC,SAASsP,QAASu2B,GAEzE3qD,KAAK8rD,sBAAsBpoD,QAAQyH,IAClC6kD,GAAahwD,KAAK+rD,kBAAkBhD,kBAAkBkI,2BAA2B9lD,GAE9E6lD,IACDhB,GAAarF,EAAS7lC,SAASsP,QAAQhhB,UAAUrS,IAAI,aAGjD4pD,EAGC+C,iBAAiB/C,EAAoBjzC,GAC7C,MAAM,QAAC0c,EAAO,UAAEjpB,GAAaw/C,EAAS7lC,SAChCosC,EAAWx5C,EAAU1X,KAAK+wD,gBAAgBz4B,QAAQqyB,GAAaA,EAASlQ,UAAS53C,OAAS,MAChG,IAAIsuD,GAAkB,EACtB,MAAMC,EAAU15C,EAAU1X,KAAK+wD,gBAAgBz4B,QAAQqyB,GAClDA,EAASnC,aAAe2I,GACzBA,GAAkB,GACX,GAGFxG,EAASlQ,UAAYkQ,EAASnC,YAAcmC,EAAS7lC,SAASsP,UACpEvxB,OAAS,OACZ,EAAA8+B,EAAA,GAAuBx2B,EAAWnL,KAAK4vB,WAAWzkB,UAAW+lD,IAC7D,EAAAvvB,EAAA,GAAuBvN,EAASp0B,KAAKgvC,KAAMoiB,GAGnCpD,kBAAkBrD,GAC1B,OAAO3qD,KAAK8rD,sBAAsB9D,aAAapzC,SAAS+1C,EAAS7lC,SAAS3Z,WAGlEiiD,oBAAoBzC,EAAoB7pD,G,MAChD,GAAIA,EAGG,CACL,MAAMgI,EAAM9I,KAAK+wD,gBAAgBl3C,QAAQ8wC,GACnC1xB,EAASj5B,KAAK+wD,gBAAgBr6B,MAAM,EAAG5tB,GAC7C,IAAIuoD,EAAkB,EAAGC,EAAkB,EAC3Cr4B,EAAOn0B,SAAS6lD,IACVA,EAASlQ,QAGFkQ,EAAS7lC,SAASsP,UAAWu2B,EAASnC,cAC7C8I,KAHAD,IACAC,MAKN,MAAMC,EAAWzoD,EAAMuoD,EAAiBG,EAAU1oD,EAAMwoD,EACxD3G,EAAS7lC,SAASsP,UAAW,EAAAuN,EAAA,GAAuBgpB,EAAS7lC,SAASsP,QAASp0B,KAAKgvC,KAAMwiB,IAC1F,EAAA7vB,EAAA,GAAuBgpB,EAAS7lC,SAAS3Z,UAAWnL,KAAK4vB,WAAWzkB,UAAWomD,QAhBtD,QAAzB,EAAA5G,EAAS7lC,SAASsP,eAAO,SAAE7xB,SAC3BooD,EAAS7lC,SAAS3Z,UAAU5I,SAkB9BooD,EAASlQ,QAAU35C,EAIXwrD,oBAAoB3kD,EAAYmH,EAAyB8E,EAAeo8C,GAChF,MAAMrF,EAAW3qD,KAAKmuD,eAAe,CAACxmD,GAAAA,GAAYmH,IAAS,QAAKA,IAAQ,EAAMkhD,GAgB9E,OAfArF,EAASrB,OAAQ,EACjBtpD,KAAK+wD,gBAAgB1uD,KAAKsoD,GACvBA,EAAS7lC,SAAShW,OACnB67C,EAAS7lC,SAAShW,MAAMsE,UAAUrS,IAAI,iBAGpCivD,IACCp8C,GACD+2C,EAAS7lC,SAASsP,QAAQhhB,UAAUrS,IAAI,QAAS,SAAW6S,GAG9D+2C,EAAS7lC,SAASspC,eAAe7rD,UAGnCvC,KAAKotD,oBAAoBzC,GAAU,GAC5BA,EAGCiE,sBAAsBjE,GAC9BA,EAAS2D,yBACTtuD,KAAKotD,oBAAoBzC,IAAYA,EAAS18B,MAAMprB,QAS5CkrD,eAAepD,GACvB,QAAGA,IACDA,EAAS7lC,SAAS3Z,UAAU5I,SAC5BooD,EAAS7lC,SAASsP,QAAQ7xB,SAC1BvC,KAAK8rD,sBAAsBhpD,UAAU6nD,EAAS7lC,SAAS3Z,kBAChDnL,KAAK+sD,WAAWpC,EAAShjD,IAChC3H,KAAK4qD,cAAc3pD,OAAO0pD,EAAS7lC,SAAS3Z,WAC5CnL,KAAK8wD,uBAAuB7vD,OAAO0pD,EAAS7lC,SAASsP,UAE9C,GAMDu6B,aAAahE,GACrB,QAAsB3mD,IAAnB2mD,EAASn6B,MACV,OAAO,EAGT,MAAM,MAACvC,EAAK,MAAEuC,GAASm6B,EAOvB,OANA18B,EAAML,OAAO4C,EAAOvC,EAAMprB,OAAS2tB,GAAO1rB,SAAQ,EAAE5C,QAAAA,MAClDA,EAAQK,YAGVvC,KAAK4uD,sBAAsBjE,IAEpB,EAGF94B,OACL81B,EAAA,oBAAmC,UAAU,KAC3C3nD,KAAK6wD,gBAAgB/rD,SAAQ,EAAEmL,GAAAA,EAAI2gD,KAAAA,MACjC3gD,KAAM2gD,MAGR5wD,KAAK6wD,gBAAgBhuD,OAAS,MAgBrB,MAAM4uD,UAAoBf,EAGvC3wD,YAAYiH,GACV+K,MACE/K,EACA,kBACA,IAAM2iB,EAAA,qBACN,EACA,EACA,GAuDI,KAAA+gC,qBAAuB,EAAErqD,OAAAA,EAAQS,QAAAA,EAASV,MAAAA,MAChD,MAAMuqD,EAAW3qD,KAAK4qD,cAAc3nD,IAAI5C,GACxCsqD,EAAS7lC,SAASmJ,MAAMk9B,mBAAqBrqD,EAAe6pD,EAAS18B,MAAM1T,KAAI,EAAErY,QAAAA,KAAaA,IAAvC,KA0SlD,KAAAwvD,UAAY,CAACrlB,GAAS,MACvBA,GAAYsb,EAAA,eAAgCA,EAAA,SAA0B3nD,OAI1Ewd,EAAA,gBAAwB,oBAAqB6uB,IApWvCslB,cAAcnhC,GACHxwB,KAAK+sD,WAAkB,MAC/Bv8B,MAAQA,EAGXohC,uBACNjH,EACAr8C,GAEA,MAAM,UAACnD,GAAaw/C,EAAS7lC,SAE7BxW,EAAQD,MAAMu1C,IACZ,MAAMjkC,EAAY3f,KAAKguD,kBAAkBrD,GAEzC/G,EAAU9+C,SAASsG,IACjB,MAAMlJ,EAAUlC,KAAK6xD,qBAAqBjC,cAAcxkD,GACxDu/C,EAAS18B,MAAM5rB,KAAK,CAAC+I,SAAAA,EAAUlJ,QAAAA,IAE5Byd,GACDgrC,EAAS7lC,SAASmJ,MAAMxiB,OAAOvJ,MAInCyoD,EAAS2D,yBACTnjD,EAAUiI,UAAU7Q,OAAO,WAIjBgrD,iBAAiB5pD,EAA4B+T,GAAU,G,yCACnE,MAAMizC,EAAW3qD,KAAKmuD,eAAexqD,GAAK,EAAA6kB,EAAA,GAAc7kB,EAAImL,SACtD,eAACs/C,GAAkBzD,EAAS7lC,SAE5BxW,EAAUtO,KAAKgH,SAASg8C,mBAAmBC,cAAct/C,GAC/D3D,KAAK4xD,uBACHjH,EACAr8C,EAAQD,MAAMy0C,GAAeA,EAAWc,aAG1C5jD,KAAK0tD,iBAAiB/C,EAAUjzC,IAEhC,OAAoB,CAClB/T,IAAAA,EACAwH,UAAWijD,EACX9tD,MAAO,KACPsd,cAAe,mBACfgF,MAAO,GACPI,OAAQ,GACRze,UAAU,OASPstB,OACL9f,MAAM8f,OAEN7xB,KAAKwS,QAAUpH,SAASuQ,eAAe,oBACvC,MAAM8vC,EAAczrD,KAAKwS,QAAQk5C,uBAC3B1c,EAAOhvC,KAAKgvC,KAAOyc,EAAYr2C,kBAC/BozC,EAAaxoD,KAAKwoD,WAAa,IAAI,KAAYiD,GAErDzrD,KAAK4vB,WAAa,IAAI,KAAW5vB,KAAKwS,QAAS,YAC/CxS,KAAK4vB,WAAWpc,mBAAqB,KACnCxT,KAAK0xD,aAoBP,MAAM9F,EAAgD,CAACC,KAAMlE,EAAA,iBAC7D3nD,KAAK8rD,sBAAwB,IAAI,IAAsB9rD,KAAK0qD,qBAAsBkB,GAElF,MAAMkG,EAAsBnH,IAC1BA,EAAS7lC,SAASmJ,MAAMk9B,kBACxBR,EAAS18B,MAAMnpB,SAAQ,EAAE5C,QAAAA,KAAalC,KAAK6xD,qBAAqB/B,kBAAkB5tD,KAClFyoD,EAAS18B,MAAMprB,OAAS,GAG1B7C,KAAK4vB,WAAWzkB,UAAUwC,iBAAiB,SAAU7F,IACnD,MAAMzH,EAASyH,EAAEzH,OACjB,IAAG,EAAAyc,EAAA,GAAgBzc,EAAQ,kBAA3B,CACE,MAAM8K,GAAY,EAAA2R,EAAA,GAAgBzc,EAAQ,kBACpCsqD,EAAW3qD,KAAK4qD,cAAc3nD,IAAIkI,GACxC,GAAGw/C,EAASrB,MACV,OAGF,IAAI,IAAc,CAAC3hD,GAAIgjD,EAAShnD,IAAIgE,GAAIo7C,YAAa4H,EAAShnD,IAAIo/C,cAAch4B,YAIlF,kBAA+BjjB,MAGjC9H,KAAK+rD,kBAAoB,iBAA8B/rD,KAAMgvC,EAAMhvC,KAAK4vB,WAAY44B,GAEpF,MAAMjtC,GAAY,EAAA2mB,EAAA,GAAaliC,KAAKwS,SAAS,GAEvCu/C,EAAqB,CAACpH,EAAgDqH,KAKvErH,EAASn6B,QACVwhC,EAAWA,EAASt7B,MAAM,EAAGi0B,EAASn6B,QAGxC,MAAMoP,EAAM,IAAIx+B,IAAI4wD,EAASz3C,KAAK5Y,GAAQA,EAAIgG,OAC9C,EAAAs8C,EAAA,GAAe0G,EAAS18B,OAAQjrB,IAC1B48B,EAAIv8B,IAAIL,EAAKoI,SAASzD,KACxB3H,KAAKiyD,cAActH,EAAU3nD,EAAKoI,UAAU,MAIhDpL,KAAKotD,oBAAoBzC,IAAYqH,EAASnvD,SAC9C,EAAAohD,EAAA,GAAe+N,GAAU,CAACrwD,EAAKmH,KAC7B9I,KAAKkyD,eAAevH,EAAUhpD,GAAK,EAAMmH,MAE3C9I,KAAK2uD,aAAahE,GAClBA,EAAS7lC,SAAS3Z,UAAUiI,UAAU7Q,OAAO,SAGzC4vD,EAAgBnyD,KAAKssD,oBAAoB,QAAS,mBAAoB,iBAGtEQ,EAAiB9sD,KAAKssD,oBAAoB,SAAU,kBAAmB,UAC7EQ,EAAet8B,MAAQ,GAEvB,MAAM4hC,GAAc,OAAW,QAAS,CAAC7zC,UAAU,IACnDuuC,EAAehoC,SAAShW,MAAMrD,OAAO2mD,IACrC,QAAiBA,GAAa,MAC5B,EAAArV,EAAA,GAAkB,CAChBsV,aAAc,gCACdC,mBAAoB,kCACpBt8C,OAAQ,CACNu8C,QAAS,WAEVlkD,MAAK,KACNrO,KAAKgH,SAASg8C,mBAAmBwP,wBAChCj7B,EAAA,MAGL,MAAMk7B,EAAkBzyD,KAAKssD,oBAAoB,UAAW,wBACtDxiD,EAAIsB,SAASC,cAAc,QACjCvB,EAAEsJ,UAAUrS,IAAI,aAAc,iBAC9B0xD,EAAgB3tC,SAASsP,QAAQ3oB,OAAO3B,GAExC,MAAM2tB,EAAW,CACf/W,QAAQkI,IAAI,CACV5oB,KAAKgH,SAAS0rD,WAAWC,SAAS,iBAClC3yD,KAAKgH,SAASg8C,mBAAmB4P,6BAChCvkD,MAAK,EAAEmiB,EAAOwhC,MACfhyD,KAAK2xD,cAAcnhC,GACnBuhC,EAAmBI,EAAeH,MAGpChyD,KAAKgH,SAASg8C,mBAAmB6P,4BAA4BxkD,MAAM2jD,IACjED,EAAmBjF,EAAgBkF,MAGrChyD,KAAKgH,SAASg8C,mBAAmB8P,iBAAiBzkD,MAAMoiB,IACtD,IAAI,MAAM9sB,KAAQ8sB,EAAgDo8B,KAChE7sD,KAAKutD,iBAAiB5pD,MAI1B3D,KAAKgH,SAASg8C,mBAAmB+P,qBAAqB1kD,MAAM2jD,IAC1D,MAAMnvD,EAASmvD,EAASnvD,OACxB7C,KAAKotD,oBAAoBqF,EAAiBj1C,EAAA,aAAuB3a,GACjE7C,KAAK4xD,uBAAuBa,EAAiB/xC,QAAQxS,QAAQ8jD,IAE7Dx0C,EAAA,mBAA2B,kBAAmBw1C,IAC5ChzD,KAAKotD,oBAAoBptD,KAAK+sD,WAAoB,QAAGiG,KAAenwD,UAK1E6d,QAAQuyC,KAAKx7B,GAAU5f,SAAQ,KAC7B0D,EAAUhZ,YAGZme,QAAQkI,IAAI6O,GAAU5f,SAAQ,KAC5B7X,KAAKy6C,SAAU,EACfz6C,KAAK0xD,YAEL,MAAMS,EAAgBnyD,KAAK+sD,WAAkB,MACvCD,EAAiB9sD,KAAK+sD,WAAmB,OAC/C/sD,KAAK+rD,kBAAkBh9B,UAAUojC,EAAclkC,MAAMprB,OAASsvD,EAAgBrF,GAE9EtvC,EAAA,mBAA2B,sBAAuB7Z,IAC5C3D,KAAK+sD,WAAWppD,EAAIgE,KACtB3H,KAAKutD,iBAAiB5pD,GAAK,SAKjC3D,KAAK6xD,qBAAuB,IAAIvC,EAAqB,mBAAiC,KAAuBtvD,KAAKgH,SAAU4kD,GAE5H,MAAMsH,EAAwBlzD,KAAK6xD,qBAAqBj0C,cACxD+pC,EAAA,0BAAyCuL,EAAuBlzD,KAAK6xD,qBAAqBlC,kBA4B1FnyC,EAAA,mBAA2B,mBAAmB,EAAE5b,KAAAA,EAAMwJ,SAAAA,EAAU+nD,MAAAA,MAK9D,MAAMxI,EAAW3qD,KAAK+sD,WAAoB,UAATnrD,EAAmB,QAAU,UAC3D+oD,IACEwI,EACDnzD,KAAKkyD,eAAevH,EAAUv/C,GAE9BpL,KAAKiyD,cAActH,EAAUv/C,OAKnCoS,EAAA,mBAA2B,oBAAoB,EAAE7V,GAAAA,MAC/C,MAAMgjD,EAAW3qD,KAAK+sD,WAAWplD,GAC9B3H,KAAK+tD,eAAepD,IACrBmH,EAAmBnH,MAIvBntC,EAAA,mBAA2B,eAAgBxd,KAAKytD,gBAAgB9lD,IAC9D,MAAMgjD,EAAW3qD,KAAK+sD,WAAWplD,GAC9BgjD,IACD3qD,KAAK0tD,iBAAiB/C,GAAU,GAChChD,EAAA,oBAAmC,mBAAmB,KACpD3nD,KAAK+rD,kBAAkB1C,gBAAgBsB,KACtC,CAAC38C,MAAM,SAIdwP,EAAA,mBAA2B,oBAAoB,EAAE5b,KAAAA,EAAMowD,SAAAA,MACrD,MAAMrH,EAAW3qD,KAAK+sD,WAAoB,UAATnrD,EAAmB,QAAU,UAC3D+oD,GACDoH,EAAmBpH,EAAUqH,MAIjCx0C,EAAA,mBAA2B,cAAc,KACvCxd,KAAKgH,SAAS0rD,WAAWC,SAAS,iBAAiBtkD,MAAMmiB,IACvDxwB,KAAK2xD,cAAcnhC,SAIvB7G,EAAA,mBAA4B,SAAU3pB,KAAKqtD,mBAE3C,OAA6B,CAACzK,SAAU5iD,KAAKwS,QAASd,eAAgB,IAAI,MAE1E,MAAM9P,EAA2B,QACjC,EAAAwxD,EAAA,GAA0B,CACxBxQ,SAAU5iD,KAAKwS,QACf6gD,aAAehzD,MAAa,EAAAw1C,EAAA,GAAcx1C,EAAQL,KAAK+sD,WAAmB,OAAEjoC,SAASmJ,OACrFkhB,OAAQ,KACNwY,EAAA,qBAAoC/lD,GAAM,IAE5CwtC,QAAS,KACPuY,EAAA,qBAAoC/lD,GAAM,MAI9C5B,KAAK6xB,KAAO,KAGPogC,cAActH,EAAgDhpD,EAAiB+sD,GACpF,MAAM1rD,GAAO,EAAA+9B,EAAA,GAAc4pB,EAAS18B,OAAQjrB,GAASA,EAAKoI,SAASzD,KAAOhG,EAAIgG,KAC3E3E,IACDA,EAAKd,QAAQK,SAETmsD,GACF1uD,KAAK4uD,sBAAsBjE,IAK1BuH,eAAevH,EAAgDhpD,EAAiB+sD,EAAiB5lD,GACtG,QAAW9E,IAAR8E,EAAmB,CACpB,MAAM4a,EAAIinC,EAAS18B,MAAMnlB,GACzB,GAAG4a,GAAKA,EAAEtY,SAASzD,KAAOhG,EAAIgG,GAC5B,OAIJ,IAAI3E,GAAO,EAAA+9B,EAAA,GAAc4pB,EAAS18B,OAAQjrB,GAASA,EAAKoI,SAASzD,KAAOhG,EAAIgG,KACxE3E,IACFA,EAAO,CACLd,QAASlC,KAAK6xD,qBAAqBjC,cAAcjuD,GACjDyJ,SAAUzJ,IAIdgpD,EAAS18B,MAAMxC,QAAQzoB,GACvB2nD,EAAS7lC,SAASmJ,MAAMvW,QAAQ1U,EAAKd,SAEjCwsD,GACF1uD,KAAK2uD,aAAahE,GAIf2I,qBAAqB3xD,GAC1B3B,KAAKgH,SAASg8C,mBAAmBuQ,kBAAkB5xD,EAAIgG,IAGlD6rD,oBAAoB7xD,GACzB3B,KAAKgH,SAASg8C,mBAAmBuQ,kBAAkB5xD,EAAIgG,IAAI,GAWtDi+C,WACL5lD,KAAK0xD,WAAU,GAGVjM,WACLzlD,KAAK0xD,YACL1xD,KAAKqtD,sB,2DCl0BM,SAASoG,EAAiBC,GACvC,MAAMr/B,EAAOjpB,SAASC,cAAc,QAGpC,OAFAgpB,EAAKjhB,UAAUrS,IAAI,eACnB,QAAMszB,EAAMq/B,EAAS,cAAgB,eAC9Br/B,I,uHCIM,MAAMs/B,UAA6B,IAChD5zD,YAAY+uD,EAAkCC,GAC5Ch9C,MAAM+8C,GADsC,KAAAC,mBAAAA,EAG5C/uD,KAAK+nD,YAAc,IAAI,KAAuB/kD,IAC5C,MAAM,OAAC3C,EAAM,QAAES,GAAWkC,EACpB4wD,GAAU,EAAAC,EAAA,GAAiB7zD,KAAKmvD,OAAQzrC,GAAMA,EAAE4G,MAAQjqB,IAC3DS,GAAW8yD,EAAQ/wD,QACpB+wD,EAAQ9uD,SAAS9B,IACfhD,KAAKmvD,MAAM1jC,QAAQzoB,MAIvBhD,KAAK+uD,oBAAsB/uD,KAAK+uD,mBAAmB/rD,GACnDhD,KAAKqvD,4BAIF3rD,QAAQ9C,GACbmR,MAAMrO,QAAQ9C,I,6TCPH,MAAMkzD,EAMnB/zD,YACUmC,EACA5B,EACAsvB,EACR1E,GAAS,GAHD,KAAAhpB,QAAAA,EACA,KAAA5B,MAAAA,EACA,KAAAsvB,WAAAA,EAPF,KAAAmkC,cAA0CrzC,QAAQxS,UAClD,KAAAmL,QAAkB,EAiClB,KAAA+c,SAAW,KACdp2B,KAAKqZ,QACN/F,aAAatT,KAAKqZ,SAElBrZ,KAAK+zD,eAAgB,SAIvB/zD,KAAKqZ,QAAU9F,OAAO7Q,YAAW,KAC/B1C,KAAKqZ,QAAU,EACfrZ,KAAK+zD,cAAc7lD,YAElB,MA2EE,KAAAwzC,oBAAuBp3B,GACrBtqB,KAAK+zD,cAAc1lD,MAAK,IAAW,EAAD,gCAGvC,GAAGrO,KAAK4d,cAAcmqC,YAAYpoC,UAAU2K,GAC1C,OAGF,MAAMrkB,EAAQqkB,EAAI9S,cAAc,SAC1BpI,EAAQkb,EAAI9S,cAAc,eAE7BpI,IACDA,EAAMgE,UAAU7Q,OAAO,cAEjB,YAGLvC,KAAK4d,cAAcmqC,YAAYpoC,UAAU2K,IAIzCrkB,IACDA,EAAM1D,SACN0D,EAAMtD,IAAM,GACZsD,EAAMrD,OACa9C,EAAA,gBAAmCmG,GAC3CnB,SAAS9B,IAClBlD,EAAA,kBAAqCkD,YA1I3ChD,KAAKgH,SAAWwW,EAAA,WAEhBxd,KAAK4d,cAAgB,IAAI+1C,OAAqB3vD,GAAW,EAAE3D,OAAAA,EAAQS,QAAAA,MAC9DA,EACDd,KAAKg0D,kBAAkB3zD,GAEvBL,KAAK0hD,oBAAoBrhD,MAa1B6qB,GACDlrB,KAAKkrB,SAmBFA,SACLlrB,KAAK4vB,WAAWzkB,UAAUwC,iBAAiB,SAAU3N,KAAKo2B,UAGrDhL,SACLprB,KAAK8gB,QACL9gB,KAAK4vB,WAAWzkB,UAAUoG,oBAAoB,SAAUvR,KAAKo2B,UAGxDtV,QACL9gB,KAAK4d,cAAckD,QAGbkzC,kBAAkB1pC,GACVA,EAAI9S,cAAc,UAuDhCxX,KAAK4d,cAAcvb,KAAK,CAACioB,IAAAA,EAAK1nB,KAlDjB,KACX,MAAMuE,EAAQmjB,EAAI3E,QAAQxe,MA4C1B,OA3CgBuZ,QAAQkI,IAAI,CAAC5oB,KAAKgH,SAASC,eAAeC,OAAOC,GAAQnH,KAAK+zD,gBAAgB1lD,MAAK,EAAO1M,KAAS,EAAD,gCAChH,MAUM2M,SAVY,OAAU,CAC1B3M,IAAAA,EACAwJ,UAAWmf,EACX1M,cAAe,KAEftd,MAAON,KAAKM,MACZ2zD,QAAQ,EACRC,WAAW,KAGO9pC,YAyBpB,OAxBA9b,EAAQuJ,SAAQ,KACd,MAAM5R,EAAQqkB,EAAI9S,cAAc,SAC1BpI,EAAQkb,EAAI9S,cAAc,eAGhCpI,GAASA,EAAMgE,UAAUrS,IAAI,QAE1BkF,IAAUA,EAAM0S,eACjBjW,YAAW,KACTuD,EAAMtD,IAAM,GACZsD,EAAMrD,OACa9C,EAAA,gBAAmCmG,GAC3CnB,SAAS9B,IAClBlD,EAAA,kBAAqCkD,QAEtC,GAIDhD,KAAK4d,cAAcmqC,YAAYpoC,UAAU2K,IAC3CtqB,KAAK0hD,oBAAoBp3B,MAItBhc,UAgDNvN,IAAIY,EAAiB8iC,EAAWzkC,KAAKkC,SAW1C,MAAMooB,EAAMlf,SAASC,cAAc,OACnCif,EAAIlX,UAAUrS,IAAI,MAAO,aAIzBupB,EAAI3E,QAAQxe,MAAQ,GAAKxF,EAAIgG,GAE7B88B,EAASh5B,OAAO6e,GAEhBtqB,KAAK4d,cAAcla,QAAQ,CAAC4mB,IAAAA,EAAK1nB,KAAM20B,EAAA,KAIvC,OAAU,CACR51B,IAAAA,EACAwJ,UAAWmf,EACX1M,cAAe,KACfq2C,QAAQ,EACRl8B,aAAa,O,sHC/LZ,SAAS3C,EACd5C,EACAhgB,EACAsB,EACA6f,EACAwgC,EAAiB,IACjBC,EACA1iD,GAEA,MAAMkjB,GAAY,OAAiBpiB,EAASggB,GAAsC,SAA9BhgB,EAAQmT,QAAQllB,UAAuB,OAAS,aAAc0zD,EAAgBxgC,OAAiB3vB,EAAW0N,GAE9J,IAAI8gB,EACF,OAAOoC,EAGT,MAAMy/B,EAAQ,IAAIC,MAAM1/B,EAAW,CACjC2/B,MAAO,CAACl0D,EAAQm0D,EAAM5D,KACpB,MAAMjpD,GAAMipD,EAAK,GACXt7B,OAAsBtxB,IAAZ4sD,EAAK,IAAmBA,EAAK,GAEvChwD,EAAM4xB,EAAKhb,cAAc,cAAc7P,QAAW6qB,EAAKqC,SAASltB,GACtE8sD,EAAa7zD,EAAI+G,EAAI2tB,MAInBm/B,EAAe,CAAMp0D,EAAqBsH,EAAY2tB,GAAU,KAAS,O,EAAD,K,OAAA,E,EAAA,YAC5E,MAAMD,EAAa7iB,EAAQqiB,SAASltB,GAEpC,GAAGmM,EAAS,CACV,MAAM4gD,EAAU5gD,EAAQnM,EAAI0tB,EAAYC,GAClCq/B,EAAYD,aAAmBh0C,cAAgBg0C,EAAUA,EAC/D,QAAiB1wD,IAAd2wD,IAA4BA,EAC7B,OAIDP,GACDA,EAAY5+B,kBAAkB,CAC5BtzB,QAAS7B,EAAOsY,cAAckc,SAASltB,GACvC8tB,SAAU,SACV+Q,eAAgBlR,OAAUtxB,EAAY,WACtCqgD,cAAe8P,EACf3M,KAAM,MAIN,iCACFlyB,GAAU,GAGZ,MAAMX,EAASC,EAAUD,SACzB,GAAGt0B,EAAO+S,UAAUqB,SAAS,WAAa9M,IAAOgtB,EAC/C,OAAO,EAGT,MAAMigC,EAAiBt/B,EAAU,KAAWrlB,GAAmBA,IAEzDM,EAAOiiB,EAAKhb,cAAciF,EAAQuL,cAAgB,WACrDzX,GACDqkD,GAAe,KACbrkD,EAAK6C,UAAU7Q,OAAO,aAKvBsyD,IAAyB,IAAZlgC,GAAiBW,GAC/Bs/B,GAAe,KACb,MAAME,EAAYz0D,EAAOmX,cAAc,KACjCu9C,EAAmB10D,EAAOsY,cAAckc,SAASF,GAAQnd,cAAc,KAE7Eu9C,EAAiB3hD,UAAU7Q,OAAO,WAClCuyD,EAAU1hD,UAAU7Q,OAAO,WAG3B,MAAMyyD,EAAYD,EAAiBp8C,cAAcA,cAAcoK,WAAa+xC,EAAUn8C,cAAcA,cAAcoK,WAC5GkyC,EAAcF,EAAiBvL,YAAcsL,EAAUtL,YAC7DsL,EAAUxpD,MAAM8Q,UAAY,eAAe44C,sBAA8BC,YAIzE,SAAQ,KAENH,EAAU1hD,UAAUrS,IAAI,WACxB+zD,EAAUxpD,MAAM8Q,UAAY,aAKlCw4C,GAAe,KACbv0D,EAAO+S,UAAUrS,IAAI,aAGvB6zB,EAAUjtB,EAAI2tB,I,YAnE8D,K,+QAsExEu/B,GAAariC,EAAKpf,UAAUqB,SAAS,aAGrCgI,EAAU+V,EAAKpd,kBAAkBqH,QAuBvC,OAtBA,QAAiB+V,GAAO1qB,IACtB,IAQIH,EARAtH,EAASyH,EAAEzH,OAMf,GAJAA,GAAS,OAAcA,EAAQmyB,IAI3BnyB,EAAQ,OAAO,EAGnB,GAAGA,EAAOslB,QAAQ5S,KAEhB,GADApL,GAAMtH,EAAOslB,QAAQ5S,KACV,IAARpL,EACD,OAAO,OAGTA,GAAK,OAAWtH,GAGlBo0D,EAAap0D,EAAQsH,KACpB,CAAC+J,eAAAA,IAEG2iD,I,2OC7GF,SAAea,EAAqB7kC,EAAoBxc,EAAcqB,EAA2BigD,G,qCACtG,MAAMniC,EAA+B,GAE/B63B,GADsB31C,MAAAA,OAAQ,EAARA,EAAUkgD,MAAMr8B,GAAwB,6BAAbA,EAAOtpB,KACvB4lD,SAAsCrxD,EACvEsxD,GAAW,EAAAC,EAAA,GAAc1hD,EAAM,CAACqB,SAAAA,EAAUigD,kBAAAA,EAAmBniC,aAAAA,EAAcwiC,oBAAqB3K,IACpFyK,EAASn9C,iBAA8B,6BAC/CrT,SAASlE,IACjBA,EAAG60D,gBAAkB,UACrB70D,EAAGwS,UAAUrS,IAAI,SAGnBiyB,EAAanwB,eAAgB6d,QAAQkI,IAAIoK,IAEzCsiC,EAASn9C,iBAA8B,qBAAqBrT,SAASlE,IACnEA,EAAG8W,SAAQ,SAAmB,OAGhC,MAAMg+C,EAAmB,IAAa,uBAAiC1xD,EAUjE2xD,EAAsB/8C,MAAMC,KAAKy8C,EAASn9C,iBAAmC,8BAA8BoC,KAAK3Z,IACpHA,EAAG+kB,QAAQiwC,IAAM,IACTh1D,EAAWoqD,sBAGf/1C,GAAO,EAAA4gD,EAAA,GAAuBP,GACpCzK,MAAAA,GAAAA,EAAUpe,uBAEVtgC,QAAQsR,IAAIxI,GAEZ,MAAM6gD,GAAM,EAAAC,EAAA,GAAe1lC,GAG3B,GAAGylC,EAAI3P,UAOA,CACL,MAAMN,EAAQz6C,SAASqsC,cACvB,IAAI0O,EAAO91B,EAAMib,UACb6a,GACF91B,EAAM5kB,OAAO06C,EAAwB/6C,SAAS4qD,eAAe,KAG/DnQ,EAAME,cAAcI,GACpBN,EAAMoQ,UAAS,GACfH,EAAI1kC,UAAU8kC,kBACdJ,EAAI1kC,UAAU+kC,SAAStQ,GAQzBx1B,EAAM1iB,iBAAiB,QAASmM,EAAA,EAAa,CAACjF,SAAS,EAAM7G,MAAM,IACnE0nD,MAAAA,GAAAA,EAAkBU,cAAc,CAACC,UAAW,kBAC5C9iD,OAAOnI,SAASkrD,YAAY,cAAc,EAAOrhD,GACjD2D,MAAMC,KAAKwX,EAAMlY,iBAAmC,eAAerT,SAAQ,CAAClE,EAAIkI,YACvElI,EAAG+kB,QAAQiwC,IAClB,MAAM5K,EAAqB2K,EAAoB7sD,GAC9ClI,EAAWoqD,mBAAqBA,EACjCA,EAAmBznD,YAAc3C,KAKnCyvB,EAAMlY,iBAA8B,OAAOrT,SAASlE,IAClDA,EAAG60D,gBAAkB,WAWvBC,MAAAA,GAAAA,EAAkBa,gBAAgBlmC,IAClC,OAAcA,EAAO,U,+RAoCvB,IAAIwB,EAAO,KACTzmB,SAASuC,iBAAiB,SAAU7F,IAClC,MAAMuoB,GAAQ,EAAAmmC,EAAA,GAAgB1uD,EAAEzH,OAAQ,0BACxC,IAAIgwB,EACF,OAGF,MAAMomC,IAAiBpmC,EAAM1K,QAAQ8wC,aAErC,IAAI5iD,EAAcqB,EADlBpN,EAAEiqB,iBAIF,IAAIxJ,GAAqBzgB,EAAE4uD,eAAiB5uD,GAAG6uD,cAAcC,QAAQ,cACjEC,GAAe,EAGf5hD,GAAgBnN,EAAE4uD,eAAiB5uD,GAAG6uD,cAAcC,QAAQ,aAEhE,MAAME,EAAgBhvD,GAA6B,uBAARA,EAAE2H,GAAuC,2BAAR3H,EAAE2H,IAAmCgnD,EACjH,GAAGA,EAAc,CACf,MAAM36B,EAAS,UACfvT,EAAYA,EAAUtC,QAAQ6V,EAAQ,IACtC7mB,EAAOA,EAAKgR,QAAQ6V,EAAQ,IAG9B,MAAM/zB,GAAUsoB,EAAM1K,QAAQ5d,QAAU,MAAckqB,WACtD,GAAGhd,EAAKib,OAAQ,CACdjb,EAAOA,EAAKgR,QAAQ,2BAA4B,IAChDhR,EAAOA,EAAKgR,QAAQ,mBAAoB,IACxChR,EAAOA,EAAKgR,QAAQ,yCAA0C,IAE9D,MAAM3gB,EAAQ2P,EAAK3P,MAAM,2BACtBA,IACD2P,EAAO3P,EAAM,GAAG4qB,QAMlB,MAEMmE,GAFS,IAAI0iC,WACAC,gBAAgB/hD,EAAM,aACxBzJ,MAAQJ,SAASC,cAAc,QAMhD,IAAI4rD,EAAW5iC,EAAK4F,WACpB,KAAMg9B,GAAU,CACd,MAAMC,EAAcD,EAASC,YAC1BD,EAASzQ,WAAayQ,EAASxQ,YAC5BwQ,EAASvQ,UAAUx2B,QACrB+mC,EAAS10D,UAIb00D,EAAWC,EAGb,MAAMC,GAAY,EAAAC,EAAA,GAAsB/iC,GAAM,GAAM,GAOpD,KAL8BtsB,IAE5BovD,EAAUjiD,SAAWiiD,EAAUjiD,SAASojB,QAAQS,GAAwB,6BAAbA,EAAOtpB,KAGjE0nD,EAAU1qD,MAAMwZ,QAAQ,MAAO,IAAIpjB,SAAW0lB,EAAUtC,QAAQ,MAAO,IAAIpjB,QAAUs0D,EAAUjiD,SAASxU,MAAMq4B,GAAwB,6BAAbA,EAAOtpB,IAAmC,CACpKoE,EAAOsjD,EAAU1qD,MACjByI,EAAWiiD,EAAUjiD,SACrB2hD,GAAe,EAEf,IAAIQ,GAAY,EAAAC,EAAA,GAAczjD,GAC9BwjD,EAAYA,EAAU/+B,OAAOw+B,IAC7B,EAAAS,EAAA,GAAcriD,EAAUmiD,IAIzBR,IACDhjD,EAAO0U,EACPrT,GAAW,EAAAoiD,EAAA,GAAczjD,GACzBqB,EAAWA,EAASojB,OAAOw+B,IAG7B5B,EAAqB7kC,EAAOxc,EAAMqB,EAAUnN,MAG9C8pB,EAAO,MAoBT,IAAY2lC,EAuBZ,SAASnC,IAKP,OAJiB,YAAkC,CACjDoC,eAAe,EACfC,cAAc,IAKlB,SAASC,EAA2BtnC,GAClC,MAAMslC,EAAsB/8C,MAAMC,KAAKwX,EAAMlY,iBAAmD,6CAChG,IAAI0yC,EAAWx6B,EAAM7Y,cAA0C,0BAC/D,IAAIqzC,GAAY8K,EAAoB9yD,OAClCgoD,EAAWwK,IACXhlC,EAAM3Y,QAAQmzC,QACT,GAAGA,IAAa8K,EAAoB9yD,OAEzC,YADAgoD,EAAStoD,SAIX,IAAIsoD,EACF,OAGF,MAAME,EAAiE,IAAIxpD,IAC3Eo0D,EAAoB7wD,SAAS5C,IAC3B,MAAM8oD,EAAqB9oD,aAAmB,KAAqBA,EAAWA,EAAgB8oD,oBACxF,MAAC7jD,GAAS6jD,EAChB,IAAIrnD,EAAMonD,EAAa9nD,IAAIkE,GACvBxD,GACFonD,EAAapnD,IAAIwD,EAAOxD,EAAM,IAAIvC,KAGpCuC,EAAI5C,IAAIiqD,MAGV,IAAI,MAAO7jD,EAAOwuD,KAAwB5K,EAAc,CACtD,IAAI6M,EAAS/M,EAASE,aAAa9nD,IAAIkE,GACvC,GAAGywD,EACD,IAAI,MAAM5M,KAAsB4M,EAC1BjC,EAAoBtyD,IAAI2nD,IAC1BA,EAAmBve,4BAIvBmrB,EAAS,IAAIx2D,IAGf,IAAI,MAAM4pD,KAAsB2K,EAC1BiC,EAAOv0D,IAAI2nD,IACbA,EAAmB6M,oBAKzBhN,EAAS9pD,IAAIgqD,GAAc,GAC3BF,EAASoD,eA9EX,SAAYuJ,GACV,yBACA,qBACA,qBAHF,CAAYA,IAAAA,EAAU,KAiFP,MAAMM,EAUnB/3D,YAAmBotB,EAA6B,IAA7B,KAAAA,QAAAA,EACjBntB,KAAKmL,UAAYC,SAASC,cAAc,OACxCrL,KAAKmL,UAAUiI,UAAUrS,IAAI,eAE7Bf,KAAKygD,SAAWtzB,EAAQszB,SACxBzgD,KAAK+3D,SAAW5qC,EAAQ4qC,cAEC/zD,IAAtBmpB,EAAQ6qC,gBAAoDh0D,IAAzBmpB,EAAQ8qC,eAC5C9qC,EAAQ8qC,aAAe1xD,KAAKI,IAAI,GAAIJ,KAAKmD,MAAMyjB,EAAQ6qC,UAAY,KAGrE,MAAM,YAACz0D,EAAW,UAAEy0D,EAAS,aAAEC,EAAY,KAAErgD,EAAI,UAAE2Q,EAAS,YAAE2vC,GAAc,EAAI,aAAEvb,GAAgBxvB,EAC5F6Y,EAAQ7Y,EAAQ6Y,OAAS7Y,EAAQgrC,UAEjCC,EAAsC,GAC5C,IAAI/nC,EA8GJ,GA7GI9H,GA2FFvoB,KAAKmL,UAAU4T,UAAY,8BACNnH,EAAO,SAASA,KAAU,oBAAoB+kC,MAAAA,EAAAA,EAAgB,UAAU3W,EAAQ,cAAgB,wCAGrH3V,EAAQrwB,KAAKmL,UAAUiK,oBA9FpByc,GACDA,IAGF7xB,KAAKmL,UAAU4T,UAAY,wCAE3BsR,EAAQrwB,KAAKmL,UAAUiK,kBACvBib,EAAMolC,gBAAkB,KAAOyC,EAS/B,kBAEA7nC,EAAM1iB,iBAAiB,aAAc7F,I,MACnC,MAAMspB,EAAYhmB,SAASmsC,eAC3B,IAAInmB,EAAUinC,YACZ,OAGF,MAAM90D,GAAc,EAAAo7B,EAAA,GAAU72B,EAAEzH,OAAQ,OACxC,IAAIkD,EACF,OAGF,MAAMse,EAAOte,EAAYue,wBACnBw2C,EAAUz2C,EAAKI,KAAOJ,EAAKe,MAAQ,EACnC21C,EAAczwD,EAAE0wD,SAAWF,EAE3BzS,EAAQz6C,SAASqsC,cACvBoO,EAAME,cAAcwS,EAAch1D,EAAyC,QAA3B,EAAAA,EAAYgjD,uBAAe,QAAIhjD,GAC/E6tB,EAAU8kC,kBACV9kC,EAAU+kC,SAAStQ,MAGrBuS,EAAiB/1D,MAAK,MAIjB,EAAAo2D,EAAA,GAAapoC,IAEdA,EAAM86B,kBA2BR,KAAcvyC,MAAMC,KAAKwX,EAAMlY,iBAAiB,uBAAuBrT,SAASlE,IAE9EA,EAAG2B,aAML,QAAoBqW,MAAMC,KAAKwX,EAAMlY,iBAAiB,sBAEtDw/C,EAA2BtnC,OAgB/BA,EAAM3iB,aAAa,MAAO,QAEvByf,EAAQurC,YACTroC,EAAMqoC,UAAYvrC,EAAQurC,WAGzBn1D,IACD,QAAM8sB,EAAO9sB,OAAaS,EAAW,eAGpCgiC,GAASziC,EAAa,CACvB,MAAM64C,EAAShxC,SAASC,cAAc,OACtC+wC,EAAOhpC,UAAUrS,IAAI,sBACrBf,KAAKmL,UAAUM,OAAO2wC,GASxB,GANGpW,IACDhmC,KAAKgmC,MAAQ56B,SAASC,cAAc,SACpCrL,KAAK68C,WACL78C,KAAKmL,UAAUM,OAAOzL,KAAKgmC,QAG1BgyB,EAAW,CACZ,MAAMW,EAAU34D,KAAKmL,UAAU+a,iBAC/B,IAAI0yC,GAAgB,EAEpB,MAAMv1B,EAAU,KACd,MAAMw1B,EAAWxoC,EAAMjd,UAAUqB,SAAS,SAEpCqkD,EAAcvwC,EAAa8H,EAA2B5jB,MAAM5J,OAAS,KAAI,EAAAu0D,EAAA,GAAsB/mC,GAAO,GAAO,GAAO5jB,OAAO5J,OAC3H0kB,EAAOywC,EAAYc,EACnBC,EAAUxxC,EAAO,EACvB8I,EAAMjd,UAAUxJ,OAAO,QAASmvD,GAI7BA,GAAWxxC,GAAQ0wC,GACpBj4D,KAAK68C,WACL8b,EAAQltD,OAAO,KAAKusD,EAAYc,MAC5BF,IAAeA,GAAgB,KAC1BC,IAAaE,GAAYH,KAClC54D,KAAK68C,WACL+b,GAAgB,IAIpBR,EAAiB/1D,KAAKghC,IAGFlW,EAAQ6rC,iBACVzwC,IAClB8H,EAAM1K,QAAQ8wC,aAAe,IAC7BpmC,EAAM1iB,iBAAiB,YAAa7F,IAClC,GAAa,UAAVA,EAAEyE,IAEH,OADAzE,EAAEiqB,kBACK,MAKVqmC,EAAiBv1D,QAClBwtB,EAAM1iB,iBAAiB,SAAS,KAC9ByqD,EAAiBtzD,SAASk4C,GAAaA,SAI3Ch9C,KAAKqwB,MAAQA,EAGR+uB,SACDp/C,KAAKyM,QAINzM,KAAKmtB,QAAQ5E,UACbvoB,KAAKqwB,MAA2B+uB,SC5hBxB,SAA+Bx+C,GAC5C,MAAMilD,EAAQz6C,SAASqsC,cACvBoO,EAAMoT,mBAAmBr4D,GACzB,MAAMsnD,EAAM30C,OAAOgkC,eACnB2Q,EAAIgO,kBACJhO,EAAIiO,SAAStQ,GDyhBTqT,CAAsBl5D,KAAKqwB,QAIxBwsB,WACL78C,KAAKgmC,MAAM1tB,YAAc,GACtBtY,KAAKmtB,QAAQgrC,WACd,EAAA1+B,EAAA,GAAaz5B,KAAKgmC,MAAOhmC,KAAKmtB,QAAQgrC,WAEtCn4D,KAAKgmC,MAAMv6B,QAAO,QAAKzL,KAAKmtB,QAAQ6Y,MAAOhmC,KAAKmtB,QAAQgsC,eAIxD1sD,YACF,OAAOzM,KAAKmtB,QAAQ5E,UAAavoB,KAAKqwB,MAA2B5jB,OAAQ,EAAA2qD,EAAA,GAAsBp3D,KAAKqwB,OAAO,GAAO,GAAO5jB,MAIvHA,UAAMA,GACRzM,KAAKg8C,iBAAiBvvC,GAAO,GAC7BzM,KAAKm+C,qBAGAA,sBACL,OAAcn+C,KAAKqwB,MAAO,SAGrB2rB,iBAAiBvvC,EAA6C2sD,GAChEp5D,KAAKmtB,QAAQ5E,UACbvoB,KAAKqwB,MAA2B5jB,MAAQA,IAEzC,EAAAsc,EAAA,GAAe/oB,KAAKqwB,MAAO5jB,GAC3BkrD,EAA2B33D,KAAKqwB,QAI7B6vB,YACL,OAAOlgD,KAAKyM,QAAUzM,KAAKq5D,cAGtB7Y,UACL,OAAQxgD,KAAKqwB,MAAMjd,UAAUqB,SAAS,YAClCzU,KAAK+3D,UAAY/3D,KAAK+3D,eACtB/3D,KAAKygD,YAAa,EAAAgY,EAAA,GAAaz4D,KAAKqwB,QAGnCipC,kBACL,OAAOt5D,KAAKwgD,WAAaxgD,KAAKkgD,YAGzBqZ,cAAc9sD,EAAQ,GAAIi7C,GAC3B1nD,KAAKmtB,QAAQ5E,YACf9b,GAAQ,EAAAopD,EAAA,IAAuB,EAAAN,EAAA,GAAc9oD,KAG5Ci7C,EACD1nD,KAAKg8C,iBAAiBvvC,GAAO,GAE7BzM,KAAKyM,MAAQA,EAIV+sD,iBAAiB/sD,EAAqC,GAAIi7C,GAC/D1nD,KAAKq5D,cAAgB5sD,EACrBzM,KAAKu5D,cAAc9sD,EAAOi7C,GAGrB+R,SAASrtC,EAAmB4Z,GAC9BA,GACDhmC,KAAKgmC,MAAM1tB,YAAc,GACzBtY,KAAKgmC,MAAMv6B,QAAO,QAAKu6B,EAAOhmC,KAAKmtB,QAAQgsC,gBAE3Cn5D,KAAK68C,WAGP78C,KAAKqwB,MAAMjd,UAAUxJ,OAAO,WAAYwiB,EAAQorC,EAAWlrB,QAC3DtsC,KAAKqwB,MAAMjd,UAAUxJ,OAAO,WAAYwiB,EAAQorC,EAAWkC,QAGtDC,SAAS3zB,GACdhmC,KAAKy5D,SAASjC,EAAWlrB,MAAOtG,M,0DErmBrB,MAAM4zB,EAWnB75D,YAAYwD,EAA0BwsB,GAL/B,KAAA8pC,UAAY,GACZ,KAAAxgD,QAAU,EA+BjB,KAAAgqB,QAAU,KACR,IAAIrjC,KAAK+vB,SAAU,OAEnB,MAAMtjB,EAAQzM,KAAKyM,MAIhBA,IAAUzM,KAAK65D,YAChB75D,KAAK65D,UAAYptD,EACjB6G,aAAatT,KAAKqZ,SAClBrZ,KAAKqZ,QAAU9F,OAAO7Q,YAAW,KAC/B1C,KAAK+vB,SAAStjB,KACb,OAIP,KAAAqtD,aAAe,KACb95D,KAAKyM,MAAQ,GACbzM,KAAK+vB,UAAY/vB,KAAK+vB,SAAS,IAC/B/vB,KAAK+5D,SAAW/5D,KAAK+5D,WA7CrB/5D,KAAKowB,WAAa,IAAI,KAAW,CAC/B7sB,YAAAA,EACAglB,WAAW,IAGbvoB,KAAKmL,UAAYnL,KAAKowB,WAAWjlB,UACjCnL,KAAKmL,UAAUiI,UAAU7Q,OAAO,eAChCvC,KAAKmL,UAAUiI,UAAUrS,IAAI,gBAE7Bf,KAAK+vB,SAAWA,EAEhB/vB,KAAKqwB,MAAQrwB,KAAKowB,WAAWC,MAC7BrwB,KAAKqwB,MAAMjd,UAAUrS,IAAI,sBAEzB,MAAMi5D,EAAa5uD,SAASC,cAAc,KAC1C2uD,EAAW5mD,UAAUrS,IAAI,QAAS,gBAElCf,KAAKi6D,SAAW7uD,SAASC,cAAc,KACvCrL,KAAKi6D,SAAS7mD,UAAUrS,IAAI,QAAS,WAAY,eAEjDf,KAAKqwB,MAAM1iB,iBAAiB,QAAS3N,KAAKqjC,SAC1CrjC,KAAKi6D,SAAStsD,iBAAiB,QAAS3N,KAAK85D,cAE7C95D,KAAKmL,UAAUM,OAAOuuD,EAAYh6D,KAAKi6D,UAyBrCxtD,YACF,OAAOzM,KAAKowB,WAAW3jB,MAGrBA,UAAMA,GACRzM,KAAK65D,UAAYptD,EACjB6G,aAAatT,KAAKqZ,SAClBrZ,KAAKowB,WAAW3jB,MAAQA,EAGnBlK,SACL+Q,aAAatT,KAAKqZ,SAClBrZ,KAAKqwB,MAAM9e,oBAAoB,QAASvR,KAAKqjC,SAC7CrjC,KAAKi6D,SAAS1oD,oBAAoB,QAASvR,KAAK85D,iB,mGCvErC,MAAMI,UAAsB,IACzCn6D,YAAY+uD,EAAwBqL,GAClCpoD,MAAM+8C,GAWA,KAAAC,mBAAqB,EAAE1uD,OAAAA,EAAQS,QAAAA,OAMrC,OAAiBd,KAAKmvD,OAAQzrC,GAAMA,EAAE4G,MAAQjqB,IAAQyE,SAAS9B,IAC1DlC,IACDkC,EAAKksD,SAAU,GAGjBlsD,EAAKlC,QAAUA,EACf,MAAM4sB,EAAQ1tB,KAAKmvD,MAAMpmD,WAAW/F,IAAUA,EAAKlC,UACnDd,KAAKmvD,MAAMvhC,OAAOrnB,KAAKC,IAAI,EAAGknB,GAAQ,EAAG1qB,MAG3ChD,KAAKqvD,0BAzBLrvD,KAAK+nD,YAAc,IAAI,IAAsB/nD,KAAK+uD,qBAEjDoL,IAAwB,SAAuB,KAC9Cn6D,KAAKkF,UACJ,KACDlF,KAAK82B,sBAuBCsjC,UACR,OAAO,OAAcp6D,KAAKmvD,OAAQnsD,GAASA,EAAKksD,UAGrCv+C,YAAY3N,G,iHACjB,EAAM2N,YAAW,UAAC3N,GACxBhD,KAAK+nD,YAAYjlD,UAAUE,EAAKsnB,M,+RAGxB+vC,WAAWv/B,EAA4Bl6B,G,MAG/C,QAFiBmR,MAAMsoD,WAAWv/B,EAAQl6B,KAI1CZ,KAAK0D,QAAQ9C,GAIH,QAAV,EAAAA,EAAGsuD,eAAO,QAAVtuD,EAAGsuD,SAAY,IAER,M,qEC/CI,MAAMoL,UAAiC,IAOpDv6D,YAAY+uD,GACV/8C,MAAM+8C,GAPE,KAAAK,MAAgC,GAChC,KAAAoL,UAAkC,IAAIn5D,IASzC8D,OACL6M,MAAM7M,OACNlF,KAAK+nD,YAAY7iD,OAGZwgD,SACL3zC,MAAM2zC,SACN1lD,KAAK+nD,YAAYrC,SAGZ5uB,mBACL/kB,MAAM2zC,SACN1lD,KAAK+nD,YAAYjxB,mBAGZhW,QACL/O,MAAM+O,QACN9gB,KAAK+nD,YAAYyS,aAGZ7U,UACL3lD,KAAK+nD,YAAYpC,UAGT8U,SAASz3D,GACjB,OAAOA,EAAKJ,KAAKI,EAAKsnB,KAGd+vC,WAAWv/B,EAA4Bl6B,GAE/C,GADaZ,KAAKmvD,MAAMzuD,MAAMgjB,GAAMA,EAAE4G,MAAQ1pB,EAAG0pB,KAAO5G,EAAE9gB,OAAShC,EAAGgC,OAEpE,OAAO,EAEP,IAAI,MAAMI,KAAQhD,KAAKu6D,UACrB,GAAGv3D,EAAKsnB,MAAQ1pB,EAAG0pB,KAAOtnB,EAAKJ,OAAShC,EAAGgC,KACzC,OAAO,EAMb,OADA5C,KAAKmvD,MAAMr0B,GAAQl6B,IACZ,EAGCyuD,yB,MACe,QAAvB,EAAArvD,KAAK06D,0BAAkB,QAAvB16D,KAAK06D,mBAAuBnnD,OAAO7Q,YAAW,KAC5C1C,KAAK06D,wBAAqB12D,EAC1BhE,KAAK26D,iBACJ,IAGEt4D,KAAKzB,GACVmR,MAAM1P,KAAKzB,GAGN6qB,QAAQ7qB,GACbmR,MAAM0Z,QAAQ7qB,GAGTK,OAAOL,IACZ,OAAiBZ,KAAKmvD,OAAQzrC,GAAMA,EAAE4G,MAAQ1pB,EAAG0pB,MACjDtqB,KAAK8C,UAAUlC,GAGV8C,QAAQ9C,GACbZ,KAAK+nD,YAAYrkD,QAAQ9C,EAAG0pB,KAGvBxnB,UAAUlC,GACfZ,KAAK+nD,YAAYjlD,UAAUlC,EAAG0pB,Q,mECvFnB,MAAMswC,UAA0B,IAQ7C76D,YAAY0F,EAA6C+Q,EAAsBkI,EAA0Bm8C,GACvG9oD,MAAM,CACJ0M,KAAM,IAAO,GAAK,IAClB9X,IAAK,EACLH,IAAK,EACLkY,eAAAA,EACAm8C,aAAAA,GACC,GAZK,KAAAC,YAAc,EAuDd,KAAAC,aAAe,KACvB/6D,KAAKwG,IAAMxG,KAAKyF,MAAMmB,SACtB5G,KAAKg7D,KAAKttD,aAAa,MAAO,GAAK1N,KAAKwG,MAGhC,KAAA+C,QAAU,KAClBvJ,KAAK8f,eAGG,KAAAjY,OAAS,KACjB,MAAM+b,EAAI,KACR5jB,KAAK8f,cAEL9f,KAAK86D,YAAc96D,KAAKyF,MAAMpB,OAAS,EAAIkP,OAAOgzB,sBAAsB3iB,IAGvE5jB,KAAK86D,aACNvnD,OAAOsgC,qBAAqB7zC,KAAK86D,aAGhC96D,KAAKwW,YACNxW,KAAKi7D,kBAGPj7D,KAAK86D,YAAcvnD,OAAOgzB,sBAAsB3iB,IAGxC,KAAAqmB,aAAe,KACpBjqC,KAAKyF,MAAMpB,SACZrE,KAAK8f,cAEF9f,KAAKwW,YACNxW,KAAKi7D,oBAKD,KAAAC,WAAcpzD,IACtB9H,KAAKi7D,mBA/EFx1D,GACDzF,KAAKqI,SAAS5C,EAAO+Q,GAIlBnO,SAAS5C,EAAyB+Q,GAAa,GACjDxW,KAAKyF,OACNzF,KAAKkb,kBAGJ1E,IAAexW,KAAKm7D,YACrBn7D,KAAKm7D,WAAa/vD,SAASC,cAAc,OACzCrL,KAAKm7D,WAAW/nD,UAAUrS,IAAI,wBAAyB,yBACvDf,KAAKmL,UAAUuM,QAAQ1X,KAAKm7D,aAEpBn7D,KAAKm7D,YACbn7D,KAAKm7D,WAAW/nD,UAAUxJ,OAAO,QAAS4M,GAG5CxW,KAAKyF,MAAQA,EACbzF,KAAKwW,WAAaA,IACd/Q,EAAMpB,QAAUoB,EAAMa,YAAc,IACtCtG,KAAK6H,SAGP,IAAIuJ,GAAa,EACjBpR,KAAKo7D,aACLp7D,KAAKkU,eACLlU,KAAK2e,YAAY,CACfw2B,YAAa,KACX/jC,GAAcpR,KAAKyF,MAAMpB,OACzB+M,GAAcpR,KAAKyF,MAAMnB,SAG3Bua,UAAY/W,IAEVsJ,GAAcpR,KAAKyF,MAAMjB,UA8CrB8lC,MAAMxiC,GACd,MAAM4iC,EAAY34B,MAAMu4B,MAAMxiC,GAE9B,OADA9H,KAAKyF,MAAMa,YAAcokC,EAClBA,EAGCuwB,kBACR,GAAG,sBAA6Cj7D,KAAKyF,OAAQ,OAC7D,MAAM41D,EAAMr7D,KAAKyF,MAAM61D,SACjBC,EAAYF,EAAIx4D,OAEhByD,EAActG,KAAKyF,MAAMa,YAC/B,IAAIk1D,EAAe,EAAGC,EAAM,EAC5B,IAAI,IAAI/3C,EAAI,EAAGA,EAAI63C,IAAa73C,EAAG,CACjC,MAAM0D,EAAQi0C,EAAIj0C,MAAM1D,GACrBpd,GAAe8gB,GAASA,GAASo0C,IAClCA,EAAep0C,EACfq0C,EAAMJ,EAAII,IAAI/3C,IAQlB,MAAMg4C,EAAW17D,KAAKyF,MAAMmB,SAAW60D,EAAMz7D,KAAKyF,MAAMmB,SAAW,EACnE5G,KAAKm7D,WAAW7vD,MAAMsX,MAAoB,IAAX84C,EAAkB,IAIzCN,aACRp7D,KAAKwG,IAAMxG,KAAKyF,MAAMmB,UAAY,EAC/B5G,KAAKwG,IAAM,EACZxG,KAAK+6D,eAEL/6D,KAAKyF,MAAMkI,iBAAiB,aAAc3N,KAAK+6D,cAI5Cj7C,cACL,GAAG,sBAA6C9f,KAAKyF,OAAQ,OAC7D,MAAMa,EAActG,KAAKyF,MAAMa,YAE/ByL,MAAM+N,YAAYxZ,GAGb4N,eACLnC,MAAMmC,eACNlU,KAAKyF,MAAMkI,iBAAiB,QAAS3N,KAAKuJ,SAC1CvJ,KAAKyF,MAAMkI,iBAAiB,OAAQ3N,KAAK6H,QACzC7H,KAAKyF,MAAMkI,iBAAiB,aAAc3N,KAAKiqC,cAC/CjqC,KAAKwW,YAAcxW,KAAKyF,MAAMkI,iBAAiB,WAAY3N,KAAKk7D,YAG3DhgD,kBACLnJ,MAAMmJ,kBAEHlb,KAAKyF,QACNzF,KAAKyF,MAAM8L,oBAAoB,aAAcvR,KAAK+6D,cAClD/6D,KAAKyF,MAAM8L,oBAAoB,QAASvR,KAAKuJ,SAC7CvJ,KAAKyF,MAAM8L,oBAAoB,OAAQvR,KAAK6H,QAC5C7H,KAAKyF,MAAM8L,oBAAoB,aAAcvR,KAAKiqC,cAClDjqC,KAAKwW,YAAcxW,KAAKyF,MAAM8L,oBAAoB,WAAYvR,KAAKk7D,aAGlEl7D,KAAK86D,cACNvnD,OAAOsgC,qBAAqB7zC,KAAK86D,aACjC96D,KAAK86D,YAAc,M,mGCxJzB,MACMvgD,EAQD,IAAIhZ,IAEHo6D,EAA8B,IAAIv6D,IAExC,IAAIw6D,GAAc,EAElB,SAASC,IACJD,IAIHA,GAAc,GACd,SAAQ,KACNA,GAAc,EAMhBD,EAAU72D,QAAQg3D,GAClBH,EAAU76C,YAWZ,SAASi7C,EAAgB75D,GACvB,MAAMN,EAAOM,EAAQyjB,QAAQulB,SAC7B,OAAGtpC,EACiB,WAEgBA,GACtBghB,MAGP1gB,EAAQ4f,wBAAwBc,MAGzC,SAASk5C,EAAY55D,GAGnB,IAAI85D,EAASzhD,EAAItX,IAAIf,GACrB,MAAM+5D,GAAaD,EAEnB,IAAI,KAACnoD,EAAI,WAAEqoD,EAAU,KAAErjD,EAAI,WAAEuH,EAAU,KAAE+7C,EAAI,UAAEC,EAAS,aAAEC,GAAgBL,GAAU,GAGpF,GAAGC,EAAW,CACZpoD,EAAO3R,EAAQoW,YACf4jD,EAAaroD,EAAKhR,OAClBgW,EAAgE,GAChEuH,EAAavH,EAAO,GAAKA,EAAO,IAEhC,IAAIoyB,EAAW/oC,EAAQyjB,QAAQslB,SAC5BA,IAAaA,IAAUA,GAAY,MAEtCkxB,EAAO,GAAGj6D,EAAQyjB,QAAQ+S,YAAc,QAAcuS,GAAY,QAAY,OAK9EmxB,GAAY,OAAavoD,EAAMsoD,GAE/BE,EAAeN,EAAgB75D,GAE/B85D,EAAS,CAACnoD,KAAAA,EAAMqoD,WAAAA,EAAYrjD,KAAAA,EAAMuH,WAAAA,EAAY+7C,KAAAA,EAAMC,UAAAA,EAAWC,aAAAA,GAC/D9hD,EAAI5W,IAAIzB,EAAS85D,GAKnB,MAAMM,EAAkBP,EAAgB75D,GAClCq6D,EAAeN,GAAaI,IAAiBC,EAGnD,IAFCL,GAAaM,IAAiBP,EAAOK,aAAeA,EAAeC,GAEjEC,EACD,GAAGH,EAAYC,EAAc,CAC3Bn6D,EAAQwL,aAAa,QAASmG,GAC9B,IAAI2oD,EAAc3oD,EACd4oD,EAAeJ,EACnB,KAAMG,EAAY35D,OAAS,GAAG,CAC5B,MAAM65D,EAAoBF,EAAY35D,OAChC85D,EAAOv8C,IACX,OAAMA,EAAas8C,GAAqB,EAAG,EAAGA,EAAoB,IAClEn2D,KAAKC,IAAIk2D,EAAoB7jD,EAAO,EAAG,GACnC+jD,EAAQJ,EAAYK,OAAO,EAAGF,GAAM12C,QAAQ,OAAQ,IACpD62C,EAAQN,EAAYK,OAAOF,EAAO,GAAG12C,QAAQ,OAAQ,IAG3D,GAFAu2C,EAAcI,EAAQE,EACtBL,GAAe,OAAaD,EAtGnB,IAsG2CL,GACjDM,EAAeJ,EAAc,CAC9Bn6D,EAAQoW,YAAcskD,EAxGf,IAwGkCE,EACzC,OAKJd,EAAOK,aAAeN,EAAgB75D,QAGtCA,EAAQmhD,gBAAgB,SAjF9B9vC,OAAO5F,iBAAiB,UAAU,KAChC,IAAI,MAAOpB,KAAQgO,EACjBohD,EAAU56D,IAAIwL,GAGhBsvD,MACC,CAAChnD,SAAS,EAAM0M,SAAS,IAkFrB,MAAMw7C,UAA8Bv5D,YACzCq0D,oBAGEt9C,EAAI5W,IAAI3D,KAAM,MACXA,KAAK2lB,QAAQulB,SACd4wB,EAAY97D,OAEZ27D,EAAU56D,IAAIf,MACd67D,KAOJpvB,uBACkBlyB,EAAItZ,OAAOjB,MAC3B27D,EAAU16D,OAAOjB,OAKrB2sC,eAAeC,OAAO,0BAA2BmwB,I,2DC7JlC,MAAMC,EAMnBj9D,YAAsBk9D,EAAkDr1D,GAAlD,KAAAq1D,mBAAAA,EAAkD,KAAAr1D,KAAAA,EAHjE,KAAAs1D,UAAY,EAIjBl9D,KAAKmL,UAAYC,SAASC,cAAc,OACxCrL,KAAKmL,UAAUiI,UAAUrS,IAAI,yBAGxB6B,OACL,OAAG5C,KAAKoqB,YAAoBpqB,KAAKoqB,YAC1BpqB,KAAKoqB,YAAc,yBAAkC,CAC1Djf,UAAWnL,KAAKmL,UAChB1H,MAAM,EACNc,UAAU,EACVqe,MAAO5iB,KAAK4H,KACZob,OAAQhjB,KAAK4H,KACbu1D,SAAS,GAER,4BAA4B9uD,MAAMnN,IAEnClB,KAAKS,UAAYS,EACjBlB,KAAKS,UAAUkN,iBAAiB,cAAcyvD,KAGX,IAA7Bp9D,KAAKS,UAAU6uC,WAAmB8tB,GAAgBp9D,KAAKk9D,YAC1B,IAA9Bl9D,KAAKS,UAAU6uC,WAAoB8tB,GAAgBp9D,KAAKk9D,aACzDl9D,KAAKS,UAAU48D,SAAS,GACxBr9D,KAAKS,UAAU6D,YAInBtE,KAAKi9D,mBAAmBK,QAAQC,4BAA8B,KACzDv9D,KAAKi9D,mBAAmBK,QAAQE,iBACjCx9D,KAAKS,UAAUg9D,aAAa,GAC5Bz9D,KAAKS,UAAUi9D,SAAW,EAC1B19D,KAAKk9D,UAAY,GACjBl9D,KAAKS,UAAU+D,SAEfxE,KAAKS,UAAUg9D,cAAc,GAC7Bz9D,KAAKS,UAAUi9D,SAAW,GAC1B19D,KAAKk9D,UAAY,EACjBl9D,KAAKS,UAAU+D,SAIZ,sBAA+BtD,MAInCqB,SACFvC,KAAKS,WACNT,KAAKS,UAAU8B,Y,2DCtDN,MAAMo7D,EAWnB59D,YAAsBqwB,EAAkCxoB,GAAlC,KAAAwoB,WAAAA,EAAkC,KAAAxoB,KAAAA,EAR9C,KAAApB,IAAM,GACN,KAAA02D,UAAY,EAQpBl9D,KAAKmL,UAAYC,SAASC,cAAc,OACxCrL,KAAKmL,UAAUiI,UAAUrS,IAAI,yBAE7B,MAAMsvB,EAAQD,EAAWC,MAEzBA,EAAM1iB,iBAAiB,QAAQ,KAC7B3N,KAAK49D,cAAc,MAGrBvtC,EAAM1iB,iBAAiB,SAAU7F,IAC/B9H,KAAK49D,cAAcxtC,EAAW3jB,MAAM5J,WAUjC+6D,cAAc/6D,GACnB,IAAI7C,KAAKS,UAAW,OAGpB,IAAIo9D,GADJh7D,EAAS0D,KAAKI,IAAI9D,EAAQ,MAGxBg7D,EAAQt3D,KAAKmD,MAAMnD,KAAKI,IAAI3G,KAAKwG,IAAK3D,IAAW,IAAM7C,KAAKwG,KAAO,OAEhExG,KAAK89D,gBACN99D,KAAK89D,cAAc11D,MAAK,GACxBpI,KAAK89D,cAAcx6D,OAAO,GAAGgI,MAAM2b,QAAU,QAG/CjnB,KAAKS,UAAU6C,OAAO,GAAGgI,MAAM2b,QAAU,IAYzC42C,EAAQ,EAIV,MAAMvuB,EAAYtvC,KAAKk9D,UAAYW,GAAS,EAAI,EAGhD79D,KAAKS,UAAUg9D,aAAanuB,GACN,IAAnBtvC,KAAKk9D,WAA6B,IAAVW,GACzB79D,KAAKS,UAAU48D,SAAS,GAI1Br9D,KAAKk9D,UAAYW,EAEjB79D,KAAKS,UAAU+D,OAMV5B,OACL,OAAG5C,KAAKoqB,YAAoBpqB,KAAKoqB,YAC1BpqB,KAAKoqB,YAAc1J,QAAQkI,IAAI,CACpC,yBAAkC,CAChCzd,UAAWnL,KAAKmL,UAChB1H,MAAM,EACNc,UAAU,EACVqe,MAAO5iB,KAAK4H,KACZob,OAAQhjB,KAAK4H,MACZ,4BAA4ByG,MAAM5N,IACnCT,KAAK89D,cAAgBr9D,EAGjBT,KAAKowB,WAAW3jB,MAAM5J,QACxBpC,EAAU+D,OAGL,sBAA+B/D,MAGxC,yBAAkC,CAChC0K,UAAWnL,KAAKmL,UAChB1H,MAAM,EACNc,UAAU,EACVqe,MAAO5iB,KAAK4H,KACZob,OAAQhjB,KAAK4H,MACZ,gCAAgCyG,MAAMnN,IACvClB,KAAKS,UAAYS,EAEblB,KAAKowB,WAAW3jB,MAAM5J,SACxB7C,KAAKS,UAAU6C,OAAO,GAAGgI,MAAM2b,QAAU,QAG3CjnB,KAAKS,UAAUkN,iBAAiB,cAAcyvD,KAIX,IAA7Bp9D,KAAKS,UAAU6uC,WAAmB8tB,GAAgBp9D,KAAKk9D,YAC1B,IAA9Bl9D,KAAKS,UAAU6uC,WAAoB8tB,GAAgBp9D,KAAKk9D,aACzDl9D,KAAKS,UAAU48D,SAAS,GACxBr9D,KAAKS,UAAU6D,SAGG,IAAjB84D,GAAyC,IAAnBp9D,KAAKk9D,WAGzBl9D,KAAK89D,gBACN99D,KAAK89D,cAAcx6D,OAAO,GAAGgI,MAAM2b,QAAU,GAC7CjnB,KAAK89D,cAAct5D,OACnBxE,KAAKS,UAAU6C,OAAO,GAAGgI,MAAM2b,QAAU,WAMxC,sBAA+B/lB,QAKrCqB,SACFvC,KAAKS,WAAWT,KAAKS,UAAU8B,SAC/BvC,KAAK89D,eAAe99D,KAAK89D,cAAcv7D,Y,4EC7IvC,MAAMw7D,EAKXh+D,YAAmBoL,EAA+BklB,GAA/B,KAAAllB,UAAAA,EAA+B,KAAAklB,MAAAA,EAJ3C,KAAAmtC,iBAAkB,EAmClB,KAAAQ,kBAAqBl2D,KAC1B,OAAYA,GACZ9H,KAAKw9D,iBAAmBx9D,KAAKw9D,gBAE7Bx9D,KAAKi+D,cAAc7qD,UAAUxJ,OAAO,aAAc5J,KAAKw9D,iBACtDx9D,KAAKqwB,MAA2BzuB,KAAO5B,KAAKw9D,gBAAkB,OAAS,WACxEx9D,KAAKu9D,6BAA+Bv9D,KAAKu9D,+BApCzCltC,EAAMzuB,KAAO,WACbyuB,EAAM3iB,aAAa,WAAY,IAC/B2iB,EAAMzY,KAAO,qBACbyY,EAAMssB,aAAe,MAGrB,MAAMuhB,EAAW9yD,SAASC,cAAc,SACxC6yD,EAAS9qD,UAAUrS,IAAI,YACvBm9D,EAASC,UAAY,EACrBD,EAASt8D,KAAO,WAChByuB,EAAM1X,cAAcjB,QAAQwmD,GAC5B7tC,EAAM1X,cAAcxB,aAAa+mD,EAASv1C,YAAa0H,EAAM6mC,aAS7D,MAAM+G,EAAgBj+D,KAAKi+D,cAAgB7yD,SAASC,cAAc,QAClE4yD,EAAc7qD,UAAUrS,IAAI,iBAAkB,SAE9CoK,EAAUiI,UAAUrS,IAAI,wBACxBoK,EAAUM,OAAOwyD,GAEjBA,EAActwD,iBAAiB,QAAS3N,KAAKg+D,mBAC7CC,EAActwD,iBAAiB,WAAY3N,KAAKg+D,oBAarC,MAAMI,UAA2B,KAG9Cr+D,YAAYotB,EAA6B,IACvCpb,MAAM,OAAD,QACHwW,WAAW,GACR4E,IAGLntB,KAAKs9D,QAAU,IAAIS,EAAqB/9D,KAAKmL,UAAWnL,KAAKqwB,U,kjBCrClD,MAAMguC,EAkBnBt+D,YACS6vB,EACC5oB,GADD,KAAA4oB,WAAAA,EACC,KAAA5oB,SAAAA,EAySH,KAAA2J,YAAoBo8B,GAAwD,EAAD,gCAChF,MAAMuxB,EAASlzD,SAASC,cAAc,OAKtC,IAAI6sB,EAJJomC,EAAOlrD,UAAUrS,IAAIs9D,EAAmBhlB,WAAa,UAAW,kBAAmB,QAEnFr5C,KAAKu+D,QAAQ9yD,OAAO6yD,GAGjBvxB,IACD7U,EAA4B,iBAAd,QACNl4B,KAAKgH,SAASgmC,iBAAiBK,SAASN,GAC7CA,EAAQ9gC,OAAuDisB,OAGpE,MAAMlO,EAAM,IAAIxE,MAChBwE,EAAI5W,UAAUrS,IAAI,gBAClBipB,EAAIw0C,WAAY,EAEhB,MAAMC,EAAe,IAAW,EAAD,gCAC7B,GAAGvmC,EAAO,CACR,MAAMzH,QAAY,OAAU,CAC1BtlB,UAAWmzD,EACXpmC,MAAAA,EACAtwB,MAAM,EAAAgwB,EAAA,GAAgBM,EAAO,IAAK,KAAK,GACvCF,kBAAkB,IAGpB,CAACvH,EAAI2H,OAAOhpB,MAAOqhB,EAAI2H,OAAOC,MAAMC,OAAOC,SAASzzB,SAASklB,IAC3DA,EAAI5W,UAAUrS,IAAI,uBAEf,CACL,MAAMm3B,QAAcl4B,KAAKgH,SAASqI,gBAAgBC,aAAatP,KAAK+H,cAC9D,OAAUu2D,EAAQt+D,KAAK+H,OAAQmwB,EAAO,YAAalO,GAG3Ds0C,EAAOlrD,UAAU7Q,OAAO,WAY1B,OATGvC,KAAKu+D,QAAQvvC,mBApWC,QAqWTyvC,KAENz+D,KAAK0+D,qBAAqBh7D,QAAQ46D,GAClCt+D,KAAK2+D,cAAch7D,IAAI26D,EAAQG,IAGjCz+D,KAAK4+D,SAEE7xB,KArVP/sC,KAAKmL,UAAYC,SAASC,cAAc,OACxCrL,KAAKmL,UAAUiI,UAAUrS,IAAIs9D,EAAmBhlB,WAAa,cAE7Dr5C,KAAKu+D,QAAUnzD,SAASC,cAAc,OACtCrL,KAAKu+D,QAAQnrD,UAAUrS,IAAIs9D,EAAmBhlB,WAAa,YAE3Dr5C,KAAK6+D,SAAWzzD,SAASC,cAAc,OACvCrL,KAAK6+D,SAASzrD,UAAUrS,IAAIs9D,EAAmBhlB,WAAa,aAE5Dr5C,KAAK8+D,KAAO1zD,SAASC,cAAc,OACnCrL,KAAK8+D,KAAK1rD,UAAUrS,IAAIs9D,EAAmBhlB,WAAa,SAExDr5C,KAAKwyB,KAAOpnB,SAASC,cAAc,OACnCrL,KAAKwyB,KAAKpf,UAAUrS,IAAIs9D,EAAmBhlB,WAAa,SAExDr5C,KAAK++D,cAAgB3zD,SAASC,cAAc,OAC5CrL,KAAK++D,cAAc3rD,UAAUrS,IAAIs9D,EAAmBhlB,WAAa,SAAU,wBAM3Er5C,KAAKg/D,UAAY5zD,SAASC,cAAc,OACxCrL,KAAKg/D,UAAU5rD,UAAUrS,IAAIs9D,EAAmBhlB,WAAa,SAAUglB,EAAmBhlB,WAAa,cAAe,oBAMtHr5C,KAAKmL,UAAUM,OAAOzL,KAAKu+D,QAASv+D,KAAK6+D,SAAU7+D,KAAK8+D,KAAM9+D,KAAKwyB,KAAMxyB,KAAK++D,cAAe/+D,KAAKg/D,WAElGh/D,KAAK2+D,cAAgB,IAAIp9D,IACzBvB,KAAK0R,eAAiB,IAAI,IAE1B,MAAMutD,EAAiB,IACY,IAA9Bj/D,KAAK4vB,WAAWoG,YACjBh2B,KAAK4vB,WAAW4F,kBAAkB,CAChCtzB,QAASlC,KAAK4vB,WAAWzkB,UAAUiK,kBACnCqgB,SAAU,WAEL,GAMLypC,EAAc,EAAI,EACxB,IAAI7yB,GAAS,EACT8yB,GAAS,GACb,QAAiBn/D,KAAKmL,WAAiBi0D,GAAO,EAAD,gCAC3C,GAAGD,EAED,YADA,EAAArlD,EAAA,GAAYslD,GAId,GAAG/yB,EAED,YADAA,GAAS,GAIX,IAAI4yB,IACF,OAGF,MAAMp9C,EAAO7hB,KAAKmL,UAAU2W,wBAItB0E,EADI44C,EACE30B,MAEN40B,EAAS74C,EAAI3E,EAAKI,KACxB,IAAKjiB,KAAKuI,WAAWK,SAAS/F,SAAW7C,KAAKuI,WAAWoB,KAAK9G,QAC3Dw8D,EAAUx9C,EAAKe,MAAQs8C,GAAgBG,EAAUx9C,EAAKe,MAAQf,EAAKe,MAAQs8C,EAAe,CAC3F,MAAMn3D,EAAS/H,KAAK+H,OAEdwuB,EAAsF,GAC5Fv2B,KAAKuI,WAAWK,SAAS0V,OAAOte,KAAKuI,WAAWC,QAASxI,KAAKuI,WAAWoB,MAAM7E,SAAQ,CAAC9B,EAAM8F,KAC5FytB,EAAQl0B,KAAK,CACXH,QAAmBlC,KAAKu+D,QAAQ1pC,SAAS/rB,GACzC9F,KAAAA,OAIJ,MAAMsS,EAAcihB,EAAQG,MAAM,EAAG12B,KAAKuI,WAAWK,SAAS/F,QACxD0S,EAAcghB,EAAQG,MAAM12B,KAAKuI,WAAWK,SAAS/F,OAAS,GAE9DxC,EAASL,KAAKu+D,QAAQ1pC,SAAS70B,KAAKuI,WAAWK,SAAS/F,QAC9Ds8D,GAAS,GACT,OAAiB9+D,EAAQ0H,GAAQ,IAAMA,IAAW/H,KAAK+H,QAAQ/H,KAAKuI,WAAWC,QAAS8M,EAAaC,GACrG4pD,GAAS,MACJ,CACL,MACMG,EAAU94C,EADA3E,EAAKu5B,MAASv5B,EAAKe,MAAQ,EAQ3C,IAAIivB,EAHJ7xC,KAAKu+D,QAAQnrD,UAAUrS,IAAI,iBACtBf,KAAKu+D,QAAQx7C,WAIwD8uB,EAD7C,IAA1B7xC,KAAKuI,WAAWmlB,OAAgB4xC,EAC3Bt/D,KAAKuI,WAAWmlB,QAAW1tB,KAAKuI,WAAWmoB,MAAQ,GAAM4uC,IAAsBt/D,KAAKuI,WAAWmoB,MAAQ,GAC/F4uC,EAAU,GAAK,EAFwBt/D,KAAKuI,WAAWmoB,MAAQ,EAG/E1wB,KAAKuI,WAAWU,GAAG4oC,IAEnB,SAAQ,KACN7xC,KAAKu+D,QAAQnrD,UAAU7Q,OAAO,yBAIjC,CAACmP,eAAgB1R,KAAK0R,iBAEzB,MAAM6tD,EAAkB,KACtBlzB,GAAS,EACTjhC,SAASI,KAAKmC,iBAAiB,IAAqB,WAAa,SAAU7F,IACzEukC,GAAS,IACR,CAACr+B,MAAM,KAGZ,IAAI4U,EAAQ,EAAG4D,EAAI,EAAGtG,EAAY,EAAwBs/C,EAAO,EAC5Cx/D,KAAKy0B,aAAe,IAAI,IAAa,CACxDvyB,QAASlC,KAAKu+D,QACdp/C,QAAS,CAACC,EAAOC,KACfa,EAAYd,EACZ,IAAIqgD,EAAQj5C,EAAIpH,GAASi/C,EAAmBqB,MAM5C,OALGD,EAAQ,EAAGA,EAAQ,EACdA,EAAQD,IAAMC,EAAQD,GAE9Bx/D,KAAKu+D,QAAQjzD,MAAM8Q,UAAYiiD,EAAmBsB,mBAAmB15C,QAAQ,MAAOw5C,EAAQ,OAErF,GAETjgD,kBAAoB1X,GACdm3D,KAIMj/D,KAAKmL,UAAUiI,UAAUqB,SAAS,eAAgB0qD,GAH1DI,KACA,EAAAzlD,EAAA,GAAYhS,IACL,GAOXuY,aAAc,KACZ,MAAMwB,EAAO7hB,KAAKu+D,QAAQz8C,wBAC1Bc,EAAQf,EAAKe,MACb48C,GAAQ58C,GAAS5iB,KAAKwyB,KAAKxD,kBAAoB,GAI/CxI,EAAI3E,EAAKI,KAAOjiB,KAAKmL,UAAU2W,wBAAwBG,KAEvDjiB,KAAKu+D,QAAQjzD,MAAM8Q,UAAYiiD,EAAmBsB,mBAAmB15C,QAAQ,MAAOO,EAAI,MAExFxmB,KAAKmL,UAAUiI,UAAUrS,IAAI,cAC7Bf,KAAKu+D,QAAQnrD,UAAUrS,IAAI,iBACtBf,KAAKu+D,QAAQx7C,YAEpBzC,QAAS,KACP,MAAMs/C,EAAWr5D,KAAK6pC,KAAK7pC,KAAK+Y,IAAIY,IAAc0C,EAAQy7C,EAAmBqB,SAAWx/C,GAAa,EAAI,GAAK,GAC9Gq/C,IAIAv/D,KAAKu+D,QAAQnrD,UAAU7Q,OAAO,kBAC9B,SAAQ,KACNvC,KAAKuI,WAAWU,GAAG22D,GACnB5/D,KAAKmL,UAAUiI,UAAU7Q,OAAO,oBAKtCvC,KAAK0+D,qBAAuB,IAAIx+D,sBAAsBC,IACpDA,EAAQ2E,SAAS1E,IACXA,EAAMS,gBAIVb,KAAK6/D,oBAAoBz/D,EAAMC,cAmBxBy/D,QAAQ/3D,G,yCACnB/H,KAAK+H,OAASA,EAEd,MAAMmwB,QAAcl4B,KAAKgH,SAASqI,gBAAgBC,aAAavH,GAC/D,IAAImwB,EACF,OAGF,MAAM3vB,EAA+CvI,KAAKuI,WAAa,IAAI,IAAW,CACpFkI,UAAW,GACXq8B,SAAU,CAAC7F,EAAQp2B,EAAOJ,KACxB,IAAII,EAAO,OAAO6P,QAAQxS,QAAQ,CAACwiB,WAAO1sB,EAAWiqB,MAAO,KAE5D,GAAGlmB,EAAOg2B,SAAU,CAClB,MAAMxN,EAA2B0W,EACjC,OAAOjnC,KAAKgH,SAASgmC,iBAAiBC,cAAcllC,EAAQwoB,EAAO9f,GAAWpC,MAAM5B,IAC3E,CACLikB,MAAOjkB,EAAMikB,MACbzC,MAAOxhB,EAAMygC,WAGZ,CACL,MAAMzV,EAAwF,GAe9F,OAdIlvB,EAAWC,SACbivB,EAASp1B,KAAKrC,KAAKgH,SAASo4B,kBAAkBE,YAAYv3B,EAAOs0B,aAGnE5E,EAASp1B,KAAKrC,KAAKgH,SAAS8G,mBAAmBkyB,UAAU,CACvDj4B,OAAAA,EACAwoB,MAAO3d,OAAOC,iBACdZ,YAAa,CACXxC,EAAG,iCAEL+gB,MAAO/f,EACPsvD,UAAW,KAGNr/C,QAAQkI,IAAI6O,GAAUppB,MAAWi6B,GAAW,EAAD,gCAChD,MAAM77B,EAAQ67B,EAAOvjB,MAIrB,IAFA,EAAAi7C,EAAA,GAAyBvzD,IAErBlE,EAAWC,QAAS,CACtB,MAAM+2B,EAAW+I,EAAO,GAClBpgC,GAAU,EAAA64B,EAAA,GAAct0B,EAAM2gB,SAAUllB,GACnCA,EAAmC+D,OAAuDisB,MAAMvwB,KAAO43B,EAAS0gC,WAAWt4D,KAGtIY,EAAWC,QAAUN,UAAiBlI,KAAKgH,SAAS8G,mBAAmBoyD,0BAA0BlgE,KAAK+H,OAAQw3B,EAAS0gC,aAIzH,MAAO,CACLvvC,MAAOjkB,EAAMikB,MACbzC,MAAOxhB,EAAM2gB,gBAKrBzc,YAAa3Q,KAAK2Q,YAClBC,OAAQ,CAAC5N,EAAM6N,KACb,MAAMlJ,EAAK3H,KAAKuI,WAAWmlB,MAErBlH,EAAI,IAAM63C,EAAmBqB,MAAQ/3D,EAC3C3H,KAAKu+D,QAAQjzD,MAAM8Q,UAAYiiD,EAAmBsB,mBAAmB15C,QAAQ,MAAO,IAAIO,MAExF,MAAM25C,EAAYngE,KAAKwyB,KAAKhb,cAAc,WACvC2oD,GAAWA,EAAU/sD,UAAU7Q,OAAO,UAE7BvC,KAAKwyB,KAAKqC,SAASltB,GAC3ByL,UAAUrS,IAAI,UAElBf,KAAK6/D,oBAAoB7/D,KAAKu+D,QAAQ1pC,SAASltB,OAIpC,qBAAZuwB,EAAMzoB,IACPlH,EAAWC,QAAU0vB,EAAMkoC,gBAGvBpgE,KAAK2Q,YAAYpI,EAAWC,SAGlCD,EAAW3F,MAAK,MAGXg8D,SACL,MAAM7rD,EAAM3H,SAASC,cAAc,OACnC0H,EAAIK,UAAUrS,IAAIs9D,EAAmBhlB,WAAa,QAClDr5C,KAAKwyB,KAAK/mB,OAAOsH,GAEkB,IAAhC/S,KAAKwyB,KAAKxD,mBACXjc,EAAIK,UAAUrS,IAAI,UAGpBf,KAAKmL,UAAUiI,UAAUxJ,OAAO,YAAa5J,KAAKwyB,KAAKxD,mBAAqB,GAoDtE6wC,oBAAoBx/D,GAC1B,MAAMw0B,EAAWjc,MAAMC,KAAKxY,EAAOsY,cAAckc,UAC3C/rB,EAAM+rB,EAAShb,QAAQxZ,GACfw0B,EAAS6B,MAAMnwB,KAAKC,IAAI,EAAGsC,EAnXxB,GAmX6CvC,KAAKI,IAAIkuB,EAAShyB,OAAQiG,EAnXvE,IAqXXhE,SAASzE,IACb,MAAM28C,EAAWh9C,KAAK2+D,cAAc17D,IAAI5C,GACrC28C,IACDA,IACAh9C,KAAK2+D,cAAc19D,OAAOZ,GAC1BL,KAAK0+D,qBAAqB57D,UAAUzC,OAKnC4a,U,MACLjb,KAAK0R,eAAeC,YACpB3R,KAAKy0B,aAAavZ,kBACO,QAAzB,EAAAlb,KAAK0+D,4BAAoB,SAAElE,cA/Xd,EAAAnhB,WAAa,kBACb,EAAAqmB,MAAQ,IAAwB,EAAI,EACpC,EAAAC,mBAAqB,IAAwB,mCAAmCtB,EAAmBqB,SAAW,oB,4VCD/H,MAAMW,EAAU,CAACxsD,EAA0CsmB,MAEzD,EAAAV,EAAA,GAAaU,EAAIrrB,MAAO+E,GAAQ,IAChCsmB,EAAIhvB,UAAUG,MAAM2b,QAAUpT,EAAO,GAAK,QAI7B,MAAMysD,EAqBnBvgE,YACUiH,EACD4oB,EACCle,EACAu0B,GAAW,GAHX,KAAAj/B,SAAAA,EACD,KAAA4oB,WAAAA,EACC,KAAAle,eAAAA,EACA,KAAAu0B,SAAAA,EAsLF,KAAAs6B,cAAgB,CAACC,GAAY,KACnC,MAAMz4D,EAAS/H,KAAK+H,OAEpB,GADA/H,KAAKkC,QAAQkR,UAAUxJ,OAAO,QAAS7B,IAAWyV,EAAA,QAC9CzV,IAAWyV,EAAA,SAAmBzV,IAAU/H,KAAKimC,UAEjD,OAAO9U,EAAA,gBACLppB,EACA/H,KAAKq6B,SACLmmC,GACA,GACA,IAAMz4D,IAAW/H,KAAK+H,SACrB/H,KAAKimC,UACN53B,MAAM2uC,IACHA,GACDA,QAlMA,KACFh9C,KAAK4vB,WAAWzkB,UAAUiI,UAAUrS,IAAI,eAGtC2Q,IACF1R,KAAK0R,eAAiB,IAAI,KAIvBmgB,OACL7xB,KAAK6xB,KAAO,KAGZ7xB,KAAKkC,QAAUkJ,SAASC,cAAc,OACtCrL,KAAKkC,QAAQkR,UAAUrS,IAAI,mBAE3Bf,KAAK+jC,QAAU,IAAI,KAAe,CAChC08B,aAAa,IAGfzgE,KAAKs+D,OAAS,IAAI,IAClBt+D,KAAKs+D,OAAOlrD,UAAUrS,IAAI,iBAAkB,cAC5Cf,KAAKs+D,OAAOr4B,SAAWjmC,KAAKimC,SAC5BjmC,KAAKs+D,OAAOvwB,mBAEZ/tC,KAAK4X,KAAOxM,SAASC,cAAc,OACnCrL,KAAK4X,KAAKxE,UAAUrS,IAAI,gBAExBf,KAAKq6B,SAAWjvB,SAASC,cAAc,OACvCrL,KAAKq6B,SAASjnB,UAAUrS,IAAI,oBAE5Bf,KAAK0gE,IAAM,IAAI,KAAI,CACjB5xD,MAAO,IACP6xD,gBAAiB,UACjB/sD,KAAM,OACN8a,UAAiB5mB,GAAM,kCACrB,GAAyC,MAArCA,EAAEzH,OAAuBoc,QAC3B,OAGF,MAAM4b,QAAar4B,KAAKgH,SAASo4B,kBAAkBwhC,mBAAmB5gE,KAAK+H,SAC3E,OAAoBswB,EAAKwoC,QACzB,EAAAvV,EAAA,IAAM,YAAY,aAAa,OAEjC55C,eAAgB1R,KAAK0R,iBAGvB1R,KAAK0gE,IAAI5xD,MAAMsE,UAAUrS,IAAI,YAE7Bf,KAAKs8B,SAAW,IAAI,KAAI,CACtBxtB,MAAO,IACP6xD,gBAAiB,WACjB/sD,KAAM,WACN8a,UAAW,IAAW,kCACpB,MAAMgN,QAAkC17B,KAAKgH,SAASqI,gBAAgBssB,QAAQ37B,KAAK+H,SACnF,OAAoB,IAAM2zB,EAAKY,WAC/B,EAAAgvB,EAAA,IAAM,YAAY,kBAAkB,OAEtC55C,eAAgB1R,KAAK0R,iBAGvB1R,KAAK28B,MAAQ,IAAI,KAAI,CACnB7tB,MAAO,IACP6xD,gBAAiB,QACjB/sD,KAAM,QACN8a,UAAW,IAAW,kCACpB,MAAMgN,QAAmB17B,KAAKgH,SAASy1B,gBAAgBC,QAAQ18B,KAAK+H,SACpE,OAAoB,IAAM2zB,EAAKiB,QAC/B,EAAA2uB,EAAA,IAAM,YAAY,eAAe,OAEnC55C,eAAgB1R,KAAK0R,iBAGvB1R,KAAK8gE,KAAO,IAAI,KAAI,CAClBhyD,MAAO,IACP6xD,gBAAiB,oBACjB/sD,KAAM,OACN8a,UAAW,MACT,OAAoB1uB,KAAK8gE,KAAKhyD,MAAMwJ,cAGpC,EAAAgzC,EAAA,IAAM,YAAY,cAAc,KAGlC55C,eAAgB1R,KAAK0R,iBAGvB1R,KAAKmsB,SAAW,IAAI,KAAI,CACtBrd,MAAO,IACP6xD,gBAAiB,eACjB/sD,KAAM,aAGR5T,KAAK+jC,QAAQvxB,QAAQ/G,OACnBzL,KAAK28B,MAAMxxB,UACXnL,KAAKs8B,SAASnxB,UACdnL,KAAKmsB,SAAShhB,UACdnL,KAAK0gE,IAAIv1D,UACTnL,KAAK8gE,KAAK31D,WAGZ,MAAM,eAACuG,GAAkB1R,KACtBA,KAAKimC,WACNjmC,KAAK+gE,cAAgB,IAAI,KAAI,CAC3Bh7B,cAAe,IAAI,IAAc,CAACn8B,QAAQ,IAC1CyoD,aAAc,gBACdz+C,KAAM,SACNlC,eAAgB1R,KAAK0R,iBAGvBA,EAAe3Q,IAAIf,KAAK+gE,cAAch7B,cAAc1V,MAApD3e,CAA2D,UAAW5J,IAChEA,EAAE0B,WAKNxJ,KAAKgH,SAAS8G,mBAAmBkzD,eAAehhE,KAAK+H,WAGvD2J,EAAe3Q,IAAIyc,EAAA,EAAnB9L,CAA8B,0BAAgC2W,GAAW,kCACvE,GAAGroB,KAAK+H,SAAWsgB,EAAOtgB,OAAQ,CAChC,MAAM+E,QAAc9M,KAAKgH,SAASi6D,wBAAwBC,iBAAiBlhE,KAAK+H,QAAQ,GACxF/H,KAAK+gE,cAAch7B,cAAcxB,SAAWz3B,QAIhD9M,KAAK+jC,QAAQvxB,QAAQ/G,OAAOzL,KAAK+gE,cAAc51D,YAGjDnL,KAAKkC,QAAQuJ,OAAOzL,KAAK+jC,QAAQ54B,WAE9B,KACDnL,KAAKkC,QAAQuJ,QAAO,WAGtBiG,EAAe3Q,IAAIyc,EAAA,EAAnB9L,CAA8B,gBAAgB,EAAE3J,OAAAA,MAC3C/H,KAAK+H,SAAWA,GACjB/H,KAAKugE,mBAIT7uD,EAAe3Q,IAAIyc,EAAA,EAAnB9L,CAA8B,iBAAkB3J,IAC3CA,IAAW/H,KAAK+H,QACjB/H,KAAKmhE,gBAAe,MAIxBzvD,EAAe3Q,IAAIyc,EAAA,EAAnB9L,CAA8B,mBAAoB3J,IAC7CA,IAAW/H,KAAK+H,QACjB/H,KAAKohE,kBAIT1vD,EAAe3Q,IAAIyc,EAAA,EAAnB9L,CAA8B,eAAgB2vD,IACzCrhE,KAAK+H,SAAWs5D,EAAOpvC,YACxBjyB,KAAKugE,mBAIT7uD,EAAe3Q,IAAIyc,EAAA,EAAnB9L,CAA8B,mBAAyB2vD,GAAW,kCAC7DrhE,KAAK+H,SAAWs5D,EAAOpvC,oBACLjyB,KAAKgH,SAASy1B,gBAAgBC,QAAQ2kC,IAChD7zD,OAAO8zD,MAASthE,KAAKimC,UAC5BjmC,KAAKuhE,sBAKX7vD,EAAe3Q,IAAIyc,EAAA,EAAnB9L,CAA8B,iBAAkB3J,IAC3C/H,KAAK+H,SAAWA,GAGjB/H,KAAKwhE,eAKTxhE,KAAKyhE,sBAAwBluD,OAAOmuD,YAAY1hE,KAAKugE,cAAe,KAsB/Dx+B,cACL,CACE/hC,KAAK0gE,IACL1gE,KAAK28B,MACL38B,KAAKs8B,SACLt8B,KAAKmsB,SACLnsB,KAAK8gE,MACLh8D,SAASq1B,IACTA,EAAIhvB,UAAUG,MAAM2b,QAAU,UAG7BjnB,KAAK+gE,gBACN/gE,KAAK+gE,cAAc51D,UAAUG,MAAM2b,QAAU,GAC7CjnB,KAAK+gE,cAAch7B,cAAcxB,SAAU,GAG7CvkC,KAAK2hE,6BAGCC,gBACN,OAAO5hE,KAAK+H,SAAWyV,EAAA,SAAmBxd,KAAKimC,SAGnCu7B,Y,yCACZ,GAAGxhE,KAAK4hE,wBACc5hE,KAAKgH,SAASqI,gBAAgBC,aAAatP,KAAK+H,SAE1D,CACR,MAAM85D,EAAa7hE,KAAKu+D,QAcxB,OAbAv+D,KAAKu+D,QAAU,IAAIF,EAAmBr+D,KAAK4vB,WAAY5vB,KAAKgH,gBACtDhH,KAAKu+D,QAAQuB,QAAQ9/D,KAAK+H,QAChC/H,KAAKu+D,QAAQO,KAAKrzD,OAAOzL,KAAK4X,KAAM5X,KAAKq6B,UAEzCr6B,KAAKs+D,OAAO/7D,SAETs/D,EAAYA,EAAW12D,UAAU6d,YAAYhpB,KAAKu+D,QAAQpzD,WACxDnL,KAAKkC,QAAQwV,QAAQ1X,KAAKu+D,QAAQpzD,gBAEpC,KACDnL,KAAK4vB,WAAWzkB,UAAUiI,UAAUrS,IAAI,aAO3C,KACDf,KAAK4vB,WAAWzkB,UAAUiI,UAAU7Q,OAAO,YAG1CvC,KAAKu+D,UACNv+D,KAAKu+D,QAAQpzD,UAAU5I,SACvBvC,KAAKu+D,QAAQtjD,UACbjb,KAAKu+D,aAAUv6D,SAGXhE,KAAKs+D,OAAOz1C,kBAAkB,CAAC9gB,OAAQ/H,KAAK+H,SAElD/H,KAAK+jC,QAAQvxB,QAAQkF,QAAQ1X,KAAKs+D,OAAQt+D,KAAK4X,KAAM5X,KAAKq6B,aAG9C+mC,e,yCACZ,MAAM,OAACr5D,GAAU/H,KACjB,GAAG+H,EAAOg2B,UAAY/9B,KAAK4hE,gBAAiB,CAC1C,MAAMtlC,QAAiBt8B,KAAKgH,SAASqI,gBAAgBktB,gBAAgBx0B,GACrE,OAAOs4D,EAAQ/jC,EAAUt8B,KAAKs8B,cAIpBilC,gB,yCACZ,MAAM,OAACx5D,GAAU/H,KACjB,GAAG+H,EAAOg2B,UAAY/9B,KAAK4hE,gBAAiB,CAC1C,MAAMplC,QAAax8B,KAAKgH,SAASy1B,gBAAgBC,QAAQ30B,GACzD,OAAOs4D,EAAQ7jC,EAAKG,OAAQ,EAAAmlC,EAAA,GAAgBtlC,EAAKG,YAAS34B,EAAWhE,KAAK28B,WAIhEolC,oB,yCACZ,MAAMC,EAAmBhiE,KAAK+gE,cAC9B,GAAIiB,EAIJ,GAAGhiE,KAAK4hE,gBAAiB,CACvB,MAAM90D,QAAc9M,KAAKgH,SAASi6D,wBAAwBC,iBAAiBlhE,KAAK+H,QAAQ,GACxFi6D,EAAiBj8B,cAAcxB,SAAWz3B,OAE1C,SAAQ,KACNk1D,EAAiB72D,UAAUG,MAAM2b,QAAU,aAKnCg7C,W,yCACZ,MAAMl6D,EAAS/H,KAAK+H,aAEd2Y,QAAQkI,IAAI,CAChB5oB,KAAKohE,eACLphE,KAAKuhE,gBACLvhE,KAAK+hE,oBACL/hE,KAAKmhE,iBACL,KAAY,kCACV,MAAOj/D,SAA8Bwe,QAAQkI,IAAI,EAC/C,OAAc,CACZ7gB,OAAAA,EACAsgB,OAAQroB,KAAKimC,SACbi8B,WAAW,OAKf,EAAAn5C,EAAA,GAAe/oB,KAAK4X,KAAM1V,MAV5B,GAaAlC,KAAKugE,eAAc,QAIV4B,sB,yCACPniE,KAAKoiE,UACTpiE,KAAKoiE,SAAU,EAEfpiE,KAAK+hC,oBACCrhB,QAAQkI,IAAI,CAChB5oB,KAAKwhE,YACLxhE,KAAKiiE,iBAIKI,gBAAgBt6D,EAAgBu6D,G,yCAK5C,GAHAjC,EAAQiC,EAASzB,OAAQ,EAAAhnC,EAAA,IAAayoC,EAASzB,YAAS78D,EAAWhE,KAAK0gE,MAGpE34D,EAAOg2B,SAAU,CACnB,MAAM+b,QAA2B95C,KAAKgH,SAASi4B,gBAAgBsjC,QAAQx6D,EAAOs0B,YAC9E,GAAGyd,EAAKxd,SACN+jC,EAAQ,gBAAkBvmB,EAAKxd,SAAUt8B,KAAK8gE,UACzC,CACL,MAAM0B,EAAkBF,EAAkCG,gBACjC,wBAAtBD,MAAAA,OAAc,EAAdA,EAAgB/yD,IACjB4wD,EAAQmC,EAAe1B,KAAM9gE,KAAK8gE,OAKxC,MAAM30C,EAAYm2C,EAAkCn2C,SAClC,oBAAfA,MAAAA,OAAQ,EAARA,EAAU1c,IACX4wD,EAAQl0C,EAASu2C,QAAS1iE,KAAKmsB,UAGjCnsB,KAAK2iE,sBAAwBpvD,OAAO7Q,YAAW,IAAM1C,KAAKmhE,gBAAe,IAAO,QAGpEA,eAAen/D,G,yCAC3BhC,KAAK2hE,6BAEL,MAAM55D,EAAS/H,KAAK+H,OACd+K,EAAW9S,KAAK8S,SAEtB,IAAI/K,UAAgB/H,KAAKgH,SAASqI,gBAAgBuzD,aAAa76D,MAAY/H,KAAK4hE,gBAC9E,OAGF,MAAMt5B,QAAetoC,KAAKgH,SAAS67D,aAAazjC,kBAAkBwhC,mBAAmB74D,EAAQ/F,GACvF8gE,EAAax6B,EAAOA,OAAOj6B,MAAWi0D,GAAa,kCACpDtiE,KAAK+H,SAAWA,GAAU/H,KAAK8S,WAAaA,UAAkB9S,KAAKgH,SAASqI,gBAAgBuzD,aAAa76D,YAKtG/H,KAAKqiE,gBAAgBt6D,EAAQu6D,SAGlCh6B,EAAOy6B,eACFD,MAIHhD,QAAQ/3D,EAAgB+K,EAAW,G,MACrC9S,KAAK+H,SAAWA,GAAU/H,KAAK8S,WAAaA,IAEtC,QAAT,EAAA9S,KAAK6xB,YAAI,oBAET7xB,KAAK+H,OAASA,EACd/H,KAAK8S,SAAWA,EAEhB9S,KAAKoiE,SAAU,GAGVT,kCAC6B39D,IAA/BhE,KAAK2iE,wBACNrvD,aAAatT,KAAK2iE,uBAClB3iE,KAAK2iE,2BAAwB3+D,GAI1BF,U,MACL9D,KAAK+H,OAAS/H,KAAK8S,cAAW9O,EAC9BhE,KAAK2hE,6BACLqB,cAAchjE,KAAKyhE,uBACP,QAAZ,EAAAzhE,KAAKu+D,eAAO,SAAEtjD,a,2JChcH,SAAegoD,EAC5Bl7D,EACA2qB,EACAwwC,EACAC,EACAC,G,qCAEA,MAAMt+C,EAAsB,GACtB4W,QAA0Ble,EAAA,mCAA2CzV,GAS3E,GARI2zB,EAAsBluB,OAAO61D,WAAaH,GAC5Cp+C,EAASziB,KCzBE,WACb,MAAMgyB,EAAOjpB,SAASC,cAAc,QACpCgpB,EAAKjhB,UAAUrS,IAAI,gBAAiB,SAEpC,MACM+nC,EAAM19B,SAAS0a,gBAAgB,6BAA8B,OACnEgjB,EAAI/iB,eAAe,KAAM,UAAW,aACpC+iB,EAAI/iB,eAAe,KAAM,QAAS,MAClC+iB,EAAI/iB,eAAe,KAAM,SAAU,MACnC+iB,EAAI11B,UAAUrS,IAAI,qBAElB,MAAMqlB,EAAMhb,SAAS0a,gBAAgB,6BAA8B,OACnEM,EAAIL,eAAe,KAAM,OAAQ,6BACjCK,EAAIhT,UAAUrS,IAAI,4BAElB,MAAMuiE,EAAOl4D,SAAS0a,gBAAgB,6BAA8B,OASpE,OARAw9C,EAAKv9C,eAAe,KAAM,OAAQ,wBAClCu9C,EAAKlwD,UAAUrS,IAAI,uBAGnB+nC,EAAIr9B,OAAO63D,EAAMl9C,GAEjBiO,EAAK5oB,OAAOq9B,GAELzU,EDCSkvC,KAGX7nC,EAAsBluB,OAAOg2D,OAAS9nC,EAAmBluB,OAAOi2D,MAAUN,GAC7Er+C,EAASziB,MAAK,EAAAoxD,EAAA,GAAkB/3B,EAAmBluB,OAAOi2D,OAGxD/nC,EAAmBluB,OAAOk2D,UAAYN,EAAe,CACvD,MAAMO,EAAejoC,EAAmBkoC,aACrCD,GAAeA,EAAYl0D,EA8B5BqV,EAASziB,KEhEA,WACb,MAAMgyB,EAAOjpB,SAASC,cAAc,QAEpC,OADAgpB,EAAKjhB,UAAUrS,IAAI,eAAgB,cAC5BszB,EF6DWwvC,IAIlB,OAAO/+C,G,+RGrCT,MAAMg/C,EAA2C,IAAIC,QAErDvmD,EAAA,mBAA2B,mBAAoBzV,IAC5B6Q,MAAMC,KAAKzN,SAAS+M,iBAAiB,6BAA6BpQ,QAC1EjD,SAAS5C,IAChB,MAAM4mB,EAAYg7C,EAAQ7gE,IAAIf,GAC9B4mB,MAAAA,GAAAA,EAAW0U,eAIA,MAAMwmC,EAcnBjkE,YAAYotB,GAVJ,KAAA5E,WAAY,EACZ,KAAAD,eAAgB,EAChB,KAAAD,QAAS,EASfroB,KAAKkC,QAAUkJ,SAASC,cAAc,QACtCrL,KAAKkC,QAAQkR,UAAUrS,IAAI,cAC3Bf,KAAKkC,QAAQwL,aAAa,MAAO,QAE9Byf,GACDntB,KAAKw9B,OAAOrQ,GAGd22C,EAAQngE,IAAI3D,KAAKkC,QAASlC,MAGrBikE,WAAW92C,GAChB,GAAIA,EAIJ,IAAI,MAAMzJ,KAAKyJ,EAAS,CAEtB,MAAM1gB,EAAQ0gB,EAAQzJ,GAED,iBAAZ,IAEP1jB,KAAKkC,QAAQyjB,QAAQjC,GAAKjX,EAAQ,IAAwB,kBAAZ,GAAyBA,EAAQA,GAAS,KAI1FzM,KAAK0jB,GAAKjX,GAID+wB,OAAOrQ,G,qDAClBntB,KAAKikE,WAAW92C,GAEhB,IAYI+2C,EAZAC,EAAWnkE,KAAKmkE,SACpB,QAAgBngE,IAAbmgE,EAMD,YALyBngE,IAAtBhE,KAAKokE,eACND,GAAW,EAAAC,EAAA,GAAaD,EAAUnkE,KAAKokE,aAAcpkE,KAAKokE,oBAG5D,EAAA3qC,EAAA,GAAaz5B,KAAKkC,SAAS,EAAAsmB,EAAA,GAAc27C,IAO3C,GAHW,QAAX,EAAAnkE,KAAK+H,cAAM,QAAX/H,KAAK+H,OAAW,MAGb/H,KAAK+H,SAAWyV,EAAA,QAAmBxd,KAAKqoB,QAoBzC,EAAAU,EAAA,GAAe/oB,KAAKkC,SAAS,QAAKlC,KAAKsoB,cAAgB,QAAU,sBApBhB,CACjD,MAAMthB,EAAwB,QAAb,EAAAhH,KAAKgH,gBAAQ,QAAIwW,EAAA,YAC3B1O,EAAOu1D,SAAe3jD,QAAQkI,IAAI,EACvC,EAAA07C,EAAA,GAAatkE,KAAK+H,OAAQ/H,KAAKuoB,UAAWvoB,KAAKsoB,cAAetoB,KAAKokE,aAAcp9D,GAChFhH,KAAKkiE,WAAae,EAAmBjjE,KAAK+H,OAAQ/H,KAAK0yB,aAAiB1yB,KAAKukE,iBAAmBtB,EAAmBjjE,KAAK+H,OAAQ/H,KAAK0yB,YAAY,GAAM,KAG1J,GAAG2xC,MAAAA,OAAK,EAALA,EAAOxhE,OAAQ,CAChB,MAAM2hE,EAAQp5D,SAASC,cAAc,QACrCm5D,EAAMpxD,UAAUrS,IAAI,oBACpBmjE,GAAW,GACX,EAAAzqC,EAAA,GAAa+qC,EAAO11D,GAEpB,MAAMwmD,EAAWlqD,SAASq5D,yBAC1BnP,EAAS7pD,OAAO+4D,KAAUH,IAC1B,EAAA5qC,EAAA,GAAaz5B,KAAKkC,QAASozD,QAE3B,EAAA77B,EAAA,GAAaz5B,KAAKkC,QAAS4M,GAM5B9O,KAAKkkE,WAAaA,IACnBlkE,KAAKkkE,SAAWA,EAChBlkE,KAAKkC,QAAQkR,UAAUxJ,OAAO,aAAcs6D,K,yXChHnC,MAAMQ,UAAoB,IAgBvC3kE,cACEgS,MAAM,eAAgB,CAAC4yD,UAAU,EAAMC,aAAa,IAZ9C,KAAAr/C,MAAQ,IAAIC,MAIZ,KAAAq/C,QAAU,CAChBC,KAAM,OACNC,eAAgB,QAQhB/kE,KAAKglE,GAAK55D,SAASC,cAAc,OACjC,QAAMrL,KAAKglE,GAAI,sBAEfhlE,KAAKilE,SAAS7xD,UAAU7Q,OAAO,YAE/BvC,KAAKwjD,OAAO/3C,OAAOzL,KAAKglE,IAExBhlE,KAAKklE,cAAgB95D,SAASC,cAAc,OAC5CrL,KAAKklE,cAAc9xD,UAAUrS,IAAI,QACjCf,KAAKklE,cAAcz5D,OAAOzL,KAAKulB,OAE/BvlB,KAAKqwB,MAAQjlB,SAASC,cAAc,SACpCrL,KAAKqwB,MAAMzuB,KAAO,OAClB5B,KAAKqwB,MAAM/kB,MAAM2b,QAAU,OAC3BjnB,KAAK0R,eAAe3Q,IAAIf,KAAKqwB,MAA7BrwB,CAAoC,UAAW8H,IAC7C,MAAMq9D,EAAOr9D,EAAEzH,OAAO+kE,MAAM,GACxBD,IAIJ,EAAAE,EAAA,GAAkBF,GAAM92D,MAAMi3D,IAC5BtlE,KAAKulB,MAAQ,IAAIC,MACjBxlB,KAAKklE,cAAcz5D,OAAOzL,KAAKulB,OAC/BvlB,KAAKulB,MAAM5iB,IAAM2iE,EAEjBtlE,KAAKulB,MAAMggD,OAAS,KAIlBvlE,KAAK+qB,OAEL/qB,KAAK6kE,QC3Df,SAAyBW,EAAiCliE,GACxD,IAAImiE,EACFt6D,EACAu6D,EACAC,EAOK,GAMLC,EAAW,EACXC,EAAU,EACVC,EAAY,EACZC,EAAa,EACbC,EAAc,EA8BhB,SAASn0C,IACP2zC,EAAcpyD,UAAUrS,IAAI,aAC5BykE,EAAchH,WAAY,EAE1BkH,EAAY,IAAIlgD,MAChBkgD,EAAU/iE,IAAM6iE,EAAc7iE,IAC9B+iE,EAAUlH,WAAY,EACtBkH,EAAUtyD,UAAUrS,IAAI,sBAEpBuC,IACFA,EAAS8H,SAASC,cAAc,WAGlCo6D,EAAgBr6D,SAASC,cAAc,OACvCo6D,EAAcryD,UAAUrS,IAAI,kBAE5BoK,EAAYC,SAASC,cAAc,OACnCF,EAAUiI,UAAUrS,IAAI,gBAExB,MAAMklE,EAAe76D,SAASC,cAAc,OAC5C46D,EAAa7yD,UAAUrS,IAAI,sBAE3B0kE,EAAcruD,YAAYjM,GACVq6D,EAActuD,WACtBE,YAAYquD,GACpBA,EAAcruD,YAAYsuD,GAC1BD,EAAcruD,YAAYouD,GAC1BC,EAAcruD,YAAY6uD,GAC1B96D,EAAUiM,YAAYsuD,GAEtBA,EAAUp6D,MAAMke,SAAWg8C,EAAc5iD,MAAQ,KAEjDojD,EAAcR,EAAcvgD,aAAeugD,EAAcr/B,YAEzD,MAAMlkB,EAAOujD,EAAcr/B,YAAc,EAAI+/B,IACvCxjD,EAAM8iD,EAAcW,aAAe,EAAIC,IAE7CC,EAzEY,IACC,KAyEbC,EAAgBrkD,EAAMS,GACtBq1B,EAAgB91B,EAAMS,GA/CtBvX,EAAUwC,iBAAiB,YAAa44D,GAAa,GACrDp7D,EAAUwC,iBAAiB,aAAc44D,GAAa,GACtDp7D,EAAUwC,iBAAiB,QAAS64D,GAAU,GAE9Cp7D,SAASuC,iBAAiB,WAAY84D,GAAY,GAgDpD,SAASJ,EAAezjD,EAAeI,GACrC8iD,EAAYljD,EAAQojD,EACpBD,EAAa/iD,EAASgjD,EAEtB76D,EAAUG,MAAMsX,MAAQA,EAAQ,KAChCzX,EAAUG,MAAM0X,OAASA,EAAS,KAGpC,SAASsjD,EAAgBrkD,EAAcS,GACrCmjD,EAAUnjD,EAAMsjD,EAChBJ,EAAW3jD,EAAO+jD,EAElBN,EAAUp6D,MAAMoX,KAAOA,EAAM,KAC7BgjD,EAAUp6D,MAAM2W,MAAQA,EAAO,KAGjC,SAAS81B,EAAgB91B,EAAcS,GACrCvX,EAAUG,MAAMoX,IAAMA,EAAM,KAC5BvX,EAAUG,MAAM2W,KAAOA,EAAO,KAehC,SAASykD,EAAQloD,GACfA,EAAOA,EAAOjY,KAAKogE,GAAK,EACxB,IAIE1kD,EACAS,EACA04B,EACAwrB,EAPEC,EAAWtgE,KAAK4pC,MAAMhlC,EAAUq+C,YAAchrC,GAChDsoD,EAAYvgE,KAAK4pC,MAAMhlC,EAAU47D,aAAevoD,GAChDrQ,EAAIu3D,EAAUlc,YACdr6C,EAAIu2D,EAAUqB,aAMbF,EA9HQ,IAgIDA,EAAW14D,IAIrB8T,EAAO9W,EAAU4X,WAAcvE,EAAO,EACtCkE,EAAMvX,EAAU4qB,UAAavX,EAAO,EACpC48B,EAAQn5B,EAAO4kD,EACfD,EAASlkD,EAAMokD,EAEZ7kD,EAAO,IAAGA,EAAO,GACjBS,EAAM,IAAGA,EAAM,GAEf04B,EAAQjtC,GACRy4D,EAASz3D,IAEZk3D,EAAeQ,EAAUA,GACzBP,EAAgBrkD,EAAMS,GACtBq1B,EAAgB91B,EAAMS,KAIxB,SAAS+jD,EAAW3+D,GAGlB,OAFAA,EAAEiqB,iBAEKi1C,OAAOC,aAAan/D,EAAEo/D,WAC3B,IAAK,IACHR,EA3JW,GA4JX,MACF,IAAK,IACHA,GA9JW,IAmKjB,SAASF,EAAS1+D,GAChBA,EAAEiqB,iBACF20C,EAAQ5+D,EAAEyV,OAAS,EAAI,GAAK,GAG9B,SAASgpD,EAAYz+D,GACnBA,EAAEiqB,iBACFjqB,EAAEq/D,kBAjEJ,SAAwBr/D,GACtB69D,EAAYyB,gBAAkBj8D,EAAUg7B,YACxCw/B,EAAY0B,iBAAmBl8D,EAAUg7D,aAEzCR,EAAY2B,eAAiBn8D,EAAU4X,WACvC4iD,EAAY4B,cAAgBp8D,EAAU4qB,UAEtC4vC,EAAY6B,SAAW1/D,EAAE0wD,SAAW1wD,EAAE2iC,OAAS3iC,EAAEolB,SAAWplB,EAAEolB,QAAQ,GAAGsrC,SAAWjlD,OAAOk0D,QAC3F9B,EAAY+B,SAAW5/D,EAAE6/D,SAAW7/D,EAAE8/D,OAAS9/D,EAAEolB,SAAWplB,EAAEolB,QAAQ,GAAGy6C,SAAWp0D,OAAOs0D,QA2D3FC,CAAehgE,GAEfsD,SAASuC,iBAAiB,YAAao6D,GACvC38D,SAASuC,iBAAiB,YAAao6D,GACvC38D,SAASuC,iBAAiB,UAAWq6D,GACrC58D,SAASuC,iBAAiB,WAAYq6D,GAGxC,SAASA,EAAUlgE,GACjBA,EAAEiqB,iBAEF3mB,SAASmG,oBAAoB,UAAWy2D,GACxC58D,SAASmG,oBAAoB,WAAYy2D,GACzC58D,SAASmG,oBAAoB,YAAaw2D,GAC1C38D,SAASmG,oBAAoB,YAAaw2D,GAG5C,SAASA,EAAOjgE,GACd,IACEma,EACAS,EACAvU,EACAgB,EAJE84D,EAAe,CAACzhD,EAAG,EAAGC,EAAG,GAM7B3e,EAAEiqB,iBACFjqB,EAAEq/D,kBAEFc,EAAazhD,EAAI1e,EAAE2iC,OAAS3iC,EAAEolB,SAAWplB,EAAEolB,QAAQ,GAAGud,MACtDw9B,EAAaxhD,EAAI3e,EAAE8/D,OAAS9/D,EAAEolB,SAAWplB,EAAEolB,QAAQ,GAAG06C,MAEtD3lD,EAAOgmD,EAAazhD,GAAKm/C,EAAY6B,QAAU7B,EAAY2B,gBAC3D5kD,EAAMulD,EAAaxhD,GAAKk/C,EAAY+B,QAAU/B,EAAY4B,eAC1Dp5D,EAAIhD,EAAUg7B,YACdh3B,EAAIhE,EAAUg7D,aAEXlkD,EAAO,EAAGA,EAAO,EACZA,EAAOyjD,EAAUv/B,YAAch4B,IAAG8T,EAAOyjD,EAAUv/B,YAAch4B,GAEtEuU,EAAM,EAAGA,EAAM,EACVA,EAAMgjD,EAAUS,aAAeh3D,IAAGuT,EAAMgjD,EAAUS,aAAeh3D,GAEzEm3D,EAAgBrkD,EAAMS,GACtBq1B,EAAgB91B,EAAMS,GAiBxB,OA5NG8iD,EAAc0C,SAAUr2C,IACtB2zC,EAAcD,OAAS1zC,EA2NrB,CAACizC,KAbR,WACExhE,EAAOsf,MAAQkjD,EACfxiE,EAAO0f,OAAS+iD,EAEJziE,EAAO0hB,WAAW,MAC1BM,UAAUkgD,EACZI,EAAUC,EACVC,EAAWC,EACX,EAAG,EACHD,EAAWC,IAIDhB,eAzNd,WACE55D,EAAUoG,oBAAoB,YAAag1D,GAC3Cp7D,EAAUoG,oBAAoB,aAAcg1D,GAC5Cp7D,EAAUoG,oBAAoB,QAASi1D,GAEvCp7D,SAASmG,oBAAoB,UAAWy2D,GACxC58D,SAASmG,oBAAoB,WAAYy2D,GACzC58D,SAASmG,oBAAoB,YAAaw2D,GAC1C38D,SAASmG,oBAAoB,YAAaw2D,GAC1C38D,SAASmG,oBAAoB,WAAYk1D,GAEzChB,EAAcljE,SACd4I,EAAU5I,SACVmjE,EAAUnjE,WDoBW,CAAgBvC,KAAKulB,MAAOvlB,KAAKsD,QAChDtD,KAAKqwB,MAAM5jB,MAAQ,UAGtB,GAEHzM,KAAKmoE,WAAWvtD,UAAY,oFAC5B,QAAiB5a,KAAKmoE,YAAY,KAChCnoE,KAAK6kE,QAAQC,OACb9kE,KAAKooE,OAELpoE,KAAKsD,OAAO+kE,QAAQC,IAClBtoE,KAAKsoE,KAAOA,EACZtoE,KAAKuoE,eACLvoE,KAAKkO,YACJ,aAAc,KAChB,CAACwD,eAAgB1R,KAAK0R,iBAEzB1R,KAAKmL,UAAUM,OAAOzL,KAAKklE,cAAellE,KAAKmoE,WAAYnoE,KAAKqwB,OAEhErwB,KAAK2N,iBAAiB,qBAAqB,KACzC3N,KAAK6kE,QAAQE,iBACV/kE,KAAKulB,OACNvlB,KAAKulB,MAAMhjB,YAKT2L,UACNlO,KAAKwoE,QAAO,IACH98C,EAAA,SAA0B1rB,KAAKsoE,QAInC19C,KAAK69C,EAA+BD,GACzCxoE,KAAKsD,OAASmlE,EACdzoE,KAAKwoE,OAASA,EAEdxoE,KAAKqwB,MAAMvb,QAGNyzD,eACL,MAAMG,EAAM1oE,KAAKsD,OAAO0hB,WAAW,MACnC0jD,EAAIx0B,UAAY,qBAChBw0B,EAAIv0B,SAAS,EAAG,EAAGn0C,KAAKsD,OAAOsf,MAAO5iB,KAAKsD,OAAO0f,W,+EEjGvC,MAAM2lD,EACnB5oE,YACUgI,EAEA+6B,EACA8lC,GAHA,KAAA7gE,OAAAA,EAEA,KAAA+6B,SAAAA,EACA,KAAA8lC,SAAAA,EAER5oE,KAAKkL,YAGOA,Y,qCACZ,IAAI,OAACnD,EAAM,SAAE+6B,EAAQ,SAAE8lC,GAAY5oE,KACnC,MAAM6oE,EAAmB,IAAI,IAAU,CAAC9gE,OAAAA,IAAS7F,QAE3C8E,EAAW,kBACDhD,IAAb8+B,IACDA,QAAiB97B,EAASqI,gBAAgBy5D,cAAc/gE,IAQ1D,MAAMghE,EAAgB,CAACxkC,EAA4CykC,EAAQ7rB,KAAgB5Y,EAAQ38B,QACjG,IAAI0G,EAAUtH,EAASi4B,gBAAgBgqC,MAAMlhE,EAAOs0B,YAEjD2sC,IACD16D,EAAUA,EAAQD,MAAK,IACdrH,EAAS8G,mBAAmBo7D,aAAanhE,MAIpD6gE,MAAAA,GAAAA,EAAWt6D,IAGP66D,EAAkB5kC,IACtB,IAAIj2B,EAEJ,GAAGvG,EAAOg2B,SACRzvB,EAAUtH,EAAS8G,mBAAmBo7D,aAAanhE,GAAQ,EAAOo1C,IAAe5Y,EAAQ38B,UAAO5D,OAC3F,CACL,IAAGugC,EAAQ38B,KAGT,OAAOmhE,EAAcxkC,GAFrBj2B,EAAUtH,EAASi4B,gBAAgBh+B,OAAO8G,EAAOs0B,YAMrDusC,MAAAA,GAAAA,EAAWt6D,IAGb,IAAIQ,EAAoByqB,EAA0B6vC,EAAwB11D,EAAsCypC,EAChH,OAAOra,GACL,IAAK,iBACuC97B,EAASi4B,gBAAgB4C,UAAU95B,EAAOs0B,WAAY,iBAC9FvtB,EAAQ,oBACRyqB,EAAc,iCACd7lB,EAAU,CAAC,CACT6+C,QAAS,oBACT8W,UAAU,EACVrsB,SAAUmsB,IAGZhsB,EAAa,CAAC,CACZtpC,KAAM,0BAGR/E,EAAQ,mBACRyqB,EAAc,4BACd6vC,EAAkB,CAACP,GACnBn1D,EAAU,CAAC,CACT6+C,QAAS,eACT8W,UAAU,EACVrsB,SAAU+rB,KAId,MAeF,IAAK,OACHj6D,EAAQ,iBACRyqB,EAAc,mCACd6vC,EAAkB,CAACP,GAEnBn1D,EAAU,CAAC,CACT6+C,QAAS,iBACT8W,UAAU,EACVrsB,SAAUmsB,IAGZhsB,EAAa,CAAC,CACZtpC,KAAM,2BACNi7B,SAAU,CACR,IAAI,IAAU,CAAC/mC,OAAAA,IAAS7F,WAI5B,MAGF,IAAK,QACH4M,EAAQ,iBACRyqB,EAAc,wCACd7lB,EAAU,CAAC,CACT6+C,QAAS,iBACT8W,UAAU,EACVrsB,SAAUmsB,IAGZ,MAGF,IAAK,YACL,IAAK,eACuCniE,EAASi4B,gBAAgB4C,UAAU95B,EAAOs0B,WAAY,iBAC9FvtB,EAAQ,iBACRyqB,EAAc,0BACd7lB,EAAU,CAAC,CACT6+C,QAAS,iBACT8W,UAAU,EACVrsB,SAAUmsB,IAGZhsB,EAAa,CAAC,CACZtpC,KAAM,mCAGR/E,EAAQ,gBACRyqB,EAAc,8BACd6vC,EAAkB,CAACP,GACnBn1D,EAAU,CAAC,CACT6+C,QAAS,iBACT8W,UAAU,EACVrsB,SAAWG,GAAe4rB,EAAc5rB,GAAY,MAQ5D,IAAI,IAAU,oBAAqB,CACjCp1C,OAAAA,EACAsqD,aAAcvjD,EACdwjD,mBAAoB/4B,EACpB+vC,oBAAqBF,EACrB11D,QAAAA,EACAypC,WAAAA,IACCpyB,Q,+rBC/JQ,MAAMw+C,EACnBxpE,YAAoBgI,EAAwB8+B,EAAwBjlC,EAAwB4nE,GAAxE,KAAAzhE,OAAAA,EAAwB,KAAA8+B,KAAAA,EAAwB,KAAAjlC,KAAAA,EAAwB,KAAA4nE,UAAAA,EAC1FxpE,KAAKkL,YAGOA,Y,yCACZ,IAAI,OAACnD,EAAM,KAAE8+B,EAAI,KAAEjlC,EAAI,UAAE4nE,GAAaxpE,KAEtC,MAAM6oE,EAAmB,IAAI,IAAU,CAAC9gE,OAAAA,IAAS7F,QAE3C8E,EAAW,aAEjB6/B,EAAOA,EAAKnQ,QACZ,MAAMsmB,EAAW,CAACzY,EAA4CklC,KAC5DD,GAAaA,IACD,cAAT5nE,EACDoF,EAAS8G,mBAAmB47D,wBAAwB3hE,EAAQ8+B,GAE5D7/B,EAAS8G,mBAAmB67D,eAAe5hE,EAAQ8+B,IAAQtC,EAAQ38B,MAAQ6hE,IAIzE/1D,EAAuC,CAAC,CAC5C6+C,QAAS,SACT8W,UAAU,EACVrsB,SAAAA,IAEIG,EAA6C,GACnD,IAAIruC,EAAoB86D,EAAkBrwC,EAA0B6vC,EAcpE,GAbmB,IAAhBviC,EAAKhkC,OACNiM,EAAQ,6BAERA,EAAQ,sBACR86D,EAAY,EAAC,QAAK,WAAY,CAAC/iC,EAAKhkC,WAIpC02B,SADOvyB,EAASqI,gBAAgBw6D,YAAY9hE,IACd,IAAhB8+B,EAAKhkC,OAAe,oCAAsC,kCAE1C,IAAhBgkC,EAAKhkC,OAAe,gCAAkC,8BAGnEkF,IAAW,UAA2B,cAATnG,QAG9B,GAAGmG,EAAOg2B,SACRof,EAAW96C,KAAK,CACdwR,KAAM,2BACNi7B,SAAU,CAAC+5B,SAER,CACL,MAAM/uB,QAAa9yC,EAASi4B,gBAAgBsjC,QAAQx6D,EAAOs0B,YAErDytC,GAAa,OAAUhwB,EAAM,mBACnC,GAAc,SAAXA,EAAKrqC,EAAc,CACpB,MAAMs6D,EAAYD,EAAajjC,EAAKnQ,cAAgB,OAAYmQ,GAAY7+B,GAAQ,EAAD,gCAEjF,aADsBhB,EAAS8G,mBAAmBuE,iBAAiBtK,EAAQC,IAC5D6F,SAAW,cAGzBk8D,EAAUlnE,SACRknE,EAAUlnE,SAAWgkC,EAAKhkC,OAC3Bs6C,EAAW96C,KAAK,CACdwR,KAAM,kBAGRspC,EAAW96C,KAAK,CACdwR,KAAM,yBAGR0lB,EAAc,0BACd6vC,EAAkB,EAAC,QAAK,WAAY,CAACW,EAAUlnE,iBAKnD6Q,EAAQ,GAAGspC,SAAYzY,GAAYyY,EAASzY,GAAS,IAK3D,OAAgB7wB,GAEF,IAAI,IAAU,oBAAqB,CAC/C3L,OAAAA,EACAsqD,aAAcvjD,EACdk7D,cAAeJ,EACftX,mBAAoB/4B,EACpB+vC,oBAAqBF,EACrB11D,QAAAA,EACAypC,WAAAA,IAGIpyB,a,qECnGK,MAAMk/C,UAAqB,IACxClqE,YACEmqE,EACAtB,EACAuB,GAAmB,GAEnBp4D,MAAM,CACJq4D,UAAW,CAAC,UAAW,YACvBxB,SAAUuB,EAAmBvB,EAAiB7gE,IAAW,O,EAAD,K,OAAA,E,EAAA,YACtD,GAAG6gE,EAAU,CACX,MAAMn4C,EAAMm4C,EAAS7gE,GAClB0oB,aAAe/P,gBACV+P,GAIV,iBAA0B,CAAC1oB,OAAAA,IAC3B,mCAA4CmiE,I,YATU,K,+QAWxD3mE,YAAa,uCACb4hC,iBAAkB,gBAClBjC,aAAc,iBAGhBljC,KAAK4vB,WAAa5vB,KAAK2kB,SAASiL,WAChC5vB,KAAKqqE,0BAA0BrqE,KAAK4vB,e,yNCgBxC,MAAM06C,EAAoBl/D,SAASI,KACnC,IAAI++D,EAAgBD,EAEpB,MAAME,EAAqB,KACzBD,GAAgB,WAA0BD,EAC1CG,EAAaC,aAGf,QAAsBJ,EAAmBE,GAO1B,MAAMC,UAA4D,IAgC/E1qE,YAAY6a,EAAmBuS,EAAwB,IA8DrD,GA7DApb,OAAM,GA7BE,KAAA7P,QAAUkJ,SAASC,cAAc,OACjC,KAAAF,UAAYC,SAASC,cAAc,OACnC,KAAAm4C,OAASp4C,SAASC,cAAc,OAChC,KAAAyD,MAAQ1D,SAASC,cAAc,OAM/B,KAAA0hB,SAA0B,KAAM,EAiMnC,KAAAq7C,KAAO,KACZ,eAAmCpoE,KAAK4gB,iBA7KxC5gB,KAAKkC,QAAQkR,UAAUrS,IAAI,SAC3Bf,KAAKkC,QAAQ0Y,UAAY,SAAWA,EAAY,IAAMA,EAAY,IAClE5a,KAAKmL,UAAUiI,UAAUrS,IAAI,kBAAmB,aAEhDf,KAAKwjD,OAAOpwC,UAAUrS,IAAI,gBAEvBosB,EAAQre,QACT9O,KAAK8O,MAAMsE,UAAUrS,IAAI,eACI,iBAAnBosB,EAAa,QACrB,QAAMntB,KAAK8O,MAAOqe,EAAQre,OAG5B9O,KAAKwjD,OAAO/3C,OAAOzL,KAAK8O,QAG1B9O,KAAKkrD,kBAAmB,SACxBlrD,KAAK0R,eAAiB,IAAI,IAC1B1R,KAAKgH,SAAWyjE,EAAaE,SAE7B3qE,KAAK4qE,8BAAgCz9C,EAAQy9C,8BAE1Cz9C,EAAQw3C,WACT3kE,KAAKilE,SAAW75D,SAASC,cAAc,QACvCrL,KAAKilE,SAAS7xD,UAAUrS,IAAI,WAAY,cAAe,eAEvDf,KAAKwjD,OAAO9rC,QAAQ1X,KAAKilE,WAEzB,QAAiBjlE,KAAKilE,SAAUjlE,KAAKooE,KAAM,CAAC12D,eAAgB1R,KAAK0R,eAAgB1D,MAAM,KAGzFhO,KAAK6qE,eAAiB19C,EAAQ09C,eAC3B7qE,KAAK6qE,gBACN7qE,KAAKkC,QAAQkR,UAAUrS,IAAI,cAG1BosB,EAAQ29C,kBACT,QAAiB9qE,KAAKkC,SAAU4F,KAC1B,OAAgBA,EAAEzH,OAAQ,oBAC5BL,KAAKooE,SAEN,CAAC12D,eAAgB1R,KAAK0R,iBAGxByb,EAAQy3C,cACT5kE,KAAKmoE,WAAa/8D,SAASC,cAAc,UACzCrL,KAAKmoE,WAAW/0D,UAAUrS,IAAI,cAAe,sBAClB,IAAxBosB,EAAQy3C,aACT5kE,KAAKmoE,WAAW18D,QAAO,QAAK0hB,EAAQy3C,cAEtC5kE,KAAKwjD,OAAO/3C,OAAOzL,KAAKmoE,aACxB,OAAOnoE,KAAKmoE,aAGdnoE,KAAKmL,UAAUM,OAAOzL,KAAKwjD,QACxBr2B,EAAQ3hB,OACTxL,KAAKwL,KAAOJ,SAASC,cAAc,OACnCrL,KAAKwL,KAAK4H,UAAUrS,IAAI,cACxBf,KAAKmL,UAAUM,OAAOzL,KAAKwL,OAG1B2hB,EAAQyC,WAAY,CACrB,MAAMA,EAAa5vB,KAAK4vB,WAAa,IAAI,KAAW5vB,KAAKwL,MACzDxL,KAAKqqE,0BAA0Bz6C,GAE3B5vB,KAAKwL,MACPxL,KAAKmL,UAAUgM,aAAayY,EAAWzkB,UAAWnL,KAAKwjD,OAAO0T,aAIlE,IAAI6T,EAAoB/qE,KAAKmoE,WAC7B,MAAMz0D,EAAU1T,KAAK0T,QAAUyZ,EAAQzZ,QACvC,GAAGA,MAAAA,OAAO,EAAPA,EAAS7Q,OAAQ,CAClB,MAAMwb,EAAare,KAAKgrE,UAAY5/D,SAASC,cAAc,OAC3DgT,EAAWjL,UAAUrS,IAAI,iBAEzB,MAAMkqE,EAAkBv3D,EAAQ6G,KAAK00B,IACnC,MAAMj5B,EAAS5K,SAASC,cAAc,UAgBtC,OAfA2K,EAAO4E,UAAY,OAASq0B,EAAEo6B,SAAW,UAAY,aAErD,OAAOrzD,GAEJi5B,EAAEp7B,KACHmC,EAAO+I,UAAakwB,EAAEp7B,KAEtBmC,EAAOvK,QAAO,QAAKwjC,EAAEsjB,QAAStjB,EAAEi8B,YAGlC,QAAiBl1D,GAAQ,KACvBi5B,EAAE+N,UAAY/N,EAAE+N,WAChBh9C,KAAK8D,YACJ,CAAC4N,eAAgB1R,KAAK0R,eAAgB1D,MAAM,IAExCihC,EAAE/sC,QAAU8T,KAGrB,IAAI+0D,GAAwC,IAAnBr3D,EAAQ7Q,OAAc,CAC7C,MAAMmT,EAAStC,EAAQhT,MAAMsV,IAAYA,EAAOknC,WAC7ClnC,IACD+0D,EAAoB/0D,EAAO9T,SAI/Bmc,EAAW5S,UAAUw/D,GACrBjrE,KAAKmL,UAAUM,OAAO4S,GAGxBre,KAAK+qE,kBAAoBA,EAEzB/qE,KAAKkC,QAAQuJ,OAAOzL,KAAKmL,WAEzBs/D,EAAaU,OAAO9oE,KAAKrC,MAGjBqqE,0BAA0Bz6C,GAClC,MAAM3f,EAAK2f,EAAWpc,mBACtBoc,EAAWpc,mBAAqB,KAC9BvD,MAAAA,GAAAA,IACA2f,EAAWzkB,UAAUiI,UAAUxJ,OAAO,gBAAiBgmB,EAAWoG,WAClEpG,EAAWzkB,UAAUiI,UAAUxJ,OAAO,kBAAmBgmB,EAAWw7C,iBAGtEx7C,EAAWzkB,UAAUiI,UAAUrS,IAAI,eAAgB,kBAAmB,yBAG9DsqE,kBACLrrE,KAAK4vB,YACN5vB,KAAK4vB,WAAWpc,qBAIbuX,OACL/qB,KAAK4gB,eAAiB,CACpBhf,KAAM,QACN0nB,MAAO,IAAMtpB,KAAK8D,UAClBipB,SAAU/sB,KAAK+sB,UAGjB,aAAiC/sB,KAAK4gB,iBAEtC,SACA2pD,EAAc9+D,OAAOzL,KAAKkC,SACrBlC,KAAKkC,QAAQikC,YAClBnmC,KAAKkC,QAAQkR,UAAUrS,IAAI,UAE3Bf,KAAKqrE,kBAEDrrE,KAAK6qE,iBACP,qBAAiC,EACjC,sBAAsC,IAKxCnoE,YAAW,KACL1C,KAAKkC,QAAQkR,UAAUqB,SAAS,WAIpCzU,KAAK0R,eAAe3Q,IAAIqK,SAASI,KAAjCxL,CAAuC,WAAY8H,IAC9C2iE,EAAaU,OAAOV,EAAaU,OAAOtoE,OAAS,KAAO7C,OAIxDA,KAAK4qE,+BAAgC,OAAsB9iE,GAAe,UAAVA,EAAEyE,QACnE,QAAmBvM,KAAK+qE,oBACxB,OAAYjjE,SAGf,GAQKhE,UACR9D,KAAKmJ,cAA8B,SACnCnJ,KAAKkC,QAAQkR,UAAUrS,IAAI,UAC3Bf,KAAKkC,QAAQkR,UAAU7Q,OAAO,UAC9BvC,KAAK0R,eAAeC,YACpB3R,KAAKkrD,iBAAiBpnD,UAElB9D,KAAK6qE,iBACP,qBAAiC,GAGnC,eAAmC7qE,KAAK4gB,gBACxC5gB,KAAK4gB,oBAAiB5c,GAEtB,OAAiBymE,EAAaU,OAAQnrE,MAGtCwqE,IAEA9nE,YAAW,K,MACT1C,KAAKkC,QAAQK,SACbvC,KAAKmJ,cAA8B,qBACnCnJ,KAAKib,UACU,QAAf,EAAAjb,KAAK4vB,kBAAU,SAAE9rB,UAEb9D,KAAK6qE,gBACP,sBAAsC,KAEvC,KAGEx0D,kBACLrW,KAAKmrE,OAAOrmE,SAASwmE,IACnB,MAAM,QAACppE,EAAO,UAAEiJ,GAAamgE,EACvB3yD,EAAgBzW,EAAQyW,cAC3BA,GAAiBA,IAAkB4xD,GAAiBA,IAAkBp/D,GACvEo/D,EAAc9+D,OAAOvJ,MAKpBmU,iBAAyCk1D,GAC9C,OAAOvrE,KAAKmrE,OAAO7yC,QAAQp2B,GAAYA,aAAmBqpE,IAGrDl1D,mBAAiEm1D,KAA+B5a,GAErG,OADc,IAAI4a,KAAQ5a,IA/Pb,EAAAua,OAA8B,GAoQxC,MAAMM,EAAmB/3D,IACfA,EAAQhT,MAAMuuC,GAAMA,EAAEiO,YAEnCxpC,EAAQrR,KAAK,CACXkwD,QAAS,SACTrV,UAAU,IAIPxpC,I,yFCnUT,MACMg4D,EAAiF,CAAC,CACtFj/D,MAFe,KAGf8+C,YAAa,uBACZ,CACD9+C,MAAOk/D,MACPpgB,YAAa,wBACZ,CACD9+C,MAAOk/D,MACPpgB,YAAa,wBACZ,CACD9+C,MAAOk/D,MACPpgB,YAAa,sBACZ,CACD9+C,MAAOk/D,OACPpgB,YAAa,uBACZ,CACD9+C,OAAQ,EACR8+C,YAAa,wBACbhnB,SAAS,IAGI,MAAMqnC,UAAkB,IACrC7rE,YAAYgI,GAaV,IAAI8jE,EAZJ95D,MAAM,aAAc,CAClBhK,OAAAA,EACAsqD,aAAc,gBACd3+C,QAAS,CAAC,CACR6+C,QAAS,wBACTvV,SAAU,KACRh9C,KAAKgH,SAAS8G,mBAAmBg+D,SAAS/jE,GAAkB,IAAV8jE,EAAc,MAAa,QAAM,GAAQA,MAG/FrgE,MAAM,IAIR,MAAMugE,GAAY,QAAoBL,GAAQj/D,IAC5Co/D,GAAQp/D,KAGVzM,KAAKwL,KAAKC,OAAOsgE,GAEjB/rE,KAAK+qB,U,kGC1BM,MAAMihD,UAAkB,IAGrCjsE,YAAoB6a,EAAmBuS,EAA4B,IAQjE,GAPApb,MAAM,cAAgB6I,EAAY,IAAMA,EAAY,IAAK,OAAF,sBACrDkwD,iBAAiB,GACd39C,GAAO,CACVre,OAAO,EACP4E,QAASyZ,EAAQzZ,UAAW,OAAgByZ,EAAQzZ,YALpC,KAAAkH,UAAAA,EAQfuS,EAAQplB,OAAQ,CACjB,MAAMoW,EAAW,IAAI,IACrBA,EAAS/K,UAAUrS,IAAI,aACvBod,EAAS0K,kBAAkB,CACzBod,UAAU,EACVl+B,OAAQolB,EAAQplB,SAElB/H,KAAKwjD,OAAO9rC,QAAQyG,GAGlBgP,EAAQ8+C,UACP9+C,EAAQklC,eAAiBllC,EAAQre,MAAO9O,KAAK8O,MAAMrD,QAAO,QAAK0hB,EAAQklC,cAAgB,UAAWllC,EAAQ68C,gBACrG78C,EAAQre,iBAAiBtL,YAC/BxD,KAAK8O,MAAMrD,OAAO0hB,EAAQre,OACrB9O,KAAK8O,MAAMgrB,UAAY3M,EAAQre,OAAS,IAGjD,MAAMwmD,EAAWlqD,SAASq5D,yBAE1B,GAAGt3C,EAAQmlC,oBAAsBnlC,EAAQoM,YAAa,CACpD,MAAM54B,EAAIX,KAAKu5B,YAAcnuB,SAASC,cAAc,KACpD1K,EAAEyS,UAAUrS,IAAI,qBACbosB,EAAQmlC,mBAAoB3xD,EAAE8K,QAAO,QAAK0hB,EAAQmlC,mBAAoBnlC,EAAQm8C,sBACzEn8C,EAAQoM,cAAa,OAAa54B,EAAGwsB,EAAQoM,aAErD+7B,EAAS7pD,OAAO9K,GAGfwsB,EAAQgwB,aACTn9C,KAAKmL,UAAUiI,UAAUrS,IAAI,iBAE7BosB,EAAQgwB,WAAWr4C,SAASonE,IAC1BA,EAAE7vB,YAAa,EACf,MAAMtW,EAAgB,IAAI,IAAcmmC,GACxCA,EAAEnmC,cAAgBA,EAClBuvB,EAAS7pD,OAAOs6B,EAAcC,UAGhC7Y,EAAQzZ,QAAQ5O,SAASkR,IACvB,GAAGA,EAAOgnC,SAAU,CAClB,MAAMmvB,EAAWn2D,EAAOgnC,SACxBhnC,EAAOgnC,SAAW,KAChB,MAAMtc,EAAsB,IAAIt/B,IAChC+rB,EAAQgwB,WAAWr4C,SAASonE,IACvBA,EAAEnmC,cAAcxB,SACjB7D,EAAE3/B,IAAImrE,EAAEr4D,SAGZs4D,EAASzrC,SAMjB1gC,KAAKmL,UAAUgM,aAAam+C,EAAUt1D,KAAKwjD,OAAO4oB,uB,+ECnFvC,MAAMC,UAAsB,IAGzCtsE,YAAYotB,GAQVpb,MAAM,gBAAiB,CAAC4yD,UAAU,EAAMmG,iBAAiB,EAAMt/D,MAAM,EAAMsD,OAAO,IAElF9O,KAAK2kB,SAAW,IAAI,IAAe,CACjC8f,SAAUzkC,KAAKwL,KACfukB,SAAU,KAAW,O,EAAD,K,OAAA,E,EAAA,YAClB,MAAM2S,EAAW1iC,KAAK2kB,SAASyhB,cACzBr+B,EAAS26B,EAASA,EAAS7/B,OAAS,GAAGovB,WAE7C,GAAG9E,EAAQy7C,SAAU,CACnB,MAAMn4C,EAAMtD,EAAQy7C,SAAS7gE,GAC7B,GAAG0oB,aAAe/P,QAChB,UACQ+P,EACN,MAAMlrB,GACN,QAKNvF,KAAK2kB,SAAW,KAChB3kB,KAAKooE,Q,YAhBa,K,+QAkBpBtlC,SAAU3V,EAAQi9C,UAClBzlC,cAAe,KACb3kC,KAAK+qB,OACL/qB,KAAK2kB,SAASob,mBAEV,KACF//B,KAAK2kB,SAAS0L,MAAMC,SAGxB6U,iBAAkBhY,EAAQgY,iBAC1BpC,aAAa,EACbtE,eAAe,EACf5N,WAAY,aACZ9oB,OAAQolB,EAAQplB,OAChBxE,YAAa4pB,EAAQ5pB,YACrB2/B,aAAc/V,EAAQ+V,aACtBl8B,SAAUhH,KAAKgH,WAKjBhH,KAAK8O,MAAMrD,OAAOzL,KAAK2kB,SAAS0L,U,2DCzDrB,MAAMi8C,UAAqB,IACxCvsE,YAAYgI,EAAgB8+B,EAAgB2iC,GAC1Cz3D,MAAM,oBAAqB,CACzBjD,MAAO,eAAe+3B,EAAKhkC,OAAS,EAAI,IAAM,SAC9C02B,YAAasN,EAAKhkC,OAAS,EAAI,QAAUgkC,EAAKhkC,OAAS,iBAAmB,oBAC1E6Q,QAAS,CAAC,CACR6+C,QAAS,OACTvV,SAAU,KACRwsB,GAAaA,IACbxpE,KAAKgH,SAAS8G,mBAAmBy+D,sBAAsBxkE,EAAQ8+B,QAKrE7mC,KAAK+qB,U,gjBCST,MAAMyhD,EAAsC,iBAE7B,MAAMC,UAAsB,IAOzC1sE,YACU2sE,EACAC,GAER56D,MAAM,iBAAkB,CAAC4yD,UAAU,EAAMmG,iBAAiB,EAAMt/D,MAAM,EAAMokB,YAAY,EAAM9gB,OAAO,IAH7F,KAAA49D,gBAAAA,EACA,KAAAC,SAAAA,EA4EF,KAAAC,gBAAwB9kE,GAAkB,EAAD,gCAC/C,MAAMzH,GAAS,OAAgByH,EAAEzH,OAAQ,uBACzC,IAAIA,EAAQ,OAEZ,MAAM8G,EAAQ9G,EAAOslB,QAAQxe,aACpB,uCAAgDA,KACvDnH,KAAKooE,UA9EPpoE,KAAK8O,MAAMrD,QAAO,QAAK,YACvBzL,KAAK6sE,YAAc,GAEnB,uBAAoC,SAAS,GAC7C7sE,KAAK2N,iBAAiB,SAAS,KAC7B,uBAAoC,SAAS,GAC7C,iCAGF3N,KAAKykC,SAAWzkC,KAAK4vB,WAAWzkB,UAEhCnL,KAAKykC,SAASrxB,UAAUrS,IAAI,eAC5B,OAAaf,KAAKykC,UAAU,GAE5BzkC,KAAK8sE,eAAiB1hE,SAASC,cAAc,OAC7CrL,KAAK8sE,eAAe15D,UAAUrS,IAAI,sBAElC,MAAM2X,GAAM,OAAO,oDAAqD,CAAC6F,UAAU,EAAM1K,KAAM,YAC/F7T,KAAK8sE,eAAerhE,OAAOiN,GAE3B1Y,KAAKwL,KAAKC,OAAOzL,KAAK8sE,iBAEtB,OAA6B,CAAClqB,SAAU5iD,KAAKykC,SAAU/yB,eAAgB1R,KAAK0R,iBAE5E,MAAMq7D,EAAsBppE,IAC1B,MAAMmF,EAAM9I,KAAK6sD,KAAK9jD,WAAWikE,GAASA,EAAKrlE,KAAOhE,EAAIgE,KAC1D,IAAY,IAATmB,EACD,OAGF9I,KAAK6sD,KAAK/jD,GAAOnF,EACjB,MAAMkpE,EAAc7sE,KAAK6sE,YAAYlpE,EAAIgE,IACzCklE,MAAAA,GAAAA,IAAgBlpE,EAAIy/C,gBACpBpjD,KAAKitE,gBAGPjtE,KAAK0R,eAAe3Q,IAAI,IAAxBf,CAAmC,qBAAsB+sE,GACzD/sE,KAAK0R,eAAe3Q,IAAI,IAAxBf,CAAmC,mBAAoB+sE,GAEvD/sE,KAAKktE,iBAGCC,yBAAyBxpE,GAC/B,MAAMwH,EAAYC,SAASC,cAAc,OAGzC,IAAI+hE,EAAgBP,EAFpB1hE,EAAUiI,UAAUrS,IAAI,eAGrB4C,IACDypE,EAAY,IAAI,KAAI,CAClBt+D,OAAO,OAAcnL,EAAImL,OACzBurB,UAAU,QAAK12B,EAAI6J,OAAO4+C,OAAS,aAAe,WAAY,CAACzoD,EAAI+sB,QACnE28C,aAAa,IAGfR,EAAeS,KACb,OAAeF,EAAUC,aAAa,QAAKC,EAAQ,uBAAyB,uBAC5EF,EAAUC,YAAYj6D,UAAUxJ,OAAO,SAAU0jE,IAGnDT,IAAclpE,EAAIy/C,gBAElBj4C,EAAUM,OAAO2hE,EAAUjiE,YAG7B,MAAMoiE,EAAiBniE,SAASC,cAAc,OAK9C,OAJAkiE,EAAen6D,UAAUrS,IAAI,wBAE7BoK,EAAUM,OAAO8hE,GAEV,CAACpiE,UAAAA,EAAWiiE,UAAAA,EAAWP,YAAAA,EAAaU,eAAAA,GAa/BL,iB,+CACZ,MAAMx6C,EAAa1yB,KAAKkrD,iBAAiBjoD,MAEnCuqE,GADS50D,MAAM60D,QAAQztE,KAAK0sE,iBAAmB1sE,KAAK0sE,gBAAkB,CAAC1sE,KAAK0sE,kBACtDnyD,KAAK8V,GAAUrwB,KAAKgH,SAASg8C,mBAAmBC,cAAc5yB,KAC1F,IAAIw8B,QAAansC,QAAQkI,IAAI4kD,GAC7B,IAAI96C,IAAc,OAClB,IAAIg7C,EAAW7gB,EAAK,GACpB,GAAmB,IAAhBA,EAAKhqD,SAAiB6qE,EAGvB,OAFA,QAAS,CAACniB,YAAavrD,KAAK2sE,SAAW,mBAAqB,8BAC5D3sE,KAAKooE,OAIPvb,EAAOA,EAAKv0B,OAAOC,SACnBm1C,EAAW7gB,EAAK,GAEhB7sD,KAAK6sD,KAAOA,EAAKtyC,KAAK5W,GAAQA,EAAIA,MAElC,MAAMgpE,EAAwB,QAAhB,EAAG3sE,KAAK2sE,gBAAQ,QAAb3sE,KAAK2sE,WAAee,EAAS/pE,IAAI6J,OAAO4+C,OAEzD,IAAIugB,EAAU,EACZ,QAAiB3sE,KAAKykC,SAAUzkC,KAAK4sE,gBAAiB,CAACl7D,eAAgB1R,KAAK0R,iBAE5E,MAAM,QAAC5N,IAAW,OAA0B,CAC1C8+C,SAAU5iD,KAAKykC,SACfkpC,eAAe,EACfC,OAAQ,IAAM5tE,KAAKooE,SAGrBpoE,KAAK2N,iBAAiB,QAAS7J,GAGjC,4BAA6C0oE,GAE7C,MAAM5uD,EAAgB,IAAI,IACpBoV,EAA+B,GAE/B66C,EAAqBhhB,EAAKtyC,KAAU5W,GAAQ,EAAD,gCAC/C,MAAM,UAACwH,EAAS,eAAEoiE,EAAc,UAAEH,EAAS,YAAEP,GAAe7sE,KAAKmtE,yBAAyBtgB,EAAKhqD,OAAS,EAAIc,EAAIA,SAAMK,GAUtH,IAAI8jD,EARDslB,IACD,QAAiBA,EAAUC,aAAa,KACtCrtE,KAAKgH,SAASg8C,mBAAmBE,iBAAiBv/C,EAAIA,OACrD,CAAC+N,eAAgB1R,KAAK0R,iBAG3B1R,KAAK6sE,YAAYlpE,EAAIA,IAAIgE,IAAMklE,EAI/B,MAAMprB,EAAO99C,EAAIigD,UAAUtrB,QAAQ32B,GAAmB,cAAXA,MAAAA,OAAG,EAAHA,EAAK8N,KAChD,GAAGk9D,EAAU,CACX,MAAMrX,GAAW,OAAgB,CAC/BwY,OAAQrsB,EAAKlnC,KAAK5Y,GAAQA,EAAIgG,KAC9BqrB,aAAAA,EACAw7B,eAAgBge,EAChB5kE,KAAM,0BACN8qB,WAAAA,IAID9Z,MAAMC,KAAKy8C,EAASzgC,UAA4B6B,MAAM,GAAG5xB,SAAS5C,IACjE,MAAMmyB,EAAOjpB,SAASC,cAAc,QACpCgpB,EAAKjhB,UAAUrS,IAAI,eACnBmB,EAAQ8mB,YAAYqL,GACpBA,EAAK5oB,OAAOvJ,MAGd4lD,EAAO,CAACwN,GAERiY,EAAen6D,UAAU6S,QAAQ,uBAAwB,gBACzDsnD,EAAen6D,UAAUrS,IAAI,YAAa,kBAE1C+mD,QAAapnC,QAAQkI,IAAI64B,EAAKlnC,KAAU5Y,GAAQ,EAAD,gCAC7C,MAAM2oB,EAAMlf,SAASC,cAAc,OACnCif,EAAIlX,UAAUrS,IAAI,uBAElB,MAAM6G,EAAO,8BAgBb,aAdM,QAAY,CAChBjG,IAAAA,EACA2oB,IAAAA,EACA1M,cAAAA,EACAtd,MAAOksE,EACPhoE,MAAM,EACNf,MAAM,EACNmf,MAAOhb,EACPob,OAAQpb,EACRi8C,UAAU,EACV7wB,aAAAA,EACAN,WAAAA,IAGKpI,QAMX,OAFAijD,EAAe9hE,UAAUq8C,EAAKxvB,OAAOC,UAE9BptB,OAGHi2B,QAAmB1gB,QAAQkI,IAAIilD,SAC/BntD,QAAQkI,IAAIoK,GAElB,MAAMhd,EAAShW,KAAKgW,QAAS,OAAO,GAAI,CAACuI,UAAU,IAEnDve,KAAKitE,gBAEL,QAAiBj3D,GAAQ,KACvB,MAAMpM,GAAS,OAAiB,CAACoM,IAAS,GAE1ChW,KAAKgH,SAASg8C,mBAAmB+qB,kBAAkBlhB,EAAKtyC,KAAK5W,GAAQA,EAAIA,OAAM0K,MAAK,KAClFrO,KAAKooE,UACJzwD,OAAM,KACP/N,SAED,CAAC8H,eAAgB1R,KAAK0R,iBAEN,IAAhBm7C,EAAKhqD,QACN,OAAa7C,KAAK8O,OAAO,OAAc4+D,EAAS/pE,IAAImL,SAEpD,OAAa9O,KAAK8O,OAAO,QAAK,UAGhC9O,KAAK8sE,eAAex0D,YAAc,GAClCtY,KAAK8sE,eAAerhE,OAAOuK,GAE3BhW,KAAKykC,SAASrxB,UAAU7Q,OAAO,cAC/BvC,KAAKykC,SAASnsB,YAAc,GAC5BtY,KAAKykC,SAASh5B,UAAU21B,GAExBphC,KAAK4vB,WAAWpc,wBAGVy5D,eACN,MAAM,KAACpgB,EAAI,SAAE8f,GAAY3sE,KACzB,IAAIguE,EAAgBC,EACpB,GAAmB,IAAhBphB,EAAKhqD,OAAc,CACpB,MAAM6qE,EAAW7gB,EAAK,GACtBohB,GAAe,QAAKtB,EAAW,aAAe,WAAY,CAACe,EAASh9C,QACpEs9C,GAASN,EAAStqB,mBACb,CACL,MAAM8qB,EAAYrhB,EAAKv0B,QAAQ30B,GAAQA,EAAIy/C,iBAC3C,IAAI1yB,EACDm8B,EAAKhqD,SAAWqrE,EAAUrrE,QAC3BmrE,GAAQ,EACRt9C,EAAQm8B,EAAKhqD,SAEbmrE,GAAQ,EACRt9C,EAAQm8B,EAAKhqD,OAASqrE,EAAUrrE,QAGlCorE,GAAe,QAAK,iBAAkB,CAACv9C,IAGzC1wB,KAAKgW,OAAO4E,UAAYozD,EAAQ,gCAAkC,8CAClE,OAAehuE,KAAKgW,QAAQ,QAAKg4D,EAAQ,mBAAqB,sBAAuB,CAACC,Q,6GC7Q3E,MAAME,EAqBnBpuE,YAAYotB,GAfJ,KAAA7R,OAAS,EACV,KAAA8yD,UAAW,EAEX,KAAA9/D,QAAmC,KAEnC,KAAA+/D,UAAW,EACV,KAAA1wD,YAAa,EACb,KAAAnH,YAAa,EACb,KAAAkwB,gBAAiB,EACjB,KAAA4nC,aAAqC,SA8FtC,KAAAx6D,QAAWhM,IACbA,IACD,OAAYA,GAGX9H,KAAKub,UAAUnI,UAAUqB,SAAS,UAChCzU,KAAKuuE,UACNvuE,KAAKuuE,SAASzmE,GAGb9H,KAAKsO,SAAWtO,KAAKsO,QAAQ+9B,QAC9BrsC,KAAKsO,QAAQ+9B,UA5Fdlf,IACD,OAAWntB,KAAMmtB,GAGhBntB,KAAKquE,WACNruE,KAAK0mC,gBAAiB,GAInB8nC,mBAAmBrhD,EAGrB,IACCntB,KAAKub,YACPvb,KAAKub,UAAYnQ,SAASC,cAAc,OACxCrL,KAAKub,UAAUnI,UAAUrS,IAAI,uBAE1BosB,EAAQ4mB,OACT/zC,KAAKub,UAAUnI,UAAUrS,IAAI,aAAeosB,EAAQ4mB,OAGnD5mB,EAAQshD,MACTzuE,KAAKub,UAAUnI,UAAUrS,IAAI,kBAG5Bf,KAAKwW,YACNxW,KAAKub,UAAUnI,UAAUrS,IAAI,yBAK5B2tE,wBACL1uE,KAAKwuE,qBAGAtjE,YACLlL,KAAKkL,UAAY,KAEjBlL,KAAKwuE,qBAELxuE,KAAKub,UAAUwD,UAAY,0HAEmD/e,KAAKwW,WAAa,cAAgB,+DACvExW,KAAKwW,WAAa,KAAO,aAAaxW,KAAKwW,WAAa,KAAO,YAAYxW,KAAKwW,WAAa,GAAK,mEAIxIxW,KAAKwW,WACNxW,KAAK4mC,YAAc,mBAEnB5mC,KAAK4mC,YAAc,mBAGlB5mC,KAAK2d,YACN3d,KAAKub,UAAUwD,WAAa,kxEAc5B/e,KAAK2uE,YAAc3uE,KAAKub,UAAU2K,iBAClClmB,KAAK4uE,UAAY5uE,KAAK2uE,YAAYjjB,wBAElC1rD,KAAKub,UAAUnI,UAAUrS,IAAI,mBAG/Bf,KAAK2mC,OAAS3mC,KAAKub,UAAUnG,kBAAkBA,kBAAkBA,kBAE9DpV,KAAK2d,aACN,QAAiB3d,KAAKub,UAAWvb,KAAK8T,SAoBnC04B,oBAAoBqiC,GACzB7uE,KAAKuuE,SAAWM,EAGX7iD,YACLhsB,KAAKub,UAAUnI,UAAUrS,IAAI,UAC7Bf,KAAK8f,YAAY,GAGZ+L,cAAcvd,GACnB,GAAGtO,KAAKquE,UAAYruE,KAAKsO,QAAS,OAElCtO,KAAKsO,QAAUA,EAEf,MAAMgN,IAAWtb,KAAKsb,OAChBwzD,EAAYznD,KAAKC,MAEjBynD,EAASxpE,IAGb,GAFA+I,EAAQ0gE,OAAS1gE,EAAQ49B,UAAY,KAElC5wB,IAAWtb,KAAKsb,OACjB,OAGF,MAAM2zD,EAAc5nD,KAAKC,MAAQwnD,EAIjC,IAAIvpE,GAAOvF,KAAK2d,WAAY,CAC1B3d,KAAK8f,YAAY,KAEjB,MAAM6B,EAAQutD,IAEXD,EAActtD,EACf3hB,KAAKorB,SAEL1oB,YAAW,KACN4Y,IAAWtb,KAAKsb,QACjBtb,KAAKorB,WAENzJ,QAGF3hB,KAAK0mC,gBACN1mC,KAAKkrB,OAAOlrB,KAAKub,UAAU5C,gBAC3B,SAAQ,KACN3Y,KAAKgsB,gBAGPhsB,KAAKorB,SAITprB,KAAKsO,QAAUA,EAAU,MAG3BA,EACCD,MAAK,IAAM0gE,EAAM,QACjBp3D,OAAOpS,GAAQwpE,EAAMxpE,KAEnB+I,EAAQ6gE,mBACT7gE,EAAQ6gE,mBAAmB/oE,IAKzB,GAAGkV,IAAWtb,KAAKsb,OAAQ,OAG3B,MAAMogD,EAAWt1D,EAAQ+lC,KAAO/lC,EAAQgmC,MAAQ,IAChDpsC,KAAK8f,YAAY47C,MAKhBxwC,OAAO6b,EAAev2B,GAAQ,EAAOlC,GACvCtO,KAAKkL,WACNlL,KAAKkL,YAGJlL,KAAKub,UAAU5C,eAChB3Y,KAAKub,UAAUnI,UAAU7Q,OAAO,UAGlCvC,KAAKouE,UAAW,EAEb9/D,GACDtO,KAAK6rB,cAAcvd,GAGrB,IAAI8gE,EAAU,GACXpvE,KAAKouE,UAAYpuE,KAAKub,UAAU5C,gBAAkBouB,KACnDqoC,GAAU,OAAQpvE,KAAKub,WAAa,EAAI,EACrCvb,KAAKub,UAAU5C,gBAAkBouB,GAClCA,EAAK/mC,KAAKsuE,cAActuE,KAAKub,aAIjC,OAAcvb,KAAKub,UAAW,cAAc,EAjOxB,SAiO+CvX,EAAWorE,GAE3EpvE,KAAK2d,YAAcnN,GACpBxQ,KAAK8f,YAAY,GAIdsL,S,MACFprB,KAAKouE,WAKRpuE,KAAKouE,UAAW,GAIC,QAAd,EAAApuE,KAAKub,iBAAS,eAAE5C,iBAYjB,OAAc3Y,KAAKub,UAAW,cAAc,EA9P1B,KA8PkD,KAClEvb,KAAKub,UAAUhZ,WACd,IAMAud,YAAY47C,GACjB,GAAI17D,KAAK4mC,cAAgB,OAAQ5mC,KAAK2mC,QAItC,GAAgB,IAAb+0B,EAKH,IACM17D,KAAK4mC,cACP5mC,KAAK4mC,YAAc5mC,KAAK2mC,OAAO0oC,kBAIjCrvE,KAAK2mC,OAAOr7B,MAAMgkE,gBAAuB/oE,KAAKC,IAAI,EAAGk1D,EAAW,IAAM17D,KAAK4mC,aAAe,KAAO5mC,KAAK4mC,YACtG,MAAMrhC,SAXNvF,KAAK2mC,OAAOr7B,MAAMgkE,gBAAkB,M,wbCtQnC,SAAeC,EACpBjlD,EACAviB,EACAmwB,EACAtwB,EACAoiB,EAAM,IAAIxE,MACV2oB,GAAY,G,yCAEZ,MAAMvqB,QAAUpG,EAAA,qDAA6DzV,EAAQmwB,EAAOtwB,GACtFwiB,EAAcxG,EAAE0kB,OAChBy6B,EAASn/C,EAAEm/C,OAIjB,IAAIyM,EACAxyB,EACAyyB,EACJ,GALAzlD,EAAI5W,UAAUrS,IAAI,gBAKfgiE,EAED/lB,EAAW,MACT,EAAAj0B,EAAA,GAAeuB,EAAKN,GACpBM,EAAI3E,QAAQouB,MAAQ,QAEjB,CACL,MAAMze,EAAU9X,EAAA,6BACb8X,GACDtL,EAAI5W,UAAUrS,IAAI,WAGpB,IAAI2uE,GAAe,EACnB,GAAY,cAAT9nE,EAAsB,CACvB,MAAM6oB,QAAY8+C,EAAUjlD,EAAKviB,EAAQmwB,EAAO,eAChDs3C,EAAqB/+C,EAAIrG,YACzBqlD,EAAah/C,EAAIg/C,gBACZ,GAAGv3C,EAAMy3C,eAAgB,CAC9BF,EAAa,IAAIjqD,MACjB8E,EAAIlX,UAAUrS,IAAI,mBAClB0uE,EAAWr8D,UAAUrS,IAAI,eAAgB,0BACzC,MAAM0G,GAAM,EAAAmoE,EAAA,GAAuB13C,EAAMy3C,gBACzCH,GAAqB,EAAAxoD,EAAA,IAA0ByoD,EAAYhoE,GAAK4G,MAAK,KAChEqhE,IAIH,EAAA3mD,EAAA,GAAeuB,EAAKmlD,MAIxBzyB,EAAW,KACT0yB,GAAe,EAEZD,EACDnlD,EAAI7e,OAAOue,IAEX,EAAAjB,EAAA,GAAeuB,EAAKN,GAGtBtnB,YAAW,KACN4nB,EAAI0E,mBACL6gD,EAAA,gBAA4B7lD,GAAK,KAC/BM,EAAI3E,QAAQouB,MAAQ,GAEjBze,GACDtL,EAAI5W,UAAU7Q,OAAO,WAGpBktE,GACDA,EAAWltE,cAIhB+yB,EAAU,IAAM,IAIvB,MAAMw6C,EAAgB1lD,EACrB/b,MAAM5G,IAAQ,EAAAuf,EAAA,IAA0BgD,EAAKviB,KAC7C4G,KAAK2uC,GAIN,aAFOwyB,GAAsBM,EAEtB,CACL/M,OAAAA,EACA34C,YAAaolD,GAAsBM,EACnCL,WAAAA,MAIJ,SAAS9rE,EACP2mB,EACAvL,EACAg1B,EACAngC,IAEA,EAAA6lB,EAAA,GAAanP,EAAKvL,GAClBuL,EAAI3E,QAAQouB,MAAQA,EACpBzpB,EAAIlX,UAAU7Q,OAAO,cAAe,uBAAwB,sBAC5DqR,GAAQ0W,EAAIlX,UAAUrS,IAAI6S,GAIb,SAAew6B,EAC5B9jB,EACAviB,EACAk+B,GAAW,EACXn3B,EAAQ,GACRq/B,GAAY,EACZE,G,yCAEA,MAAM0hC,EAAOvyD,EAAA,OAEb,GAAGzV,IAAWgoE,GAAQ9pC,EAEpB,YADAtiC,EAAI2mB,EAAK,GAAI,GAAI,eAInB,MAAMtjB,EAAWwW,EAAA,WAEjB,GAAGzV,IAAW,MAAgBA,EAAOg2B,SAAU,CAC7C,MAAMvB,QAAax1B,EAASy1B,gBAAgBC,QAAQ30B,GACpD,GAAGy0B,GAAQA,EAAKhvB,QAAUgvB,EAAKhvB,OAAOwxB,QAEpC,YADAr7B,EAAI2mB,EAAK,IAAI,EAAA0lD,EAAA,GAAiBjoE,GAAS,wBAK3C,MAAMH,EAAsBymC,EAAQ,YAAc,cAC5CnW,QAAclxB,EAASqI,gBAAgBC,aAAavH,GACpDkoE,IAAoB/3C,EACpBg4C,IAAmB5lD,EAAIlV,oBAAuBkV,EAAIlV,kBAAkChC,UAAUqB,SAAS,SAC7G,IAAIw7D,IAAoBC,WAA0BlpE,EAASmpE,kBAAkBC,eAAeroE,EAAQH,IAAQ,CAC1G,IAAImsC,EAAQ,GAKZ,IAJGhsC,GAAWA,IAAWgoE,GAAS9pC,IAChC8N,GAAQ,EAAAi8B,EAAA,GAAiBjoE,IAGxBA,IAAW,KAEZ,YADApE,EAAI2mB,EAAK,GAAIypB,EAAO,sBAItB,MAAM2L,QAAc5wC,GAAQ,EAAA4qB,EAAA,GAAgB5qB,GCvJjC,SAA+B/G,EAAgBf,EAAWwW,EAAA,Y,mDACvE,MAAMke,QAA0B10B,EAASqI,gBAAgBssB,QAAQ5zB,GACjE,OAAO,EAAA2xB,EAAA,GACoB,QAAxB,EAAAgC,EAAmB5sB,aAAK,QAAI,CAAE4sB,EAAmB20C,WAAa30C,EAAmB40C,WAAWh4C,OAAOC,SAASzU,KAAK,O,mRDoJ7DysD,CAAgBxoE,EAAQf,GAC7ErD,EAAI2mB,EAAKo1B,EAAM3L,EAAO,IAIxB,OAAGk8B,EACeV,EAAUjlD,EAAKviB,EAAQmwB,EAAOtwB,OAAM5D,EAAWmqC,QADjE,O,2BE9JK,SAASjM,EAAa6E,EAAeypC,GAAY,GACtD,MAAMv7D,EAAO,wMAKb,GAAGu7D,EAAW,CACZ,MAAMlmD,EAAMlf,SAASC,cAAc,OAQnC,OAPAif,EAAIlX,UAAUrS,IAAI,aAClBupB,EAAIvL,UAAY9J,EAEb8xB,GACDA,EAAK3vB,YAAYkT,GAGZA,EAIT,OADAyc,EAAK9uB,mBAAmB,YAAahD,GAC9B8xB,EAAK7gB,iBAKP,SAASuqD,EAAgB1pC,EAAyBnzB,EAAO,SAK9D,OAJAmzB,EAAK3zB,UAAU7Q,OAAO,SAAWqR,GACjCmzB,EAAK2H,UAAW,EAChBxM,EAAa6E,GAEN,KACLA,EAAKhoB,UAAY,GACjBgoB,EAAK3zB,UAAUrS,IAAI,SAAW6S,GAC9BmzB,EAAKsc,gBAAgB,a,gCAVzB,gBAA8BnhB,G,yFCnBf,MAAMwuC,EAKnB3wE,YAAYotB,GAQV,MAAM6Y,EAAQhmC,KAAKgmC,MAAQ56B,SAASC,cAAc,SAClD26B,EAAM5yB,UAAUrS,IAAI,eAEjBosB,EAAQwjD,YACT3qC,EAAM5yB,UAAUrS,IAAI,qBAGtB,MAAMsvB,EAAQrwB,KAAKqwB,MAAQjlB,SAASC,cAAc,SAClDglB,EAAMzuB,KAAO,QACIyuB,EAAMzY,KAAO,eAAiBuV,EAAQvV,KAEpDuV,EAAQ1gB,QACT4jB,EAAM5jB,MAAQ0gB,EAAQ1gB,MAEnB0gB,EAAQ0uB,WACT,eAA2BxtC,MAAM+d,IAC/BiE,EAAMkU,SAAU,OAAgBnY,EAAOe,EAAQ0uB,YAAc1uB,EAAQ1gB,SAGvE4jB,EAAM1iB,iBAAiB,UAAU,KAC/B,sCAA4Cwf,EAAQ0uB,SAAU1uB,EAAQ1gB,YAK5E,MAAMqS,EAAO9e,KAAK8e,KAAO1T,SAASC,cAAc,OAChDyT,EAAK1L,UAAUrS,IAAI,oBAEhBosB,EAAQtZ,KACTiL,EAAKC,UAAYoO,EAAQtZ,KAWjBsZ,EAAQolC,UAChB,QAAMzzC,EAAMqO,EAAQolC,SAGtBvsB,EAAMv6B,OAAO4kB,EAAOvR,GAGlBylB,cACF,OAAOvkC,KAAKqwB,MAAMkU,QAGhBA,YAAQA,GACVvkC,KAAKg8C,iBAAiBzX,GAEtB,MAAMgY,EAAQ,IAAIC,MAAM,SAAU,CAACzC,SAAS,EAAMp8B,YAAY,IAC9D3d,KAAKqwB,MAAMlnB,cAAcozC,GAGpBP,iBAAiBzX,GACtBvkC,KAAKqwB,MAAMkU,QAAUA,K,4BC7EV,SAASqsC,EAAUC,EAA6D9gD,GAC7F,MAAM+gD,EAAO1lE,SAASC,cAAc,QAYpC,OAVAwlE,EAAO/rE,SAAS8e,IACd,MAAM,UAACzY,EAAS,MAAEklB,GAASzM,EAC3BktD,EAAKrlE,OAAON,GACZklB,EAAM1iB,iBAAiB,UAAW7F,IAC7BuoB,EAAMkU,SACPxU,EAASM,EAAM5jB,MAAO3E,SAKrBgpE,E,+FCTM,MAAMC,EAyBnBhxE,YACEotB,EAQA1gB,EAAQ,GA7BH,KAAAmT,WAAY,EAIX,KAAAoxD,OAKH,GAOK,KAAAtyD,gBAAiB,EACjB,KAAAm8C,cAAe,EACf,KAAAt4C,UAAW,EA0DX,KAAA2zB,YAAeqG,IACvBv8C,KAAKsqC,MAAMiS,IAGH,KAAApH,YAAeoH,I,MACvBv8C,KAAK6hB,KAAO7hB,KAAKmL,UAAU2W,wBAC3B9hB,KAAK4f,WAAY,EACjB5f,KAAKsqC,MAAMiS,GACXv8C,KAAKmL,UAAUiI,UAAUrS,IAAI,eAClB,QAAX,EAAAf,KAAKgxE,cAAM,eAAE77B,cAAen1C,KAAKgxE,OAAO77B,YAAYoH,IAG5C,KAAA19B,UAAa09B,I,MACrBv8C,KAAK4f,WAAY,EACjB5f,KAAKmL,UAAUiI,UAAU7Q,OAAO,eACrB,QAAX,EAAAvC,KAAKgxE,cAAM,eAAEnyD,YAAa7e,KAAKgxE,OAAOnyD,UAAU09B,IAQ3C,KAAAlZ,QAAU,K,MACf,MAAM52B,GAASzM,KAAKg7D,KAAKvuD,MACzBzM,KAAKixE,UAAUxkE,IACJ,QAAX,EAAAzM,KAAKgxE,cAAM,eAAEpyD,UAAW5e,KAAKgxE,OAAOpyD,QAAQnS,KAvE5C,OAAWzM,KAAMmtB,GAEjBntB,KAAKmL,UAAYC,SAASC,cAAc,OACxCrL,KAAKmL,UAAUiI,UAAUrS,IAAI,iBAG1Bf,KAAK66D,aACN76D,KAAKmL,UAAUiI,UAAUrS,IAAI,iBACrBf,KAAK0e,gBACb1e,KAAKmL,UAAUiI,UAAUrS,IAAI,mBAG/Bf,KAAKkxE,OAAS9lE,SAASC,cAAc,OACrCrL,KAAKkxE,OAAO99D,UAAUrS,IAAI,yBAE1B,MAAMi6D,EAAOh7D,KAAKg7D,KAAO5vD,SAASC,cAAc,SAChD2vD,EAAK5nD,UAAUrS,IAAI,uBAEnBi6D,EAAKp5D,KAAO,QACZo5D,EAAKv8C,KAAO,GAAKze,KAAKye,KACtBu8C,EAAKr0D,IAAM,GAAK3G,KAAK2G,IACrBq0D,EAAKx0D,IAAM,GAAKxG,KAAKwG,IACrBw0D,EAAKvuD,MAAQ,GAAKA,EAEfA,GACDzM,KAAK8f,YAAYrT,GAGnB,MAAM0kE,EAAU,GAAKnxE,KAAKye,KACpBiP,EAAQyjD,EAAQt3D,QAAQ,KAC9B7Z,KAAKoxE,UAAsB,IAAX1jD,EAAe,EAAIyjD,EAAQtuE,OAAS6qB,EAAQ,EAI5D1tB,KAAKmL,UAAUM,OAAOzL,KAAKkxE,OAAQlW,GAGjCvuD,YACF,OAAQzM,KAAKg7D,KAAKvuD,MAGbkS,YAAYqyD,GACjBhxE,KAAKgxE,OAASA,EAqBT98D,eACLlU,KAAKg7D,KAAKrtD,iBAAiB,QAAS3N,KAAKqjC,SACzCrjC,KAAKqxE,kBAAmB,OAAoBrxE,KAAKmL,UAAWnL,KAAKm1C,YAAan1C,KAAKk2C,YAAal2C,KAAK6e,WAShGiB,YAAYrT,GACjBzM,KAAKg7D,KAAKvuD,MAAQ,GAAKA,EACvBzM,KAAKixE,WAAWjxE,KAAKg7D,KAAKvuD,OAGrB+T,YAAY/T,GACjBzM,KAAKg7D,KAAKvuD,MAAQ,KAAOzM,KAAKg7D,KAAKvuD,MAAQA,GAC3CzM,KAAKixE,WAAWjxE,KAAKg7D,KAAKvuD,OAGrBwkE,UAAUxkE,GACf,IAAIivD,GAAYjvD,EAAQzM,KAAK2G,MAAQ3G,KAAKwG,IAAMxG,KAAK2G,KACrD+0D,GAAW,OAAMA,EAAU,EAAG,GAG3B17D,KAAK66D,aACN76D,KAAKkxE,OAAO5lE,MAAM8Q,UAAY,UAAUs/C,KAExC17D,KAAKkxE,OAAO5lE,MAAMsX,MAAoB,IAAX84C,EAAkB,IAIvCpxB,MAAMiS,G,MACd,MAAM+0B,EAAUtxE,KAAKuiB,SAAWviB,KAAK6hB,KAAKmB,OAAShjB,KAAK6hB,KAAKe,MACvD2uD,GAAkB,OAAMvxE,KAAKuiB,WAAag6B,EAAM91B,EAAIzmB,KAAK6hB,KAAK+kD,QAAUrqB,EAAM/1B,EAAIxmB,KAAK6hB,KAAKI,KAAM,EAAGqvD,GAE3G,IAAI7kE,EAAQzM,KAAK2G,IAAO4qE,EAAkBD,GAAWtxE,KAAKwG,IAAMxG,KAAK2G,KAerE,OAbI8F,EAAQzM,KAAK2G,KAAS3G,KAAKwG,IAAMxG,KAAK2G,KAAO,IAC/C8F,GAASzM,KAAKye,KAAO,IAGvBhS,GAASA,EAAM+nC,QAAQx0C,KAAKoxE,UAC5B3kE,GAAQ,OAAMA,EAAOzM,KAAK2G,IAAK3G,KAAKwG,KAKpCxG,KAAK8f,YAAYrT,IACN,QAAX,EAAAzM,KAAKgxE,cAAM,eAAEpyD,UAAW5e,KAAKgxE,OAAOpyD,QAAQnS,GAErCA,EAGFyO,kBACFlb,KAAKqxE,mBACNrxE,KAAKqxE,mBACLrxE,KAAKqxE,iBAAmB,MAG1BrxE,KAAKg7D,KAAKzpD,oBAAoB,QAASvR,KAAKqjC,SAE5CrjC,KAAKgxE,OAAS,M,mGChKlB,IAAIQ,EAAgB,EACL,SAASl9C,EACtByS,EACAiW,EAAoD,KAAMt8B,QAAQxS,WAClE6gE,EAA8B,KAC9Br3D,GAAU,EACV+5D,EAAmB1qC,GAGnB,GAAGA,EAAKvvB,cAAc,aAAc,OACpCuvB,EAAK3zB,UAAUrS,IAAI,MAEnB,MAAM6iB,EAAIxY,SAASC,cAAc,OAUjC,IAAIqmE,EATJ9tD,EAAExQ,UAAUrS,IAAI,YAECgmC,EAAK3zB,UAAUqB,SAAS,cAEvCmP,EAAExQ,UAAUrS,IAAI,aAGlBgmC,EAAKrvB,EAAU,UAAY,UAAUkM,GAIrC,MAAM+tD,EAAa,CAACnZ,EAAiBmP,KACnC,MAAMmH,EAAYznD,KAAKC,MACjByf,EAAO37B,SAASC,cAAc,OAE9BumE,EAAUJ,IAIV5qE,EAAgG,KAApF2M,OAAO6P,iBAAiBQ,GAAGP,iBAAiB,qBAAqB4C,QAAQ,IAAK,IAGhGyrD,EAAU,KAMR,MAAMzC,EAAc5nD,KAAKC,MAAQwnD,EAC3B7+D,EAAK,KAET,YAAqB,KACnB82B,EAAKxkC,YAGJwsE,GAAOA,EAAM6C,IAElB,GAAG3C,EAAcroE,EAAU,CACzB,MAAM+a,EAAQpb,KAAKC,IAAII,EAAWqoE,EAAaroE,EAAW,GAC1DlE,YAAW,IAAMqkC,EAAK3zB,UAAUrS,IAAI,WAAWwF,KAAKC,IAAImb,EAAQ/a,EAAW,EAAG,IAE9ElE,WAAWuN,EAAI0R,QAEfolB,EAAK3zB,UAAUrS,IAAI,UACnB2B,WAAWuN,EAAIrJ,EAAW,GAGxB,KACF2M,OAAOhC,oBAAoB,cAAemgE,GAG5CA,EAAU,KACVG,GAAkB,GAIpB70B,GAAYA,EAAS40B,GAerBr+D,OAAOgzB,uBAAsB,KAC3B,MAAM1kB,EAAO+B,EAAE9B,wBACfilB,EAAK3zB,UAAUrS,IAAI,oBAEnB,MAAMs+D,EAAS7G,EAAU32C,EAAKI,KACxB6vD,EAASnK,EAAU9lD,EAAKa,IAGxB9a,EADSrB,KAAKusC,KAAK,SAACvsC,KAAK+Y,IAAIwyD,EAASjwD,EAAKmB,OAAS,GAAKnB,EAAKmB,OAAS,EAAM,GAAI,SAACzc,KAAK+Y,IAAI+/C,EAASx9C,EAAKe,MAAQ,GAAKf,EAAKe,MAAQ,EAAM,IAIzI4D,EAAI64C,EAASz3D,EAAO,EACpB6e,EAAIqrD,EAASlqE,EAAO,EAI1Bm/B,EAAKz7B,MAAMsX,MAAQmkB,EAAKz7B,MAAM0X,OAASpb,EAAO,KAC9Cm/B,EAAKz7B,MAAM2W,KAAOuE,EAAI,KACtBugB,EAAKz7B,MAAMoX,IAAM+D,EAAI,KAgBrB7C,EAAEnY,OAAOs7B,OAQPgrC,EAAoBjqE,GAAaA,EAAEzH,SAAW0mC,IAClD,CAAC,SAAU,KAAKnyB,SAAU9M,EAAEzH,OAAuBoc,WACjD,OAAgB3U,EAAEzH,OAAuB,cAAgBujB,KAE3D6tD,IAAqB1qC,KAClB,OAAcj/B,EAAEzH,OAAuBoxE,IAI5C,IAAII,GAAkB,EACtB,GAAG,IAAoB,CACrB,MAAMG,EAAW,KACfN,GAAWA,KAGbD,EAAiB9jE,iBAAiB,cAAe7F,IAC/C,IAAI,+BACF,OAIF,GAAGA,EAAEolB,QAAQrqB,OAAS,GAAKgvE,GAAmBE,EAAiBjqE,GAC7D,OAIF+pE,GAAkB,EAElB,MAAM,QAACrZ,EAAO,QAAEmP,GAAW7/D,EAAEolB,QAAQ,GACrCykD,EAAWnZ,EAASmP,GACpB8J,EAAiB9jE,iBAAiB,WAAYqkE,EAAU,CAAChkE,MAAM,IAE/DuF,OAAO5F,iBAAiB,aAAc7F,IACpCA,EAAEkqB,cAAe,EACjBlqB,EAAEq/D,kBACF6K,IACAP,EAAiBlgE,oBAAoB,WAAYygE,KAChD,CAAChkE,MAAM,MACT,CAACuT,SAAS,SAEbkwD,EAAiB9jE,iBAAiB,aAAc7F,IAC9C,IAAI,CAAC,EAAG,GAAG8M,SAAS9M,EAAEkO,QACpB,OAGF,IAAI,+BACF,OAIF,GAAuC,MAApCy7D,EAAiB9rD,QAAQ2O,QAAkBy9C,EAAiBjqE,GAC7D,OACK,GAAG+pE,EAER,YADAA,GAAkB,GAIpB,MAAM,QAACrZ,EAAO,QAAEmP,GAAW7/D,EAC3B6pE,EAAWnZ,EAASmP,GACpBp0D,OAAO5F,iBAAiB,UAAW+jE,EAAS,CAAC1jE,MAAM,EAAMuT,SAAS,IAClEhO,OAAO5F,iBAAiB,cAAe+jE,EAAS,CAAC1jE,MAAM,EAAMuT,SAAS,MACrE,CAACA,SAAS,M,sKCnLjB,MAAM0wD,EAAa,CAAC/vE,EAAsBsQ,MACzB,IAAZA,IAE2B,iBAAd,GACd,OAAatQ,EAASsQ,GAEtBtQ,EAAQuJ,OAAO+G,KAMJ,MAAM0/D,EAmBnBnyE,YAAYotB,EAuBP,IA7BE,KAAAwV,SAAU,EA8BZxV,EAAQglD,uBACThlD,EAAQ4Y,cAAgB,IAAI,IAAc,OAAD,QACvCr0B,eAAgByb,EAAQzb,gBACrByb,EAAQglD,wBAIf,MAAM11D,EAAU0Q,EAAQilD,OAAS,IAAOjlD,EAAQklD,YAAcllD,EAAQ4Y,cAAgB,QAAU,MAQhG,GAPA/lC,KAAKmL,UAAYC,SAASC,cAAcoR,GACxCzc,KAAKmL,UAAUiI,UAAUrS,IAAI,MAAO,eAEjCosB,EAAQmlD,QACTtyE,KAAKmL,UAAUiI,UAAUrS,IAAI,WAG5BosB,EAAQkN,SAAU,CACnB,MAAMA,EAAWr6B,KAAKq6B,SAKtB,GAJA43C,EAAW53C,EAAUlN,EAAQkN,UAE1BlN,EAAQmlD,QAAQj4C,EAASjnB,UAAUrS,IAAI,WAEvCosB,EAAQolD,cAAe,CACxBvyE,KAAKmL,UAAUM,OAAOzL,KAAKwyE,YAAcxyE,KAAKyyE,aAC9CzyE,KAAKwyE,YAAYp/D,UAAUrS,IAAI,oBAC/B,MAAMwxE,EAAgBvyE,KAAKuyE,cAAgBnnE,SAASC,cAAc,OAClEknE,EAAcn/D,UAAUrS,IAAI,eAAgB,sBAE5CkxE,EAAWM,EAAeplD,EAAQolD,eAClCvyE,KAAKwyE,YAAY/mE,OAAO4uB,EAAUk4C,SAE5BplD,EAAQwzC,iBAChB3gE,KAAKq6B,SAAS5uB,QAAO,QAAK0hB,EAAQwzC,gBAAiBxzC,EAAQulD,mBAG7D,IAAIp4C,IAAgBnN,EAAQmN,YAC5B,GAAGnN,EAAQklD,YAAcllD,EAAQ4Y,cAAe,CAO9C,GANG5Y,EAAQklD,aACTryE,KAAKqyE,WAAallD,EAAQklD,WAC1BryE,KAAKmL,UAAUM,OAAOzL,KAAKqyE,WAAWrsC,OACtC1L,GAAc,GAGbnN,EAAQ4Y,cAAe,CACxB/lC,KAAK+lC,cAAgB5Y,EAAQ4Y,cAE7B,MAAM4sC,EAAWxlD,EAAQ4Y,cAAcC,MAAM5yB,UAAUqB,SAAS,yBAShE,GARGk+D,GACD3yE,KAAKmL,UAAUiI,UAAUrS,IAAI,mBAC7BosB,EAAQiN,WAAap6B,KAAK+lC,cAAcC,QAExC1L,GAAc,EACdt6B,KAAKmL,UAAUM,OAAOzL,KAAK+lC,cAAcC,QAGxC7Y,EAAQylD,uBAAyBD,EAAU,CAC5C,MAAM5iD,EAAW,MACf,OAAe/vB,KAAKq6B,UAAU,QAAKr6B,KAAK+lC,cAAc1V,MAAMkU,QAAU,mBAAqB,uBAG1FpX,EAAQzb,eAAgByb,EAAQzb,eAAe3Q,IAAIf,KAAK+lC,cAAc1V,MAA9ClD,CAAqD,SAAU4C,GACrF/vB,KAAK+lC,cAAc1V,MAAM1iB,iBAAiB,SAAUoiB,KAInD5C,EAAQklD,YAAcllD,EAAQ4Y,eACtCC,MAAM5yB,UAAUrS,IAAI,iBAGxB,GAAGosB,EAAQre,OAASqe,EAAQklC,aAAc,CACxC,IAAI3xB,EACJ,MAAMmyC,EAAoB1lD,EAAQiN,YAAcjN,EAAQ2lD,oBAkBxD,GAjBGD,GACD7yE,KAAKmL,UAAUM,OAAOi1B,EAAI1gC,KAAK+yE,SAAW/yE,KAAKyyE,aAC/CzyE,KAAK+yE,SAAS3/D,UAAUrS,IAAI,kBAE5B2/B,EAAI1gC,KAAKmL,UAGXnL,KAAK8O,MAAQ9O,KAAKgzE,cACf7lD,EAAQmlD,QAAQtyE,KAAK8O,MAAMsE,UAAUrS,IAAI,WACzCosB,EAAQre,MACTmjE,EAAWjyE,KAAK8O,MAAOqe,EAAQre,OACvBqe,EAAQklC,cAChBryD,KAAK8O,MAAMrD,QAAO,QAAK0hB,EAAQklC,eAGjC3xB,EAAEj1B,OAAOzL,KAAK8O,OAEX+jE,EAAmB,CACpB,MAAMz4C,EAAap6B,KAAKo6B,WAAahvB,SAASC,cAAc,OAC5D+uB,EAAWhnB,UAAUrS,IAAI,YAAa,mBAEnCosB,EAAQ2lD,qBACT14C,EAAWhnB,UAAUrS,IAAI,6BAG3BkxE,EAAW73C,EAAYy4C,GACvBnyC,EAAEj1B,OAAO2uB,IAIVjN,EAAQvZ,OACT0mB,GAAc,EACdt6B,KAAK8O,MAAMsE,UAAUrS,IAAI,QAAS,SAAWosB,EAAQvZ,MACrD5T,KAAKmL,UAAUiI,UAAUrS,IAAI,kBAG5Bu5B,GACDt6B,KAAKmL,UAAUiI,UAAUrS,IAAI,oBAG5BosB,EAAQ8lD,gBACT9lD,EAAQuB,UAAY,IAAMvB,EAAQ8lD,cAAcroD,SAG/CuC,EAAQuB,WAAavB,EAAQklD,YAAcllD,EAAQ4Y,iBACnB,mBAAvB5Y,EAAiB,YACzB,QAAiBntB,KAAKmL,WAAYrD,IAC7B9H,KAAK2iC,SACPxV,EAAQuB,UAAkB5mB,KAC1B,CAAC4J,eAAgByb,EAAQzb,iBAG9B1R,KAAKmL,UAAUiI,UAAUrS,IAAI,gBAAiB,gBAE1CosB,EAAQ5O,WACV,OAAOve,KAAKmL,eAAWnH,OAAWA,GAAW,KAQ9CmpB,EAAQkgD,aAAelgD,EAAQ+lD,sBAChClzE,KAAKqtE,YAAclgD,EAAQkgD,uBAAuB7pE,YAChD2pB,EAAQkgD,aACR,OAAO,gCAAiC,CAACx5D,KAAMsZ,EAAQ+lD,qBACzDlzE,KAAKmL,UAAUM,OAAOzL,KAAKqtE,cAIpBhzC,e,MACT,OAAqB,QAAd,EAAAr6B,KAAKmzE,iBAAS,QAAKnzE,KAAKmzE,UAAYnzE,KAAKozE,iBAG1CX,YACN,MAAM/xC,EAAIt1B,SAASC,cAAc,OAEjC,OADAq1B,EAAEttB,UAAUrS,IAAI,WACT2/B,EAGDsyC,cACN,MAAMlkE,EAAQ1D,SAASC,cAAc,OAGrC,OAFAyD,EAAMsE,UAAUrS,IAAI,aACpB+N,EAAMpB,aAAa,MAAO,QACnBoB,EAGDskE,iBACN,MAAM/4C,EAAWjvB,SAASC,cAAc,OAMxC,OALAgvB,EAASjnB,UAAUrS,IAAI,gBACvBs5B,EAAS3sB,aAAa,MAAO,QAC1B1N,KAAK8O,MAAO9O,KAAK8O,MAAMw+C,MAAMjzB,GAC3Br6B,KAAKmL,UAAUuM,QAAQ2iB,GAC5Br6B,KAAKmL,UAAUiI,UAAU7Q,OAAO,eACzB83B,EAGFg5C,YAAYzrE,GACjB,MAAMnC,EAAQ2F,SAASC,cAAc,OACrC,OAAOrL,KAAKu6B,kBAAkB90B,EAAOmC,GAGhC2yB,kBAAkB90B,EAAoBmC,GAY3C,OAXA5H,KAAKmL,UAAUiI,UAAUrS,IAAI,oBAE7Bf,KAAKyF,MAAQA,EACbA,EAAM2N,UAAUrS,IAAI,aAEjB6G,GACDnC,EAAM2N,UAAUrS,IAAI,aAAe6G,GAGrC5H,KAAKmL,UAAUM,OAAOhG,GAEfA,GAIJ,MAAM6tE,EAA8BvtC,GAClC,IAAImsC,EAAI,CAACnsC,cAAAA,EAAer0B,eAAgBq0B,EAAcr0B,iBAGlD6hE,EAAoB,CAAC/iB,EAAazgC,KACtC,OAAUygC,EAAKj2C,KAAKqJ,IAAM,CAAEzY,UAAWyY,EAAEzY,UAAWklB,MAAOzM,EAAEyuD,WAAWhiD,UAAUN,GAG9EyjD,EAAsB,CAACltC,EAAiFvW,KACnH,MAAMnY,EAAO,SAA2B,QAAhBrR,KAAK6wC,SAAsB,GACnD,IAAIq8B,EACJ,MAAMjjB,EAAOlqB,EAAO/rB,KAAI,EAAEgxC,YAAAA,EAAa9+C,MAAAA,EAAO83B,QAAAA,MAC5C,MAAMpK,EAAM,IAAI+3C,EAAI,CAClBG,WAAY,IAAI,IAAW,CACzB9f,QAAShH,EACT3zC,KAAAA,EACAnL,MAAO,GAAKA,MAQhB,OAJG83B,IACDkvC,EAAoBt5C,EAAIk4C,YAGnBl4C,KAGH22C,EAAOyC,EAAkB/iB,EAAMzgC,GAIrC,OAHG0jD,IACDA,EAAkBlvC,SAAU,GAEvBusC,I,6GCjPT,MAAM4C,E,QAAkBC,WAAa,IAAM,GAEpC,MAAMC,EAuBX7zE,YAAmBa,EAAiBizE,EAAY,GAAW1oE,EAAyBC,SAASC,cAAc,QAAxF,KAAAzK,GAAAA,EAAwC,KAAAuK,UAAAA,EAnBpD,KAAA2oE,gBAA0B,EAE1B,KAAAC,mBAA6B,EAC7B,KAAAC,oBAA8B,EAM9B,KAAAC,4BAA6B,EAC1B,KAAAC,yBAA0B,EAmG7B,KAAA99C,SAAW,KAOhB,GAAGp2B,KAAKi0E,2BAGN,OAFAj0E,KAAKm0E,qBACLn0E,KAAKk0E,yBAA0B,IAK5Bl0E,KAAKo0E,eAAkBp0E,KAAKiwB,kBAAsBjwB,KAAK4jC,SAAY5jC,KAAKwT,sBAC1ExT,KAAK8zE,kBAGR9zE,KAAK8zE,gBAAkBvgE,OAAO7Q,YAAW,KACvC1C,KAAK8zE,gBAAkB,EAEvB,MAAMO,EAAiBr0E,KAAKmL,UAAUnL,KAAKs0E,gBAC3Ct0E,KAAKg0E,oBAAsBh0E,KAAK+zE,qBAAuBM,EAAiB,EAAKr0E,KAAK+zE,mBAAqBM,EAAiB,GAAK,EAC7Hr0E,KAAK+zE,mBAAqBM,EAGvBr0E,KAAKwT,oBACNxT,KAAKwT,qBAGJxT,KAAK+/B,kBACN//B,KAAK+/B,qBAGN2zC,MA3HH1zE,KAAKmL,UAAUiI,UAAUrS,IAAI,cAE7Bf,KAAKyd,KAAM,QAAO,UAAYo2D,EAAY,IAAMA,EAAY,IAAK,YAE9DjzE,IACDgY,MAAMC,KAAKjY,EAAGi0B,UAAU/vB,SAAS47B,GAAM1gC,KAAKmL,UAAUM,OAAOi1B,KAE7D9/B,EAAG6K,OAAOzL,KAAKmL,YAKZopE,oBACFv0E,KAAKw0E,sBAIRx0E,KAAKw0E,qBAAsB,EAC3Bx0E,KAAKmL,UAAUwC,iBAAiB,SAAU3N,KAAKo2B,SAAU,CAAC7U,SAAS,EAAM1M,SAAS,KAG7E4/D,uBACDz0E,KAAKw0E,sBAITx0E,KAAKw0E,qBAAsB,EAC3Bx0E,KAAKmL,UAAUoG,oBAAoB,SAAUvR,KAAKo2B,SAAU,CAACvhB,SAAS,KAGjEX,eACFlU,KAAK00E,+BAIRnhE,OAAO5F,iBAAiB,SAAU3N,KAAKo2B,SAAU,CAAC7U,SAAS,IAC3DvhB,KAAKu0E,oBAELv0E,KAAK00E,8BAA+B,SAAuB,KACzD10E,KAAKi0E,4BAA6B,EAE/Bj0E,KAAK8zE,kBACN9zE,KAAKm0E,gBACLn0E,KAAKk0E,yBAA0B,MAEhC,KACDl0E,KAAKi0E,4BAA6B,EAE/Bj0E,KAAKk0E,0BACNl0E,KAAKo2B,WACLp2B,KAAKk0E,yBAA0B,OAK9Bh5D,kBACDlb,KAAK00E,+BAITnhE,OAAOhC,oBAAoB,SAAUvR,KAAKo2B,UAC1Cp2B,KAAKy0E,uBAELz0E,KAAK00E,+BACL10E,KAAK00E,kCAA+B1wE,GAG/BF,UACL9D,KAAKkb,kBACLlb,KAAKwT,wBAAqBxP,EAC1BhE,KAAKo0E,mBAAgBpwE,EACrBhE,KAAKiwB,sBAAmBjsB,EAGnByH,OAAOvJ,GACZlC,KAAKmL,UAAUM,OAAOvJ,GAGjBszB,kBAAkBrI,GAGvB,OAAO,OAAiB,OAAD,wBAClBA,GAAO,CACVhiB,UAAWnL,KAAKmL,aA2CbgpE,gBACFn0E,KAAK8zE,kBAENxgE,aAAatT,KAAK8zE,iBAClB9zE,KAAK8zE,gBAAkB,IAQd,MAAMa,UAAmBf,EAKtC7zE,YAAYa,EAAiBizE,EAAY,GAAWe,EAAiB,IAAKC,GACxE9iE,MAAMnR,EAAIizE,GADwC,KAAAe,eAAAA,EAF7C,KAAA9yB,UAAiC,CAACp/B,KAAK,EAAMkkD,QAAQ,GAsBrD,KAAA7mC,iBAAmB,KACxB,IAAK//B,KAAKo0E,gBAAkBp0E,KAAKiwB,iBAAmB,OAEpD,GAAGjwB,KAAKi0E,2BAEN,YADAj0E,KAAKo2B,WAIP,MAAMF,EAAel2B,KAAKmL,UAAU+qB,aACpC,IAAIA,EACF,OAGF,MACM4+C,EAAe5+C,EADAl2B,KAAKmL,UAAU47D,aAE9B/wC,EAAYh2B,KAAK+zE,mBAIpB/zE,KAAKo0E,eAAiBp+C,GAAah2B,KAAK40E,gBAAkB50E,KAAKg0E,qBAAuB,GACvFh0E,KAAKo0E,gBAGJp0E,KAAKiwB,kBAAqB6kD,EAAe9+C,GAAch2B,KAAK40E,gBAAkB50E,KAAKg0E,qBAAuB,GAC3Gh0E,KAAKiwB,oBAlCPjwB,KAAKmL,UAAUiI,UAAUrS,IAAI,gBAC7Bf,KAAKkU,eACLlU,KAAKs0E,eAAiB,YAGjBxkD,oBAAoBlvB,GACzBZ,KAAK4jC,QAAUhjC,EACfZ,KAAKyd,IAAI,uBAAwB7c,EAAIZ,MA+BhC0X,WAAWoN,IACf9kB,KAAK4jC,SAAW5jC,KAAKypB,SAAWzpB,KAAKmL,WAAWuM,WAAWoN,GAGvDrZ,UAAUqZ,IACd9kB,KAAK4jC,SAAW5jC,KAAKypB,SAAWzpB,KAAKmL,WAAWM,UAAUqZ,GAGtDiwD,mBACL,OAAO/0E,KAAKk2B,aAAe3vB,KAAKmD,MAAM1J,KAAKg2B,UAAYh2B,KAAKmL,UAAUg7D,cAGpEiF,qBACF,OAAOprE,KAAK+0E,oBAAsB,EAGhC/+C,cAAUvP,GACZzmB,KAAKmL,UAAU6qB,UAAYvP,EAGzBuP,gBAEF,OAAOh2B,KAAKmL,UAAU6qB,UAGjBg/C,qBAAqBvoE,GAC1BzM,KAAK+zE,mBAAqBtnE,EAC1BzM,KAAKi1E,wBAELj1E,KAAKg2B,UAAYvpB,EAGZwoE,wBACFj1E,KAAK00E,+BACN10E,KAAKy0E,uBACLz0E,KAAKmL,UAAUwC,iBAAiB,UAAW7F,KACzC,OAAYA,GACZ9H,KAAKu0E,sBACJ,CAAC1/D,SAAS,EAAM0M,SAAS,EAAOvT,MAAM,KAIzCkoB,mBACF,OAAOl2B,KAAKmL,UAAU+qB,cAInB,MAAMg/C,UAAoBtB,EAC/B7zE,YAAYa,EAAiBizE,EAAY,GAAWe,EAAiB,IAAYO,EAAa,GAAWhqE,EAAyBC,SAASC,cAAc,QAKvJ,GAJA0G,MAAMnR,EAAIizE,EAAW1oE,GAD6B,KAAAypE,eAAAA,EAA6B,KAAAO,WAAAA,EAAwB,KAAAhqE,UAAAA,EAGvGnL,KAAKmL,UAAUiI,UAAUrS,IAAI,iBAEzB,IAAoB,CACtB,MAAMq0E,EAAsBttE,KACtBA,EAAEutE,QAAUr1E,KAAKmL,UAAUmqE,YAAct1E,KAAKmL,UAAUq+C,cAC1DxpD,KAAKmL,UAAUo+C,YAAczhD,EAAEyV,OAAS,GACxC,OAAYzV,KAIhB9H,KAAKmL,UAAUwC,iBAAiB,QAASynE,EAAoB,CAAC7zD,SAAS,IAGzEvhB,KAAKs0E,eAAiB,gB,8OClTX,MAAMiB,UAAuB,IAA5C,c,oBAEU,KAAAp1B,aAAyC,KAEzC,KAAAq1B,WAAqB,EAQtB3jD,KACL8R,EACA6xC,GAAqB,GAErBx1E,KAAKw1E,UAAYA,EACjBx1E,KAAK2jC,QAAUA,EAEf3jC,KAAKmL,UAAUiI,UAAUrS,IAAI,uBAC7Bf,KAAKy1E,SAAS,YAEdz1E,KAAK+gD,WAAa,IAAI,KAAYC,IAChChhD,KAAKmgD,aAAea,KAGtB,MAAMjd,EAAU,IAAI2xC,GAAe,IAE7BC,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3Bf,KAAK41E,oBAAsB,IAAI,KAAW,CACxC5vC,MAAO,yBACPgyB,UAAW,MAGbh4D,KAAK61E,wBAA0B,IAAI,KAAW,CAC5C7vC,MAAO,eACPpuB,KAAM,WACNsgD,aAAa,IAGfyd,EAAalqE,OACXzL,KAAK41E,oBAAoBzqE,UACzBnL,KAAK61E,wBAAwB1qE,WAG/BnL,KAAK0R,eAAe3Q,IAAIf,KAAK41E,oBAAoBvlD,MAAjDrwB,CAAwD,SAAS,KAE/D,IAAI81E,IADU91E,KAAK41E,oBAAoBnpE,MACd5J,SAAW7C,KAAK41E,oBAAoBvlD,MAAMjd,UAAUqB,SAAS,SACnFzU,KAAKw1E,YAAWM,EAAaA,KAAgB91E,KAAK+1E,sBAAwB/1E,KAAKg2E,qBAClFh2E,KAAK2gD,QAAQvtC,UAAUxJ,OAAO,eAAgBksE,MAGhD91E,KAAK2gD,SAAU,OAAa,CAAC/sC,KAAM,gBAEnC,QAAiB5T,KAAK2gD,SAAS,KAC7B,MAAM7xC,EAAQ9O,KAAK41E,oBAAoBnpE,MAEvC,IAAI6B,EACJ,GAAGtO,KAAKw1E,UAAW,CACjB,IAAIx1E,KAAKg2E,sBAAwBh2E,KAAK+1E,mBAAoB,OAC1DznE,EAAUtO,KAAKgH,SAASi4B,gBAAgBg3C,cAAc,CACpDnnE,MAAAA,EACA+xD,MAAO,GACPqV,UAAW,OAAF,QACPzmE,EAAG,iBACAzP,KAAK+1E,oBAEVrT,QAAS1iE,KAAKg2E,oBACdG,WAAW,IACV9nE,MAAM+nE,IACJp2E,KAAKmgD,cACNngD,KAAKmgD,eAAe9xC,MAAMgoE,IACxBr2E,KAAKgH,SAASi4B,gBAAgBq3C,UAAUF,EAAQC,MAIjDr2E,KAAK2jC,QAAQ9gC,QACd7C,KAAKgH,SAASi4B,gBAAgBs3C,gBAAgBH,EAAQp2E,KAAK2jC,SAGtDyyC,UAGTp2E,KAAK2gD,QAAQjS,UAAW,EACxBpgC,EAAUtO,KAAKgH,SAASi4B,gBAAgBu3C,WAAW1nE,EAAO9O,KAAK2jC,QAAQppB,KAAKxS,GAAWA,EAAOk2B,cAAa5vB,MAAM+nE,IAC5Gp2E,KAAKmgD,cACNngD,KAAKmgD,eAAe9xC,MAAMgoE,IACxBr2E,KAAKgH,SAASi4B,gBAAgBq3C,UAAUF,EAAQC,MAI7CD,KAIP9nE,GAIJA,EAAQD,MAAM+nE,IACZp2E,KAAKyS,QAEL0e,EAAA,eAA0B,CAACppB,OAAQquE,EAAOnkD,UAAS,UAEpD,CAACvgB,eAAgB1R,KAAK0R,iBAEzB,MAAM+kE,EAAe,IAAIf,GAAe,CACtC99D,KAAM,UACN8+D,SAAU,CAAC12E,KAAK2jC,QAAQ9gC,UAGpBisB,EAAO9uB,KAAK8uB,KAAOqI,EAAA,uBAAiC,CACxDw/C,KAAK,IAmBP,OAhBAF,EAAajkE,QAAQ/G,OAAOqjB,GAE5BiV,EAAQvxB,QAAQ/G,OAAOzL,KAAK+gD,WAAW51C,UAAWwqE,GAElD31E,KAAKwS,QAAQ/G,OAAOzL,KAAK2gD,SACzB3gD,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,UAAWsrE,EAAatrE,WAEpDqqE,GACDx1E,KAAKy1E,SAAS,qBACdz1E,KAAK61E,wBAAwB1qE,UAAUiI,UAAU7Q,OAAO,QACxDvC,KAAK61E,wBAAwB75B,iBAAiB,YAAY,WAAW,IACrEh8C,KAAK42E,iBAEL52E,KAAK61E,wBAAwB1qE,UAAUiI,UAAUrS,IAAI,QAGhD2f,QAAQkI,IAAI5oB,KAAK2jC,QAAQppB,KAAU8mD,IAAW,O,EAAD,K,OAAA,E,EAAA,YAClD,MAAM,IAACnqC,GAAOC,EAAA,qBAA+B,CAC3CpvB,OAAQs5D,EACRl2D,UAAWnL,KAAK8uB,KAChB2P,eAAe,EACf5N,WAAY,eAGdqG,EAAIiF,gBAAgB1wB,QAAO,EAAAuyB,EAAA,SAA0Bh+B,KAAKgH,SAASy1B,gBAAgBC,QAAQ2kC,M,YARzC,K,kRAY/Clf,sBACLniD,KAAK+gD,WAAWjgC,QAChB9gB,KAAKmgD,aAAe,KACpBngD,KAAK41E,oBAAoBnpE,MAAQ,GACjCzM,KAAK61E,wBAAwB1qE,UAAUiI,UAAUrS,IAAI,QACrDf,KAAK2gD,QAAQjS,UAAW,EAGlBkoC,gBACNxxE,UAAUyxE,YAAYC,oBAAoB3qD,IACxCnsB,KAAK+1E,mBAAqB,CACxBgB,IAAK5qD,EAAS6qD,OAAOC,SACrBC,KAAM/qD,EAAS6qD,OAAOG,WAGxB,IAAIC,EAAM,8CACVA,GAAO,QAAQjrD,EAAS6qD,OAAOC,SAC/BG,GAAO,QAAQjrD,EAAS6qD,OAAOG,UAC/BC,GAAO,eACPA,GAAO,oBACPA,GAAO,sBACPC,MAAMD,GACL/oE,MAAMipE,GAAaA,EAASC,SAC5BlpE,MAAMipE,IACLt3E,KAAKg2E,oBAAsBsB,EAASE,aACpCx3E,KAAK61E,wBAAwB75B,iBAAiBs7B,EAASE,oBAEvD7rD,IACCA,aAAiB8rD,yBAClBz3E,KAAK61E,wBAAwB75B,iBAAiB,mDAE9Ch8C,KAAK61E,wBAAwB75B,iBAAiB,kD,IC9MjD07B,E,uFCSU,SAASC,EAAuBC,GAC7C,MAAMC,EAAuB,GAGvBC,EAAoB,CAACC,MAAO,GAAIC,MAAO,IAAKC,EAAuB,CAACF,MAAO,GAAIC,MAAO,IA8B5F,OA7BAJ,EAAM9yE,SAASozE,IACb,OAAOA,EAAKzoE,GACV,IAAK,uBACHooE,EAAMx1E,KAAK,GACX,MACF,IAAK,0BACHw1E,EAAMx1E,KAAK,GACX,MACF,IAAK,4BACHw1E,EAAMx1E,KAAK,GACX,MAIF,IAAK,oCACHy1E,EAAWE,MAAM31E,QAAQ61E,EAAKF,OAC9B,MACF,IAAK,yBACHF,EAAWC,MAAM11E,QAAQ61E,EAAKH,OAC9B,MACF,IAAK,uCACHE,EAAcD,MAAM31E,QAAQ61E,EAAKF,OACjC,MACF,IAAK,4BACHC,EAAcF,MAAM11E,QAAQ61E,EAAKH,WAKhC,CAACn2E,KAAMi2E,EAAM,GAAII,cAAAA,EAAeH,WAAAA,ID3CzC,SAAKJ,GACH,6BACA,2BACA,uBAHF,CAAKA,IAAAA,EAAW,KAMhB,U,wBEee,MAAMS,EAiBnBp4E,YAAmBotB,GAAA,KAAAA,QAAAA,EAqLX,KAAAirD,cAAiB3rE,IACvBA,GAASA,EACTzM,KAAK4B,KAAO6K,EAEZ,MAAM0G,EAAUnT,KAAKmtB,QAAQkrD,SAASr4E,KAAK4B,MACrC02E,EAAiBt4E,KAAKu4E,aAAaplE,QACrCA,EAEMA,aAAmB3P,aAC3B,EAAAulB,EAAA,GAAeuvD,EAAgBnlE,IAE/B,QAAMmlE,EAAgBnlE,GAJtBmlE,EAAev5D,UAAY,GAM7Bu5D,EAAellE,UAAUxJ,OAAO,QAASuJ,GAEtCnT,KAAKw4E,aACNx4E,KAAKw4E,WAAWv1E,IAAI,SAASk3B,IAAIhvB,UAAUiI,UAAUxJ,OAAO,OAAQ5J,KAAK4B,OAAS,aAClF5B,KAAKw4E,WAAWv1E,IAAI,YAAYk3B,IAAIhvB,UAAUiI,UAAUxJ,OAAO,OAAQ5J,KAAK4B,OAAS,WAGvF5B,KAAKmtB,QAAQirD,eAAiBp4E,KAAKmtB,QAAQirD,cAAc3rE,IA7LtD0gB,EAAQkrD,UACTlrD,EAAQkrD,SAAStnE,UAGnB,MAAM/J,EAAWmmB,EAAQnmB,SAEzBhH,KAAKu4E,aAAe,IAAI7C,GAAe,CAAC99D,KAAMuV,EAAQre,MAAOqE,SAAS,IAEtEnT,KAAKy4E,UAAY,IAAIl3E,IAErB,IAAIqiB,EAAsD,CAAC,CACzDhiB,KAAM,YACN2wD,QAAS,sCACR,CACD3wD,KAAM,WACN2wD,QAAS,wCACR,CACD3wD,KAAM,SACN2wD,QAAS,qCAGRplC,EAAQurD,YACT90D,EAAIA,EAAE0U,QAAQ1U,IAAOuJ,EAAQurD,UAAU9jE,SAASgP,EAAEhiB,SAGpD,MAAMw1C,GAAS,SACfxzB,EAAE9e,SAAQ,EAAElD,KAAAA,EAAM2wD,QAAAA,MAChB,MAAMp4B,EAAM,IAAI,KAAI,CAClBk4C,WAAY,IAAI,IAAW,CACzB9f,QAAAA,EACA36C,KAAMw/B,EACN3qC,MAAO,GAAK7K,MAIhB5B,KAAKy4E,UAAU90E,IAAI/B,EAAMu4B,MAG3B,MAAM22C,GAAO,QAAkB,IAAI9wE,KAAKy4E,UAAUnyC,UAAWtmC,KAAKo4E,eAOlE,GALAp4E,KAAKu4E,aAAa/lE,QAAQ/G,OAAOqlE,GAC9B3jD,EAAQsX,UACTtX,EAAQsX,SAASh5B,OAAOzL,KAAKu4E,aAAaptE,YAGxCgiB,EAAQwrD,aAAc,CACxB,MAAMxtE,EAAYytE,GAAgBzrD,EAAQsX,SAAU,oBAAqB,sCAEzEzkC,KAAKw4E,WAAa,IAAIj3E,IAAI,CAAC,CACzB,WACA,CACE8wD,aAAcllC,EAAQ0rD,eAAe,GACrCtsE,IAAK,WACL4tB,IAAK,KACLvmB,KAAM,aACN+sD,gBAAiB,qCACjBjyC,WAAW,IAEZ,CACD,QACA,CACE2jC,aAAcllC,EAAQ0rD,eAAe,GACrCtsE,IAAK,QACL4tB,IAAK,KACLvmB,KAAM,UACN+sD,gBAAiB,qCACjBjyC,WAAW,MAIf1uB,KAAKw4E,WAAW1zE,SAASg0E,IACvBA,EAAU3+C,IAAM,IAAI,KAAI2+C,GAExBA,EAAU3+C,IAAIhvB,UAAUwC,iBAAiB,SAAS,KAChDW,EAAQD,MAAK,KACX,MAAM0qE,EAAW/4E,KAAK2jC,QAAQm1C,EAAUvsE,KACxC4gB,EAAQpa,IAAIimE,OAAOC,UAAU,KAAkBruD,KAAK,CAClDhpB,KAAM,UACNs3E,WAAW,EACXpqE,MAAOgqE,EAAUzmB,aACjB9uD,YAAa,kCACb41E,QAAUC,IACRL,EAASl2E,OAAS,EAClBk2E,EAAS12E,QAAQ+2E,GACjBN,EAAU3+C,IAAIE,SAAStb,UAAY,GACnC+5D,EAAU3+C,IAAIE,SAAS5uB,UAAUzL,KAAKq5E,YAAYr5E,KAAKs5E,iBAAiBF,MAE1EG,gBAAiBR,UAKvB5tE,EAAUM,OAAOqtE,EAAU3+C,IAAIhvB,cAQnC,MAAMmD,EAAUtH,EAASwyE,kBAAkBC,WAAWtsD,EAAQusD,UAAUrrE,MAAMupE,IAC5E,MAAMxxE,EAAUuxE,EAAuBC,GACvC53E,KAAK25E,SAASvzE,EAAQxE,MAEnB5B,KAAKw4E,aACNx4E,KAAK2jC,QAAU,GACf,CAAC,QAAkB,YAAqB7+B,SAAS80E,IAC/C,MAAMl0C,EAAM,GACN7sB,EAAa,UAAN+gE,EAAgBxzE,EAAQ0xE,WAAa1xE,EAAQ6xE,cAC1DvyC,EAAIrjC,QAAQwW,EAAKk/D,MAAMx9D,KAAK5S,GAAOA,EAAGsqB,cACtCyT,EAAIrjC,QAAQwW,EAAKm/D,MAAMz9D,KAAK5S,GAAOA,EAAGsqB,UAAS,MAC/CjyB,KAAK2jC,QAAQi2C,GAAKl0C,EAClB,MAAM57B,EAAI9J,KAAKw4E,WAAWv1E,IAAI22E,GAAGz/C,IAAIE,SACrCvwB,EAAEiV,UAAY,GACdjV,EAAE2B,UAAUzL,KAAKq5E,YAAYxgE,QAIjCsU,EAAQpa,IAAI8mE,cAAclsE,iBAAiB,WAAW,KAAW,O,EAAA,K,OAAA,E,EAAA,YAC/D,MAAMiqE,EAA4B,GAElC,OAAO53E,KAAK4B,MACV,KAAK,YACHg2E,EAAMv1E,KAAK,CAACoN,EAAG,8BACf,MACF,KAAK,WACHmoE,EAAMv1E,KAAK,CAACoN,EAAG,mCACf,MACF,KAAK,SACHmoE,EAAMv1E,KAAK,CAACoN,EAAG,iCAInB,GAAGzP,KAAKw4E,WAAY,CAClB,MAAMlkE,EAAK,CACT,CAAC,QAAa,yCAA8C,+BAC5D,CAAC,WAAa,4CAA8C,mCAM9D,IAAI,MAAOslE,EAAGE,EAASC,KAAazlE,EAAG,CACrC,GAAGtU,KAAKw4E,WAAWv1E,IAAI22E,GAAGz/C,IAAIhvB,UAAUiI,UAAUqB,SAAS,QACzD,SAGF,MAAMskE,EAAW/4E,KAAK2jC,QAAQi2C,GAC9B,GAAGb,EAAU,CACX,MAAMv1D,EAAWxjB,KAAKs5E,iBAAiBP,GACpCv1D,EAASw0D,MAAMn1E,QAChB+0E,EAAMv1E,KAAK,CAACoN,EAAGqqE,EAAS9B,MAAOx0D,EAASw0D,QAGvCx0D,EAASu0D,MAAMl1E,QAChB+0E,EAAMv1E,KAAK,CACToN,EAAGsqE,EACHhC,YAAar3D,QAAQkI,IAAIpF,EAASu0D,MAAMx9D,KAAK5S,GAAOX,EAASy1B,gBAAgBu9C,aAAaryE,UAOpGX,EAASwyE,kBAAkBS,WAAW9sD,EAAQusD,SAAU9B,I,YA9CO,K,gRA+C9D,CAAC5pE,MAAM,OA2BP2rE,SAAS/3E,GACd,MAAMu4B,EAAMn6B,KAAKy4E,UAAUx1E,IAAIrB,GAC/B5B,KAAKo4E,cAAcx2E,GACnBu4B,EAAIk4C,WAAWhiD,MAAMkU,SAAU,EAGzB+0C,iBAAiB31C,GACvB,MAAMxF,EAAQ,CAAC45C,MAAO,GAAgBC,MAAO,IAK7C,OAJAr0C,EAAQ7+B,SAASiD,IACfo2B,EAAMp2B,EAAOg3B,YAAc,QAAU,SAAS18B,KAAK0F,EAAOg3B,YAAch3B,EAAOs0B,WAAat0B,MAGvFo2B,EAGDk7C,YAAYl7C,GAClB,OAAIA,EAAM45C,MAAMl1E,QAAWs7B,EAAM65C,MAAMn1E,QAIhC,QAAK,CACVs7B,EAAM45C,MAAMl1E,QAAS,QAAK,QAAS,CAACs7B,EAAM45C,MAAMl1E,SAAW,KAC3Ds7B,EAAM65C,MAAMn1E,QAAS,QAAK,QAAS,CAACs7B,EAAM65C,MAAMn1E,SAAW,MAC3Dy1B,OAAOC,UAAU,GANV,EAAC,QAAK,wC,kCCxPJ,SAAS2hD,EAAW/sD,EAG9B,IACH,MAAM8Z,EAAS77B,SAASC,cAAc,KAGtC,GAFA47B,EAAO7zB,UAAUrS,IAAI,eAElBosB,EAAQgtD,OAAQ,CACjB,MAAMngD,EAAO,gBAAkB7M,EAAQgtD,OACvClzC,EAAOjN,KAAOiN,EAAOnN,UAAYE,EASnC,OANA,QAAiBiN,GAASn/B,KACxB,EAAAgS,EAAA,GAAYhS,IACZ,OAAoBm/B,EAAOjN,OAC3B,EAAAsxB,EAAA,IAAS,CAACC,YAAa,kBAGlBtkB,ECjBM,MAAMmzC,UAAiC,IACvCvoD,O,qCACX7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,cAAe,wBAC5Cf,KAAKy1E,SAAS,gBAEd,MAAM54C,EAAY,WAAa78B,KAAKgH,SAASy1B,gBAAgB49C,WAAW19C,MAClE29C,EAAYlvE,SAASC,cAAc,OACzCivE,EAAU7uE,QACR,QAAK,oBACLL,SAASC,cAAc,MACvBD,SAASC,cAAc,OACvB,QAAK,qBACLD,SAASC,cAAc,MACvB6uE,EAAW,CACTC,OAAQt9C,KAIZ,MAAM09C,EAAe,IAAIpC,EAAe,CACtCplE,IAAK/S,KACL8O,MAAO,oBACP4qE,SAAU,6BACVrB,SAAU,CAACiC,EAAWA,EAAW,IACjCzB,eAAgB,CAAC,uCAAwC,yCACzDp0C,SAAUzkC,KAAK4vB,WACfwoD,cAAgBx2E,IACdkI,EAAE6vE,SAAS,aACX7vE,EAAEyuE,aAAaptE,UAAUiI,UAAUxJ,OAAO,OAAQhI,IAAS,WAE7DoF,SAAUhH,KAAKgH,WAGXwzE,EAAwB,oBACxB1wE,EAAI,IAAIquE,EAAe,CAC3BplE,IAAK/S,KACL8O,MAAO,qBACP4qE,SAAU,8BACVrB,SAAU,CAACmC,EAAUA,EAAU,IAC/B7B,cAAc,EACdD,UAAW,CAAC,UACZ1xE,SAAUhH,KAAKgH,WAGjBhH,KAAK4vB,WAAWzkB,UAAUgM,aAAarN,EAAEyuE,aAAaptE,UAAWovE,EAAahC,aAAaptE,UAAU+rD,c,iUC3C1F,MAAMujB,UAAqC,IACjD5oD,OACL7xB,KAAKmL,UAAUiI,UAAUrS,IAAI,wBAAyB,6BACtDf,KAAKy1E,SAAS,kCAEd,MAAM1xC,EAAU,IAAI2xC,GAAe,CACjCgF,WAAY,qCACZja,aAAa,IAITka,EAAmBvvE,SAASC,cAAc,QAEhD,OAAiB,CACfyzC,MAJY,KAKZx0B,IAAKqwD,EACL/3D,MAAO,IACPI,OAAQ,MAGV+gB,EAAQvxB,QAAQ/G,OAAOkvE,GAEvB,MAAMC,EAAe72C,EAAQ82C,yBAEvBlF,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3B,MAAM+5E,GAAY,OAAO,gCAAiC,CAACjnE,KAAM,+CAEjE,QAAiBinE,GAAYhzE,IAC3B9H,KAAKyS,WAGPzS,KAAKg5E,OAAO+B,kBAAkBC,GAAgBh7E,MAE9C21E,EAAalqE,OAAOqvE,GAEpBF,EAAanvE,OAAOkqE,GAEpB31E,KAAK4vB,WAAWzkB,UAAUM,OAAOs4B,EAAQ54B,Y,wBC5CtC,SAAS8vE,EAASC,GACvB,OAAQ,EAAA7xD,mBAAqB6xD,E,cCYhB,MAAMC,UAAmD,IAAxE,c,oBAKS,KAAAC,SAAU,EAEVvpD,OACL7xB,KAAKmL,UAAUiI,UAAUrS,IAAI,wBAAyB,4CACtDf,KAAKy1E,SAAS,6BAEd,MAAM1xC,EAAU,IAAI2xC,GAAe,CACjCgF,YAAY,EACZja,aAAa,KAGf,QAAM18B,EAAQ5wB,QAAS,mCAAoC,CAACnT,KAAKq7E,QAEjE,MACMV,EAAmBvvE,SAASC,cAAc,QAEhD,OAAiB,CACfif,IAAKqwD,EACL/3D,MAAO,IACPI,OAAQ,IACR87B,MAPY,OAUd/a,EAAQvxB,QAAQ/G,OAAOkvE,GAEvB,MAAMC,EAAe72C,EAAQ82C,yBAEvBlF,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3B,MAAMqvB,EAAapwB,KAAKs7E,eAAiB,IAAI,IAAe,CAC1D1jE,KAAM,sBACNouB,MAAO,2BACPnjC,OAAQ7C,KAAK6C,OACbi6C,OAASvjC,IACP4lD,GAAO,GAEPn/D,KAAKgH,SAASu0E,gBAAgBC,qBAAqB,GAAKjiE,GACvDlL,MAAM5B,IAKLgvE,OAED9jE,OAAOpS,IACN,OAAOA,EAAI3D,MACT,IAAK,eACHwuB,EAAWC,MAAMjd,UAAUrS,IAAI,UAC/B,EAAAgoB,EAAA,GAAeqH,EAAW4V,OAAO,QAAK,oCACtC,MAEF,IAAK,qBACH5V,EAAWC,MAAMjd,UAAUrS,IAAI,UAC/B,EAAAgoB,EAAA,GAAeqH,EAAW4V,OAAO,QAAK,oCACtC,MAEF,QACE75B,QAAQwf,MAAM,gBAAiBpmB,GAInC45D,GAAO,SAKPuc,GAAY,OAAO,8CAA+C,CAAC7nE,KAAM,qCACzE8nE,GAAY,OAAO,4DAA6D,CAAC9nE,KAAM,eAEvF4nE,EAAS,KACbz7E,KAAKg5E,OAAOC,UAAUwB,GAA8B7vD,QAGhDu0C,EAAU1iB,KACd,EAAAb,EAAA,GAAiB,CAACxrB,EAAWC,MAAOqrD,EAAWC,GAAYl/B,KAG7D,QAAiBi/B,GAAY5zE,IAC3Bq3D,GAAO,GACPn/D,KAAKgH,SAASu0E,gBAAgBK,sBAAsBvtE,MAAM5B,IACxDzM,KAAKg5E,OAAO+B,kBAAkBc,EAAgC77E,MAC9DA,KAAKyS,WACJ,KACD0sD,GAAO,UAIX,QAAiBwc,GAAY7zE,IAC3Bq3D,GAAO,GACP,MAAM74C,GAAI,EAAA4b,EAAA,GAAay5C,GACvB37E,KAAKgH,SAASu0E,gBAAgBO,sBAAsBztE,MAAM5B,IACxD6Z,EAAE/jB,SACF48D,GAAO,SAIXwW,EAAalqE,OAAO2kB,EAAWjlB,UAAWuwE,EAAWC,GAErDf,EAAanvE,OAAOkqE,GAEpB31E,KAAK4vB,WAAWzkB,UAAUM,OAAOs4B,EAAQ54B,WAG3C4wE,qBACMd,EAASj7E,KAAKo7E,UAClBp7E,KAAKs7E,eAAejrD,MAAMC,S,cC/Gf,MAAMurD,UAAuC,IAA5D,c,oBAMS,KAAAT,SAAU,EAEVvpD,OACL7xB,KAAKmL,UAAUiI,UAAUrS,IAAI,wBAAyB,+BACtDf,KAAKy1E,SAAS,sBAEd,MAAM1xC,EAAU,IAAI2xC,GAAe,CACjCgF,YAAY,EACZja,aAAa,IAITka,EAAmBvvE,SAASC,cAAc,QAEhD,OAAiB,CACfif,IAAKqwD,EACL/3D,MAAO,IACPI,OAAQ,IACR87B,MAPY,OAUd/a,EAAQvxB,QAAQ/G,OAAOkvE,GAEvB,MAAMC,EAAe72C,EAAQ82C,yBAEvBlF,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3B,MAAMqvB,EAAapwB,KAAKowB,WAAa,IAAI,KAAW,CAClDxY,KAAM,iBACNouB,MAAO,gBACPzd,WAAW,IAGb6H,EAAWC,MAAM1iB,iBAAiB,YAAa7F,IAC7C,GAAa,UAAVA,EAAEyE,IAEH,OADA,EAAAuN,EAAA,GAAYhS,GACLk0E,OAIX5rD,EAAWC,MAAM1iB,iBAAiB,SAAU7F,IAC1CsoB,EAAWC,MAAMjd,UAAU7Q,OAAO,YAGpC,MAAM05E,GAAc,OAAO,gCAAiC,CAACpoE,KAAM,aAC7DqoE,GAAU,OAAO,4DAA6D,CAACroE,KAAM,kBAErF4nE,EAAS,KACbz7E,KAAKg5E,OAAOC,UAAUwB,GAA8B7vD,QAGhDoxD,EAAkB,KACtB,MAAMX,EAAQjrD,EAAW3jB,MAAMyjB,OACzB5qB,GAAQ,EAAA62E,EAAA,GAAWd,GACzB,IAAI/1E,GAASA,EAAM,GAAGzC,SAAWw4E,EAAMx4E,OAErC,YADAutB,EAAWC,MAAMjd,UAAUrS,IAAI,SAIjCq7E,GAAc,GACd,MAAM91D,GAAI,EAAA4b,EAAA,GAAa+5C,GAEvBj8E,KAAKgH,SAASu0E,gBAAgBc,eAAe,CAC3CC,KAAMt8E,KAAKs8E,KACXC,gBAAiBv8E,KAAKw8E,cACtBC,YAAaz8E,KAAKy8E,YAClBpB,MAAAA,IACChtE,MAAM5B,IACPgvE,OACEl2E,IACF,GAAGA,EAAI3D,KAAKgT,SAAS,qBAAsB,CACzC,MAAM8nE,GAAWn3E,EAAI3D,KAAK0D,MAAM,4BAA4B,GAEtDyN,EAAM/S,KAAKg5E,OAAOC,UAAUkC,GAClCpoE,EAAIqZ,MAAQpsB,KAAKosB,MACjBrZ,EAAIsoE,MAAQA,EACZtoE,EAAIlQ,OAAS65E,EACb3pE,EAAI6X,YAEJze,QAAQsR,IAAI,qBAAsBlY,GAGpC62E,GAAc,GACd91D,EAAE/jB,cAGN,QAAiB05E,EAAaD,GAE9B,MAAMI,EAAiBjd,IAClBA,GACD8c,EAAYvuE,aAAa,WAAY,QACrCwuE,EAAQxuE,aAAa,WAAY,UAEjCuuE,EAAY54B,gBAAgB,YAC5B64B,EAAQ74B,gBAAgB,eAI5B,QAAiB64B,GAAUp0E,IACX,IAAI,IAAU,mBAAoB,CAC9C4L,QAAS,CAAC,CACR6+C,QAAS,SACTrV,UAAU,GACT,CACDqV,QAAS,gBACTvV,SAAU,KAERo/B,GAAc,IACd,EAAAl6C,EAAA,GAAag6C,GACbl8E,KAAKgH,SAASu0E,gBAAgBc,eAAe,CAC3CC,KAAMt8E,KAAKs8E,KACXC,gBAAiBv8E,KAAKw8E,cACtBC,YAAaz8E,KAAKy8E,YAClBpB,MAAO,KACNhtE,MAAK,KACNotE,OACEl2E,IACF62E,GAAc,OAGlB/S,UAAU,IAEZhX,aAAc,uBACdC,mBAAoB,6BAGhBvnC,UAGR4qD,EAAalqE,OAAO2kB,EAAWjlB,UAAW8wE,EAAaC,GAEvDtB,EAAanvE,OAAOkqE,GAEpB31E,KAAK4vB,WAAWzkB,UAAUM,OAAOs4B,EAAQ54B,WAG3C4wE,qBACMd,EAASj7E,KAAKo7E,UAClBp7E,KAAKowB,WAAWC,MAAMC,S,sDCpJX,MAAMqsD,WAAsC,IAMlD9qD,OACL7xB,KAAKmL,UAAUiI,UAAUrS,IAAI,wBAAyB,8BACtDf,KAAKy1E,SAAS,8BAEd,MAAM1xC,EAAU,IAAI2xC,GAAe,CACjCjV,aAAa,IAITka,EAAmBvvE,SAASC,cAAc,QAChD,OAAiB,CACfif,IAAKqwD,EACL/3D,MAAO,IACPI,OAAQ,IACR87B,MANY,OASd/a,EAAQvxB,QAAQ/G,OAAOkvE,GAEvB,MAAMhF,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3B,MAAMqvB,EAAapwB,KAAKowB,WAAa,IAAI,KAAW,CAClDxY,KAAM,OACNouB,MAAO,qCAGT5V,EAAWC,MAAM1iB,iBAAiB,YAAa7F,IAC7C,GAAa,UAAVA,EAAEyE,IAEH,OADA,EAAAuN,EAAA,GAAYhS,GACLsoB,EAAW3jB,MAAQuvE,IAAoBY,OAIlD,MAAMnB,EAAS,CAAC3zE,EAAW+0E,KACtB/0E,IACD,EAAAgS,EAAA,GAAYhS,GAGd,MAAMw0E,EAAOO,EAAWzsD,EAAW3jB,WAAQzI,EAC3C,GAAGs4E,GAAQt8E,KAAKy8E,cAAgBH,EAE9B,YADA,EAAAhxB,EAAA,IAAM,YAAY,uBAAuB,IAI3C,MAAMv4C,EAAM/S,KAAKg5E,OAAOC,UAAU4C,GAClC9oE,EAAIqZ,MAAQpsB,KAAKosB,MACjBrZ,EAAIypE,cAAgBx8E,KAAKw8E,cACzBzpE,EAAI0pE,YAAcz8E,KAAKy8E,YACvB1pE,EAAIupE,KAAOA,EAEXvpE,EAAI6X,QAGAqxD,GAAc,OAAO,gCAAiC,CAACpoE,KAAM,aAC7DqoE,GAAU,OAAO,4DAA6D,CAACroE,KAAM,kBAErFmoE,EAAmBl0E,GAAc2zE,EAAO3zE,GAAG,GAC3C80E,EAAe90E,GAAc2zE,EAAO3zE,GAAG,IAC7C,QAAiBm0E,EAAaD,IAC9B,QAAiBE,EAASU,GAE1BjH,EAAalqE,OAAO2kB,EAAWjlB,UAAW8wE,EAAaC,GAEvDn4C,EAAQvxB,QAAQ/G,OAAOkqE,GAEvB31E,KAAK4vB,WAAWzkB,UAAUM,OAAOs4B,EAAQ54B,WAG3C4wE,qBACE/7E,KAAKowB,WAAWC,MAAMC,SC7EX,MAAMwsD,WAAiD,IAM7DjrD,OACL7xB,KAAKmL,UAAUiI,UAAUrS,IAAI,wBAAyB,uCAAwC,2CAC9Ff,KAAKy1E,SAAS,yBAEd,MAAM1xC,EAAU,IAAI2xC,GAAe,CACjCjV,aAAa,IAGTkV,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3B,MAAMk8D,EAAqBj9D,KAAKi9D,mBAAqB,IAAI,IAAmB,CAC1ErlD,KAAM,oBACNouB,MAAO,0BAGH+2C,EAAS,IAAI,KAAe9f,EAAoB,KAEhDgf,GAAc,OAAO,gCAAiC,CAACpoE,KAAM,aAEnE8hE,EAAalqE,OAAOwxD,EAAmB9xD,UAAW8wE,GAClDl4C,EAAQvxB,QAAQ/G,OAAOsxE,EAAO5xE,UAAWwqE,GAEzC31E,KAAK4vB,WAAWzkB,UAAUM,OAAOs4B,EAAQ54B,WAEzC8xD,EAAmB5sC,MAAM1iB,iBAAiB,YAAa7F,IAKrD,GAJGm1D,EAAmB5sC,MAAMjd,UAAUqB,SAAS,UAC7CwoD,EAAmBxD,SAAS,cAGjB,UAAV3xD,EAAEyE,IACH,OAAOyvE,OAIX,MAAMgB,EAAc,IACfh9E,KAAKy8E,cAAgBxf,EAAmBxwD,QACzCwwD,EAAmBtD,YACZ,GAMLqiB,EAAmBl0E,IAKvB,GAJGA,IACD,EAAAgS,EAAA,GAAYhS,IAGVk1E,IAAe,OAEnB,MAAMjqE,EAAM/S,KAAKg5E,OAAOC,UAAU0D,IAClC5pE,EAAIqZ,MAAQpsB,KAAKosB,MACjBrZ,EAAIypE,cAAgBx8E,KAAKw8E,cACzBzpE,EAAI0pE,YAAcz8E,KAAKy8E,YACvB1pE,EAAI6X,QAIN,OAFA,QAAiBqxD,EAAaD,GAEvBe,EAAOn6E,OAGhBm5E,qBACE/7E,KAAKi9D,mBAAmB5sC,MAAMC,SC/DnB,MAAM2sD,WAA+C,IAApE,c,oBAIS,KAAA7B,SAAU,EAEVvpD,OACL,MAAMqrD,GAASl9E,KAAKosB,MAAM5e,OAAO2vE,cAAgBn9E,KAAKw8E,cACtDx8E,KAAKmL,UAAUiI,UAAUrS,IAAI,wBAAyB,wCACtDf,KAAKy1E,SAASyH,EAAQ,2BAA6B,8BAEnD,MAAMn5C,EAAU,IAAI2xC,GAAe,CACjCjV,aAAa,IAGTkV,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3B,MAAMk8D,EAAqBj9D,KAAKi9D,mBAAqB,IAAI,IAAmB,CAC1ErlD,KAAM,iBACNouB,MAAOk3C,EAAQ,2BAA8Bl9E,KAAKosB,MAAMkwD,UAAOt4E,EAAY,gBAC3Em0D,WAAY+kB,GAASl9E,KAAKosB,MAAMkwD,MAAO,EAAA9zD,EAAA,GAAcxoB,KAAKosB,MAAMkwD,WAAQt4E,IAGpE+4E,EAAS,IAAI,IAAe9f,EAAoB,KAEhDgf,GAAc,OAAO,iCACrBmB,EAAS,IAAI,iBAAiB,CAAC7wE,IAAK,aAE1C0vE,EAAYxwE,OAAO2xE,EAAOl7E,SAE1ByzE,EAAalqE,OAAOwxD,EAAmB9xD,UAAW8wE,GAClDl4C,EAAQvxB,QAAQ/G,OAAOsxE,EAAO5xE,UAAWwqE,GAEzC31E,KAAK4vB,WAAWzkB,UAAUM,OAAOs4B,EAAQ54B,WAEzC8xD,EAAmB5sC,MAAM1iB,iBAAiB,YAAa7F,IAOrD,GANGm1D,EAAmB5sC,MAAMjd,UAAUqB,SAAS,WAC7CwoD,EAAmB5sC,MAAMjd,UAAU7Q,OAAO,SAC1C66E,EAAO7wE,IAAM,WACb6wE,EAAO5/C,UAGI,UAAV11B,EAAEyE,IACH,OAAOyvE,OAIX,MAAMgB,EAAc,MACd/f,EAAmBxwD,MAAM5J,SAC3Bo6D,EAAmB5sC,MAAMjd,UAAUrS,IAAI,UAChC,GAMX,IAAIi7E,EACJ,GAAIkB,EAkEFlB,EAAmBl0E,IAKjB,GAJGA,IACD,EAAAgS,EAAA,GAAYhS,IAGVk1E,IAAe,OAEnB,MAAMjqE,EAAM/S,KAAKg5E,OAAOC,UAAU6D,IAClC/pE,EAAIqZ,MAAQpsB,KAAKosB,MACjBrZ,EAAI0pE,YAAcxf,EAAmBxwD,MACrCsG,EAAIypE,cAAgBx8E,KAAKw8E,cACzBzpE,EAAI6X,YA7EG,CACT,IAAIyyD,EAEJ,MAAMC,EAAW,KAEXD,IACFA,EAAmB9pE,OAAOmuD,YAAY4b,EAAU,MAG3Ct9E,KAAKgH,SAASu0E,gBAAgB+B,WAAWjvE,MAAMkvE,IACpDv9E,KAAKosB,MAAQmxD,EAEVv9E,KAAKosB,MAAMkwD,MACZ,EAAA7iD,EAAA,GAAawjC,EAAmBj3B,OAAO,EAAAxd,EAAA,GAAcxoB,KAAKosB,MAAMkwD,QAEhE,EAAAvzD,EAAA,GAAek0C,EAAmBj3B,OAAO,QAAK,sBA+CpDg2C,EA1CgBl0E,IACd,IAAIk1E,IAEF,YADA,EAAAljE,EAAA,GAAYhS,GAIdm0E,EAAYvuE,aAAa,WAAY,QACrC0vE,EAAO7wE,IAAM,aACb6wE,EAAO5/C,SACP,MAAMjiB,GAAY,EAAA2mB,EAAA,GAAa+5C,GAEzBO,EAAgBvf,EAAmBxwD,MACzCzM,KAAKgH,SAASu0E,gBAAgBiC,MAAMvgB,EAAmBxwD,MAAOzM,KAAKosB,OAAO/d,MAAMovE,IAG9E,GAFAtxE,QAAQsR,IAAIggE,GAEE,uBAAXA,EAAKhuE,EAA4B,CAClCuzD,cAAcqa,GACXN,GAAQA,EAAOx6E,SAClB,MAAMwQ,EAAM/S,KAAKg5E,OAAOC,UAAUyE,IAClC3qE,EAAIqZ,MAAQpsB,KAAKosB,MACjBrZ,EAAIypE,cAAgBA,EACpBzpE,EAAI6X,OACJ5qB,KAAKg5E,OAAO2E,qBAAqB39E,UAEjCuF,IACF02E,EAAY54B,gBAAgB,YAC5B4Z,EAAmB5sC,MAAMjd,UAAUrS,IAAI,SAEhCwE,EAAI3D,KAGPw7E,EAAO7wE,IAAM,wBACb6wE,EAAO5/C,SACPjiB,EAAUhZ,SACV06D,EAAmB7d,SAIvBk+B,QAMJA,IAmBF,OAFA,QAAiBrB,EAAaD,GAEvBe,EAAOn6E,OAGhBm5E,qBACMd,EAASj7E,KAAKo7E,UAClBp7E,KAAKi9D,mBAAmB5sC,MAAMC,SCvJnB,MAAMotD,WAAkC,IAI9C7rD,OACL7xB,KAAKmL,UAAUiI,UAAUrS,IAAI,wBAAyB,8BACtDf,KAAKy1E,SAAS,4BAEd,MAAM1xC,EAAU,IAAI2xC,GAAe,CACjCgF,YAAY,EACZja,aAAa,IAITka,EAAmBvvE,SAASC,cAAc,QAEhD,OAAiB,CACfif,IAAKqwD,EACL/3D,MAAO,IACPI,OAAQ,IACR87B,MAPY,OAUd/a,EAAQvxB,QAAQ/G,OAAOkvE,GAEvB,MAAMj6C,EAAIqD,EAAQ82C,yBAClB,GAAG76E,KAAKosB,MAAM5e,OAAO2vE,aAAc,EACjC,QAAMp5C,EAAQ5wB,QAAS,2BAEvB,MAAMyqE,GAAoB,OAAO,8BAA+B,CAAChqE,KAAM,OAAQC,KAAM,+BAC/EgqE,GAAqB,OAAO,8BAA+B,CAACjqE,KAAM,cAAeC,KAAM,+BACvFiqE,GAAsB,OAAO,8BAA+B,CAAClqE,KAAM,QAASC,KAAM7T,KAAKosB,MAAM5e,OAAOuwE,aAAe,0BAA4B,4BAErJ,QAAiBH,GAAmB,KAClC,MAAM7qE,EAAM/S,KAAKg5E,OAAOC,UAAUgE,IAClClqE,EAAIqZ,MAAQpsB,KAAKosB,MACjBrZ,EAAIypE,cAAgBx8E,KAAKw8E,cACzBzpE,EAAI6X,WAGN,QAAiBizD,GAAoB,KACrB,IAAI,IAAU,yBAA0B,CACpDnqE,QAAS,CAAC,CACR6+C,QAAS,UACTvV,SAAU,KACRh9C,KAAKgH,SAASu0E,gBAAgBc,eAAe,CAACE,gBAAiBv8E,KAAKw8E,gBAAgBnuE,MAAK,KACvFrO,KAAKg5E,OAAO+B,kBAAkBC,GAAgBh7E,MAC9CA,KAAKyS,YAGT42D,UAAU,IAEZhX,aAAc,+BACdC,mBAAoB,4BAGhBvnC,WAGR,QAAiB+yD,GAAqB,KACpC,MAAM/qE,EAAM/S,KAAKg5E,OAAOC,UAAU4C,GAClC9oE,EAAIqZ,MAAQpsB,KAAKosB,MACjBrZ,EAAIupE,KAAOt8E,KAAKosB,MAAMkwD,KACtBvpE,EAAIypE,cAAgBx8E,KAAKw8E,cACzBzpE,EAAI0pE,YAAcz8E,KAAKw8E,cACvBzpE,EAAIqoE,SAAU,EACdroE,EAAI6X,UAGN8V,EAAEj1B,OAAOmyE,EAAmBC,EAAoBC,OAC3C,EACL,QAAM/5C,EAAQ5wB,QAAS,+BAEvB,MAAMwiE,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3B,MAAMi9E,GAAiB,OAAO,gCAAiC,CAACnqE,KAAM,mCAEtE8hE,EAAalqE,OAAOuyE,GACpBt9C,EAAEj1B,OAAOkqE,IAET,QAAiBqI,GAAiBl2E,IAChC,MAAMiL,EAAM/S,KAAKg5E,OAAOC,UAAUgE,IAClClqE,EAAIqZ,MAAQpsB,KAAKosB,MACjBrZ,EAAI6X,UAIR5qB,KAAK4vB,WAAWzkB,UAAUM,OAAOs4B,EAAQ54B,YChG9B,MAAM8yE,WAA8B,IAC1CpsD,OACL7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,cAAe,qBAC5Cf,KAAKy1E,SAAS,mBAEd,MAAMtiE,EAAuB,gDAC7B,IAAIglE,EAAe,CACjBplE,IAAK/S,KACL8O,MAAO,gBACP4qE,SAAU,iCACVrB,SAAU,CAACllE,EAASA,EAASA,GAC7B0lE,eAAgB,CAAC,uCAAwC,yCACzDp0C,SAAUzkC,KAAK4vB,WACf5oB,SAAUhH,KAAKgH,YCbN,MAAMk3E,WAAkC,IAC9CrsD,OACL7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,cAAe,yBAC5Cf,KAAKy1E,SAAS,uBAEd,MAAMtiE,EAAuB,oDAC7B,IAAIglE,EAAe,CACjBplE,IAAK/S,KACL8O,MAAO,2BACP4qE,SAAU,8BACVrB,SAAU,CAACllE,EAASA,EAASA,GAC7B0lE,eAAgB,CAAC,uCAAwC,yCACzDp0C,SAAUzkC,KAAK4vB,WACf8oD,UAAW,CAAC,UACZ1xE,SAAUhH,KAAKgH,YChBN,MAAMm3E,WAAqC,IACjDtsD,OACL7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,cAAe,4BAC5Cf,KAAKy1E,SAAS,4BAEd,MAAMtiE,EAAuB,gDAC7B,IAAIglE,EAAe,CACjBplE,IAAK/S,KACL8O,MAAO,uBACP4qE,SAAU,0BACVrB,SAAU,CAACllE,EAASA,EAASA,GAC7B0lE,eAAgB,CAAC,uCAAwC,yCACzDp0C,SAAUzkC,KAAK4vB,WACf5oB,SAAUhH,KAAKgH,YCbN,MAAMo3E,WAAiC,IAC7CvsD,OACL7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,cAAe,yBAC5Cf,KAAKy1E,SAAS,0BAEd,MAAMtiE,EAAuB,6CAC7B,IAAIglE,EAAe,CACjBplE,IAAK/S,KACL8O,MAAO,cACP4qE,SAAU,4BACVrB,SAAU,CAACllE,EAASA,EAASA,GAC7B0lE,eAAgB,CAAC,uCAAwC,yCACzDp0C,SAAUzkC,KAAK4vB,WACf8oD,UAAW,CAAC,UACZ1xE,SAAUhH,KAAKgH,YChBN,MAAMq3E,WAA2B,IACvCxsD,OACL7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,cAAe,iBAC5Cf,KAAKy1E,SAAS,8BAEd,MAAMtiE,EAAuB,iDAC7B,IAAIglE,EAAe,CACjBplE,IAAK/S,KACL8O,MAAO,eACP4qE,SAAU,2BACVrB,SAAU,CAACllE,EAASA,EAASA,GAC7B0lE,eAAgB,CAAC,uCAAwC,yCACzDp0C,SAAUzkC,KAAK4vB,WACf5oB,SAAUhH,KAAKgH,WAGjB,CACE,MAAMmM,EAAuB,qCAC7B,IAAIglE,EAAe,CACjBplE,IAAK/S,KACL8O,MAAO,mBACP4qE,SAAU,0BACVrB,SAAU,CAACllE,EAASA,EAASA,GAC7B0lE,eAAgB,CAAC,uCAAwC,yCACzDp0C,SAAUzkC,KAAK4vB,WACf5oB,SAAUhH,KAAKgH,a,sECZR,MAAMs3E,WAA6B,IAIzCzsD,OACL7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,6BAC7Bf,KAAKy1E,SAAS,iBAEd,MAAM8I,EAAWd,IACf,MAAMtjD,EAAM,IAAI,KAAI,CAClBrrB,MAAO,CAAC2uE,EAAKe,SAAUf,EAAKgB,aAAa36D,KAAK,KAC9CuW,SAAU,CAACojD,EAAKiB,GAAIjB,EAAKngC,SAASx5B,KAAK,OACvC4K,WAAW,EACX0L,WAAYqjD,EAAKjwE,OAAOhF,aAAUxE,GAAY,QAA8B,IAAIqjB,KAAqD,IAAhD9gB,KAAKC,IAAIi3E,EAAKkB,YAAalB,EAAKmB,kBAGvHzkD,EAAIhvB,UAAUwa,QAAQuG,KAAO,GAAKuxD,EAAKvxD,KAEvC,MAAM2yD,EAAWzzE,SAASC,cAAc,OAMxC,OALAwzE,EAASzrE,UAAUrS,IAAI,gBACvB89E,EAAS9/D,UAAY,CAAC0+D,EAAKqB,aAAcrB,EAAKsB,gBAAkBtB,EAAKuB,UAAU1mD,OAAOC,SAASzU,KAAK,MAEpGqW,EAAIE,SAAS1hB,cAAcxB,aAAa0nE,EAAU1kD,EAAIE,UAE/CF,GAGH8kD,EAAiBj/E,KAAKi/E,eAAevoD,QAE3C,CACE,MAAMqN,EAAU,IAAI2xC,GAAe,CACjC99D,KAAM,iBACNzE,QAAS,2BAGLsqE,GAAO,EAAA18C,GAAA,GAAck+C,GAAgBxB,GAAQA,EAAKjwE,OAAOhF,UACzD02E,EAAUX,EAAQd,GAIxB,GAFA15C,EAAQvxB,QAAQ/G,OAAOyzE,EAAQ/zE,WAE5B8zE,EAAep8E,OAAQ,CACxB,MAAMs8E,GAAe,OAAO,qCAAsC,CAACvrE,KAAM,OAAQC,KAAM,0BACvF,QAAiBsrE,GAAer3E,IAC9B,IAAI,IAAU,iBAAkB,CAC9B4L,QAAS,CAAC,CACR6+C,QAAS,YACT8W,UAAU,EACVrsB,SAAU,KACR,MAAMpzC,GAAS,EAAAgyC,EAAA,GAAiB,CAACujC,IAAe,GAChDn/E,KAAKgH,SAAS0rD,WAAW0sB,UAAU,4BAA4B/wE,MAAM5B,IAEnE0yE,EAAa58E,SACb88E,EAAal0E,UAAU5I,WACtB+8E,GAASznE,SAAQ,KAClBjO,UAINyoD,aAAc,0BACdC,mBAAoB,uBACnBvnC,UAGLgZ,EAAQvxB,QAAQ/G,OAAO0zE,GAGzBn/E,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAGjC,IAAI8zE,EAAep8E,OACjB,OAGF,MAAMw8E,EAAe,IAAI3J,GAAe,CACtC99D,KAAM,gBACNzE,QAAS,qBAGX8rE,EAAen6E,SAAS24E,IACtB4B,EAAa7sE,QAAQ/G,OAAO8yE,EAAQd,GAAMtyE,cAG5CnL,KAAK4vB,WAAWnkB,OAAO4zE,EAAal0E,WAEpC,MAAMm0E,EAAW/5E,IACC,wCAAbA,EAAI3D,OACL,EAAA0pD,EAAA,IAAM,YAAY,mCAAmC,KAIzD,IAAIjrD,EACJ,MAAMk/E,EAAmB,KACvB,MAAMrzD,EAAO7rB,EAAOslB,QAAQuG,KAE5B,IAAI,IAAU,iBAAkB,CAC9BxY,QAAS,CAAC,CACR6+C,QAAS,YACT8W,UAAU,EACVrsB,SAAU,KACRh9C,KAAKgH,SAAS0rD,WAAW0sB,UAAU,6BAA8B,CAAClzD,KAAAA,IACjE7d,MAAM5B,IACFA,GACDpM,EAAOkC,WAER+8E,MAGPjtB,aAAc,yBACdC,mBAAoB,yBACnBvnC,QAGC7oB,EAAUlC,KAAKw/E,aAAc,QAAW,CAAC,CAC7C5rE,KAAM,OACNC,KAAM,YACNC,QAASyrE,KAEXr9E,EAAQyF,GAAK,8BACbzF,EAAQkR,UAAUrS,IAAI,eAEtBqK,SAASuQ,eAAe,cAAclQ,OAAOvJ,IAE7C,EAAA0vB,GAAA,GAA0B5xB,KAAK4vB,WAAWzkB,WAAYrD,IACpDzH,GAAS,EAAAyc,GAAA,GAAgBhV,EAAEzH,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAOslB,QAAQuG,OAI1BpkB,aAAagqB,YAAYhqB,EAAEiqB,iBAE3BjqB,aAAagqB,aAAYhqB,EAAEkqB,cAAe,IAE7C,EAAAK,GAAA,GAAavqB,EAAG5F,GAChBowB,GAAA,cAAkCpwB,QAGpC,QAAiBlC,KAAK4vB,WAAWzkB,WAAYrD,IAC3CzH,GAAS,EAAAyc,GAAA,GAAgBhV,EAAEzH,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAOslB,QAAQuG,MAI7BqzD,OAIJp9B,sBAKE,OAJGniD,KAAKw/E,aACNx/E,KAAKw/E,YAAYj9E,SAGZwP,MAAMowC,uB,qCC3JF,MAAMs9B,WAA2B,IAIvC5tD,OACL7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,2BAC7Bf,KAAKy1E,SAAS,gBAEd,MAAM1xC,EAAU,IAAI2xC,GAAe,CACjCviE,QAAS,qBAGX4wB,EAAQ5wB,QAAQwF,cAAcjB,QAAQqsB,EAAQ5wB,SAE9CnT,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAE/B,MAAMu0E,GAAS,OAAa,CAAC9rE,KAAM,MAAOgH,UAAW,eACrD5a,KAAKwS,QAAQ/G,OAAOi0E,IAEpB,QAAiBA,GAAS53E,IACxB,IAAI,KAAc,CAChBsiE,UAAW,CAAC,YACZ7mE,YAAa,gCACbqlE,SAAW7gE,IAET/H,KAAKgH,SAASy1B,gBAAgBkjD,YAAY53E,GAAQ,QAGrD,CAAC2J,eAAgB1R,KAAK0R,iBAEzB,MAAMod,EAAOqI,EAAA,yBACbn3B,KAAK4vB,WAAWzkB,UAAUiI,UAAUrS,IAAI,sBACxCgjC,EAAQvxB,QAAQ/G,OAAOqjB,GAEvB,MAAM/tB,EAAM,CAAMgH,EAAgB0D,KAAoB,O,EAAA,K,OAAA,E,EAAA,YACpD,MAAM,IAACyrB,GAAOC,EAAA,qBAA+B,CAC3CpvB,OAAQA,EACRoD,UAAW2jB,EACX2P,eAAe,EACf5N,WAAY,aACZplB,OAAAA,IAGI+wB,QAAax8B,KAAKgH,SAASy1B,gBAAgBC,QAAQ30B,GACtDy0B,EAAKhvB,OAAOoyE,IACb1oD,EAAIiF,gBAAgB1wB,OAAO,IAAM+wB,EAAKF,UAEnCE,EAAKG,MAAOzF,EAAIiF,gBAAgBpd,WAAY,EAAA+iD,GAAA,GAAgBtlC,EAAKG,OAC/DzF,EAAIiF,gBAAgB1wB,OAAO+wB,EAAKF,SAAW,IAAME,EAAKF,UAAW,EAAA0B,EAAA,GAAoBxB,K,YAdxC,K,+QAqBtD,IAAI,MAAMz0B,KAAU/H,KAAK2jC,QACvB5iC,EAAIgH,GAAQ,GAGd,IAAI1H,EACJ,MAKM6B,EAAUlC,KAAKw/E,aAAc,QAAW,CAAC,CAC7C5rE,KAAM,UACNC,KAAM,UACNC,QARgB,KAChB,MAAM/L,EAAS1H,EAAOslB,QAAQ5d,OAAOkqB,WACrCjyB,KAAKgH,SAASy1B,gBAAgBkjD,YAAY53E,GAAQ,IAOlDolB,QAAS,CAACzb,eAAgB1R,KAAK0R,mBAEjCxP,EAAQyF,GAAK,4BACbzF,EAAQkR,UAAUrS,IAAI,eAEtBqK,SAASuQ,eAAe,cAAclQ,OAAOvJ,IAE7C,EAAA0vB,GAAA,GAA0B5xB,KAAK4vB,WAAWzkB,WAAYrD,IACpDzH,GAAS,EAAAs+B,GAAA,GAAU72B,EAAEzH,OAAQ,EAAAu+B,yBACzBv+B,IAIDyH,aAAagqB,YAAYhqB,EAAEiqB,iBAE3BjqB,aAAagqB,aAAYhqB,EAAEkqB,cAAe,IAE7C,EAAAK,GAAA,GAAavqB,EAAG5F,GAChBowB,GAAA,cAAkCpwB,MACjClC,KAAK0R,gBAER1R,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,cAAew9B,IAChD,MAAM,OAACz1B,EAAM,QAAE83E,GAAWriD,EACpBkB,EAAK5P,EAAKtX,cAAc,kBAAkBzP,OAC7C83E,EACGnhD,GACF39B,EAAIgH,GAAQ,GAGX22B,GACDA,EAAGn8B,YAMT,IAAI8oB,GAAU,EACdrrB,KAAK4vB,WAAWK,iBAAmB,KAC9B5E,IAIHA,GAAU,EACVrrB,KAAKgH,SAASy1B,gBAAgBqjD,WAAWhxD,EAAKE,kBAR7B,IAQ4D3gB,MAAMoiB,IACjF,IAAI,MAAM1oB,KAAU0oB,EAAIkT,QACtB5iC,EAAIgH,GAAQ,IAGX0oB,EAAIkT,QAAQ9gC,OAbA,IAauBisB,EAAKE,oBAAsByB,EAAIC,SACnE1wB,KAAK4vB,WAAWK,iBAAmB,MAGrCjwB,KAAK4vB,WAAWmQ,sBACfloB,SAAQ,KACTwT,GAAU,OAKhB0wD,qBACE/7E,KAAK4vB,WAAWwG,WAGlB+rB,sBAKE,OAJGniD,KAAKw/E,aACNx/E,KAAKw/E,YAAYj9E,SAGZwP,MAAMowC,uB,eC/JF,SAAS49B,GAAqBxzE,GAG3C,MADM,SADAA,EAAI,GAAGyzE,cAAgBzzE,EAAImqB,MAAM,I,yBCS1B,MAAMupD,WAA4B,IACxCpuD,OACL7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,cAAe,kBAC5Cf,KAAKy1E,SAAS,wBAEd,MAAMtiE,EAAuB,2BAC7B,IAAIglE,EAAe,CACjBplE,IAAK/S,KACL8O,MAAO,4BACP4qE,SAAU,+BACVrB,SAAU,CAACllE,EAASA,EAASA,GAC7B0lE,eAAgB,CAAC,uCAAwC,yCACzDp0C,SAAUzkC,KAAK4vB,WACf5oB,SAAUhH,KAAKgH,YCYN,MAAMk5E,WAAiC,IAI7C7pE,mBAAmB8pE,GACxB,MAAO,CACLC,UAAWD,EAAQn5E,SAAS0rD,WAAW2tB,eACvCC,cAAeH,EAAQn5E,SAASwyE,kBAAkB+G,2BAClDC,gBAAiBL,EAAQn5E,SAAS0rD,WAAW0sB,UAAU,+BAIpDvtD,KAAKlxB,GACVX,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,wBAC7Bf,KAAKy1E,SAAS,mBAEd,MAAMgL,EAAwB,UAE9B,CACE,MAAM18C,EAAU,IAAI2xC,GAAe,CAACjV,aAAa,EAAMttD,QAAS,iBAEhE,IAAIutE,EACJ,MAAMC,EAAkB,IAAI,KAAI,CAC9B/sE,KAAM,aACNy+C,aAAc,eACdsO,gBAAiB8f,EACjB/xD,UAAW,KACT,MAAM3b,EAAM/S,KAAKg5E,OAAOC,UAAUwG,IAClC1sE,EAAI4wB,QAAU+8C,EACd3tE,EAAI6X,QAENlZ,eAAgB1R,KAAK0R,iBAIvB,IAAIkvE,EAFJD,EAAgBh+C,SAAU,EAG1B,MAAMk+C,EAAsB,CAC1BjtE,KAAM,OACNy+C,aAAc,sBACdsO,gBAAiB8f,EACjB/xD,UAAY5mB,IACV,IAAIiL,EACD6tE,EAAcpzE,OAAO2vE,aACtBpqE,EAAM/S,KAAKg5E,OAAOC,UAAUgE,IACpB2D,EAAcE,2BACtB/tE,EAAM/S,KAAKg5E,OAAOC,UAAUkC,GAC5BpoE,EAAIsoE,MAAQuF,EAAcE,0BAC1B/tE,EAAIlQ,OAAS,EACbkQ,EAAIqoE,SAAU,EACdp7E,KAAKgH,SAASu0E,gBAAgBO,uBAE9B/oE,EAAM/S,KAAKg5E,OAAOC,UAAUyE,IAG9B3qE,EAAIqZ,MAAQw0D,EACZ7tE,EAAI6X,QAENlZ,eAAgB1R,KAAK0R,gBAGjBqvE,EAAe,IAAI,KAAIF,GAC7BE,EAAap+C,SAAU,EAEvB,MAAMq+C,EAAoBhhF,KAAKghF,kBAAoB,IAAI,KAAI,CACzDptE,KAAM,iBACNy+C,aAAc,gBACdsO,gBAAiB8f,EACjB/xD,UAAW,KACT,MAAM3b,EAAM/S,KAAKg5E,OAAOC,UAAUqF,IAClCvrE,EAAIksE,eAAiBj/E,KAAKi/E,eAC1BlsE,EAAI8mE,cAAclsE,iBAAiB,WAAW,KAC5C3N,KAAKihF,yBACJ,CAACjzE,MAAM,IACV+E,EAAI6X,QAENlZ,eAAgB1R,KAAK0R,iBAEvBsvE,EAAkBr+C,SAAU,EAE5BoB,EAAQvxB,QAAQ/G,OAAOk1E,EAAgBx1E,UAAW41E,EAAa51E,UAAW61E,EAAkB71E,WAC5FnL,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAE/B,MAAM+1E,EAAmBxwD,IACpBA,GACD,EAAA3H,EAAA,GAAe43D,EAAgBtmD,UAAU,QAAK,sCAAuC,CAAC3J,MAEtF,EAAA3H,EAAA,GAAe43D,EAAgBtmD,UAAU,QAAK,eAAgB,CAAC3J,MAInE1wB,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,cAAc,KAM/CmhF,OAGF,MAAMA,EAAgB,KACpBnhF,KAAKgH,SAASy1B,gBAAgBqjD,aAAazxE,MAAMoiB,IAC/CkwD,EAAgBh+C,SAAU,EAC1Bu+C,EAAgBzwD,EAAIC,OACpBgwD,EAAiBjwD,EAAIkT,YAIzBw9C,IAEAnhF,KAAKgH,SAASu0E,gBAAgB+B,WAAWjvE,MAAM+d,IAC7Cw0D,EAAgBx0D,GAChB,EAAArD,EAAA,GAAeg4D,EAAa1mD,UAAU,QAAKjO,EAAM5e,OAAO2vE,aAAe,6BAA+B,gCACtG4D,EAAap+C,SAAU,KAKzB3iC,KAAKihF,uBAGP,CACE,MAAMl9C,EAAU,IAAI2xC,GAAe,CAAC99D,KAAM,eAAgBzE,QAAS,0BAEnE4wB,EAAQvxB,QAAQY,UAAUrS,IAAI,gCAE9B,MAAMqgF,EAED,GAECC,EAAsBD,EAAuC,2BAAI,IAAI,KAAI,CAC7E/uB,aAAc,oBACdsO,gBAAiB8f,EACjB/xD,UAAW,KACT1uB,KAAKg5E,OAAOC,UAAUmB,GAA0BxvD,QAElDlZ,eAAgB1R,KAAK0R,iBAGjB4vE,EAAkBF,EAA2C,+BAAI,IAAI,KAAI,CAC7E/uB,aAAc,gBACdsO,gBAAiB8f,EACjB/xD,UAAW,KACT1uB,KAAKg5E,OAAOC,UAAUgF,IAAuBrzD,QAE/ClZ,eAAgB1R,KAAK0R,iBAGjB6vE,EAAqBH,EAAwC,4BAAI,IAAI,KAAI,CAC7E/uB,aAAc,2BACdsO,gBAAiB8f,EACjB/xD,UAAW,KACT1uB,KAAKg5E,OAAOC,UAAUiF,IAA2BtzD,QAEnDlZ,eAAgB1R,KAAK0R,iBAGjB8vE,EAAUJ,EAAqC,yBAAI,IAAI,KAAI,CAC/D/uB,aAAc,eACdsO,gBAAiB8f,EACjB/xD,UAAW,KACT1uB,KAAKg5E,OAAOC,UAAUoF,IAAoBzzD,QAE5ClZ,eAAgB1R,KAAK0R,iBAGjB+vE,EAAiBL,EAAoC,wBAAI,IAAI,KAAI,CACrE/uB,aAAc,uBACdsO,gBAAiB8f,EACjB/xD,UAAW,KACT1uB,KAAKg5E,OAAOC,UAAUkF,IAA8BvzD,QAEtDlZ,eAAgB1R,KAAK0R,iBAGjBgwE,EAAmBN,EAAsC,0BAAI,IAAI,KAAI,CACzE/uB,aAAc,cACdsO,gBAAiB8f,EACjB/xD,UAAW,KACT1uB,KAAKg5E,OAAOC,UAAUmF,IAA0BxzD,QAElDlZ,eAAgB1R,KAAK0R,iBAGjBiwE,EAAYP,EAAyC,6BAAI,IAAI,KAAI,CACrE/uB,aAAc,4BACdsO,gBAAiB8f,EACjB/xD,UAAW,KACLlR,EAAA,UAGFxd,KAAKg5E,OAAOC,UAAUgH,IAAqBr1D,QAF3C,EAAA0gC,EAAA,IAAS,CAACC,YAAa,qCAK3B75C,eAAgB1R,KAAK0R,iBAGjBkwE,EAAoBr1E,IACxB,MAAM4tB,EAAMinD,EAAW70E,GACnB4tB,GAIJn6B,KAAKgH,SAASwyE,kBAAkBC,WAAWltE,GAAK8B,MAAMupE,IACpD,MAAMxxE,EAAUuxE,EAAuBC,GACjCrlB,EAAUnsD,EAAQxE,OAAS,YAAwB,qCAAwCwE,EAAQxE,OAAS,WAAuB,uCAAyC,mCAC5KigF,EAAiBz7E,EAAQ6xE,cAAcF,MAAMl1E,OAASuD,EAAQ6xE,cAAcD,MAAMn1E,OAClFi/E,EAAc17E,EAAQ0xE,WAAWC,MAAMl1E,OAASuD,EAAQ0xE,WAAWE,MAAMn1E,OAE/Es3B,EAAIE,SAAStb,UAAY,GACzB,MAAMjV,GAAI,QAAKyoD,GACfp4B,EAAIE,SAAS5uB,OAAO3B,IACjB+3E,GAAkBC,IACnB3nD,EAAIE,SAAS5uB,OAAO,KAAK,EAAEo2E,EAAgBC,EAAc,IAAMA,EAAc,GAAGxpD,OAAOC,SAASzU,KAAK,cAK3GigB,EAAQvxB,QAAQ/G,OACd41E,EAAoBl2E,UACpBm2E,EAAgBn2E,UAChBo2E,EAAmBp2E,UACnBq2E,EAAQr2E,UACRs2E,EAAet2E,UACfu2E,EAAiBv2E,UACjBw2E,EAAUx2E,WAEZnL,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAE/B,IAAI,MAAMoB,KAAO60E,EACfQ,EAAiBr1E,GAGnBiR,EAAA,mBAA2B,kBAAmBggB,IAC5CokD,EAAiB7B,GAAqBviD,EAAOjxB,IAAIkD,OAIrD,MAAMgoB,EAA2B,GAEjC,CACE,MAAMsM,EAAU,IAAI2xC,GAAe,CAAC99D,KAAM,0BAA2BzE,QAAS,uBAExE4yB,EAAgB,IAAI,KAAc,CAAClyB,KAAM,mBACzCsmB,EAAM,IAAI,KAAI,CAClB4L,cAAAA,IAKF,IAAIv0B,EAAkBuwE,EAFtBh+C,EAAQvxB,QAAQ/G,OAAO0uB,EAAIhvB,WAG3BnL,KAAK65E,cAAclsE,iBAAiB,WAAW,KAE7C,GADAo0E,GAAY,OACG/9E,IAAZwN,GAAyBA,IAAYu0B,EAAcxB,QACtD,OAAOvkC,KAAKgH,SAASwyE,kBAAkBwI,yBAAyB,CAC9DvyE,EAAG,wBACHwyE,sCAAuCl8C,EAAcxB,YAEtD,CAACv2B,MAAM,IAEV,MAAMM,EAAUoS,QAAQkI,IAAI,CAC1BjoB,EAAEy/E,UACFz/E,EAAE2/E,gBACDjyE,MAAK,EAAE+xE,EAAW8B,MACnB,GAAGH,EACD,OAGF,MAAMI,EAAmBnvB,IACvBjvB,EAAQ54B,UAAUiI,UAAUxJ,OAAO,QAASopD,IAAcotB,EAAUgC,gCAGtEpiF,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,iBAAkBmiF,GACrDA,EAAgB3kE,EAAA,WAEhBhM,IAAY0wE,EAASD,sCAErBl8C,EAAciW,iBAAiBxqC,MAGjCimB,EAASp1B,KAAKiM,GAEdtO,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAGjC,CACE,MAAM44B,EAAU,IAAI2xC,GAAe,CAAC99D,KAAM,2BAA4BzE,QAAS,qCAC/E4wB,EAAQ54B,UAAUiI,UAAUrS,IAAI,QAEhC,MAAMglC,EAAgB,IAAI,KAAc,CAAClyB,KAAM,qCACzCsmB,EAAM,IAAI,KAAI,CAClB4L,cAAAA,IAKF,IAAIv0B,EAFJuyB,EAAQvxB,QAAQ/G,OAAO0uB,EAAIhvB,WAG3BnL,KAAK65E,cAAclsE,iBAAiB,WAAW,KAC7C,QAAe3J,IAAZwN,EAAuB,OAC1B,MAAM6wE,EAAWloD,EAAI4L,cAAcxB,QAEnC,OADkB89C,IAAa7wE,EAKxBxR,KAAKgH,SAAS0rD,WAAW0sB,UAAU,6BAA8B,CACtEkD,kBAAmBD,SALrB,IAOC,CAACr0E,MAAM,IAEV,MAAMM,EAAU3N,EAAE6/E,gBAAgBnyE,MAAM6zE,IAClCA,EAAS10E,OAAO+0E,uBAIpB/wE,IAAY0wE,EAAS10E,OAAO80E,kBAC5Bv8C,EAAciW,iBAAiBxqC,GAC/BuyB,EAAQ54B,UAAUiI,UAAU7Q,OAAO,YAGrCk1B,EAASp1B,KAAKiM,GAEdtO,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAGjC,CACE,MAAM44B,EAAU,IAAI2xC,GAAe,CAAC99D,KAAM,kBAAmBzE,QAAS,6BAEhE2mD,EAAe,KACnB,MAAM3sC,EAAoC,CACxCklC,aAAc,iCACdC,mBAAoB,gCACpBt8C,OAAQ,CACNu8C,QAAS,SAEXpV,WAAY,CAAC,CACXtpC,KAAM,uBACN0wB,SAAS,GACR,CACD1wB,KAAM,sBACN0wB,SAAS,MAIb,EAAAwY,GAAA,GAAkB5vB,GAAS9e,MAAK,KAC9B,MAAOywD,EAAM0jB,GAAWr1D,EAAQgwB,WAAW5iC,KAAKmmB,GAAMA,EAAEqF,cAAcxB,UAChE36B,GAAS,EAAAgyC,EAAA,GAAiB,CAACwW,IAAc,GAC/CpyD,KAAKgH,SAASy7E,mBAAmBC,eAAe5jB,EAAM0jB,GAASn0E,MAAK,MAC9DywD,GAAS0jB,KAIb54E,KACA,EAAA0hD,EAAA,IAAS,CACPC,YAAauT,GAAQ0jB,EAAU,wCAA2C1jB,EAAO,qCAAuC,4CAG3HvnC,GAAA,IAGC66B,GAAc,OAAO,8BAA+B,CAACx+C,KAAM,SAAUC,KAAM,yBACjF7T,KAAK0R,eAAe3Q,IAAIqxD,EAAxBpyD,CAAqC,QAAS85D,GAC9C/1B,EAAQvxB,QAAQ/G,OAAO2mD,GAEvBpyD,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAGjC,CACE,MAAM44B,EAAU,IAAI2xC,GAAe,CAAC99D,KAAM,gBAEpCrF,EAAgB,KACN,IAAI,IAAU,sBAAuB,CACjDmB,QAAS,CAAC,CACR6+C,QAAS,SACTvV,SAAU,KACR,MAAMpzC,GAAS,EAAAgyC,EAAA,GAAiB,CAAC+mC,IAAe,GAChD3iF,KAAKgH,SAAS47E,iBAAiBC,iBAAiBx0E,MAAK,KACnDzE,QAGJy/D,UAAU,IAEZhX,aAAc,6BACdC,mBAAoB,0BAGhBvnC,QAGF43D,GAAe,OAAO,8BAA+B,CAAC/uE,KAAM,SAAUC,KAAM,6BAClF7T,KAAK0R,eAAe3Q,IAAI4hF,EAAxB3iF,CAAsC,QAASuS,GAC/CwxB,EAAQvxB,QAAQ/G,OAAOk3E,GAcvB3iF,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAGjC,OAAOuV,QAAQkI,IAAI6O,GAGdwpD,uBACLjhF,KAAKgH,SAAS0rD,WAAW0sB,UAAU,6BAA6B/wE,MAAMy0E,IACpE9iF,KAAKghF,kBAAkBr+C,SAAU,EACjC3iC,KAAKi/E,eAAiB6D,EAAM7D,gBAC5B,QAAMj/E,KAAKghF,kBAAkB3mD,SAAU,kBAAmB,CAACr6B,KAAKi/E,eAAep8E,a,wBC3b9E,SAASkgF,GAAuBz/E,GACrC,MAAM+M,EAAU/M,EAAO0hB,WAAW,MAE5Bg+D,EAAQ,IAAIpqE,MAAM,GAAGqqE,KAAK,GAC1BzwC,EAASniC,EAAQ6yE,aAAa,EAAG,EAAG5/E,EAAOsf,MAAOtf,EAAO0f,QAAQyvB,KACjE0wC,EAAe3wC,EAAO3vC,OAAS,EACrC,IAAI,IAAI6gB,EAAI,EAAGA,EAAI8uB,EAAO3vC,OAAQ6gB,GAAK,EAErCs/D,EAAM,IAAMxwC,EAAO9uB,GACnBs/D,EAAM,IAAMxwC,EAAO9uB,EAAI,GACvBs/D,EAAM,IAAMxwC,EAAO9uB,EAAI,GACvBs/D,EAAM,IAAMxwC,EAAO9uB,EAAI,GAGzB,MAAM0/D,EAAW,IAAIC,kBAAkB,GAMvC,OALAD,EAAS,GAAKJ,EAAM,GAAKG,EACzBC,EAAS,GAAKJ,EAAM,GAAKG,EACzBC,EAAS,GAAKJ,EAAM,GAAKG,EACzBC,EAAS,GAAKJ,EAAM,GAAKG,EAElBC,E,qCCzBM,SAASE,GAAmBC,GACzC,IAAI,EAACp0E,EAAC,EAAErF,EAAC,EAAE05E,IAAK,SAAWD,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAOlD,OANGz5E,EAAI,IACLA,EAAIvD,KAAKI,IAAI,IAAKmD,EAAI,EAAI,IAAO,IAAMA,KAEzC05E,EAAIj9E,KAAKC,IAAI,EAAO,IAAJg9E,GAEH,QAAQr0E,MAAMrF,OAAO05E,U,uGCKrB,MAAMC,GAyBnB1jF,cAhBQ,KAAA2jF,IAAM,EACN,KAAAC,WAAa,IACb,KAAAC,UAAY,GACZ,KAAA5vC,MAAQ,EACR,KAAAlvB,SAOJ,GAoGI,KAAA++D,YAAc,KACpBz4E,SAAS04E,gBAAgBx4E,MAAMiV,OAASvgB,KAAK8kB,SAASi/D,WAAWz4E,MAAMiV,OAAS,YAG1E,KAAAyjE,UAAY,KAClB54E,SAAS04E,gBAAgBx4E,MAAMiV,OAASvgB,KAAK8kB,SAASi/D,WAAWz4E,MAAMiV,OAAS,IAnGhFvgB,KAAKmL,UAAYC,SAASC,cAAc,OACxCrL,KAAKmL,UAAUiI,UAAUrS,IAAI0iF,GAAYpqC,YAEzC,MAAMpkC,EAAO,uBACGwuE,GAAYpqC,WAAa,g+BAgBvBoqC,GAAYpqC,WAAa,cAAcoqC,GAAYpqC,WAAa,mKAIlEoqC,GAAYpqC,WAAa,qCACvBoqC,GAAYpqC,WAAa,6tBAavBoqC,GAAYpqC,WAAa,cAAcoqC,GAAYpqC,WAAa,mLAOpFr5C,KAAKmL,UAAU4T,UAAY9J,EAE3BjV,KAAK8kB,SAASm3B,IAAMj8C,KAAKmL,UAAUiK,kBACnCpV,KAAK8kB,SAASi/D,WAAa/jF,KAAK8kB,SAASm3B,IAAI/1B,iBAC7ClmB,KAAK8kB,SAAS6+D,WAAa3jF,KAAK8kB,SAASm3B,IAAI7mC,kBAAkBA,kBAE/DpV,KAAK8kB,SAASm/D,QAAUjkF,KAAK8kB,SAASm3B,IAAImwB,mBAE1CpsE,KAAK8kB,SAAS4+D,IAAM1jF,KAAK8kB,SAASm/D,QAAQ7uE,kBAC1CpV,KAAK8kB,SAASo/D,WAAalkF,KAAK8kB,SAAS4+D,IAAIx9D,iBAE7ClmB,KAAKmkF,cAAgB,IAAI,KAAW,CAAC57D,WAAW,EAAMyd,MAAO,yBAC7DhmC,KAAKokF,cAAgB,IAAI,KAAW,CAAC77D,WAAW,EAAMyd,MAAO,yBAE7D,MAAMq+C,EAASj5E,SAASC,cAAc,OACtCg5E,EAAOzpE,UAAY6oE,GAAYpqC,WAAa,UAC5CgrC,EAAO54E,OAAOzL,KAAKmkF,cAAch5E,UAAWnL,KAAKokF,cAAcj5E,WAC/DnL,KAAKmL,UAAUM,OAAO44E,GAEtBrkF,KAAKmkF,cAAc9zD,MAAM1iB,iBAAiB,SAAS,KACjD,IAAIlB,EAAQzM,KAAKmkF,cAAc13E,MAAMwZ,QAAQ,KAAM,IAAIyQ,MAAM,EAAG,GAEhE,MAAMpxB,EAAQmH,EAAMnH,MAAM,iBACpBg/E,EAAQh/E,GAASA,EAAM,GAAGzC,SAAW4J,EAAM5J,QAAU,CAAa,GAAG+R,SAASnI,EAAM5J,QAC1F7C,KAAKmkF,cAAc1qB,SAAS6qB,EAAQ,aAAqB,YAEzD73E,EAAQ,IAAMA,EACdzM,KAAKmkF,cAAcnoC,iBAAiBvvC,GAEjC63E,GACDtkF,KAAKukF,SAAS93E,GAAO,GAAO,MAKhC,MAAM+3E,EAAY,wHAClBxkF,KAAKokF,cAAc/zD,MAAM1iB,iBAAiB,SAAS,KACjD,MAAMrI,EAAQtF,KAAKokF,cAAc33E,MAAMnH,MAAMk/E,GAC7CxkF,KAAKokF,cAAc3qB,SAASn0D,EAAQ,aAAqB,YAEtDA,GACDtF,KAAKukF,UAAS,UAAYj/E,EAAM,IAAKA,EAAM,IAAKA,EAAM,KAAK,GAAM,MAIrEtF,KAAKykF,qBACLzkF,KAAK0kF,qBAWCD,sBACN,EAAAE,GAAA,GAAoB3kF,KAAK8kB,SAASm3B,KAAY,KAC5Cj8C,KAAK6jF,cACL7jF,KAAK4kF,QAAU5kF,KAAK8kB,SAASm3B,IAAIn6B,2BAE/B4vB,IACF1xC,KAAK6kF,kBAAkBnzC,EAAIlrB,EAAGkrB,EAAIjrB,MACjC,KACDzmB,KAAKgkF,eAIDU,sBACN,EAAAC,GAAA,GAAoB3kF,KAAK8kB,SAAS4+D,KAAY,KAC5C1jF,KAAK6jF,cACL7jF,KAAK8kF,QAAU9kF,KAAK8kB,SAAS4+D,IAAI5hE,2BAE/B4vB,IACF1xC,KAAK+kF,WAAWrzC,EAAIlrB,MACnB,KACDxmB,KAAKgkF,eAIFO,SAASxwC,EAA2BixC,GAAiB,EAAMC,GAAiB,GACjF,QAAajhF,IAAV+vC,EACDA,EAAQ,CACN5kC,EAAG,EACHrF,EAAG,IACH05E,EAAG,GACHlvE,EAAG,QAEA,GAAqB,iBAAZ,EACd,GAAgB,MAAby/B,EAAM,GACPA,GAAQ,SAAWA,OACd,CACL,MAAMmxC,EAAMnxC,EAAMzuC,MAAM,YACxByuC,GAAQ,UAAYmxC,EAAI,IAAKA,EAAI,IAAKA,EAAI,QAAelhF,IAAXkhF,EAAI,GAAmB,GAAKA,EAAI,IAKlFllF,KAAK4kF,QAAU5kF,KAAK8kB,SAASm3B,IAAIn6B,wBAEjC,MAAMqjE,EAAOnlF,KAAK4kF,QAAQhiE,MAAQ,IAAMmxB,EAAMjqC,EACxCs7E,EAAW,IAAOrxC,EAAMyvC,GAAK,IAAMzvC,EAAMjqC,EAAI,GAAM,IACnDu7E,EAAOrlF,KAAK4kF,QAAQ5hE,OAAS,IAAMoiE,EAEzCplF,KAAK6kF,kBAAkB7kF,KAAK4kF,QAAQ3iE,KAAOkjE,EAAMnlF,KAAK4kF,QAAQliE,IAAM2iE,GAAM,GAG1ErlF,KAAK8kF,QAAU9kF,KAAK8kB,SAAS4+D,IAAI5hE,wBAEjC,MAAMwjE,EAAavxC,EAAM5kC,EAAI,IACvBo2E,EAAOvlF,KAAK8kF,QAAQ7iE,KAAOjiB,KAAK8kF,QAAQliE,MAAQ0iE,EAEtDtlF,KAAK+kF,WAAWQ,GAAM,GAGtBvlF,KAAK0jF,IAAM3vC,EAAM5kC,EACjBnP,KAAK2jF,WAAa5vC,EAAMjqC,EACxB9J,KAAK4jF,UAAY7vC,EAAMyvC,EACvBxjF,KAAKg0C,MAAQD,EAAMz/B,EAEnBtU,KAAKwlF,aAAaR,EAAgBC,GAG7BQ,kBACL,MAAMC,GAAY,SAAW1lF,KAAK0jF,IAAK1jF,KAAK2jF,WAAY3jF,KAAK4jF,UAAW5jF,KAAKg0C,OACvE2xC,GAAO,SAAWD,GAClBx0C,EAAMy0C,EAAKjvD,MAAM,GAAI,GAE3B,MAAO,CACLkvD,IAAK,OAAO5lF,KAAK0jF,QAAQ1jF,KAAK2jF,gBAAgB3jF,KAAK4jF,cACnDsB,IAAK,OAAOQ,EAAU,OAAOA,EAAU,OAAOA,EAAU,MACxDx0C,IAAKA,EACL20C,KAAM,QAAQ7lF,KAAK0jF,QAAQ1jF,KAAK2jF,gBAAgB3jF,KAAK4jF,eAAe5jF,KAAKg0C,SACzEuvC,KAAM,QAAQmC,EAAU,OAAOA,EAAU,OAAOA,EAAU,OAAOA,EAAU,MAC3EC,KAAMA,EACND,UAAWA,GAIRF,aAAaR,GAAiB,EAAMC,GAAiB,GAC1D,MAAMlxC,EAAQ/zC,KAAKylF,kBACnBzlF,KAAK8kB,SAASi/D,WAAWh+D,eAAe,KAAM,OAAQguB,EAAM7C,KAEzD8zC,IACDhlF,KAAKmkF,cAAcnoC,iBAAiBjI,EAAM7C,KAC1ClxC,KAAKmkF,cAAc1qB,SAAS,eAG3BwrB,IACDjlF,KAAKokF,cAAcpoC,iBAAiBjI,EAAM2xC,UAAUhvD,MAAM,GAAI,GAAG5S,KAAK,OACtE9jB,KAAKokF,cAAc3qB,SAAS,eAG3Bz5D,KAAK+vB,UACN/vB,KAAK+vB,SAASgkB,GAIVgxC,WAAWt6C,EAAejN,GAAS,GACzC,MAEMk+B,GAFS,EAAAoqB,GAAA,GAAMr7C,EAAQzqC,KAAK8kF,QAAQ7iE,KAAM,EAAGjiB,KAAK8kF,QAAQliE,OAEtC5iB,KAAK8kF,QAAQliE,MACvC5iB,KAAK0jF,IAAMn9E,KAAKmD,MAAM,IAAMgyD,GAE5B,MAAMmqB,EAAO,QAAQ7lF,KAAK0jF,mBAAmB1jF,KAAKg0C,SAElDh0C,KAAK8kB,SAASo/D,WAAWn+D,eAAe,KAAM,IAAiB,IAAX21C,EAAkB,KACtE17D,KAAK8kB,SAASo/D,WAAWn+D,eAAe,KAAM,OAAQ8/D,GAEtD7lF,KAAK8kB,SAAS6+D,WAAWz9D,iBAAiBH,eAAe,KAAM,aAAc8/D,GAE1EroD,GACDx9B,KAAKwlF,eAIDX,kBAAkBp6C,EAAem9B,EAAepqC,GAAS,GAC/D,MAAMuoD,EAAO/lF,KAAK4kF,QAAQhiE,MACpBojE,EAAOhmF,KAAK4kF,QAAQ5hE,OAKpBijE,GAHS,EAAAH,GAAA,GAAMr7C,EAAQzqC,KAAK4kF,QAAQ3iE,KAAM,EAAG8jE,GAG7BA,EAAO,IACvBG,GAHS,EAAAJ,GAAA,GAAMle,EAAQ5nE,KAAK4kF,QAAQliE,IAAK,EAAGsjE,GAG5BA,EAAO,IAEvBjC,EAAa/jF,KAAK8kB,SAASi/D,WACjCA,EAAWh+D,eAAe,KAAM,IAAKkgE,EAAO,KAC5ClC,EAAWh+D,eAAe,KAAM,IAAKmgE,EAAO,KAE5C,MAAMvC,GAAa,EAAAmC,GAAA,GAAMG,EAAM,EAAG,KAE5BE,EAAa,IAAMxC,EAAa,EAChCyC,EAAa,KAAM,EAAAN,GAAA,GAAMI,EAAM,EAAG,KAElCtC,GAAY,EAAAkC,GAAA,GAAMM,EAAa,IAAMD,EAAY,EAAG,KAE1DnmF,KAAK2jF,WAAaA,EAClB3jF,KAAK4jF,UAAYA,EAEdpmD,GACDx9B,KAAKwlF,gBAhRM,GAAAnsC,WAAa,eCGf,MAAMgtC,WAA8B,IAAnD,c,oBA2FU,KAAAC,YAAc,CAACp1C,EAAaq1C,GAAoB,KACtD,GAAGA,EACDvmF,KAAKwmF,YAAYjC,SAASrzC,OACrB,CACL,MAAMqyC,GAAO,SAAWryC,GAClBu1C,EAAazmF,KAAK0mF,MAAMD,WACxBZ,EAAOvC,GAAmBC,GAEhCkD,EAAW9+E,GAAK,IAChB8+E,EAAWE,UAAY,EACvBF,EAAWG,KAAO,GAClBH,EAAW1yC,MAAQ7C,EAAIlpB,cACvBy+D,EAAWnD,mBAAqBuC,EAChC7lF,KAAKgH,SAAS6/E,gBAAgBC,YAAY,WAAYtpE,EAAA,YAEtD2T,EAAA,yBAA+BntB,OAAWA,GAAW,GACrDhE,KAAK+uB,cAID,KAAAg4D,cAAiBhzC,IACvB/zC,KAAKgnF,WAAWjzC,EAAM7C,KAAK,IA1G7Brf,OACE7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,uBAAwB,8BACrDf,KAAKy1E,SAAS,YAEdz1E,KAAK0mF,MAAQO,GAAA,aAEb,MAAMljD,EAAU,IAAI2xC,GAAe,IACnC11E,KAAKwmF,YAAc,IAAI/C,GAEvB1/C,EAAQvxB,QAAQ/G,OAAOzL,KAAKwmF,YAAYr7E,WAExCnL,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAE/B,MAAM+7E,EAAc,IAAIxR,GAAe,IAEjCyR,EAAOnnF,KAAKmnF,KAAO/7E,SAASC,cAAc,OAChD87E,EAAK/zE,UAAUrS,IAAI,QAEJ,CACb,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGK+D,SAASivC,IACd,MAAM/wC,EAAOoI,SAASC,cAAc,OACpCrI,EAAKoQ,UAAUrS,IAAI,aACnBiC,EAAK2iB,QAAQouB,MAAQA,EAAM/rB,cAG3B,MAAMviB,EAAQ2F,SAASC,cAAc,OACrC5F,EAAM2N,UAAUrS,IAAI,mBACpB0E,EAAM6F,MAAM87E,gBAAkBrzC,EAE9B/wC,EAAKyI,OAAOhG,GACZ0hF,EAAK17E,OAAOzI,OAGd,QAAiBmkF,GAAOr/E,IACtB,MAAMzH,GAAS,EAAAyc,GAAA,GAAgBhV,EAAEzH,OAAQ,aACzC,IAAIA,GAAUA,EAAO+S,UAAUqB,SAAS,UACtC,OAGF,MAAMs/B,EAAQ1zC,EAAOslB,QAAQouB,MACzBA,GAIJ/zC,KAAKgnF,WAAWjzC,KACf,CAACriC,eAAgB1R,KAAK0R,iBAEzBw1E,EAAY10E,QAAQ/G,OAAO07E,GAC3BnnF,KAAK4vB,WAAWnkB,OAAOy7E,EAAY/7E,WAEnCnL,KAAKgnF,YAAa,EAAAK,GAAA,GAASrnF,KAAKsmF,YAAa,IAAI,GAG3Cv3D,YACN,MAAM3N,EAASphB,KAAKmnF,KAAK3vE,cAAc,WACjCivE,EAAazmF,KAAK0mF,MAAMD,WACxBpmF,EAASomF,EAAW1yC,MAAQ/zC,KAAKmnF,KAAK3vE,cAAc,0BAA0BivE,EAAW1yC,WAAa,KACzG3yB,IAAW/gB,IAIX+gB,GACDA,EAAOhO,UAAU7Q,OAAO,UAGvBlC,GACDA,EAAO+S,UAAUrS,IAAI,WA4BzBouC,SACEzsC,YAAW,KACT,MAAM+jF,EAAazmF,KAAK0mF,MAAMD,WAExB1yC,GAAS0yC,EAAW1yC,OAAS,IAAItwB,MAAM,KAAK,GAC5C6jE,IAAcvzC,IAAU0yC,EAAWG,KAGtCU,IACDtnF,KAAKwmF,YAAYz2D,SAAW/vB,KAAK+mF,eAGnC/mF,KAAKwmF,YAAYjC,SAASxwC,GAAS,WAE/BuzC,IACFtnF,KAAKwmF,YAAYz2D,SAAW/vB,KAAK+mF,iBAElC,GAGL5kC,sBAIE,OAHAniD,KAAKwmF,YAAYz2D,cAAW/rB,EAC5BhE,KAAKwmF,iBAAcxiF,EAEZ+N,MAAMowC,uB,iWC1HF,MAAMolC,WAAyB,IAA9C,c,oBAEU,KAAAjsE,OAAS,EACT,KAAAksE,QAAsB,IAAIpmF,IAG1B,KAAAqmF,oBAAmD,IAAIlmF,IACvD,KAAAmmF,cAA0C,IAAInmF,IAyE9C,KAAAomF,cAAgB,MCpHX,SAAqBC,GAClC,MAAMv3D,EAAQjlB,SAASC,cAAc,SACrCglB,EAAMzuB,KAAO,OACbyuB,EAAM/kB,MAAM2b,QAAU,OAGpBoJ,EAAMu3D,OAASA,EAGjBx8E,SAASI,KAAKC,OAAO4kB,GAErB,MAAM/hB,EAAU,IAAIoS,SAAc,CAACxS,EAASyS,KAC1C0P,EAAM1iB,iBAAiB,UAAW7F,IAChC,MAAMq9D,EAAar9D,EAAEzH,OAAO+kE,MAAM,GAC9BD,EAKJj3D,EAAQi3D,GAJNxkD,EAAO,sBAKR,CAAC3S,MAAM,OACT6J,SAAQ,KACTwY,EAAM9tB,YAKR,OAFA8tB,EAAMvb,QAECxG,GD0FLu5E,CAAY,oCAAoCx5E,MAAW82D,GAAS,mCAClE,GAAGA,EAAKvtD,KAAKkwE,SAAS,QAAS,CAC7B,MAAM99D,EAAM5e,SAASC,cAAc,OAC7B5D,EAAM4xB,IAAI0uD,gBAAgB5iB,SAC1B,EAAAn+C,GAAA,IAA0BgD,EAAKviB,GAAK,GAC1C,MAAMugF,EAAW,cACX,KAAC1f,SAAc,EAAA2f,GAAA,GAAkB,CAACxiF,MAAOukB,EAAKpiB,KAAM,IAAI,KAAUoiB,EAAI/E,aAAc+E,EAAI9E,eAAgB8iE,SAAAA,IAC9G7iB,EAAO,IAAI+iB,KAAK,CAAC5f,GAAOnD,EAAKvtD,KAAKqO,QAAQ,SAAU,QAAS,CAACrkB,KAAMomF,IAGtE,MAAMG,QAAkBnoF,KAAKgH,SAASC,eAAemhF,uBAAuBjjB,GACtEkjB,EAAgBroF,KAAKgH,SAASC,eAAeqhF,gBAAgBH,EAAUxgF,IACvE4gF,EAA0C78D,GAAA,0BAA2Cy5C,EAAKvtD,KAAMywE,GAEhGp6E,GAAW,UACjBA,EAASkhE,kBAAoBoZ,EAAepZ,kBAC5ClhE,EAASo+B,OAASk8C,EAAel8C,OAEjCk8C,EAAel6E,MAAM85E,IACnBnoF,KAAKwnF,QAAQvmF,OAAOsL,GACpBvM,KAAK0nF,cAAczmF,OAAOsL,GAC1BvM,KAAKynF,oBAAoB9jF,IAAIwH,EAAWg9E,GACxC,MAAMK,EAASxoF,KAAKyoF,gBAAgBN,GACpCnoF,KAAK0nF,cAAc/jF,IAAI6kF,EAAQr9E,GAE/BnL,KAAK0oF,sBAAsBP,GAAW95E,KAAKJ,EAASC,QAASD,EAAS0S,UACrE1S,EAAS0S,QAEZ,MAAMpU,EAAMvM,KAAKyoF,gBAAgBN,GACjCl6E,EAAS0J,OAAM,KACbxM,EAAU5I,YAGZ,MAAMgZ,EAAY,IAAI,KAAqB,CACzC8yD,UAAU,EACV1wD,YAAY,EACZ+oB,gBAAgB,IAGZv7B,EAAYnL,KAAK2oF,aAAaR,GAAW,GAC/CnoF,KAAKwnF,QAAQzmF,IAAIwL,GAEjBgP,EAAU2P,OAAO/f,GAAW,EAAO8C,SAI/B,KAAA26E,aAAe,KACrB,MAAMC,EAAe,2BAAiC/nD,GAAMA,EAAElpB,OAAS5X,KAAK0mF,MAAM9uE,OAC/EixE,MACC7oF,KAAKsb,OACPtb,KAAK0mF,MAAMD,YAAa,EAAApkD,GAAA,GAAKwmD,EAAapC,YAC1CzmF,KAAKgH,SAAS6/E,gBAAgBC,YAAY,WAAYtpE,EAAA,YACtD2T,EAAA,yBAA+BntB,OAAWA,GAAW,GACrDhE,KAAK8oF,kBAAkB9sC,iBAAiBh8C,KAAK0mF,MAAMD,WAAW5mC,QA+G1D,KAAAkpC,YAAejhF,IACrB,MAAMzH,GAAS,EAAAyc,GAAA,GAAgBhV,EAAEzH,OAAQ,aACzC,IAAIA,EAAQ,OAEZ,MAAM2oF,EAAYhpF,KAAKynF,oBAAoBxkF,IAAI5C,GAC/C,GAAmB,oBAAhB2oF,EAAUv5E,EAEX,YADAzP,KAAK0oF,sBAAsBM,GAI7B,MAAMz8E,EAAMvM,KAAKyoF,gBAAgBO,GACjC,GAAGhpF,KAAKwnF,QAAQnkF,IAAIkJ,GAAM,OAC1BvM,KAAKwnF,QAAQzmF,IAAIwL,GAEjB,MAAM5K,EAAMqnF,EAAU59E,SAChBmQ,EAAY,IAAI,KAAqB,CACzCoC,YAAY,EACZ+oB,gBAAgB,IAGZ9jC,EAAO,IAAW,mCACtB,MAAM0L,EAAUtO,KAAK0oF,sBAAsBM,UAChBhpF,KAAKgH,SAASO,cAAcC,gBAAgB7F,IACtD8F,MAAOzH,KAAK0mF,MAAMD,WAAW5mC,MAC5CtkC,EAAU2P,OAAO7qB,GAAQ,EAAMiO,MAInCiN,EAAUrQ,aAEV,QAAiB7K,GAASyH,IACrByT,EAAUA,UAAU5C,eACrB4C,EAAUzH,QAAQhM,GAClByT,EAAU6P,UAEVxoB,MAED,CAAC8O,eAAgB1R,KAAK0R,iBAEzB9O,KAKM,KAAAqmF,YAAc,CAACrC,EAAcn/E,KACnC4vE,MAAM5vE,GAAK4G,MAAMipE,IACfnmD,EAAA,oBAA+B,eAAiBy1D,EAAMtP,OAIlD,KAAAoR,sBAAyBP,IAC/B,MAAMe,IAAYlpF,KAAKsb,OACjBoX,EAAa,IAAMw2D,IAAYlpF,KAAKsb,OAEpC3Z,EAAOwmF,EAAkC/8E,SACzC6C,GAAW,UACjB,IAAIgI,EA4EJ,OA3EGtU,GACDsU,EAAWyV,GAAA,mBAAoC,CAACjmB,MAAO9D,EAAKuR,QAASie,EAAA,eAA4BA,EAAA,qCAAkD,IACnJljB,EAASkhE,kBAAoBl5D,EAASk5D,kBACtClhE,EAASo+B,OAASp2B,EAASo2B,QAE3Bp2B,EAAWyK,QAAQxS,UAGrB+H,EAAS5H,MAAK,IAAW,mCACvB,IAAIqkB,IAEF,YADAzkB,EAASC,UAIX,MAAMu4E,EAAazmF,KAAK0mF,MAAMD,WACxB0C,EAAW1hF,IAEf,IAAI2hF,EACJ,MAAMhC,EAAkBpnF,KAAKqpF,uBAAuBlB,GACpD,GAAG1gF,IAAQ2/E,EACTgC,EJpTH,SAAsBE,GAC3B,MAAMt/D,EAAM5e,SAASC,cAAc,OACnC,OAAO,EAAA2b,GAAA,IAA0BgD,EAAKs/D,GAAU,GAAOj7E,MAAK,IArBvD,SAAqCk7E,EAAgC3mE,EAAeI,GACzF,MAAM1f,EAAS8H,SAASC,cAAc,UAChCm+E,EAAQ5mE,EAAQI,EActB,OAZa,IAAVwmE,GACDlmF,EAAOsf,MAFU,GAGjBtf,EAAO0f,OAAS1f,EAAOsf,MAAQ4mE,GACvBA,EAAQ,GAChBlmF,EAAO0f,OALU,GAMjB1f,EAAOsf,MAAQtf,EAAO0f,OAASwmE,GAE/BlmF,EAAOsf,MAAQtf,EAAO0f,OARL,GAWH1f,EAAO0hB,WAAW,MAC1BM,UAAUikE,EAAa,EAAG,EAAG3mE,EAAOI,EAAQ,EAAG,EAAG1f,EAAOsf,MAAOtf,EAAO0f,QACxE+/D,GAAuBz/E,GAMrBmmF,CAA4Bz/D,EAAKA,EAAI/E,aAAc+E,EAAI9E,iBIiTtCwkE,CAAajiF,OAC1B,CACL,MAAM,OAACnE,GAAU,YAAsC8jF,GACvDgC,EAAkB1oE,QAAQxS,QAAQ60E,GAAuBz/E,IAG3D8lF,EAAgB/6E,MAAM20E,I,UACpB,IAAItwD,IAEF,YADAzkB,EAASC,UAIX,MAAM23E,EAAOvC,GAAmB1qE,MAAMC,KAAKmqE,IAIrC4D,EAA8C,QAAtC,EAAAuB,EAAkCvB,YAAI,QAAI,GACxDH,EAAW9+E,GAAKwgF,EAAUxgF,GAC1B8+E,EAAWE,UAAyC,QAA7B,EAAkB,QAAlB,EAAAwB,EAAUjG,gBAAQ,eAAEyE,iBAAS,QAAI,EACxDF,EAAW1yC,MAAQqzC,EACnBX,EAAWG,KAAOA,EAClBH,EAAWnD,mBAAqBuC,EAChC7lF,KAAKgH,SAAS6/E,gBAAgBC,YAAY,WAAYtpE,EAAA,YAEnDopE,GACD5mF,KAAKipF,YAAYrC,EAAMn/E,GAGzB0pB,EAAA,oBAA+By1D,EAAMn/E,GAAK,GAAM4G,KAAKJ,EAASC,aAIlE,IAAIvM,EAEF,YADAwnF,IAIF,MAAM7hF,QAAqBtH,KAAKgH,SAASO,cAAcC,gBAAgB7F,GACpE8kF,EAAW5mC,KACZn9C,YAAW,KACT,MAAM,OAACY,EAAM,QAAEgL,IAAW,QAAKhH,EAAaG,IAAK,GAAI,GACrD6G,EAAQD,MAAK,KACPqkB,IAKJy2D,EAAQ7lF,EAAOqmF,aAJb17E,EAASC,eAMZ,KAEHi7E,EAAQ7hF,EAAaG,UAIlBwG,GAGD,KAAA8gB,UAAY,KAClB,MAAM3N,EAASphB,KAAKmnF,KAAK3vE,cAAc,WACjCnX,EAASL,KAAK0nF,cAAczkF,IAAIjD,KAAK4pF,yBAAyB5pF,KAAK0mF,QACtEtlE,IAAW/gB,IAIX+gB,GACDA,EAAOhO,UAAU7Q,OAAO,UAGvBlC,GACDA,EAAO+S,UAAUrS,IAAI,YA/Xb2lF,YACV,OAAOO,GAAA,aAGTp1D,OACE7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,uBAAwB,8BACrDf,KAAKy1E,SAAS,kBAEd,CACE,MAAMtqE,EAAYytE,GAAgB54E,KAAK4vB,YAEjCi6D,GAAe,OAAO,8BAA+B,CAACj2E,KAAM,YAAaC,KAAM,mCAC/Ei2E,GAAc,OAAO,8BAA+B,CAACl2E,KAAM,WAAYC,KAAM,aAC7Ek2E,GAAc,OAAO,8BAA+B,CAACn2E,KAAM,aAAcC,KAAM,sBAErF,QAAiBg2E,EAAc7pF,KAAK2nF,cAAe,CAACj2E,eAAgB1R,KAAK0R,kBAEzE,QAAiBo4E,GAAa,KAC5B9pF,KAAKg5E,OAAOC,UAAUoN,IAAuBz7D,SAC5C,CAAClZ,eAAgB1R,KAAK0R,kBAEzB,QAAiBq4E,EAAa/pF,KAAK4oF,aAAc,CAACl3E,eAAgB1R,KAAK0R,iBAEvE,MAAMo3E,EAAoB9oF,KAAK8oF,kBAAoB,IAAI,KAAc,CACnEj1E,KAAM,sBACN+D,KAAM,OACN2sB,QAASvkC,KAAK0mF,MAAMD,WAAW5mC,OAGjC7/C,KAAK0R,eAAe3Q,IAAI+nF,EAAkBz4D,MAA1CrwB,CAAiD,UAAU,IAAW,mCACpEA,KAAK0mF,MAAMD,WAAW5mC,KAAOipC,EAAkBz4D,MAAMkU,cAC/CvkC,KAAKgH,SAAS6/E,gBAAgBC,YAAY,WAAYtpE,EAAA,YAG5D9a,YAAW,KACT,MAAM0e,EAAS+lE,EAAK3vE,cAAc,WAClC,IAAI4J,EAAQ,OAEZ,MAAM4nE,EAAYhpF,KAAKynF,oBAAoBxkF,IAAIme,GAC3C4nE,EAAkCx7E,OAAOw8E,SAA2B,oBAAhBhB,EAAUv5E,GAIlEzP,KAAK0oF,sBAAsBM,KAC1B,UAGL79E,EAAUM,OACRo+E,EACAC,EACAC,GACA,QAA2BjB,GAAmB39E,WAIlDqS,EAAA,mBAA2B,oBAAqBxd,KAAK+uB,WAErD/uB,KAAKgH,SAASC,eAAegjF,gBAAgB57E,MAAM67E,IACjDA,EAAWplF,SAASqjF,IAClBnoF,KAAK2oF,aAAaR,SAItB,MAAMgC,EAAgBvR,GAAgB54E,KAAK4vB,YACrCu3D,EAAOnnF,KAAKmnF,KAAO/7E,SAASC,cAAc,OAChD87E,EAAK/zE,UAAUrS,IAAI,SACnB,QAAiBomF,EAAMnnF,KAAK+oF,YAAa,CAACr3E,eAAgB1R,KAAK0R,iBAC/Dy4E,EAAc1+E,OAAO07E,GA6DfkC,uBAAuBlB,GAC7B,OAAOA,EAAUjG,SAAW,CAC1BiG,EAAUjG,SAASkI,iBACnBjC,EAAUjG,SAASmI,wBACnBlC,EAAUjG,SAASoI,uBACnBnC,EAAUjG,SAASqI,yBACnBjyD,OAAOC,SAAShe,KAAKw5B,GAAU,IAAMA,EAAMyD,SAAS,MAAK1zB,KAAK,KAAO,GAGjE2kE,gBAAgBN,GACtB,MAAO,GAAKA,EAAUxgF,GAGhBiiF,yBAAyBlD,GAC/B,MAAO,GAAKA,EAAMD,WAAW9+E,GAGvBghF,aAAaR,EAAsB18E,GAAS,GAClD,MAAMqoC,EAAS9zC,KAAKqpF,uBAAuBlB,GACrCqC,EAA0B,cAAhBrC,EAAU14E,EAC1B,GAAI+6E,GAAWrC,EAAU36E,OAAOw8E,UAAYl2C,EAE1C,OAGF,MAAM22C,IAAWtC,EAAU36E,OAAOk9E,KAE5B/oF,EAAM6oF,EAAUrC,EAAU/8E,cAAgCpH,EAE1DmH,EAAYC,SAASC,cAAc,OACzCF,EAAUiI,UAAUrS,IAAI,aAExBoK,EAAUwa,QAAQhe,GAAK,GAAKwgF,EAAUxgF,GAEtC,MAAM4E,EAAMvM,KAAKyoF,gBAAgBN,GACjCnoF,KAAKynF,oBAAoB9jF,IAAIwH,EAAWg9E,GACxCnoF,KAAK0nF,cAAc/jF,IAAI4I,EAAKpB,GAE5B,MAAM1F,EAAQ2F,SAASC,cAAc,OAGrC,IAAIssB,EAAuC/vB,EAuC3C,GAzCAnC,EAAM2N,UAAUrS,IAAI,mBAGjBypF,GACD5iF,GAAO,EAAAgwB,GAAA,GAAgBj2B,EAAK,IAAK,KACjCg2B,GAAU,QAAU,CAClBO,MAAOv2B,EACPuG,QAAS,KACTiD,UAAW1F,EACXuyB,kBAAkB,EAClBpwB,KAAMA,EACN+iF,SAAUxC,EAAU36E,OAAOw8E,UAG1B7B,EAAU36E,OAAOw8E,SAClBvkF,EAAM2N,UAAUrS,IAAI,cAGtB42B,EAAQtpB,MAAK,EAAO2kB,aAAAA,EAAcoF,OAAAA,KAAY,mCAE5C,aADMpF,EAAa5jB,QAAS4jB,EAAaqF,KAClCD,OACN/pB,MAAM+pB,I,MACJ+vD,EAAU36E,OAAOw8E,UACfS,GACDryD,EAAOC,KAAK/sB,MAAM2b,QAAU,OACzBmR,EAAOhpB,QACRgpB,EAAOhpB,MAAM9D,MAAM2b,QAAU,UAEL,QAAlB,EAAAkhE,EAAUjG,gBAAQ,eAAEyE,aAC5BvuD,EAAOC,KAAK/sB,MAAM4Y,QAAU,GAAK3d,KAAK+Y,IAAI6oE,EAAUjG,SAASyE,WAAa,MAI9E9W,GAAA,UAAqB,KACnB1kE,EAAUM,OAAOhG,UAIrB0F,EAAUM,OAAOhG,GAGhB0iF,EAAUjG,eAAoDl+E,IAAxCmkF,EAAUjG,SAASkI,iBAAgC,CAC1E,MAAM,OAAC9mF,GAAU,YAAsCwwC,GACvDxwC,EAAO8P,UAAUrS,IAAI,4BAElB0pF,GAAUD,EACX7yD,EAAQtpB,MAAK,EAAE2kB,aAAAA,MACbA,EAAaqF,KAAKhqB,MAAK,IAAW,mCAChC,MAAM/G,QAAqBtH,KAAKgH,SAASO,cAAcC,gBAAgB7F,EAAKiG,EAAKhG,MACjF0B,EAAOgI,MAAMs/E,gBAAkB,OAAOtjF,EAAaG,OACnDnE,EAAOgI,MAAM4Y,QAAU,IAAMikE,EAAU36E,OAAOk9E,KAAO,IAAMvC,EAAUjG,SAASyE,UAAYwB,EAAUjG,SAASyE,WAAa,IAC1HlhF,EAAMgG,OAAOnI,WAIjBmC,EAAMgG,OAAOnI,GAUjB,OANGtD,KAAK4pF,yBAAyB5pF,KAAK0mF,SAAWn6E,GAC/CpB,EAAUiI,UAAUrS,IAAI,UAG1Bf,KAAKmnF,KAAK17E,EAAS,SAAW,WAAWN,GAElCA,G,wEEzQI,MAAM0/E,WAA4B,IACxCh5D,OAKL,OAJA7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKy1E,SAAS,oBACdz1E,KAAKmL,UAAUiI,UAAUrS,IAAI,4BAEtB2f,QAAQkI,IAAI,CACjB5oB,KAAKgH,SAAS8jF,oBAAoBC,mBAClC/qF,KAAKgH,SAAS8jF,oBAAoBE,0BACjC38E,MAAK,EAAE48E,EAAeC,MACvBA,EAAqBA,EAAmB5yD,QAAQ6yD,IAAcA,EAAS39E,OAAO49E,WAE9E,MAAMrnD,EAAU,IAAI2xC,GAGdllB,EAAO06B,EAAmB3wE,KAAK8wE,IACnC,MAAMhZ,EAAa,IAAI,IAAW,CAChCz6D,KAHS,iBAIT/D,KAAMw3E,EAAkBv8E,MACxBrC,MAAO4+E,EAAkBF,SACzBxa,YAAY,IAGRx2C,EAAM,IAAI,KAAI,CAClBk4C,WAAAA,EACA/3C,aAAa,IAef,OAZA+3C,EAAWvzD,KAAK1L,UAAUrS,IAAI,yBAE9B,QAAiB,CACfo5B,IAAAA,EACAx4B,IAAK0pF,EAAkBC,YACvB1jF,KAAM,UAGLyjF,EAAkBF,WAAcF,EAAoCE,UACrE9Y,EAAWr2B,kBAAiB,GAGvB7hB,KAGH22C,GAAO,QAAkBtgB,GAAO/jD,IACpCzM,KAAKgH,SAAS8jF,oBAAoBS,mBAAmB,CAAC97E,EAAG,gBAAiB+7E,SAAU/+E,OAGtFs3B,EAAQvxB,QAAQ/G,OAAOqlE,GACvB9wE,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,e,eC/B9B,MAAMsgF,GAOX1rF,YACE6X,EACA6G,EACAitE,EACAC,EACApiD,EACAqiD,GAAa,GAEb,MAAMvyC,EAAa,yBACnBr5C,KAAKmL,UAAYC,SAASC,cAAc,OACxCrL,KAAKmL,UAAUiI,UAAUrS,IAAIs4C,GAE7B,MAAMjzC,EAAUgF,SAASC,cAAc,OACvCjF,EAAQgN,UAAUrS,IAAIs4C,EAAa,YAEnC,MAAMwyC,EAAUzgF,SAASC,cAAc,OACvCwgF,EAAQz4E,UAAUrS,IAAIs4C,EAAa,UACnC,QAAMwyC,EAASj0E,GAEf,MAAMk0E,EAAW9rF,KAAK+rF,eAAiB3gF,SAASC,cAAc,OAC9DygF,EAAS14E,UAAUrS,IAAIs4C,EAAa,UAEjCuyC,IACDE,EAAS/sE,UAAY,GAAK2sE,GAG5BtlF,EAAQqF,OAAOogF,EAASC,GAExB9rF,KAAK6lD,MAAQ,IAAI,KAAc,CAC7BpnC,KAAAA,EACA9X,IAAKglF,EACLnlF,IAAK+iC,GACJmiD,GACH1rF,KAAK6lD,MAAM3xC,eACXlU,KAAK6lD,MAAMlnC,YAAY,CACrBC,QAASnS,IACJzM,KAAK+vB,UACN/vB,KAAK+vB,SAAStjB,GAGbm/E,IAEDE,EAAShyD,UAAY,GAAKrtB,MAKhCzM,KAAKmL,UAAUM,OAAOrF,EAASpG,KAAK6lD,MAAM16C,YAI/B,MAAM6gF,WAA8B,IACjDn6D,OACE7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,8BAC7Bf,KAAKy1E,SAAS,WAEd,MAAM1xC,EAAU60C,GAAgB5+D,KAAK,KAAMha,KAAK4vB,YAEhD,CACE,MAAMzkB,EAAY44B,EAAQ,YAEpB8hB,EAAQ,IAAI4lC,GAAqB,WAAY,EAAGjuE,EAAA,4BAAqC,GAAI,IAC/FqoC,EAAM91B,SAAYtjB,IAChB+Q,EAAA,oCAA4C,4BAA6B/Q,IAG3E,MAAMw/E,GAAuB,OAAO,8BAA+B,CAACr4E,KAAM,QAASC,KAAM,oBAEzF,QAAiBo4E,GAAsB,KACrCjsF,KAAKg5E,OAAOC,UAAUsO,IAAkB38D,UAG1C,MAAMshE,EAA0B,IAAI,KAAc,CAChDr4E,KAAM,mBACN+D,KAAM,aACNikC,SAAU,6BACVnqC,eAAgB1R,KAAK0R,iBAGvBvG,EAAUM,OACRo6C,EAAM16C,UACN8gF,GACA,QAA2BC,GAAyB/gF,WAIxD,CACE,MAAMA,EAAY44B,EAAQ,oBAEpB+sC,EAAO1lE,SAASC,cAAc,QAE9BuM,EAAO,gBACPikC,EAAW,wBAEXswC,EAAW,IAAI,KAAI,CACvB9Z,WAAY,IAAI,IAAW,CACzB9f,QAAS,6BACT36C,KAAAA,EACAnL,MAAO,QACPovC,SAAAA,IAEF8kB,gBAAiB,4CAGbyrB,EAAe,IAAI,KAAI,CAC3B/Z,WAAY,IAAI,IAAW,CACzBz6D,KAAAA,EACAnL,MAAO,YACPovC,SAAAA,IAEF8kB,gBAAiB,wCAEnB,QAAMyrB,EAAa/Z,WAAWvzD,KAAM,iCAAkC,CAAC,EAAAlP,SAAW,IAAM,SAExFkhE,EAAKrlE,OAAO0gF,EAAShhF,UAAWihF,EAAajhF,WAC7CA,EAAUM,OAAOqlE,GAGnB,GAAG,KAA0B,CAC3B,MAAM3lE,EAAY44B,EAAQ,sBAEpB+sC,EAAO1lE,SAASC,cAAc,QAE9BuM,EAAO,gBACPikC,EAAW,wBAEXwwC,EAAgB,IAAI,KAAI,CAC5Bha,WAAY,IAAI,IAAW,CACzB9f,QAAS,0BACT36C,KAAAA,EACAnL,MAAO,aACPovC,SAAAA,MAIEywC,EAAW,IAAI,KAAI,CACvBja,WAAY,IAAI,IAAW,CACzB9f,QAAS,qBACT36C,KAAAA,EACAnL,MAAO,QACPovC,SAAAA,MAIJi1B,EAAKrlE,OAAO4gF,EAAclhF,UAAWmhF,EAASnhF,WAC9CA,EAAUM,OAAOqlE,GAGnB,CACE,MAAM3lE,EAAY44B,EAAQ,sBAEpB+sC,EAAO1lE,SAASC,cAAc,QAE9BuM,EAAO,cACPikC,EAAW,sBAEX0wC,EAA4D,CAChE,CAAC,MAAO,0BACR,CAAC,MAAO,2BAGJ/7B,EAAO+7B,EAAQhyE,KAAI,EAAEiyE,EAAQjhC,KACrB,IAAI,KAAI,CAClB8mB,WAAY,IAAI,IAAW,CACzB9f,QAAShH,EACT3zC,KAAAA,EACAnL,MAAO+/E,EACP3wC,SAAAA,QAOAxP,EC3MG,SAAoB2Q,EAAqByvC,GAAW,GACjE,OCAa,SAAqBzvC,EAAqB0vC,EAA8BD,GAAW,GAChG,MAKME,EAAY3vC,EAKlB,IAAI3jC,EAQJ,OAZIozE,IACFzvC,EAAWzlB,GAAA,GAIb,SAAUq1D,IACR5vC,IACA3jC,EAAUqvD,GAAA,aAAekkB,EAAKF,KAFhC,GAKA1vC,EAAW2vC,EAhBI,KACbr5E,aAAa+F,IDFRwzE,CAAY7vC,GAAU,IAAuC,KAAhC,IAAK,IAAI31B,MAAOylE,eAAsBL,GD0MvDM,EAAW,KACxB,MAAM32E,EAAO,IAAIiR,KAEjBklE,EAAQznF,SAAQ,EAAE0nF,GAAS1jF,KACzB,MAAMya,EAAMnN,EAAK42E,mBAAmB,cAAgBR,EAAQ,CAC1DS,KAAM,UACNC,OAAQ,YAGV18B,EAAK1nD,GAAKuxB,SAAS/hB,YAAciL,QAIrCvjB,KAAK65E,cAAclsE,iBAAiB,UAAW0+B,GAE/CykC,EAAKrlE,UAAU+kD,EAAKj2C,KAAK4f,GAAQA,EAAIhvB,aACrCA,EAAUM,OAAOqlE,GAGnB,CACE,MAAM3lE,EAAY44B,EAAQ,SAEpBopD,EAAuB,IAAI,KAAc,CAC7Ct5E,KAAM,kCACN+D,KAAM,gBACNikC,SAAU,yBACVnqC,eAAgB1R,KAAK0R,iBAEjB07E,EAAmB,IAAI,KAAc,CACzCv5E,KAAM,2BACN+D,KAAM,YACNikC,SAAU,qBACVnqC,eAAgB1R,KAAK0R,iBAGvBvG,EAAUM,QACR,QAA2B0hF,GAAsBhiF,WACjD,QAA2BiiF,GAAkBjiF,WAIjD,CACE,MAAM44B,EAAU,IAAI2xC,GAAe,CAAC99D,KAAM,2CAA4CzE,QAAS,oBAEzFk6E,EAAe,IAAI,KAAI,CAC3Bh7B,aAAc,mBACd/3B,aAAa,EACb5L,UAAW,KACT1uB,KAAKg5E,OAAOC,UAAU4R,IAAqBjgE,QAE7ClZ,eAAgB1R,KAAK0R,iBAGjB47E,EAAsB,KAC1BttF,KAAKgH,SAAS8jF,oBAAoBC,mBAAmB18E,MAAM88E,GACvC,sBAAfA,EAAS17E,EACH07E,EAASG,YAETtrF,KAAKgH,SAASylD,gBAAgB8gC,uBAAuBpC,EAASqC,eAEtEn/E,MAAM1M,KACP,QAAiB,CACfw4B,IAAKkzD,EACL1rF,IAAAA,EACAiG,KAAM,cAKZ0lF,IAEAttF,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,iBAAkBstF,GAErD,MAAMH,EAAuB,IAAI,KAAc,CAC7Ct5E,KAAM,2BACN+D,KAAM,UACNikC,SAAU,4BACVnqC,eAAgB1R,KAAK0R,iBAEjB+7E,EAAoB,IAAI,KAAc,CAC1C55E,KAAM,iCACN+D,KAAM,OACNikC,SAAU,yBACVnqC,eAAgB1R,KAAK0R,iBAGjBg8E,EAAmC,GAEnCC,EAAkB5pD,EAAQ82C,yBAE1Bj9D,EAAgB,IAAI,KACpB2vC,EAAmB,CAACzK,EAAmChoB,EAA+B,YAC1F,MAAMX,EAAM,IAAI,KAAI,CAClBrrB,OAAO,EAAA0Z,EAAA,GAAcs6B,EAAWh0C,OAChC6xD,gBAAiB,WACjB+R,iBAAkB,CAAC5vB,EAAWpyB,OAC9B4J,aAAa,EACb5L,UAAW,KACT,IAAI,KAAc,CAAC/mB,GAAIm7C,EAAWn7C,GAAIo7C,YAAaD,EAAWC,cAAch4B,QAE9ErZ,eAAgB1R,KAAK0R,iBAGvBg8E,EAAY5qC,EAAWn7C,IAAMwyB,EAE7B,MAAM7P,EAAMlf,SAASC,cAAc,OACnCif,EAAIlX,UAAUrS,IAAI,cAElB,QAAoB,CAClB4C,IAAKm/C,EACL33C,UAAWmf,EACXhqB,MAAO,mBACPsd,cAAAA,EACAgF,MAAO,GACPI,OAAQ,GACRze,UAAU,IAGZ41B,EAAIhvB,UAAUM,OAAO6e,GAErBqjE,EAAgB7yD,GAAQX,EAAIhvB,YAG9BnL,KAAKgH,SAASg8C,mBAAmB8P,iBAAiBzkD,MAAMu/E,KACtD,EAAAC,GAAA,GAAoDD,GACpD,IAAI,MAAM9qC,KAAc8qC,EAAY/gC,KAClCU,EAAiBzK,MAIrB9iD,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,sBAAuB2D,IACpD+pF,EAAY/pF,EAAIgE,KAClB4lD,EAAiB5pD,EAAK,cAI1B3D,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,oBAAqB2D,IACnD+pF,EAAY/pF,EAAIgE,MACjB+lF,EAAY/pF,EAAIgE,IAAIwD,UAAU5I,gBACvBmrF,EAAY/pF,EAAIgE,QAI3Bo8B,EAAQvxB,QAAQ/G,OACd4hF,EAAaliF,WACb,QAA2BgiF,GAAsBhiF,WACjD,QAA2BsiF,GAAmBtiF,WAEhDnL,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,YAInCgkC,SACKnvC,KAAK6xB,OACN7xB,KAAK6xB,OACL7xB,KAAK6xB,KAAO,O,0BG7VH,MAAMi8D,WAA0B,IAWtCz3E,qBACL,MAAO,CACL03E,aAAcvwE,EAAA,+BAAuC,OACrDgf,KAAMhf,EAAA,qCACNwwE,SAAUxwE,EAAA,wCAAgDA,EAAA,oBAIjDqU,KAAKlxB,G,qCAChBX,KAAKmL,UAAUiI,UAAUrS,IAAI,0BAC7Bf,KAAKy1E,SAAS,qBAEd,MAAMl1B,EAA4B,IAE3BwtC,EAAcvxD,EAAMwxD,SAAkBttE,QAAQkI,IAAI,CAACjoB,EAAEotF,aAAcptF,EAAE67B,KAAM77B,EAAEqtF,WAEpF,CACE,MAAMjqD,EAAU60C,GAAgB54E,KAAK4vB,gBAAY5rB,EAAW,mBACtD2xE,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3Bf,KAAKiuF,oBAAsB,IAAI,KAAW,CACxCjoD,MAAO,6BACPpuB,KAAM,aACNogD,UAAW,KAEbh4D,KAAKkuF,mBAAqB,IAAI,KAAW,CACvCloD,MAAO,sCACPpuB,KAAM,YACNogD,UAAW,KAEbh4D,KAAKmuF,cAAgB,IAAI,KAAW,CAClCnoD,MAAO,uBACPpuB,KAAM,MACNogD,UAAW+1B,IAGbpY,EAAalqE,OAAOzL,KAAKiuF,oBAAoB9iF,UAAWnL,KAAKkuF,mBAAmB/iF,UAAWnL,KAAKmuF,cAAchjF,WAE9G,MAAMgI,EAAU/H,SAASC,cAAc,OACvC8H,EAAQC,UAAUrS,IAAI,YACtB,QAAM,CAACmB,QAASiR,EAAS5G,IAAK,oBAE9Bg0C,EAAYl+C,KAAKrC,KAAKiuF,oBAAqBjuF,KAAKkuF,mBAAoBluF,KAAKmuF,eAEzEnuF,KAAKouF,SAAW,IAAI,KAAS,CAC3BrmF,OAAQyV,EAAA,OACR+iC,YAAAA,EACA7uC,eAAgB1R,KAAK0R,iBAGvB1R,KAAKwS,QAAQ/G,OAAOzL,KAAKouF,SAASztC,SAElC5c,EAAQt4B,OAAOzL,KAAKouF,SAASrtC,WAAW51C,UAAWwqE,GAGrD,CACE,MAAM5xC,EAAU,IAAI2xC,GAAe,CACjC99D,KAAM,uBACNzE,SAAS,IAGLwiE,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3Bf,KAAKquF,mBAAqB,IAAI,KAAmB,CAC/CroD,MAAO,6BACPpuB,KAAM,WACN2Q,WAAW,EACX7W,eAAgB1R,KAAK0R,eACrBqe,SAAU,KACR/vB,KAAKouF,SAAS1tC,eACd1gD,KAAKsuF,iBAEPC,cAAe,iCACfC,UAAW,6BACXC,YAAa,gCACZzuF,KAAKgH,UAER2uE,EAAalqE,OAAOzL,KAAKquF,mBAAmBljF,WAE5C,MAAMgI,EAAU4wB,EAAQ5wB,QACxBA,EAAQ1H,QAAO,QAAK,uCACpB0H,EAAQ1H,OAAOL,SAASC,cAAc,MAAOD,SAASC,cAAc,OAEpE,MAAMqjF,EAAsB1uF,KAAK0uF,oBAAsBtjF,SAASC,cAAc,OAC9EqjF,EAAoBt7E,UAAUrS,IAAI,yBAElC,MAAM4tF,EAAmB3uF,KAAK2uF,iBAAmBzU,IAEjDwU,EAAoBjjF,QAAO,QAAK,mBAAoB,CAACkjF,KAErDx7E,EAAQ1H,OAAOijF,GAEfnuC,EAAYl+C,KAAKrC,KAAKquF,oBACtBtqD,EAAQvxB,QAAQ/G,OAAOkqE,GACvB31E,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,YAGjC,QAAiBnL,KAAKouF,SAASztC,SAAS,KACtC3gD,KAAKouF,SAASztC,QAAQjS,UAAW,EAEjC,MAAMjX,EAA2B,GAE3Bm3D,EAAiB5uF,KAAKgH,SAASo4B,kBAAkByvD,cACrD7uF,KAAKiuF,oBAAoBxhF,MACzBzM,KAAKkuF,mBAAmBzhF,MACxBzM,KAAKmuF,cAAc1hF,OAErBgrB,EAASp1B,KAAKusF,EAAevgF,MAAK,KAChCrO,KAAKyS,WACHlN,IACF4G,QAAQwf,MAAM,uBAAwBpmB,OAGrCvF,KAAKouF,SAASjuC,cACf1oB,EAASp1B,KAAKrC,KAAKouF,SAASjuC,eAAe9xC,MAAMgoE,GACxCr2E,KAAKgH,SAASo4B,kBAAkB0vD,mBAAmBzY,MAI3Dr2E,KAAKquF,mBAAmB/0B,mBACzB7hC,EAASp1B,KAAKrC,KAAKgH,SAASy1B,gBAAgBsyD,eAAe/uF,KAAKquF,mBAAmB5hF,QAGrFiU,QAAQuyC,KAAKx7B,GAAU5f,SAAQ,KAC7B7X,KAAKouF,SAASztC,QAAQ0C,gBAAgB,iBAEvC,CAAC3xC,eAAgB1R,KAAK0R,iBAEzB1R,KAAKiuF,oBAAoBz0B,iBAAiBh9B,EAAK6zC,YAAY,GAC3DrwE,KAAKkuF,mBAAmB10B,iBAAiBh9B,EAAK8zC,WAAW,GACzDtwE,KAAKmuF,cAAc30B,iBAAiBw0B,EAASntB,OAAO,GACpD7gE,KAAKquF,mBAAmB70B,iBAAiBh9B,EAAKF,UAAU,GAExDt8B,KAAKsuF,gBACLtuF,KAAKouF,SAAS1tC,gB,+RAGR4tC,gBACHtuF,KAAKquF,mBAAmBh+D,MAAMjd,UAAUqB,SAAS,WAAazU,KAAKquF,mBAAmB5hF,MAAM5J,OAC7F7C,KAAK0uF,oBAAoBpjF,MAAM2b,QAAU,QAEzCjnB,KAAK0uF,oBAAoBpjF,MAAM2b,QAAU,GACzCjnB,KAAK2uF,iBAAiB3lE,YAAYhpB,KAAK2uF,iBAAmBzU,EAAW,CAACC,OAAQn6E,KAAKquF,mBAAmB5hF,W,4UCzJ7F,MAAMuiF,WAA4B,IACxCn9D,OACL7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,0BAA2B,eACxDf,KAAKy1E,SAAS,+CAEd,MAAMwZ,EAAiB9hE,IAKrB,MAAM4W,EAAU,IAAI2xC,GAAe,CACjC99D,KAAMuV,EAAQvV,OAGVs3E,EAAa,IAAI,KAAI,CACzBnpD,cAAe,IAAI,KAAc,CAAClyB,KAAMsZ,EAAQgiE,SAAU5qD,SAAS,IACnEo8B,gBAAiB,UACjBjvD,eAAgB1R,KAAK0R,eACrBkhE,sBAAsB,IAGlBwc,EAAoB,IAAI,KAAI,CAChCrpD,cAAe,IAAI,KAAc,CAAClyB,KAAM,iBAAkB0wB,SAAS,IACnEo8B,gBAAiB,UACjBjvD,eAAgB1R,KAAK0R,eACrBkhE,sBAAsB,IAGxB7uC,EAAQvxB,QAAQ/G,OAAOyjF,EAAW/jF,UAAWikF,EAAkBjkF,WAE/DnL,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAE/B,MAAMkkF,EAAkB,CAAC5/E,EAAG0d,EAAQusD,UAC9Bt1D,EAAMpkB,KAAKgH,SAASi6D,wBAAwBquB,kBAAkBD,IACnEjrE,aAAe1D,QAAU0D,EAAM1D,QAAQxS,QAAQkW,IAAM/V,MAAMkhF,IAC1D,MAAMC,EAAgB,IAAW,mCAC/B,MAAM1iF,QAAc9M,KAAKgH,SAASi6D,wBAAwBwuB,QAAQF,GAIlE,OAHAL,EAAWnpD,cAAcxB,SAAWz3B,EACpCsiF,EAAkBrpD,cAAcxB,QAAUgrD,EAAeG,cAElD5iF,KAGT0iF,IAEAxvF,KAAK65E,cAAclsE,iBAAiB,WAAW,IAAW,mCACxD,MAAMgiF,GAAQT,EAAWnpD,cAAcxB,QACjCqrD,EAAeR,EAAkBrpD,cAAcxB,QAErD,GAAGorD,WAAgB3vF,KAAKgH,SAASi6D,wBAAwBwuB,QAAQF,KAAoBK,IAAiBL,EAAeG,cACnH,OAGF,MAAMG,GAAqB,EAAAxtD,GAAA,GAAKktD,GAChCM,EAAcpgF,EAAI,0BAClBogF,EAAcC,WAAaH,EAAO,MAAa,EAC/CE,EAAcH,cAAgBE,EAE9B5vF,KAAKgH,SAASi6D,wBAAwB8uB,qBAAqBV,EAAiBQ,OAC3E,CAAC7hF,MAAM,IAEVhO,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,mBAAoBw9B,IACrD,MAAMk8C,EAAWqG,GAAqBviD,EAAO9B,KAAKjsB,GAC/C0d,EAAQusD,WAAaA,IACtB6V,EAAiB/xD,EAAOwyD,gBACxBR,YAMRP,EAAc,CACZr3E,KAAM,4BACNu3E,SAAU,+BACVzV,SAAU,qBAGZuV,EAAc,CACZr3E,KAAM,sBACNu3E,SAAU,yBACVzV,SAAU,qBAGZuV,EAAc,CACZr3E,KAAM,wBACNu3E,SAAU,2BACVzV,SAAU,0BAGZ,CACE,MAAM31C,EAAU,IAAI2xC,GAAe,CACjC99D,KAAM,uBAGFq4E,EAAoB,IAAI,KAAI,CAChClqD,cAAe,IAAI,KAAc,CAAClyB,KAAM,gBAAiB0wB,SAAS,IAClEo8B,gBAAiB,UACjBjvD,eAAgB1R,KAAK0R,eACrBkhE,sBAAsB,IAGlBsd,EAAW,IAAI,KAAI,CACvBnqD,cAAe,IAAI,KAAc,CAAClyB,KAAM,sBAAuB0wB,SAAS,EAAMsX,SAAU,+BAAgCnqC,eAAgB1R,KAAK0R,iBAC7IivD,gBAAiB,UACjBjvD,eAAgB1R,KAAK0R,eACrBkhE,sBAAsB,IAGxB,gBAA2BvkE,MAAM+d,IAC/B8jE,EAASnqD,cAAcxB,QAAUnY,EAAM81D,SAASnhB,cAAcovB,SAGhEpsD,EAAQvxB,QAAQ/G,OAAOwkF,EAAkB9kF,UAAW+kF,EAAS/kF,WAE7DnL,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAE/BnL,KAAKgH,SAASi6D,wBAAwBmvB,+BAA+B/hF,MAAMmD,IACzEy+E,EAAkBlqD,cAAcxB,QAAU/yB,EAE1CxR,KAAK65E,cAAclsE,iBAAiB,WAAW,KAC7C,MAAM00E,EAAW4N,EAAkBlqD,cAAcxB,QAC9C/yB,IAAY6wE,GACbriF,KAAKgH,SAASi6D,wBAAwBovB,8BAA8BhO,KAErE,CAACr0E,MAAM,SClIH,MAAMsiF,WAAuB,IACnCj6E,qBACL,MAAO,CACLk6E,WAAY/yE,EAAA,yCAAiD,wBAAyB,CACpFgzE,UAAW,QAKbC,WAAY/vE,QAAQxS,QAAQ,KAIzB2jB,KAAKlxB,GACVX,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKmL,UAAUiI,UAAUrS,IAAI,sBAC7Bf,KAAKy1E,SAAS,mCAEd,MAAM1xC,EAAU,IAAI2xC,GAAe,IAE7B+C,EAA8B,IAAIl3E,IAElC+M,EAAUoS,QAAQkI,IAAI,CAC1BjoB,EAAE4vF,WACF5vF,EAAE8vF,aACDpiF,MAAK,EAAEkiF,EAAYE,MACpB,MAAMC,EAAwB,IAAItvF,IAC5BuvF,EAAeJ,EAAWh2E,KAAKq2E,GAAaA,EAASC,YAErDz5C,GAAS,SACfm5C,EAAWjyE,OAAOmyE,GAAY3rF,SAAS8rF,IACrC,GAAGF,EAASrtF,IAAIutF,EAASC,WAAY,OACrCH,EAAS3vF,IAAI6vF,EAASC,WAEtB,MAAM12D,EAAM,IAAI,KAAI,CAClBk4C,WAAY,IAAI,IAAW,CACzBx+D,KAAM+8E,EAASh5E,KACfA,KAAMw/B,EACN3qC,MAAOmkF,EAASC,YAElBx2D,SAAUu2D,EAASE,cAGrBrY,EAAU90E,IAAIitF,EAASC,UAAW12D,MAGpC,MAAM22C,GAAO,QAAkB,IAAI2H,EAAUnyC,WAAY75B,IACvD,iBAAiBA,EAAOkkF,EAAa/7E,SAASnI,OAGhD,wBAAwB4B,MAAM0iF,IAC5B,MAAM52D,EAAMs+C,EAAUx1E,IAAI8tF,EAASF,WAC/B12D,EAKJA,EAAIk4C,WAAWr2B,kBAAiB,GAJ9B7vC,QAAQwf,MAAM,SAAUwO,EAAK42D,MAOjChtD,EAAQvxB,QAAQ/G,OAAOqlE,MAKzB,OAFA9wE,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAExBmD,G,gDCnEJ,SAAS0iF,GAA4BpvF,EAAkCkN,EAAoB4C,GAChG,MAAMqyB,EAAU,IAAI2xC,GAAe,CAAC99D,KAAM9I,IAEpCvC,EAAM,yBAA2B3K,EAAO,IACxCqvF,EAAwB,IAAI,KAAc,CAC9Cp9E,KAAM,uBACN+D,KAAM,WACNikC,SAAUtvC,EAAM,WAChBmF,eAAAA,IAEIw/E,EAAuB,IAAI,KAAc,CAC7Cr9E,KAAM,2BACN+D,KAAM,UACNikC,SAAUtvC,EAAM,UAChBmF,eAAAA,IAEIy/E,EAAsB,IAAI,KAAc,CAC5Ct9E,KAAM,yBACN+D,KAAM,SACNikC,SAAUtvC,EAAM,SAChBmF,eAAAA,IAEI0/E,EAAwB,IAAI,KAAc,CAC9Cv9E,KAAM,uBACN+D,KAAM,WACNikC,SAAUtvC,EAAM,WAChBmF,eAAAA,IAUF,OAPAqyB,EAAQvxB,QAAQ/G,QACd,QAA2BwlF,GAAuB9lF,WAClD,QAA2B+lF,GAAsB/lF,WACjD,QAA2BgmF,GAAqBhmF,WAChD,QAA2BimF,GAAuBjmF,WAG7C44B,EAGM,MAAMstD,WAAgC,IAC5Cx/D,OACL7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKy1E,SAAS,sBAEd,MAAM1xC,EAAUitD,GAA4B,QAAS,0BAA2BhxF,KAAK0R,gBACrF1R,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,YC5CpB,MAAMmmF,WAA+B,IAC3Cz/D,OACL7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKy1E,SAAS,qBAEd,MAAM8b,GAAgB,EAAAp4E,GAAA,IAAUq4E,IAC9BxxF,KAAKgH,SAAS6/E,gBAAgB4K,SAAS,yCAA0CD,KAChF,KAAK,GAAO,GAETztD,EAAUitD,GAA4B,OAAQ,yBAA0BhxF,KAAK0R,gBAE7EggF,EAAM,OAGNC,EAAYC,SAEZJ,EAAUh0E,EAAA,yCACV/Q,EAAQlG,KAAKusC,KAAKvsC,KAAKusC,MAAM0+C,EAAUE,GAAOC,IAC9CE,EAAO,IAAI,iBAAiB,CAChCtlF,IAAK,4BACLqkD,KAAM,EAAC,EAAAkhC,GAAA,GAAYN,MAEf3rC,EAAQ,IAAI4lC,GAAqB,0BAA2B,IAAMh/E,EAAO,EAAG,GAAG,GACrFo5C,EAAM91B,SAAYtjB,IAChB,MAAM+kF,EAAW,SAAA/kF,EAAS,GAAIklF,EAAYD,EAAO,EAEjDG,EAAKE,iBAAiB,CAACnhC,KAAM,EAAC,EAAAkhC,GAAA,GAAYN,MAE1CD,EAAcC,IAGhB3rC,EAAMkmC,eAAetgF,OAAOomF,EAAK3vF,SAEjC6hC,EAAQvxB,QAAQ/G,OAAOo6C,EAAM16C,WAE7BnL,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,YCxCpB,MAAM6mF,WAAgC,IAC5CngE,OACL7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKy1E,SAAS,sBAEd,MAAM1xC,EAAUitD,GAA4B,QAAS,0BAA2BhxF,KAAK0R,gBACrF1R,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,YCWnC,MAAM8mF,GAAmF,CACvFh1D,SAAU,uBACVi1D,QAAS,iBACTjuF,OAAQ,qBACRkuF,SAAU,wBAGG,MAAMC,WAA6B,IACnCvgE,O,qCACX7xB,KAAKwjD,OAAOpwC,UAAUrS,IAAI,eAC1Bf,KAAKy1E,SAAS,gBAEd,CACE,MAAM1xC,EAAU,IAAI2xC,GAAe,CAAC99D,KAAM,yBAA0BzE,QAAS,0BAEvEiZ,QAAc,gBAEdimE,EAAoB,IAAI,KAAc,CAC1Cx+E,KAAM,oBACN+D,KAAM,OACN2sB,SAAUnY,EAAM81D,SAASoQ,gBAAgB9kF,OAAOkhC,SAChDh9B,eAAgB1R,KAAK0R,iBAGjB6gF,EAAU,IAAI,KAAI,CACtBxsD,cAAessD,EACf3gF,eAAgB1R,KAAK0R,iBAGjBqe,EAAW,MACf,EAAA6rB,EAAA,GAAiB,CAACmuC,IAChB,EAAAyI,GAAA,GAAUpmE,EAAM81D,SAASp2C,aAAc,8BACvC,EAAA0mD,GAAA,GAAUpmE,EAAM81D,SAASoQ,gBAAiB,iCAGxCG,EAAe,KACnBzyF,KAAK0yF,wBAAwBC,EAAUvmE,EAAM81D,SAASp2C,aAAa5T,OACnEl4B,KAAK0yF,wBAAwBE,EAAUxmE,EAAM81D,SAASp2C,aAAa7lC,OACnEjG,KAAK0yF,wBAAwBG,EAASzmE,EAAM81D,SAASp2C,aAAaq5B,KAAM/4C,EAAM81D,SAASoQ,gBAAgBQ,gBAGnGC,EAAWC,IACf,MAAMjgF,EAAM/S,KAAKg5E,OAAOC,UAAU+Z,GAClCjgF,EAAI6X,OAEJ5qB,KAAK0R,eAAe3Q,IAAIgS,EAAI8mE,cAA5B75E,CAA2C,WAAW,KACpDyyF,IACA1iE,MACC,CAAC/hB,MAAM,KAGN2kF,EAAW,IAAI,KAAI,CACvBtgC,aAAc,qBACdh4B,SAAU,GACV3L,UAAW,KACTqkE,EAAQ1B,KAEV3/E,eAAgB1R,KAAK0R,iBAGjBkhF,EAAW,IAAI,KAAI,CACvBvgC,aAAc,qBACdh4B,SAAU,GACV3L,UAAW,KACTqkE,EAAQf,KAEVtgF,eAAgB1R,KAAK0R,iBAGjBmhF,EAAU,IAAI,KAAI,CACtBxgC,aAAc,oBACdh4B,SAAU,GACV3L,UAAW,KACTqkE,EAAQzB,KAEV5/E,eAAgB1R,KAAK0R,iBAGjBq4E,GAAc,OAAO,sCAAuC,CAACn2E,KAAM,SAAUC,KAAM,iCACzF,QAAiBk2E,GAAa,MAC5B,EAAAhtC,GAAA,GAAkB,CAChBsV,aAAc,wCACdC,mBAAoB,mCACpBt8C,OAAQ,CACNu8C,QAAS,WAEVlkD,MAAK,KACN,MAAM6zE,EAAW1kE,EAAA,WACjB0kE,EAASoQ,iBAAkB,EAAAjwD,GAAA,GAAK,+BAChC6/C,EAASp2C,cAAe,EAAAzJ,GAAA,GAAK,4BAC7BjW,EAAM81D,SAAWA,EACjBliF,KAAKgH,SAAS6/E,gBAAgB4K,SAAS,WAAYvP,GAEnDuQ,IACAJ,EAAkB9tD,SAAWnY,EAAM81D,SAASoQ,gBAAgB9kF,OAAOkhC,eAIvE,MAAMukD,EAAmB,KACvB,MAAMvkD,GAAY2jD,EAAkB9tD,QAE9B29C,EAAW1kE,EAAA,WACdkxB,EACDwzC,EAASoQ,gBAAgB9kF,OAAOkhC,UAAW,SAEpCwzC,EAASoQ,gBAAgB9kF,OAAOkhC,SAGzC,CAACikD,EAAUC,EAAUC,GAAS/tF,SAASq1B,IACrCA,EAAIhvB,UAAUiI,UAAUxJ,OAAO,cAAe8kC,MAGhD1uC,KAAKgH,SAAS6/E,gBAAgB4K,SAAS,WAAYvP,GAEnDnyD,KAGFsiE,EAAkBhiE,MAAM1iB,iBAAiB,SAAUslF,GACnDA,IACAR,IAEA1uD,EAAQvxB,QAAQ/G,OACd8mF,EAAQpnF,UACRwnF,EAASxnF,UACTynF,EAASznF,UACT0nF,EAAQ1nF,UACR4+E,GAGF/pF,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAGjC,CACE,MAAM44B,EAAU,IAAI2xC,GAAe,CAAC99D,KAAM,kBAE1CmsB,EAAQvxB,QAAQ/G,OAAO,IAAI,KAAI,CAC7Bs6B,cAAe,IAAI,KAAc,CAC/BlyB,KAAM,cACN+D,KAAM,OACNikC,SAAU,yBACVnqC,eAAgB1R,KAAK0R,iBAEvBA,eAAgB1R,KAAK0R,iBACpBvG,UAAW,IAAI,KAAI,CACpB46B,cAAe,IAAI,KAAc,CAC/BlyB,KAAM,gBACN+D,KAAM,SACNikC,SAAU,2BACVnqC,eAAgB1R,KAAK0R,iBAEvBA,eAAgB1R,KAAK0R,iBACpBvG,WAEHnL,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,a,+RAI3BunF,wBAAwBv4D,EAAU+nD,EAAwCsP,GAChF,IAAIjlF,EACJ,MAAMqkD,EAA2B,GAE3BsiC,EAAWhvF,OAAOC,KAAK+9E,GACvBiR,EAAcD,EAAS34E,KAAKhO,GAAQ21E,EAAS31E,GAAO0lF,GAAuB1lF,QAAOvI,IAAWs0B,OAAOC,SAC1G,GAAI46D,EAAYtwF,QAAsB,IAAZ2uF,EAEnB,CACL,MAAM4B,EAAQD,EAAYtwF,SAAWqwF,EAASrwF,OAQ9C,QAPemB,IAAZwtF,GACDjlF,EAAM6mF,EAAQ,6BAA+B,wBAC7CxiC,EAAKvuD,MAAK,EAAAyvF,GAAA,GAAYN,KAEtBjlF,EAAM6mF,EAAQ,yBAA2B,qBAGvCA,EAAO,CACT,MAAM99B,EAAWlqD,SAASC,cAAc,QACxCiqD,EAAS7pD,WAAU,QAAK0nF,EAAY54E,KAAKhO,IAAQ,QAAKA,MAAO,GAAM,IACnEqkD,EAAKvuD,KAAKizD,SAbZ/oD,EAAM,mBAiBR,EAAAwc,EAAA,GAAeoR,EAAIE,UAAU,QAAK9tB,EAAKqkD,K,uVC/K5B,MAAMoqB,WAAuB,IAA5C,c,oBACU,KAAAtnE,QAOJ,GASSme,O,0CACX7xB,KAAKmL,UAAUiI,UAAUrS,IAAI,sBAC7Bf,KAAKy1E,SAAS,YAEd,MAAM/6D,GAAU,OAAiB,CAAChJ,eAAgB1R,KAAK0R,gBAAiB,cAAe,CAAC,CACtFkC,KAAM,SACNC,KAAM,qBACNC,QAAS,KACP,IAAI,IAAU,SAAU,CACtBu+C,aAAc,SACdC,mBAAoB,qBACpB5+C,QAAS,CAAC,CACR6+C,QAAS,SACTvV,SAAU,KACRh9C,KAAKgH,SAAS0rD,WAAW2gC,UAE3BhqB,UAAU,MAEXt+C,WAIP/qB,KAAK0T,QAAQ4/E,MAAO,QAAW,QAE/BtzF,KAAKwjD,OAAO/3C,OAAOzL,KAAK0T,QAAQ4/E,KAAM54E,GAEtC1a,KAAKuzF,QAAU,IAAI,KAAYvzF,KAAKgH,SAAUhH,KAAK4vB,WAAY5vB,KAAK0R,gBAAgB,GACpF1R,KAAKuzF,QAAQ1hE,OACb7xB,KAAKuzF,QAAQzzB,QAAQtiD,EAAA,QACrB,MAAMg2E,EAAcxzF,KAAKuzF,QAAQpxB,sBAE3BsxB,GAAkB,OAAO,wDAAyD,CAAC7/E,KAAM,eAC/F,QAAiB6/E,GAAiB,KAChC,MAAMnwF,EAAS8H,SAASC,cAAc,UACtC,iBAAyB,MAAauf,KAAKtnB,GAASowF,IAClDA,IAASrlF,MAAMgoE,GACNr2E,KAAKgH,SAASo4B,kBAAkB0vD,mBAAmBzY,UAG7D,CAAC3kE,eAAgB1R,KAAK0R,iBACzB1R,KAAKuzF,QAAQrxF,QAAQgkB,iBAAiB9Q,kBAAkB3J,OAAOgoF,GAE/D,MAAME,EAAwB,IAAW,mC,MACvC,MAAMn3D,QAAax8B,KAAKgH,SAASy1B,gBAAgB49C,UACjDoZ,EAAgBrgF,UAAUxJ,OAAO,OAA0B,sBAAR,QAAV,EAAA4yB,EAAKtE,aAAK,eAAEzoB,OAGvDkkF,IACA3zF,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,iBAAkB+H,IAChDyV,EAAA,SAAmBzV,GACpB4rF,OA8CJ,MAAMt1E,EAAajT,SAASC,cAAc,OAC1CgT,EAAWjL,UAAUrS,IAAI,mBAMzB,MAAM++B,EAAI,CACRlsB,EACAC,EACA6sB,EACAkzD,KASA,IAAIA,EAAa,CACf,MAAMziD,EAAKzQ,EAAmCkzD,YAC3CziD,IAEDyiD,EAAc,IAAM,CAACziD,EAAEnxC,QAI3B,MAAO,CACL4T,KAAAA,EACAC,KAAAA,EACAm/E,eAAgBtyD,EAChBkzD,YAAAA,EACAhjC,KAAMgjC,MAAAA,OAAW,EAAXA,MAgBJpjC,EARI,CACR1wB,EAAE,SAAU,gCAAiCkvD,IAC7ClvD,EAAE,OAAQ,eAAgBsyD,IAC1BtyD,EAAE,OAAQ,qCAAsCogD,IAChDpgD,EAAE,WAAY,yCAA0CksD,IACxDlsD,EAAE,SAAU,0BAA2B,OAG1BvlB,KAAKvX,IAClB,MAAM,KAAC4Q,EAAMC,KAAM03C,EAAW,eAAEynC,EAAc,YAAEY,GAAe5wF,EAC/D,OAAO,IAAI,KAAI,CACbqvD,aAAc9G,EACd33C,KAAAA,EACA8a,UAAW,IAAW,mCACpB,MAAMkiC,EAAO5tD,EAAK4tD,WAAa5tD,EAAK4tD,KAAO,GACrC79C,EAAM/S,KAAKg5E,OAAOC,UAAU+Z,GAClCjgF,EAAI6X,QAAQgmC,GAET79C,aAAe,KAA2B6gF,GAC3C7gF,EAAI8mE,cAAclsE,iBAAiB,gBAAiBW,IAClDtL,EAAK4tD,KAAOtiD,EAAQD,MAAK,IAAMulF,YAIrCliF,eAAgB1R,KAAK0R,oBAInBmiF,EAAevD,GAAesD,cACpCpjC,EAAKnuD,KACHrC,KAAK8zF,WAAa,IAAI,KAAI,CACxBzhC,aAAc,UACdygB,oBAAqB,IACrBl/D,KAAM,iBACN8a,UAAW,IAAW,mCAChB1uB,KAAKi/E,uBACDj/E,KAAKihF,wBAGb,MAAMluE,EAAM/S,KAAKg5E,OAAOC,UAAUqF,IAClCvrE,EAAIksE,eAAiBj/E,KAAKi/E,eAC1BlsE,EAAI8mE,cAAclsE,iBAAiB,WAAW,KAC5C3N,KAAKi/E,oBAAiBj7E,EACtBhE,KAAKihF,sBAAqB,KACzB,CAACjzE,MAAM,IACV+E,EAAI6X,UAENlZ,eAAgB1R,KAAK0R,iBAGvB1R,KAAK+zF,YAAc,IAAI,KAAI,CACzB1hC,aAAc,2BACdygB,qBAAqB,QAAK,gBAC1Bl/D,KAAM,WACN8a,UAAW,KACT1uB,KAAKg5E,OAAOC,UAAUqX,IAAgB1lE,KAAKipE,IAE7CniF,eAAgB1R,KAAK0R,kBAIzB2M,EAAW5S,UAAU+kD,EAAKj2C,KAAK4f,GAAQA,EAAIhvB,aAK3C,MAAM6oF,EAAiB,IAAIte,GAC3Bse,EAAexhF,QAAQ/G,OAAO4S,GAE9Bre,KAAK4vB,WAAWnkB,OAAOzL,KAAKuzF,QAAQrxF,QAAuC8xF,EAAe7oF,WAE1F,MAAM8oF,EAAqB,KACzBC,EAAkBpG,GAAkB8F,eAEtC,IAAIM,GACJ,QAAiBl0F,KAAK0T,QAAQ4/E,MAAM,KACtBtzF,KAAKg5E,OAAOC,UAAU6U,IAC9BljE,KAAKspE,KACR,CAACxiF,eAAgB1R,KAAK0R,iBACzBuiF,IAMAj0F,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,eAAgBqhE,IAC9C7jD,EAAA,oBAA8B6jD,GAC/B4yB,OAIJE,GAAA,sBAEAn0F,KAAKihF,6BAECuS,KAGAY,kBAAkBC,GACxB,GAAGr0F,KAAKs0F,2BAA6BD,EAAW,OAAOr0F,KAAKs0F,yBAE5D,MAAMhmF,EAAUtO,KAAKs0F,yBAA2Bt0F,KAAKgH,SAAS0rD,WAAW0sB,UAAU,6BAClFvnE,SAAQ,KACJ7X,KAAKs0F,2BAA6BhmF,IACnCtO,KAAKs0F,8BAA2BtwF,MAIpC,OAAOsK,EAGF2yE,qBAAqBoT,GAC1B,OAAOr0F,KAAKo0F,kBAAkBC,GAAWhmF,MAAMy0E,IAC7C9iF,KAAKi/E,eAAiB6D,EAAM7D,eAC5Bj/E,KAAK8zF,WAAW15D,WAAW9hB,YAAc,GAAKtY,KAAKi/E,eAAep8E,UAI/Ds/C,sBAEL,OADAniD,KAAKuzF,QAAQzvF,UACNiO,MAAMowC,uBCjSF,MAAMoyC,WAAyB,IAA9C,c,oBACU,KAAAp0C,aAAyC,KAO1CtuB,OACL7xB,KAAKmL,UAAUiI,UAAUrS,IAAI,yBAC7Bf,KAAKy1E,SAAS,cAEdz1E,KAAK+gD,WAAa,IAAI,KAAYC,IAChChhD,KAAKmgD,aAAea,KAGtB,MAAMjd,EAAU,IAAI2xC,GAAe,CACjCviE,QAAS,wCAGLwiE,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3Bf,KAAKw0F,sBAAwB,IAAI,KAAW,CAC1CxuD,MAAO,mBACPgyB,UAAW,MAGbh4D,KAAKy0F,6BAA+B,IAAI,KAAW,CACjDzuD,MAAO,iCACPgyB,UAAW,MAGb2d,EAAalqE,OAAOzL,KAAKw0F,sBAAsBrpF,UAAWnL,KAAKy0F,6BAA6BtpF,WAE5F,MAAMupF,EAAiB,KACrB10F,KAAK2gD,QAAQvtC,UAAUxJ,OAAO,eAAgB5J,KAAKw0F,sBAAsB/nF,MAAM5J,SAC5E7C,KAAKw0F,sBAAsBnkE,MAAMjd,UAAUqB,SAAS,WACpDzU,KAAKy0F,6BAA6BpkE,MAAMjd,UAAUqB,SAAS,WAGhEzU,KAAKw0F,sBAAsBnkE,MAAM1iB,iBAAiB,QAAS+mF,GAC3D10F,KAAKy0F,6BAA6BpkE,MAAM1iB,iBAAiB,QAAS+mF,GAElE10F,KAAK2gD,SAAU,OAAa,CAAC/sC,KAAM,gBAEnC,QAAiB5T,KAAK2gD,SAAS,KAC7B,MAAM7xC,EAAQ9O,KAAKw0F,sBAAsB/nF,MACnCo0D,EAAQ7gE,KAAKy0F,6BAA6BhoF,MAEhDzM,KAAK2gD,QAAQjS,UAAW,EACxB1uC,KAAKgH,SAASi4B,gBAAgBg3C,cAAc,CAC1CnnE,MAAAA,EACA+xD,MAAAA,EACA8zB,WAAW,IACVtmF,MAAMumF,IACJ50F,KAAKmgD,cACNngD,KAAKmgD,eAAe9xC,MAAMgoE,IACxBr2E,KAAKgH,SAASi4B,gBAAgBq3C,UAAUse,EAAWve,MAIvDllD,EAAA,eAA0B,CAACppB,OAAQ6sF,EAAU3iE,UAAS,KAEtD,wBAAoCjyB,MACpCA,KAAKg5E,OAAOC,UAAU,KAAkBruD,KAAK,CAC3ChpB,KAAM,UACNs3E,WAAW,EACXpqE,MAAO,kBACPvL,YAAa,gBACb41E,QAAUx1C,GACD3jC,KAAKgH,SAASi4B,gBAAgBs3C,gBAAgBqe,EAAWjxD,UAIrE,CAACjyB,eAAgB1R,KAAK0R,iBAEzB1R,KAAKwS,QAAQ/G,OAAOzL,KAAK2gD,SACzB5c,EAAQvxB,QAAQ/G,OAAOzL,KAAK+gD,WAAW51C,UAAWwqE,GAClD31E,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAG1Bg3C,sBAML,OALAniD,KAAK+gD,WAAWjgC,QAChB9gB,KAAKmgD,aAAe,KACpBngD,KAAKw0F,sBAAsB/nF,MAAQ,GACnCzM,KAAKy0F,6BAA6BhoF,MAAQ,GAC1CzM,KAAK2gD,QAAQjS,UAAW,EACjB38B,MAAMowC,uB,mCC1FF,MAAM0yC,WAA2B,KAC9C90F,cACEgS,MAAM,wDAAyD,CAAC4yD,UAAU,EAAMC,YAAa,MAAO91D,MAAO,oBAC3G9O,KAAKkL,YAGOA,Y,sCACZ,QAAiBlL,KAAKmoE,YAAY,KAChC,MAAM75D,EAAUtO,KAAKgH,SAASy1B,gBAAgBq4D,cAAcC,EAAetoF,MAAOyhF,EAAmBzhF,MAAOuoF,EAAcvoF,OAE1H6B,EAAQD,MAAK,KACXrO,KAAKooE,UACH7iE,IACc,YAAbA,EAAI3D,QACL,EAAA0pD,EAAA,IAAS,CAACC,YAAa,sCACvB6iC,EAAS1/C,UAAW,MAIxB0/C,EAASntC,gBAAgB3yC,KACxB,CAACoD,eAAgB1R,KAAK0R,iBAEzB,MAAM6uC,EAA4B,GAC5Bj2B,EAAMlf,SAASC,cAAc,OACnCif,EAAIlX,UAAUrS,IAAI,eAClB,MAAMg0F,EAAiB,IAAI,KAAW,CACpC/uD,MAAO,YACPpuB,KAAM,sBACNogD,UAAW,GACXvX,UAAU,IAENytC,EAAqB,IAAI,KAAW,CACxCloD,MAAO,WACPpuB,KAAM,0BACNogD,UAAW,KAEPg9B,EAAgB,IAAI,KAAc,CAACv0C,UAAU,IACnDF,EAAYl+C,KAAK0yF,EAAgB7G,EAAoB8G,GAErD,MAAM3xD,EAAU,KACd,MAAMzrB,EAAOm9E,EAAetoF,MAAQ,IAAMyhF,EAAmBzhF,MAE7D2hF,EAASvtC,WAAW/3B,UAAYlR,EAChCw2E,EAASvtC,WAAWrjB,UAGtBx9B,KAAK0R,eAAe3Q,IAAIg0F,EAAe1kE,MAAvCrwB,CAA8C,QAASqjC,GACvDrjC,KAAK0R,eAAe3Q,IAAImtF,EAAmB79D,MAA3CrwB,CAAkD,QAASqjC,GAE3D2xD,EAAcj9B,SAAW,MACdi9B,EAAcvoF,MAAMnH,MAAM,MAGrC,MAAMk3B,QAAax8B,KAAKgH,SAASy1B,gBAAgB49C,UAC3Cx9C,GAAY,EAAAD,GAAA,GAAkBJ,EAAKG,OACtCE,EAAUtjB,OACXy7E,EAAcvoF,MAAQ,IAAMowB,EAAUtjB,KAAKilC,cAG7C,MAAM4vC,EAAW,IAAI,KAAS,CAC5B7tC,YAAAA,EACA7uC,eAAgB1R,KAAK0R,eACrBovC,iBAAiB,EACjBH,QAAS3gD,KAAKmoE,WACdt3C,WAAY,MAGdvG,EAAI7e,OAAOspF,EAAe5pF,UAAW+iF,EAAmB/iF,UAAWijF,EAASvtC,YAC5E7gD,KAAKmL,UAAUM,OAAO6e,EAAK0qE,EAAc7pF,WAEzCnL,KAAK+qB,Q,0TC9DM,MAAMkqE,WAAuB,IAKnCpjE,OACL7xB,KAAKmL,UAAUxD,GAAK,qBAIpB,MAAM+3E,GAAS,OAAa,CAAC9rE,KAAM,MAAOgH,UAAW,eACrD5a,KAAKwS,QAAQ/G,OAAOi0E,IAEpB,QAAiBA,GAAQ,KACvB,iBAAyBmV,MACxB,CAACnjF,eAAgB1R,KAAK0R,iBAEzB1R,KAAKiiD,YAAc,IAAI,IAAY,UAAWx1C,IAC5CzM,KAAKk1F,aAAazoF,MAGpBzM,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,mBAAyBqhE,IAAW,O,EAAA,K,OAAA,E,EAAA,YACrE,MAAM8zB,QAAkBn1F,KAAKgH,SAASy1B,gBAAgB04D,UAAU9zB,GAC1Dt5D,EAASs5D,EAAOpvC,WACnBkjE,EAAWn1F,KAAKo1F,eAAer0F,IAAIgH,GACjC/H,KAAKo1F,eAAen0F,OAAO8G,I,YAJqC,K,iRAOvE/H,KAAK8O,MAAMka,YAAYhpB,KAAKiiD,YAAY92C,WAExCnL,KAAK0yB,YAAa,UAElB1yB,KAAKk1F,eAMGG,aACR,MAAMD,EAAiB,IAAI,KAAe,CACxCpuF,SAAUhH,KAAKgH,WAEX8nB,EAAOsmE,EAAetmE,KAM5B,OALAA,EAAKnnB,GAAK,WACVmnB,EAAK1b,UAAUrS,IAAI,sBACnBo2B,EAAA,6BAAuCrI,GAAM,KAC3C9uB,KAAKyS,eACJzO,GAAW,GACPoxF,EAGChmD,UACRpvC,KAAK0yB,WAAW7oB,QAMRkyE,sBACL,EAAA1hE,WAAc4gE,GAAS,IAC1Bj7E,KAAKiiD,YAAY5xB,MAAMC,QAGlB4kE,aAAaxlE,GAClB1vB,KAAK0yB,WAAW7oB,QAChB,MAAM6oB,EAAa1yB,KAAK0yB,WAAWzvB,MACnCjD,KAAK4vB,WAAWK,iBAAmB,KACnCjwB,KAAK4vB,WAAWzkB,UAAUmN,YAAc,GAExCtY,KAAKgH,SAASy1B,gBAAgBO,mBAAmBtN,OAAO1rB,EAAW,UAAUqK,MAAM4uB,IACjF,IAAIvK,IACF,OAGF,MAAM0iE,EAAiBp1F,KAAKo1F,eAAiBp1F,KAAKq1F,aAElD,IAAIC,EAAa,KACf,MAAMrwD,EAAY1lB,GAAA,SAAoB,GAAK,KAAO,EACtC0d,EAASrP,OAAO,EAAGqX,GAE3BngC,SAASiD,IACXqtF,EAAer0F,IAAIgH,MAGjBk1B,EAASp6B,SACXyyF,OAAatxF,EACbhE,KAAK4vB,WAAWK,iBAAmB,OAIvCqlE,IACAt1F,KAAK4vB,WAAWK,iBAAmB,KAC9BqlE,EACDA,IAEAt1F,KAAK4vB,WAAWK,iBAAmB,OAIvC,EAAAlH,EAAA,GAAe/oB,KAAK4vB,WAAWzkB,UAAWiqF,EAAetmE,UChHhD,MAAMymE,WAAuB,IAInC1jE,OAML,GALA7xB,KAAKw1F,YAAcr+D,EAAA,iBAEnBn3B,KAAKmL,UAAUxD,GAAK,2BACpB3H,KAAKy1E,SAAS,kBAEVt+C,EAAA,oBAA8Bo+D,GAAeE,UAAW,CAC1D,MAAMC,EAAWv+D,EAAA,yBACEA,EAAA,2BAAqCu+D,EAAU,CAChE5mF,WAAO9K,EACP2D,GAAI4tF,GAAeE,SACnBE,QAAS,QAEAxqF,UAAUM,OAAOiqF,GAC5Bv+D,EAAA,6BAAuCu+D,EAAU,MAAM,GAIzD,MAAM9lE,EAAauH,EAAA,oBAA8Bo+D,GAAeE,UAIhE,OAHAz1F,KAAK4vB,WAAWzkB,UAAU6d,YAAY4G,EAAWzkB,WAG1CgsB,EAAA,gCAA0Co+D,GAAeE,UAAUpnF,MAAK,EAAE00D,OAAAA,EAAQ+M,cAAAA,MACvF,GAAG/M,EACD,OAAO+M,KAMbiM,qBACE5kD,EAAA,oBAA8Bn3B,KAAKw1F,aAAa10E,QAGlDsuB,UACEjY,EAAA,gCAA0Cn3B,KAAKw1F,aAGjDrzC,sBAEE,OADAhrB,EAAA,oBAA8Bo+D,GAAeE,UAAU30E,QAChD/O,MAAMowC,uBA3CA,GAAAszC,SAA2B,MCY7B,MAAMG,WAA2B,IAAhD,c,oBAEU,KAAAC,mBAA6B,EA6I7BC,cAAcjkD,GACpB,MAAuC,UAApCr0B,EAAA,wBACEq0B,EAAW,SACL,QAAK,YAAa,CAACtrC,KAAKmD,MAAMmoC,EAAW,SAEzC,QAAK,YAAa,CAACtrC,KAAKmD,MAAiB,MAAXmoC,KAGpCA,GAAY,KACN,QAAK,eAAgB,CAACA,EAAW,OAEjC,QAAK,cAAe,CAACA,IAqD1BkkD,gBACF/1F,KAAKg2F,sBAAuBh2F,KAAK61F,oBACrC71F,KAAK61F,mBAAoB,GAEzB,EAAAvqC,EAAA,IAAM,qFAENtrD,KAAKgH,SAASy1B,gBAAgBw5D,WAC5Bj2F,KAAKg2F,oBAAoB/e,SACzBj3E,KAAKg2F,oBAAoB7e,UACzBn3E,KAAKg2F,oBAAoBE,UACzB,EACA,YAGF9wF,UAAUyxE,YAAYsf,eAAe7tD,IACnC,MAAM8tD,EAAuB9tD,EAAO0uC,OAAOG,YAAcn3E,KAAKg2F,oBAAoB7e,UAC5Ekf,EAAsB/tD,EAAO0uC,OAAOC,WAAaj3E,KAAKg2F,oBAAoB/e,SAC1Eqf,EAAgBt2F,KAAKu2F,kBACzBjuD,EAAO0uC,OAAOC,SAAU3uC,EAAO0uC,OAAOG,UACtCn3E,KAAKg2F,oBAAoB/e,SAAUj3E,KAAKg2F,oBAAoB7e,WAC1D,KAEAkf,GAAuBD,IAAyBE,IAClDt2F,KAAKgH,SAASy1B,gBAAgBw5D,WAC5B3tD,EAAO0uC,OAAOC,SACd3uC,EAAO0uC,OAAOG,UACd7uC,EAAO0uC,OAAOkf,UACd,EACA,YAEFl2F,KAAKg2F,oBAAsB,CACzB/e,SAAU3uC,EAAO0uC,OAAOC,SACxBE,UAAW7uC,EAAO0uC,OAAOG,UACzB+e,SAAU5tD,EAAO0uC,OAAOkf,eAMxBM,eACFx2F,KAAK61F,oBACT71F,KAAK61F,mBAAoB,GACzB,EAAAvqC,EAAA,IAAM,gGACNtrD,KAAKgH,SAASy1B,gBAAgBw5D,WAC5B,EACA,EACA,GACA,EACA,IAIIM,kBAAkBE,EAAcC,EAAeC,EAAcC,GACnE,MAAMj2F,EAAI,oBACV,OACE,MAAQ4F,KAAKswF,KACXtwF,KAAKusC,KACF,GAAMvsC,KAAK4sC,KAAKwjD,EAAOF,GAAQ91F,GAE9B4F,KAAK4sC,IAAIsjD,EAAO91F,GAAK4F,KAAK4sC,IAAIwjD,EAAOh2F,IACpC,EAAI4F,KAAK4sC,KAAKyjD,EAAQF,GAAS/1F,GAAG,M,wXC7OxC,MAAMm2F,GAA+B,uBAErC,MAAMC,WAAuB,IAkBlCh3F,cACEgS,MAAM,CACJilF,UAAW5rF,SAASuQ,eAAe,eACnCw7B,eAAgB,SATZ,KAAAhoB,aAAuG,GAa/GjkB,UAAUlE,GACRhH,KAAKgH,SAAWA,EAGhBhH,KAAKiiD,YAAc,IAAI,IAAY,UACnC,MAAMg1C,EAAgBj3F,KAAKg3F,UAAUx/E,cAAc,8BACnDy/E,EAAcxrF,OAAOzL,KAAKiiD,YAAY92C,WAEtC,MAUM+rF,EAAkB,KACtBl3F,KAAKi5E,UAAUgc,IAAgBrqE,QAIjC5qB,KAAKm3F,QAAUn3F,KAAKg3F,UAAUx/E,cAAc,wBAE5C,MAAM4/E,EAAoC,CACxCxjF,KAAM,UACNC,KAAM,gBACNC,QAAS,KACP9T,KAAKi5E,UAAUsc,IAAgB3qE,QAEjCtiB,OAAQ,IAAW,mCAEjB,eADqBtI,KAAKgH,SAASqwF,eAAeC,iBAAiB,GAAG,IACtDz0F,gBAAkB7C,KAAKgH,SAASqwF,eAAeE,gBAAgB,QAI7EC,EAAqB,IAAI,KAAc,CAC3C5tF,QAAQ,EACR26B,QAA6C,UAApC0iD,GAAA,aAA2BrvE,OAEtC4/E,EAAmBnnE,MAAM1iB,iBAAiB,UAAU,IAAW,yCACvD3N,KAAKgH,SAAS6/E,gBAAgB4K,SAAS,iBAAkB+F,EAAmBnnE,MAAMkU,QAAU,QAAU,OAC5G/mB,EAAA,gBAAwB,qBAG1BA,EAAA,mBAA2B,gBAAgB,KACzCg6E,EAAmBx7C,iBAAqD,UAApCirC,GAAA,aAA2BrvE,SAGjE,MAuFM6/E,EAvFuF,CAAC,CAC5F7jF,KAAM,gBACNC,KAAM,gBACNC,QAAS,KACPpR,YAAW,KACTyuB,EAAA,UAAqB,CACnBppB,OAAQopB,EAAA,WAET,KAEJimE,EAAY,CACbxjF,KAAM,OACNC,KAAM,WACNC,QAASojF,GACR,KAA2B,CAC5BtjF,KAAM,QACNC,KAAM,eACNC,QAAS,KACP9T,KAAKi5E,UAAU2c,IAAoBhrE,cAEnC5mB,EAAW,CACb4P,KAAM,WACNC,KAAM,WACNC,QAAS,KACP9T,KAAKi5E,UAAU+B,IAAgBpwD,SAEhC,CACDhX,KAAM,WACNC,KAAM,WACNC,QAAS,OAGTiyB,cAAeyxD,GACd,CACD5jF,KAAM,aACNC,KAAM,aACNC,QAAS,OAGTiyB,cAAe,IAAI,KAAc,CAC/Bn8B,QAAQ,EACR26B,SAAS,EACTsX,SAAU,gCAEX,CACDjoC,KAAM,OACNC,KAAM,mBACNC,QAAS,KACP,MAAMrM,EAAM,YAAY,uBAAuB,GAC/C0pB,EAAA,UAAqB1pB,KAEtB,CACDmM,KAAM,MACNC,KAAM,YACNC,QAAS,KACP,MAAMQ,EAAIlJ,SAASC,cAAc,KACjCiJ,EAAEjU,OAAS,SACXiU,EAAE0lB,KAAO,kDACT5uB,SAASI,KAAKC,OAAO6I,GACrBA,EAAEQ,QACFpS,YAAW,KACT4R,EAAE/R,WACD,KAEJ,CACDqR,KAAM,SACNC,KAAM,2BACNC,QAAS,KACP4M,QAAQkI,IAAI,CACV8uE,GAAA,MAAmB,CAACC,WAAY,MAChCD,GAAA,SAAsB,eACrBrpF,MAAK,KACN8d,SAAS6N,KAAO,kCAGpB1xB,OAAQ,IAAM,mBACb,CACDsL,KAAM,SACNC,KAAM,kCACNC,QAAS,KACP4jF,GAAA,SAAsB,aAAarpF,MAAK,KACtC8d,SAAS6N,KAAO,yCAGpB1xB,OAAQ,IAAM,oBAGoBgwB,OAAOC,SAE3Cv4B,KAAK43F,UAAW,OAAiB,GAAI,eAAgBH,GAAuB3vF,GAAM,yCAC1E4Y,QAAQkI,IAAI6uE,EAAgBl9E,KAAUvE,GAAW,mCAClDA,EAAO1N,QACR0N,EAAO9T,QAAQkR,UAAUxJ,OAAO,eAAgBoM,EAAO1N,sBAI7DtI,KAAK43F,SAASxkF,UAAU7Q,OAAO,cAC/BvC,KAAK43F,SAASxkF,UAAUrS,IAAI,uBAAwB,cAEpDf,KAAKm3F,QAAQx+E,cAAcxB,aAAanX,KAAK43F,SAAU53F,KAAKm3F,SAE5D,MAAMz8E,EAAU1a,KAAK43F,SAASpgF,cAAc,aAEtCqgF,EAAgBzsF,SAASC,cAAc,KAC7CwsF,EAAc79D,KAAO,iEACrB69D,EAAcx3F,OAAS,SACvBw3F,EAAcC,IAAM,sBACpBD,EAAczkF,UAAUrS,IAAI,mBAC5B82F,EAAclqF,iBAAiB,MAAmB7F,IAChDA,EAAEq/D,kBACF70C,GAAA,aAEF,MAAMwO,EAAI11B,SAASC,cAAc,QACjCy1B,EAAE1tB,UAAUrS,IAAI,wBAChB+/B,EAAE/hB,UAAY,eAAiB,YAAa,IAAqB,iBACjE84E,EAAcpsF,OAAOq1B,GACrBpmB,EAAQtH,UAAUrS,IAAI,cACtB2Z,EAAQjP,OAAOosF,GAEf73F,KAAK+3F,YAAa,OAAiB,GAAI,WAAY,CAAC,CAClDnkF,KAAM,aACNC,KAAM,aACNC,QAAS,KACP9T,KAAKi5E,UAAUsb,IAAkB3pE,SAElC,CACDhX,KAAM,WACNC,KAAM,WACNC,QA1KsB,KACtB9T,KAAKi5E,UAAU,KAAkBruD,KAAK,CACpChpB,KAAM,OACNs3E,WAAW,EACXC,QAAUx1C,GAAY3jC,KAAKi5E,UAAU1D,GAAgB3qD,KAAK+Y,GAC1D70B,MAAO,kBACPvL,YAAa,oBAqKd,CACDqQ,KAAM,aACNC,KAAM,iBACNC,QAASojF,KAEXl3F,KAAK+3F,WAAWn9E,UAAY,0EAC5B5a,KAAK+3F,WAAW9/E,mBAAmB,aAAc,6GAIjDjY,KAAK+3F,WAAWpwF,GAAK,WACrBsvF,EAAc7qB,mBAAmB3gE,OAAOzL,KAAK+3F,YAE7C/3F,KAAKg4F,UAAY5sF,SAASC,cAAc,OAExCrL,KAAKg4F,UAAUp9E,UAAY,2DAC3B,EAAA0Z,GAAA,GAAOt0B,KAAKg4F,WACZh4F,KAAKg4F,UAAUvsF,QAAO,QAAK,YAK3B,QAAiBzL,KAAKg4F,WAAW,KAC5Bh4F,KAAKg4F,UAAU5kF,UAAUqB,SAAS,cAIrC0X,SAAS8rE,YAGXhB,EAAc7qB,mBAAmB3gE,OAAOzL,KAAKg4F,WAS7Ch4F,KAAKiiD,YAAY5xB,MAAM1iB,iBAAiB,SAAS,IAAM3N,KAAKk4F,cAAc,CAAClqF,MAAM,IAIjFhO,KAAKm4F,cAAgB/sF,SAASC,cAAc,QAC5CrL,KAAKm4F,cAAcv9E,UAAY,2CAE/Bw8E,EAAWl1F,QAAQuJ,OAAOzL,KAAKm4F,eAE/B36E,EAAA,mBAA2B,iBAAkB46E,IAC3C,GAAiB,IAAdA,EAAOzwF,GAAU,CAElB,MAAM+oB,EAAQ0nE,EAAOC,cAAczwF,KACnC5H,KAAKm4F,cAAcr+D,UAAY,IAAK,EAAAw+D,GAAA,GAAa5nE,EAAO,GACxD1wB,KAAKm4F,cAAc/kF,UAAUxJ,OAAO,QAAS8mB,OAIjD1wB,KAAKgH,SAASy1B,gBAAgByB,YAAY,kBAG1C,MAAMtd,EAAiC,CACrChf,KAAM,sBACN0nB,MAAO,KACL5mB,YAAW,KACT1C,KAAKiiD,YAAY5xB,MAAMC,UACtB,IAEI,GAETxC,WAAW,GAEbjN,GAAA,WAAiCD,GAEjC,gBAA2BvS,MAAM+d,IAC/B,MACMmsE,EAAsB72B,aAAY,KACtC2V,MAAM,UAAW,CAACmhB,MAAO,aACxBnqF,MAAMoiB,GAAwB,MAAfA,EAAIgoE,QAAkBhoE,EAAIioE,IAAMjoE,EAAI5c,QAAW6M,QAAQC,WACtEtS,MAAMwF,IACFA,IAAS,mBACV7T,KAAK24F,WAAY,EACjB31B,cAAcu1B,GAEVv4F,KAAK+3F,WAAW3kF,UAAUqB,SAAS,cACrCzU,KAAKg4F,UAAU5kF,UAAU7Q,OAAO,iBAIrCoV,MAAM4f,GAAA,KAdqB,SAmB1B2gE,aACN,MAAMU,EAAkB54F,KAAKg3F,UAAUx/E,cAAc,qBAE/CoY,EAAa,IAAI,KAAWgpE,GAE5BnmF,EAAQ,MAEZ,QAAmBzS,KAAKm3F,UAI1Bn3F,KAAKmvB,aAAe,CAClB8N,SAAU,IAAI,IAAY,sBAAuB,gBAAYj5B,OAAWA,OAAWA,OAAWA,EAAWyO,GACzG2qB,eAAgB,IAAI,IAAY,eAAgB,gBAAYp5B,OAAWA,OAAWA,OAAWA,EAAWyO,GACxGod,SAAU,IAAI,IAAY,iBAAkB,YAC5CuO,OAAQ,IAAI,KAAY,EAAO,YAAY,EAAM,uBAAuB,GAAM,EAAO3rB,GAAO,GAC5ForB,OAAQ,IAAI,IAAY,SAAU,YAAY,EAAM,uBAAuB,GAAM,EAAMprB,IAGzF,MAAMwe,EAAcjxB,KAAKixB,YAAc,IAAI,IAAe,CACxDkD,UAAW,CAAC,CACVliB,YAAa,2BACb2F,KAAM,cACNhW,KAAM,SACL,CACDqQ,YAAa,gCACb2F,KAAM,kBACNhW,KAAM,SACL,CACDqQ,YAAa,yBACb2F,KAAM,kBACNhW,KAAM,SACL,CACDqQ,YAAa,8BACb2F,KAAM,kBACNhW,KAAM,SACL,CACDqQ,YAAa,2BACb2F,KAAM,kBACNhW,KAAM,SACL,CACDqQ,YAAa,gCACb2F,KAAM,kBACNhW,KAAM,UAERguB,WAAAA,EACAT,aAAcnvB,KAAKmvB,aACnBmE,YAAY,EACZE,eAAe,EACfC,YAAY,EACZzsB,SAAUhH,KAAKgH,WAGjB4xF,EAAgBlhF,QAAQuZ,EAAY+C,IAAIrb,cAAcA,eACtDiX,EAAWzkB,UAAUM,OAAOwlB,EAAY9lB,WAGtC8lB,EAAYqR,SAAS,CACnBv6B,OAAQ,GAAGkqB,WACXjhB,SAAU,IAEZigB,EAAY2D,UAAU,GACtB3D,EAAYruB,MAAK,GAKnB,MAAMi2F,EAAgC,GACtC,IAAIC,EAAyB,GAAG7mE,WAC5B8mE,EAAkB,EAClBC,EAAkB,EACtB,MAAMC,EAAe,KAEnBj5F,KAAKiiD,YAAY92C,UAAUiI,UAAUxJ,OAAO,kBAA6C,IAA1BivF,EAAeh2F,QAC9E7C,KAAKiiD,YAAY92C,UAAUiI,UAAUxJ,OAAO,cAAeivF,EAAeh2F,QAEvEg2F,EAAeh2F,OAChB7C,KAAKiiD,YAAY5xB,MAAM/kB,MAAM4tF,YAAY,gBAAkBL,EAAeA,EAAeh2F,OAAS,GAAGif,wBAAwBs5B,MAAQp7C,KAAKiiD,YAAY5xB,MAAMvO,wBAAwBG,KAAQ,MAE5LjiB,KAAKiiD,YAAY5xB,MAAM/kB,MAAM6tF,eAAe,kBAI1CC,EAAShuF,SAASC,cAAc,OACtC+tF,EAAOhmF,UAAUrS,IAAI,iBACrBq4F,EAAOzrF,iBAAiB,SAAU7F,IAChC,MAAMzH,GAAS,EAAAyc,GAAA,GAAgBhV,EAAEzH,OAAQ,iBACzC,IAAIA,EACF,OAGF,MAAMkM,EAAMlM,EAAOslB,QAAQpZ,IAC3B,GAA4B,IAAzBA,EAAIsN,QAAQ,SAAgB,CAC7B,MAAOpK,EAAGkuB,EAAS4E,GAAWh2B,EAAIkX,MAAM,KACxCs1E,GAAmBp7D,EACnBq7D,GAAmBz2D,OAEnBu2D,EAAiBvsF,EAAI0lB,WAGvB5xB,EAAOsN,iBAAiB,SAAS,KAC/B0rF,EAAeh5F,MAGjBL,KAAKiiD,YAAY92C,UAAUM,OAAOpL,GAClCL,KAAKiiD,YAAYlyB,SAAS/vB,KAAKiiD,YAAYx1C,MAAQ,IACnDosF,EAAex2F,KAAKhC,GACpB44F,OAGFhoE,EAAY+C,IAAIrb,cAAclN,OAAO2tF,GAErC,MAAME,EAAe,CAAC/sF,EAAsBuC,KAC1C,MAAMwb,EAAMlf,SAASC,cAAc,OACnCif,EAAIlX,UAAUrS,IAAI,iBAElB,MAAMod,EAAW,IAAI,IA0BrB,OAzBAA,EAAS/K,UAAUrS,IAAI,uBAAwB,QAAS,aACxDod,EAAS8nB,UAAW,EAEpB3b,EAAI3E,QAAQpZ,IAAM,GAAKA,EACpBA,EAAI4b,iBACQnkB,IAAV8K,IACDA,EAAQ,IAAI,KAAU,CAAC/G,OAAQwE,EAAI0lB,aAAa/vB,SAGlDic,EAAS0K,kBAAkB,CAAC9gB,OAAQwE,KAEpC4R,EAAS/K,UAAUrS,IAAI,wBAGtB+N,IACoB,iBAAZ,EACPwb,EAAIvL,UAAYjQ,IAEhB,EAAAia,EAAA,GAAeuB,EAAKxb,GACpBwb,EAAI7e,OAAOqD,KAIfwb,EAAI4b,sBAAsB,aAAc/nB,GAEjCmM,GAGH+uE,EAAkBh5F,IAEM,IADhBA,EAAOslB,QAAQpZ,IACpBsN,QAAQ,SACbk/E,EAAkBC,EAAkB,EAEpCF,EAAiB,GAAG7mE,WAGtB5xB,EAAOkC,UACP,EAAA6sD,GAAA,GAAiBypC,EAAgBx4F,GAEjCqC,YAAW,KACTu2F,IACAj5F,KAAKiiD,YAAYlyB,SAAS/vB,KAAKiiD,YAAYx1C,SAC1C,IAGLzM,KAAKiiD,YAAY8X,QAAU,KACzB8+B,EAAe/zF,SAASlE,IACtBy4F,EAAez4F,OAInBZ,KAAKiiD,YAAYlyB,SAAYtjB,IAgB3B,GAfAwkB,EAAY8Q,cACZ9Q,EAAYqR,SAAS,CACnBv6B,OAAQ+wF,EACR9nF,SAAU8nF,OAAiB90F,EAAY,EACvC0rB,MAAOjjB,EACPkxB,QAASo7D,EACTx2D,QAASy2D,IAEX/nE,EAAYruB,MAAK,GAEjBw2F,EAAOr6E,UAAY,GACnBkS,EAAY+C,IAAI5gB,UAAU7Q,OAAO,SAI7Bu2F,GAAkBrsF,EAAMyjB,OAAQ,CAClC,MAAMwC,EAAazB,EAAYyB,WAAWzvB,MAC1Cyd,QAAQkI,IAAI,CAEV5oB,KAAKgH,SAAS8G,mBAAmB2vB,iBAAiBhxB,GAAO4B,MAAK,EAAEqvB,QAAAA,KAAaA,EAAQnjB,KAAK+L,GAAMA,EAAEve,WAClG/H,KAAKgH,SAASy1B,gBAAgBO,mBAAmBvwB,GAAO,KACvD4B,MAAMusB,IACHlI,MACY,IAAItxB,IAAIw5B,EAAQ,GAAGtc,OAAOsc,EAAQ,KAE1C91B,SAASiD,IACfqxF,EAAO3tF,OAAO6tF,EAAavxF,OAG7BkpB,EAAY+C,IAAI5gB,UAAUxJ,OAAO,SAAUwvF,EAAOr6E,eAKtD,IAAIg6E,GAAmBtsF,EAAMyjB,OAAQ,CACnC,MAAMqpE,EAAoB,IAC1B,QAAa9sF,EAAO8sF,GACpBA,EAAMz0F,SAAS00F,IACbJ,EAAO3tF,OAAO6tF,EAAa,QAAUE,EAAS77D,QAAU,IAAM67D,EAASj3D,QAASi3D,EAAS1qF,WAG3FmiB,EAAY+C,IAAI5gB,UAAUxJ,OAAO,SAAUwvF,EAAOr6E,aAItDkS,EAAYuB,KAAK+I,yBAAyB5tB,iBAAiB,aAAc7F,IACvE,MAAMzH,GAAS,EAAAs+B,GAAA,GAAU72B,EAAEzH,OAAQ,EAAAu+B,yBACnC,IAAIv+B,EACF,OAGF,MAAMuwB,GAAc,EAAA9T,GAAA,GAAgBzc,EAAQ,gBAC5C,IAAIuwB,GAAeA,EAAYxd,UAAUqB,SAAS,wBAA0Bmc,EAAYxd,UAAUqB,SAAS,uBACzG,OAGF,MAAM1M,EAAS1H,EAAOsU,aAAa,gBAAgBsd,WACnDjyB,KAAKgH,SAASy1B,gBAAgBg9D,iBAAiB1xF,KAC9C,CAAC8M,SAAS,IAEb,MAAM6kF,EAAkBtuF,SAASC,cAAc,OAC/CquF,EAAgBtmF,UAAUrS,IAAI,2BAC9B24F,EAAgBjuF,OAAOzL,KAAKmvB,aAAaiP,OAAOtP,MAChD9uB,KAAKmvB,aAAaiP,OAAOjzB,UAAUM,OAAOiuF,GACjB,IAAI,KAAYA,GAEzC,IACIC,EADAnjD,GAAQ,EAGZ,MAAMojD,GAAa,OAAiBhB,EAAgBjgF,cAAe,YAAa,KAAMhR,IACjFgyF,GAAuBrmF,aAAaqmF,GAE7B,IAAPhyF,GAAa6uC,IACdvlB,EAAY2D,UAAU,GAAG,GACzB50B,KAAKiiD,YAAY6X,eACjB6/B,EAAwBpmF,OAAO7Q,YAAW,KACxCi3F,EAAwB,EACxB35F,KAAK+3F,WAAW3kF,UAAU7Q,OAAO,aACjCvC,KAAK24F,WAAa34F,KAAKg4F,UAAU5kF,UAAU7Q,OAAO,eACjD,MAGLi0C,GAAQ,KAGVojD,EAAW,GAEX,MAAMC,EAAkB,aAClBC,EAAU,KACd95F,KAAK43F,SAASxkF,UAAU7Q,OAAOs3F,GAC/B75F,KAAKm3F,QAAQ/jF,UAAUrS,IAAI84F,GAC3B75F,KAAK+3F,WAAW3kF,UAAUrS,IAAI,aAC9Bf,KAAKg4F,UAAU5kF,UAAUrS,IAAI,aAC7Bf,KAAK43F,SAASj/E,cAAcvD,kBAAkBhC,UAAUxJ,OAAO,cAAc,GAE7E,MAAMutC,EAAyC,gBAC3C,EAAA9tB,kBAAqBxI,GAAA,iBAAuCs2B,IAC9Dt2B,GAAA,WAAiC,CAC/ByI,MAAO,KACL7W,KAEF7Q,KAAMu1C,IAIVyiD,EAAW,IAGb55F,KAAKiiD,YAAY5xB,MAAM1iB,iBAAiB,QAASmsF,GACjDA,KAEA,QAAiB95F,KAAKm3F,SAAUrvF,IAC9B9H,KAAK43F,SAASxkF,UAAUrS,IAAI84F,GAC5B75F,KAAKm3F,QAAQ/jF,UAAU7Q,OAAOs3F,GAC9B75F,KAAK43F,SAASj/E,cAAcvD,kBAAkBhC,UAAUxJ,OAAO,cAAc,GAE7EiX,GAAA,eAAqC,iBAErC+4E,EAAW,MAGb,MAAMG,GAAuB,QAAW,SACxC/5F,KAAKmvB,aAAa0O,OAAOzf,OAAO3S,OAAOsuF,GACvCA,EAAqBpsF,iBAAiB,SAAS,MAC7C,EAAAovC,GAAA,GAAkB,CAChBuV,mBAAoB,8BACpBt8C,OAAQ,CACNu8C,QAAS,cACT8W,UAAU,KAEXh7D,MAAK,IACCrO,KAAKgH,SAASy1B,gBAAgBu9D,oBAAoB3rF,MAAK,KAC5DrO,KAAKmvB,aAAa0O,OAAO/c,iBAoBnC,MAAMlG,GAAY,uBACX,MAAM86D,GASX31E,YAAYotB,EAAiC,I,MAC3C,MAAMhiB,EAAYnL,KAAKmL,UAAYC,SAASC,cAAc,OAC1DF,EAAUiI,UAAUrS,IAAI6Z,GAAY,cAEpC,MAAMopB,EAAiBhkC,KAAKgkC,eAAiB54B,SAASC,cAAc,OAOpE,GANA24B,EAAe5wB,UAAUrS,IAAI6Z,IAE1BuS,EAAQkX,UACTL,EAAe5wB,UAAUrS,IAAI,aAG5BosB,EAAQ8sE,sBACTj2D,EAAev4B,OAAOyuF,MACtBl2D,EAAe5wB,UAAUrS,IAAI,4BACxB,GAAIosB,EAAQszC,YAIjBz8B,EAAe5wB,UAAUrS,IAAI,oBAJC,CAC9B,MAAMo5F,EAAK/uF,SAASC,cAAc,MAClC24B,EAAev4B,OAAO0uF,GAaxB,MAAM3nF,EAAUxS,KAAKwS,QAAUxS,KAAK66E,yBAEpC,GAAG1tD,EAAQvV,KAAM,CACf,MAAM9I,EAAQ9O,KAAK8O,MAAQ1D,SAASC,cAAc,OAClDyD,EAAMsE,UAAUrS,IAAI,kBAAmB6Z,GAAY,UACnD,QAAM,CAAC1Y,QAAS4M,EAAOvC,IAAK4gB,EAAQvV,KAAMg5C,KAAMzjC,EAAQupD,WACxDlkE,EAAQ/G,OAAOqD,GAGjB3D,EAAUM,OAAOu4B,GAEjB,MAAM7wB,EAAyB,QAAf,EAAAga,EAAQha,eAAO,QAAIga,EAAQutD,WAC3C,GAAGvnE,EAAS,CACV,MAAMvS,EAAKZ,KAAKmT,QAAUnT,KAAK66E,yBAC/Bj6E,EAAGwS,UAAUrS,IAAI6Z,GAAY,YAEzBuS,EAAQutD,YACVvvE,EAAUM,OAAO7K,IAGJ,IAAZuS,IACD,QAAM,CAACjR,QAAStB,EAAI2L,IAAK4G,EAASy9C,KAAMzjC,EAAQitE,eAK/Cvf,yBACL,MAAMroE,EAAUpH,SAASC,cAAc,OAQvC,OAPAmH,EAAQY,UAAUrS,IAAI6Z,GAAY,YAMlC5a,KAAKgkC,eAAev4B,OAAO+G,GACpBA,GAIJ,MAAMomE,GAAkB,CAACn0C,EAAsB7sB,EAAoBzE,KACxE,MAAM4wB,EAAU,IAAI2xC,GAAe,CAAC99D,KAAAA,EAAMzE,QAAAA,IAE1C,OADAsxB,EAASh5B,OAAOs4B,EAAQ54B,WACjB44B,EAAQvxB,SAGJ0nF,GAAoB,KAC/B,MAAMG,EAAYjvF,SAASC,cAAc,OAEzC,OADAgvF,EAAUjnF,UAAUrS,IAAI,sBACjBs5F,GAsBHC,GAAiB,IAAIvD,GAC3B,oBAAgCuD,GAChC,a,wFCpwBe,MAAMC,UAAyB,IAOrC1oE,KAAK1E,GAQVntB,KAAKmL,UAAUiI,UAAUrS,IAAI,yBAC7Bf,KAAK2gD,SAAU,OAAa,CAAC/sC,KAAM,eACnC5T,KAAKwS,QAAQ/G,OAAOzL,KAAK2gD,SACzB3gD,KAAK4vB,WAAWzkB,UAAU5I,SAE1BvC,KAAK2gD,QAAQhzC,iBAAiB,SAAS,KACrC,MAAMg2B,EAAU3jC,KAAK2kB,SAASyhB,cAAc7rB,KAAK2tC,GAAQA,EAAIj2B,aACvDqW,EAAStoC,KAAKm5E,QAAQx1C,GAEzB3jC,KAAKk5E,UACNl5E,KAAKyS,QACG61B,aAAkB5nB,QAC1B1gB,KAAKw6F,gBAAgBlyD,QACFtkC,IAAXskC,GACRtoC,KAAKyS,WAKTzS,KAAKy1E,SAAStoD,EAAQre,OACtB9O,KAAK8iC,SAAW3V,EAAQvrB,KACxB5B,KAAKm5E,QAAUhsD,EAAQgsD,QACvBn5E,KAAKk5E,UAAY/rD,EAAQ+rD,UAEzB,MAAMuhB,EAA8B,YAAlBz6F,KAAK8iC,SACvB9iC,KAAK2kB,SAAW,IAAI,IAAe,CACjC8f,SAAUzkC,KAAKwS,QACfud,SAAU/vB,KAAKk5E,UAAY,KAAQr2E,IACjC7C,KAAK2gD,QAAQvtC,UAAUxJ,OAAO,eAAgB/G,IAEhDigC,SAAU,CAAC23D,EAAY,UAAY,YACnCl3F,YAAa4pB,EAAQ5pB,YACrBy/B,WAAYy3D,EACZ32D,iBAAkB22D,EAAY,CAAC,aAAc,eAAYz2F,EACzDgD,SAAUhH,KAAKgH,SACfo8B,OAAQ,WAGPjW,EAAQosD,iBACTv5E,KAAK2kB,SAAS0hB,WAAWlZ,EAAQosD,iBAGnCv5E,KAAK2gD,QAAQvtC,UAAUrS,IAAI,oBAC3Bf,KAAK2gD,QAAQ5hC,UAAY,GACzB/e,KAAK2gD,QAAQjS,UAAW,EACxB1uC,KAAK2gD,QAAQvtC,UAAUxJ,OAAO,aAAc5J,KAAKk5E,WAG5CshB,gBAAgBlsF,GACrB,MAAMosF,GAAe,OAAgB16F,KAAK2gD,QAAS,cAEnDryC,EAAQD,MAAK,KACXrO,KAAKyS,WACJ,KACDioF,U,4eCvDS,MAAMC,UAA0B,IAA/C,c,oBAOU,KAAAC,gBAA6C,GAG9CvkF,qBACL,OAAO,iCAA0C,aAGrCwkF,aACZC,EACA3vF,EACAgvB,EACA1uB,G,yCAEA,IAAI6sB,EACAiB,EAAc,GAClB,MAAMjT,EAAmB,GACzB,GAAsB,0BAAnBw0E,EAAarrF,EACd6oB,EAASwiE,EAAaxiE,OACtBiB,EAAcuhE,EAAavhE,gBACtB,CAQL,GAPAjB,EAASwiE,EAOa,IALC52F,OAAOC,KAAKm0B,EAAO9qB,QAAQ3K,OAKzB,CACvB,MAAM2K,EAAS8qB,EAAO9qB,OACtB,IAAIosE,EACDpsE,EAAOyvB,SAAU28C,EAAI,oBAChBpsE,EAAOutF,aAAcnhB,EAAI,uBACzBpsE,EAAOvJ,OAAQ21E,EAAI,kBACnBpsE,EAAOwtF,WAAYphB,EAAI,oBACvBpsE,EAAOytF,OAAMrhB,EAAI,iBAEtBA,GACDtzD,EAAEjkB,MAAK,QAAKu3E,IAIhB,IAAItzD,EAAEzjB,OAAQ,CACZ,MAAMu1F,QAAep4F,KAAKgH,SAASqwF,eAAeC,iBAAiBh/D,EAAO3wB,IAC1E,IAAIqwE,EAAQ,EAAGma,EAAW,EAAGluF,EAAS,QAChCyc,QAAQkI,IAAIwvE,EAAO79E,KAAU8N,GAAW,EAAD,uCAClCroB,KAAKgH,SAASqI,gBAAgB6rF,WAAW7yE,EAAOtgB,SAAS9D,WACpDjE,KAAKgH,SAASqI,gBAAgBuyB,YAAYvZ,EAAOtgB,SAASoqF,IACnEna,UAGJA,GAAO1xD,EAAEjkB,MAAK,QAAK,QAAS,CAAC21E,KAC7Bma,GAAU7rE,EAAEjkB,MAAK,QAAK,WAAY,CAAC8vF,KACnCluF,GAAQqiB,EAAEjkB,MAAK,QAAK,SAAU,CAAC4B,MAItC,GAAIk2B,EAuBC7B,EAAO3wB,KAAO,OACf,OAAewyB,EAAIrrB,OAAO,OAAcwpB,EAAOxpB,QAGjDqrB,EAAIE,SAAS/hB,YAAc,GAC3B6hB,EAAIE,SAAS5uB,WAAU,QAAK6a,SAhB5B,GAXA6T,EAAM,IAAI,KAAI,CACZrrB,MAAOwpB,EAAO3wB,KAAO,MAAgB,QAAK,mBAAoB,OAAc2wB,EAAOxpB,OACnFurB,SAAUd,EACV7K,UAAW4J,EAAO3wB,KAAO,KACzBurE,mBAAuC,0BAAnB4nB,EAAarrF,EAAgC,WAAQzL,IAGxEsiB,EAAEzjB,QACHs3B,EAAIE,SAAS5uB,WAAU,QAAK6a,IAGR,iBAAnBw0E,EAAarrF,EAAsB,CACpC,MAAMgmF,EAAWn9D,EAAO3wB,GACpB3H,KAAK46F,gBAAgBtiE,EAAO3wB,KAAO2wB,EAAO3wB,KAAO,OACnD,QAAiBwyB,EAAIhvB,WAAW,IAAW,EAAD,gCACxCnL,KAAKg5E,OAAOC,UAAU,KAAkBruD,WAAW5qB,KAAKgH,SAASm0F,eAAeC,UAAU3F,QACzF,CAAC/jF,eAAgB1R,KAAK0R,iBAG3B1R,KAAK46F,gBAAgBtiE,EAAO3wB,IAAMwyB,EAWtC,MAAM7P,EAAM6P,EAAIhvB,UAEhB,GAAGM,EAAQ,CACT,MAAMkqF,EAAWr9D,EAA0Bq9D,aAC5B3xF,IAAZ2xF,GAED,OAAuBrrE,EAAKA,EAAI3R,eAAiBxN,EAAWwqF,GACpDxqF,GACRA,EAAUM,OAAO6e,GAIrB,OAAO6P,KAGFtI,KAAKlxB,EAAyDg6F,EAAkB/G,eACrF5zF,KAAKmL,UAAUiI,UAAUrS,IAAI,0BAC7Bf,KAAKy1E,SAAS,8BAEdz1E,KAAK4vB,WAAWzkB,UAAUiI,UAAUrS,IAAI,gBAExCf,KAAK26E,iBAAmBvvE,SAASC,cAAc,OAC/CrL,KAAK26E,iBAAiBvnE,UAAUrS,IAAI,qBAEpC,MAAMoS,EAAU/H,SAASC,cAAc,OACvC8H,EAAQC,UAAUrS,IAAI,YACtB,QAAM,CAACmB,QAASiR,EAAS5G,IAAK,2BAE9BvM,KAAKq7F,iBAAkB,OAAO,kDAAmD,CAC/ExnF,KAAM,2BACND,KAAM,QAGR5T,KAAKs7F,eAAiB,IAAI,KAAe,CACvC1jF,KAAM,YAER5X,KAAKs7F,eAAenwF,UAAUG,MAAM2b,QAAU,OAE9CjnB,KAAKu7F,iBAAmB,IAAI,KAAe,CACzC3jF,KAAM,sBAER5X,KAAKu7F,iBAAiBpwF,UAAUG,MAAM2b,QAAU,OAEhDjnB,KAAK4vB,WAAWnkB,OAAOzL,KAAK26E,iBAAkBxnE,EAASnT,KAAKq7F,gBAAiBr7F,KAAKs7F,eAAenwF,UAAWnL,KAAKu7F,iBAAiBpwF,YAElI,QAAiBnL,KAAKq7F,iBAAiB,IAAW,EAAD,uCACpCr7F,KAAKw7F,mBAGdx7F,KAAKg5E,OAAOC,UAAU,KAAkBruD,QAFxC,QAAM,6CAIP,CAAClZ,eAAgB1R,KAAK0R,iBAEzB,MAAM+pF,EAA2B,KAC/Bz7F,KAAKs7F,eAAenwF,UAAUG,MAAM2b,QAAU/iB,OAAOC,KAAKnE,KAAK46F,iBAAiB/3F,OAAS,GAAK,QA8EhG,OA3EA7C,KAAKgH,SAASm0F,eAAeO,mBAAmBrtF,MAAW+xB,GAAY,EAAD,gCACpE,IAAI,MAAM9H,KAAU8H,EACf9H,EAAO3wB,KAAO,aAIX3H,KAAK66F,aAAaviE,EAAQt4B,KAAKs7F,eAAe9oF,aAASxO,GAAW,IAG1EhE,KAAK27F,iBAELF,SAGFz7F,KAAK0R,eAAe3Q,IAAI,IAAxBf,CAAmC,iBAAuBs4B,GAAW,EAAD,gCAClE,MAAM0rB,EAAiBhkD,KAAK46F,gBAAgBtiE,EAAO3wB,IAChDq8C,QACKhkD,KAAK66F,aAAaviE,EAAQ,KAAM0rB,GAC9B1rB,EAAO3wB,KAAO,aAChB3H,KAAK66F,aAAaviE,EAAQt4B,KAAKs7F,eAAe9oF,aAASxO,GAAW,IAG1Ey3F,IAEAz7F,KAAK47F,2BAGP57F,KAAK0R,eAAe3Q,IAAI,IAAxBf,CAAmC,iBAAkBs4B,IACnD,MAAM0rB,EAAiBhkD,KAAK46F,gBAAgBtiE,EAAO3wB,IAChDq8C,IAMDhkD,KAAK47F,sBAEL53C,EAAe74C,UAAU5I,gBAClBvC,KAAK46F,gBAAgBtiE,EAAO3wB,KAGrC8zF,OAGFz7F,KAAK0R,eAAe3Q,IAAI,IAAxBf,CAAmC,gBAAiBksD,IAClDA,EAAM5zB,QAAQm9D,KAAez1F,KAAK46F,gBAAgBnF,KAAW3wF,SAAQ,CAAC2wF,EAAU3sF,KAC9E,MACMqC,EADiBnL,KAAK46F,gBAAgBnF,GACXtqF,WACjC,OAAuBA,EAAWA,EAAUwN,cAAe7P,EAAM,SAIrE9I,KAAK0R,eAAe3Q,IAAI,IAAxBf,CAAmC,kBAAkB,KACnDA,KAAK27F,oBAGP37F,KAAK67F,qBAAuBl7F,EAAE0N,MAAW4B,GAAO,EAAD,gCAC7C,MAAM7N,QAAe6N,EAAG,CACtB9E,UAAWnL,KAAK26E,iBAChBl3E,MAAM,EACNc,UAAU,EACVqe,MAAO,GACPI,OAAQ,KAKV,OAFAhjB,KAAKS,UAAY2B,EAEV,sBAA+BA,QAGxCpC,KAAK47F,sBAKE57F,KAAK67F,qBAGd9f,qBAME,OALA/7E,KAAK67F,qBAAqBxtF,MAAK,KAC7BrO,KAAKS,UAAU8D,UAAW,EAC1BvE,KAAKS,UAAU+D,UAGVuN,MAAMgqE,qBAGP4f,iBACiB37F,KAAK46F,gBAAgB,MAC7BzvF,UAAUiI,UAAUxJ,OAAO,QAAS,aAGvC4xF,kB,yCACZ,MAAOhrE,EAAO4P,SAAiB1f,QAAQkI,IAAI,CACzC5oB,KAAKgH,SAAS0rD,WAAWC,SAAS,WAClC3yD,KAAKgH,SAASm0F,eAAeO,qBAI/B,OADsBt7D,EAAQ9H,QAAQA,IAAY,SAAiBA,EAAO3wB,MAAK9E,OACxD2tB,KAGjBorE,sBACN,OAAO57F,KAAKgH,SAASm0F,eAAeW,6BAA6BztF,MAAW0tF,GAAqB,EAAD,gCAC9F/7F,KAAKu7F,iBAAiBpwF,UAAUG,MAAM2b,QAAU80E,EAAiBl5F,OAAS,GAAK,OAC/E+V,MAAMC,KAAK7Y,KAAKu7F,iBAAiB/oF,QAAQqiB,UAAU6B,MAAM,GAAG5xB,SAASlE,GAAOA,EAAG2B,WAE/E,IAAI,MAAM+1B,KAAUyjE,EAAkB,CACpC,MAAM5hE,QAAYn6B,KAAK66F,aAAaviE,GACpCt4B,KAAKu7F,iBAAiB/oF,QAAQ/G,OAAO0uB,EAAIhvB,WAEzC,MAAM6K,EAASmkB,EAAIkzC,aACnB,QAAiBr3D,GAAclO,GAAM,EAAD,gCAGlC,IAFA,OAAYA,WAED9H,KAAKw7F,mBAEd,YADA,QAAM,yCAIRxlF,EAAOtI,aAAa,WAAY,QAEhC,MAAM81B,EAAIlL,EAAOA,OACjBkL,EAAEw4D,eAAiB,GACnBx4D,EAAEy4D,eAAiB,GACnBz4D,EAAE04D,cAAgB,GAElBl8F,KAAKgH,SAASm0F,eAAegB,mBAAmB34D,GAAG,GAAMn1B,MAAM+tF,IAC1DA,GACDjiE,EAAIhvB,UAAU5I,YAEfsV,SAAQ,KACT7B,EAAOqtC,gBAAgB,mBAExB,CAAC3xC,eAAgB1R,KAAK0R,0B,khBC7RlB,MAAM2qF,UAA4B,IAAjD,c,oBAgIE,KAAA34D,cAAsBC,GAAsB,EAAD,sCAGnC3jC,KAAKgH,SAASy1B,gBAAgB6/D,cACpC34D,EAAQ7+B,SAASiD,IAGf,MAAM,IAACmvB,GAAOC,EAAA,qBAA+B,CAC3CpvB,OAAQA,EACRoD,UAAWnL,KAAK2kB,SAASiL,WACzB6O,eAAe,EACf5N,WAAY,eAGR6R,EAAW1iC,KAAK2kB,SAAS+d,SAASr/B,IAAI0E,GAC5CmvB,EAAIV,YAAY/qB,OAAOzL,KAAKskC,SAAS5B,IAGrC,MAAM65D,EAAgC,GACtCv8F,KAAKw8F,iBAAiB13F,SAAQ,CAAC44B,EAASpF,KACtC,GAAGoF,EAAQr6B,IAAI0E,GAAS,CACtB,MAAMssB,EAAOjpB,SAASC,cAAc,SACpC,EAAAouB,EAAA,GAAapF,GAAM,EAAA7L,EAAA,GAAc8P,EAAOxpB,QACxCytF,EAAel6F,KAAKgyB,QAIT,QAAKkoE,GAAgB,GAC7Bz3F,SAASlE,IACds2B,EAAIiF,gBAAgB1wB,OAAO7K,YA+FjC,KAAA67F,eAAkB55F,IAEC,aAAd7C,KAAK4B,OACN5B,KAAK08F,WAAWpxF,MAAM2b,QAAUpkB,EAAS,GAAK,SAnP3CgvB,KACLyG,EACA12B,EACA+6F,GAEA38F,KAAK48F,eAAiBtkE,EACtBt4B,KAAKs4B,QAAS,EAAA+J,EAAA,GAAKriC,KAAK48F,gBACxB58F,KAAK4B,KAAOA,EACZ5B,KAAK28F,cAAgBA,EAErB38F,KAAKwS,QAAQjQ,SACbvC,KAAKmL,UAAUiI,UAAUrS,IAAI,+BAC7Bf,KAAK08F,YAAa,OAAW,yBAA0B,CAACn+E,UAAU,IAClEve,KAAK08F,WAAWpxF,MAAM2b,QAAU,OAEhCjnB,KAAKwjD,OAAO/3C,OAAOzL,KAAK08F,aAExB,QAAiB18F,KAAK08F,YAAY,IAAW,EAAD,gCAC1C,MAAMh6D,EAAW1iC,KAAK2kB,SAASyhB,cAI/B,GAAiB,aAAdpmC,KAAK4B,KACN,IAAI,MAAM2K,KAAOvM,KAAKs4B,OAAO9qB,OACI,IAA5BjB,EAAIsN,QAAQ,oBAKR7Z,KAAKs4B,OAAO9qB,OAAOjB,QAG5B,IAAI,MAAMA,KAAOvM,KAAKs4B,OAAO9qB,OACI,IAA5BjB,EAAIsN,QAAQ,oBAKR7Z,KAAKs4B,OAAO9qB,OAAOjB,GAI9B,MAAMo3B,EAAoB,GAC1B,IAAI,MAAMp3B,KAAOm2B,EACZn2B,EAAI4b,WACLwb,EAAQthC,KAAKkK,EAAI0lB,YAGjBjyB,KAAKs4B,OAAO9qB,OAAOjB,IAAO,EAI9B,IAAIswF,EAEFA,EADe,aAAd78F,KAAK4B,KACCmG,GAAW47B,EAAQ/uB,SAAS7M,GAE5BA,IAAY47B,EAAQ/uB,SAAS7M,IAGtC,EAAAk8C,EAAA,GAAejkD,KAAKs4B,OAAO4jE,eAAe,CAACn0F,EAAQe,KAC7C+zF,EAAI90F,KACN/H,KAAKs4B,OAAO4jE,cAActuE,OAAO9kB,EAAK,GACtC9I,KAAKs4B,OAAOwkE,aAAalvE,OAAO9kB,EAAK,OAIzC,MAAMi0F,EAAsB,aAAd/8F,KAAK4B,KAAsB,iBAAmB,iBACtDo7F,EAA4B,aAAdh9F,KAAK4B,KAAsB,gBAAkB,iBACjE,EAAAqiD,EAAA,GAAejkD,KAAKs4B,OAAOykE,IAAQ,CAACh1F,EAAQe,KACvC66B,EAAQ/uB,SAAS7M,KAClB/H,KAAKs4B,OAAOykE,GAAOnvE,OAAO9kB,EAAK,GAC/B9I,KAAKs4B,OAAO0kE,GAAapvE,OAAO9kB,EAAK,OAIzC9I,KAAKs4B,OAAqB,aAAdt4B,KAAK4B,KAAsB,iBAAmB,kBAAoB+hC,EAC9E3jC,KAAKs4B,OAAqB,aAAdt4B,KAAK4B,KAAsB,gBAAkB,uBAAyB8e,QAAQkI,IAAI+a,EAAQppB,KAAKxS,GAAW/H,KAAKgH,SAASqI,gBAAgB4tF,iBAAiBl1F,MAGrK/H,KAAK28F,cAAcO,UAAUl9F,KAAKs4B,QAAQ,GAC1Ct4B,KAAKyS,YACJ,CAACf,eAAgB1R,KAAK0R,iBAEzB,MAAMyrF,EAAe/c,IACnBpgF,KAAKwwB,MAAQhT,EAAA,UAAoB4iE,EAAUgd,mCAAqChd,EAAUid,oCAM5F,OAHAr9F,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,aAAcm9F,GAEjDn9F,KAAKw8F,iBAAmB,IAAIj7F,IACrBmf,QAAQkI,IAAI,CACjB5oB,KAAKgH,SAASm0F,eAAeO,mBAAmBrtF,MAAW+xB,GAAY,EAAD,sCAC9D1f,QAAQkI,IAAIwX,EAAQ9H,QAAQA,IAAY,SAAiBA,EAAO3wB,MAAK4S,KAAU+d,GAAW,EAAD,gCAC7F,MACMqL,SADgB3jC,KAAKgH,SAASqwF,eAAeC,iBAAiBh/D,EAAO3wB,KACnD4S,KAAK+L,GAAMA,EAAEve,SACrC/H,KAAKw8F,iBAAiB74F,IAAI20B,EAAQ,IAAIl3B,IAAIuiC,eAI9C3jC,KAAKgH,SAAS0rD,WAAW2tB,eAAehyE,MAAM+xE,IAC5C+c,EAAY/c,QAKlB97C,SAAS5B,GACP,MAAMqD,EAAgB,IAAI,IAAc,CACtCr8B,OAAO,IAMT,OAJGg5B,IACDqD,EAAc1V,MAAMkU,QAAU7B,GAGzBqD,EAAcC,MAqCvBmJ,SACEnvC,KAAK08F,WAAWpxF,MAAM2b,QAAwB,aAAdjnB,KAAK4B,KAAsB,GAAK,OAChE5B,KAAKy1E,SAAuB,aAAdz1E,KAAK4B,KAAsB,mBAAqB,mBAE9D,MAAM02B,EAASt4B,KAAKs4B,OAEdglE,EAAoB,IAAI,KAAe,CAC3C78B,aAAa,EACb7oD,KAAM,oBAKR,IAAIxR,EAFJk3F,EAAkBnyF,UAAUiI,UAAUrS,IAAI,qBAIxCqF,EADe,aAAdpG,KAAK4B,KACI,CACR27F,cAAe,CAACC,IAAK,OAAQ3pF,KAAM,8BACnC4pF,iBAAkB,CAACD,IAAK,UAAW3pF,KAAM,2BACzC6pF,aAAc,CAACF,IAAK,YAAa3pF,KAAM,8BAG/B,CACRopB,SAAU,CAACugE,IAAK,aAAc3pF,KAAM,4BACpCknF,aAAc,CAACyC,IAAK,cAAe3pF,KAAM,+BACzC5P,OAAQ,CAACu5F,IAAK,QAAS3pF,KAAM,0BAC7BmnF,WAAY,CAACwC,IAAK,aAAc3pF,KAAM,4BACtConF,KAAM,CAACuC,IAAK,OAAQ3pF,KAAM,yBAI9B,MAAM2vB,EAAIp4B,SAASq5D,yBACnB,IAAI,MAAMl4D,KAAOnG,EAAS,CACxB,MAAM4P,GAAS,OAAO,qDAAsD,CAACpC,KAAMxN,EAAQmG,GAAKixF,IAAK3pF,KAAMzN,EAAQmG,GAAKsH,OACxHmC,EAAO2P,QAAQ5d,OAASwE,EACxByJ,EAAOvK,OAAOzL,KAAKskC,YACnBd,EAAE/3B,OAAOuK,GAEXsnF,EAAkB9qF,QAAQ/G,OAAO+3B,GAIjC,MAAMm6D,GAA+B,aAAd39F,KAAK4B,KAAsB02B,EAAO0jE,eAAiB1jE,EAAO2jE,gBAAgBvlE,QAEjG12B,KAAK2kB,SAAW,IAAI,IAAe,CACjC8f,SAAUzkC,KAAKmL,UACf4kB,SAAU/vB,KAAKy8F,eACf35D,SAAU,CAAC,WACXW,kBAAmBzjC,KAAK0jC,cACxBngC,YAAa,SACb6gC,uBAAwB,cACxBp9B,SAAUhH,KAAKgH,WAEjBhH,KAAK2kB,SAAS+d,SAAW,IAAIthC,IAAIu8F,GAEjC,IAAIC,GAAe,EACnB,MAAMC,EAAO79F,KAAK2kB,SAAS5jB,IAAIiZ,KAAKha,KAAK2kB,UACzC3kB,KAAK2kB,SAAS5jB,IAAM,CAACgH,EAAQ+G,EAAOmnB,KAClC,GAAGj2B,KAAK2kB,SAAS+d,SAAS96B,MAAQ5H,KAAKwwB,OAASotE,IAAiBx3F,EAAQ2B,GAAS,CAChF,MAAMnH,EAAuBZ,KAAK2kB,SAASmK,KAAKtX,cAAc,kBAAkBzP,yBAC7EnH,GACD8B,YAAW,KACT9B,EAAG2jC,SAAU,IACZ,GAGL,MAAMhhB,EAAM,YAA0B,aAAdvjB,KAAK4B,KAAsB,uCAAwC,wCAAwC,GAEnI,YADA,EAAA0pD,EAAA,IAAM/nC,GAIR,MAAM+G,EAAMuzE,EAAK91F,EAAQ3B,EAAQ2B,IAAU,QAAK3B,EAAQ2B,GAAQ8L,WAAQ7P,EAAWiyB,GAInF,OAHG7vB,EAAQ2B,IACTuiB,EAAI9S,cAAc,kBAAkBpE,UAAUrS,IAAI,SAAWqF,EAAQ2B,GAAQy1F,KAExElzE,GAGTtqB,KAAK2kB,SAASiL,WAAWzkB,UAAUM,OAAO6xF,EAAkBnyF,UAAWnL,KAAK2kB,SAASiL,WAAWzkB,UAAU+a,kBAE1GlmB,KAAK2kB,SAAS0hB,WAAWs3D,GACzBC,GAAe,EAEf,IAAI,MAAME,KAAQxlE,EAAO9qB,OAEpBpH,EAAQ23F,eAAeD,IAAWxlE,EAAO9qB,OAAOswF,KACjD,QAAmBR,EAAkB9qF,QAAQgF,cAAc,kBAAkBsmF,QAYnF37C,sBAME,OALGniD,KAAK2kB,WACN3kB,KAAK2kB,SAASxZ,UAAU5I,SACxBvC,KAAK2kB,SAAW,MAGX5S,MAAMowC,uB,kVCtQF,MAAM67C,UAAyB,IAA9C,c,oBAUU,KAAAC,MAAsJ,GASvJpsE,OACL7xB,KAAKmL,UAAUiI,UAAUrS,IAAI,yBAC7Bf,KAAKmT,QAAU/H,SAASC,cAAc,OACtCrL,KAAKmT,QAAQC,UAAUrS,IAAI,WAC3Bf,KAAKmT,QAAQ1H,QAAO,QAAK,6BACzBzL,KAAK26E,iBAAmBvvE,SAASC,cAAc,OAC/CrL,KAAK26E,iBAAiBvnE,UAAUrS,IAAI,qBAEpCf,KAAK08F,YAAa,OAAW,+BAC7B,MAAMwB,EAA4C,CAChDtqF,KAAM,gBACNC,KAAM,mBACNC,QAAS,KACP,IAAI,IAAU,gBAAiB,CAC7Bu+C,aAAc,wCACdC,mBAAoB,sCACpB5+C,QAAS,CAAC,CACR6+C,QAAS,SACTvV,SAAU,KACRkhD,EAAmBh8F,QAAQwL,aAAa,WAAY,QACpD1N,KAAKgH,SAASm0F,eAAegD,mBAAmBn+F,KAAKs4B,QAAQ,GAAMjqB,MAAM+tF,IACpEA,GACDp8F,KAAKyS,WAENoF,SAAQ,KACTqmF,EAAmBh8F,QAAQmhD,gBAAgB,gBAG/CgmB,UAAU,MAEXt+C,SAGP/qB,KAAKo+F,SAAU,OAAiB,CAAC1sF,eAAgB1R,KAAK0R,gBAAiB,cAAe,CAACwsF,IACvFl+F,KAAKo+F,QAAQhrF,UAAUrS,IAAI,QAE3Bf,KAAKwjD,OAAO/3C,OAAOzL,KAAK08F,WAAY18F,KAAKo+F,SAEzC,MAAMC,EAAe,IAAI,KAAe,IAElC1oB,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3Bf,KAAK+0F,eAAiB,IAAI,KAAW,CACnC/uD,MAAO,iBACPgyB,UAlEyB,KAqE3B2d,EAAalqE,OAAOzL,KAAK+0F,eAAe5pF,WACxCkzF,EAAa7rF,QAAQ/G,OAAOkqE,GAE5B,MAAM2oB,EAAe,CAAC1jF,EAAmB2jF,EAAqB7qF,EAAgF8qF,KAC5I,MAAMz6D,EAAU,IAAI,KAAe,CACjCnsB,KAAM2mF,EACN99B,aAAa,IAGf18B,EAAQ54B,UAAUiI,UAAUrS,IAAI,cAAe6Z,GAE/C,MAAMmyC,EAAahpB,EAAQ82C,yBAiB3B,OAhBA9tB,EAAW35C,UAAUrS,IAAI,qBAEzB2S,EAAQ5O,SAASonE,IACf,MAAMl2D,GAAS,OAAO,yDAA0D,CAC9EpC,KAAMs4D,EAAEt4D,KACRC,KAAMq4D,EAAEr4D,KACR0K,UAAU2tD,EAAE7vB,iBAAar4C,IAGxBkoE,EAAEt0D,OACH4mF,EAAGtyB,EAAEt0D,MAAQ5B,GAGf+2C,EAAWthD,OAAOuK,MAGb+tB,GAGT/jC,KAAKg8F,eAAiBsC,EAAa,uBAAwB,gBAAiB,CAAC,CAC3E1qF,KAAM,cACNC,KAAM,kCACNwoC,YAAY,GACX,CACDxoC,KAAM,2BACND,KAAM,aACNgE,KAAM,YACL,CACD/D,KAAM,8BACND,KAAM,cACNgE,KAAM,gBACL,CACD/D,KAAM,yBACND,KAAM,QACNgE,KAAM,UACL,CACD/D,KAAM,2BACND,KAAM,UACNgE,KAAM,cACL,CACD/D,KAAM,uBACND,KAAM,OACNgE,KAAM,SACJ5X,KAAKi+F,OAETj+F,KAAKi8F,eAAiBqC,EAAa,uBAAwB,gBAAiB,CAAC,CAC3E1qF,KAAM,gBACNC,KAAM,kCACNwoC,YAAY,GACX,CACDxoC,KAAM,6BACND,KAAM,OACNgE,KAAM,iBACL,CACD/D,KAAM,0BACND,KAAM,UACNgE,KAAM,oBACL,CACD/D,KAAM,4BACND,KAAM,YACNgE,KAAM,iBACJ5X,KAAKi+F,OAETj+F,KAAK4vB,WAAWnkB,OAAOzL,KAAK26E,iBAAkB36E,KAAKmT,QAASkrF,EAAalzF,UAAWnL,KAAKg8F,eAAe7wF,UAAWnL,KAAKi8F,eAAe9wF,WAEvI,MAAMszF,EAAyBz+F,KAAKg8F,eAAe7wF,UAAUqM,cAAc,sBACrEknF,EAAyB1+F,KAAKi8F,eAAe9wF,UAAUqM,cAAc,uBAE3E,QAAiBinF,EAAuBjnF,cAAc,SAAwB,KAC5ExX,KAAKg5E,OAAOC,UAAUojB,GAAqBzxE,KAAK5qB,KAAKs4B,OAAQ,WAAYt4B,QACxE,CAAC0R,eAAgB1R,KAAK0R,kBAEzB,QAAiBgtF,EAAuBlnF,cAAc,SAAwB,KAC5ExX,KAAKg5E,OAAOC,UAAUojB,GAAqBzxE,KAAK5qB,KAAKs4B,OAAQ,WAAYt4B,QACxE,CAAC0R,eAAgB1R,KAAK0R,kBAEzB,QAAiB1R,KAAK08F,YAAY,KAChC,GAAG18F,KAAK+0F,eAAe1kE,MAAMjd,UAAUqB,SAAS,SAC9C,OAGF,IAAIzU,KAAK+0F,eAAetoF,MAAMyjB,OAE5B,YADAlwB,KAAK+0F,eAAe1kE,MAAMjd,UAAUrS,IAAI,SAI1C,IAUIuN,EAVAqwF,EAAW/lF,MAAMC,KAAK4lF,EAAuB5pE,UAA4B6B,MAAM,GAAGqe,QAAO,CAACC,EAAKp0C,IAAOo0C,KAAQp0C,EAAG0K,MAAM2b,SAAS,GACpI03E,GAAW3+F,KAAKs4B,OAAOsmE,cAAc/7F,OAEjC87F,GAKJ3+F,KAAK08F,WAAWhvF,aAAa,WAAY,QAMvCY,EAHEtO,KAAKs4B,OAAO3wB,GAGJ3H,KAAKgH,SAASm0F,eAAegD,mBAAmBn+F,KAAKs4B,QAFrDt4B,KAAKgH,SAASm0F,eAAegB,mBAAmBn8F,KAAKs4B,QAKjEhqB,EAAQD,MAAM+tF,IACTA,GACDp8F,KAAKyS,WAENkF,OAAOpS,IACQ,4BAAbA,EAAI3D,MACL,EAAA0pD,EAAA,IAAM,yCAENn/C,QAAQwf,MAAM,4BAA6BpmB,MAE5CsS,SAAQ,KACT7X,KAAK08F,WAAWr5C,gBAAgB,iBAxBhC,EAAAiI,EAAA,IAAM,sDA0BP,CAAC55C,eAAgB1R,KAAK0R,iBAEzB1R,KAAK0R,eAAe3Q,IAAIf,KAAK+0F,eAAe1kE,MAA5CrwB,CAAmD,SAAS,KAC1DA,KAAKs4B,OAAOxpB,MAAQ9O,KAAK+0F,eAAetoF,MACxCzM,KAAK6+F,wBAGP,MAAMC,EAAsD,SAAd9+F,KAAK4B,KAAkB,CACnE5B,KAAKgH,SAASm0F,eAAe4D,qBAAqB/+F,KAAKs4B,OAAO3wB,GAAI,gBAClE3H,KAAKgH,SAASm0F,eAAe4D,qBAAqB/+F,KAAKs4B,OAAO3wB,GAAI,iBAClE3H,KAAKgH,SAASm0F,eAAe4D,qBAAqB/+F,KAAKs4B,OAAO3wB,GAAI,kBAChE,GAEJ,OAAO+Y,QAAQkI,IAAI,CACjB5oB,KAAK67F,qBAAuB1H,EAAA,uBAAkC,CAC5DhpF,UAAWnL,KAAK26E,iBAChBl3E,MAAM,EACNc,UAAU,EACVqe,MAAO,GACPI,OAAQ,IACP,aAAa3U,MAAMjM,IACpBpC,KAAKS,UAAY2B,EAEV+xF,EAAA,oBAA+B/xF,SAGrC08F,IAIP/iB,qBACE/7E,KAAK67F,qBAAqBxtF,MAAK,KAC7BrO,KAAKS,UAAU8D,UAAW,EAC1BvE,KAAKS,UAAU+D,UAIXw6F,eAENh/F,KAAKy1E,SAAS,aACdz1E,KAAKo+F,QAAQhrF,UAAUrS,IAAI,QAC3Bf,KAAK08F,WAAWtpF,UAAU7Q,OAAO,QACjCvC,KAAK+0F,eAAetoF,MAAQ,GAE5B,IAAI,MAAMqxF,KAAQ99F,KAAKi+F,MAErBj+F,KAAKi+F,MAAMH,GAAMxyF,MAAM2b,QAAU,OAI7Bg4E,aAENj/F,KAAKy1E,SAAuB,WAAdz1E,KAAK4B,KAAoB,YAAc,oBAEpC,SAAd5B,KAAK4B,OACN5B,KAAKo+F,QAAQhrF,UAAU7Q,OAAO,QAC9BvC,KAAK08F,WAAWtpF,UAAUrS,IAAI,SAGhC,MAAMu3B,EAASt4B,KAAKs4B,OACpBt4B,KAAK+0F,eAAetoF,OAAQ,EAAA8oD,EAAA,GAAcj9B,EAAOxpB,OAEjD,IAAI,MAAMgvF,KAAQ99F,KAAKi+F,MACrBj+F,KAAKi+F,MAAMH,GAAyCxyF,MAAM2b,QAAYqR,EAAO9qB,OAAOswF,GAA2C,GAAK,OAGtI,CAAE,iBAA2B,kBAA4Bh5F,SAAcyH,GAAQ,kCAC7E,MAAMw3B,EAAU/jC,KAAKuM,GACf2yF,EAAK/nE,EAAA,uBAAiC,CAACgoE,aAAa,IAE1D,IAAIhhE,EAAQ7F,EAAO/rB,GAGnB,MAAM6yF,EAAgBr3F,GAAmB,kCACvC,eAAgB/H,KAAKgH,SAAS8G,mBAAmBuxF,cAAct3F,OAAaA,EAAOg2B,UAAkF,gBAAhE/9B,KAAKgH,SAASy1B,gBAAgBC,QAAQ30B,EAAOk2B,aAAaxuB,KAG3J6vF,QAAiB,EAAAC,EAAA,GAAYphE,GAAQp2B,GAAWq3F,EAAQr3F,KAC9Do2B,EAAMt7B,OAAS,EACfs7B,EAAM97B,QAAQi9F,GAEdnhE,EAAQA,EAAMzH,QAEd,MAAM8oE,EAAmBC,GAAoB,kCAC3C,IAAI,IAAI/7E,EAAI,EAAG7gB,EAAS0D,KAAKI,IAAIw3B,EAAMt7B,OAAQ48F,GAAU/7E,EAAI7gB,IAAU6gB,EAAG,CACxE,MAAM3b,EAASo2B,EAAMxN,QACrB,IAAG5oB,EAAOg2B,kBAA2B/9B,KAAKgH,SAAS8G,mBAAmBuxF,cAAct3F,IAClF,SAGF,MAAM,IAACmvB,GAAOC,EAAA,qBAA+B,CAC3CpvB,OAAQA,EACRoD,UAAW+zF,EACXzgE,eAAe,EACf3N,WAAW,EACXD,WAAY,UAEdqG,EAAIiF,gBAAgBxjB,cAAcpW,SAGjC47B,EAAMt7B,OACPw6B,EAASnX,iBAAiB8C,aAAY,QAAK,sBAAuB,CAACmV,EAAMt7B,UACjEw6B,GACRA,EAAS96B,YAMb,IAAI86B,EACJ,GAHA0G,EAAQ82C,yBAAyBpvE,OAAOyzF,GAGrC/gE,EAAMt7B,OAAQ,CACf,MAAM2P,EAAUuxB,EAAQ82C,yBACxBx9C,GAAW,OAAO,yDAA0D,CAACzpB,KAAM,SACnFypB,EAASjqB,UAAUrS,IAAI,YAAa,gBACpC,QAAiBs8B,GAAU,IAAMmiE,EAAW,KAAK,CAAC9tF,eAAgB1R,KAAK0R,iBACvE2rB,EAAS5xB,QAAO,QAAK,sBAAuB,CAAC0yB,EAAMt7B,UAEnD2P,EAAQ/G,OAAO4xB,GAGjBmiE,EAAW,QAIfX,qBACE,GAAiB,SAAd7+F,KAAK4B,KAAiB,CACvB,MAAMuhD,IAAW,EAAAqvC,EAAA,GAAUxyF,KAAK48F,eAAgB58F,KAAKs4B,QACrDt4B,KAAK08F,WAAWtpF,UAAUxJ,OAAO,QAASu5C,GAC1CnjD,KAAKo+F,QAAQhrF,UAAUxJ,OAAO,OAAQu5C,IAI1C+5C,UAAU5kE,EAAsB2jC,GAC3Bj8D,KAAKmL,WAENyN,MAAMC,KAAK7Y,KAAKmL,UAAUgN,iBAAiB,mBAAmBrT,SAASlE,GAAOA,EAAG2B,WAGhF05D,GACDj8D,KAAK48F,eAAiBtkE,EACtBt4B,KAAKs4B,QAAS,EAAA+J,EAAA,GAAK/J,KAEnBt4B,KAAKs4B,OAASA,EACdt4B,KAAKi/F,aACLj/F,KAAK6+F,sBAIFj0E,KAAK0N,GAqBV,YApBct0B,IAAXs0B,GACDt4B,KAAKk9F,UAAU,CACbztF,EAAG,eACH9H,GAAI,EACJmH,MAAO,GACPtB,OAAQ,GACRsvF,aAAc,GACd8B,cAAe,GACfc,cAAe,GACfxD,cAAe,GACfF,eAAgB,GAChBC,eAAgB,KACf,GACHj8F,KAAK4B,KAAO,WAEZ5B,KAAKk9F,UAAU5kE,GAAQ,GACvBt4B,KAAK4B,KAAO,QAIPmQ,MAAM6Y,OAAOvc,MAAK,KACN,SAAdrO,KAAK4B,MACN5B,KAAKk9F,UAAUl9F,KAAK48F,gBAAgB,GACpC58F,KAAKi/F,cAELj/F,KAAKg/F,qB,4GCjYN,MAAMW,EAAgC,wBAEtC,MAAMC,UAAwB,IAInC7/F,cACEgS,MAAM,CACJilF,UAAW5rF,SAASuQ,eAAe,gBACnCkkF,cAAc,EACd1oD,eAAgB,UAPZ,KAAA2oD,uBAAwB,EAWhC50F,UAAUlE,GACRhH,KAAKgH,SAAWA,EAEhB,qBAA4B,gBAAgB,CAAC6R,EAAM2lF,KAC9CA,IAAO,YAAqB3lF,IAAS,YACtC7Y,KAAK+/F,eAAc,MAIvB,qBAA4B,UAAU,KACpC//F,KAAKggG,yBAIFC,uBACL,MAAMltF,EAAM/S,KAAKi5E,UAAU,KAAmB,GAG9C,OAFAlmE,EAAIimE,OAASh5E,KAEN+S,EAGFmtF,sBAAsBntF,GAC3B,MAAMotF,EAAcngG,KAAKogG,eACzB,GAAGD,EAAa,CACd,MAAMr3F,EAAM9I,KAAKqgG,cAAcxmF,QAAQsmF,GAEpCngG,KAAKsgG,WAAWC,YAAcJ,EAAYh1F,WAC3CnL,KAAKsgG,WAAWE,QAAQztF,MAAAA,OAAG,EAAHA,EAAK5H,WAG5B4H,IACW,IAATjK,IACD9I,KAAKqgG,cAAcv3F,GAAOiK,GAGVotF,EAAYh1F,UAAUiI,UAAUqB,SAAS,WAEzD1B,EAAI5H,UAAUiI,UAAUrS,IAAI,UAG9Bo/F,EAAYh1F,UAAU6d,YAAYjW,EAAI5H,cAE1B,IAATrC,GACD9I,KAAKqgG,cAAczyE,OAAO9kB,EAAK,GAGjCq3F,EAAYh1F,UAAU5I,eAGxBvC,KAAKw0B,cAAc9c,QAAQ3E,EAAI5H,WAGjCnL,KAAKogG,eAAiBrtF,EAGjB0tF,WAAW94F,EAAY2tB,EAAkBorE,GAC1C1gG,KAAKqgG,cAAcx9F,QACrB7C,KAAK+/F,eAAc,EAAOzqE,GAG5BvjB,MAAM0uF,WAAW94F,EAAI2tB,EAASorE,GAGxBV,sBACN,MAAM94E,EAAalnB,KAAKg3F,UAAU1hB,YAAct1E,KAAKg3F,UAAUtrC,uBAAuB4pB,YACtFlqE,SAAS04E,gBAAgBx4E,MAAM4tF,YAAY,4BAA6B,GAAKhyE,GAGxE64E,cAAcrgF,EAAkB4V,GACrC,MAAMlU,EAAShW,SAASI,KAAK4H,UAAUqB,SAASkrF,GAChD,IAAIgB,EAaJ,QAZc38F,IAAX0b,EACEA,EACG0B,IACFu/E,GAAa,GAEPv/E,IACRu/E,GAAa,GAGfA,GAAa,GAGXA,EAAY,OAAOjgF,QAAQxS,UAE3BkT,GAAWphB,KAAKqgG,cAAcx9F,QAChC7C,KAAKogG,eAAex1E,OAGlB5qB,KAAK8/F,wBACP9/F,KAAKggG,sBACLhgG,KAAK8/F,uBAAwB,GAG/B,MAAMc,EAAmB,cAAuBx/E,EAAS,EAAI,EAAGkU,GAEhE,OADAlqB,SAASI,KAAK4H,UAAUxJ,OAAO+1F,EAA+BjgF,GACvDkhF,GA+CX,MAAMC,EAAkB,IAAIjB,EAC5B,qBAAiCiB,EACjC,W,sfCrJe,MAAMC,UAA0B,IAMhCjvE,O,yCACX7xB,KAAKmL,UAAUiI,UAAUrS,IAAI,sBAAuB,0BACpD,MAAMm8E,UAAgBl9E,KAAKgH,SAASy1B,gBAAgB04D,UAAUn1F,KAAK+H,OAAOk2B,aAC1Ej+B,KAAKy1E,SAASyH,EAAQ,kBAAoB,QAE1C,CACE,MAAMn5C,EAAU,IAAI,KAAe,CAAC08B,aAAa,IAC3ClgB,EAA4B,GAE5Bo1B,EAAevqE,SAASC,cAAc,OAe5C,GAdAsqE,EAAaviE,UAAUrS,IAAI,iBAE3Bf,KAAK+0F,eAAiB,IAAI,KAAW,CACnC/uD,MAAO,YACPpuB,KAAM,eACNogD,UAAW,GACXvX,UAAU,IAEZzgD,KAAKkuF,mBAAqB,IAAI,KAAW,CACvCloD,MAAO,WACPpuB,KAAM,mBACNogD,UAAW,KAGVh4D,KAAK+H,OAAQ,CACd,MAAMy0B,QAAax8B,KAAKgH,SAASy1B,gBAAgBC,QAAQ18B,KAAK+H,QAE3Dm1E,GACDl9E,KAAK+0F,eAAex7B,cAAc/8B,EAAK6zC,YACvCrwE,KAAKkuF,mBAAmB30B,cAAc/8B,EAAK8zC,aAE3CtwE,KAAK+0F,eAAev7B,iBAAiBh9B,EAAK6zC,YAC1CrwE,KAAKkuF,mBAAmB10B,iBAAiBh9B,EAAK8zC,YAelD,GAXAqF,EAAalqE,OAAOzL,KAAK+0F,eAAe5pF,UAAWnL,KAAKkuF,mBAAmB/iF,WAC3Eo1C,EAAYl+C,KAAKrC,KAAK+0F,eAAgB/0F,KAAKkuF,oBAE3CluF,KAAKouF,SAAW,IAAI,IAAS,CAC3BrmF,OAAQ/H,KAAK+H,OACbw4C,YAAAA,EACA7uC,eAAgB1R,KAAK0R,eACrBovC,iBAAiB,IAEnB9gD,KAAKwS,QAAQ/G,OAAOzL,KAAKouF,SAASztC,SAE/B3gD,KAAK+H,OAAQ,CACd,MAAMuiB,EAAMlf,SAASC,cAAc,OACnCif,EAAIlX,UAAUrS,IAAI,eAClBupB,EAAI7e,OAAOzL,KAAKouF,SAASvtC,YAEzB,MAAMkgD,EAA6B,IAAI,IAAc,CACnDltF,KAAM,kBAGRktF,EAA2B1wE,MAAM1iB,iBAAiB,UAAW7F,IACvDA,EAAE0B,WAINxJ,KAAKgH,SAAS8G,mBAAmBkzD,eAAehhE,KAAK+H,WAGvD/H,KAAK0R,eAAe3Q,IAAI,IAAxBf,CAAmC,mBAAyBw9B,GAAW,EAAD,gCACpE,GAAqB,eAAlBA,EAAO9B,KAAKjsB,EAAoB,OACnC,MAAM1H,GAAS,OAAUy1B,EAAO9B,KAAKA,MACrC,GAAG17B,KAAK+H,SAAWA,EAAQ,CACzB,MAAMyJ,UAAkBxR,KAAKgH,SAASi6D,wBAAwBwuB,QAAQjyD,EAAOwyD,kBAC1Ex+E,IAAYuvF,EAA2Bx8D,UACxCw8D,EAA2Bx8D,QAAU/yB,SAK3C,MAAMwvF,EAAiB51F,SAASC,cAAc,OAC9C21F,EAAe5tF,UAAUrS,IAAI,gBAC7BigG,EAAev1F,OAAO,IAAI,IAAU,CAClC1D,OAAQ/H,KAAK+H,SACZ7F,SAGH,MAAM++F,EAAqB71F,SAASC,cAAc,OAMlD,GALA41F,EAAmB7tF,UAAUrS,IAAI,oBACjCkgG,EAAmBx1F,QAAO,QAAK,6BAE/Bs4B,EAAQvxB,QAAQ/G,OAAO6e,EAAK02E,EAAgBC,EAAoBtrB,GAE5DuH,EAWG,CACL,MAAM1gD,QAAax8B,KAAKgH,SAASy1B,gBAAgBC,QAAQ18B,KAAK+H,QAExDm5F,EAAW,IAAI,KAAI,CACvBttF,KAAM,QACNy+C,aAAc71B,EAAKG,WAAQ34B,EAAY,eACvC8K,MAAO0tB,EAAKG,OAAQ,OAAgBH,EAAKG,YAAU34B,EACnD28D,gBAAiBnkC,EAAKG,MAAQ,QAAU,4BACxC+1C,iBAAkBl2C,EAAKG,WAAQ34B,EAAY,CAAC,IAAI,IAAU,CAAC+D,OAAQ/H,KAAK+H,SAAS7F,WAGnF6hC,EAAQvxB,QAAQ/G,OAAOy1F,EAAS/1F,eAtBvB,CACT,MAAM62D,EAAmB,IAAI,KAAI,CAC/Bj8B,cAAeg7D,EACfnuB,sBAAsB,EACtBlhE,eAAgB1R,KAAK0R,iBAGjBF,UAAkBxR,KAAKgH,SAASi6D,wBAAwBC,iBAAiBlhE,KAAK+H,QAAQ,IAC5Fg5F,EAA2Bx8D,QAAU/yB,EAErCuyB,EAAQvxB,QAAQ/G,OAAOu2D,EAAiB72D,iBAe1C44B,EAAQvxB,QAAQ/G,OAAOkqE,GAGzB31E,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,YAE/B,QAAiBnL,KAAKouF,SAASztC,SAAS,IAAW,EAAD,gCAChD3gD,KAAKouF,SAASztC,QAAQjS,UAAW,EAEjC1uC,KAAKgH,SAASy1B,gBAAgB0kE,WAC5BnhG,KAAK+H,OACL/H,KAAK+0F,eAAetoF,MACpBzM,KAAKkuF,mBAAmBzhF,aACjBzM,KAAKgH,SAASy1B,gBAAgBC,QAAQ18B,KAAK+H,SAAS40B,OAC3D9kB,SAAQ,KACR7X,KAAKouF,SAASztC,QAAQ0C,gBAAgB,YACtCrjD,KAAKyS,eAEN,CAACf,eAAgB1R,KAAK0R,iBAG3B,IAAIwrE,EAAO,CACT,MAAMn5C,EAAU,IAAI,KAAe,IAI7Bq9D,GAAY,OAAO,qCAAsC,CAACxtF,KAAM,SAAUC,KAAM,4BAEtF,QAAiButF,GAAW,KAC1B,IAAI,IAAU,uBAAwB,CACpCr5F,OAAQ/H,KAAK+H,OACbsqD,aAAc,gBACdC,mBAAoB,0BACpB5+C,SAAS,OAAgB,CAAC,CACxB6+C,QAAS,SACTvV,SAAU,KACR,MAAMpzC,GAAS,OAAiB,CAACw3F,IAAY,GAE7CphG,KAAKgH,SAASy1B,gBAAgB4kE,eAAe,CAACrhG,KAAK+H,SAASsG,MAAK,KAC/DrO,KAAKyS,WACJ,KACD7I,QAGJy/D,UAAU,OAEXt+C,SACF,CAACrZ,eAAgB1R,KAAK0R,iBAEzBqyB,EAAQvxB,QAAQ/G,OAAO21F,GAEvBphG,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,kB,0QCvKtB,MAAMm2F,UAAuB,IAI7BzvE,O,qCACX7xB,KAAKmL,UAAUiI,UAAUrS,IAAI,sBAAuB,wBAEpD,MAAM6gC,QAAoB5hC,KAAKgH,SAASi4B,gBAAgB2C,YAAY5hC,KAAKo2E,QAEzEp2E,KAAKy1E,SAAS7zC,EAAc,cAAgB,aAE5C,MAAMmC,EAAU,IAAI,KAAe,CACjCnsB,KAAMgqB,EAAc,cAAgB,cAGhCwV,GAAS,SACTmqD,EAAa,IAAI,KAAI,CACzBlvB,WAAY,IAAI,IAAW,CACzB9f,QAAS3wB,EAAc,iBAAmB,cAC1ChqB,KAAMw/B,EACN3qC,MAAO,YAETk0D,gBAAiB/+B,EAAc,qBAAuB,oBAElD4/D,EAAY,IAAI,KAAI,CACxBnvB,WAAY,IAAI,IAAW,CACzB9f,QAAS3wB,EAAc,gBAAkB,aACzChqB,KAAMw/B,EACN3qC,MAAO,WAETk0D,gBAAiB/+B,EAAc,oBAAsB,mBAEjDkvC,GAAO,QAAkB,CAACywB,EAAYC,IAAa/0F,IACvD,MAAM6H,EAAI,CAACmtF,EAAgBC,GACd,WAAVj1F,GAAoB6H,EAAEvD,UAEzBuD,EAAE,GAAGnJ,UAAUiI,UAAU7Q,OAAO,QAChC+R,EAAE,GAAGnJ,UAAUiI,UAAUrS,IAAI,QAE7BgvB,OAGI+pB,QAAmB95C,KAAKgH,SAASi4B,gBAAgBsjC,QAAQviE,KAAKo2E,QAEpEryC,EAAQvxB,QAAQ/G,OAAOqlE,GAEvB,MAAM2wB,EAAiB,IAAI,KAAe,IAGpCE,EAAU,IAAI,KAAI,CACtB7yF,MAAQ9O,KAAKu/B,SAASkjC,gBAA0D3B,KAChFH,gBAAiB/+B,EAAc,yBAA2B,sBAC1DlT,UAAW,MACT,OAAqB1uB,KAAKu/B,SAASkjC,gBAA0D3B,OAC7F,EAAAxV,EAAA,IAAM,YAAY,cAAc,KAElC55C,eAAgB1R,KAAK0R,iBAGjBkwF,GAAY,OAAO,qCAAsC,CAAChuF,KAAM,SAAUC,KAAM,gBAEtF,QAAiB+tF,GAAW,KAC1B,IAAI,IAAU,cAAe,CAC3BluF,QAAS,CAAC,CACR6+C,QAAS,eACTvV,SAAU,KACR,MAAMpzC,GAAS,EAAAgyC,EAAA,GAAiB,CAACgmD,IAAY,GAE7C5hG,KAAKgH,SAASo4B,kBAAkByiE,kBAAkB7hG,KAAKo2E,QAAQ,GAAM/nE,MAAMyyD,IACzEl3D,IACA+3F,EAAQ7yF,MAAMiQ,UAAY+hD,QAMhCzO,aAAc,aACdC,mBAAoB,gBACnBvnC,SACF,CAACrZ,eAAgB1R,KAAK0R,iBAEzB+vF,EAAejvF,QAAQ/G,OAAOk2F,EAAQx2F,UAAWy2F,GAEjD,MAAMF,EAAgB,IAAI,KAAe,CACvCvuF,QAASyuB,EAAc,+BAAiC,6BACxD6+B,aAAa,IAGTkV,EAAevqE,SAASC,cAAc,OAC5CsqE,EAAaviE,UAAUrS,IAAI,iBAE3B,MAAMwC,EAAc,QAEdwsB,EAAW,KACf,MAAMozB,EAAWo+C,EAAWlvB,WAAW9tC,SAAY80B,IAAkB91D,GAClEu+F,EAAexoC,mBAAqBwoC,EAAezxE,MAAMjd,UAAUqB,SAAS,SAC/EstF,EAAS3uF,UAAUxJ,OAAO,aAAcu5C,IAGpC2+C,EAAiB,IAAI,IAAmB,CAC5C97D,MAAO,oBACPpuB,KAAM,oBACN2Q,WAAW,EACX7W,eAAgB1R,KAAK0R,eACrB68E,cAAe,iBACfE,YAAa,eACbD,UAAW,aACXz+D,SAAUA,EACVhoB,OAAQ/H,KAAKo2E,OAAOnkD,UAAS,GAC7B+vE,KAAMz+F,GACLvD,KAAKgH,UAEFqyD,EAAgB91D,GAAgBu2C,EAAsBxd,UAAY,IAExEq5C,EAAalqE,OAAOq2F,EAAe32F,WACnCu2F,EAAclvF,QAAQ/G,OAAOkqE,GAE7B,MAAMosB,GAAW,OAAa,CAACnuF,KAAM,QAASgH,UAAW,eACzD5a,KAAKwS,QAAQ/G,OAAOs2F,IAEpB,QAAiBA,GAAU,MACC,OAAgBA,GAC1C,MAAMzlE,EAAWklE,EAAUnvB,WAAW9tC,QAAUu9D,EAAeG,WAAa,GAC5EjiG,KAAKgH,SAASi4B,gBAAgBijE,YAAYliG,KAAKo2E,QAAQ/nE,MAAMumF,GACpD50F,KAAKgH,SAASi4B,gBAAgB8vD,eAAe6F,EAAWt4D,KAC9DjuB,MAAK,KAENrO,KAAKyS,aAEN,CAACf,eAAgB1R,KAAK0R,kBAExB2nD,IAAkB91D,EAAci+F,EAAYD,GAAYlvB,WAAW9tC,SAAU,EAC9Eu9D,EAAetoC,iBAAiBH,GAEhCr5D,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,UAAWs2F,EAAet2F,UAAWu2F,EAAcv2F,WAElF,CACE,MAAM44B,EAAU,IAAI,KAAe,CACjCnsB,KAAM,qBACNzE,QAASyuB,EAAc,mCAAqC,mCAGxDmE,EAAgB,IAAI,IAAc,CACtClyB,KAAM,wBACNwoC,YAAY,IAGdr8C,KAAK0R,eAAe3Q,IAAIglC,EAAc1V,MAAtCrwB,CAA6C,UAAU,KACrD,MAAM4J,EAASm8B,EAAc6V,kBAAiB,GAC9C57C,KAAKgH,SAASi4B,gBAAgBkjE,iBAAiBniG,KAAKo2E,OAAQrwC,EAAcxB,SAASl2B,MAAK,KACtFzE,UAIJ,MAAMw4F,EAAe,KACnBr8D,EAAciW,mBAAoBlC,EAAsBtsC,OAAO60F,aAGjEriG,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,eAAgBo2E,IAC9Cp2E,KAAKo2E,SAAWA,GACjBgsB,OAIJA,IAEAr+D,EAAQvxB,QAAQ/G,OAAOs6B,EAAcC,OAErChmC,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,a,wYChLtB,MAAMm3F,UAA8B,IAKpCzwE,O,qCAIX,IAAI0wE,EAHJviG,KAAKmL,UAAUiI,UAAUrS,IAAI,sBAAuB,8BACpDf,KAAKy1E,SAAS,oBAId,CACE,MAAM1xC,EAAU,IAAI,KAAe,CACjCnsB,KAAM,0BAGF0S,EAAMlf,SAASC,cAAc,OACnCif,EAAIlX,UAAUrS,IAAI,sBAClBgjC,EAAQvxB,QAAQ2E,aAAamT,EAAKyZ,EAAQj1B,OAE1C,MAAMggB,EAAOqI,EAAA,uBAAiC,CAACw/C,KAAK,IACpDrsD,EAAI7e,OAAOqjB,GAEX,MAAM,IAACoI,GAAOC,EAAA,qBAA+B,CAC3CpvB,OAAQ/H,KAAKqhE,OAAOpvC,UAAS,GAC7B9mB,UAAW2jB,EACX2P,eAAe,EACf5N,WAAY,eAGdqG,EAAIiF,gBAAgB1wB,QAAO,EAAAuyB,EAAA,SAA0Bh+B,KAAKgH,SAASy1B,gBAAgBC,QAAQ18B,KAAKqhE,UAEhG,MAAM1gE,EAAI,IAAI6hG,EAAgB,CAC5BpsB,OAAQp2E,KAAKo2E,OACb1kE,eAAgB1R,KAAK0R,eACrB+yB,SAAUV,EAAQvxB,QAClBqsB,YAAoC,6BAAvB7+B,KAAK6+B,YAAYpvB,EAAmCzP,KAAK6+B,iBAAc76B,GACnFhE,KAAKgH,UAERu7F,EAAkB,KAEhB,MAAME,EAAS9hG,EAAEw4E,UACS,6BAAvBn5E,KAAK6+B,YAAYpvB,IAAoC,EAAA+iF,EAAA,GAAUxyF,KAAK6+B,YAAY6jE,cAAcl1F,OAAQi1F,EAAOj1F,SAIhHxN,KAAKgH,SAASi4B,gBAAgB0jE,WAAW3iG,KAAKo2E,OAAQp2E,KAAK6+B,YAAa4jE,IAG1EziG,KAAK65E,cAAclsE,iBAAiB,UAAW40F,EAAiB,CAACv0F,MAAM,IAEvEhO,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAGjC,CACE,MAAM44B,EAAU,IAAI,KAAe,IAEnC,GAA0B,6BAAvB/jC,KAAK6+B,YAAYpvB,EAAkC,CACpD,MAAMmzF,GAAqB,OAAO,qCAAsC,CAAChvF,KAAM,SAAUC,KAAM,4BAE/F,QAAiB+uF,GAAoB,KACnC,MAAMh5F,GAAS,EAAAgyC,EAAA,GAAiB,CAACgnD,IAAqB,GACtD5iG,KAAKgH,SAASi4B,gBAAgB4jE,oCAAoC7iG,KAAKo2E,OAAQp2E,KAAK6+B,aAAaxwB,MAAK,KACpGrO,KAAK65E,cAActoE,oBAAoB,UAAWgxF,GAClDviG,KAAKyS,WACJ,KACD7I,SAED,CAAC8H,eAAgB1R,KAAK0R,iBAEzBqyB,EAAQvxB,QAAQ/G,OAAOm3F,GAGzB,MAAMxB,GAAY,OAAO,qCAAsC,CAACxtF,KAAM,aAAcC,KAAM,2BAE1F,QAAiButF,GAAW,MACX,EAAAxlD,EAAA,GAAiB,CAACwlD,IAAY,GAC7CphG,KAAKgH,SAASi4B,gBAAgB6jE,gBAAgB9iG,KAAKo2E,OAAQp2E,KAAK6+B,aAAaxwB,MAAK,KAChFrO,KAAK65E,cAActoE,oBAAoB,UAAWgxF,GAClDviG,KAAKyS,aAqBN,CAACf,eAAgB1R,KAAK0R,iBAEzBqyB,EAAQvxB,QAAQ/G,OAAO21F,GAEvBphG,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,a,0kBC7F9B,MAAMq3F,EASXziG,YAAoBotB,EAKTnmB,GALS,KAAAmmB,QAAAA,EAKT,KAAAnmB,SAAAA,EACThH,KAAKkL,YAGMA,Y,yCACXlL,KAAK6mB,EAAI,CACP,CAACo3E,MAAO,CAAC,iBAAkBpqF,KAAM,uBAAwBkvF,cAAe,0BACxE,CAAC9E,MAAO,CAAC,cAAepqF,KAAM,4BAA6BkvF,cAAe,+BAC1E,CAAC9E,MAAO,CAAC,gBAAiB,aAAcpqF,KAAM,+BAAgCkvF,cAAe,kCAC7F,CAAC9E,MAAO,CAAC,cAAepqF,KAAM,4BAA6BkvF,cAAe,+BAC1E,CAAC9E,MAAO,CAAC,eAAgBpqF,KAAM,6BAA8BkvF,cAAe,gCAC5E,CAAC9E,MAAO,CAAC,gBAAiBpqF,KAAM,8BAA+BkvF,cAAe,iCAC9E,CAAC9E,MAAO,CAAC,gBAAiBpqF,KAAM,8BAA+BkvF,cAAe,iCAC9E,CAAC9E,MAAO,CAAC,eAAgBpqF,KAAM,6BAA8BkvF,cAAe,iCAG9E/iG,KAAKgjG,WAAa,CAChB,cAAiB,CAAC,aAAc,gBAAiB,aAAc,gBAGjE,MAAM71E,EAAUntB,KAAKmtB,QACf2sB,QAAuC95C,KAAKgH,SAASi4B,gBAAgBsjC,QAAQp1C,EAAQipD,QACrF6sB,EAAsBnpD,EAAKopD,sBAC3BT,EAASt1E,EAAQ0R,YCxDZ,SAAwCib,EAAoB2oD,GACzE,GAAG3oD,EAAKopD,sBAAuB,CAC7BT,GAAS,EAAApgE,EAAA,GAAKogE,GACd,MAAMU,EAAgBrpD,EAAKopD,sBAAsB11F,OACjD,IAAI,MAAMkW,KAAKy/E,EAEbV,EAAOj1F,OAAOkW,GAAKy/E,EAAcz/E,GAIrC,OAAO++E,ED8CgCW,CAA+BtpD,EAAsB3sB,EAAQ0R,YAAY6jE,eAAiBO,EAEzHI,EAA+Bl2E,EAAQ0R,YAAc,2BAA6B,gCACxF,IAAI,MAAMigC,KAAQ9+D,KAAK6mB,EAAG,CACxB,MAAMy8E,EAAWxkC,EAAKm/B,MAAM,GAC5Bn/B,EAAK/4B,cAAgB,IAAI,IAAc,CACrClyB,KAAMirD,EAAKjrD,KACX0wB,SAAS,EAAA1C,EAAA,GAAUiY,EAAMwpD,EAAUb,GACnC9mD,aAAa,EACbU,YAAY,KAIZlvB,EAAQ0R,aACNokE,EAAoBz1F,OAAO81F,IAE5BxpD,EAAsBxd,WAEnBwiC,EAAKm/B,MAAMrpF,SAAS,iBACpBkqD,EAAKm/B,MAAMrpF,SAAS,mBAIxBkqD,EAAK/4B,cAAc1V,MAAMqe,UAAW,GAYpC,QAAiBowB,EAAK/4B,cAAcC,OAAQl+B,KAC1C,EAAAwjD,EAAA,IAAM,YAAY+3C,GAAiB,MAClC,CAAC3xF,eAAgByb,EAAQzb,kBAG3B1R,KAAKgjG,WAAWM,IACjBn2E,EAAQzb,eAAe3Q,IAAI+9D,EAAK/4B,cAAc1V,MAA9ClD,CAAqD,UAAU,KACzD2xC,EAAK/4B,cAAcxB,SACPvkC,KAAK6mB,EAAEyR,QAAQ5U,GAAM1jB,KAAKgjG,WAAWM,GAAU1uF,SAAS8O,EAAEu6E,MAAM,MACxEn5F,SAASg6D,IACbA,EAAK/4B,cAAcxB,SAAU,QAMrCpX,EAAQsX,SAASh5B,OAAOqzD,EAAK/4B,cAAcC,WAIxCmzC,UACL,MAAMspB,EAA2B,CAC/BhzF,EAAG,mBACH8zF,WAAY,WACZ/1F,OAAQ,IAGV,IAAI,MAAMsxD,KAAQ9+D,KAAK6mB,GACLi4C,EAAK/4B,cAAcxB,SAEjCu6B,EAAKm/B,MAAMn5F,SAASg5F,IAElB2E,EAAOj1F,OAAOswF,IAAQ,KAK5B,OAAO2E,GAII,MAAMe,UAA+B,IAGrC3xE,O,yCAIX,IAAI4xE,EAHJzjG,KAAKmL,UAAUiI,UAAUrS,IAAI,sBAAuB,+BACpDf,KAAKy1E,SAAS,sBAGd,CACE,MAAM1xC,EAAU,IAAI,KAAe,CACjCnsB,KAAM,6BAGR6rF,EAAkB,IAAIjB,EAAgB,CACpCpsB,OAAQp2E,KAAKo2E,OACb1kE,eAAgB1R,KAAK0R,eACrB+yB,SAAUV,EAAQvxB,SACjBxS,KAAKgH,UAERhH,KAAK65E,cAAclsE,iBAAiB,WAAW,KAC7C3N,KAAKgH,SAASi4B,gBAAgBykE,4BAA4B1jG,KAAKo2E,OAAQqtB,EAAgBtqB,aACtF,CAACnrE,MAAM,IAEVhO,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAGjC,CACE,MAAM44B,EAAU,IAAI,KAAe,CACjCnsB,KAAM,sBAGF+rF,EAAkB,IAAI,KAAI,CAC9BtxC,aAAc,sBACdsO,gBAAiB,UACjB/sD,KAAM,UACN8a,UAAW,KACT,IAAI,IAAc,CAChB07C,UAAW,CAAC,uBACZxB,SAAW7gE,IACTrF,YAAW,KACTkhG,EAAgB77F,KACf,IAELxE,YAAa,oCACbwE,QAAS/H,KAAKo2E,UAGlB1kE,eAAgB1R,KAAK0R,iBAGjBkyF,EAAwB77F,GAAmB,kCAC/C,IAAI82B,EACJ,IACEA,QAAoB7+B,KAAKgH,SAASo4B,kBAAkBykE,sBAAsB7jG,KAAKo2E,OAAQruE,GACvF,MAAMxC,GAEN,YADA,EAAA+lD,EAAA,IAAM,iCAIR,MAAMv4C,EAAM/S,KAAKg5E,OAAOC,UAAUqpB,GAClCvvF,EAAI8rB,YAAcA,EAClB9rB,EAAIqjE,OAASp2E,KAAKo2E,OAClBrjE,EAAIsuD,OAASt5D,EACbgL,EAAI6X,UAGNmZ,EAAQvxB,QAAQ/G,OAAOk4F,EAAgBx4F,WAWvC,MAAMu1B,EAAIqD,EAAQ82C,yBAClBn6C,EAAEttB,UAAUrS,IAAI,sBAEhB,MAAM+tB,EAAOqI,EAAA,uBAAiC,CAACw/C,KAAK,IACpDj2C,EAAEj1B,OAAOqjB,IAET,QAAiBA,GAAOhnB,IACtB,MAAMzH,GAAS,EAAAs+B,EAAA,GAAU72B,EAAEzH,OAAQ,EAAAu+B,yBACnC,IAAIv+B,EAAQ,OAEZ,MAAM0H,EAAS1H,EAAOslB,QAAQ5d,OAAOkqB,WACrC2xE,EAAgB77F,KACf,CAAC2J,eAAgB1R,KAAK0R,iBAEzB,MAAMoyF,EAAc,CAAMplE,EAAaG,IAA6D,kCAClG,MAAMklE,EAAellE,EAAY6jE,cAC3BO,SAA8BjjG,KAAKgH,SAASi4B,gBAAgBsjC,QAAQviE,KAAKo2E,SAA0B8sB,sBAGnGc,EAA0B,GAChCP,EAAgB58E,EAAE/hB,SAASg6D,IACzB,MAAMwkC,EAAWxkC,EAAKm/B,MAAM,GAEzB8F,EAAav2F,OAAO81F,KAAcL,EAAoBz1F,OAAO81F,IAC9DU,EAAS3hG,KAAKy8D,EAAKikC,kBAOvB,MAAMniG,EAAK89B,EAAGlnB,cAAc,sBAEzBwsF,EAASnhG,SACVjC,EAAGme,UAAY,GACfne,EAAG6K,WAAU,QAAKu4F,EAASzpF,KAAKumB,IAAM,QAAKA,MAAK,KAKlDlgC,EAAGwS,UAAUxJ,OAAO,QAASo6F,EAASnhG,WAGlC9B,EAAM,CAAC89B,EAA0DpzB,KACrE,MAAM,IAACyrB,GAAOC,EAAA,qBAA+B,CAC3CpvB,QAAQ,EAAAk8F,EAAA,GAAUplE,EAAYnD,MAC9BvwB,UAAW2jB,EACX2P,eAAe,EACf5N,WAAY,aACZplB,OAAAA,IAGFq4F,EAAY5sE,EAAIgtE,OAAQrlE,IAgCpBslE,EAAY,MAChB,EAAAp7E,EAAA,GAAe46E,EAAgBtpE,UAAU,QAAK+pE,EAAkB,8BAAgC,2BAA4B,CAACA,MAG/H,IACIC,EADAD,EAAkB,EAEtB,MAAME,EAAY,KAEhBD,EAAS,IAAI,IAAiB,CAC5Bz0E,WAAY5vB,KAAK4vB,WACjB20E,WAAY,IACHvkG,KAAKgH,SAASo4B,kBAAkBC,uBAAuBr/B,KAAKo2E,OAAQ,CAAC3mE,EAAG,4BAA6Bo2B,EAAG,IAJhG,GAIiH/W,EAAKE,mBAAmB3gB,MAAMoiB,IAC5J,IAAI,MAAMoO,KAAepO,EAAIoL,aAC3B96B,EAAI89B,GAA4D,GAMlE,OAHAulE,EAAkB3zE,EAAIC,MACtByzE,IAEO1zE,EAAIoL,aAAah5B,OAZX,IAYkC4tB,EAAIC,QAAU5B,EAAKE,uBAKjEq1E,EAAOzhG,QAGhB5C,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,kBAEtBnL,KAAKgH,SAASi4B,gBAAgBC,UAAUl/B,KAAKo2E,eAC9CkuB,KAENH,IAEAnkG,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,kBAAkB,EAAEwkG,YAAAA,EAAaC,UAAAA,MAC/DzkG,KAAKo2E,SAAWouB,IACjBxkG,KAAKo2E,OAASquB,EACdH,aAOVvoB,qBACE/7E,KAAK4vB,WAAWwG,Y,sUE3UL,MAAMsuE,UAA4B,IAGlC7yE,O,+CACX7xB,KAAKy1E,SAAS,aAEd,MAAMyV,QAA2BlrF,KAAKgH,SAAS8jF,oBAAoB6Z,8BAC7DplE,QAAiBv/B,KAAKgH,SAASo4B,kBAAkBE,YAAYt/B,KAAKo2E,QAClEx0C,QAAoB5hC,KAAKgH,SAASi4B,gBAAgB2C,YAAY5hC,KAAKo2E,QAEzE,IAAIwuB,EAA6C,QAA5B,EAAArlE,EAASslE,2BAAmB,QAAI,CAACp1F,EAAG,qBACrDq1F,EAAgBF,EAChBr8C,EAAY,IAAInnD,IAAyB,sBAArBwjG,EAAen1F,EAA4Bm1F,EAAeG,UAAUxqF,KAAK4wE,GAAcA,EAAoCK,WAAY,IAE/J,MAAMwZ,EAA6Bz8C,GAAyCA,EAAUhuC,KAAKixE,IAAa,CAAE/7E,EAAG,gBAAiB+7E,SAAAA,MAExHyZ,EAAwB,IACzBrjE,EACM,6BAGkB,qBAApBkjE,EAAcr1F,EAA2B,yBAAgD,sBAApBq1F,EAAcr1F,EAA4B,uBAAyB,0BAG3Iy1F,EAAgB,IAAI,KAAe,CACvCttF,KAAMgqB,OAAc59B,EAAY,qBAChCmP,QAAS8xF,MAGLE,EAAmB,IAAI,KAAe,CAC1CvtF,KAAM,2BAGFwtF,EAAkC,K,MACtC,MAAMxhF,EAAiG,QAAlE,EAAAkhF,EAAkDC,iBAAgB,QAAI,GAC3Gx8C,EAAY,IAAInnD,IAAIwiB,EAAErJ,KAAI,EAAEixE,SAAAA,KAAcA,KAC1C6Z,EAAyBvgG,SAAQ,CAACihC,EAAeylD,KAC/CzlD,EAAciW,iBAAiBuM,EAAUllD,IAAImoF,QAIjD,IAAI8Z,EACJ,GAAG1jE,EAAa,CACd0jE,EAAsB,IAAI,IAAc,CAAC17F,QAAQ,EAAM26B,QAA8B,sBAArBqgE,EAAen1F,IAC/E,MAAM81F,EAAY,IAAI,KAAI,CACxBx/D,cAAeu/D,EACfjzC,aAAc,kBACd3gD,eAAgB1R,KAAK0R,iBAGvBwzF,EAAc1yF,QAAQ/G,OAAO85F,EAAUp6F,WAEvCnL,KAAK0R,eAAe3Q,IAAIukG,EAAoBj1E,MAA5CrwB,CAAmD,UAAU,KAC3D,IAAIwlG,GAAO,EACPF,EAAoB/gE,QAEdkhE,EAAeC,OAAO3/D,IAAmBA,EAAcxB,UAC/DugE,EAAgB,CAACr1F,EAAG,oBAAqBs1F,UAAWC,EAA0B9Z,EAAmB3wE,KAAI,EAAE4wE,SAAAA,KAAcA,MACzF,sBAApB2Z,EAAcr1F,EACtBq1F,EAAgB,CAACr1F,EAAG,oBAAqBs1F,UAAWC,EAA0BpsF,MAAMC,KAAK0vC,KAEzFi9C,GAAO,EANPV,EAAgB,CAACr1F,EAAG,qBASnB+1F,IACDJ,IACAO,YAGC,CACL,MAAMrxF,EAAyC,CAC7C,CAAC,mBAAoB,gBACrB,CAAC,oBAAqB,iBACtB,CAAC,oBAAqB,gBAGlByb,EAAW,KACfo1E,EAAiBh6F,UAAUiI,UAAUxJ,OAAO,OAA4B,sBAApBk7F,EAAcr1F,IAGpE,IAAIhD,EAAQm4F,EAAen1F,EAC3B,MAAMqhE,GAAO,QAAoBx8D,EAAEiG,KAAI,EAAE9N,EAAO8+C,MACvC,CACLA,YAAAA,EACA9+C,MAAAA,EACA83B,QAASqgE,EAAen1F,IAAMhD,OAE7B+yC,IACH/yC,EAAQ+yC,EAGNslD,EADW,qBAAVr4F,EACe,CACdgD,EAAGhD,EACHe,OAAQ,CACNo4F,cAAc,IAGA,sBAAVn5F,EACQ,CACdgD,EAAGhD,GAGW,CACdgD,EAAGhD,EACHs4F,UAAWC,EAA0B,CAAC,KAAM,SAIhD,EAAAj8E,EAAA,GAAem8E,EAAc/xF,SAAS,QAAK8xF,MAC3CG,IACAO,IACA51E,OAGFm1E,EAAc1yF,QAAQ/G,OAAOqlE,GAC7B/gD,IAGF,MAAMs1E,EAAuD,IAAI9jG,IAC3DkkG,EAAiBva,EAAmB3wE,KAAK8wE,IAC7C,MAAMG,EAAWH,EAAkBF,SAC7BplD,EAAgB,IAAI,IAAc,CACtCn8B,QAAQ,EACR26B,QAASgkB,EAAUllD,IAAImoF,KAGzB6Z,EAAyB1hG,IAAI6nF,EAAUzlD,GAEvC/lC,KAAK0R,eAAe3Q,IAAIglC,EAAc1V,MAAtCrwB,CAA6C,UAAU,KAClD+lC,EAAcxB,SACfgkB,EAAUxnD,IAAIyqF,GAEX8Z,IAAwBA,EAAoB/gE,UAC7C+gE,EAAoB/gE,SAAU,KAGhCgkB,EAAUtnD,OAAOuqF,IAEd8Z,MAAAA,OAAmB,EAAnBA,EAAqB/gE,WAAYgkB,EAAU3gD,OAC5C09F,EAAoB/gE,SAAU,IAIlCohE,OAGF,MAAMxrE,EAAM,IAAI,KAAI,CAClB4L,cAAAA,EACAj3B,MAAOu8E,EAAkBv8E,MACzBwrB,aAAa,EACb5oB,eAAgB1R,KAAK0R,iBAWvB,OARA,OAAiB,CACfyoB,IAAAA,EACAx4B,IAAK0pF,EAAkBC,YACvB1jF,KAAM,UAGRu9F,EAAiB3yF,QAAQ/G,OAAO0uB,EAAIhvB,WAE7B46B,KAGH8/D,EAAgB,IAAW,kCAC/BF,EAAuBryF,eAMA,sBAApBwxF,EAAcr1F,IACfq1F,EAAcC,UAAYC,EAA0BpsF,MAAMC,KAAK0vC,KAQjEvoD,KAAKgH,SAASi4B,gBAAgB6mE,0BAA0B9lG,KAAKo2E,OAAQ0uB,GACrEF,EAAiBE,KAGba,GAAyB,EAAAxsF,EAAA,GAAS0sF,EAAe,KAAM,GAAO,GAEpE7lG,KAAK65E,cAAclsE,iBAAiB,WAAW,KAC1Cg4F,EAAuBI,eACxBF,MAED,CAAC73F,MAAM,IAEVhO,KAAK4vB,WAAWnkB,OAAOy5F,EAAc/5F,UAAWg6F,EAAiBh6F,e,0SCtLtD,MAAM66F,UAAuB,IAO1BC,Q,+CAEdjmG,KAAK0R,eAAeC,YACpB3R,KAAK4vB,WAAWzkB,UAAU4T,UAAY,GAC3B,QAAX,EAAA/e,KAAKsb,cAAM,QAAXtb,KAAKsb,OAAW,GAChB,MAAMA,IAAWtb,KAAKsb,OAEtBtb,KAAKmL,UAAUiI,UAAUrS,IAAI,sBAAuB,wBACpDf,KAAKy1E,SAAS,QAEd,IAAIl2C,QAAiBv/B,KAAKgH,SAASo4B,kBAAkBE,YAAYt/B,KAAKo2E,QAAQ,GAE9E,MAAMt8B,QAAuC95C,KAAKgH,SAASi4B,gBAAgBsjC,QAAQviE,KAAKo2E,QAClFx0C,QAAoB5hC,KAAKgH,SAASi4B,gBAAgB2C,YAAY5hC,KAAKo2E,QACnEl3C,QAAkBl/B,KAAKgH,SAASi4B,gBAAgBC,UAAUl/B,KAAKo2E,QAE/D8vB,EAAsC,GACtCC,EAAyBnpD,IAC7BkpD,EAAoB7jG,KAAK26C,IAG3Bh9C,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,eAAgBo2E,IAC9Cp2E,KAAKo2E,SAAWA,GACjB8vB,EAAoBphG,SAASk4C,GAAaA,SAI9Ch9C,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,oBAA0Bo2E,GAAW,kCACnEp2E,KAAKo2E,SAAWA,IACjB72C,SAAiBv/B,KAAKgH,SAASo4B,kBAAkBgnE,kBAAkBhwB,KAAW72C,QAIlF,MAAMx3B,EAAS/H,KAAKo2E,OAAOnkD,UAAS,GAC9Bo0E,QAAsBrmG,KAAKgH,SAASi4B,gBAAgB4C,UAAU7hC,KAAKo2E,OAAQ,eAC3EkwB,QAA6BtmG,KAAKgH,SAASi4B,gBAAgB4C,UAAU7hC,KAAKo2E,OAAQ,sBAExF,CACE,MAAMryC,EAAU,IAAI,KAAe,CAAC08B,aAAa,IAC3ClgB,EAA4B,GAE5Bo1B,EAAevqE,SAASC,cAAc,OA+B5C,GA9BAsqE,EAAaviE,UAAUrS,IAAI,iBAE3Bf,KAAKumG,mBAAqB,IAAI,KAAW,CACvCvgE,MAAOpE,EAAc,mBAAqB,yBAC1ChqB,KAAM,YACNogD,UAAW,IACXvX,UAAU,IAEZzgD,KAAKwmG,sBAAwB,IAAI,KAAW,CAC1CxgE,MAAO,yBACPpuB,KAAM,mBACNogD,UAAW,MAGbh4D,KAAKumG,mBAAmB/sC,iBAAiB1f,EAAKhrC,OAC9C9O,KAAKwmG,sBAAsBhtC,iBAAiBj6B,EAASshC,OAErD8U,EAAalqE,OAAOzL,KAAKumG,mBAAmBp7F,UAAWnL,KAAKwmG,sBAAsBr7F,WAElFo1C,EAAYl+C,KAAKrC,KAAKumG,mBAAoBvmG,KAAKwmG,uBAE/CxmG,KAAKouF,SAAW,IAAI,IAAS,CAC3BrmF,OAAAA,EACAw4C,YAAAA,EACA7uC,eAAgB1R,KAAK0R,iBAEvB1R,KAAKwS,QAAQ/G,OAAOzL,KAAKouF,SAASztC,SAElC5c,EAAQvxB,QAAQ/G,OAAOzL,KAAKouF,SAASrtC,WAAW51C,UAAWwqE,GAExD0wB,EAAe,CAChB,MAAMI,EAAc,IAAI,KAAI,CAC1Bp0C,aAAczwB,EAAc,cAAgB,YAC5ClT,UAAW,KACT,MAAM3b,EAAM/S,KAAKg5E,OAAOC,UAAUqoB,GAClCvuF,EAAIqjE,OAASp2E,KAAKo2E,OAClBrjE,EAAIwsB,SAAWA,EACfxsB,EAAI6X,OAEJ5qB,KAAK0R,eAAe3Q,IAAIgS,EAAI8mE,cAA5B75E,CAA2C,UAAW0mG,IAExD9yF,KAAM,OACNlC,eAAgB1R,KAAK0R,iBAGjBg1F,EAAsB,KAG1B,IAAIn6F,EAFJk6F,EAAYpsE,SAAS/hB,YAAc,GAIjC/L,EADCq1B,EACMkY,EAAsBxd,SAAW,aAAe,cAEhDwd,EAAsBxd,SAAW,kBAAoB,mBAG9DmqE,EAAYpsE,SAAS5uB,QAAO,QAAKc,KAGnCm6F,IACA3iE,EAAQvxB,QAAQ/G,OAAOg7F,EAAYt7F,WAGrC,GAAGk7F,GAAiBC,EAAsB,CACxC,MAAMjZ,EAAe,IAAI,KAAI,CAC3Bh7B,aAAc,YACdz+C,KAAM,YACN8a,UAAW,KACT,MAAM3b,EAAM/S,KAAKg5E,OAAOC,UAAUyrB,GAClC3xF,EAAIqjE,OAASp2E,KAAKo2E,OAClBrjE,EAAI6X,OAAOvc,MAAK,KACXrO,KAAKsb,SAAWA,GAInBtb,KAAK0R,eAAe3Q,IAAIgS,EAAI8mE,cAA5B75E,CAA2C,UAAW2mG,OAG1Dj1F,eAAgB1R,KAAK0R,iBAIjBk1F,SAD2B5mG,KAAKgH,SAAS8jF,oBAAoBE,yBACf1yD,QAAQ+yD,IAAuBA,EAAkB79E,OAAO49E,WAAUvoF,OAChH8jG,EAAqB,K,MACzB,MAAME,EAAqD,QAA5B,EAAAtnE,EAASslE,2BAAmB,QAAI,CAACp1F,EAAG,qBACnE,GAAgC,sBAA7Bo3F,EAAuBp3F,EAA2B,CACnD,MAAM5M,EAASgkG,EAAuB9B,UAAUliG,OAC7CA,IAAW+jG,GACZ,EAAA79E,EAAA,GAAeskE,EAAahzD,UAAU,QAAK,iBAE3CgzD,EAAahzD,SAAS/hB,YAAczV,EAAS,IAAM+jG,OAGrD,EAAA79E,EAAA,GAAeskE,EAAahzD,UAAU,QAAkC,qBAA7BwsE,EAAuBp3F,EAA2B,eAAiB,uBAIlHk3F,IAEA5iE,EAAQvxB,QAAQ/G,OAAO4hF,EAAaliF,WAGtC,GAAGm7F,IAAyB1kE,EAAa,CACvC,MAAMq8D,EAAQ,CACZ,gBACA,aACA,gBACA,aACA,cACA,eACA,eACA,eAGI6I,EAAiB,IAAI,KAAI,CAC7Bz0C,aAAc,qBACd3jC,UAAW,KACT,MAAM3b,EAAM/S,KAAKg5E,OAAOC,UAAUuqB,GAClCzwF,EAAIqjE,OAASp2E,KAAKo2E,OAClBrjE,EAAI6X,QAENhX,KAAM,cACNlC,eAAgB1R,KAAK0R,iBAGjBq1F,EAAuB,IAAW,kCACtC,MAAMjtD,QAAa95C,KAAKgH,SAASi4B,gBAAgB+nE,aAAahnG,KAAKo2E,QACnE0wB,EAAezsE,SAAStb,UAAYk/E,EAAMlpD,QAAO,CAACC,EAAKxR,IAAMwR,KAAO,EAAAnT,EAAA,GAAUiY,EAAMtW,EAAIsW,EAAmBopD,wBAAwB,GAAK,IAAMjF,EAAMp7F,UAGtJkkG,IACAhjE,EAAQvxB,QAAQ/G,OAAOq7F,EAAe37F,WAEtCnL,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,eAAgBo2E,IAC9Cp2E,KAAKo2E,SAAWA,GACjB2wB,OA+DN,GAjDA/mG,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,YAE/B,QAAiBnL,KAAKouF,SAASztC,SAAS,KACtC3gD,KAAKouF,SAASztC,QAAQjS,UAAW,EAEjC,MAAMjX,EAA2B,GAE3B9vB,EAAK3H,KAAKo2E,OACbp2E,KAAKumG,mBAAmBjtC,mBACzB7hC,EAASp1B,KAAKrC,KAAKgH,SAASi4B,gBAAgBgoE,UAAUt/F,EAAI3H,KAAKumG,mBAAmB95F,QAGjFzM,KAAKwmG,sBAAsBltC,mBAC5B7hC,EAASp1B,KAAKrC,KAAKgH,SAASi4B,gBAAgBioE,UAAUv/F,EAAI3H,KAAKwmG,sBAAsB/5F,QAGpFzM,KAAKouF,SAASjuC,cACf1oB,EAASp1B,KAAKrC,KAAKouF,SAASjuC,eAAe9xC,MAAMgoE,GACxCr2E,KAAKgH,SAASi4B,gBAAgBq3C,UAAU3uE,EAAI0uE,MAIvD31D,QAAQuyC,KAAKx7B,GAAU5f,SAAQ,KAC7B7X,KAAKouF,SAASztC,QAAQ0C,gBAAgB,YACtCrjD,KAAKyS,aAEN,CAACf,eAAgB1R,KAAK0R,iBAuBtBkwB,UAAqB5hC,KAAKgH,SAASi4B,gBAAgB4C,UAAU7hC,KAAKo2E,OAAQ,gBAAgB,CAC3F,MAAM+wB,EAA4B,IAAI,IAAc,CAClDtzF,KAAM,wBACN0wB,UAAYuV,EAAsBtsC,OAAO45F,aAG3CpnG,KAAK0R,eAAe3Q,IAAIomG,EAA0B92E,MAAlDrwB,CAAyD,UAAU,KACjE,MAAM4J,EAASu9F,EAA0BvrD,kBAAiB,GAC1D57C,KAAKgH,SAASi4B,gBAAgBooE,iBAAiBrnG,KAAKo2E,OAAQ+wB,EAA0B5iE,SAASl2B,MAAK,KAClGzE,UAIJu8F,GAAsB,KACpBgB,EAA0BnrD,mBAAoBlC,EAAsBtsC,OAAO45F,eAG7ErjE,EAAQvxB,QAAQ/G,QAAO,QAA2B07F,GAA2Bh8F,YAIjF,IAAIy2B,EAAa,CACf,MAAMmC,EAAU,IAAI,KAAe,IAcnC,IAAInC,GAAeykE,EAAe,CAChC,MAAMiB,EAA+B,IAAI,IAAc,CACrDzzF,KAAM,gBAGR7T,KAAK0R,eAAe3Q,IAAIumG,EAA6Bj3E,MAArDrwB,CAA4D,UAAU,KACpE,MAAM4J,EAAS09F,EAA6B1rD,kBAAiB,GAC7D57C,KAAKgH,SAASi4B,gBAAgBsoE,uBAAuBvnG,KAAKo2E,QAASkxB,EAA6B/iE,SAASl2B,MAAK,KAC5GzE,UAKJ,MAAMw4F,EAAe,KACnBkF,EAA6BtrD,iBAAiB9c,IAAeK,EAAkC/xB,OAAOg6F,oBAGxGpF,IACA+D,EAAsB/D,GAEtBr+D,EAAQvxB,QAAQ/G,QAAO,QAA2B67F,GAA8Bn8F,WAG/E44B,EAAQvxB,QAAQwc,mBACjBhvB,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAInC,SAASnL,KAAKgH,SAASi4B,gBAAgB4C,UAAU7hC,KAAKo2E,OAAQ,eAAgB,CAC5E,MAAMryC,EAAU,IAAI,KAAe,IAE7Bq9D,GAAY,OAAO,qCAAsC,CAACxtF,KAAM,SAAUC,KAAM+tB,EAAc,yBAA2B,yBAE/H,QAAiBw/D,GAAW,KAC1B,IAAI,IAAkBr5F,OAAwB/D,GAAYsK,IACxD,MAAM1E,GAAS,EAAAgyC,EAAA,GAAiB,CAACwlD,IAAY,GAC7C9yF,EAAQD,MAAK,KACXrO,KAAKyS,WACJ,KACD7I,YAGH,CAAC8H,eAAgB1R,KAAK0R,iBAEzBqyB,EAAQvxB,QAAQ/G,OAAO21F,GAEvBphG,KAAK4vB,WAAWnkB,OAAOs4B,EAAQ54B,WAG7B+zB,GAEFl/B,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,kBAAkB,EAAEwkG,YAAAA,EAAaC,UAAAA,MAC/D18F,IAAWy8F,IACZxkG,KAAKo2E,OAASquB,EAAUpoE,WACxBr8B,KAAKimG,eAMNp0E,OACL,OAAO7xB,KAAKimG,S,4VCxVhB,MAAMwB,EAIF,GAGW,MAAMC,WAA0B,IAW7C3nG,YAAYi5E,GACVjnE,MAAMinE,GAAQ,GARR,KAAAlmE,SAAW,EAWZ+e,OAGL7xB,KAAKmL,UAAUiI,UAAUrS,IAAI,yBAA0B,qBAGvD,MAAM4mG,GAAc,OAAO,gCAAiC,CAACppF,UAAU,IACvEve,KAAK4nG,SAAS5+E,YAAY2+E,GAC1B3nG,KAAK4nG,SAAWD,EAEhB,MAAME,EAAoBz8F,SAASC,cAAc,OACjDw8F,EAAkBz0F,UAAUrS,IAAI,uBAChC4mG,EAAYl8F,OAAOo8F,GAEnB,MAAMC,EAAsB18F,SAASC,cAAc,OACnDy8F,EAAoBltF,UAAY,wBAEhC,MAAMmtF,EAAsB38F,SAASC,cAAc,OACnD08F,EAAoB30F,UAAUrS,IAAI,mBAElCf,KAAK8O,MAAMrD,QAAO,QAAK,YACvBzL,KAAKgoG,SAAU,OAAW,QAG1BD,EAAoBt8F,OAAOzL,KAAK8O,MAAO9O,KAAKgoG,SAE5C,MAAMC,EAAqB78F,SAASC,cAAc,OAClD48F,EAAmB70F,UAAUrS,IAAI,mBAEjC,MAAMmnG,EAA2BloG,KAAK8O,MAAM6Z,YAC5Cu/E,EAAYz8F,QAAO,QAAK,yBAExBw8F,EAAmBx8F,OAAOy8F,GAE1BJ,EAAoBr8F,OAAOs8F,EAAqBE,GAEhDjoG,KAAKwjD,OAAO/3C,OAAOq8F,GAInB9nG,KAAKuzF,QAAU,IAAI,IAAYvzF,KAAKgH,SAAUhH,KAAK4vB,WAAY5vB,KAAK0R,gBACpE1R,KAAKuzF,QAAQ1hE,OAEb7xB,KAAK4vB,WAAWnkB,OAAOzL,KAAKuzF,QAAQrxF,SAGpClC,KAAK4vB,WAAWpc,mBAAqB,KACnC,MAAMqO,EAAO7hB,KAAKixB,YAAY+C,IAAIlS,wBAClC,IAAID,EAAKe,MAAO,OAEhB,MAAMF,EAAMb,EAAKa,IAAM,EACvBylF,EAAiBzlF,GANG,KAStB,MAAMylF,EAAoBC,IACxBP,EAAkBz0F,UAAUxJ,OAAO,aAAcw+F,GACjDpoG,KAAKixB,YAAY9lB,UAAUiI,UAAUxJ,OAAO,mBAAoBw+F,GAChExO,GAAYwO,GAERA,GACFpoG,KAAKixB,YAAY6Q,wBAIf83D,GAAa,OAAiBkO,EAAqB,aAAc,IAAK,MAAM,GAElFlO,EAAW,IAEX,QAAiB55F,KAAK4nG,UAAW9/F,IAC5B9H,KAAK4nG,SAASxyF,kBAAkBhC,UAAUqB,SAAS,eACpDzU,KAAK4vB,WAAW4F,kBAAkB,CAChCtzB,QAASlC,KAAK4vB,WAAWzkB,UAAUiK,kBACnCqgB,SAAU,UAEZmkE,EAAW,GACXiO,EAAkBz0F,UAAU7Q,OAAO,eAC1BvC,KAAK4vB,WAAWqkD,4BACzBj0E,KAAKg5E,OAAOqvB,oBAEb,CAAC32F,eAAgB1R,KAAK0R,kBAEzB,QAAiB1R,KAAKgoG,SAAUlgG,IAC9B,IAAIiL,EAEFA,EADC/S,KAAK+H,OAAOg3B,YACP/+B,KAAKg5E,OAAOC,UAAU+sB,GAEtBhmG,KAAKg5E,OAAOC,UAAU,KAG3BlmE,IACEA,aAAeizF,EAChBjzF,EAAIqjE,OAASp2E,KAAK+H,OAAOs0B,WAEzBtpB,EAAIhL,OAAS/H,KAAK+H,OAGpBgL,EAAI6X,UAEL,CAAClZ,eAAgB1R,KAAK0R,iBAEzB1R,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,mBAAoBqhE,IAClDrhE,KAAK+H,SAAWs5D,GACjBrhE,KAAKsoG,mBAITtoG,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,eAAgBo2E,IAC9Cp2E,KAAK+H,SAAWquE,EAAOnkD,UAAS,IACjCjyB,KAAKsoG,mBAITtoG,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,uBAAwBkI,IACzDlI,KAAKuoG,kBAAkBrgG,MAGzBlI,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,kBAAkB,EAAE+H,OAAAA,EAAQygG,KAAAA,MAC7DxoG,KAAKyoG,sBAAsB1gG,EAAQ6Q,MAAMC,KAAK2vF,OAIhDxoG,KAAK0R,eAAe3Q,IAAIyc,EAAA,EAAxBxd,CAAmC,gBAAgB,EAAEkI,QAAAA,MACnDlI,KAAKuoG,kBAAkBrgG,MAKzBlI,KAAKixB,YAAc,IAAI,IAAe,CACpCkD,UAAW,CAAC,CACVliB,YAAa,2BACb2F,KAAM,oBACNhW,KAAM,WACL,CACDqQ,YAAa,gCACb2F,KAAM,kBACNhW,KAAM,SACL,CACDqQ,YAAa,8BACb2F,KAAM,kBACNhW,KAAM,SACL,CACDqQ,YAAa,yBACb2F,KAAM,kBACNhW,KAAM,SACL,CACDqQ,YAAa,2BACb2F,KAAM,kBACNhW,KAAM,SACL,CACDqQ,YAAa,gCACb2F,KAAM,kBACNhW,KAAM,UAERguB,WAAY5vB,KAAK4vB,WACjBiG,YAAc3B,IACZ,MAAM7a,EAA4B,YAAlB6a,EAAStyB,MAAsB4b,EAAA,6BAAuC,IAAM,EAC5F9a,YAAW,KACTgmG,EAAct1F,UAAUxJ,OAAO,YAA+B,YAAlBsqB,EAAStyB,QACpDyX,IAELrS,SAAUhH,KAAKgH,WAGjBhH,KAAKixB,YAAY0E,oBAAsB,KACrCwyE,GAAiB,IAGnBnoG,KAAKuzF,QAAQrxF,QAAQuJ,OAAOzL,KAAKixB,YAAY9lB,WAE7C,MAAMu9F,GAAgB,OAAa,CAAC90F,KAAM,qBAC1C5T,KAAKwS,QAAQ/G,OAAOi9F,IAEpB,QAAiBA,GAAe,IAAW,kCACzC,MAAM3gG,EAAS/H,KAAK+H,OACdJ,EAAK3H,KAAK+H,OAAOs0B,WACjB6C,QAAkBl/B,KAAKgH,SAASi4B,gBAAgBC,UAAUv3B,GAE1DghG,EAAmB,CAAChlE,EAAmBqZ,KAC3C,IAAIqV,EAA2B2X,EAC7B1X,EAAiCgX,EACjCnsB,EAEF,GAAGxZ,EAAQ9gC,OAAS,EAClBwvD,EAAe,uBACf2X,EAAgB,EAAC,QAAK,UAAW,CAACrmC,EAAQ9gC,UAC1CyvD,EAAqB,2BACrBgX,EAAsB3lC,EAAQppB,KAAKxS,IACjC,MAAMknC,EAAI7jC,SAASC,cAAc,KAEjC,OADA4jC,EAAExjC,OAAO,IAAI,IAAU,CAAC1D,OAAAA,IAAS7F,SAC1B+sC,KAGL/P,IACFie,EAAa,CAAC,CACZtpC,KAAM,4BACN0wB,SAAS,SAGR,CACL8tB,EAAe,yBACfC,EAAqB,2BACrB,MAAMrjB,EAAI7jC,SAASC,cAAc,KACjC4jC,EAAExjC,OAAO,IAAI,IAAU,CACrB1D,OAAQ47B,EAAQ,KACfzhC,SACHonE,EAAsB,CAACr6B,GAEnB/P,IACFie,EAAa,CAAC,CACZtpC,KAAM,8BACNi7B,SAAU,CAAC,IAAI,IAAU,CAAC/mC,OAAQ47B,EAAQ,KAAKzhC,SAC/CqiC,SAAS,KAKf+kC,EAAoBjnE,KAAK,IAAI,IAAU,CACrC0F,OAAAA,IACC7F,SAEH,IAAI,IAAU,oBAAqB,CACjC6F,OAAAA,EACAsqD,aAAAA,EACAC,mBAAAA,EACAgX,oBAAAA,EACA51D,QAAS,CAAC,CACR6+C,QAAS,MACTvV,SAAAA,IAEFG,WAAAA,IACCpyB,QAGCu0D,EAAW/5E,IACC,4BAAbA,EAAI3D,OACL,EAAA0pD,EAAA,IAAS,CAACC,YAAa,wBAI3B,GAAGrsB,EAAW,CACZ,MAAMnsB,EAAM/S,KAAKg5E,OAAOC,UAAU,KAClClmE,EAAI6X,KAAK,CACPhpB,KAAM,UACNs3E,WAAW,EACXC,QAAUx1C,IACRglE,EAAiBhlE,GAAS,KACxB,MAAMr1B,EAAUtO,KAAKgH,SAASi4B,gBAAgBs3C,gBAAgB5uE,EAAIg8B,GAClEr1B,EAAQqJ,MAAM2nE,GACdvsE,EAAIynF,gBAAgBlsF,OAGf,GAETQ,MAAO,kBACPvL,YAAa,uBAGf,IAAI,IAAc,CAChB6mE,UAAW,CAAC,YACZ7mE,YAAa,SACbqlE,SAAW7gE,IACTrF,YAAW,KACTimG,EAAiB,CAAC5gG,IAAUw8B,IAC1BvkC,KAAKgH,SAASi4B,gBAAgB2pE,YAAYjhG,EAAII,EAAQw8B,EAAQ38B,UAAO5D,EAAY,GAChF2T,MAAM2nE,QAER,UAIR,CAAC5tE,eAAgB1R,KAAK0R,iBAKd62F,kBAAkBrgG,G,yCAC7B,GAAGlI,KAAK6xB,KAAM,OAEd,MAAM,OAAC9pB,GAAUG,EACjB,GAAIu/F,EAAiB1/F,GAErB,IAAI,MAAMmsB,KAAYl0B,KAAKixB,YAAYkD,UAAW,CAChD,MAAMliB,EAAciiB,EAASjiB,YACvBmb,EAAUq6E,EAAiB1/F,GAAQkK,GACzC,IAAImb,EACF,SAGF,MAAMkyE,EAAWt/F,KAAKixB,YAAY8F,qBAAqB,CAAC7uB,GAAU+J,GAAaqmB,QAAQpwB,IAAaklB,EAAQ1sB,MAAMo/B,GAAMA,EAAE93B,MAAQE,EAAQF,KAAO83B,EAAE/3B,SAAWG,EAAQH,WACnKu3F,EAASz8F,SACVuqB,EAAQ3B,WAAW6zE,EAAS/kF,KAAKrS,IAAY,CAAEF,IAAKE,EAAQF,IAAKD,OAAQG,EAAQH,YAE9E/H,KAAK+H,SAAWA,IAA6D,IAAnD/H,KAAKixB,YAAY2B,gBAAgB3gB,KAC5DjS,KAAKixB,YAAY2B,gBAAgB3gB,IAAgBqtF,EAASz8F,OAC1D7C,KAAKixB,YAAYuJ,oBAAoB8kE,EAAUprE,GAAU,SAM1Du0E,sBAAsB1gG,EAAgB8+B,GAC3C,IAAG7mC,KAAK6xB,MAEJ41E,EAAiB1/F,GAArB,CAEA,IAAI,MAAMC,KAAO6+B,EACf,IAAI,MAAMjlC,KAAQ5B,KAAKixB,YAAYkD,UAAW,CAC5C,MAAMliB,EAAcrQ,EAAKqQ,YAEnBmb,EAAUq6E,EAAiB1/F,GAAQkK,GACzC,IAAImb,EAAS,SAEb,MAAMtkB,EAAMskB,EAAQrkB,WAAW+2B,GAAMA,EAAE93B,MAAQA,IAC/C,IAAY,IAATc,IAIHskB,EAAQQ,OAAO9kB,EAAK,GAEjB9I,KAAK+H,SAAWA,GAAQ,CACzB,MACMuiB,EADYtqB,KAAKixB,YAAYuB,KAAKvgB,GAClBuF,cAAc,cAAcxP,qBAAuBD,OACtEuiB,IACEtqB,KAAKixB,YAAYG,UAAUC,aAC5BrxB,KAAKixB,YAAYG,UAAUI,gBAAgBlH,GAG7CA,EAAI/nB,UAGHvC,KAAKixB,YAAY2B,gBAAgB3gB,IAAiBnJ,EAAM,KACvD9I,KAAKixB,YAAY2B,gBAAgB3gB,IAS3CjS,KAAK4vB,WAAWwG,YAGL2L,c,yCAEX/hC,KAAKuzF,QAAQxxD,cACb/hC,KAAKgoG,QAAQ50F,UAAUrS,IAAI,QAC3Bf,KAAKixB,YAAY8Q,aAAY,GAC7B/hC,KAAKmL,UAAUiI,UAAUxJ,OAAO,yBAAyB5J,KAAKixB,YAAYqP,0BAA0BtgC,KAAKgH,SAASi4B,gBAAgB4C,UAAU7hC,KAAK+H,OAAOs0B,WAAY,qBAI/JwsE,aAAav6F,GAClBtO,KAAKixB,YAAY6B,UAAYxkB,EAGxBwxD,QAAQ/3D,EAAgB+K,EAAW,G,MACxC,OAAG9S,KAAK+H,SAAWA,GAAU/H,KAAK8S,WAAaA,KAE/C9S,KAAK+H,OAASA,EACd/H,KAAK8S,SAAWA,EAChB9S,KAAK8oG,aAAc,EAEhB9oG,KAAK6xB,OACN7xB,KAAK6xB,OACL7xB,KAAK6xB,KAAO,MAGd7xB,KAAKixB,YAAYqR,SAAS,CACxBv6B,OAAAA,EAEA4qB,eAAuC,QAAzB,EAAE80E,EAAiB1/F,UAAM,QAAvB0/F,EAAiB1/F,GAAY,KAG/C/H,KAAKuzF,QAAQzzB,QAAQ/3D,EAAQ+K,IAEtB,GAGIqvD,sB,yCACPniE,KAAK8oG,cAIT9oG,KAAK8oG,aAAc,QACb9oG,KAAK+hC,oBACL/hC,KAAKsoG,sBACLtoG,KAAKuzF,QAAQpxB,0BAGPmmC,gB,yCACZ,IAAIv9E,EAEFA,EADC/qB,KAAK+H,OAAOg2B,SACN/9B,KAAK+H,SAAWyV,EAAA,eAAwBxd,KAAKgH,SAASy1B,gBAAgB04D,UAAUn1F,KAAK+H,OAAOk2B,mBAEtFj+B,KAAKgH,SAASi4B,gBAAgB4C,UAAU7hC,KAAK+H,OAAOs0B,WAAY,eAG/Er8B,KAAKgoG,QAAQ50F,UAAUxJ,OAAO,QAASmhB,MAGlCg+E,iBAAiBx6E,EAAiBkR,GACvCz/B,KAAKixB,YAAYruB,KAAK2rB,EAAQkR,GAGhCs8C,qBACE/7E,KAAK4vB,WAAWwG,WAGXtyB,UACL9D,KAAKgpG,aAAc,EACnBhpG,KAAKmiD,sBACLniD,KAAKuzF,QAAQzvF,UACb9D,KAAKixB,YAAYntB,a,2DCpcrB,MAAMmlG,EAAgB,CACpB/mG,EACA0Y,EACA89B,EACA9xC,EACA+sB,EACAy7C,EACA17C,KAEA,MAAM,QAACra,EAAO,IAAE6vF,GAAOhnG,EAAQyjB,QAmB/B,QAlBe3hB,IAAZqV,GACD/F,cAAc+F,QAMLrV,IAARklG,IACD31F,OAAOsgC,sBAAsBq1D,GACzB95B,UACKltE,EAAQyjB,QAAQujF,KAQxB95B,GAAW,gCAAwCxoE,EAMpD,YALA1E,EAAQyjB,QAAQujF,IAAM,GAAK31F,OAAOgzB,uBAAsB,YAC/CrkC,EAAQyjB,QAAQujF,IACvBD,EAAc/mG,EAAS0Y,EAAW89B,EAAU9xC,EAAU+sB,EAAiBy7C,EAAU,EAAG17C,OAMrFglB,GAAY99B,GACb1Y,EAAQkR,UAAUrS,IAAI6Z,GAGxB,MAAMuuF,EAAe,YACZjnG,EAAQyjB,QAAQtM,SACnBq/B,GAAY99B,GACd1Y,EAAQkR,UAAU7Q,OAAO,YAAaqY,GAGxC1Y,EAAQkR,UAAU7Q,OAAO,aAEzBoxB,MAAAA,GAAAA,KAIF,GADAD,MAAAA,GAAAA,KACI,iCAAyC9sB,EAG3C,OAFA1E,EAAQkR,UAAU7Q,OAAO,YAAa,kBACtC4mG,IAIFjnG,EAAQkR,UAAUrS,IAAI,aAEtBmB,EAAQkR,UAAUxJ,OAAO,aAAc8uC,GACvCx2C,EAAQyjB,QAAQtM,QAAU,GAAK3W,WAAWymG,EAAcviG,IAG1D,K,4GCvDe,MAAMwiG,EAUnBrpG,YAAYotB,GARL,KAAAkzE,cAA6C,GAI5C,KAAAR,cAAe,EA2BhB,KAAAwI,gBAAkB,KACV,mBAAuCroG,KAAKm3C,gBAEvD,SAA6Bn3C,KAAKm3C,gBAC1Bn3C,KAAKqgG,cAAcx9F,QAC3B7C,KAAKqpG,SAASrpG,KAAKqgG,cAAcrgG,KAAKqgG,cAAcx9F,OAAS,KAK1D,KAAAwmG,SAAW,CAAC1hG,EAA8B2tB,EAAmBorE,KAClE,QAAU18F,IAAP2D,GAAoB3H,KAAKqgG,cAAcrgG,KAAKqgG,cAAcx9F,OAAS,KAAO8E,EAE3E,OADA3H,KAAK29E,qBAAqBh2E,IACnB,EAIT,MAAM2hG,EAAYtpG,KAAKqgG,cAAct7E,MACrC/kB,KAAKygG,WAAW6I,EAAWh0E,EAASorE,GAEpC,MAAM3tF,EAAM/S,KAAKqgG,cAAcrgG,KAAKqgG,cAAcx9F,OAAS,GAE3D,OADA7C,KAAKsgG,gBAAmBt8F,IAAR+O,EAAqBA,aAAe,IAAiBA,EAAI5H,UAAY4H,EAAQ/S,KAAK6/F,cAAgB,EAAI,EAAIvqE,IACnH,IAvCP,OAAWt1B,KAAMmtB,GAEbntB,KAAKwyB,OACPxyB,KAAKwyB,KAAO,IAAIjxB,KAGlBvB,KAAKw0B,cAAgBx0B,KAAKg3F,UAAUx/E,cAAc,mBAClDxX,KAAKsgG,YAAa,OAAiBtgG,KAAKw0B,cAAe,aA3BnC,KA4BhBx0B,KAAK6/F,cACP7/F,KAAKsgG,WAAW,GAiCb1rE,UAAUjtB,G,MAKf,GAAG3H,KAAKqgG,cAAcrgG,KAAKqgG,cAAcx9F,OAAS,KAAO8E,EACvD,OAAO,EAGT,MAAMoL,EAAsBpL,aAAc,IAAiBA,EAAK3H,KAAKwyB,KAAKvvB,IAAI0E,GA0B9E,OAzBGoL,IAES,QAAV,EAAAA,EAAIo8B,cAAM,iBAGPp8B,EAAIgpE,oBACLr5E,YAAW,KAETqQ,EAAIgpE,uBAhFU,MAsFpB,aAAiC,CAC/Bn6E,KAAM5B,KAAKm3C,eACX7tB,MAAQC,IACNvpB,KAAKqpG,cAASrlG,EAAWulB,GAAY,IAC9B,KAKXvpB,KAAKqgG,cAAch+F,KAAKsF,GACxB3H,KAAKsgG,WAAW34F,aAAc,IAAiBA,EAAGwD,UAAYxD,IACvD,EAGFg2E,qBAAqBh2E,IAC1B,OAAiB3H,KAAKqgG,cAAe14F,GACrC3H,KAAKygG,WAAW94F,OAAI3D,GAGf+2E,kBAAkBiY,EAA6CuW,GACpE,IAAI,IAAI7lF,EAAI1jB,KAAKqgG,cAAcx9F,OAAS,EAAG6gB,GAAK,IAAKA,EAAG,CACtD,MAAM3Q,EAAM/S,KAAKqgG,cAAc38E,GAC/B,GAAG3Q,IAAQw2F,EAAX,CACK,GAAGx2F,aAAeigF,EACrB,MAGFhzF,KAAK29E,qBAAqB5qE,KAKvBy2F,OAAiCxW,GACtC,OAAOhzF,KAAKqgG,cAAc3/F,MAAMogC,GAAMA,aAAakyD,IAG9CyW,YAAYzW,GACjB,QAAShzF,KAAKwpG,OAAOxW,GAGbyN,WAAW94F,EAA6B2tB,EAAkBorE,G,MAC9DA,GACF,iBAAqC1gG,KAAKm3C,gBAAgB,GAG5D,MAAMpkC,EAAsBpL,aAAc,IAAiBA,EAAK3H,KAAKwyB,KAAKvvB,IAAI0E,GAC9E,GAAGoL,EAAK,CACN,IAEa,QAAX,EAAAA,EAAIq8B,eAAO,iBACX,MAAM7pC,GACN4G,QAAQwf,MAAM,oBAAqB5Y,GAIlCA,EAAIovC,qBACLz/C,YAAW,KAETqQ,EAAIovC,wBACH+sB,MAKFtQ,OAAO7rD,GACRA,EAAI5H,UAAUwN,gBAChB3Y,KAAKw0B,cAAc/oB,OAAOsH,EAAI5H,WAE3B4H,EAAI60F,UACL70F,EAAI60F,SAASj6F,iBAAiB,QAAS3N,KAAKqoG,kBAK3CpvB,UAAoCzN,EAAsCk+B,GAC/E,MAAM32F,EAAM,IAAIy4D,EAAKk+B,OAAc1lG,EAAYhE,MAAM,GAErD,OADA+S,EAAI/L,SAAWhH,KAAKgH,SACb+L,K,oHC1JI,MAAM42F,EAkBnB5pG,YAAYi5E,EAAuBgwB,GACjChpG,KAAK4pG,aAAa5wB,EAAQgwB,GAGrBY,aAAa5wB,EAAuBgwB,GAAc,GACvDhpG,KAAKg5E,OAASA,EACdh5E,KAAKgpG,YAAcA,EAEnBhpG,KAAKmL,UAAYC,SAASC,cAAc,OACxCrL,KAAKmL,UAAUiI,UAAUrS,IAAI,WAAY,uBAGzCf,KAAKwjD,OAASp4C,SAASC,cAAc,OACrCrL,KAAKwjD,OAAOpwC,UAAUrS,IAAI,kBAE1Bf,KAAK4nG,UAAW,OAAW,4BAA6B,CAACrpF,UAAU,IACnEve,KAAK8O,MAAQ1D,SAASC,cAAc,OACpCrL,KAAK8O,MAAMsE,UAAUrS,IAAI,yBACzBf,KAAKwjD,OAAO/3C,OAAOzL,KAAK4nG,SAAU5nG,KAAK8O,OAGvC9O,KAAKwS,QAAUpH,SAASC,cAAc,OACtCrL,KAAKwS,QAAQY,UAAUrS,IAAI,mBAE3Bf,KAAK4vB,WAAa,IAAI,KAAW5vB,KAAKwS,aAASxO,OAAWA,GAAW,GAErEhE,KAAKmL,UAAUM,OAAOzL,KAAKwjD,OAAQxjD,KAAKwS,SAErCxS,KAAKg5E,QACNh5E,KAAKg5E,OAAOpa,OAAO5+D,MAGrBA,KAAK0R,eAAiB,IAAI,IAGrBe,QACL,OAAOzS,KAAKg5E,OAAOqwB,SAASrpG,MAGjB4qB,QAAQgmC,G,qCACnB,GAAG5wD,KAAK6xB,KACN,IACE,MAAMyW,EAAStoC,KAAK6xB,QAAQ++B,GAC5B5wD,KAAK6xB,KAAO,KAETyW,aAAkB5nB,gBACb4nB,GAER,MAAM/iC,GACN4G,QAAQwf,MAAM,iBAAkBpmB,GAIpCvF,KAAKg5E,OAAOpkD,UAAU50B,O,+RAGjB6xB,QAAQ++B,IAILzhB,UACA4sC,sBACA3sC,WAEA+S,sB,MACLniD,KAAKgpG,cACNhpG,KAAKg5E,OAAOxmD,KAAKvxB,OAAOjB,MACxBA,KAAKmL,UAAU5I,SACfvC,KAAK4vB,WAAW9rB,UACG,QAAnB,EAAA9D,KAAK0R,sBAAc,SAAEC,aAIf8jE,SAASlpE,GACjBvM,KAAK8O,MAAMq8C,iBAAgB,QAAK5+C,KAI7B,MAAMs9F,UAAgCF,EAO3C5pG,YAAYi5E,GACVjnE,MAAMinE,GACNh5E,KAAK65E,cAAgB,IAAI,IAG3BzqC,UACEpvC,KAAK65E,cAAc1wE,cAAc,SAGnCg5C,sBACE,MAAMvnB,EAAU56B,KAAK65E,cAAciwB,wBAAwB,WAG3D,OAFA9pG,KAAK65E,cAAc1wE,cAAc,eAAgBuX,QAAQkI,IAAIgS,GAASvsB,KAAK,IAAM,MACjFrO,KAAK65E,cAAc5+D,UACZlJ,MAAMowC,yB,ibCrHF,MAAM4nD,UAAuB,IAc1ChqG,YAAYotB,GAgEV,IAAI9T,EApDJtH,MAAM,CACJi4F,SAAU78E,EAAQ68E,UAAY,CAAE9nG,GAAYlC,KAAKgH,SAASy1B,gBAAgBwtE,qBAAqB/nG,EAAQyF,KACvGuiG,SAAWhoG,IACTA,EAAQg1B,IAAIgtE,OAAO3hG,SACnBvC,KAAKmqG,oBAAsBnqG,KAAKmqG,sBAElCC,SAAUj9E,EAAQi9E,UAAY,CAAOloG,GAAY,EAAD,gCAC9C,MAAMu2F,GAAS,aAA0Bz4F,KAAKgH,SAASy1B,gBAAgBC,QAAQx6B,EAAQyF,MACvF,OAAezF,EAAQg1B,IAAIiF,gBAAiBs8D,OAE9C4R,OAAQ,CAACnoG,EAAS4G,KAChB,MAAMwhG,EAAmBpoG,EAAQg1B,IAAIgtE,OAAOvrF,gBAAkB3Y,KAAK8uB,MACnE,OAAuB5sB,EAAQg1B,IAAIgtE,OAAQlkG,KAAK8uB,KAAMhmB,GAEnDwhG,GAAoBtqG,KAAKmqG,oBAC1BnqG,KAAKmqG,sBAGTI,gBAAkBC,IAChB,MAAM,IAACtzE,GAAO,uBAA+B,CAC3CnvB,OAAQyiG,EAAK7iG,GACbwD,WAAW,EACX0lB,WAAY7wB,KAAK6wB,WACjBlC,WAAY3uB,KAAK2uB,WACjBmC,WAAW,EACX2N,cAAez+B,KAAKy+B,cACpB7gB,cAAe5d,KAAK4d,gBAItB,OADC4sF,EAAoBtzE,IAAMA,EACpBszE,GAETC,kBAAmB,KACnBC,eAAsB1tD,GAAa,EAAD,gCAChC,OAAI,OAAQh9C,KAAK8uB,aAIX,WAEF,OAAQ9uB,KAAK8uB,WAIjBkuB,GAAS,GAHAA,GAAS,IANTA,GAAS,QAxDd,KAAAnsB,WAAgC,aAChC,KAAA4N,eAAgB,EAChB,KAAA9P,YAAa,GAmErB,OAAW3uB,KAAMmtB,GAEjBntB,KAAK8uB,KAAO,yBAAiC9uB,KAAK2qG,uBAGlD,MAAMC,EAAY,KAChBvxF,EAAU9F,OAAO7Q,YAAW,KAC1B1C,KAAK6qG,YAAYrxF,IACZA,GACDoxF,SAGHb,EAAee,gBAGpBF,KAxFe,EAAAE,cAAgB,K,4hBCOnC,IAAIC,GAAY,EACD,SAASC,GAA6B,SAACpoD,EAAQ,eAAElxC,EAAc,SAAEiT,EAAUsmF,WAAYC,IAMpG,GAAG,IACD,OAGF,MAAMD,EAAa,CAACnjG,EAAeqjG,KACjC,IAAIvqG,EACJ,GAAGsqG,EAAoBtqG,EAAKsqG,EAAmBpjG,OAC1C,CACH,MAAMgC,EAAI6a,GAAY,yBACtB/jB,EAAMkH,EAAEzH,OAAuB+qG,QAAQthG,GAGzC,OAAOlJ,GAAQuqG,KAAkB,OAAcvqG,EAAIgiD,QAAkB5+C,EAALpD,GAG5DoG,EAAW,aAEjB0K,EAAe3Q,IAAI6hD,EAAnBlxC,CAA6B,aAAc5J,IACzC,GAAGijG,GAAajjG,EAAE4L,QAAU,GAAkB,IAAb5L,EAAEkO,OAAc,OACjD,IAAIq1F,EAAiBJ,EAAWnjG,GAChC,IAAIujG,EACF,OAKF,MAAMlkG,EAAQkkG,EAAe1lF,QAAQxe,MACrC,IAAIA,EACF,OAGF,MAAMyT,EAAY,iBACZta,EAA4B,iBAG5BgrG,EAAgB,8BAChBC,GAAc,SACpB,IAAIpgG,EAAwBqgG,EAE5B,MAAMC,EAAgB,EAAOJ,eAAAA,EAAgB1pG,IAAAA,EAAK+wB,WAAAA,EAAYg5E,WAAAA,EAAYC,YAAAA,KAMpE,EAAD,gCACH,MAAMC,GAAc,OAAsBjqG,GACpCkqG,EAAqBR,EAAevpF,wBACpChY,GAAI,OAAcnI,EAAIwM,EAAGxM,EAAIwN,GAC7BvH,EAAOgkG,EAAc,IAAM,IAC3BE,GAAU,OAAclkG,EAAMA,GAC9BmkG,EAASF,EAAUjpF,QAAUipF,EAAU7oF,OAAS8oF,EAAUhiG,EAAEkiG,aAAaF,GAEzE7xD,GAAS,OAAgBoxD,EAAgB,UACzClnF,GAAQ81B,GAASA,EAAO7mC,UAAUqB,SAAS,UAE3Cw3F,EAAc7gG,SAASC,cAAc,OAC3C4gG,EAAY74F,UAAUrS,IAAI6Z,EAAY,gBAEtC,MAAM+/D,EAAmBvvE,SAASC,cAAc,OAChDsvE,EAAiBvnE,UAAUrS,IAAI6Z,EAAY,YACX+/D,EAAiBrvE,MAAMsX,MAAQmpF,EAAOnpF,MAAQ,KAC7C+3D,EAAiBrvE,MAAM0X,OAAS+oF,EAAO/oF,OAAS,KAEjF,MAAMmnC,EAAe/+C,SAASC,cAAc,OAI5C,GAHA8+C,EAAa/2C,UAAUrS,IAAI6Z,EAAY,UACvCuvC,EAAa1+C,QAAO,OAAc9J,EAAI0sD,kBAEnCu9C,EAAa,CACd,MAAMvsD,GAAUz3C,EAAO,KAA4BA,GAAQ,GAAKuc,EAAQ,GAAK,GAC7E8nF,EAAY74F,UAAUrS,IAAI,cAG1BkrG,EAAY3gG,MAAM4tF,YAAY,eAAgB,GAAG75C,OACjD8K,EAAa7+C,MAAM4tF,YAAY,gBAAoB75C,EAAJ,MAGjD,MAAMl9B,GAAkB,OAAgBkpF,EAAgB,cAClDjpF,GAAc,OAAeipF,EAAgBlpF,GAAiB,EAAM0pF,IACvEzpF,EAAYE,SAASC,UAAYH,EAAYE,SAASE,aACvDm4D,EAAiBvnE,UAAUrS,IAAI,eAWjC,MAAM8gB,EAAOwpF,EAAevpF,wBACtBmB,EAASpB,EAAKe,MAAQmpF,EAAOnpF,MAC7BM,EAASrB,EAAKmB,OAAS+oF,EAAO/oF,OAC9BkpF,EAAarqF,EAAKI,MAAQ,UAAmBJ,EAAKe,OAAS,EAC3DupF,EAAatqF,EAAKa,KAAO,WAAoBb,EAAKmB,QAAU,EAClEipF,EAAY3gG,MAAM8Q,UAAY,aAAa8vF,QAAiBC,cAAuBlpF,MAAWC,KAC3FyoF,GAAaM,EAAY74F,UAAUrS,IAAI,gBAC1CkrG,EAAYxgG,OAAOkvE,EAAkBxwB,GACrCh/C,EAAUM,OAAOwgG,GAEjB,MAAM//B,QAAU,QAAY,CAC1BvqE,IAAAA,EACA2oB,IAAKqwD,EACLr6E,MAAAA,EACAsiB,MAAOmpF,EAAOnpF,MACdI,OAAQ+oF,EAAO/oF,OACfxe,MAAM,EACNf,MAAM,EACNivB,WAAAA,EACA1rB,SAAAA,EACAolG,YAAY,EACZjoF,MAAAA,EACAkoF,WAAW,EACXC,gBAAgB,EAChBC,YAAY,IACXl+F,MAAK,EAAEo5B,OAAAA,KAAYA,IACtB,IAAI/U,IAAc,OAEdvnB,EAAUwN,eACZvN,SAASI,KAAKC,OAAON,GAGvB,MAAM/I,EAASwW,MAAM60D,QAAQvB,GAAKA,EAAE,GAAKA,EAEnCsgC,EAAoBpqG,aAAkB,IAC1C,IAAIse,SAAexS,GAAY9L,EAAOuL,iBAAiB,aAAcO,EAAS,CAACF,MAAM,MACrF0S,QAAQxS,UAGV,SAFMwS,QAAQkI,IAAI,CAAC4jF,GAAmB,kBAChC,OAAM,GACR95E,IAAJ,CAOA,GALGg5E,IACD,4BAA6CprG,GAC7C,sBAAsC,IAGrC8B,aAAkB,IAAe,CAClC,MAAMqqG,EAAapB,aAA0B,KAC3CA,EAAejpG,OACf,iBAA0BipG,GAC5B,GAAGoB,EAAY,CAcb,GAbArqG,EAAOs7D,SAAW+uC,EAAW/uC,SAC7Bt7D,EAAOoC,aACD,IAAIkc,SAAexS,IACvB,IAAIwV,EAAI,EACR,MAAMgd,EAAI,KACG,KAANhd,IACHxV,IACA9L,EAAOmP,oBAAoB,aAAcmvB,KAI7Ct+B,EAAOuL,iBAAiB,aAAc+yB,OAEpChO,IAAc,OAClBtwB,EAAOkC,cAEJ,GAAGlC,aAAkBI,iBAAkB,CAC5C,MAAMiqG,EAAapB,EAAe7zF,cAAgC,SAC/Di1F,IACDrqG,EAAOkE,YAAcmmG,EAAWnmG,aAIpC,MAAO,CACLomG,MAAO,MACFtqG,aAAkB,KAAiBA,aAAkBI,mBACtDJ,EAAOoC,OAGNonG,IACD,QAAmBjxB,IAGvBsxB,YAAAA,OAIE5yF,EAAU9F,OAAO7Q,YAAW,IAAW,EAAD,gCAC1C0I,SAASmG,oBAAoB,YAAao7F,GAE1CxhG,EAAYC,SAASC,cAAc,OACnCF,EAAUiI,UAAUrS,IAAI6Z,GACxBmwF,GAAY,EAEZ,MAAMr4E,EAAa64E,EAAYtoG,MACzBtB,QAAYqF,EAASC,eAAeC,OAAOC,GACjD,IAAIurB,IAAc,OAElB,IAAI4V,EACJ,IAOE,GANAA,QAAemjE,EAAc,CAC3B9pG,IAAAA,EACA0pG,eAAAA,EACA34E,WAAAA,EACAg5E,YAAY,KAEVpjE,EAAQ,OACZ,MAAM/iC,GACN,OAGF,MAAM,MAACmnG,EAAK,YAAET,GAAe3jE,EAE7BkjE,EAAsBS,GAEtB,OAAc9gG,EAAW,cAAc,EA9KpB,KA8KwC,KACrDunB,KACJg6E,OAGFthG,SAASuC,iBAAiB,YAAauoC,OACtC,KAEGA,EAAoBpuC,GAAkB,EAAD,gCACzC,MAAM8kG,EAAoB3B,EAAWnjG,GAAG,GACxC,IAAI8kG,GAAqBvB,IAAmBuB,EAC1C,OAGF,MAAMzlG,EAAQylG,EAAkBjnF,QAAQxe,MACxC,IAAIA,EACF,OAGFkkG,EAAiBuB,EACjBrB,EAAY1hG,QACZ,MAAM6oB,EAAa64E,EAAYtoG,MAEzBtB,QAAYqF,EAASC,eAAeC,OAAOC,GACjD,IAAIurB,IAAc,OAElB,IAAI9O,EACJ,IAOE,GANAA,QAAU6nF,EAAc,CACtB9pG,IAAAA,EACA0pG,eAAAA,EACA34E,WAAAA,EACAi5E,aAAa,KAEX/nF,EAAG,OACP,MAAMre,GAEN,YADA4G,QAAQwf,MAAM,uBAAwBpmB,GAIxC,MAAM,MAACmnG,EAAK,YAAET,GAAeroF,EAEvBipF,EAAuBrB,GAC7B,OAAcqB,EAAsB,gBAAgB,EAxN/B,KAwNqD,KACxEA,EAAqBtqG,YAGvBipG,EAAsBS,GAEtB,OAAcA,EAAa,gBAAgB,EA9NtB,KA8N6C,KAC5Dv5E,KACJg6E,UAIEC,EAAkB7kG,KAClB,OAAcA,EAAEzH,OAAuBgrG,IACzCxsF,KAIEA,EAAY,KAChBvL,aAAa+F,GACbkyF,EAAY1hG,QAETsB,KACD,OAAcA,EAAW,cAAc,EAhPtB,KAgP2C,KAC1DA,EAAU5I,SACV,4BAA6C+oG,GAC7C,sBAAsC,GACtCP,GAAY,MAGd,QAAiB3/F,SAASI,KAAM,IAAa,CAACqJ,SAAS,EAAM7G,MAAM,KAGrE5C,SAASmG,oBAAoB,YAAao7F,GAC1CvhG,SAASmG,oBAAoB,YAAa2kC,GAC1C9qC,SAASmG,oBAAoB,UAAWsN,EAAW,CAAChK,SAAS,KAG/DzJ,SAASuC,iBAAiB,YAAag/F,GACvCvhG,SAASuC,iBAAiB,UAAWkR,EAAW,CAAC7Q,MAAM,EAAM6G,SAAS,S,6CChU3D,MAAMi4F,EAInB/sG,YAAoBoL,EAAgCumE,GAAhC,KAAAvmE,UAAAA,EAAgC,KAAAumE,QAAAA,EAClD1xE,KAAK+sG,iBACL/sG,KAAKgtG,kBAQCD,iBACN/sG,KAAKitG,gBAAkB,IAAI/sG,sBAAsBC,IAC/C,IAAI,MAAMC,KAASD,EAAS,CAC1B,MAAM+sG,EAAa9sG,EAAM+sG,mBACnBC,EAAehtG,EAAMC,OAAOsY,cAC5B00F,EAAiBjtG,EAAMktG,WAG1BJ,EAAWtmC,OAASymC,EAAe3qF,KACpC1iB,KAAK0xE,SAAQ,EAAM07B,GAIlBF,EAAWtmC,QAAUymC,EAAe3qF,KACnCwqF,EAAWtmC,OAASymC,EAAezmC,QACrC5mE,KAAK0xE,SAAQ,EAAO07B,MAGvB,CAACG,UAAW,EAAG1hD,KAAM7rD,KAAKmL,YAGvB6hG,kBACNhtG,KAAKwtG,iBAAmB,IAAIttG,sBAAsBC,IAChD,MAAMC,EAAQD,EACbm4B,QAAQl4B,GAAUA,EAAM+sG,mBAAmBzqF,IAAMtiB,EAAMktG,WAAW5qF,MAClEg3B,MAAK,CAACplC,EAAG26B,IAAM36B,EAAE64F,mBAAmBzqF,IAAMusB,EAAEk+D,mBAAmBzqF,MAAK,GACrE,IAAItiB,EAAO,OAEX,MAAM+K,EAAY/K,EAAMS,eAAiBT,EAAMC,OAASD,EAAMC,OAAO+rE,mBACrEpsE,KAAK0xE,SAAQ,EAAMvmE,KAClB,CAAC0gD,KAAM7rD,KAAKmL,YAOTsiG,YAAYtiG,EAAwByP,GAC1C,MAAM8yF,EAAWtiG,SAASC,cAAc,OAExC,OADAqiG,EAASt6F,UAAUrS,IAAI,kBAAmB6Z,GACnCzP,EAAUiM,YAAYs2F,GAQxBz8C,2BAA2B/uD,GAChC,MAAMyrG,EAAiB3tG,KAAKytG,YAAYvrG,EAAS,wBACjDlC,KAAKitG,gBAAgBvpG,QAAQiqG,GAE7B3tG,KAAKwtG,iBAAiB9pG,QAAQxB,GAGzBs4D,aACLx6D,KAAKitG,gBAAgBzyC,aACrBx6D,KAAKwtG,iBAAiBhzC,aAGjB13D,UAAUZ,EAAsByrG,GACrC3tG,KAAKwtG,iBAAiB1qG,UAAUZ,GAChClC,KAAKitG,gBAAgBnqG,UAAU6qG,M,yFCvEnC,MAAMC,EAAY9lG,GACRA,EAAiBolB,QAAWplB,EAAiBolB,QAAQ,GAAKplB,EAG9D+lG,EAAyBt6F,OAE/B,IAAIu6F,GAAe,EACnB,qBAAuC,UAAWhtG,IAChDgtG,EAAehtG,KAcF,MAAMitG,EAenBhuG,YAAYotB,GATJ,KAAA5M,OAA6M,WAC7M,KAAAzG,aAAc,EACd,KAAAk0F,iBAAqD,EAGrD,KAAAC,SAAU,EACV,KAAAC,MAAgB,KAChB,KAAAC,MAAgB,KAsCxB,KAAA39F,MAAS1I,IAKJ,IACD+lG,EAAuBt8F,oBAAoB,YAAavR,KAAKouG,WAAY,CAACv5F,SAAS,KAEnFg5F,EAAuBt8F,oBAAoB,YAAavR,KAAKouG,YAC7DpuG,KAAKquG,YAAY/iG,MAAMiV,OAAS,IAG/BvgB,KAAKsgB,SAAWtgB,KAAKiuG,SACtBjuG,KAAKsgB,UAGPtgB,KAAKkuG,MAAQluG,KAAKmuG,MAAQ,KAC1BnuG,KAAKiuG,SAAU,GAGjB,KAAAK,YAAoBlvC,IAAgC,O,EAAD,K,OAAA,E,EAAA,YACjD,MAAMt3D,EAAI8lG,EAASxuC,GACnB,GAAGp/D,KAAKwf,2BAA6Bxf,KAAKwf,kBAAkB4/C,IAC1D,OAAOp/D,KAAKwQ,QAGdxQ,KAAKkuG,MAAQpmG,EAAE0wD,QACfx4D,KAAKmuG,MAAQrmG,EAAE6/D,QAEZ,IACDkmC,EAAuBlgG,iBAAiB,YAAa3N,KAAKouG,WAAY,CAAC7sF,SAAS,EAAO1M,SAAS,IAEhGg5F,EAAuBlgG,iBAAiB,YAAa3N,KAAKouG,YAAY,I,YAZvB,K,+QAgBnD,KAAAA,WAAchvC,IACZ,GAAkB,OAAfp/D,KAAKkuG,OAAiC,OAAfluG,KAAKmuG,OAAkBL,EAE/C,YADA9tG,KAAKwQ,QAIJxQ,KAAK8Z,cACN,OAAYslD,GAGd,MAAMt3D,EAAI8lG,EAASxuC,GACbmvC,EAAMzmG,EAAE0wD,QACRg2C,EAAM1mG,EAAE6/D,QAERvoD,EAAQpf,KAAKkuG,MAAQK,EACrBlvF,EAAQrf,KAAKmuG,MAAQK,EAE3B,IAAIxuG,KAAKiuG,QAAS,CAChB,IAAI7uF,IAAUC,EACZ,OAGFrf,KAAKiuG,SAAU,EAEX,KACFjuG,KAAKquG,YAAY/iG,MAAM4tF,YAAY,SAAUl5F,KAAKugB,OAAQ,aAGzDvgB,KAAKqgB,cACNrgB,KAAKqgB,eAmBT,MAAMouF,EAAgBzuG,KAAKmf,QAAQC,EAAOC,EAAO+/C,QAC5Bp7D,IAAlByqG,GAA+BA,GAChCzuG,KAAKwQ,UAzHP,OAAWxQ,KAAMmtB,GAEjBntB,KAAKquG,YAAcruG,KAAKkC,QAExBlC,KAAKkU,eAGAA,eACD,KAIFlU,KAAKkC,QAAQyL,iBAAiB,aAAc3N,KAAKsuG,YAAatuG,KAAKguG,iBACnEH,EAAuBlgG,iBAAiB,WAAY3N,KAAKwQ,SAJzDxQ,KAAKkC,QAAQyL,iBAAiB,YAAa3N,KAAKsuG,YAAatuG,KAAKguG,iBAClEH,EAAuBlgG,iBAAiB,UAAW3N,KAAKwQ,QAOrD0K,kBACD,KAIFlb,KAAKkC,QAAQqP,oBAAoB,aAAcvR,KAAKsuG,YAAatuG,KAAKguG,iBACtEH,EAAuBt8F,oBAAoB,WAAYvR,KAAKwQ,SAJ5DxQ,KAAKkC,QAAQqP,oBAAoB,YAAavR,KAAKsuG,YAAatuG,KAAKguG,iBACrEH,EAAuBt8F,oBAAoB,UAAWvR,KAAKwQ,QAOxDk+F,UAAUnuF,GACfvgB,KAAKugB,OAASA,GAEV,KAAsBvgB,KAAKiuG,SAC7BjuG,KAAKquG,YAAY/iG,MAAM4tF,YAAY,SAAUl5F,KAAKugB,OAAQ,gB,uFCpEjD,MAAMouF,UAAsB,KAIzC5uG,YAAYotB,EAER,IACFpb,MAAM,OAAD,QACHi0B,MAAO,mCAEPpuB,KAAM,SACHuV,IAVC,KAAAyhF,QAAS,EACV,KAAAC,UAAY,GAYjB7uG,KAAKmL,UAAUiI,UAAUrS,IAAI,qBAE7B,MAAM+tG,EAAQ9uG,KAAKqwB,MACnB,GAAGy+E,aAAiBC,iBAClBD,EAAMltG,KAAO,MACbktG,EAAMnyD,aAAe,qBAChB,CACLmyD,EAAMp2C,UAAY,UAElB,MAAMs2C,EAAaz7F,OAAO07F,iBAC1B,GAAGD,EAAa,EAAG,CACjB,IAAIE,EACD,EAAAt/F,SACDs/F,GAA8B,IAAdF,EACR,EAAAr7B,aACRu7B,EAAgB,GAGlBJ,EAAMxjG,MAAM4tF,YAAY,mBAAoBgW,EAAgB,MAG9D,MAAMC,EAAenvG,KAAKg8C,iBAAiBhiC,KAAKha,MAChDA,KAAKg8C,iBAAoBvvC,IACvB0iG,EAAa1iG,IACb,OAAgBzM,KAAKqwB,OAAO,IAIhCy+E,EAAMnhG,iBAAiB,SAAS,KAE9BmhG,EAAM17F,UAAU7Q,OAAO,SAEvB,MAAMkK,EAAQzM,KAAKyM,MAUnB,IAAI2iG,EATS7oG,KAAK+Y,IAAI7S,EAAM5J,OAAS7C,KAAK6uG,UAAUhsG,QAC1C,IAAM7C,KAAK4uG,QAAU,EAAA/zF,iBAC7B7a,KAAKg8C,iBAAiBh8C,KAAK6uG,UAAYpiG,GAGzCzM,KAAK4uG,QAAS,EAEd5uG,KAAK68C,WAGL,IAAIhgB,EAAmBygB,EAAsBY,EAA8BmxD,EAAc,GACnD,MAAnCrvG,KAAKyM,MAAMwZ,QAAQ,MAAO,KAC3BjmB,KAAKg8C,iBAAiB,MAEtBozD,GAAuB,OAAkBpvG,KAAKyM,OAC9CowB,EAAYuyE,EAAqBvyE,UACjCygB,EAAU8xD,EAAqB9xD,QAC/B+xD,EAAcD,EAAqBC,YACnCnxD,EAAckxD,EAAqB71F,KACnCvZ,KAAKg8C,iBAAiBh8C,KAAK6uG,UAAYhyE,EAAY,IAAMA,EAAY,KAGvEiyE,EAAMnpF,QAAQ0pF,YAAcA,EAI5BliF,EAAQkW,SAAWlW,EAAQkW,QAAQ+rE,MAGrCN,EAAMnhG,iBAAiB,SAAS,KAC9B3N,KAAK4uG,QAAS,KAQhBE,EAAMnhG,iBAAiB,YAAa7F,IAElC,MAAMyE,EAAMzE,EAAEyE,IACd,GAAG,KAAKqzC,KAAKrzC,KAAUzE,EAAEqV,UAAWrV,EAAEoV,SAAoB,cAAR3Q,IAAiC,MAARA,IAAezE,EAAEwnG,UAE1F,OADAxnG,EAAEiqB,kBACK,Q,kGC5Ff,MAAMw9E,EAAUnkG,SAASC,cAAc,OAEvC,IAAIgO,EADJk2F,EAAQn8F,UAAUrS,IAAI,SAGtB,MAAMylB,EAAI,IAAI,IAAoB,SAO3B,SAASgpF,IACdhpF,EAAE/T,QAEF88F,EAAQn8F,UAAU7Q,OAAO,cACzB8W,GAAW/F,cAAc+F,GAEzBA,EAAU9F,OAAO7Q,YAAW,KAC1B6sG,EAAQhtG,SACR8W,OAAUrV,IACT,KAGE,SAASsnD,EAAM94C,EAAwB48B,GAC5C5oB,EAAE/T,SAEF,OAAe88F,EAAS/8F,GAEpB+8F,EAAQ52F,gBACVvN,SAASI,KAAKC,OAAO8jG,GAChBA,EAAQxsF,YAGfwsF,EAAQn8F,UAAUrS,IAAI,cAEtBsY,GAAW/F,cAAc+F,GACzBmN,EAAEoE,KAAK2kF,GAEPl2F,EAAU9F,OAAO7Q,WAAW8sG,EAAW,KAEpCpgE,GACD5oB,EAAE7Y,iBAAiB,SAAUyhC,EAAS,CAACphC,MAAM,IAI1C,SAASyhG,EAAStiF,GAKvBm+B,GAAM,QAAKn+B,EAAQo+B,YAAap+B,EAAQq+B,mBAAoBr+B,EAAQiiB,SA7CtE5oB,EAAE7Y,iBAAiB,UAAWid,IACxBA,GACF4kF,Q,kGCJJ,SAASE,EAAgBr6E,EAAyBs6E,EAA6BrwC,GAC7E,MAAM18C,EAAQ+sF,EAAe7tF,wBAAwBc,MAC/CkC,EAAW,CAACuQ,EAAYs6E,GAY9B,OAXGrwC,GAASx6C,EAAS/T,UACrB+T,EAAS,GAAGxZ,MAAMgtB,OAAS,kBAC3BxT,EAAS,GAAGxZ,MAAM8Q,UAAY,eAAwB,KAARwG,aAC9CkC,EAAS,GAAGxZ,MAAM8Q,UAAY,eAAewG,aAE7CyS,EAAWjiB,UAAUrS,IAAI,UACpBs0B,EAAW8Q,YAEhB9Q,EAAW/pB,MAAM8Q,UAAY,GAC7BiZ,EAAW/pB,MAAMgtB,OAAS,GAEnB,KACLq3E,EAAerkG,MAAM8Q,UAAYuzF,EAAerkG,MAAMgtB,OAAS,IAInE,SAASs3E,EAAUv6E,EAAyBs6E,EAA6BrwC,GAWvE,MAAM18C,EAAQ+sF,EAAe7tF,wBAAwBc,MAM/CkC,EAAW,CAACuQ,EAAYs6E,GAW9B,OAVGrwC,GAASx6C,EAAS/T,UACrB+T,EAAS,GAAGxZ,MAAM8Q,UAAY,gBAAgBwG,aAC9CkC,EAAS,GAAGxZ,MAAM8Q,UAAY,eAAewG,aAE7CyS,EAAWjiB,UAAUrS,IAAI,UACpBs0B,EAAW8Q,YAEhB9Q,EAAW/pB,MAAM8Q,UAAY,GAGtB,KACLuzF,EAAerkG,MAAM8Q,UAAY,IAqB9B,MAAMyzF,EAAmB,CAC9Br9F,EACA5Q,EACAuyD,EACAxgC,EACAm8E,GAAU,EACVp+F,KAEA,IAAIq+F,EAAwC,KAE5C,OAAOnuG,GACL,IAAK,OACHmuG,EAAoBH,EACpB,MACF,IAAK,aACHG,EAAoBL,EAQxB,OAFAl9F,EAAQmT,QAAQllB,UAAYmB,EAErBouG,EAAWx9F,EAASu9F,EAAmB57C,EAAgBxgC,EAAiBm8E,OAAS9rG,OAAWA,EAAW0N,IAK1Gs+F,EAAa,CACjBx9F,EACAu9F,EACA57C,EACAxgC,EACAm8E,GAAU,EACV9hG,GAAO,EACPiiG,GAAwB,EACxBv+F,KAEA,MAAMw+F,EAAuD,IAAI3uG,IACjE,IAAI4uG,EAEAt3F,EAAoB,KAExB,GAAGo3F,EAAuB,CACxB,MAAMG,EAAeL,EAAoB,gBAAkB,eAErDM,EAAcvoG,IAGlB,IAFA,OAAYA,GAERA,EAAEzH,OAAuBsY,gBAAkBnG,EAC7C,OAKF,MAAMwqC,EAAWkzD,EAAyBjtG,IAAI6E,EAAEzH,QAChD28C,MAAAA,GAAAA,IAEGl1C,EAAEzH,SAAWwY,KAIZs3F,GAAqBL,IAEtBK,IACDA,EAAkBjiG,UAClBiiG,OAAoBnsG,GAGnB2vB,GACDA,EAAgBiB,EAAUD,UAG5BniB,EAAQY,UAAU7Q,OAAO,YAAa,YAAa,iBAEhDyL,IACE0D,EAAgBA,EAAe2kC,aAAa7jC,EAAS49F,EAAcC,GACjE79F,EAAQjB,oBAAoB6+F,EAAcC,GAC/Cx3F,EAAOs3F,OAAoBnsG,EAC3BksG,EAAyBpvF,YAK1BpP,EAAgBA,EAAe3Q,IAAIyR,EAAnBd,CAA4B0+F,EAAcC,GACxD79F,EAAQ7E,iBAAiByiG,EAAcC,GAG9C,SAASz7E,EAAUjtB,EAA0B2tB,GAAU,EAAMg7E,GACxDA,IACDz3F,EAAOy3F,GAGN3oG,aAAcnE,cACfmE,GAAK,OAAWA,IAGlB,MAAMgtB,EAASC,EAAUD,SACzB,GAAGhtB,IAAOgtB,EAAQ,OAAO,EAIzB,MAAM6pE,EAAKhsF,EAAQqiB,SAASltB,GAM5B,GAJI,iCAAoD,IAAZgtB,IAC1CW,GAAU,IAGR26E,EAAuB,CACzB,MAAM52F,EAAU7G,EAAQmT,QAAQtM,aACjBrV,IAAZqV,GACD/F,cAAc+F,UAGT7G,EAAQmT,QAAQtM,QAGzB,IAAIic,EAAS,CACX,GAAGzc,EAAMA,EAAKzF,UAAU7Q,OAAO,SAAU,KAAM,aAC1C,GAAGi8F,EAAI,CACV,MAAMxhD,EAAWkzD,EAAyBjtG,IAAIu7F,GAC9CxhD,MAAAA,GAAAA,IAaF,OAVGwhD,IACDA,EAAGprF,UAAU7Q,OAAO,KAAM,QAC1Bi8F,EAAGprF,UAAUrS,IAAI,WAGnByR,EAAQY,UAAU7Q,OAAO,YAAa,YAAa,iBAEnDsW,EAAO2lF,OAEJ7qE,GAAiBA,EAAgBhsB,IAIlCsoG,IACFz9F,EAAQmT,QAAQtM,QAAU,GAAK9F,OAAO7Q,YAAW,KAC/C87F,EAAGprF,UAAU7Q,OAAO,MACpBsW,GAAQA,EAAKzF,UAAU7Q,OAAO,QAC9BiQ,EAAQY,UAAU7Q,OAAO,YAAa,YAAa,wBAC5CiQ,EAAQmT,QAAQtM,UACtB86C,IAGFt7C,IACDA,EAAKzF,UAAU7Q,OAAO,MACtBsW,EAAKzF,UAAUrS,IAAI,SAGrByR,EAAQY,UAAUrS,IAAI,aACtB,MAAMu+D,EAAU3qC,EAAShtB,EAGzB,IAAI4oG,EAcJ,GAhBA/9F,EAAQY,UAAUxJ,OAAO,aAAc01D,GAGnCk/B,IAGCuR,EACDQ,EAA0BR,EAAkBvR,EAAI3lF,EAAMymD,GAEtDk/B,EAAGprF,UAAUrS,IAAI,UAGnBy9F,EAAGprF,UAAU7Q,OAAO,QACpBi8F,EAAGprF,UAAUrS,IAAI,OAGhBy9F,EAAI,CACL,MAAMgS,EAAoBhS,EAAG74E,QAAQ6qF,kBAClCA,GACDl9F,cAAck9F,GAGhBN,EAAyBvsG,IAAI66F,GAAI,KAC/BA,EAAGprF,UAAU7Q,OAAO,MACpB2tG,EAAyBjvG,OAAOu9F,MAIpC,GAAG3lF,EAAqB,CACtB,IAAIQ,EACJ,MAAMo3F,EAAQ53F,EACRmkC,EAAW,KACf1pC,aAAa+F,GACbo3F,EAAMr9F,UAAU7Q,OAAO,SAAU,QAE9BguG,IACDA,MAAAA,GAAAA,KAGFL,EAAyBjvG,OAAOwvG,IAG/BjS,GACDnlF,EAAU9F,OAAO7Q,WAAWs6C,EAAUmX,EAAiB,KACvD+7C,EAAyBvsG,IAAI8sG,EAAOzzD,KAEpC3jC,EAAU9F,OAAO7Q,WAAWs6C,EAAUmX,GACtC+7C,EAAyBvsG,IAAI8sG,GAAO,KAClCn9F,aAAa+F,GACb62F,EAAyBjvG,OAAOwvG,OAIpCA,EAAM9qF,QAAQ6qF,kBAAoB,GAAKn3F,EAEpCy2F,IACGK,IACFA,GAAoB,WAItB,QAA4BA,EAAoC,EAAjBh8C,IAInDt7C,EAAO2lF,EAQT,OAJA5pE,EAAUD,OAAS,IAAM9b,GAAO,OAAWA,IAAS,EACpD+b,EAAU2rE,QAAU,IAAM1nF,EAC1B+b,EAAU4rE,QAAWiQ,GAAuB53F,EAAO43F,EAE5C77E,I,oECpTM,SAAS87E,EAAgBp0E,GACtC,OAASA,EAASz5B,QAAU,GAAKy5B,EAASz5B,QAAU,KAAQy5B,EAASz5B,SAAW,kBAAkB+8C,KAAKtjB,GCYlG,MAAMq0E,UAA2B,KAatC5wG,YACEotB,EACQnmB,GAER+K,MAAMob,GAFE,KAAAnmB,SAAAA,EAIRhH,KAAK4wG,wBAAyB,EAAAz3F,EAAA,GAASnZ,KAAK6wG,cAAc72F,KAAKha,MAAO,KAAK,GAAO,GAElFmtB,EAAQzb,eAAe3Q,IAAIf,KAAKqwB,MAAhClD,CAAuC,SAAS,KAC9C,MAAM1gB,EAAQzM,KAAKiiG,WAGnB,GAAGx1F,IAAUzM,KAAKq5D,gBAAkB5sD,EAAM5J,OAGxC,OAFA7C,KAAKy5D,SAAS,mBACdz5D,KAAKmtB,QAAQ4C,UAAY/vB,KAAKmtB,QAAQ4C,YAE7B2gF,EAAgBjkG,GAGzBzM,KAAKy5D,SAAS,cAFdz5D,KAAK25D,SAAS35D,KAAKmtB,QAAQshE,aAK1BzuF,KAAKqwB,MAAMjd,UAAUqB,SAAS,SAC/BzU,KAAKmtB,QAAQ4C,UAAY/vB,KAAKmtB,QAAQ4C,WAIxC/vB,KAAK4wG,uBAAuBnkG,MAIzBw1F,WACL,IAAIx1F,EAAQzM,KAAKyM,MAMjB,OALGzM,KAAKmtB,QAAQ60E,OACdv1F,EAAQA,EAAMiqB,MAAM12B,KAAKmtB,QAAQ60E,KAAKn/F,QACtC7C,KAAKg8C,iBAAiBh8C,KAAKmtB,QAAQ60E,KAAOv1F,IAGrCA,EAGDokG,cAAcv0E,GACjBt8B,KAAK8wG,uBAEL9wG,KAAKmtB,QAAQplB,OACd/H,KAAK8wG,qBAAuB9wG,KAAKgH,SAASi4B,gBAAgB4xE,cAAc7wG,KAAKmtB,QAAQplB,OAAOs0B,WAAYC,GAExGt8B,KAAK8wG,qBAAuB9wG,KAAKgH,SAASy1B,gBAAgBo0E,cAAcv0E,GAG1Et8B,KAAK8wG,qBAAqBziG,MAAM0iG,IAC3B/wG,KAAKiiG,aAAe3lE,IAEpBy0E,EACD/wG,KAAKy5D,SAAS,WAAkBz5D,KAAKmtB,QAAQohE,eAE7CvuF,KAAK25D,SAAS35D,KAAKmtB,QAAQqhE,eAE3BjpF,IACCvF,KAAKiiG,aAAe3lE,GAGhB,qBADA/2B,EAAI3D,MAEP5B,KAAK25D,SAAS35D,KAAKmtB,QAAQshE,gBAI9BpgF,MAAK,KACNrO,KAAK8wG,0BAAuB9sG,EAC5BhE,KAAKmtB,QAAQ4C,UAAY/vB,KAAKmtB,QAAQ4C,WAEtC,MAAMtjB,EAAQzM,KAAKiiG,WAChBx1F,IAAU6vB,GAAYt8B,KAAKs5D,mBAAqBo3C,EAAgBjkG,IACjEzM,KAAK6wG,cAAcpkG,U,6CCzFZ,MAAMukG,EAKnBjxG,YAAYgvD,EAAwC5hC,GAH5C,KAAAc,MAAkC,IAAI1sB,IACtC,KAAA0vG,QAAS,EAGfjxG,KAAKC,SAAW,IAAIC,sBAAsBC,IACxC,GAAGH,KAAKixG,OACN,OAGF,MAAM9tD,EAAoC,GAE1ChjD,EAAQ2E,SAAQ,CAAC1E,EAAOstB,KACtB,MAAMrtB,EAASD,EAAMC,OAErB,GAAGL,KAAKiuB,MAAMhrB,IAAI5C,KAAYD,EAAMS,eAClC,OAEAb,KAAKiuB,MAAMtqB,IAAItD,EAAQD,EAAMS,gBAW/B,MAAMqwG,EAA4B,CAAC7wG,OAAAA,EAAQS,QAASV,EAAMS,eAAgBT,MAAAA,EAAOstB,MAAAA,GAIjFy1B,EAAQ9gD,KAAK6uG,MAKf/tD,EAAQr+C,SAAS9B,IACf+rD,EAAmB/rD,QAEpBmqB,GAGE66B,aACL,MAAM/5B,EAAsB,GAO5B,OANAjuB,KAAKiuB,MAAMnpB,SAAQ,CAAC2H,EAAOF,KACtBE,GACDwhB,EAAM5rB,KAAKkK,MAIR0hB,EAGFg6B,eACL,MAAMnnD,EAAUd,KAAKgoD,aACrB,IAAI,MAAM3nD,KAAUS,EAClBd,KAAKiuB,MAAMtqB,IAAItD,GAAQ,GAIpBsf,UAAUtf,GACf,OAAOL,KAAKiuB,MAAMhrB,IAAI5C,GAGjBm6D,aACLx6D,KAAKC,SAASu6D,aACdx6D,KAAKiuB,MAAMnN,QAGN6kC,UACL3lD,KAAKC,SAASu6D,aAGd,MAAMjkC,EAAU,IAAIv2B,KAAKiuB,MAAM9pB,QAC/B,IAAI,MAAM9D,KAAUk2B,EAElBv2B,KAAKC,SAASyD,QAAQrD,GAKnB8wG,iBACL,MAAMrwG,EAAUd,KAAKgoD,aACrB,IAAI,MAAM3nD,KAAUS,EAClBd,KAAKC,SAAS6C,UAAUzC,GAG1B,IAAI,MAAMA,KAAUS,EAClBd,KAAKC,SAASyD,QAAQrD,GAInBqD,QAAQrD,GACbL,KAAKiuB,MAAMtqB,IAAItD,GAAQ,GACvBL,KAAKC,SAASyD,QAAQrD,GAGjByC,UAAUzC,GACfL,KAAKC,SAAS6C,UAAUzC,GACxBL,KAAKiuB,MAAMhtB,OAAOZ,GAGbqlD,SACL1lD,KAAKixG,QAAS,EAGTn6E,mBACL92B,KAAK0lD,SACL1lD,KAAK2lD,UAGAzgD,OACLlF,KAAKixG,QAAS,K,uFChHH,MAAMG,UAAuB,IAK1CrxG,YAAsB2R,EAA0C6Q,GAAW,GACzExQ,MAAM,CACJ0M,KAAM,IACN9X,IAAK,EACLH,IAAK,EACL+b,SAAAA,GACC,GANiB,KAAA7Q,eAAAA,EAA0C,KAAA6Q,SAAAA,EAsCxD,KAAA8uF,YAAevpG,IACrBA,IAAK,OAAYA,GACjB,WAAoC,WAG/B,KAAAwpG,UAAY,KAEjB,MAAM,OAACzkG,EAAM,MAAEC,GAAS,IACxB,IACIykG,EAEFA,GADE1kG,GAAUC,EACA,EACJD,EAAS,GACL,EACJA,EAAS,GAAKA,EAAS,IACnB,EAEA,EAGdukG,EAAeI,MAAM1sG,SAAS8O,GAAS5T,KAAK4T,KAAKR,UAAU7Q,OAAO,SAAWqR,KAC7E5T,KAAK4T,KAAKR,UAAUrS,IAAI,SAAWqwG,EAAeI,MAAMD,IAEpDvxG,KAAK4f,WACP5f,KAAK8f,YAAYhT,EAAQ,EAAID,IAtD/B7M,KAAKkU,eACLlU,KAAK2e,YAAY,CACfC,QAAStY,IACP,MAAMmG,EAAQlG,KAAKC,IAAID,KAAKI,IAAIL,EAAa,GAAI,GAIjD,WAAmC,EACnC,WAAoCmG,KAQxC,MAAMmO,EAAY,gBACZlC,EAAM1Y,KAAK0Y,IAAMtN,SAASC,cAAc,OAC9CqN,EAAItF,UAAUrS,IAAI,WAAY6Z,GAC9B,MAAMhH,EAAO5T,KAAK4T,KAAOxI,SAASC,cAAc,QAChDuI,EAAKR,UAAUrS,IAAI6Z,EAAY,UAE/BlC,EAAIjN,OAAOmI,EAAM5T,KAAKmL,YAEtB,QAAiByI,EAAM5T,KAAKqxG,YAAa,CAAC3/F,eAAgB1R,KAAK0R,iBAC/D1R,KAAK0R,eAAe3Q,IAAI,IAAxBf,CAAoD,iBAAkBA,KAAKsxG,WAE3EtxG,KAAKsxG,aAvCQ,EAAAE,MAAQ,CAAC,aAAc,cAAe,cAAe,c,2DCDvD,SAASC,GAAgB,OACtC3jC,EAAM,aACN96C,EAAY,WACZN,EAAU,cACV9U,EAAa,KACbhW,EAAI,eACJ4mD,IASA,MAAM36C,EAAO,IAAI69F,OAAO5jC,EAAOjrE,QACzBqS,EAA4B,GAmBlC,OAlBA44D,EAAOhpE,SAAQ,CAACqC,EAAO2B,KACrBoM,EAAS7S,KAAK,CACZoN,EAAG,2BACHypB,OAAQpwB,EACRjG,OAAQ,EACR2qF,YAAarmF,QAID,QAAa0M,EAAM,CACjCqB,SAAAA,EACA8d,aAAAA,EACAw7B,eAAAA,EACAC,gBAAiB7mD,EACjB8qB,WAAAA,EACA9U,cAAAA,M,qiBCAW,SAAe+zF,GAAa,QAACzpG,EAAO,SAAEuwB,EAAQ,WAAEC,EAAU,aAAEC,EAAY,WAAElF,EAAU,cAAEtpB,EAAa,aAAE6oB,EAAY,iBAAE4F,EAAgB,cAAEhb,EAAa,SAAEstB,EAAQ,SAAElkC,EAAW,aAAkB,aAAEM,EAAY,SAAE2jC,I,+CAexNvS,MAAAA,IAAAA,EAAe,KACfwS,MAAAA,IAAAA,EAAa,IACbD,MAAAA,IAAAA,EAAa,GACb,MAAM2mE,EAAsC,IAArBh5E,EAEjBj3B,EAAQuG,EAAQzC,MAA4C2F,UAAclD,EAAQzC,MAA2CqzB,QAA4B1tB,SACzJymG,EAAiB3pG,MAAAA,OAAO,EAAPA,EAAS2/B,kBAChC,GAAgB,UAAblmC,EAAIC,MAAiC,UAAbD,EAAIC,MAAiC,UAAbD,EAAIC,KAAkB,CACvE,MAAMkwG,EAAe,IAAI,KAezB,OAdAA,EAAar5E,SAAWA,EACxBq5E,EAAa5pG,QAAUA,EACvB4pG,EAAaF,eAAiBA,EAC9BE,EAAal0F,cAAgBA,EAC7Bk0F,EAAa9+E,aAAeA,EAEzB2F,IAAcm5E,EAAan5E,aAAeA,GAC1CxuB,IAAe2nG,EAAa3nG,cAAgBA,GAC5CspB,IAAYq+E,EAAar+E,WAAaA,GAEzCq+E,EAAansF,QAAQ+S,WAAa,GAAKA,EACvCo5E,EAAansF,QAAQslB,SAAW,GAAKA,EACrC6mE,EAAansF,QAAQulB,SAAWA,QAC1B4mE,EAAarqE,SACZqqE,EAGT,MAAMC,EAAcpwG,EAAI+N,UAAY/N,EAAI+N,UAAU+T,MAAM,KAAO,GAC/D,IAAIuuF,EAAM,GACVA,EAAMD,EAAYlvG,OAAS,GAAK+V,MAAM60D,QAAQskC,IAC5C,QAAqBA,EAAYhtF,MAAMtB,MAAM,IAAK,GAAG,GAAGuE,eACxD,OAEF,MAAMiqF,EAAS7mG,SAASC,cAAc,OACtC4mG,EAAO7+F,UAAUrS,IAAI,WAAY,OAAOixG,KACxCC,EAAOtsF,QAAQxe,MAAQ,GAAKxF,EAAIgG,GAC/BsqG,EAAetwG,IAAMA,EAItB,MAAMuwG,EAAS9mG,SAASC,cAAc,OAEtC,IAAI8mG,EADJD,EAAO9+F,UAAUrS,IAAI,gBAGrB,MAAMqxG,IAAe9qG,EACfE,EAAkB,IACf4qG,EAAa9qG,EAAeN,EAASO,cAAcC,gBAAgB7F,GAG5E2F,QAAqBE,IACrB,IAAI6qG,GAAW,EACf,IAAc,QAAV,EAAA1wG,EAAIqN,cAAM,eAAEnM,SAAWqF,EAAQsF,OAAOo6B,aAAetgC,EAAaG,KAAoB,UAAb9F,EAAIC,KAA2D,CAC1IqwG,EAAO7+F,UAAUrS,IAAI,uBACrBsxG,GAAW,EAEX,MAAMvmF,EAAoE,GAE1E,GAAG5jB,EAAQsF,OAAOo6B,aAAe,CAAC,QAAS,SAAShzB,SAASjT,EAAIC,OAAS0F,EAAaG,IACrFyqG,EAAOnzF,UAAY,aAAazX,EAAaG,QAC7CqkB,EAAKzpB,KAAK6vG,EAAO98F,uBACZ,CACQk9F,YAAYhrF,MAAzB,MACMqQ,QAAgB,OAAU,CAC9BO,MAAOv2B,EACPuG,QAAS,KACTiD,UAAW+mG,EACXr6E,SAAU,GACVC,UAAW,GACX9E,aAAAA,EACAgF,kBAAkB,EAClBpa,cAAAA,EACAhW,MAAM,OAAgBjG,EAAK,GAAI,IAAI,GACnCqF,SAAAA,IAGFkrG,EAAO5mG,MAAMsX,MAAQsvF,EAAO5mG,MAAM0X,OAAS,GACxC2U,EAAQS,OAAOhpB,OAAO0c,EAAKzpB,KAAKs1B,EAAQS,OAAOhpB,OAC/CuoB,EAAQS,OAAOC,MAAMvM,EAAKzpB,KAAKs1B,EAAQS,OAAOC,MAGnDvM,EAAKhnB,SAASklB,GAAQA,EAAI5W,UAAUrS,IAAI,yBAExCoxG,EAAY/mG,SAASC,cAAc,QACnC8mG,EAAU/+F,UAAUrS,IAAI,qBACxBoxG,EAAUr4E,UAAYk4E,EACtBE,EAAOzmG,OAAO0mG,GAIhB,MAAMI,EAAW5wG,EAAI+N,WAAY,OAAc/N,EAAI+N,WAAa,eAC1CtE,SAASC,cAAc,OAC/B+H,UAAUrS,IAAI,wBAC5B,MAAMyxG,EAAiBpnG,SAASC,cAAc,QAIxConG,EAAgE,EAHtD,OAAY9wG,EAAIiG,OAahC,GARG6wB,GACDg6E,EAAiBpwG,MAAK,QAAmB6F,EAAQkO,OAGhDqd,GACDg/E,EAAiBpwG,WAAW,OAAiB6F,KAG3CuwB,IAAahF,EAAY,CAC3B,MAAMwb,EAAI7jC,SAASC,cAAc,QAC3BqnG,GAAa,OAAY/wG,EAAIiG,MACnCqnC,EAAExjC,OAfgB,MAeIinG,GACtBzjE,EAAE3jC,MAAM0N,WAAa,SACrBy5F,EAAiBpwG,KAAK4sC,GAGxBgjE,EAAOlzF,UAAY,OAChBzX,EAAa2iB,aAAe4nF,IAAoB3pG,EAAQF,MAAQqqG,EAAW,GAAK,wHAKnF,MAAMxmB,EAAUomB,EAAOz6F,cAAc,kBAC/BwzB,EAAmB,IAAI,IAC7BA,EAAiBrlB,QAAQ+S,WAAa,GAAKA,EAC3CsS,EAAiBrlB,QAAQslB,SAAW,GAAKA,EACzCD,EAAiBrlB,QAAQulB,SAAWA,EACpCF,EAAiB1yB,YAAci6F,EAI3BrqG,EAAQF,KACViqG,EAAO7+F,UAAUrS,IAAI,cAGvB8qF,EAAQpgF,OAAOu/B,GAEZvX,GACDo4D,EAAQpgF,QAAO,OAAavD,IAG9B,MAAMyqG,EAAUV,EAAOz6F,cAAc,kBAMrC,GALAg7F,EAAe/mG,WAAU,QAAiBgnG,EAAkB,QAC5DE,EAAQlnG,OAAO+mG,GAEfP,EAAOv6F,QAAQw6F,IAEXL,GAAkB3pG,EAAQsF,OAAOo6B,cAAgB1/B,EAAQF,IAC3D,OAAOiqG,EAGT,IAAIlqE,EAA0BxsB,GAAkC,KAChE,MAAMuhB,GAAS,KAGb,GAFAm1E,EAAO7+F,UAAU7Q,OAAO,eAEDZ,EAAIiG,KAAO,OAAuBiqG,EAKvD,OAJAt2F,GAAUyQ,YACVzQ,GAAU2P,OAAO6c,GACjBxsB,GAAUA,UAAUnI,UAAUrS,IAAI,eAClCwa,GAAUixB,oBAAoB5pC,IAQhC,GAJGjB,EAAIiG,MAAQ,MACbqqG,EAAO7+F,UAAUrS,IAAI,cAGpBgnC,EAAa,CACd,GAAGA,IAAgBmqE,EAAQ,CACzB,MAAMU,EAAe7qE,EACrBrlC,YAAW,KACTkwG,EAAarwG,WACZ,KAGLwlC,EAAc,KAGbxsB,KACDA,GAAY,OAIVs3F,GAAmBvkG,IACvB2jG,EAAO7+F,UAAUrS,IAAI,eAErB,MAAM+xG,EAAgB1nG,SAASC,cAAc,QACvC0nG,GAAkB,OAAYpxG,EAAIiG,MACxCkrG,EAAcxnG,MAAMmqB,SAAW,WAC/Bq9E,EAAcxnG,MAAM2W,KAAO,IAC3B3T,EAAQD,KAAKyuB,GAAQ,KAAMjlB,SAAQ,KAEjC26F,EAAelnG,MAAM0N,WAAa,GAClC85F,EAAcvwG,YAMhB,MAAMiqF,EAAUv9E,IAAkB,OAAYA,GAC9C,IAAIqX,EAAIkmE,EAAO,GACfgmB,EAAelnG,MAAM0N,WAAa,SAElC85F,EAAcrnG,OAAO6a,EA3GH,MA2GmBysF,GACrCP,EAAe75F,cAAclN,OAAOqnG,GACpCxkG,EAAQ6gE,mBAAmB13D,IACzB,MAAMu7F,EAAKxmB,EAAO/0E,EAAS00B,MAC3B7lB,EAAE0C,YAAYgqF,GACd1sF,EAAI0sF,MAKFpwG,GAAQkF,I,MACZ,MAAM09F,GAAQ19F,GAAKA,EAAE0B,UACf7H,EAAOswG,EAAetwG,IAE5B,IAAIsU,EACJ,MAAM/C,EAAU,iBAA4B,4CAAkDlP,EAC9F,GAAIwhG,EAEG,GAAgB,QAAb7jG,EAAIC,KAAgB,CAC5B,MAAMqxG,GAAyE13F,IAAaA,GAAU6yD,SACtGn4D,EAAW,qBAAoC,CAACxQ,MAAO9D,EAAKuR,QAAAA,IACzD+/F,GACDh9F,EAAS5H,MAAK,KACZ3L,YAAW,IAAW,EAAD,gCACnB,MAAM+E,SAAaD,KAAmBC,IACtC8L,OAAOqX,KAAKnjB,OACX,+BAAuC,IAAM,WAIpDwO,EADQ,QAA+BtU,EAAI2U,aAAwB,QAAV,EAAA3U,EAAIqN,cAAM,eAAEnM,QAC1D,qBAAoC,CAAC4C,MAAO9D,EAAKuR,QAAAA,IAEjD,mBAAkC,CAACzN,MAAO9D,EAAKuR,QAAAA,SAf1D+C,EAAW,mBAAkC,CAACxQ,MAAO9D,EAAKuR,QAAAA,IAAU,GAkBtE+C,EAAS0B,OAAM,KACbs6F,EAAO7+F,UAAU7Q,OAAO,kBAGvBwlC,IACDxsB,GAAU2P,OAAO6c,GAAa,EAAM9xB,GACpC48F,GAAgB58F,MAIbs8F,SAAUW,KAAoB,OAAwB,CAACztG,MAAO9D,EAAKwxG,WAAY,MACtF,SAASnsG,EAASosG,eAAeC,cAAcH,IAAmB,CAChEnrE,EAAckqE,EAAOz6F,cAAc,uBAAyB06F,EAC5D,MAAM5jG,EAAU,mBAAkC,CAAC7I,MAAO9D,IAAM,GAEhE4Z,GAAY,IAAI,IAChBA,GAAU2P,OAAO6c,GAAa,EAAOz5B,GACrCiN,GAAUixB,oBAAoB5pC,IAC9BiwG,GAAgBvkG,QACX,IAAIhH,EAAa2iB,YAAc4nF,EAMpC,GALA9pE,EAAckqE,EAAOz6F,cAAc,uBAAyB06F,EAC5D32F,GAAY,IAAI,IAAqB,CACnC8yD,WAAYwjC,IAGVA,EASG,CACL,MAAMxpB,EAAgB,cAA6BwpB,GACnDt2F,GAAUsQ,cAAcw8D,GACxB9sE,GAAU2P,OAAO6c,GACjB8qE,GAAgBxqB,QAZhB9sE,GAAUrQ,YACVqQ,GAAUyQ,YACVzQ,GAAU2P,OAAO6c,GACjBxsB,GAAUixB,oBAAoB5pC,SAENoB,IAArB40B,GAAkCA,GAAoBj3B,EAAIiG,OAC3D,QAAmB2T,GAAUA,WAsBnC,OAZA,QAAiB02F,GAASnqG,KACrB,OAAgBA,EAAEzH,OAAQ,UAI1Bkb,GACDA,GAAUzH,QAAQhM,GAElBlF,GAAKkF,OAIFmqG,KAzTT,qBAA2B,wBAAyB9qG,IACjCyR,MAAMC,KAAKzN,SAAS+M,iBAAiB,0BAA0BhR,QACvErC,SAAS5C,IACbA,EAAQsV,cAAc,iCACvB,QAAmBtV,U,2DChCV,SAAS4/D,EAAgBnlC,GACtC,MAAO,KAAM,OAAkBA,GAAOE,Y,8ECEzB,SAAeT,EAAqBg6C,EAAgBpvE,EAAW,c,qDAC5E,MAAM8yC,QAAmB9yC,EAASi4B,gBAAgBsjC,QAAQ6T,GAC1D,GAAc,kBAAXt8B,EAAKrqC,EACN,OAAO,QAAK,iBAGd,MAAM8vB,QAAiBv4B,EAASo4B,kBAAkBgnE,kBAAkBhwB,GACpE,IAAI1lD,EAGAA,EAFD6O,EACiB,gBAAfA,EAAS9vB,EACF8vB,EAAS3D,mBAEgE,QAAxE,EAAA2D,EAAS1D,aAAmDA,oBAAY,eAAEh5B,OAG5Ei3C,EAAmBle,qBAAgD,QAAzB,EAAAke,EAAaje,oBAAY,eAAEA,aAAah5B,QAI7F6tB,EAAQA,GAAS,EAEjB,MAAMnkB,EAHeutC,EAAsBtsC,OAAOmnF,UAGX,0BAA4B,qBACnE,OAAO,QAAKpoF,EAAK,EAAC,OAAuBmkB,M,6WCjB5B,SAAe4zC,EAAav8D,EAAgBwgB,GAAY,EAAOD,GAAgB,EAAOgrF,EAAwBtsG,EAAwB,c,qCAC/Ie,IACFA,EAAS,UAGX,IAAI+G,EAAQ,GACZ,GAAG/G,EAAOg2B,SAAU,CAClB,MAAMvB,QAAax1B,EAASy1B,gBAAgBC,QAAQ30B,EAAOk2B,YACxDzB,EAAK6zC,aAAYvhE,GAAS0tB,EAAK6zC,aAC/B7zC,EAAK8zC,WAAehoD,GAAkBxZ,IAAQA,GAAS,IAAM0tB,EAAK8zC,WAGhExhE,EADDA,EACSA,EAAMohB,OADAsM,EAAKhvB,OAAOwxB,QAAU,YAAY1W,EAAgB,UAAY,cAAc,GAAQkU,EAAKF,cAI5GxtB,SAD8B9H,EAASi4B,gBAAgBsjC,QAAQx6D,EAAOs0B,aACzDvtB,MAEVwZ,IACDxZ,EAAQA,EAAM2U,MAAM,KAAK,IAQ7B,YAJqBzf,IAAlBsvG,IACDxkG,GAAQ,OAAaA,EAAOwkG,EAAeA,IAGtC/qF,EAAYzZ,GAAQ,OAAcA,I,+WC/B5B,SAASkvB,EAAoBxB,G,MAC1C,IAAIA,EACF,OAAOpxB,SAASC,cAAc,QAGhC,IAAIkB,EACAqkD,EAEJ,OAAOp0B,EAAK70B,IACV,KAAK,gBACH4E,EAAM,4BACN,MACF,KAAK,gBACHA,EAAM,4BACN,MACF,QACE,GAAGiwB,EAAKhvB,OAAOoyE,IAAK,CAClBrzE,EAAM,MACN,MAGF,GAAGiwB,EAAKhvB,OAAO+lG,QAAS,CACtBhnG,EAAM,gBACN,MAGF,OAAkB,QAAX,EAAAiwB,EAAKi8D,cAAM,eAAEhpF,GAClB,IAAK,qBACHlD,EAAM,SACN,MAGF,IAAK,qBACHA,EAAM,cACN,MAGF,IAAK,sBACHA,EAAM,eACN,MAGF,IAAK,oBAAqB,CACxB,MAAM6J,EAAOomB,EAAKi8D,OAAO+a,WACnBC,EAAQ,IAAIpsF,KAGZE,GAFMksF,EAAMtyE,UAAY,IAAO,GAElB/qB,EACnB,GAAGmR,EAAO,GACRhb,EAAM,2BACD,GAAGgb,EAAO,KACfhb,EAAM,qBAENqkD,EAAO,CADGrpC,EAAO,GAAK,QAEjB,GAAGA,EAAO,OAASksF,EAAMC,YAAc,IAAIrsF,KAAY,IAAPjR,GAAas9F,UAClEnnG,EAAM,oBAENqkD,EAAO,CADGrpC,EAAO,KAAO,OAEnB,CACLhb,EAAM,yBACN,MAAM,OAAConG,EAAM,OAAEC,IAAU,QAAsBx9F,GAC/Cw6C,EAAO,CAAC+iD,EAAQC,GAGlB,MAGF,IAAK,mBACHrnG,EAAM,SACN,MAGF,QACEA,EAAM,gBASd,OAAO,QAAKA,EAAKqkD,K,0LCpFJ,SAASijD,EAAwB3rG,GAC9C,MAAM+D,EAAS/D,EAAQ+D,QACjB,QAACyI,EAAO,IAAEjN,IAAO,EAAAqsG,EAAA,GAAQ,0BAA0B5rG,EAAQH,OAAOs0B,iBAAiBpwB,EAAO8nG,KAAKpsG,kBAAkBsE,EAAO8nG,KAAKhxD,eACnI,IAAIruC,EACF,OAAOtJ,SAASC,cAAc,QAGhC,MAAMiJ,EAAIlJ,SAASC,cAAc,KAIjC,OAHAiJ,EAAE0lB,KAAOvyB,EACT6M,EAAE5G,aAAa,UAAWgH,EAAU,UAE7BJ,E,6TCKT,SAAe0/F,EAAkB9rG,EAAmD+rG,G,yCAClF,MAAMt8E,QAAgB,OAAoBzvB,OAASlE,OAAWA,EAAWiwG,GACzE,GAAGA,EACD,OAAOt8E,EAGT,MAAMrjB,EAAIlJ,SAASC,cAAc,KAIjC,OAHAiJ,EAAEqR,QAAQuuF,UAAYhsG,EAAQH,OAAS,IAAMG,EAAQF,IACrDsM,EAAE6/F,IAAM,OACR7/F,EAAE7I,OAAOksB,GACFrjB,KCvBM,SAAe8/F,EAAyBlsG,EAAoB+rG,G,qCACzE,IACE,aDwBW,SAA8C/rG,EAAoB+rG,G,+CAC/E,MAAM/xG,EAAuB+xG,OAAQjwG,EAAYoH,SAASC,cAAc,QAClEY,EAAS,WAAY/D,GAAWA,EAAQ+D,OAI9C,GAAIA,EAAmD/D,QAAS,CAC9D,MAAMmsG,EAAiBpoG,EAAmD/D,QAC1E,OAAG+rG,GACM,EAAA/5E,EAAA,GAAcm6E,KAErB,EAAA56E,EAAA,GAAav3B,GAAS,EAAA23B,EAAA,IAAaw6E,EAAe,CAAC59C,cAAc,KAC1Dv0D,GAEJ,CACL,IAEIqpD,EACAqF,EAHAnhD,EAAIxD,EAAOwD,EAKf,MAAMzI,EAAWwW,EAAA,WAEX82F,EAAiB,CAACvsG,EAAgBksG,IAC/BA,GAAQ,EAAA3vC,EAAA,GAAav8D,EAAQksG,IAAS,OAAc,CAAClsG,OAAAA,IAG9D,OAAOkE,EAAOwD,GACZ,IAAK,yBACHA,GAAK,IAAOxD,EAAerK,KAE3BgvD,EAAO,EAAC,EAAA2jD,EAAA,GAAmBtoG,EAAOrF,SAAUqtG,IAC5C,MAGF,IAAK,yBACHxkG,GAAK,IAAOxD,EAAerK,KAE3BgvD,EAAO,GACHnhD,EAAEq4E,SAAS,QAAW5/E,EAAQsF,OAAOgnG,MACvC5jD,EAAKvuD,KAAKiyG,EAAepsG,EAAQ2F,OAAQomG,SAGpBjwG,IAApBiI,EAAOrF,SACRgqD,EAAKvuD,MAAK,EAAAkyG,EAAA,GAAmBtoG,EAAOrF,SAAUqtG,IAE9CrjD,EAAKvuD,KAAKwxG,EAAwB3rG,IAGpC,MAGF,IAAK,iCAAkC,CACrC,MAAMy7B,EAAU,CAACz7B,EAAQ2F,OAAQ5B,EAAO8rE,MAAM,GAAG9lD,YACjD,IAAI3d,EAAI,mCACR,MAAMy7D,EAAOvyD,EAAA,OACVmmB,EAAQ,KAAOosC,EAAMz7D,GAAK,QACrBqvB,EAAQ,KAAOosC,IAAMz7D,GAAK,WAClC,EAAA86C,EAAA,GAAiBzrB,EAASosC,GAE1BxkB,EAAcj3C,EACds8C,EAAOjtB,EAAQppB,KAAKxS,GAAWusG,EAAevsG,EAAQksG,KACtDrjD,EAAKvuD,KAAKwxG,EAAwB3rG,IAClC,MAGF,IAAK,kCAAmC,CACtC,MAAMurG,EAAQ,IAAIpsF,KACZjR,EAAO,IAAIiR,KAA4B,IAAvBpb,EAAOwoG,eACvBC,GAAet+F,EAAK+qB,UAAYsyE,EAAMtyE,WAAa,MACnDwzE,EAAe,IAAIttF,KAAKosF,GAC9BkB,EAAa1zE,QAAQ0zE,EAAajB,UAAY,GAE9C,MAAM9xE,QAAoB56B,EAASqI,gBAAgBuyB,YAAY15B,EAAQH,QACvEwjD,EAAc3pB,EAAc,8CAAgD,sCAC5EgvB,EAAO,GACP,MAAMmf,EAAOvyD,EAAA,OAOb,IAAIo8D,EAND1xE,EAAQ2F,SAAWkiE,EACpBxkB,GAAe,MACN3pB,GACTgvB,EAAKvuD,KAAKiyG,EAAepsG,EAAQ2F,OAAQomG,IAI3C,MAAMW,EAA4B,GAC/BF,EAAc,GAAKt+F,EAAKs9F,YAAcD,EAAMC,UAC7C95B,EAAI,4BACI86B,EAAc,GAAKt+F,EAAKs9F,YAAciB,EAAajB,UAC3D95B,EAAI,mBAEJA,EAAI,mBACJg7B,EAAMvyG,KAAK,IAAI,qBAAqB,CAClC+T,KAAAA,EACA+W,QAAS,CACP0nF,IAAK,UACLxzE,MAAO,UACPE,KAAM,aAEPr/B,UAGL0yG,EAAMvyG,MAAK,QAAW+T,IACtB,MAAM0qB,GAAI,QAAK84C,EAAGg7B,GAClBhkD,EAAKvuD,KAAKy+B,GAEV,MAGF,IAAK,0BAA2B,CAC9B,MAAMivC,EAAOvyD,EAAA,OACVtV,EAAQ2F,SAAWkiE,EACpBtgE,GAAK,MAELmhD,EAAO,CAAC0jD,EAAepsG,EAAQ2F,OAAQomG,IAGzC,MAGF,IAAK,0BAA2B,CAC9B,MAAMlsG,EAASG,EAAQH,OACjB+sG,QAAsB9tG,EAAS8G,mBAAmBuE,iBAAiBtK,EAAQG,EAAQ6sG,cAEzFnkD,EAAO,CACL0jD,EAAepsG,EAAQ2F,OAAQomG,IAG7Ba,EAOFlkD,EAAKvuD,KAAK2xG,EAAkBc,EAAeb,KAN3C1oD,EAAc,qBAEXrjD,EAAQ6sG,cACT/tG,EAAS8G,mBAAmBknG,oBAAoB9sG,IAMpD,MAGF,IAAK,mCAAoC,CACvC,MAAM05B,QAAoB56B,EAASqI,gBAAgBuyB,YAAY15B,EAAQH,QACpEG,EAAQsF,OAAO06B,IAChBqjB,EAAc3pB,EAAc,+BAAiC,8BAE7D2pB,EAAc3pB,EAAc,yCAA2C,uCACvEgvB,EAAO,CAAC0jD,EAAepsG,EAAQ2F,OAAQomG,KAEzC,MAGF,IAAK,6BACL,IAAK,0BACL,IAAK,yBACL,IAAK,0BACL,IAAK,6BACL,IAAK,+BACL,IAAK,6BACL,IAAK,gCACL,IAAK,gCACL,IAAK,kCACHrjD,EAAO,CAAC0jD,EAAepsG,EAAQ2F,OAAQomG,IACvC,MAGF,IAAK,gCACL,IAAK,6BACHrjD,EAAO,GACS,+BAAb3kD,EAAOwD,GACRmhD,EAAKvuD,KAAKiyG,EAAepsG,EAAQ2F,OAAQomG,IAG3CrjD,EAAKvuD,KAAK4xG,EAAQhoG,EAAO6C,OAAQ,EAAAmmG,EAAA,IAAW,EAAAzsF,EAAA,GAAcvc,EAAO6C,SACjE,MAGF,IAAK,8BACL,IAAK,4BACL,IAAK,2BAA4B,CAC/B,MAAMipE,EAAS9rE,EAAkD8rE,OAC/D,CAAE9rE,EAAqDipG,SAIzD,GAFAtkD,EAAO,CAAC0jD,EAAepsG,EAAQ2F,OAAQomG,IAEpCl8B,EAAMl1E,OAAS,EAAG,CACnB,MAAMsyG,GAAS,cACPz0F,QAAQkI,IAAImvD,EAAMx9D,KAAK8mD,GAAmBizC,EAAejzC,EAAOpvC,WAAYgiF,OAClF,EACAA,GAGF,GAAGA,EACDrjD,EAAKvuD,QAAQ8yG,OACR,CACL,MAAM7/C,EAAWlqD,SAASC,cAAc,QACxCiqD,EAAS7pD,UAAU0pG,GACnBvkD,EAAKvuD,KAAKizD,SAGZ1E,EAAKvuD,KAAKiyG,EAAev8B,EAAM,GAAG9lD,WAAYgiF,IAGhD,MAGF,IAAK,0BAA2B,CAC9B,MAAMmB,GAAa,EAAAv7E,EAAA,IAAa5tB,EAAOopG,OAAQ,CAC7CngG,SAAU,CAAC,CACTzF,EAAG,mBACH5M,OAAQoJ,EAAOopG,OAAOxyG,OACtBq2B,OAAQ,MAMZ03B,EAAO,EAFM,EAAAqkD,EAAA,GAAWG,IAGxB,MAGF,IAAK,2BAA4B,CAC/B,MAAME,EAAkBrpG,EAAOuB,OAAO+nG,eAChCC,EAAkBvpG,EAAOuB,OAAOioG,eAKtC,GAJAlqD,EAAciqD,EAAkB,+CAAkDF,EAAkB,+CAAiD,mCAErJ1kD,EAAO,EADO,EAAA8kD,EAAA,GAA2BzpG,EAAO0pG,aAAc1pG,EAAO2pG,UACtDtB,EAAepsG,EAAQH,OAAQksG,IAE3C/rG,EAAQ6sG,aAAc,CACvB,MAAMc,QAAuB7uG,EAAS8G,mBAAmBuE,kBACvC,QAAhB,EAAAnK,EAAQ4tG,gBAAQ,eAAEC,mBAAmB,EAAA9R,EAAA,GAAU/7F,EAAQ4tG,SAASC,kBAAoB7tG,EAAQH,OAC5FG,EAAQ6sG,cAGNc,GAGFtqD,EAAciqD,EAAkB,wCAA2CF,EAAkB,wCAA0C,4BACvI1kD,EAAKvuD,KAAK2xG,EAAkB6B,EAAgB5B,GAAO5lG,MAAMzN,IACpDA,aAAc4C,aACf5C,EAAGwS,UAAUrS,IAAI,mBAGZH,OARToG,EAAS8G,mBAAmBknG,oBAAoB9sG,GAapD,MAGF,IAAK,8BAA+B,CAClC0oD,EAAO,GAEP,MAAMhvB,QAAoB56B,EAASqI,gBAAgBuyB,YAAY15B,EAAQH,QACvE,GAAGkE,EAAO+pG,OAAQ,CAUhB,IAAIpvG,EACJ,GAVGg7B,EACD2pB,EAAc,0BACNrjD,EAAQ2F,SAAW2P,EAAA,OAC3B+tC,EAAc,uBAEdA,EAAc,mBACdqF,EAAKvuD,KAAKiyG,EAAepsG,EAAQ2F,OAAQomG,KAIxChoG,EAAO+pG,OAAS,QAAS,CAC1B,IAAIzpG,EACJ,MAAMqkD,EAA2B,GAC3BrvB,EAAO,QACVt1B,EAAO+pG,QAAUz0E,GAClBh1B,EAAM,QACNqkD,EAAKvuD,KAAK4J,EAAO+pG,OAASz0E,EAAO,KAEjCh1B,EAAM,SACNqkD,EAAKvuD,KAAK4J,EAAO+pG,QAAoB,GAAV,MAAgB,IAG7CpvG,EAAWqtG,EAAQ,YAAY1nG,GAAK,EAAMqkD,IAAQ,QAAKrkD,EAAKqkD,QAE5DhqD,GAAW,EAAA2tG,EAAA,GAAmBtoG,EAAO+pG,OAAQ/B,GAG/CrjD,EAAKvuD,KAAKuE,QAEPg7B,EACD2pB,EAAc,2BACNrjD,EAAQ2F,SAAW2P,EAAA,OAC3B+tC,EAAc,wBAEdA,EAAc,oBACdqF,EAAKvuD,KAAKiyG,EAAepsG,EAAQ2F,OAAQomG,KAG7C,MAGF,QACE1oD,EAAewlC,EAAA,GAASthF,IAAM,IAAIxD,EAAOwD,KAIzC87C,IACFA,EAAcwlC,EAAA,GAASthF,QACJzL,IAAhBunD,IACDA,EAAc,IAAM97C,EAAI,MAI5B,MAAMwmG,EAASrlD,UAAclwC,QAAQkI,IAAIgoC,IAEzC,OAAGqjD,EACM,YAAY1oD,GAAa,EAAM0qD,IAE/B,QAAM/zG,EAASqpD,EAAa0qD,OChVxBC,CAA+BhuG,EAAS+rG,GACrD,MAAM1uG,GAEN,OADA4G,QAAQwf,MAAM,wCAAyCpmB,GAChD0uG,EAAQ,GAAK7oG,SAASC,cAAc,U,kdCShC,SAAe8qG,EAAoBjuG,EAAqC2L,EAAgB3L,EAA4BA,QAASkuG,EAAsBnC,EAAiB38E,EAAwB++E,G,qDACzM,MAAMvrE,EAA2B,GAEjC,IAAIwrE,GAAc,EAClB,MAAMC,EAAU,CAAChkD,EAAsBikD,KACrC,GAAGjkD,EAAS,CACV,QAAYvuD,IAATwyG,GAAsBF,EACvB,OAGFE,EAAOvC,EAAQ,YAAY1hD,GAAS,IAAQ,QAAKA,GAGnD,GAAG0hD,EACDnpE,EAAMzoC,KAAKm0G,OACN,CACL,MAAM51G,EAAKwK,SAASC,cAAc,QACd,iBAAX,EAAqBzK,EAAGme,UAAYy3F,EACxC51G,EAAG6K,OAAO+qG,GACf1rE,EAAMzoC,KAAKzB,KAKTkN,EADW,aACmBA,mBAE9B80D,GAAe,OAAoB16D,GAEzC,IAAIgN,EAAqD,QAAzC,EAAAhN,EAA4BiN,qBAAa,QAAKjN,EAAsCgN,SACpG,GAAIhN,EAA4BzC,QAAUm9D,EAAc,EACtD,OAA4B16D,GAC5B,IAAIuuG,GAAiB,EACrB,GAAGvuG,EAAQwuG,WAAY,CACrB,GAAGN,EAAW,CACZ,MAAMvvE,QAAa/4B,EAAmB6oG,iBAAiBzuG,GACvD,GAAGkuG,EAAUvzG,SAAWgkC,EAAKhkC,QAC3B,IAAI,MAAMmF,KAAO6+B,EACf,IAAIuvE,EAAUxhG,SAAS5M,GAAM,CAC3ByuG,GAAiB,EACjB,YAIJA,GAAiB,EAIrB,GAAGA,EAAgB,CACjB,MAAMG,QAAkB9oG,EAAmB+oG,aAAa3uG,EAAQwuG,YAChE7iG,EAAO+iG,EAAU1uG,QACjBgN,EAAW0hG,EAAUzhG,cAEjBkhG,IACFE,EAAQ,eACRD,GAAc,SAIlBG,GAAiB,EAGnB,IAAKA,IAAmBJ,IAAsBxiG,EAAM,CAClD,MAAMpO,EAAQyC,EAAQzC,MACtB,OAAOA,EAAMgK,GACX,IAAK,oBACH8mG,EAAQ,eACR,MACF,IAAK,mBACHA,OAAQvyG,EAAWiwG,EAAQxuG,EAAM+lF,UAAW,OAAc/lF,EAAM+lF,WAChE,MACF,IAAK,oBACH33E,EAAOpO,EAAMqJ,MACbynG,EAAQ,kBACR,MAEF,IAAK,kBACHA,EAAQ,kBACR,MACF,IAAK,sBACHA,EAAQ,sBACR,MACF,IAAK,mBACH,MAAM/yE,EAAI,OAAc/9B,EAAMqxG,KAAKC,UAAY,QAC/CR,OAAQvyG,EAAWiwG,EAAQzwE,GAAI,OAAcA,IAC7C,MACF,IAAK,sBACH+yE,EAAQ,iBACR,MACF,IAAK,mBAAoB,CACvB,MAAM/yE,EAAI,MAAa/9B,EAAMuxG,KAAKloG,MAClCynG,OAAQvyG,EAAWiwG,EAAQzwE,GAAI,OAAcA,IAC7C,MAEF,IAAK,uBAAwB,CAC3B,MAAMp4B,EAAW3F,EAAM2F,SAEvB,GAAqB,UAAlBA,EAASxJ,KACV20G,EAAQ,oBACH,GAAqB,UAAlBnrG,EAASxJ,KACjB20G,EAAQ,oBACH,GAAqB,QAAlBnrG,EAASxJ,KACjB20G,EAAQ,kBACH,GAAqB,UAAlBnrG,EAASxJ,KACjB20G,EAAQ,oBACH,GAAqB,YAAlBnrG,EAASxJ,KAAoB,CACrC,MAAM8hB,EAAIonB,EAAMjoC,OAChB,GAAGuI,EAASijD,gBAAiB,CAC3B,MAAM7qB,EAAIp4B,EAASijD,gBAAkB,IACrCkoD,OAAQvyG,EAAWiwG,EAAQzwE,GAAI,OAAcA,IAG/C+yE,EAAQ,iBAGR,MAAM51G,EAAImqC,EAAMld,OAAOlK,EAAG,GAC1B,GAAGuwF,EAAOnpE,EAAMzoC,KAAM1B,EAAE,GAAiBA,EAAE,QACtC,CACH,MAAM0zB,EAAO9gB,OAAOnI,SAASC,cAAc,QAC3CgpB,EAAK5oB,UAAU9K,GACfmqC,EAAMzoC,KAAKgyB,GAGbxgB,EAAO,QACF,GAAqB,UAAlBzI,EAASxJ,KAAkB,CACnC,MAAM2N,EAAYnE,EAASoE,WAAW9O,MAAM6O,GAA8B,2BAAhBA,EAAUE,IAAmCF,EAAUT,OAASS,EAAUI,aAC9H6zB,EAAI,OAAcj0B,EAAY,CAACA,EAAUT,MAAOS,EAAUI,WAAW2oB,OAAOC,SAASzU,KAAK,OAAS1Y,EAASsE,WAClH6mG,OAAQvyG,EAAWiwG,EAAQzwE,GAAI,OAAcA,SAE7C+yE,OAAQvyG,EAAWiwG,EAAQ7oG,EAASsE,WAAY,OAActE,EAASsE,YAGzE,MAGF,IAAK,sBAC4B,iCAAR,QAApB,EAAAjK,EAAMwxG,sBAAc,eAAExnG,GACvB8mG,OAAQvyG,EAAWiwG,EAAQxuG,EAAM8zB,aAAc,OAAc9zB,EAAM8zB,cAEnEg9E,OAAQvyG,EAAWiwG,EAAQxuG,EAAMqJ,OAAQ,OAAcrJ,EAAMqJ,QAG/D,MAGF,IAAK,0BACHynG,EAAQ,OAWd,MAAM1zG,EAASioC,EAAMjoC,OACrB,IAAI,IAAI6gB,EAAI,EAAGA,EAAI7gB,EAAQ6gB,GAAK,EAC9BonB,EAAMld,OAAOlK,EAAG,EAAG,MAGlB7P,GAAQhR,GACTioC,EAAMzoC,KAAK,MAIf,GAAI6F,EAAmC+D,OAAQ,CAC7C,MAAMirG,QAAsB,OAA0BhvG,EAAoC+rG,GACvFiD,GACDX,OAAQvyG,EAAWkzG,GASvB,GALGt0C,IACD/uD,GAAO,QAAsB3L,EAA4BivG,oBAAoBtjG,KAC7EqB,EAAW,IAGVrB,EAOD,GANAA,GAAO,OAAaA,EAAM,KAEtBqB,IACFA,EAAW,IAGV++F,EACDnpE,EAAMzoC,MAAK,OAAcwR,EAAMqB,QAC1B,CAGL,GAAGoiB,EAAe,CAChBA,EAAgBA,EAAcpH,OAC9B,IACI5qB,EADAnD,GAAQ,EAEZ,MAAM25B,EAAS,IAAIC,QAAO,OAAazE,GAAgB,MAEvD,IADApiB,EAAWA,EAASwhB,QACkB,QAA/BpxB,EAAQw2B,EAAOs7E,KAAKvjG,KACzBqB,EAAS7S,KAAK,CAACoN,EAAG,yBAA0B5M,OAAQy0B,EAAcz0B,OAAQq2B,OAAQ5zB,EAAMooB,QACxFvrB,GAAQ,EAGPA,IACD,OAAa+S,GAIjB,MAAMmiG,GAAiB,QAAaxjG,EAAM,CACxC4iD,cAAc,EACdvhD,SAAAA,EACAoiG,SAAS,EACTC,cAAc,IAGhBzsE,EAAMzoC,MAAK,OAAuBg1G,IAItC,GAAGpD,EACD,OAAOnpE,EAAMhnB,KAAK,IACb,CACL,MAAMwxC,EAAWlqD,SAASq5D,yBAE1B,OADAnP,EAAS7pD,UAAUq/B,GACZwqB,I,gVChPI,SAAekiD,EAAcrqF,G,qCAC1C,MAAMrE,EAAY,IAAI,IAEtB,aADMA,EAAU0U,OAAOrQ,GAChBrE,EAAU5mB,S,yvBCgBJ,SAAeu1G,GAAU,MAACv/E,EAAK,QAAEhwB,EAAO,UAAEiD,EAAS,SAAE0sB,EAAQ,UAAEC,EAAS,SAAE4/E,EAAQ,MAAEvzF,EAAK,cAAEvG,EAAa,WAAE8U,EAAU,KAAE9qB,EAAI,iBAAEowB,EAAgB,aAAEhF,EAAY,iBAAE4F,EAAgB,OAAET,EAAM,QAAEw/E,EAAO,SAAEhtB,EAAQ,UAAEitB,EAAS,SAAE5wG,EAAW,e,yCAoB5O,MAAMod,EAAM,CACV4O,aAAc,CACZ5jB,MAAOsR,QAAQxS,UACfmqB,KAAM3X,QAAQxS,WAEhBkqB,OAAQ,CACNhpB,MAAO,KACPipB,KAAM,MAER9c,UAAW,KACXoH,SAAU,MAGNuG,EAAyB,aAAZgP,EAAMzoB,EACnBooG,GAAW,OAAc3/E,GAC/B,IAAMA,EAAkBhpB,QAAUgpB,EAAqBlpB,SAAY6oG,EAKjE,OAJGhgF,GAAYC,IAAclwB,GAAQshB,IACnC,OAAkBgP,EAAO/sB,EAAW0sB,EAAUC,OAAW9zB,EAAWkE,GAG/Dkc,EAGT,IAAIwtF,EAAsC,IAArBh5E,EAEjBhxB,SACc5D,IAAb6zB,IAAwBA,EAAW,+BACrB7zB,IAAd8zB,IAAyBA,EAAY,4BAG1C3sB,EAAUiI,UAAUrS,IAAI,mBACxB,IAII0uE,EAEAnoE,EANAqb,EAAWxX,EAEX2sG,GAAQ,EACRC,EAAiCr3F,QAAQxS,UAI7C,MAAM8pG,EAAQ9uF,GAAkC,cAApBgP,EAAM5hB,YAA8B1O,EAKhE,GAAGiwB,GAAYC,IAAclwB,EAAM,CACjC,MAAMjE,GAAM,OAAkBu0B,EAAO/sB,EAAW0sB,EAAUC,OAAW9zB,EAAWkE,OAASlE,EAAWg0G,EAAQ,CAC1GvoG,EAAG,YACHtB,EAAG+pB,EAAM/pB,EACTgB,EAAG+oB,EAAM/oB,EACTvH,KAAMswB,EAAMtwB,KACZhG,KAAM,WACJoC,GAKJ,GAJA4D,EAAOjE,EAAIomB,UACX+tF,EAAQn0G,EAAIm0G,MACZxwG,QAAqBN,EAASO,cAAcC,gBAAgB0wB,EAAOtwB,EAAKhG,OAEpEk2G,IAAUD,EAAU,CACtBl1F,EAAWvX,SAASC,cAAc,OAClCsX,EAASvP,UAAUrS,IAAI,4BACvB4hB,EAASrX,MAAMsX,MAAQjf,EAAIiE,KAAKgb,MAAQ,KACxCD,EAASrX,MAAM0X,OAASrf,EAAIiE,KAAKob,OAAS,KAE1C,MAAMkH,GAAW,OAAyBgO,EAAO5wB,GAAe6wB,GAAQ,GACxE,GAAGjO,EAAU,CACX6tF,EAAmB7tF,EAASE,YAC5B,MAAMqlD,EAAavlD,EAAS3E,MAC5BkqD,EAAWr8D,UAAUrS,IAAI,eACzBoK,EAAUM,OAAOgkE,cAECgoC,EAAU,CAC1BtsG,UAAAA,EACAjD,QAAAA,EACAgwB,MAAAA,EACAL,SAAU,EACVC,UAAW,EACXlwB,KAAAA,EACAgW,cAAAA,EACAuG,MAAAA,EACA6O,aAAAA,EACAN,WAAAA,EACAsF,iBAAAA,EACA0/E,SAAAA,EACA9+E,iBAAAA,EACAT,OAAAA,EACAw/E,SAAS,EACTC,WAAW,EACX5wG,SAAAA,KAGqBoxB,OAAOC,KACnBjlB,UAAUrS,IAAI,cAAe,aAI1CoK,EAAUiI,UAAUrS,IAAI,0BACxBoK,EAAUM,OAAOkX,SAGf/a,IACFA,GAAO,OAAgBswB,EAAOL,EAAUC,GAAW,IAGrDxwB,QAAqBN,EAASO,cAAcC,gBAAgB0wB,EAAOtwB,MAAAA,OAAI,EAAJA,EAAMhG,MAG3E,IAAI+1G,IAAYE,EAAU,CACxB,MAAM3tF,GAAW,OAAyBgO,EAAO5wB,GAAe6wB,GAC7DjO,IACD6tF,EAAmBr3F,QAAQkI,IAAI,CAACmvF,EAAkB7tF,EAASE,cAC3DhG,EAAI4O,aAAa5jB,MAAQgV,EAAI4O,aAAaqF,KAAO0/E,EACjDtoC,EAAarrD,EAAIgU,OAAOhpB,MAAQ8a,EAAS3E,MACzCkqD,EAAWr8D,UAAUrS,IAAI,eACzB4hB,EAASlX,OAAOgkE,IAOpB,GAFArrD,EAAIzB,SAAWA,EAEC,oBAAZ/a,MAAAA,OAAI,EAAJA,EAAM6H,IAA0ByZ,IAAgBthB,MAAAA,OAAI,EAAJA,EAAsCqH,OACxF,OAAOmV,EAGT,IAAI3e,EACW,eAAZmC,MAAAA,OAAI,EAAJA,EAAM6H,IACPhK,EAAQ2e,EAAIgU,OAAOC,MAAO,SAC1B5yB,EAAMlB,UAAW,EACjBkB,EAAMhC,MAAO,EACbgC,EAAMqH,OAAQ,EACdrH,EAAM2N,UAAUrS,IAAI,iBAEpB0E,EAAQ2e,EAAIgU,OAAOC,KAAO,IAAI7S,MAC9B/f,EAAM2N,UAAUrS,IAAI,gBAKtB,MAAMqrG,GAAc38B,IAAenoE,EAAa2iB,aAAe,iCAAyC0gE,EAExG,IAAIpvE,EACJ,MAAMssB,EAAqB3/B,MAAAA,OAAO,EAAPA,EAA6B2/B,kBACpD7P,IACE1wB,EAAa2iB,aAAc4d,IAC7BtsB,EAAY,IAAI,IAAqB,CACnC+yD,aAAc,UACdD,WAAYxmC,KAIbA,IACDtsB,EAAUsQ,cAAc,cAA6Bgc,IACrDtsB,EAAU2P,OAAO/f,GACjBymG,OAAiB5tG,IAKrB,MAeMi0G,EAAgBxwG,IACb,OAAsB0D,EAAW1F,EAAOgC,EAAK2kG,EAAYzpF,EAAU8sD,GAGtE3yC,EAAer1B,GAAgB,EAAD,gCAClC,IAAGirB,GAAeA,IAAlB,CAEA,GAAGklF,EAAW,CACZ,MAAMtvE,GAAS,OAAK7gC,EAAK,IACzB,OAAO6gC,EAAOh6B,QAAQD,MAAK,IAElB4pG,EAAa3vE,EAAOhlC,OAAOqmF,eAItC,OAAOsuB,EAAaxwG,OAGtB,IAAI2iB,EACJ,MAAM8tF,EACHtwG,EAA6BuG,GAAK,KAClCvG,EAA6BuH,GAAK,KAChCyiG,EACChvG,EAAO,IAAW,EAAD,gCAClBgvG,IAAmB55E,GAAoBzc,IACxCA,EAAUrQ,YACVqQ,EAAUyQ,aAGZ,MAAM1d,EA5CmB,MAIzB,MAAM6pG,EAAiBH,IAAUpwG,EAQjC,OAPgB,qBAAoC,CAClDnC,MAAOyyB,EACP9oB,MAAOxH,EACPsL,QAAS0K,MAAAA,OAAa,EAAbA,EAAe1K,QACxBklG,UAAWD,OAAiBn0G,EAAY4tG,KAmC1ByG,GACV/wG,QAAqBN,EAASO,cAAcC,gBAAgB0wB,EAAOtwB,MAAAA,OAAI,EAAJA,EAAMhG,MAE7E2Z,IACCjU,EAAa2iB,aACb+N,GACDkgF,GAEA38F,EAAU2P,OAAO/f,GAAW,EAAOmD,GAGrCsjG,OAAiB5tG,EAEjB,MAAM8rE,EAAgBxhE,EAAQD,KAAKyuB,GAEnC,OADAgzC,EAAcn4D,MAAM,KACb,CAAC1B,SAAU3H,EAASm5B,OAAQqoC,MAiCrC,OA9BGv0D,GACDA,EAAUixB,oBAAoB5pC,GAG7B0E,EAAa2iB,WACd8tF,EAAmB3tF,SAAqBxnB,KAAQ6kC,OAE5C7pB,EAKMA,EAAcvb,KAAK,CAACioB,IAAKnf,EAAWvI,KAAM,IAAMA,IAAOyL,MAAK,EAAE4H,SAAAA,KAAcA,MALnEmU,SAAqBxnB,KAAQ6kC,OAQ/CzU,GAAgB+kF,GACjB/kF,EAAa3wB,KAAK01G,SAIdA,EACN3zF,EAAI4O,aAAa5jB,MAAQ2oG,EACzB3zF,EAAI4O,aAAaqF,KAAOjO,GAAe1J,QAAQxS,UAC/CkW,EAAI7I,UAAYA,EAOT6I,O,yFC3RM,SAAek0F,EAAiBpwG,G,qCAC7C,MAAMqwG,EAA2BntG,SAASC,cAAc,QACxDktG,EAAYnlG,UAAUrS,IAAI,gBAE1B,MAAMy3G,EAAStwG,EAAQ2F,SAAW,UAAkB3F,EAAQH,SAAW,SAUvE,GATAwwG,EAAY9sG,OACV+sG,GACE,QAAK,WACL,IAAI,IAAU,OAAD,yBACR,OAA6BtwG,IAAQ,CACxCmgB,OAAQngB,EAAQH,SAAW,YAC1B7F,gBAGE,wCAA8CgG,EAAQH,UAAWywG,EAAQ,CAChF,MAAM1vF,EAAY,IAAI,IAAU,CAAC/gB,OAAQG,EAAQH,SAAS7F,QAC1Dq2G,EAAY9sG,OAAO,MAAOqd,GAG5B,OAAOyvF,G,2VCtBM,SAASE,EAAavwG,GACnC,MAAMtH,EAAkBwK,SAASC,cAAc,QAI/C,OAHAzK,EAAGwS,UAAUrS,IAAI,aACjBH,EAAG6K,QAAO,QAA8B,IAAI4b,KAAoB,IAAfnf,EAAQkO,QAElDxV,I,0pBCmCF,MAAM83G,EAA4B,KAGnCC,EAAuC,GAEhCC,EAA6C,GAE3C,SAAeC,GAAY,IAACl3G,EAAG,IAAE2oB,EAAG,WAAEoI,EAAU,sBAAEomF,EAAqB,cAAEl7F,EAAa,WAAEm7F,EAAU,MAAEz4G,EAAK,KAAEkE,EAAI,UAAE2pC,EAAS,MAAE2Q,EAAK,MAAEl8B,EAAK,OAAEI,EAAM,UAAEqpF,EAAS,KAAE5oG,EAAI,aAAEuvB,EAAY,WAAEo5E,EAAU,YAAE4M,EAAW,UAAEC,EAAW5iG,OAAQ6iG,EAAQ,SAAElyG,EAAWwW,EAAA,WAAkB,UAAE27F,EAAS,MAAEh1F,EAAK,UAAEi1F,EAAS,SAAEv1D,EAAQ,eAAEyoD,EAAc,WAAEC,GAAU,cAAE8M,GAAa,YAAEC,K,gDA8BrWhvF,EAAM1R,MAAM60D,QAAQnjD,GAAOA,EAAM,CAACA,GAE/B+uF,KACDv6D,EAAQn9C,EAAI0sD,iBAGd,MAAMkrD,GAAc53G,EAAIkhD,QAKxB,GAJmB,IAAhB02D,KACDL,GAAW,IAGTt2F,IAAUI,EAAQ,CACpB,MAAM9T,EAAQya,EAAA,SACRmiF,EAAUhtD,EAAQ5vC,EAAMsqG,aAAgB73G,EAAI6tD,SAAWtgD,EAAMuqG,gBAAkBvqG,EAAMwqG,cACrF9xG,GAAO,OAAcjG,EAAIwM,EAAGxM,EAAIwN,GAAG68F,aAAaF,GACtDlpF,EAAQhb,EAAKgb,MACbI,EAASpb,EAAKob,OA+ChB,IAAI1b,GA5Ce,IAAhBiyG,IAEDplB,EAAA,sBAGF7pE,EAAIxlB,SAASwlB,IACXA,EAAI3E,QAAQxe,MAAQ,GAAKxF,EAAIgG,GAC1Bm3C,IACDx0B,EAAI3E,QAAQwkC,aAAerL,GAG7Bx0B,EAAIlX,UAAUrS,IAAI,4BAkCpB,MAAMyG,GAAkB,CAAM5F,GAAe0F,MAAAA,QAAY,EAAZA,GAAc1F,QAAS,EAAD,gCACjE,OAAO0F,SAAqBN,EAASO,cAAcC,gBAAgB7F,EAAKC,MAGpE+3G,IAAcT,IAA6B,IAAhBK,IAAqC,IAAhBA,IAEhD3N,IAAc,EAAAgO,EAAA,GAAsBj4G,QAC7BqC,IAAVmgB,GAAuBynF,KAAgBznF,GACxCmG,EAAIxlB,SAASwlB,GAAQA,EAAIlX,UAAUrS,IAAI,eAGzC,MAAM84G,GAAejO,IAAe/nD,EACpC,GAAGg2D,GAAc,CACf,MAAMC,EAAUnB,EAAUh3G,EAAIgG,IAC9B2iB,EAAIxlB,SAASwlB,IACXA,EAAIlX,UAAUrS,IAAI,qBAAsB,sBACxC+4G,GAAWxvF,EAAIhf,MAAM4tF,YAAY,aAAc,OAAO4gB,SAI1D,GAAGZ,GAA4B,IAAhBK,GAAmB,CAChC,MAAMnqG,GAAQ,EAAAwoB,EAAA,GAAgBj2B,EAAKihB,EAAOI,GAAQ,SAC5Cxb,GAAgB4H,EAAMxN,iBAEtB4F,GAAgB2xG,MAAAA,OAAS,EAATA,EAAWv3G,MAGnC,MAAMm4G,GAAYj7D,IAAUu6D,IAAgB,QAAkBv6D,IAAU,EAClE70B,GAAa3iB,GAAa2iB,aAAemiF,EAEzC4N,GAAuBL,GACvBM,GAAoC,IAAhBV,IAAqC,IAAhBA,SAA0BvyG,EAASC,eAAeizG,qBAAqBv4G,EAAIgG,GAAIoyG,SAAa/1G,EAErIogB,GAAM,CAACqjB,YAAQzjC,EAAiCpB,UAAMoB,GAC5D,IAAI+zG,IAAmB,SACnBoC,IAAkB,EACtB,KACY,QAAV,GAAAx4G,EAAIqN,cAAM,iBAAEnM,SACVo3G,MAED3vF,EAAI,GAAGlV,qBACP6U,IACC+vF,IACA7rE,KACe,IAAdk+D,EACH,CACA,IAAIj9F,EAAQ6qG,IAAqBt4G,EAAIqN,OAAO,GAI5C,MAAMorG,EAAc,CAAC9vF,EAAkBmlD,KACjCnlD,EAAI0E,kBAQN+oF,GAAiB7pG,WAPjBuhE,EAAWr8D,UAAUrS,IAAI,gBAAiB,aAE1C8uE,EAAA,gBAA4BvlD,GAAK,KAC/BA,EAAI7e,OAAOgkE,GACXsoC,GAAiB7pG,eAOvB,GAAG,QAASkB,EACV+qG,IAAkB,EAClB7vF,EAAIxlB,SAASwlB,IACX,MAAMmlD,EAAa,IAAIjqD,OACvB,EAAAwB,EAAA,IAAmByoD,EAAargE,EAAc3H,KAAK,IAAM2yG,EAAY9vF,EAAKmlD,aAEvE,GAAG,UAAWrgE,GACnB,GAAe,kBAAZA,EAAMK,EAAuB,CAC1BL,EAAMH,MAAMpM,SACduM,EAAQzN,EAAIqN,OAAOtO,MAAMogC,IAAK,MAAC,OAAwC,QAAxC,EAACA,EAAkC7xB,aAAK,eAAEpM,WAAWuM,GAGtF,MAAMkX,ECxNC,SAA0BrX,GAGvC,IAAIgV,EAAO,IACX,IAAI,IAAIP,EAAI,EAAG7gB,EAASoM,EAAMpM,OAAQ6gB,EAAI7gB,IAAU6gB,EAAG,CACrD,MAAM22F,EAAMprG,EAAMyU,GAEf22F,GAAO,IACRp2F,GAPW,mEAOIo2F,EAAM,IAAM,KAExBA,GAAO,IACRp2F,GAAQ,IACAo2F,GAAO,KACfp2F,GAAQ,KAEVA,GAAQ,IAAY,GAANo2F,IAKlB,OAFAp2F,GAAQ,IAEDA,EDoMSq2F,CAAkBlrG,EAAsCH,OAC5DsrG,EAAK,6BACLzxE,EAAM19B,SAAS0a,gBAAgBy0F,EAAI,OACzCzxE,EAAI11B,UAAUrS,IAAI,iBAAkB,gBAAiB,aACrD+nC,EAAI/iB,eAAe,KAAM,UAAW,OAAOpkB,EAAIwM,GAAK,OAAOxM,EAAIwN,GAAK,OAoCpE,MAAM8U,EAAO7Y,SAAS0a,gBAAgBy0F,EAAI,QAC1Ct2F,EAAK8B,eAAe,KAAM,IAAKO,GAC5B9I,EAAA,+BAAyC67F,IAAep1F,EAAK8B,eAAe,KAAM,OAAQ,WAC7F+iB,EAAIr9B,OAAOwY,GACXqG,EAAIxlB,SAAQ,CAACwlB,EAAKxhB,IAAQwhB,EAAI7e,OAAO3C,EAAM,EAAIggC,EAAIngB,WAAU,GAAQmgB,KACrEqxE,IAAkB,EAClBpC,GAAiB7pG,eACZ,GAAG6rG,IAAa,EAAG,CACxB,MAAMn2F,EAAI,KACP0G,EAAsBxlB,SAASwlB,IAC9B,MAAMmlD,EAAa,IAAIjqD,MACjB/d,GAAM,EAAA+yG,EAAA,GAAuB74G,EAAKyN,GAAsC,IAC9E,EAAA4X,EAAA,IAAmByoD,EAAYhoE,GAAK,IAAM2yG,EAAY9vF,EAAKmlD,SAI3D,KAAqB9tE,EAAI6L,OAAOitG,uBAAyBnzG,GAAaG,KACxE0yG,IAAkB,EAClBv2F,MAEAu2F,IAAkB,EAClBO,EAAA,UAA6B,QAAU/4G,EAAIgG,GAAIyH,EAAMH,OAAOZ,MAAMY,IAChEjI,EAASC,eAAe0zG,+BAA+Bh5G,EAAIgG,GAAIsH,GAC9DG,EAAsCH,MAAQA,EAC/CtN,EAAI6L,OAAOitG,uBAAwB,EAE/B/nF,IAAeA,KAAkBpI,EAAsB,GAAG0E,kBAC5D+oF,GAAiB7pG,UAInB0V,OACCjM,OAAM,IAAMogG,GAAiB7pG,mBAG/B,IAAqB,IAAhBqrG,IAAqBQ,IAAa,GAAsB,IAAhBR,MAAuBlN,GAAal+D,GAAY,CAClG,MAAMvrC,EAAO,IAAW,EAAD,gCACrB,GAAI0nB,EAAsB,GAAG0E,mBAAsB0D,IAAeA,IAEhE,YADAqlF,GAAiB7pG,UAInB,MAAM0V,EAAI,CAAC0G,EAAkBmlD,EAAyBhoE,KACjD6iB,EAAI0E,mBAAsB0D,IAAeA,IAC1CqlF,GAAiB7pG,UAIfzG,GACC,EAAAuf,EAAA,IAAmByoD,EAAYhoE,GAAK,IAAM2yG,EAAY9vF,EAAKmlD,KADvD2qC,EAAY9vF,EAAKmlD,UAItBjoE,KACL8iB,EAAsBxlB,SAASwlB,IAC9B,GAAGhjB,GAAaG,IACdmc,EAAE0G,EAAK,IAAI9E,MAASle,GAAaG,UAC5B,GAAG,UAAW2H,EAAO,CAC1B,MAAMqhB,GAAM,EAAAmqF,EAAA,GAA0Bj5G,EAAKyN,GAAsC,GACjFqhB,EAAIrG,YAAY/b,MAAK,IAAMuV,EAAE0G,EAAKmG,EAAIlL,MAAO,WAI7CmG,EAAA,mBAAoC,CAClCjmB,MAAO9D,EACPyN,MAAOA,IACNf,MAAW5G,GAAQ,EAAD,gCACnB,OAAOmc,EAAE0G,EAAK,IAAI9E,MAAS/d,cAMnC,GAAGmW,GAAiBuwB,EAGlB,OAFAvwB,EAAcvb,KAAK,CAACioB,IAAKA,EAAI,GAAI1nB,KAAAA,IACjCm1G,GAAiB7pG,UACVkW,GAEPxhB,IAEIwM,EAAc3H,MAChB0yG,IAAkB,IAU1B,GAJGnnF,GAAgBmnF,IACjBnnF,EAAa3wB,KAAK01G,IAGjB5pE,EACD,OAAO/pB,GAGT,MAAMy2F,IAAkB,EAAAC,EAAA,GAAU,cAC5Bl4G,GAAO,IAAW,EAAD,gCACrB,GAAG8vB,IAAeA,IAChB,MAAMmoF,GAGR,GAAmB,IAAhBtB,KAAsBL,EACvB,OAAOxtF,EAAA,gBAAiC,CAACjmB,MAAO9D,EAAKuR,QAAS0K,MAAAA,OAAa,EAAbA,EAAe1K,QAAS9D,MAAO+pG,IAC5F9qG,MAAWi6D,GAAS,EAAD,gCAClB,GAAG51C,IAAeA,IAChB,MAAMmoF,GAGR,MAAMp6G,QAAkB0zF,EAAA,sBAAiC,CACvDhpF,UAAYmf,EAAsB,GAClC7mB,OAAUq7C,IAASu6D,KAAkB51G,EACrCc,SAAUC,EACVu2G,cAAezyC,EACf1lD,MAAAA,EACAI,OAAAA,EACApL,KAAM,MAAQjW,EAAIgG,GAClBqxG,YAAAA,EACAC,UAAAA,EACAc,UAAAA,GACAiB,KAAM3B,IACL/4G,EAAOw4G,MAAAA,EAAAA,EAAyBpmF,GAI7BuoF,EAAepB,GAAe,K,QAClC,MAAMC,EAA0B,QAAnB,EAAGnB,EAAU,EAAAh3G,EAAIgG,WAAE,QAAhBgxG,EAAU,GEpYrB,SAA0Br1G,G,MACvC,MAAM+M,EAAU/M,EAAO0hB,WAAW,MAC5Bpd,EAAO,IAAgB,QAAV,EAAAtE,EAAO43G,WAAG,QAAI,GAC3Bt4F,EAAQhb,EACRob,EAASpb,EACTuzG,GAAS73G,EAAOsf,MAAQA,GAAS,EAEjCw4F,EAAQ93G,EAAO0f,OAASA,EADf,EAETq4F,EAAYhrG,EAAQ6yE,aAAai4B,EAAOC,EAAOx4F,EAAOI,GAAQyvB,KACpE,IAAI6oE,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EACjC,IAAI,IAAI/3F,EAAI,EAAGA,EAAI23F,EAAUx4G,OAAQ6gB,GAAK,EACxC43F,GAAMD,EAAU33F,GAChB63F,GAAMF,EAAU33F,EAAI,GACpB83F,GAAMH,EAAU33F,EAAI,GACpB+3F,GAAMJ,EAAU33F,EAAI,GAGtB,MAAMg4F,EAAYtwG,SAASC,cAAc,UACzCqwG,EAAU94F,MAAQhb,EAClB8zG,EAAU14F,OAASpb,EACnB,MAAM+zG,EAAaD,EAAU12F,WAAW,MAClC+uB,EAAQ,IAAIsvC,kBAAkB,CAAM,IAALi4B,EAAWG,EAAS,IAALF,EAAWE,EAAS,IAALD,EAAWC,EAAI,MAC5El4B,EAAO,QAAQxvC,EAAM,OAAOA,EAAM,OAAOA,EAAM,OAAOA,EAAM,MAMlE,OALA4nE,EAAWznE,UAAYqvC,EACvBo4B,EAAWxnE,SAAS,EAAG,EAAGunE,EAAU94F,MAAO84F,EAAU14F,QACrD24F,EAAWznE,UAAY,2BACvBynE,EAAWxnE,SAAS,EAAG,EAAGunE,EAAU94F,MAAO84F,EAAU14F,QAE9C04F,EAAU/xB,UAAU,cFwWmBiyB,CAAiBn7G,EAAU6C,OAAO,IACvEgnB,EAAsBxlB,SAASwlB,GAAQA,EAAIhf,MAAM4tF,YAAY,aAAc,OAAO4gB,cACjF91G,EAwDJ,OArBAvD,EAAUkN,iBAAiB,cAAc,KACvC,MAAMrK,EAAS7C,EAAU6C,OAAO,KACf,IAAd+oG,GAAuBgN,MACxB,EAAAwC,EAAA,GAAkBl6G,EAAK2B,EAAQy2G,IAG9BF,IACDoB,IAGE5B,IACD/uF,EAAsBxlB,SAAQ,CAACqG,EAAWrC,KA5C1B,EAACqC,EAAwB7H,KAC5C,MAAMpB,EAAUiJ,EAAUiK,mBACR,IAAfg3F,IACDA,GAAcA,IAAelqG,GAA+B,QAApBA,EAAQua,UAAsBe,EAAA,8BAGxE,MAAMvN,EAAK,KACN/N,GAAWA,IAAYoB,GAA8B,QAApBpB,EAAQua,SAC1Cva,EAAQK,UAIR6pG,EAKFv8B,EAAA,UAAqB,KACnBvsE,GAAUA,EAAO8P,UAAUrS,IAAI,WAC5BmB,GACDA,EAAQkR,UAAUrS,IAAI,aAGvBuC,GAAUpB,GAASyL,iBAAiB,gBAAgB,KACnDkiE,EAAA,UAAqB,KACnBvsE,GAAUA,EAAO8P,UAAU7Q,OAAO,WAClC0N,SAED,CAACjC,MAAM,OAfT9L,GACD2tE,EAAA,SAAqB5/D,IA+BrB6rG,CAAa3wG,EAAW1K,EAAU6C,OAAOwF,SAG5C,CAACkF,MAAM,IAEP8wC,GACD93C,EAASg8C,mBAAmB+4D,qCAAqCj9D,GAG5Dr+C,OAKJ,GAAGy4G,GAA4B,IAAhBK,GAAmB,CACvC,MAAMyC,EAAgBrC,IAAcL,GAC9B2C,EAAYD,EAAgBE,EAAA,eAAyB,GAAKv6G,EAAIgG,GAAI,EAAG,OAAG3D,OAAWA,QAAaA,EAEhGm4G,EAAevD,EAAYqD,GACjC,GAAGE,EACD,OAAOA,EAGT,MACM12G,GADIu2G,EAAiB1xF,EAAsBoM,MAAM,EAAG,GAAKpM,GAChC/P,KAAI,KACjC,IAAI9U,EACJ,GAAGyzG,EACDzzG,EAAQ,IAAI+f,UACP,CACL,MAAMvf,EAAQR,GAAQ,EAAAggB,EAAA,KAKtB,GAJAxf,EAAM6G,OAAQ,EACXtI,IAAMyB,EAAM1B,UAAW,GACvBd,IAAMwC,EAAMxC,MAAO,GAEnBA,GAAyB,iBAAX,EAAqB,CACpC,IAAI24G,EAAe,EAAGC,EAAc,EACpC,SAASC,IACJF,EAAep8G,KAAKsG,eAAiB+1G,IAAgB54G,IACtDzD,KAAKuE,UAAW,EAChBvE,KAAKyD,MAAO,EACZzD,KAAKsE,QACL2B,EAAMsL,oBAAoB,aAAc+qG,IAG1CF,EAAep8G,KAAKsG,YAGtBL,EAAM0H,iBAAiB,aAAc2uG,IAKzC,OADA72G,EAAM2N,UAAUrS,IAAI,iBACb0E,KAGHgqE,EAAcnlD,EAAsB/P,KAAI,CAAC+P,EAAKxhB,IAASwhB,EAAIlV,oBAAsC3P,EAAMqD,IAAQwhB,EAAIlV,qBACvG,IAAfg3F,IACDA,GAAcA,IAAeniF,KAAeivF,EAAWzpC,EAAW,IAAOA,EAAW,IAAgC,QAA1BA,EAAW,GAAGhzD,WAAwBe,EAAA,8BAG/H4uF,GACD3mG,EAAMX,SAASW,GAAUA,EAAM2N,UAAUrS,IAAI,aAG/C,MAAMuN,EAAU,IAAIoS,SAAiD,CAAMxS,EAASyS,IAAW,EAAD,gCAC5F,MAAMiD,EAAI,IAAW,EAAD,gCAClB,GAAG8O,IAAeA,IAEhB,YADA/R,EAAOk6F,IAIT,MAAM0B,EAAc92G,EAAM5C,OACpBowB,EAAwB,GA2D9B,IAAIupF,QADEh1G,KAEL8iB,EAAsBxlB,SAAQ,CAACwlB,EAAKxhB,KACnC,MAAM2zG,EAASh3G,EAAMqD,GAElB2zG,IAAQD,GAAc,EAAAx1F,EAAA,IAA0By1F,EAAQn1G,GAAaG,MACxE+0G,EAAYnuG,MAFD,IA7DE,EAACic,EAAkB7kB,EAAoBgqE,KACpDI,EAAA,gBAA4BvlD,GAAK,KAC/B,IAAGoI,GAAeA,IAKlB,GAAIjtB,EAAJ,CAQA,GAAGA,EAA2B,CAC5B,MAAM0I,EAAIyU,EAAQrP,OAAO07F,iBACnB9/F,EAAI6T,EAASzP,OAAO07F,iBAC1B,KAAI,OAAsBttG,EAAKo4G,GAAW5rG,EAAGgB,GAAI,CAE/C,MAAM7L,EAAS8H,SAASC,cAAc,UACtC/H,EAAOsf,MAAQzU,EACf7K,EAAO0f,OAAS7T,EACJ7L,EAAO0hB,WAAW,MAC1BM,UAAU7f,EAA2B,EAAG,EAAGnC,EAAOsf,MAAOtf,EAAO0f,SACpE,EAAA64F,EAAA,GAAkBl6G,EAAK2B,EAAQy2G,KAKhCiC,EACD9tG,EAAQzI,IAIV6kB,EAAI7e,OAAOhG,GAER2mG,GACD38B,GAAcA,EAAWr8D,UAAUrS,IAAI,YACvC0E,EAAMkI,iBAAiB,gBAAgB,KACrClI,EAAM2N,UAAU7Q,OAAO,WACvBktE,MAAAA,GAAAA,EAAYltE,WACX,CAACyL,MAAM,KAEVyhE,MAAAA,GAAAA,EAAYltE,SAGXo3G,IACD75G,EAAA,eAAkC2F,EAA2BnF,GAG5D2yB,EAAO5wB,KAAKoD,KAAW82G,GACxBruG,EAAQ+kB,SA5CJ+oF,GAAkBrC,IACpBlqC,MAAAA,GAAAA,EAAYltE,cANdoe,EAAOk6F,QA0DM/9E,CAAOxS,EAAKmyF,EAAQhtC,EAAW3mE,YAOpD,SADMtB,KACHF,GAAaG,IAAKmc,QAChB,CACH,IAAItV,EACJ,GAAmB,IAAhBirG,IAAqBL,EAAU,CAChC,MAAM9pG,GAAQ,EAAAwoB,EAAA,GAAgBj2B,EAAKihB,EAAOI,GAAQ,GAElD1U,EAAUod,EAAA,mBAAoC,CAACjmB,MAAO9D,EAAKyN,MAAAA,EAAO8D,QAAS0K,MAAAA,OAAa,EAAbA,EAAe1K,eAE1F5E,EAAUod,EAAA,mBAAoC,CAACjmB,MAAO9D,EAAKuR,QAAS0K,MAAAA,OAAa,EAAbA,EAAe1K,UAGrF5E,EAAQD,KAAKuV,EAAGjD,SAapB,OATGs7F,IACDrD,EAAYqD,GAAa3tG,EACzBwqG,GAAyBxqG,EAAQuJ,SAAQ,KACnCihG,YACKF,EAAYqD,OAKlB3tG,MAIX,GAAGyqG,IAA+B,IAAfA,KAAsB9uF,IAAc0vF,KAA+B,IAAfZ,GAErE,OADA30F,GAAIxhB,KAAOA,GACJwhB,GAGT,MAAMgG,IAAgExM,GAAmBqM,KAAc0vF,GAErG/2G,MADCgb,EAAcvb,KAAK,CAACioB,IAAKA,EAAI,GAAI1nB,KAAAA,KAAQ8d,QAAQxS,WAyBpD,OAtBG+b,IAAc,IACf8tF,GAAmB3tF,GAChB4I,GACDA,EAAa3wB,KAAK01G,KAIH,IAAhBwB,IAAqB3N,SAAyB5nG,IAAVmgB,IAAwBi1F,GAkBjE,UAAoC,UAACjuG,EAAS,IAAExJ,EAAG,SAAEqF,EAAQ,WAAE0rB,EAAU,MAAEvO,EAAK,MAAEvB,EAAK,YAAEwH,EAAW,eAAEkiF,EAAc,WAAEC,IAWpHvlG,EAASg8C,mBAAmB05D,eAAe/6G,EAAIgG,IAAI,GAEnD,IAAIg1G,GAAU,GACd,QAAiBxxG,GAAiBrD,GAAM,EAAD,gCAErC,IADA,EAAAgS,EAAA,GAAYhS,GACT60G,EAAS,CACV,MAAMroG,EAAIlJ,SAASC,cAAc,KAWjC,OAVAiJ,EAAEI,QAAU,MACV,UACA,IAAI,IAAc/S,EAAI+qE,iBAAiB3hD,aAGzC,EAAAugC,EAAA,IAAS,CACPC,YAAa,6BACbC,kBAAmB,CAACl3C,KAMxBqoG,GAAU,QAEJvyF,EACN,MAAM,aAACwyF,EAAY,eAAEC,IAAkB,OAAqB,CAC1Dl7G,IAAAA,EACA+wB,WAAAA,EACAoqF,KAAM34F,EAAQ,QAAU,OACxBvc,KAAMgb,EAAQ81F,EACdr4G,OAAQ8K,EACR3G,MAAM,EACN20G,WAAW,EAAAS,EAAA,GAAsBj4G,GACjC2qG,eAAAA,EACAC,WAAAA,SAGWvoG,IAAVmgB,GAAwBA,GACzBy4F,EAAaxpG,UAAUrS,IAAI,aAG7B87G,EAAexuG,MAAMjM,IACnBA,EAAOuL,iBAAiB,WAAW,KACjCgvG,GAAU,aArEdI,CAA2B,CACzB5xG,UAAWmf,EAAI,GACf3oB,IAAAA,EACAqF,SAAAA,EACA0rB,WAAAA,EACAvO,MAAAA,EACAvB,MAAAA,EACAwH,YAAAA,GACAkiF,eAAAA,EACAC,WAAAA,KAIJnoF,GAAIqjB,OAASrd,GACNhG,MA6DF,SAAe44F,GAAoB,MAACzgE,EAAK,UAAEpxC,EAAS,SAAEnE,EAAQ,OAAEe,EAAM,WAAE2qB,I,kDAO7E,EAAA5Y,EAAA,GAAYyiC,GAEZ,MAAMtC,GAAS,EAAAn9B,EAAA,GAAgB3R,EAAW,UACpC2zC,EAAQ3zC,EAAUwa,QAAQwkC,aAE1B1pD,EAAa0K,EAAUiI,UAAUqB,SAAS,qBAAyDzQ,EAAvCmwF,EAAA,eAA0BhpF,GAC5F,GAAG1K,MAAAA,OAAS,EAATA,EAAW4D,OAAQ,CACpB,MAAM1C,QAAYqF,EAASg8C,mBAAmBi6D,8BAA8Bn+D,GAC5E,GAAGn9C,EAAK,CACN,MAAMuE,EAAQkF,SAASC,cAAc,SACrCnF,EAAMoF,MAAM2b,QAAU,OACtB9b,EAAUwN,cAAclN,OAAOvF,GAE/B,IACE,MAAMuB,QAAYikB,EAAA,mBAAoC,CAACjmB,MAAO9D,IAE9DuE,EAAMvD,IAAM8E,EACZvB,EAAM1B,aACA,EAAA4V,EAAA,GAAYlU,OAAOlC,GAAW,GAEpCkC,EAAMyH,iBAAiB,SAAS,KAC9BzH,EAAMvD,IAAM,GACZuD,EAAM3D,WACL,CAACyL,MAAM,IACV,MAAMzI,KAKV9E,EAAU8D,UAAW,EACrB9D,EAAUy8G,UAGZ,IAAIn1G,EAAOg2B,SACT,OAGF,MAAMp8B,QAAYqF,EAASg8C,mBAAmBm6D,wBAAwBr+D,GAAO,GAC7E,IAAIn9C,EACF,OAGF,MAAM8wC,EAAoE,QAAhE,KAAqCtnC,GAAkBiyG,iBAAS,UAATA,UAAc,CAC7E9oG,EAAG,GACHuS,EAAG,GAGCw2F,EAAwClyG,EAAkBkyG,0BAA2B,EAAAh2B,EAAA,IAAS,KAElG,IADe50C,EAAKn+B,EAAEzR,OAEpB,OAGF,MAAMo5D,EAAYxpB,EAAKn+B,EAAE,GAAGwsB,EAE5B2R,EAAKn+B,EAAExP,SAASwP,IACdA,EAAEwsB,GAAKxsB,EAAEwsB,EAAIm7B,GAAa,OAG5B,MAAMhiB,GAAS,EAAAn9B,EAAA,GAAgB3R,EAAW,UAC1CnE,EAAS8G,mBAAmB4jD,UAAUvgC,EAAA,cAA0B,CAC9D1hB,EAAG,8BACH6tG,QAAQ,EAAAC,EAAA,IAAoBtjE,EAAOt0B,QAAQ3d,KAC3CwjF,SAAU1sC,EACV0+D,YAAa,CACX/tG,EAAG,WACHgjC,KAAMgrE,KAAKC,UAAUjrE,MAEtB,GAEHA,EAAKn+B,EAAEzR,OAAS,IACf,KAAM,GAEHshB,EAAQ81B,EAASA,EAAO7mC,UAAUqB,SAAS,eAAYzQ,GACvD,aAAC44G,IAAgB,OAAqB,CAC1Cj7G,IAAAA,EACA+wB,WAAAA,EACAoqF,KAAM34F,EAAQ,QAAU,OACxBvc,KAAM,IACNvH,OAAQ8K,EACR3G,MAAM,EACNm5G,kBAAkB,SAGP35G,IAAVmgB,GAAwBA,GACzBy4F,EAAaxpG,UAAUrS,IAAI,aAI1Bw7C,EAAM/yC,YACPipC,EAAKn+B,EAAEjS,KAAK,CACVqhB,EAAG,EACHod,EAAGzZ,KAAKC,QAGV+1F,U,0IG7wBW,SAASO,GAAqB,KAC3Ch2G,EAAI,IACJjG,EAAG,WACH+wB,EAAU,OACVryB,EAAM,KACNy8G,EAAI,UACJ7D,EAAS,KACTz0G,EAAI,SACJwC,EAAQ,UACRmyG,EAAS,iBACTwE,EAAgB,eAChBrR,EAAc,WACdC,I,MAeA,MAAMqQ,EAAexxG,SAASC,cAAc,OAO5C,IAAI5K,EANJm8G,EAAaxpG,UAAUrS,IAAI,mBAG3B67G,EAAatxG,MAAMsX,MAAQhb,EAAO,KAClCg1G,EAAatxG,MAAM0X,OAASpb,EAAO,KAGnC,MAAMi2G,EAAmB,KACvB3yD,EAAiBrhD,QACjBpJ,MAAAA,GAAAA,EAAW8B,SACXq6G,EAAar6G,SACb,0DAAmE,SAAU6zB,IAGzE80B,EAAuC,QAApB,EAAAx4B,MAAAA,OAAU,EAAVA,EAAYorF,gBAAQ,SAAI,SACjDprF,EAAaw4B,EAAiBjoD,MAE9B,MAAM45G,GAAiB,QAAY,CACjCvyF,IAAKsyF,EACLj7G,IAAAA,EACA+wB,WAAAA,EACA25E,WAAW,EACXD,YAAY,EACZ3oG,OAAQ8oG,EACR3pF,MAAOhb,EACPob,OAAQpb,EACRpD,KAAAA,EACAlE,MAAO,OACP24G,UAAAA,EACAjyG,SAAAA,EACAmyG,UAAAA,IACC9qG,MAAK,EAAEo5B,OAAAA,KAAYA,IAAQp5B,MAAMnN,IAElC,IADA,OAA0BA,IACtBwxB,IAEF,MADAxxB,EAAWqB,UACL,OAAU,cAgBlB,OAbA9B,EAAYS,EACZT,EAAUkN,iBAAiB,cAAeowG,KACnCxR,GAAcwR,IAAYt9G,EAAUu9G,YAAc,OAAQ39G,IAC7Dw9G,OAID,KACDp9G,EAAUkN,iBAAiB,cAAc,KACvCvI,UAAU64G,QAAQ,OACjB,CAACjwG,MAAM,IAGLvN,KAGHy9G,EAAwB13G,IAC5B,MAAMod,EAAIrd,KAAK6wC,SAAW5wC,EAAM,EAChC,OAAOod,EAAIpd,GAAOod,EAAIpd,EAAMod,GAGxBu6F,EAAgBR,EAAmBO,EAAqB,IAAM,EAC9DE,EAAgBT,EAAmBO,EAAqB,GAAK,EAC7DG,EAAc,KAClB,KAAI,OAAQh+G,GAEV,YADAw9G,IAIF,MAAMh8F,EAAOxhB,EAAOyhB,wBAEdw8F,EAASz8F,EAAKe,MAAQ,IACtB27F,EAAyB,WAATzB,EAAoB,EAAI,IAAe,UAATA,EAAmB,GAAK,GAAKwB,EAE3EE,EAAyB,WAAT1B,EAAoB,EAAI,EAAIwB,EAE5CG,EAAiB,UAAT3B,EAAmBj7F,EAAKu5B,MAAQv5B,EAAKI,KAC7Cy8F,EAAQ78F,EAAKa,IAEbi8F,GAAuB,WAAT7B,GAAqBj7F,EAAKe,MAAQhb,GAAQ,EAAc,UAATk1G,GAAoBl1G,EAAO,GAAM22G,EAAgBJ,EAC9GS,GAA2C/8F,EAAKmB,OAASpb,GAAQ,EAAS42G,EAAgBJ,EAC1F53F,EAAIi4F,EAAQE,EACZl4F,EAAIi4F,EAAQE,EAEfn4F,IAAM7e,GAAQ6e,GAAK,WACpBo3F,IAICvR,GACW,WAATwQ,EAAmBF,EAAatxG,MAAMwxG,IAAmC,EAA3Bv2G,KAAK+Y,IAAIi/F,GAAsB,KAC3E3B,EAAatxG,MAAM2W,KAAO08F,EAAa,KAC5C/B,EAAatxG,MAAMoX,IAAMk8F,EAAa,OAEtChC,EAAatxG,MAAMoX,IAAM+D,EAAI,KAC7Bm2F,EAAatxG,MAAM2W,KAAOuE,EAAI,OAI5B4P,GAAW,OAAgBioF,GAYjC,OAXA,uDAAgE,SAAUjoF,GAE1EioF,IAEG/R,GACDsQ,EAAaxpG,UAAUrS,IAAI,eAC3BV,EAAOsY,cAAclN,OAAOmxG,IAE5B,mCAA4CA,GAGvC,CAACA,aAAAA,EAAcC,eAAAA,K,qECnJT,SAAegC,GAAiB,MAAC//D,EAAK,IAAEx0B,EAAG,MAAE1H,EAAK,OAAEI,EAAM,SAAEhc,EAAW,e,qCAOpF,MAAMrF,QAAYqF,EAASg8C,mBAAmBm6D,wBAAwBr+D,GACtE,IAAIn9C,EAEF,MADA2oB,EAAIlX,UAAUrS,IAAI,yBACZ,IAAIurC,MAAM,cAGlB,OAAO,QAAY,CACjB3qC,IAAAA,EACA2oB,IAAAA,EACAw0B,MAAAA,EACAl8B,MAAAA,EACAI,OAAAA,EACAvf,MAAM,EACNe,MAAM,K,8rBCbK,SAAes6G,GAAoB,IAACn7G,EAAG,cAAEia,EAAa,UAAEzS,EAAS,MAAE7K,EAAK,SAAEiE,EAAQ,MAAEqe,EAAK,OAAEI,EAAM,SAAEhc,EAAW,e,+CAU3H,GAAa,QAAV,EAAArD,EAAIqL,cAAM,eAAEnM,OAgDb,OA/CAsI,EAAUiI,UAAUrS,IAAI,8BACxB6c,EAAcvb,KAAK,CACjBioB,IAAKnf,EACLvI,KAAM,IAAW,EAAD,gCACd,MAAMm8G,QAAwB/3G,EAASg8C,mBAAmBg8D,kCAAkCr7G,GACtF2K,EAAU,aAA4BywG,GAE5C,GAAGp7G,EAAI6J,OAAOgiD,WAAa7rD,EAAI6J,OAAOyxG,OACpC,OAAO3wG,EACND,MAAMi6D,IACL,wBAAiC,CAC/Bn9D,UAAAA,EACA1H,MAAM,EACNc,SAAAA,EACAw2G,cAAezyC,EACf1lD,MAAAA,EACAI,OAAAA,EACAg2F,aAAa,EACbphG,KAAM,WAAajU,EAAIgE,IACtBrH,MAEA,CACL,IAAImF,EAYJ,OAXG9B,EAAI6J,OAAOyxG,QACZx5G,GAAQ,SACPA,EAA2BlB,UAAW,EACtCkB,EAA2BqH,OAAQ,EACnCrH,EAA2BhC,MAAO,GAEnCgC,EAAQ,IAAI+f,MAGd/f,EAAM2N,UAAUrS,IAAI,iBAEbuN,EAAQD,MAAMi6D,KACnB,QAAmB7iE,EAAO4zB,IAAI0uD,gBAAgBzf,IAAO,KACnDn9D,EAAUM,OAAOhG,GAEd9B,EAAI6J,OAAOyxG,QACZ,iBAAkCx5G,EAA2BnF,eAW3E,IAAI4+G,EAGFA,EADCv7G,EAAIw7G,kBACWn4G,EAASylD,gBAAgB8gC,uBAAuB5pF,EAAIw7G,mBAEpDn4G,EAASg8C,mBAAmBC,cAAct/C,GAAK0K,MAAMy0C,GAAeA,EAAWc,UAAU,KAG3G,MAAMjiD,QAAYu9G,EACL,kBAAVv9G,EAAI8N,IACL,QAAY,CACV9N,IAAAA,EACA2oB,IAAKnf,EACL7K,MAAOA,EACPsd,cAAAA,EACA5W,SAAAA,EACA4b,MAAAA,EACAI,OAAAA,S,yDCpFS,SAASo8F,GAAiB,IAACz9G,EAAG,IAAEw4B,EAAG,KAAEvyB,EAAI,SAAEZ,IAMxD,MAAMq4G,EAAgBllF,EAAI10B,MACpBA,EAAQ00B,EAAIk5C,YAAY,SAE3BgsC,GACD55G,EAAM2N,UAAUrS,IAAI,QAGtB,MAAMiyB,EAA+BqsF,EAAgB,QAAKr7G,EAEpDs7G,EAAiB,UAAT13G,EAAmB,GAAK,GAChC0gC,GAAS,QAAY,CACzBhe,IAAK7kB,EACL9D,IAAKA,EACLihB,MAAO08F,EACPt8F,OAAQs8F,EACRtsF,aAAAA,EACAhsB,SAAAA,IACCqH,MAAK,EAAEo5B,OAAAA,KAAYA,IAOtB,OALAzU,GAAgBtS,QAAQkI,IAAIoK,GAAc3kB,MAAK,KAC7C5I,EAAM2N,UAAU7Q,OAAO,QACvB88G,EAAc98G,YAGT+lC,I,ylBCCT,IAAIi3E,EAA0B,EAuBf,SAAeC,GAAU,IAAC79G,EAAG,UAAEwJ,EAAS,QAAEjD,EAAO,SAAE2vB,EAAQ,UAAEC,EAAS,SAAE4/E,EAAQ,MAAEvzF,EAAK,WAAEuO,EAAU,cAAE9U,EAAa,OAAEq2C,EAAM,MAAE3zD,EAAK,YAAEy3B,EAAW,UAAEm8B,EAAS,iBAAEl8B,EAAgB,aAAEhF,EAAY,aAAEiF,EAAY,UAAElO,EAAS,UAAE01F,EAAS,cAAEt1G,EAAa,aAAE2hC,EAAY,SAAE9kC,EAAW,e,+CAuBpR,MAAM4xB,EAAmBkT,MAAAA,OAAY,EAAZA,EAAc7lC,MACvC,IAAI2rG,EAAsC,IAArBh5E,EACrB,MAAM8mF,IAAgB7nF,GAAYC,GAC5B6nF,GAEW,UAAbh+G,EAAIC,MACFD,EAAIiG,MAtDoB,WAuDvB83G,KAEc,QAAb/9G,EAAIC,KAAiB,2BAAmC,8BAEhE,IAAIg+G,GAAuBC,GAE3B,IAAI5rD,EAAQ,CACV2rD,GAAWx0G,SAASC,cAAc,QAClCu0G,GAASxsG,UAAUrS,IAAI,cACvBoK,EAAUM,OAAOm0G,IAEjB,IAAIE,GAAiB,EACL,QAAbn+G,EAAIC,MACLg+G,GAAS9lF,WAAY,OAASn4B,EAAIiF,UAAU,GAExCqxB,GAA6B,UAAbt2B,EAAIC,OACnB+9G,IAAgB/N,EACjBgO,GAASxsG,UAAUrS,IAAI,QAAS,gBAEhC++G,GAAiB,KAIrBF,GAAS9lF,UAAY,MAEjB6lF,GAAgB1nF,IAClB6nF,GAAiB,EACjBlO,OAAiB5tG,IAIlB87G,IACDD,GAAWz0G,SAASC,cAAc,QAClCw0G,GAASzsG,UAAUrS,IAAI,aAAc,kBAAmB,aAAc,mBACtEoK,EAAUM,OAAOo0G,KAIrB,MAAMpvF,GAGF,GAEJ,GAAqB,cAAlB9uB,EAAI2U,UAA2B,CAChC,MAAMypG,QAAiB,OAAU,CAC/B7nF,MAAOv2B,EACPuG,QAAAA,EACAiD,UAAAA,EACA0sB,SAAAA,EACAC,UAAAA,EACA4/E,SAAAA,EACAvzF,MAAAA,EACAvG,cAAAA,EACA8U,WAAAA,EACAsF,iBAAAA,EACAhF,aAAAA,EACA4F,iBAAAA,EACAhxB,KAAMmiB,EACN/iB,SAAAA,IAKF,OAFAypB,GAAIrhB,MAAQ2wG,EACZtvF,GAAIrG,YAAc21F,EAAS/sF,aAAaqF,KACjC5H,GAQT,IAAIlV,GAEJ,MAAMtV,IAAQ,SAGd,GAFAA,GAAMmN,UAAUrS,IAAI,eACpBkF,GAAM6G,OAAQ,EACE,UAAbnL,EAAIC,KAAkB,CACvB,MAAMo+G,EAAW50G,SAASC,cAAc,OACxC20G,EAAS5sG,UAAUrS,IAAI,cAAe,aACtCi/G,EAASr6F,QAAQ3d,IAAM,GAAKE,EAAQF,IACpCg4G,EAASr6F,QAAQ5d,OAAS,GAAKG,EAAQH,OACtCi4G,EAAiB93G,QAAUA,EAE5B,MAAMN,EAAO,iBACPq4G,EAAWr4G,EAAKgb,MAAQ,EACxBs9F,EAAc,IACdC,EAASF,EAA0B,EAAdC,EAC3BF,EAASjhG,UAAY,qCAAqCnX,EAAKgb,kBAAkBhb,EAAKgb,6IACMs9F,UAAoBD,UAAiBA,SAAgBE,sCAGjJ,MAAMx5E,EAASq5E,EAAS5qG,kBAAkBA,kBACtCmqG,IACFA,EAA0B,EAAIh5G,KAAKogE,GAAKw5C,GAE1Cx5E,EAAOr7B,MAAMgkE,gBAAkBiwC,EAA0B,IAAMA,EAC/D54E,EAAOr7B,MAAM80G,iBAAmB,GAAKb,EAErCK,GAASxsG,UAAUrS,IAAI,SAENmH,EAAQsF,OAAOI,cAE9BoyG,EAAS5sG,UAAUrS,IAAI,aAGzB,MAAMuC,EAAS8H,SAASC,cAAc,UACtC/H,EAAOsf,MAAQtf,EAAO0f,OAASrhB,EAAIwM,EAEnC6xG,EAAStoG,QAAQpU,EAAQs8G,IACzBI,EAASv0G,OAAOxF,IAChBkF,EAAUM,OAAOu0G,GAEjB,MAAMt3C,EAAMplE,EAAO0hB,WAAW,MAKxB8X,EAAS,KACb,MAAM50B,EAA4B83G,EAAiB93G,QAC7Cm4G,EAAc,aAAoCn4G,GAAU0pG,GAC5D9wF,EAAQ,MACX,yBAAoCJ,QAAQxS,WAAW2J,SAAQ,MAC3D,OAAQwoG,KAIXA,EAAY9uG,oBAAoB,OAAQ1J,GACxCw4G,EAAY9uG,oBAAoB,aAAc24B,GAC9Cm2E,EAAY9uG,oBAAoB,QAAS+uG,GACzCD,EAAY9uG,oBAAoB,QAAShI,QAIvCg3G,EAAU,KACd73C,EAAIpjD,UAAU+6F,EAAa,EAAG,GAE9B,MAAMnnF,EAASqmF,EAA0Bc,EAAY/5G,YAAc+5G,EAAYz5G,SAAW24G,EAG1F,OAFA54E,EAAOr7B,MAAM80G,iBAAmB,GAAKlnF,GAE7BmnF,EAAYh8G,QAGhB4lC,EAAe,KACfo2E,EAAYz5G,YAIZ,OAAQy5G,IAKTA,EAAYh8G,QACbk8G,IAGFX,GAAS9lF,WAAY,OAASumF,EAAYz5G,SAAWy5G,EAAY/5G,aAAa,IAR5Ewa,MAWEopB,GAAsB,QAAS,MACnC,QAAQD,KACP,KAAM,GAEHpiC,EAAS,KACb5B,GAAMmN,UAAUrS,IAAI,QACpBi/G,EAAS5sG,UAAU7Q,OAAO,cAC1B,QAAcg+G,EAASj9G,GAEpBiY,IAAaA,GAAUA,WAAaA,GAAUA,UAAUnI,UAAUqB,SAAS,WAC5E8G,GAAUzH,WAIRwsG,EAAW,MACX,OAAQD,GAKZL,EAAS5sG,UAAUrS,IAAI,aAJrB+f,KAOEvX,EAAU,KACdtD,GAAMmN,UAAU7Q,OAAO,QACvBy9G,EAAS5sG,UAAUrS,IAAI,aAEvBkF,GAAMK,YAAc,EACpBs5G,GAAS9lF,WAAY,OAASumF,EAAYz5G,UAAU,GAEjDy5G,EAAY/5G,cACb+5G,EAAY/5G,YAAc,IAI9B+5G,EAAY1yG,iBAAiB,OAAQ9F,GACrCw4G,EAAY1yG,iBAAiB,aAAcu8B,GAC3Cm2E,EAAY1yG,iBAAiB,QAAS2yG,GACtCD,EAAY1yG,iBAAiB,QAASpE,IAEtC,QAAiBjG,GAASwE,IAaxB,IAZA,OAAYA,GAGTyT,KAAcA,GAAU6yD,UACzB7yD,GAAUzH,UAQTusG,EAAYh8G,OAAQ,CACrB,MAAMunC,IAAqBzhC,EAC3B,GAAG,qBAA4CA,GAAiB,CAC9DpC,OAAQ,KACRkK,YAAa,CAACxC,EAAG,4BACjBo8B,WAAW,IACT,CACF,MAAOt7B,EAAM5G,GAASiiC,GAAwB,QAAiBo0E,EAAU93G,EAAQF,KAAxC,GACzC,eAAsC,CAACD,OAAQG,EAAQH,OAAQC,IAAKE,EAAQF,KAAMuI,EAAM5G,GAG1F02G,EAAY77G,YAEZ67G,EAAY/7G,WAIb+7G,EAAYh8G,OACVg8G,EAAYz5G,UAAYy5G,EAAY/5G,cAAgB+5G,EAAYz5G,UAAYy5G,EAAY/5G,YAAc,GACvGi6G,IACAt2E,IACAhkC,GAAMmN,UAAUrS,IAAI,SAEpBu/G,IAGFz4G,KAIDK,EAAQsF,OAAOo6B,aACfo4E,EAAiBljF,OAASA,EAC3BkjF,EAASr6F,QAAQgiB,WAAa,KAE9B7K,SAGF72B,GAAM1B,UAAW,EAGnB,IAAIw7G,GAgEAz4G,GA/DJ,GAAGY,EAAS,CAoBV,GAnBA63G,SAAiB,OAAU,CACzB7nF,MAAOv2B,EACPuG,QAAAA,EACAiD,UAAAA,EACA0sB,SAAAA,EACAC,UAAAA,EACA4/E,SAAAA,EACAvzF,MAAAA,EACAvG,cAAAA,EACA8U,WAAAA,EACAsF,kBAAkB,EAClBhF,aAAAA,EACA4F,iBAAkBkT,MAAAA,OAAY,EAAZA,EAAc5T,MAChCtwB,KAAMmiB,EACN/iB,SAAAA,IAGFypB,GAAIrhB,MAAQ2wG,IAEPJ,GAA4B,QAAbh+G,EAAIC,MAAmBm2B,EAEzC,OADAtH,GAAIrG,YAAc21F,GAAS/sF,aAAaqF,KACjC5H,GAGT,GAAGinF,EAAU,CACX,MAAM3wF,GAAiBg5F,GAAS3nF,OAAOhpB,OAAS2wG,GAAS3nF,OAAOC,MAAM1f,cACtE1S,GAAM2c,OAASmE,EAAcR,eAAe,KAAM,SAClDtgB,GAAM+c,QAAU+D,EAAcR,eAAe,KAAM,UACnDQ,EAActb,OAAOxF,UAElB,IAAIiuD,EAAW,CACpB,MAAMhqC,GAAW,OAAyBvoB,EAAK,IAAkB,GACjE,GAAGuoB,EAAU,CACX,MAAMulD,EAAavlD,EAAS3E,MAC5BkqD,EAAWr8D,UAAUrS,IAAI,gBACzBoK,EAAUM,OAAOgkE,GACjBh/C,GAAIrhB,MAAQ,CACV4jB,aAAc,CACZ5jB,MAAO8a,EAASE,YAChBiO,KAAM3X,QAAQxS,WAEhBkqB,OAAQ,CACNhpB,MAAOqgE,EACPp3C,KAAM,MAER9c,UAAW,KACXoH,SAAU,MAGZqQ,MAAAA,GAAAA,EAAc3wB,KAAK6nB,EAASE,aAC5BqG,GAAIrG,YAAcF,EAASE,aAI/B,GAAG2N,EACD,OAAOtH,IAGLxqB,GAAM0S,eAAiBxN,KACxB40G,MAAAA,QAAQ,EAARA,GAAUp9F,WAAYxX,GAAWM,OAAOxF,IAI3C,MAAMuB,GAAkB,IAAW,EAAD,gCAChC,OAAOF,SAAqBN,EAASO,cAAcC,gBAAgB7F,EAAK89G,MAAAA,OAAS,EAATA,EAAW79G,eAG/E4F,KAEN,MAAMqqG,GAAiB3pG,MAAAA,OAAO,EAAPA,EAAS2/B,kBAC7BgqE,IACDt2F,GAAY,IAAI,IAAqB,CACnC+yD,aAAc,UACdD,UAAU,IAEZ9yD,GAAUsQ,cAAc,cAA6BgmF,KACrDt2F,GAAU2P,OAAO/f,GAAW,GAC5BymG,OAAiB5tG,GACRsD,GAAa2iB,YAAetoB,EAAIyF,mBAAsB4wB,EAIvDr2B,EAAIyF,oBACZmU,GAAY,IAAI,IAAqB,CACnCoC,YAAY,EACZ2wD,aAAc,aANhB/yD,GAAY,IAAI,IAAqB,CACnC+yD,aAAc,YASlB,MAAMkyC,IAAiB,SAevB,GAdAv6G,GAAM0H,iBAAiB,SAAU7F,IACP,IAArB7B,GAAM0lB,MAAMpS,MACbpN,QAAQwf,MAAM,SAAW1lB,GAAM0lB,MAAMpS,KAAO,cAAgBtT,GAAM0lB,MAAMzjB,SAGvEqT,KAAcs2F,IACft2F,GAAU6P,SAGRo1F,GAAen8F,aACjBm8F,GAAetyG,YAEhB,CAACF,MAAM,IAEM,UAAbrM,EAAIC,KAAkB,CACvB,MAAMqoC,EAAe,KACfhkC,GAAMW,WAIVg5G,GAAS9lF,WAAY,OAAS7zB,GAAMW,SAAWX,GAAMK,aAAa,KAG9D4jC,GAAsB,QAAS,MACnC,QAAQD,KACP,KAAK,GAERhkC,GAAM0H,iBAAiB,aAAcu8B,GAElC21E,IACD55G,GAAM0H,iBAAiB,cAAc,KACnC,kBAA4BkyG,IAAU,KACpCA,GAASt9G,cAEV,CAACyL,MAAM,IAId/H,GAAM6G,OAAQ,EACd7G,GAAMxC,MAAO,EAEbwC,GAAM1B,UAAW,EAEjB,IAAIk8G,GAAqB7O,IAAqC,QAAnB,EAAAmO,MAAAA,QAAQ,EAARA,GAAUxkG,iBAAS,eAAEgzD,UAChE,MAAM3rE,GAAO,IAAW,EAAD,gCAClB2Y,IAAaq2F,IAAmB55E,IACjCzc,GAAUrQ,YACVqQ,GAAUyQ,mBAGNxkB,KACN,IAAI4iB,EAA4B1J,QAAQxS,UACxC,GAAIqN,KAAcs2F,IAAmB75E,EACnC,GAAI1wB,GAAa2iB,YAAetoB,EAAIyF,kBAW1BzF,EAAIyF,oBACTwqG,EACDxnF,EAAc1J,QAAQC,QAAO,OAAU,sBAC9BrZ,GAAa2iB,YAAc1O,KACpCA,GAAU2P,OAAO/f,GAAW,EAAO,MACnClF,GAAM0H,iBAAiB,EAAAlL,UAAY,aAAe,WAAW,KAC3D8Y,GAAU6P,WACT,CAACpd,MAAM,UAlByC,CACrD,MAAMM,EAAU8b,EAAc,qBAAoC,CAChE3kB,MAAO9D,EACPuR,QAAS0K,MAAAA,OAAa,EAAbA,EAAe1K,QACxBklG,UAAWxG,EACXxiG,MAAOqwG,IAGNlkG,IACDA,GAAU2P,OAAO/f,GAAW,EAAOmD,GAmDzC,OArCIsjG,GAAkB6O,KACpBA,KACAA,GAAqB,MAGvB7O,OAAiB5tG,EAEjBomB,EAAY/b,MAAK,IAAW,EAAD,iCACtBqkB,GAAeA,KAKF,UAAb/wB,EAAIC,MACL,+BAAsDsG,EAAQH,OAAQG,EAAQF,IAAKE,EAAQsF,OAAOC,oBAG9FjG,MAEN,OAAYvB,IAAOoI,MAAK,KACnB/N,GACD,iBAAkC2F,GAAO3F,GAGxCib,KAAcs2F,IACft2F,GAAU6P,SAGZo1F,GAAetyG,aACb3I,IACF4G,QAAQwf,MAAM,mBAAoBpmB,GAClCi7G,GAAe7/F,OAAOpb,OAGxB,QAAmBU,GAAOqB,GAAaG,MAzBrC+4G,GAAetyG,cA0BhB,KAEI,CAAC+H,SAAUmU,EAAaqd,OAAQ/mB,QAAQkI,IAAI,CAACwB,EAAao2F,SAyCnE,OAtCGjlG,KAAcs2F,IACft2F,GAAUixB,oBAAoB5pC,IAqBhB,QAAbjB,EAAIC,MAAmB+9G,EAOxBlvF,GAAIrG,YAAexM,GAEhBA,EAAcvb,KAAK,CAACioB,IAAKnf,EAAWvI,KAAM,IAAMA,KAAOyL,MAAK,EAAEo5B,OAAAA,KAAYA,MAAW/mB,QAAQxS,kBADvFtL,MAAQ6kC,QAPjB,QAAiBt8B,GAAYrD,KAC3B,OAAYA,GACZ+3G,GAASt9G,SACTK,OACC,CAACiS,SAAS,EAAM7G,MAAM,IAOxByiB,GAAIrhB,cACCqhB,GAAIrhB,MAAM4jB,aAAa5jB,OAGxBqhB,MAtiBT,qBAA4B,gBAAgB,CAAC5X,EAAM2lF,KACjD,GAAGA,IAAO,YAAqB3lF,IAAS,WAAmB,CACzD,MAAMiM,EAAWlM,MAAMC,KAAKzN,SAAS+M,iBAAiB,gCAChDyK,EAAQ,uBACRq9F,EAAWr9F,EAAQ,EACnBu9F,EAASF,EAAW,EAC1BV,EAA0B,EAAIh5G,KAAKogE,GAAKw5C,EACxCr7F,EAAShgB,SAAS5C,IAChBA,EAAQ6jB,eAAe,KAAM,QAAS,GAAKnD,GAC3C1gB,EAAQ6jB,eAAe,KAAM,SAAU,GAAKnD,GAE5C,MAAM+jB,EAASzkC,EAAQkT,kBACvBuxB,EAAO5gB,eAAe,KAAM,KAAM,GAAKk6F,GACvCt5E,EAAO5gB,eAAe,KAAM,KAAM,GAAKk6F,GACvCt5E,EAAO5gB,eAAe,KAAM,IAAK,GAAKo6F,GAEtCx5E,EAAOr7B,MAAMgkE,gBAAkBiwC,EAA0B,IAAMA,EAC/D54E,EAAOr7B,MAAM80G,iBAAmB,GAAKb,U,qEClD5B,SAASmB,EAAuBC,GAC7C,MAAMC,GAAuB,OAAaD,EAAQpnF,aAAe,GAAI,IAAK,KAS1E,OAAO,QAAaqnF,K,qECVP,SAASC,EAAiBF,GACvC,IAAIG,EAAaH,EAAQ7xG,OAAS6xG,EAAQvsG,QAAUusG,EAAQI,WAAa,GAEzE,OADAD,GAAa,OAAaA,EAAY,GAAI,MACnC,QAAaA,EAAY,CAACxJ,SAAS,EAAM7gD,cAAc,M,6CCGhE,MAEA,EAFmD,CAAC,IAAM,CAAC,KAAO,MAAM,MAAQ,8BAA8B,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,OAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,wCAAwC,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,KAAK,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,cAAc,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,KAAK,WAAa,UAAU,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,wBAAwB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,SAAS,WAAa,cAAc,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,KAAK,cAAgB,GAAG,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,OAAO,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,KAAK,WAAa,UAAU,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,UAAU,WAAa,eAAe,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,SAAS,WAAa,cAAc,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,SAAS,WAAa,cAAc,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,OAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,MAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,KAAK,WAAa,UAAU,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,MAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,OAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,cAAc,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,YAAY,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,6BAA6B,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,SAAS,WAAa,cAAc,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,uBAAuB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,KAAS,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,UAAU,WAAa,eAAe,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,cAAc,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,c,qDCR55iB,MAAMuqD,EAAyE,CAAC,GAAK,CAAC,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,GAAI,GAAG,CAAC,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,IAAK,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,OAAO,MAAO,OAAO,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa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","sources":["webpack://tweb/./src/components/animationIntersector.ts","webpack://tweb/./src/components/appMediaPlaybackController.ts","webpack://tweb/./src/components/appMediaViewer.ts","webpack://tweb/./src/lib/mediaPlayer.ts","webpack://tweb/./src/components/appMediaViewerBase.ts","webpack://tweb/./src/helpers/fillPropertyValue.ts","webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/appSearch.ts","webpack://tweb/./src/components/appSearchSuper..ts","webpack://tweb/./src/helpers/dom/lockTouchScroll.ts","webpack://tweb/./src/components/appSelectPeers.ts","webpack://tweb/./src/components/audio.ts","webpack://tweb/./src/helpers/avatarListLoader.ts","webpack://tweb/./src/components/appMediaViewerAvatar.ts","webpack://tweb/./src/components/avatar.ts","webpack://tweb/./src/components/avatarEdit.ts","webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/buttonCorner.ts","webpack://tweb/./src/components/buttonIcon.ts","webpack://tweb/./src/components/buttonMenu.ts","webpack://tweb/./src/components/buttonMenuToggle.ts","webpack://tweb/./src/components/chat/gradientRenderer.ts","webpack://tweb/./src/helpers/easing/easeOutQuad.ts","webpack://tweb/./src/components/chat/selection.ts","webpack://tweb/./src/helpers/dom/getSelectedText.ts","webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/confirmationPopup.ts","webpack://tweb/./src/components/countryInputField.ts","webpack://tweb/./src/components/editPeer.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/stickers.ts","webpack://tweb/./src/components/emoticonsDropdown/index.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/emoji.ts","webpack://tweb/./src/lib/richTextProcessor/wrapSingleEmoji.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/stickers.ts","webpack://tweb/./src/components/generateFakeIcon.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat2.ts","webpack://tweb/./src/components/gifsMasonry.ts","webpack://tweb/./src/components/horizontalMenu.ts","webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/components/inputSearch.ts","webpack://tweb/./src/components/lazyLoadQueue.ts","webpack://tweb/./src/components/lazyLoadQueueIntersector.ts","webpack://tweb/./src/components/mediaProgressLine.ts","webpack://tweb/./src/components/middleEllipsis.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/components/peerProfileAvatars.ts","webpack://tweb/./src/components/peerProfile.ts","webpack://tweb/./src/components/generateTitleIcons.ts","webpack://tweb/./src/components/generateVerifiedIcon.ts","webpack://tweb/./src/components/generatePremiumIcon.ts","webpack://tweb/./src/components/peerTitle.ts","webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/deleteDialog.ts","webpack://tweb/./src/components/popups/deleteMessages.ts","webpack://tweb/./src/components/popups/forward.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/components/popups/mute.ts","webpack://tweb/./src/components/popups/peer.ts","webpack://tweb/./src/components/popups/pickUser.ts","webpack://tweb/./src/components/popups/sendNow.ts","webpack://tweb/./src/components/popups/stickers.ts","webpack://tweb/./src/components/preloader.ts","webpack://tweb/./src/components/putPhoto.ts","webpack://tweb/./src/components/wrappers/getPeerInitials.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/radioField.ts","webpack://tweb/./src/components/radioForm.ts","webpack://tweb/./src/components/rangeSelector.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/components/row.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newGroup.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/privacyType.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/getPrivacyRulesDetails.ts","webpack://tweb/./src/components/privacySection.ts","webpack://tweb/./src/helpers/dom/anchorCopy.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack://tweb/./src/helpers/dom/canFocus.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/email.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack://tweb/./src/helpers/string/convertKeyToInputKey.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/voices.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack://tweb/./src/helpers/averageColor.ts","webpack://tweb/./src/helpers/highlightningColor.ts","webpack://tweb/./src/components/colorPicker.ts","webpack://tweb/./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack://tweb/./src/components/sidebarLeft/tabs/background.ts","webpack://tweb/./src/helpers/files/requestFile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/quickReaction.ts","webpack://tweb/./src/components/sidebarLeft/tabs/generalSettings.ts","webpack://tweb/./src/helpers/eachMinute.ts","webpack://tweb/./src/helpers/eachTimeout.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editProfile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/notifications.ts","webpack://tweb/./src/components/sidebarLeft/tabs/language.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/photo.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/file.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/video.ts","webpack://tweb/./src/components/sidebarLeft/tabs/dataAndStorage.ts","webpack://tweb/./src/components/sidebarLeft/tabs/settings.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newChannel.ts","webpack://tweb/./src/components/popups/createContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/contacts.ts","webpack://tweb/./src/components/sidebarLeft/tabs/archivedTab.ts","webpack://tweb/./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack://tweb/./src/components/sidebarLeft/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/addMembers.ts","webpack://tweb/./src/components/sidebarLeft/tabs/chatFolders.ts","webpack://tweb/./src/components/sidebarLeft/tabs/includedChats.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editFolder.ts","webpack://tweb/./src/components/sidebarRight/index.ts","webpack://tweb/./src/components/sidebarRight/tabs/editContact.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatType.ts","webpack://tweb/./src/components/sidebarRight/tabs/userPermissions.ts","webpack://tweb/./src/components/sidebarRight/tabs/groupPermissions.ts","webpack://tweb/./src/lib/appManagers/utils/chats/combineParticipantBannedRights.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatReactions.ts","webpack://tweb/./src/components/sidebarRight/tabs/editChat.ts","webpack://tweb/./src/components/sidebarRight/tabs/sharedMedia.ts","webpack://tweb/./src/components/singleTransition.ts","webpack://tweb/./src/components/slider.ts","webpack://tweb/./src/components/sliderTab.ts","webpack://tweb/./src/components/sortedUserList.ts","webpack://tweb/./src/components/stickerViewer.ts","webpack://tweb/./src/components/stickyIntersector.ts","webpack://tweb/./src/components/swipeHandler.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/components/toast.ts","webpack://tweb/./src/components/transition.ts","webpack://tweb/./src/lib/richTextProcessor/isUsernameValid.ts","webpack://tweb/./src/components/usernameInputField.ts","webpack://tweb/./src/components/visibilityIntersector.ts","webpack://tweb/./src/components/volumeSelector.ts","webpack://tweb/./src/components/wrappers/customEmoji.ts","webpack://tweb/./src/components/wrappers/document.ts","webpack://tweb/./src/components/wrappers/formatUserPhone.ts","webpack://tweb/./src/components/wrappers/getChatMembersString.ts","webpack://tweb/./src/components/wrappers/getPeerTitle.ts","webpack://tweb/./src/components/wrappers/getUserStatusString.ts","webpack://tweb/./src/components/wrappers/joinVoiceChatAnchor.ts","webpack://tweb/./src/components/wrappers/messageActionTextNewUnsafe.ts","webpack://tweb/./src/components/wrappers/messageActionTextNew.ts","webpack://tweb/./src/components/wrappers/messageForReply.ts","webpack://tweb/./src/components/wrappers/peerTitle.ts","webpack://tweb/./src/components/wrappers/photo.ts","webpack://tweb/./src/components/wrappers/senderToPeer.ts","webpack://tweb/./src/components/wrappers/sentTime.ts","webpack://tweb/./src/components/wrappers/sticker.ts","webpack://tweb/./src/helpers/bytes/getPathFromBytes.ts","webpack://tweb/./src/helpers/computeLockColor.ts","webpack://tweb/./src/components/wrappers/stickerAnimation.ts","webpack://tweb/./src/components/wrappers/stickerEmoji.ts","webpack://tweb/./src/components/wrappers/stickerSetThumb.ts","webpack://tweb/./src/components/wrappers/stickerToRow.ts","webpack://tweb/./src/components/wrappers/video.ts","webpack://tweb/./src/components/wrappers/webPageDescription.ts","webpack://tweb/./src/components/wrappers/webPageTitle.ts","webpack://tweb/./src/config/currencies.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/config/font.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/helpers/animation.ts","webpack://tweb/./src/helpers/array/filterAsync.ts","webpack://tweb/./src/helpers/array/findAndSpliceAll.ts","webpack://tweb/./src/helpers/audioAssetPlayer.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/heavyQueue.ts","webpack://tweb/./src/helpers/blur.ts","webpack://tweb/./src/helpers/bytes/getPreviewURLFromBytes.ts","webpack://tweb/./src/helpers/bytes/bytesToDataURL.ts","webpack://tweb/./src/helpers/calcImageInBox.ts","webpack://tweb/./src/helpers/canvas/getTextWidth.ts","webpack://tweb/./src/helpers/canvas/scaleMediaElement.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/clipboard.ts","webpack://tweb/./src/helpers/contextMenuController.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/dom/attachContextMenuListener.ts","webpack://tweb/./src/helpers/dom/attachGrabListeners.ts","webpack://tweb/./src/helpers/dom/cancelSelection.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/controlsHover.ts","webpack://tweb/./src/helpers/dom/createStickersContextMenu.ts","webpack://tweb/./src/helpers/dom/createContextMenu.ts","webpack://tweb/./src/helpers/dom/createVideo.ts","webpack://tweb/./src/helpers/dom/customProperties.ts","webpack://tweb/./src/helpers/dom/dispatchEvent.ts","webpack://tweb/./src/helpers/dom/documentFragmentToHTML.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/getCaretPosNew.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValueWithCaret.ts","webpack://tweb/./src/helpers/dom/getViewportSlice.ts","webpack://tweb/./src/helpers/dom/getVisibleRect.ts","webpack://tweb/./src/helpers/dom/handleHorizontalSwipe.ts","webpack://tweb/./src/helpers/dom/handleTabSwipe.ts","webpack://tweb/./src/helpers/dom/htmlToDocumentFragment.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/positionElementByIndex.ts","webpack://tweb/./src/helpers/dom/renderImageFromUrl.ts","webpack://tweb/./src/helpers/dom/renderMediaWithFadeIn.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts","webpack://tweb/./src/helpers/dom/compareNodes.ts","webpack://tweb/./src/helpers/dom/richInputHandler.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/dom/whichChild.ts","webpack://tweb/./src/helpers/dropdownHover.ts","webpack://tweb/./src/helpers/fastSmoothScroll.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/filterChatPhotosMessages.ts","webpack://tweb/./src/helpers/formatBytes.ts","webpack://tweb/./src/helpers/formatCallDuration.ts","webpack://tweb/./src/helpers/formatDuration.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/helpers/framesCache.ts","webpack://tweb/./src/helpers/generatePathData.ts","webpack://tweb/./src/helpers/getImageFromStrippedThumb.ts","webpack://tweb/./src/helpers/getPreviewURLFromThumb.ts","webpack://tweb/./src/helpers/getStrippedThumbIfNeeded.ts","webpack://tweb/./src/helpers/listLoader.ts","webpack://tweb/./src/helpers/listenerSetter.ts","webpack://tweb/./src/helpers/mediaSize.ts","webpack://tweb/./src/helpers/mediaSizes.ts","webpack://tweb/./src/helpers/middleware.ts","webpack://tweb/./src/helpers/middlewarePromise.ts","webpack://tweb/./src/helpers/number/clamp.ts","webpack://tweb/./src/helpers/number/formatNumber.ts","webpack://tweb/./src/helpers/number/numberThousandSplitter.ts","webpack://tweb/./src/helpers/onMediaLoad.ts","webpack://tweb/./src/helpers/overlayClickHandler.ts","webpack://tweb/./src/helpers/paymentsWrapCurrencyAmount.ts","webpack://tweb/./src/helpers/positionMenu.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/helpers/saveLottiePreview.ts","webpack://tweb/./src/helpers/schedulers/throttleWithRaf.ts","webpack://tweb/./src/helpers/schedulers/throttleWith.ts","webpack://tweb/./src/helpers/scrollableLoader.ts","webpack://tweb/./src/helpers/searchListLoader.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/incrementMessageId.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/setAttachmentSize.ts","webpack://tweb/./src/helpers/sortedList.ts","webpack://tweb/./src/helpers/string/bom.ts","webpack://tweb/./src/helpers/string/encodeEntities.ts","webpack://tweb/./src/helpers/string/escapeRegExp.ts","webpack://tweb/./src/helpers/string/limitSymbols.ts","webpack://tweb/./src/helpers/string/toHHMMSS.ts","webpack://tweb/./src/helpers/windowSize.ts","webpack://tweb/./src/hooks/useHeavyAnimationCheck.ts","webpack://tweb/./src/components/dialogsContextMenu.ts","webpack://tweb/./src/components/connectionStatus.ts","webpack://tweb/./src/components/sendingStatus.ts","webpack://tweb/./src/helpers/easing/easeInOutSine.ts","webpack://tweb/./src/helpers/canvas/roundRect.ts","webpack://tweb/./src/components/groupCallActiveIcon.ts","webpack://tweb/./src/helpers/canvas/shimmer.ts","webpack://tweb/./src/helpers/dialogsPlaceholder.ts","webpack://tweb/./src/helpers/canvas/drawCircle.ts","webpack://tweb/./src/lib/appManagers/appDialogsManager.ts","webpack://tweb/./src/helpers/number/getUnsafeRandomInt.ts","webpack://tweb/./src/lib/appManagers/appDownloadManager.ts","webpack://tweb/./src/helpers/dom/createDownloadAnchor.ts","webpack://tweb/./src/components/chat/bubbleGroups.ts","webpack://tweb/./src/helpers/array/partition.ts","webpack://tweb/./src/components/popups/datePicker.ts","webpack://tweb/./src/components/divAndCaption.ts","webpack://tweb/./src/components/chat/replyContainer.ts","webpack://tweb/./src/components/wrappers/reply.ts","webpack://tweb/./src/components/stackedAvatars.ts","webpack://tweb/./src/components/chat/replies.ts","webpack://tweb/./src/components/chat/messageRender.ts","webpack://tweb/./src/helpers/dom/getElementByPoint.ts","webpack://tweb/./src/helpers/dom/reflowScrollableElement.ts","webpack://tweb/./src/lib/mtproto/constants.ts","webpack://tweb/./src/lib/appManagers/internalLink.ts","webpack://tweb/./src/components/popups/joinChatInvite.ts","webpack://tweb/./src/components/chat/reaction.ts","webpack://tweb/./src/components/chat/reactions.ts","webpack://tweb/./src/helpers/scrollSaver.ts","webpack://tweb/./src/helpers/dom/superIntersectionObserver.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMentionUnread.ts","webpack://tweb/./src/helpers/array/accumulate.ts","webpack://tweb/./src/helpers/cacheCallback.ts","webpack://tweb/./src/helpers/string/replaceNonNumber.ts","webpack://tweb/./src/helpers/cards/cardBrands.ts","webpack://tweb/./src/helpers/array/createArray.ts","webpack://tweb/./src/helpers/string/buggedNumbers.ts","webpack://tweb/./src/helpers/cards/patternCharacters.ts","webpack://tweb/./src/helpers/cards/cardFormattingPatterns.ts","webpack://tweb/./src/helpers/cards/formatValueByPattern.ts","webpack://tweb/./src/helpers/cards/validateCard.ts","webpack://tweb/./src/helpers/string/nbsp.ts","webpack://tweb/./src/components/popups/paymentVerification.ts","webpack://tweb/./src/components/popups/paymentCard.ts","webpack://tweb/./src/helpers/cards/formatInputValueByPattern.ts","webpack://tweb/./src/components/popups/paymentCardConfirmation.ts","webpack://tweb/./src/components/popups/paymentShipping.ts","webpack://tweb/./src/components/popups/paymentShippingMethods.ts","webpack://tweb/./src/components/popups/payment.ts","webpack://tweb/./src/components/groupedLayout.ts","webpack://tweb/./src/components/prepareAlbum.ts","webpack://tweb/./src/components/wrappers/album.ts","webpack://tweb/./src/components/sidebarRight/tabs/pollResults.ts","webpack://tweb/./src/components/poll.ts","webpack://tweb/./src/helpers/string/isRTL.ts","webpack://tweb/./src/components/dotRenderer.ts","webpack://tweb/./src/components/chat/bubbles.ts","webpack://tweb/./src/helpers/dom/copyFromElement.ts","webpack://tweb/./src/components/wrappers/groupedDocuments.ts","webpack://tweb/./src/components/wrappers/poll.ts","webpack://tweb/./src/components/popups/unpinMessage.ts","webpack://tweb/./src/helpers/dom/isSelectionEmpty.ts","webpack://tweb/./src/helpers/preloadAnimatedEmojiSticker.ts","webpack://tweb/./src/components/popups/reportMessagesConfirm.ts","webpack://tweb/./src/components/popups/reportMessages.ts","webpack://tweb/./src/components/popups/sponsored.ts","webpack://tweb/./src/components/popups/reactedList.ts","webpack://tweb/./src/components/chat/reactionsMenu.ts","webpack://tweb/./src/components/chat/contextMenu.ts","webpack://tweb/./src/components/chat/sendContextMenu.ts","webpack://tweb/./src/components/popups/createPoll.ts","webpack://tweb/./src/helpers/createPoster.ts","webpack://tweb/./src/helpers/getGifDuration.ts","webpack://tweb/./src/components/popups/newMedia.ts","webpack://tweb/./src/helpers/dom/attachListNavigation.ts","webpack://tweb/./src/components/chat/autocompleteHelper.ts","webpack://tweb/./src/components/chat/stickersHelper.ts","webpack://tweb/./src/components/popups/schedule.ts","webpack://tweb/./src/components/chat/emojiHelper.ts","webpack://tweb/./src/components/chat/autocompletePeerHelper.ts","webpack://tweb/./src/components/chat/commandsHelper.ts","webpack://tweb/./src/components/chat/autocompleteHelperController.ts","webpack://tweb/./src/components/chat/mentionsHelper.ts","webpack://tweb/./src/components/chat/replyKeyboard.ts","webpack://tweb/./src/components/chat/inlineHelper.ts","webpack://tweb/./src/components/chat/botCommands.ts","webpack://tweb/./src/helpers/modifyAckedResult.ts","webpack://tweb/./src/components/chat/sendAs.ts","webpack://tweb/./src/components/inputFieldAnimated.ts","webpack://tweb/./src/helpers/dom/hasMarkupInSelection.ts","webpack://tweb/./src/components/chat/input.ts","webpack://tweb/./src/components/wrappers/draft.ts","webpack://tweb/./src/components/chat/pinnedContainer.ts","webpack://tweb/./src/components/chat/pinnedMessageBorder.ts","webpack://tweb/./src/components/chat/audio.ts","webpack://tweb/./src/components/chat/pinnedMessage.ts","webpack://tweb/./src/helpers/dom/handleScrollSideEvent.ts","webpack://tweb/./src/components/chat/topbar.ts","webpack://tweb/./src/components/sidebarRight/tabs/search.ts","webpack://tweb/./src/components/chat/search.ts","webpack://tweb/./src/components/chat/patternRenderer.ts","webpack://tweb/./src/components/chat/chat.ts","webpack://tweb/./src/helpers/autoDownload.ts","webpack://tweb/./src/components/chat/markupTooltip.ts","webpack://tweb/./src/components/chat/dragAndDrop.ts","webpack://tweb/./src/helpers/dom/disableTransition.ts","webpack://tweb/./src/components/lineBlobDrawable.ts","webpack://tweb/./src/components/topbarWeave.ts","webpack://tweb/./src/lib/rlottie/rlottieIcon.ts","webpack://tweb/./src/components/superIcon.ts","webpack://tweb/./src/components/groupCall/microphoneIcon.ts","webpack://tweb/./src/components/groupCall/participantMutedIcon.ts","webpack://tweb/./src/components/groupCall/index.ts","webpack://tweb/./src/components/groupCall/participantStatus.ts","webpack://tweb/./src/components/groupCall/participantsList.ts","webpack://tweb/./src/components/call/videoCanvasBlur.ts","webpack://tweb/./src/components/groupCall/participantVideo.ts","webpack://tweb/./src/components/groupCall/participantVideos.ts","webpack://tweb/./src/components/groupCall/participants.ts","webpack://tweb/./src/components/groupCall/description.ts","webpack://tweb/./src/components/groupCall/title.ts","webpack://tweb/./src/components/call/button.ts","webpack://tweb/./src/components/movableElement.ts","webpack://tweb/./src/helpers/movablePanel.ts","webpack://tweb/./src/helpers/toggleClassName.ts","webpack://tweb/./src/components/call/description.ts","webpack://tweb/./src/components/groupCall/microphoneIconMini.ts","webpack://tweb/./src/components/call/index.ts","webpack://tweb/./src/components/topbarCall.ts","webpack://tweb/./src/lib/appManagers/uiNotificationsManager.ts","webpack://tweb/./src/helpers/files/getFilesFromEvent.ts","webpack://tweb/./src/helpers/addAnchorListener.ts","webpack://tweb/./src/lib/appManagers/appImManager.ts","webpack://tweb/./src/lib/appManagers/utils/messages/canSaveMessageMedia.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMediaFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageSenderPeerIdOrName.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMessageRestricted.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerColorById.ts","webpack://tweb/./src/lib/appManagers/utils/photos/choosePhotoSize.ts","webpack://tweb/./src/lib/calls/callConnectionInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/createPeerConnection.ts","webpack://tweb/./src/lib/calls/helpers/createDataChannel.ts","webpack://tweb/./src/lib/calls/helpers/parseSignalingData.ts","webpack://tweb/./src/lib/calls/callConnectionInstance.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/calls/p2P/p2PEncryptor.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/calls/p2P/chromeP2PSdpBuilder.ts","webpack://tweb/./src/lib/calls/p2P/p2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/firefoxP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/safariP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/callInstance.ts","webpack://tweb/./src/lib/calls/p2P/getCallProtocol.ts","webpack://tweb/./src/lib/calls/p2P/getRtcConfiguration.ts","webpack://tweb/./src/lib/calls/helpers/getStreamCached.ts","webpack://tweb/./src/lib/calls/callInstanceBase.ts","webpack://tweb/./src/lib/calls/callState.ts","webpack://tweb/./src/components/call/getAudioAsset.ts","webpack://tweb/./src/lib/calls/callsController.ts","webpack://tweb/./src/lib/calls/constants.ts","webpack://tweb/./src/lib/calls/groupCallConnectionInstance.ts","webpack://tweb/./src/lib/calls/helpers/processMediaSection.ts","webpack://tweb/./src/lib/calls/helpers/filterServerCodecs.ts","webpack://tweb/./src/lib/calls/helpers/fixLocalOffer.ts","webpack://tweb/./src/lib/calls/groupCallInstance.ts","webpack://tweb/./src/lib/calls/groupCallState.ts","webpack://tweb/./src/components/groupCall/getAudioAsset.ts","webpack://tweb/./src/lib/calls/groupCallsController.ts","webpack://tweb/./src/lib/calls/helpers/createMainStreamManager.ts","webpack://tweb/./src/lib/calls/helpers/getAudioConstraints.ts","webpack://tweb/./src/environment/constraintSupport.ts","webpack://tweb/./src/lib/calls/helpers/getScreenConstraints.ts","webpack://tweb/./src/lib/calls/helpers/getScreenStream.ts","webpack://tweb/./src/lib/calls/helpers/getStream.ts","webpack://tweb/./src/lib/calls/helpers/getVideoConstraints.ts","webpack://tweb/./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack://tweb/./src/lib/calls/helpers/parseSourceGroups.ts","webpack://tweb/./src/lib/calls/helpers/stopTrack.ts","webpack://tweb/./src/lib/calls/localConferenceDescription.ts","webpack://tweb/./src/lib/calls/sdp/index.ts","webpack://tweb/./src/helpers/string/splitStringByLimitWithRest.ts","webpack://tweb/./src/helpers/uniqueNumberGenerator.ts","webpack://tweb/./src/lib/calls/sdp/attributeSplitted.ts","webpack://tweb/./src/lib/calls/sdp/mediaLineParts.ts","webpack://tweb/./src/lib/calls/sdp/line.ts","webpack://tweb/./src/lib/calls/sdp/attributeInner.ts","webpack://tweb/./src/lib/calls/sdp/attributes.ts","webpack://tweb/./src/lib/calls/sdp/mediaSection.ts","webpack://tweb/./src/lib/calls/sdp/sessionSection.ts","webpack://tweb/./src/lib/calls/sdp/utils.ts","webpack://tweb/./src/lib/calls/sdpBuilder.ts","webpack://tweb/./src/lib/calls/streamManager.ts","webpack://tweb/./src/lib/calls/stringFromLineBuilder.ts","webpack://tweb/./src/lib/calls/utils.ts","webpack://tweb/./src/lib/richTextProcessor/getAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiEntityFromEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchEmail.ts","webpack://tweb/./src/lib/richTextProcessor/wrapDraftText.ts","webpack://tweb/./src/lib/richTextProcessor/wrapEmojiText.ts","webpack://tweb/./src/lib/richTextProcessor/setBlankToAnchor.ts","webpack://tweb/./src/environment/emojiVersionsSupport.ts","webpack://tweb/./src/lib/richTextProcessor/wrapRichText.ts","webpack://tweb/./src/helpers/buildURLHash.ts","webpack://tweb/./src/lib/rlottie/queryableWorker.ts","webpack://tweb/./src/environment/webAssemblySupport.ts","webpack://tweb/./src/lib/rlottie/lottieLoader.ts","webpack://tweb/./src/lib/rlottie/rlottiePlayer.ts","webpack://tweb/./src/pages/pagesManager.ts","webpack://tweb/./src/pages/page.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/./public/recorder.min.js","webpack://tweb/./src/vendor/bezier-easing/index.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 {CustomEmojiElement, CustomEmojiRendererElement} from '../lib/richTextProcessor/wrapRichText';\r\nimport rootScope from '../lib/rootScope';\r\nimport {IS_SAFARI} from '../environment/userAgent';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport isInDOM from '../helpers/dom/isInDOM';\r\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\r\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\r\nimport forEachReverse from '../helpers/array/forEachReverse';\r\nimport idleController from '../helpers/idleController';\r\nimport appMediaPlaybackController from './appMediaPlaybackController';\r\nimport {fastRaf} from '../helpers/schedulers';\r\n\r\nexport type AnimationItemGroup = '' | 'none' | 'chat' | 'lock' |\r\n 'STICKERS-POPUP' | 'emoticons-dropdown' | 'STICKERS-SEARCH' | 'GIFS-SEARCH' |\r\n `CHAT-MENU-REACTIONS-${number}` | 'INLINE-HELPER' | 'GENERAL-SETTINGS' | 'STICKER-VIEWER' | 'EMOJI' |\r\n 'EMOJI-STATUS' | `chat-${number}`;\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: AnimationItemGroup,\r\n animation: AnimationItemWrapper,\r\n controlled?: boolean\r\n};\r\n\r\nexport interface AnimationItemWrapper {\r\n remove: () => void;\r\n paused: boolean;\r\n pause: () => any;\r\n play: () => any;\r\n autoplay: boolean;\r\n // onVisibilityChange?: (visible: boolean) => boolean;\r\n};\r\n\r\nexport class AnimationIntersector {\r\n private observer: IntersectionObserver;\r\n private visible: Set;\r\n\r\n private overrideIdleGroups: Set;\r\n private byGroups: {[group in AnimationItemGroup]?: AnimationItem[]};\r\n private byPlayer: Map;\r\n private lockedGroups: {[group in AnimationItemGroup]?: true};\r\n private onlyOnePlayableGroup: AnimationItemGroup;\r\n\r\n private intersectionLockedGroups: {[group in AnimationItemGroup]?: true};\r\n private videosLocked: boolean;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group as AnimationItemGroup]) {\r\n continue;\r\n }\r\n\r\n const animation = this.byGroups[group as AnimationItemGroup].find((p) => p.el === target);\r\n if(!animation) {\r\n continue;\r\n }\r\n\r\n if(entry.isIntersecting) {\r\n this.visible.add(animation);\r\n this.checkAnimation(animation, false);\r\n\r\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\r\n animation.src = animation.dataset.src;\r\n animation.load();\r\n } */\r\n } else {\r\n this.visible.delete(animation);\r\n this.checkAnimation(animation, true);\r\n\r\n const _animation = animation.animation;\r\n if(_animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\r\n // console.warn('will clear cache', player);\r\n _animation.clearCache();\r\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\r\n animation.dataset.src = animation.src;\r\n animation.src = '';\r\n animation.load();\r\n } */\r\n }\r\n\r\n break;\r\n }\r\n }\r\n });\r\n\r\n this.visible = new Set();\r\n\r\n this.overrideIdleGroups = new Set();\r\n this.byGroups = {};\r\n this.byPlayer = new Map();\r\n this.lockedGroups = {};\r\n this.onlyOnePlayableGroup = '';\r\n\r\n this.intersectionLockedGroups = {};\r\n this.videosLocked = false;\r\n\r\n appMediaPlaybackController.addEventListener('play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations2();\r\n }\r\n });\r\n\r\n appMediaPlaybackController.addEventListener('pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations2();\r\n }\r\n });\r\n\r\n idleController.addEventListener('change', (idle) => {\r\n this.checkAnimations2(idle);\r\n });\r\n }\r\n\r\n public setOverrideIdleGroup(group: string, override: boolean) {\r\n if(override) this.overrideIdleGroups.add(group);\r\n else this.overrideIdleGroups.delete(group);\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group as AnimationItemGroup]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n const {el, animation} = player;\r\n // if(!(animation instanceof CustomEmojiElement)) {\r\n animation.remove();\r\n // }\r\n\r\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n const group = this.byGroups[player.group];\r\n if(group) {\r\n indexOfAndSplice(group, player);\r\n if(!group.length) {\r\n delete this.byGroups[player.group];\r\n }\r\n }\r\n\r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n this.byPlayer.delete(animation);\r\n }\r\n\r\n public removeAnimationByPlayer(player: AnimationItemWrapper) {\r\n const item = this.byPlayer.get(player);\r\n if(item) {\r\n this.removeAnimation(item);\r\n }\r\n }\r\n\r\n public addAnimation(\r\n animation: AnimationItem['animation'],\r\n group: AnimationItemGroup = '',\r\n observeElement?: HTMLElement,\r\n controlled?: boolean\r\n ) {\r\n if(group === 'none' || this.byPlayer.has(animation)) {\r\n return;\r\n }\r\n\r\n if(!observeElement) {\r\n if(animation instanceof RLottiePlayer) {\r\n observeElement = animation.el[0];\r\n } else if(animation instanceof CustomEmojiRendererElement) {\r\n observeElement = animation.canvas;\r\n } else if(animation instanceof CustomEmojiElement) {\r\n observeElement = animation.placeholder ?? animation;\r\n } else if(animation instanceof HTMLElement) {\r\n observeElement = animation;\r\n }\r\n }\r\n\r\n const item: AnimationItem = {\r\n el: observeElement,\r\n animation: animation,\r\n group,\r\n controlled\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group as AnimationItemGroup] ??= []).push(item);\r\n this.observer.observe(item.el);\r\n this.byPlayer.set(animation, item);\r\n }\r\n\r\n public checkAnimations(\r\n blurred?: boolean,\r\n group?: AnimationItemGroup,\r\n destroy?: boolean,\r\n imitateIntersection?: boolean\r\n ) {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n if(group !== undefined && !this.byGroups[group]) {\r\n // console.warn('no animation group:', group);\r\n return;\r\n }\r\n\r\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups) as AnimationItemGroup[];\r\n\r\n for(const group of groups) {\r\n if(imitateIntersection && this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const animations = this.byGroups[group];\r\n\r\n forEachReverse(animations, (animation) => {\r\n this.checkAnimation(animation, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimations2(blurred?: boolean) {\r\n this.checkAnimations(blurred, undefined, undefined, true);\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred?: boolean, destroy?: boolean) {\r\n const {el, animation, group} = player;\r\n // return;\r\n if(destroy || (!this.lockedGroups[group] && !isInDOM(el))) {\r\n if(!player.controlled || destroy) {\r\n this.removeAnimation(player);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(blurred ||\r\n (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) ||\r\n (animation instanceof HTMLVideoElement && this.videosLocked)\r\n ) {\r\n if(!animation.paused) {\r\n // console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused &&\r\n this.visible.has(player) &&\r\n animation.autoplay &&\r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\r\n (!idleController.isIdle || this.overrideIdleGroups.has(player.group))\r\n ) {\r\n // console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public getOnlyOnePlayableGroup() {\r\n return this.onlyOnePlayableGroup;\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: AnimationItemGroup = '') {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: AnimationItemGroup) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: AnimationItemGroup) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: AnimationItemGroup) {\r\n const animations = this.byGroups[group];\r\n if(!animations?.length) {\r\n return;\r\n }\r\n\r\n animations.forEach((animation) => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n fastRaf(() => {\r\n animations.forEach((animation) => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n\r\n public lockIntersectionGroup(group: AnimationItemGroup) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: AnimationItemGroup) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n\r\n public toggleIntersectionGroup(group: AnimationItemGroup, lock: boolean) {\r\n if(lock) this.lockIntersectionGroup(group);\r\n else this.unlockIntersectionGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.animationIntersector = animationIntersector);\r\nexport default animationIntersector;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../lib/rootScope';\r\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\r\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport {IS_APPLE, IS_SAFARI} from '../environment/userAgent';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport simulateEvent from '../helpers/dom/dispatchEvent';\r\nimport type {SearchSuperContext} from './appSearchSuper.';\r\nimport {Document, DocumentAttribute, Message, PhotoSize} from '../layer';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport I18n from '../lib/langPack';\r\nimport SearchListLoader from '../helpers/searchListLoader';\r\nimport copy from '../helpers/object/copy';\r\nimport deepEqual from '../helpers/object/deepEqual';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\r\nimport getPeerTitle from './wrappers/getPeerTitle';\r\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\r\nimport onMediaLoad from '../helpers/onMediaLoad';\r\nimport EventListenerBase from '../helpers/eventListenerBase';\r\n\r\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\r\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\r\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\r\n\r\nexport type MediaItem = {mid: number, peerId: PeerId};\r\n\r\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\r\n\r\nconst SHOULD_USE_SAFARI_FIX = (() => {\r\n try {\r\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\r\n } catch(err) {\r\n return false;\r\n }\r\n})();\r\n\r\nconst SEEK_OFFSET = 10;\r\n\r\nexport type MediaSearchContext = SearchSuperContext & Partial<{\r\n isScheduled: boolean,\r\n useSearch: boolean\r\n}>;\r\n\r\ntype MediaDetails = {\r\n peerId: PeerId,\r\n mid: number,\r\n docId: DocId,\r\n doc: MyDocument,\r\n message: Message.message,\r\n clean?: boolean,\r\n isScheduled?: boolean,\r\n isSingle?: boolean\r\n};\r\n\r\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\r\n\r\nexport class AppMediaPlaybackController extends EventListenerBase<{\r\n play: (details: ReturnType) => void,\r\n pause: () => void,\r\n playbackParams: (params: ReturnType) => void,\r\n stop: () => void,\r\n}> {\r\n private container: HTMLElement;\r\n private media: Map> = new Map();\r\n private scheduled: AppMediaPlaybackController['media'] = new Map();\r\n private mediaDetails: Map = new Map();\r\n private playingMedia: HTMLMediaElement;\r\n private playingMediaType: PlaybackMediaType;\r\n\r\n private waitingMediaForLoad: Map>> = new Map();\r\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\r\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\r\n\r\n public willBePlayedMedia: HTMLMediaElement;\r\n private searchContext: MediaSearchContext;\r\n\r\n private listLoader: SearchListLoader;\r\n\r\n public volume: number;\r\n public muted: boolean;\r\n public playbackRate: number;\r\n public loop: boolean;\r\n public round: boolean;\r\n private _volume: number;\r\n private _muted: boolean;\r\n private _playbackRate: number;\r\n private _loop: boolean;\r\n private _round: boolean;\r\n private lockedSwitchers: boolean;\r\n private playbackRates: Record = {\r\n voice: 1,\r\n video: 1,\r\n audio: 1\r\n };\r\n\r\n private pip: HTMLVideoElement;\r\n private managers: AppManagers;\r\n private skipMediaPlayEvent: boolean;\r\n\r\n construct(managers: AppManagers) {\r\n this.managers = managers;\r\n this.container = document.createElement('div');\r\n // this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\r\n this.container.style.cssText = 'display: none;';\r\n document.body.append(this.container);\r\n\r\n if(navigator.mediaSession) {\r\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\r\n play: this.browserPlay,\r\n pause: this.browserPause,\r\n stop: this.browserStop,\r\n seekbackward: this.browserSeekBackward,\r\n seekforward: this.browserSeekForward,\r\n seekto: this.browserSeekTo,\r\n previoustrack: this.browserPrevious,\r\n nexttrack: this.browserNext\r\n };\r\n\r\n for(const action in actions) {\r\n try {\r\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\r\n } catch(err) {\r\n console.warn('MediaSession action is not supported:', action);\r\n }\r\n }\r\n }\r\n\r\n rootScope.addEventListener('document_downloaded', (docId) => {\r\n const set = this.waitingDocumentsForLoad[docId];\r\n if(set) {\r\n for(const media of set) {\r\n this.onMediaDocumentLoad(media);\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_play', () => {\r\n if(this.skipMediaPlayEvent) {\r\n this.skipMediaPlayEvent = false;\r\n return;\r\n }\r\n\r\n if(!this.pause() && this.pip) {\r\n this.pip.pause();\r\n }\r\n });\r\n\r\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\r\n const keys = [\r\n 'volume' as const,\r\n 'muted' as const,\r\n 'playbackRate' as const,\r\n 'loop' as const,\r\n 'round' as const\r\n ];\r\n keys.forEach((key) => {\r\n const _key = ('_' + key) as `_${typeof key}`;\r\n properties[key] = {\r\n get: () => this[_key],\r\n set: (value: number | boolean) => {\r\n if(this[_key] === value) {\r\n return;\r\n }\r\n\r\n // @ts-ignore\r\n this[_key] = value;\r\n if(this.playingMedia && (key !== 'loop' || this.playingMediaType === 'audio') && key !== 'round') {\r\n // @ts-ignore\r\n this.playingMedia[key] = value;\r\n }\r\n\r\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\r\n this.playbackRates[this.playingMediaType] = value as number;\r\n }\r\n\r\n this.dispatchPlaybackParams();\r\n }\r\n };\r\n });\r\n Object.defineProperties(this, properties);\r\n }\r\n\r\n private dispatchPlaybackParams() {\r\n this.dispatchEvent('playbackParams', this.getPlaybackParams());\r\n }\r\n\r\n public getPlaybackParams() {\r\n const {volume, muted, playbackRate, playbackRates, loop, round} = this;\r\n return {\r\n volume,\r\n muted,\r\n playbackRate,\r\n playbackRates,\r\n loop,\r\n round\r\n };\r\n }\r\n\r\n public setPlaybackParams(params: ReturnType) {\r\n this.playbackRates = params.playbackRates;\r\n this._volume = params.volume;\r\n this._muted = params.muted;\r\n this._playbackRate = params.playbackRate;\r\n this._loop = params.loop;\r\n this._round = params.round;\r\n }\r\n\r\n public seekBackward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekForward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekTo = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = details.seekTime;\r\n }\r\n };\r\n\r\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\r\n const {peerId, mid} = message;\r\n\r\n const isScheduled = !!message.pFlags.is_scheduled;\r\n const s = isScheduled ? this.scheduled : this.media;\r\n let storage = s.get(message.peerId);\r\n if(!storage) {\r\n s.set(message.peerId, storage = new Map());\r\n }\r\n\r\n let media = storage.get(mid);\r\n if(media) {\r\n return media;\r\n }\r\n\r\n const doc = getMediaFromMessage(message) as Document.document;\r\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\r\n // const source = document.createElement('source');\r\n // source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\r\n\r\n if(doc.type === 'round') {\r\n media.setAttribute('playsinline', 'true');\r\n // media.muted = true;\r\n }\r\n\r\n const details: MediaDetails = {\r\n peerId,\r\n mid,\r\n docId: doc.id,\r\n doc,\r\n message,\r\n clean,\r\n isScheduled: message.pFlags.is_scheduled\r\n };\r\n\r\n this.mediaDetails.set(media, details);\r\n\r\n // media.autoplay = true;\r\n media.volume = 1;\r\n // media.append(source);\r\n\r\n this.container.append(media);\r\n\r\n media.addEventListener('play', this.onPlay);\r\n media.addEventListener('pause', this.onPause);\r\n media.addEventListener('ended', this.onEnded);\r\n\r\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\r\n media.addEventListener('timeupdate', () => {\r\n this.managers.appMessagesManager.readMessages(peerId, [mid]);\r\n }, {once: true});\r\n }\r\n\r\n /* const onError = (e: Event) => {\r\n //console.log('appMediaPlaybackController: video onError', e);\r\n\r\n if(this.nextMid === mid) {\r\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\r\n if(this.nextMid && storage[this.nextMid]) {\r\n storage[this.nextMid].play();\r\n }\r\n });\r\n }\r\n };\r\n\r\n media.addEventListener('error', onError); */\r\n\r\n const deferred = deferredPromise();\r\n if(autoload) {\r\n deferred.resolve();\r\n } else {\r\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n let waitingStorage = w.get(peerId);\r\n if(!waitingStorage) {\r\n w.set(peerId, waitingStorage = new Map());\r\n }\r\n\r\n waitingStorage.set(mid, deferred);\r\n }\r\n\r\n deferred.then(async() => {\r\n // media.autoplay = true;\r\n // console.log('will set media url:', media, doc, doc.type, doc.url);\r\n\r\n if(doc.supportsStreaming || (await this.managers.thumbsStorage.getCacheContext(doc)).url) {\r\n this.onMediaDocumentLoad(media);\r\n } else {\r\n let set = this.waitingDocumentsForLoad[doc.id];\r\n if(!set) {\r\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\r\n }\r\n\r\n set.add(media);\r\n appDownloadManager.downloadMediaURL({media: doc});\r\n }\r\n }/* , onError */);\r\n\r\n return media;\r\n }\r\n\r\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\r\n return s?.get(mid);\r\n }\r\n\r\n private onMediaDocumentLoad = async(media: HTMLMediaElement) => {\r\n const details = this.mediaDetails.get(media);\r\n const doc = await this.managers.appDocsManager.getDoc(details.docId);\r\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\r\n this.handleSafariStreamable(media);\r\n }\r\n\r\n // setTimeout(() => {\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\r\n media.src = cacheContext.url;\r\n\r\n if(this.playingMedia === media) {\r\n media.playbackRate = this.playbackRate;\r\n\r\n if(doc.type === 'audio') {\r\n media.loop = this.loop;\r\n }\r\n }\r\n // }, doc.supportsStreaming ? 500e3 : 0);\r\n\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n set.delete(media);\r\n\r\n if(!set.size) {\r\n delete this.waitingDocumentsForLoad[doc.id];\r\n }\r\n }\r\n };\r\n\r\n // safari подгрузит последний чанк и песня включится,\r\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\r\n private handleSafariStreamable(media: HTMLMediaElement) {\r\n media.addEventListener('play', () => {\r\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\r\n return;\r\n } */\r\n\r\n // media.volume = 0;\r\n const currentTime = media.currentTime;\r\n // this.setSafariBuffering(media, true);\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = media.duration - 1;\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = currentTime;\r\n // media.volume = 1;\r\n // this.setSafariBuffering(media, false);\r\n\r\n if(!media.paused) {\r\n media.play()/* .catch(() => {}) */;\r\n }\r\n }, {once: true});\r\n }, {once: true});\r\n }/* , {once: true} */);\r\n }\r\n\r\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n const storage = w.get(peerId);\r\n if(!storage) {\r\n return;\r\n }\r\n\r\n const promise = storage.get(mid);\r\n if(promise) {\r\n promise.resolve();\r\n storage.delete(mid);\r\n\r\n if(!storage.size) {\r\n w.delete(peerId);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Only for audio\r\n */\r\n public isSafariBuffering(media: HTMLMediaElement) {\r\n // @ts-ignore\r\n return !!media.safariBuffering;\r\n }\r\n\r\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\r\n // @ts-ignore\r\n media.safariBuffering = value;\r\n }\r\n\r\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\r\n if(document.pictureInPictureElement) {\r\n return;\r\n }\r\n\r\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\r\n\r\n const doc = getMediaFromMessage(message) as MyDocument;\r\n\r\n const artwork: MediaImage[] = [];\r\n\r\n const isVoice = doc.type === 'voice' || doc.type === 'round';\r\n let title = '', artist = '';\r\n\r\n if(doc.thumbs?.length) {\r\n const size = doc.thumbs[doc.thumbs.length - 1];\r\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\r\n\r\n if(cacheContext.url) {\r\n artwork.push({\r\n src: cacheContext.url,\r\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n const download = appDownloadManager.downloadMediaURL({media: doc, thumb: size});\r\n download.then(() => {\r\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\r\n return;\r\n }\r\n\r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n } else if(isVoice) {\r\n const peerId = message.fromId || message.peerId;\r\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\r\n if(peerPhoto) {\r\n // const result = this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\r\n // if(result.cached) {\r\n // const url = await result.loadPromise;\r\n // artwork.push({\r\n // src: url,\r\n // sizes: '160x160',\r\n // type: 'image/jpeg'\r\n // });\r\n // } else {\r\n // result.loadPromise.then((url) => {\r\n // if(this.playingMedia !== playingMedia || !url) {\r\n // return;\r\n // }\r\n\r\n // this.setNewMediadata(message);\r\n // });\r\n // }\r\n }\r\n\r\n title = await getPeerTitle(peerId, true, false);\r\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\r\n }\r\n\r\n if(!isVoice) {\r\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\r\n title = attribute?.title ?? doc.file_name;\r\n artist = attribute?.performer;\r\n }\r\n\r\n if(!artwork.length) {\r\n if(IS_APPLE) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon-precomposed.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n } else {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n }\r\n } else {\r\n [72, 96, 144, 192, 256, 384, 512].forEach((size) => {\r\n const sizes = `${size}x${size}`;\r\n artwork.push({\r\n src: `assets/img/android-chrome-${sizes}.png`,\r\n sizes,\r\n type: 'image/png'\r\n });\r\n });\r\n }\r\n }\r\n\r\n const metadata = new MediaMetadata({\r\n title,\r\n artist,\r\n artwork\r\n });\r\n\r\n navigator.mediaSession.metadata = metadata;\r\n }\r\n\r\n public setCurrentMediadata() {\r\n const {playingMedia} = this;\r\n if(!playingMedia) return;\r\n const message = this.getMessageByMedia(playingMedia);\r\n this.setNewMediadata(message, playingMedia);\r\n }\r\n\r\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\r\n const details = this.mediaDetails.get(media);\r\n return details.message;\r\n // const {peerId, mid} = details;\r\n // const message = details.isScheduled ?\r\n // this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) :\r\n // this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\r\n // return message;\r\n }\r\n\r\n public getPlayingDetails() {\r\n const {playingMedia} = this;\r\n if(!playingMedia) {\r\n return;\r\n }\r\n\r\n const message = this.getMessageByMedia(playingMedia);\r\n return {\r\n doc: getMediaFromMessage(message) as MyDocument,\r\n message,\r\n media: playingMedia,\r\n playbackParams: this.getPlaybackParams()\r\n };\r\n }\r\n\r\n private onPlay = (e?: Event) => {\r\n const media = e.target as HTMLMediaElement;\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n\r\n // console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\r\n\r\n const pip = this.pip;\r\n if(pip) {\r\n pip.pause();\r\n }\r\n\r\n const message = this.getMessageByMedia(media);\r\n\r\n const previousMedia = this.playingMedia;\r\n if(previousMedia !== media) {\r\n this.stop();\r\n this.setMedia(media, message);\r\n\r\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\r\n const listLoader = this.listLoader;\r\n const current = listLoader.getCurrent();\r\n if(!current || !verify(current)) {\r\n let jumpLength: number;\r\n\r\n for(const withOtherSide of [false, true]) {\r\n const previous = listLoader.getPrevious(withOtherSide);\r\n\r\n let idx = previous.findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = -(previous.length - idx);\r\n } else {\r\n const next = listLoader.getNext(withOtherSide);\r\n idx = next.findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = idx + 1;\r\n }\r\n }\r\n\r\n if(jumpLength !== undefined) {\r\n break;\r\n }\r\n }\r\n\r\n if(jumpLength) {\r\n this.go(jumpLength, false);\r\n } else {\r\n this.setTargets({peerId, mid});\r\n }\r\n }\r\n }\r\n\r\n // audio_pause не успеет сработать без таймаута\r\n setTimeout(() => {\r\n if(this.playingMedia !== media) {\r\n return;\r\n }\r\n\r\n this.dispatchEvent('play', this.getPlayingDetails());\r\n this.pauseMediaInOtherTabs();\r\n }, 0);\r\n };\r\n\r\n private onPause = (e?: Event) => {\r\n /* const target = e.target as HTMLMediaElement;\r\n if(!isInDOM(target)) {\r\n this.container.append(target);\r\n target.play();\r\n return;\r\n } */\r\n\r\n // if(this.pip) {\r\n // this.pip.play();\r\n // }\r\n\r\n this.dispatchEvent('pause');\r\n };\r\n\r\n private onEnded = (e?: Event) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.onPause(e);\r\n\r\n // console.log('on media end');\r\n\r\n const listLoader = this.listLoader;\r\n if(this.lockedSwitchers ||\r\n (!this.round && listLoader.current && !listLoader.next.length) ||\r\n !listLoader.getNext(true).length ||\r\n !this.next()) {\r\n this.stop();\r\n this.dispatchEvent('stop');\r\n }\r\n };\r\n\r\n public pauseMediaInOtherTabs() {\r\n this.skipMediaPlayEvent = true;\r\n rootScope.dispatchEvent('media_play');\r\n }\r\n\r\n // public get pip() {\r\n // return document.pictureInPictureElement as HTMLVideoElement;\r\n // }\r\n\r\n public toggle(play?: boolean, media = this.playingMedia) {\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(play === undefined) {\r\n play = media.paused;\r\n }\r\n\r\n if(media.paused !== play) {\r\n return false;\r\n }\r\n\r\n if(play) {\r\n media.play();\r\n } else {\r\n media.pause();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public play = () => {\r\n return this.toggle(true);\r\n };\r\n\r\n public pause = () => {\r\n return this.toggle(false);\r\n };\r\n\r\n public stop = (media = this.playingMedia) => {\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(!media.paused) {\r\n media.pause();\r\n }\r\n\r\n media.currentTime = 0;\r\n simulateEvent(media, 'ended');\r\n\r\n if(media === this.playingMedia) {\r\n const details = this.mediaDetails.get(media);\r\n if(details?.clean) {\r\n media.src = '';\r\n const peerId = details.peerId;\r\n const s = details.isScheduled ? this.scheduled : this.media;\r\n const storage = s.get(peerId);\r\n if(storage) {\r\n storage.delete(details.mid);\r\n\r\n if(!storage.size) {\r\n s.delete(peerId);\r\n }\r\n }\r\n\r\n media.remove();\r\n\r\n this.mediaDetails.delete(media);\r\n }\r\n\r\n this.playingMedia = undefined;\r\n this.playingMediaType = undefined;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n public playItem = (item: MediaItem) => {\r\n const {peerId, mid} = item;\r\n const isScheduled = this.searchContext.isScheduled;\r\n const media = this.getMedia(peerId, mid, isScheduled);\r\n\r\n /* if(isSafari) {\r\n media.autoplay = true;\r\n } */\r\n\r\n media.play();\r\n\r\n setTimeout(() => {\r\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\r\n }, 0);\r\n };\r\n\r\n public go = (length: number, dispatchJump?: boolean) => {\r\n const listLoader = this.listLoader;\r\n if(this.lockedSwitchers || !listLoader) {\r\n return;\r\n }\r\n\r\n if(this.playingMediaType === 'audio') {\r\n return listLoader.goRound(length, dispatchJump);\r\n } else {\r\n return listLoader.go(length, dispatchJump);\r\n }\r\n };\r\n\r\n private bindBrowserCallback(cb: (video: HTMLVideoElement, details: MediaSessionActionDetails) => void) {\r\n const handler: MediaSessionActionHandler = (details) => {\r\n cb(this.pip, details);\r\n };\r\n\r\n return handler;\r\n }\r\n\r\n public browserPlay = this.bindBrowserCallback((video) => this.toggle(true, video));\r\n public browserPause = this.bindBrowserCallback((video) => this.toggle(false, video));\r\n public browserStop = this.bindBrowserCallback((video) => this.stop(video));\r\n public browserSeekBackward = this.bindBrowserCallback((video, details) => this.seekBackward(details, video));\r\n public browserSeekForward = this.bindBrowserCallback((video, details) => this.seekForward(details, video));\r\n public browserSeekTo = this.bindBrowserCallback((video, details) => this.seekTo(details, video));\r\n public browserNext = this.bindBrowserCallback((video) => video || this.next());\r\n public browserPrevious = this.bindBrowserCallback((video) => video ? this.seekToStart(video) : this.previous());\r\n\r\n public next = () => {\r\n return this.go(1);\r\n };\r\n\r\n public previous = () => {\r\n if(this.seekToStart(this.playingMedia)) {\r\n return;\r\n }\r\n\r\n return this.go(-1);\r\n };\r\n\r\n public seekToStart(media: HTMLMediaElement) {\r\n if(media?.currentTime > 5) {\r\n media.currentTime = 0;\r\n this.toggle(true, media);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public willBePlayed(media: HTMLMediaElement) {\r\n this.willBePlayedMedia = media;\r\n }\r\n\r\n public setSearchContext(context: MediaSearchContext) {\r\n if(deepEqual(this.searchContext, context)) {\r\n return false;\r\n }\r\n\r\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\r\n return true;\r\n }\r\n\r\n public getSearchContext() {\r\n return this.searchContext;\r\n }\r\n\r\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\r\n let listLoader = this.listLoader;\r\n if(!listLoader) {\r\n listLoader = this.listLoader = new SearchListLoader({\r\n loadCount: 10,\r\n loadWhenLeft: 5,\r\n processItem: (message: Message.message) => {\r\n this.addMedia(message, false);\r\n return {peerId: message.peerId, mid: message.mid};\r\n },\r\n onJump: (item, older) => {\r\n this.playItem(item);\r\n },\r\n onEmptied: () => {\r\n this.dispatchEvent('stop');\r\n this.stop();\r\n }\r\n });\r\n } else {\r\n listLoader.reset();\r\n }\r\n\r\n const reverse = this.searchContext.folderId !== undefined ? false : true;\r\n if(prev) {\r\n listLoader.setTargets(prev, next, reverse);\r\n } else {\r\n listLoader.reverse = reverse;\r\n }\r\n\r\n listLoader.setSearchContext(this.searchContext);\r\n listLoader.current = current;\r\n\r\n listLoader.load(true);\r\n listLoader.load(false);\r\n }\r\n\r\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\r\n const doc = getMediaFromMessage(message) as MyDocument;\r\n let mediaType: PlaybackMediaType = 'audio';\r\n if(doc?.type) {\r\n if(doc.type === 'voice' || doc.type === 'round') {\r\n mediaType = 'voice';\r\n } else if(doc.type === 'video') {\r\n mediaType = 'video';\r\n }\r\n }\r\n\r\n return mediaType;\r\n }\r\n\r\n public setMedia(media: HTMLMediaElement, message: Message.message) {\r\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\r\n\r\n this._playbackRate = this.playbackRates[mediaType];\r\n\r\n this.playingMedia = media;\r\n this.playingMediaType = mediaType;\r\n this.playingMedia.volume = this.volume;\r\n this.playingMedia.muted = this.muted;\r\n this.playingMedia.playbackRate = this.playbackRate;\r\n\r\n if(mediaType === 'audio') {\r\n this.playingMedia.loop = this.loop;\r\n }\r\n\r\n if('mediaSession' in navigator) {\r\n this.setNewMediadata(message);\r\n }\r\n }\r\n\r\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\r\n const playingMedia = this.playingMedia;\r\n\r\n const wasPlaying = this.pause();\r\n\r\n let onPlay: () => void;\r\n if(media) {\r\n onPlay = () => {\r\n const pip = this.pip;\r\n if(pip) {\r\n pip.pause();\r\n }\r\n\r\n this.pauseMediaInOtherTabs();\r\n };\r\n\r\n if(!media.paused) {\r\n onPlay();\r\n }\r\n\r\n media.addEventListener('play', onPlay);\r\n } else { // maybe it's voice recording\r\n this.pauseMediaInOtherTabs();\r\n }\r\n\r\n this.willBePlayed(undefined);\r\n if(media) this.setMedia(media, message);\r\n else this.playingMedia = undefined;\r\n this.toggleSwitchers(false);\r\n\r\n return (playPaused = wasPlaying) => {\r\n this.toggleSwitchers(true);\r\n\r\n if(playingMedia) {\r\n if(this.mediaDetails.get(playingMedia)) {\r\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\r\n } else {\r\n this.next() || this.previous();\r\n }\r\n }\r\n\r\n // If it's still not cleaned\r\n if(this.playingMedia === media) {\r\n this.playingMedia = undefined;\r\n this.playingMediaType = undefined;\r\n }\r\n\r\n if(media) {\r\n media.removeEventListener('play', onPlay);\r\n }\r\n\r\n // I don't remember what it was for\r\n // if(media && this.playingMedia === media) {\r\n // this.stop();\r\n // }\r\n\r\n if(playPaused) {\r\n this.play();\r\n }\r\n };\r\n }\r\n\r\n public toggleSwitchers(enabled: boolean) {\r\n this.lockedSwitchers = !enabled;\r\n }\r\n\r\n public setPictureInPicture(video: HTMLVideoElement) {\r\n this.pip = video;\r\n\r\n // let wasPlaying = this.pause();\r\n\r\n const listenerSetter = new ListenerSetter();\r\n listenerSetter.add(video)('leavepictureinpicture', () => {\r\n if(this.pip !== video) {\r\n return;\r\n }\r\n\r\n this.pip = undefined;\r\n // if(wasPlaying) {\r\n // this.play();\r\n // }\r\n\r\n listenerSetter.removeAll();\r\n }, {once: true});\r\n\r\n listenerSetter.add(video)('play', (e) => {\r\n if(this.playingMedia !== video) {\r\n this.pause();\r\n }\r\n\r\n this.pauseMediaInOtherTabs();\r\n // if(this.pause()) {\r\n // listenerSetter.add(video)('pause', () => {\r\n // this.play();\r\n // }, {once: true});\r\n // }\r\n });\r\n }\r\n}\r\n\r\nconst appMediaPlaybackController = new AppMediaPlaybackController();\r\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\r\nexport default appMediaPlaybackController;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport mediaSizes from '../helpers/mediaSizes';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport {Message} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport canSaveMessageMedia from '../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport {MediaSearchContext} from './appMediaPlaybackController';\nimport AppMediaViewerBase, {MEDIA_VIEWER_CLASSNAME} from './appMediaViewerBase';\nimport {ButtonMenuItemOptions} from './buttonMenu';\nimport PopupDeleteMessages from './popups/deleteMessages';\nimport PopupForward from './popups/forward';\nimport Scrollable from './scrollable';\nimport appSidebarRight from './sidebarRight';\nimport AppSharedMediaTab from './sidebarRight/tabs/sharedMedia';\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptions;\n protected btnMenuDownload: ButtonMenuItemOptions;\n protected btnMenuDelete: ButtonMenuItemOptions;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = getMediaFromMessage(item);\n\n if(!media) return;\n\n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption', 'spoilers-container'/* , '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 const a = findUpTag(e.target, 'A');\n const spoiler = findUpClassName(e.target, 'spoiler');\n if(a instanceof HTMLAnchorElement && (!spoiler || this.content.caption.classList.contains('is-spoiler-visible'))) { // close viewer if it's t.me/ redirect\n const onclick = a.getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n this.content.caption.removeEventListener('click', onCaptionClick, {capture: true});\n a.click();\n });\n\n return false;\n }\n };\n\n this.content.caption.addEventListener('click', onCaptionClick, {capture: true});\n }\n\n /* public close(e?: MouseEvent) {\n const good = !this.setMoverAnimationPromise;\n const promise = super.close(e);\n\n if(good) { // clear\n this.currentMessageId = 0;\n this.peerId = 0;\n }\n\n return promise;\n } */\n\n protected getMessageByPeer(peerId: PeerId, mid: number) {\n return this.searchContext.isScheduled ? this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) : this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n // appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = async(e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = await this.getMessageByPeer(peerId, mid);\n this.close(e)\n // .then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(async() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer({\n peerId: message.peerId,\n lastMsgId: mid,\n type: threadId ? 'discussion' : undefined,\n threadId\n });\n });\n }\n };\n\n onDownloadClick = async() => {\n const {peerId, mid} = this.target;\n const message = await this.getMessageByPeer(peerId, mid);\n const media = getMediaFromMessage(message);\n if(!media) return;\n appDownloadManager.downloadToDisc({media, queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId});\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html: Parameters[1] = '';\n if(caption) {\n html = wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n\n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false,\n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = getMediaFromMessage(message);\n\n const noForwards = await this.managers.appPeersManager.noForwards(message.peerId);\n const isServiceMessage = message._ === 'messageService';\n const cantForwardMessage = isServiceMessage || !(await this.managers.appMessagesManager.canForward(message));\n const cantDownloadMessage = (isServiceMessage ? noForwards : cantForwardMessage) || !canSaveMessageMedia(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', cantDownloadMessage);\n\n [this.buttons.download, this.btnMenuDownload.element].forEach((button) => {\n button.classList.toggle('hide', cantDownloadMessage);\n });\n\n const canDeleteMessage = await this.managers.appMessagesManager.canDeleteMessage(message);\n [this.buttons.delete, this.btnMenuDelete.element].forEach((button) => {\n button.classList.toggle('hide', !canDeleteMessage);\n });\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMediaPlaybackController from '../components/appMediaPlaybackController';\nimport {IS_APPLE_MOBILE, IS_MOBILE} from '../environment/userAgent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport ButtonMenu from '../components/buttonMenu';\nimport {ButtonMenuToggleHandler} from '../components/buttonMenuToggle';\nimport ControlsHover from '../helpers/dom/controlsHover';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../helpers/dom/fullScreen';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from '../components/mediaProgressLine';\nimport VolumeSelector from '../components/volumeSelector';\nimport debounce from '../helpers/schedulers/debounce';\nimport overlayCounter from '../helpers/overlayCounter';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport default class VideoPlayer extends ControlsHover {\n private static PLAYBACK_RATES = [0.5, 1, 1.5, 2];\n private static PLAYBACK_RATES_ICONS = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];\n\n protected video: HTMLVideoElement;\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n protected playbackRateButton: HTMLElement;\n protected pipButton: HTMLElement;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n protected onPip?: (pip: boolean) => void;\n protected onPipClose?: () => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle, onPip, onPipClose}: {\n video: HTMLVideoElement,\n play?: boolean,\n streamable?: boolean,\n duration?: number,\n onPlaybackRackMenuToggle?: VideoPlayer['onPlaybackRackMenuToggle'],\n onPip?: VideoPlayer['onPip'],\n onPipClose?: VideoPlayer['onPipClose']\n }) {\n super();\n\n this.video = video;\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.onPlaybackRackMenuToggle = onPlaybackRackMenuToggle;\n this.onPip = onPip;\n this.onPipClose = onPipClose;\n\n this.listenerSetter = new ListenerSetter();\n\n this.setup({\n element: this.wrapper,\n listenerSetter: this.listenerSetter,\n canHideControls: () => {\n return !this.video.paused && (!this.playbackRateButton || !this.playbackRateButton.classList.contains('menu-open'));\n },\n showOnLeaveToClassName: 'media-viewer-caption',\n ignoreClickClassName: 'ckin__controls'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n }\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.textContent = 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 attachClickEvent(button, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n });\n\n if(this.pipButton) {\n attachClickEvent(this.pipButton, () => {\n this.video.requestPictureInPicture();\n }, {listenerSetter: this.listenerSetter});\n\n const onPip = (pip: boolean) => {\n this.wrapper.style.visibility = pip ? 'hidden': '';\n if(this.onPip) {\n this.onPip(pip);\n }\n };\n\n const debounceTime = 20;\n const debouncedPip = debounce(onPip, debounceTime, false, true);\n\n listenerSetter.add(video)('enterpictureinpicture', () => {\n debouncedPip(true);\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n const onPause = () => {\n clearTimeout(timeout);\n if(this.onPipClose) {\n this.onPipClose();\n }\n };\n const listener = listenerSetter.add(video)('pause', onPause, {once: true}) as any as Listener;\n const timeout = setTimeout(() => {\n listenerSetter.remove(listener);\n }, debounceTime);\n }, {once: true});\n });\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n debouncedPip(false);\n });\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(video, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1 || document.pictureInPictureElement === video) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && (code === 'Equal' || code === 'Minus')) {\n const add = code === 'Equal' ? 1 : -1;\n const playbackRate = appMediaPlaybackController.playbackRate;\n const idx = VideoPlayer.PLAYBACK_RATES.indexOf(playbackRate);\n const nextIdx = idx + add;\n if(nextIdx >= 0 && nextIdx < VideoPlayer.PLAYBACK_RATES.length) {\n appMediaPlaybackController.playbackRate = VideoPlayer.PLAYBACK_RATES[nextIdx];\n }\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n attachClickEvent(fullScreenButton, () => {\n this.toggleFullScreen();\n }, {listenerSetter: this.listenerSetter});\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.textContent = toHHMMSS(video.currentTime | 0);\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('play', () => {\n this.hideControls(true);\n });\n }\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(appMediaPlaybackController)('playbackParams', () => {\n this.setPlaybackRateIcon();\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n\n if(video.duration || initDuration) {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration || initDuration));\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration));\n });\n }\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!IS_MOBILE && document.pictureInPictureEnabled ? `` : ''}\n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0] = VideoPlayer.PLAYBACK_RATES.map((rate, idx) => {\n return {\n // icon: VideoPlayer.PLAYBACK_RATES_ICONS[idx],\n regularText: rate + 'x',\n onClick: () => {\n appMediaPlaybackController.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenu(buttons);\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler(\n this.playbackRateButton,\n this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined,\n undefined,\n this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(false);\n } : undefined\n );\n this.playbackRateButton.append(btnMenu);\n\n this.setPlaybackRateIcon();\n }\n\n protected setPlaybackRateIcon() {\n const playbackRateButton = this.playbackRateButton;\n VideoPlayer.PLAYBACK_RATES_ICONS.forEach((className) => {\n className = 'tgico-' + className;\n playbackRateButton.classList.remove(className);\n });\n\n let idx = VideoPlayer.PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);\n if(idx === -1) idx = VideoPlayer.PLAYBACK_RATES.indexOf(1);\n\n playbackRateButton.classList.add('tgico-' + VideoPlayer.PLAYBACK_RATES_ICONS[idx]);\n }\n\n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n\n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n\n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n\n cancelFullScreen();\n }\n }\n\n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public cleanup() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = this.onPip = undefined;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise from '../helpers/cancellablePromise';\nimport mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE_SAFARI, IS_SAFARI} from '../environment/userAgent';\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {logger} from '../lib/logger';\nimport VideoPlayer from '../lib/mediaPlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector from './animationIntersector';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from './appMediaPlaybackController';\nimport AvatarElement from './avatar';\nimport ButtonIcon from './buttonIcon';\nimport {ButtonMenuItemOptions} from './buttonMenu';\nimport ButtonMenuToggle from './buttonMenuToggle';\nimport ProgressivePreloader from './preloader';\nimport SwipeHandler from './swipeHandler';\nimport {formatFullSentTime} from '../helpers/date';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport {Message} from '../layer';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport fillPropertyValue from '../helpers/fillPropertyValue';\nimport generatePathData from '../helpers/generatePathData';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {doubleRaf, fastRaf} from '../helpers/schedulers';\nimport RangeSelector from './rangeSelector';\nimport windowSize from '../helpers/windowSize';\nimport ListLoader from '../helpers/listLoader';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport {isFullScreen} from '../helpers/dom/fullScreen';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport createVideo from '../helpers/dom/createVideo';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../helpers/setAttachmentSize';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport LazyLoadQueueBase from './lazyLoadQueueBase';\nimport overlayCounter from '../helpers/overlayCounter';\nimport {ThumbCache} from '../lib/storages/thumbs';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPeerTitle from './wrappers/peerTitle';\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string,\n ButtonsAdditionType extends string,\n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n\n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n // protected targetContainer: HTMLElement = null;\n // protected loadMore: () => void = null;\n\n protected log: ReturnType;\n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n\n protected ctrlKeyDown: boolean;\n protected releaseSingleMedia: ReturnType;\n protected navigationItem: NavigationItem;\n\n protected managers: AppManagers;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader,\n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.managers = rootScope.managers;\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n\n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n\n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n\n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n\n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n\n authorRight.append(this.author.nameEl, this.author.date);\n\n this.author.container.append(this.author.avatarEl, authorRight);\n\n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n\n topButtons.concat(['download', 'zoom', 'close']).forEach((name) => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n attachClickEvent(this.zoomElements.btnOut, () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n attachClickEvent(this.zoomElements.btnIn, () => this.changeZoom(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: ZOOM_STEP,\n min: ZOOM_MIN_VALUE,\n max: ZOOM_MAX_VALUE,\n withTransition: true\n }, ZOOM_INITIAL_VALUE);\n this.zoomElements.rangeSelector.setListeners();\n this.zoomElements.rangeSelector.setHandlers({\n onScrub: this.setZoomValue,\n onMouseUp: () => this.setZoomValue()\n });\n\n this.zoomElements.container.append(this.zoomElements.btnOut, this.zoomElements.rangeSelector.container, this.zoomElements.btnIn);\n\n this.wholeDiv.append(this.zoomElements.container);\n\n // * content\n this.content.main = document.createElement('div');\n this.content.main.classList.add(MEDIA_VIEWER_CLASSNAME + '-content');\n\n this.content.container = document.createElement('div');\n this.content.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-container');\n\n this.content.media = document.createElement('div');\n this.content.media.classList.add(MEDIA_VIEWER_CLASSNAME + '-media');\n\n this.content.container.append(this.content.media);\n\n this.content.main.append(this.content.container);\n mainDiv.append(this.content.main);\n this.overlaysDiv.append(mainDiv);\n // * overlays end\n\n topbarLeft.append(this.buttons['mobile-close'], this.author.container);\n topbar.append(topbarLeft, buttonsDiv);\n\n this.buttons.prev = document.createElement('div');\n this.buttons.prev.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-left`;\n this.buttons.prev.innerHTML = ``;\n\n this.buttons.next = document.createElement('div');\n this.buttons.next.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-right`;\n this.buttons.next.innerHTML = ``;\n\n this.moversContainer = document.createElement('div');\n this.moversContainer.classList.add(MEDIA_VIEWER_CLASSNAME + '-movers');\n\n this.wholeDiv.append(this.overlaysDiv, this.buttons.prev, this.buttons.next, this.topbar, this.moversContainer);\n\n // * constructing html end\n\n this.listLoader.onLoadedMore = () => {\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n };\n\n this.setNewMover();\n }\n\n protected setListeners() {\n attachClickEvent(this.buttons.download, this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach((el) => {\n attachClickEvent(el, this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n // attachClickEvent(button, (e) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n\n this.listLoader.go(moveLength);\n });\n });\n\n attachClickEvent(this.buttons.zoom, () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n // ! cannot use the function because it'll cancel slide event on touch devices\n // attachClickEvent(this.wholeDiv, this.onClick);\n this.wholeDiv.addEventListener('click', this.onClick);\n\n this.listLoader.onJump = (item, older) => {\n if(older) this.onNextClick(item);\n else this.onPrevClick(item);\n };\n\n if(IS_TOUCH_SUPPORTED) {\n const swipeHandler = new SwipeHandler({\n element: this.wholeDiv,\n onSwipe: (xDiff, yDiff) => {\n if(isFullScreen()) {\n return;\n }\n // console.log(xDiff, yDiff);\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || xDiff > 125) {\n // console.log('will swipe', xDiff);\n\n if(xDiff < 0) {\n this.buttons.prev.click();\n } else {\n this.buttons.next.click();\n }\n\n return true;\n }\n\n const percentsY = Math.abs(yDiff) / windowSize.height;\n if(percentsY > .2 || yDiff > 125) {\n this.close();\n return true;\n }\n\n return false;\n },\n verifyTouchTarget: (evt) => {\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = -1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({onlyMobile: true}, 'bottom-left', buttons);\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n }\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as SearchListLoader).cleanup && (this.listLoader as SearchListLoader).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n if((window as any).appMediaViewer === this) {\n (window as any).appMediaViewer = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n this.removeGlobalListeners();\n\n this.zoomSwipeHandler = undefined;\n\n promise.finally(() => {\n this.wholeDiv.remove();\n this.toggleOverlay(false);\n });\n\n return promise;\n }\n\n protected toggleOverlay(active: boolean) {\n overlayCounter.isOverlayActive = active;\n animationIntersector.checkAnimations2(active);\n }\n\n protected toggleGlobalListeners(active: boolean) {\n if(active) this.setGlobalListeners();\n else this.removeGlobalListeners();\n }\n\n protected removeGlobalListeners() {\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n }\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n }\n\n protected setGlobalListeners() {\n if(this.isZooming()) {\n this.zoomSwipeHandler.setListeners();\n }\n\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n\n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find((s) => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.close();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n // this.log('onKeyDown', e);\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n\n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(overlayCounter.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n // mover.append(this.buttons.prev, this.buttons.next);\n }\n\n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n // let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement, true);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n\n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n\n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map((r) => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n // let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n\n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n let src: string;\n\n // if(target instanceof HTMLVideoElement) {\n const selector = 'video, img, .canvas-thumbnail';\n const queryFrom = target.matches(selector) ? target.parentElement : target;\n const elements = Array.from(queryFrom.querySelectorAll(selector)) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if(target instanceof HTMLImageElement) {\n canvas.width = target.naturalWidth;\n canvas.height = target.naturalHeight;\n } else if(target instanceof HTMLVideoElement) {\n canvas.width = target.videoWidth;\n canvas.height = target.videoHeight;\n } else if(target instanceof HTMLCanvasElement) {\n canvas.width = target.width;\n canvas.height = target.height;\n }\n\n canvas.className = 'canvas-thumbnail thumbnail media-photo';\n context.drawImage(target as HTMLImageElement | HTMLCanvasElement, 0, 0);\n target = canvas;\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 } 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 } else if(target instanceof HTMLCanvasElement) {\n mediaElement = target;\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 if((el as HTMLImageElement).src !== url) {\n renderImageFromUrl(el, url);\n }\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n const isPeerId = fromId.isPeerId();\n let wrapTitlePromise: Promise | HTMLElement;\n if(isPeerId) {\n wrapTitlePromise = wrapPeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n })\n } else {\n const title = wrapTitlePromise = document.createElement('span');\n title.append(wrapEmojiText(fromId));\n title.classList.add('peer-title');\n }\n\n const oldAvatar = this.author.avatarEl;\n const newAvatar = this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n return Promise.all([\n (this.author.avatarEl as AvatarElement).updateWithOptions({\n peerId: fromId as PeerId || NULL_PEER_ID,\n peerTitle: isPeerId ? undefined : '' + fromId\n }),\n\n wrapTitlePromise\n ]).then(([_, title]) => {\n if(this.author.avatarEl !== newAvatar) {\n return;\n }\n\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n replaceContent(this.author.nameEl, title);\n oldAvatar.replaceWith(this.author.avatarEl);\n });\n }\n\n protected async _openMedia(\n media: MyDocument | MyPhoto,\n timestamp: number,\n fromId: PeerId | string,\n fromRight: number,\n target?: HTMLElement,\n reverse = false,\n prevTargets: TargetType[] = [],\n nextTargets: TargetType[] = [],\n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n const setAuthorPromise = this.setAuthorInfo(fromId, timestamp);\n\n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n // this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n // this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n if(this.listLoader.next.length < 10) {\n setTimeout(() => {\n this.listLoader.load(true);\n }, 0);\n }\n\n // if(prevTarget && (!prevTarget.parentElement || !this.isElementVisible(this.targetContainer, prevTarget))) prevTarget = null;\n // if(nextTarget && (!nextTarget.parentElement || !this.isElementVisible(this.targetContainer, nextTarget))) nextTarget = null;\n\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n\n const container = this.content.media;\n const useContainerAsTarget = !target || target === container;\n if(useContainerAsTarget) target = container;\n\n this.target = {element: target} as any;\n const tempId = ++this.tempId;\n\n if(container.firstElementChild) {\n container.innerHTML = '';\n }\n\n // ok set\n\n const wasActive = fromRight !== 0;\n if(wasActive) {\n this.moveTheMover(this.content.mover, fromRight === 1);\n this.setNewMover();\n } else {\n this.toggleOverlay(true);\n this.setGlobalListeners();\n await setAuthorPromise;\n\n if(!this.wholeDiv.parentElement) {\n this.pageEl.insertBefore(this.wholeDiv, document.getElementById('main-columns'));\n void this.wholeDiv.offsetLeft; // reflow\n }\n\n this.toggleWholeActive(true);\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n\n this.close();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n // //////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n // const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(media, size.type);\n let img: HTMLImageElement | HTMLCanvasElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n const getCacheContext = () => {\n return this.managers.thumbsStorage.getCacheContext(media, size?.type);\n };\n\n let setMoverPromise: Promise;\n if(isVideo) {\n // //////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ?\n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement :\n */createVideo({pip: useController});\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', cancelEvent);\n }\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 this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n\n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n\n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n } else if(media.duration < 60) {\n video.loop = true;\n }\n\n // if(!video.parentElement) {\n div.append(video);\n // }\n\n const canPlayThrough = new Promise((resolve) => {\n video.addEventListener('canplay', resolve, {once: true});\n });\n\n const createPlayer = () => {\n if(media.type !== 'gif') {\n video.dataset.ckin = 'default';\n video.dataset.overlay = '1';\n\n Promise.all([canPlayThrough, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n // const play = useController ? appMediaPlaybackController.willBePlayedMedia === video : true;\n const play = true;\n const player = this.videoPlayer = new VideoPlayer({\n video,\n play,\n streamable: supportsStreaming,\n onPlaybackRackMenuToggle: (open) => {\n this.wholeDiv.classList.toggle('hide-caption', !!open);\n },\n onPip: (pip) => {\n const otherMediaViewer = (window as any).appMediaViewer;\n if(!pip && otherMediaViewer && otherMediaViewer !== this) {\n this.releaseSingleMedia = undefined;\n this.close();\n return;\n }\n\n const mover = this.moversContainer.lastElementChild as HTMLElement;\n mover.classList.toggle('hiding', pip);\n this.toggleWholeActive(!pip);\n this.toggleOverlay(!pip);\n this.toggleGlobalListeners(!pip);\n\n if(this.navigationItem) {\n if(pip) appNavigationController.removeItem(this.navigationItem);\n else appNavigationController.pushItem(this.navigationItem);\n }\n\n if(useController) {\n if(pip) {\n // appMediaPlaybackController.toggleSwitchers(true);\n\n this.releaseSingleMedia(false);\n this.releaseSingleMedia = undefined;\n\n appMediaPlaybackController.setPictureInPicture(video);\n } else {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n }\n }\n },\n onPipClose: () => {\n // this.target = undefined;\n // this.toggleWholeActive(false);\n // this.toggleOverlay(false);\n this.close();\n }\n });\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.cleanup();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n\n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n // console.log('ppp 1');\n preloader.attach(mover, true);\n }\n\n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n\n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n // console.log('ppp 2');\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 // console.log('ppp 3');\n preloader.attach(mover, true);\n\n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', (e) => {\n cancelEvent(e);\n });\n }\n\n attachCanPlay();\n }\n\n // if(!video.src || media.url !== video.src) {\n const load = async() => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDownloadManager.downloadMediaURL({media});\n\n if(!supportsStreaming) {\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n // console.log('ppp 4');\n preloader.attach(mover, true, promise);\n }\n });\n }\n\n Promise.all([promise, onAnimationEnd]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n const url = (await getCacheContext()).url;\n\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 if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n // if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n // }\n } else {\n renderImageFromUrl(video, url);\n }\n\n // * have to set options (especially playbackRate) after src\n // * https://github.com/videojs/video.js/issues/2516\n if(useController) {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n if(this.releaseSingleMedia) {\n this.releaseSingleMedia();\n this.releaseSingleMedia = undefined;\n }\n }, {once: true});\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n\n return promise;\n };\n\n this.lazyLoadQueue.unshift({load});\n // } else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n // return; // set and don't move\n // if(wasActive) return;\n // return;\n\n const load = async() => {\n const cancellablePromise = isDocument ? appDownloadManager.downloadMediaURL({media}) : appDownloadManager.downloadMediaURL({media, thumb: size});\n\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n this.preloader.attachPromise(cancellablePromise);\n // this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n\n Promise.all([onAnimationEnd, cancellablePromise]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n\n // /////this.log('indochina', blob);\n\n const url = (await getCacheContext()).url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n\n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach((img) => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n const 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 const 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","/*\r\n * https://github.com/morethanwords/tweb\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 'toast' | 'dropdown',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array;\r\n private id: number;\r\n private manual: boolean;\r\n private log: ReturnType;\r\n private debug: boolean;\r\n private currentHash: string; // have to start with # if not empty\r\n private overriddenHash: string; // have to start with # if not empty\r\n private isPossibleSwipe: boolean;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n this.navigations = [];\r\n this.id = Date.now();\r\n this.manual = false;\r\n this.log = logger('NC');\r\n this.debug = true;\r\n this.currentHash = window.location.hash;\r\n this.overriddenHash = '';\r\n this.isPossibleSwipe = false;\r\n\r\n window.addEventListener('popstate', this.onPopState);\r\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', this.onTouchStart, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private onPopState = (e: PopStateEvent) => {\r\n const hash = window.location.hash;\r\n const id: number = e.state;\r\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\r\n if(hash !== this.currentHash) {\r\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\r\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\r\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\r\n this.overrideHash(this.overriddenHash);\r\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\r\n this.overrideHash();\r\n } else {\r\n this.currentHash = hash;\r\n this.onHashChange && this.onHashChange();\r\n // this.replaceState();\r\n return;\r\n }\r\n }\r\n\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n\r\n if(!this.navigations.length) {\r\n return;\r\n }\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !this.isPossibleSwipe;\r\n this.handleItem(item);\r\n // this.pushState(); // * prevent adding forward arrow\r\n };\r\n\r\n private onKeyDown = (e: KeyboardEvent) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n };\r\n\r\n private onTouchStart = (e: TouchEvent) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n this.isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n this.isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n };\r\n\r\n public overrideHash(hash: string = '') {\r\n if(hash && hash[0] !== '#') hash = '#' + hash;\r\n else if(hash === '#') hash = '';\r\n\r\n this.overriddenHash = this.currentHash = hash;\r\n this.replaceState();\r\n this.pushState();\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n // if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n // }\r\n }\r\n\r\n private onItemAdded(item: NavigationItem) {\r\n this.debug && this.log('onItemAdded', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public unshiftItem(item: NavigationItem) {\r\n this.navigations.unshift(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\r\n this.navigations.splice(index, length, ...items);\r\n items.forEach((item) => {\r\n this.onItemAdded(item);\r\n });\r\n }\r\n\r\n private pushState() {\r\n this.debug && this.log('push');\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n this.debug && this.log.warn('replace');\r\n\r\n const url = location.origin + location.pathname + location.search + this.overriddenHash;\r\n history.replaceState(this.id, '', url);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n\r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from '../lib/appManagers/appDialogsManager';\r\nimport Scrollable from './scrollable';\r\nimport InputSearch from './inputSearch';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nexport class SearchGroup {\r\n container: HTMLDivElement;\r\n nameEl: HTMLDivElement;\r\n list: HTMLUListElement;\r\n\r\n constructor(\r\n public name: LangPackKey | boolean,\r\n public type: string,\r\n private clearable = true,\r\n className?: string,\r\n clickable = true,\r\n public autonomous = true,\r\n public onFound?: () => void,\r\n public noIcons?: boolean\r\n ) {\r\n this.list = appDialogsManager.createChatList();\r\n this.container = document.createElement('div');\r\n if(className) this.container.className = className;\r\n\r\n if(name) {\r\n this.nameEl = document.createElement('div');\r\n this.nameEl.classList.add('search-group__name');\r\n if(typeof(name) === 'string') {\r\n this.nameEl.append(i18n(name));\r\n }\r\n this.container.append(this.nameEl);\r\n }\r\n\r\n this.container.classList.add('search-group', 'search-group-' + type);\r\n this.container.append(this.list);\r\n this.container.style.display = 'none';\r\n\r\n if(clickable) {\r\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\r\n }\r\n }\r\n\r\n clear() {\r\n this.container.style.display = 'none';\r\n\r\n if(this.clearable) {\r\n this.list.innerHTML = '';\r\n }\r\n }\r\n\r\n setActive() {\r\n this.container.style.display = '';\r\n }\r\n\r\n toggle() {\r\n if(this.list.childElementCount) {\r\n this.setActive();\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}\r\n\r\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\r\n\r\nexport default class AppSearch {\r\n private minMsgId = 0;\r\n private loadedCount = -1;\r\n private foundCount = -1;\r\n\r\n private searchPromise: Promise = null;\r\n private searchTimeout: number = 0;\r\n\r\n private query = '';\r\n\r\n private listsContainer: HTMLDivElement = null;\r\n\r\n private peerId: PeerId; // 0 - means global\r\n private threadId = 0;\r\n\r\n private scrollable: Scrollable;\r\n\r\n constructor(\r\n public container: HTMLElement,\r\n public searchInput: InputSearch,\r\n public searchGroups: {[group in SearchGroupType]: SearchGroup},\r\n public onSearch?: (count: number) => void,\r\n public noIcons?: boolean\r\n ) {\r\n this.scrollable = new Scrollable(this.container);\r\n this.listsContainer = this.scrollable.container as HTMLDivElement;\r\n for(const 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(const i in this.searchGroups) {\r\n this.searchGroups[i as SearchGroupType].clear();\r\n }\r\n\r\n this.searchPromise = null;\r\n }\r\n\r\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n\r\n if(this.query !== query) {\r\n this.searchInput.inputField.value = query;\r\n }\r\n\r\n this.searchInput.input.focus();\r\n }\r\n\r\n public searchMore() {\r\n if(this.searchPromise) return this.searchPromise;\r\n\r\n const query = this.query;\r\n\r\n if(!query.trim()) {\r\n this.onSearch && this.onSearch(0);\r\n return;\r\n }\r\n\r\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\r\n return Promise.resolve();\r\n }\r\n\r\n const maxId = this.minMsgId || 0;\r\n\r\n return this.searchPromise = rootScope.managers.appMessagesManager.getSearch({\r\n peerId: this.peerId,\r\n query,\r\n inputFilter: {_: 'inputMessagesFilterEmpty'},\r\n maxId,\r\n limit: 20,\r\n threadId: this.threadId\r\n }).then((res) => {\r\n this.searchPromise = null;\r\n\r\n if(this.searchInput.value !== query) {\r\n return;\r\n }\r\n\r\n // console.log('input search result:', this.peerId, query, null, maxId, 20, res);\r\n\r\n const {count, history} = res;\r\n\r\n if(history.length && history[0].mid === this.minMsgId) {\r\n history.shift();\r\n }\r\n\r\n const searchGroup = this.searchGroups.messages;\r\n\r\n history.forEach((message) => {\r\n try {\r\n const peerId = this.peerId ? message.fromId : message.peerId;\r\n appDialogsManager.addDialogAndSetLastMessage({\r\n peerId,\r\n container: this.scrollable/* searchGroup.list */,\r\n avatarSize: 'bigger',\r\n meAsSaved: false,\r\n message,\r\n query,\r\n noIcons: this.noIcons\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport type {MyInputMessagesFilter, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport {SearchGroup, SearchGroupType} from './appSearch';\nimport {horizontalMenu} from './horizontalMenu';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport {putPreloader} from './putPreloader';\nimport ripple from './ripple';\nimport Scrollable, {ScrollableX} from './scrollable';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport I18n, {LangPackKey, i18n} from '../lib/langPack';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {ChannelParticipant, ChatFull, ChatParticipant, ChatParticipants, Document, Message, MessageMedia, Photo, WebPage} from '../layer';\nimport SortedUserList from './sortedUserList';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport appSidebarRight from './sidebarRight';\nimport mediaSizes from '../helpers/mediaSizes';\nimport appImManager from '../lib/appManagers/appImManager';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport cleanSearchText from '../helpers/cleanSearchText';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport handleTabSwipe from '../helpers/dom/handleTabSwipe';\nimport windowSize from '../helpers/windowSize';\nimport {formatPhoneNumber} from '../helpers/formatPhoneNumber';\nimport ButtonMenu, {ButtonMenuItemOptions} from './buttonMenu';\nimport PopupForward from './popups/forward';\nimport PopupDeleteMessages from './popups/deleteMessages';\nimport Row from './row';\nimport htmlToDocumentFragment from '../helpers/dom/htmlToDocumentFragment';\nimport {SearchSelection} from './chat/selection';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport AppMediaViewer from './appMediaViewer';\nimport lockTouchScroll from '../helpers/dom/lockTouchScroll';\nimport copy from '../helpers/object/copy';\nimport getObjectKeysAndSort from '../helpers/object/getObjectKeysAndSort';\nimport safeAssign from '../helpers/object/safeAssign';\nimport escapeRegExp from '../helpers/string/escapeRegExp';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport {ScrollStartCallbackDimensions} from '../helpers/fastSmoothScroll';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapWebPageDescription from './wrappers/webPageDescription';\nimport wrapWebPageTitle from './wrappers/webPageTitle';\nimport getAbbreviation from '../lib/richTextProcessor/getAbbreviation';\nimport matchUrl from '../lib/richTextProcessor/matchUrl';\nimport wrapPlainText from '../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport filterMessagesByInputFilter from '../lib/appManagers/utils/messages/filterMessagesByInputFilter';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport {Awaited} from '../types';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../helpers/contextMenuController';\nimport positionMenu from '../helpers/positionMenu';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport SwipeHandler from './swipeHandler';\nimport wrapDocument from './wrappers/document';\nimport wrapPhoto from './wrappers/photo';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\n\n// const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n private managers: AppManagers;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper,\n private listenerSetter: ListenerSetter\n ) {\n this.managers = searchSuper.managers;\n\n const onContextMenu = (e: MouseEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n await Promise.all(this.buttons.map(async(button) => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? await button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n }));\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n r();\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener(attachTo, onContextMenu as any, listenerSetter);\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: async() => this.managers.appMessagesManager.canForward(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected &&\n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport type ProcessSearchSuperResult = {\n message: Message.message,\n middleware: Middleware,\n promises: Promise[],\n elemsToAppend: {element: HTMLElement, message: any}[],\n inputFilter: MyInputMessagesFilter,\n searchGroup?: SearchGroup\n};\n\nexport default class AppSearchSuper {\n public tabs: {[t in SearchSuperType]: HTMLDivElement} = {} as any;\n\n public mediaTab: SearchSuperMediaTab;\n\n public container: HTMLElement;\n public nav: HTMLElement;\n public navScrollableContainer: HTMLDivElement;\n public tabsContainer: HTMLElement;\n public navScrollable: ScrollableX;\n private tabsMenu: HTMLElement;\n private prevTabId = -1;\n\n private lazyLoadQueue = new LazyLoadQueue();\n public middleware = getMiddleware();\n\n public historyStorage: Partial<{[type in SearchSuperType]: {mid: number, peerId: PeerId}[]}> = {};\n public usedFromHistory: Partial<{[type in SearchSuperType]: number}> = {};\n public urlsToRevoke: string[] = [];\n\n public searchContext: SearchSuperContext;\n public loadMutex: Promise = Promise.resolve();\n\n private nextRates: Partial<{[type in SearchSuperType]: number}> = {};\n private loadPromises: Partial<{[type in SearchSuperType]: Promise}> = {};\n private loaded: Partial<{[type in SearchSuperType]: boolean}> = {};\n private loadedChats = false;\n private firstLoad = true;\n\n private log = logger('SEARCH-SUPER');\n public selectTab: ReturnType;\n\n private monthContainers: Partial<{\n [type in SearchSuperType]: {\n [timestamp: number]: {\n container: HTMLElement,\n items: HTMLElement\n }\n }\n }> = {};\n\n private searchGroupMedia: SearchGroup;\n\n public mediaTabsMap: Map = new Map();\n\n private membersList: SortedUserList;\n\n private skipScroll: boolean;\n\n // * arguments\n public mediaTabs: SearchSuperMediaTab[];\n public scrollable: Scrollable;\n public searchGroups?: {[group in SearchGroupType]: SearchGroup};\n public asChatList? = false;\n public groupByMonth? = true;\n public hideEmptyTabs? = true;\n public onChangeTab?: (mediaTab: SearchSuperMediaTab) => void;\n public showSender? = false;\n\n private searchContextMenu: SearchContextMenu;\n public selection: SearchSelection;\n\n public scrollStartCallback: (dimensions: ScrollStartCallbackDimensions) => void;\n\n public managers: AppManagers;\n private loadFirstTimePromise: Promise;\n\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\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.listenerSetter = new ListenerSetter();\n this.searchContextMenu = new SearchContextMenu(this.container, this, this.listenerSetter);\n this.selection = new SearchSelection(this, this.managers, this.listenerSetter);\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 this.swipeHandler = handleTabSwipe({\n element: this.tabsContainer,\n onSwipe: (xDiff, yDiff, e) => {\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && this.canLoadMediaTab(this.mediaTab)/* && false */) {\n // this.log('onScrolledBottom will load media');\n this.load(true);\n }\n };\n // this.scroll.attachSentinels(undefined, 400);\n\n this.selectTab = horizontalMenu(this.tabsMenu, this.tabsContainer, (id, tabContent, animate) => {\n if(this.prevTabId === id && !this.skipScroll) {\n this.scrollable.scrollIntoViewNew({\n element: this.container,\n position: 'start',\n startCallback: this.scrollStartCallback\n });\n return;\n }\n\n const newMediaTab = this.mediaTabs[id];\n if(this.onChangeTab) {\n this.onChangeTab(newMediaTab);\n }\n\n const fromMediaTab = this.mediaTab;\n this.mediaTab = newMediaTab;\n\n if(this.prevTabId !== -1 && animate) {\n this.onTransitionStart();\n }\n\n if(this.skipScroll) {\n this.skipScroll = false;\n } else {\n const offsetTop = this.container.offsetTop;\n let scrollTop = this.scrollable.scrollTop;\n if(scrollTop < offsetTop) {\n this.scrollable.scrollIntoViewNew({\n element: this.container,\n position: 'start',\n startCallback: this.scrollStartCallback\n });\n scrollTop = offsetTop;\n }\n\n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n\n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n\n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n\n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n // console.log('what you gonna do', this.goingHard, diff);\n\n // this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n // }\n }\n }\n }\n\n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n // this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n\n // console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable, this.listenerSetter);\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, listenerSetter: this.listenerSetter});\n\n const onMediaClick = async(className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n\n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map((el) => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el,\n mid: +containerEl.dataset.mid,\n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n // const ids = Object.keys(this.mediaDivsByIds).map((k) => +k).sort((a, b) => a - b);\n const idx = targets.findIndex((item) => item.mid === mid && item.peerId === peerId);\n\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'), {listenerSetter: this.listenerSetter});\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'), {listenerSetter: this.listenerSetter});\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 }, this.listenerSetter);\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n return filterMessagesByInputFilter(type, messages, messages.length);\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const loadPromises: Promise[] = [];\n const {dom} = appDialogsManager.addDialogNew({\n peerId: message.peerId,\n container: searchGroup.list,\n avatarSize: 'bigger',\n loadPromises\n });\n\n const setLastMessagePromise = appDialogsManager.setLastMessageN({\n dialog: {\n _: 'dialog',\n peerId: message.peerId\n } as any,\n lastMessage: message,\n dom,\n highlightWord: this.searchContext.query\n });\n\n loadPromises.push(setLastMessagePromise);\n return Promise.all(loadPromises).then(noop);\n }\n\n private async processPhotoVideoFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n const media = getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n // this.log(message, photo);\n\n let wrapped: Awaited>;\n const size = choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = await (await wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n photoSize: size\n })).thumb;\n } else {\n wrapped = await wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n [wrapped.images.thumb, wrapped.images.full].filter(Boolean).forEach((image) => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n return {element: div, message};\n }\n\n private async processDocumentFilter({message, inputFilter}: ProcessSearchSuperResult) {\n const document = getMediaFromMessage(message) as Document.document;\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n\n const div = await wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n autoDownloadSize: 0\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n return {message, element: div};\n }\n\n private async processUrlFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n let webpage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage;\n\n if(!webpage) {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n const match = matchUrl(message.message);\n if(!match) {\n return;\n }\n\n url = match[0];\n } else {\n sliced = message.message.slice(entity.offset, entity.offset + entity.length);\n }\n\n if(entity?._ === 'messageEntityTextUrl') {\n url = entity.url;\n // display_url = sliced;\n } else {\n url = url || sliced;\n }\n\n display_url = url;\n\n const same = message.message === url;\n if(!url.match(/^(ftp|http|https):\\/\\//)) {\n display_url = 'https://' + url;\n url = url.includes('@') ? url : 'https://' + url;\n }\n\n display_url = new URL(display_url).hostname;\n\n webpage = {\n _: 'webPage',\n url,\n display_url,\n id: '',\n hash: 0\n };\n\n if(!same) {\n webpage.description = message.message;\n }\n }\n\n const previewDiv = document.createElement('div');\n previewDiv.classList.add('preview');\n\n // this.log('wrapping webpage', webpage);\n\n if(webpage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webpage.photo as Photo.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: choosePhotoSize(webpage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n setInnerHTML(previewDiv, getAbbreviation(webpage.title || webpage.display_url || webpage.description || webpage.url, true));\n }\n\n const title = wrapWebPageTitle(webpage);\n\n const subtitleFragment = wrapWebPageDescription(webpage);\n const aFragment = htmlToDocumentFragment(wrapRichText(webpage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n try { // can have 'URIError: URI malformed'\n a.innerText = decodeURIComponent(a.href);\n } catch(err) {\n\n }\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', await wrapSenderToPeer(message));\n }\n\n if(!title.textContent) {\n // title = new URL(webpage.url).hostname;\n title.append(wrapPlainText(webpage.display_url.split('/', 1)[0]));\n }\n\n const row = new Row({\n title,\n titleRight: wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n row.applyMediaElement(previewDiv, 'big');\n\n if(row.container.innerText.trim().length) {\n return {message, element: row.container};\n }\n }\n\n public async performSearchResult(messages: any[], mediaTab: SearchSuperMediaTab, append = true) {\n const elemsToAppend: {element: HTMLElement, message: any}[] = [];\n const sharedMediaDiv: HTMLElement = mediaTab.contentTab;\n const promises: Promise[] = [];\n const middleware = this.middleware.get();\n let inputFilter = mediaTab.inputFilter;\n\n await getHeavyAnimationPromise();\n\n let searchGroup: SearchGroup;\n if(inputFilter === 'inputMessagesFilterPhotoVideo' && !!this.searchContext.query.trim()) {\n inputFilter = 'inputMessagesFilterEmpty';\n searchGroup = this.searchGroupMedia;\n sharedMediaDiv.append(searchGroup.container);\n } else if(inputFilter === 'inputMessagesFilterEmpty') {\n searchGroup = this.searchGroups.messages;\n }\n\n const options: ProcessSearchSuperResult = {\n elemsToAppend,\n inputFilter,\n message: undefined,\n middleware,\n promises,\n searchGroup\n };\n\n let processCallback: (options: ProcessSearchSuperResult) => any;\n\n // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n processCallback = this.processEmptyFilter;\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n processCallback = this.processPhotoVideoFilter;\n break;\n }\n\n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n processCallback = this.processDocumentFilter;\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n processCallback = this.processUrlFilter;\n break;\n }\n\n default:\n // this.log.warn('death is my friend', messages);\n break;\n }\n\n if(processCallback) {\n processCallback = processCallback.bind(this);\n\n type K = {element: HTMLElement, message: Message.message | Message.messageService};\n const results: (Promise | K)[] = messages.map(async(message) => {\n try {\n options.message = message;\n return await processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n });\n\n const awaited = (await Promise.all(results)).filter(Boolean);\n elemsToAppend.push(...awaited.filter(Boolean));\n }\n\n if(searchGroup && searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n // this.log.warn('peer changed');\n return;\n }\n }\n\n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach((details) => {\n const {element, message} = details;\n if(!message) {\n debugger;\n }\n\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(const i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.map((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n\n renderedPeerIds.add(peerId);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: group.list,\n avatarSize: 'abitbigger',\n autonomous: group.autonomous\n });\n\n return {dom, peerId};\n }).filter(Boolean).forEach(async({dom, peerId}) => {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(showMembersCount && (peer.participants_count || peer.participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(await getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = await this.managers.appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n\n dom.lastMessageSpan.textContent = username;\n }\n });\n\n group.toggle();\n };\n\n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n\n // this.loadedContacts = true;\n\n return arg;\n };\n\n return Promise.all([\n this.managers.appUsersManager.getContactsPeerIds(query, true, undefined, 10)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n\n this.managers.appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild !== this.searchGroups.globalContacts.nameEl.firstElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n\n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n const intlElement = new I18n.IntlElement({\n key: 'Separator.ShowMore'\n });\n showMore.append(intlElement.element);\n this.searchGroups.globalContacts.nameEl.append(showMore);\n attachClickEvent(showMore, () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n intlElement.key = isShort ? 'Separator.ShowMore' : 'Separator.ShowLess';\n intlElement.update();\n });\n }\n }\n }),\n\n this.managers.appMessagesManager.getConversations(query, 0, 20, 0)\n .then(onLoad)\n .then((value) => {\n if(value) {\n setResults(value.dialogs.map((d) => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return apiManagerProxy.getState().then((state) => {\n if(!middleware()) {\n return;\n }\n\n this.searchGroups.recent.list.innerHTML = '';\n\n state.recentSearch.slice(0, 20).forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.searchGroups.recent.list,\n meAsSaved: true,\n avatarSize: 'abitbigger',\n autonomous: true\n });\n\n dom.lastMessageSpan.append(await (peerId.isUser() ?\n getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())) :\n getChatMembersString(peerId.toChatId())));\n });\n\n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n this.managers.appUsersManager.getTopPeers('correspondents').then((peers) => {\n if(!middleware()) return;\n\n const idx = peers.findIndex((peer) => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n // console.log('got top categories:', categories);\n if(peers.length) {\n peers.forEach((peer) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peer.id,\n container: this.searchGroups.people.list,\n onlyFirstName: true,\n avatarSize: 'bigger',\n autonomous: false,\n noIcons: this.searchGroups.people.noIcons\n });\n\n dom.subtitleEl.remove();\n });\n }\n\n this.searchGroups.people.setActive();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private async loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n if(!this.membersList) {\n this.membersList = new SortedUserList({\n lazyLoadQueue: this.lazyLoadQueue,\n rippleEnabled: false,\n managers: this.managers\n });\n attachClickEvent(this.membersList.list, (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n\n promise.then(() => {\n appImManager.setInnerPeer({peerId});\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n for(const participant of participants) {\n const peerId = getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n continue;\n }\n\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n continue;\n }\n\n this.membersList.add(peerId);\n }\n };\n\n if(await this.managers.appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = this.managers.appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then((participants) => {\n if(!middleware()) {\n return;\n }\n\n const list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = this.managers.appProfileManager.getChatFull(id).then((chatFull) => {\n if(!middleware()) {\n return;\n }\n\n // console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = (chatFull as ChatFull.chatFull).participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n\n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ?? (this.historyStorage[type] = []);\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const promise = this.loadPromises[type] = Promise.resolve().then(async() => {\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n const messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n const ids = history.slice(used, used + loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n const notFilteredMessages = await Promise.all(ids.map((m) => this.managers.appMessagesManager.getMessageByPeer(m.peerId, m.mid)));\n\n messages.push(...this.filterMessagesByType(notFilteredMessages, type));\n } while(slicedLength < loadCount && used < history.length);\n\n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n // if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n // }\n }\n\n const maxId = history.length ? history[history.length - 1].mid : 0;\n\n const value = await this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId,\n limit: loadCount,\n nextRate: this.nextRates[type] ??= 0\n });\n\n history.push(...value.history.map((m) => ({mid: m.mid, peerId: m.peerId})));\n\n if(!middleware()) {\n // this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n // if((value.count || history.length === value.count) && history.length >= value.count) {\n // this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return;\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n promise.then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n // this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n // if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n // }\n }).catch((err) => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n\n return promise;\n }\n\n private canLoadMediaTab(mediaTab: SearchSuperMediaTab) {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n }\n\n private async loadFirstTime() {\n const middleware = this.middleware.get();\n const peerId = this.searchContext.peerId;\n if(!this.hideEmptyTabs) {\n return;\n }\n\n const mediaTabs = this.mediaTabs.filter((mediaTab) => mediaTab.inputFilter !== 'inputMessagesFilterEmpty');\n const filters = mediaTabs.map((mediaTab) => ({_: mediaTab.inputFilter}));\n\n const [counters, canViewMembers] = await Promise.all([\n this.managers.appMessagesManager.getSearchCounters(peerId, filters),\n this.canViewMembers()\n ]);\n\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach((mediaTab) => {\n const counter = counters.find((c) => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n // mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count) {\n if(firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n ++count;\n }\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n // firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n public async load(single = false, justLoad = false) {\n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n await (this.loadFirstTimePromise ??= this.loadFirstTime());\n if(!middleware()) {\n return;\n }\n\n this.loadFirstTimePromise = undefined;\n this.firstLoad = false;\n }\n\n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter((t) => t !== this.mediaTab);\n toLoad = toLoad.filter((mediaTab) => {\n return this.canLoadMediaTab(mediaTab);\n });\n\n if(peerId.isUser()) {\n findAndSplice(toLoad, (mediaTab) => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map((mediaTab) => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware);\n });\n\n return Promise.all(promises).catch((err) => {\n this.log.error('Load error all promises:', err);\n });\n }\n\n public getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n\n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n return Promise.all([\n this.searchContext.peerId.isAnyChat(),\n this.managers.appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()),\n this.managers.appChatsManager.hasRights(this.searchContext.peerId.toChatId(), 'view_participants')\n ]).then(([isAnyChat, isBroadcast, hasRights]) => {\n return isAnyChat && !isBroadcast && hasRights;\n });\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n this.prevTabId = -1;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach((mediaTab) => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection?.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.loadFirstTimePromise = undefined;\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach((mediaTab) => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n if(this.urlsToRevoke.length) {\n this.urlsToRevoke.forEach((url) => {\n URL.revokeObjectURL(url);\n });\n this.urlsToRevoke.length = 0;\n }\n\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.innerHTML = '';\n\n if(this.hideEmptyTabs) {\n // tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n\n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n // if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n // }\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId,\n query?: string,\n threadId?: number,\n historyStorage?: AppSearchSuper['historyStorage'],\n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n\n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n\n public destroy() {\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.swipeHandler?.removeListeners();\n this.selection?.cleanup();\n\n this.scrollStartCallback = undefined;\n this.onChangeTab = undefined;\n this.selectTab = undefined;\n this.searchContextMenu = undefined;\n this.swipeHandler = undefined;\n this.selection = 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 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatRights} from '../lib/appManagers/appChatsManager';\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DialogElementSize as DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport Scrollable from './scrollable';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport CheckboxField from './checkboxField';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport PeerTitle from './peerTitle';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport debounce from '../helpers/schedulers/debounce';\nimport windowSize from '../helpers/windowSize';\nimport type {IsPeerType} from '../lib/appManagers/appPeersManager';\nimport {generateDelimiter, SettingSection} from './sidebarLeft';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport filterUnique from '../helpers/array/filterUnique';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport AvatarElement from './avatar';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport filterAsync from '../helpers/array/filterAsync';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport {Chat, User} from '../layer';\nimport canSendToUser from '../lib/appManagers/utils/users/canSendToUser';\nimport hasRights from '../lib/appManagers/utils/chats/hasRights';\nimport getDialogIndex from '../lib/appManagers/utils/dialogs/getDialogIndex';\n\ntype SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants';\n\n// TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени\n\nexport default class AppSelectPeers {\n public container = document.createElement('div');\n public list = appDialogsManager.createChatList(/* {\n handheldsSize: 66,\n avatarSize: 48\n } */);\n private chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n private selectedScrollable: Scrollable;\n\n private selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n\n // public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void | Promise;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize: DialogElementSize = 'abitbigger';\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n\n private needSwitchList = false;\n\n private sectionNameLangPackKey: LangPackKey;\n\n private managers: AppManagers;\n\n private design: 'round' | 'square' = 'round';\n\n constructor(options: {\n appendTo: AppSelectPeers['appendTo'],\n onChange?: AppSelectPeers['onChange'],\n peerType?: AppSelectPeers['peerType'],\n peerId?: AppSelectPeers['peerId'],\n onFirstRender?: () => void,\n renderResultsFunc?: AppSelectPeers['renderResultsFunc'],\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n multiSelect?: AppSelectPeers['multiSelect'],\n rippleEnabled?: AppSelectPeers['rippleEnabled'],\n avatarSize?: AppSelectPeers['avatarSize'],\n placeholder?: AppSelectPeers['placeholder'],\n selfPresence?: AppSelectPeers['selfPresence'],\n exceptSelf?: AppSelectPeers['exceptSelf'],\n filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'],\n sectionNameLangPackKey?: AppSelectPeers['sectionNameLangPackKey'],\n managers: AppSelectPeers['managers'],\n design?: AppSelectPeers['design']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector', 'selector-' + this.design);\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = async(peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n\n peerIds = peerIds.filter((peerId) => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = await filterAsync(peerIds, async(peerId) => {\n if(peerId.isPeerId()) {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(!peer.deleted) {\n for(const method of this.filterPeerTypeBy) {\n if(await this.managers.appPeersManager[method](peerId)) {\n return true;\n }\n }\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n const section = new SettingSection({});\n section.innerContainer.classList.add('selector-search-section');\n const 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 simulateClickEvent(li);\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 const 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(const i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = null;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n\n // console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private async renderSaved() {\n if(\n !this.exceptSelf &&\n !this.offsetIndex &&\n this.folderId === 0 &&\n this.peerType.includes('dialogs') &&\n (!this.query || await this.managers.appUsersManager.testSelfSearch(this.query))\n ) {\n await this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n if(this.tempIds[type] === undefined) {\n this.tempIds[type] = 0;\n }\n\n return ++this.tempIds[type];\n }\n\n private async getMoreDialogs(): Promise {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n\n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n\n const tempId = this.getTempId('dialogs');\n const promise = this.managers.appMessagesManager.getConversations(this.query, this.offsetIndex, pageCount, this.folderId, true);\n this.promise = promise;\n const value = await promise;\n if(this.tempIds.dialogs !== tempId) {\n return;\n }\n\n this.promise = null;\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = getDialogIndex(dialogs[dialogs.length - 1]) || 0;\n\n dialogs = dialogs.slice();\n findAndSplice(dialogs, d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = await filterAsync(dialogs, (d) => this.filterByRights(d.peerId));\n }\n\n await this.renderSaved();\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map((dialog) => dialog.peerId));\n\n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n await this.renderSaved();\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private async filterByRights(peerId: PeerId) {\n const peer: User | Chat = await this.managers.appPeersManager.getPeer(peerId);\n if(peerId.isUser()) {\n return this.chatRightsAction !== 'send_messages' || canSendToUser(peer as User.user);\n } else if(hasRights(peer as Chat.chat, this.chatRightsAction)) {\n return true;\n }\n }\n\n private async getMoreContacts() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const tempId = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? this.managers.appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? this.managers.appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n this.promise = promise;\n const [cachedContacts, searchResult] = await promise;\n if(this.tempIds.contacts !== tempId) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = await filterAsync(resultPeerIds, (peerId) => this.filterByRights(peerId));\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter((peerId) => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n this.promise = null;\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n\n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const tempId = this.getTempId('channelParticipants');\n const promise = this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(), {_: 'channelParticipantsSearch', q: this.query}, pageCount, this.list.childElementCount);\n const participants = await promise;\n if(this.tempIds.channelParticipants !== tempId) {\n return;\n }\n\n const peerIds = participants.participants.map((participant) => {\n return getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n const get = () => {\n const promises: Promise[] = [];\n\n // if(!loadedAllDialogs && (this.peerType.includes('dialogs')/* || this.peerType.includes('contacts') */)) {\n // if(!loadAllDialogsPromise) {\n // loadAllDialogsPromise = appMessagesManager.getConversationsAll()\n // .then(() => {\n // loadedAllDialogs = true;\n // }).finally(() => {\n // loadAllDialogsPromise = null;\n // });\n // }\n\n // promises.push(loadAllDialogsPromise);\n // }\n\n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n promises.push(this.getMoreDialogs());\n\n if(!this.loadedWhat.archived) {\n return promises;\n }\n }\n\n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n promises.push(this.getMoreContacts());\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n promises.push(this.getMoreChannelParticipants());\n }\n\n return promises;\n };\n\n const promises = get();\n const promise = Promise.all(promises);\n if(promises.length) {\n promise.then(this.checkForTriggers);\n }\n\n return promise;\n }\n\n private async renderResults(peerIds: PeerId[]) {\n // console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = await filterAsync(peerIds, (peerId) => {\n return this.managers.appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.scrollable,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n // dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = await getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId()));\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n // console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId(), dialog: true}).element;\n }\n\n avatarEl.updateWithOptions({\n peerId: key as PeerId\n });\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n // this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange?.(this.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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport ProgressivePreloader from './preloader';\nimport appMediaPlaybackController, {MediaItem, MediaSearchContext} from './appMediaPlaybackController';\nimport {DocumentAttribute, Message} from '../layer';\nimport mediaSizes from '../helpers/mediaSizes';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport rootScope from '../lib/rootScope';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport noop from '../helpers/noop';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {joinElementsWith} from '../lib/langPack';\nimport {MiddleEllipsisElement} from './middleEllipsis';\nimport {formatFullSentTime} from '../helpers/date';\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport formatBytes from '../helpers/formatBytes';\nimport {animateSingle} from '../helpers/animation';\nimport clamp from '../helpers/number/clamp';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from './mediaProgressLine';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPhoto from './wrappers/photo';\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 if(sumI < (barCount + 1) / 2) {\n if(maxValue < value) maxValue = value;\n }\n\n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n\n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n const container = document.createElement('div');\n container.classList.add('audio-waveform');\n container.append(svg);\n\n svg.insertAdjacentHTML('beforeend', html);\n return {svg, container, availW};\n}\n\nasync function wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n let waveform = (doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio).waveform || new Uint8Array([]);\n waveform = decodeWaveform(waveform.slice(0, 63));\n\n const {svg, container: svgContainer, availW} = createWaveformBars(waveform, doc.duration);\n\n const fakeSvgContainer = svgContainer.cloneNode(true) as HTMLElement;\n fakeSvgContainer.classList.add('audio-waveform-fake');\n svgContainer.classList.add('audio-waveform-background');\n\n const waveformContainer = document.createElement('div');\n waveformContainer.classList.add('audio-waveform-container');\n waveformContainer.append(svgContainer, fakeSvgContainer);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(waveformContainer, timeDiv);\n\n let progress = svg as any as HTMLElement;\n\n const onLoad = () => {\n let audio = audioEl.audio;\n\n const setAnimation = () => {\n animateSingle(() => {\n if(!audio) return false;\n onTimeUpdate();\n return !audio.paused;\n }, audioEl);\n };\n\n const onTimeUpdate = () => {\n fakeSvgContainer.style.width = (audio.currentTime / audio.duration * 100) + '%';\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onTimeUpdate();\n }\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n audioEl.addAudioListener('timeupdate', throttledTimeUpdate);\n audioEl.addAudioListener('ended', throttledTimeUpdate);\n audioEl.addAudioListener('play', setAnimation);\n\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n });\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n\n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n\n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n\n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n\n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nasync function wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n\n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(audioAttribute?.performer) {\n parts.push(wrapEmojiText(audioAttribute.performer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(await wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n middleEllipsisEl.dataset.fontSize = audioEl.dataset.fontSize;\n middleEllipsisEl.dataset.sizeType = audioEl.dataset.sizeType;\n if(isVoice) {\n middleEllipsisEl.append(await wrapSenderToPeer(message));\n } else {\n setInnerHTML(middleEllipsisEl, wrapEmojiText(audioAttribute?.title ?? doc.file_name));\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(wrapSentTime(message));\n }\n\n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement, anchorMid: number/* , useSearch: boolean */) => {\n let prev: MediaItem[], next: MediaItem[];\n // if(anchor.classList.contains('search-super-item') || !useSearch) {\n const isBubbles = !anchor.classList.contains('search-super-item');\n const container = findUpClassName(anchor, !isBubbles ? 'tabs-tab' : 'bubbles-inner');\n if(container) {\n const attr = `:not([data-is-outgoing=\"1\"])`;\n const justAudioSelector = `.audio:not(.is-voice)${attr}`;\n let selectors: string[];\n if(!anchor.matches(justAudioSelector)) {\n selectors = [`.audio.is-voice${attr}`, `.media-round${attr}`];\n } else {\n selectors = [justAudioSelector];\n }\n\n if(isBubbles) {\n const prefix = '.bubble:not(.webpage) ';\n selectors = selectors.map((s) => prefix + s);\n }\n\n const selector = selectors.join(', ');\n\n const elements = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n const idx = elements.indexOf(anchor);\n\n const mediaItems: MediaItem[] = elements.map((element) => ({peerId: element.dataset.peerId.toPeerId(), mid: +element.dataset.mid}));\n\n prev = mediaItems.slice(0, idx);\n next = mediaItems.slice(idx + 1);\n }\n // }\n\n if((next.length && next[0].mid < anchorMid) || (prev.length && prev[prev.length - 1].mid > anchorMid)) {\n [prev, next] = [next.reverse(), prev.reverse()];\n }\n\n // prev = next = undefined;\n\n return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n public managers: AppManagers;\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public async render() {\n this.classList.add('audio');\n this.managers = rootScope.managers;\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc = getMediaFromMessage(this.message) as MyDocument;\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploadingFileName = this.message?.uploadingFileName;\n\n const durationStr = toHHMMSS(doc.duration | 0);\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploadingFileName) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = await (isVoice ? wrapVoiceMessage(this) : wrapAudio(this));\n\n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n\n const getTimeStr = () => toHHMMSS(audio.currentTime | 0) + (isVoice ? (' / ' + durationStr) : '');\n\n const onPlay = () => {\n audioTimeDiv.innerText = getTimeStr();\n toggle.classList.toggle('playing', !audio.paused);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onPlay();\n }\n\n const togglePlay = (e?: Event, paused = audio.paused) => {\n e && cancelEvent(e);\n\n if(paused) {\n const hadSearchContext = !!this.searchContext;\n if(appMediaPlaybackController.setSearchContext(this.searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(this, this.message.mid/* , this.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLElement[] = [];\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: toggle,\n boxWidth: 48,\n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach((img) => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n const autoDownload = doc.type !== 'audio'/* || !this.noAutoDownload */;\n onLoad(autoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n\n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDownloadManager.downloadMediaURL({media: doc});\n\n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n if(this.classList.contains('corner-download')) {\n toggle.append(downloadDiv);\n } else {\n this.append(downloadDiv);\n }\n\n this.classList.add('downloading');\n\n this.readyPromise.then(() => {\n this.classList.remove('downloading');\n downloadDiv.classList.add('downloaded');\n setTimeout(() => {\n downloadDiv.remove();\n }, 200);\n\n // setTimeout(() => {\n // release loaded audio\n if(appMediaPlaybackController.willBePlayedMedia === this.audio) {\n this.audio.play();\n appMediaPlaybackController.willBePlayed(undefined);\n }\n // }, 10e3);\n });\n };\n\n if(!this.audio?.src) {\n if(autoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploadingFileName) {\n this.preloader = constructDownloadPreloader(false);\n this.preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n // onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n setTimeout(() => {\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 if(this.listenerSetter) {\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n }\n\n if(this.preloader) {\n this.preloader = null;\n }\n }, 100);\n }\n}\n\ncustomElements.define('audio-element', AudioElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Photo} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId, managers: AppManagers}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId;\n return this.managers.appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then((value) => {\n const items = value.photos.map((photoId) => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarListLoader from '../helpers/avatarListLoader';\nimport {Photo} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport AppMediaViewerBase from './appMediaViewerBase';\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId, managers: rootScope.managers}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n\n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = async() => {\n appDownloadManager.downloadToDisc({\n media: await this.managers.appPhotosManager.getPhoto(this.target.photoId),\n queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId\n });\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = await this.managers.appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../lib/rootScope';\r\nimport {Message, Photo} from '../layer';\r\nimport type LazyLoadQueue from './lazyLoadQueue';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport AppMediaViewer from './appMediaViewer';\r\nimport AppMediaViewerAvatar from './appMediaViewerAvatar';\r\nimport isObject from '../helpers/object/isObject';\r\nimport {ArgumentTypes} from '../types';\r\nimport putPhoto from './putPhoto';\r\nimport {recordPromise} from '../helpers/recordPromise';\r\n\r\nconst onAvatarUpdate = (peerId: PeerId) => {\r\n (Array.from(document.querySelectorAll('avatar-element[data-peer-id=\"' + peerId + '\"]')) as AvatarElement[]).forEach((elem) => {\r\n // console.log('updating avatar:', elem);\r\n elem.update();\r\n });\r\n};\r\n\r\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\r\nrootScope.addEventListener('peer_title_edit', async(peerId) => {\r\n if(!(await rootScope.managers.appAvatarsManager.isAvatarCached(peerId))) {\r\n onAvatarUpdate(peerId);\r\n }\r\n});\r\n\r\nexport async function openAvatarViewer(\r\n target: HTMLElement,\r\n peerId: PeerId,\r\n middleware: () => boolean,\r\n message?: any,\r\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[],\r\n nextTargets?: typeof prevTargets\r\n) {\r\n let photo = await rootScope.managers.appProfileManager.getFullPhoto(peerId);\r\n if(!middleware() || !photo) {\r\n return;\r\n }\r\n\r\n const getTarget = () => {\r\n const good = Array.from(target.querySelectorAll('img')).find((img) => !img.classList.contains('emoji'));\r\n return good ? target : null;\r\n };\r\n\r\n if(peerId.isAnyChat()) {\r\n const hadMessage = !!message;\r\n const inputFilter = 'inputMessagesFilterChatPhotos';\r\n if(!message) {\r\n message = await rootScope.managers.appMessagesManager.getSearch({\r\n peerId,\r\n inputFilter: {_: inputFilter},\r\n maxId: 0,\r\n limit: 1\r\n }).then((value) => {\r\n // console.log(lol);\r\n // ! by descend\r\n return value.history[0];\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n }\r\n\r\n if(message) {\r\n // ! гений в деле, костылируем (но это гениально)\r\n const messagePhoto = message.action.photo;\r\n if(messagePhoto.id !== photo.id) {\r\n if(!hadMessage) {\r\n message = rootScope.managers.appMessagesManager.generateFakeAvatarMessage(peerId, photo);\r\n } else {\r\n\r\n }\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\r\n element: el.element,\r\n mid: (el.item as Message.messageService).mid,\r\n peerId: (el.item as Message.messageService).peerId\r\n }));\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n peerId,\r\n inputFilter: {_: inputFilter}\r\n })\r\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n\r\n return;\r\n }\r\n }\r\n\r\n if(photo) {\r\n if(!isObject(message) && message) {\r\n photo = await rootScope.managers.appPhotosManager.getPhoto(message);\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\r\n element: el.element,\r\n photoId: el.item as string\r\n }));\r\n\r\n new AppMediaViewerAvatar(peerId).openMedia(\r\n photo.id,\r\n getTarget(),\r\n undefined,\r\n prevTargets ? f(prevTargets) : undefined,\r\n nextTargets ? f(nextTargets) : undefined\r\n );\r\n }\r\n}\r\n\r\nconst believeMe: Map> = new Map();\r\nconst seen: Set = new Set();\r\n\r\nexport default class AvatarElement extends HTMLElement {\r\n public peerId: PeerId;\r\n public isDialog: boolean;\r\n public peerTitle: string;\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueue;\r\n public isBig: boolean;\r\n private addedToQueue = false;\r\n\r\n disconnectedCallback() {\r\n // браузер вызывает этот метод при удалении элемента из документа\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n const set = believeMe.get(this.peerId);\r\n if(set && set.has(this)) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(this.peerId);\r\n }\r\n }\r\n\r\n this.lazyLoadQueue?.delete({div: this});\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(const i in options) {\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n public updateWithOptions(options: {\r\n peerId: PeerId,\r\n isDialog?: boolean,\r\n isBig?: boolean,\r\n peerTitle?: string,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n loadPromises?: Promise[]\r\n }) {\r\n const wasPeerId = this.peerId;\r\n this.updateOptions(options);\r\n const newPeerId = this.peerId;\r\n\r\n if(wasPeerId === newPeerId) {\r\n return;\r\n }\r\n\r\n this.peerId = /* rootScope.managers.appPeersManager.getPeerMigratedTo(newPeerId) || */newPeerId;\r\n this.dataset.peerId = '' + newPeerId;\r\n\r\n if(wasPeerId) {\r\n const set = believeMe.get(wasPeerId);\r\n if(set) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(wasPeerId);\r\n }\r\n }\r\n }\r\n\r\n return this.update();\r\n }\r\n\r\n private r(onlyThumb = false) {\r\n const promise = putPhoto(this, this.peerId, this.isDialog, this.peerTitle, onlyThumb, this.isBig);\r\n // recordPromise(promise, 'avatar putPhoto-' + this.peerId);\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises.push(promise);\r\n\r\n promise.finally(() => {\r\n this.loadPromises = undefined;\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public update() {\r\n if(this.lazyLoadQueue) {\r\n if(!seen.has(this.peerId)) {\r\n if(this.addedToQueue) return;\r\n this.addedToQueue = true;\r\n\r\n let set = believeMe.get(this.peerId);\r\n if(!set) {\r\n set = new Set();\r\n believeMe.set(this.peerId, set);\r\n }\r\n\r\n set.add(this);\r\n\r\n this.lazyLoadQueue.push({\r\n div: this,\r\n load: () => {\r\n seen.add(this.peerId);\r\n return this.update();\r\n }\r\n });\r\n\r\n return this.r(true);\r\n } else if(this.addedToQueue) {\r\n this.lazyLoadQueue.delete({div: this});\r\n }\r\n }\r\n\r\n seen.add(this.peerId);\r\n\r\n const promise = this.r();\r\n\r\n if(this.addedToQueue) {\r\n promise.finally(() => {\r\n this.addedToQueue = false;\r\n });\r\n }\r\n\r\n const set = believeMe.get(this.peerId);\r\n if(set) {\r\n set.delete(this);\r\n const arr = Array.from(set);\r\n believeMe.delete(this.peerId);\r\n\r\n\r\n for(let i = 0, length = arr.length; i < length; ++i) {\r\n arr[i].update();\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n}\r\n\r\ncustomElements.define('avatar-element', AvatarElement);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport type {InputFile} from '../layer';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport PopupElement from './popups';\r\nimport PopupAvatar from './popups/avatar';\r\n\r\nexport default class AvatarEdit {\r\n public container: HTMLElement;\r\n private canvas: HTMLCanvasElement;\r\n private icon: HTMLSpanElement;\r\n\r\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('avatar-edit');\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('avatar-edit-canvas');\r\n\r\n this.icon = document.createElement('span');\r\n this.icon.classList.add('tgico', 'tgico-cameraadd');\r\n\r\n this.container.append(this.canvas, this.icon);\r\n\r\n attachClickEvent(this.container, () => {\r\n PopupElement.createPopup(PopupAvatar).open(this.canvas, onChange);\r\n });\r\n }\r\n\r\n public clear() {\r\n const ctx = this.canvas.getContext('2d');\r\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {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 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 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport CheckboxField from './checkboxField';\n\nexport type ButtonMenuItemOptions = {\n icon?: string,\n text?: LangPackKey,\n textArgs?: FormatterArguments,\n regularText?: string,\n onClick: (e: MouseEvent | TouchEvent) => void | boolean | any,\n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean\n /* , cancelEvent?: true */\n};\n\nconst ButtonMenuItem = (options: ButtonMenuItemOptions) => {\n if(options.element) return options.element;\n\n const {icon, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n // ripple(el);\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text, options.textArgs) : document.createElement('span');\n if(options.regularText) textElement.innerHTML = options.regularText;\n }\n\n textElement.classList.add('btn-menu-item-text');\n el.append(textElement);\n\n const keepOpen = !!checkboxField || !!options.keepOpen;\n\n // * cancel mobile keyboard close\n onClick && attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ (e) => {\n cancelEvent(e);\n\n const menu = findUpClassName(e.target, 'btn-menu');\n if(menu && !menu.classList.contains('active')) {\n return;\n }\n\n const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\n contextMenuController.close();\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 contextMenuController from '../helpers/contextMenuController';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {AttachClickOptions, CLICK_EVENT_NAME} from '../helpers/dom/clickEvent';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport ButtonIcon from './buttonIcon';\r\nimport ButtonMenu, {ButtonMenuItemOptions} from './buttonMenu';\r\n\r\nconst ButtonMenuToggle = (\r\n options: Partial<{\r\n noRipple: true,\r\n onlyMobile: true,\r\n listenerSetter: ListenerSetter,\r\n asDiv: boolean,\r\n container: HTMLElement\r\n }> = {},\r\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right',\r\n buttons: ButtonMenuItemOptions[],\r\n onOpen?: (e: Event) => void,\r\n onClose?: () => void\r\n) => {\r\n options.asDiv = true;\r\n const button = options.container ?? ButtonIcon('more', options);\r\n button.classList.add('btn-menu-toggle');\r\n\r\n const btnMenu = ButtonMenu(buttons, options.listenerSetter);\r\n btnMenu.classList.add(direction);\r\n ButtonMenuToggleHandler(button, onOpen, options, onClose);\r\n button.append(btnMenu);\r\n return button;\r\n};\r\n\r\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\r\nconst ButtonMenuToggleHandler = (el: HTMLElement, onOpen?: (e: Event) => void | Promise, options?: AttachClickOptions, onClose?: () => void) => {\r\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\r\n\r\n // console.trace('ButtonMenuToggleHandler attach', el, onOpen, options);\r\n add(CLICK_EVENT_NAME, (e: Event) => {\r\n // console.log('ButtonMenuToggleHandler click', e);\r\n if(!el.classList.contains('btn-menu-toggle')) return false;\r\n\r\n // window.removeEventListener('mousemove', onMouseMove);\r\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\r\n cancelEvent(e);\r\n\r\n if(el.classList.contains('menu-open')) {\r\n contextMenuController.close();\r\n } else {\r\n const result = onOpen && onOpen(e);\r\n const open = () => {\r\n contextMenuController.openBtnMenu(openedMenu, onClose);\r\n };\r\n\r\n if(result instanceof Promise) {\r\n result.then(open);\r\n } else {\r\n open();\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport {ButtonMenuToggleHandler};\r\nexport default ButtonMenuToggle;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko, 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 {animateSingle} from '../../helpers/animation';\nimport {hexToRgb} from '../../helpers/color';\nimport {easeOutQuadApply} from '../../helpers/easing/easeOutQuad';\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, 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 private _nextPositionTail: number;\n private _nextPositionTails: number;\n private _nextPositionLeft: number;\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 positions.push(...positions.splice(0, shift));\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 changeTailAndDraw(diff: number) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n\n private drawOnWheel = () => {\n const value = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n const diff = value > 0 ? Math.floor(value) : Math.ceil(value);\n if(diff) {\n this.changeTailAndDraw(diff);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = (getProgress?: () => number) => {\n let done: boolean, id: ImageData;\n if(getProgress) {\n const value = getProgress();\n done = value >= 1;\n const transitionValue = easeOutQuadApply(value, 1);\n const nextPositionTail = this._nextPositionTail ?? 0;\n const tail = this._nextPositionTail = this._nextPositionTails * transitionValue;\n const diff = tail - nextPositionTail;\n if(diff) {\n this._nextPositionLeft -= diff;\n this.changeTailAndDraw(diff);\n }\n } else {\n const frames = this._frames;\n id = frames.shift();\n done = !frames.length;\n }\n\n if(id) {\n this.drawImageData(id);\n }\n\n if(done) {\n this._nextPositionLeft = undefined;\n this._nextPositionTails = undefined;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = undefined;\n }\n\n return !done;\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', {alpha: false});\n }\n\n this._canvas = el;\n this._ctx = this._canvas.getContext('2d', {alpha: false});\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(getProgress?: () => number) {\n if(this._colors.length < 2) {\n return;\n }\n\n if(getProgress) {\n this._nextPositionLeft = this._tails + (this._nextPositionLeft ?? 0);\n this._nextPositionTails = this._nextPositionLeft;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated.bind(this, getProgress), this);\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 animateSingle(this.drawNextPositionAnimated, this);\n }\n\n // public toNextPositionThrottled = throttle(this.toNextPosition.bind(this), 100, true);\n\n public scrollAnimate(start?: boolean) {\n return;\n\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","export default function easeOutQuad(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeOutQuadApply(t / d, c) + b;\n}\n\nexport function easeOutQuadApply(v: number, c: number) {\n return -c * v * (v - 2);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppMessagesManager, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport type ChatBubbles from './bubbles';\nimport type ChatInput from './input';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport Button from '../button';\nimport ButtonIcon from '../buttonIcon';\nimport CheckboxField from '../checkboxField';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport 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 replaceContent from '../../helpers/dom/replaceContent';\nimport AppSearchSuper from '../appSearchSuper.';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {randomLong} from '../../helpers/random';\nimport {attachClickEvent, AttachClickOptions} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport appImManager from '../../lib/appManagers/appImManager';\n\nconst accumulateMapSet = (map: Map>) => {\n return [...map.values()].reduce((acc, v) => acc + v.size, 0);\n};\n\n// const MIN_CLICK_MOVE = 32; // minimum bubble height\n\nclass AppSelection extends EventListenerBase<{\n toggle: (isSelecting: boolean) => void\n}> {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void | Promise;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n protected doNotAnimate: boolean;\n protected managers: AppManagers;\n\n constructor(options: {\n managers: AppManagers,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n }\n\n public attachListeners(listenElement: HTMLElement, listenerSetter: ListenerSetter) {\n if(this.listenElement) {\n this.listenerSetter.removeAll();\n }\n\n this.listenElement = listenElement;\n this.listenerSetter = listenerSetter;\n\n if(!listenElement) {\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener(listenElement, (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n // this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n // cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n }, listenerSetter);\n\n return;\n }\n\n listenerSetter.add(listenElement)('mousedown', this.onMouseDown);\n }\n\n private onMouseDown = (e: MouseEvent) => {\n // console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n\n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(seenSet.has(mid)) {\n return;\n }\n\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n // bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = this.getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach((element) => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n };\n\n // const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n // console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n // bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n };\n\n private getElementsBetween = (first: HTMLElement, last: HTMLElement) => {\n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n\n const checkboxField = new CheckboxField({\n name: element.dataset.mid,\n round: true\n });\n\n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n\n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n SetTransition(element, 'is-selected', false, 200);\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' &&\n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected async updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n\n let cantForward = !size,\n cantDelete = !size;\n const cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.isScheduled ? 'scheduled' : 'history'}`;\n const r = await this.managers.appMessagesManager.cantForwardDeleteMids(storageKey, Array.from(mids));\n cantForward = r.cantForward;\n cantDelete = r.cantDelete;\n\n if(cantForward && cantDelete) break;\n }\n\n this.onUpdateContainer?.(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 const toggleResult = 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 (toggleResult || Promise.resolve()).then(() => this.updateContainer(forceSelection));\n }\n\n return true;\n }\n\n public cancelSelection = async(doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && await this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n if(doNotAnimate) this.doNotAnimate = undefined;\n };\n\n public cleanup() {\n this.doNotAnimate = true;\n this.selectedMids.clear();\n this.toggleSelection(false);\n this.doNotAnimate = undefined;\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition(element, 'is-selected', isSelected, 200);\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n // const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n // if(diff < 0) {\n // toast(I18n.format('Chat.Selection.LimitToast', true));\n // return false;\n // /* const it = this.selectedMids.values();\n // do {\n // const mid = it.next().value;\n // const mounted = this.appImManager.getMountedBubble(mid);\n // if(mounted) {\n // this.toggleByBubble(mounted.bubble);\n // } else {\n // const mids = this.appMessagesManager.getMidsByMid(mid);\n // for(const mid of mids) {\n // this.selectedMids.delete(mid);\n // }\n // }\n // } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n // }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach((mid) => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, managers: AppManagers, listenerSetter: ListenerSetter) {\n super({\n managers,\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n this.attachListeners(searchSuper.container, listenerSetter);\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach((element) => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n SetTransition(this.searchSuper.navScrollableContainer, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer =\n this.selectionForwardBtn =\n this.selectionDeleteBtn =\n null;\n this.selectedText = undefined;\n }\n });\n\n SetTransition(this.searchSuper.container, 'is-selecting', forwards, 200);\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {listenerSetter: this.listenerSetter, once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n appImManager.setInnerPeer({peerId, lastMsgId: mid});\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel,\n this.selectionCountEl,\n this.selectionGotoBtn,\n this.selectionForwardBtn,\n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n private selectionLeft: HTMLDivElement;\n private selectionRight: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private bubbles: ChatBubbles,\n private input: ChatInput,\n managers: AppManagers\n ) {\n super({\n managers,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size &&\n !(e.target as HTMLElement).classList.contains('bubble') &&\n !(e.target as HTMLElement).classList.contains('document-selection') &&\n target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element &&\n !(e.target as HTMLElement).classList.contains('document-selection') &&\n selecting === undefined &&\n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n if(this.bubbles.skippedMids.has(+mid)) {\n continue;\n }\n\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach((item) => this.toggleElementCheckbox(item, show));\n }\n }\n\n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement): Promise => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.chat.peerId);\n if(set) {\n // const mids = await this.chat.getMidsByMid(mid);\n const mids = this.getMidsFromGroupContainer(bubble);\n mids.forEach((mid) => set.delete(mid));\n }\n }\n\n /* const promises = */this.bubbles.getBubbleGroupedItems(bubble).map(this.toggleByElement);\n // await Promise.all(promises);\n return;\n }\n\n if(!this.toggleMid(this.chat.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(groupContainer);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.chat.peerId, mid));\n };\n\n protected toggleByMid = async(peerId: PeerId, mid: number) => {\n const mounted = await this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(element));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected getMidsFromGroupContainer(groupContainer: HTMLElement) {\n const elements = this.chat.bubbles.getBubbleGroupedItems(groupContainer);\n if(!elements.length) {\n elements.push(groupContainer);\n }\n\n return elements.map((element) => +element.dataset.mid);\n }\n\n protected isGroupedMidsSelected(groupContainer: HTMLElement) {\n const mids = this.getMidsFromGroupContainer(groupContainer);\n const selectedMids = mids.filter((mid) => this.isMidSelected(this.chat.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n\n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n\n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n\n return bubble.classList.contains('document-container') ?\n bubble.querySelector('label input') as HTMLInputElement :\n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') &&\n !bubble.classList.contains('is-outgoing') &&\n !bubble.classList.contains('is-error') &&\n !bubble.classList.contains('bubble-first') &&\n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = async(forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = await this.chat.input.center(animate);\n\n SetTransition(this.listenElement, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper =\n this.selectionContainer =\n this.selectionSendNowBtn =\n this.selectionForwardBtn =\n this.selectionDeleteBtn =\n this.selectionLeft =\n this.selectionRight =\n null;\n this.selectedText = undefined;\n }\n\n /* fastRaf(() => {\n this.bubbles.onScroll();\n }); */\n });\n\n // const chatInput = this.appImManager.chatInput;\n\n const translateButtonsX = widthFrom < widthTo ? undefined : needTranslateX * 2;\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n this.selectionInputWrapper = document.createElement('div');\n this.selectionInputWrapper.classList.add('chat-input-wrapper', 'selection-wrapper');\n\n // const background = document.createElement('div');\n // background.classList.add('chat-input-wrapper-background');\n\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n const left = this.selectionLeft = document.createElement('div');\n left.classList.add('selection-container-left');\n left.append(btnCancel, this.selectionCountEl);\n\n const right = this.selectionRight = document.createElement('div');\n right.classList.add('selection-container-right');\n right.append(...[\n this.selectionSendNowBtn,\n this.selectionForwardBtn,\n this.selectionDeleteBtn\n ].filter(Boolean))\n\n if(translateButtonsX !== undefined) {\n left.style.transform = `translateX(${-translateButtonsX}px)`;\n right.style.transform = `translateX(${translateButtonsX}px)`;\n }\n\n this.selectionContainer.append(left, right);\n\n // background.style.opacity = '0';\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(/* background, */this.selectionContainer);\n this.input.inputContainer.append(this.selectionInputWrapper);\n\n void this.selectionInputWrapper.offsetLeft; // reflow\n // background.style.opacity = '';\n this.selectionInputWrapper.style.opacity = '';\n left.style.transform = '';\n right.style.transform = '';\n }\n } else if(this.selectionLeft && translateButtonsX !== undefined) {\n this.selectionLeft.style.transform = `translateX(-${translateButtonsX}px)`;\n this.selectionRight.style.transform = `translateX(${translateButtonsX}px)`;\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = async() => {\n return;\n const promises: Promise[] = [];\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n promises.push(this.bubbles.getMountedBubble(mid).then((m) => m?.bubble));\n }\n }\n\n const bubbles = filterUnique((await Promise.all(promises)).filter(Boolean));\n bubbles.forEach((bubble) => {\n this.toggleByElement(bubble);\n });\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedText(): string {\r\n if(window.getSelection) {\r\n return window.getSelection().toString();\r\n // @ts-ignore\r\n } else if(document.selection) {\r\n // @ts-ignore\r\n return document.selection.createRange().text;\r\n }\r\n\r\n return '';\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 '../helpers/listenerSetter';\r\nimport ripple from './ripple';\r\nimport {LangPackKey, _i18n} from '../lib/langPack';\r\nimport getDeepProperty from '../helpers/object/getDeepProperty';\r\nimport rootScope from '../lib/rootScope';\r\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string,\r\n round?: boolean,\r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n listenerSetter?: ListenerSetter\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n public listenerSetter: ListenerSetter;\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 this.listenerSetter = options.listenerSetter;\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 let loaded = false;\r\n const onChange = () => {\r\n if(!loaded) {\r\n return;\r\n }\r\n\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n rootScope.managers.appStateManager.setByKey(options.stateKey, value);\r\n };\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n loaded = true;\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\r\n if(options.listenerSetter) options.listenerSetter.add(input)('change', onChange);\r\n else input.addEventListener('change', onChange);\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n\r\n const checkSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n\r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n\r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n\r\n box.append(border, bg, checkSvg);\r\n\r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n // label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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 {addCancelButton} from './popups';\nimport PopupPeer, {PopupPeerOptions} from './popups/peer';\n\n// type PopupConfirmationOptions = Pick;\nexport type 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(options.buttons || [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 IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport {randomLong} from '../helpers/random';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport I18n, {i18n} from '../lib/langPack';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../lib/rootScope';\nimport {getCountryEmoji} from '../vendor/emoji';\nimport InputField, {InputFieldOptions} from './inputField';\nimport Scrollable from './scrollable';\n\nlet countries: HelpCountry.helpCountry[];\nconst setCountries = () => {\n countries = I18n.countriesList\n .filter((country) => !country.pFlags?.hidden)\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\n};\n\nlet init = () => {\n setCountries();\n rootScope.addEventListener('language_change', () => {\n setCountries();\n });\n};\n\nexport default class CountryInputField extends InputField {\n private lastCountrySelected: HelpCountry;\n private lastCountryCodeSelected: HelpCountryCode;\n\n private hideTimeout: number;\n private selectWrapper: HTMLElement;\n\n private liMap: Map;\n\n constructor(public options: InputFieldOptions & {\n onCountryChange?: (country: HelpCountry.helpCountry, code: HelpCountryCode.helpCountryCode) => void,\n noPhoneCodes?: boolean\n } = {}) {\n super({\n label: 'Country',\n name: randomLong(),\n ...options\n });\n\n if(init) {\n init();\n init = undefined;\n }\n\n this.liMap = new Map();\n\n this.container.classList.add('input-select');\n\n const selectWrapper = this.selectWrapper = document.createElement('div');\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\n\n const arrowDown = document.createElement('span');\n arrowDown.classList.add('arrow', 'arrow-down');\n this.container.append(arrowDown);\n\n const selectList = document.createElement('ul');\n selectWrapper.appendChild(selectList);\n\n const scroll = new Scrollable(selectWrapper);\n\n let initSelect = () => {\n initSelect = null;\n\n countries.forEach((c) => {\n const emoji = getCountryEmoji(c.iso2);\n\n const liArr: Array = [];\n for(let i = 0, length = Math.min(c.country_codes.length, options.noPhoneCodes ? 1 : Infinity); i < length; ++i) {\n const countryCode = c.country_codes[i];\n const li = document.createElement('li');\n\n const wrapped = wrapEmojiText(emoji);\n if(IS_EMOJI_SUPPORTED) {\n const spanEmoji = document.createElement('span');\n setInnerHTML(spanEmoji, wrapped);\n li.append(spanEmoji);\n } else {\n setInnerHTML(li, wrapped);\n }\n\n const el = i18n(c.default_name as any);\n el.dataset.defaultName = c.default_name;\n li.append(el);\n\n if(!options.noPhoneCodes) {\n const span = document.createElement('span');\n span.classList.add('phone-code');\n span.innerText = '+' + countryCode.country_code;\n li.appendChild(span);\n }\n\n liArr.push(li);\n selectList.append(li);\n }\n\n this.liMap.set(c.iso2, liArr);\n });\n\n selectList.addEventListener('mousedown', (e) => {\n if(e.button !== 0) { // other buttons but left shall not pass\n return;\n }\n\n const target = findUpTag(e.target, 'LI')\n this.selectCountryByTarget(target);\n // console.log('clicked', e, countryName, phoneCode);\n });\n\n this.container.appendChild(selectWrapper);\n };\n\n initSelect();\n\n this.input.addEventListener('focus', (e) => {\n if(initSelect) {\n initSelect();\n } else {\n countries.forEach((c) => {\n this.liMap.get(c.iso2).forEach((li) => li.style.display = '');\n });\n }\n\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n\n selectWrapper.classList.remove('hide');\n void selectWrapper.offsetWidth; // reflow\n selectWrapper.classList.add('active');\n\n this.select();\n\n fastSmoothScroll({\n // container: page.pageEl.parentElement.parentElement,\n container: findUpClassName(this.container, 'scrollable-y'),\n element: this.input,\n position: 'start',\n margin: 4\n });\n\n setTimeout(() => {\n if(!mouseDownHandlerAttached) {\n document.addEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = true;\n }\n }, 0);\n });\n\n let mouseDownHandlerAttached = false;\n const onMouseDown = (e: MouseEvent) => {\n if(findUpClassName(e.target, 'input-select')) {\n return;\n }\n if(e.target === this.input) {\n return;\n }\n\n this.hidePicker();\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = false;\n };\n\n /* false && this.input.addEventListener('blur', function(this: typeof this.input, e) {\n hidePicker();\n\n e.cancelBubble = true;\n }, {capture: true}); */\n\n const onKeyPress = (e: KeyboardEvent) => {\n const key = e.key;\n if(e.ctrlKey || key === 'Control') return false;\n\n // let i = new RegExp('^' + this.value, 'i');\n const _value = this.value.toLowerCase();\n const matches: HelpCountry[] = [];\n countries.forEach((c) => {\n const names = [\n c.name,\n c.default_name,\n c.iso2\n ];\n\n names.filter(Boolean).forEach((name) => {\n const abbr = name.split(' ').filter((word) => /\\w/.test(word)).map((word) => word[0]).join('');\n if(abbr.length > 1) {\n names.push(abbr);\n }\n });\n\n const good = !!names.filter(Boolean).find((str) => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;// i.test(c.name);\n\n this.liMap.get(c.iso2).forEach((li) => li.style.display = good ? '' : 'none');\n if(good) matches.push(c);\n });\n\n // Код ниже автоматически выберет страну если она осталась одна при поиске\n /* if(matches.length === 1 && matches[0].li.length === 1) {\n if(matches[0].name === lastCountrySelected) return false;\n //console.log('clicking', matches[0]);\n\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initEvent('mousedown', true, true);\n matches[0].li[0].dispatchEvent(clickEvent);\n return false;\n } else */if(matches.length === 0) {\n countries.forEach((c) => {\n this.liMap.get(c.iso2).forEach((li) => li.style.display = '');\n });\n } else if(matches.length === 1 && key === 'Enter') {\n cancelEvent(e);\n this.selectCountryByTarget(this.liMap.get(matches[0].iso2)[0]);\n }\n };\n\n this.input.addEventListener('keyup', onKeyPress);\n this.input.addEventListener('keydown', (e) => {\n if(e.key === 'Enter') {\n onKeyPress(e);\n }\n });\n\n arrowDown.addEventListener('mousedown', (e) => {\n if(this.input.matches(':focus')) {\n this.hidePicker();\n this.input.blur();\n } else {\n e.cancelBubble = true;\n e.preventDefault();\n this.input.focus();\n }\n });\n }\n\n public getSelected() {\n return {country: this.lastCountrySelected, code: this.lastCountryCodeSelected};\n }\n\n public hidePicker = () => {\n if(this.hideTimeout !== undefined) return;\n this.selectWrapper.classList.remove('active');\n this.hideTimeout = window.setTimeout(() => {\n this.selectWrapper.classList.add('hide');\n this.hideTimeout = undefined;\n }, 200);\n }\n\n public selectCountryByTarget = (target: HTMLElement) => {\n const defaultName = target.querySelector('[data-default-name]').dataset.defaultName;\n const phoneCodeEl = target.querySelector('.phone-code');\n const phoneCode = phoneCodeEl?.innerText;\n const countryCode = phoneCode && phoneCode.replace(/\\D/g, '');\n\n replaceContent(this.input, i18n(defaultName as any));\n this.simulateInputEvent();\n this.lastCountrySelected = countries.find((c) => c.default_name === defaultName);\n this.lastCountryCodeSelected = countryCode && this.lastCountrySelected.country_codes.find((_countryCode) => _countryCode.country_code === countryCode);\n\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n this.hidePicker();\n }\n\n public selectCountryByIso2(iso2: string) {\n this.selectCountryByTarget(this.liMap.get(iso2)[0]);\n }\n\n public override(country: HelpCountry, code: HelpCountryCode, countryName?: string) {\n replaceContent(this.input, country ? i18n(country.default_name as any) : countryName);\n this.lastCountrySelected = country;\n this.lastCountryCodeSelected = code;\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\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 {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\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\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 this.peerId ||= NULL_PEER_ID;\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\nimport emoticonsDropdown, {EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP} from '..';\r\nimport GifsMasonry from '../../gifsMasonry';\r\nimport Scrollable from '../../scrollable';\r\nimport {putPreloader} from '../../putPreloader';\r\nimport {AppManagers} from '../../../lib/appManagers/managers';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\n\r\nexport default class GifsTab implements EmoticonsTab {\r\n public content: HTMLElement;\r\n public scrollable: Scrollable;\r\n public tabId: number;\r\n\r\n constructor(private managers: AppManagers) {\r\n\r\n }\r\n\r\n init() {\r\n this.content = document.getElementById('content-gifs');\r\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\r\n attachClickEvent(gifsContainer, EmoticonsDropdown.onMediaClick);\r\n\r\n const scroll = this.scrollable = new Scrollable(this.content, 'GIFS');\r\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\r\n const preloader = putPreloader(this.content, true);\r\n\r\n this.managers.appDocsManager.getGifs().then((docs) => {\r\n docs.forEach((doc) => {\r\n masonry.add(doc);\r\n });\r\n\r\n preloader.remove();\r\n });\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\r\n\r\n this.init = null;\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDocument} from '../../../lib/appManagers/appDocsManager';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport InputSearch from '../../inputSearch';\r\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\r\nimport appSidebarRight from '..';\r\nimport {AppInlineBotsManager} from '../../../lib/appManagers/appInlineBotsManager';\r\nimport GifsMasonry from '../../gifsMasonry';\r\nimport appImManager from '../../../lib/appManagers/appImManager';\r\nimport 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: AnimationItemGroup = '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 public 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 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 }\r\n\r\n private onGifsClick = async(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(await 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 async search(query: string, newSearch = true) {\r\n if(this.searchPromise || this.loadedAll) return;\r\n\r\n if(!this.gifBotPeerId) {\r\n this.gifBotPeerId = (await this.managers.appUsersManager.resolveUsername('gif')).id.toPeerId(false);\r\n }\r\n\r\n try {\r\n this.searchPromise = this.managers.appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\r\n const {results, next_offset} = await this.searchPromise;\r\n\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n this.searchPromise = null;\r\n this.nextOffset = next_offset;\r\n if(newSearch) {\r\n this.gifsDiv.innerHTML = '';\r\n }\r\n\r\n if(results.length) {\r\n results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult' && result.document) {\r\n this.masonry.add(result.document as MyDocument);\r\n }\r\n });\r\n } else {\r\n this.loadedAll = true;\r\n }\r\n\r\n this.scrollable.onScroll();\r\n } catch(err) {\r\n this.searchPromise = null;\r\n console.error('gifs loading error:', err);\r\n throw err;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider';\r\nimport InputSearch from '../../inputSearch';\r\nimport LazyLoadQueue from '../../lazyLoadQueue';\r\nimport appImManager from '../../../lib/appManagers/appImManager';\r\nimport PopupStickers from '../../popups/stickers';\r\nimport animationIntersector from '../../animationIntersector';\r\nimport appSidebarRight from '..';\r\nimport {StickerSet, StickerSetCovered} from '../../../layer';\r\nimport {i18n} from '../../../lib/langPack';\r\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport forEachReverse from '../../../helpers/array/forEachReverse';\r\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\r\nimport attachStickerViewerListeners from '../../stickerViewer';\r\nimport wrapSticker from '../../wrappers/sticker';\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 public 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 attachStickerViewerListeners({listenTo: this.setsDiv, listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(this.setsDiv, (e) => {\r\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(sticker) {\r\n const docId = sticker.dataset.docId;\r\n appImManager.chat.input.sendMessageWithDocument(docId);\r\n return;\r\n }\r\n\r\n const target = findUpClassName(e.target, 'sticker-set');\r\n if(!target) return;\r\n\r\n const id = target.dataset.stickerSet as string;\r\n const access_hash = target.dataset.access_hash as string;\r\n\r\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\r\n if(button) {\r\n e.preventDefault();\r\n e.cancelBubble = true;\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\r\n this.managers.appStickersManager.toggleStickerSet(full.set).then((changed) => {\r\n if(changed) {\r\n button.textContent = '';\r\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n button.classList.toggle('gray', !!full.set.installed_date);\r\n }\r\n }).finally(() => {\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n button.removeAttribute('disabled');\r\n });\r\n });\r\n } else {\r\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\r\n new PopupStickers(full.set).show();\r\n });\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.renderFeatured();\r\n });\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.setsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n public renderSet(set: StickerSet.stickerSet) {\r\n // console.log('renderSet:', set);\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n const header = document.createElement('div');\r\n header.classList.add('sticker-set-header');\r\n\r\n const details = document.createElement('div');\r\n details.classList.add('sticker-set-details');\r\n details.innerHTML = `
`;\r\n\r\n setInnerHTML(details.firstElementChild, wrapEmojiText(set.title));\r\n\r\n const countDiv = document.createElement('div');\r\n countDiv.classList.add('sticker-set-count');\r\n countDiv.append(i18n('Stickers', [set.count]));\r\n details.append(countDiv);\r\n\r\n const button = document.createElement('button');\r\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\r\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n\r\n if(set.installed_date) {\r\n button.classList.add('gray');\r\n }\r\n\r\n // ripple(button);\r\n\r\n header.append(details, button);\r\n\r\n const stickersDiv = document.createElement('div');\r\n stickersDiv.classList.add('sticker-set-stickers');\r\n\r\n const count = Math.min(5, set.count);\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add('sticker-set-sticker');\r\n\r\n stickersDiv.append(stickerDiv);\r\n }\r\n\r\n this.managers.appStickersManager.getStickerSet(set).then((set) => {\r\n // console.log('renderSet got set:', set);\r\n\r\n for(let i = 0; i < count; ++i) {\r\n const div = stickersDiv.children[i] as HTMLDivElement;\r\n const doc = set.documents[i];\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n\r\n wrapSticker({\r\n doc,\r\n div,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: 'STICKERS-SEARCH',\r\n /* play: false,\r\n loop: false, */\r\n play: true,\r\n loop: true,\r\n width: 68,\r\n height: 68,\r\n withLock: true\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 renderFeatured() {\r\n return this.managers.appStickersManager.getFeaturedStickers().then((coveredSets) => {\r\n if(this.inputSearch.value) {\r\n return;\r\n }\r\n\r\n coveredSets = this.filterRendered('', coveredSets);\r\n coveredSets.forEach((set) => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n\r\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\r\n coveredSets = coveredSets.slice();\r\n\r\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\r\n forEachReverse(children, el => {\r\n const id = el.dataset.stickerSet;\r\n const index = coveredSets.findIndex((covered) => covered.set.id === id);\r\n\r\n if(index !== -1) {\r\n coveredSets.splice(index, 1);\r\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\r\n el.remove();\r\n }\r\n });\r\n\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n\r\n return coveredSets;\r\n }\r\n\r\n public search(query: string) {\r\n if(!query) {\r\n return this.renderFeatured();\r\n }\r\n\r\n return this.managers.appStickersManager.searchStickerSets(query, false).then((coveredSets) => {\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n // console.log('search result:', coveredSets);\r\n\r\n coveredSets = this.filterRendered(query, coveredSets);\r\n coveredSets.forEach((set) => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n}\r\n","/*\n * 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, {AnimationItemGroup} from '../animationIntersector';\nimport {horizontalMenu} from '../horizontalMenu';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable, {ScrollableX} from '../scrollable';\nimport appSidebarRight from '../sidebarRight';\nimport StickyIntersector from '../stickyIntersector';\nimport EmojiTab from './tabs/emoji';\nimport GifsTab from './tabs/gifs';\nimport StickersTab, {EmoticonsTabC, StickersTabCategory} from './tabs/stickers';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport AppGifsTab from '../sidebarRight/tabs/gifs';\nimport AppStickersTab from '../sidebarRight/tabs/stickers';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport whichChild from '../../helpers/dom/whichChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport pause from '../../helpers/schedulers/pause';\nimport {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport type LazyLoadQueueIntersector from '../lazyLoadQueueIntersector';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport noop from '../../helpers/noop';\nimport {FocusDirection, ScrollOptions} from '../../helpers/fastSmoothScroll';\nimport BezierEasing from '../../vendor/bezier-easing';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {getCaretPosF} from '../../helpers/dom/getCaretPosNew';\n\nexport const EMOTICONSSTICKERGROUP: AnimationItemGroup = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n content: HTMLElement;\n scrollable: Scrollable;\n menuScroll?: ScrollableX;\n tabId: number;\n init: () => void;\n onOpen?: () => void;\n onOpened?: () => void;\n onClose?: () => void;\n onClosed?: () => void;\n}\n\nconst easing = BezierEasing(0.42, 0.0, 0.58, 1.0);\nconst scrollOptions: Partial = {\n forceDuration: 200,\n transitionFunction: easing\n};\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue(1);\n\n private emojiTab: EmojiTab;\n private stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n private managers: AppManagers;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement,\n ignoreOutClickClassName: 'input-message-input'\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 const tab = this.tab;\n tab.onOpen?.();\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlockAndRefresh();\n\n // this.container.classList.remove('disable-hover');\n\n const tab = this.tab;\n tab.onOpened?.();\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 const tab = this.tab;\n tab.onClose?.();\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 const tab = this.tab;\n tab.onClosed?.();\n });\n }\n\n public get tab() {\n return this.tabs[this.tabId];\n }\n\n public init() {\n this.managers = rootScope.managers;\n this.emojiTab = new EmojiTab(this.managers);\n this.stickersTab = new StickersTab(this.managers);\n this.gifsTab = new GifsTab(this.managers);\n\n this.tabs = {};\n [this.emojiTab, this.stickersTab, this.gifsTab].forEach((tab, idx) => {\n tab.tabId = idx;\n this.tabs[idx] = tab;\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;\n tab.init?.();\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 === this.stickersTab.tabId) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n appSidebarRight.createTab(AppStickersTab).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n appSidebarRight.createTab(AppGifsTab).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n attachClickEvent(this.deleteBtn, (e) => {\n cancelEvent(e);\n const input = appImManager.chat.input.messageInput;\n // RichInputHandler.getInstance().makeFocused(appImManager.chat.input.messageInput);\n let range = RichInputHandler.getInstance().getSavedRange(input);\n if(!range) {\n range = document.createRange();\n range.setStartAfter(input.lastChild);\n }\n\n const newRange = range.cloneRange();\n // if(range.endOffset === range.startOffset && range.endContainer === range.startContainer) {\n if(range.collapsed) {\n const {node, offset} = getCaretPosF(input, range.endContainer, range.endOffset);\n let newStartNode: Node;\n if(offset) {\n newStartNode = node;\n } else {\n newStartNode = node.previousSibling;\n if(!newStartNode) {\n return;\n }\n\n while(newStartNode.nodeType === newStartNode.TEXT_NODE && !newStartNode.nodeValue && (newStartNode = newStartNode.previousSibling)) {\n\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && !(newStartNode as HTMLElement).isContentEditable) {\n return;\n }\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && (newStartNode as any).tagName === 'IMG') {\n newRange.selectNode(newStartNode);\n } else {\n const text = [...newStartNode.textContent];\n let t: string;\n if(offset) {\n let length = 0;\n t = text.find((text) => (length += text.length, length >= offset));\n } else {\n t = text.pop() || '';\n }\n\n const newOffset = offset ? offset - t.length : newStartNode.textContent.length - t.length;\n newRange.setStart(newStartNode, newOffset);\n }\n }\n\n newRange.deleteContents();\n\n appImManager.chat.input.messageInputField.simulateInputEvent();\n // const selection = document.getSelection();\n // if(selection.isCollapsed) {\n // selection.modify('extend', 'backward', 'character');\n // }\n\n // selection.deleteFromDocument();\n // (document.activeElement as HTMLElement).blur();\n\n // document.execCommand('undo', false, null);\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\n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE && false;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? this.stickersTab.tabId : this.emojiTab.tabId;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n simulateClickEvent(this.tabsEl.children[INIT_TAB_ID + 1] as HTMLElement);\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n let lastMouseMoveEvent: MouseEvent, mouseMoveEventAttached = false;\n const onMouseMove = (e: MouseEvent) => {\n lastMouseMoveEvent = e;\n };\n overlayCounter.addEventListener('change', (isActive) => {\n if(isActive) {\n if(!mouseMoveEventAttached) {\n document.body.addEventListener('mousemove', onMouseMove);\n mouseMoveEventAttached = true;\n }\n } else if(mouseMoveEventAttached) {\n document.body.removeEventListener('mousemove', onMouseMove);\n if(lastMouseMoveEvent) {\n this.onMouseOut(lastMouseMoveEvent);\n }\n }\n });\n }\n\n appImManager.addEventListener('peer_changing', () => {\n this.toggle(false);\n });\n appImManager.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n public getElement() {\n return this.element;\n }\n\n public scrollTo(tab: EmoticonsTab, element: HTMLElement) {\n tab.scrollable.scrollIntoViewNew({\n element: element as HTMLElement,\n axis: 'y',\n position: 'start',\n ...scrollOptions\n });\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n const {tab} = this;\n this.scrollTo(tab, tab.scrollable.container.firstElementChild as HTMLElement);\n return;\n }\n\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === this.emojiTab.tabId);\n this.deleteBtn.classList.toggle('hide', this.tabId !== this.emojiTab.tabId);\n };\n\n private checkRights = async() => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const [canSendStickers, canSendGifs] = await Promise.all([\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers'),\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs')\n ]);\n\n tabsElements[this.stickersTab.tabId + 1].toggleAttribute('disabled', !canSendStickers);\n tabsElements[this.gifsTab.tabId + 1].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== (this.emojiTab.tabId + 1) && (!canSendStickers || !canSendGifs)) {\n this.selectTab(this.emojiTab.tabId, false);\n }\n };\n\n public static menuOnClick = (\n emoticons: EmoticonsTabC,\n menu: HTMLElement,\n scrollable: Scrollable,\n menuScroll?: ScrollableX,\n prevTab?: StickersTabCategory\n ) => {\n let jumpedTo = -1;\n\n const scrollToTab = (tab: typeof prevTab, f?: boolean) => {\n const m = tab.menuScroll || menuScroll;\n if(m) {\n m.scrollIntoViewNew({\n element: tab.elements.menuTab,\n position: 'center',\n axis: 'x',\n getElementPosition: f ? ({elementPosition}) => {\n return elementPosition - 106;\n } : undefined,\n ...scrollOptions\n });\n }\n };\n\n const setActive = (tab: typeof prevTab, scroll = true) => {\n if(tab === prevTab) {\n return false;\n }\n\n let f = false;\n if(prevTab) {\n prevTab.elements.menuTab.classList.remove('active');\n if(prevTab.menuScroll && prevTab.menuScroll !== tab.menuScroll) {\n f = true;\n // scroll to first\n prevTab.menuScroll.container.parentElement.classList.remove('active');\n prevTab.menuScroll.scrollIntoViewNew({\n element: prevTab.menuScroll.container.firstElementChild as HTMLElement,\n forceDirection: scroll ? undefined : FocusDirection.Static,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n }\n\n tab.elements.menuTab.classList.add('active');\n\n if(tab.menuScroll) {\n tab.menuScroll.container.parentElement.classList.add('active');\n scroll && menuScroll.scrollIntoViewNew({\n element: tab.menuScroll.container.parentElement,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n\n if(prevTab) {\n scrollToTab(tab, f);\n }\n\n prevTab = tab;\n\n return true;\n };\n\n const setActiveStatic = (tab: typeof prevTab) => {\n if(prevTab?.local) {\n return;\n }\n\n emoticons.scrollable.scrollTop = tab.elements.container.offsetTop + 1;\n const s = emoticons.menuScroll.container;\n const e = tab.elements.menuTab;\n s.scrollLeft = e.offsetLeft - s.clientWidth / 2 + e.offsetWidth / 2;\n setActive(tab, false);\n };\n\n let scrollingToContent = false;\n const stickyIntersector = new StickyIntersector(scrollable.container, (stuck, target) => {\n if(scrollingToContent) {\n return;\n }\n\n // console.log('sticky scrollTop', stuck, target, scrollable.container.scrollTop, jumpedTo);\n\n if(Math.abs(jumpedTo - scrollable.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const tab = emoticons.getCategoryByContainer(target);\n const which = whichChild(target);\n if(!stuck && (which || tab.menuScroll)) {\n return;\n }\n\n setActive(tab);\n });\n\n menu.addEventListener('click', (e) => {\n let target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-div-item');\n if(!target) {\n target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-inner');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n target = target.firstElementChild.firstElementChild as HTMLElement;\n }\n\n const which = whichChild(target);\n\n const tab = emoticons.getCategoryByMenuTab(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(setActive(tab)) {\n // scrollToTab(tab);\n // return;\n }\n\n let offsetTop = 0, additionalOffset = 0;\n if(which > 0 || tab.menuScroll) {\n const element = tab.elements.container;\n additionalOffset = 1;\n offsetTop = element.offsetTop + additionalOffset; // * due to stickyIntersector\n }\n\n jumpedTo = offsetTop;\n\n scrollingToContent = true;\n scrollable.scrollIntoViewNew({\n element: offsetTop ? tab.elements.container : scrollable.container.firstElementChild,\n position: 'start',\n axis: 'y',\n getElementPosition: offsetTop ? ({elementPosition}) => elementPosition + additionalOffset : undefined,\n ...scrollOptions\n }).finally(() => {\n setActive(tab);\n scrollingToContent = false;\n });\n });\n\n const a = scrollable.onAdditionalScroll ? scrollable.onAdditionalScroll.bind(scrollable) : noop;\n scrollable.onAdditionalScroll = () => {\n emoticons.content.parentElement.classList.toggle('scrolled-top', !scrollable.scrollTop);\n a();\n };\n\n return {stickyIntersector, setActive, setActiveStatic};\n };\n\n public static onMediaClick = async(e: {target: EventTarget | Element}, clearDraft = false, silent?: boolean) => {\n const target = findUpTag(e.target as HTMLElement, 'DIV');\n if(!target) return false;\n\n const docId = target.dataset.docId;\n if(!docId) return false;\n\n return this.sendDocId(docId, clearDraft, silent);\n };\n\n public static async sendDocId(docId: DocId, clearDraft?: boolean, silent?: boolean) {\n if(await appImManager.chat.input.sendMessageWithDocument(docId, undefined, clearDraft, silent)) {\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:', docId);\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","/*\n * 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, EMOTICONSSTICKERGROUP} from '..';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {fastRaf} from '../../../helpers/schedulers';\nimport pause from '../../../helpers/schedulers/pause';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport {emojiFromCodePoints} from '../../../vendor/emoji';\nimport {putPreloader} from '../../putPreloader';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport IS_EMOJI_SUPPORTED from '../../../environment/emojiSupport';\nimport IS_TOUCH_SUPPORTED from '../../../environment/touchSupport';\nimport blurActiveElement from '../../../helpers/dom/blurActiveElement';\nimport Emoji from '../../../config/emoji';\nimport fixEmoji from '../../../lib/richTextProcessor/fixEmoji';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport wrapSingleEmoji from '../../../lib/richTextProcessor/wrapSingleEmoji';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {EmoticonsTabC, StickersTabCategory} from './stickers';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport {Document, StickerSet} from '../../../layer';\nimport {CustomEmojiElement, CustomEmojiRendererElement} from '../../../lib/richTextProcessor/wrapRichText';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport PopupStickers from '../../popups/stickers';\nimport {hideToast, toastNew} from '../../toast';\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container?: HTMLElement, prepend = false, unify = false) {\n // const emoji = details.unified;\n // const emoji = (details.unified as string).split('-')\n // .reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: DocumentFragment;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = wrapSingleEmoji(emoji);\n } else {\n emoji = fixEmoji(emoji);\n kek = wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n // console.log(kek);\n\n spanEmoji.append(kek);\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild?.tagName === 'IMG') {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n\n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n // spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n // spanEmoji.setAttribute('emoji', emoji);\n if(container) {\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n }\n\n return spanEmoji;\n}\n\nexport function getEmojiFromElement(element: HTMLElement): {docId?: DocId, emoji: string} {\n const superEmoji = findUpClassName(element, 'super-emoji');\n if(!superEmoji) return;\n\n const firstElementChild = superEmoji.firstElementChild as HTMLElement;\n if(firstElementChild && firstElementChild.classList.contains('custom-emoji')) {\n return {emoji: firstElementChild.dataset.stickerEmoji, docId: firstElementChild.dataset.docId} as const;\n } else {\n if(element.nodeType === element.TEXT_NODE) return {emoji: element.nodeValue};\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n\n return {emoji: element.getAttribute('alt') || element.innerText} as const;\n }\n}\n\nconst EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = 'Emoji.Recent';\nconst EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [EMOJI_RECENT_ID, 'recent'];\nconst CUSTOM_EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = '';\nconst CUSTOM_EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [CUSTOM_EMOJI_RECENT_ID, ''];\nconst EMOJI_CATEGORIES: [LangPackKey | '', string][] = [\n ['Emoji.SmilesAndPeople', 'smile'],\n ['Emoji.AnimalsAndNature', 'animals'],\n ['Emoji.FoodAndDrink', 'eats'],\n ['Emoji.TravelAndPlaces', 'car'],\n ['Emoji.ActivityAndSport', 'sport'],\n ['Emoji.Objects', 'lamp'],\n // ['Emoji.Symbols', 'info'],\n ['Emoji.Flags', 'flag'],\n ['Skin Tones' as any, '']\n];\n\nfunction prepare() {\n let sorted: Map<(typeof EMOJI_CATEGORIES)[0], string[]> = new Map([\n [CUSTOM_EMOJI_RECENT_CATEGORY, []],\n [EMOJI_RECENT_CATEGORY, []]\n ]);\n\n for(const emoji in Emoji) {\n const details = Emoji[emoji];\n const i = '' + details;\n const category = EMOJI_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 sorted.delete(EMOJI_CATEGORIES.pop());\n EMOJI_CATEGORIES.unshift(CUSTOM_EMOJI_RECENT_CATEGORY, EMOJI_RECENT_CATEGORY);\n const order = EMOJI_CATEGORIES.map(([id]) => id);\n const entries = [...sorted.entries()].sort((a, b) => order.indexOf(a[0][0]) - order.indexOf(b[0][0]));\n sorted = new Map(entries);\n\n return sorted;\n}\n\nconst EMOJI_ELEMENT_SIZE = makeMediaSize(42, 42);\nconst RECENT_MAX_LENGTH = 32;\n\ntype EmojiTabItem = {element: HTMLElement} & ReturnType;\ntype EmojiTabCategory = StickersTabCategory;\nexport default class EmojiTab extends EmoticonsTabC {\n private closeScrollTop: number;\n\n constructor(managers: AppManagers) {\n super(\n managers,\n 'super-emojis',\n () => EMOJI_ELEMENT_SIZE,\n 16,\n 4,\n 0\n );\n }\n\n private onCategoryVisibility = ({target, visible}: Pick) => {\n const category = this.categoriesMap.get(target);\n // console.log(target, visible, category);\n // if(category.local) return;\n\n const renderer = category.elements.renderer;\n const newChildren: HTMLElement[] = [];\n if(renderer) {\n newChildren.push(renderer);\n const customEmojis: Parameters[0] = new Map();\n if(visible) {\n newChildren.push(...category.items.map(({docId, element}) => {\n // return element;\n\n // if(element.firstElementChild) {\n // return element;\n // }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear(false);\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n // element.append(customEmojiElement);\n return element;\n }));\n\n renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, undefined, false);\n } else {\n renderer.clearCanvas();\n renderer.middlewareHelper.clean();\n }\n } else if(visible) {\n newChildren.push(...category.items.map(({element}) => element));\n }\n\n // if(visible)\n category.elements.items.replaceChildren(...newChildren);\n\n if(renderer && !visible) {\n const customEmojis: Parameters[0] = new Map();\n category.items.forEach(({element}) => {\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear();\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n });\n\n /* const promise = */renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, true);\n // promise.then(() => {\n // customEmojis.forEach((elements) => {\n // elements.forEach((element) => {\n // if(!element.innerHTML) {\n // console.log('no thumb', element);\n // // debugger;\n // }\n // });\n // });\n\n // const set = customEmojis.get('5766933926429854499');\n // console.log(`wrapped ${customEmojis.size} thumbs`, set && set.values().next().value.innerHTML);\n // });\n }\n\n // if(!visible) {\n // const customEmojis: Parameters[0] = {};\n // category.items.forEach((item) => {\n // const {element, document} = item;\n // if(!element.firstElementChild) {\n // return;\n // }\n\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n // customEmojis[customEmojiElement.docId] = new Set([customEmojiElement]);\n // element.firstElementChild.replaceWith(customEmojiElement);\n // });\n\n // renderer.add(customEmojis, EmoticonsDropdown.lazyLoadQueue);\n // }\n };\n\n public init() {\n super.init();\n\n this.content = document.getElementById('content-emoji') as HTMLDivElement;\n\n const menuWrapper = this.content.previousElementSibling as HTMLElement;\n const menu = this.menu = menuWrapper.firstElementChild as HTMLElement;\n const menuScroll = this.menuScroll = new ScrollableX(menuWrapper);\n\n const emojiScroll = this.scrollable = new Scrollable(this.content, 'EMOJI');\n\n const intersectionOptions: IntersectionObserverInit = {root: emoticonsDropdown.getElement()};\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n const m = this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, menu, emojiScroll, menuScroll, undefined);\n\n const preloader = putPreloader(this.content, true);\n\n const x = new ScrollableX(undefined);\n x.container.classList.add('menu-horizontal-inner-scroll');\n\n const innerScrollWrapper = document.createElement('div');\n innerScrollWrapper.classList.add('menu-horizontal-inner');\n innerScrollWrapper.append(x.container);\n\n prepare().forEach((emojis, [titleLangPackKey, icon]) => {\n const category = this.createLocalCategory(titleLangPackKey, titleLangPackKey, icon, !icon);\n category.elements.container.classList.remove('hide');\n category.elements.items.classList.add(icon ? 'is-local' : 'not-local');\n\n emojis.forEach((unified) => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n const 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 this.addEmojiToCategory(category, {emoji}, true);\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n });\n\n Promise.all([\n pause(200),\n this.managers.appEmojiManager.getRecentEmojis('native'),\n this.managers.appEmojiManager.getRecentEmojis('custom'),\n this.managers.appEmojiManager.getCustomEmojis()\n ]).then(([_, recent, recentCustom, sets]) => {\n preloader.remove();\n\n const recentCategory = this.categories[EMOJI_RECENT_ID];\n const recentCustomCategory = this.categories[CUSTOM_EMOJI_RECENT_ID];\n\n [[recentCategory, recent] as const, [recentCustomCategory, recentCustom] as const].forEach(([category, recent]) => {\n category.limit = RECENT_MAX_LENGTH;\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n });\n\n for(const emoji of recent) {\n this.addEmojiToCategory(recentCategory, {emoji}, true);\n }\n\n this.createRendererForCategory(recentCustomCategory);\n for(const docId of recentCustom) {\n this.addEmojiToCategory(recentCustomCategory, {emoji: '', docId}, true);\n }\n recentCustomCategory.elements.container.style.paddingTop = '.5rem';\n\n EMOJI_CATEGORIES.forEach(([id]) => {\n const category = this.categories[id];\n this.toggleLocalCategory(category, true);\n\n if(id !== EMOJI_RECENT_ID && id !== CUSTOM_EMOJI_RECENT_ID) {\n category.menuScroll = x;\n x.container.append(category.elements.menuTab);\n }\n });\n\n this.resizeCategories();\n\n recentCategory.elements.menuTab.after(innerScrollWrapper);\n\n sets.sets.forEach((set) => {\n this.renderStickerSet(set);\n });\n\n rootScope.addEventListener('premium_toggle', () => {\n this.toggleCustomCategory();\n });\n\n rootScope.addEventListener('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(category) {\n this.positionCategory(category, true);\n\n emoticonsDropdown.addEventListener('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }\n }));\n\n const toggleRenderers = (ignore: boolean) => {\n for(const id in this.categories) {\n const category = this.categories[id];\n const renderer = category.elements.renderer;\n if(renderer) {\n renderer.ignoreSettingDimensions = ignore;\n if(!ignore) {\n renderer.setDimensionsFromRect(undefined, true);\n }\n }\n }\n };\n\n emoticonsDropdown.addEventListener('opened', () => {\n toggleRenderers(false);\n });\n\n emoticonsDropdown.addEventListener('close', () => {\n toggleRenderers(true);\n });\n\n rootScope.addEventListener('stickers_installed', (set) => {\n if(!this.categories[set.id] && set.pFlags.emojis) {\n this.renderStickerSet(set, true);\n }\n });\n\n rootScope.addEventListener('stickers_deleted', (set) => {\n const category = this.categories[set.id];\n if(this.deleteCategory(category)) {\n const {renderer} = category.elements;\n if(renderer) {\n renderer.middlewareHelper.clean();\n }\n }\n });\n\n rootScope.addEventListener('emoji_recent', this.postponedEvent((emoji) => {\n const category = this.categories[emoji.docId ? CUSTOM_EMOJI_RECENT_ID : EMOJI_RECENT_ID];\n\n const verify: (item: EmojiTabItem) => boolean = emoji.docId ? (item) => item.docId === emoji.docId : (item) => item.emoji === emoji.emoji;\n const found = findAndSplice(category.items, verify);\n if(found) {\n category.items.unshift(found);\n if(this.isCategoryVisible(category)) {\n const {renderer} = category.elements;\n positionElementByIndex(found.element, category.elements.items, renderer ? 1 : 0, -1);\n renderer?.forceRender();\n }\n } else {\n this.addEmojiToCategory(category, emoji, false, true);\n }\n\n if(this.closeScrollTop === 0) {\n this.menuOnClickResult.setActive(emoji.docId ? this.categories[EMOJI_RECENT_ID] : category);\n }\n }));\n\n appImManager.addEventListener('peer_changed', () => {\n this.toggleCustomCategory();\n });\n\n this.toggleCustomCategory();\n\n this.menuOnClickResult.setActive(recentCategory);\n });\n\n attachClickEvent(this.content, this.onContentClick);\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: new ListenerSetter()});\n this.init = null;\n }\n\n private renderStickerSet(set: StickerSet.stickerSet, prepend?: boolean) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n this.positionCategory(category, prepend);\n const {container, menuTabPadding} = category.elements;\n category.elements.items.classList.add('not-local');\n category.elements.container.classList.add('is-premium-set');\n category.elements.title.classList.add('tgico');\n\n this.createRendererForCategory(category);\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n promise.then(({documents}) => {\n documents.forEach((document) => {\n this.addEmojiToCategory(category, {docId: document.id, emoji: (document as Document.document).stickerEmojiRaw}, true);\n });\n\n // if(this.isCategoryVisible(category)) {\n // category.elements.items.append(...category.items.map(({element}) => element));\n // }\n\n this.onCategoryVisibility({target: category.elements.container, visible: this.isCategoryVisible(category)});\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private get peerId() {\n return appImManager.chat.peerId;\n }\n\n private toggleCustomCategory() {\n const category = this.categories[CUSTOM_EMOJI_RECENT_ID];\n const hasPremium = rootScope.premium || this.peerId === rootScope.myId;\n super.toggleLocalCategory(category, !!category.items.length && hasPremium);\n this.content.classList.toggle('has-premium', hasPremium);\n }\n\n protected toggleLocalCategory(category: EmojiTabCategory, visible: boolean) {\n if(category.id === CUSTOM_EMOJI_RECENT_ID) {\n this.toggleCustomCategory();\n return;\n }\n\n super.toggleLocalCategory(category, visible);\n }\n\n private createRendererForCategory(category: EmojiTabCategory) {\n const renderer = CustomEmojiRendererElement.create({\n animationGroup: EMOTICONSSTICKERGROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji\n });\n\n category.elements.renderer = renderer;\n category.elements.items.append(renderer);\n }\n\n private addEmojiToCategory(category: EmojiTabCategory, emoji: ReturnType, batch?: boolean, prepend?: boolean) {\n let element: HTMLElement;\n if(emoji.docId) {\n const customEmojiElement = CustomEmojiElement.create(emoji.docId);\n const span = document.createElement('span');\n span.classList.add(/* 'emoji', */'super-emoji');\n span.append(customEmojiElement);\n element = span;\n } else {\n element = appendEmoji(emoji.emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, undefined, false/* , false */);\n }\n\n const item: typeof category['items'][0] = {\n ...emoji,\n element\n };\n\n category.items[prepend ? 'unshift' : 'push'](item);\n if(!batch && !this.spliceExceed(category)) {\n this.onLocalCategoryUpdate(category);\n }\n }\n\n // private addEmojisToCategory(category: EmojiTabCategory, emojis: string[], prepend?: boolean) {\n // emojis.forEach((emoji) => {\n // this.addEmojiToCategory(category, emoji, true, prepend);\n // });\n\n // this.onLocalCategoryUpdate(category);\n // }\n\n private onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n\n const {target} = e;\n\n if(findUpClassName(target, 'category-title')) {\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}, true).show();\n return;\n }\n\n const emoji = getEmojiFromElement(target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n if(emoji.docId && !rootScope.premium && this.peerId !== rootScope.myId) {\n const a = document.createElement('a');\n a.onclick = () => {\n appImManager.openUsername({userName: 'premiumbot'});\n hideToast();\n };\n toastNew({\n langPackKey: 'CustomEmoji.PremiumAlert',\n langPackArguments: [a]\n });\n return;\n }\n\n appImManager.chat.input.onEmojiSelected(emoji, false);\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n public onClose() {\n this.closeScrollTop = this.scrollable.scrollTop;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\n private elementsMap: Map = new Map();\n\n constructor(\n parallelLimit?: number,\n protected onVisibilityChange?: OnVisibilityChange,\n options?: IntersectionObserverInit\n ) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n\n const queueItem = this.elementsMap.get(target);\n queueItem.visible = visible;\n\n if(visible) {\n queueItem.wasSeen = true;\n if(!this.queue.includes(queueItem)) {\n this.queue.push(queueItem);\n }\n } else {\n indexOfAndSplice(this.queue, queueItem);\n }\n\n this.onVisibilityChange?.(item);\n this.setProcessQueueTimeout();\n }, options);\n }\n\n public clear() {\n super.clear();\n this.elementsMap.clear();\n }\n\n /* public async processItem(item: LazyLoadElement) {\n //await super.processItem(item);\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\n\n if(this.lazyLoadMedia.length) {\n this.processQueue();\n }\n } */\n\n public observe(el: LazyLoadElement) {\n this.elementsMap.set(el.div, el);\n super.observe(el);\n }\n\n public unobserve(el: LazyLoadElement) {\n this.elementsMap.delete(el.div);\n super.unobserve(el);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab} from '..';\r\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\r\nimport mediaSizes from '../../../helpers/mediaSizes';\r\nimport {Document, MessagesAllStickers, StickerSet} from '../../../layer';\r\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\r\nimport {AppManagers} from '../../../lib/appManagers/managers';\r\nimport {i18n, LangPackKey} from '../../../lib/langPack';\r\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\r\nimport LazyLoadQueue from '../../lazyLoadQueue';\r\nimport LazyLoadQueueRepeat from '../../lazyLoadQueueRepeat';\r\nimport {putPreloader} from '../../putPreloader';\r\nimport PopupStickers from '../../popups/stickers';\r\nimport Scrollable, {ScrollableX} from '../../scrollable';\r\nimport StickyIntersector from '../../stickyIntersector';\r\nimport findAndSplice from '../../../helpers/array/findAndSplice';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\r\nimport noop from '../../../helpers/noop';\r\nimport ButtonIcon from '../../buttonIcon';\r\nimport confirmationPopup from '../../confirmationPopup';\r\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\r\nimport createStickersContextMenu from '../../../helpers/dom/createStickersContextMenu';\r\nimport findUpAsChild from '../../../helpers/dom/findUpAsChild';\r\nimport forEachReverse from '../../../helpers/array/forEachReverse';\r\nimport attachStickerViewerListeners from '../../stickerViewer';\r\nimport ListenerSetter from '../../../helpers/listenerSetter';\r\nimport wrapSticker from '../../wrappers/sticker';\r\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\r\nimport {MediaSize} from '../../../helpers/mediaSize';\r\nimport {AnyFunction} from '../../../types';\r\nimport {IgnoreMouseOutType} from '../../../helpers/dropdownHover';\r\n\r\nexport class SuperStickerRenderer {\r\n public lazyLoadQueue: LazyLoadQueueRepeat;\r\n private animated: Set = new Set();\r\n\r\n constructor(\r\n private regularLazyLoadQueue: LazyLoadQueue,\r\n private group: AnimationItemGroup,\r\n private managers: AppManagers,\r\n private options?: IntersectionObserverInit\r\n ) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, ({target, visible}) => {\r\n if(!visible) {\r\n this.processInvisible(target);\r\n }\r\n }, options);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n public renderSticker(doc: MyDocument, element?: HTMLElement, loadPromises?: Promise[]) {\r\n if(!element) {\r\n element = document.createElement('div');\r\n element.classList.add('grid-item', 'super-sticker');\r\n element.dataset.docId = '' + doc.id;\r\n\r\n if(doc.animated) {\r\n this.observeAnimated(element);\r\n }\r\n }\r\n\r\n // * This will wrap only a thumb\r\n /* !doc.animated && */wrapSticker({\r\n doc,\r\n div: element,\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 element;\r\n }\r\n\r\n public observeAnimated(element: HTMLElement) {\r\n this.animated.add(element);\r\n this.lazyLoadQueue.observe({\r\n div: element,\r\n load: this.processVisible\r\n });\r\n }\r\n\r\n public unobserveAnimated(element: HTMLElement) {\r\n this.animated.delete(element);\r\n this.lazyLoadQueue.delete({div: element});\r\n }\r\n\r\n private checkAnimationContainer = (element: HTMLElement, visible: boolean) => {\r\n // console.error('checkAnimationContainer', div, visible);\r\n const players = animationIntersector.getAnimations(element);\r\n players.forEach((player) => {\r\n if(!visible) {\r\n animationIntersector.removeAnimation(player);\r\n } else {\r\n animationIntersector.checkAnimation(player, false);\r\n }\r\n });\r\n };\r\n\r\n private processVisible = async(element: HTMLElement) => {\r\n const docId = element.dataset.docId;\r\n const doc = await this.managers.appDocsManager.getDoc(docId);\r\n\r\n const size = mediaSizes.active.esgSticker.width;\r\n\r\n // console.log('processVisibleDiv:', element);\r\n\r\n const promise = wrapSticker({\r\n doc,\r\n div: element,\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 withLock: true\r\n }).then(({render}) => render);\r\n\r\n promise.then(() => {\r\n // clearTimeout(timeout);\r\n this.checkAnimationContainer(element, this.lazyLoadQueue.intersector.isVisible(element));\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 processInvisible = async(element: HTMLElement) => {\r\n const docId = element.dataset.docId;\r\n const doc = await this.managers.appDocsManager.getDoc(docId);\r\n\r\n // console.log('STICKER INvisible:', /* div, */docId);\r\n\r\n this.checkAnimationContainer(element, false);\r\n\r\n element.textContent = '';\r\n this.renderSticker(doc, element as HTMLDivElement);\r\n };\r\n}\r\n\r\nexport type StickersTabCategoryItem = {element: HTMLElement};\r\n\r\nexport class StickersTabCategory = {}> {\r\n public elements: {\r\n container: HTMLElement,\r\n title: HTMLElement,\r\n items: HTMLElement,\r\n menuTab: HTMLElement,\r\n menuTabPadding: HTMLElement\r\n } & AdditionalElements;\r\n public items: Item[];\r\n public mounted: boolean;\r\n public id: string;\r\n public limit: number;\r\n\r\n private getContainerSize: () => {width: number, height: number};\r\n private getElementMediaSize: () => MediaSize;\r\n\r\n private gapX: number;\r\n private gapY: number;\r\n\r\n public set?: StickerSet;\r\n public local?: boolean;\r\n public menuScroll?: ScrollableX;\r\n\r\n constructor(options: {\r\n id: string,\r\n title: HTMLElement | DocumentFragment,\r\n overflowElement: HTMLElement,\r\n getContainerSize: StickersTabCategory['getContainerSize'],\r\n getElementMediaSize: StickersTabCategory['getElementMediaSize'],\r\n gapX: number,\r\n gapY: number,\r\n noMenuTab?: boolean\r\n }) {\r\n const container = document.createElement('div');\r\n container.classList.add('emoji-category');\r\n\r\n const items = document.createElement('div');\r\n items.classList.add('category-items');\r\n\r\n let title: HTMLElement;\r\n if(options.title) {\r\n title = document.createElement('div');\r\n title.classList.add('category-title');\r\n title.append(options.title);\r\n }\r\n\r\n let menuTab: HTMLElement, menuTabPadding: HTMLElement;\r\n if(!options.noMenuTab) {\r\n menuTab = ButtonIcon(undefined, {noRipple: true});\r\n menuTab.classList.add('menu-horizontal-div-item');\r\n\r\n menuTabPadding = document.createElement('div');\r\n menuTabPadding.classList.add('menu-horizontal-div-item-padding');\r\n\r\n menuTab.append(menuTabPadding);\r\n }\r\n\r\n if(title) container.append(title);\r\n container.append(items);\r\n\r\n this.elements = {\r\n container,\r\n title,\r\n items,\r\n menuTab,\r\n menuTabPadding\r\n } as any;\r\n this.id = options.id;\r\n this.items = [];\r\n\r\n this.getContainerSize = options.getContainerSize;\r\n this.getElementMediaSize = options.getElementMediaSize;\r\n this.gapX = options.gapX ?? 0;\r\n this.gapY = options.gapY ?? 0;\r\n }\r\n\r\n public setCategoryItemsHeight() {\r\n const {width: containerWidth} = this.getContainerSize();\r\n const elementSize = this.getElementMediaSize().width;\r\n\r\n let itemsPerRow = containerWidth / elementSize;\r\n if(this.gapX && (itemsPerRow - 1) * this.gapX > containerWidth) --itemsPerRow;\r\n itemsPerRow = Math.floor(itemsPerRow);\r\n\r\n const rows = Math.ceil(this.items.length / itemsPerRow);\r\n let height = rows * elementSize;\r\n if(this.gapY) height += (rows - 1) * this.gapY;\r\n\r\n this.elements.items.style.minHeight = height + 'px';\r\n }\r\n}\r\n\r\nexport class EmoticonsTabC> implements EmoticonsTab {\r\n public content: HTMLElement;\r\n public menuScroll: ScrollableX;\r\n\r\n protected categories: {[id: string]: Category};\r\n protected categoriesMap: Map;\r\n protected categoriesByMenuTabMap: Map;\r\n protected categoriesIntersector: VisibilityIntersector;\r\n protected localCategories: Category[];\r\n\r\n public scrollable: Scrollable;\r\n protected menu: HTMLElement;\r\n protected mounted = false;\r\n protected menuOnClickResult: ReturnType;\r\n\r\n public tabId: number;\r\n\r\n protected postponedEvents: {cb: AnyFunction, args: any[]}[];\r\n\r\n constructor(\r\n protected managers: AppManagers,\r\n protected categoryItemsClassName: string,\r\n protected getElementMediaSize: () => MediaSize,\r\n protected padding: number,\r\n protected gapX: number,\r\n protected gapY: number\r\n ) {\r\n this.categories = {};\r\n this.categoriesMap = new Map();\r\n this.categoriesByMenuTabMap = new Map();\r\n this.localCategories = [];\r\n this.postponedEvents = [];\r\n }\r\n\r\n public getCategoryByContainer(container: HTMLElement) {\r\n return this.categoriesMap.get(container);\r\n }\r\n\r\n public getCategoryByMenuTab(menuTab: HTMLElement) {\r\n return this.categoriesByMenuTabMap.get(menuTab);\r\n }\r\n\r\n protected createCategory(stickerSet: StickerSet, title: HTMLElement | DocumentFragment, isLocal?: boolean, noMenuTab?: boolean) {\r\n const category: Category = new StickersTabCategory({\r\n id: '' + stickerSet.id,\r\n title,\r\n overflowElement: this.content,\r\n getContainerSize: () => {\r\n const {width, height} = this.content.getBoundingClientRect();\r\n return {width: width - this.padding, height};\r\n },\r\n getElementMediaSize: this.getElementMediaSize,\r\n gapX: this.gapX,\r\n gapY: this.gapY,\r\n noMenuTab\r\n }) as any;\r\n\r\n if(this.categoryItemsClassName) {\r\n category.elements.items.classList.add(this.categoryItemsClassName);\r\n }\r\n\r\n const container = category.elements.container;\r\n container.classList.add('hide');\r\n\r\n category.set = stickerSet;\r\n this.categories[stickerSet.id] = category;\r\n this.categoriesMap.set(container, category);\r\n !noMenuTab && this.categoriesByMenuTabMap.set(category.elements.menuTab, category);\r\n\r\n this.categoriesIntersector.observe(container);\r\n !noMenuTab && this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(container);\r\n\r\n if(!isLocal) {\r\n !noMenuTab && category.elements.menuTab.classList.add('not-local');\r\n }\r\n\r\n return category;\r\n }\r\n\r\n protected positionCategory(category: Category, prepend?: boolean) {\r\n const {menuTab, container} = category.elements;\r\n const posItems = prepend ? this.localCategories.filter((category) => category.mounted).length : 0xFFFF;\r\n let foundMenuScroll = false;\r\n const posMenu = prepend ? this.localCategories.filter((category) => {\r\n if(category.menuScroll && !foundMenuScroll) {\r\n foundMenuScroll = true;\r\n return true;\r\n }\r\n\r\n return category.mounted && !category.menuScroll && category.elements.menuTab;\r\n }).length : 0xFFFF;\r\n positionElementByIndex(container, this.scrollable.container, posItems);\r\n positionElementByIndex(menuTab, this.menu, posMenu);\r\n }\r\n\r\n protected isCategoryVisible(category: Category) {\r\n return this.categoriesIntersector.getVisible().includes(category.elements.container);\r\n }\r\n\r\n protected toggleLocalCategory(category: Category, visible: boolean) {\r\n if(!visible) {\r\n category.elements.menuTab?.remove();\r\n category.elements.container.remove();\r\n } else {\r\n const idx = this.localCategories.indexOf(category);\r\n const sliced = this.localCategories.slice(0, idx);\r\n let notMountedItems = 0, notMountedMenus = 0;\r\n sliced.forEach((category) => {\r\n if(!category.mounted) {\r\n ++notMountedItems;\r\n ++notMountedMenus;\r\n } else if(!category.elements.menuTab || category.menuScroll) {\r\n ++notMountedMenus;\r\n }\r\n });\r\n const itemsIdx = idx - notMountedItems, menuIdx = idx - notMountedMenus;\r\n category.elements.menuTab && positionElementByIndex(category.elements.menuTab, this.menu, menuIdx);\r\n positionElementByIndex(category.elements.container, this.scrollable.container, itemsIdx);\r\n }\r\n\r\n category.mounted = visible;\r\n // category.elements.container.classList.toggle('hide', !visible);\r\n }\r\n\r\n protected createLocalCategory(id: string, title: LangPackKey | '', icon?: string, noMenuTab?: boolean) {\r\n const category = this.createCategory({id} as any, title && i18n(title), true, noMenuTab);\r\n category.local = true;\r\n this.localCategories.push(category);\r\n if(category.elements.title) {\r\n category.elements.title.classList.add('disable-hover');\r\n }\r\n\r\n if(!noMenuTab) {\r\n if(icon) {\r\n category.elements.menuTab.classList.add('tgico', 'tgico-' + icon);\r\n }\r\n\r\n category.elements.menuTabPadding.remove();\r\n }\r\n\r\n this.toggleLocalCategory(category, false);\r\n return category;\r\n }\r\n\r\n protected onLocalCategoryUpdate(category: Category) {\r\n category.setCategoryItemsHeight();\r\n this.toggleLocalCategory(category, !!category.items.length);\r\n }\r\n\r\n protected resizeCategories = () => {\r\n for(const [container, category] of this.categoriesMap) {\r\n category.setCategoryItemsHeight();\r\n }\r\n };\r\n\r\n protected deleteCategory(category: Category) {\r\n if(category) {\r\n category.elements.container.remove();\r\n category.elements.menuTab.remove();\r\n this.categoriesIntersector.unobserve(category.elements.container);\r\n delete this.categories[category.id];\r\n this.categoriesMap.delete(category.elements.container);\r\n this.categoriesByMenuTabMap.delete(category.elements.menuTab);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n protected spliceExceed(category: Category) {\r\n if(category.limit === undefined) {\r\n return false;\r\n }\r\n\r\n const {items, limit} = category;\r\n items.splice(limit, items.length - limit).forEach(({element}) => {\r\n element.remove();\r\n });\r\n\r\n this.onLocalCategoryUpdate(category);\r\n\r\n return true;\r\n }\r\n\r\n public init() {\r\n emoticonsDropdown.addEventListener('closed', () => {\r\n this.postponedEvents.forEach(({cb, args}) => {\r\n cb(...args);\r\n });\r\n\r\n this.postponedEvents.length = 0;\r\n });\r\n }\r\n\r\n protected postponedEvent = (cb: (...args: K[]) => void) => {\r\n return (...args: K[]) => {\r\n if(emoticonsDropdown.isActive()) {\r\n this.postponedEvents.push({cb, args});\r\n } else {\r\n cb(...args);\r\n }\r\n };\r\n };\r\n}\r\n\r\ntype StickersTabItem = {element: HTMLElement, document: Document.document};\r\nexport default class StickersTab extends EmoticonsTabC> {\r\n private superStickerRenderer: SuperStickerRenderer;\r\n\r\n constructor(managers: AppManagers) {\r\n super(\r\n managers,\r\n 'super-stickers',\r\n () => mediaSizes.active.esgSticker,\r\n 3 * 2,\r\n 4,\r\n 4\r\n );\r\n }\r\n\r\n private setFavedLimit(limit: number) {\r\n const category = this.categories['faved'];\r\n category.limit = limit;\r\n }\r\n\r\n private categoryAppendStickers(\r\n category: StickersTabCategory,\r\n promise: Promise\r\n ) {\r\n const {container} = category.elements;\r\n\r\n promise.then((documents) => {\r\n const isVisible = this.isCategoryVisible(category);\r\n\r\n documents.forEach((document) => {\r\n const element = this.superStickerRenderer.renderSticker(document);\r\n category.items.push({document, element});\r\n\r\n if(isVisible) {\r\n category.elements.items.append(element);\r\n }\r\n });\r\n\r\n category.setCategoryItemsHeight();\r\n container.classList.remove('hide');\r\n });\r\n }\r\n\r\n private async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\r\n const category = this.createCategory(set, wrapEmojiText(set.title));\r\n const {menuTabPadding} = category.elements;\r\n\r\n const promise = this.managers.appStickersManager.getStickerSet(set);\r\n this.categoryAppendStickers(\r\n category,\r\n promise.then((stickerSet) => stickerSet.documents as MyDocument[])\r\n );\r\n\r\n this.positionCategory(category, prepend);\r\n\r\n wrapStickerSetThumb({\r\n set,\r\n container: menuTabPadding,\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 private onCategoryVisibility = ({target, visible, entry}: OnVisibilityChangeItem) => {\r\n const category = this.categoriesMap.get(target);\r\n category.elements.items.replaceChildren(...(!visible ? [] : category.items.map(({element}) => element)));\r\n };\r\n\r\n public init() {\r\n super.init();\r\n\r\n this.content = document.getElementById('content-stickers');\r\n const menuWrapper = this.content.previousElementSibling as HTMLElement;\r\n const menu = this.menu = menuWrapper.firstElementChild as HTMLElement;\r\n const menuScroll = this.menuScroll = new ScrollableX(menuWrapper);\r\n\r\n this.scrollable = new Scrollable(this.content, 'STICKERS');\r\n this.scrollable.onAdditionalScroll = () => {\r\n this.setTyping();\r\n };\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 const intersectionOptions: IntersectionObserverInit = {root: emoticonsDropdown.getElement()};\r\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\r\n\r\n const clearCategoryItems = (category: StickersTabCategory) => {\r\n category.elements.items.replaceChildren();\r\n category.items.forEach(({element}) => this.superStickerRenderer.unobserveAnimated(element));\r\n category.items.length = 0;\r\n };\r\n\r\n this.scrollable.container.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n if(findUpClassName(target, 'category-title')) {\r\n const container = findUpClassName(target, 'emoji-category');\r\n const category = this.categoriesMap.get(container);\r\n if(category.local) {\r\n return;\r\n }\r\n\r\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}).show();\r\n return;\r\n }\r\n\r\n EmoticonsDropdown.onMediaClick(e);\r\n });\r\n\r\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, menu, this.scrollable, menuScroll);\r\n\r\n const preloader = putPreloader(this.content, true);\r\n\r\n const onCategoryStickers = (category: StickersTabCategory, stickers: MyDocument[]) => {\r\n // if(category.id === 'faved' && category.limit && category.limit < stickers.length) {\r\n // category.limit = stickers.length;\r\n // }\r\n\r\n if(category.limit) {\r\n stickers = stickers.slice(0, category.limit);\r\n }\r\n\r\n const ids = new Set(stickers.map((doc) => doc.id));\r\n forEachReverse(category.items, (item) => {\r\n if(!ids.has(item.document.id)) {\r\n this.deleteSticker(category, item.document, true);\r\n }\r\n });\r\n\r\n this.toggleLocalCategory(category, !!stickers.length);\r\n forEachReverse(stickers, (doc, idx) => {\r\n this.unshiftSticker(category, doc, true, idx);\r\n });\r\n this.spliceExceed(category);\r\n category.elements.container.classList.remove('hide');\r\n };\r\n\r\n const favedCategory = this.createLocalCategory('faved', 'FavoriteStickers', 'savedmessages');\r\n // favedCategory.elements.menuTab.classList.add('active');\r\n\r\n const recentCategory = this.createLocalCategory('recent', 'Stickers.Recent', 'recent');\r\n recentCategory.limit = 20;\r\n\r\n const clearButton = ButtonIcon('close', {noRipple: true});\r\n recentCategory.elements.title.append(clearButton);\r\n attachClickEvent(clearButton, () => {\r\n confirmationPopup({\r\n titleLangKey: 'ClearRecentStickersAlertTitle',\r\n descriptionLangKey: 'ClearRecentStickersAlertMessage',\r\n button: {\r\n langKey: 'Clear'\r\n }\r\n }).then(() => {\r\n this.managers.appStickersManager.clearRecentStickers();\r\n }, noop);\r\n });\r\n\r\n const premiumCategory = this.createLocalCategory('premium', 'PremiumStickersShort');\r\n const s = document.createElement('span');\r\n s.classList.add('tgico-star', 'color-premium');\r\n premiumCategory.elements.menuTab.append(s);\r\n\r\n const promises = [\r\n Promise.all([\r\n this.managers.apiManager.getLimit('favedStickers'),\r\n this.managers.appStickersManager.getFavedStickersStickers()\r\n ]).then(([limit, stickers]) => {\r\n this.setFavedLimit(limit);\r\n onCategoryStickers(favedCategory, stickers);\r\n }),\r\n\r\n this.managers.appStickersManager.getRecentStickersStickers().then((stickers) => {\r\n onCategoryStickers(recentCategory, stickers);\r\n }),\r\n\r\n this.managers.appStickersManager.getAllStickers().then((res) => {\r\n for(const set of (res as MessagesAllStickers.messagesAllStickers).sets) {\r\n this.renderStickerSet(set);\r\n }\r\n }),\r\n\r\n this.managers.appStickersManager.getPremiumStickers().then((stickers) => {\r\n const length = stickers.length;\r\n this.toggleLocalCategory(premiumCategory, rootScope.premium && !!length);\r\n this.categoryAppendStickers(premiumCategory, Promise.resolve(stickers));\r\n\r\n rootScope.addEventListener('premium_toggle', (isPremium) => {\r\n this.toggleLocalCategory(this.categories['premium'], isPremium && !!length);\r\n });\r\n })\r\n ];\r\n\r\n Promise.race(promises).finally(() => {\r\n preloader.remove();\r\n });\r\n\r\n Promise.all(promises).finally(() => {\r\n this.mounted = true;\r\n this.setTyping();\r\n\r\n const favedCategory = this.categories['faved'];\r\n const recentCategory = this.categories['recent'];\r\n this.menuOnClickResult.setActive(favedCategory.items.length ? favedCategory : recentCategory);\r\n\r\n rootScope.addEventListener('stickers_installed', (set) => {\r\n if(!this.categories[set.id]) {\r\n this.renderStickerSet(set, true);\r\n }\r\n });\r\n });\r\n\r\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP, this.managers, intersectionOptions);\r\n\r\n const rendererLazyLoadQueue = this.superStickerRenderer.lazyLoadQueue;\r\n emoticonsDropdown.addLazyLoadQueueRepeat(rendererLazyLoadQueue, this.superStickerRenderer.processInvisible);\r\n\r\n // emoticonsDropdown.addEventListener('close', () => {\r\n // this.categoriesIntersector.lock();\r\n // });\r\n\r\n // emoticonsDropdown.addEventListener('closed', () => {\r\n // for(const [container] of this.categoriesMap) {\r\n // onCategoryVisibility(container, false);\r\n // }\r\n // });\r\n\r\n // emoticonsDropdown.addEventListener('opened', () => {\r\n // this.categoriesIntersector.unlockAndRefresh();\r\n // });\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(\r\n // 'STICKERS RENDERED IN PANEL:',\r\n // players.length,\r\n // players.filter((p) => !p.paused).length,\r\n // rendererLazyLoadQueue.intersector.getVisible().length\r\n // );\r\n // }, .25e3);\r\n\r\n rootScope.addEventListener('sticker_updated', ({type, document, faved}) => {\r\n // if(type === 'faved') {\r\n // return;\r\n // }\r\n\r\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\r\n if(category) {\r\n if(faved) {\r\n this.unshiftSticker(category, document);\r\n } else {\r\n this.deleteSticker(category, document);\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_deleted', ({id}) => {\r\n const category = this.categories[id];\r\n if(this.deleteCategory(category)) {\r\n clearCategoryItems(category);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_top', this.postponedEvent((id) => {\r\n const category = this.categories[id];\r\n if(category) {\r\n this.positionCategory(category, true);\r\n emoticonsDropdown.addEventListener('openAfterLayout', () => {\r\n this.menuOnClickResult.setActiveStatic(category);\r\n }, {once: true});\r\n }\r\n }));\r\n\r\n rootScope.addEventListener('stickers_updated', ({type, stickers}) => {\r\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\r\n if(category) {\r\n onCategoryStickers(category, stickers);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('app_config', () => {\r\n this.managers.apiManager.getLimit('favedStickers').then((limit) => {\r\n this.setFavedLimit(limit);\r\n });\r\n });\r\n\r\n mediaSizes.addEventListener('resize', this.resizeCategories);\r\n\r\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: new ListenerSetter()});\r\n\r\n const type: IgnoreMouseOutType = 'menu';\r\n createStickersContextMenu({\r\n listenTo: this.content,\r\n verifyRecent: (target) => !!findUpAsChild(target, this.categories['recent'].elements.items),\r\n onOpen: () => {\r\n emoticonsDropdown.setIgnoreMouseOut(type, true);\r\n },\r\n onClose: () => {\r\n emoticonsDropdown.setIgnoreMouseOut(type, false);\r\n }\r\n });\r\n\r\n this.init = null;\r\n }\r\n\r\n public deleteSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean) {\r\n const item = findAndSplice(category.items, (item) => item.document.id === doc.id);\r\n if(item) {\r\n item.element.remove();\r\n\r\n if(!batch) {\r\n this.onLocalCategoryUpdate(category);\r\n }\r\n }\r\n }\r\n\r\n public unshiftSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean, idx?: number) {\r\n if(idx !== undefined) {\r\n const i = category.items[idx];\r\n if(i && i.document.id === doc.id) {\r\n return;\r\n }\r\n }\r\n\r\n let item = findAndSplice(category.items, (item) => item.document.id === doc.id);\r\n if(!item) {\r\n item = {\r\n element: this.superStickerRenderer.renderSticker(doc),\r\n document: doc\r\n };\r\n }\r\n\r\n category.items.unshift(item);\r\n category.elements.items.prepend(item.element);\r\n\r\n if(!batch) {\r\n this.spliceExceed(category);\r\n }\r\n }\r\n\r\n public unshiftRecentSticker(doc: MyDocument) {\r\n this.managers.appStickersManager.saveRecentSticker(doc.id);\r\n }\r\n\r\n public deleteRecentSticker(doc: MyDocument) {\r\n this.managers.appStickersManager.saveRecentSticker(doc.id, true);\r\n }\r\n\r\n public setTyping = (cancel = false) => {\r\n if(!cancel && (!emoticonsDropdown.isActive() || emoticonsDropdown.tab !== this)) {\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('choosing_sticker', !cancel);\r\n };\r\n\r\n public onClosed() {\r\n this.setTyping(true);\r\n }\r\n\r\n public onOpened() {\r\n this.setTyping();\r\n this.resizeCategories();\r\n }\r\n}\r\n","import {_i18n} from '../lib/langPack';\n\nexport default function generateFakeIcon(isScam?: boolean) {\n const span = document.createElement('span');\n span.classList.add('badge-fake');\n _i18n(span, isScam ? 'ScamMessage' : 'FakeMessage');\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, protected onVisibilityChange?: OnVisibilityChange) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\n if(visible && spliced.length) {\n spliced.forEach((item) => {\n this.queue.unshift(item);\n });\n }\n\n this.onVisibilityChange && this.onVisibilityChange(item);\n this.setProcessQueueTimeout();\n });\n }\n\n public observe(el: LazyLoadElement) {\n super.observe(el);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\r\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\r\nimport Scrollable from './scrollable';\r\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport calcImageInBox from '../helpers/calcImageInBox';\r\nimport {doubleRaf} from '../helpers/schedulers';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport rootScope from '../lib/rootScope';\r\nimport LazyLoadQueueRepeat2 from './lazyLoadQueueRepeat2';\r\nimport wrapVideo from './wrappers/video';\r\nimport noop from '../helpers/noop';\r\n\r\nconst width = 400;\r\nconst maxSingleWidth = width - 100;\r\nconst height = 100;\r\n\r\nexport default class GifsMasonry {\r\n public lazyLoadQueue: LazyLoadQueueRepeat2;\r\n private scrollPromise: CancellablePromise = Promise.resolve();\r\n private timeout: number = 0;\r\n private managers: AppManagers;\r\n\r\n constructor(\r\n private element: HTMLElement,\r\n private group: AnimationItemGroup,\r\n private scrollable: Scrollable,\r\n attach = true\r\n ) {\r\n this.managers = rootScope.managers;\r\n\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, ({target, visible}) => {\r\n if(visible) {\r\n this.processVisibleDiv(target);\r\n } else {\r\n this.processInvisibleDiv(target);\r\n }\r\n });\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = animationIntersector.byGroups[group];\r\n\r\n if(players) {\r\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter((p) => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\r\n }\r\n }, .25e3); */\r\n\r\n if(attach) {\r\n this.attach();\r\n }\r\n }\r\n\r\n private onScroll = () => {\r\n if(this.timeout) {\r\n clearTimeout(this.timeout);\r\n } else {\r\n this.scrollPromise = deferredPromise();\r\n // animationIntersector.checkAnimations(true, group);\r\n }\r\n\r\n this.timeout = window.setTimeout(() => {\r\n this.timeout = 0;\r\n this.scrollPromise.resolve();\r\n // animationIntersector.checkAnimations(false, group);\r\n }, 150);\r\n };\r\n\r\n public attach() {\r\n this.scrollable.container.addEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public detach() {\r\n this.clear();\r\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n private processVisibleDiv(div: HTMLElement) {\r\n const video = div.querySelector('video');\r\n if(video) {\r\n return;\r\n }\r\n\r\n const load = () => {\r\n const docId = div.dataset.docId;\r\n const promise = Promise.all([this.managers.appDocsManager.getDoc(docId), this.scrollPromise]).then(async([doc]) => {\r\n const res = await wrapVideo({\r\n doc,\r\n container: div as HTMLDivElement,\r\n lazyLoadQueue: null,\r\n // lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n group: this.group,\r\n noInfo: true,\r\n noPreview: true\r\n });\r\n\r\n const promise = res.loadPromise;\r\n promise.finally(() => {\r\n const video = div.querySelector('video');\r\n const thumb = div.querySelector('img, canvas');\r\n\r\n // div.style.opacity = '';\r\n thumb && thumb.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.removeAnimation(item);\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 thumb = div.querySelector('img, canvas');\r\n\r\n if(thumb) {\r\n thumb.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.removeAnimation(item);\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 const div = document.createElement('div');\r\n div.classList.add('gif', 'grid-item'/* , '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: noop as any});\r\n\r\n // let preloader = new ProgressivePreloader(div);\r\n\r\n wrapVideo({\r\n doc,\r\n container: div as HTMLDivElement,\r\n lazyLoadQueue: null,\r\n noInfo: true,\r\n onlyPreview: true\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 {TransitionSlider} from './transition';\r\nimport {ScrollableX} from './scrollable';\r\nimport rootScope from '../lib/rootScope';\r\nimport {fastRaf} from '../helpers/schedulers';\r\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\r\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\r\nimport whichChild from '../helpers/dom/whichChild';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\n\r\nexport function horizontalMenu(\r\n tabs: HTMLElement,\r\n content: HTMLElement,\r\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean | Promise,\r\n onTransitionEnd?: () => void,\r\n transitionTime = 200,\r\n scrollableX?: ScrollableX,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd, undefined, listenerSetter);\r\n\r\n if(!tabs) {\r\n return selectTab;\r\n }\r\n\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n\r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = async(target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const result1 = onClick(id, tabContent, animate);\r\n const canChange = result1 instanceof Promise ? await result1 : result1;\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew({\r\n element: target.parentElement.children[id] as HTMLElement,\r\n position: 'center',\r\n forceDirection: animate ? undefined : FocusDirection.Static,\r\n forceDuration: transitionTime,\r\n axis: 'x'\r\n });\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n\r\n const mutateCallback = animate ? fastRaf : (cb: () => void) => cb();\r\n\r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n if(prev) {\r\n mutateCallback(() => {\r\n prev.classList.remove('active');\r\n });\r\n }\r\n\r\n // a great stripe from Jolly Cobra\r\n if(useStripe && prevId !== -1 && animate) {\r\n mutateCallback(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n\r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n\r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n\r\n // console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n\r\n fastRaf(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n\r\n mutateCallback(() => {\r\n target.classList.add('active');\r\n });\r\n\r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n // const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n attachClickEvent(tabs, (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n target = findUpAsChild(target, tabs);\r\n\r\n // console.log('tabs click:', target);\r\n\r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n }, {listenerSetter});\r\n\r\n return proxy;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport simulateEvent from '../helpers/dom/dispatchEvent';\r\nimport documentFragmentToHTML from '../helpers/dom/documentFragmentToHTML';\r\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport findUpTag from '../helpers/dom/findUpTag';\r\nimport getCaretPosNew from '../helpers/dom/getCaretPosNew';\r\nimport getRichValueWithCaret from '../helpers/dom/getRichValueWithCaret';\r\nimport isInputEmpty from '../helpers/dom/isInputEmpty';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport RichInputHandler, {USING_BOMS} from '../helpers/dom/richInputHandler';\r\nimport selectElementContents from '../helpers/dom/selectElementContents';\r\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\r\nimport BOM from '../helpers/string/bom';\r\nimport {MessageEntity} from '../layer';\r\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\r\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\r\nimport mergeEntities from '../lib/richTextProcessor/mergeEntities';\r\nimport parseEntities from '../lib/richTextProcessor/parseEntities';\r\nimport wrapDraftText from '../lib/richTextProcessor/wrapDraftText';\r\nimport {createCustomFiller, CustomEmojiElement, CustomEmojiRendererElement, insertCustomFillers, renderEmojis} from '../lib/richTextProcessor/wrapRichText';\r\n\r\nexport async function insertRichTextAsHTML(input: HTMLElement, text: string, entities: MessageEntity[], wrappingForPeerId: PeerId) {\r\n const loadPromises: Promise[] = [];\r\n const wrappingCustomEmoji = entities?.some((entity) => entity._ === 'messageEntityCustomEmoji');\r\n const renderer = wrappingCustomEmoji ? createCustomEmojiRendererForInput() : undefined;\r\n const fragment = wrapDraftText(text, {entities, wrappingForPeerId, loadPromises, customEmojiRenderer: renderer});\r\n const something = fragment.querySelectorAll('[contenteditable=\"false\"]');\r\n something.forEach((el) => {\r\n el.contentEditable = 'inherit';\r\n el.classList.add('pc');\r\n });\r\n\r\n loadPromises.length && await Promise.all(loadPromises);\r\n\r\n fragment.querySelectorAll('.input-selectable').forEach((el) => {\r\n el.prepend(createCustomFiller(true));\r\n });\r\n\r\n const richInputHandler = USING_BOMS ? RichInputHandler.getInstance() : undefined;\r\n // const restore = richInputHandler.prepareApplyingMarkdown();\r\n\r\n // fragment.querySelectorAll('.input-filler').forEach((el) => el.remove());\r\n\r\n // const fillers = Array.from(input.querySelectorAll('.input-filler')).map((el) => {\r\n // el.contentEditable = 'false';\r\n // return el;\r\n // });\r\n\r\n const customEmojiElements = Array.from(fragment.querySelectorAll('.custom-emoji-placeholder')).map((el) => {\r\n el.dataset.ces = '1';\r\n return (el as any).customEmojiElement as CustomEmojiElement;\r\n });\r\n\r\n const html = documentFragmentToHTML(fragment);\r\n renderer?.disconnectedCallback();\r\n\r\n console.log(html);\r\n\r\n const pre = getCaretPosNew(input);\r\n // console.log('pre', pre);\r\n let textNode: ChildNode, textNodeValue: string;\r\n if(pre.node) {\r\n // if(pre.node?.nodeValue === BOM && false) {\r\n // textNode = document.createTextNode(textNodeValue = BOM);\r\n // (pre.node.parentNode as any as ChildNode).after(textNode);\r\n // pre.selection.modify('extend', 'forward', 'character');\r\n // pre.selection.collapseToEnd();\r\n // }\r\n } else {\r\n const range = document.createRange();\r\n let node = input.lastChild;\r\n if(!node) {\r\n input.append(node /* = textNode */ = document.createTextNode(''));\r\n }\r\n\r\n range.setStartAfter(node);\r\n range.collapse(true);\r\n pre.selection.removeAllRanges();\r\n pre.selection.addRange(range);\r\n }\r\n\r\n // const fragmentLastChild = fragment.lastChild;\r\n\r\n // const s = document.createElement('span');\r\n // (node as ChildNode).replaceWith(s);\r\n // s.append(node);\r\n input.addEventListener('input', cancelEvent, {capture: true, once: true});\r\n richInputHandler?.onBeforeInput({inputType: 'insertContent'});\r\n window.document.execCommand('insertHTML', false, html);\r\n Array.from(input.querySelectorAll('[data-ces]')).forEach((el, idx) => {\r\n delete el.dataset.ces;\r\n const customEmojiElement = customEmojiElements[idx];\r\n (el as any).customEmojiElement = customEmojiElement;\r\n customEmojiElement.placeholder = el;\r\n });\r\n // fillers.forEach((el) => {\r\n // el.contentEditable = 'inherit';\r\n // });\r\n input.querySelectorAll('.pc').forEach((el) => {\r\n el.contentEditable = 'false';\r\n });\r\n if(textNode) {\r\n const {nodeValue} = textNode;\r\n if(nodeValue === textNodeValue) {\r\n textNode.remove();\r\n } else {\r\n (textNode as CharacterData).replaceData(nodeValue.indexOf(textNodeValue), textNodeValue.length, '');\r\n }\r\n }\r\n // restore();\r\n richInputHandler?.removeExtraBOMs(input);\r\n simulateEvent(input, 'input');\r\n\r\n // if(textNode) {\r\n // const selection = document.getSelection();\r\n // const node = fragmentLastChild.nextSibling || fragmentLastChild;\r\n // const range = document.createRange();\r\n // range.setStartAfter(node);\r\n // range.collapse(true);\r\n // selection.removeAllRanges();\r\n // selection.addRange(range);\r\n // }\r\n\r\n // const after = getCaretPosNew(input);\r\n // console.log('after', after);\r\n // if(after.node?.nodeValue === BOM) {\r\n // const smth = findUpClassName(after.node.parentElement, 'input-something');\r\n // if(smth) {\r\n // const selection = document.getSelection();\r\n // const node = smth.nextSibling;\r\n // const range = document.createRange();\r\n // range.setStartAfter(node);\r\n // range.collapse(true);\r\n // selection.removeAllRanges();\r\n // selection.addRange(range);\r\n\r\n // // if(after.offset === 0) after.selection.modify('extend', 'forward', 'character');\r\n // // after.selection.modify('extend', 'forward', 'character');\r\n // // after.selection.collapseToEnd();\r\n // }\r\n // }\r\n\r\n // setCaretAt(fragmentLastChild.nextSibling);\r\n\r\n // console.log('ASD');\r\n}\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n const input = findUpAttribute(e.target, 'contenteditable=\"true\"');\r\n if(!input) {\r\n return;\r\n }\r\n\r\n const noLinebreaks = !!input.dataset.noLinebreaks;\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\r\n const filterEntity = (e: MessageEntity) => e._ === 'messageEntityEmoji' || (e._ === 'messageEntityLinebreak' && !noLinebreaks);\r\n if(noLinebreaks) {\r\n const regExp = /[\\r\\n]/g;\r\n plainText = plainText.replace(regExp, '');\r\n html = html.replace(regExp, '');\r\n }\r\n\r\n const peerId = (input.dataset.peerId || NULL_PEER_ID).toPeerId();\r\n if(html.trim()) {\r\n html = html.replace(//, '');\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 // const s = cleanHTML(html, true) as NodeList;\r\n // console.log(s);\r\n\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(html, 'text/html');\r\n const span = doc.body || document.createElement('body');\r\n\r\n // const span: HTMLElement = document.createElement('span');\r\n // span.innerHTML = html;\r\n // span.append(...Array.from(s));\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n const nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === curChild.TEXT_NODE) {\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 = getRichValueWithCaret(span, true, false);\r\n\r\n const canWrapCustomEmojis = !!peerId;\r\n if(!canWrapCustomEmojis) {\r\n richValue.entities = richValue.entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\r\n }\r\n\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length || richValue.entities.find((entity) => entity._ === 'messageEntityCustomEmoji')) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n\r\n let entities2 = parseEntities(text);\r\n entities2 = entities2.filter(filterEntity);\r\n mergeEntities(entities, entities2);\r\n }\r\n }\r\n\r\n if(usePlainText) {\r\n text = plainText;\r\n entities = parseEntities(text);\r\n entities = entities.filter(filterEntity);\r\n }\r\n\r\n insertRichTextAsHTML(input, text, entities, peerId);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey,\r\n label?: LangPackKey,\r\n labelOptions?: any[],\r\n labelText?: string | DocumentFragment,\r\n name?: string,\r\n maxLength?: number,\r\n showLengthOn?: number,\r\n plainText?: true,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean,\r\n inputMode?: 'tel' | 'numeric',\r\n withLinebreaks?: boolean,\r\n autocomplete?: string\r\n};\r\n\r\nfunction createCustomEmojiRendererForInput() {\r\n const renderer = CustomEmojiRendererElement.create({\r\n wrappingDraft: true,\r\n isSelectable: true\r\n });\r\n return renderer;\r\n}\r\n\r\nfunction processCustomEmojisInInput(input: HTMLElement) {\r\n const customEmojiElements = Array.from(input.querySelectorAll('.custom-emoji, .custom-emoji-placeholder'));\r\n let renderer = input.querySelector('.custom-emoji-renderer');\r\n if(!renderer && customEmojiElements.length) {\r\n renderer = createCustomEmojiRendererForInput();\r\n input.prepend(renderer);\r\n } else if(renderer && !customEmojiElements.length) {\r\n renderer.remove();\r\n return;\r\n }\r\n\r\n if(!renderer) {\r\n return;\r\n }\r\n\r\n const customEmojis: Parameters[0] = new Map();\r\n customEmojiElements.forEach((element) => {\r\n const customEmojiElement = element instanceof CustomEmojiElement ? element : (element as any).customEmojiElement as CustomEmojiElement;\r\n const {docId} = customEmojiElement;\r\n let set = customEmojis.get(docId);\r\n if(!set) {\r\n customEmojis.set(docId, set = new Set());\r\n }\r\n\r\n set.add(customEmojiElement);\r\n });\r\n\r\n for(const [docId, customEmojiElements] of customEmojis) {\r\n let hasSet = renderer.customEmojis.get(docId);\r\n if(hasSet) {\r\n for(const customEmojiElement of hasSet) {\r\n if(!customEmojiElements.has(customEmojiElement)) {\r\n customEmojiElement.disconnectedCallback();\r\n }\r\n }\r\n } else {\r\n hasSet = new Set();\r\n }\r\n\r\n for(const customEmojiElement of customEmojiElements) {\r\n if(!hasSet.has(customEmojiElement)) {\r\n customEmojiElement.connectedCallback();\r\n }\r\n }\r\n }\r\n\r\n renderer.add(customEmojis, false);\r\n renderer.forceRender();\r\n}\r\n\r\nexport default class InputField {\r\n public container: HTMLElement;\r\n public input: 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 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, autocomplete} = options;\r\n const label = options.label || options.labelText;\r\n\r\n const onInputCallbacks: Array<() => void> = [];\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 input = this.container.firstElementChild as HTMLElement;\r\n input.contentEditable = '' + !!canBeEdited;\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 RichInputHandler.getInstance();\r\n\r\n input.addEventListener('mousedown', (e) => {\r\n const selection = document.getSelection();\r\n if(!selection.isCollapsed) {\r\n return;\r\n }\r\n\r\n const placeholder = findUpTag(e.target, 'IMG');\r\n if(!placeholder) {\r\n return;\r\n }\r\n\r\n const rect = placeholder.getBoundingClientRect();\r\n const centerX = rect.left + rect.width / 2;\r\n const focusOnNext = e.clientX >= centerX;\r\n\r\n const range = document.createRange();\r\n range.setStartAfter(focusOnNext ? placeholder : placeholder.previousSibling ?? placeholder);\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n });\r\n\r\n onInputCallbacks.push(() => {\r\n // console.log('input');\r\n // return;\r\n // * because if delete all characters there will br left\r\n if(isInputEmpty(input)) {\r\n // const textNode = Array.from(input.childNodes).find((node) => node.nodeType === node.TEXT_NODE) || document.createTextNode('');\r\n input.replaceChildren();\r\n // input.append(document.createTextNode('')); // need first text node to support history stack\r\n }\r\n\r\n // const fillers = Array.from(input.querySelectorAll('.emoji-filler')) as HTMLElement[];\r\n // fillers.forEach((filler) => {\r\n // const textContent = filler.textContent;\r\n // if(textContent === BOM) {\r\n // return;\r\n // }\r\n\r\n // if(textContent) {\r\n\r\n // } else {\r\n // let curChild = filler.firstChild;\r\n // while(curChild) {\r\n // curChild = curChild.nextSibling;\r\n // }\r\n // }\r\n\r\n // filler.classList.remove('emoji-filler');\r\n // });\r\n\r\n // Array.from(input.querySelectorAll('br, span:empty')).forEach((el) => {\r\n // const parentElement = el.parentElement;\r\n // (parentElement === input ? el : parentElement).remove();\r\n // });\r\n USING_BOMS && Array.from(input.querySelectorAll('br:not(.br-not-br)')).forEach((el) => {\r\n // const parentElement = el.parentElement;\r\n el.remove();\r\n // if(!parentElement.children.length && !parentElement.textContent) {\r\n // parentElement.textContent = '';\r\n // }\r\n });\r\n\r\n insertCustomFillers(Array.from(input.querySelectorAll('.input-something')));\r\n\r\n processCustomEmojisInInput(input);\r\n\r\n // .forEach((el) => el.remove());\r\n });\r\n\r\n // ! childList for paste first symbol\r\n // observer.observe(input, {characterData: true, childList: true, subtree: true});\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(options.inputMode) {\r\n input.inputMode = options.inputMode;\r\n }\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\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 if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n const onInput = () => {\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 : [...getRichValueWithCaret(input, false, 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 onInputCallbacks.push(onInput);\r\n }\r\n\r\n const noLinebreaks = !options.withLinebreaks;\r\n if(noLinebreaks && !plainText) {\r\n input.dataset.noLinebreaks = '1';\r\n input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n e.preventDefault();\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n if(onInputCallbacks.length) {\r\n input.addEventListener('input', () => {\r\n onInputCallbacks.forEach((callback) => callback());\r\n });\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n setInnerHTML(this.label, this.options.labelText);\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n get value(): string {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValueWithCaret(this.input, false, false).value;\r\n // return getRichValue(this.input);\r\n }\r\n\r\n set value(value: Parameters[1]) {\r\n this.setValueSilently(value, true);\r\n this.simulateInputEvent();\r\n }\r\n\r\n public simulateInputEvent() {\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: Parameters[1], fromSet?: boolean) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value as string;\r\n } else {\r\n replaceContent(this.input, value);\r\n processCustomEmojisInInput(this.input);\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?: boolean) {\r\n if(!this.options.plainText) {\r\n value = documentFragmentToHTML(wrapDraftText(value));\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false);\r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent?: boolean) {\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 } else {\r\n this.setLabel();\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","// 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\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 const 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 VisibilityIntersector, {OnVisibilityChangeItem} from './visibilityIntersector';\r\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\r\nimport findAndSplice from '../helpers/array/findAndSplice';\r\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\r\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\r\n\r\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\r\n constructor(parallelLimit?: number, ignoreHeavyAnimation?: boolean) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\r\n\r\n !ignoreHeavyAnimation && useHeavyAnimationCheck(() => {\r\n this.lock();\r\n }, () => {\r\n this.unlockAndRefresh();\r\n });\r\n }\r\n\r\n private onVisibilityChange = ({target, visible}: OnVisibilityChangeItem) => {\r\n // if(DEBUG) {\r\n // this.log('isIntersecting', target, visible);\r\n // }\r\n\r\n // if visible - will move to the end of visible arary\r\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {\r\n if(visible) {\r\n item.wasSeen = true;\r\n }\r\n\r\n item.visible = visible;\r\n const index = this.queue.findIndex((item) => !item.visible);\r\n this.queue.splice(Math.max(0, index), 0, item);\r\n });\r\n\r\n this.setProcessQueueTimeout();\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.observe(el);\r\n /* if(el.wasSeen) {\r\n this.processQueue(el);\r\n } else */\r\n el.wasSeen ??= false;\r\n\r\n return true;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueBase, {LazyLoadElementBase} from './lazyLoadQueueBase';\nimport VisibilityIntersector from './visibilityIntersector';\n\nexport type LazyLoadElement = Omit & {\n load: (target?: HTMLElement) => Promise,\n div: HTMLElement\n wasSeen?: boolean,\n visible?: boolean\n};\n\nexport default class LazyLoadQueueIntersector extends LazyLoadQueueBase {\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n public intersector: VisibilityIntersector;\n protected intersectorTimeout: number;\n\n constructor(parallelLimit?: number) {\n super(parallelLimit);\n }\n\n public lock() {\n super.lock();\n this.intersector.lock();\n }\n\n public unlock() {\n super.unlock();\n this.intersector.unlock();\n }\n\n public unlockAndRefresh() {\n super.unlock();\n this.intersector.unlockAndRefresh();\n }\n\n public clear() {\n super.clear();\n this.intersector.disconnect();\n }\n\n public refresh() {\n this.intersector.refresh();\n }\n\n protected loadItem(item: LazyLoadElement) {\n return item.load(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const item = this.queue.find((i) => i.div === el.div && i.load === el.load);\n if(item) {\n return false;\n } else {\n for(const item of this.inProcess) {\n if(item.div === el.div && item.load === el.load) {\n return false;\n }\n }\n }\n\n this.queue[method](el);\n return true;\n }\n\n protected setProcessQueueTimeout() {\n this.intersectorTimeout ??= window.setTimeout(() => {\n this.intersectorTimeout = undefined;\n this.processQueue();\n }, 0);\n }\n\n public push(el: LazyLoadElement) {\n super.push(el);\n }\n\n public unshift(el: LazyLoadElement) {\n super.unshift(el);\n }\n\n public delete(el: Omit) {\n findAndSpliceAll(this.queue, (i) => i.div === el.div);\n this.unobserve(el);\n }\n\n public observe(el: LazyLoadElement) {\n this.intersector.observe(el.div);\n }\n\n public unobserve(el: Omit) {\n this.intersector.unobserve(el.div);\n }\n}\n","/*\n * 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 const 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {FontFamily, FontSize, FontWeight} from '../config/font';\r\nimport getTextWidth from '../helpers/canvas/getTextWidth';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport clamp from '../helpers/number/clamp';\r\nimport {fastRaf} from '../helpers/schedulers';\r\n\r\n// Thanks to https://stackoverflow.com/a/49349813\r\n\r\n/**\r\n * Attibute modifier to create middle ellipsis\r\n * When the attribute value is left blank the ellipsis will be in the middle\r\n * When positive the attribute value will be used as a percentage\r\n * When negative the attribute value will be used as character index counted from the end\r\n * @example\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n */\r\nconst ellipsis = '…';\r\nconst map: Map = new Map();\r\n\r\nconst testQueue: Set = new Set();\r\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 let fontSize = element.dataset.fontSize;\r\n if(fontSize && +fontSize) fontSize += 'px';\r\n // const perf = performance.now();\r\n font = `${element.dataset.fontWeight || FontWeight} ${fontSize || 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 const 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","/*\r\n * https://github.com/morethanwords/tweb\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.helpers.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.helpers.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[0].style.display = 'none';\r\n }\r\n\r\n this.animation.canvas[0].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[0].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[0].style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas[0].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 cancelEvent from '../helpers/dom/cancelEvent';\r\nimport InputField, {InputFieldOptions} from './inputField';\r\n\r\nexport class PasswordInputHelpers {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(public container: HTMLElement, public input: 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 // * 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 /* 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 const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n container.classList.add('input-field-password');\r\n 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\nexport default class PasswordInputField extends InputField {\r\n public helpers: PasswordInputHelpers;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n this.helpers = new PasswordInputHelpers(this.container, this.input as HTMLInputElement);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from '../environment/parallaxSupport';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport filterChatPhotosMessages from '../helpers/filterChatPhotosMessages';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ListLoader from '../helpers/listLoader';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Message, ChatFull, MessageAction, Photo} from '../layer';\nimport type {AppMessagesManager} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {openAvatarViewer} from './avatar';\nimport {putAvatar} from './putPhoto';\nimport Scrollable from './scrollable';\nimport SwipeHandler from './swipeHandler';\nimport wrapPhoto from './wrappers/photo';\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = IS_PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = IS_PARALLAX_SUPPORTED ? `translate3d({x}, 0, -1px) scale(${PeerProfileAvatars.SCALE})` : 'translate({x}, 0)';\n public container: HTMLElement;\n public avatars: HTMLElement;\n public gradient: HTMLElement;\n public info: HTMLElement;\n public arrowPrevious: HTMLElement;\n public arrowNext: HTMLElement;\n private tabs: HTMLDivElement;\n private listLoader: ListLoader;\n private peerId: PeerId;\n private intersectionObserver: IntersectionObserver;\n private loadCallbacks: Map void>;\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(\n public scrollable: Scrollable,\n private managers: AppManagers\n ) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n\n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n this.loadCallbacks = new Map();\n this.listenerSetter = new ListenerSetter();\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n return false;\n }\n\n return true;\n };\n\n const SWITCH_ZONE = 1 / 3;\n let cancel = false;\n let freeze = false;\n attachClickEvent(this.container, async(_e) => {\n if(freeze) {\n cancelEvent(_e);\n return;\n }\n\n if(cancel) {\n cancel = false;\n return;\n }\n\n if(!checkScrollTop()) {\n return;\n }\n\n const rect = this.container.getBoundingClientRect();\n\n // const e = (_e as TouchEvent).touches ? (_e as TouchEvent).touches[0] : _e as MouseEvent;\n const e = _e;\n const x = e.pageX;\n\n const clickX = x - rect.left;\n if((!this.listLoader.previous.length && !this.listLoader.next.length) ||\n (clickX > (rect.width * SWITCH_ZONE) && clickX < (rect.width - rect.width * SWITCH_ZONE))) {\n const peerId = this.peerId;\n\n const targets: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[] = [];\n this.listLoader.previous.concat(this.listLoader.current, this.listLoader.next).forEach((item, idx) => {\n targets.push({\n element: /* null */this.avatars.children[idx] as HTMLElement,\n item\n });\n });\n\n const prevTargets = targets.slice(0, this.listLoader.previous.length);\n const nextTargets = targets.slice(this.listLoader.previous.length + 1);\n\n const target = this.avatars.children[this.listLoader.previous.length] as HTMLElement;\n freeze = true;\n openAvatarViewer(target, peerId, () => peerId === this.peerId, this.listLoader.current, prevTargets, nextTargets);\n freeze = false;\n } else {\n const centerX = rect.right - (rect.width / 2);\n const toRight = x > centerX;\n\n // this.avatars.classList.remove('no-transition');\n // fastRaf(() => {\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n\n let distance: number;\n if(this.listLoader.index === 0 && !toRight) distance = this.listLoader.count - 1;\n else if(this.listLoader.index === (this.listLoader.count - 1) && toRight) distance = -(this.listLoader.count - 1);\n else distance = toRight ? 1 : -1;\n this.listLoader.go(distance);\n\n fastRaf(() => {\n this.avatars.classList.remove('no-transition');\n });\n // });\n }\n }, {listenerSetter: this.listenerSetter});\n\n const cancelNextClick = () => {\n cancel = true;\n document.body.addEventListener(IS_TOUCH_SUPPORTED ? 'touchend' : 'click', (e) => {\n cancel = false;\n }, {once: true});\n };\n\n let width = 0, x = 0, lastDiffX = 0, /* lastIndex = 0, */ minX = 0;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.avatars,\n onSwipe: (xDiff, yDiff) => {\n lastDiffX = xDiff;\n let lastX = x + xDiff * -PeerProfileAvatars.SCALE;\n if(lastX > 0) lastX = 0;\n else if(lastX < minX) lastX = minX;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', lastX + 'px');\n // console.log(xDiff, yDiff);\n return false;\n },\n verifyTouchTarget: (e) => {\n if(!checkScrollTop()) {\n cancelNextClick();\n cancelEvent(e);\n return false;\n } else if(this.container.classList.contains('is-single') || freeze) {\n return false;\n }\n\n return true;\n },\n onFirstSwipe: () => {\n const rect = this.avatars.getBoundingClientRect();\n width = rect.width;\n minX = -width * (this.tabs.childElementCount - 1);\n\n /* lastIndex = whichChild(this.tabs.querySelector('.active'));\n x = -width * lastIndex; */\n x = rect.left - this.container.getBoundingClientRect().left;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', x + 'px');\n\n this.container.classList.add('is-swiping');\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n },\n onReset: () => {\n const addIndex = Math.ceil(Math.abs(lastDiffX) / (width / PeerProfileAvatars.SCALE)) * (lastDiffX >= 0 ? 1 : -1);\n cancelNextClick();\n\n // console.log(addIndex);\n\n this.avatars.classList.remove('no-transition');\n fastRaf(() => {\n this.listLoader.go(addIndex);\n this.container.classList.remove('is-swiping');\n });\n }\n });\n\n this.intersectionObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if(!entry.isIntersecting) {\n return;\n }\n\n this.loadNearestToTarget(entry.target);\n });\n });\n\n /* this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(photo) {\n const id = photo.photo_id;\n const previous = this.listLoader.previous;\n for(let i = 0; i < previous.length; ++i) {\n if(previous[i] === id)\n }\n this.listLoader.previous.forEach((_id, idx, arr) => {});\n }\n }\n }); */\n }\n\n public async setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = anchor as any;\n return this.managers.appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then((value) => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise | ChatFull, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(this.managers.appProfileManager.getChatFull(peerId.toChatId()));\n }\n\n promises.push(this.managers.appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then(async(result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = findAndSplice(value.history, (message) => {\n return ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n\n listLoader.current = message || await this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n // console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n // const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n await this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = async(photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container', 'hide');\n\n this.avatars.append(avatar);\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ?\n await this.managers.appPhotosManager.getPhoto(photoId) :\n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = async() => {\n if(photo) {\n const res = await wrapPhoto({\n container: avatar,\n photo,\n size: choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n\n [res.images.thumb, res.images.full].filter(Boolean).forEach((img) => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n await putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n\n avatar.classList.remove('hide');\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n await loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach((target) => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.swipeHandler.removeListeners();\n this.intersectionObserver?.disconnect();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from '../environment/parallaxSupport';\nimport {copyTextToClipboard} from '../helpers/clipboard';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Chat, ChatFull, User, UserFull} from '../layer';\nimport type {Channel} from '../lib/appManagers/appChatsManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport I18n from '../lib/langPack';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport AvatarElement from './avatar';\nimport CheckboxField from './checkboxField';\nimport PeerProfileAvatars from './peerProfileAvatars';\nimport Row from './row';\nimport Scrollable from './scrollable';\nimport {SettingSection, generateDelimiter} from './sidebarLeft';\nimport {toast} from './toast';\nimport formatUserPhone from './wrappers/formatUserPhone';\nimport wrapPeerTitle from './wrappers/peerTitle';\n\nconst setText = (text: Parameters[1], row: Row) => {\n // fastRaf(() => {\n setInnerHTML(row.title, text || '');\n row.container.style.display = text ? '' : 'none';\n // });\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n private avatars: PeerProfileAvatars;\n private avatar: AvatarElement;\n private section: SettingSection;\n private name: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private bio: Row;\n private username: Row;\n private phone: Row;\n private notifications: Row;\n private location: Row;\n private link: Row;\n\n private cleaned: boolean;\n private setMoreDetailsTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n constructor(\n private managers: AppManagers,\n public scrollable: Scrollable,\n private listenerSetter?: ListenerSetter,\n private isDialog = true\n ) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n\n if(!listenerSetter) {\n this.listenerSetter = new ListenerSetter();\n }\n }\n\n public init() {\n this.init = null;\n\n\n this.element = document.createElement('div');\n this.element.classList.add('profile-content');\n\n this.section = new SettingSection({\n noDelimiter: true\n });\n\n this.avatar = new AvatarElement();\n this.avatar.classList.add('profile-avatar', 'avatar-120');\n this.avatar.isDialog = this.isDialog;\n this.avatar.attachClickEvent();\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitleLangKey: 'UserBio',\n icon: 'info',\n clickable: async(e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n\n const full = await this.managers.appProfileManager.getProfileByPeerId(this.peerId);\n copyTextToClipboard(full.about);\n toast(I18n.format('BioCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: async() => {\n const peer: Channel | User.user = await this.managers.appPeersManager.getPeer(this.peerId);\n copyTextToClipboard('@' + peer.username);\n toast(I18n.format('UsernameCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n this.phone = new Row({\n title: ' ',\n subtitleLangKey: 'Phone',\n icon: 'phone',\n clickable: async() => {\n const peer: User = await this.managers.appUsersManager.getUser(this.peerId);\n copyTextToClipboard('+' + peer.phone);\n toast(I18n.format('PhoneCopied', true));\n },\n listenerSetter: this.listenerSetter\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 listenerSetter: this.listenerSetter\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 listenerSetter: this.listenerSetter\n });\n\n listenerSetter.add(this.notifications.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n // let checked = this.notificationsCheckbox.checked;\n this.managers.appMessagesManager.togglePeerMute(this.peerId);\n });\n\n listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n this.section.content.append(this.notifications.container);\n }\n\n this.element.append(this.section.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.element.append(generateDelimiter());\n }\n\n listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n listenerSetter.add(rootScope)('peer_title_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.fillUsername();\n }\n });\n\n listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n if(this.peerId === userId.toPeerId()) {\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user.pFlags.self || !this.isDialog) {\n this.fillUserPhone();\n }\n }\n });\n\n listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n // const photo = appPeersManager.getPeerPhoto(peerId);\n // if(!photo && this.avatars) {\n this.setAvatar();\n // }\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n }\n\n private setPeerStatus = (needClear = false) => {\n const peerId = this.peerId;\n this.element.classList.toggle('is-me', peerId === rootScope.myId);\n if(!peerId || (rootScope.myId === peerId && this.isDialog)) return;\n\n return appImManager.setPeerStatus(\n peerId,\n this.subtitle,\n needClear,\n true,\n () => peerId === this.peerId,\n !this.isDialog\n ).then((callback) => {\n if(callback) {\n callback();\n }\n });\n };\n\n public cleanupHTML() {\n [\n this.bio,\n this.phone,\n this.username,\n this.location,\n this.link\n ].forEach((row) => {\n row.container.style.display = 'none';\n });\n\n if(this.notifications) {\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n }\n\n this.clearSetMoreDetailsTimeout();\n }\n\n private canBeDetailed() {\n return this.peerId !== rootScope.myId || !this.isDialog;\n }\n\n private async setAvatar() {\n if(this.canBeDetailed()) {\n const photo = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable, this.managers);\n await this.avatars.setPeer(this.peerId);\n this.avatars.info.append(this.name, this.subtitle);\n\n this.avatar.remove();\n\n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n\n return;\n }\n }\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars.cleanup();\n this.avatars = undefined;\n }\n\n await this.avatar.updateWithOptions({peerId: this.peerId});\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n }\n\n private async fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n return setText(username, this.username);\n }\n }\n\n private async fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const user = await this.managers.appUsersManager.getUser(peerId);\n return setText(user.phone ? formatUserPhone(user.phone) : undefined, this.phone);\n }\n }\n\n private async fillNotifications() {\n const notificationsRow = this.notifications;\n if(!notificationsRow) {\n return;\n }\n\n if(this.canBeDetailed()) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n notificationsRow.checkboxField.checked = !muted;\n } else {\n fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n });\n }\n }\n\n private async fillRows() {\n const peerId = this.peerId;\n\n await Promise.all([\n this.fillUsername(),\n this.fillUserPhone(),\n this.fillNotifications(),\n this.setMoreDetails(),\n (async() => {\n const [element/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: this.isDialog,\n withIcons: true\n })\n\n // generateTitleIcons(peerId)\n ]);\n replaceContent(this.name, element);\n // this.name.append(...icons);\n })(),\n this.setPeerStatus(true)\n ]);\n }\n\n public async fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n\n this.cleanupHTML();\n await Promise.all([\n this.setAvatar(),\n this.fillRows()\n ]);\n }\n\n private async _setMoreDetails(peerId: PeerId, peerFull: ChatFull | UserFull) {\n // if(peerFull.about) {\n setText(peerFull.about ? wrapRichText(peerFull.about) : undefined, this.bio);\n // }\n\n if(!peerId.isUser()) {\n const chat: Chat.channel = await this.managers.appChatsManager.getChat(peerId.toChatId());\n if(chat.username) {\n setText('https://t.me/' + chat.username, this.link);\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite?._ === 'chatInviteExported') {\n setText(exportedInvite.link, this.link);\n }\n }\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n setText(location.address, this.location);\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n }\n\n private async setMoreDetails(override?: true) {\n this.clearSetMoreDetailsTimeout();\n\n const peerId = this.peerId;\n const threadId = this.threadId;\n\n if(!peerId || await this.managers.appPeersManager.isRestricted(peerId) || !this.canBeDetailed()) {\n return;\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId, override);\n const setPromise = result.result.then(async(peerFull) => {\n if(this.peerId !== peerId || this.threadId !== threadId || await this.managers.appPeersManager.isRestricted(peerId)) {\n // this.log.warn('peer changed');\n return;\n }\n\n await this._setMoreDetails(peerId, peerFull);\n });\n\n if(result.cached) {\n await setPromise;\n }\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n this.init?.();\n\n this.peerId = peerId;\n this.threadId = threadId;\n\n this.cleaned = true;\n }\n\n public clearSetMoreDetailsTimeout() {\n if(this.setMoreDetailsTimeout !== undefined) {\n clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = undefined;\n }\n }\n\n public destroy() {\n this.peerId = this.threadId = undefined;\n this.clearSetMoreDetailsTimeout();\n clearInterval(this.setPeerStatusInterval);\n this.avatars?.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 mediaSizes from '../helpers/mediaSizes';\nimport {Middleware} from '../helpers/middleware';\nimport {Chat, Document, EmojiStatus, User} from '../layer';\nimport rootScope from '../lib/rootScope';\nimport generateFakeIcon from './generateFakeIcon';\nimport generatePremiumIcon from './generatePremiumIcon';\nimport generateVerifiedIcon from './generateVerifiedIcon';\nimport wrapSticker from './wrappers/sticker';\n\nexport default async function generateTitleIcons(\n peerId: PeerId,\n middleware?: Middleware,\n noVerifiedIcon?: boolean,\n noFakeIcon?: boolean,\n noPremiumIcon?: boolean\n) {\n const elements: Element[] = [];\n const peer: Chat | User = await rootScope.managers.appPeersManager.getPeer(peerId);\n if((peer as Chat.channel).pFlags.verified && !noVerifiedIcon) {\n elements.push(generateVerifiedIcon());\n }\n\n if(((peer as Chat.channel).pFlags.fake || (peer as User.user).pFlags.scam) && !noFakeIcon) {\n elements.push(generateFakeIcon((peer as User.user).pFlags.scam));\n }\n\n if((peer as User.user).pFlags.premium && !noPremiumIcon) {\n const emojiStatus = (peer as User.user).emoji_status;\n if(emojiStatus && emojiStatus._ !== 'emojiStatusEmpty' && false) {\n const container = document.createElement('span');\n container.classList.add('emoji-status');\n const result = await rootScope.managers.acknowledged.appEmojiManager.getCustomEmojiDocument((emojiStatus as EmojiStatus.emojiStatus).document_id);\n const wrap = async(doc: Document.document) => {\n const size = mediaSizes.active.emojiStatus\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n div: container,\n width: size.width,\n height: size.height,\n loop: 2,\n play: true,\n group: 'EMOJI-STATUS',\n loadPromises,\n middleware\n // group: 'none'\n });\n\n await Promise.all(loadPromises);\n };\n\n const p = result.result.then(wrap);\n if(result.cached) {\n await p;\n }\n\n elements.push(container);\n } else {\n elements.push(generatePremiumIcon());\n }\n }\n\n return elements;\n}\n","export default function generateVerifiedIcon() {\n const span = document.createElement('span');\n span.classList.add('verified-icon', 'tgico');\n\n const size = 26; // 24\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${size} ${size}`);\n svg.setAttributeNS(null, 'width', `${size}`);\n svg.setAttributeNS(null, 'height', `${size}`);\n svg.classList.add('verified-icon-svg');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-icon-background');\n use.classList.add('verified-icon-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-icon-check');\n use2.classList.add('verified-icon-check');\n\n // svg.append(use, use2);\n svg.append(use2, use);\n\n span.append(svg);\n\n return span;\n // const span = document.createElement('span');\n // span.classList.add('verified-icon', 'tgico-verified_filled');\n // return span;\n}\n","export default function generatePremiumIcon() {\n const span = document.createElement('span');\n span.classList.add('premium-icon', 'tgico-star');\n return span;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../lib/rootScope';\r\nimport {i18n} from '../lib/langPack';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\r\nimport limitSymbols from '../helpers/string/limitSymbols';\r\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport getPeerTitle from './wrappers/getPeerTitle';\r\nimport generateTitleIcons from './generateTitleIcons';\r\nimport {Middleware} from '../helpers/middleware';\r\n\r\nexport type PeerTitleOptions = {\r\n peerId?: PeerId,\r\n fromName?: string,\r\n plainText?: boolean,\r\n onlyFirstName?: boolean,\r\n dialog?: boolean,\r\n limitSymbols?: number,\r\n managers?: AppManagers,\r\n withIcons?: boolean,\r\n withPremiumIcon?: boolean,\r\n middleware?: Middleware\r\n};\r\n\r\nconst weakMap: WeakMap = new WeakMap();\r\n\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\r\n elements.forEach((element) => {\r\n const peerTitle = weakMap.get(element);\r\n peerTitle?.update();\r\n });\r\n});\r\n\r\nexport default class PeerTitle {\r\n public element: HTMLElement;\r\n public peerId: PeerId;\r\n private fromName: string;\r\n private plainText = false;\r\n private onlyFirstName = false;\r\n private dialog = false;\r\n private limitSymbols: number;\r\n private managers: AppManagers;\r\n private hasInner: boolean;\r\n private withIcons: boolean;\r\n private withPremiumIcon: boolean;\r\n private middleware: Middleware;\r\n\r\n constructor(options?: PeerTitleOptions) {\r\n this.element = document.createElement('span');\r\n this.element.classList.add('peer-title');\r\n this.element.setAttribute('dir', 'auto');\r\n\r\n if(options) {\r\n this.update(options);\r\n }\r\n\r\n weakMap.set(this.element, this);\r\n }\r\n\r\n public setOptions(options?: PeerTitleOptions) {\r\n if(!options) {\r\n return;\r\n }\r\n\r\n for(const i in options) {\r\n // @ts-ignore\r\n const value = options[i];\r\n\r\n if(typeof(value) !== 'object') {\r\n // @ts-ignore\r\n this.element.dataset[i] = value ? '' + (typeof(value) === 'boolean' ? +value : value) : '0';\r\n }\r\n\r\n // @ts-ignore\r\n this[i] = value;\r\n }\r\n }\r\n\r\n public async update(options?: PeerTitleOptions) {\r\n this.setOptions(options);\r\n\r\n let fromName = this.fromName;\r\n if(fromName !== undefined) {\r\n if(this.limitSymbols !== undefined) {\r\n fromName = limitSymbols(fromName, this.limitSymbols, this.limitSymbols);\r\n }\r\n\r\n setInnerHTML(this.element, wrapEmojiText(fromName));\r\n return;\r\n }\r\n\r\n this.peerId ??= NULL_PEER_ID;\r\n\r\n let hasInner: boolean;\r\n if(this.peerId !== rootScope.myId || !this.dialog) {\r\n const managers = this.managers ?? rootScope.managers;\r\n const [title, icons] = await Promise.all([\r\n getPeerTitle(this.peerId, this.plainText, this.onlyFirstName, this.limitSymbols, managers),\r\n (this.withIcons && generateTitleIcons(this.peerId, this.middleware)) || (this.withPremiumIcon && generateTitleIcons(this.peerId, this.middleware, true, true))\r\n ]);\r\n\r\n if(icons?.length) {\r\n const inner = document.createElement('span');\r\n inner.classList.add('peer-title-inner');\r\n hasInner = true;\r\n setInnerHTML(inner, title);\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(inner, ...icons);\r\n setInnerHTML(this.element, fragment);\r\n } else {\r\n setInnerHTML(this.element, title);\r\n }\r\n } else {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages'));\r\n }\r\n\r\n if(this.hasInner !== hasInner) {\r\n this.hasInner = hasInner;\r\n this.element.classList.toggle('with-icons', hasInner);\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 {AppDownloadManager} from '../../lib/appManagers/appDownloadManager';\r\nimport resizeableImage from '../../lib/cropper';\r\nimport PopupElement from '.';\r\nimport {_i18n} from '../../lib/langPack';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\r\nimport rootScope from '../../lib/rootScope';\r\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', {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 const ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement,\r\n container: HTMLDivElement,\r\n cropImage: HTMLImageElement,\r\n event_state: Partial<{\r\n mouse_x: number,\r\n mouse_y: number,\r\n container_width: number,\r\n container_height: number,\r\n container_left: number,\r\n container_top: number\r\n }> = {},\r\n keyZoomValue = 4.0,\r\n MINWIDTH = 50,\r\n MINHEIGHT = 50,\r\n CROPWIDTH = 200,\r\n CROPHEIGHT = 200,\r\n cropLeft = 0,\r\n cropTop = 0,\r\n cropWidth = 0,\r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n\r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n\r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n\r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n\r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n\r\n document.addEventListener('keypress', keyHandler, false);\r\n // document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n\r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n\r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n\r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n\r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n\r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n\r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n\r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n\r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n\r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n // crop();\r\n }\r\n\r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n\r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n\r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n\r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n\r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n\r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n\r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom),\r\n newHeight = Math.floor(container.clientHeight + zoom),\r\n w = cropImage.clientWidth,\r\n h = cropImage.clientHeight,\r\n left: number,\r\n top: number,\r\n right: number,\r\n bottom: number;\r\n\r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n\r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n\r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n // crop();\r\n }\r\n\r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n\r\n switch(String.fromCharCode(e.charCode)) {\r\n case '+':\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-':\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n\r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n\r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n saveEventState(e);\r\n\r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n\r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n\r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n\r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0},\r\n left: number,\r\n top: number,\r\n w: number,\r\n h: number;\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n\r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n\r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n // crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n\r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport type {PeerType} from '../../lib/appManagers/appPeersManager';\nimport {LangPackKey} from '../../lib/langPack';\nimport PeerTitle from '../peerTitle';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\n\nexport default class PopupDeleteDialog {\n constructor(\n private peerId: PeerId,\n // actionType: 'leave' | 'delete',\n private peerType?: PeerType,\n private onSelect?: (promise: Promise) => void\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, peerType, onSelect} = this;\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n const managers = PopupElement.MANAGERS;\n if(peerType === undefined) {\n peerType = await managers.appPeersManager.getDialogType(peerId);\n }\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = managers.appChatsManager.leave(peerId.toChatId());\n\n if(flush) {\n promise = promise.then(() => {\n return managers.appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n\n onSelect?.(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(peerId.isUser()) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = managers.appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n\n onSelect?.(promise);\n };\n\n let title: LangPackKey, description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n new PeerTitle({peerId}).element\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport {ChatType} from '../chat/chat';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport PeerTitle from '../peerTitle';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport filterAsync from '../../helpers/array/filterAsync';\n\nexport default class PopupDeleteMessages {\n constructor(private peerId: PeerId, private mids: number[], private type: ChatType, private onConfirm?: () => void) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, mids, type, onConfirm} = this;\n\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n const managers = PopupElement.MANAGERS;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n managers.appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n managers.appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n const buttons: PopupPeerOptions['buttons'] = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n const checkboxes: PopupPeerOptions['checkboxes'] = [];\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n\n if(await managers.appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n\n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId());\n\n const _hasRights = hasRights(chat, 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = _hasRights ? mids.slice() : await filterAsync(mids, async(mid) => {\n const message = await managers.appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n // description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\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 this.scrollable = this.selector.scrollable;\r\n this.attachScrollableListeners(this.scrollable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ripple from '../ripple';\r\nimport animationIntersector from '../animationIntersector';\r\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\r\nimport {i18n, LangPackKey, _i18n} from '../../lib/langPack';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\r\nimport {addFullScreenListener, getFullScreenElement} from '../../helpers/dom/fullScreen';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport overlayCounter from '../../helpers/overlayCounter';\r\nimport Scrollable from '../scrollable';\r\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: boolean,\r\n overlayClosable: boolean,\r\n withConfirm: LangPackKey | boolean,\r\n body: boolean,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean,\r\n scrollable: boolean,\r\n buttons: Array,\r\n title: boolean | LangPackKey\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): T;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\ntype PopupListeners = {\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n};\r\n\r\nexport default class PopupElement extends EventListenerBase {\r\n private static POPUPS: PopupElement[] = [];\r\n public static MANAGERS: AppManagers;\r\n\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n protected managers: AppManagers;\r\n\r\n protected scrollable: Scrollable;\r\n\r\n protected buttons: Array;\r\n\r\n protected middlewareHelper: MiddlewareHelper;\r\n\r\n constructor(className: string, 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\r\n if(options.title) {\r\n this.title.classList.add('popup-title');\r\n if(typeof(options.title) === 'string') {\r\n _i18n(this.title, options.title);\r\n }\r\n\r\n this.header.append(this.title);\r\n }\r\n\r\n this.middlewareHelper = getMiddleware();\r\n this.listenerSetter = new ListenerSetter();\r\n this.managers = PopupElement.MANAGERS;\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n // ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n if(options.scrollable) {\r\n const scrollable = this.scrollable = new Scrollable(this.body);\r\n this.attachScrollableListeners(scrollable);\r\n\r\n if(!this.body) {\r\n this.container.insertBefore(scrollable.container, this.header.nextSibling);\r\n }\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n const buttons = this.buttons = options.buttons;\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 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 protected attachScrollableListeners(scrollable: Scrollable) {\r\n const cb = scrollable.onAdditionalScroll;\r\n scrollable.onAdditionalScroll = () => {\r\n cb?.();\r\n scrollable.container.classList.toggle('scrolled-top', !scrollable.scrollTop);\r\n scrollable.container.classList.toggle('scrolled-bottom', scrollable.isScrolledDown);\r\n };\r\n\r\n scrollable.container.classList.add('scrolled-top', 'scrolled-bottom', 'scrollable-y-bordered');\r\n }\r\n\r\n protected onContentUpdate() {\r\n if(this.scrollable) {\r\n this.scrollable.onAdditionalScroll();\r\n }\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 this.onContentUpdate();\r\n\r\n if(!this.withoutOverlay) {\r\n overlayCounter.isOverlayActive = true;\r\n animationIntersector.checkAnimations2(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 if(!this.element.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(PopupElement.POPUPS[PopupElement.POPUPS.length - 1] !== this) {\r\n return;\r\n }\r\n\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 this.middlewareHelper.destroy();\r\n\r\n if(!this.withoutOverlay) {\r\n overlayCounter.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n this.scrollable?.destroy();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations2(false);\r\n }\r\n }, 150);\r\n }\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach((popup) => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopups(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.filter((element) => element instanceof popupConstructor) as T[];\r\n }\r\n\r\n public static createPopup>(ctor: {new(...args: A): T}, ...args: A) {\r\n const popup = new ctor(...args);\r\n return popup;\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find((b) => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport tsNow from '../../helpers/tsNow';\nimport {LangPackKey} from '../../lib/langPack';\nimport {MUTE_UNTIL} from '../../lib/mtproto/mtproto_config';\nimport {RadioFormFromValues} from '../row';\nimport PopupPeer from './peer';\n\nconst ONE_HOUR = 3600;\nconst times: {value: number | string, langPackKey: LangPackKey, checked?: boolean}[] = [{\n value: ONE_HOUR,\n langPackKey: 'ChatList.Mute.1Hour'\n}, {\n value: ONE_HOUR * 4,\n langPackKey: 'ChatList.Mute.4Hours'\n}, {\n value: ONE_HOUR * 8,\n langPackKey: 'ChatList.Mute.8Hours'\n}, {\n value: ONE_HOUR * 24,\n langPackKey: 'ChatList.Mute.1Day'\n}, {\n value: ONE_HOUR * 24 * 3,\n langPackKey: 'ChatList.Mute.3Days'\n}, {\n value: -1,\n langPackKey: 'ChatList.Mute.Forever',\n checked: true\n}];\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n this.managers.appMessagesManager.mutePeer(peerId, time === -1 ? MUTE_UNTIL : tsNow(true) + time);\n }\n }],\n body: true\n });\n\n let time: number;\n const radioForm = RadioFormFromValues(times, (value) => {\n time = +value;\n });\n\n this.body.append(radioForm);\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 AvatarElement from '../avatar';\nimport PopupElement, {addCancelButton, PopupButton, PopupOptions} from '.';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport CheckboxField, {CheckboxFieldOptions} from '../checkboxField';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = Omit & Partial<{\n peerId: PeerId,\n title: string | HTMLElement,\n titleLangKey: LangPackKey,\n titleLangArgs: any[],\n noTitle: boolean,\n description: string | DocumentFragment,\n descriptionLangKey: LangPackKey,\n descriptionLangArgs: any[],\n buttons: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n protected description: HTMLParagraphElement;\n\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), {\n overlayClosable: true,\n ...options,\n title: true,\n buttons: options.buttons && addCancelButton(options.buttons)\n });\n\n if(options.peerId) {\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('avatar-32');\n avatarEl.updateWithOptions({\n isDialog: true,\n peerId: options.peerId\n });\n this.header.prepend(avatarEl);\n }\n\n if(!options.noTitle) {\n if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs));\n else if(options.title instanceof HTMLElement) {\n this.title.append(options.title);\n } else this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = this.description = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) setInnerHTML(p, options.description);\n\n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n\n options.checkboxes.forEach((o) => {\n o.withRipple = true;\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 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', {closable: true, overlayClosable: true, body: true, title: 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: 'abitbigger',\r\n peerId: options.peerId,\r\n placeholder: options.placeholder,\r\n selfPresence: options.selfPresence,\r\n managers: this.managers\r\n });\r\n\r\n // this.scrollable = new Scrollable(this.body);\r\n\r\n this.title.append(this.selector.input);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupPeer from './peer';\n\nexport default class PopupSendNow extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-delete-chat', {\n title: `Send Message${mids.length > 1 ? 's' : ''} Now`,\n description: mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?',\n buttons: [{\n langKey: 'Send',\n callback: () => {\n onConfirm && onConfirm();\n this.managers.appMessagesManager.sendScheduledMessages(peerId, mids);\n }\n }]\n });\n\n this.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\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 {AppStickersManager} from '../../lib/appManagers/appStickersManager';\r\nimport PopupElement from '.';\r\nimport wrapSticker from '../wrappers/sticker';\r\nimport LazyLoadQueue from '../lazyLoadQueue';\r\nimport {putPreloader} from '../putPreloader';\r\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\r\nimport appImManager from '../../lib/appManagers/appImManager';\r\nimport mediaSizes from '../../helpers/mediaSizes';\r\nimport {i18n} from '../../lib/langPack';\r\nimport Button from '../button';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport toggleDisability from '../../helpers/dom/toggleDisability';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport {toastNew} from '../toast';\r\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport createStickersContextMenu from '../../helpers/dom/createStickersContextMenu';\r\nimport attachStickerViewerListeners from '../stickerViewer';\r\nimport {Document, StickerSet} from '../../layer';\r\nimport Row from '../row';\r\nimport replaceContent from '../../helpers/dom/replaceContent';\r\nimport rootScope from '../../lib/rootScope';\r\nimport wrapCustomEmoji from '../wrappers/customEmoji';\r\nimport emoticonsDropdown from '../emoticonsDropdown';\r\n\r\nconst ANIMATION_GROUP: AnimationItemGroup = 'STICKERS-POPUP';\r\n\r\nexport default class PopupStickers extends PopupElement {\r\n private stickersFooter: HTMLElement;\r\n private appendTo: HTMLElement;\r\n private updateAdded: {[setId: Long]: (added: boolean) => void};\r\n private sets: StickerSet.stickerSet[];\r\n private button: HTMLElement;\r\n\r\n constructor(\r\n private stickerSetInput: Parameters[0] | Parameters[0][],\r\n private isEmojis?: boolean\r\n ) {\r\n super('popup-stickers', {closable: true, overlayClosable: true, body: true, scrollable: true, title: true});\r\n\r\n this.title.append(i18n('Loading'));\r\n this.updateAdded = {};\r\n\r\n emoticonsDropdown.setIgnoreMouseOut('popup', true);\r\n this.addEventListener('close', () => {\r\n emoticonsDropdown.setIgnoreMouseOut('popup', false);\r\n animationIntersector.setOnlyOnePlayableGroup();\r\n });\r\n\r\n this.appendTo = this.scrollable.container;\r\n\r\n this.appendTo.classList.add('is-loading');\r\n putPreloader(this.appendTo, true);\r\n\r\n this.stickersFooter = document.createElement('div');\r\n this.stickersFooter.classList.add('sticker-set-footer');\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(this.stickersFooter);\r\n\r\n attachStickerViewerListeners({listenTo: this.appendTo, listenerSetter: this.listenerSetter});\r\n\r\n const onStickerSetUpdate = (set: StickerSet.stickerSet) => {\r\n const idx = this.sets.findIndex((_set) => _set.id === set.id);\r\n if(idx === -1) {\r\n return;\r\n }\r\n\r\n this.sets[idx] = set;\r\n const updateAdded = this.updateAdded[set.id];\r\n updateAdded?.(!!set.installed_date);\r\n this.updateButton();\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('stickers_installed', onStickerSetUpdate);\r\n this.listenerSetter.add(rootScope)('stickers_deleted', onStickerSetUpdate);\r\n\r\n this.loadStickerSet();\r\n }\r\n\r\n private createStickerSetElements(set?: StickerSet.stickerSet) {\r\n const container = document.createElement('div');\r\n container.classList.add('sticker-set');\r\n\r\n let headerRow: Row, updateAdded: (added: boolean) => void;\r\n if(set) {\r\n headerRow = new Row({\r\n title: wrapEmojiText(set.title),\r\n subtitle: i18n(set.pFlags.emojis ? 'EmojiCount' : 'Stickers', [set.count]),\r\n buttonRight: true\r\n });\r\n\r\n updateAdded = (added) => {\r\n replaceContent(headerRow.buttonRight, i18n(added ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n headerRow.buttonRight.classList.toggle('active', added);\r\n };\r\n\r\n updateAdded(!!set.installed_date);\r\n\r\n container.append(headerRow.container);\r\n }\r\n\r\n const itemsContainer = document.createElement('div');\r\n itemsContainer.classList.add('sticker-set-stickers');\r\n\r\n container.append(itemsContainer);\r\n\r\n return {container, headerRow, updateAdded, itemsContainer};\r\n }\r\n\r\n private onStickersClick = async(e: MouseEvent) => {\r\n const target = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(!target) return;\r\n\r\n const docId = target.dataset.docId;\r\n if(await appImManager.chat.input.sendMessageWithDocument(docId)) {\r\n this.hide();\r\n }\r\n };\r\n\r\n private async loadStickerSet() {\r\n const middleware = this.middlewareHelper.get();\r\n const inputs = Array.isArray(this.stickerSetInput) ? this.stickerSetInput : [this.stickerSetInput];\r\n const setsPromises = inputs.map((input) => this.managers.appStickersManager.getStickerSet(input));\r\n let sets = await Promise.all(setsPromises);\r\n if(!middleware()) return;\r\n let firstSet = sets[0];\r\n if(sets.length === 1 && !firstSet) {\r\n toastNew({langPackKey: this.isEmojis ? 'AddEmojiNotFound' : 'StickerSet.DontExist'});\r\n this.hide();\r\n return;\r\n }\r\n\r\n sets = sets.filter(Boolean);\r\n firstSet = sets[0];\r\n\r\n this.sets = sets.map((set) => set.set);\r\n\r\n const isEmojis = this.isEmojis ??= !!firstSet.set.pFlags.emojis;\r\n\r\n if(!isEmojis) {\r\n attachClickEvent(this.appendTo, this.onStickersClick, {listenerSetter: this.listenerSetter});\r\n\r\n const {destroy} = createStickersContextMenu({\r\n listenTo: this.appendTo,\r\n isStickerPack: true,\r\n onSend: () => this.hide()\r\n });\r\n\r\n this.addEventListener('close', destroy);\r\n }\r\n\r\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const loadPromises: Promise[] = [];\r\n\r\n const containersPromises = sets.map(async(set) => {\r\n const {container, itemsContainer, headerRow, updateAdded} = this.createStickerSetElements(sets.length > 1 ? set.set : undefined);\r\n\r\n if(headerRow) {\r\n attachClickEvent(headerRow.buttonRight, () => {\r\n this.managers.appStickersManager.toggleStickerSet(set.set);\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.updateAdded[set.set.id] = updateAdded;\r\n\r\n let divs: (HTMLElement | DocumentFragment)[];\r\n\r\n const docs = set.documents.filter((doc) => doc?._ === 'document') as Document.document[];\r\n if(isEmojis) {\r\n const fragment = wrapCustomEmoji({\r\n docIds: docs.map((doc) => doc.id),\r\n loadPromises,\r\n animationGroup: ANIMATION_GROUP,\r\n size: mediaSizes.active.esgCustomEmoji,\r\n middleware\r\n // lazyLoadQueue\r\n });\r\n\r\n (Array.from(fragment.children) as HTMLElement[]).slice(1).forEach((element) => {\r\n const span = document.createElement('span');\r\n span.classList.add('super-emoji');\r\n element.replaceWith(span);\r\n span.append(element);\r\n });\r\n\r\n divs = [fragment];\r\n\r\n itemsContainer.classList.replace('sticker-set-stickers', 'super-emojis');\r\n itemsContainer.classList.add('is-emojis', 'not-local');\r\n } else {\r\n divs = await Promise.all(docs.map(async(doc) => {\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set-sticker');\r\n\r\n const size = mediaSizes.active.popupSticker.width;\r\n\r\n await 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 withLock: true,\r\n loadPromises,\r\n middleware\r\n });\r\n\r\n return div;\r\n }));\r\n }\r\n\r\n itemsContainer.append(...divs.filter(Boolean));\r\n\r\n return container;\r\n });\r\n\r\n const containers = await Promise.all(containersPromises);\r\n await Promise.all(loadPromises);\r\n\r\n const button = this.button = Button('', {noRipple: true});\r\n\r\n this.updateButton();\r\n\r\n attachClickEvent(button, () => {\r\n const toggle = toggleDisability([button], true);\r\n\r\n this.managers.appStickersManager.toggleStickerSets(sets.map((set) => set.set)).then(() => {\r\n this.hide();\r\n }).catch(() => {\r\n toggle();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n if(sets.length === 1) {\r\n setInnerHTML(this.title, wrapEmojiText(firstSet.set.title));\r\n } else {\r\n setInnerHTML(this.title, i18n('Emoji'));\r\n }\r\n\r\n this.stickersFooter.textContent = '';\r\n this.stickersFooter.append(button);\r\n\r\n this.appendTo.classList.remove('is-loading');\r\n this.appendTo.textContent = '';\r\n this.appendTo.append(...containers);\r\n\r\n this.scrollable.onAdditionalScroll();\r\n }\r\n\r\n private updateButton() {\r\n const {sets, isEmojis} = this;\r\n let isAdd: boolean, buttonAppend: HTMLElement;\r\n if(sets.length === 1) {\r\n const firstSet = sets[0];\r\n buttonAppend = i18n(isEmojis ? 'EmojiCount' : 'Stickers', [firstSet.count]);\r\n isAdd = !firstSet.installed_date;\r\n } else {\r\n const installed = sets.filter((set) => set.installed_date);\r\n let count: number;\r\n if(sets.length === installed.length) {\r\n isAdd = false;\r\n count = sets.length;\r\n } else {\r\n isAdd = true;\r\n count = sets.length - installed.length;\r\n }\r\n\r\n buttonAppend = i18n('EmojiPackCount', [count]);\r\n }\r\n\r\n this.button.className = isAdd ? 'btn-primary btn-color-primary' : 'btn-primary btn-primary-transparent danger';\r\n replaceContent(this.button, i18n(isAdd ? 'AddStickersCount' : 'RemoveStickersCount', [buttonAppend]));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport SetTransition from './singleTransition';\r\nimport {fastRaf} from '../helpers/schedulers';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport isInDOM from '../helpers/dom/isInDOM';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\n\r\nconst TRANSITION_TIME = 200;\r\n\r\nexport default class ProgressivePreloader {\r\n public preloader: HTMLDivElement;\r\n public circle: SVGCircleElement;\r\n private cancelSvg: SVGSVGElement;\r\n private downloadSvg: HTMLElement;\r\n\r\n private tempId = 0;\r\n public detached = true;\r\n\r\n public promise: CancellablePromise = null;\r\n\r\n public isUpload = false;\r\n private cancelable = true;\r\n private streamable = false;\r\n private tryAgainOnFail = true;\r\n private attachMethod: 'append' | 'prepend' = 'append';\r\n\r\n public loadFunc: (e?: Event) => any;\r\n\r\n public totalLength: number;\r\n\r\n constructor(options?: Partial<{\r\n isUpload: ProgressivePreloader['isUpload'],\r\n cancelable: ProgressivePreloader['cancelable'],\r\n streamable: ProgressivePreloader['streamable'],\r\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\r\n attachMethod: ProgressivePreloader['attachMethod']\r\n }>) {\r\n if(options) {\r\n safeAssign(this, options);\r\n }\r\n\r\n if(this.isUpload) {\r\n this.tryAgainOnFail = false;\r\n }\r\n }\r\n\r\n public constructContainer(options: Partial<{\r\n color: 'transparent',\r\n bold: boolean\r\n }> = {}) {\r\n if(!this.preloader) {\r\n this.preloader = document.createElement('div');\r\n this.preloader.classList.add('preloader-container');\r\n\r\n if(options.color) {\r\n this.preloader.classList.add('preloader-' + options.color);\r\n }\r\n\r\n if(options.bold) {\r\n this.preloader.classList.add('preloader-bold');\r\n }\r\n\r\n if(this.streamable) {\r\n this.preloader.classList.add('preloader-streamable');\r\n }\r\n }\r\n }\r\n\r\n public constructDownloadIcon() {\r\n this.constructContainer();\r\n }\r\n\r\n public construct() {\r\n this.construct = null;\r\n\r\n this.constructContainer();\r\n\r\n this.preloader.innerHTML = `\r\n
\r\n \r\n \r\n \r\n
`;\r\n\r\n if(this.streamable) {\r\n this.totalLength = 118.61124420166016;\r\n } else {\r\n this.totalLength = 149.82473754882812;\r\n }\r\n\r\n if(this.cancelable) {\r\n this.preloader.innerHTML += `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `;\r\n\r\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\r\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\r\n } else {\r\n this.preloader.classList.add('preloader-swing');\r\n }\r\n\r\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\r\n\r\n if(this.cancelable) {\r\n attachClickEvent(this.preloader, this.onClick);\r\n }\r\n }\r\n\r\n public onClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.preloader.classList.contains('manual')) {\r\n if(this.loadFunc) {\r\n this.loadFunc(e);\r\n }\r\n } else {\r\n if(this.promise && this.promise.cancel) {\r\n this.promise.cancel();\r\n }\r\n }\r\n };\r\n\r\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\r\n this.loadFunc = func;\r\n }\r\n\r\n public setManual() {\r\n this.preloader.classList.add('manual');\r\n this.setProgress(0);\r\n }\r\n\r\n public attachPromise(promise: CancellablePromise) {\r\n if(this.isUpload && this.promise) return;\r\n\r\n this.promise = promise;\r\n\r\n const tempId = --this.tempId;\r\n const startTime = Date.now();\r\n\r\n const onEnd = (err: Error) => {\r\n promise.notify = promise.notifyAll = null;\r\n\r\n if(tempId !== this.tempId) {\r\n return;\r\n }\r\n\r\n const elapsedTime = Date.now() - startTime;\r\n\r\n // console.log('[PP]: end', this.detached, performance.now());\r\n\r\n if(!err && this.cancelable) {\r\n this.setProgress(100);\r\n\r\n const delay = TRANSITION_TIME * 0.75;\r\n\r\n if(elapsedTime < delay) {\r\n this.detach();\r\n } else {\r\n setTimeout(() => { // * wait for transition complete\r\n if(tempId === this.tempId) {\r\n this.detach();\r\n }\r\n }, delay);\r\n }\r\n } else {\r\n if(this.tryAgainOnFail) {\r\n this.attach(this.preloader.parentElement);\r\n fastRaf(() => {\r\n this.setManual();\r\n });\r\n } else {\r\n this.detach();\r\n }\r\n }\r\n\r\n this.promise = promise = null;\r\n };\r\n\r\n promise\r\n .then(() => onEnd(null))\r\n .catch((err) => onEnd(err));\r\n\r\n if(promise.addNotifyListener) {\r\n promise.addNotifyListener((details: {done: number, total: number}) => {\r\n /* if(details.done >= details.total) {\r\n onEnd();\r\n } */\r\n\r\n if(tempId !== this.tempId) return;\r\n\r\n // console.log('preloader download', promise, details);\r\n const percents = details.done / details.total * 100;\r\n this.setProgress(percents);\r\n });\r\n }\r\n }\r\n\r\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\r\n if(this.construct) {\r\n this.construct();\r\n }\r\n\r\n if(this.preloader.parentElement) {\r\n this.preloader.classList.remove('manual');\r\n }\r\n\r\n this.detached = false;\r\n\r\n if(promise/* && false */) {\r\n this.attachPromise(promise);\r\n }\r\n\r\n let useRafs = 0;\r\n if(this.detached || this.preloader.parentElement !== elem) {\r\n 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\r\n SetTransition(this.preloader, 'is-visible', true, TRANSITION_TIME, undefined, useRafs);\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?.parentElement) {\r\n /* setTimeout(() => */// fastRaf(() => {\r\n /* if(!this.detached) return;\r\n this.detached = true; */\r\n\r\n // fastRaf(() => {\r\n // console.log('[PP]: detach after rAF', this.detached, performance.now());\r\n\r\n // if(!this.detached || !this.preloader.parentElement) {\r\n // return;\r\n // }\r\n\r\n SetTransition(this.preloader, 'is-visible', false, TRANSITION_TIME, () => {\r\n this.preloader.remove();\r\n }, 1);\r\n // });\r\n // })/* , 5e3) */;\r\n }\r\n }\r\n\r\n public setProgress(percents: number) {\r\n if(!this.totalLength && !isInDOM(this.circle)) {\r\n return;\r\n }\r\n\r\n if(percents === 0) {\r\n this.circle.style.strokeDasharray = '';\r\n return;\r\n }\r\n\r\n try {\r\n if(!this.totalLength) {\r\n this.totalLength = this.circle.getTotalLength();\r\n }\r\n\r\n // console.log('setProgress', (percents / 100 * totalLength));\r\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\r\n } catch(err) {}\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getPreviewURLFromBytes from '../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {recordPromise} from '../helpers/recordPromise';\nimport sequentialDom from '../helpers/sequentialDom';\nimport {UserProfilePhoto, ChatPhoto} from '../layer';\nimport type {PeerPhotoSize} from '../lib/appManagers/appAvatarsManager';\nimport getPeerColorById from '../lib/appManagers/utils/peers/getPeerColorById';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport getAbbreviation from '../lib/richTextProcessor/getAbbreviation';\nimport rootScope from '../lib/rootScope';\nimport getPeerInitials from './wrappers/getPeerInitials';\n\nexport async function putAvatar(\n div: HTMLElement,\n peerId: PeerId,\n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto,\n size: PeerPhotoSize,\n img = new Image(),\n onlyThumb = false\n) {\n const r = await rootScope.managers.acknowledged.appAvatarsManager.loadAvatar(peerId, photo, size);\n const loadPromise = r.result;\n const cached = r.cached;\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n let isFullLoaded = false;\n if(size === 'photo_big') { // let's load small photo first\n const res = await putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n if(isFullLoaded) {\n return;\n }\n\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n isFullLoaded = true;\n\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n\n if(animate) {\n img.classList.remove('fade-in');\n }\n\n if(thumbImage) {\n thumbImage.remove();\n }\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , !cached */))\n .then(callback);\n\n await (renderThumbPromise || renderPromise);\n\n return {\n cached,\n loadPromise: renderThumbPromise || renderPromise,\n thumbImage\n };\n}\n\nfunction set(\n div: HTMLElement,\n innerHTML: Parameters[1],\n color: string,\n icon: string\n) {\n setInnerHTML(div, innerHTML);\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled');\n icon && div.classList.add(icon);\n}\n\n// peerId === peerId || title\nexport default async function putPhoto(\n div: HTMLElement,\n peerId: PeerId,\n isDialog = false,\n title = '',\n onlyThumb = false,\n isBig?: boolean\n) {\n const myId = rootScope.myId;\n\n if(peerId === myId && isDialog) {\n set(div, '', '', 'tgico-saved');\n return;\n }\n\n const managers = rootScope.managers;\n\n if(peerId !== NULL_PEER_ID && peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId);\n if(user && user.pFlags && user.pFlags.deleted) {\n set(div, '', getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n }\n\n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n const photo = await managers.appPeersManager.getPeerPhoto(peerId);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !(await managers.appAvatarsManager.isAvatarCached(peerId, size))) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n set(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n const abbr = await (title ? getAbbreviation(title) : getPeerInitials(peerId, managers));\n set(div, abbr, color, '');\n // return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const promise = putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n // recordPromise(promise, 'putAvatar-' + peerId);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Chat, User} from '../../layer';\nimport getAbbreviation from '../../lib/richTextProcessor/getAbbreviation';\nimport rootScope from '../../lib/rootScope';\n\nexport default async function getPeerInitials(peerId: PeerId, managers = rootScope.managers) {\n const peer: Chat | User = await managers.appPeersManager.getPeer(peerId);\n return getAbbreviation(\n (peer as Chat.chat).title ?? [(peer as User.user).first_name, (peer as User.user).last_name].filter(Boolean).join(' ')\n );\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n\r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getDeepProperty from '../helpers/object/getDeepProperty';\r\nimport {LangPackKey, _i18n} from '../lib/langPack';\r\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nexport default class RadioField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public main: HTMLElement;\r\n\r\n constructor(options: {\r\n text?: string,\r\n langKey?: LangPackKey,\r\n name: string,\r\n value?: string,\r\n stateKey?: string,\r\n alignRight?: boolean\r\n }) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('radio-field');\r\n\r\n if(options.alignRight) {\r\n label.classList.add('radio-field-right');\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.type = 'radio';\r\n /* input.id = */input.name = 'input-radio-' + options.name;\r\n\r\n if(options.value) {\r\n input.value = options.value;\r\n\r\n if(options.stateKey) {\r\n apiManagerProxy.getState().then((state) => {\r\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\r\n });\r\n\r\n input.addEventListener('change', () => {\r\n rootScope.managers.appStateManager.setByKey(options.stateKey, options.value);\r\n });\r\n }\r\n }\r\n\r\n const main = this.main = document.createElement('div');\r\n main.classList.add('radio-field-main');\r\n\r\n if(options.text) {\r\n main.innerHTML = options.text;\r\n /* const caption = document.createElement('div');\r\n caption.classList.add('radio-field-main-caption');\r\n caption.innerHTML = text;\r\n\r\n if(subtitle) {\r\n label.classList.add('radio-field-with-subtitle');\r\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\r\n }\r\n\r\n main.append(caption); */\r\n } else if(options.langKey) {\r\n _i18n(main, options.langKey);\r\n }\r\n\r\n label.append(input, main);\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\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 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","/*\r\n * https://github.com/morethanwords/tweb\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 const 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 const 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 const 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 as HTMLElement, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n const 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 const {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 const {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 CheckboxField, {CheckboxFieldOptions} 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\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport Button from './button';\r\n\r\ntype K = string | HTMLElement | DocumentFragment | true;\r\n\r\nconst setContent = (element: HTMLElement, content: K) => {\r\n if(content === true) {\r\n\r\n } else if(typeof(content) === 'string') {\r\n setInnerHTML(element, content);\r\n } else {\r\n element.append(content);\r\n }\r\n};\r\n\r\nexport type RowMediaSizeType = 'small' | 'medium' | 'big' | 'abitbigger' | 'bigger';\r\n\r\nexport default class Row {\r\n public container: HTMLElement;\r\n public title: HTMLElement;\r\n public titleRow: HTMLElement;\r\n public titleRight: HTMLElement;\r\n public media: HTMLElement;\r\n\r\n public subtitleRow: HTMLElement;\r\n public subtitleRight: HTMLElement;\r\n\r\n public checkboxField: CheckboxField;\r\n public radioField: RadioField;\r\n\r\n public freezed = false;\r\n\r\n public buttonRight: HTMLElement;\r\n\r\n private _subtitle: HTMLElement;\r\n\r\n constructor(options: Partial<{\r\n icon: string,\r\n subtitle: K,\r\n subtitleLangKey: LangPackKey,\r\n subtitleLangArgs: any[],\r\n subtitleRight: K,\r\n radioField: Row['radioField'],\r\n checkboxField: Row['checkboxField'],\r\n checkboxFieldOptions: CheckboxFieldOptions,\r\n withCheckboxSubtitle: boolean,\r\n title: K,\r\n titleLangKey: LangPackKey,\r\n titleRight: K,\r\n titleRightSecondary: K,\r\n clickable: boolean | ((e: Event) => void),\r\n navigationTab: SliderSuperTab,\r\n havePadding: boolean,\r\n noRipple: boolean,\r\n noWrap: boolean,\r\n listenerSetter: ListenerSetter,\r\n buttonRight?: HTMLElement | boolean,\r\n buttonRightLangKey: LangPackKey,\r\n asLink: boolean\r\n }> = {}) {\r\n if(options.checkboxFieldOptions) {\r\n options.checkboxField = new CheckboxField({\r\n listenerSetter: options.listenerSetter,\r\n ...options.checkboxFieldOptions\r\n });\r\n }\r\n\r\n const tagName = options.asLink ? 'a' : (options.radioField || options.checkboxField ? 'label' : 'div');\r\n this.container = document.createElement(tagName);\r\n this.container.classList.add('row', 'no-subtitle');\r\n\r\n if(options.noWrap) {\r\n this.container.classList.add('no-wrap');\r\n }\r\n\r\n if(options.subtitle) {\r\n const subtitle = this.subtitle;\r\n setContent(subtitle, options.subtitle);\r\n\r\n if(options.noWrap) subtitle.classList.add('no-wrap');\r\n\r\n if(options.subtitleRight) {\r\n this.container.append(this.subtitleRow = this.createRow());\r\n this.subtitleRow.classList.add('row-subtitle-row');\r\n const subtitleRight = this.subtitleRight = document.createElement('div');\r\n subtitleRight.classList.add('row-subtitle', 'row-subtitle-right');\r\n\r\n setContent(subtitleRight, options.subtitleRight);\r\n this.subtitleRow.append(subtitle, subtitleRight);\r\n }\r\n } else if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\r\n }\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.withCheckboxSubtitle && !isToggle) {\r\n const onChange = () => {\r\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\r\n };\r\n\r\n if(options.listenerSetter) options.listenerSetter.add(this.checkboxField.input)('change', onChange);\r\n else this.checkboxField.input.addEventListener('change', onChange);\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 titleRightContent = options.titleRight || options.titleRightSecondary;\r\n if(titleRightContent) {\r\n this.container.append(c = this.titleRow = this.createRow());\r\n this.titleRow.classList.add('row-title-row');\r\n } else {\r\n c = this.container;\r\n }\r\n\r\n this.title = this.createTitle();\r\n if(options.noWrap) this.title.classList.add('no-wrap');\r\n if(options.title) {\r\n setContent(this.title, options.title);\r\n } else if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n c.append(this.title);\r\n\r\n if(titleRightContent) {\r\n const titleRight = this.titleRight = document.createElement('div');\r\n titleRight.classList.add('row-title', 'row-title-right');\r\n\r\n if(options.titleRightSecondary) {\r\n titleRight.classList.add('row-title-right-secondary');\r\n }\r\n\r\n setContent(titleRight, titleRightContent);\r\n c.append(titleRight);\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 attachClickEvent(this.container, (e) => {\r\n if(this.freezed) return;\r\n (options.clickable as any)(e);\r\n }, {listenerSetter: options.listenerSetter});\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 if(options.buttonRight || options.buttonRightLangKey) {\r\n this.buttonRight = options.buttonRight instanceof HTMLElement ?\r\n options.buttonRight :\r\n Button('btn-primary btn-color-primary', {text: options.buttonRightLangKey});\r\n this.container.append(this.buttonRight);\r\n }\r\n }\r\n\r\n public get subtitle() {\r\n return this._subtitle ?? (this._subtitle = this.createSubtitle());\r\n }\r\n\r\n private createRow() {\r\n const c = document.createElement('div');\r\n c.classList.add('row-row');\r\n return c;\r\n }\r\n\r\n private createTitle() {\r\n const title = document.createElement('div');\r\n title.classList.add('row-title');\r\n title.setAttribute('dir', 'auto');\r\n return title;\r\n }\r\n\r\n private createSubtitle() {\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('row-subtitle');\r\n subtitle.setAttribute('dir', 'auto');\r\n if(this.title) this.title.after(subtitle);\r\n else this.container.prepend(subtitle);\r\n this.container.classList.remove('no-subtitle');\r\n return subtitle;\r\n }\r\n\r\n public createMedia(size?: RowMediaSizeType) {\r\n const media = document.createElement('div');\r\n return this.applyMediaElement(media, size);\r\n }\r\n\r\n public applyMediaElement(media: HTMLElement, size?: RowMediaSizeType) {\r\n this.container.classList.add('row-with-padding');\r\n\r\n this.media = media;\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 CreateRowFromCheckboxField = (checkboxField: CheckboxField) => {\r\n return new Row({checkboxField, listenerSetter: checkboxField.listenerSetter});\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\nexport const RadioFormFromValues = (values: {langPackKey: LangPackKey, value: number | string, checked?: boolean}[], onChange: Parameters[1]) => {\r\n const name = 'name-' + (Math.random() * 0x7FFFFF | 0);\r\n let checkedRadioField: RadioField;\r\n const rows = values.map(({langPackKey, value, checked}) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey: langPackKey,\r\n name,\r\n value: '' + value\r\n })\r\n });\r\n\r\n if(checked) {\r\n checkedRadioField = row.radioField;\r\n }\r\n\r\n return row;\r\n });\r\n\r\n const form = RadioFormFromRows(rows, onChange);\r\n if(checkedRadioField) {\r\n checkedRadioField.checked = true;\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 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\nimport {IS_ANDROID} from '../environment/userAgent';\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 //_el.style.display = '';\r\n //return;\r\n\r\n let el = _el.parentElement;\r\n let height = el.scrollHeight;\r\n let width = el.scrollWidth;\r\n el.style.width = width + 'px';\r\n el.style.height = height + 'px';\r\n _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\nconst SCROLL_THROTTLE = IS_ANDROID ? 200 : 24;\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 destroy() {\r\n this.removeListeners();\r\n this.onAdditionalScroll = undefined;\r\n this.onScrolledTop = undefined;\r\n this.onScrolledBottom = 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 // this.removeListeners();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });/* .finally(() => {\r\n this.setListeners();\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 = window.setTimeout(() => {\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 }, SCROLL_THROTTLE);\r\n };\r\n\r\n public cancelMeasure() {\r\n if(this.onScrollMeasure) {\r\n // window.cancelAnimationFrame(this.onScrollMeasure);\r\n clearTimeout(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 appSidebarLeft, {SettingSection} from '..';\r\nimport {InputFile} from '../../../layer';\r\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\r\nimport InputField from '../../inputField';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport AvatarEdit from '../../avatarEdit';\r\nimport I18n from '../../../lib/langPack';\r\nimport ButtonCorner from '../../buttonCorner';\r\nimport getUserStatusString from '../../wrappers/getUserStatusString';\r\nimport appImManager from '../../../lib/appManagers/appImManager';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\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 public init(\r\n peerIds: PeerId[],\r\n isGeoChat: boolean = false\r\n ) {\r\n this.isGeoChat = isGeoChat;\r\n this.peerIds = peerIds;\r\n\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.listenerSetter.add(this.groupNameInputField.input)('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 attachClickEvent(this.nextBtn, () => {\r\n const title = this.groupNameInputField.value;\r\n\r\n let promise: Promise;\r\n if(this.isGeoChat) {\r\n if(!this.userLocationAddress || !this.userLocationCoords) return;\r\n promise = this.managers.appChatsManager.createChannel({\r\n title,\r\n about: '',\r\n geo_point: {\r\n _: 'inputGeoPoint',\r\n ...this.userLocationCoords\r\n },\r\n address: this.userLocationAddress,\r\n megagroup: true\r\n }).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n\r\n if(this.peerIds.length) {\r\n this.managers.appChatsManager.inviteToChannel(chatId, this.peerIds);\r\n }\r\n\r\n return chatId;\r\n });\r\n } else {\r\n this.nextBtn.disabled = true;\r\n promise = this.managers.appChatsManager.createChat(title, this.peerIds.map((peerId) => peerId.toUserId())).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n\r\n return chatId;\r\n });\r\n }\r\n\r\n if(!promise) {\r\n return;\r\n }\r\n\r\n promise.then((chatId) => {\r\n this.close();\r\n\r\n appImManager.setInnerPeer({peerId: chatId.toPeerId(true)});\r\n });\r\n }, {listenerSetter: this.listenerSetter});\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 if(isGeoChat) {\r\n this.setTitle('NearbyCreateGroup');\r\n this.groupLocationInputField.container.classList.remove('hide');\r\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\r\n this.startLocating();\r\n } else {\r\n this.groupLocationInputField.container.classList.add('hide');\r\n }\r\n\r\n return Promise.all(this.peerIds.map(async(userId) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: userId,\r\n container: this.list,\r\n rippleEnabled: false,\r\n avatarSize: 'abitbigger'\r\n });\r\n\r\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(userId)));\r\n }));\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 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","enum PrivacyType {\n Everybody = 2,\n Contacts = 1,\n Nobody = 0\n}\n\nexport default PrivacyType;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PrivacyRule} from '../../../../layer';\nimport PrivacyType from './privacyType';\n\nexport default function getPrivacyRulesDetails(rules: PrivacyRule[]) {\n const types: PrivacyType[] = [];\n\n type peers = {users: UserId[], chats: ChatId[]};\n const allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\n rules.forEach((rule) => {\n switch(rule._) {\n case 'privacyValueAllowAll':\n types.push(2);\n break;\n case 'privacyValueDisallowAll':\n types.push(0);\n break;\n case 'privacyValueAllowContacts':\n types.push(1);\n break;\n /* case 'privacyValueDisallowContacts':\n types.push('Except My Contacts');\n break; */\n case 'privacyValueAllowChatParticipants':\n allowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueAllowUsers':\n allowPeers.users.push(...rule.users);\n break;\n case 'privacyValueDisallowChatParticipants':\n disallowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueDisallowUsers':\n disallowPeers.users.push(...rule.users);\n break;\n }\n });\n\n return {type: types[0], disallowPeers, allowPeers};\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport {randomLong} from '../helpers/random';\r\nimport {InputPrivacyKey, InputPrivacyRule} from '../layer';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport getPrivacyRulesDetails from '../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\r\nimport PrivacyType from '../lib/appManagers/utils/privacy/privacyType';\r\nimport {i18n, join, LangPackKey, _i18n} from '../lib/langPack';\r\nimport RadioField from './radioField';\r\nimport Row, {RadioFormFromRows} from './row';\r\nimport Scrollable from './scrollable';\r\nimport {SettingSection, generateSection} from './sidebarLeft';\r\nimport AppAddMembersTab from './sidebarLeft/tabs/addMembers';\r\nimport {SliderSuperTabEventable} from './sliderTab';\r\n\r\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\r\nexport default class PrivacySection {\r\n public radioRows: Map;\r\n public radioSection: SettingSection;\r\n public exceptions: Map;\r\n public peerIds: {\r\n disallow?: PeerId[],\r\n allow?: PeerId[]\r\n };\r\n public type: PrivacyType;\r\n\r\n constructor(public options: {\r\n tab: SliderSuperTabEventable,\r\n title: LangPackKey,\r\n inputKey: InputPrivacyKey['_'],\r\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\r\n appendTo?: Scrollable,\r\n noExceptions?: boolean,\r\n onRadioChange?: (value: number) => any,\r\n skipTypes?: PrivacyType[],\r\n exceptionTexts?: [LangPackKey, LangPackKey],\r\n managers: AppManagers\r\n }) {\r\n if(options.captions) {\r\n options.captions.reverse();\r\n }\r\n\r\n const managers = options.managers;\r\n\r\n this.radioSection = new SettingSection({name: options.title, caption: true});\r\n\r\n this.radioRows = new Map();\r\n\r\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\r\n type: PrivacyType.Everybody,\r\n langKey: 'PrivacySettingsController.Everbody'\r\n }, {\r\n type: PrivacyType.Contacts,\r\n langKey: 'PrivacySettingsController.MyContacts'\r\n }, {\r\n type: PrivacyType.Nobody,\r\n langKey: 'PrivacySettingsController.Nobody'\r\n }];\r\n\r\n if(options.skipTypes) {\r\n r = r.filter((r) => !options.skipTypes.includes(r.type));\r\n }\r\n\r\n const random = randomLong();\r\n r.forEach(({type, langKey}) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey,\r\n name: random,\r\n value: '' + type\r\n })\r\n });\r\n\r\n this.radioRows.set(type, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\r\n\r\n this.radioSection.content.append(form);\r\n if(options.appendTo) {\r\n options.appendTo.append(this.radioSection.container);\r\n }\r\n\r\n if(!options.noExceptions) {\r\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\r\n\r\n this.exceptions = new Map([[\r\n 'disallow',\r\n {\r\n titleLangKey: options.exceptionTexts[0],\r\n key: 'disallow',\r\n row: null,\r\n icon: 'deleteuser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ], [\r\n 'allow',\r\n {\r\n titleLangKey: options.exceptionTexts[1],\r\n key: 'allow',\r\n row: null,\r\n icon: 'adduser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ]]);\r\n\r\n this.exceptions.forEach((exception) => {\r\n exception.row = new Row(exception);\r\n\r\n exception.row.container.addEventListener('click', () => {\r\n promise.then(() => {\r\n const _peerIds = this.peerIds[exception.key];\r\n options.tab.slider.createTab(AppAddMembersTab).open({\r\n type: 'privacy',\r\n skippable: true,\r\n title: exception.titleLangKey,\r\n placeholder: 'PrivacyModal.Search.Placeholder',\r\n takeOut: (newPeerIds) => {\r\n _peerIds.length = 0;\r\n _peerIds.push(...newPeerIds);\r\n exception.row.subtitle.innerHTML = '';\r\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\r\n },\r\n selectedPeerIds: _peerIds\r\n });\r\n });\r\n });\r\n\r\n container.append(exception.row.container);\r\n });\r\n }\r\n\r\n /* setTimeout(() => {\r\n this.setRadio(PrivacyType.Contacts);\r\n }, 0); */\r\n\r\n const promise = managers.appPrivacyManager.getPrivacy(options.inputKey).then((rules) => {\r\n const details = getPrivacyRulesDetails(rules);\r\n this.setRadio(details.type);\r\n\r\n if(this.exceptions) {\r\n this.peerIds = {};\r\n ['allow' as const, 'disallow' as const].forEach((k) => {\r\n const arr = [];\r\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\r\n arr.push(...from.users.map((id) => id.toPeerId()));\r\n arr.push(...from.chats.map((id) => id.toPeerId(true)));\r\n this.peerIds[k] = arr;\r\n const s = this.exceptions.get(k).row.subtitle;\r\n s.innerHTML = '';\r\n s.append(...this.generateStr(from));\r\n });\r\n }\r\n\r\n options.tab.eventListener.addEventListener('destroy', async() => {\r\n const rules: InputPrivacyRule[] = [];\r\n\r\n switch(this.type) {\r\n case PrivacyType.Everybody:\r\n rules.push({_: 'inputPrivacyValueAllowAll'});\r\n break;\r\n case PrivacyType.Contacts:\r\n rules.push({_: 'inputPrivacyValueAllowContacts'});\r\n break;\r\n case PrivacyType.Nobody:\r\n rules.push({_: 'inputPrivacyValueDisallowAll'});\r\n break;\r\n }\r\n\r\n if(this.exceptions) {\r\n const a = ([\r\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\r\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\r\n ] as Array<[\r\n 'allow' | 'disallow',\r\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants',\r\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\r\n ]>);\r\n for(const [k, chatKey, usersKey] of a) {\r\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\r\n continue;\r\n }\r\n\r\n const _peerIds = this.peerIds[k];\r\n if(_peerIds) {\r\n const splitted = this.splitPeersByType(_peerIds);\r\n if(splitted.chats.length) {\r\n rules.push({_: chatKey, chats: splitted.chats});\r\n }\r\n\r\n if(splitted.users.length) {\r\n rules.push({\r\n _: usersKey,\r\n users: await Promise.all(splitted.users.map((id) => managers.appUsersManager.getUserInput(id)))\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n managers.appPrivacyManager.setPrivacy(options.inputKey, rules);\r\n }, {once: true});\r\n });\r\n }\r\n\r\n private onRadioChange = (value: string | PrivacySection['type']) => {\r\n value = +value as PrivacySection['type'];\r\n this.type = value;\r\n\r\n const caption = this.options.captions[this.type];\r\n const captionElement = this.radioSection.caption;\r\n if(!caption) {\r\n captionElement.innerHTML = '';\r\n } else if(caption instanceof HTMLElement) {\r\n replaceContent(captionElement, caption);\r\n } else {\r\n _i18n(captionElement, caption);\r\n }\r\n captionElement.classList.toggle('hide', !caption);\r\n\r\n if(this.exceptions) {\r\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\r\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\r\n }\r\n\r\n this.options.onRadioChange && this.options.onRadioChange(value);\r\n };\r\n\r\n public setRadio(type: PrivacySection['type']) {\r\n const row = this.radioRows.get(type);\r\n this.onRadioChange(type);\r\n row.radioField.input.checked = true;\r\n }\r\n\r\n private splitPeersByType(peerIds: PeerId[]) {\r\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\r\n peerIds.forEach((peerId) => {\r\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\r\n });\r\n\r\n return peers;\r\n }\r\n\r\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\r\n if(!peers.users.length && !peers.chats.length) {\r\n return [i18n('PrivacySettingsController.AddUsers')];\r\n }\r\n\r\n return join([\r\n peers.users.length ? i18n('Users', [peers.users.length]) : null,\r\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\r\n ].filter(Boolean), false);\r\n }\r\n}\r\n","/*\n * 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 {SliderSuperTabEventable} from '../../../sliderTab';\r\nimport PrivacySection from '../../../privacySection';\r\nimport {i18n, LangPackKey} from '../../../../lib/langPack';\r\nimport anchorCopy from '../../../../helpers/dom/anchorCopy';\r\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\r\n\r\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\r\n public async init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\r\n this.setTitle('PrivacyPhone');\r\n\r\n const formatted = '+' + (await this.managers.appUsersManager.getSelf()).phone;\r\n const captionEl = document.createElement('div');\r\n captionEl.append(\r\n i18n('PrivacyPhoneInfo'),\r\n document.createElement('br'),\r\n document.createElement('br'),\r\n i18n('PrivacyPhoneInfo4'),\r\n document.createElement('br'),\r\n anchorCopy({\r\n mePath: formatted\r\n })\r\n );\r\n\r\n const phoneSection = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle',\r\n inputKey: 'inputPrivacyKeyPhoneNumber',\r\n captions: [captionEl, captionEl, ''],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n onRadioChange: (type) => {\r\n s.setRadio(PrivacyType.Everybody);\r\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\r\n },\r\n managers: this.managers\r\n });\r\n\r\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\r\n const s = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle2',\r\n inputKey: 'inputPrivacyKeyAddedByPhone',\r\n captions: [sCaption, sCaption, ''],\r\n noExceptions: true,\r\n skipTypes: [PrivacyType.Nobody],\r\n managers: this.managers\r\n });\r\n\r\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '../..';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\nimport Button from '../../../button';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\r\nimport AppSettingsTab from '../settings';\r\n\r\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\r\n public 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 captionOld: 'TwoStepVerificationPasswordSetInfo',\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🥳';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n emoji,\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\r\n\r\n attachClickEvent(btnReturn, (e) => {\r\n this.close();\r\n });\r\n\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n\r\n inputWrapper.append(btnReturn);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\r\n\r\nexport function canFocus(isFirstInput: boolean) {\r\n return !IS_MOBILE_SAFARI || !isFirstInput;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '../..';\r\nimport {AccountPassword} from '../../../../layer';\r\nimport Button from '../../../button';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport AppTwoStepVerificationSetTab from './passwordSet';\r\nimport CodeInputField from '../../../codeInputField';\r\nimport AppTwoStepVerificationEmailTab from './email';\r\nimport {putPreloader} from '../../../putPreloader';\r\nimport {i18n, _i18n} from '../../../../lib/langPack';\r\nimport {canFocus} from '../../../../helpers/dom/canFocus';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\nimport replaceContent from '../../../../helpers/dom/replaceContent';\r\nimport toggleDisability from '../../../../helpers/dom/toggleDisability';\r\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\r\n\r\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\r\n public codeInputField: CodeInputField;\r\n public state: AccountPassword;\r\n public email: string;\r\n public length: number;\r\n public isFirst = false;\r\n\r\n public 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 captionOld: true,\r\n noDelimiter: true\r\n });\r\n\r\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\r\n\r\n const emoji = '📬';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.codeInputField = new CodeInputField({\r\n name: 'recovery-email-code',\r\n label: 'TwoStepAuth.RecoveryCode',\r\n length: this.length,\r\n onFill: (code) => {\r\n freeze(true);\r\n\r\n this.managers.passwordManager.confirmPasswordEmail('' + code)\r\n .then((value) => {\r\n if(!value) {\r\n\r\n }\r\n\r\n goNext();\r\n })\r\n .catch((err) => {\r\n switch(err.type) {\r\n case 'CODE_INVALID':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\r\n break;\r\n\r\n case 'EMAIL_HASH_EXPIRED':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\r\n break;\r\n\r\n default:\r\n console.error('confirm error', err);\r\n break;\r\n }\r\n\r\n freeze(false);\r\n });\r\n }\r\n });\r\n\r\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\r\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\r\n\r\n const goNext = () => {\r\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\r\n };\r\n\r\n const freeze = (disable: boolean) => {\r\n toggleDisability([inputField.input, btnChange, btnResend], disable);\r\n };\r\n\r\n attachClickEvent(btnChange, (e) => {\r\n freeze(true);\r\n this.managers.passwordManager.cancelPasswordEmail().then((value) => {\r\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\r\n this.close();\r\n }, () => {\r\n freeze(false);\r\n });\r\n });\r\n\r\n attachClickEvent(btnResend, (e) => {\r\n freeze(true);\r\n const d = putPreloader(btnResend);\r\n this.managers.passwordManager.resendPasswordEmail().then((value) => {\r\n d.remove();\r\n freeze(false);\r\n });\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnChange, btnResend);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.codeInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '../..';\r\nimport {AccountPassword} from '../../../../layer';\r\nimport Button from '../../../button';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport InputField from '../../../inputField';\r\nimport {putPreloader} from '../../../putPreloader';\r\nimport AppTwoStepVerificationSetTab from './passwordSet';\r\nimport AppTwoStepVerificationEmailConfirmationTab from './emailConfirmation';\r\nimport PopupPeer from '../../../popups/peer';\r\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\r\nimport {canFocus} from '../../../../helpers/dom/canFocus';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\nimport matchEmail from '../../../../lib/richTextProcessor/matchEmail';\r\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\r\n\r\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n public hint: string;\r\n public isFirst = false;\r\n\r\n public 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 captionOld: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💌';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'recovery-email',\r\n label: 'RecoveryEmail',\r\n plainText: true\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n inputField.input.addEventListener('input', (e) => {\r\n inputField.input.classList.remove('error');\r\n });\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const goNext = () => {\r\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\r\n };\r\n\r\n const onContinueClick = () => {\r\n const email = inputField.value.trim();\r\n const match = matchEmail(email);\r\n if(!match || match[0].length !== email.length) {\r\n inputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n toggleButtons(true);\r\n const d = putPreloader(btnContinue);\r\n\r\n this.managers.passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email\r\n }).then((value) => {\r\n goNext();\r\n }, (err) => {\r\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\r\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\r\n tab.state = this.state;\r\n tab.email = email;\r\n tab.length = symbols;\r\n tab.open();\r\n } else {\r\n console.log('password set error', err);\r\n }\r\n\r\n toggleButtons(false);\r\n d.remove();\r\n });\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n const toggleButtons = (freeze: boolean) => {\r\n if(freeze) {\r\n btnContinue.setAttribute('disabled', 'true');\r\n btnSkip.setAttribute('disabled', 'true');\r\n } else {\r\n btnContinue.removeAttribute('disabled');\r\n btnSkip.removeAttribute('disabled');\r\n }\r\n };\r\n\r\n attachClickEvent(btnSkip, (e) => {\r\n const popup = new PopupPeer('popup-skip-email', {\r\n buttons: [{\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }, {\r\n langKey: 'YourEmailSkip',\r\n callback: () => {\r\n // inputContent.classList.add('sidebar-left-section-disabled');\r\n toggleButtons(true);\r\n putPreloader(btnSkip);\r\n this.managers.passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email: ''\r\n }).then(() => {\r\n goNext();\r\n }, (err) => {\r\n toggleButtons(false);\r\n });\r\n },\r\n isDanger: true\r\n }],\r\n titleLangKey: 'YourEmailSkipWarning',\r\n descriptionLangKey: 'YourEmailSkipWarningText'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '../..';\r\nimport {AccountPassword} from '../../../../layer';\r\nimport Button from '../../../button';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport InputField from '../../../inputField';\r\nimport AppTwoStepVerificationEmailTab from './email';\r\nimport {toast} from '../../../toast';\r\nimport I18n from '../../../../lib/langPack';\r\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\r\n\r\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n public init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\r\n this.setTitle('TwoStepAuth.SetupHintTitle');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💡';\r\n const stickerContainer = document.createElement('div');\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'hint',\r\n label: 'TwoStepAuth.SetupHintPlaceholder'\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return inputField.value ? onContinueClick() : onSkipClick();\r\n }\r\n });\r\n\r\n const goNext = (e?: Event, saveHint?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const hint = saveHint ? inputField.value : undefined;\r\n if(hint && this.newPassword === hint) {\r\n toast(I18n.format('PasswordAsHintError', true));\r\n return;\r\n }\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.hint = hint;\r\n\r\n tab.open();\r\n };\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const onContinueClick = (e?: Event) => goNext(e, true);\r\n const onSkipClick = (e?: Event) => goNext(e, false);\r\n attachClickEvent(btnContinue, onContinueClick);\r\n attachClickEvent(btnSkip, onSkipClick);\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n section.content.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '../..';\r\nimport {AccountPassword} from '../../../../layer';\r\nimport Button from '../../../button';\r\nimport PasswordInputField from '../../../passwordInputField';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport TrackingMonkey from '../../../monkeys/tracking';\r\nimport AppTwoStepVerificationHintTab from './hint';\r\nimport {InputState} from '../../../inputField';\r\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\n\r\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n public init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\r\n this.setTitle('PleaseReEnterPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 're-enter-password',\r\n label: 'PleaseReEnterPassword'\r\n });\r\n\r\n const monkey = new TrackingMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(this.newPassword !== passwordInputField.value) {\r\n passwordInputField.setError();\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const onContinueClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationHintTab);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.open();\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AppTwoStepVerificationTab from '.';\r\nimport {SettingSection} from '../..';\r\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\r\nimport {canFocus} from '../../../../helpers/dom/canFocus';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\nimport replaceContent from '../../../../helpers/dom/replaceContent';\r\nimport setInnerHTML from '../../../../helpers/dom/setInnerHTML';\r\nimport {AccountPassword} from '../../../../layer';\r\nimport I18n, {i18n} from '../../../../lib/langPack';\r\nimport wrapEmojiText from '../../../../lib/richTextProcessor/wrapEmojiText';\r\nimport Button from '../../../button';\r\nimport {putPreloader} from '../../../putPreloader';\r\nimport PasswordMonkey from '../../../monkeys/password';\r\nimport PasswordInputField from '../../../passwordInputField';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport AppTwoStepVerificationReEnterPasswordTab from './reEnterPassword';\r\n\r\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public isFirst = true;\r\n\r\n public init() {\r\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\r\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 'enter-password',\r\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\r\n labelText: !isNew && this.state.hint ? wrapEmojiText(this.state.hint) : undefined\r\n });\r\n\r\n const monkey = new PasswordMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary');\r\n const textEl = new I18n.IntlElement({key: 'Continue'});\r\n\r\n btnContinue.append(textEl.element);\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.input.classList.remove('error');\r\n textEl.key = 'Continue';\r\n textEl.update();\r\n }\r\n\r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(!passwordInputField.value.length) {\r\n passwordInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n let onContinueClick: (e?: Event) => void;\r\n if(!isNew) {\r\n let getStateInterval: number;\r\n\r\n const getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return this.managers.passwordManager.getState().then((_state) => {\r\n this.state = _state;\r\n\r\n if(this.state.hint) {\r\n setInnerHTML(passwordInputField.label, wrapEmojiText(this.state.hint));\r\n } else {\r\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\r\n }\r\n });\r\n };\r\n\r\n const submit = (e?: Event) => {\r\n if(!verifyInput()) {\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n btnContinue.setAttribute('disabled', 'true');\r\n textEl.key = 'PleaseWait';\r\n textEl.update();\r\n const preloader = putPreloader(btnContinue);\r\n\r\n const plainPassword = passwordInputField.value;\r\n this.managers.passwordManager.check(passwordInputField.value, this.state).then((auth) => {\r\n console.log(auth);\r\n\r\n if(auth._ === 'auth.authorization') {\r\n clearInterval(getStateInterval);\r\n if(monkey) monkey.remove();\r\n const tab = this.slider.createTab(AppTwoStepVerificationTab);\r\n tab.state = this.state;\r\n tab.plainPassword = plainPassword;\r\n tab.open();\r\n this.slider.removeTabFromHistory(this);\r\n }\r\n }, (err) => {\r\n btnContinue.removeAttribute('disabled');\r\n passwordInputField.input.classList.add('error');\r\n\r\n switch(err.type) {\r\n default:\r\n // btnContinue.innerText = err.type;\r\n textEl.key = 'PASSWORD_HASH_INVALID';\r\n textEl.update();\r\n preloader.remove();\r\n passwordInputField.select();\r\n break;\r\n }\r\n\r\n getState();\r\n });\r\n };\r\n\r\n onContinueClick = submit;\r\n\r\n getState();\r\n } else {\r\n onContinueClick = (e) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationReEnterPasswordTab);\r\n tab.state = this.state;\r\n tab.newPassword = passwordInputField.value;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n };\r\n }\r\n\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '../..';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\nimport {AccountPassword} from '../../../../layer';\r\nimport {_i18n} from '../../../../lib/langPack';\r\nimport Button from '../../../button';\r\nimport PopupPeer from '../../../popups/peer';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\r\nimport AppSettingsTab from '../settings';\r\nimport AppTwoStepVerificationEmailTab from './email';\r\nimport AppTwoStepVerificationEnterPasswordTab from './enterPassword';\r\n\r\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n\r\n public 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 captionOld: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🔐';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 168,\r\n height: 168,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const c = section.generateContentElement();\r\n if(this.state.pFlags.has_password) {\r\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\r\n\r\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\r\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\r\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\r\n\r\n attachClickEvent(btnChangePassword, () => {\r\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n });\r\n\r\n attachClickEvent(btnDisablePassword, () => {\r\n const popup = new PopupPeer('popup-disable-password', {\r\n buttons: [{\r\n langKey: 'Disable',\r\n callback: () => {\r\n this.managers.passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n this.close();\r\n });\r\n },\r\n isDanger: true\r\n }],\r\n titleLangKey: 'TurnPasswordOffQuestionTitle',\r\n descriptionLangKey: 'TurnPasswordOffQuestion'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n attachClickEvent(btnSetRecoveryEmail, () => {\r\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\r\n tab.state = this.state;\r\n tab.hint = this.state.hint;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.plainPassword;\r\n tab.isFirst = true;\r\n tab.open();\r\n });\r\n\r\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\r\n } else {\r\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\r\n\r\n inputWrapper.append(btnSetPassword);\r\n c.append(inputWrapper);\r\n\r\n attachClickEvent(btnSetPassword, (e) => {\r\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\r\n tab.state = this.state;\r\n tab.open();\r\n });\r\n }\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTabEventable} from '../../../sliderTab';\r\nimport PrivacySection from '../../../privacySection';\r\nimport {LangPackKey} from '../../../../lib/langPack';\r\n\r\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\r\n public init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\r\n this.setTitle('PrivacyLastSeen');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'LastSeenTitle',\r\n inputKey: 'inputPrivacyKeyStatusTimestamp',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTabEventable} from '../../../sliderTab';\r\nimport PrivacySection from '../../../privacySection';\r\nimport {LangPackKey} from '../../../../lib/langPack';\r\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\r\n\r\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\r\n public init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\r\n this.setTitle('PrivacyProfilePhoto');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyProfilePhotoTitle',\r\n inputKey: 'inputPrivacyKeyProfilePhoto',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody],\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTabEventable} from '../../../sliderTab';\r\nimport PrivacySection from '../../../privacySection';\r\nimport {LangPackKey} from '../../../../lib/langPack';\r\n\r\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\r\n public init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\r\n this.setTitle('PrivacySettings.Forwards');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyForwardsTitle',\r\n inputKey: 'inputPrivacyKeyForwards',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTabEventable} from '../../../sliderTab';\r\nimport PrivacySection from '../../../privacySection';\r\nimport {LangPackKey} from '../../../../lib/langPack';\r\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\r\n\r\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\r\n public init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\r\n this.setTitle('PrivacySettings.Groups');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanAddMe',\r\n inputKey: 'inputPrivacyKeyChatInvite',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody],\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTabEventable} from '../../../sliderTab';\r\nimport PrivacySection from '../../../privacySection';\r\nimport {LangPackKey} from '../../../../lib/langPack';\r\n\r\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\r\n public init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-calls');\r\n this.setTitle('PrivacySettings.VoiceCalls');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanCallMe',\r\n inputKey: 'inputPrivacyKeyPhoneCall',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n\r\n {\r\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyP2PHeader',\r\n inputKey: 'inputPrivacyKeyPhoneP2P',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '..';\r\nimport Button from '../../button';\r\nimport Row from '../../row';\r\nimport {Authorization} from '../../../layer';\r\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\r\nimport ButtonMenu from '../../buttonMenu';\r\nimport {toast} from '../../toast';\r\nimport I18n from '../../../lib/langPack';\r\nimport PopupPeer from '../../popups/peer';\r\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\r\nimport {SliderSuperTabEventable} from '../../sliderTab';\r\nimport findAndSplice from '../../../helpers/array/findAndSplice';\r\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\r\nimport positionMenu from '../../../helpers/positionMenu';\r\nimport contextMenuController from '../../../helpers/contextMenuController';\r\n\r\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\r\n public authorizations: Authorization.authorization[];\r\n private menuElement: HTMLElement;\r\n\r\n public init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('active-sessions-container');\r\n this.setTitle('SessionsTitle');\r\n\r\n const Session = (auth: Authorization.authorization) => {\r\n const row = new Row({\r\n title: [auth.app_name, auth.app_version].join(' '),\r\n subtitle: [auth.ip, auth.country].join(' - '),\r\n clickable: true,\r\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\r\n });\r\n\r\n row.container.dataset.hash = '' + auth.hash;\r\n\r\n const midtitle = document.createElement('div');\r\n midtitle.classList.add('row-midtitle');\r\n midtitle.innerHTML = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\r\n\r\n row.subtitle.parentElement.insertBefore(midtitle, row.subtitle);\r\n\r\n return row;\r\n };\r\n\r\n const authorizations = this.authorizations.slice();\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'CurrentSession',\r\n caption: 'ClearOtherSessionsHelp'\r\n });\r\n\r\n const auth = findAndSplice(authorizations, auth => auth.pFlags.current);\r\n const session = Session(auth);\r\n\r\n section.content.append(session.container);\r\n\r\n if(authorizations.length) {\r\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\r\n attachClickEvent(btnTerminate, (e) => {\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n const toggle = toggleDisability([btnTerminate], true);\r\n this.managers.apiManager.invokeApi('auth.resetAuthorizations').then((value) => {\r\n // toggleDisability([btnTerminate], false);\r\n btnTerminate.remove();\r\n otherSection.container.remove();\r\n }, onError).finally(() => {\r\n toggle();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionsTitle',\r\n descriptionLangKey: 'AreYouSureSessions'\r\n }).show();\r\n });\r\n\r\n section.content.append(btnTerminate);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!authorizations.length) {\r\n return;\r\n }\r\n\r\n const otherSection = new SettingSection({\r\n name: 'OtherSessions',\r\n caption: 'SessionsListInfo'\r\n });\r\n\r\n authorizations.forEach((auth) => {\r\n otherSection.content.append(Session(auth).container);\r\n });\r\n\r\n this.scrollable.append(otherSection.container);\r\n\r\n const onError = (err: any) => {\r\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\r\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\r\n }\r\n };\r\n\r\n let target: HTMLElement;\r\n const onTerminateClick = () => {\r\n const hash = target.dataset.hash;\r\n\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n this.managers.apiManager.invokeApi('account.resetAuthorization', {hash})\r\n .then((value) => {\r\n if(value) {\r\n target.remove();\r\n }\r\n }, onError);\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionTitle',\r\n descriptionLangKey: 'TerminateSessionText'\r\n }).show();\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'stop',\r\n text: 'Terminate',\r\n onClick: onTerminateClick\r\n }]);\r\n element.id = 'active-sessions-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n contextMenuController.openBtnMenu(element);\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n onTerminateClick();\r\n });\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider';\r\nimport {SettingSection} from '..';\r\nimport ButtonMenu from '../../buttonMenu';\r\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\r\nimport PopupPickUser from '../../popups/pickUser';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport findUpTag from '../../../helpers/dom/findUpTag';\r\nimport ButtonCorner from '../../buttonCorner';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport formatUserPhone from '../../wrappers/formatUserPhone';\r\nimport getUserStatusString from '../../wrappers/getUserStatusString';\r\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\r\nimport positionMenu from '../../../helpers/positionMenu';\r\nimport contextMenuController from '../../../helpers/contextMenuController';\r\n\r\nexport default class AppBlockedUsersTab extends SliderSuperTab {\r\n public peerIds: PeerId[];\r\n private menuElement: HTMLElement;\r\n\r\n public init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('blocked-users-container');\r\n this.setTitle('BlockedUsers');\r\n\r\n const section = new SettingSection({\r\n caption: 'BlockedUsersInfo'\r\n });\r\n\r\n section.caption.parentElement.prepend(section.caption);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\r\n this.content.append(btnAdd);\r\n\r\n attachClickEvent(btnAdd, (e) => {\r\n new PopupPickUser({\r\n peerTypes: ['contacts'],\r\n placeholder: 'BlockModal.Search.Placeholder',\r\n onSelect: (peerId) => {\r\n // console.log('block', peerId);\r\n this.managers.appUsersManager.toggleBlock(peerId, true);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const list = appDialogsManager.createChatList();\r\n this.scrollable.container.classList.add('chatlist-container');\r\n section.content.append(list);\r\n\r\n const add = async(peerId: PeerId, append: boolean) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: peerId,\r\n container: list,\r\n rippleEnabled: true,\r\n avatarSize: 'abitbigger',\r\n append\r\n });\r\n\r\n const user = await this.managers.appUsersManager.getUser(peerId);\r\n if(user.pFlags.bot) {\r\n dom.lastMessageSpan.append('@' + user.username);\r\n } else {\r\n if(user.phone) dom.lastMessageSpan.innerHTML = formatUserPhone(user.phone);\r\n else dom.lastMessageSpan.append(user.username ? '@' + user.username : getUserStatusString(user));\r\n }\r\n\r\n // dom.titleSpan.innerHTML = 'Raaid El Syed';\r\n // dom.lastMessageSpan.innerHTML = '+1 234 567891';\r\n };\r\n\r\n for(const peerId of this.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n let target: HTMLElement;\r\n const onUnblock = () => {\r\n const peerId = target.dataset.peerId.toPeerId();\r\n this.managers.appUsersManager.toggleBlock(peerId, false);\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'lockoff',\r\n text: 'Unblock',\r\n onClick: onUnblock,\r\n options: {listenerSetter: this.listenerSetter}\r\n }]);\r\n element.id = 'blocked-users-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\r\n if(!target) {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n contextMenuController.openBtnMenu(element);\r\n }, this.listenerSetter);\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\r\n const {peerId, blocked} = update;\r\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\r\n if(blocked) {\r\n if(!li) {\r\n add(peerId, false);\r\n }\r\n } else {\r\n if(li) {\r\n li.remove();\r\n }\r\n }\r\n });\r\n\r\n const LOAD_COUNT = 50;\r\n let loading = false;\r\n this.scrollable.onScrolledBottom = () => {\r\n if(loading) {\r\n return;\r\n }\r\n\r\n loading = true;\r\n this.managers.appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then((res) => {\r\n for(const peerId of res.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\r\n this.scrollable.onScrolledBottom = null;\r\n }\r\n\r\n this.scrollable.checkForTriggers();\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.scrollable.onScroll();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\n}\n","/*\n * 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 PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyVoicesTab extends SliderSuperTabEventable {\n public init() {\n this.header.classList.add('with-border');\n this.container.classList.add('privacy-tab', 'privacy-voices');\n this.setTitle('PrivacyVoiceMessages');\n\n const caption: LangPackKey = 'PrivacyVoiceMessagesInfo';\n new PrivacySection({\n tab: this,\n title: 'PrivacyVoiceMessagesTitle',\n inputKey: 'inputPrivacyKeyVoiceMessages',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\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 SliderSuperTab, {SliderSuperTabEventable} from '../../sliderTab';\r\nimport {SettingSection} from '..';\r\nimport Row from '../../row';\r\nimport {AccountPassword, Authorization, InputPrivacyKey, Updates} from '../../../layer';\r\nimport AppPrivacyPhoneNumberTab from './privacy/phoneNumber';\r\nimport AppTwoStepVerificationTab from './2fa';\r\nimport AppTwoStepVerificationEnterPasswordTab from './2fa/enterPassword';\r\nimport AppTwoStepVerificationEmailConfirmationTab from './2fa/emailConfirmation';\r\nimport AppPrivacyLastSeenTab from './privacy/lastSeen';\r\nimport AppPrivacyProfilePhotoTab from './privacy/profilePhoto';\r\nimport AppPrivacyForwardMessagesTab from './privacy/forwardMessages';\r\nimport AppPrivacyAddToGroupsTab from './privacy/addToGroups';\r\nimport AppPrivacyCallsTab from './privacy/calls';\r\nimport AppActiveSessionsTab from './activeSessions';\r\nimport AppBlockedUsersTab from './blockedUsers';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {i18n, LangPackKey, _i18n} from '../../../lib/langPack';\r\nimport replaceContent from '../../../helpers/dom/replaceContent';\r\nimport CheckboxField from '../../checkboxField';\r\nimport PopupPeer from '../../popups/peer';\r\nimport Button from '../../button';\r\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\r\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\r\nimport getPrivacyRulesDetails from '../../../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\r\nimport PrivacyType from '../../../lib/appManagers/utils/privacy/privacyType';\r\nimport confirmationPopup, {PopupConfirmationOptions} from '../../confirmationPopup';\r\nimport noop from '../../../helpers/noop';\r\nimport {toastNew} from '../../toast';\r\nimport AppPrivacyVoicesTab from './privacy/voices';\r\n\r\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\r\n private activeSessionsRow: Row;\r\n private authorizations: Authorization.authorization[];\r\n\r\n public static getInitArgs(fromTab: SliderSuperTab) {\r\n return {\r\n appConfig: fromTab.managers.apiManager.getAppConfig(),\r\n globalPrivacy: fromTab.managers.appPrivacyManager.getGlobalPrivacySettings(),\r\n contentSettings: fromTab.managers.apiManager.invokeApi('account.getContentSettings')\r\n };\r\n }\r\n\r\n public init(p: ReturnType) {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('dont-u-dare-block-me');\r\n this.setTitle('PrivacySettings');\r\n\r\n const SUBTITLE: LangPackKey = 'Loading';\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\r\n\r\n let blockedPeerIds: PeerId[];\r\n const blockedUsersRow = new Row({\r\n icon: 'deleteuser',\r\n titleLangKey: 'BlockedUsers',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppBlockedUsersTab);\r\n tab.peerIds = blockedPeerIds;\r\n tab.open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n blockedUsersRow.freezed = true;\r\n\r\n let passwordState: AccountPassword;\r\n const twoFactorRowOptions = {\r\n icon: 'lock',\r\n titleLangKey: 'TwoStepVerification' as LangPackKey,\r\n subtitleLangKey: SUBTITLE,\r\n clickable: (e: Event) => {\r\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\r\n if(passwordState.pFlags.has_password) {\r\n tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\r\n } else if(passwordState.email_unconfirmed_pattern) {\r\n tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\r\n tab.email = passwordState.email_unconfirmed_pattern;\r\n tab.length = 6;\r\n tab.isFirst = true;\r\n this.managers.passwordManager.resendPasswordEmail();\r\n } else {\r\n tab = this.slider.createTab(AppTwoStepVerificationTab);\r\n }\r\n\r\n tab.state = passwordState;\r\n tab.open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n };\r\n\r\n const twoFactorRow = new Row(twoFactorRowOptions);\r\n twoFactorRow.freezed = true;\r\n\r\n const activeSessionsRow = this.activeSessionsRow = new Row({\r\n icon: 'activesessions',\r\n titleLangKey: 'SessionsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppActiveSessionsTab);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.updateActiveSessions();\r\n }, {once: true});\r\n tab.open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n activeSessionsRow.freezed = true;\r\n\r\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n const setBlockedCount = (count: number) => {\r\n if(count) {\r\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\r\n } else {\r\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\r\n }\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', () => {\r\n /* const {blocked, peerId} = update;\r\n if(!blocked) blockedPeerIds.findAndSplice((p) => p === peerId);\r\n else blockedPeerIds.unshift(peerId);\r\n blockedCount += blocked ? 1 : -1;\r\n setBlockedCount(blockedCount); */\r\n updateBlocked();\r\n });\r\n\r\n const updateBlocked = () => {\r\n this.managers.appUsersManager.getBlocked().then((res) => {\r\n blockedUsersRow.freezed = false;\r\n setBlockedCount(res.count);\r\n blockedPeerIds = res.peerIds;\r\n });\r\n };\r\n\r\n updateBlocked();\r\n\r\n this.managers.passwordManager.getState().then((state) => {\r\n passwordState = state;\r\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\r\n twoFactorRow.freezed = false;\r\n\r\n // console.log('password state', state);\r\n });\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\r\n\r\n section.content.classList.add('privacy-navigation-container');\r\n\r\n const rowsByKeys: Partial<{\r\n [key in InputPrivacyKey['_']]: Row\r\n }> = {};\r\n\r\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\r\n titleLangKey: 'PrivacyPhoneTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyPhoneNumberTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\r\n titleLangKey: 'LastSeenTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyLastSeenTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\r\n titleLangKey: 'PrivacyProfilePhotoTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyProfilePhotoTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\r\n titleLangKey: 'WhoCanCallMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyCallsTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\r\n titleLangKey: 'PrivacyForwardsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyForwardMessagesTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\r\n titleLangKey: 'WhoCanAddMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyAddToGroupsTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const voicesRow = rowsByKeys['inputPrivacyKeyVoiceMessages'] = new Row({\r\n titleLangKey: 'PrivacyVoiceMessagesTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n if(!rootScope.premium) {\r\n toastNew({langPackKey: 'PrivacyVoiceMessagesPremiumOnly'});\r\n } else {\r\n this.slider.createTab(AppPrivacyVoicesTab).open();\r\n }\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\r\n const row = rowsByKeys[key];\r\n if(!row) {\r\n return;\r\n }\r\n\r\n this.managers.appPrivacyManager.getPrivacy(key).then((rules) => {\r\n const details = getPrivacyRulesDetails(rules);\r\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\r\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\r\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\r\n\r\n row.subtitle.innerHTML = '';\r\n const s = i18n(langKey);\r\n row.subtitle.append(s);\r\n if(disallowLength || allowLength) {\r\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\r\n }\r\n });\r\n };\r\n\r\n section.content.append(\r\n numberVisibilityRow.container,\r\n lastSeenTimeRow.container,\r\n photoVisibilityRow.container,\r\n callRow.container,\r\n linkAccountRow.container,\r\n groupChatsAddRow.container,\r\n voicesRow.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 {\r\n const section = new SettingSection({name: 'NewChatsFromNonContacts', caption: 'ArchiveAndMuteInfo'});\r\n\r\n const checkboxField = new CheckboxField({text: 'ArchiveAndMute'});\r\n const row = new Row({\r\n checkboxField\r\n });\r\n\r\n section.content.append(row.container);\r\n\r\n let enabled: boolean, destroyed: boolean;\r\n this.eventListener.addEventListener('destroy', () => {\r\n destroyed = true;\r\n if(enabled === undefined || enabled === checkboxField.checked) return;\r\n return this.managers.appPrivacyManager.setGlobalPrivacySettings({\r\n _: 'globalPrivacySettings',\r\n archive_and_mute_new_noncontact_peers: checkboxField.checked\r\n });\r\n }, {once: true});\r\n\r\n const promise = Promise.all([\r\n p.appConfig,\r\n p.globalPrivacy\r\n ]).then(([appConfig, settings]) => {\r\n if(destroyed) {\r\n return;\r\n }\r\n\r\n const onPremiumToggle = (isPremium: boolean) => {\r\n section.container.classList.toggle('hide', !isPremium && !appConfig.autoarchive_setting_available);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('premium_toggle', onPremiumToggle);\r\n onPremiumToggle(rootScope.premium);\r\n\r\n enabled = !!settings.archive_and_mute_new_noncontact_peers;\r\n\r\n checkboxField.setValueSilently(enabled);\r\n });\r\n\r\n promises.push(promise);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'Privacy.SensitiveContent', caption: 'PrivacyAndSecurity.SensitiveDesc'});\r\n section.container.classList.add('hide');\r\n\r\n const checkboxField = new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText'});\r\n const row = new Row({\r\n checkboxField\r\n });\r\n\r\n section.content.append(row.container);\r\n\r\n let enabled: boolean;\r\n this.eventListener.addEventListener('destroy', () => {\r\n if(enabled === undefined) return;\r\n const _enabled = row.checkboxField.checked;\r\n const isChanged = _enabled !== enabled;\r\n if(!isChanged) {\r\n return;\r\n }\r\n\r\n return this.managers.apiManager.invokeApi('account.setContentSettings', {\r\n sensitive_enabled: _enabled\r\n });\r\n }, {once: true});\r\n\r\n const promise = p.contentSettings.then((settings) => {\r\n if(!settings.pFlags.sensitive_can_change) {\r\n return;\r\n }\r\n\r\n enabled = !!settings.pFlags.sensitive_enabled;\r\n checkboxField.setValueSilently(enabled);\r\n section.container.classList.remove('hide');\r\n });\r\n\r\n promises.push(promise);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyPayments', caption: 'PrivacyPaymentsClearInfo'});\r\n\r\n const onClearClick = () => {\r\n const options: PopupConfirmationOptions = {\r\n titleLangKey: 'PrivacyPaymentsClearAlertTitle',\r\n descriptionLangKey: 'PrivacyPaymentsClearAlertText',\r\n button: {\r\n langKey: 'Clear'\r\n },\r\n checkboxes: [{\r\n text: 'PrivacyClearShipping',\r\n checked: true\r\n }, {\r\n text: 'PrivacyClearPayment',\r\n checked: true\r\n }]\r\n };\r\n\r\n confirmationPopup(options).then(() => {\r\n const [info, payment] = options.checkboxes.map((c) => c.checkboxField.checked);\r\n const toggle = toggleDisability([clearButton], true);\r\n this.managers.appPaymentsManager.clearSavedInfo(info, payment).then(() => {\r\n if(!info && !payment) {\r\n return;\r\n }\r\n\r\n toggle();\r\n toastNew({\r\n langPackKey: info && payment ? 'PrivacyPaymentsPaymentShippingCleared' : (info ? 'PrivacyPaymentsShippingInfoCleared' : 'PrivacyPaymentsPaymentInfoCleared')\r\n });\r\n });\r\n }, noop);\r\n };\r\n\r\n const clearButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyPaymentsClear'});\r\n this.listenerSetter.add(clearButton)('click', onClearClick);\r\n section.content.append(clearButton);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'FilterChats'});\r\n\r\n const onDeleteClick = () => {\r\n const popup = new PopupPeer('popup-delete-drafts', {\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([deleteButton], true);\r\n this.managers.appDraftsManager.clearAllDrafts().then(() => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }],\r\n titleLangKey: 'AreYouSureClearDraftsTitle',\r\n descriptionLangKey: 'AreYouSureClearDrafts'\r\n });\r\n\r\n popup.show();\r\n };\r\n\r\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\r\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\r\n section.content.append(deleteButton);\r\n\r\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then((drafts) => {\r\n const draftsRow = new Row({\r\n titleLangKey: 'PrivacyDeleteCloudDrafts',\r\n subtitleLangKey: 'Drafts',\r\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\r\n icon: 'delete',\r\n clickable: onDeleteClick\r\n });\r\n\r\n section.content.append(draftsRow.container);\r\n })); */\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public updateActiveSessions() {\r\n this.managers.apiManager.invokeApi('account.getAuthorizations').then((auths) => {\r\n this.activeSessionsRow.freezed = false;\r\n this.authorizations = auths.authorizations;\r\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\r\n // console.log('auths', auths);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {renderImageFromUrlPromise} 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 const pixelsLength = pixels.length / 4;\r\n for(let i = 0; i < pixels.length; i += 4) {\r\n // const alphaPixel = pixels[i + 3];\r\n pixel[0] += pixels[i]/* * (alphaPixel / 255) */;\r\n pixel[1] += pixels[i + 1]/* * (alphaPixel / 255) */;\r\n pixel[2] += pixels[i + 2]/* * (alphaPixel / 255) */;\r\n pixel[3] += pixels[i + 3];\r\n }\r\n\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 // outPixel[3] = 255;\r\n return outPixel;\r\n}\r\n\r\nexport function averageColorFromImageSource(imageSource: CanvasImageSource, width: number, height: number) {\r\n const canvas = document.createElement('canvas');\r\n const ratio = width / height;\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(imageSource, 0, 0, width, height, 0, 0, canvas.width, canvas.height);\r\n return averageColorFromCanvas(canvas);\r\n}\r\n\r\nexport function averageColor(imageUrl: string) {\r\n const img = document.createElement('img');\r\n return renderImageFromUrlPromise(img, imageUrl, false).then(() => {\r\n return averageColorFromImageSource(img, img.naturalWidth, img.naturalHeight);\r\n });\r\n};\r\n","import {rgbaToHsla} from './color';\r\n\r\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\r\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\r\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\r\n if(s > 0) {\r\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\r\n }\r\n l = Math.max(0, l * .65);\r\n\r\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\r\n return hsla;\r\n}\r\n","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 private hue = 0;\r\n private saturation = 100;\r\n private lightness = 50;\r\n private alpha = 1;\r\n private elements: {\r\n box: SVGSVGElement,\r\n boxDragger: SVGSVGElement,\r\n sliders: HTMLElement,\r\n hue: SVGSVGElement,\r\n hueDragger: SVGSVGElement,\r\n saturation: SVGLinearGradientElement,\r\n } = {} as any;\r\n private hexInputField: InputField;\r\n private rgbInputField: InputField;\r\n public onChange: (color: ReturnType) => void;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add(ColorPicker.BASE_CLASS);\r\n\r\n const html = `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n\r\n this.container.innerHTML = html;\r\n\r\n this.elements.box = this.container.firstElementChild as any;\r\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\r\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\r\n\r\n this.elements.sliders = this.elements.box.nextElementSibling as any;\r\n\r\n this.elements.hue = this.elements.sliders.firstElementChild as any;\r\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\r\n\r\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\r\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\r\n\r\n const inputs = document.createElement('div');\r\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\r\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\r\n this.container.append(inputs);\r\n\r\n this.hexInputField.input.addEventListener('input', () => {\r\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\r\n\r\n const match = value.match(/([a-fA-F\\d]+)/);\r\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\r\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\r\n\r\n value = '#' + value;\r\n this.hexInputField.setValueSilently(value);\r\n\r\n if(valid) {\r\n this.setColor(value, false, true);\r\n }\r\n });\r\n\r\n // patched https://stackoverflow.com/a/34029238/6758968\r\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\r\n this.rgbInputField.input.addEventListener('input', () => {\r\n const match = this.rgbInputField.value.match(rgbRegExp);\r\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\r\n\r\n if(match) {\r\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\r\n }\r\n });\r\n\r\n this.attachBoxListeners();\r\n this.attachHueListeners();\r\n }\r\n\r\n private onGrabStart = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\r\n };\r\n\r\n private onGrabEnd = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\r\n };\r\n\r\n private attachBoxListeners() {\r\n attachGrabListeners(this.elements.box as any, () => {\r\n this.onGrabStart();\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n // this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.saturationHandler(pos.x, pos.y);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n private attachHueListeners() {\r\n attachGrabListeners(this.elements.hue as any, () => {\r\n this.onGrabStart();\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n // this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.hueHandler(pos.x);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\r\n if(color === undefined) { // * set to red\r\n color = {\r\n h: 0,\r\n s: 100,\r\n l: 50,\r\n a: 1\r\n };\r\n } else if(typeof(color) === 'string') {\r\n if(color[0] === '#') {\r\n color = hexaToHsla(color);\r\n } else {\r\n const rgb = color.match(/[.?\\d]+/g);\r\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\r\n }\r\n }\r\n\r\n // Set box\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n\r\n const boxX = this.boxRect.width / 100 * color.s;\r\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\r\n const boxY = this.boxRect.height / 100 * percentY;\r\n\r\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\r\n\r\n // Set hue\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n\r\n const percentHue = color.h / 360;\r\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\r\n\r\n this.hueHandler(hueX, false);\r\n\r\n // Set values\r\n this.hue = color.h;\r\n this.saturation = color.s;\r\n this.lightness = color.l;\r\n this.alpha = color.a;\r\n\r\n this.updatePicker(updateHexInput, updateRgbInput);\r\n };\r\n\r\n public getCurrentColor(): ColorPickerColor {\r\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\r\n const hexa = rgbaToHexa(rgbaArray);\r\n const hex = hexa.slice(0, -2);\r\n\r\n return {\r\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\r\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\r\n hex: hex,\r\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\r\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\r\n hexa: hexa,\r\n rgbaArray: rgbaArray\r\n };\r\n }\r\n\r\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\r\n const color = this.getCurrentColor();\r\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\r\n\r\n if(updateHexInput) {\r\n this.hexInputField.setValueSilently(color.hex);\r\n this.hexInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(updateRgbInput) {\r\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\r\n this.rgbInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.onChange) {\r\n this.onChange(color);\r\n }\r\n }\r\n\r\n private hueHandler(pageX: number, update = true) {\r\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\r\n\r\n const percents = eventX / this.hueRect.width;\r\n this.hue = Math.round(360 * percents);\r\n\r\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\r\n\r\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\r\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\r\n\r\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n }\r\n\r\n private saturationHandler(pageX: number, pageY: number, update = true) {\r\n const maxX = this.boxRect.width;\r\n const maxY = this.boxRect.height;\r\n\r\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\r\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\r\n\r\n const posX = eventX / maxX * 100;\r\n const posY = eventY / maxY * 100;\r\n\r\n const boxDragger = this.elements.boxDragger;\r\n boxDragger.setAttributeNS(null, 'x', posX + '%');\r\n boxDragger.setAttributeNS(null, 'y', posY + '%');\r\n\r\n const saturation = clamp(posX, 0, 100);\r\n\r\n const lightnessX = 100 - saturation / 2;\r\n const lightnessY = 100 - clamp(posY, 0, 100);\r\n\r\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\r\n\r\n this.saturation = saturation;\r\n this.lightness = lightness;\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '..';\r\nimport {Theme} from '../../../config/state';\r\nimport {hexaToRgba} from '../../../helpers/color';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\r\nimport highlightningColor from '../../../helpers/highlightningColor';\r\nimport throttle from '../../../helpers/schedulers/throttle';\r\nimport themeController from '../../../helpers/themeController';\r\nimport appImManager from '../../../lib/appManagers/appImManager';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport ColorPicker, {ColorPickerColor} from '../../colorPicker';\r\nimport {SliderSuperTab} from '../../slider';\r\n\r\nexport default class AppBackgroundColorTab extends SliderSuperTab {\r\n private colorPicker: ColorPicker;\r\n private grid: HTMLElement;\r\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\r\n private theme: Theme;\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-color-container');\r\n this.setTitle('SetColor');\r\n\r\n this.theme = themeController.getTheme();\r\n\r\n const section = new SettingSection({});\r\n this.colorPicker = new ColorPicker();\r\n\r\n section.content.append(this.colorPicker.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const gridSection = new SettingSection({});\r\n\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n\r\n const colors = [\r\n '#E6EBEE',\r\n '#B2CEE1',\r\n '#008DD0',\r\n '#C6E7CB',\r\n '#C4E1A6',\r\n '#60B16E',\r\n '#CCD0AF',\r\n '#A6A997',\r\n '#7A7072',\r\n '#FDD7AF',\r\n '#FDB76E',\r\n '#DD8851'\r\n ];\r\n\r\n colors.forEach((color) => {\r\n const item = document.createElement('div');\r\n item.classList.add('grid-item');\r\n item.dataset.color = color.toLowerCase();\r\n\r\n // * need for transform scale\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n media.style.backgroundColor = color;\r\n\r\n item.append(media);\r\n grid.append(item);\r\n });\r\n\r\n attachClickEvent(grid, (e) => {\r\n const target = findUpClassName(e.target, 'grid-item');\r\n if(!target || target.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n const color = target.dataset.color;\r\n if(!color) {\r\n return;\r\n }\r\n\r\n this.applyColor(color);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n gridSection.content.append(grid);\r\n this.scrollable.append(gridSection.container);\r\n\r\n this.applyColor = throttle(this._applyColor, 16, true);\r\n }\r\n\r\n private setActive() {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.color ? this.grid.querySelector(`.grid-item[data-color=\"${background.color}\"]`) : null;\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n }\r\n\r\n private _applyColor = (hex: string, updateColorPicker = true) => {\r\n if(updateColorPicker) {\r\n this.colorPicker.setColor(hex);\r\n } else {\r\n const rgba = hexaToRgba(hex);\r\n const background = this.theme.background;\r\n const hsla = highlightningColor(rgba);\r\n\r\n background.id = '2';\r\n background.intensity = 0;\r\n background.slug = '';\r\n background.color = hex.toLowerCase();\r\n background.highlightningColor = hsla;\r\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.setActive();\r\n }\r\n };\r\n\r\n private onColorChange = (color: ColorPickerColor) => {\r\n this.applyColor(color.hex, false);\r\n };\r\n\r\n onOpen() {\r\n setTimeout(() => {\r\n const background = this.theme.background;\r\n\r\n const color = (background.color || '').split(',')[0];\r\n const isColored = !!color && !background.slug;\r\n\r\n // * set active if type is color\r\n if(isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n\r\n this.colorPicker.setColor(color || '#cccccc');\r\n\r\n if(!isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n }, 0);\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.colorPicker.onChange = undefined;\r\n this.colorPicker = undefined;\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {generateSection} from '..';\r\nimport {averageColor, averageColorFromCanvas} from '../../../helpers/averageColor';\r\nimport blur from '../../../helpers/blur';\r\nimport deferredPromise, {CancellablePromise} from '../../../helpers/cancellablePromise';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\r\nimport highlightningColor from '../../../helpers/highlightningColor';\r\nimport copy from '../../../helpers/object/copy';\r\nimport sequentialDom from '../../../helpers/sequentialDom';\r\nimport ChatBackgroundGradientRenderer from '../../chat/gradientRenderer';\r\nimport {Document, PhotoSize, WallPaper} from '../../../layer';\r\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\r\nimport appDownloadManager, {AppDownloadManager, DownloadBlob} from '../../../lib/appManagers/appDownloadManager';\r\nimport appImManager from '../../../lib/appManagers/appImManager';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport Button from '../../button';\r\nimport CheckboxField from '../../checkboxField';\r\nimport ProgressivePreloader from '../../preloader';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport AppBackgroundColorTab from './backgroundColor';\r\nimport choosePhotoSize from '../../../lib/appManagers/utils/photos/choosePhotoSize';\r\nimport {STATE_INIT, Theme} from '../../../config/state';\r\nimport themeController from '../../../helpers/themeController';\r\nimport requestFile from '../../../helpers/files/requestFile';\r\nimport {renderImageFromUrlPromise} from '../../../helpers/dom/renderImageFromUrl';\r\nimport scaleMediaElement from '../../../helpers/canvas/scaleMediaElement';\r\nimport {MediaSize} from '../../../helpers/mediaSize';\r\nimport wrapPhoto from '../../wrappers/photo';\r\nimport {CreateRowFromCheckboxField} from '../../row';\r\n\r\nexport default class AppBackgroundTab extends SliderSuperTab {\r\n private grid: HTMLElement;\r\n private tempId = 0;\r\n private clicked: Set = new Set();\r\n private blurCheckboxField: CheckboxField;\r\n\r\n private wallPapersByElement: Map = new Map();\r\n private elementsByKey: Map = new Map();\r\n\r\n private get theme() {\r\n return themeController.getTheme();\r\n }\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-image-container');\r\n this.setTitle('ChatBackground');\r\n\r\n {\r\n const container = generateSection(this.scrollable);\r\n\r\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\r\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\r\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\r\n\r\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(colorButton, () => {\r\n this.slider.createTab(AppBackgroundColorTab).open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\r\n\r\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\r\n text: 'ChatBackground.Blur',\r\n name: 'blur',\r\n checked: this.theme.background.blur\r\n });\r\n\r\n this.listenerSetter.add(blurCheckboxField.input)('change', async() => {\r\n this.theme.background.blur = blurCheckboxField.input.checked;\r\n await this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n // * wait for animation end\r\n setTimeout(() => {\r\n const active = grid.querySelector('.active') as HTMLElement;\r\n if(!active) return;\r\n\r\n const wallpaper = this.wallPapersByElement.get(active);\r\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\r\n return;\r\n }\r\n\r\n this.setBackgroundDocument(wallpaper);\r\n }, 100);\r\n });\r\n\r\n container.append(\r\n uploadButton,\r\n colorButton,\r\n resetButton,\r\n CreateRowFromCheckboxField(blurCheckboxField).container\r\n );\r\n }\r\n\r\n rootScope.addEventListener('background_change', this.setActive);\r\n\r\n this.managers.appDocsManager.getWallPapers().then((wallPapers) => {\r\n wallPapers.forEach((wallPaper) => {\r\n this.addWallPaper(wallPaper);\r\n });\r\n });\r\n\r\n const gridContainer = generateSection(this.scrollable);\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\r\n gridContainer.append(grid);\r\n }\r\n\r\n private onUploadClick = () => {\r\n requestFile('image/x-png,image/png,image/jpeg').then(async(file) => {\r\n if(file.name.endsWith('.png')) {\r\n const img = document.createElement('img');\r\n const url = URL.createObjectURL(file);\r\n await renderImageFromUrlPromise(img, url, false);\r\n const mimeType = 'image/jpeg';\r\n const {blob} = await scaleMediaElement({media: img, size: new MediaSize(img.naturalWidth, img.naturalHeight), mimeType});\r\n file = new File([blob], file.name.replace(/\\.png$/, '.jpg'), {type: mimeType});\r\n }\r\n\r\n const wallPaper = await this.managers.appDocsManager.prepareWallPaperUpload(file);\r\n const uploadPromise = this.managers.appDocsManager.uploadWallPaper(wallPaper.id);\r\n const uploadDeferred: CancellablePromise = appDownloadManager.getNewDeferredForUpload(file.name, uploadPromise);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = uploadDeferred.addNotifyListener;\r\n deferred.cancel = uploadDeferred.cancel;\r\n\r\n uploadDeferred.then((wallPaper) => {\r\n this.clicked.delete(key);\r\n this.elementsByKey.delete(key);\r\n this.wallPapersByElement.set(container, wallPaper);\r\n const newKey = this.getWallPaperKey(wallPaper);\r\n this.elementsByKey.set(newKey, container);\r\n\r\n this.setBackgroundDocument(wallPaper).then(deferred.resolve, deferred.reject);\r\n }, deferred.reject);\r\n\r\n const key = this.getWallPaperKey(wallPaper);\r\n deferred.catch(() => {\r\n container.remove();\r\n });\r\n\r\n const preloader = new ProgressivePreloader({\r\n isUpload: true,\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const container = this.addWallPaper(wallPaper, false);\r\n this.clicked.add(key);\r\n\r\n preloader.attach(container, false, deferred);\r\n });\r\n };\r\n\r\n private onResetClick = () => {\r\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === this.theme.name);\r\n if(defaultTheme) {\r\n ++this.tempId;\r\n this.theme.background = copy(defaultTheme.background);\r\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\r\n }\r\n };\r\n\r\n private getColorsFromWallPaper(wallPaper: WallPaper) {\r\n return wallPaper.settings ? [\r\n wallPaper.settings.background_color,\r\n wallPaper.settings.second_background_color,\r\n wallPaper.settings.third_background_color,\r\n wallPaper.settings.fourth_background_color\r\n ].filter(Boolean).map((color) => '#' + color.toString(16)).join(',') : '';\r\n }\r\n\r\n private getWallPaperKey(wallPaper: WallPaper) {\r\n return '' + wallPaper.id;\r\n }\r\n\r\n private getWallPaperKeyFromTheme(theme: Theme) {\r\n return '' + theme.background.id;\r\n }\r\n\r\n private addWallPaper(wallPaper: WallPaper, append = true) {\r\n const colors = this.getColorsFromWallPaper(wallPaper);\r\n const hasFile = wallPaper._ === 'wallPaper';\r\n if((hasFile && wallPaper.pFlags.pattern && !colors)/* ||\r\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\r\n return;\r\n }\r\n\r\n const isDark = !!wallPaper.pFlags.dark;\r\n\r\n const doc = hasFile ? wallPaper.document as Document.document : undefined;\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('grid-item');\r\n\r\n container.dataset.id = '' + wallPaper.id;\r\n\r\n const key = this.getWallPaperKey(wallPaper);\r\n this.wallPapersByElement.set(container, wallPaper);\r\n this.elementsByKey.set(key, container);\r\n\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n\r\n let wrapped: ReturnType, size: ReturnType;\r\n if(hasFile) {\r\n size = choosePhotoSize(doc, 200, 200);\r\n wrapped = wrapPhoto({\r\n photo: doc,\r\n message: null,\r\n container: media,\r\n withoutPreloader: true,\r\n size: size,\r\n noFadeIn: wallPaper.pFlags.pattern\r\n });\r\n\r\n if(wallPaper.pFlags.pattern) {\r\n media.classList.add('is-pattern');\r\n }\r\n\r\n wrapped.then(async({loadPromises, images}) => {\r\n await loadPromises.thumb || loadPromises.full;\r\n return images;\r\n }).then((images) => {\r\n if(wallPaper.pFlags.pattern) {\r\n if(isDark) {\r\n images.full.style.display = 'none';\r\n if(images.thumb) {\r\n images.thumb.style.display = 'none';\r\n }\r\n } else if(wallPaper.settings?.intensity) {\r\n images.full.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\r\n }\r\n }\r\n\r\n sequentialDom.mutate(() => {\r\n container.append(media);\r\n });\r\n });\r\n } else {\r\n container.append(media);\r\n }\r\n\r\n if(wallPaper.settings && wallPaper.settings.background_color !== undefined) {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\r\n canvas.classList.add('background-colors-canvas');\r\n\r\n if(isDark && hasFile) {\r\n wrapped.then(({loadPromises}) => {\r\n loadPromises.full.then(async() => {\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\r\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\r\n canvas.style.opacity = '' + (wallPaper.pFlags.dark ? 100 + wallPaper.settings.intensity : wallPaper.settings.intensity) / 100;\r\n media.append(canvas);\r\n });\r\n });\r\n } else {\r\n media.append(canvas);\r\n }\r\n }\r\n\r\n if(this.getWallPaperKeyFromTheme(this.theme) === key) {\r\n container.classList.add('active');\r\n }\r\n\r\n this.grid[append ? 'append' : 'prepend'](container);\r\n\r\n return container;\r\n }\r\n\r\n private onGridClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\r\n if(!target) return;\r\n\r\n const wallpaper = this.wallPapersByElement.get(target);\r\n if(wallpaper._ === 'wallPaperNoFile') {\r\n this.setBackgroundDocument(wallpaper);\r\n return;\r\n }\r\n\r\n const key = this.getWallPaperKey(wallpaper);\r\n if(this.clicked.has(key)) return;\r\n this.clicked.add(key);\r\n\r\n const doc = wallpaper.document as MyDocument;\r\n const preloader = new ProgressivePreloader({\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const load = async() => {\r\n const promise = this.setBackgroundDocument(wallpaper);\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\r\n if(!cacheContext.url || this.theme.background.blur) {\r\n preloader.attach(target, true, promise);\r\n }\r\n };\r\n\r\n preloader.construct();\r\n\r\n attachClickEvent(target, (e) => {\r\n if(preloader.preloader.parentElement) {\r\n preloader.onClick(e);\r\n preloader.detach();\r\n } else {\r\n load();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n load();\r\n\r\n // console.log(doc);\r\n };\r\n\r\n private saveToCache = (slug: string, url: string) => {\r\n fetch(url).then((response) => {\r\n appImManager.cacheStorage.save('backgrounds/' + slug, response);\r\n });\r\n };\r\n\r\n private setBackgroundDocument = (wallPaper: WallPaper) => {\r\n const _tempId = ++this.tempId;\r\n const middleware = () => _tempId === this.tempId;\r\n\r\n const doc = (wallPaper as WallPaper.wallPaper).document as MyDocument;\r\n const deferred = deferredPromise();\r\n let download: Promise | ReturnType;\r\n if(doc) {\r\n download = appDownloadManager.downloadMediaURL({media: doc, queueId: appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0});\r\n deferred.addNotifyListener = download.addNotifyListener;\r\n deferred.cancel = download.cancel;\r\n } else {\r\n download = Promise.resolve();\r\n }\r\n\r\n download.then(async() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n const background = this.theme.background;\r\n const onReady = (url?: string) => {\r\n // const perf = performance.now();\r\n let getPixelPromise: Promise;\r\n const backgroundColor = this.getColorsFromWallPaper(wallPaper);\r\n if(url && !backgroundColor) {\r\n getPixelPromise = averageColor(url);\r\n } else {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(backgroundColor);\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 = backgroundColor;\r\n background.slug = slug;\r\n background.highlightningColor = hsla;\r\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n if(slug) {\r\n this.saveToCache(slug, url);\r\n }\r\n\r\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\r\n });\r\n };\r\n\r\n if(!doc) {\r\n onReady();\r\n return;\r\n }\r\n\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\r\n if(background.blur) {\r\n setTimeout(() => {\r\n const {canvas, promise} = blur(cacheContext.url, 12, 4)\r\n promise.then(() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(canvas.toDataURL());\r\n });\r\n }, 200);\r\n } else {\r\n onReady(cacheContext.url);\r\n }\r\n });\r\n\r\n return deferred;\r\n };\r\n\r\n private setActive = () => {\r\n const active = this.grid.querySelector('.active');\r\n const target = this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n };\r\n}\r\n","export default function requestFile(accept?: string) {\n const input = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n\n if(accept) {\n input.accept = accept;\n }\n\n document.body.append(input);\n\n const promise = new Promise((resolve, reject) => {\n input.addEventListener('change', (e: any) => {\n const file: File = e.target.files[0];\n if(!file) {\n reject('NO_FILE_SELECTED');\n return;\n }\n\n resolve(file);\n }, {once: true});\n }).finally(() => {\n input.remove();\n });\n\n input.click();\n\n return promise;\n}\n","/*\n * 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 {AvailableReaction} from '../../../layer';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SliderSuperTab from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n public init() {\n this.header.classList.add('with-border');\n this.setTitle('DoubleTapSetting');\n this.container.classList.add('quick-reaction-container');\n\n return Promise.all([\n this.managers.appReactionsManager.getQuickReaction(),\n this.managers.appReactionsManager.getAvailableReactions()\n ]).then(([quickReaction, availableReactions]) => {\n availableReactions = availableReactions.filter((reaction) => !reaction.pFlags.inactive);\n\n const section = new SettingSection();\n\n const name = 'quick-reaction';\n const rows = availableReactions.map((availableReaction) => {\n const radioField = new RadioField({\n name,\n text: availableReaction.title,\n value: availableReaction.reaction,\n alignRight: true\n });\n\n const row = new Row({\n radioField,\n havePadding: true\n });\n\n radioField.main.classList.add('quick-reaction-title');\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n if(availableReaction.reaction === (quickReaction as AvailableReaction).reaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n this.managers.appReactionsManager.setDefaultReaction({_: 'reactionEmoji', emoticon: value});\n });\n\n section.content.append(form);\n this.scrollable.append(section.container);\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {generateSection, SettingSection} from '..';\r\nimport RangeSelector from '../../rangeSelector';\r\nimport Button from '../../button';\r\nimport CheckboxField from '../../checkboxField';\r\nimport RadioField from '../../radioField';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {IS_APPLE} from '../../../environment/userAgent';\r\nimport Row, {CreateRowFromCheckboxField} from '../../row';\r\nimport AppBackgroundTab from './background';\r\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport assumeType from '../../../helpers/assumeType';\r\nimport {AvailableReaction, MessagesAllStickers, StickerSet} from '../../../layer';\r\nimport LazyLoadQueue from '../../lazyLoadQueue';\r\nimport PopupStickers from '../../popups/stickers';\r\nimport eachMinute from '../../../helpers/eachMinute';\r\nimport {SliderSuperTabEventable} from '../../sliderTab';\r\nimport IS_GEOLOCATION_SUPPORTED from '../../../environment/geolocationSupport';\r\nimport AppQuickReactionTab from './quickReaction';\r\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\r\nimport {State} from '../../../config/state';\r\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\r\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\r\n\r\nexport class RangeSettingSelector {\r\n public container: HTMLDivElement;\r\n public valueContainer: HTMLElement;\r\n private range: RangeSelector;\r\n\r\n public onChange: (value: number) => void;\r\n\r\n constructor(\r\n name: LangPackKey,\r\n step: number,\r\n initialValue: number,\r\n minValue: number,\r\n maxValue: number,\r\n writeValue = true\r\n ) {\r\n const BASE_CLASS = 'range-setting-selector';\r\n this.container = document.createElement('div');\r\n this.container.classList.add(BASE_CLASS);\r\n\r\n const details = document.createElement('div');\r\n details.classList.add(BASE_CLASS + '-details');\r\n\r\n const nameDiv = document.createElement('div');\r\n nameDiv.classList.add(BASE_CLASS + '-name');\r\n _i18n(nameDiv, name);\r\n\r\n const valueDiv = this.valueContainer = document.createElement('div');\r\n valueDiv.classList.add(BASE_CLASS + '-value');\r\n\r\n if(writeValue) {\r\n valueDiv.innerHTML = '' + initialValue;\r\n }\r\n\r\n details.append(nameDiv, valueDiv);\r\n\r\n this.range = new RangeSelector({\r\n step,\r\n min: minValue,\r\n max: maxValue\r\n }, initialValue);\r\n this.range.setListeners();\r\n this.range.setHandlers({\r\n onScrub: value => {\r\n if(this.onChange) {\r\n this.onChange(value);\r\n }\r\n\r\n if(writeValue) {\r\n // console.log('font size scrub:', value);\r\n valueDiv.innerText = '' + value;\r\n }\r\n }\r\n });\r\n\r\n this.container.append(details, this.range.container);\r\n }\r\n}\r\n\r\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('general-settings-container');\r\n this.setTitle('General');\r\n\r\n const section = generateSection.bind(null, this.scrollable);\r\n\r\n {\r\n const container = section('Settings');\r\n\r\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\r\n range.onChange = (value) => {\r\n rootScope.managers.appStateManager.setByKey('settings.messagesTextSize', value);\r\n };\r\n\r\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\r\n\r\n attachClickEvent(chatBackgroundButton, () => {\r\n this.slider.createTab(AppBackgroundTab).open();\r\n });\r\n\r\n const animationsCheckboxField = new CheckboxField({\r\n text: 'EnableAnimations',\r\n name: 'animations',\r\n stateKey: 'settings.animationsEnabled',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n container.append(\r\n range.container,\r\n chatBackgroundButton,\r\n CreateRowFromCheckboxField(animationsCheckboxField).container\r\n );\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 listenerSetter: this.listenerSetter\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 listenerSetter: this.listenerSetter\r\n });\r\n\r\n container.append(\r\n CreateRowFromCheckboxField(suggestCheckboxField).container,\r\n CreateRowFromCheckboxField(bigCheckboxField).container\r\n );\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\r\n\r\n const reactionsRow = new Row({\r\n titleLangKey: 'DoubleTapSetting',\r\n havePadding: true,\r\n clickable: () => {\r\n this.slider.createTab(AppQuickReactionTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const renderQuickReaction = () => {\r\n this.managers.appReactionsManager.getQuickReaction().then((reaction) => {\r\n if(reaction._ === 'availableReaction') {\r\n return reaction.static_icon;\r\n } else {\r\n return this.managers.appEmojiManager.getCustomEmojiDocument(reaction.document_id);\r\n }\r\n }).then((doc) => {\r\n wrapStickerToRow({\r\n row: reactionsRow,\r\n doc,\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 listenerSetter: this.listenerSetter\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 listenerSetter: this.listenerSetter\r\n });\r\n\r\n const stickerSets: {[id: string]: Row} = {};\r\n\r\n const stickersContent = section.generateContentElement();\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\r\n const row = new Row({\r\n title: wrapEmojiText(stickerSet.title),\r\n subtitleLangKey: 'Stickers',\r\n subtitleLangArgs: [stickerSet.count],\r\n havePadding: true,\r\n clickable: () => {\r\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\r\n },\r\n listenerSetter: this.listenerSetter\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: 36,\r\n height: 36,\r\n autoplay: true\r\n });\r\n\r\n row.container.append(div);\r\n\r\n stickersContent[method](row.container);\r\n };\r\n\r\n this.managers.appStickersManager.getAllStickers().then((allStickers) => {\r\n assumeType(allStickers);\r\n for(const stickerSet of allStickers.sets) {\r\n renderStickerSet(stickerSet);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\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', (set) => {\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(\r\n reactionsRow.container,\r\n CreateRowFromCheckboxField(suggestCheckboxField).container,\r\n CreateRowFromCheckboxField(loopCheckboxField).container\r\n );\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport eachTimeout from './eachTimeout';\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachMinute(callback: () => any, runFirst = true) {\n return eachTimeout(callback, () => (60 - new Date().getSeconds()) * 1000, runFirst);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../environment/ctx';\nimport noop from './noop';\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachTimeout(callback: () => any, getNextTimeout: () => number, runFirst = true) {\n const cancel = () => {\n clearTimeout(timeout);\n };\n\n // replace callback to run noop and restore after\n const _callback = callback;\n if(!runFirst) {\n callback = noop;\n }\n\n let timeout: number;\n (function run() {\n callback();\n timeout = ctx.setTimeout(run, getNextTimeout());\n })();\n\n callback = _callback;\n\n return cancel;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from '../../inputField';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport EditPeer from '../../editPeer';\r\nimport {UsernameInputField} from '../../usernameInputField';\r\nimport {i18n, i18n_} from '../../../lib/langPack';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {generateSection, SettingSection} from '..';\r\nimport anchorCopy from '../../../helpers/dom/anchorCopy';\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 public static getInitArgs() {\r\n return {\r\n bioMaxLength: rootScope.managers.apiManager.getLimit('bio'),\r\n user: rootScope.managers.appUsersManager.getSelf(),\r\n userFull: rootScope.managers.appProfileManager.getProfile(rootScope.myId.toUserId())\r\n };\r\n }\r\n\r\n public async init(p: ReturnType) {\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 const [bioMaxLength, user, userFull] = await Promise.all([p.bioMaxLength, p.user, p.userFull]);\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: bioMaxLength\r\n });\r\n\r\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\r\n\r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'Bio.Description'});\r\n\r\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: rootScope.myId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n }\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'EditAccount.Username',\r\n caption: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.usernameInputField = new UsernameInputField({\r\n label: 'EditProfile.Username.Label',\r\n name: 'username',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n onChange: () => {\r\n this.editPeer.handleChange();\r\n this.setProfileUrl();\r\n },\r\n availableText: 'EditProfile.Username.Available',\r\n takenText: 'EditProfile.Username.Taken',\r\n invalidText: 'EditProfile.Username.Invalid'\r\n }, this.managers);\r\n\r\n inputWrapper.append(this.usernameInputField.container);\r\n\r\n const caption = section.caption;\r\n caption.append(i18n('UsernameSettings.ChangeDescription'));\r\n caption.append(document.createElement('br'), document.createElement('br'));\r\n\r\n const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\r\n profileUrlContainer.classList.add('profile-url-container');\r\n\r\n const profileUrlAnchor = this.profileUrlAnchor = anchorCopy();\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 const promises: Promise[] = [];\r\n\r\n const profilePromise = this.managers.appProfileManager.updateProfile(\r\n this.firstNameInputField.value,\r\n this.lastNameInputField.value,\r\n this.bioInputField.value\r\n );\r\n promises.push(profilePromise.then(() => {\r\n this.close();\r\n }, (err) => {\r\n console.error('updateProfile error:', err);\r\n }));\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\r\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\r\n }));\r\n }\r\n\r\n if(this.usernameInputField.isValidToChange()) {\r\n promises.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n 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 this.profileUrlAnchor.replaceWith(this.profileUrlAnchor = anchorCopy({mePath: this.usernameInputField.value}));\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '..';\r\nimport Row from '../../row';\r\nimport CheckboxField from '../../checkboxField';\r\nimport {InputNotifyPeer, Update} from '../../../layer';\r\nimport {SliderSuperTabEventable} from '../../sliderTab';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {LangPackKey} from '../../../lib/langPack';\r\nimport copy from '../../../helpers/object/copy';\r\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\r\nimport {MUTE_UNTIL} from '../../../lib/mtproto/mtproto_config';\r\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\r\n\r\ntype InputNotifyKey = Exclude;\r\n\r\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\r\n public 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 listenerSetter: this.listenerSetter,\r\n withCheckboxSubtitle: true\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 listenerSetter: this.listenerSetter,\r\n withCheckboxSubtitle: true\r\n });\r\n\r\n section.content.append(enabledRow.container, previewEnabledRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const inputNotifyPeer = {_: options.inputKey};\r\n const ret = this.managers.appNotificationsManager.getNotifySettings(inputNotifyPeer);\r\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\r\n const applySettings = async() => {\r\n const muted = await this.managers.appNotificationsManager.isMuted(notifySettings);\r\n enabledRow.checkboxField.checked = !muted;\r\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\r\n\r\n return muted;\r\n };\r\n\r\n applySettings();\r\n\r\n this.eventListener.addEventListener('destroy', async() => {\r\n const mute = !enabledRow.checkboxField.checked;\r\n const showPreviews = previewEnabledRow.checkboxField.checked;\r\n\r\n if(mute === (await this.managers.appNotificationsManager.isMuted(notifySettings)) && showPreviews === notifySettings.show_previews) {\r\n return;\r\n }\r\n\r\n const inputSettings: any = copy(notifySettings);\r\n inputSettings._ = 'inputPeerNotifySettings';\r\n inputSettings.mute_until = mute ? MUTE_UNTIL : 0;\r\n inputSettings.show_previews = showPreviews;\r\n\r\n this.managers.appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\r\n }, {once: true});\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\r\n const inputKey = convertKeyToInputKey(update.peer._) as any;\r\n if(options.inputKey === inputKey) {\r\n notifySettings = update.notify_settings;\r\n applySettings();\r\n }\r\n });\r\n });\r\n };\r\n\r\n NotifySection({\r\n name: 'NotificationsPrivateChats',\r\n typeText: 'NotificationsForPrivateChats',\r\n inputKey: 'inputNotifyUsers'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsGroups',\r\n typeText: 'NotificationsForGroups',\r\n inputKey: 'inputNotifyChats'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsChannels',\r\n typeText: 'NotificationsForChannels',\r\n inputKey: 'inputNotifyBroadcasts'\r\n });\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'NotificationsOther'\r\n });\r\n\r\n const contactsSignUpRow = new Row({\r\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n listenerSetter: this.listenerSetter,\r\n withCheckboxSubtitle: true\r\n });\r\n\r\n const soundRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound', listenerSetter: this.listenerSetter}),\r\n subtitleLangKey: 'Loading',\r\n listenerSetter: this.listenerSetter,\r\n withCheckboxSubtitle: true\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n soundRow.checkboxField.checked = state.settings.notifications.sound;\r\n });\r\n\r\n section.content.append(contactsSignUpRow.container, soundRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n this.managers.appNotificationsManager.getContactSignUpNotification().then((enabled) => {\r\n contactsSignUpRow.checkboxField.checked = enabled;\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = contactsSignUpRow.checkboxField.checked;\r\n if(enabled !== _enabled) {\r\n this.managers.appNotificationsManager.setContactSignUpNotification(!_enabled);\r\n }\r\n }, {once: true});\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '..';\r\nimport {randomLong} from '../../../helpers/random';\r\nimport {LangPackLanguage} from '../../../layer';\r\nimport I18n from '../../../lib/langPack';\r\nimport rootScope from '../../../lib/rootScope';\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 public static getInitArgs() {\r\n return {\r\n languages1: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'web'\r\n }),\r\n // languages2: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n // lang_pack: 'macos'\r\n // })\r\n languages2: Promise.resolve([] as LangPackLanguage[])\r\n };\r\n }\r\n\r\n public init(p: ReturnType) {\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 = Promise.all([\r\n p.languages1,\r\n p.languages2\r\n ]).then(([languages1, languages2]) => {\r\n const rendered: Set = new Set();\r\n const webLangCodes = languages1.map((language) => language.lang_code);\r\n\r\n const random = randomLong();\r\n languages1.concat(languages2).forEach((language) => {\r\n if(rendered.has(language.lang_code)) return;\r\n rendered.add(language.lang_code);\r\n\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, webLangCodes.includes(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 type ListenerSetter from '../../../../helpers/listenerSetter';\nimport {SettingSection} from '../..';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport CheckboxField from '../../../checkboxField';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport Row, {CreateRowFromCheckboxField} from '../../../row';\n\nexport function autoDownloadPeerTypeSection(type: 'photo' | 'video' | 'file', title: LangPackKey, listenerSetter: ListenerSetter) {\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 listenerSetter\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats',\n name: 'private',\n stateKey: key + 'private',\n listenerSetter\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats',\n name: 'groups',\n stateKey: key + 'groups',\n listenerSetter\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels',\n name: 'channels',\n stateKey: key + 'channels',\n listenerSetter\n });\n\n section.content.append(\n CreateRowFromCheckboxField(contactsCheckboxField).container,\n CreateRowFromCheckboxField(privateCheckboxField).container,\n CreateRowFromCheckboxField(groupsCheckboxField).container,\n CreateRowFromCheckboxField(channelsCheckboxField).container\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n public init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadPhotos');\n\n const section = autoDownloadPeerTypeSection('photo', 'AutoDownloadPhotosTitle', this.listenerSetter);\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport formatBytes from '../../../../helpers/formatBytes';\nimport debounce from '../../../../helpers/schedulers/debounce';\nimport I18n from '../../../../lib/langPack';\nimport rootScope from '../../../../lib/rootScope';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport {RangeSettingSelector} from '../generalSettings';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadFileTab extends SliderSuperTabEventable {\n public init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadFiles');\n\n const debouncedSave = debounce((sizeMax: number) => {\n this.managers.appStateManager.setByKey('settings.autoDownloadNew.file_size_max', sizeMax);\n }, 200, false, true);\n\n const section = autoDownloadPeerTypeSection('file', 'AutoDownloadFilesTitle', this.listenerSetter);\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 public init() {\n this.header.classList.add('with-border');\n this.setTitle('AutoDownloadVideos');\n\n const section = autoDownloadPeerTypeSection('video', 'AutoDownloadVideosTitle', this.listenerSetter);\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AutoDownloadPeerTypeSettings, STATE_INIT} from '../../../config/state';\nimport {SettingSection} from '..';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport formatBytes from '../../../helpers/formatBytes';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {FormatterArguments, i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport {SliderSuperTabEventable, SliderSuperTabEventableConstructable} from '../../sliderTab';\nimport AppAutoDownloadFileTab from './autoDownload/file';\nimport AppAutoDownloadPhotoTab from './autoDownload/photo';\nimport AppAutoDownloadVideoTab from './autoDownload/video';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\n\nconst AUTO_DOWNLOAD_FOR_KEYS: {[k in keyof AutoDownloadPeerTypeSettings]: LangPackKey} = {\n contacts: 'AutoDownloadContacts',\n private: 'AutoDownloadPm',\n groups: 'AutoDownloadGroups',\n channels: 'AutoDownloadChannels'\n};\n\nexport default class AppDataAndStorageTab extends SliderSuperTabEventable {\n public async init() {\n this.header.classList.add('with-border');\n this.setTitle('DataSettings');\n\n {\n const section = new SettingSection({name: 'AutomaticMediaDownload', caption: 'AutoDownloadAudioInfo'});\n\n const state = await apiManagerProxy.getState();\n\n const autoCheckboxField = new CheckboxField({\n text: 'AutoDownloadMedia',\n name: 'auto',\n checked: !state.settings.autoDownloadNew.pFlags.disabled,\n listenerSetter: this.listenerSetter\n });\n\n const autoRow = new Row({\n checkboxField: autoCheckboxField,\n listenerSetter: this.listenerSetter\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 = this.slider.createTab(tabConstructor);\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 listenerSetter: this.listenerSetter\n });\n\n const videoRow = new Row({\n titleLangKey: 'AutoDownloadVideos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadVideoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const fileRow = new Row({\n titleLangKey: 'AutoDownloadFiles',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadFileTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const resetButton = Button('btn-primary btn-transparent primary', {icon: 'delete', text: 'ResetAutomaticMediaDownload'});\n attachClickEvent(resetButton, () => {\n confirmationPopup({\n titleLangKey: 'ResetAutomaticMediaDownloadAlertTitle',\n descriptionLangKey: 'ResetAutomaticMediaDownloadAlert',\n button: {\n langKey: 'Reset'\n }\n }).then(() => {\n const settings = rootScope.settings;\n settings.autoDownloadNew = copy(STATE_INIT.settings.autoDownloadNew);\n settings.autoDownload = copy(STATE_INIT.settings.autoDownload);\n state.settings = settings;\n this.managers.appStateManager.setByKey('settings', settings);\n\n setSubtitles();\n autoCheckboxField.checked = !state.settings.autoDownloadNew.pFlags.disabled;\n });\n });\n\n const onDisabledChange = () => {\n const disabled = !autoCheckboxField.checked;\n\n const settings = rootScope.settings;\n if(disabled) {\n settings.autoDownloadNew.pFlags.disabled = true;\n } else {\n delete settings.autoDownloadNew.pFlags.disabled;\n }\n\n [photoRow, videoRow, fileRow].forEach((row) => {\n row.container.classList.toggle('is-disabled', disabled);\n });\n\n this.managers.appStateManager.setByKey('settings', settings);\n\n onChange();\n };\n\n autoCheckboxField.input.addEventListener('change', onDisabledChange);\n onDisabledChange();\n setSubtitles();\n\n section.content.append(\n autoRow.container,\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 section.content.append(new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayGIF',\n name: 'gifs',\n stateKey: 'settings.autoPlay.gifs',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container, new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayVideo',\n name: 'videos',\n stateKey: 'settings.autoPlay.videos',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n\n const peerKeys = Object.keys(settings) as (keyof typeof AUTO_DOWNLOAD_FOR_KEYS)[];\n const enabledKeys = peerKeys.map((key) => settings[key] ? AUTO_DOWNLOAD_FOR_KEYS[key] : undefined).filter(Boolean);\n if(!enabledKeys.length || sizeMax === 0) {\n key = 'AutoDownloadOff';\n } else {\n const isAll = enabledKeys.length === peerKeys.length;\n if(sizeMax !== undefined) {\n key = isAll ? 'AutoDownloadUpToOnAllChats' : 'AutoDownloadOnUpToFor';\n args.push(formatBytes(sizeMax));\n } else {\n key = isAll ? 'AutoDownloadOnAllChats' : 'AutoDownloadOnFor';\n }\n\n if(!isAll) {\n const fragment = document.createElement('span');\n fragment.append(...join(enabledKeys.map((key) => i18n(key)), true, false));\n args.push(fragment);\n }\n }\n\n replaceContent(row.subtitle, i18n(key, args));\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider';\r\nimport ButtonMenuToggle from '../../buttonMenuToggle';\r\nimport Button from '../../button';\r\nimport AppPrivacyAndSecurityTab from './privacyAndSecurity';\r\nimport AppGeneralSettingsTab from './generalSettings';\r\nimport AppEditProfileTab from './editProfile';\r\nimport AppChatFoldersTab from './chatFolders';\r\nimport AppNotificationsTab from './notifications';\r\nimport AppLanguageTab from './language';\r\nimport lottieLoader from '../../../lib/rlottie/lottieLoader';\r\nimport PopupPeer from '../../popups/peer';\r\nimport AppDataAndStorageTab from './dataAndStorage';\r\nimport ButtonIcon from '../../buttonIcon';\r\nimport PeerProfile from '../../peerProfile';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {SettingSection} from '..';\r\nimport Row from '../../row';\r\nimport AppActiveSessionsTab from './activeSessions';\r\nimport {i18n, LangPackKey} from '../../../lib/langPack';\r\nimport {SliderSuperTabConstructable, SliderSuperTabEventable} from '../../sliderTab';\r\nimport PopupAvatar from '../../popups/avatar';\r\nimport {AccountAuthorizations, Authorization} from '../../../layer';\r\nimport PopupElement from '../../popups';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\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 public async init() {\r\n this.container.classList.add('settings-container');\r\n this.setTitle('Settings');\r\n\r\n const btnMenu = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', [{\r\n icon: 'logout',\r\n text: 'EditAccount.Logout',\r\n onClick: () => {\r\n new PopupPeer('logout', {\r\n titleLangKey: 'LogOut',\r\n descriptionLangKey: 'LogOut.Description',\r\n buttons: [{\r\n langKey: 'LogOut',\r\n callback: () => {\r\n this.managers.apiManager.logOut();\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n }]);\r\n\r\n this.buttons.edit = ButtonIcon('edit');\r\n\r\n this.header.append(this.buttons.edit, btnMenu);\r\n\r\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter, false);\r\n this.profile.init();\r\n this.profile.setPeer(rootScope.myId);\r\n const fillPromise = this.profile.fillProfileElements();\r\n\r\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\r\n attachClickEvent(changeAvatarBtn, () => {\r\n const canvas = document.createElement('canvas');\r\n PopupElement.createPopup(PopupAvatar).open(canvas, (upload) => {\r\n upload().then((inputFile) => {\r\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\r\n\r\n const updateChangeAvatarBtn = async() => {\r\n const user = await this.managers.appUsersManager.getSelf();\r\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\r\n };\r\n\r\n updateChangeAvatarBtn();\r\n this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\r\n if(rootScope.myId === peerId) {\r\n updateChangeAvatarBtn();\r\n }\r\n });\r\n\r\n /* const div = document.createElement('div');\r\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\r\n //div.style.width = '135px';\r\n //div.style.height = '100px';\r\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\r\n div.style.width = '135px';\r\n div.style.height = '100px';\r\n\r\n const img = document.createElement('img');\r\n img.src = 'assets/img/pepe.jpg';\r\n img.classList.add('media-photo');\r\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\r\n\r\n div.append(img);\r\n\r\n div.addEventListener('click', () => {\r\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\r\n _: 'message',\r\n mid: 1,\r\n peerId: 61004386,\r\n fromId: 61004386,\r\n message: '',\r\n media: {\r\n _: 'messageMediaPhoto',\r\n photo: {\r\n _: 'photo',\r\n url: img.src,\r\n downloaded: 111,\r\n sizes: [{\r\n _: 'photoSize',\r\n type: 'x',\r\n w: 618,\r\n h: 412\r\n }]\r\n }\r\n },\r\n date: Date.now() / 1000 | 0\r\n }, img);\r\n });\r\n\r\n this.scrollable.append(div); */\r\n\r\n const buttonsDiv = document.createElement('div');\r\n buttonsDiv.classList.add('profile-buttons');\r\n\r\n type ConstructorP = T extends {\r\n new (...args: any[]): infer U;\r\n } ? U : never;\r\n\r\n const m = (\r\n icon: string,\r\n text: LangPackKey,\r\n c: T,\r\n getInitArgs?: () => Promise['init']>>\r\n ): {\r\n icon: string,\r\n text: LangPackKey,\r\n tabConstructor: T,\r\n getInitArgs?: typeof getInitArgs,\r\n // args?: ReturnType\r\n args?: any\r\n } => {\r\n if(!getInitArgs) {\r\n const g = (c as any as typeof SliderSuperTab).getInitArgs;\r\n if(g) {\r\n // @ts-ignore\r\n getInitArgs = () => [g(this)];\r\n }\r\n }\r\n\r\n return {\r\n icon,\r\n text,\r\n tabConstructor: c,\r\n getInitArgs,\r\n args: getInitArgs?.()\r\n };\r\n };\r\n\r\n // const k = (c: T): () => [ReturnType['getInitArgs']>] => {\r\n // return () => (c as any).getInitArgs(this);\r\n // };\r\n\r\n const b = [\r\n m('unmute', 'AccountSettings.Notifications', AppNotificationsTab),\r\n m('data', 'DataSettings', AppDataAndStorageTab),\r\n m('lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab),\r\n m('settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab),\r\n m('folder', 'AccountSettings.Filters', AppChatFoldersTab)\r\n ];\r\n\r\n const rows = b.map((item) => {\r\n const {icon, text: langPackKey, tabConstructor, getInitArgs} = item;\r\n return new Row({\r\n titleLangKey: langPackKey,\r\n icon,\r\n clickable: async() => {\r\n const args = item.args ? await item.args : [];\r\n const tab = this.slider.createTab(tabConstructor as any);\r\n tab.open(...args);\r\n\r\n if(tab instanceof SliderSuperTabEventable && getInitArgs) {\r\n tab.eventListener.addEventListener('destroyAfter', (promise) => {\r\n item.args = promise.then(() => getInitArgs() as any);\r\n });\r\n }\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n });\r\n\r\n const languageArgs = AppLanguageTab.getInitArgs();\r\n rows.push(\r\n this.devicesRow = new Row({\r\n titleLangKey: 'Devices',\r\n titleRightSecondary: ' ',\r\n icon: 'activesessions',\r\n clickable: async() => {\r\n if(!this.authorizations) {\r\n await this.updateActiveSessions();\r\n }\r\n\r\n const tab = this.slider.createTab(AppActiveSessionsTab);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.authorizations = undefined;\r\n this.updateActiveSessions(true);\r\n }, {once: true});\r\n tab.open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n }),\r\n\r\n this.languageRow = new Row({\r\n titleLangKey: 'AccountSettings.Language',\r\n titleRightSecondary: i18n('LanguageName'),\r\n icon: 'language',\r\n clickable: () => {\r\n this.slider.createTab(AppLanguageTab).open(languageArgs);\r\n },\r\n listenerSetter: this.listenerSetter\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 const getEditProfileArgs = () => {\r\n editProfileArgs = AppEditProfileTab.getInitArgs();\r\n };\r\n let editProfileArgs: ReturnType;\r\n attachClickEvent(this.buttons.edit, () => {\r\n const tab = this.slider.createTab(AppEditProfileTab);\r\n tab.open(editProfileArgs);\r\n }, {listenerSetter: this.listenerSetter});\r\n getEditProfileArgs();\r\n // this.listenerSetter.add(rootScope)('user_full_update', (userId) => {\r\n // if(rootScope.myId.toUserId() === userId) {\r\n // getEditProfileArgs();\r\n // }\r\n // });\r\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\r\n if(rootScope.myId.toUserId() === userId) {\r\n getEditProfileArgs();\r\n }\r\n });\r\n\r\n lottieLoader.loadLottieWorkers();\r\n\r\n this.updateActiveSessions();\r\n\r\n await fillPromise;\r\n }\r\n\r\n private getAuthorizations(overwrite?: boolean) {\r\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\r\n\r\n const promise = this.getAuthorizationsPromise = this.managers.apiManager.invokeApi('account.getAuthorizations')\r\n .finally(() => {\r\n if(this.getAuthorizationsPromise === promise) {\r\n this.getAuthorizationsPromise = undefined;\r\n }\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n public updateActiveSessions(overwrite?: boolean) {\r\n return this.getAuthorizations(overwrite).then((auths) => {\r\n this.authorizations = auths.authorizations;\r\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\r\n });\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.profile.destroy();\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 appSidebarLeft, {SettingSection} from '..';\r\nimport {InputFile} from '../../../layer';\r\nimport InputField from '../../inputField';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport AvatarEdit from '../../avatarEdit';\r\nimport AppAddMembersTab from './addMembers';\r\nimport {_i18n} from '../../../lib/langPack';\r\nimport ButtonCorner from '../../buttonCorner';\r\nimport appImManager from '../../../lib/appManagers/appImManager';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\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 public 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 attachClickEvent(this.nextBtn, () => {\r\n const title = this.channelNameInputField.value;\r\n const about = this.channelDescriptionInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n this.managers.appChatsManager.createChannel({\r\n title,\r\n about,\r\n broadcast: true\r\n }).then((channelId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n this.managers.appChatsManager.editPhoto(channelId, inputFile);\r\n });\r\n }\r\n\r\n appImManager.setInnerPeer({peerId: channelId.toPeerId(true)});\r\n\r\n appSidebarLeft.removeTabFromHistory(this);\r\n this.slider.createTab(AppAddMembersTab).open({\r\n type: 'channel',\r\n skippable: true,\r\n title: 'GroupAddMembers',\r\n placeholder: 'SendMessageTo',\r\n takeOut: (peerIds) => {\r\n return this.managers.appChatsManager.inviteToChannel(channelId, peerIds);\r\n }\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.content.append(this.nextBtn);\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.channelNameInputField.value = '';\r\n this.channelDescriptionInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../inputField';\nimport PopupElement from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport EditPeer from '../editPeer';\nimport {_i18n} from '../../lib/langPack';\nimport TelInputField from '../telInputField';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport {toastNew} from '../toast';\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', {closable: true, withConfirm: 'Add', title: 'AddContactTitle'});\n this.construct();\n }\n\n private async construct() {\n attachClickEvent(this.btnConfirm, () => {\n const promise = this.managers.appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = getAbbreviation(name);\n editPeer.avatarElem.peerTitle = name;\n editPeer.avatarElem.update();\n };\n\n this.listenerSetter.add(nameInputField.input)('input', onInput);\n this.listenerSetter.add(lastNameInputField.input)('input', onInput);\n\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n const user = await this.managers.appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted.code) {\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputSearch from '../../inputSearch';\nimport {IS_MOBILE} from '../../../environment/userAgent';\nimport {canFocus} from '../../../helpers/dom/canFocus';\nimport windowSize from '../../../helpers/windowSize';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport PopupCreateContact from '../../popups/createContact';\nimport SortedUserList from '../../sortedUserList';\nimport {getMiddleware} from '../../../helpers/middleware';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport rootScope from '../../../lib/rootScope';\nimport PopupElement from '../../popups';\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n\n public init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n PopupElement.createPopup(PopupCreateContact);\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n const isContact = await this.managers.appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n this.openContacts();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList({\n managers: this.managers\n });\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 56 * 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 this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n this.managers.appUsersManager.getContactsPeerIds(query, undefined, 'online').then((contacts) => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 56 * 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","/*\n * 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';\nimport {FOLDER_ID_ARCHIVE, REAL_FOLDER_ID} from '../../../lib/mtproto/mtproto_config';\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId: REAL_FOLDER_ID = FOLDER_ID_ARCHIVE;\n private wasFilterId: number;\n\n public init() {\n this.wasFilterId = appDialogsManager.filterId;\n\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n if(!appDialogsManager.sortedLists[AppArchivedTab.filterId]) {\n const chatList = appDialogsManager.createChatList();\n const scrollable = appDialogsManager.generateScrollable(chatList, {\n title: undefined,\n id: AppArchivedTab.filterId,\n localId: FOLDER_ID_ARCHIVE\n });\n scrollable.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 // ! DO NOT UNCOMMENT NEXT LINE - chats will stop loading on scroll after closing the tab\n // this.scrollable = scrollable;\n return appDialogsManager.setFilterIdAndChangeTab(AppArchivedTab.filterId).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.sortedLists[this.wasFilterId].clear();\n }\n\n onClose() {\n appDialogsManager.setFilterIdAndChangeTab(this.wasFilterId);\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.sortedLists[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider';\r\nimport ButtonCorner from '../../buttonCorner';\r\nimport AppNewGroupTab from './newGroup';\r\nimport {toast} from '../../toast';\r\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\r\nimport {i18n, join, _i18n} from '../../../lib/langPack';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport wrapSticker from '../../wrappers/sticker';\r\nimport SortedUserList from '../../sortedUserList';\r\nimport {PeerLocated, Update, Updates} from '../../../layer';\r\nimport {SettingChatListSection} from '..';\r\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport confirmationPopup from '../../confirmationPopup';\r\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\r\nimport type LazyLoadQueue from '../../lazyLoadQueue';\r\n\r\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\r\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\r\n private isLocationWatched: boolean = false;\r\n private errorCategory: HTMLElement;\r\n private retryBtn: HTMLButtonElement;\r\n private btnOptions: HTMLButtonElement;\r\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\r\n\r\n protected lazyLoadQueue: LazyLoadQueue;\r\n protected peopleSection: SettingChatListSection;\r\n protected chatsSection: SettingChatListSection;\r\n\r\n protected locatedPeers: Map;\r\n\r\n // public async init() {\r\n // this.container.classList.add('people-nearby-container');\r\n // this.setTitle('PeopleNearby');\r\n\r\n // this.errorCategory = document.createElement('div');\r\n // this.errorCategory.classList.add('text', 'hide', 'nearby-error');\r\n\r\n // this.retryBtn = ButtonCorner({icon: 'check'});\r\n\r\n // const emoji = '🧭';\r\n // const doc = await this.managers.appStickersManager.getAnimatedEmojiSticker(emoji);\r\n // const stickerContainer = document.createElement('div');\r\n // stickerContainer.classList.add('sticker-container');\r\n\r\n // if(doc) {\r\n // wrapSticker({\r\n // doc,\r\n // div: stickerContainer,\r\n // loop: false,\r\n // play: true,\r\n // width: 86,\r\n // height: 86,\r\n // emoji,\r\n // needUpscale: true\r\n // }).then(() => {\r\n // // this.animation = player;\r\n // });\r\n // } else {\r\n // stickerContainer.classList.add('media-sticker-wrapper');\r\n // }\r\n\r\n // const caption = document.createElement('div');\r\n // caption.classList.add('caption');\r\n // _i18n(caption, 'PeopleNearbyInfo2');\r\n\r\n // this.locatedPeers = new Map();\r\n\r\n // const m = () => {\r\n // const sortedUserList = new SortedUserList({\r\n // avatarSize: 42,\r\n // createChatListOptions: {\r\n // dialogSize: 48,\r\n // new: true\r\n // },\r\n // autonomous: false,\r\n // onUpdate: (element) => {\r\n // const peer = this.locatedPeers.get(element.id);\r\n // const elements: HTMLElement[] = [\r\n // this.parseDistance(peer.distance)\r\n // ];\r\n\r\n // if(!element.id.isUser()) {\r\n // elements.push(this.managers.appProfileManager.getChatMembersString(element.id.toChatId()));\r\n // }\r\n\r\n // element.dom.lastMessageSpan.textContent = '';\r\n // element.dom.lastMessageSpan.append(...join(elements, false));\r\n // },\r\n // getIndex: (element) => {\r\n // const peer = this.locatedPeers.get(element.id);\r\n // return 0x7FFFFFFF - peer.distance;\r\n // },\r\n // appUsersManager: this.managers.appUsersManager\r\n // });\r\n\r\n // appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\r\n\r\n // return sortedUserList;\r\n // };\r\n\r\n // const peopleSection = this.peopleSection = new SettingChatListSection({\r\n // name: 'PeopleNearbyHeader',\r\n // sortedList: m()\r\n // });\r\n\r\n // const chatsSection = this.chatsSection = new SettingChatListSection({\r\n // name: 'ChatsNearbyHeader',\r\n // sortedList: m()\r\n // });\r\n\r\n // const btnMakeVisible = peopleSection.makeButton({\r\n // text: 'MakeMyselfVisible',\r\n // icon: 'location'\r\n // });\r\n\r\n // const btnMakeInvisible = peopleSection.makeButton({\r\n // text: 'StopShowingMe',\r\n // icon: 'location'\r\n // });\r\n\r\n // const btnCreateGroup = chatsSection.makeButton({\r\n // text: 'NearbyCreateGroup',\r\n // icon: 'newgroup'\r\n // });\r\n\r\n // attachClickEvent(btnMakeVisible, () => {\r\n // confirmationPopup({\r\n // titleLangKey: 'MakeMyselfVisibleTitle',\r\n // descriptionLangKey: 'MakeMyselfVisibleInfo',\r\n // button: {\r\n // langKey: 'OK'\r\n // }\r\n // }).then(() => {\r\n // this.startWatching();\r\n // });\r\n // }, {listenerSetter: this.listenerSetter});\r\n\r\n // attachClickEvent(btnMakeInvisible, () => {\r\n // this.stopWatching();\r\n // }, {listenerSetter: this.listenerSetter});\r\n\r\n // attachClickEvent(btnCreateGroup, () => {\r\n // this.slider.createTab(AppNewGroupTab).open([], true);\r\n // }, {listenerSetter: this.listenerSetter});\r\n\r\n // btnMakeVisible.classList.add('primary');\r\n // btnMakeInvisible.classList.add('danger');\r\n // btnCreateGroup.classList.add('primary');\r\n\r\n // this.content.append(this.retryBtn);\r\n // this.scrollable.append(\r\n // stickerContainer,\r\n // caption,\r\n // peopleSection.container,\r\n // chatsSection.container,\r\n // this.errorCategory\r\n // );\r\n // }\r\n\r\n private parseDistance(distance: number) {\r\n if(rootScope.settings.distanceUnit === 'miles') {\r\n if(distance > 1609.34) {\r\n return i18n('MilesAway', [Math.round(distance / 1609)]);\r\n } else {\r\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\r\n }\r\n } else {\r\n if(distance >= 1000) {\r\n return i18n('KMetersAway2', [distance / 1000]);\r\n } else {\r\n return i18n('MetersAway2', [distance]);\r\n }\r\n }\r\n }\r\n\r\n // public open() {\r\n // const result = super.open();\r\n // result.then(() => {\r\n // this.retryBtn.classList.remove('is-visible');\r\n // navigator.geolocation.getCurrentPosition((location) => {\r\n // this.latestLocationSaved = {\r\n // latitude: location.coords.latitude,\r\n // longitude: location.coords.longitude,\r\n // accuracy: location.coords.accuracy\r\n // };\r\n\r\n // console.log(this.latestLocationSaved);\r\n\r\n // this.managers.appUsersManager.getLocated(\r\n // location.coords.latitude,\r\n // location.coords.longitude,\r\n // location.coords.accuracy\r\n // ).then((response) => {\r\n // const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\r\n // const peers = update.peers as PeerLocated.peerLocated[];\r\n // const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\r\n // const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\r\n // const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\r\n // orderedPeers?.forEach((peer) => {\r\n // const peerId = getPeerId(peer.peer);\r\n // const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\r\n // this.locatedPeers.set(peerId, peer);\r\n // section.sortedList.add(peerId);\r\n // });\r\n\r\n // this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\r\n // this.errorCategory.innerHTML = 'No groups or channels found around you.';\r\n // });\r\n // }, (error) => {\r\n // this.errorCategory.classList.remove('hide');\r\n // this.retryBtn.classList.add('is-visible');\r\n // this.retryBtn.addEventListener('click', this.open);\r\n // if(error instanceof GeolocationPositionError) {\r\n // this.errorCategory.innerHTML = 'Location permission denied. Click below to retry.';\r\n // } else {\r\n // this.errorCategory.innerHTML = 'An error has occurred. Please retry later clicking the button below.';\r\n // }\r\n // });\r\n // });\r\n\r\n // return result;\r\n // }\r\n\r\n private startWatching() {\r\n if(!this.latestLocationSaved || this.isLocationWatched) return;\r\n this.isLocationWatched = true;\r\n\r\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\r\n\r\n this.managers.appUsersManager.getLocated(\r\n this.latestLocationSaved.latitude,\r\n this.latestLocationSaved.longitude,\r\n this.latestLocationSaved.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n\r\n navigator.geolocation.watchPosition((result) => {\r\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\r\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\r\n const distanceCheck = this.calculateDistance(\r\n result.coords.latitude, result.coords.longitude,\r\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\r\n ) > 100;\r\n\r\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\r\n this.managers.appUsersManager.getLocated(\r\n result.coords.latitude,\r\n result.coords.longitude,\r\n result.coords.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n this.latestLocationSaved = {\r\n latitude: result.coords.latitude,\r\n longitude: result.coords.longitude,\r\n accuracy: result.coords.accuracy\r\n }\r\n }\r\n });\r\n }\r\n\r\n private stopWatching() {\r\n if(!this.isLocationWatched) return;\r\n this.isLocationWatched = false;\r\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\r\n this.managers.appUsersManager.getLocated(\r\n 0, // latitude parameter\r\n 0, // longitude parameter\r\n 0, // accuracy parameter\r\n false, // background parameter\r\n 0 // self_expires parameter\r\n );\r\n }\r\n\r\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\r\n const p = 0.017453292519943295; // Math.PI/180\r\n return (\r\n 12742 * Math.asin(\r\n Math.sqrt(\r\n (0.5 - Math.cos((lat2 - lat1) * p)) +\r\n (\r\n Math.cos(lat1 * p) * Math.cos(lat2 * p) *\r\n (1 - Math.cos((long2 - long1) * p)/2)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport {SearchGroup} from '../appSearch';\nimport '../avatar';\nimport Scrollable, {ScrollableX} from '../scrollable';\nimport InputSearch from '../inputSearch';\nimport SidebarSlider from '../slider';\nimport {TransitionSlider} from '../transition';\nimport AppNewGroupTab from './tabs/newGroup';\nimport AppSearchSuper from '../appSearchSuper.';\nimport {DateData, fillTipDates} from '../../helpers/date';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport AppSettingsTab from './tabs/settings';\nimport AppNewChannelTab from './tabs/newChannel';\nimport AppContactsTab from './tabs/contacts';\nimport AppArchivedTab from './tabs/archivedTab';\nimport AppAddMembersTab from './tabs/addMembers';\nimport I18n, {FormatterArguments, i18n, i18n_, LangPackKey} from '../../lib/langPack';\nimport AppPeopleNearbyTab from './tabs/peopleNearby';\nimport {ButtonMenuItemOptions} from '../buttonMenu';\nimport CheckboxField from '../checkboxField';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport PeerTitle from '../peerTitle';\nimport App from '../../config/app';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport sessionStorage from '../../lib/sessionStorage';\nimport {attachClickEvent, CLICK_EVENT_NAME, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport ButtonIcon from '../buttonIcon';\nimport confirmationPopup from '../confirmationPopup';\nimport IS_GEOLOCATION_SUPPORTED from '../../environment/geolocationSupport';\nimport type SortedUserList from '../sortedUserList';\nimport Button, {ButtonOptions} from '../button';\nimport noop from '../../helpers/noop';\nimport ripple from '../ripple';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AvatarElement from '../avatar';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLElement;\n private backBtn: HTMLButtonElement;\n // private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n\n public archivedCount: HTMLSpanElement;\n\n private newBtnMenu: HTMLElement;\n\n // private log = logger('SL');\n\n private searchGroups: {[k in 'contacts' | 'globalContacts' | 'messages' | 'people' | 'recent']: SearchGroup} = {} as any;\n private searchSuper: AppSearchSuper;\n\n private updateBtn: HTMLElement;\n private hasUpdate: boolean;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n // this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n this.createTab(AppAddMembersTab).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => this.createTab(AppNewGroupTab).open(peerIds),\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n this.createTab(AppContactsTab).open();\n };\n\n // this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: typeof menuButtons[0] = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n this.createTab(AppArchivedTab).open();\n },\n verify: async() => {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(1, false);\n return !!folder.length || !(await this.managers.dialogsStorage.isDialogsLoaded(1));\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: themeController.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', async() => {\n await this.managers.appStateManager.setByKey('settings.theme', themeCheckboxField.input.checked ? 'night' : 'day');\n rootScope.dispatchEvent('theme_change');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(themeController.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise})[] = [{\n icon: 'savedmessages',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer({\n peerId: appImManager.myId\n });\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, IS_GEOLOCATION_SUPPORTED ? {\n icon: 'group',\n text: 'PeopleNearby',\n onClick: () => {\n this.createTab(AppPeopleNearbyTab).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n this.createTab(AppSettingsTab).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n\n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n\n },\n checkboxField: new CheckboxField({\n toggle: true,\n checked: true,\n stateKey: 'settings.animationsEnabled'\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n const url = I18n.format('TelegramFeaturesUrl', true);\n appImManager.openUrl(url);\n }\n }, {\n icon: 'bug',\n text: 'ReportBug',\n onClick: () => {\n const a = document.createElement('a');\n a.target = '_blank';\n a.href = 'https://bugs.telegram.org/?tag_ids=40&sort=time';\n document.body.append(a);\n a.click();\n setTimeout(() => {\n a.remove();\n }, 0);\n }\n }, {\n icon: 'char z',\n text: 'ChatList.Menu.SwitchTo.Z',\n onClick: () => {\n Promise.all([\n sessionStorage.set({kz_version: 'Z'}),\n sessionStorage.delete('tgme_sync')\n ]).then(() => {\n location.href = 'https://web.telegram.org/z/';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'char w',\n text: 'ChatList.Menu.SwitchTo.Webogram',\n onClick: () => {\n sessionStorage.delete('tgme_sync').then(() => {\n location.href = 'https://web.telegram.org/?legacy=1';\n });\n },\n verify: () => App.isMainDomain\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({}, 'bottom-right', filteredButtons, async(e) => {\n await Promise.all(filteredButtons.map(async(button) => {\n if(button.verify) {\n button.element.classList.toggle('hide', !(await button.verify()));\n }\n }));\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n const btnMenu = this.toolsBtn.querySelector('.btn-menu') as HTMLElement;\n\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n contextMenuController.close();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' '/* ' alpha ' */ + App.versionFull;\n btnMenuFooter.append(t);\n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n this.newBtnMenu = ButtonMenuToggle({}, 'top-left', [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n this.createTab(AppNewChannelTab).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]);\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.updateBtn = document.createElement('div');\n // this.updateBtn.classList.add('btn-update');\n this.updateBtn.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n // const weave = new TopbarWeave();\n // const weaveContainer = weave.render('btn-update-weave');\n // this.updateBtn.prepend(weaveContainer);\n\n attachClickEvent(this.updateBtn, () => {\n if(this.updateBtn.classList.contains('is-hidden')) {\n return;\n }\n\n location.reload();\n });\n\n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n // setTimeout(() => {\n // weave.componentDidMount();\n // weave.setCurrentState(GROUP_CALL_STATE.MUTED, true);\n // weave.setAmplitude(0);\n // weave.handleBlur();\n // }, 1e3);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n // parseMenuButtonsTo(this.newButtons, this.newBtnMenu.firstElementChild.children);\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n btnArchive.element.append(this.archivedCount);\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 1) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadPeerIds.size;\n this.archivedCount.innerText = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n this.managers.appUsersManager.getTopPeers('correspondents');\n\n // Focus search input by pressing Escape\n const navigationItem: NavigationItem = {\n type: 'global-search-focus',\n onPop: () => {\n setTimeout(() => {\n this.inputSearch.input.focus();\n }, 0);\n\n return false;\n },\n noHistory: true\n };\n appNavigationController.pushItem(navigationItem);\n\n apiManagerProxy.getState().then((state) => {\n const CHECK_UPDATE_INTERVAL = 1800e3;\n const checkUpdateInterval = setInterval(() => {\n fetch('version', {cache: 'no-cache'})\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n if(text !== App.versionFull) {\n this.hasUpdate = true;\n clearInterval(checkUpdateInterval);\n\n if(!this.newBtnMenu.classList.contains('is-hidden')) {\n this.updateBtn.classList.remove('is-hidden');\n }\n }\n })\n .catch(noop);\n }, CHECK_UPDATE_INTERVAL);\n });\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n // setTimeout(() => {\n simulateClickEvent(this.backBtn);\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, true),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }],\n scrollable,\n searchGroups: this.searchGroups,\n asChatList: true,\n hideEmptyTabs: false,\n showSender: true,\n managers: this.managers\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(),\n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true);\n };\n\n resetSearch();\n\n const pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n // (this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-30');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId()}).element;\n }\n\n avatarEl.updateWithOptions({peerId: key as PeerId});\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n\n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach((el) => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId,\n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n\n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then((dialogs) => dialogs.map((d) => d.peerId)),\n this.managers.appMessagesManager.getConversations(value).then(({dialogs}) => dialogs.map((d) => d.peerId)),\n this.managers.appUsersManager.getContactsPeerIds(value, true)\n ]).then((results) => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n\n peerIds.forEach((peerId) => {\n helper.append(renderEntity(peerId));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n // console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n\n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach((dateData) => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG) as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n this.managers.appUsersManager.pushRecentSearch(peerId);\n }, {capture: true});\n\n const 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 const 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 attachClickEvent(this.backBtn, (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = ButtonIcon('close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n confirmationPopup({\n descriptionLangKey: 'Search.Confirm.ClearHistory',\n button: {\n langKey: 'ClearButton',\n isDanger: true\n }\n }).then(() => {\n return this.managers.appUsersManager.clearRecentSearch().then(() => {\n this.searchGroups.recent.clear();\n });\n });\n });\n }\n}\n\nexport type SettingSectionOptions = {\n name?: LangPackKey,\n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n captionArgs?: FormatterArguments,\n captionOld?: SettingSectionOptions['caption'],\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 const caption = options.caption ?? options.captionOld;\n if(caption) {\n const el = this.caption = this.generateContentElement();\n el.classList.add(className + '-caption');\n\n if(!options.captionOld) {\n container.append(el);\n }\n\n if(caption !== true) {\n i18n_({element: el, key: caption, args: options.captionArgs});\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 {SliderSuperTab} from '../../slider';\r\nimport AppSelectPeers from '../../appSelectPeers';\r\nimport {setButtonLoader} from '../../putPreloader';\r\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\r\nimport ButtonCorner from '../../buttonCorner';\r\n\r\nexport default class AppAddMembersTab extends SliderSuperTab {\r\n private nextBtn: HTMLButtonElement;\r\n private selector: AppSelectPeers;\r\n private peerType: 'channel' | 'chat' | 'privacy';\r\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\r\n private skippable: boolean;\r\n\r\n public init(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 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 const result = this.takeOut(peerIds);\r\n\r\n if(this.skippable) {\r\n this.close();\r\n } else if(result instanceof Promise) {\r\n this.attachToPromise(result);\r\n } else if(result === undefined) {\r\n this.close();\r\n }\r\n });\r\n\r\n //\r\n this.setTitle(options.title);\r\n this.peerType = options.type;\r\n this.takeOut = options.takeOut;\r\n this.skippable = options.skippable;\r\n\r\n const isPrivacy = this.peerType === 'privacy';\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.content,\r\n onChange: this.skippable ? null : (length) => {\r\n this.nextBtn.classList.toggle('is-visible', !!length);\r\n },\r\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\r\n placeholder: options.placeholder,\r\n exceptSelf: isPrivacy,\r\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined,\r\n managers: this.managers,\r\n design: 'square'\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\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","/*\r\n * https://github.com/morethanwords/tweb\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 {MyDialogFilter} from '../../../lib/storages/filters';\r\nimport type {DialogFilterSuggested} from '../../../layer';\r\nimport type _rootScope from '../../../lib/rootScope';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\r\nimport {toast} from '../../toast';\r\nimport Button from '../../button';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport AppEditFolderTab from './editFolder';\r\nimport Row from '../../row';\r\nimport {SettingSection} from '..';\r\nimport {i18n, i18n_, LangPackKey, join} from '../../../lib/langPack';\r\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\r\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\r\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\r\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\r\nimport replaceContent from '../../../helpers/dom/replaceContent';\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 public static getInitArgs() {\r\n return lottieLoader.loadAnimationFromURLManually('Folders_1');\r\n }\r\n\r\n private async renderFolder(\r\n dialogFilter: DialogFilterSuggested | MyDialogFilter,\r\n container?: HTMLElement,\r\n row?: Row,\r\n append?: boolean\r\n ) {\r\n let filter: MyDialogFilter;\r\n let description = '';\r\n const d: HTMLElement[] = [];\r\n if(dialogFilter._ === 'dialogFilterSuggested') {\r\n filter = dialogFilter.filter as MyDialogFilter;\r\n description = dialogFilter.description;\r\n } else {\r\n filter = dialogFilter;\r\n\r\n const enabledFilters = Object.keys(filter.pFlags).length;\r\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach((key) => {\r\n enabledFilters += +!!filter[key].length;\r\n }); */\r\n\r\n if(enabledFilters === 1) {\r\n const pFlags = filter.pFlags;\r\n let k: LangPackKey;\r\n if(pFlags.contacts) k = 'FilterAllContacts';\r\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\r\n else if(pFlags.groups) k = 'FilterAllGroups';\r\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\r\n else if(pFlags.bots) k = 'FilterAllBots';\r\n\r\n if(k) {\r\n d.push(i18n(k));\r\n }\r\n }\r\n\r\n if(!d.length) {\r\n const folder = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\r\n let chats = 0, channels = 0, groups = 0;\r\n await Promise.all(folder.map(async(dialog) => {\r\n if(await this.managers.appPeersManager.isAnyGroup(dialog.peerId)) groups++;\r\n else if(await this.managers.appPeersManager.isBroadcast(dialog.peerId)) channels++;\r\n else chats++;\r\n }));\r\n\r\n if(chats) d.push(i18n('Chats', [chats]));\r\n if(channels) d.push(i18n('Channels', [channels]));\r\n if(groups) d.push(i18n('Groups', [groups]));\r\n }\r\n }\r\n\r\n if(!row) {\r\n row = new Row({\r\n title: filter.id === FOLDER_ID_ALL ? i18n('FilterAllChats') : wrapEmojiText(filter.title),\r\n subtitle: description,\r\n clickable: filter.id !== FOLDER_ID_ALL,\r\n buttonRightLangKey: dialogFilter._ === 'dialogFilterSuggested' ? 'Add' : undefined\r\n });\r\n\r\n if(d.length) {\r\n row.subtitle.append(...join(d));\r\n }\r\n\r\n if(dialogFilter._ === 'dialogFilter') {\r\n const filterId = filter.id;\r\n if(!this.filtersRendered[filter.id] && filter.id !== FOLDER_ID_ALL) {\r\n attachClickEvent(row.container, async() => {\r\n this.slider.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(filterId));\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.filtersRendered[filter.id] = row;\r\n }\r\n } else {\r\n if(filter.id !== FOLDER_ID_ALL) {\r\n replaceContent(row.title, wrapEmojiText(filter.title));\r\n }\r\n\r\n row.subtitle.textContent = '';\r\n row.subtitle.append(...join(d));\r\n }\r\n\r\n const div = row.container;\r\n\r\n if(append) {\r\n const localId = (filter as MyDialogFilter).localId;\r\n if(localId !== undefined) {\r\n // ! header will be at 0 index\r\n positionElementByIndex(div, div.parentElement || container, localId);\r\n } else if(container) {\r\n container.append(div);\r\n }\r\n }\r\n\r\n return row;\r\n }\r\n\r\n public init(p: ReturnType = AppChatFoldersTab.getInitArgs()) {\r\n this.container.classList.add('chat-folders-container');\r\n this.setTitle('ChatList.Filter.List.Title');\r\n\r\n this.scrollable.container.classList.add('chat-folders');\r\n\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\r\n\r\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\r\n text: 'ChatList.Filter.NewTitle',\r\n icon: 'add'\r\n });\r\n\r\n this.foldersSection = new SettingSection({\r\n name: 'Filters'\r\n });\r\n this.foldersSection.container.style.display = 'none';\r\n\r\n this.suggestedSection = new SettingSection({\r\n name: 'FilterRecommended'\r\n });\r\n this.suggestedSection.container.style.display = 'none';\r\n\r\n this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container);\r\n\r\n attachClickEvent(this.createFolderBtn, async() => {\r\n if(!(await this.canCreateFolder())) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n this.slider.createTab(AppEditFolderTab).open();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onFiltersContainerUpdate = () => {\r\n this.foldersSection.container.style.display = Object.keys(this.filtersRendered).length ? '' : 'none';\r\n };\r\n\r\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\r\n for(const filter of filters) {\r\n if(filter.id === FOLDER_ID_ARCHIVE) {\r\n continue;\r\n }\r\n\r\n await this.renderFolder(filter, this.foldersSection.content, undefined, true);\r\n }\r\n\r\n this.toggleAllChats();\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\r\n const filterRendered = this.filtersRendered[filter.id];\r\n if(filterRendered) {\r\n await this.renderFolder(filter, null, filterRendered);\r\n } else if(filter.id !== FOLDER_ID_ARCHIVE) {\r\n await this.renderFolder(filter, this.foldersSection.content, undefined, true);\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 const filterRendered = this.filtersRendered[filter.id];\r\n if(filterRendered) {\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 filterRendered.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.filter((filterId) => !!this.filtersRendered[filterId]).forEach((filterId, idx) => {\r\n const filterRendered = this.filtersRendered[filterId];\r\n const container = filterRendered.container;\r\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header\r\n });\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\r\n this.toggleAllChats();\r\n });\r\n\r\n this.loadAnimationPromise = p.then(async(cb) => {\r\n const player = await cb({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n });\r\n\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 return super.onOpenAfterTimeout();\r\n }\r\n\r\n private toggleAllChats() {\r\n const filterRendered = this.filtersRendered[FOLDER_ID_ALL];\r\n filterRendered.container.classList.toggle('hide', !rootScope.premium);\r\n }\r\n\r\n private async canCreateFolder() {\r\n const [limit, filters] = await Promise.all([\r\n this.managers.apiManager.getLimit('folders'),\r\n this.managers.filtersStorage.getDialogFilters()\r\n ]);\r\n\r\n const filtersLength = filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).length;\r\n return filtersLength < limit;\r\n }\r\n\r\n private getSuggestedFilters() {\r\n return this.managers.filtersStorage.getSuggestedDialogsFilters().then(async(suggestedFilters) => {\r\n this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none';\r\n Array.from(this.suggestedSection.content.children).slice(1).forEach((el) => el.remove());\r\n\r\n for(const filter of suggestedFilters) {\r\n const row = await this.renderFolder(filter);\r\n this.suggestedSection.content.append(row.container);\r\n\r\n const button = row.buttonRight;\r\n attachClickEvent(button, async(e) => {\r\n cancelEvent(e);\r\n\r\n if(!(await this.canCreateFolder())) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n return;\r\n }\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n const f = filter.filter as MyDialogFilter;\r\n f.includePeerIds = [];\r\n f.excludePeerIds = [];\r\n f.pinnedPeerIds = [];\r\n\r\n this.managers.filtersStorage.createDialogFilter(f, true).then((bool) => {\r\n if(bool) {\r\n row.container.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 {SliderSuperTab} from '../../slider';\r\nimport AppSelectPeers from '../../appSelectPeers';\r\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\r\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\r\nimport ButtonIcon from '../../buttonIcon';\r\nimport CheckboxField from '../../checkboxField';\r\nimport Button from '../../button';\r\nimport AppEditFolderTab from './editFolder';\r\nimport I18n, {i18n, LangPackKey, _i18n, join} from '../../../lib/langPack';\r\nimport {SettingSection} from '..';\r\nimport {toast} from '../../toast';\r\nimport copy from '../../../helpers/object/copy';\r\nimport forEachReverse from '../../../helpers/array/forEachReverse';\r\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\r\nimport {REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {MTAppConfig} from '../../../lib/mtproto/appConfig';\r\nimport {attachClickEvent, simulateClickEvent} from '../../../helpers/dom/clickEvent';\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 private limit: number;\r\n\r\n public init(\r\n filter: DialogFilter,\r\n type: 'included' | 'excluded',\r\n editFolderTab: AppIncludedChatsTab['editFolderTab']\r\n ) {\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 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 attachClickEvent(this.confirmBtn, async() => {\r\n const selected = this.selector.getSelected();\r\n\r\n // this.filter.pFlags = {};\r\n\r\n if(this.type === 'included') {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') === 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n } else {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') !== 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n }\r\n\r\n const peerIds: PeerId[] = [];\r\n for(const key of selected) {\r\n if(key.isPeerId()) {\r\n peerIds.push(key.toPeerId());\r\n } else {\r\n // @ts-ignore\r\n this.filter.pFlags[key] = true;\r\n }\r\n }\r\n\r\n let cmp: (peerId: PeerId) => boolean;\r\n if(this.type === 'included') {\r\n cmp = (peerId) => peerIds.includes(peerId);\r\n } else {\r\n cmp = (peerId) => !peerIds.includes(peerId);\r\n }\r\n\r\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\r\n if(!cmp(peerId)) {\r\n this.filter.pinnedPeerIds.splice(idx, 1);\r\n this.filter.pinned_peers.splice(idx, 1);\r\n }\r\n });\r\n\r\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\r\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\r\n forEachReverse(this.filter[other], (peerId, idx) => {\r\n if(peerIds.includes(peerId)) {\r\n this.filter[other].splice(idx, 1);\r\n this.filter[otherLegacy].splice(idx, 1);\r\n }\r\n });\r\n\r\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\r\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = await Promise.all(peerIds.map((peerId) => this.managers.appPeersManager.getInputPeerById(peerId)));\r\n // this.filter.pinned_peers = this.filter.pinned_peers.filter((peerId) => this.filter.include_peers.includes(peerId));\r\n\r\n this.editFolderTab.setFilter(this.filter, false);\r\n this.close();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onAppConfig = (appConfig: MTAppConfig) => {\r\n this.limit = rootScope.premium ? appConfig.dialog_filters_chats_limit_premium : appConfig.dialog_filters_chats_limit_default;\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('app_config', onAppConfig);\r\n\r\n this.dialogsByFilters = new Map();\r\n return Promise.all([\r\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\r\n await Promise.all(filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).map(async(filter) => {\r\n const dialogs = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\r\n const peerIds = dialogs.map((d) => d.peerId);\r\n this.dialogsByFilters.set(filter, new Set(peerIds));\r\n }));\r\n }),\r\n\r\n this.managers.apiManager.getAppConfig().then((appConfig) => {\r\n onAppConfig(appConfig);\r\n })\r\n ]);\r\n }\r\n\r\n checkbox(selected?: boolean) {\r\n const checkboxField = new CheckboxField({\r\n round: true\r\n });\r\n if(selected) {\r\n checkboxField.input.checked = selected;\r\n }\r\n\r\n return checkboxField.label;\r\n }\r\n\r\n renderResults = async(peerIds: PeerId[]) => {\r\n // const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\r\n\r\n await this.managers.appUsersManager.getContacts();\r\n peerIds.forEach((peerId) => {\r\n // if(other.includes(peerId)) return;\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: peerId,\r\n container: this.selector.scrollable,\r\n rippleEnabled: true,\r\n avatarSize: 'abitbigger'\r\n });\r\n\r\n const selected = this.selector.selected.has(peerId);\r\n dom.containerEl.append(this.checkbox(selected));\r\n // if(selected) dom.listEl.classList.add('active');\r\n\r\n const foundInFilters: HTMLElement[] = [];\r\n this.dialogsByFilters.forEach((dialogs, filter) => {\r\n if(dialogs.has(peerId)) {\r\n const span = document.createElement('span');\r\n setInnerHTML(span, wrapEmojiText(filter.title));\r\n foundInFilters.push(span);\r\n }\r\n });\r\n\r\n const joined = join(foundInFilters, false);\r\n joined.forEach((el) => {\r\n dom.lastMessageSpan.append(el);\r\n });\r\n });\r\n };\r\n\r\n onOpen() {\r\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\r\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\r\n\r\n const filter = this.filter;\r\n\r\n const categoriesSection = new SettingSection({\r\n noDelimiter: true,\r\n name: 'FilterChatTypes'\r\n });\r\n\r\n categoriesSection.container.classList.add('folder-categories');\r\n\r\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\r\n if(this.type === 'excluded') {\r\n details = {\r\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\r\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\r\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\r\n };\r\n } else {\r\n details = {\r\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\r\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\r\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\r\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\r\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\r\n };\r\n }\r\n\r\n const f = document.createDocumentFragment();\r\n for(const key in details) {\r\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\r\n button.dataset.peerId = key;\r\n button.append(this.checkbox());\r\n f.append(button);\r\n }\r\n categoriesSection.content.append(f);\r\n\r\n // ///////////////\r\n\r\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.container,\r\n onChange: this.onSelectChange,\r\n peerType: ['dialogs'],\r\n renderResultsFunc: this.renderResults,\r\n placeholder: 'Search',\r\n sectionNameLangPackKey: 'FilterChats',\r\n managers: this.managers\r\n });\r\n this.selector.selected = new Set(selectedPeers);\r\n\r\n let addedInitial = false;\r\n const _add = this.selector.add.bind(this.selector);\r\n this.selector.add = (peerId, title, scroll) => {\r\n if(this.selector.selected.size >= this.limit && 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 simulateClickEvent(categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement);\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 * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\r\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\r\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport {toast} from '../../toast';\r\nimport InputField from '../../inputField';\r\nimport ButtonIcon from '../../buttonIcon';\r\nimport ButtonMenuToggle from '../../buttonMenuToggle';\r\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\r\nimport Button from '../../button';\r\nimport AppIncludedChatsTab from './includedChats';\r\nimport {i18n, LangPackKey} from '../../../lib/langPack';\r\nimport {SettingSection} from '..';\r\nimport PopupPeer from '../../popups/peer';\r\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\r\nimport copy from '../../../helpers/object/copy';\r\nimport deepEqual from '../../../helpers/object/deepEqual';\r\nimport wrapDraftText from '../../../lib/richTextProcessor/wrapDraftText';\r\nimport filterAsync from '../../../helpers/array/filterAsync';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\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 public init() {\r\n this.container.classList.add('edit-folder-container');\r\n this.caption = document.createElement('div');\r\n this.caption.classList.add('caption');\r\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\r\n const deleteFolderButton: ButtonMenuItemOptions = {\r\n icon: 'delete danger',\r\n text: 'FilterMenuDelete',\r\n onClick: () => {\r\n new PopupPeer('filter-delete', {\r\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\r\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n deleteFolderButton.element.setAttribute('disabled', 'true');\r\n this.managers.filtersStorage.updateDialogFilter(this.filter, true).then((bool) => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).finally(() => {\r\n deleteFolderButton.element.removeAttribute('disabled');\r\n });\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n };\r\n this.menuBtn = ButtonMenuToggle({listenerSetter: this.listenerSetter}, '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 attachClickEvent(includedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\r\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'included', this);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(excludedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\r\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'excluded', this);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(this.confirmBtn, () => {\r\n if(this.nameInputField.input.classList.contains('error')) {\r\n return;\r\n }\r\n\r\n if(!this.nameInputField.value.trim()) {\r\n this.nameInputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\r\n include += this.filter.include_peers.length;\r\n\r\n if(!include) {\r\n toast('Please choose at least one chat for this folder.');\r\n return;\r\n }\r\n\r\n this.confirmBtn.setAttribute('disabled', 'true');\r\n\r\n let promise: Promise;\r\n if(!this.filter.id) {\r\n promise = this.managers.filtersStorage.createDialogFilter(this.filter);\r\n } else {\r\n promise = this.managers.filtersStorage.updateDialogFilter(this.filter);\r\n }\r\n\r\n promise.then((bool) => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).catch((err) => {\r\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n console.error('updateDialogFilter error:', err);\r\n }\r\n }).finally(() => {\r\n this.confirmBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(this.nameInputField.input)('input', () => {\r\n this.filter.title = this.nameInputField.value;\r\n this.editCheckForChange();\r\n });\r\n\r\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\r\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\r\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\r\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\r\n ] : [];\r\n\r\n return Promise.all([\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_2').then((player) => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n }),\r\n\r\n ...reloadMissingPromises\r\n ]);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private onCreateOpen() {\r\n // this.caption.style.display = '';\r\n this.setTitle('FilterNew');\r\n this.menuBtn.classList.add('hide');\r\n this.confirmBtn.classList.remove('hide');\r\n this.nameInputField.value = '';\r\n\r\n for(const flag in this.flags) {\r\n // @ts-ignore\r\n this.flags[flag].style.display = 'none';\r\n }\r\n }\r\n\r\n private onEditOpen() {\r\n // this.caption.style.display = 'none';\r\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\r\n\r\n if(this.type === 'edit') {\r\n this.menuBtn.classList.remove('hide');\r\n this.confirmBtn.classList.add('hide');\r\n }\r\n\r\n const filter = this.filter;\r\n this.nameInputField.value = wrapDraftText(filter.title);\r\n\r\n for(const flag in this.flags) {\r\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\r\n }\r\n\r\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(async(key) => {\r\n const section = this[key];\r\n const ul = appDialogsManager.createChatList({ignoreClick: true});\r\n\r\n let peers = filter[key];\r\n\r\n // filter peers where we're kicked\r\n const hasPeer = async(peerId: PeerId) => {\r\n return !!(await this.managers.appMessagesManager.getDialogOnly(peerId)) || (peerId.isUser() ? (await this.managers.appUsersManager.getUser(peerId.toUserId()))._ === 'user' : false);\r\n };\r\n\r\n const filtered = await filterAsync(peers, (peerId) => hasPeer(peerId));\r\n peers.length = 0;\r\n peers.push(...filtered);\r\n\r\n peers = peers.slice();\r\n\r\n const renderMore = async(_length: number) => {\r\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\r\n const peerId = peers.shift();\r\n if(peerId.isUser() ? false : !(await this.managers.appMessagesManager.getDialogOnly(peerId))) {\r\n continue;\r\n }\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: peerId,\r\n container: ul,\r\n rippleEnabled: false,\r\n meAsSaved: true,\r\n avatarSize: 'small'\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 attachClickEvent(showMore, () => renderMore(20), {listenerSetter: this.listenerSetter});\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 // @ts-ignore\r\n return super.open().then(() => {\r\n if(this.type === 'edit') {\r\n this.setFilter(this.originalFilter, true);\r\n this.onEditOpen();\r\n } else {\r\n this.onCreateOpen();\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from '../../lib/appManagers/appImManager';\r\nimport SidebarSlider from '../slider';\r\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\r\nimport AppSharedMediaTab from './tabs/sharedMedia';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\n\r\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\r\n\r\nexport class AppSidebarRight extends SidebarSlider {\r\n private isColumnProportionSet = false;\r\n private sharedMediaTab: AppSharedMediaTab;\r\n\r\n constructor() {\r\n super({\r\n sidebarEl: document.getElementById('column-right') as HTMLElement,\r\n canHideFirst: true,\r\n navigationType: 'right'\r\n });\r\n }\r\n\r\n construct(managers: AppManagers) {\r\n this.managers = managers;\r\n\r\n mediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\r\n this.toggleSidebar(false);\r\n }\r\n });\r\n\r\n mediaSizes.addEventListener('resize', () => {\r\n this.setColumnProportion();\r\n });\r\n }\r\n\r\n public createSharedMediaTab() {\r\n const tab = this.createTab(AppSharedMediaTab, true);\r\n tab.slider = this;\r\n // this.tabsContainer.prepend(tab.container);\r\n return tab;\r\n }\r\n\r\n public replaceSharedMediaTab(tab?: AppSharedMediaTab) {\r\n const previousTab = this.sharedMediaTab;\r\n if(previousTab) {\r\n const idx = this.historyTabIds.indexOf(previousTab);\r\n\r\n if(this._selectTab.getFrom() === previousTab.container) {\r\n this._selectTab.setFrom(tab?.container);\r\n }\r\n\r\n if(tab) {\r\n if(idx !== -1) {\r\n this.historyTabIds[idx] = tab;\r\n }\r\n\r\n const wasActive = previousTab.container.classList.contains('active');\r\n if(wasActive) {\r\n tab.container.classList.add('active');\r\n }\r\n\r\n previousTab.container.replaceWith(tab.container);\r\n } else {\r\n if(idx !== -1) {\r\n this.historyTabIds.splice(idx, 1);\r\n }\r\n\r\n previousTab.container.remove();\r\n }\r\n } else {\r\n this.tabsContainer.prepend(tab.container);\r\n }\r\n\r\n this.sharedMediaTab = tab;\r\n }\r\n\r\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\r\n if(!this.historyTabIds.length) {\r\n this.toggleSidebar(false, animate);\r\n }\r\n\r\n super.onCloseTab(id, animate, isNavigation);\r\n }\r\n\r\n private setColumnProportion() {\r\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\r\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\r\n }\r\n\r\n public toggleSidebar(enable?: boolean, animate?: boolean) {\r\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\r\n let willChange: boolean;\r\n if(enable !== undefined) {\r\n if(enable) {\r\n if(!active) {\r\n willChange = true;\r\n }\r\n } else if(active) {\r\n willChange = true;\r\n }\r\n } else {\r\n willChange = true;\r\n }\r\n\r\n if(!willChange) return Promise.resolve();\r\n\r\n if(!active && !this.historyTabIds.length) {\r\n this.sharedMediaTab.open();\r\n }\r\n\r\n if(!this.isColumnProportionSet) {\r\n this.setColumnProportion();\r\n this.isColumnProportionSet = true;\r\n }\r\n\r\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\r\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\r\n return animationPromise;\r\n\r\n /* return new Promise((resolve, reject) => {\r\n const hidden: {element: HTMLDivElement, height: number}[] = [];\r\n const observer = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const bubble = entry.target as HTMLDivElement;\r\n if(!entry.isIntersecting) {\r\n hidden.push({element: bubble, height: bubble.scrollHeight});\r\n }\r\n }\r\n\r\n for(const item of hidden) {\r\n item.element.style.minHeight = item.height + 'px';\r\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\r\n item.element.style.width = '1px';\r\n }\r\n\r\n //console.log('hidden', hidden);\r\n observer.disconnect();\r\n\r\n set();\r\n\r\n setTimeout(() => {\r\n for(const item of hidden) {\r\n item.element.style.minHeight = '';\r\n item.element.style.width = '';\r\n (item.element.firstElementChild as HTMLElement).style.display = '';\r\n }\r\n\r\n resolve();\r\n }, 200);\r\n });\r\n\r\n const length = Object.keys(appImManager.bubbles).length;\r\n if(length) {\r\n for(const i in appImManager.bubbles) {\r\n observer.observe(appImManager.bubbles[i]);\r\n }\r\n } else {\r\n set();\r\n setTimeout(resolve, 200);\r\n }\r\n }); */\r\n }\r\n}\r\n\r\nconst appSidebarRight = new AppSidebarRight();\r\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\r\nexport default appSidebarRight;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider'\r\nimport InputField from '../../inputField';\r\nimport EditPeer from '../../editPeer';\r\nimport {SettingSection} from '../../sidebarLeft';\r\nimport Row from '../../row';\r\nimport CheckboxField from '../../checkboxField';\r\nimport Button from '../../button';\r\nimport PeerTitle from '../../peerTitle';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport PopupPeer from '../../popups/peer';\r\nimport {addCancelButton} from '../../popups';\r\nimport {i18n} from '../../../lib/langPack';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\r\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\r\nimport formatUserPhone from '../../wrappers/formatUserPhone';\r\n\r\nexport default class AppEditContactTab extends SliderSuperTab {\r\n private nameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private editPeer: EditPeer;\r\n public peerId: PeerId;\r\n\r\n public async init() {\r\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\r\n const isNew = !(await this.managers.appUsersManager.isContact(this.peerId.toUserId()));\r\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.nameInputField = new InputField({\r\n label: 'FirstName',\r\n name: 'contact-name',\r\n maxLength: 70,\r\n required: true\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'LastName',\r\n name: 'contact-lastname',\r\n maxLength: 70\r\n });\r\n\r\n if(this.peerId) {\r\n const user = await this.managers.appUsersManager.getUser(this.peerId);\r\n\r\n if(isNew) {\r\n this.nameInputField.setDraftValue(user.first_name);\r\n this.lastNameInputField.setDraftValue(user.last_name);\r\n } else {\r\n this.nameInputField.setOriginalValue(user.first_name);\r\n this.lastNameInputField.setOriginalValue(user.last_name);\r\n }\r\n }\r\n\r\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\r\n inputFields.push(this.nameInputField, this.lastNameInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: this.peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter,\r\n doNotEditAvatar: true\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n if(this.peerId) {\r\n const div = document.createElement('div');\r\n div.classList.add('avatar-edit');\r\n div.append(this.editPeer.avatarElem);\r\n\r\n const notificationsCheckboxField = new CheckboxField({\r\n text: 'Notifications'\r\n });\r\n\r\n notificationsCheckboxField.input.addEventListener('change', (e) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.managers.appMessagesManager.togglePeerMute(this.peerId);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', async(update) => {\r\n if(update.peer._ !== 'notifyPeer') return;\r\n const peerId = getPeerId(update.peer.peer);\r\n if(this.peerId === peerId) {\r\n const enabled = !(await this.managers.appNotificationsManager.isMuted(update.notify_settings));\r\n if(enabled !== notificationsCheckboxField.checked) {\r\n notificationsCheckboxField.checked = enabled;\r\n }\r\n }\r\n });\r\n\r\n const profileNameDiv = document.createElement('div');\r\n profileNameDiv.classList.add('profile-name');\r\n profileNameDiv.append(new PeerTitle({\r\n peerId: this.peerId\r\n }).element);\r\n // profileNameDiv.innerHTML = 'Karen Stanford';\r\n\r\n const profileSubtitleDiv = document.createElement('div');\r\n profileSubtitleDiv.classList.add('profile-subtitle');\r\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\r\n\r\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\r\n\r\n if(!isNew) {\r\n const notificationsRow = new Row({\r\n checkboxField: notificationsCheckboxField,\r\n withCheckboxSubtitle: true,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const enabled = !(await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false));\r\n notificationsCheckboxField.checked = enabled;\r\n\r\n section.content.append(notificationsRow.container);\r\n } else {\r\n const user = await this.managers.appUsersManager.getUser(this.peerId);\r\n\r\n const phoneRow = new Row({\r\n icon: 'phone',\r\n titleLangKey: user.phone ? undefined : 'MobileHidden',\r\n title: user.phone ? formatUserPhone(user.phone) : undefined,\r\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\r\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: this.peerId}).element]\r\n });\r\n\r\n section.content.append(phoneRow.container);\r\n }\r\n } else {\r\n section.content.append(inputWrapper);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, async() => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n this.managers.appUsersManager.addContact(\r\n this.peerId,\r\n this.nameInputField.value,\r\n this.lastNameInputField.value,\r\n (await this.managers.appUsersManager.getUser(this.peerId)).phone\r\n ).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(!isNew) {\r\n const section = new SettingSection({\r\n\r\n });\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupPeer('popup-delete-contact', {\r\n peerId: this.peerId,\r\n titleLangKey: 'DeleteContact',\r\n descriptionLangKey: 'AreYouSureDeleteContact',\r\n buttons: addCancelButton([{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n\r\n this.managers.appUsersManager.deleteContacts([this.peerId]).then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }])\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {copyTextToClipboard} from '../../../helpers/clipboard';\r\nimport {randomLong} from '../../../helpers/random';\r\nimport {Chat, ChatFull, ExportedChatInvite} from '../../../layer';\r\nimport Button from '../../button';\r\nimport {setButtonLoader} from '../../putPreloader';\r\nimport RadioField from '../../radioField';\r\nimport Row, {RadioFormFromRows} from '../../row';\r\nimport {SettingSection} from '../../sidebarLeft';\r\nimport {toast} from '../../toast';\r\nimport {UsernameInputField} from '../../usernameInputField';\r\nimport {SliderSuperTabEventable} from '../../sliderTab';\r\nimport I18n from '../../../lib/langPack';\r\nimport PopupPeer from '../../popups/peer';\r\nimport ButtonCorner from '../../buttonCorner';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\r\nimport CheckboxField from '../../checkboxField';\r\nimport rootScope from '../../../lib/rootScope';\r\n\r\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\r\n public chatId: ChatId;\r\n public chatFull: ChatFull;\r\n\r\n public async init() {\r\n this.container.classList.add('edit-peer-container', 'group-type-container');\r\n\r\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\r\n\r\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\r\n\r\n const section = new SettingSection({\r\n name: isBroadcast ? 'ChannelType' : 'GroupType'\r\n });\r\n\r\n const random = randomLong();\r\n const privateRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate',\r\n name: random,\r\n value: 'private'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\r\n });\r\n const publicRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic',\r\n name: random,\r\n value: 'public'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\r\n });\r\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\r\n const a = [privateSection, publicSection];\r\n if(value === 'public') a.reverse();\r\n\r\n a[0].container.classList.remove('hide');\r\n a[1].container.classList.add('hide');\r\n\r\n onChange();\r\n });\r\n\r\n const chat: Chat = await this.managers.appChatsManager.getChat(this.chatId);\r\n\r\n section.content.append(form);\r\n\r\n const privateSection = new SettingSection({});\r\n\r\n // let revoked = false;\r\n const linkRow = new Row({\r\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\r\n clickable: () => {\r\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\r\n toast(I18n.format('LinkCopied', true));\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\r\n\r\n attachClickEvent(btnRevoke, () => {\r\n new PopupPeer('revoke-link', {\r\n buttons: [{\r\n langKey: 'RevokeButton',\r\n callback: () => {\r\n const toggle = toggleDisability([btnRevoke], true);\r\n\r\n this.managers.appProfileManager.getChatInviteLink(this.chatId, true).then((link) => {\r\n toggle();\r\n linkRow.title.innerHTML = link;\r\n // revoked = true;\r\n // onChange();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'RevokeLink',\r\n descriptionLangKey: 'RevokeAlert'\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n privateSection.content.append(linkRow.container, btnRevoke);\r\n\r\n const publicSection = new SettingSection({\r\n caption: isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup',\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const placeholder = 't.me/';\r\n\r\n const onChange = () => {\r\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) ||\r\n (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\r\n applyBtn.classList.toggle('is-visible', changed);\r\n };\r\n\r\n const linkInputField = new UsernameInputField({\r\n label: 'SetUrlPlaceholder',\r\n name: 'group-public-link',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n availableText: 'Link.Available',\r\n invalidText: 'Link.Invalid',\r\n takenText: 'Link.Taken',\r\n onChange: onChange,\r\n peerId: this.chatId.toPeerId(true),\r\n head: placeholder\r\n }, this.managers);\r\n\r\n const originalValue = placeholder + ((chat as Chat.channel).username || '');\r\n\r\n inputWrapper.append(linkInputField.container)\r\n publicSection.content.append(inputWrapper);\r\n\r\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\r\n this.content.append(applyBtn);\r\n\r\n attachClickEvent(applyBtn, () => {\r\n /* const unsetLoader = */setButtonLoader(applyBtn);\r\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\r\n this.managers.appChatsManager.migrateChat(this.chatId).then((channelId) => {\r\n return this.managers.appChatsManager.updateUsername(channelId, username);\r\n }).then(() => {\r\n // unsetLoader();\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n (originalValue !== placeholder ? publicRow : privateRow).radioField.checked = true;\r\n linkInputField.setOriginalValue(originalValue);\r\n\r\n this.scrollable.append(section.container, privateSection.container, publicSection.container);\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'SavingContentTitle',\r\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\r\n });\r\n\r\n const checkboxField = new CheckboxField({\r\n text: 'RestrictSavingContent',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(checkboxField.input)('change', () => {\r\n const toggle = checkboxField.toggleDisability(true);\r\n this.managers.appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const onChatUpdate = () => {\r\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n onChatUpdate();\r\n }\r\n });\r\n\r\n onChatUpdate();\r\n\r\n section.content.append(checkboxField.label);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ChannelParticipant} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport Button from '../../button';\nimport {SettingSection} from '../../sidebarLeft';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {ChatPermissions} from './groupPermissions';\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo'\n });\n\n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: this.userId.toPeerId(false),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(this.userId)));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n }, this.managers);\n\n destroyListener = () => {\n // appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n this.managers.appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n this.managers.appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport ScrollableLoader from '../../../helpers/scrollableLoader';\nimport {ChannelParticipant, Chat, ChatBannedRights, Update} from '../../../layer';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport combineParticipantBannedRights from '../../../lib/appManagers/utils/chats/combineParticipantBannedRights';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport CheckboxField from '../../checkboxField';\nimport PopupPickUser from '../../popups/pickUser';\nimport Row from '../../row';\nimport {SettingSection} from '../../sidebarLeft';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport {toast} from '../../toast';\nimport AppUserPermissionsTab from './userPermissions';\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(private options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }, private managers: AppManagers) {\n this.construct();\n }\n\n public async construct() {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const options = this.options;\n const chat: Chat.chat | Chat.channel = await this.managers.appChatsManager.getChat(options.chatId);\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? combineParticipantBannedRights(chat as Chat.channel, options.participant.banned_rights) : defaultBannedRights;\n\n const restrictionText: LangPackKey = options.participant ? 'UserRestrictionsDisabled' : 'EditCantEditPermissionsPublic';\n for(const info of this.v) {\n const mainFlag = info.flags[0];\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: hasRights(chat, mainFlag, rights),\n restriction: true,\n withRipple: true\n });\n\n if((\n options.participant &&\n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n (chat as Chat.channel).username &&\n (\n info.flags.includes('pin_messages') ||\n info.flags.includes('change_info')\n )\n )\n ) {\n info.checkboxField.input.disabled = true;\n\n /* options.listenerSetter.add(info.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n cancelEvent(e);\n toast('This option is disabled for all members in Group Permissions.');\n info.checkboxField.checked = false;\n }); */\n\n attachClickEvent(info.checkboxField.label, (e) => {\n toast(I18n.format(restrictionText, true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter((i) => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach((info) => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(info.checkboxField.label);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach((flag) => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader'\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content\n }, this.managers);\n\n this.eventListener.addEventListener('destroy', () => {\n this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId\n });\n },\n listenerSetter: this.listenerSetter\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await this.managers.appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = this.slider.createTab(AppUserPermissionsTab);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n\n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = async(li: Element, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;// appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = ((await this.managers.appChatsManager.getChat(this.chatId)) as Chat.channel).default_banned_rights;\n // const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach((info) => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = li.querySelector('.user-last-message') as HTMLElement;\n\n if(cantWhat.length) {\n el.innerHTML = '';\n el.append(...join(cantWhat.map((t) => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n\n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: getPeerId(participant.peer),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n setSubtitle(dom.listEl, participant);\n\n // dom.titleSpan.innerHTML = 'Chinaza Akachi';\n // dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n // this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n // const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n // const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n // if(needAdd) {\n // if(!li) {\n // add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n // } else {\n // setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n // }\n\n // if(update.prev_participant?._ !== 'channelParticipantBanned') {\n // ++exceptionsCount;\n // }\n // } else {\n // if(li) {\n // li.remove();\n // }\n\n // if(update.prev_participant?._ === 'channelParticipantBanned') {\n // --exceptionsCount;\n // }\n // }\n\n // setLength();\n // });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return this.managers.appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then((res) => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n\n exceptionsCount = res.count;\n setLength();\n\n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(await this.managers.appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport copy from '../../../../helpers/object/copy';\nimport {ChatBannedRights, Chat} from '../../../../layer';\n\nexport default function combineParticipantBannedRights(chat: Chat.channel, rights: ChatBannedRights) {\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(const i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport debounce from '../../../helpers/schedulers/debounce';\nimport {ChatReactions, Reaction} from '../../../layer';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport CheckboxField from '../../checkboxField';\nimport Row, {RadioFormFromValues} from '../../row';\nimport {SettingSection} from '../../sidebarLeft';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.setTitle('Reactions');\n\n const availableReactions = await this.managers.appReactionsManager.getActiveAvailableReactions();\n const chatFull = await this.managers.appProfileManager.getChatFull(this.chatId);\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n let _chatReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n let chatReactions = _chatReactions;\n let emoticons = new Set(_chatReactions._ === 'chatReactionsSome' ? _chatReactions.reactions.map((reaction) => (reaction as Reaction.reactionEmoji).emoticon) : []);\n\n const makeReactionFromEmoticons = (emoticons: Array): Reaction[] => emoticons.map((emoticon) => ({_: 'reactionEmoji', emoticon}));\n\n const getCaptionLangPackKey = (): LangPackKey => {\n if(isBroadcast) {\n return 'EnableReactionsChannelInfo';\n }\n\n return chatReactions._ === 'chatReactionsAll' ? 'EnableAllReactionsInfo' : (chatReactions._ === 'chatReactionsNone' ? 'DisableReactionsInfo' : 'EnableSomeReactionsInfo');\n };\n\n const toggleSection = new SettingSection({\n name: isBroadcast ? undefined : 'AvailableReactions',\n caption: getCaptionLangPackKey()\n });\n\n const reactionsSection = new SettingSection({\n name: 'OnlyAllowThisReactions'\n });\n\n const toggleCheckboxFieldsByEmoticons = () => {\n const r: Reaction.reactionEmoji[] = (chatReactions as ChatReactions.chatReactionsSome).reactions as any ?? [];\n emoticons = new Set(r.map(({emoticon}) => emoticon));\n checkboxFieldsByEmoticon.forEach((checkboxField, emoticon) => {\n checkboxField.setValueSilently(emoticons.has(emoticon));\n });\n };\n\n let toggleCheckboxField: CheckboxField;\n if(isBroadcast) {\n toggleCheckboxField = new CheckboxField({toggle: true, checked: _chatReactions._ === 'chatReactionsSome'});\n const toggleRow = new Row({\n checkboxField: toggleCheckboxField,\n titleLangKey: 'EnableReactions',\n listenerSetter: this.listenerSetter\n });\n\n toggleSection.content.append(toggleRow.container);\n\n this.listenerSetter.add(toggleCheckboxField.input)('change', () => {\n let save = true;\n if(!toggleCheckboxField.checked) {\n chatReactions = {_: 'chatReactionsNone'};\n } else if(checkboxFields.every((checkboxField) => !checkboxField.checked)) {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(availableReactions.map(({reaction}) => reaction))};\n } else if(chatReactions._ !== 'chatReactionsSome') {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(Array.from(emoticons))};\n } else {\n save = false;\n }\n\n if(save) {\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n }\n });\n } else {\n const a: [ChatReactions['_'], LangPackKey][] = [\n ['chatReactionsAll', 'AllReactions'],\n ['chatReactionsSome', 'SomeReactions'],\n ['chatReactionsNone', 'NoReactions']\n ];\n\n const onChange = () => {\n reactionsSection.container.classList.toggle('hide', chatReactions._ !== 'chatReactionsSome');\n };\n\n let value = _chatReactions._;\n const form = RadioFormFromValues(a.map(([value, langPackKey]) => {\n return {\n langPackKey,\n value,\n checked: _chatReactions._ === value\n };\n }), (_value) => {\n value = _value as any;\n\n if(value === 'chatReactionsAll') {\n chatReactions = {\n _: value,\n pFlags: {\n allow_custom: true\n }\n };\n } else if(value === 'chatReactionsNone') {\n chatReactions = {\n _: value\n };\n } else {\n chatReactions = {\n _: value,\n reactions: makeReactionFromEmoticons(['👍', '👎'])\n };\n }\n\n replaceContent(toggleSection.caption, i18n(getCaptionLangPackKey()));\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n onChange();\n });\n\n toggleSection.content.append(form);\n onChange();\n }\n\n const checkboxFieldsByEmoticon: Map = new Map();\n const checkboxFields = availableReactions.map((availableReaction) => {\n const emoticon = availableReaction.reaction;\n const checkboxField = new CheckboxField({\n toggle: true,\n checked: emoticons.has(emoticon)\n });\n\n checkboxFieldsByEmoticon.set(emoticon, checkboxField);\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n emoticons.add(emoticon);\n\n if(toggleCheckboxField && !toggleCheckboxField.checked) {\n toggleCheckboxField.checked = true;\n }\n } else {\n emoticons.delete(emoticon);\n\n if(toggleCheckboxField?.checked && !emoticons.size) {\n toggleCheckboxField.checked = false;\n }\n }\n\n saveReactionsDebounced();\n });\n\n const row = new Row({\n checkboxField,\n title: availableReaction.title,\n havePadding: true,\n listenerSetter: this.listenerSetter\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 const saveReactions = async() => {\n saveReactionsDebounced.clearTimeout();\n // const newReactions = Array.from(enabledReactions);\n // if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n // return;\n // }\n\n if(chatReactions._ === 'chatReactionsSome') {\n chatReactions.reactions = makeReactionFromEmoticons(Array.from(emoticons));\n }\n\n // const r = (chatReactions as ChatReactions.chatReactionsSome).reactions;\n // if(r?.length === availableReactions.length) {\n // chatReactions = {_: 'chatReactionsAll'};\n // }\n\n this.managers.appChatsManager.setChatAvailableReactions(this.chatId, chatReactions);\n _chatReactions = chatReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', () => {\n if(saveReactionsDebounced.isDebounced()) {\n saveReactions();\n }\n }, {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, {CreateRowFromCheckboxField} from '../../row';\r\nimport Button from '../../button';\r\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\r\nimport {Chat, ChatFull} from '../../../layer';\r\nimport AppChatTypeTab from './chatType';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport AppGroupPermissionsTab from './groupPermissions';\r\nimport {i18n, LangPackKey} from '../../../lib/langPack';\r\nimport PopupDeleteDialog from '../../popups/deleteDialog';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\r\nimport CheckboxField from '../../checkboxField';\r\nimport AppChatReactionsTab from './chatReactions';\r\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\r\nimport replaceContent from '../../../helpers/dom/replaceContent';\r\n\r\nexport default class AppEditChatTab extends SliderSuperTab {\r\n private chatNameInputField: InputField;\r\n private descriptionInputField: InputField;\r\n private editPeer: EditPeer;\r\n private tempId: number;\r\n public chatId: ChatId;\r\n\r\n protected async _init() {\r\n // * cleanup prev\r\n this.listenerSetter.removeAll();\r\n this.scrollable.container.innerHTML = '';\r\n this.tempId ??= 0;\r\n const tempId = ++this.tempId;\r\n\r\n this.container.classList.add('edit-peer-container', 'edit-group-container');\r\n this.setTitle('Edit');\r\n\r\n let chatFull = await this.managers.appProfileManager.getChatFull(this.chatId, true);\r\n\r\n const chat: Chat.chat | Chat.channel = await this.managers.appChatsManager.getChat(this.chatId);\r\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\r\n const isChannel = await this.managers.appChatsManager.isChannel(this.chatId);\r\n\r\n const chatUpdateListeners: (() => void)[] = [];\r\n const addChatUpdateListener = (callback: () => void) => {\r\n chatUpdateListeners.push(callback);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatUpdateListeners.forEach((callback) => callback());\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_full_update', async(chatId) => {\r\n if(this.chatId === chatId) {\r\n chatFull = await this.managers.appProfileManager.getCachedFullChat(chatId) || chatFull;\r\n }\r\n });\r\n\r\n const peerId = this.chatId.toPeerId(true);\r\n const canChangeType = await this.managers.appChatsManager.hasRights(this.chatId, 'change_type');\r\n const canChangePermissions = await this.managers.appChatsManager.hasRights(this.chatId, 'change_permissions');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.chatNameInputField = new InputField({\r\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\r\n name: 'chat-name',\r\n maxLength: 255,\r\n required: true\r\n });\r\n this.descriptionInputField = new InputField({\r\n label: 'DescriptionPlaceholder',\r\n name: 'chat-description',\r\n maxLength: 255\r\n });\r\n\r\n this.chatNameInputField.setOriginalValue(chat.title);\r\n this.descriptionInputField.setOriginalValue(chatFull.about);\r\n\r\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\r\n\r\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n\r\n if(canChangeType) {\r\n const chatTypeRow = new Row({\r\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppChatTypeTab);\r\n tab.chatId = this.chatId;\r\n tab.chatFull = chatFull;\r\n tab.open();\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setChatTypeSubtitle);\r\n },\r\n icon: 'lock',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const setChatTypeSubtitle = () => {\r\n chatTypeRow.subtitle.textContent = '';\r\n\r\n let key: LangPackKey;\r\n if(isBroadcast) {\r\n key = (chat as Chat.channel).username ? 'TypePublic' : 'TypePrivate';\r\n } else {\r\n key = (chat as Chat.channel).username ? 'TypePublicGroup' : 'TypePrivateGroup';\r\n }\r\n\r\n chatTypeRow.subtitle.append(i18n(key));\r\n };\r\n\r\n setChatTypeSubtitle();\r\n section.content.append(chatTypeRow.container);\r\n }\r\n\r\n if(canChangeType || canChangePermissions) {\r\n const reactionsRow = new Row({\r\n titleLangKey: 'Reactions',\r\n icon: 'reactions',\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppChatReactionsTab);\r\n tab.chatId = this.chatId;\r\n tab.open().then(() => {\r\n if(this.tempId !== tempId) {\r\n return;\r\n }\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setReactionsLength);\r\n });\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const availableReactions = await this.managers.appReactionsManager.getAvailableReactions();\r\n const availableReactionsLength = availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive).length;\r\n const setReactionsLength = () => {\r\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\r\n if(chatAvailableReactions._ === 'chatReactionsSome') {\r\n const length = chatAvailableReactions.reactions.length;\r\n if(length === availableReactionsLength) {\r\n replaceContent(reactionsRow.subtitle, i18n('ReactionsAll'));\r\n } else {\r\n reactionsRow.subtitle.textContent = length + '/' + availableReactionsLength;\r\n }\r\n } else {\r\n replaceContent(reactionsRow.subtitle, i18n(chatAvailableReactions._ === 'chatReactionsAll' ? 'ReactionsAll' : 'Checkbox.Disabled'));\r\n }\r\n };\r\n\r\n setReactionsLength();\r\n\r\n section.content.append(reactionsRow.container);\r\n }\r\n\r\n if(canChangePermissions && !isBroadcast) {\r\n const flags = [\r\n 'send_messages',\r\n 'send_media',\r\n 'send_stickers',\r\n 'send_polls',\r\n 'embed_links',\r\n 'invite_users',\r\n 'pin_messages',\r\n 'change_info'\r\n ] as ChatRights[];\r\n\r\n const permissionsRow = new Row({\r\n titleLangKey: 'ChannelPermissions',\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppGroupPermissionsTab);\r\n tab.chatId = this.chatId;\r\n tab.open();\r\n },\r\n icon: 'permissions',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const setPermissionsLength = async() => {\r\n const chat = await this.managers.appChatsManager.getChatTyped(this.chatId);\r\n permissionsRow.subtitle.innerHTML = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;\r\n };\r\n\r\n setPermissionsLength();\r\n section.content.append(permissionsRow.container);\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n setPermissionsLength();\r\n }\r\n });\r\n }\r\n\r\n /* const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n const promises: Promise[] = [];\r\n\r\n const id = this.chatId;\r\n if(this.chatNameInputField.isValidToChange()) {\r\n promises.push(this.managers.appChatsManager.editTitle(id, this.chatNameInputField.value));\r\n }\r\n\r\n if(this.descriptionInputField.isValidToChange()) {\r\n promises.push(this.managers.appChatsManager.editAbout(id, this.descriptionInputField.value));\r\n }\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\r\n return this.managers.appChatsManager.editPhoto(id, inputFile);\r\n }));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n\r\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\r\n const discussionRow = new Row({\r\n titleLangKey: 'PeerInfo.Discussion',\r\n subtitleLangKey: 'PeerInfo.Discussion.Add',\r\n clickable: true,\r\n icon: 'message'\r\n });\r\n\r\n section.content.append(discussionRow.container);\r\n }\r\n\r\n const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + chatFull.admins_count,\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n if(isBroadcast && await this.managers.appChatsManager.hasRights(this.chatId, 'change_info')) {\r\n const signMessagesCheckboxField = new CheckboxField({\r\n text: 'PeerInfo.SignMessages',\r\n checked: !!(chat as Chat.channel).pFlags.signatures\r\n });\r\n\r\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\r\n const toggle = signMessagesCheckboxField.toggleDisability(true);\r\n this.managers.appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n addChatUpdateListener(() => {\r\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\r\n });\r\n\r\n section.content.append(CreateRowFromCheckboxField(signMessagesCheckboxField).container);\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 });\r\n\r\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\r\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\r\n this.managers.appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n // ! it won't be updated because chatFull will be old\r\n const onChatUpdate = () => {\r\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\r\n };\r\n\r\n onChatUpdate();\r\n addChatUpdateListener(onChatUpdate);\r\n\r\n section.content.append(CreateRowFromCheckboxField(showChatHistoryCheckboxField).container);\r\n }\r\n\r\n if(section.content.childElementCount) {\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n if(await this.managers.appChatsManager.hasRights(this.chatId, 'delete_chat')) {\r\n const section = new SettingSection({});\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!isChannel) {\r\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\r\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\r\n if(peerId === migrateFrom) {\r\n this.chatId = migrateTo.toChatId();\r\n this._init();\r\n }\r\n });\r\n }\r\n }\r\n\r\n public init() {\r\n return this._init();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../../lib/rootScope';\nimport AppSearchSuper, {SearchSuperType} from '../../appSearchSuper.';\nimport SidebarSlider, {SliderSuperTab} from '../../slider';\nimport {TransitionSlider} from '../../transition';\nimport AppEditChatTab from './editChat';\nimport PeerTitle from '../../peerTitle';\nimport AppEditContactTab from './editContact';\nimport Button from '../../button';\nimport ButtonIcon from '../../buttonIcon';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport {toastNew} from '../../toast';\nimport AppAddMembersTab from '../../sidebarLeft/tabs/addMembers';\nimport PopupPickUser from '../../popups/pickUser';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions} from '../../popups/peer';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport PeerProfile from '../../peerProfile';\nimport {Message} from '../../../layer';\n\nconst historiesStorage: {\n [peerId: PeerId]: Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n }>\n} = {};\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n constructor(slider: SidebarSlider) {\n super(slider, false);\n }\n\n public init() {\n // const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n\n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.title.append(i18n('Profile'));\n this.editBtn = ButtonIcon('edit');\n // const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter);\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 }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.editBtn, (e) => {\n let tab: AppEditChatTab | AppEditContactTab;\n if(this.peerId.isAnyChat()) {\n tab = this.slider.createTab(AppEditChatTab);\n } else {\n tab = this.slider.createTab(AppEditContactTab);\n }\n\n if(tab) {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = this.peerId.toChatId();\n } else {\n tab.peerId = this.peerId;\n }\n\n tab.open();\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n this.renderNewMessages(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', ({message}) => {\n this.renderNewMessages(message);\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 const timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n },\n managers: this.managers\n });\n\n this.searchSuper.scrollStartCallback = () => {\n setIsSharedMedia(true);\n };\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n attachClickEvent(btnAddMembers, async() => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = await this.managers.appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map((peerId) => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n\n if(isChannel) {\n const tab = this.slider.createTab(AppAddMembersTab);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = this.managers.appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n this.managers.appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n }\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n // console.log('construct shared media time:', performance.now() - perf);\n }\n\n public async renderNewMessages(message: Message.message | Message.messageService) {\n if(this.init) return; // * not inited yet\n\n const {peerId} = message;\n if(!historiesStorage[peerId]) return;\n\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const history = historiesStorage[peerId][inputFilter];\n if(!history) {\n continue;\n }\n\n const filtered = this.searchSuper.filterMessagesByType([message], inputFilter).filter((message) => !history.find((m) => m.mid === message.mid && m.peerId === message.peerId));\n if(filtered.length) {\n history.unshift(...filtered.map((message) => ({mid: message.mid, peerId: message.peerId})));\n\n if(this.peerId === peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!historiesStorage[peerId]) return;\n\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = historiesStorage[peerId][inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex((m) => m.mid === mid);\n if(idx === -1) {\n continue;\n }\n\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n\n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n --this.searchSuper.usedFromHistory[inputFilter];\n }\n }\n\n // can have element in different tabs somehow\n // break;\n }\n }\n\n this.scrollable.onScroll();\n }\n\n public async cleanupHTML() {\n // const perf = performance.now();\n this.profile.cleanupHTML();\n this.editBtn.classList.add('hide');\n this.searchSuper.cleanupHTML(true);\n this.container.classList.toggle('can-add-members', await this.searchSuper.canViewMembers() && await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users'));\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId,\n // threadId,\n historyStorage: historiesStorage[peerId] ??= {}\n });\n\n this.profile.setPeer(peerId, threadId);\n\n return true;\n }\n\n public async fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n await this.cleanupHTML();\n await this.toggleEditBtn();\n await this.profile.fillProfileElements();\n }\n\n private async toggleEditBtn() {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && await this.managers.appUsersManager.isContact(this.peerId.toUserId());\n } else {\n show = await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'change_info');\n }\n\n this.editBtn.classList.toggle('hide', !show);\n }\n\n public loadSidebarMedia(single: boolean, justLoad?: boolean) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n\n public destroy() {\n this.destroyable = true;\n this.onCloseAfterTimeout();\n this.profile.destroy();\n this.searchSuper.destroy();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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 onTransitionStart?: () => void\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n // useRafs = undefined;\r\n // duration = 0;\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, onTransitionStart);\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?.();\r\n };\r\n\r\n onTransitionStart?.();\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\nimport {horizontalMenu} from './horizontalMenu';\r\nimport {TransitionSlider} from './transition';\r\nimport appNavigationController, {NavigationItem} from './appNavigationController';\r\nimport SliderSuperTab, {SliderSuperTabConstructable} from './sliderTab';\r\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\n\r\nconst TRANSITION_TIME = 250;\r\n\r\nexport {SliderSuperTab};\r\n\r\nexport default class SidebarSlider {\r\n protected _selectTab: ReturnType;\r\n public historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\r\n public tabsContainer: HTMLElement;\r\n public sidebarEl: HTMLElement;\r\n public tabs: Map; // * key is any, since right sidebar is ugly now\r\n private canHideFirst = false;\r\n private navigationType: NavigationItem['type'];\r\n protected managers: AppManagers;\r\n\r\n constructor(options: {\r\n sidebarEl: SidebarSlider['sidebarEl'],\r\n tabs?: SidebarSlider['tabs'],\r\n canHideFirst?: SidebarSlider['canHideFirst'],\r\n navigationType: SidebarSlider['navigationType']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.tabs) {\r\n this.tabs = new Map();\r\n }\r\n\r\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\r\n this._selectTab = TransitionSlider(this.tabsContainer, 'navigation', TRANSITION_TIME);\r\n if(!this.canHideFirst) {\r\n this._selectTab(0);\r\n }\r\n\r\n // Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach((el) => {\r\n // attachClickEvent(el, this.onCloseBtnClick);\r\n // });\r\n }\r\n\r\n public onCloseBtnClick = () => {\r\n const item = appNavigationController.findItemByType(this.navigationType);\r\n if(item) {\r\n appNavigationController.back(this.navigationType);\r\n } else if(this.historyTabIds.length) {\r\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\r\n }\r\n // this.closeTab();\r\n };\r\n\r\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\r\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\r\n this.removeTabFromHistory(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: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n // @ts-ignore\r\n tab.onOpen?.();\r\n\r\n // @ts-ignore\r\n if(tab.onOpenAfterTimeout) {\r\n setTimeout(() => {\r\n // @ts-ignore\r\n tab.onOpenAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n\r\n // if(!this.canHideFirst || this.historyTabIds.length) {\r\n appNavigationController.pushItem({\r\n type: this.navigationType,\r\n onPop: (canAnimate) => {\r\n this.closeTab(undefined, canAnimate, true);\r\n return true;\r\n }\r\n });\r\n // }\r\n\r\n this.historyTabIds.push(id);\r\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\r\n return true;\r\n }\r\n\r\n public removeTabFromHistory(id: number | SliderSuperTab) {\r\n indexOfAndSplice(this.historyTabIds, id);\r\n this.onCloseTab(id, undefined);\r\n }\r\n\r\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\r\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\r\n const tab = this.historyTabIds[i];\r\n if(tab === preserveTab) continue;\r\n else if(tab instanceof tabConstructor) {\r\n break;\r\n }\r\n\r\n this.removeTabFromHistory(tab);\r\n // appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n }\r\n\r\n public getTab(tabConstructor: SliderSuperTabConstructable) {\r\n return this.historyTabIds.find((t) => t instanceof tabConstructor) as T;\r\n }\r\n\r\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\r\n return !!this.getTab(tabConstructor);\r\n }\r\n\r\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\r\n if(!isNavigation) {\r\n appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n\r\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n try {\r\n // @ts-ignore\r\n tab.onClose?.();\r\n } catch(err) {\r\n console.error('tab onClose error', tab);\r\n }\r\n\r\n // @ts-ignore\r\n if(tab.onCloseAfterTimeout) {\r\n setTimeout(() => {\r\n // @ts-ignore\r\n tab.onCloseAfterTimeout();\r\n }, TRANSITION_TIME + 30);\r\n }\r\n }\r\n }\r\n\r\n public addTab(tab: SliderSuperTab) {\r\n if(!tab.container.parentElement) {\r\n this.tabsContainer.append(tab.container);\r\n\r\n if(tab.closeBtn) {\r\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\r\n }\r\n }\r\n }\r\n\r\n public createTab(ctor: SliderSuperTabConstructable, doNotAppend?: boolean) {\r\n const tab = new ctor(doNotAppend ? undefined : this, true);\r\n tab.managers = this.managers;\r\n return tab;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport EventListenerBase from '../helpers/eventListenerBase';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport noop from '../helpers/noop';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport ButtonIcon from './buttonIcon';\r\nimport Scrollable from './scrollable';\r\nimport SidebarSlider from './slider';\r\n\r\nexport interface SliderSuperTabConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): T;\r\n}\r\n\r\nexport interface SliderSuperTabEventableConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\r\n}\r\n\r\nexport default class SliderSuperTab {\r\n public static getInitArgs?(fromTab: SliderSuperTab): any;\r\n\r\n public container: HTMLElement;\r\n\r\n public header: HTMLElement;\r\n public closeBtn: HTMLElement;\r\n public title: HTMLElement;\r\n\r\n public content: HTMLElement;\r\n public scrollable: Scrollable;\r\n\r\n public slider: SidebarSlider;\r\n public destroyable: boolean;\r\n public listenerSetter: ListenerSetter;\r\n\r\n public managers: AppManagers;\r\n\r\n constructor(slider: SidebarSlider, destroyable?: boolean) {\r\n this._constructor(slider, destroyable);\r\n }\r\n\r\n public _constructor(slider: SidebarSlider, destroyable = true): any {\r\n this.slider = slider;\r\n this.destroyable = destroyable;\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\r\n\r\n // * Header\r\n this.header = document.createElement('div');\r\n this.header.classList.add('sidebar-header');\r\n\r\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\r\n this.title = document.createElement('div');\r\n this.title.classList.add('sidebar-header__title');\r\n this.header.append(this.closeBtn, this.title);\r\n\r\n // * Content\r\n this.content = document.createElement('div');\r\n this.content.classList.add('sidebar-content');\r\n\r\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\r\n\r\n this.container.append(this.header, this.content);\r\n\r\n if(this.slider) {\r\n this.slider.addTab(this);\r\n }\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public close() {\r\n return this.slider.closeTab(this);\r\n }\r\n\r\n public async open(...args: Parameters) {\r\n if(this.init) {\r\n try {\r\n const result = this.init(...args);\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 public init(...args: any[]): Promise | any {\r\n\r\n }\r\n\r\n protected onOpen() {}\r\n protected onOpenAfterTimeout() {}\r\n protected onClose() {}\r\n\r\n protected onCloseAfterTimeout() {\r\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\r\n this.slider.tabs.delete(this);\r\n this.container.remove();\r\n this.scrollable.destroy();\r\n this.listenerSetter?.removeAll();\r\n }\r\n }\r\n\r\n protected setTitle(key: LangPackKey) {\r\n this.title.replaceChildren(i18n(key));\r\n }\r\n}\r\n\r\nexport class SliderSuperTabEventable extends SliderSuperTab {\r\n public eventListener: EventListenerBase<{\r\n destroy: () => void | Promise,\r\n destroyAfter: (promise: Promise) => void,\r\n close: () => 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 onClose() {\r\n this.eventListener.dispatchEvent('close');\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n const results = this.eventListener.dispatchResultableEvent('destroy');\r\n this.eventListener.dispatchEvent('destroyAfter', Promise.all(results).then(noop, noop));\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, {AppDialogsManager, DialogDom, DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {fastRaf} from '../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n protected getIndex: (element: SortedUser) => number;\n protected onUpdate: (element: SortedUser) => void;\n protected managers: AppManagers;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n createChatListOptions: SortedUserList['createChatListOptions'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange'],\n getIndex: SortedUserList['getIndex'],\n onUpdate: SortedUserList['onUpdate']\n }> & {\n managers: SortedUserList['managers']\n }) {\n super({\n getIndex: options.getIndex || ((element) => this.managers.appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || (async(element) => {\n const status = getUserStatusString(await this.managers.appUsersManager.getUser(element.id));\n replaceContent(element.dom.lastMessageSpan, status);\n }),\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n await getHeavyAnimationPromise();\n\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {simulateClickEvent, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {doubleRaf} from '../helpers/schedulers';\nimport pause from '../helpers/schedulers/pause';\nimport windowSize from '../helpers/windowSize';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport getStickerEffectThumb from '../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport {CustomEmojiElement} from '../lib/richTextProcessor/wrapRichText';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport SetTransition from './singleTransition';\nimport wrapSticker from './wrappers/sticker';\nimport {STICKER_EFFECT_MULTIPLIER} from './wrappers/sticker';\n\nlet hasViewer = false;\nexport default function attachStickerViewerListeners({listenTo, listenerSetter, selector, findTarget: originalFindTarget}: {\n listenerSetter: ListenerSetter,\n listenTo: HTMLElement,\n selector?: string,\n findTarget?: (e: MouseEvent) => HTMLElement\n}) {\n if(IS_TOUCH_SUPPORTED) {\n return;\n }\n\n const findTarget = (e: MouseEvent, checkForParent?: boolean) => {\n let el: HTMLElement;\n if(originalFindTarget) el = originalFindTarget(e);\n else {\n const s = selector || `.media-sticker-wrapper`;\n el = (e.target as HTMLElement).closest(s) as HTMLElement;\n }\n\n return el && (!checkForParent || findUpAsChild(el, listenTo)) ? el : undefined;\n };\n\n const managers = rootScope.managers;\n\n listenerSetter.add(listenTo)('mousedown', (e) => {\n if(hasViewer || e.buttons > 1 || e.button !== 0) return;\n let mediaContainer = findTarget(e);\n if(!mediaContainer) {\n return;\n }\n\n // const img: HTMLImageElement = mediaContainer.querySelector('img.media-sticker');\n\n const docId = mediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n const className = 'sticker-viewer';\n const group: AnimationItemGroup = 'STICKER-VIEWER';\n const openDuration = 200;\n const switchDuration = 200;\n const previousGroup = animationIntersector.getOnlyOnePlayableGroup();\n const _middleware = getMiddleware();\n let container: HTMLElement, previousTransformer: HTMLElement;\n\n const doThatSticker = async({mediaContainer, doc, middleware, lockGroups, isSwitching}: {\n mediaContainer: HTMLElement,\n doc: MyDocument,\n middleware: Middleware,\n lockGroups?: boolean,\n isSwitching?: boolean\n }) => {\n const effectThumb = getStickerEffectThumb(doc);\n const mediaRect: DOMRect = mediaContainer.getBoundingClientRect();\n const s = makeMediaSize(doc.w, doc.h);\n const size = effectThumb ? 280 : 360;\n const boxSize = makeMediaSize(size, size);\n const fitted = mediaRect.width === mediaRect.height ? boxSize : s.aspectFitted(boxSize);\n\n const bubble = findUpClassName(mediaContainer, 'bubble');\n const isOut = bubble ? bubble.classList.contains('is-out') : true;\n\n const transformer = document.createElement('div');\n transformer.classList.add(className + '-transformer');\n\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add(className + '-sticker');\n /* transformer.style.width = */stickerContainer.style.width = fitted.width + 'px';\n /* transformer.style.height = */stickerContainer.style.height = fitted.height + 'px';\n\n const stickerEmoji = document.createElement('div');\n stickerEmoji.classList.add(className + '-emoji');\n stickerEmoji.append(wrapEmojiText(doc.stickerEmojiRaw));\n\n if(effectThumb) {\n const margin = (size * STICKER_EFFECT_MULTIPLIER - size) / 3 * (isOut ? 1 : -1);\n transformer.classList.add('has-effect');\n // const property = `--margin-${isOut ? 'right' : 'left'}`;\n // stickerContainer.style.setProperty(property, `${margin * 2}px`);\n transformer.style.setProperty('--translateX', `${margin}px`);\n stickerEmoji.style.setProperty('--translateX', `${-margin}px`);\n }\n\n const overflowElement = findUpClassName(mediaContainer, 'scrollable');\n const visibleRect = getVisibleRect(mediaContainer, overflowElement, true, mediaRect);\n if(visibleRect.overflow.vertical || visibleRect.overflow.horizontal) {\n stickerContainer.classList.add('is-overflow');\n }\n\n // if(img) {\n // const ratio = img.naturalWidth / img.naturalHeight;\n // if((mediaRect.width / mediaRect.height).toFixed(1) !== ratio.toFixed(1)) {\n\n // mediaRect = mediaRect.toJSON();\n // }\n // }\n\n const rect = mediaContainer.getBoundingClientRect();\n const scaleX = rect.width / fitted.width;\n const scaleY = rect.height / fitted.height;\n const transformX = rect.left - (windowSize.width - rect.width) / 2;\n const transformY = rect.top - (windowSize.height - rect.height) / 2;\n transformer.style.transform = `translate(${transformX}px, ${transformY}px) scale(${scaleX}, ${scaleY})`;\n if(isSwitching) transformer.classList.add('is-switching');\n transformer.append(stickerContainer, stickerEmoji);\n container.append(transformer);\n\n const o = await wrapSticker({\n doc,\n div: stickerContainer,\n group,\n width: fitted.width,\n height: fitted.height,\n play: false,\n loop: true,\n middleware,\n managers,\n needFadeIn: false,\n isOut,\n withThumb: false,\n relativeEffect: true,\n loopEffect: true\n }).then(({render}) => render);\n if(!middleware()) return;\n\n if(!container.parentElement) {\n document.body.append(container);\n }\n\n const player = Array.isArray(o) ? o[0] : o;\n\n const firstFramePromise = player instanceof RLottiePlayer ?\n new Promise((resolve) => player.addEventListener('firstFrame', resolve, {once: true})) :\n Promise.resolve();\n await Promise.all([firstFramePromise, doubleRaf()]);\n await pause(0); // ! need it because firstFrame will be called just from the loop\n if(!middleware()) return;\n\n if(lockGroups) {\n animationIntersector.setOnlyOnePlayableGroup(group);\n animationIntersector.checkAnimations2(true);\n }\n\n if(player instanceof RLottiePlayer) {\n const prevPlayer = mediaContainer instanceof CustomEmojiElement ?\n mediaContainer.player as RLottiePlayer :\n lottieLoader.getAnimation(mediaContainer);\n if(prevPlayer) {\n player.curFrame = prevPlayer.curFrame;\n player.play();\n await new Promise((resolve) => {\n let i = 0;\n const c = () => {\n if(++i === 2) {\n resolve();\n player.removeEventListener('enterFrame', c);\n }\n };\n\n player.addEventListener('enterFrame', c);\n });\n if(!middleware()) return;\n player.pause();\n }\n } else if(player instanceof HTMLVideoElement) {\n const prevPlayer = mediaContainer.querySelector('video');\n if(prevPlayer) {\n player.currentTime = prevPlayer.currentTime;\n }\n }\n\n return {\n ready: () => {\n if(player instanceof RLottiePlayer || player instanceof HTMLVideoElement) {\n player.play();\n }\n\n if(effectThumb) {\n simulateClickEvent(stickerContainer);\n }\n },\n transformer\n };\n };\n\n const timeout = window.setTimeout(async() => {\n document.removeEventListener('mousemove', onMousePreMove);\n\n container = document.createElement('div');\n container.classList.add(className);\n hasViewer = true;\n\n const middleware = _middleware.get();\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let result: Awaited>;\n try {\n result = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n lockGroups: true\n });\n if(!result) return;\n } catch(err) {\n return;\n }\n\n const {ready, transformer} = result;\n\n previousTransformer = transformer;\n\n SetTransition(container, 'is-visible', true, openDuration, () => {\n if(!middleware()) return;\n ready();\n });\n\n document.addEventListener('mousemove', onMouseMove);\n }, 125);\n\n const onMouseMove = async(e: MouseEvent) => {\n const newMediaContainer = findTarget(e, true);\n if(!newMediaContainer || mediaContainer === newMediaContainer) {\n return;\n }\n\n const docId = newMediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n mediaContainer = newMediaContainer;\n _middleware.clean();\n const middleware = _middleware.get();\n\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let r: Awaited>;\n try {\n r = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n isSwitching: true\n });\n if(!r) return;\n } catch(err) {\n console.error('sticker viewer error', err);\n return;\n }\n\n const {ready, transformer} = r;\n\n const _previousTransformer = previousTransformer;\n SetTransition(_previousTransformer, 'is-switching', true, switchDuration, () => {\n _previousTransformer.remove();\n });\n\n previousTransformer = transformer;\n\n SetTransition(transformer, 'is-switching', false, switchDuration, () => {\n if(!middleware()) return;\n ready();\n });\n };\n\n const onMousePreMove = (e: MouseEvent) => {\n if(!findUpAsChild(e.target as HTMLElement, mediaContainer)) {\n onMouseUp();\n }\n };\n\n const onMouseUp = () => {\n clearTimeout(timeout);\n _middleware.clean();\n\n if(container) {\n SetTransition(container, 'is-visible', false, openDuration, () => {\n container.remove();\n animationIntersector.setOnlyOnePlayableGroup(previousGroup);\n animationIntersector.checkAnimations2(false);\n hasViewer = false;\n });\n\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n document.removeEventListener('mousemove', onMousePreMove);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp, {capture: true});\n };\n\n document.addEventListener('mousemove', onMousePreMove);\n document.addEventListener('mouseup', onMouseUp, {once: true, capture: 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\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport contextMenuController from '../helpers/contextMenuController';\r\n\r\nconst getEvent = (e: TouchEvent | MouseEvent) => {\r\n return (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent;\r\n};\r\n\r\nconst attachGlobalListenerTo = window;\r\n\r\nlet RESET_GLOBAL = false;\r\ncontextMenuController.addEventListener('toggle', (visible) => {\r\n RESET_GLOBAL = visible;\r\n});\r\n\r\nexport type SwipeHandlerOptions = {\r\n element: SwipeHandler['element'],\r\n onSwipe: SwipeHandler['onSwipe'],\r\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\r\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\r\n onReset?: SwipeHandler['onReset'],\r\n cursor?: SwipeHandler['cursor'],\r\n cancelEvent?: SwipeHandler['cancelEvent'],\r\n listenerOptions?: SwipeHandler['listenerOptions']\r\n};\r\n\r\nexport default class SwipeHandler {\r\n private element: HTMLElement;\r\n private onSwipe: (xDiff: number, yDiff: number, e: TouchEvent | MouseEvent) => boolean | void;\r\n private verifyTouchTarget: (evt: TouchEvent | MouseEvent) => boolean | Promise;\r\n private onFirstSwipe: () => void;\r\n private onReset: () => void;\r\n private cursor: 'grabbing' | 'move' | 'row-resize' | 'col-resize' | 'nesw-resize' | 'nwse-resize' | 'ne-resize' | 'se-resize' | 'sw-resize' | 'nw-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | '' = 'grabbing';\r\n private cancelEvent = true;\r\n private listenerOptions: boolean | AddEventListenerOptions = false;\r\n private setCursorTo: HTMLElement;\r\n\r\n private hadMove = false;\r\n private xDown: number = null;\r\n private yDown: number = null;\r\n\r\n constructor(options: SwipeHandlerOptions) {\r\n safeAssign(this, options);\r\n\r\n this.setCursorTo = this.element;\r\n\r\n this.setListeners();\r\n }\r\n\r\n public setListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.addEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.addEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public removeListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.removeEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.removeEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public setCursor(cursor: SwipeHandler['cursor']) {\r\n this.cursor = cursor;\r\n\r\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n }\r\n\r\n reset = (e?: Event) => {\r\n /* if(e) {\r\n cancelEvent(e);\r\n } */\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.removeEventListener('touchmove', this.handleMove, {capture: true});\r\n } else {\r\n attachGlobalListenerTo.removeEventListener('mousemove', this.handleMove);\r\n this.setCursorTo.style.cursor = '';\r\n }\r\n\r\n if(this.onReset && this.hadMove) {\r\n this.onReset();\r\n }\r\n\r\n this.xDown = this.yDown = null;\r\n this.hadMove = false;\r\n };\r\n\r\n handleStart = async(_e: TouchEvent | MouseEvent) => {\r\n const e = getEvent(_e);\r\n if(this.verifyTouchTarget && !(await this.verifyTouchTarget(_e))) {\r\n return this.reset();\r\n }\r\n\r\n this.xDown = e.clientX;\r\n this.yDown = e.clientY;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.addEventListener('touchmove', this.handleMove, {passive: false, capture: true});\r\n } else {\r\n attachGlobalListenerTo.addEventListener('mousemove', this.handleMove, false);\r\n }\r\n };\r\n\r\n handleMove = (_e: TouchEvent | MouseEvent) => {\r\n if(this.xDown === null || this.yDown === null || RESET_GLOBAL) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if(this.cancelEvent) {\r\n cancelEvent(_e);\r\n }\r\n\r\n const e = getEvent(_e);\r\n const xUp = e.clientX;\r\n const yUp = e.clientY;\r\n\r\n const xDiff = this.xDown - xUp;\r\n const yDiff = this.yDown - yUp;\r\n\r\n if(!this.hadMove) {\r\n if(!xDiff && !yDiff) {\r\n return;\r\n }\r\n\r\n this.hadMove = true;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n\r\n if(this.onFirstSwipe) {\r\n this.onFirstSwipe();\r\n }\r\n }\r\n\r\n // if(Math.abs(xDiff) > Math.abs(yDiff)) { /*most significant*/\r\n // if(xDiff > 0) { /* left swipe */\r\n\r\n // } else { /* right swipe */\r\n\r\n // }\r\n // } else {\r\n // if(yDiff > 0) { /* up swipe */\r\n\r\n // } else { /* down swipe */\r\n\r\n // }\r\n // }\r\n\r\n /* reset values */\r\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\r\n if(onSwipeResult !== undefined && onSwipeResult) {\r\n this.reset();\r\n }\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 const 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 replaceContent from '../helpers/dom/replaceContent';\r\nimport OverlayClickHandler from '../helpers/overlayClickHandler';\r\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\r\n\r\nconst toastEl = document.createElement('div');\r\ntoastEl.classList.add('toast');\r\nlet timeout: number;\r\n\r\nconst x = new OverlayClickHandler('toast');\r\nx.addEventListener('toggle', (open) => {\r\n if(!open) {\r\n hideToast();\r\n }\r\n});\r\n\r\nexport function hideToast() {\r\n x.close();\r\n\r\n toastEl.classList.remove('is-visible');\r\n timeout && clearTimeout(+timeout);\r\n\r\n timeout = window.setTimeout(() => {\r\n toastEl.remove();\r\n timeout = undefined;\r\n }, 200);\r\n}\r\n\r\nexport function toast(content: string | Node, onClose?: () => void) {\r\n x.close();\r\n\r\n replaceContent(toastEl, content);\r\n\r\n if(!toastEl.parentElement) {\r\n document.body.append(toastEl);\r\n void toastEl.offsetLeft; // reflow\r\n }\r\n\r\n toastEl.classList.add('is-visible');\r\n\r\n timeout && clearTimeout(+timeout);\r\n x.open(toastEl);\r\n\r\n timeout = window.setTimeout(hideToast, 3000);\r\n\r\n if(onClose) {\r\n x.addEventListener('toggle', onClose, {once: true});\r\n }\r\n}\r\n\r\nexport function toastNew(options: Partial<{\r\n langPackKey: LangPackKey,\r\n langPackArguments: FormatterArguments,\r\n onClose: () => void\r\n}>) {\r\n toast(i18n(options.langPackKey, options.langPackArguments), options.onClose);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../lib/rootScope';\r\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\r\nimport whichChild from '../helpers/dom/whichChild';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n\r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\r\n // window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n // void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n\r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n // });\r\n\r\n return () => {\r\n prevTabContent.style.transform = '';\r\n\r\n // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement,\r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */,\r\n transitionTime: number,\r\n onTransitionEnd?: (id: number) => void,\r\n isHeavy = true,\r\n listenerSetter?: ListenerSetter\r\n) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n\r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy, undefined, undefined, listenerSetter);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (\r\n content: HTMLElement,\r\n animationFunction: TransitionFunction,\r\n transitionTime: number,\r\n onTransitionEnd?: (id: number) => void,\r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true,\r\n listenerSetter?: ListenerSetter\r\n) => {\r\n const onTransitionEndCallbacks: Map = new Map();\r\n let animationDeferred: CancellablePromise;\r\n // let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n\r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n\r\n // console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n\r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n callback?.();\r\n\r\n if(e.target !== from) {\r\n return;\r\n }\r\n\r\n if(!animationDeferred && isHeavy) return;\r\n\r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n\r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n if(once) {\r\n if(listenerSetter) listenerSetter.removeManual(content, listenerName, onEndEvent);\r\n else content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n\r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n if(listenerSetter) listenerSetter.add(content)(listenerName, onEndEvent);\r\n else content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n // console.log('selectTab id:', id);\r\n\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n callback?.();\r\n }\r\n\r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating'/* , 'disable-hover' */);\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType;\r\n if(!to) {\r\n // prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n\r\n if(to) {\r\n const transitionTimeout = to.dataset.transitionTimeout;\r\n if(transitionTimeout) {\r\n clearTimeout(+transitionTimeout);\r\n }\r\n\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(from/* && false */) {\r\n let timeout: number;\r\n const _from = from;\r\n const callback = () => {\r\n clearTimeout(timeout);\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback?.();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n timeout = window.setTimeout(callback, transitionTime + 100); // something happened to container\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n onTransitionEndCallbacks.delete(_from);\r\n });\r\n }\r\n\r\n _from.dataset.transitionTimeout = '' + timeout;\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise();\r\n // animationStarted = performance.now();\r\n }\r\n\r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n\r\n from = to;\r\n }\r\n\r\n // selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n selectTab.getFrom = () => from;\r\n selectTab.setFrom = (_from: HTMLElement) => from = _from;\r\n\r\n return selectTab;\r\n};\r\n\r\nexport default Transition;\r\n","export default function isUsernameValid(username: string) {\n return ((username.length >= 5 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport debounce from '../helpers/schedulers/debounce';\r\nimport {LangPackKey} from '../lib/langPack';\r\nimport InputField, {InputFieldOptions, InputState} from './inputField';\r\nimport isUsernameValid from '../lib/richTextProcessor/isUsernameValid';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\n\r\nexport class UsernameInputField extends InputField {\r\n private checkUsernamePromise: Promise;\r\n private checkUsernameDebounced: (username: string) => void;\r\n public options: InputFieldOptions & {\r\n peerId?: PeerId,\r\n listenerSetter: ListenerSetter,\r\n onChange?: () => void,\r\n invalidText: LangPackKey,\r\n takenText: LangPackKey,\r\n availableText: LangPackKey,\r\n head?: string\r\n };\r\n\r\n constructor(\r\n options: UsernameInputField['options'],\r\n private managers: AppManagers\r\n ) {\r\n super(options);\r\n\r\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\r\n\r\n options.listenerSetter.add(this.input)('input', () => {\r\n const value = this.getValue();\r\n\r\n // console.log('userNameInput:', value);\r\n if(value === this.originalValue || !value.length) {\r\n this.setState(InputState.Neutral);\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n } else if(!isUsernameValid(value)) { // does not check the last underscore\r\n this.setError(this.options.invalidText);\r\n } else {\r\n this.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.input.classList.contains('error')) {\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n }\r\n\r\n this.checkUsernameDebounced(value);\r\n });\r\n }\r\n\r\n public getValue() {\r\n let value = this.value;\r\n if(this.options.head) {\r\n value = value.slice(this.options.head.length);\r\n this.setValueSilently(this.options.head + value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private checkUsername(username: string) {\r\n if(this.checkUsernamePromise) return;\r\n\r\n if(this.options.peerId) {\r\n this.checkUsernamePromise = this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(), username);\r\n } else {\r\n this.checkUsernamePromise = this.managers.appUsersManager.checkUsername(username);\r\n }\r\n\r\n this.checkUsernamePromise.then((available) => {\r\n if(this.getValue() !== username) return;\r\n\r\n if(available) {\r\n this.setState(InputState.Valid, this.options.availableText);\r\n } else {\r\n this.setError(this.options.takenText);\r\n }\r\n }, (err) => {\r\n if(this.getValue() !== username) return;\r\n\r\n switch(err.type) {\r\n case 'USERNAME_INVALID': {\r\n this.setError(this.options.invalidText);\r\n break;\r\n }\r\n }\r\n }).then(() => {\r\n this.checkUsernamePromise = undefined;\r\n this.options.onChange && this.options.onChange();\r\n\r\n const value = this.getValue();\r\n if(value !== username && this.isValidToChange() && isUsernameValid(value)) {\r\n this.checkUsername(value);\r\n }\r\n });\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/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 OnVisibilityChangeItem = {target: TargetType, visible: boolean, entry: IntersectionObserverEntry, index: number};\r\nexport type OnVisibilityChange = (item: OnVisibilityChangeItem) => 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, options?: IntersectionObserverInit) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(this.locked) {\r\n return;\r\n }\r\n\r\n const changed: OnVisibilityChangeItem[] = [];\r\n\r\n entries.forEach((entry, index) => {\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 const change: typeof changed[0] = {target, visible: entry.isIntersecting, entry, index};\r\n\r\n // ! order will be incorrect so can't use it\r\n // changed[entry.isIntersecting ? 'unshift' : 'push'](change);\r\n changed.push(change);\r\n\r\n // onVisibilityChange(target, entry.isIntersecting);\r\n });\r\n\r\n changed.forEach((item) => {\r\n onVisibilityChange(item);\r\n });\r\n }, options);\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport rootScope from '../lib/rootScope';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class VolumeSelector extends RangeSelector {\n private static ICONS = ['volume_off', 'volume_mute', 'volume_down', 'volume_up'];\n public btn: HTMLElement;\n protected icon: HTMLSpanElement;\n\n constructor(protected listenerSetter: ListenerSetter, protected vertical = false) {\n super({\n step: 0.01,\n min: 0,\n max: 1,\n vertical\n }, 1);\n\n this.setListeners();\n this.setHandlers({\n onScrub: currentTime => {\n const value = Math.max(Math.min(currentTime, 1), 0);\n\n // console.log('volume scrub:', currentTime, value);\n\n appMediaPlaybackController.muted = false;\n appMediaPlaybackController.volume = value;\n }\n\n /* onMouseUp: (e) => {\n cancelEvent(e.event);\n } */\n });\n\n const className = 'player-volume';\n const btn = this.btn = document.createElement('div');\n btn.classList.add('btn-icon', className);\n const icon = this.icon = document.createElement('span');\n icon.classList.add(className + '__icon');\n\n btn.append(icon, this.container);\n\n attachClickEvent(icon, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n public setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n let iconIndex: number;\n if(!volume || muted) {\n iconIndex = 0;\n } else if(volume > .5) {\n iconIndex = 3;\n } else if(volume > 0 && volume < .25) {\n iconIndex = 1;\n } else {\n iconIndex = 2;\n }\n\n VolumeSelector.ICONS.forEach((icon) => this.icon.classList.remove('tgico-' + icon));\n this.icon.classList.add('tgico-' + VolumeSelector.ICONS[iconIndex]);\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MediaSize} from '../../helpers/mediaSize';\nimport {Middleware} from '../../helpers/middleware';\nimport {MessageEntity} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\n\nexport default function wrapCustomEmoji({\n docIds,\n loadPromises,\n middleware,\n lazyLoadQueue,\n size,\n animationGroup\n}: {\n docIds: DocId[],\n loadPromises?: Promise[],\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n size?: MediaSize,\n animationGroup?: AnimationItemGroup\n}) {\n const text = ' '.repeat(docIds.length);\n const entities: MessageEntity[] = [];\n docIds.forEach((docId, idx) => {\n entities.push({\n _: 'messageEntityCustomEmoji',\n offset: idx,\n length: 1,\n document_id: docId\n });\n });\n\n const wrapped = wrapRichText(text, {\n entities,\n loadPromises,\n animationGroup,\n customEmojiSize: size,\n middleware,\n lazyLoadQueue\n });\n\n return wrapped;\n}\n\n","/*\n * 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 {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {clearBadCharsAndTrim} from '../../helpers/cleanSearchText';\nimport {formatFullSentTime} from '../../helpers/date';\nimport {simulateClickEvent, attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatBytes from '../../helpers/formatBytes';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport noop from '../../helpers/noop';\nimport {Message, MessageMedia, WebPage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {Progress} from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getDownloadMediaDetails from '../../lib/appManagers/utils/download/getDownloadMediaDetails';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {joinElementsWith} from '../../lib/langPack';\nimport {MAX_FILE_SAVE_SIZE} from '../../lib/mtproto/mtproto_config';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport AudioElement from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {MiddleEllipsisElement} from '../middleEllipsis';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\nimport wrapSenderToPeer from './senderToPeer';\nimport wrapSentTime from './sentTime';\n\nrootScope.addEventListener('document_downloading', (docId) => {\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n if(element.querySelector('.preloader-container.manual')) {\n simulateClickEvent(element);\n }\n });\n});\n\nexport default async function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, autoDownloadSize, lazyLoadQueue, sizeType, managers = rootScope.managers, cacheContext, fontSize}: {\n message: Message.message,\n withTime?: boolean,\n fontWeight?: number,\n voiceAsMusic?: boolean,\n showSender?: boolean,\n searchContext?: MediaSearchContext,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n cacheContext?: ThumbCache,\n fontSize?: number\n}): Promise {\n fontWeight ??= 500;\n sizeType ??= '' as any;\n fontSize ??= 0;\n const noAutoDownload = autoDownloadSize === 0;\n\n const doc = ((message.media as MessageMedia.messageMediaDocument).document || ((message.media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document) as MyDocument;\n const uploadFileName = message?.uploadingFileName;\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\n const audioElement = new AudioElement();\n audioElement.withTime = withTime;\n audioElement.message = message;\n audioElement.noAutoDownload = noAutoDownload;\n audioElement.lazyLoadQueue = lazyLoadQueue;\n audioElement.loadPromises = loadPromises;\n\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\n if(searchContext) audioElement.searchContext = searchContext;\n if(showSender) audioElement.showSender = showSender;\n\n audioElement.dataset.fontWeight = '' + fontWeight;\n audioElement.dataset.fontSize = '' + fontSize;\n audioElement.dataset.sizeType = sizeType;\n await audioElement.render();\n return audioElement;\n }\n\n const extSplitted = doc.file_name ? doc.file_name.split('.') : '';\n let ext = '';\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ?\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) :\n 'file';\n\n const docDiv = document.createElement('div');\n docDiv.classList.add('document', `ext-${ext}`);\n docDiv.dataset.docId = '' + doc.id;\n (docDiv as any).doc = doc;\n\n // return docDiv;\n\n const icoDiv = document.createElement('div');\n icoDiv.classList.add('document-ico');\n let icoTextEl: HTMLElement;\n\n const hadContext = !!cacheContext;\n const getCacheContext = () => {\n return hadContext ? cacheContext : managers.thumbsStorage.getCacheContext(doc);\n };\n\n cacheContext = await getCacheContext();\n let hasThumb = false;\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\n docDiv.classList.add('document-with-thumb');\n hasThumb = true;\n\n const imgs: (HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)[] = [];\n // ! WARNING, use thumbs for check when thumb will be generated for media\n if(message.pFlags.is_outgoing && ['photo', 'video'].includes(doc.type) && cacheContext.url) {\n icoDiv.innerHTML = ``;\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\n } else {\n const perf = performance.now();\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: icoDiv,\n boxWidth: 54,\n boxHeight: 54,\n loadPromises,\n withoutPreloader: true,\n lazyLoadQueue,\n size: choosePhotoSize(doc, 54, 54, true),\n managers\n });\n // console.log('was wrapping photo', performance.now() - perf);\n icoDiv.style.width = icoDiv.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n }\n\n imgs.forEach((img) => img.classList.add('document-thumb'));\n } else {\n icoTextEl = document.createElement('span');\n icoTextEl.classList.add('document-ico-text');\n icoTextEl.innerText = ext;\n icoDiv.append(icoTextEl);\n }\n\n // let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\n const fileName = doc.file_name ? wrapPlainText(doc.file_name) : 'Unknown.file';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('document-description');\n const bytesContainer = document.createElement('span');\n const bytesEl = formatBytes(doc.size);\n const bytesJoiner = ' / ';\n\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [bytesEl];\n\n if(withTime) {\n descriptionParts.push(formatFullSentTime(message.date));\n }\n\n if(showSender) {\n descriptionParts.push(await wrapSenderToPeer(message));\n }\n\n if(!withTime && !showSender) {\n const b = document.createElement('span');\n const bytesMaxEl = formatBytes(doc.size);\n b.append(bytesJoiner, bytesMaxEl);\n b.style.visibility = 'hidden';\n descriptionParts.push(b);\n }\n\n docDiv.innerHTML = `\n ${(cacheContext.downloaded && !uploadFileName) || !message.mid || !hasThumb ? '' : `
`}\n
\n
\n `;\n\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\n middleEllipsisEl.dataset.fontSize = '' + fontSize;\n middleEllipsisEl.dataset.sizeType = sizeType;\n middleEllipsisEl.textContent = fileName;\n // setInnerHTML(middleEllipsisEl, fileName);\n\n // * new media popup\n if(!message.mid) {\n docDiv.classList.add('downloaded');\n }\n\n nameDiv.append(middleEllipsisEl);\n\n if(showSender) {\n nameDiv.append(wrapSentTime(message));\n }\n\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\n bytesContainer.append(...joinElementsWith(descriptionParts, ' · '));\n sizeDiv.append(bytesContainer);\n\n docDiv.prepend(icoDiv);\n\n if(!uploadFileName && message.pFlags.is_outgoing && !message.mid) {\n return docDiv;\n }\n\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\n const onLoad = () => {\n docDiv.classList.remove('downloading');\n\n if(/* !hasThumb || */(doc.size > MAX_FILE_SAVE_SIZE && !uploadFileName)) {\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.preloader.classList.add('manual');\n preloader.setDownloadFunction(load);\n return;\n }\n\n if(doc.size <= MAX_FILE_SAVE_SIZE) {\n docDiv.classList.add('downloaded');\n }\n\n if(downloadDiv) {\n if(downloadDiv !== icoDiv) {\n const _downloadDiv = downloadDiv;\n setTimeout(() => {\n _downloadDiv.remove();\n }, 200);\n }\n\n downloadDiv = null;\n }\n\n if(preloader) {\n preloader = null;\n }\n };\n\n const addByteProgress = (promise: CancellablePromise) => {\n docDiv.classList.add('downloading');\n\n const sizeContainer = document.createElement('span');\n const _bytesContainer = formatBytes(doc.size);\n sizeContainer.style.position = 'absolute';\n sizeContainer.style.left = '0';\n promise.then(onLoad, noop).finally(() => {\n // sizeContainer.replaceWith(bytesContainer);\n bytesContainer.style.visibility = '';\n sizeContainer.remove();\n // b && b.classList.remove('hide');\n });\n\n // b && b.classList.add('hide');\n\n const format = (bytes: number) => formatBytes(bytes);\n let d = format(0);\n bytesContainer.style.visibility = 'hidden';\n // bytesContainer.replaceWith(sizeContainer);\n sizeContainer.append(d, bytesJoiner, _bytesContainer);\n bytesContainer.parentElement.append(sizeContainer);\n promise.addNotifyListener((progress: Progress) => {\n const _d = format(progress.done);\n d.replaceWith(_d);\n d = _d;\n });\n };\n\n // ! DO NOT USE ASYNC/AWAIT HERE ! SAFARI WON'T LET DOWNLOAD THE FILE BECAUSE OF ASYNC\n const load = (e?: Event) => {\n const save = !e || e.isTrusted;\n const doc = (docDiv as any).doc;\n // const doc = await managers.appDocsManager.getDoc(docDiv.dataset.docId);\n let download: CancellablePromise;\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\n if(!save) {\n download = appDownloadManager.downloadToDisc({media: doc, queueId}, true);\n } else if(doc.type === 'pdf') {\n const canOpenAfter = /* managers.appDocsManager.downloading.has(doc.id) || */!preloader || preloader.detached;\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n if(canOpenAfter) {\n download.then(() => {\n setTimeout(async() => { // wait for preloader animation end\n const url = (await getCacheContext()).url;\n window.open(url);\n }, rootScope.settings.animationsEnabled ? 250 : 0);\n });\n }\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n } else {\n download = appDownloadManager.downloadToDisc({media: doc, queueId});\n }\n\n download.catch(() => {\n docDiv.classList.remove('downloading');\n });\n\n if(downloadDiv) {\n preloader.attach(downloadDiv, true, download);\n addByteProgress(download);\n }\n };\n\n const {fileName: downloadFileName} = getDownloadMediaDetails({media: doc, downloadId: '1'});\n if(await managers.apiFileManager.isDownloading(downloadFileName)) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n const promise = appDownloadManager.downloadToDisc({media: doc}, true);\n\n preloader = new ProgressivePreloader();\n preloader.attach(downloadDiv, false, promise);\n preloader.setDownloadFunction(load);\n addByteProgress(promise);\n } else if(!cacheContext.downloaded || uploadFileName) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n preloader = new ProgressivePreloader({\n isUpload: !!uploadFileName\n });\n\n if(!uploadFileName) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.setDownloadFunction(load);\n\n if(autoDownloadSize !== undefined && autoDownloadSize >= doc.size) {\n simulateClickEvent(preloader.preloader);\n }\n } else {\n const uploadPromise = appDownloadManager.getUpload(uploadFileName);\n preloader.attachPromise(uploadPromise);\n preloader.attach(downloadDiv);\n addByteProgress(uploadPromise);\n }\n }\n\n attachClickEvent(docDiv, (e) => {\n if(findUpClassName(e.target, 'time')) { // prevent downloading by clicking on time\n return;\n }\n\n if(preloader) {\n preloader.onClick(e);\n } else {\n load(e);\n }\n });\n\n return docDiv;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\n\nexport default function formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {Chat, ChatParticipants} from '../../layer';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\n\nexport default async function getChatMembersString(chatId: ChatId, managers = rootScope.managers) {\n const chat: Chat = await managers.appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = await managers.appProfileManager.getCachedFullChat(chatId);\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isBroadcast = (chat as Chat.channel).pFlags.broadcast;\n count = count || 1;\n\n const key: LangPackKey = isBroadcast ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Chat} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport I18n from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\n\nexport default async function getPeerTitle(peerId: PeerId, plainText: true, onlyFirstName?: boolean, _limitSymbols?: number, managers?: AppManagers): Promise;\nexport default async function getPeerTitle(peerId: PeerId, plainText?: false, onlyFirstName?: boolean, _limitSymbols?: number, managers?: AppManagers): Promise;\nexport default async function getPeerTitle(peerId: PeerId, plainText: boolean, onlyFirstName?: boolean, _limitSymbols?: number, managers?: AppManagers): Promise;\nexport default async function getPeerTitle(peerId: PeerId, plainText = false, onlyFirstName = false, _limitSymbols?: number, managers: AppManagers = rootScope.managers): Promise {\n if(!peerId) {\n peerId = rootScope.myId;\n }\n\n let title = '';\n if(peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId.toUserId());\n if(user.first_name) title += user.first_name;\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\n\n if(!title) title = user.pFlags.deleted ? I18n.format(onlyFirstName ? 'Deleted' : 'HiddenName', true) : user.username;\n else title = title.trim();\n } else {\n const chat: Chat.chat = await managers.appChatsManager.getChat(peerId.toChatId());\n title = chat.title;\n\n if(onlyFirstName) {\n title = title.split(' ')[0];\n }\n }\n\n if(_limitSymbols !== undefined) {\n title = limitSymbols(title, _limitSymbols, _limitSymbols);\n }\n\n return plainText ? title : wrapEmojiText(title);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatFullSentTimeRaw} from '../../helpers/date';\nimport {User} from '../../layer';\nimport {LangPackKey, i18n} from '../../lib/langPack';\nimport {REPLIES_PEER_ID, SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\n\nexport default function getUserStatusString(user: User.user): HTMLElement {\n if(!user) {\n return document.createElement('span');\n }\n\n let key: LangPackKey;\n let args: any[];\n\n switch(user.id) {\n case REPLIES_PEER_ID.toUserId():\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID.toUserId():\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(user.pFlags.bot) {\n key = 'Bot';\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n\n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n\n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n\n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n\n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n\n break;\n }\n\n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n\n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n\n return i18n(key, args);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageAction} from '../../layer';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\n\nexport default function wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n\n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {formatTime, ONE_DAY} from '../../helpers/date';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {Message, MessageAction} from '../../layer';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {FormatterArgument, FormatterArguments, i18n, join, langPack, LangPackKey, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport getPeerTitle from './getPeerTitle';\nimport wrapJoinVoiceChatAnchor from './joinVoiceChatAnchor';\nimport wrapMessageForReply from './messageForReply';\nimport wrapPeerTitle from './peerTitle';\n\nasync function wrapLinkToMessage(message: Message.message | Message.messageService, plain?: boolean) {\n const wrapped = await wrapMessageForReply(message, undefined, undefined, plain as any);\n if(plain) {\n return wrapped;\n }\n\n const a = document.createElement('i');\n a.dataset.savedFrom = message.peerId + '_' + message.mid;\n a.dir = 'auto';\n a.append(wrapped);\n return a;\n}\n\nexport default async function wrapMessageActionTextNewUnsafe(message: MyMessage, plain?: boolean) {\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return wrapPlainText(unsafeMessage);\n } else {\n setInnerHTML(element, wrapRichText(unsafeMessage, {noLinebreaks: true}));\n return element;\n }\n } else {\n let _ = action._;\n // let suffix = '';\n let langPackKey: LangPackKey;\n let args: Array>;\n\n const managers = rootScope.managers;\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? getPeerTitle(peerId, plain) : wrapPeerTitle({peerId});\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = rootScope.myId;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map((peerId) => getNameDivHTML(peerId, plain));\n args.push(wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey;\n const _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date,\n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n\n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = await managers.appMessagesManager.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain)\n ];\n\n if(!pinnedMessage/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n managers.appMessagesManager.fetchMessageReplyTo(message);\n }\n } else {\n args.push(wrapLinkToMessage(pinnedMessage, plain));\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(plain ? action.title : htmlToSpan(wrapEmojiText(action.title)));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users ||\n [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n await Promise.all(users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain))),\n false,\n plain\n );\n\n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n case 'messageActionPaymentSent': {\n const isRecurringInit = action.pFlags.recurring_init;\n const isRecurringUsed = action.pFlags.recurring_used;\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsedNoTitle' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInitNoTitle' : 'Chat.Service.PaymentSent1NoTitle');\n const price = paymentsWrapCurrencyAmount(action.total_amount, action.currency);\n args = [price, getNameDivHTML(message.peerId, plain)];\n\n if(message.reply_to_mid) {\n const invoiceMessage = await managers.appMessagesManager.getMessageByPeer(\n message.reply_to?.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId,\n message.reply_to_mid\n );\n\n if(!invoiceMessage) {\n managers.appMessagesManager.fetchMessageReplyTo(message);\n } else {\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsed' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInit' : 'Chat.Service.PaymentSent1');\n args.push(wrapLinkToMessage(invoiceMessage, plain).then((el) => {\n if(el instanceof HTMLElement) {\n el.classList.add('is-receipt-link');\n }\n\n return el;\n }));\n }\n }\n\n break;\n }\n\n case 'messageActionSetMessagesTTL': {\n args = [];\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(action.period) {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelChanged';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouChanged';\n } else {\n langPackKey = 'ActionTTLChanged';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let duration: ReturnType;\n if(action.period > 1814400) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const year = 31536000;\n if(action.period >= year) {\n key = 'Years';\n args.push(action.period / year | 0);\n } else {\n key = 'Months';\n args.push(action.period / (ONE_DAY * 30) | 0);\n }\n\n duration = plain ? I18n.format(key, true, args) : i18n(key, args);\n } else {\n duration = formatCallDuration(action.period, plain);\n }\n\n args.push(duration);\n } else {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelDisabled';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouDisabled';\n } else {\n langPackKey = 'ActionTTLDisabled';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n }\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n const waited = args && await Promise.all(args);\n\n if(plain) {\n return I18n.format(langPackKey, true, waited);\n } else {\n return _i18n(element, langPackKey, waited);\n }\n\n // str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport wrapMessageActionTextNewUnsafe from './messageActionTextNewUnsafe';\n\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain: true): Promise;\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain?: false): Promise;\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain: boolean): Promise;\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain?: boolean): Promise {\n try {\n return await wrapMessageActionTextNewUnsafe(message, plain);\n } catch(err) {\n console.error('wrapMessageActionTextNewUnsafe error:', err);\n return plain ? '' : document.createElement('span');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport assumeType from '../../helpers/assumeType';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport escapeRegExp from '../../helpers/string/escapeRegExp';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Message, DocumentAttribute, DraftMessage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport isMessageRestricted from '../../lib/appManagers/utils/messages/isMessageRestricted';\nimport I18n, {LangPackKey, i18n, UNSUPPORTED_LANG_PACK_KEY} from '../../lib/langPack';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport wrapMessageActionTextNew from './messageActionTextNew';\n\nexport default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): Promise;\nexport default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): Promise;\nexport default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): Promise {\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement | DocumentFragment) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n\n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n\n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('span');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n const managers = rootScope.managers;\n const appMessagesManager = managers.appMessagesManager;\n\n const isRestricted = isMessageRestricted(message as any);\n\n let entities = (message as Message.message).totalEntities ?? (message as DraftMessage.draftMessage).entities;\n if((message as Message.message).media && !isRestricted) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = await appMessagesManager.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = await appMessagesManager.getAlbumText(message.grouped_id);\n text = albumText.message;\n entities = albumText.totalEntities;\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n const f = '📊' + ' ' + (media.poll.question || 'poll');\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n\n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n const i = parts.length;\n if(document.stickerEmojiRaw) {\n const f = document.stickerEmojiRaw + ' ';\n addPart(undefined, plain ? f : wrapEmojiText(f));\n }\n\n addPart('AttachSticker');\n\n // will combine two parts into one\n const p = parts.splice(i, 2);\n if(plain) parts.push((p[0] as string) + (p[1] as string));\n else {\n const span = window.document.createElement('span');\n span.append(...p);\n parts.push(span);\n }\n\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find((attribute) => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : wrapEmojiText(document.file_name));\n }\n\n break;\n }\n\n case 'messageMediaInvoice': {\n if(media.extended_media?._ === 'messageExtendedMediaPreview') {\n addPart(undefined, plain ? media.description : wrapEmojiText(media.description));\n } else {\n addPart(undefined, plain ? media.title : wrapEmojiText(media.title));\n }\n\n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n\n default:\n // messageText += media._;\n // /////appMessagesManager.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n }\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = await wrapMessageActionTextNew((message as Message.messageService), plain);\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(isRestricted) {\n text = getRestrictionReason((message as Message.message).restriction_reason).text;\n entities = [];\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(wrapPlainText(text, entities));\n } else {\n // let entities = parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n const regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n entities = entities.slice(); // fix leaving highlight entity\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n\n if(found) {\n sortEntities(entities);\n }\n }\n\n const messageWrapped = wrapRichText(text, {\n noLinebreaks: true,\n entities,\n noLinks: true,\n noTextFormat: true\n });\n\n parts.push(htmlToDocumentFragment(messageWrapped));\n }\n }\n\n if(plain) {\n return parts.join('');\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PeerTitle, {PeerTitleOptions} from '../peerTitle';\n\nexport default async function wrapPeerTitle(options: PeerTitleOptions) {\n const peerTitle = new PeerTitle();\n await peerTitle.update(options);\n return peerTitle.element;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Message, PhotoSize, VideoSize, WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport rootScope from '../../lib/rootScope';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport blur from '../../helpers/blur';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport isWebDocument from '../../lib/appManagers/utils/webDocs/isWebDocument';\nimport createVideo from '../../helpers/dom/createVideo';\nimport noop from '../../helpers/noop';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport {Middleware} from '../../helpers/middleware';\n\nexport default async function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, autoDownloadSize, noBlur, noThumb, noFadeIn, blurAfter, managers = rootScope.managers}: {\n photo: MyPhoto | MyDocument | WebDocument,\n message?: Message.message | Message.messageService,\n container: HTMLElement,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n middleware?: Middleware,\n size?: PhotoSize | VideoSize,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n noBlur?: boolean,\n noThumb?: boolean,\n noFadeIn?: boolean,\n blurAfter?: boolean,\n managers?: AppManagers,\n}) {\n const ret = {\n loadPromises: {\n thumb: Promise.resolve() as Promise,\n full: Promise.resolve() as Promise\n },\n images: {\n thumb: null as HTMLImageElement | HTMLCanvasElement,\n full: null as HTMLVideoElement | HTMLImageElement\n },\n preloader: null as ProgressivePreloader,\n aspecter: null as HTMLElement\n };\n\n const isDocument = photo._ === 'document';\n const isWebDoc = isWebDocument(photo);\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs) && !isWebDoc) {\n if(boxWidth && boxHeight && !size && isDocument) {\n setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\n }\n\n return ret;\n }\n\n let noAutoDownload = autoDownloadSize === 0;\n\n if(!size) {\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\n }\n\n container.classList.add('media-container');\n let aspecter = container;\n\n let isFit = true;\n let loadThumbPromise: Promise = Promise.resolve();\n let thumbImage: HTMLImageElement | HTMLCanvasElement;\n // let image: HTMLImageElement;\n let cacheContext: ThumbCache;\n const isGif = isDocument && photo.mime_type === 'image/gif' && !size;\n // if(withTail) {\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\n // } else {\n\n if(boxWidth && boxHeight && !size) { // !album\n const set = setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isGif ? {\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n } : undefined);\n size = set.photoSize;\n isFit = set.isFit;\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size.type);\n\n if(!isFit && !isWebDoc) {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-container-aspecter');\n aspecter.style.width = set.size.width + 'px';\n aspecter.style.height = set.size.height + 'px';\n\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\n if(gotThumb) {\n loadThumbPromise = gotThumb.loadPromise;\n const thumbImage = gotThumb.image; // local scope\n thumbImage.classList.add('media-photo');\n container.append(thumbImage);\n } else {\n const res = await wrapPhoto({\n container,\n message,\n photo,\n boxWidth: 0,\n boxHeight: 0,\n size,\n lazyLoadQueue,\n isOut,\n loadPromises,\n middleware,\n withoutPreloader,\n withTail,\n autoDownloadSize,\n noBlur,\n noThumb: true,\n blurAfter: true,\n managers\n // noFadeIn: true\n });\n const thumbImage = res.images.full;\n thumbImage.classList.add('media-photo', 'thumbnail');\n // container.append(thumbImage);\n }\n\n container.classList.add('media-container-fitted');\n container.append(aspecter);\n }\n } else {\n if(!size) {\n size = choosePhotoSize(photo, boxWidth, boxHeight, true);\n }\n\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n }\n\n if(!noThumb && !isWebDoc) {\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\n if(gotThumb) {\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\n ret.loadPromises.thumb = ret.loadPromises.full = loadThumbPromise;\n thumbImage = ret.images.thumb = gotThumb.image;\n thumbImage.classList.add('media-photo');\n aspecter.append(thumbImage);\n }\n }\n // }\n\n ret.aspecter = aspecter;\n\n if((size?._ === 'photoSizeEmpty' && isDocument) || (size as PhotoSize.photoStrippedSize)?.bytes) {\n return ret;\n }\n\n let media: HTMLVideoElement | HTMLImageElement;\n if(size?._ === 'videoSize') {\n media = ret.images.full = createVideo();\n media.autoplay = true;\n media.loop = true;\n media.muted = true;\n media.classList.add('media-photo');\n } else {\n media = ret.images.full = new Image();\n media.classList.add('media-photo');\n }\n\n // console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\n\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\n\n let preloader: ProgressivePreloader;\n const uploadingFileName = (message as Message.message)?.uploadingFileName;\n if(!withoutPreloader) {\n if(!cacheContext.downloaded || uploadingFileName) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: !!uploadingFileName\n });\n }\n\n if(uploadingFileName) { // means upload\n preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n preloader.attach(container);\n noAutoDownload = undefined;\n }\n }\n\n\n const getDownloadPromise = () => {\n // const promise = isGif && !size ?\n // managers.appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) :\n // managers.appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\n const haveToDownload = isGif && !size;\n const promise = appDownloadManager.downloadMediaURL({\n media: photo,\n thumb: size,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: haveToDownload ? undefined : noAutoDownload\n });\n\n return promise;\n };\n\n const renderOnLoad = (url: string) => {\n return renderMediaWithFadeIn(container, media, url, needFadeIn, aspecter, thumbImage);\n };\n\n const onLoad = async(url: string) => {\n if(middleware && !middleware()) return;\n\n if(blurAfter) {\n const result = blur(url, 12);\n return result.promise.then(() => {\n // image = result.canvas;\n return renderOnLoad(result.canvas.toDataURL());\n });\n }\n\n return renderOnLoad(url);\n };\n\n let loadPromise: Promise;\n const canAttachPreloader = (\n (size as PhotoSize.photoSize).w >= 150 &&\n (size as PhotoSize.photoSize).h >= 150\n ) || noAutoDownload;\n const load = async() => {\n if(noAutoDownload && !withoutPreloader && preloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n const promise = getDownloadPromise();\n const cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n if(\n preloader &&\n !cacheContext.downloaded &&\n !withoutPreloader &&\n canAttachPreloader\n ) {\n preloader.attach(container, false, promise);\n }\n\n noAutoDownload = undefined;\n\n const renderPromise = promise.then(onLoad);\n renderPromise.catch(noop);\n return {download: promise, render: renderPromise};\n };\n\n if(preloader) {\n preloader.setDownloadFunction(load);\n }\n\n if(cacheContext.downloaded) {\n loadThumbPromise = loadPromise = (await load()).render;\n } else {\n if(!lazyLoadQueue) loadPromise = (await load()).render;\n /* else if(noAutoDownload) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(container);\n } */ else lazyLoadQueue.push({div: container, load: () => load().then(({download}) => download)});\n }\n\n if(loadPromises && loadThumbPromise) {\n loadPromises.push(loadThumbPromise);\n }\n\n // const perf = performance.now();\n await loadThumbPromise;\n ret.loadPromises.thumb = loadThumbPromise;\n ret.loadPromises.full = loadPromise || Promise.resolve();\n ret.preloader = preloader;\n\n // const elapsedTime = performance.now() - perf;\n // if(elapsedTime > 4) {\n // console.log('wrapping photo thumb time', elapsedTime, photo, size);\n // }\n\n return 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 {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport getMessageSenderPeerIdOrName from '../../lib/appManagers/utils/messages/getMessageSenderPeerIdOrName';\nimport {i18n} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\nimport PeerTitle from '../peerTitle';\n\nexport default async function wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n\n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ?\n i18n('FromYou') :\n new PeerTitle({\n ...getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n }).element\n );\n\n if(await rootScope.managers.appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = new PeerTitle({peerId: message.peerId}).element;\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\n\nexport default function wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport assumeType from '../../helpers/assumeType';\nimport getPathFromBytes from '../../helpers/bytes/getPathFromBytes';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport computeLockColor from '../../helpers/computeLockColor';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport getPreviewURLFromThumb from '../../helpers/getPreviewURLFromThumb';\nimport makeError from '../../helpers/makeError';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {isSavingLottiePreview, saveLottiePreview} from '../../helpers/saveLottiePreview';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport type RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport webpWorkerController from '../../lib/webp/webpWorkerController';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport {getEmojiToneIndex} from '../../vendor/emoji';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport PopupStickers from '../popups/stickers';\nimport {hideToast, toastNew} from '../toast';\nimport wrapStickerAnimation from './stickerAnimation';\nimport framesCache from '../../helpers/framesCache';\n\n// https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp#L40\nexport const STICKER_EFFECT_MULTIPLIER = 1 + 0.245 * 2;\nconst EMOJI_EFFECT_MULTIPLIER = 3;\n\nconst locksUrls: {[docId: string]: string} = {};\n\nexport const videosCache: {[key: string]: Promise} = {};\n\nexport default async function wrapSticker({doc, div, middleware, loadStickerMiddleware, lazyLoadQueue, exportLoad, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic, managers = rootScope.managers, fullThumb, isOut, noPremium, withLock, relativeEffect, loopEffect, isCustomEmoji, syncedVideo}: {\n doc: MyDocument,\n div: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n loadStickerMiddleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n exportLoad?: number,\n group?: AnimationItemGroup,\n play?: boolean,\n onlyThumb?: boolean,\n emoji?: string,\n width?: number,\n height?: number,\n withThumb?: boolean,\n loop?: RLottiePlayer['loop'],\n loadPromises?: Promise[],\n needFadeIn?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n static?: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n isOut?: boolean,\n noPremium?: boolean,\n withLock?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean,\n isCustomEmoji?: boolean,\n syncedVideo?: boolean\n}) {\n div = Array.isArray(div) ? div : [div];\n\n if(isCustomEmoji) {\n emoji = doc.stickerEmojiRaw;\n }\n\n const stickerType = doc.sticker;\n if(stickerType === 1) {\n asStatic = true;\n }\n\n if(!width && !height) {\n const sizes = mediaSizes.active;\n const boxSize = emoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n const size = makeMediaSize(doc.w, doc.h).aspectFitted(boxSize);\n width = size.width;\n height = size.height;\n }\n\n if(stickerType === 2) {\n // LottieLoader.loadLottie();\n lottieLoader.loadLottieWorkers();\n }\n\n div.forEach((div) => {\n div.dataset.docId = '' + doc.id;\n if(emoji) {\n div.dataset.stickerEmoji = emoji;\n }\n\n div.classList.add('media-sticker-wrapper');\n });\n\n /* if(stickerType === 3) {\n const videoRes = wrapVideo({\n doc,\n boxWidth: width,\n boxHeight: height,\n container: div,\n group,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n noPlayButton: true,\n noInfo: true\n });\n\n if(videoRes.thumb) {\n if(videoRes.thumb.images.thumb) {\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\n }\n\n if(videoRes.thumb.images.full) {\n videoRes.thumb.images.full.classList.add('media-sticker');\n }\n }\n\n return videoRes.loadPromise;\n } */\n\n // console.log('wrap sticker', doc, div, onlyThumb);\n\n let cacheContext: ThumbCache;\n const getCacheContext = async(type: string = cacheContext?.type) => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, type);\n };\n\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\n\n const effectThumb = getStickerEffectThumb(doc);\n if(isOut !== undefined && effectThumb && !isOut) {\n div.forEach((div) => div.classList.add('reflect-x'));\n }\n\n const willHaveLock = effectThumb && withLock;\n if(willHaveLock) {\n const lockUrl = locksUrls[doc.id];\n div.forEach((div) => {\n div.classList.add('is-premium-sticker', 'tgico-premium_lock');\n lockUrl && div.style.setProperty('--lock-url', `url(${lockUrl})`);\n });\n }\n\n if(asStatic && stickerType !== 1) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n await getCacheContext(thumb.type);\n } else {\n await getCacheContext(fullThumb?.type);\n }\n\n const toneIndex = emoji && !isCustomEmoji ? getEmojiToneIndex(emoji) : -1;\n const downloaded = cacheContext.downloaded && !needFadeIn;\n\n const isThumbNeededForType = isAnimated;\n const lottieCachedThumb = stickerType === 2 || stickerType === 3 ? await managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex) : undefined;\n\n const ret = {render: undefined as typeof loadPromise, load: undefined as typeof load};\n let loadThumbPromise = deferredPromise();\n let haveThumbCached = false;\n if((\n doc.thumbs?.length ||\n lottieCachedThumb\n ) &&\n !div[0].firstElementChild && (\n !downloaded ||\n isThumbNeededForType ||\n onlyThumb\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\n ) {\n let thumb = lottieCachedThumb || doc.thumbs[0];\n\n // console.log('wrap sticker', thumb, div);\n\n const afterRender = (div: HTMLElement, thumbImage: HTMLElement) => {\n if(!div.childElementCount) {\n thumbImage.classList.add('media-sticker', 'thumbnail');\n\n sequentialDom.mutateElement(div, () => {\n div.append(thumbImage);\n loadThumbPromise.resolve();\n });\n } else {\n loadThumbPromise.resolve();\n }\n };\n\n if('url' in thumb) {\n haveThumbCached = true;\n div.forEach((div) => {\n const thumbImage = new Image();\n renderImageFromUrl(thumbImage, (thumb as any).url, () => afterRender(div, thumbImage));\n });\n } else if('bytes' in thumb) {\n if(thumb._ === 'photoPathSize') {\n if(!thumb.bytes.length) {\n thumb = doc.thumbs.find((t) => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\n }\n\n const d = getPathFromBytes((thumb as PhotoSize.photoStrippedSize).bytes);\n const ns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(ns, 'svg');\n svg.classList.add('rlottie-vector', 'media-sticker', 'thumbnail');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${doc.w || 512} ${doc.h || 512}`);\n\n // const defs = document.createElementNS(ns, 'defs');\n // const linearGradient = document.createElementNS(ns, 'linearGradient');\n // linearGradient.setAttributeNS(null, 'id', 'g');\n // linearGradient.setAttributeNS(null, 'x1', '-300%');\n // linearGradient.setAttributeNS(null, 'x2', '-200%');\n // linearGradient.setAttributeNS(null, 'y1', '0');\n // linearGradient.setAttributeNS(null, 'y2', '0');\n // const stops = [\n // ['-10%', '.1'],\n // ['30%', '.07'],\n // ['70%', '.07'],\n // ['110%', '.1']\n // ].map(([offset, stopOpacity]) => {\n // const stop = document.createElementNS(ns, 'stop');\n // stop.setAttributeNS(null, 'offset', offset);\n // stop.setAttributeNS(null, 'stop-opacity', stopOpacity);\n // return stop;\n // });\n // const animates = [\n // ['-300%', '1200%'],\n // ['-200%', '1300%']\n // ].map(([from, to], idx) => {\n // const animate = document.createElementNS(ns, 'animate');\n // animate.setAttributeNS(null, 'attributeName', 'x' + (idx + 1));\n // animate.setAttributeNS(null, 'from', from);\n // animate.setAttributeNS(null, 'to', to);\n // animate.setAttributeNS(null, 'dur', '3s');\n // animate.setAttributeNS(null, 'repeatCount', 'indefinite');\n // return animate;\n // });\n // linearGradient.append(...stops, ...animates);\n // defs.append(linearGradient);\n // svg.append(defs);\n\n const path = document.createElementNS(ns, 'path');\n path.setAttributeNS(null, 'd', d);\n if(rootScope.settings.animationsEnabled && !isCustomEmoji) path.setAttributeNS(null, 'fill', 'url(#g)');\n svg.append(path);\n div.forEach((div, idx) => div.append(idx > 0 ? svg.cloneNode(true) : svg));\n haveThumbCached = true;\n loadThumbPromise.resolve();\n } else if(toneIndex <= 0) {\n const r = () => {\n (div as HTMLElement[]).forEach((div) => {\n const thumbImage = new Image();\n const url = getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n });\n };\n\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\n haveThumbCached = true;\n r();\n } else {\n haveThumbCached = true;\n webpWorkerController.convert('main-' + doc.id, thumb.bytes).then((bytes) => {\n managers.appDocsManager.saveWebPConvertedStrippedThumb(doc.id, bytes);\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\n doc.pFlags.stickerThumbConverted = true;\n\n if((middleware && !middleware()) || (div as HTMLElement[])[0].childElementCount) {\n loadThumbPromise.resolve();\n return;\n }\n\n r();\n }).catch(() => loadThumbPromise.resolve());\n }\n }\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\n const load = async() => {\n if((div as HTMLElement[])[0].childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n const r = (div: HTMLElement, thumbImage: HTMLElement, url: string) => {\n if(div.childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n if(!url) afterRender(div, thumbImage);\n else renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n };\n\n await getCacheContext();\n (div as HTMLElement[]).forEach((div) => {\n if(cacheContext.url) {\n r(div, new Image(), cacheContext.url);\n } else if('bytes' in thumb) {\n const res = getImageFromStrippedThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n res.loadPromise.then(() => r(div, res.image, ''));\n\n // return managers.appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\n } else {\n appDownloadManager.downloadMediaURL({\n media: doc,\n thumb: thumb as PhotoSize\n }).then(async(url) => {\n return r(div, new Image(), url);\n });\n }\n });\n };\n\n if(lazyLoadQueue && onlyThumb) {\n lazyLoadQueue.push({div: div[0], load});\n loadThumbPromise.resolve();\n return ret;\n } else {\n load();\n\n if((thumb as any).url) {\n haveThumbCached = true;\n }\n }\n }\n }\n\n if(loadPromises && haveThumbCached) {\n loadPromises.push(loadThumbPromise);\n }\n\n if(onlyThumb/* || true */) { // for sticker panel\n return ret;\n }\n\n const middlewareError = makeError('MIDDLEWARE');\n const load = async() => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n if(stickerType === 2 && !asStatic) {\n return appDownloadManager.downloadMedia({media: doc, queueId: lazyLoadQueue?.queueId, thumb: fullThumb})\n .then(async(blob) => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n const animation = await lottieLoader.loadAnimationWorker({\n container: (div as HTMLElement[])[0],\n loop: !!(!emoji || isCustomEmoji) && loop,\n autoplay: play,\n animationData: blob,\n width,\n height,\n name: 'doc' + doc.id,\n needUpscale,\n skipRatio,\n toneIndex,\n sync: isCustomEmoji\n }, group, loadStickerMiddleware ?? middleware);\n\n // const deferred = deferredPromise();\n\n const setLockColor = willHaveLock ? () => {\n const lockUrl = locksUrls[doc.id] ??= computeLockColor(animation.canvas[0]);\n (div as HTMLElement[]).forEach((div) => div.style.setProperty('--lock-url', `url(${lockUrl})`));\n } : undefined;\n\n const onFirstFrame = (container: HTMLElement, canvas: HTMLCanvasElement) => {\n const element = container.firstElementChild;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\n }\n\n const cb = () => {\n if(element && element !== canvas && element.tagName !== 'DIV') {\n element.remove();\n }\n };\n\n if(!needFadeIn) {\n if(element) {\n sequentialDom.mutate(cb);\n }\n } else {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.add('fade-in');\n if(element) {\n element.classList.add('fade-out');\n }\n\n (canvas || element).addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.remove('fade-in');\n cb();\n });\n }, {once: true});\n });\n }\n };\n\n animation.addEventListener('firstFrame', () => {\n const canvas = animation.canvas[0];\n if(withThumb !== false || isCustomEmoji) {\n saveLottiePreview(doc, canvas, toneIndex);\n }\n\n if(willHaveLock) {\n setLockColor();\n }\n\n if(!isCustomEmoji) {\n (div as HTMLElement[]).forEach((container, idx) => {\n onFirstFrame(container, animation.canvas[idx]);\n });\n }\n }, {once: true});\n\n if(emoji) {\n managers.appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\n }\n\n return animation;\n\n // return deferred;\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n });\n } else if(asStatic || stickerType === 3) {\n const isSingleVideo = isAnimated && syncedVideo;\n const cacheName = isSingleVideo ? framesCache.generateName('' + doc.id, 0, 0, undefined, undefined) : undefined;\n\n const cachePromise = videosCache[cacheName];\n if(cachePromise) {\n return cachePromise as typeof promise;\n }\n\n const d = isSingleVideo ? (div as HTMLElement[]).slice(0, 1) : div as HTMLElement[];\n const media: HTMLElement[] = d.map(() => {\n let media: HTMLElement;\n if(asStatic) {\n media = new Image();\n } else {\n const video = media = createVideo();\n video.muted = true;\n if(play) video.autoplay = true;\n if(loop) video.loop = true;\n\n if(loop && typeof(loop) === 'number') {\n let previousTime = 0, playedTimes = 0;\n function onTimeupdate(this: HTMLVideoElement) {\n if(previousTime > this.currentTime && ++playedTimes === loop as number) {\n this.autoplay = false;\n this.loop = false;\n this.pause();\n video.removeEventListener('timeupdate', onTimeupdate);\n }\n\n previousTime = this.currentTime;\n }\n\n video.addEventListener('timeupdate', onTimeupdate);\n }\n }\n\n media.classList.add('media-sticker');\n return media;\n });\n\n const thumbImage = (div as HTMLElement[]).map((div, idx) => (div.firstElementChild as HTMLElement) !== media[idx] && div.firstElementChild) as HTMLElement[];\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage[0] : (!thumbImage[0] || thumbImage[0].tagName === 'svg'))) && rootScope.settings.animationsEnabled;\n }\n\n if(needFadeIn) {\n media.forEach((media) => media.classList.add('fade-in'));\n }\n\n const promise = new Promise(async(resolve, reject) => {\n const r = async() => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n const mediaLength = media.length;\n const loaded: HTMLElement[] = [];\n const onLoad = (div: HTMLElement, media: HTMLElement, thumbImage: HTMLElement) => {\n sequentialDom.mutateElement(div, () => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n if(!media) {\n if(!isSingleVideo || !isAnimated) {\n thumbImage?.remove();\n }\n\n return;\n }\n\n if(media as HTMLVideoElement) {\n const w = width * window.devicePixelRatio;\n const h = height * window.devicePixelRatio;\n if(!isSavingLottiePreview(doc, toneIndex, w, h)) {\n // const perf = performance.now();\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(media as HTMLVideoElement, 0, 0, canvas.width, canvas.height);\n saveLottiePreview(doc, canvas, toneIndex);\n // console.log('perf', performance.now() - perf);\n }\n }\n\n if(isSingleVideo) {\n resolve(media as any);\n return;\n }\n\n div.append(media);\n\n if(needFadeIn) {\n thumbImage && thumbImage.classList.add('fade-out');\n media.addEventListener('animationend', () => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n\n if(isAnimated) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n\n if(loaded.push(media) === mediaLength) {\n resolve(loaded as any);\n }\n });\n };\n\n await getCacheContext();\n let lastPromise: Promise;\n (div as HTMLElement[]).forEach((div, idx) => {\n const _media = media[idx];\n const cb = () => onLoad(div, _media, thumbImage[idx]);\n if(_media) lastPromise = renderImageFromUrlPromise(_media, cacheContext.url);\n lastPromise.then(cb);\n });\n };\n\n await getCacheContext();\n if(cacheContext.url) r();\n else {\n let promise: Promise;\n if(stickerType !== 1 && asStatic) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n // promise = managers.appDocsManager.getThumbURL(doc, thumb).promise\n promise = appDownloadManager.downloadMediaURL({media: doc, thumb, queueId: lazyLoadQueue?.queueId});\n } else {\n promise = appDownloadManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId});\n }\n\n promise.then(r, reject);\n }\n });\n\n if(cacheName) {\n videosCache[cacheName] = promise as any;\n loadStickerMiddleware && promise.finally(() => {\n if(!loadStickerMiddleware()) {\n delete videosCache[cacheName];\n }\n });\n }\n\n return promise;\n }\n };\n\n if(exportLoad && ((exportLoad === 1 && (!downloaded || isAnimated)) || exportLoad === 2)) {\n ret.load = load;\n return ret;\n }\n\n const loadPromise: Promise> | void> = lazyLoadQueue && (!downloaded || isAnimated) ?\n (lazyLoadQueue.push({div: div[0], load}), Promise.resolve()) :\n load();\n\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\n loadThumbPromise = loadPromise as any;\n if(loadPromises) {\n loadPromises.push(loadThumbPromise);\n }\n }\n\n if(stickerType === 2 && effectThumb && isOut !== undefined && !noPremium) {\n attachStickerEffectHandler({\n container: div[0],\n doc,\n managers,\n middleware,\n isOut,\n width,\n loadPromise,\n relativeEffect,\n loopEffect\n });\n }\n\n ret.render = loadPromise as any;\n return ret;\n}\n\nfunction attachStickerEffectHandler({container, doc, managers, middleware, isOut, width, loadPromise, relativeEffect, loopEffect}: {\n container: HTMLElement,\n doc: MyDocument,\n managers: AppManagers,\n middleware: Middleware,\n isOut: boolean,\n width: number,\n loadPromise: Promise,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n managers.appStickersManager.preloadSticker(doc.id, true);\n\n let playing = false;\n attachClickEvent(container, async(e) => {\n cancelEvent(e);\n if(playing) {\n const a = document.createElement('a');\n a.onclick = () => {\n hideToast();\n new PopupStickers(doc.stickerSetInput).show();\n };\n\n toastNew({\n langPackKey: 'Sticker.Premium.Click.Info',\n langPackArguments: [a]\n });\n\n return;\n }\n\n playing = true;\n\n await loadPromise;\n const {animationDiv, stickerPromise} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: width * STICKER_EFFECT_MULTIPLIER,\n target: container,\n play: true,\n fullThumb: getStickerEffectThumb(doc),\n relativeEffect,\n loopEffect\n });\n\n if(isOut !== undefined && !isOut/* && !relativeEffect */) {\n animationDiv.classList.add('reflect-x');\n }\n\n stickerPromise.then((player) => {\n player.addEventListener('destroy', () => {\n playing = false;\n });\n });\n });\n}\n\nexport async function onEmojiStickerClick({event, container, managers, peerId, middleware}: {\n event: Event,\n container: HTMLElement,\n managers: AppManagers,\n peerId: PeerId,\n middleware: Middleware\n}) {\n cancelEvent(event);\n\n const bubble = findUpClassName(container, 'bubble');\n const emoji = container.dataset.stickerEmoji;\n\n const animation = !container.classList.contains('custom-emoji') ? lottieLoader.getAnimation(container) : undefined;\n if(animation?.paused) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSoundDocument(emoji);\n if(doc) {\n const audio = document.createElement('audio');\n audio.style.display = 'none';\n container.parentElement.append(audio);\n\n try {\n const url = await appDownloadManager.downloadMediaURL({media: doc});\n\n audio.src = url;\n audio.play();\n await onMediaLoad(audio, undefined, true);\n\n audio.addEventListener('ended', () => {\n audio.src = '';\n audio.remove();\n }, {once: true});\n } catch(err) {\n\n }\n }\n\n animation.autoplay = true;\n animation.restart();\n }\n\n if(!peerId.isUser()) {\n return;\n }\n\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji, true);\n if(!doc) {\n return;\n }\n\n const data: SendMessageEmojiInteractionData = (container as any).emojiData ??= {\n a: [],\n v: 1\n };\n\n const sendInteractionThrottled: () => void = (container as any).sendInteractionThrottled = throttle(() => {\n const length = data.a.length;\n if(!length) {\n return;\n }\n\n const firstTime = data.a[0].t;\n\n data.a.forEach((a) => {\n a.t = (a.t - firstTime) / 1000;\n });\n\n const bubble = findUpClassName(container, 'bubble');\n managers.appMessagesManager.setTyping(appImManager.chat.peerId, {\n _: 'sendMessageEmojiInteraction',\n msg_id: getServerMessageId(+bubble.dataset.mid),\n emoticon: emoji,\n interaction: {\n _: 'dataJSON',\n data: JSON.stringify(data)\n }\n }, true);\n\n data.a.length = 0;\n }, 1000, false);\n\n const isOut = bubble ? bubble.classList.contains('is-out') : undefined;\n const {animationDiv} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: 360,\n target: container,\n play: true,\n withRandomOffset: true\n });\n\n if(isOut !== undefined && !isOut) {\n animationDiv.classList.add('reflect-x');\n }\n\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\n if(event.isTrusted) {\n data.a.push({\n i: 1,\n t: Date.now()\n });\n\n sendInteractionThrottled();\n }\n // });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n/**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\nexport default function getPathFromBytes(bytes: Uint8Array) {\n const lookup = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,';\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-';\n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n}\n","// https://github.com/telegramdesktop/tdesktop/blob/543bfab24a76402992421063f1e6444f347d31fe/Telegram/SourceFiles/boxes/sticker_set_box.cpp#L75\nexport default function computeLockColor(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const size = 20 * (canvas.dpr ?? 1);\n const width = size;\n const height = size;\n const skipx = (canvas.width - width) / 2;\n const margin = 0/* * (canvas.dpr ?? 1) */;\n const skipy = canvas.height - height - margin;\n const imageData = context.getImageData(skipx, skipy, width, height).data;\n let sr = 0, sg = 0, sb = 0, sa = 0;\n for(let i = 0; i < imageData.length; i += 4) {\n sr += imageData[i];\n sg += imageData[i + 1];\n sb += imageData[i + 2];\n sa += imageData[i + 3];\n }\n\n const outCanvas = document.createElement('canvas');\n outCanvas.width = size;\n outCanvas.height = size;\n const outContext = outCanvas.getContext('2d');\n const color = new Uint8ClampedArray([sr * 255 / sa, sg * 255 / sa, sb * 255 / sa, 255]);\n const rgba = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`;\n outContext.fillStyle = rgba;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n outContext.fillStyle = `rgba(112, 117, 121, 0.3)`;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n // document.querySelector('.popup-title').append(c);\n return outCanvas.toDataURL('image/jpeg');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport assumeType from '../../helpers/assumeType';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport makeError from '../../helpers/makeError';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport throttleWithRaf from '../../helpers/schedulers/throttleWithRaf';\nimport windowSize from '../../helpers/windowSize';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerAnimation({\n size,\n doc,\n middleware,\n target,\n side,\n skipRatio,\n play,\n managers,\n fullThumb,\n withRandomOffset,\n relativeEffect,\n loopEffect\n}: {\n size: number,\n doc: MyDocument,\n middleware?: Middleware,\n target: HTMLElement,\n side: 'left' | 'center' | 'right',\n skipRatio?: number,\n play: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n withRandomOffset?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n const animationDiv = document.createElement('div');\n animationDiv.classList.add('emoji-animation');\n\n // const size = 280;\n animationDiv.style.width = size + 'px';\n animationDiv.style.height = size + 'px';\n\n let animation: RLottiePlayer;\n const unmountAnimation = () => {\n middlewareHelper.clean();\n animation?.remove();\n animationDiv.remove();\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\n };\n\n const middlewareHelper = middleware?.create() ?? getMiddleware();\n middleware = middlewareHelper.get();\n\n const stickerPromise = wrapSticker({\n div: animationDiv,\n doc,\n middleware,\n withThumb: false,\n needFadeIn: false,\n loop: !!loopEffect,\n width: size,\n height: size,\n play,\n group: 'none',\n skipRatio,\n managers,\n fullThumb\n }).then(({render}) => render).then((_animation) => {\n assumeType(_animation);\n if(!middleware()) {\n _animation.remove();\n throw makeError('MIDDLEWARE');\n }\n\n animation = _animation;\n animation.addEventListener('enterFrame', (frameNo) => {\n if((!loopEffect && frameNo === animation.maxFrame) || !isInDOM(target)) {\n unmountAnimation();\n }\n });\n\n if(IS_VIBRATE_SUPPORTED) {\n animation.addEventListener('firstFrame', () => {\n navigator.vibrate(100);\n }, {once: true});\n }\n\n return animation;\n });\n\n const generateRandomSigned = (max: number) => {\n const r = Math.random() * max * 2;\n return r > max ? -r % max : r;\n };\n\n const randomOffsetX = withRandomOffset ? generateRandomSigned(16) : 0;\n const randomOffsetY = withRandomOffset ? generateRandomSigned(4) : 0;\n const setPosition = () => {\n if(!isInDOM(target)) {\n unmountAnimation();\n return;\n }\n\n const rect = target.getBoundingClientRect();\n\n const factor = rect.width / 200;\n const stableOffsetX = side === 'center' ? 0 : 16 * (side === 'right' ? 1 : -1) * factor;\n // const stableOffsetY = side === 'center' ? 0 : -50 * factor;\n const stableOffsetY = side === 'center' ? 0 : 0 * factor;\n\n const rectX = side === 'right' ? rect.right : rect.left;\n const rectY = rect.top;\n\n const addOffsetX = (side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0)) + stableOffsetX + randomOffsetX;\n const addOffsetY = (side === 'center' || true ? (rect.height - size) / 2 : 0) + stableOffsetY + randomOffsetY;\n const x = rectX + addOffsetX;\n const y = rectY + addOffsetY;\n\n if(y <= -size || y >= windowSize.height) {\n unmountAnimation();\n return;\n }\n\n if(relativeEffect) {\n if(side !== 'center') animationDiv.style[side] = Math.abs(stableOffsetX) * -1 + 'px';\n else animationDiv.style.left = addOffsetX + 'px';\n animationDiv.style.top = addOffsetY + 'px';\n } else {\n animationDiv.style.top = y + 'px';\n animationDiv.style.left = x + 'px';\n }\n };\n\n const onScroll = throttleWithRaf(setPosition);\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\n\n setPosition();\n\n if(relativeEffect) {\n animationDiv.classList.add('is-relative');\n target.parentElement.append(animationDiv);\n } else {\n appImManager.emojiAnimationContainer.append(animationDiv);\n }\n\n return {animationDiv, stickerPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport wrapSticker from './sticker'\n\nexport default async function wrapStickerEmoji({emoji, div, width, height, managers = rootScope.managers}: {\n emoji: string,\n div: HTMLElement,\n managers?: AppManagers,\n width: number,\n height: number\n}) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n if(!doc) {\n div.classList.add('media-sticker-wrapper');\n throw new Error('no sticker');\n }\n\n return wrapSticker({\n doc,\n div,\n emoji,\n width,\n height,\n loop: false,\n play: true\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport createVideo from '../../helpers/dom/createVideo';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport {Document, StickerSet} from '../../layer';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapSticker from './sticker';\n\nexport default async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height, managers = rootScope.managers}: {\n set: StickerSet.stickerSet,\n lazyLoadQueue: LazyLoadQueue,\n container: HTMLElement,\n group: AnimationItemGroup,\n autoplay: boolean,\n width: number,\n height: number,\n managers?: AppManagers\n}) {\n if(set.thumbs?.length) {\n container.classList.add('media-sticker-wrapper');\n lazyLoadQueue.push({\n div: container,\n load: async() => {\n const downloadOptions = await managers.appStickersManager.getStickerSetThumbDownloadOptions(set);\n const promise = appDownloadManager.download(downloadOptions);\n\n if(set.pFlags.animated && !set.pFlags.videos) {\n return promise\n .then((blob) => {\n lottieLoader.loadAnimationWorker({\n container,\n loop: true,\n autoplay,\n animationData: blob,\n width,\n height,\n needUpscale: true,\n name: 'setThumb' + set.id\n }, group);\n });\n } else {\n let media: HTMLElement;\n if(set.pFlags.videos) {\n media = createVideo();\n (media as HTMLVideoElement).autoplay = true;\n (media as HTMLVideoElement).muted = true;\n (media as HTMLVideoElement).loop = true;\n } else {\n media = new Image();\n }\n\n media.classList.add('media-sticker');\n\n return promise.then((blob) => {\n renderImageFromUrl(media, URL.createObjectURL(blob), () => {\n container.append(media);\n\n if(set.pFlags.videos) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n });\n });\n }\n }\n });\n\n return;\n }\n\n let getDocPromise: Promise;\n\n if(set.thumb_document_id) {\n getDocPromise = managers.appEmojiManager.getCustomEmojiDocument(set.thumb_document_id);\n } else {\n getDocPromise = managers.appStickersManager.getStickerSet(set).then((stickerSet) => stickerSet.documents[0]);\n }\n\n const doc = await getDocPromise;\n if(doc._ !== 'documentEmpty') { // as thumb will be used first sticker\n wrapSticker({\n doc,\n div: container,\n group: group,\n lazyLoadQueue,\n managers,\n width,\n height\n }); // kostil\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport Row from '../row';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerToRow({doc, row, size, managers}: {\n doc: MyDocument,\n row: Row,\n size?: 'small' | 'large',\n managers?: AppManagers\n}) {\n const previousMedia = row.media;\n const media = row.createMedia('small');\n\n if(previousMedia) {\n media.classList.add('hide');\n }\n\n const loadPromises: Promise[] = previousMedia ? [] : undefined;\n\n const _size = size === 'small' ? 32 : 48;\n const result = wrapSticker({\n div: media,\n doc: doc,\n width: _size,\n height: _size,\n loadPromises,\n managers\n }).then(({render}) => render);\n\n loadPromises && Promise.all(loadPromises).then(() => {\n media.classList.remove('hide');\n previousMedia.remove();\n });\n\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport {animateSingle} from '../../helpers/animation';\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport makeError from '../../helpers/makeError';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {fastRaf} from '../../helpers/schedulers';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {Message, PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport rootScope from '../../lib/rootScope';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appMediaPlaybackController, {MediaSearchContext} from '../appMediaPlaybackController';\nimport {findMediaTargets} from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\n\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\n\nlet roundVideoCircumference = 0;\nmediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\n const width = mediaSizes.active.round.width;\n const halfSize = width / 2;\n const radius = halfSize - 7;\n roundVideoCircumference = 2 * Math.PI * radius;\n elements.forEach((element) => {\n element.setAttributeNS(null, 'width', '' + width);\n element.setAttributeNS(null, 'height', '' + width);\n\n const circle = element.firstElementChild as SVGCircleElement;\n circle.setAttributeNS(null, 'cx', '' + halfSize);\n circle.setAttributeNS(null, 'cy', '' + halfSize);\n circle.setAttributeNS(null, 'r', '' + radius);\n\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n });\n }\n});\n\nexport default async function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, noPreview, withoutPreloader, loadPromises, noPlayButton, photoSize, videoSize, searchContext, autoDownload, managers = rootScope.managers}: {\n doc: MyDocument,\n container?: HTMLElement,\n message?: Message.message,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n noInfo?: boolean,\n noPlayButton?: boolean,\n group?: AnimationItemGroup,\n onlyPreview?: boolean,\n noPreview?: boolean,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n photoSize?: PhotoSize,\n videoSize?: VideoSize,\n searchContext?: MediaSearchContext,\n managers?: AppManagers\n}) {\n const autoDownloadSize = autoDownload?.video;\n let noAutoDownload = autoDownloadSize === 0;\n const isAlbumItem = !(boxWidth && boxHeight);\n const canAutoplay = /* doc.sticker || */(\n (\n doc.type !== 'video' || (\n doc.size <= MAX_VIDEO_AUTOPLAY_SIZE &&\n !isAlbumItem\n )\n ) && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos)\n );\n let spanTime: HTMLElement, spanPlay: HTMLElement;\n\n if(!noInfo) {\n spanTime = document.createElement('span');\n spanTime.classList.add('video-time');\n container.append(spanTime);\n\n let needPlayButton = false;\n if(doc.type !== 'gif') {\n spanTime.innerText = toHHMMSS(doc.duration, false);\n\n if(!noPlayButton && doc.type !== 'round') {\n if(canAutoplay && !noAutoDownload) {\n spanTime.classList.add('tgico', 'can-autoplay');\n } else {\n needPlayButton = true;\n }\n }\n } else {\n spanTime.innerText = 'GIF';\n\n if(!canAutoplay && !noPlayButton) {\n needPlayButton = true;\n noAutoDownload = undefined;\n }\n }\n\n if(needPlayButton) {\n spanPlay = document.createElement('span');\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\n container.append(spanPlay);\n }\n }\n\n const res: {\n thumb?: typeof photoRes,\n loadPromise: Promise\n } = {} as any;\n\n if(doc.mime_type === 'image/gif') {\n const photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader,\n loadPromises,\n autoDownloadSize,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\n if(video.parentElement) {\n video.remove();\n } */\n\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\n\n const video = createVideo();\n video.classList.add('media-video');\n video.muted = true;\n if(doc.type === 'round') {\n const divRound = document.createElement('div');\n divRound.classList.add('media-round', 'z-depth-1');\n divRound.dataset.mid = '' + message.mid;\n divRound.dataset.peerId = '' + message.peerId;\n (divRound as any).message = message;\n\n const size = mediaSizes.active.round;\n const halfSize = size.width / 2;\n const strokeWidth = 3.5;\n const radius = halfSize - (strokeWidth * 2);\n divRound.innerHTML = `\n \n `;\n\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\n if(!roundVideoCircumference) {\n roundVideoCircumference = 2 * Math.PI * radius;\n }\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n\n spanTime.classList.add('tgico');\n\n const isUnread = message.pFlags.media_unread;\n if(isUnread) {\n divRound.classList.add('is-unread');\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\n\n divRound.prepend(canvas, spanTime);\n divRound.append(video);\n container.append(divRound);\n\n const ctx = canvas.getContext('2d');\n /* ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\n ctx.clip(); */\n\n const onLoad = () => {\n const message: Message.message = (divRound as any).message;\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\n const clear = () => {\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\n if(isInDOM(globalVideo)) {\n return;\n }\n\n globalVideo.removeEventListener('play', onPlay);\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.removeEventListener('pause', onPaused);\n globalVideo.removeEventListener('ended', onEnded);\n });\n };\n\n const onFrame = () => {\n ctx.drawImage(globalVideo, 0, 0);\n\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\n circle.style.strokeDashoffset = '' + offset;\n\n return !globalVideo.paused;\n };\n\n const onTimeUpdate = () => {\n if(!globalVideo.duration) {\n return;\n }\n\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n if(globalVideo.paused) {\n onFrame();\n }\n\n spanTime.innerText = toHHMMSS(globalVideo.duration - globalVideo.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1000, false);\n\n const onPlay = () => {\n video.classList.add('hide');\n divRound.classList.remove('is-paused');\n animateSingle(onFrame, canvas);\n\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\n preloader.onClick();\n }\n };\n\n const onPaused = () => {\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n divRound.classList.add('is-paused');\n };\n\n const onEnded = () => {\n video.classList.remove('hide');\n divRound.classList.add('is-paused');\n\n video.currentTime = 0;\n spanTime.innerText = toHHMMSS(globalVideo.duration, false);\n\n if(globalVideo.currentTime) {\n globalVideo.currentTime = 0;\n }\n };\n\n globalVideo.addEventListener('play', onPlay);\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.addEventListener('pause', onPaused);\n globalVideo.addEventListener('ended', onEnded);\n\n attachClickEvent(canvas, (e) => {\n cancelEvent(e);\n\n // ! костыль\n if(preloader && !preloader.detached) {\n preloader.onClick();\n }\n\n // ! can't use it here. on Safari iOS video won't start.\n /* if(globalVideo.readyState < 2) {\n return;\n } */\n\n if(globalVideo.paused) {\n const hadSearchContext = !!searchContext;\n if(appMediaPlaybackController.setSearchContext(searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound, message.mid/* , searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\n }\n\n globalVideo.play();\n } else {\n globalVideo.pause();\n }\n });\n\n if(globalVideo.paused) {\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\n onFrame();\n onTimeUpdate();\n video.classList.add('hide');\n } else {\n onPaused();\n }\n } else {\n onPlay();\n }\n };\n\n if(message.pFlags.is_outgoing) {\n (divRound as any).onLoad = onLoad;\n divRound.dataset.isOutgoing = '1';\n } else {\n onLoad();\n }\n } else {\n video.autoplay = true; // для safari\n }\n\n let photoRes: Awaited>;\n if(message) {\n photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n autoDownloadSize: autoDownload?.photo,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n if(withTail) {\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\n video.width = +foreignObject.getAttributeNS(null, 'width');\n video.height = +foreignObject.getAttributeNS(null, 'height');\n foreignObject.append(video);\n }\n } else if(!noPreview) { // * gifs masonry\n const gotThumb = getStrippedThumbIfNeeded(doc, {} as ThumbCache, true);\n if(gotThumb) {\n const thumbImage = gotThumb.image;\n thumbImage.classList.add('media-poster');\n container.append(thumbImage);\n res.thumb = {\n loadPromises: {\n thumb: gotThumb.loadPromise,\n full: Promise.resolve()\n },\n images: {\n thumb: thumbImage,\n full: null\n },\n preloader: null,\n aspecter: null\n };\n\n loadPromises?.push(gotThumb.loadPromise);\n res.loadPromise = gotThumb.loadPromise;\n }\n }\n\n if(onlyPreview) {\n return res;\n }\n\n if(!video.parentElement && container) {\n (photoRes?.aspecter || container).append(video);\n }\n\n let cacheContext: ThumbCache;\n const getCacheContext = async() => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, videoSize?.type);\n };\n\n await getCacheContext();\n\n const uploadFileName = message?.uploadingFileName;\n if(uploadFileName) { // means upload\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: true\n });\n preloader.attachPromise(appDownloadManager.getUpload(uploadFileName));\n preloader.attach(container, false);\n noAutoDownload = undefined;\n } else if(!cacheContext.downloaded && !doc.supportsStreaming && !withoutPreloader) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend'\n });\n } else if(doc.supportsStreaming) {\n preloader = new ProgressivePreloader({\n cancelable: false,\n attachMethod: 'prepend'\n });\n }\n\n const renderDeferred = deferredPromise();\n video.addEventListener('error', (e) => {\n if(video.error.code !== 4) {\n console.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n if(!renderDeferred.isFulfilled) {\n renderDeferred.resolve();\n }\n }, {once: true});\n\n if(doc.type === 'video') {\n const onTimeUpdate = () => {\n if(!video.duration) {\n return;\n }\n\n spanTime.innerText = toHHMMSS(video.duration - video.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1e3, false);\n\n video.addEventListener('timeupdate', throttledTimeUpdate);\n\n if(spanPlay) {\n video.addEventListener('timeupdate', () => {\n sequentialDom.mutateElement(spanPlay, () => {\n spanPlay.remove();\n });\n }, {once: true});\n }\n }\n\n video.muted = true;\n video.loop = true;\n // video.play();\n video.autoplay = true;\n\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\n const load = async() => {\n if(preloader && noAutoDownload && !withoutPreloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n await getCacheContext();\n let loadPromise: Promise = Promise.resolve();\n if((preloader && !uploadFileName) || withoutPreloader) {\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\n const promise = loadPromise = appDownloadManager.downloadMediaURL({\n media: doc,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: noAutoDownload,\n thumb: videoSize\n });\n\n if(preloader) {\n preloader.attach(container, false, promise);\n }\n } else if(doc.supportsStreaming) {\n if(noAutoDownload) {\n loadPromise = Promise.reject(makeError('NO_AUTO_DOWNLOAD'));\n } else if(!cacheContext.downloaded && preloader) { // * check for uploading video\n preloader.attach(container, false, null);\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\n preloader.detach();\n }, {once: true});\n }\n }\n }\n\n if(!noAutoDownload && loadPhotoThumbFunc) {\n loadPhotoThumbFunc();\n loadPhotoThumbFunc = null;\n }\n\n noAutoDownload = undefined;\n\n loadPromise.then(async() => {\n if(middleware && !middleware()) {\n renderDeferred.resolve();\n return;\n }\n\n if(doc.type === 'round') {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n }\n\n await getCacheContext();\n\n onMediaLoad(video).then(() => {\n if(group) {\n animationIntersector.addAnimation(video, group);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n renderDeferred.resolve();\n }, (err) => {\n console.error('video load error', err);\n renderDeferred.reject(err);\n });\n\n renderImageFromUrl(video, cacheContext.url);\n }, noop);\n\n return {download: loadPromise, render: Promise.all([loadPromise, renderDeferred])};\n };\n\n if(preloader && !uploadFileName) {\n preloader.setDownloadFunction(load);\n }\n\n /* if(doc.size >= 20e6 && !doc.downloaded) {\n let downloadDiv = document.createElement('div');\n downloadDiv.classList.add('download');\n\n let span = document.createElement('span');\n span.classList.add('btn-circle', 'tgico-download');\n downloadDiv.append(span);\n\n downloadDiv.addEventListener('click', () => {\n downloadDiv.remove();\n loadVideo();\n });\n\n container.prepend(downloadDiv);\n\n return;\n } */\n\n if(doc.type === 'gif' && !canAutoplay) {\n attachClickEvent(container, (e) => {\n cancelEvent(e);\n spanPlay.remove();\n load();\n }, {capture: true, once: true});\n } else {\n res.loadPromise = !lazyLoadQueue ?\n (await load()).render :\n (lazyLoadQueue.push({div: container, load: () => load().then(({render}) => render)}), Promise.resolve());\n }\n\n if(res.thumb) {\n await res.thumb.loadPromises.thumb;\n }\n\n return res;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageDescription(webPage: WebPage.webPage) {\n const shortDescriptionText = limitSymbols(webPage.description || '', 150, 180);\n // const siteName = webPage.site_name;\n // let contextHashtag = '';\n // if(siteName === 'GitHub') {\n // const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\n // if(matches) {\n // contextHashtag = matches[0] + '/issues/{1}';\n // }\n // }\n return wrapRichText(shortDescriptionText/* , {\n contextSite: siteName || 'external',\n contextHashtag: contextHashtag\n } */);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageTitle(webPage: WebPage.webPage) {\n let shortTitle = webPage.title || webPage.author || webPage.site_name || '';\n shortTitle = limitSymbols(shortTitle, 80, 100);\n return wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\n}\n","// Taken from https://core.telegram.org/bots/payments/currencies.json\nexport type Currency = {\n code: string,\n title: string,\n symbol: string,\n native: string,\n thousands_sep: string,\n decimal_sep: string,\n symbol_left: boolean,\n space_between: boolean,\n exp: number,\n min_amount: string | number,\n max_amount: string | number\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nconst Currencies: {[currency: string]: Currency} = {\"AED\":{\"code\":\"AED\",\"title\":\"United Arab Emirates Dirham\",\"symbol\":\"AED\",\"native\":\"د.إ.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"367\",\"max_amount\":\"3673030\"},\"AFN\":{\"code\":\"AFN\",\"title\":\"Afghan Afghani\",\"symbol\":\"AFN\",\"native\":\"؋\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8729\",\"max_amount\":\"87299487\"},\"ALL\":{\"code\":\"ALL\",\"title\":\"Albanian Lek\",\"symbol\":\"ALL\",\"native\":\"Lek\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"11842\",\"max_amount\":\"118421187\"},\"AMD\":{\"code\":\"AMD\",\"title\":\"Armenian Dram\",\"symbol\":\"AMD\",\"native\":\"դր.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"40943\",\"max_amount\":\"409436718\"},\"ARS\":{\"code\":\"ARS\",\"title\":\"Argentine Peso\",\"symbol\":\"ARS\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14705\",\"max_amount\":\"147059002\"},\"AUD\":{\"code\":\"AUD\",\"title\":\"Australian Dollar\",\"symbol\":\"AU$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"153\",\"max_amount\":\"1536825\"},\"AZN\":{\"code\":\"AZN\",\"title\":\"Azerbaijani Manat\",\"symbol\":\"AZN\",\"native\":\"ман.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"169\",\"max_amount\":\"1699858\"},\"BAM\":{\"code\":\"BAM\",\"title\":\"Bosnia & Herzegovina Convertible Mark\",\"symbol\":\"BAM\",\"native\":\"KM\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1990677\"},\"BDT\":{\"code\":\"BDT\",\"title\":\"Bangladeshi Taka\",\"symbol\":\"BDT\",\"native\":\"৳\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"10009\",\"max_amount\":\"100094046\"},\"BGN\":{\"code\":\"BGN\",\"title\":\"Bulgarian Lev\",\"symbol\":\"BGN\",\"native\":\"лв.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1993315\"},\"BND\":{\"code\":\"BND\",\"title\":\"Brunei Dollar\",\"symbol\":\"BND\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"142\",\"max_amount\":\"1421883\"},\"BOB\":{\"code\":\"BOB\",\"title\":\"Bolivian Boliviano\",\"symbol\":\"BOB\",\"native\":\"Bs\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"683\",\"max_amount\":\"6832607\"},\"BRL\":{\"code\":\"BRL\",\"title\":\"Brazilian Real\",\"symbol\":\"R$\",\"native\":\"R$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"539\",\"max_amount\":\"5397799\"},\"BYN\":{\"code\":\"BYN\",\"title\":\"Belarusian ruble\",\"symbol\":\"BYN\",\"native\":\"BYN\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"249\",\"max_amount\":\"2495801\"},\"CAD\":{\"code\":\"CAD\",\"title\":\"Canadian Dollar\",\"symbol\":\"CA$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"136\",\"max_amount\":\"1366860\"},\"CHF\":{\"code\":\"CHF\",\"title\":\"Swiss Franc\",\"symbol\":\"CHF\",\"native\":\"CHF\",\"thousands_sep\":\"'\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"97\",\"max_amount\":\"976705\"},\"CLP\":{\"code\":\"CLP\",\"title\":\"Chilean Peso\",\"symbol\":\"CLP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"963\",\"max_amount\":\"9637495\"},\"CNY\":{\"code\":\"CNY\",\"title\":\"Chinese Renminbi Yuan\",\"symbol\":\"CN¥\",\"native\":\"CN¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"709\",\"max_amount\":\"7094102\"},\"COP\":{\"code\":\"COP\",\"title\":\"Colombian Peso\",\"symbol\":\"COP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"452870\",\"max_amount\":\"4528700000\"},\"CRC\":{\"code\":\"CRC\",\"title\":\"Costa Rican Colón\",\"symbol\":\"CRC\",\"native\":\"₡\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"62506\",\"max_amount\":\"625061070\"},\"CZK\":{\"code\":\"CZK\",\"title\":\"Czech Koruna\",\"symbol\":\"CZK\",\"native\":\"Kč\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"2497\",\"max_amount\":\"24975029\"},\"DKK\":{\"code\":\"DKK\",\"title\":\"Danish Krone\",\"symbol\":\"DKK\",\"native\":\"kr\",\"thousands_sep\":\"\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"755\",\"max_amount\":\"7555990\"},\"DOP\":{\"code\":\"DOP\",\"title\":\"Dominican Peso\",\"symbol\":\"DOP\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5275\",\"max_amount\":\"52757308\"},\"DZD\":{\"code\":\"DZD\",\"title\":\"Algerian Dinar\",\"symbol\":\"DZD\",\"native\":\"د.ج.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14035\",\"max_amount\":\"140353307\"},\"EGP\":{\"code\":\"EGP\",\"title\":\"Egyptian Pound\",\"symbol\":\"EGP\",\"native\":\"ج.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1953\",\"max_amount\":\"19537405\"},\"ETB\":{\"code\":\"ETB\",\"title\":\"Ethiopian Birr\",\"symbol\":\"ETB\",\"native\":\"ብር\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5224\",\"max_amount\":\"52247069\"},\"EUR\":{\"code\":\"EUR\",\"title\":\"Euro\",\"symbol\":\"€\",\"native\":\"€\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"101\",\"max_amount\":\"1016045\"},\"GBP\":{\"code\":\"GBP\",\"title\":\"British Pound\",\"symbol\":\"£\",\"native\":\"£\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"89\",\"max_amount\":\"894445\"},\"GEL\":{\"code\":\"GEL\",\"title\":\"Georgian Lari\",\"symbol\":\"GEL\",\"native\":\"GEL\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"283\",\"max_amount\":\"2830234\"},\"GTQ\":{\"code\":\"GTQ\",\"title\":\"Guatemalan Quetzal\",\"symbol\":\"GTQ\",\"native\":\"Q\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"778\",\"max_amount\":\"7781323\"},\"HKD\":{\"code\":\"HKD\",\"title\":\"Hong Kong Dollar\",\"symbol\":\"HK$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"784\",\"max_amount\":\"7849750\"},\"HNL\":{\"code\":\"HNL\",\"title\":\"Honduran Lempira\",\"symbol\":\"HNL\",\"native\":\"L\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"2441\",\"max_amount\":\"24413729\"},\"HRK\":{\"code\":\"HRK\",\"title\":\"Croatian Kuna\",\"symbol\":\"HRK\",\"native\":\"kn\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"764\",\"max_amount\":\"7648805\"},\"HUF\":{\"code\":\"HUF\",\"title\":\"Hungarian Forint\",\"symbol\":\"HUF\",\"native\":\"Ft\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"42685\",\"max_amount\":\"426850229\"},\"IDR\":{\"code\":\"IDR\",\"title\":\"Indonesian Rupiah\",\"symbol\":\"IDR\",\"native\":\"Rp\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"1523370\",\"max_amount\":\"15233700000\"},\"ILS\":{\"code\":\"ILS\",\"title\":\"Israeli New Sheqel\",\"symbol\":\"₪\",\"native\":\"₪\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"354\",\"max_amount\":\"3543350\"},\"INR\":{\"code\":\"INR\",\"title\":\"Indian Rupee\",\"symbol\":\"₹\",\"native\":\"₹\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8155\",\"max_amount\":\"81555550\"},\"ISK\":{\"code\":\"ISK\",\"title\":\"Icelandic Króna\",\"symbol\":\"ISK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"142\",\"max_amount\":\"1425603\"},\"JMD\":{\"code\":\"JMD\",\"title\":\"Jamaican Dollar\",\"symbol\":\"JMD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"15013\",\"max_amount\":\"150131044\"},\"JPY\":{\"code\":\"JPY\",\"title\":\"Japanese Yen\",\"symbol\":\"¥\",\"native\":\"¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"144\",\"max_amount\":\"1443065\"},\"KES\":{\"code\":\"KES\",\"title\":\"Kenyan Shilling\",\"symbol\":\"KES\",\"native\":\"Ksh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12075\",\"max_amount\":\"120750271\"},\"KGS\":{\"code\":\"KGS\",\"title\":\"Kyrgyzstani Som\",\"symbol\":\"KGS\",\"native\":\"KGS\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"8018\",\"max_amount\":\"80182898\"},\"KRW\":{\"code\":\"KRW\",\"title\":\"South Korean Won\",\"symbol\":\"₩\",\"native\":\"₩\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"1431\",\"max_amount\":\"14315201\"},\"KZT\":{\"code\":\"KZT\",\"title\":\"Kazakhstani Tenge\",\"symbol\":\"KZT\",\"native\":\"₸\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"47186\",\"max_amount\":\"471867112\"},\"LBP\":{\"code\":\"LBP\",\"title\":\"Lebanese Pound\",\"symbol\":\"LBP\",\"native\":\"ل.ل.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"150999\",\"max_amount\":\"1509998778\"},\"LKR\":{\"code\":\"LKR\",\"title\":\"Sri Lankan Rupee\",\"symbol\":\"LKR\",\"native\":\"රු.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"35546\",\"max_amount\":\"355469651\"},\"MAD\":{\"code\":\"MAD\",\"title\":\"Moroccan Dirham\",\"symbol\":\"MAD\",\"native\":\"د.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1093\",\"max_amount\":\"10938136\"},\"MDL\":{\"code\":\"MDL\",\"title\":\"Moldovan Leu\",\"symbol\":\"MDL\",\"native\":\"MDL\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1926\",\"max_amount\":\"19264439\"},\"MNT\":{\"code\":\"MNT\",\"title\":\"Mongolian Tögrög\",\"symbol\":\"MNT\",\"native\":\"MNT\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"322444\",\"max_amount\":\"3224442056\"},\"MUR\":{\"code\":\"MUR\",\"title\":\"Mauritian Rupee\",\"symbol\":\"MUR\",\"native\":\"MUR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"4453\",\"max_amount\":\"44535174\"},\"MVR\":{\"code\":\"MVR\",\"title\":\"Maldivian Rufiyaa\",\"symbol\":\"MVR\",\"native\":\"MVR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1546\",\"max_amount\":\"15460397\"},\"MXN\":{\"code\":\"MXN\",\"title\":\"Mexican Peso\",\"symbol\":\"MX$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"2012\",\"max_amount\":\"20122860\"},\"MYR\":{\"code\":\"MYR\",\"title\":\"Malaysian Ringgit\",\"symbol\":\"MYR\",\"native\":\"RM\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"463\",\"max_amount\":\"4632502\"},\"MZN\":{\"code\":\"MZN\",\"title\":\"Mozambican Metical\",\"symbol\":\"MZN\",\"native\":\"MTn\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"6382\",\"max_amount\":\"63829729\"},\"NGN\":{\"code\":\"NGN\",\"title\":\"Nigerian Naira\",\"symbol\":\"NGN\",\"native\":\"₦\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"43203\",\"max_amount\":\"432039828\"},\"NIO\":{\"code\":\"NIO\",\"title\":\"Nicaraguan Córdoba\",\"symbol\":\"NIO\",\"native\":\"C$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"3556\",\"max_amount\":\"35566412\"},\"NOK\":{\"code\":\"NOK\",\"title\":\"Norwegian Krone\",\"symbol\":\"NOK\",\"native\":\"kr\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1069\",\"max_amount\":\"10690975\"},\"NPR\":{\"code\":\"NPR\",\"title\":\"Nepalese Rupee\",\"symbol\":\"NPR\",\"native\":\"नेरू\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12954\",\"max_amount\":\"129546657\"},\"NZD\":{\"code\":\"NZD\",\"title\":\"New Zealand Dollar\",\"symbol\":\"NZ$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"174\",\"max_amount\":\"1746220\"},\"PAB\":{\"code\":\"PAB\",\"title\":\"Panamanian Balboa\",\"symbol\":\"PAB\",\"native\":\"B\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"98\",\"max_amount\":\"988722\"},\"PEN\":{\"code\":\"PEN\",\"title\":\"Peruvian Nuevo Sol\",\"symbol\":\"PEN\",\"native\":\"S\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"390\",\"max_amount\":\"3902208\"},\"PHP\":{\"code\":\"PHP\",\"title\":\"Philippine Peso\",\"symbol\":\"PHP\",\"native\":\"₱\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5862\",\"max_amount\":\"58627496\"},\"PKR\":{\"code\":\"PKR\",\"title\":\"Pakistani Rupee\",\"symbol\":\"PKR\",\"native\":\"₨\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"22642\",\"max_amount\":\"226426805\"},\"PLN\":{\"code\":\"PLN\",\"title\":\"Polish Złoty\",\"symbol\":\"PLN\",\"native\":\"zł\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"493\",\"max_amount\":\"4932350\"},\"PYG\":{\"code\":\"PYG\",\"title\":\"Paraguayan Guaraní\",\"symbol\":\"PYG\",\"native\":\"₲\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"6977\",\"max_amount\":\"69772317\"},\"QAR\":{\"code\":\"QAR\",\"title\":\"Qatari Riyal\",\"symbol\":\"QAR\",\"native\":\"ر.ق.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"364\",\"max_amount\":\"3640989\"},\"RON\":{\"code\":\"RON\",\"title\":\"Romanian Leu\",\"symbol\":\"RON\",\"native\":\"RON\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"502\",\"max_amount\":\"5028645\"},\"RSD\":{\"code\":\"RSD\",\"title\":\"Serbian Dinar\",\"symbol\":\"RSD\",\"native\":\"дин.\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"11918\",\"max_amount\":\"119184990\"},\"RUB\":{\"code\":\"RUB\",\"title\":\"Russian Ruble\",\"symbol\":\"RUB\",\"native\":\"₽\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"7128\",\"max_amount\":\"71281218\"},\"SAR\":{\"code\":\"SAR\",\"title\":\"Saudi Riyal\",\"symbol\":\"SAR\",\"native\":\"ر.س.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"375\",\"max_amount\":\"3756546\"},\"SEK\":{\"code\":\"SEK\",\"title\":\"Swedish Krona\",\"symbol\":\"SEK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1109\",\"max_amount\":\"11094972\"},\"SGD\":{\"code\":\"SGD\",\"title\":\"Singapore Dollar\",\"symbol\":\"SGD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"143\",\"max_amount\":\"1430495\"},\"THB\":{\"code\":\"THB\",\"title\":\"Thai Baht\",\"symbol\":\"฿\",\"native\":\"฿\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3780\",\"max_amount\":\"37800497\"},\"TJS\":{\"code\":\"TJS\",\"title\":\"Tajikistani Somoni\",\"symbol\":\"TJS\",\"native\":\"TJS\",\"thousands_sep\":\" \",\"decimal_sep\":\";\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"975\",\"max_amount\":\"9753854\"},\"TRY\":{\"code\":\"TRY\",\"title\":\"Turkish Lira\",\"symbol\":\"TRY\",\"native\":\"TL\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1854\",\"max_amount\":\"18543598\"},\"TTD\":{\"code\":\"TTD\",\"title\":\"Trinidad and Tobago Dollar\",\"symbol\":\"TTD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"672\",\"max_amount\":\"6722681\"},\"TWD\":{\"code\":\"TWD\",\"title\":\"New Taiwan Dollar\",\"symbol\":\"NT$\",\"native\":\"NT$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3173\",\"max_amount\":\"31738502\"},\"TZS\":{\"code\":\"TZS\",\"title\":\"Tanzanian Shilling\",\"symbol\":\"TZS\",\"native\":\"TSh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"233199\",\"max_amount\":\"2331999890\"},\"UAH\":{\"code\":\"UAH\",\"title\":\"Ukrainian Hryvnia\",\"symbol\":\"UAH\",\"native\":\"₴\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"3633\",\"max_amount\":\"36338830\"},\"UGX\":{\"code\":\"UGX\",\"title\":\"Ugandan Shilling\",\"symbol\":\"UGX\",\"native\":\"USh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"3816\",\"max_amount\":\"38166726\"},\"USD\":{\"code\":\"USD\",\"title\":\"United States Dollar\",\"symbol\":\"$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"100\",\"max_amount\":1000000},\"UYU\":{\"code\":\"UYU\",\"title\":\"Uruguayan Peso\",\"symbol\":\"UYU\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"4080\",\"max_amount\":\"40801205\"},\"UZS\":{\"code\":\"UZS\",\"title\":\"Uzbekistani Som\",\"symbol\":\"UZS\",\"native\":\"UZS\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1089058\",\"max_amount\":\"10890583014\"},\"VND\":{\"code\":\"VND\",\"title\":\"Vietnamese Đồng\",\"symbol\":\"₫\",\"native\":\"₫\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"23862\",\"max_amount\":\"238625000\"},\"YER\":{\"code\":\"YER\",\"title\":\"Yemeni Rial\",\"symbol\":\"YER\",\"native\":\"ر.ي.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"25030\",\"max_amount\":\"250300677\"},\"ZAR\":{\"code\":\"ZAR\",\"title\":\"South African Rand\",\"symbol\":\"ZAR\",\"native\":\"R\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1789\",\"max_amount\":\"17894299\"}};\n\nexport default Currencies;\n","/*\n * 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 {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[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 as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\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 FontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\nexport const FontSize = '16px';\nexport const FontWeight = '400';\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's animation.ts\r\n\r\nimport {fastRaf} from './schedulers';\r\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false,\r\n deferred: deferredPromise()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n if(getAnimationInstance(key) === instance) {\r\n instances.delete(key);\r\n }\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n\r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n","type K = boolean;\nexport default async function filterAsync(arr: T[], callback: (item: T, idx: number, arr: T[]) => Promise | K) {\n const promises = arr.map(async(item, idx, arr) => {\n if(await callback(item, idx, arr)) {\n return item;\n }\n });\n\n return (await Promise.all(promises)).filter(Boolean);\n}\n","export default function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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","/*\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\r\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\r\nimport {fastRaf} from './schedulers';\r\nimport {ArgumentTypes} from '../types';\r\n\r\ntype HeavyQueue> = {\r\n items: ArgumentTypes[],\r\n process: (...args: any[]) => ReturnType,\r\n context: any,\r\n promise?: CancellablePromise[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask>(queue: T, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]) as typeof promise;\r\n }\r\n\r\n const promise = queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return promise;\r\n}\r\n\r\nfunction processHeavyQueue() {\r\n if(!processingQueue) {\r\n const queue = heavyQueue.shift();\r\n timedChunk(queue).finally(() => {\r\n processingQueue = false;\r\n if(heavyQueue.length) {\r\n processHeavyQueue();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction timedChunk>(queue: HeavyQueue) {\r\n if(!queue.items.length) {\r\n queue.promise.resolve([] as any);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: ReturnType[] = [];\r\n\r\n return new Promise((resolve, reject) => {\r\n const f = async() => {\r\n const start = performance.now();\r\n\r\n do {\r\n await getHeavyAnimationPromise();\r\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\r\n let realResult: typeof results[0];\r\n // @ts-ignore\r\n if(possiblePromise instanceof Promise) {\r\n try {\r\n realResult = await possiblePromise;\r\n } catch(err) {\r\n reject(err);\r\n return;\r\n }\r\n } else {\r\n realResult = possiblePromise;\r\n }\r\n\r\n results.push(realResult);\r\n } while(todo.length > 0 && (performance.now() - start) < 6);\r\n\r\n if(todo.length > 0) {\r\n fastRaf(f);\r\n // setTimeout(f, 25);\r\n } else {\r\n resolve(results);\r\n }\r\n };\r\n\r\n fastRaf(f);\r\n // setTimeout(f, 25);\r\n }).then(queue.promise.resolve, queue.promise.reject);\r\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type fastBlur from '../vendor/fastBlur';\r\nimport addHeavyTask from './heavyQueue';\r\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\r\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!IS_CANVAS_FILTER_SUPPORTED) {\r\n requireBlurPromise = import('../vendor/fastBlur').then((m) => {\r\n fastBlurFunc = m.default;\r\n });\r\n} else {\r\n requireBlurPromise = Promise.resolve();\r\n}\r\n\r\nfunction processBlurNext(\r\n img: HTMLImageElement,\r\n radius: number,\r\n iterations: number,\r\n canvas: HTMLCanvasElement = document.createElement('canvas')\r\n) {\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n const ctx = canvas.getContext('2d', {alpha: false});\r\n if(IS_CANVAS_FILTER_SUPPORTED) {\r\n ctx.filter = `blur(${radius}px)`;\r\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\r\n } else {\r\n ctx.drawImage(img, 0, 0);\r\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\r\n }\r\n\r\n return canvas;\r\n}\r\n\r\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise};\r\nconst cache: Map = new Map();\r\nconst CACHE_SIZE = 150;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n throw 'no dataUri for blur: ' + dataUri;\r\n }\r\n\r\n if(cache.size > CACHE_SIZE) {\r\n cache.clear();\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.className = 'canvas-thumbnail';\r\n\r\n let cached = cache.get(dataUri);\r\n if(!cached) {\r\n const promise: CacheValue['promise'] = new Promise((resolve) => {\r\n // return resolve(dataUri);\r\n requireBlurPromise.then(() => {\r\n const img = new Image();\r\n img.onload = () => {\r\n // if(IS_CANVAS_FILTER_SUPPORTED) {\r\n // resolve(processBlurNext(img, radius, iterations));\r\n // } else {\r\n const promise = addHeavyTask({\r\n items: [[img, radius, iterations, canvas]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift');\r\n\r\n promise.then(() => {\r\n resolve();\r\n });\r\n // }\r\n };\r\n img.src = dataUri;\r\n });\r\n });\r\n\r\n cache.set(dataUri, cached = {\r\n canvas,\r\n promise\r\n });\r\n } else {\r\n canvas.width = cached.canvas.width;\r\n canvas.height = cached.canvas.height;\r\n cached.promise.then(() => {\r\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\r\n });\r\n }\r\n\r\n return {\r\n ...cached,\r\n canvas\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport bytesFromHex from './bytesFromHex';\nimport bytesToDataURL from './bytesToDataURL';\n\nconst JPEG_HEADER = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\nconst JPEG_TAIL = bytesFromHex('ffd9');\n\nexport default function getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\n arr = new Uint8Array(JPEG_HEADER.concat(Array.from(bytes.slice(3)), JPEG_TAIL));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n return bytesToDataURL(arr, mimeType);\n}\n","export default function bytesToDataURL(bytes: Uint8Array, mimeType: string = 'image/jpeg') {\n return `data:${mimeType};base64,${btoa(String.fromCharCode(...bytes))}`;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport {makeMediaSize} from './mediaSize';\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { MOUNT_CLASS_TO } from \"../../config/debug\";\n\nlet context: CanvasRenderingContext2D;\n/**\n * Get the text width\n * @param {string} text\n * @param {string} font\n */\nexport default function getTextWidth(text: string, font: string) {\n // const perf = performance.now();\n if(!context) {\n const canvas = document.createElement('canvas');\n context = canvas.getContext('2d', {alpha: false});\n }\n\n if(context.font !== font) {\n context.font = font;\n }\n\n // context.font = font;\n const metrics = context.measureText(text);\n // console.log('getTextWidth perf:', performance.now() - perf);\n return metrics.width;\n // return Math.round(metrics.width);\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.getTextWidth = getTextWidth);\n","import type {MediaSize} from '../mediaSize';\n\nexport default function scaleMediaElement(options: {\n media: CanvasImageSource,\n mediaSize?: MediaSize,\n boxSize?: MediaSize,\n quality?: number,\n mimeType?: 'image/jpeg' | 'image/png',\n size?: MediaSize\n}): Promise<{blob: Blob, size: MediaSize}> {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n const size = options.size ?? options.mediaSize.aspectFitted(options.boxSize);\n canvas.width = size.width * window.devicePixelRatio;\n canvas.height = size.height * window.devicePixelRatio;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\n canvas.toBlob((blob) => {\n resolve({blob, size});\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\n });\n}\n","/*\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\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}\n","/*\n * 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 mediaSizes from './mediaSizes';\nimport OverlayClickHandler from './overlayClickHandler';\n\nclass ContextMenuController extends OverlayClickHandler {\n constructor() {\n super('menu', true);\n\n mediaSizes.addEventListener('resize', () => {\n if(this.element) {\n this.close();\n }\n\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\n const rect = openedMenu.getBoundingClientRect();\n const {innerWidth, innerHeight} = window;\n\n console.log(innerWidth, innerHeight, rect);\n } */\n });\n }\n\n public isOpened() {\n return !!this.element;\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const rect = this.element.getBoundingClientRect();\n const {clientX, clientY} = e;\n\n const diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n const diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n\n if(diffX >= 100 || diffY >= 100) {\n this.close();\n // openedMenu.parentElement.click();\n }\n // console.log('mousemove', diffX, diffY);\n };\n\n public close() {\n if(this.element) {\n this.element.classList.remove('active');\n this.element.parentElement.classList.remove('menu-open');\n }\n\n super.close();\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('mousemove', this.onMouseMove);\n }\n }\n\n public openBtnMenu(element: HTMLElement, onClose?: () => void) {\n super.open(element);\n\n this.element.classList.add('active');\n this.element.parentElement.classList.add('menu-open');\n\n if(onClose) {\n this.addEventListener('toggle', onClose, {once: true});\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.addEventListener('mousemove', this.onMouseMove);\n }\n }\n}\n\nconst contextMenuController = new ContextMenuController();\nexport default contextMenuController;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport I18n, {i18n} from '../lib/langPack';\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true,\r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\r\n joiner + date.getFullYear() +\r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp('20[0-9]{1,2}');\r\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\r\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\r\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if('today'.indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if('yesterday'.indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if(k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if(k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n\r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n\r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n\r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter from '../listenerSetter';\nimport cancelEvent from './cancelEvent';\n\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\nexport function cancelContextMenuOpening() {\n if(_cancelContextMenuOpeningTimeout) {\n clearTimeout(_cancelContextMenuOpeningTimeout);\n }\n\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\n _cancelContextMenuOpeningTimeout = 0;\n _cancelContextMenuOpening = false;\n }, .4e3);\n\n _cancelContextMenuOpening = true;\n}\n\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\n\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\n let timeout: number;\n\n const options: EventListenerOptions = {capture: true};\n\n const onCancel = () => {\n clearTimeout(timeout);\n // @ts-ignore\n remove('touchmove', onCancel, options);\n // @ts-ignore\n remove('touchend', onCancel, options);\n // @ts-ignore\n remove('touchcancel', onCancel, options);\n };\n\n add('touchstart', (e: TouchEvent) => {\n if(e.touches.length > 1) {\n onCancel();\n return;\n }\n\n add('touchmove', onCancel, options);\n add('touchend', onCancel, options);\n add('touchcancel', onCancel, options);\n\n timeout = window.setTimeout(() => {\n if(_cancelContextMenuOpening) {\n onCancel();\n return;\n }\n\n callback(e.touches[0]);\n onCancel();\n\n if(contextMenuController.isOpened()) {\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n });\n\n /* if(!isSafari) {\n add('contextmenu', (e: any) => {\n cancelEvent(e);\n }, {passive: false, capture: true});\n } */\n } else {\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\n callback(e);\n\n if(contextMenuController.isOpened()) {\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback);\n }\n}\n","/*\r\n * https://github.com/morethanwords/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\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","/*\r\n * https://github.com/morethanwords/tweb\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 | Window, 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 as any, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport EventListenerBase from '../eventListenerBase';\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 type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport PopupStickers from '../../components/popups/stickers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport createContextMenu from './createContextMenu';\nimport findUpClassName from './findUpClassName';\nimport emoticonsDropdown, {EmoticonsDropdown} from '../../components/emoticonsDropdown';\n\nexport default function createStickersContextMenu(options: {\n listenTo: HTMLElement,\n isStickerPack?: boolean,\n verifyRecent?: (target: HTMLElement) => boolean,\n appendTo?: HTMLElement,\n onOpen?: () => any,\n onClose?: () => any,\n onSend?: () => any\n}) {\n const {listenTo, isStickerPack, verifyRecent, appendTo, onOpen, onClose, onSend} = options;\n let target: HTMLElement, doc: MyDocument;\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const favedStickers = await rootScope.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n return createContextMenu({\n listenTo: listenTo,\n appendTo,\n findElement: (e) => target = findUpClassName(e.target, 'media-sticker-wrapper'),\n onOpen: async() => {\n doc = await rootScope.managers.appDocsManager.getDoc(target.dataset.docId);\n return onOpen?.();\n },\n onClose,\n buttons: [{\n icon: 'stickers',\n text: 'Context.ViewStickerSet',\n onClick: () => new PopupStickers(doc.stickerSetInput).show(),\n verify: () => !isStickerPack\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'delete',\n text: 'DeleteFromRecent',\n onClick: () => rootScope.managers.appStickersManager.saveRecentSticker(doc.id, true),\n verify: () => verifyRecent?.(target) ?? false\n }, {\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: () => {\n onSend?.();\n return EmoticonsDropdown.sendDocId(doc.id, false, true);\n },\n verify: () => !!(appImManager.chat.peerId && appImManager.chat.peerId !== rootScope.myId)\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: () => appImManager.chat.input.scheduleSending(() => appImManager.chat.input.sendMessageWithDocument(doc)),\n verify: () => !!appImManager.chat.peerId\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 ButtonMenu, {ButtonMenuItemOptions} from '../../components/buttonMenu';\nimport filterAsync from '../array/filterAsync';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter from '../listenerSetter';\nimport {getMiddleware} from '../middleware';\nimport positionMenu from '../positionMenu';\nimport {attachContextMenuListener} from './attachContextMenuListener';\n\nexport default function createContextMenu boolean | Promise}>({\n buttons,\n findElement,\n listenTo,\n appendTo,\n filterButtons,\n onOpen,\n onClose\n}: {\n buttons: T[],\n findElement: (e: MouseEvent) => HTMLElement,\n listenTo: HTMLElement,\n appendTo?: HTMLElement,\n filterButtons?: (buttons: T[]) => Promise,\n onOpen?: (target: HTMLElement) => any,\n onClose?: () => any\n}) {\n appendTo ??= document.body;\n\n const attachListenerSetter = new ListenerSetter();\n const listenerSetter = new ListenerSetter();\n const middleware = getMiddleware();\n let element: HTMLElement;\n\n attachContextMenuListener(listenTo, (e) => {\n const target = findElement(e as any);\n if(!target) {\n return;\n }\n\n let _element = element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(_element && _element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n const r = async() => {\n await onOpen?.(target);\n\n const initResult = await init();\n if(!initResult) {\n return;\n }\n\n _element = initResult.element;\n const {cleanup, destroy} = initResult;\n\n positionMenu(e, _element);\n contextMenuController.openBtnMenu(_element, () => {\n onClose?.();\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n };\n\n r();\n }, attachListenerSetter);\n\n const cleanup = () => {\n listenerSetter.removeAll();\n middleware.clean();\n };\n\n const destroy = () => {\n cleanup();\n attachListenerSetter.removeAll();\n };\n\n const init = async() => {\n cleanup();\n\n buttons.forEach((button) => button.element = undefined);\n const f = filterButtons || ((buttons: T[]) => filterAsync(buttons, (button) => button?.verify?.() ?? true));\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = ButtonMenu(filteredButtons, listenerSetter);\n _element.classList.add('contextmenu');\n\n appendTo.append(_element);\n\n return {\n element: _element,\n cleanup,\n destroy: () => {\n _element.remove();\n }\n };\n };\n\n return {element, destroy};\n}\n","export default function createVideo(options: {\n pip?: boolean\n} = {}) {\n const video = document.createElement('video');\n if(!options.pip) video.disablePictureInPicture = true;\n video.setAttribute('playsinline', 'true');\n return video;\n}\n","/*\n * 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(const 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","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","import encodeEntities from '../string/encodeEntities';\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === node.TEXT_NODE ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: T, parent: HTMLElement): T {\r\n if(!el) return null;\r\n if(el.parentElement === parent) return el;\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement as any;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\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\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","/*\n * 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpAsChild from './findUpAsChild';\n\nexport default function getCaretPosNew(input: HTMLElement, anchor?: boolean): ReturnType & {selection: Selection} {\n const selection = document.getSelection();\n // let {focusNode: node, focusOffset: offset} = selection;\n const node = selection[anchor ? 'anchorNode' : 'focusNode'];\n const offset = selection[anchor ? 'anchorOffset' : 'focusOffset'];\n if(!findUpAsChild(node, input) && node !== input) {\n return {selection} as any;\n }\n\n return {...getCaretPosF(input, node, offset), selection};\n}\n\nexport function getCaretPosF(input: HTMLElement, node: Node, offset: number) {\n if(node === input) {\n const childNodes = input.childNodes;\n const childNodesLength = childNodes.length;\n if(childNodesLength && offset >= childNodesLength) {\n node = childNodes[childNodesLength - 1];\n offset = (node.textContent || (node as HTMLImageElement).alt || '').length;\n } else {\n node = childNodes[offset];\n offset = 0;\n }\n }\n\n return {node: node as ChildNode, offset};\n}\n","/*\r\n * https://github.com/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 BOM from '../string/bom';\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler'/* | 'customEmoji' */;\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\"], [style*=\"strikethrough\"], 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 // customEmoji: {\r\n // match: '.custom-emoji',\r\n // entityName: 'messageEntityCustomEmoji'\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\nconst BOM_REG_EXP = new RegExp(BOM, 'g');\r\n\r\nfunction checkNodeForEntity(node: Node, value: string, entities: MessageEntity[], offset: {offset: number}) {\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: HTMLElement = parentElement.closest(tag.match + ', [contenteditable=\"true\"]');\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: value.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: value.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n }/* else if(tag.entityName === 'messageEntityCustomEmoji') {\r\n entities.push({\r\n _: tag.entityName,\r\n document_id: (closest as HTMLElement).dataset.docId,\r\n offset: offset.offset,\r\n length: emoji.length\r\n });\r\n } */ else {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: value.length\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport default function getRichElementValue(\r\n node: HTMLElement,\r\n lines: string[],\r\n line: string[],\r\n selNode?: Node,\r\n selOffset?: number,\r\n entities?: MessageEntity[],\r\n offset = {offset: 0}\r\n) {\r\n if(node.nodeType === node.TEXT_NODE) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n // if(nodeValue[0] === BOM) {\r\n nodeValue = nodeValue.replace(BOM_REG_EXP, '');\r\n // }\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(nodeValue) {\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 } else if(selNode === node) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(entities && nodeValue.length && node.parentNode) {\r\n checkNodeForEntity(node, nodeValue, entities, offset);\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== node.ELEMENT_NODE) { // 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 || node.tagName === 'BR')) {\r\n lines.push(line.join(''));\r\n line.length = 0;\r\n ++offset.offset;\r\n } else {\r\n const alt = node.dataset.stickerEmoji || (node as HTMLImageElement).alt;\r\n const stickerEmoji = node.dataset.stickerEmoji;\r\n\r\n if(alt && entities) {\r\n checkNodeForEntity(node, alt, entities, offset);\r\n }\r\n\r\n if(stickerEmoji && entities) {\r\n entities.push({\r\n _: 'messageEntityCustomEmoji',\r\n document_id: node.dataset.docId,\r\n offset: offset.offset,\r\n length: alt.length\r\n });\r\n }\r\n\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport {MessageEntity} from '../../layer';\r\nimport combineSameEntities from '../../lib/richTextProcessor/combineSameEntities';\r\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\r\nimport getRichElementValue from './getRichElementValue';\r\n\r\nexport function getCaretPos(field: HTMLElement) {\r\n const sel = window.getSelection();\r\n let selNode: Node;\r\n let selOffset: number;\r\n if(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 return {node: selNode, offset: selOffset};\r\n}\r\n\r\nexport default function getRichValueWithCaret(\r\n field: HTMLElement | DocumentFragment,\r\n withEntities = true,\r\n withCaret = true\r\n) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const {node: selNode, offset: selOffset} = !(field instanceof DocumentFragment) && withCaret && getCaretPos(field);\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n const offset = {offset: 0};\r\n if(field instanceof DocumentFragment) {\r\n let curChild = field.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 } else {\r\n getRichElementValue(field, lines, line, selNode, selOffset, entities, offset);\r\n }\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?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n combineSameEntities(entities);\r\n sortEntities(entities);\r\n }\r\n\r\n return {value, entities, caretPos};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValueWithCaret = getRichValueWithCaret;\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 getVisibleRect from './getVisibleRect';\n\nexport type ViewportSlicePart = {element: HTMLElement, rect: DOMRect, visibleRect: ReturnType}[];\n\nexport default function getViewportSlice({overflowElement, overflowRect, selector, extraSize, elements}: {\n overflowElement: HTMLElement,\n overflowRect?: DOMRectMinified,\n extraSize?: number,\n selector?: string,\n elements?: HTMLElement[]\n}) {\n // const perf = performance.now();\n overflowRect ??= overflowElement.getBoundingClientRect();\n elements ??= Array.from(overflowElement.querySelectorAll(selector));\n\n if(extraSize) {\n overflowRect = {\n top: overflowRect.top - extraSize,\n right: overflowRect.right + extraSize,\n bottom: overflowRect.bottom + extraSize,\n left: overflowRect.left - extraSize\n };\n }\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport windowSize from '../windowSize';\r\n\r\nexport default function getVisibleRect(\r\n element: HTMLElement,\r\n overflowElement: HTMLElement,\r\n lookForSticky?: boolean,\r\n rect: DOMRectMinified = element.getBoundingClientRect(),\r\n overflowRect: DOMRectMinified = 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 const windowWidth = windowSize.width;\r\n const windowHeight = windowSize.height;\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\nimport SwipeHandler, {SwipeHandlerOptions} from '../../components/swipeHandler';\nimport cancelEvent from './cancelEvent';\nimport findUpClassName from './findUpClassName';\nimport isSwipingBackSafari from './isSwipingBackSafari';\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') &&\n !isSwipingBackSafari(e) &&\n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {cancelContextMenuOpening} from './attachContextMenuListener';\nimport handleHorizontalSwipe, {SwipeHandlerHorizontalOptions} from './handleHorizontalSwipe';\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToDocumentFragment(html: string | DocumentFragment) {\r\n if(html instanceof DocumentFragment) return html;\r\n const template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.isContentEditable || 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 !getRichValueWithCaret(element, false, false).value.trim();\r\n return !element.textContent.trim() && !element.querySelector('.emoji, .custom-emoji, .custom-emoji-placeholder');\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 rootScope from '../../lib/rootScope';\r\nimport {IS_MOBILE, IS_APPLE} from '../../environment/userAgent';\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\r\n * https://github.com/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, focus = true) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || (document.activeElement.tagName !== 'INPUT' && !(document.activeElement as HTMLElement).isContentEditable))) {\r\n return;\r\n }\r\n\r\n focus && el.focus();\r\n if(el instanceof HTMLInputElement) {\r\n const length = el.value.length;\r\n el.selectionStart = length;\r\n el.selectionEnd = length;\r\n } else {\r\n const range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n const sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n }\r\n}\r\n\r\n(window as any).placeCaretAtEnd = placeCaretAtEnd;\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 onMediaLoad from '../onMediaLoad';\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement,\n url: string,\n callback?: () => void,\n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback?.();\n return;\n }\n\n const isVideo = elem instanceof HTMLVideoElement;\n if(((loadedURLs[url]/* && false */) && useCache) || isVideo) {\n if(elem) {\n set(elem, url);\n }\n\n if(callback) {\n if(isVideo) {\n onMediaLoad(elem).then(callback);\n } else {\n callback?.();\n }\n // callback && getHeavyAnimationPromise().then(() => callback());\n }\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\n const onLoad = () => {\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?.();\n\n loader.removeEventListener('error', onError);\n };\n\n const onError = (err: ErrorEvent) => {\n console.error('Render image from url failed:', err, url, loader);\n loader.removeEventListener('load', onLoad);\n callback?.();\n };\n\n loader.addEventListener('load', onLoad, {once: true});\n loader.addEventListener('error', onError, {once: true});\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport sequentialDom from '../sequentialDom';\nimport {renderImageFromUrlPromise} from './renderImageFromUrl';\n\nexport default function renderMediaWithFadeIn(\n container: HTMLElement,\n media: Parameters[0],\n url: string,\n needFadeIn: boolean,\n aspecter = container,\n thumbImage?: HTMLElement\n) {\n if(needFadeIn) {\n media.classList.add('fade-in');\n }\n\n const promise = renderImageFromUrlPromise(media, url).then(() => {\n return sequentialDom.mutateElement(container, () => {\n aspecter.append(media);\n\n if(needFadeIn) {\n media.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n });\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n });\n });\n\n // recordPromise(promise, 'renderImageWithFadeIn');\n\n return promise;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport clamp from '../number/clamp';\nimport findUpAsChild from './findUpAsChild';\nimport whichChild from './whichChild';\n\nexport default function compareNodes(node1: ChildNode, node1Offset: number, node2: ChildNode, node2Offset: number) {\n let diff: number;\n if(node1 === node2) {\n diff = node1Offset - node2Offset;\n } else if(node1.parentElement === node2.parentElement) {\n diff = whichChild(node1, true) - whichChild(node2, true);\n } else {\n const parents: HTMLElement[] = [];\n let parentElement = node1.parentElement;\n do {\n parents.push(parentElement);\n } while(parentElement = parentElement.parentElement);\n\n parentElement = node2.parentElement;\n do {\n if(parents.includes(parentElement)) {\n break;\n }\n } while(parentElement = parentElement.parentElement);\n\n const commonAncestorContainer = parentElement;\n // const range = document.createRange();\n // range.setStart(node1, 0);\n // range.setEnd(node2, node2.textContent.length);\n // const {commonAncestorContainer} = range;\n node1 = findUpAsChild(node1 as HTMLElement, commonAncestorContainer as HTMLElement);\n node2 = findUpAsChild(node2 as HTMLElement, commonAncestorContainer as HTMLElement);\n diff = whichChild(node1, true) - whichChild(node2, true);\n }\n\n return clamp(diff, -1, 1);\n}\n\n(window as any).compareNodes = compareNodes;\n","/*\n * 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_FIREFOX} from '../../environment/userAgent';\nimport {logger} from '../../lib/logger';\nimport {isCustomFillerNeededBySiblingNode} from '../../lib/richTextProcessor/wrapRichText';\nimport ListenerSetter from '../listenerSetter';\nimport BOM from '../string/bom';\nimport compareNodes from './compareNodes';\nimport getCaretPosNew from './getCaretPosNew';\nimport placeCaretAtEnd from './placeCaretAtEnd';\nimport whichChild from './whichChild';\n\nconst NOT_ONLY_BOMS_REG_EXP = new RegExp(`[^${BOM}]`);\n\nexport const USING_BOMS = false;\n\nexport default class RichInputHandler {\n private static INSTANCE: RichInputHandler;\n\n private listenerSetter: ListenerSetter;\n\n private lastNode: Node;\n private lastOffset: number;\n private savedRanges: WeakMap;\n\n private log: ReturnType;\n\n private inputCaptureCallbacks: Function[];\n\n constructor() {\n this.log = logger('RICH-INPUT');\n this.listenerSetter = new ListenerSetter();\n this.savedRanges = new WeakMap();\n\n this.listenerSetter.add(document)('selectionchange', this.saveSelectionOnChange);\n if(USING_BOMS) {\n this.listenerSetter.add(document)('focusout', this.onFocusOut);\n this.listenerSetter.add(document)('selectionchange', this.onSelectionChange);\n this.listenerSetter.add(document)('beforeinput', this.onBeforeInput);\n this.listenerSetter.add(document)('keydown', this.onKeyDown, {capture: true});\n\n if(IS_FIREFOX) {\n this.inputCaptureCallbacks = [];\n this.listenerSetter.add(document)('input', () => {\n this.inputCaptureCallbacks.forEach((callback) => callback());\n this.inputCaptureCallbacks.length = 0;\n }, {capture: true});\n }\n }\n }\n\n private get input() {\n const selection = document.getSelection();\n const {anchorNode: node} = selection;\n if(!node) return;\n return ((node as HTMLElement).closest ? node as HTMLElement : node.parentElement).closest('[contenteditable=\"true\"]');\n }\n\n private saveRangeForElement(element: HTMLElement) {\n if(element && (element.isContentEditable || element.tagName === 'INPUT')) {\n const selection = document.getSelection();\n if(selection.rangeCount) {\n this.savedRanges.set(element as HTMLElement, document.getSelection().getRangeAt(0));\n }\n }\n }\n\n private saveSelectionOnChange = (e: Event) => {\n const element = document.activeElement as HTMLElement; // e.target as HTMLElement;\n this.saveRangeForElement(element);\n };\n\n private onFocusOut = (e: FocusEvent) => {\n this.lastNode = this.lastOffset = undefined;\n };\n\n private findPreviousSmthIndex(input: HTMLElement, node: ChildNode, something?: NodeListOf) {\n // node = this.getFiller(node);\n // const childNodes = Array.from(node.parentElement.childNodes);\n // fillerIndex = childNodes.indexOf(node);\n // let smthIndex = -1;\n // for(let i = fillerIndex; i >= 0; --i) {\n // const node = childNodes[i];\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // smthIndex = i;\n // break;\n // }\n // }\n // return smthIndex;\n\n const elements = Array.from(something ?? input.querySelectorAll('.input-something'));\n const index = elements.findIndex((element) => compareNodes(element, 0, node, 0) >= 0);\n return index === -1 ? elements.length - 1 : Math.max(0, index - 1);\n }\n\n private superMove(\n input: HTMLElement,\n caret: ReturnType,\n toLeft: boolean,\n fromSelectionChange: boolean\n ) {\n const {node, offset, move} = caret;\n const something = input.querySelectorAll('.input-something');\n const smthIndex = this.findPreviousSmthIndex(input, node, something);\n const r = document.createRange();\n r[toLeft ? 'setEnd' : 'setStart'](node, offset);\n\n if(fromSelectionChange) {\n move(toLeft);\n }\n\n const c = this.getCaretPosN();\n if(c.node?.nodeValue === BOM && (!fromSelectionChange || node === this.lastNode)) {\n const idx = this.findPreviousSmthIndex(input, c.node, something);\n\n let moved = !fromSelectionChange;\n\n do {\n const c = this.getCaretPosN();\n const idxidx = this.findPreviousSmthIndex(input, c.node, something);\n r[toLeft ? 'setStart' : 'setEnd'](c.node, c.offset);\n const rangeString = r.toString();\n const onlyBOMs = !NOT_ONLY_BOMS_REG_EXP.test(rangeString);\n this.log('test cursor', rangeString, onlyBOMs, idx, idxidx);\n if(\n onlyBOMs &&\n c.node?.nodeValue === BOM &&\n idxidx === idx &&\n // (idxidx > 1 || c.offset) &&\n // (idxidx < (getFiller(c.node).parentElement.childNodes.length - 2) || c.offset < BOM.length)\n (idxidx || c.offset) &&\n (idxidx < (something.length - 1) || c.offset < BOM.length)\n ) {\n move(toLeft);\n moved = true;\n } else if(!moved) {\n break;\n } else {\n if((!this.getFiller(node as HTMLElement).classList.contains('input-filler-text') && idx !== smthIndex) || c.offset === BOM.length) {\n move(!toLeft);\n }\n\n break;\n }\n } while(true);\n }\n }\n\n private onSelectionChange = (e: Event) => {\n const {input} = this;\n if(!input) {\n this.setSelectionClassName(document.getSelection());\n return;\n }\n\n // return;\n\n // this.log('selectionchange', document.getSelection(), document.getSelection().rangeCount && document.getSelection().getRangeAt(0), getCaretPosN());\n // let {node, offset} = getCaretPos(this.messageInput);\n\n let caret = this.getCaretPosN();\n do {\n const {node, offset, selection, move} = caret;\n\n const nodeValue = node?.nodeValue;\n // if(!nodeValue?.includes(BOM)) {\n if(nodeValue !== BOM || !this.lastNode) {\n break;\n }\n\n // node = getFiller(node);\n\n // const childIndex = whichChild(getFiller(node), true);\n // let toLeft: boolean;\n // // if(node === lastNode) toLeft = lastOffset >= offset;\n // if(node === lastNode) toLeft = lastOffset > offset;\n // else {\n // // toLeft = whichChild(getFiller(lastNode)) > childIndex;\n // toLeft = (lastNode.nodeValue === BOM ? whichChild(getFiller(lastNode), true) : whichChild(findUpAsChild(lastNode as any, getFiller(node).parentElement), true)) > childIndex;\n // }\n\n const toLeft = compareNodes(node, offset, this.lastNode as ChildNode, this.lastOffset) < 0;\n\n // const childNodes = Array.from(node.parentElement.childNodes);\n // if(toLeft) {\n // for(let i = childIndex; i >= 0; --i) {\n // const sibling = childNodes[i];\n // const {textContent} = sibling;\n // for()\n // }\n // }\n\n // {\n // if(toLeft === undefined) {\n // return;\n // }\n\n // const selection = window.getSelection();\n // selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // return;\n // }\n\n // const parent = getFiller(node);\n if(toLeft !== undefined) {\n // let newNode = toLeft ? parent.previousSibling : parent.nextSibling;\n if(selection.isCollapsed) {\n this.superMove(input, caret, toLeft, true);\n\n // if(offset === BOM.length) {\n // newNode = toLeft ? newNode.nextSibling.nextSibling : parent.previousSibling.previousSibling;\n // }\n\n // setCaretAt(newNode);\n } else {\n selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // const range = selection.getRangeAt(0);\n\n // if(toLeft) {\n // newNode = parent.previousSibling.previousSibling.firstChild;\n // const value = newNode.nodeValue;\n // range.setStart(newNode, value?.length);\n // } else {\n // newNode = parent.nextSibling.nextSibling.firstChild;\n // range.setEnd(newNode, 0);\n // }\n }\n }\n\n this.log('selectionchange',\n node,\n offset,\n this.lastNode,\n this.lastOffset,\n node === this.lastNode,\n whichChild(this.getFiller(node)),\n whichChild(this.getFiller(this.lastNode)),\n toLeft,\n selection,\n document.getSelection(),\n document.getSelection().getRangeAt(0),\n node?.parentNode,\n this.lastNode?.parentNode\n );\n\n caret = this.getCaretPosN();\n this.lastNode = node;\n this.lastOffset = offset;\n\n break;\n\n // if(findPreviousSmthIndex(caret.node) !== smthIndex) {\n // break;\n // }\n } while(true);\n\n this.lastNode = this.lastOffset = undefined;\n\n // if(offset === BOM.length) {\n // setCaretAt(parent);\n // } else {\n // setCaretAt(parent.nextSibling);\n // }\n\n this.setSelectionClassName(caret.selection, input);\n };\n\n public restoreSavedRange(input: HTMLElement) {\n const range = this.getSavedRange(input);\n if(!range) {\n return false;\n }\n\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n }\n\n public getSavedRange(input: HTMLElement) {\n return this.savedRanges.get(input);\n }\n\n public makeFocused(input: HTMLElement) {\n if(document.activeElement !== input && !this.restoreSavedRange(input)) {\n placeCaretAtEnd(input, false, false);\n }\n }\n\n private fixInsertedLineBreaks(input: HTMLElement) {\n input.querySelectorAll('br').forEach((br) => {\n br.classList.add('br-not-br');\n });\n }\n\n private fixBuggedCaret() {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n public onBeforeInput = (e: Pick) => {\n const {input, log} = this;\n if(!input) {\n return;\n }\n\n const addInputCallback = this.addInputCallback.bind(this, input);\n\n const caretPos = this.getCaretPosN();\n let {node, offset, selection, move} = caretPos;\n log('beforeinput', e, node, offset, selection, caretPos);\n this.lastNode = this.lastOffset = undefined;\n\n if(e.inputType.startsWith('delete')) { // delete current BOM\n addInputCallback(() => {\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.fixInsertedLineBreaks(input);\n });\n\n if(node?.nodeValue === BOM && selection.isCollapsed && e.inputType.includes('deleteContent')) {\n const toLeft = e.inputType.includes('Backward');\n const moveFirst = (offset === BOM.length && toLeft) || (!offset && !toLeft);\n this.superMove(input, caretPos, toLeft, moveFirst);\n // if((offset === BOM.length && toLeft) || (!offset && !toLeft)) {\n // move(toLeft);\n // }\n\n // addInputCallback(() => {\n // removePossibleBOMSiblingsByNode(getFiller(node));\n // });\n\n // if(node.parentNode.childNodes.length === 1) {\n // (node.parentNode as HTMLElement).remove();\n // move(e.inputType.includes('Backward') ? false : true);\n // } else {\n // move(e.inputType.includes('Backward') ? true : false);\n // addInputCallback(() => {\n // move(e.inputType.includes('Backward') ? false : true);\n // });\n // }\n\n // for(let i = 0, length = BOM.length + (direction === 'backward' ? offset : BOM.length - offset); i < length; ++i) {\n // selection.modify('extend', direction, 'character');\n // }\n\n // selection.modify('extend', direction, 'character');\n // selection.modify('extend', direction, 'character');\n\n // selection.deleteFromDocument();\n // e.preventDefault();\n } else {\n // const filler = getFiller(node);\n // if(filler?.classList?.contains('input-filler-text')) {\n // const {previousSibling, nextSibling} = filler;\n // addInputCallback(() => {\n // if(!filler.isConnected) {\n // removePossibleBOMSiblings(previousSibling, nextSibling);\n // }\n // // removeExtraBOMs();\n // // processEmptiedFillers();\n // });\n // }\n // addInputCallback(() => {\n // this.fixInsertedLineBreaks(input);\n // });\n }\n } else if(e.inputType.startsWith('insert')) { // clear current BOM\n if((node as HTMLElement)?.classList?.contains('input-something')/* || (node.textContent === BOM && offset === BOM.length) */) {\n node = node.previousSibling.firstChild;\n const range = selection.getRangeAt(0);\n range.setStart(node, 0);\n range.setEnd(node, 0);\n range.collapse(true);\n // selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n if(node && node.textContent === BOM && offset === BOM.length) {\n // const range = selection.getRangeAt(0);\n // range.setStart(node, 0);\n // range.setEnd(node, 0);\n // range.collapse(true);\n selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n // if(node && node.textContent === BOM && offset === 0) {\n // selection.modify('move', 'forward', 'character');\n // offset = BOM.length;\n // }\n\n if(e.inputType === 'insertLineBreak' || true) {\n // const appendix = 'X';\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // selection.modify('move', 'forward', 'character');\n // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n /* if(node?.nodeValue === BOM) */ {\n // const parent = node.parentElement;\n // parent.contentEditable = 'false';\n // addInputCallback(() => {\n // parent.contentEditable = 'inherit';\n // });\n // node.parentElement.remove();\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // fix case when focused somehow on span instead of text node\n if(node && node.nodeType === node.ELEMENT_NODE) {\n node = node.firstChild;\n log.warn('fixing focus on span');\n }\n\n const isBOM = node?.nodeValue === BOM;\n log('inserting line break', isBOM, node, `\"${node?.nodeValue}\"`, node?.parentElement ? Array.from(node.parentElement.childNodes).slice() : []);\n if(isBOM) {\n // (node as ChildNode).replaceWith(this.messageInput.querySelector('.lol'));\n\n const parentElement = node.parentElement;\n parentElement.classList.replace('input-filler', 'input-filler-text');\n const childNodesLength = parentElement.childNodes.length;\n addInputCallback(() => {\n const newChildNodesLength = parentElement.childNodes.length;\n if(newChildNodesLength > 1/* && newChildNodesLength !== childNodesLength */) {\n log('inserting line break, remove');\n node = Array.from(parentElement.childNodes).find((node) => node.nodeValue === BOM);\n (parentElement as any).t = node;\n // node?.remove();\n\n // const n = parentElement.firstChild;\n // const range = selection.getRangeAt(0);\n // range.setStart(n, n.nodeValue.length);\n // range.setEnd(n, n.nodeValue.length);\n } else if(node.nodeValue !== BOM) {\n log('inserting line break, deleteData');\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // node = document.createTextNode(BOM);\n }\n\n this.fixInsertedLineBreaks(input);\n // (parentElement as any).t = node;\n // node.remove();\n });\n // addInputCallback(() => {\n // node.parentElement.classList.replace('input-filler', 'input-filler3');\n // const s = document.createElement('span');\n // s.style.display = 'none';\n // node.replaceWith(s);\n // s.prepend(node);\n // });\n } else if(e.inputType === 'insertLineBreak') {\n addInputCallback(() => {\n this.fixInsertedLineBreaks(input);\n });\n // const range = selection.getRangeAt(0);\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }, false);\n }/* else if(node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n\n } */\n\n // if(e.inputType === 'insertLineBreak') {\n // e.preventDefault();\n // document.execCommand('insertHTML', false, '\\n');\n\n // this.messageInputField.simulateInputEvent();\n // }\n\n // node.parentElement.replaceWith(node);\n // selection.removeAllRanges();\n // const range = new Range();\n // range.setStart(node, 0);\n // range.setEnd(node, node.nodeValue.length);\n // selection.addRange(range);\n // node.parentElement.classList.remove('input-filler');\n // node.parentElement\n }\n\n // document.execCommand('insertHTML', false, '\\n');\n // e.preventDefault();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // if(node?.nodeValue === BOM) {\n // addInputCallback(() => {\n // node.remove();\n // });\n // }\n // this.messageInputField.simulateInputEvent();\n\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n // });\n return;\n }\n\n if(node?.nodeValue === BOM) {\n // node.nodeValue = ''; // ! will move cursor forward\n // addInputCallback(() => {\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // });\n\n if(e.inputType === 'insertLineBreak') {\n if(offset === BOM.length) {\n selection.modify('move', 'backward', 'character');\n }\n\n // if(offset !== BOM.length) {\n // selection.modify('move', 'forward', 'character');\n // }\n\n addInputCallback(() => {\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n\n setTimeout(() => {\n selection.modify('move', 'forward', 'character');\n }, 0);\n });\n }\n\n // node.parentElement.replaceWith(node);\n\n // node.parentElement.replaceWith(node);\n if(e.inputType === 'insertLineBreak') {\n // const previousParentSibling = node.parentNode.previousSibling;\n // addInputCallback(() => {\n // if(previousParentSibling.nextSibling.nodeValue === '\\n') {\n // previousParentSibling.nextSibling.remove();\n\n // setTimeout(() => {\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // }, 0);\n // } else {\n // previousParentSibling.nextSibling.nodeValue = previousParentSibling.nextSibling.nodeValue.replace('\\n\\n', '\\n');\n // }\n // });\n } else {\n // if(node.parentElement !== this.messageInput) {\n // node.parentElement.replaceWith(node);\n // }\n\n // setTimeout(() => {\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // node.nodeValue = node.nodeValue.replace(BOM, '');\n // // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // }, 1000);\n\n addInputCallback(() => {\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n if(!node.nodeValue) {\n node.remove();\n }\n\n // selection.modify('move', 'forward', 'character');\n });\n }\n\n if(selection.isCollapsed && false) {\n node.parentElement.replaceWith(node);\n // const textNode = document.createTextNode(BOM);\n // (node.parentNode as any as ChildNode).after(textNode);\n // setCaretAt(textNode.nextSibling);\n // selection.modify('move', 'forward', 'character');\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n // selection.collapseToEnd();\n\n // addInputCallback(() => {\n // (textNode as CharacterData).deleteData(textNode.nodeValue.indexOf(BOM), BOM.length);\n // node.parentElement.remove();\n // });\n }\n } else if(e.inputType === 'insertLineBreak' &&\n node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n log('inserting line break');\n // const appendix = '\\x01';\n\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'inherit';\n });\n addInputCallback(() => {\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'false';\n });\n });\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // const offset = node.nodeValue.length;\n // (node as CharacterData).insertData(offset, appendix);\n // addInputCallback(() => {\n // selection.modify('move', 'forward', 'character');\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(appendix), appendix.length);\n // if(!node.nodeValue) {\n // node.remove();\n // }\n // });\n }\n } else if(e.inputType === 'historyUndo') { // have to remove extra BOMs\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.removeEmptyTextNodes(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n\n // lol\n // this.messageInput.querySelectorAll('.has-text').forEach((el) => {\n // if(el.textContent === BOM) {\n // el.firstElementChild.replaceWith(el.firstElementChild.firstChild);\n // el.classList.replace('input-filler3', 'input-filler');\n // }\n // });\n });\n } else if(e.inputType === 'historyRedo') {\n // if(node?.nodeValue === BOM && offset === BOM.length) {\n // selection.modify('move', 'backward', 'character');\n // }\n\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n\n // fix contenteditable attribute\n input.querySelectorAll('.input-something:not([contenteditable])').forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n });\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n\n // // have to ignore line up and down\n if(key === 'ArrowDown' || key === 'ArrowUp') {\n this.lastNode = this.lastOffset = undefined;\n } else {\n const {node, offset} = this.getCaretPosN();\n this.lastNode = node/* getFiller(node) */, this.lastOffset = offset;\n if(this.lastNode === this.input) {\n this.lastNode = this.lastOffset = undefined;\n }\n }\n\n this.log('keydown', this.lastNode, this.lastNode?.parentNode, this.lastOffset, this.getCaretPosN(), e);\n };\n\n private addInputCallback(input: HTMLElement, callback: () => void, capture = true) {\n const newCallback = () => {\n this.log('input modify callback');\n callback();\n };\n\n if(capture && IS_FIREFOX) this.inputCaptureCallbacks.push(newCallback);\n else this.listenerSetter.add(input)('input', newCallback, {once: true, capture});\n }\n\n public removeExtraBOMs(input: HTMLElement) {\n const c = (sibling: ChildNode) => {\n return (sibling as HTMLElement)?.classList?.contains('input-something');\n };\n\n input.querySelectorAll('.input-filler').forEach((el) => {\n const {previousSibling, nextSibling} = el;\n let needed = false;\n\n // if(!(previousSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(previousSibling)) {\n if(!(nextSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(nextSibling)) {\n needed = c(previousSibling) || c(nextSibling);\n }\n\n if(!needed) {\n this.log.warn('removing empty bom node', el);\n el.remove();\n }\n });\n }\n\n private getFiller(node: Node) {\n return node && node.nodeType === node.TEXT_NODE && node.parentElement !== this.input ? node.parentElement : node as HTMLElement;\n }\n\n private getCaretPosN() {\n const ret = getCaretPosNew(this.input);\n // const {node} = ret;\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // ret.node = node.previousSibling;\n // ret.offset = ret.node.textContent.length;\n // }\n\n return {...ret, move: this.move.bind(this, ret.selection)};\n }\n\n private removeEmptyTextNodes(input: HTMLElement) {\n const {log} = this;\n // let i = -1;\n // remove empty text nodes\n const treeWalker = document.createTreeWalker(\n input,\n NodeFilter.SHOW_TEXT,\n {acceptNode: (node) => node.parentElement === input && !node.nodeValue/* && !++i */ ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let textNode: Text;\n while(textNode = treeWalker.nextNode() as Text) {\n log.warn('removing empty text node', textNode);\n textNode.remove();\n }\n }\n\n private removePossibleBOMSiblings(previousSibling: ChildNode, nextSibling: ChildNode) {\n [previousSibling, nextSibling].forEach((sibling) => {\n if((sibling as HTMLElement)?.classList?.contains('input-filler')) {\n sibling.remove();\n }\n });\n }\n\n private removePossibleBOMSiblingsByNode(node: ChildNode) {\n const {previousSibling, nextSibling} = node;\n this.removePossibleBOMSiblings(previousSibling, nextSibling);\n };\n\n private processEmptiedFillers(input: HTMLElement) {\n input.querySelectorAll('.input-filler-text').forEach((el) => {\n this.removeExtraBOMs(el);\n\n let cleanSiblings = true;\n if(!el.textContent) {\n el.classList.replace('input-filler-text', 'input-filler');\n\n const textNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE);\n if(textNode) {\n (textNode as CharacterData).insertData(0, BOM);\n } else if(((el as any).t as ChildNode)?.nodeValue) {\n el.append((el as any).t);\n } else {\n el.append(document.createTextNode(BOM));\n }\n } else if(!NOT_ONLY_BOMS_REG_EXP.test(el.textContent) && !el.querySelector('.input-something')) {\n el.classList.replace('input-filler-text', 'input-filler');\n } else {\n cleanSiblings = false;\n }\n\n if(cleanSiblings) {\n this.removePossibleBOMSiblingsByNode(el);\n }\n });\n }\n\n private processFilledFillers(input: HTMLElement) {\n // remove the BOM when changing to text\n input.querySelectorAll('.input-filler').forEach((el) => {\n if(el.textContent !== BOM) {\n el.classList.replace('input-filler', 'input-filler-text');\n const t = (el as any).t as ChildNode;\n const bomNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE && node.nodeValue.includes(BOM));\n if(bomNode && !t?.nodeValue) {\n const idx = bomNode.nodeValue.indexOf(BOM);\n if(idx !== -1) {\n (bomNode as CharacterData).deleteData(idx, BOM.length);\n }\n }\n\n // t?.remove();\n }\n });\n }\n\n private setSelectionClassName(selection: Selection, input?: HTMLElement) {\n // Array.from(this.messageInput.querySelectorAll('.selection')).forEach((element) => {\n // element.classList.remove('selection');\n // });\n\n if(selection.rangeCount) {\n const range = selection.getRangeAt(0);\n\n if(input) {\n Array.from(input.querySelectorAll('.input-selectable')).forEach((element) => {\n element.classList.toggle('selection', !range.collapsed && range.intersectsNode(element));\n });\n } else {\n Array.from(document.querySelectorAll('.input-selectable.selection')).forEach((element) => element.classList.remove('selection'));\n }\n }\n }\n\n private move(selection: Selection, left: boolean) {\n const {focusNode: focusNodeBefore, focusOffset: focusOffsetBefore} = selection;\n selection.modify('extend', left ? 'backward' : 'forward', 'character');\n // if(offset === nodeValue.length) {\n // selection.modify('extend', !left ? 'backward' : 'forward', 'character');\n // }\n if(left) selection.collapseToStart();\n else selection.collapseToEnd();\n const {focusNode: focusNodeAfter, focusOffset: focusOffsetAfter} = selection;\n this.log(\n 'moving cursor',\n left,\n focusNodeBefore,\n focusNodeBefore.nodeType === focusNodeBefore.ELEMENT_NODE ? focusNodeBefore : focusNodeBefore.parentElement,\n focusOffsetBefore,\n focusNodeAfter,\n focusNodeAfter.nodeType === focusNodeAfter.ELEMENT_NODE ? focusNodeAfter : focusNodeAfter.parentElement,\n focusOffsetAfter\n );\n }\n\n public prepareApplyingMarkdown() {\n const {input} = this;\n\n // do not wrap fillers into spans\n const fillers = input.querySelectorAll('.input-filler');\n // fillers.forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n const smths = input.querySelectorAll('.input-something');\n smths.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n return () => {\n fillers.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n smths.forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n };\n }\n\n public static getInstance() {\n return this.INSTANCE ??= new RichInputHandler();\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 setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\r\n elem.setAttribute('dir', 'auto');\r\n if(typeof(html) === 'string') {\r\n if(!html) elem.textContent = '';\r\n else elem.innerHTML = html;\r\n } else {\r\n elem.replaceChildren(html);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\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 whichChild(elem: Node, countNonElements?: boolean) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n\r\n if(countNonElements) {\r\n return Array.from(elem.parentNode.childNodes).indexOf(elem as ChildNode);\r\n }\r\n\r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {attachClickEvent, detachClickEvent} 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\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\r\nimport findUpClassName from './dom/findUpClassName';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst KEEP_OPEN = false;\r\nconst TOGGLE_TIMEOUT = 200;\r\nconst ANIMATION_DURATION = 200;\r\n\r\nexport type IgnoreMouseOutType = 'click' | 'menu' | 'popup';\r\ntype DropdownHoverTimeoutType = 'toggle' | 'done';\r\n\r\nexport default class DropdownHover extends EventListenerBase<{\r\n open: () => Promise | void,\r\n openAfterLayout: () => void,\r\n opened: () => any,\r\n close: () => any,\r\n closed: () => any\r\n}> {\r\n protected element: HTMLElement;\r\n protected forceClose: boolean;\r\n protected inited: boolean;\r\n protected ignoreMouseOut: Set;\r\n protected ignoreButtons: Set;\r\n protected navigationItem: NavigationItem;\r\n protected ignoreOutClickClassName: string;\r\n protected timeouts: {[type in DropdownHoverTimeoutType]?: number};\r\n\r\n constructor(options: {\r\n element: DropdownHover['element'],\r\n ignoreOutClickClassName?: string\r\n }) {\r\n super(false);\r\n safeAssign(this, options);\r\n this.forceClose = false;\r\n this.inited = false;\r\n this.ignoreMouseOut = new Set();\r\n this.ignoreButtons = new Set();\r\n this.timeouts = {};\r\n }\r\n\r\n public attachButtonListener(\r\n button: HTMLElement,\r\n listenerSetter: ListenerSetter\r\n ) {\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 if(firstTime) {\r\n listenerSetter.add(button)('mouseout', (e) => {\r\n this.clearTimeout('toggle');\r\n this.onMouseOut(e);\r\n });\r\n firstTime = false;\r\n }\r\n\r\n this.setTimeout('toggle', () => {\r\n this.toggle(true);\r\n }, TOGGLE_TIMEOUT);\r\n });\r\n\r\n attachClickEvent(button, () => {\r\n const type: IgnoreMouseOutType = 'click';\r\n const ignore = !this.ignoreMouseOut.has(type);\r\n\r\n if(ignore && !this.ignoreMouseOut.size) {\r\n this.ignoreButtons.add(button);\r\n setTimeout(() => {\r\n attachClickEvent(window, this.onClickOut, {capture: true});\r\n }, 0);\r\n }\r\n\r\n this.setIgnoreMouseOut(type, ignore);\r\n this.toggle(ignore);\r\n }, {listenerSetter});\r\n }\r\n }\r\n\r\n protected onClickOut = (e: MouseEvent) => {\r\n const target = e.target as HTMLElement;\r\n if(\r\n !findUpAsChild(target, this.element) &&\r\n !Array.from(this.ignoreButtons).some((button) => findUpAsChild(target, button) || target === button) &&\r\n this.ignoreMouseOut.size <= 1 &&\r\n (!this.ignoreOutClickClassName || !findUpClassName(target, this.ignoreOutClickClassName))\r\n ) {\r\n this.toggle(false);\r\n }\r\n };\r\n\r\n protected onMouseOut = (e: MouseEvent) => {\r\n if(KEEP_OPEN || !this.isActive()) return;\r\n this.clearTimeout('toggle');\r\n\r\n if(this.ignoreMouseOut.size) {\r\n return;\r\n }\r\n\r\n const toElement = (e as any).toElement as HTMLElement;\r\n if(toElement && findUpAsChild(toElement, this.element)) {\r\n return;\r\n }\r\n\r\n this.setTimeout('toggle', () => {\r\n this.toggle(false);\r\n }, TOGGLE_TIMEOUT);\r\n };\r\n\r\n protected clearTimeout(type: DropdownHoverTimeoutType) {\r\n if(this.timeouts[type] !== undefined) {\r\n clearTimeout(this.timeouts[type]);\r\n delete this.timeouts[type];\r\n }\r\n }\r\n\r\n protected setTimeout(type: DropdownHoverTimeoutType, cb: () => void, timeout: number) {\r\n this.clearTimeout(type);\r\n this.timeouts[type] = window.setTimeout(() => {\r\n this.clearTimeout(type);\r\n cb();\r\n }, timeout);\r\n }\r\n\r\n public 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 this.clearTimeout('toggle');\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 const delay = IS_TOUCH_SUPPORTED || !rootScope.settings.animationsEnabled ? 0 : ANIMATION_DURATION;\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 this.dispatchEvent('openAfterLayout');\r\n\r\n appNavigationController.pushItem(this.navigationItem = {\r\n type: 'dropdown',\r\n onPop: () => {\r\n this.toggle(false);\r\n }\r\n });\r\n\r\n this.clearTimeout('toggle');\r\n this.setTimeout('done', () => {\r\n this.forceClose = false;\r\n this.dispatchEvent('opened');\r\n }, delay);\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 this.ignoreMouseOut.clear();\r\n this.ignoreButtons.clear();\r\n\r\n this.element.classList.remove('active');\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n detachClickEvent(window, this.onClickOut, {capture: true});\r\n\r\n this.clearTimeout('toggle');\r\n this.setTimeout('done', () => {\r\n this.element.style.display = 'none';\r\n this.forceClose = false;\r\n this.dispatchEvent('closed');\r\n }, delay);\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 public setIgnoreMouseOut(type: IgnoreMouseOutType, ignore: boolean) {\r\n ignore ? this.ignoreMouseOut.add(type) : this.ignoreMouseOut.delete(type);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\r\nimport {fastRafPromise} from './schedulers';\r\nimport {animateSingle, cancelAnimationByKey} from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\r\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\r\nexport type ScrollGetElementPositionCallback = (options: {elementRect: DOMRect, containerRect: DOMRect, elementPosition: number}) => number;\r\nexport type ScrollStartCallbackDimensions = {\r\n scrollSize: number,\r\n scrollPosition: number,\r\n distanceToEnd: number,\r\n path: number,\r\n duration: number,\r\n containerRect: DOMRect,\r\n elementRect: DOMRect,\r\n getProgress: () => number\r\n};\r\n\r\nexport type ScrollOptions = {\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin?: number,\r\n maxDistance?: number,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis?: 'x' | 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback,\r\n getElementPosition?: ScrollGetElementPositionCallback,\r\n fallbackToElementStartWhenCentering?: HTMLElement,\r\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void,\r\n transitionFunction?: (value: number) => number\r\n};\r\n\r\nexport default function fastSmoothScroll(options: ScrollOptions) {\r\n options.margin ??= 0;\r\n options.maxDistance ??= LONG_TRANSITION_MAX_DISTANCE;\r\n options.axis ??= 'y';\r\n // return;\r\n\r\n if(!rootScope.settings.animationsEnabled || options.forceDuration === 0) {\r\n options.forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(options.forceDirection === FocusDirection.Static) {\r\n options.forceDuration = 0;\r\n return scrollWithJs(options);\r\n /* return Promise.resolve();\r\n\r\n element.scrollIntoView({ block: position });\r\n\r\n cancelAnimationByKey(container);\r\n return Promise.resolve(); */\r\n }\r\n\r\n const promise = fastRafPromise().then(() => scrollWithJs(options));\r\n\r\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(options: ScrollOptions): Promise {\r\n const {element, container, getNormalSize, getElementPosition, transitionFunction, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n\r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const elementScrollSizeKey = axis === 'y' ? 'scrollHeight' : 'offsetWidth'; // can use offsetWidth for X, since it's almost same as scrollWidth\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n // const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n // const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const possibleElementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementPosition = getElementPosition ? getElementPosition({elementRect, containerRect, elementPosition: possibleElementPosition}) : possibleElementPosition;\r\n const elementSize = element[elementScrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n let scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n /* const elementPosition = element.offsetTop;\r\n const elementSize = element.offsetHeight;\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n const containerSize = container.offsetHeight; */\r\n\r\n let path!: number;\r\n\r\n switch(position) {\r\n case 'start':\r\n path = elementPosition - margin;\r\n break;\r\n case 'end':\r\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n if(elementSize < containerSize) {\r\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\r\n } else {\r\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\r\n options.element = options.fallbackToElementStartWhenCentering;\r\n options.position = 'start';\r\n return scrollWithJs(options);\r\n }\r\n\r\n path = elementPosition - margin;\r\n }\r\n\r\n break;\r\n }\r\n /* switch (position) {\r\n case 'start':\r\n path = (elementPosition - margin) - scrollPosition;\r\n break;\r\n case 'end':\r\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\r\n : (elementPosition - margin) - scrollPosition;\r\n break;\r\n } */\r\n\r\n if(Math.abs(path - (margin || 0)) < 1) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n\r\n if(axis === 'y') {\r\n if(forceDirection === undefined) {\r\n if(path > maxDistance) {\r\n scrollPosition = container.scrollTop += path - maxDistance;\r\n path = maxDistance;\r\n } else if(path < -maxDistance) {\r\n scrollPosition = container.scrollTop += path + maxDistance;\r\n path = -maxDistance;\r\n }\r\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\r\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\r\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\r\n } */\r\n }\r\n\r\n // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n\r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const transition = transitionFunction ?? (absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition);\r\n const getProgress = () => duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const tick = () => {\r\n const t = getProgress();\r\n const value = transition(t);\r\n const currentPath = path * (1 - value);\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n\r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n\r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n\r\n }); */\r\n\r\n if(options.startCallback) {\r\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\r\n options.startCallback({\r\n scrollSize,\r\n scrollPosition,\r\n distanceToEnd,\r\n path,\r\n duration,\r\n containerRect,\r\n elementRect,\r\n getProgress\r\n });\r\n }\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction longTransition(t: number) {\r\n return 1 - ((1 - t) ** 5);\r\n}\r\n\r\nfunction shortTransition(t: number) {\r\n return 1 - ((1 - t) ** 3.5);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\r\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string,\r\n downloadId: 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 + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n // console.log('getFileURL', location);\r\n // const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return /* '/' + */type + '/' + encoded;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, MessageAction} from '../layer';\nimport type {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport forEachReverse from './array/forEachReverse';\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {i18n, LangPackKey} from '../lib/langPack';\n\nexport default function formatBytes(bytes: number, decimals: number | 'auto' = 'auto') {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const strictDecimals = decimals === 'auto';\n\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const _decimals = decimals === 'auto' ? Math.max(0, i - 1) : decimals;\n\n const dm = Math.max(0, _decimals);\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const fixed = (bytes / Math.pow(k, i)).toFixed(dm);\n return i18n(sizes[i], [strictDecimals ? fixed : parseFloat(fixed)]);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\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 mm: 'Months',\r\n y: 'Years'\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' | 'mm' | 'y';\r\nexport default function formatDuration(duration: number, showLast = 2) {\r\n if(!duration) {\r\n duration = 1;\r\n }\r\n\r\n const 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 = Math.round(t * o.m);\r\n\r\n if(duration < t) {\r\n return;\r\n }\r\n\r\n let dd = duration / t;\r\n if(idx !== (p.length - 1)) {\r\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\r\n dd %= modulus;\r\n }\r\n\r\n d.push({\r\n duration: dd | 0,\r\n type: o.t\r\n });\r\n });\r\n\r\n const out = d.slice(-showLast).reverse();\r\n for(let i = out.length - 1; i >= 0; --i) {\r\n if(out[i].duration === 0) {\r\n out.splice(i, 1);\r\n }\r\n }\r\n\r\n return out;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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 const 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 type {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type FramesCacheMap = Map;\nexport type FramesCacheMapNew = Map;\nexport type FramesCacheMapURLs = Map;\nexport type FramesCacheItem = {\n frames: FramesCacheMap,\n framesNew: FramesCacheMapNew,\n framesURLs: FramesCacheMapURLs,\n clearCache: () => void,\n counter: number\n};\n\nexport class FramesCache {\n private cache: Map;\n\n constructor() {\n this.cache = new Map();\n }\n\n public static createCache(): FramesCacheItem {\n const cache: FramesCacheItem = {\n frames: new Map(),\n framesNew: new Map(),\n framesURLs: new Map(),\n clearCache: () => {\n cache.framesNew.forEach((value) => {\n (value as ImageBitmap).close?.();\n });\n\n cache.frames.clear();\n cache.framesNew.clear();\n cache.framesURLs.clear();\n },\n counter: 0\n };\n\n return cache;\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = FramesCache.createCache());\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name,\n width,\n height,\n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst framesCache = new FramesCache();\n\nexport default framesCache;\n","/*\r\n * https://github.com/morethanwords/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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize} from '../layer';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\nimport getPreviewURLFromThumb from './getPreviewURLFromThumb';\nimport blur from './blur';\n\nexport default function getImageFromStrippedThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, useBlur: boolean) {\n const url = getPreviewURLFromThumb(photo, thumb, false);\n\n let element: HTMLImageElement | HTMLCanvasElement, loadPromise: Promise;\n if(!useBlur) {\n element = new Image();\n loadPromise = renderImageFromUrlPromise(element, url);\n } else {\n const result = blur(url);\n element = result.canvas;\n loadPromise = result.promise;\n }\n\n element.classList.add('thumbnail');\n\n return {image: element, loadPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {PhotoSize} from '../layer';\n// import appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport getPreviewURLFromBytes from './bytes/getPreviewURLFromBytes';\n\nexport default function getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n // const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n // return cacheContext.url || (cacheContext.url = getPreviewURLFromBytes(thumb.bytes, isSticker));\n return getPreviewURLFromBytes(thumb.bytes, isSticker);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../lib/mtproto/mtproto_config';\nimport type {ThumbCache} from '../lib/storages/thumbs';\nimport getImageFromStrippedThumb from './getImageFromStrippedThumb';\n\nexport default function getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false) {\n const isVideo = (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type);\n if(!cacheContext.downloaded || isVideo || ignoreCache) {\n if(\n photo._ === 'document' &&\n cacheContext.downloaded &&\n !ignoreCache &&\n (!isVideo || cacheContext.type !== THUMB_TYPE_FULL)\n ) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find((size) => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from './array/forEachReverse';\nimport safeAssign from './object/safeAssign';\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T | Promise;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n\n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n /* public filter(callback: (item: T, idx: number, arr: T[]) => boolean) {\n const filter = (item: T, idx: number, arr: T[]) => {\n if(!callback(item, idx, arr)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n } */\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.setLoaded(true, loadedAll);\n this.setLoaded(false, loadedAll);\n }\n\n public go(length: number, dispatchJump = true) {\n let items: T[], item: T;\n if(length > 0) {\n items = this.next.splice(0, length);\n item = items.pop();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.unshift(this.current);\n this.previous.push(...items);\n } else {\n items = this.previous.splice(Math.max(0, this.previous.length + length), -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.push(this.current);\n this.next.unshift(...items);\n }\n\n if(this.next.length < this.loadWhenLeft) {\n this.load(!this.reverse);\n }\n\n if(this.previous.length < this.loadWhenLeft) {\n this.load(this.reverse);\n }\n\n this.current = item;\n dispatchJump && this.onJump && this.onJump(item, length > 0);\n return this.current;\n }\n\n protected unsetCurrent(toPrevious: boolean) {\n if(toPrevious) this.previous.push(this.current);\n else this.next.unshift(this.current);\n\n this.current = undefined;\n }\n\n public goUnsafe(length: number, dispatchJump?: boolean) {\n const leftLength = length > 0 ? Math.max(0, length - this.next.length) : Math.min(0, length + this.previous.length);\n const item = this.go(length, leftLength ? false : dispatchJump);\n\n /* if(length > 0 ? this.loadedAllUp : this.loadedAllDown) {\n this.unsetCurrent(length > 0);\n } */\n\n return {\n item: !leftLength ? item : undefined,\n leftLength\n };\n }\n\n protected setLoaded(down: boolean, value: boolean) {\n const isChanged = (down ? this.loadedAllDown : this.loadedAllUp) !== value;\n if(!isChanged) {\n return false;\n }\n\n if(down) this.loadedAllDown = value;\n else this.loadedAllUp = value;\n\n if(!value) {\n if(down) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n }\n\n return true;\n }\n\n // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older ? this.loadedAllDown : this.loadedAllUp) return Promise.resolve();\n\n let promise = older ? this.loadPromiseDown : this.loadPromiseUp;\n if(promise) return promise;\n\n let anchor: T;\n if(older) {\n anchor = this.reverse ? this.previous[0] : this.next[this.next.length - 1];\n } else {\n anchor = this.reverse ? this.next[this.next.length - 1] : this.previous[0];\n }\n\n anchor ??= this.current;\n promise = this.loadMore(anchor, older, this.loadCount).then(async(result) => {\n if((older ? this.loadPromiseDown : this.loadPromiseUp) !== promise) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n this.setLoaded(older, true);\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const processedArr: (Promise | any)[] = [];\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n processedArr.push(processed);\n });\n\n const results = await Promise.all(processedArr);\n if(older) {\n if(this.reverse) this.previous.unshift(...results);\n else this.next.push(...results);\n } else {\n if(this.reverse) this.next.push(...results);\n else this.previous.unshift(...results);\n }\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type EventListenerBase from './eventListenerBase';\r\n\r\nexport type Listener = {\r\n element: ListenerElement,\r\n event: ListenerEvent,\r\n callback: ListenerCallback,\r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set = new Set();\r\n\r\n public add(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual(\r\n element: T,\r\n event: ListenerEvent,\r\n callback: ListenerCallback,\r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element &&\r\n _listener.event === event &&\r\n _listener.callback === callback &&\r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach((listener) => {\r\n this.remove(listener);\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport calcImageInBox from './calcImageInBox';\n\nexport class MediaSize {\n constructor(public width = 0, public height = width) {\n\n }\n\n public aspect(boxSize: MediaSize, fitted: boolean) {\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\n }\n\n public aspectFitted(boxSize: MediaSize) {\n return this.aspect(boxSize, true);\n }\n\n public aspectCovered(boxSize: MediaSize) {\n return this.aspect(boxSize, false);\n }\n}\n\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\n return new MediaSize(width, height);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport EventListenerBase from './eventListenerBase';\r\nimport {makeMediaSize, MediaSize} from './mediaSize';\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize,\r\n documentName: MediaSize,\r\n invoice: MediaSize,\r\n extendedInvoice: MediaSize,\r\n customEmoji: MediaSize,\r\n esgCustomEmoji: MediaSize,\r\n emojiStatus: MediaSize,\r\n popupSticker: MediaSize\r\n};\r\n\r\nexport type MediaSizeType = keyof MediaTypeSizes;\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nconst CUSTOM_EMOJI_SIZE = makeMediaSize(20, 20);\r\nconst ESG_CUSTOM_EMOJI_SIZE = makeMediaSize(36, 36);\r\nconst EMOJI_STATUS_SIZE = makeMediaSize(18, 18);\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200),\r\n documentName: makeMediaSize(200, 0),\r\n invoice: makeMediaSize(270, 270),\r\n extendedInvoice: makeMediaSize(270, 270),\r\n customEmoji: CUSTOM_EMOJI_SIZE,\r\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\r\n emojiStatus: EMOJI_STATUS_SIZE,\r\n popupSticker: makeMediaSize(68, 68)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(72, 72),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280),\r\n documentName: makeMediaSize(240, 0),\r\n invoice: makeMediaSize(320, 320),\r\n extendedInvoice: makeMediaSize(420, 340),\r\n customEmoji: CUSTOM_EMOJI_SIZE,\r\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\r\n emojiStatus: EMOJI_STATUS_SIZE,\r\n popupSticker: makeMediaSize(80, 80)\r\n }\r\n };\r\n\r\n public isMobile = false;\r\n public active: MediaTypeSizes;\r\n public activeScreen: ScreenSize;\r\n private rAF: number;\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('resize', () => {\r\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\r\n this.rAF = window.requestAnimationFrame(() => {\r\n this.handleResize();\r\n this.rAF = 0;\r\n });\r\n });\r\n this.handleResize();\r\n }\r\n\r\n private handleResize = () => {\r\n const innerWidth = window.innerWidth;\r\n // this.isMobile = innerWidth <= 720;\r\n\r\n let activeScreen = this.screenSizes[0].key;\r\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\r\n if(this.screenSizes[i].value < innerWidth) {\r\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\r\n break;\r\n }\r\n }\r\n\r\n const wasScreen = this.activeScreen;\r\n this.activeScreen = activeScreen;\r\n this.isMobile = this.activeScreen === ScreenSize.mobile;\r\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\r\n\r\n // console.time('esg');\r\n // const computedStyle = window.getComputedStyle(document.documentElement);\r\n // this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\r\n // console.timeEnd('esg');\r\n\r\n if(wasScreen !== activeScreen) {\r\n // console.log('changeScreen', this.activeScreen, activeScreen);\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\r\n }\r\n }\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('resize');\r\n }\r\n\r\n /* if(this.isMobile) {\r\n for(let i in this.active) {\r\n // @ts-ignore\r\n let size = this.active[i];\r\n size.width = innerWidth\r\n }\r\n } */\r\n };\r\n}\r\n\r\nconst mediaSizes = new MediaSizes();\r\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\r\nexport default mediaSizes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport indexOfAndSplice from './array/indexOfAndSplice';\r\nimport makeError from './makeError';\r\n\r\nexport type Middleware = {\r\n (): boolean;\r\n create(): MiddlewareHelper;\r\n onClean: (callback: VoidFunction) => void;\r\n onDestroy: (callback: VoidFunction) => void;\r\n};\r\n\r\nconst createDetails = (): {\r\n cleaned?: boolean,\r\n inner: MiddlewareHelper[],\r\n onCleanCallbacks: VoidFunction[]\r\n} => ({\r\n cleaned: false,\r\n inner: [],\r\n onCleanCallbacks: []\r\n});\r\n\r\nconst MIDDLEWARE_ERROR = makeError('MIDDLEWARE');\r\n\r\n// * onClean == cancel promises, etc\r\n// * onDestroy == destructor\r\nexport class MiddlewareHelper {\r\n private details = createDetails();\r\n private onDestroyCallbacks: VoidFunction[] = [];\r\n private parent: MiddlewareHelper;\r\n private destroyed: boolean;\r\n\r\n public clean() {\r\n const details = this.details;\r\n details.cleaned = true;\r\n details.inner.splice(0, details.inner.length).forEach((helper) => helper.destroy());\r\n details.onCleanCallbacks.splice(0, details.onCleanCallbacks.length).forEach((callback) => callback());\r\n this.details = createDetails();\r\n }\r\n\r\n public destroy() {\r\n this.destroyed = true;\r\n this.clean();\r\n this.onDestroyCallbacks.splice(0, this.onDestroyCallbacks.length).forEach((callback) => callback());\r\n\r\n if(this.parent) {\r\n indexOfAndSplice(this.parent.details.inner, this);\r\n this.parent = undefined;\r\n }\r\n }\r\n\r\n public get(additionalCallback?: () => boolean) {\r\n const details = this.details;\r\n\r\n const middleware: Middleware = () => {\r\n return !details.cleaned && (!additionalCallback || additionalCallback());\r\n };\r\n\r\n middleware.create = () => {\r\n if(!middleware()) throw MIDDLEWARE_ERROR;\r\n const helper = new MiddlewareHelper();\r\n helper.parent = this;\r\n details.inner.push(helper);\r\n return helper;\r\n };\r\n\r\n middleware.onClean = (callback) => {\r\n if(!middleware()) return callback();\r\n details.onCleanCallbacks.push(callback);\r\n };\r\n\r\n middleware.onDestroy = this.onDestroy;\r\n\r\n return middleware;\r\n }\r\n\r\n public onDestroy = (callback: VoidFunction) => {\r\n if(this.destroyed) return callback();\r\n this.onDestroyCallbacks.push(callback);\r\n };\r\n}\r\n\r\n// * will change .cleaned and new instance will be created\r\nexport function getMiddleware() {\r\n return new MiddlewareHelper();\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 makeError from './makeError';\n\nconst error = makeError('MIDDLEWARE');\nexport default function middlewarePromise(middleware: () => boolean, throwWhat: any = error) {\n return (promise: T): T => {\n if(!(promise instanceof Promise)) {\n if(promise instanceof Error) {\n throw promise;\n } else {\n return promise;\n }\n }\n\n return (promise as any as Promise).then((result) => {\n if(!middleware()) {\n throw throwWhat;\n }\n\n return result;\n }) as any;\n };\n}\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\n}\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","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","import {IS_APPLE_MOBILE} from '../environment/userAgent';\n\nexport default function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\n return new Promise((resolve, reject) => {\n if(media.readyState >= readyState) {\n resolve();\n return;\n }\n\n const loadEventName = IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay';\n const errorEventName = 'error';\n const onLoad = () => {\n media.removeEventListener(errorEventName, onError);\n resolve();\n };\n const onError = (e: ErrorEvent) => {\n media.removeEventListener(loadEventName, onLoad);\n reject(e);\n };\n media.addEventListener(loadEventName, onLoad, {once: true});\n media.addEventListener(errorEventName, onError, {once: true});\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport cancelEvent from './dom/cancelEvent';\nimport {CLICK_EVENT_NAME} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\n\nexport default class OverlayClickHandler extends EventListenerBase<{\n toggle: (open: boolean) => void\n}> {\n protected element: HTMLElement;\n protected overlay: HTMLElement;\n protected listenerOptions: AddEventListenerOptions;\n\n constructor(\n protected navigationType: NavigationItem['type'],\n protected withOverlay?: boolean\n ) {\n super(false);\n this.listenerOptions = withOverlay ? {} : {capture: true};\n }\n\n protected onClick = (e: MouseEvent | TouchEvent) => {\n if(this.element && findUpAsChild(e.target as HTMLElement, this.element)) {\n return;\n }\n\n if(this.listenerOptions?.capture) {\n cancelEvent(e);\n }\n\n this.close();\n };\n\n public close() {\n if(this.element) {\n this.overlay?.remove();\n this.element = undefined;\n this.dispatchEvent('toggle', false);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.removeEventListener('keydown', onKeyDown, {capture: true});\n window.removeEventListener('contextmenu', this.onClick, this.listenerOptions);\n }\n\n document.removeEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n public open(element: HTMLElement) {\n this.close();\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.close();\n }\n });\n }\n\n this.element = element;\n\n if(!this.overlay && this.withOverlay) {\n this.overlay = document.createElement('div');\n this.overlay.classList.add('btn-menu-overlay');\n\n // ! because this event must be canceled, and can't cancel on menu click (below)\n this.overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n this.onClick(e);\n });\n }\n\n this.overlay && this.element.parentElement.insertBefore(this.overlay, this.element);\n\n // document.body.classList.add('disable-hover');\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.addEventListener('keydown', onKeyDown, {capture: true});\n window.addEventListener('contextmenu', this.onClick, {...this.listenerOptions, once: true});\n }\n\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n }); */\n\n // ! safari iOS doesn't handle window click event on overlay, idk why\n document.addEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n this.dispatchEvent('toggle', true);\n }\n}\n","import Currencies from '../config/currencies';\n\n// https://stackoverflow.com/a/34141813\nfunction number_format(number: any, decimals: any, dec_point: any, thousands_sep: any): string {\n // Strip all characters but numerical ones.\n number = (number + '').replace(/[^0-9+\\-Ee.]/g, '');\n var n = !isFinite(+number) ? 0 : +number,\n prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),\n sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,\n dec = (typeof dec_point === 'undefined') ? '.' : dec_point,\n s: any = '',\n toFixedFix = function(n: number, prec: number) {\n var k = Math.pow(10, prec);\n return '' + Math.round(n * k) / k;\n };\n // Fix for IE parseFloat(0.55).toFixed(0) = 0;\n s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');\n if(s[0].length > 3) {\n s[0] = s[0].replace(/\\B(?=(?:\\d{3})+(?!\\d))/g, sep);\n }\n if((s[1] || '').length < prec) {\n s[1] = s[1] || '';\n s[1] += new Array(prec - s[1].length + 1).join('0');\n }\n return s.join(dec);\n}\n\nexport default function paymentsWrapCurrencyAmount(amount: number | string, currency: string, skipSymbol?: boolean) {\n amount = +amount;\n\n const isNegative = amount < 0;\n\n const currencyData = Currencies[currency];\n if(!currencyData) {\n throw new Error('CURRENCY_WRAP_INVALID');\n }\n\n const amountExp = amount / Math.pow(10, currencyData.exp);\n\n let decimals = currencyData.exp;\n if(currency == 'IRR' && Math.floor(amountExp) == amountExp) {\n decimals = 0; // у иранцев копейки почти всегда = 0 и не показываются в UI\n }\n\n let formatted = number_format(amountExp, decimals, currencyData.decimal_sep, currencyData.thousands_sep);\n if(skipSymbol) {\n return formatted;\n }\n\n let symbol = currencyData.symbol;\n if(isNegative && !currencyData.space_between && currencyData.symbol_left) {\n symbol = '-' + symbol;\n formatted = formatted.replace('-', '');\n }\n\n let out: string;\n const splitter = currencyData.space_between ? ' ' : '';\n if(currencyData.symbol_left) {\n out = symbol + splitter + formatted;\n } else {\n out = formatted + splitter + symbol;\n }\n return out;\n}\n\n(window as any).p = paymentsWrapCurrencyAmount;\n\n// function paymentsGetCurrencyExp($currency: string) {\n// if($currency == 'CLF') {\n// return 4;\n// }\n// if(['BHD','IQD','JOD','KWD','LYD','OMR','TND'].includes($currency)) {\n// return 3;\n// }\n// if(['BIF','BYR','CLP','CVE','DJF','GNF','ISK','JPY','KMF','KRW','MGA', 'PYG','RWF','UGX','UYI','VND','VUV','XAF','XOF','XPF'].includes($currency)) {\n// return 0;\n// }\n// if($currency == 'MRO') {\n// return 1;\n// }\n// return 2;\n// }\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from './mediaSizes';\n\nexport type MenuPositionPadding = {\n top?: number,\n right?: number,\n bottom?: number,\n left?: number\n};\n\nconst PADDING_TOP = 8;\nconst PADDING_BOTTOM = PADDING_TOP;\nconst PADDING_LEFT = 8;\nconst PADDING_RIGHT = PADDING_LEFT;\nexport default function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\n // let {clientX, clientY} = e;\n\n // * side mean the OPEN side\n\n const getScrollWidthFromElement = (Array.from(elem.children) as HTMLElement[]).find((element) => element.classList.contains('btn-menu-item') && !element.classList.contains('hide')) || elem;\n\n const {scrollWidth: menuWidth} = getScrollWidthFromElement;\n const {scrollHeight: menuHeight} = elem;\n // let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\n const rect = document.body.getBoundingClientRect();\n const windowWidth = rect.width;\n const windowHeight = rect.height;\n\n let paddingTop = PADDING_TOP, paddingRight = PADDING_RIGHT, paddingBottom = PADDING_BOTTOM, paddingLeft = PADDING_LEFT;\n if(additionalPadding) {\n if(additionalPadding.top) paddingTop += additionalPadding.top;\n if(additionalPadding.right) paddingRight += additionalPadding.right;\n if(additionalPadding.bottom) paddingBottom += additionalPadding.bottom;\n if(additionalPadding.left) paddingLeft += additionalPadding.left;\n }\n\n side = mediaSizes.isMobile ? 'right' : 'left';\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\n\n const maxTop = windowHeight - menuHeight - paddingBottom;\n const maxLeft = windowWidth - menuWidth - paddingRight;\n const minTop = paddingTop;\n const minLeft = paddingLeft;\n\n const getSides = () => {\n return {\n x: {\n left: pageX,\n right: Math.min(maxLeft, pageX - menuWidth)\n },\n intermediateX: side === 'right' ? minLeft : maxLeft,\n // intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n y: {\n top: pageY,\n bottom: pageY - menuHeight\n },\n // intermediateY: verticalSide === 'top' ? paddingTop : windowHeight - menuHeight - paddingTop,\n // intermediateY: pageY < (windowHeight / 2) ? paddingTop : windowHeight - menuHeight - paddingBottom,\n intermediateY: maxTop\n };\n };\n\n const sides = getSides();\n\n const possibleSides = {\n x: {\n left: (sides.x.left + menuWidth + paddingRight) <= windowWidth,\n right: sides.x.right >= paddingLeft\n },\n y: {\n top: (sides.y.top + menuHeight + paddingBottom) <= windowHeight,\n bottom: (sides.y.bottom - paddingBottom) >= paddingBottom\n }\n };\n\n /* if(side === undefined) {\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\n side = 'right';\n }\n } */\n\n {\n /* const x = sides.x;\n\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\n if(side) {\n s.findAndSplice((s) => s === side);\n s.unshift(side);\n }\n\n const possibleSide = s.find((s) => possibleSides.x[s]); */\n // let left: number;\n /* if(possibleSide) {\n left = x[possibleSide];\n side = possibleSide;\n } else {\n left = sides.intermediateX;\n side = undefined;\n } */\n const left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\n\n elem.style.left = left + 'px';\n }\n\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\n verticalSide = 'bottom';\n } else {\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\n verticalSide = 'top';\n } */\n\n {\n const top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\n\n elem.style.top = top + 'px';\n }\n\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\n elem.classList.add(\n // (verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\n (verticalSide === 'center' ? verticalSide : 'bottom') +\n '-' +\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\n\n return {\n width: menuWidth,\n height: menuHeight\n };\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport rootScope from '../lib/rootScope';\n\nconst savingLottiePreview: {[docId: DocId]: {width: number, height: number}} = {};\n\nexport function isSavingLottiePreview(doc: MyDocument, toneIndex: number, width: number, height: number) {\n const key = doc.id + '-' + toneIndex;\n const saving = savingLottiePreview[key];\n return saving && saving.width >= width && saving.height >= height;\n}\n\nexport async function saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n const {width, height} = canvas;\n if(isSavingLottiePreview(doc, toneIndex, width, height)) {\n return;\n }\n\n const saving = savingLottiePreview[key] = {\n width,\n height\n };\n\n const thumb = await rootScope.managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex);\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n const promise = new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob));\n });\n\n const blob = await promise;\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n // console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n rootScope.managers.appDocsManager.saveLottiePreview(doc.id, blob, width, height, toneIndex);\n\n // delete savingLottiePreview[key];\n\n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice((t) => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n}\n","// * 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","/*\r\n * https://github.com/morethanwords/tweb\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 type {MediaSearchContext} from '../components/appMediaPlaybackController';\nimport type {SearchSuperContext} from '../components/appSearchSuper.';\nimport type {Message} from '../layer';\nimport type {MessagesStorageKey, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport incrementMessageId from '../lib/appManagers/utils/messageId/incrementMessageId';\nimport rootScope from '../lib/rootScope';\nimport forEachReverse from './array/forEachReverse';\nimport filterChatPhotosMessages from './filterChatPhotosMessages';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class SearchListLoader extends ListLoader {\n public searchContext: MediaSearchContext;\n public onEmptied: () => void;\n\n private otherSideLoader: SearchListLoader;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {\n onEmptied?: () => void,\n isInner?: boolean,\n managers?: AppManagers\n } = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = anchor?.mid;\n\n if(maxId === undefined) maxId = this.searchContext.maxId;\n if(!older) maxId = incrementMessageId(maxId, 1);\n\n return this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then((value) => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: async(message) => {\n const filtered = await this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n this.managers ??= rootScope.managers;\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n\n if(!options.isInner) {\n this.otherSideLoader = new SearchListLoader({\n ...options,\n isInner: true\n });\n\n // this.otherSideLoader.onLoadedMore = () => {\n\n // };\n }\n }\n\n protected async filterMids(mids: number[]) {\n const storageKey: MessagesStorageKey = `${this.searchContext.peerId}_${this.searchContext.isScheduled ? 'scheduled' : 'history'}`;\n const filtered = (await this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._, mids, storageKey, mids.length)) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n this.current = undefined;\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = async(message: Message.message | Message.messageService) => {\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 if(message.peerId !== this.searchContext.peerId) {\n return;\n }\n\n const filtered = await this.filterMids([message.mid]);\n const targets = (await Promise.all(filtered.map((message) => this.processItem(message)))).filter(Boolean);\n if(targets.length) {\n /* const {previous, current, next} = this;\n const targets = previous.concat(current, next);\n const currentIdx = targets.length;\n const mid = targets[0].mid;\n let i = 0, length = targets.length;\n for(; i < length; ++i) {\n const target = targets[i];\n if(!target || mid < target.mid) {\n break;\n }\n }\n\n if(i < currentIdx) previous.push(...targets);\n else next. */\n\n if(!this.current) {\n this.previous.push(...targets);\n } else {\n this.next.push(...targets);\n }\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend(message);\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(withOtherSide?: boolean) {\n let previous = this.previous;\n\n if(this.otherSideLoader && withOtherSide) {\n previous = previous.concat(this.otherSideLoader.previous);\n }\n\n return previous;\n }\n\n public getNext(withOtherSide?: boolean) {\n let next = this.next;\n\n if(this.otherSideLoader && withOtherSide) {\n next = next.concat(this.otherSideLoader.next);\n }\n\n return next;\n }\n\n public getCurrent() {\n return this.current || this.otherSideLoader?.current;\n }\n\n private goToOtherEnd(length: number) {\n if(length > 0) return this.go(-this.previous.length);\n else return this.go(this.next.length);\n }\n\n public goRound(length: number, dispatchJump?: boolean) {\n let ret: ReturnType['goUnsafe']>;\n\n if(this.otherSideLoader?.current) {\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n if(ret.item) {\n return ret.item;\n }\n\n length = ret.leftLength;\n if(!(length > 0 ? this.otherSideLoader.next : this.otherSideLoader.previous).length) {\n const loaded = length > 0 ? this.otherSideLoader.loadedAllUp : this.otherSideLoader.loadedAllDown;\n if(!loaded) { // do not reset anything until it's loaded\n return;\n }\n\n // if other side is loaded too will start from its begin\n if((length > 0 && (this.otherSideLoader.searchContext.maxId === 1 || this.otherSideLoader.loadedAllDown)) ||\n (length < 0 && (this.otherSideLoader.searchContext.maxId === 0 || this.otherSideLoader.loadedAllUp))) {\n return this.otherSideLoader.goToOtherEnd(length);\n }\n\n this.otherSideLoader.unsetCurrent(length > 0);\n }\n }\n\n ret = this.goUnsafe(length, dispatchJump);\n if(!ret.item) {\n if(this.loadedAllUp && this.loadedAllDown) { // just use the same loader if the list is too short\n return this.goToOtherEnd(length);\n } else if(this.otherSideLoader) {\n length = ret.leftLength;\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n\n if(ret.item) {\n this.unsetCurrent(length > 0);\n }\n }\n }\n\n return ret?.item;\n }\n\n // public setTargets(previous: Item[], next: Item[], reverse: boolean) {\n // super.setTargets(previous, next, reverse);\n // }\n\n protected setLoaded(down: boolean, value: boolean) {\n const changed = super.setLoaded(down, value);\n\n if(changed &&\n this.otherSideLoader &&\n value &&\n this.searchContext?.useSearch !== false/* &&\n (this.reverse ? this.loadedAllUp : this.loadedAllDown) */) {\n const reverse = this.loadedAllUp;\n this.otherSideLoader.setSearchContext({\n ...this.searchContext,\n maxId: reverse ? 1 : 0\n });\n\n // these 'reverse' are different, not a mistake here.\n this.otherSideLoader.reverse = this.reverse;\n this.otherSideLoader.setLoaded(reverse, true);\n this.otherSideLoader.load(!reverse);\n }\n\n return changed;\n }\n\n public cleanup() {\n this.reset();\n rootScope.removeEventListener('history_delete', this.onHistoryDelete);\n rootScope.removeEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.removeEventListener('message_sent', this.onMessageSent);\n this.onEmptied = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.cleanup();\n this.otherSideLoader = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport generateMessageId from './generateMessageId';\nimport getServerMessageId from './getServerMessageId';\n\nexport default function incrementMessageId(messageId: number, increment: number) {\n return generateMessageId(getServerMessageId(messageId) + increment);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\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 {PhotoSize, WebDocument} from '../layer';\nimport {REPLIES_HIDDEN_CHANNEL_ID} from '../lib/mtproto/mtproto_config';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {MediaSize, makeMediaSize} from './mediaSize';\nimport isWebDocument from '../lib/appManagers/utils/webDocs/isWebDocument';\n\nexport default function setAttachmentSize(\n photo: MyPhoto | MyDocument | WebDocument,\n element: HTMLElement | SVGForeignObjectElement,\n boxWidth: number,\n boxHeight: number,\n noZoom = true,\n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n) {\n const _isWebDocument = isWebDocument(photo);\n // if(_isWebDocument && pushDocumentSize === undefined) {\n // pushDocumentSize = true;\n // }\n\n if(!photoSize) {\n photoSize = choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n // console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n\n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument || _isWebDocument) {\n size = makeMediaSize(photo.w || (photoSize as PhotoSize.photoSize).w || 512, photo.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.type) || _isWebDocument) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n\n if(message &&\n (message.message ||\n message.reply_to_mid ||\n message.media.webpage ||\n (message.replies && message.replies.pFlags.comments && message.replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n\n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n\n return {photoSize, size, isFit};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger} from '../lib/logger';\nimport insertInDescendSortedArray from './array/insertInDescendSortedArray';\nimport {getMiddleware, MiddlewareHelper} from './middleware';\nimport middlewarePromise from './middlewarePromise';\nimport safeAssign from './object/safeAssign';\nimport pause from './schedulers/pause';\n\nexport type SortedElementId = PeerId;\nexport type SortedElementBase = {\n id: SortedElementId,\n index: number\n};\n\nlet id = 0;\n\nexport class BatchProcessor {\n protected queue: Promise[];\n protected promise: Promise;\n\n protected middlewareHelper: MiddlewareHelper;\n protected log: ReturnType;\n\n protected process: (batch: Item[], m: ReturnType, log: BatchProcessor['log']) => Promise;\n protected possibleError: any;\n\n constructor(options: {\n log?: BatchProcessor['log'],\n // middleware: MiddlewareHelper,\n process: BatchProcessor['process'],\n possibleError?: BatchProcessor['possibleError']\n }) {\n safeAssign(this, options);\n\n this.queue = [];\n this.middlewareHelper ??= getMiddleware();\n\n const prefix = 'BATCH-PROCESSOR-' + ++id;\n if(this.log) {\n this.log = this.log.bindPrefix(prefix);\n } else {\n this.log = logger(prefix);\n }\n }\n\n public get queuePromise() {\n return this.promise;\n }\n\n public clear() {\n this.log('clear');\n this.queue.length = 0;\n this.promise = undefined;\n this.middlewareHelper.clean();\n }\n\n public addToQueue(item: BatchProcessor['queue'][0]) {\n this.queue.push(item);\n return this.setQueue();\n }\n\n protected setQueue() {\n if(!this.queue.length) {\n return Promise.resolve();\n }\n\n if(this.promise) {\n return this.promise;\n }\n\n const middleware = this.middlewareHelper.get();\n const log = this.log.bindPrefix('queue');\n const m = middlewarePromise(middleware, this.possibleError);\n\n const processQueue = async(): Promise => {\n log('start');\n\n const queue = this.queue.splice(0, this.queue.length);\n\n const perf = performance.now();\n const promises = queue.map((promise) => {\n promise.then((details) => {\n log('render item time', performance.now() - perf, details);\n });\n\n return promise;\n });\n\n const renderedQueue = await m(Promise.all(promises));\n await m(this.process(renderedQueue, m, log));\n\n log('queue rendered');\n\n if(this.queue.length) {\n log('have new items to render');\n return processQueue();\n } else {\n log('end');\n }\n };\n\n log('setting pause');\n const promise = this.promise = m(pause(0))\n .then(\n processQueue,\n (err) => {\n log('pause has been cleared');\n throw err;\n }\n )\n .finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n });\n\n return promise;\n }\n}\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => PromiseLike | number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase) => PromiseLike | SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware: MiddlewareHelper;\n\n protected batchProcessor: BatchProcessor;\n\n protected log: ReturnType;\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 log?: SortedList['log']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n this.middleware = getMiddleware();\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: async(batch, m, log) => {\n // const elements = await Promise.all(batch.map((element) => this.onElementCreate(element)));\n const elements = batch;\n const promises = elements.map((element) => this.update(element.id, element));\n await m(Promise.all(promises));\n }\n });\n }\n\n public clear() {\n this.batchProcessor.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);\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 async add(id: SortedElementId) {\n const element = this.get(id);\n if(element) {\n return;\n // return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n this.elements.set(id, base as SortedElement);\n const createPromise = Promise.resolve(this.onElementCreate(base));\n return this.batchProcessor.addToQueue(createPromise);\n\n // return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n\n this.elements.delete(id);\n\n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public async update(id: SortedElementId, element = this.get(id)) {\n if(!element) {\n return;\n }\n\n element.index = await this.getIndex(element);\n if(this.get(id) !== element) {\n return;\n }\n\n this.onUpdate?.(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n this.onSort(element, idx);\n }\n}\n","const BOM = '';\n// const BOM = 'K';\nexport default BOM;\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","// 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","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","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 {IS_WORKER} from './context';\n\nexport class WindowSize {\n public width: number;\n public height: number;\n\n constructor() {\n if(IS_WORKER) {\n return;\n }\n\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\r\n\r\nimport {AnyToVoidFunction} from '../types';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport DEBUG from '../config/debug';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport EventListenerBase from '../helpers/eventListenerBase';\r\n\r\nconst eventListener = new EventListenerBase<{\r\n start: () => void,\r\n end: () => void\r\n}>();\r\nconst ANIMATION_START_EVENT = 'start';\r\nconst ANIMATION_END_EVENT = 'end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise();\r\n eventListener.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n\r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\n(window as any).dispatchHeavyAnimationEvent = dispatchHeavyAnimationEvent;\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n eventListener.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n // useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(eventListener) : eventListener.addEventListener.bind(eventListener);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n // }, [handleAnimationEnd, handleAnimationStart]);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport rootScope from '../lib/rootScope';\nimport ButtonMenu, {ButtonMenuItemOptions} from './buttonMenu';\nimport PopupDeleteDialog from './popups/deleteDialog';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport PopupPeer, {PopupPeerButton} from './popups/peer';\nimport AppChatFoldersTab from './sidebarLeft/tabs/chatFolders';\nimport appSidebarLeft from './sidebarLeft';\nimport {toastNew} from './toast';\nimport PopupMute from './popups/mute';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport positionMenu from '../helpers/positionMenu';\nimport contextMenuController from '../helpers/contextMenuController';\nimport type {ApiLimitType} from '../lib/mtproto/api_methods';\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise})[];\n\n private selectedId: PeerId;\n private filterId: number;\n private dialog: Dialog;\n\n constructor(private managers: AppManagers) {\n\n }\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: async() => !(await this.managers.appMessagesManager.isDialogUnread(this.dialog))\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => this.managers.appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => {\n const isPinned = this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: async() => {\n const isPinned = this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => {\n return this.selectedId !== rootScope.myId && !(await this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId));\n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: async() => {\n return this.selectedId !== rootScope.myId && (await this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId));\n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.selectedId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.selectedId !== rootScope.myId\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = async() => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.selectedId);\n if(dialog) {\n this.managers.appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onPinClick = () => {\n this.managers.appMessagesManager.toggleDialogPin(this.selectedId, this.filterId).catch(async(err: ApiError) => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH') {\n if(this.filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n // const a: {[type in ApiLimitType]?: {\n // title: LangPackKey,\n // description: LangPackKey,\n // descriptionPremium: LangPackKey,\n // descriptionLocked: LangPackKey,\n // icon: string\n // }} = {\n // pin: {\n // title: 'LimitReached',\n // description: 'LimitReachedPinDialogs',\n // descriptionPremium: 'LimitReachedPinDialogsPremium',\n // descriptionLocked: 'LimitReachedPinDialogsLocked',\n // icon: 'limit_pin'\n // }\n // };\n\n // class P extends PopupPeer {\n // constructor(options: {\n // isPremium: boolean,\n // limit: number,\n // limitPremium: number\n // }, _a: typeof a[keyof typeof a]) {\n // super('popup-limit', {\n // buttons: options.isPremium === undefined ? [{\n // langKey: 'LimitReached.Ok',\n // isCancel: true\n // }] : (options.isPremium ? [{\n // langKey: 'OK',\n // isCancel: true\n // }] : [{\n // langKey: 'IncreaseLimit',\n // callback: () => {\n\n // }\n // }, {\n // langKey: 'Cancel',\n // isCancel: true\n // }]),\n // descriptionLangKey: options.isPremium === undefined ? _a.descriptionLocked : (options.isPremium ? _a.descriptionPremium : _a.description),\n // descriptionLangArgs: options.isPremium ? [options.limitPremium] : [options.limit, options.limitPremium],\n // titleLangKey: _a.title\n // });\n\n // const isLocked = options.isPremium === undefined;\n // if(isLocked) {\n // this.element.classList.add('is-locked');\n // }\n\n // const limitContainer = document.createElement('div');\n // limitContainer.classList.add('popup-limit-line');\n\n // const hint = document.createElement('div');\n // hint.classList.add('popup-limit-hint');\n // const i = document.createElement('span');\n // i.classList.add('popup-limit-hint-icon', 'tgico-' + _a.icon);\n // hint.append(i, '' + (options.isPremium ? options.limitPremium : options.limit));\n\n // limitContainer.append(hint);\n\n // if(!isLocked) {\n // const limit = document.createElement('div');\n // limit.classList.add('limit-line');\n\n // const free = document.createElement('div');\n // free.classList.add('limit-line-free');\n\n // const premium = document.createElement('div');\n // premium.classList.add('limit-line-premium');\n\n // limit.append(free, premium);\n\n // _i18n(free, 'LimitFree');\n // premium.append(i18n('LimitPremium'), '' + options.limitPremium);\n\n // limitContainer.append(limit);\n // }\n\n // this.container.insertBefore(limitContainer, this.description);\n\n // if(options.isPremium === false) {\n // this.buttons.pop().element.remove();\n // }\n // }\n // }\n\n // async function showLimitPopup(type: keyof typeof a) {\n // const _a = a[type];\n // const [appConfig, limit, limitPremium] = await Promise.all([\n // rootScope.managers.apiManager.getAppConfig(),\n // ...[false, true].map((v) => rootScope.managers.apiManager.getLimit(type, v))\n // ]);\n // const isLocked = appConfig.premium_purchase_blocked;\n // new P({\n // isPremium: isLocked ? undefined : rootScope.premium,\n // limit,\n // limitPremium\n // }, _a).show();\n // }\n\n // showLimitPopup('pin');\n\n const config = await this.managers.apiManager.getConfig();\n new PopupPeer('pinned-dialogs-too-much', {\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'FiltersSetupPinAlert',\n callback: () => {\n appSidebarLeft.createTab(AppChatFoldersTab).open();\n }\n }],\n descriptionLangKey: 'PinToTopLimitReached2',\n descriptionLangArgs: [i18n('Chats', [config.pinned_dialogs_count_max])]\n }).show();\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n this.managers.appMessagesManager.togglePeerMute(this.selectedId, false);\n };\n\n private onMuteClick = () => {\n new PopupMute(this.selectedId);\n };\n\n private onUnreadClick = async() => {\n const selectedId = this.selectedId;\n const dialog = await this.managers.appMessagesManager.getDialogOnly(selectedId);\n if(!dialog) return;\n\n if(dialog.unread_count) {\n this.managers.appMessagesManager.readHistory(selectedId, dialog.top_message);\n this.managers.appMessagesManager.markDialogUnread(selectedId, true);\n } else {\n this.managers.appMessagesManager.markDialogUnread(selectedId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.selectedId/* , 'delete' */);\n };\n\n onContextMenu = (e: MouseEvent | Touch) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n\n try {\n li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n } catch(e) {}\n\n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.filterId = appDialogsManager.filterId;\n this.selectedId = li.dataset.peerId.toPeerId();\n this.dialog = await this.managers.appMessagesManager.getDialogOnly(this.selectedId);\n\n await Promise.all(this.buttons.map(async(button) => {\n const good = await button.verify();\n\n button.element.classList.toggle('hide', !good);\n }));\n\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(await this.managers.appPeersManager.getDeleteButtonText(this.selectedId)));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.selectedId = this.dialog = this.filterId = undefined;\n });\n };\n\n r();\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from '../config/app';\r\nimport DEBUG from '../config/debug';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport {LangPackKey, i18n} from '../lib/langPack';\r\nimport {logger} from '../lib/logger';\r\nimport rootScope from '../lib/rootScope';\r\nimport Button from './button';\r\nimport ProgressivePreloader from './preloader';\r\nimport SetTransition from './singleTransition';\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport {ConnectionStatus} from '../lib/mtproto/connectionStatus';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport singleInstance from '../lib/mtproto/singleInstance';\r\n\r\nexport default class ConnectionStatusComponent {\r\n public static CHANGE_STATE_DELAY = 1000;\r\n\r\n private statusContainer: HTMLElement;\r\n private statusEl: HTMLElement;\r\n private statusPreloader: ProgressivePreloader;\r\n\r\n private currentLangPackKey: LangPackKey;\r\n\r\n private hadConnect = false;\r\n private retryAt: number;\r\n private connecting = false;\r\n private timedOut = false;\r\n private updating = false;\r\n\r\n private log: ReturnType;\r\n\r\n private setFirstConnectionTimeout: number;\r\n private setStateTimeout: number;\r\n\r\n constructor(private managers: AppManagers, chatsContainer: HTMLElement) {\r\n this.log = logger('CS', undefined, undefined);\r\n\r\n this.statusContainer = document.createElement('div');\r\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\r\n\r\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\r\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\r\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\r\n this.statusContainer.append(this.statusEl);\r\n\r\n chatsContainer.prepend(this.statusContainer);\r\n\r\n rootScope.addEventListener('connection_status_change', (status) => {\r\n // console.log(status);\r\n\r\n this.setConnectionStatus();\r\n });\r\n\r\n rootScope.addEventListener('state_synchronizing', (channelId) => {\r\n if(!channelId) {\r\n this.updating = true;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('state_synchronized', (channelId) => {\r\n DEBUG && this.log('state_synchronized', channelId);\r\n if(!channelId) {\r\n this.updating = false;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\r\n\r\n // let bool = true;\r\n // document.addEventListener('dblclick', () => {\r\n // this.setConnectionStatus(bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected));\r\n // });\r\n }\r\n\r\n private setConnectionStatus = (overrideStatus?: ConnectionStatus) => {\r\n Promise.all([\r\n sessionStorage.get('dc'),\r\n rootScope.managers.rootScope.getConnectionStatus()\r\n ]).then(([baseDcId, connectionStatus]) => {\r\n if(!baseDcId) {\r\n baseDcId = App.baseDcId;\r\n }\r\n\r\n if(this.setFirstConnectionTimeout) {\r\n clearTimeout(this.setFirstConnectionTimeout);\r\n this.setFirstConnectionTimeout = 0;\r\n }\r\n\r\n const status = connectionStatus['NET-' + baseDcId];\r\n const online = status && (overrideStatus || status.status) === ConnectionStatus.Connected;\r\n\r\n if(this.connecting && online) {\r\n this.managers.apiUpdatesManager.forceGetDifference();\r\n }\r\n\r\n if(online && !this.hadConnect) {\r\n this.hadConnect = true;\r\n }\r\n\r\n this.timedOut = status && (overrideStatus || status.status) === ConnectionStatus.TimedOut;\r\n this.connecting = !online;\r\n this.retryAt = status && status.retryAt;\r\n DEBUG && this.log('connecting', this.connecting);\r\n this.setState();\r\n });\r\n };\r\n\r\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\r\n if(this.currentLangPackKey === langPackKey) return;\r\n this.currentLangPackKey = langPackKey;\r\n replaceContent(this.statusEl, i18n(langPackKey, args));\r\n this.statusPreloader.attach(this.statusEl);\r\n };\r\n\r\n private getA(langPackKey: LangPackKey, callback: () => void) {\r\n const a = document.createElement('a');\r\n a.classList.add('force-reconnect');\r\n a.append(i18n(langPackKey));\r\n attachClickEvent(a, (e) => {\r\n cancelEvent(e);\r\n callback();\r\n });\r\n\r\n return a;\r\n }\r\n\r\n private setState = () => {\r\n if(singleInstance.deactivatedReason) {\r\n return;\r\n }\r\n\r\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\r\n if(this.connecting) {\r\n if(this.timedOut) {\r\n const a = this.getA('ConnectionStatus.ForceReconnect', () => this.managers.networkerFactory.forceReconnect());\r\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\r\n } else if(this.hadConnect) {\r\n if(this.retryAt !== undefined) {\r\n const timerSpan = document.createElement('span');\r\n const retryAt = this.retryAt;\r\n const setTime = () => {\r\n const now = Date.now();\r\n timerSpan.innerText = '' + Math.round((retryAt - now) / 1000);\r\n if(now > retryAt) {\r\n clearInterval(interval);\r\n }\r\n };\r\n const interval = setInterval(setTime, 1e3);\r\n setTime();\r\n\r\n const a = this.getA('ConnectionStatus.Reconnect', () => this.managers.networkerFactory.forceReconnectTimeout());\r\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\r\n } else {\r\n this.setStatusText('ConnectionStatus.Reconnecting');\r\n }\r\n } else {\r\n this.setStatusText('ConnectionStatus.Waiting');\r\n }\r\n } else if(this.updating) {\r\n this.setStatusText('Updating');\r\n }\r\n\r\n DEBUG && this.log('setState', this.connecting || this.updating);\r\n window.requestAnimationFrame(() => {\r\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\r\n\r\n const cb = () => {\r\n SetTransition(this.statusContainer, 'is-shown', this.connecting || this.updating, 200);\r\n this.setStateTimeout = 0;\r\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\r\n };\r\n\r\n this.setStateTimeout = window.setTimeout(cb, timeout);\r\n // cb();\r\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\r\n else cb(); */\r\n });\r\n };\r\n}\r\n","/*\n * 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' | 'sendingerror';\n if(message?.pFlags.out) {\n if(message.error) {\n className = 'sendingerror';\n } else 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","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeInOutSineApply(t / d, c) + b;\n}\n\nexport function easeInOutSineApply(v: number, c: number) {\n return -c / 2 * (Math.cos(Math.PI * v) - 1);\n}\n","export default function roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number,\n fill?: boolean,\n stroke?: boolean\n) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n width *= dpr;\n height *= dpr;\n }\n\n if(typeof(radius) === 'number') {\n if(dpr) radius *= dpr;\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] ? (dpr ? radius[side] * dpr : radius[side]) : defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animate} from '../helpers/animation';\nimport customProperties from '../helpers/dom/customProperties';\nimport easeInOutSine from '../helpers/easing/easeInOutSine';\nimport mediaSizes from '../helpers/mediaSizes';\nimport roundRect from '../helpers/canvas/roundRect';\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n\n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n\n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n\n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n\n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n\n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n\n height *= DPR;\n const y = (SIZE - height) / 2;\n\n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\n","import customProperties from '../dom/customProperties';\nimport clamp from '../number/clamp';\n\nexport default class Shimmer {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private font = '30pt Helvetica';\n private currTime = Date.now();\n private diffTime = 0;\n private spread = 0;\n private paused = false;\n private pausedTime = 0;\n private pauseInterval = 850;\n private lightSource = 0;\n private inc = 0.032;\n private lightSpread = 0.55;\n private animations = ['slide', 'slide', 'slide', 'slide'];\n private currentAnimationIndex = 0;\n private text: string;\n private fillStyle: CanvasRenderingContext2D['fillStyle'];\n\n private keepTime() {\n this.diffTime = Date.now() - this.currTime;\n this.currTime = Date.now();\n }\n\n private cycleAnimation() {\n ++this.currentAnimationIndex;\n if(this.currentAnimationIndex >= this.animations.length) {\n this.currentAnimationIndex = 0;\n }\n }\n\n private animate() {\n const currentAnimation = this.animations[this.currentAnimationIndex];\n if(currentAnimation === 'glow') {\n return this.animateGlow(); // return glow style\n } else if(currentAnimation === 'slide') {\n return this.animateSlide(); // return slide gradient\n } else {\n console.log('unknown animation type: ' + String(currentAnimation));\n }\n }\n\n private animateGlow() {\n var glowEnd = 255,\n rgbStart = 68,\n r = rgbStart,\n g = r,\n b = r,\n increment = 10,\n interval = 800;\n\n return () => {\n var smartInc = increment * (this.diffTime / (1000 / 60));\n if(this.paused) {\n if((Date.now() - this.pausedTime) > interval) {\n r = rgbStart;\n this.cycleAnimation()\n this.paused = false;\n }\n } else {\n r = parseInt('' + (r + smartInc));\n if(r >= glowEnd) {\n this.paused = true;\n this.pausedTime = Date.now()\n }\n }\n return 'rgb('+ r + ',' + r + ',' + r + ')';\n };\n }\n\n private animateSlide(): CanvasGradient {\n var gradient = this.ctx.createLinearGradient(0, 0, this.canvas.width, 0),\n smartInc = this.inc * (this.diffTime / (1000 / 60)),\n lightLeft,\n lightRight,\n lightCenter;\n if(this.paused) {\n if((Date.now() - this.pausedTime) > this.pauseInterval) {\n this.lightSource = -0.6;\n this.cycleAnimation()\n this.paused = false;\n return this.animateSlide();\n }\n } else {\n this.lightSource += smartInc;\n if(this.lightSource > (1 + this.lightSpread)) {\n this.paused = true;\n this.pausedTime = Date.now();\n }\n }\n // lighting positions:\n lightCenter = clamp(this.lightSource, 0, 1);\n lightLeft = clamp(this.lightSource - this.lightSpread, 0, 1);\n lightRight = clamp(this.lightSource + this.lightSpread, 0, 1);\n\n const backgroundColor = customProperties.getProperty('background-color-true');\n const shimmerColor = customProperties.getProperty('surface-color');\n gradient.addColorStop(lightLeft, backgroundColor);\n gradient.addColorStop(lightCenter, shimmerColor);\n gradient.addColorStop(lightRight, backgroundColor);\n\n return gradient;\n }\n\n public settings(dict: Partial<{\n canvas: Shimmer['canvas'],\n fillStyle: Shimmer['fillStyle'],\n font: Shimmer['font'],\n lightSpread: Shimmer['lightSpread'],\n inc: Shimmer['inc'],\n animations: Shimmer['animations'],\n text: Shimmer['text']\n }> = {}) {\n this.canvas = dict.canvas ?? document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n this.font = dict.font ?? this.font;\n this.lightSpread = dict.lightSpread ?? this.lightSpread;\n this.inc = dict.inc ?? this.inc;\n this.animations = dict.animations ?? this.animations;\n this.text = dict.text ?? this.text;\n this.fillStyle = dict.fillStyle;\n\n this.canvas.classList.add('shimmer-canvas');\n }\n\n public on() {\n const {width, height} = this.canvas;\n // record the time we ran:\n this.keepTime();\n // clear and fill the canvas:\n this.ctx.clearRect(0, 0, width, height);\n\n if(this.font) {\n this.ctx.font = this.font;\n }\n\n this.ctx.fillStyle = this.animate() as any;\n this.ctx.fillRect(0, 0, width, height);\n\n if(this.fillStyle) {\n this.ctx.fillStyle = this.fillStyle;\n this.ctx.fillRect(0, 0, width, height);\n }\n\n if(this.text) {\n this.ctx.fillText(this.text, 50, 50);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport rootScope from '../lib/rootScope';\nimport {animate} from './animation';\nimport {drawCircleFromStart} from './canvas/drawCircle';\nimport roundRect from './canvas/roundRect';\nimport Shimmer from './canvas/shimmer';\nimport customProperties from './dom/customProperties';\nimport easeInOutSine from './easing/easeInOutSine';\nimport mediaSizes from './mediaSizes';\n\nexport default class DialogsPlaceholder {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private shimmer: Shimmer;\n private tempId: number;\n private detachTime: number;\n\n private length: number;\n private dialogHeight: number;\n private availableLength: number;\n\n private avatarSize: number;\n private marginVertical: number;\n private lineHeight: number;\n private lineBorderRadius: number;\n private lineMarginVertical: number;\n private statusWidth: number;\n private generatedValues: {\n firstLineWidth: number,\n secondLineWidth: number,\n statusWidth: number\n }[];\n\n private getRectFrom: Element;\n private onRemove: () => void;\n private blockScrollable: Scrollable;\n\n constructor() {\n this.shimmer = new Shimmer();\n this.tempId = 0;\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('dialogs-placeholder-canvas');\n this.ctx = this.canvas.getContext('2d');\n\n this.generatedValues = [];\n this.avatarSize = 54;\n this.marginVertical = 9;\n this.lineHeight = 10;\n this.lineBorderRadius = 6;\n this.lineMarginVertical = 8;\n this.statusWidth = 24;\n }\n\n public attach({container, rect, getRectFrom, onRemove, blockScrollable}: {\n container: HTMLElement,\n rect?: {width: number, height: number},\n getRectFrom?: HTMLElement,\n onRemove?: DialogsPlaceholder['onRemove'],\n blockScrollable?: DialogsPlaceholder['blockScrollable']\n }) {\n const {canvas} = this;\n\n this.onRemove = onRemove;\n this.getRectFrom = getRectFrom || container;\n if(this.blockScrollable = blockScrollable) {\n blockScrollable.container.style.overflowY = 'hidden';\n }\n\n this.updateCanvasSize(rect);\n this.startAnimation();\n container.append(canvas);\n }\n\n public detach(availableLength: number) {\n if(this.detachTime) {\n return;\n }\n\n this.availableLength = availableLength;\n this.detachTime = Date.now();\n\n if(!rootScope.settings.animationsEnabled) {\n this.remove();\n }\n }\n\n public remove() {\n this.stopAnimation();\n\n if(this.canvas.parentElement) {\n this.canvas.remove();\n\n if(this.onRemove) {\n this.onRemove();\n this.onRemove = undefined;\n }\n\n if(this.blockScrollable) {\n this.blockScrollable.container.style.overflowY = '';\n this.blockScrollable = undefined;\n }\n }\n }\n\n private updateCanvasSize(rect: {width: number, height: number} = this.getRectFrom.getBoundingClientRect()) {\n const {canvas} = this;\n const dpr = canvas.dpr = window.devicePixelRatio;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n canvas.style.width = rect.width + 'px';\n canvas.style.height = rect.height + 'px';\n }\n\n private renderDetachAnimationFrame() {\n const {\n canvas,\n ctx,\n detachTime,\n length,\n availableLength\n } = this;\n\n if(!detachTime) {\n return;\n } else if(!rootScope.settings.animationsEnabled) {\n this.remove();\n return;\n }\n\n const {width} = canvas;\n\n ctx.globalCompositeOperation = 'destination-out';\n\n // ctx.fillStyle = 'rgba(0, 0, 0, 0)';\n // ctx.fillRect(0, 0, width, height);\n\n // const DURATION = 500;\n // const DELAY = DURATION;\n const DURATION = 150;\n const DELAY = 15;\n const elapsedTime = Date.now() - detachTime;\n let completed = true;\n for(let i = 0; i < length; ++i) {\n const delay = availableLength < length && i >= availableLength ? DELAY * (availableLength - 1) : DELAY * i;\n const elapsedRowTime = elapsedTime - delay;\n if(elapsedRowTime <= 0) {\n completed = false;\n continue;\n }\n\n const progress = easeInOutSine(elapsedRowTime, 0, 1, DURATION);\n\n ctx.beginPath();\n ctx.rect(0, this.dialogHeight * i, width, this.dialogHeight);\n ctx.fillStyle = `rgba(0, 0, 0, ${progress})`;\n ctx.fill();\n\n if(progress < 1) {\n completed = false;\n }\n }\n\n // const totalRadius = Math.sqrt(width ** 2 + height ** 2);\n // const gradient = ctx.createRadialGradient(\n // 0, 0, 0,\n // 0, 0, totalRadius);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // const gradient = ctx.createLinearGradient(0, 0, 0, height);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // ctx.fillStyle = gradient;\n // ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'source-over';\n\n if(completed) {\n this.remove();\n }\n }\n\n private renderFrame() {\n this.shimmer.on();\n this.renderDetachAnimationFrame();\n }\n\n private startAnimation() {\n const {canvas, shimmer} = this;\n const tempId = ++this.tempId;\n const pattern = this.createPattern();\n\n shimmer.settings({\n canvas,\n fillStyle: pattern\n });\n\n const middleware = () => {\n return this.tempId === tempId;\n };\n\n this.renderFrame();\n animate(() => {\n if(!middleware()) {\n return false;\n }\n\n // ! should've removed the loop if animations are disabled\n if(rootScope.settings.animationsEnabled) {\n this.renderFrame();\n }\n\n // ! tempId can be changed during renderFrame\n return middleware();\n });\n\n rootScope.addEventListener('theme_change', this.onThemeChange);\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private stopAnimation() {\n ++this.tempId;\n rootScope.removeEventListener('theme_change', this.onThemeChange);\n mediaSizes.removeEventListener('resize', this.onResize);\n }\n\n private onThemeChange = () => {\n this.stopAnimation();\n this.startAnimation();\n };\n\n private onResize = () => {\n const {canvas} = this;\n const {width, height, dpr} = canvas;\n this.updateCanvasSize();\n if(canvas.width === width && canvas.height === height && canvas.dpr === dpr) {\n return;\n }\n\n this.stopAnimation();\n this.startAnimation();\n };\n\n private createPattern() {\n const {canvas, ctx} = this;\n\n const patternCanvas = document.createElement('canvas');\n const patternContext = patternCanvas.getContext('2d');\n const dpr = canvas.dpr;\n patternCanvas.dpr = dpr;\n patternCanvas.width = canvas.width;\n patternCanvas.height = canvas.height;\n\n patternContext.fillStyle = customProperties.getProperty('surface-color');\n patternContext.fillRect(0, 0, patternCanvas.width, patternCanvas.height);\n\n patternContext.fillStyle = '#000';\n patternContext.globalCompositeOperation = 'destination-out';\n\n const dialogHeight = this.dialogHeight = (this.avatarSize + this.marginVertical * 2) * dpr;\n const length = this.length = Math.ceil(canvas.height / dialogHeight);\n for(let i = 0; i < length; ++i) {\n this.drawChat(patternContext, i, i * dialogHeight);\n }\n\n return ctx.createPattern(patternCanvas, 'no-repeat');\n }\n\n private drawChat(ctx: CanvasRenderingContext2D, i: number, y: number) {\n let generatedValues = this.generatedValues[i];\n if(!generatedValues) {\n generatedValues = this.generatedValues[i] = {\n firstLineWidth: 40 + Math.random() * 100, // 120\n secondLineWidth: 120 + Math.random() * 130, // 240\n statusWidth: 24 + Math.random() * 16\n };\n }\n\n const {\n firstLineWidth,\n secondLineWidth,\n statusWidth\n } = generatedValues;\n\n const {canvas} = ctx;\n const {dpr} = canvas;\n y /= dpr;\n\n const {\n avatarSize,\n marginVertical,\n lineHeight,\n lineBorderRadius,\n lineMarginVertical\n } = this;\n\n let marginLeft = 17;\n drawCircleFromStart(ctx, marginLeft, y + marginVertical, avatarSize / 2, true);\n\n marginLeft += avatarSize + 10;\n roundRect(ctx, marginLeft, y + marginVertical + lineMarginVertical, firstLineWidth, lineHeight, lineBorderRadius, true);\n roundRect(ctx, marginLeft, y + marginVertical + avatarSize - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n\n roundRect(ctx, canvas.width / dpr - 24 - statusWidth, y + marginVertical + lineMarginVertical, statusWidth, lineHeight, lineBorderRadius, true);\n }\n}\n","export default function drawCircle(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n radius *= dpr;\n }\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, 2 * Math.PI, false);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n\nexport function drawCircleFromStart(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n return drawCircle(ctx, x + radius, y + radius, radius, fill, stroke);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter as DialogFilter, MyDialogFilter} from '../storages/filters';\nimport type LazyLoadQueue from '../../components/lazyLoadQueue';\nimport type {Dialog, MyMessage} from './appMessagesManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyDocument} from './appDocsManager';\nimport type {State} from '../../config/state';\nimport AvatarElement from '../../components/avatar';\nimport DialogsContextMenu from '../../components/dialogsContextMenu';\nimport {horizontalMenu} from '../../components/horizontalMenu';\nimport ripple from '../../components/ripple';\nimport Scrollable, {ScrollableX, SliceSides} from '../../components/scrollable';\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {IS_MOBILE_SAFARI, IS_SAFARI} from '../../environment/userAgent';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport appImManager from './appImManager';\nimport Button from '../../components/button';\nimport SetTransition from '../../components/singleTransition';\nimport {MyDraftMessage} from './appDraftsManager';\nimport DEBUG, {MOUNT_CLASS_TO} from '../../config/debug';\nimport PeerTitle from '../../components/peerTitle';\nimport I18n, {FormatterArguments, i18n, LangPackKey, _i18n} from '../langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport wrapPhoto from '../../components/wrappers/photo';\nimport AppEditFolderTab from '../../components/sidebarLeft/tabs/editFolder';\nimport appSidebarLeft, {SettingSection} from '../../components/sidebarLeft';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport ConnectionStatusComponent from '../../components/connectionStatus';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport {fastRafConventional, fastRafPromise} from '../../helpers/schedulers';\nimport SortedUserList from '../../components/sortedUserList';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport handleTabSwipe from '../../helpers/dom/handleTabSwipe';\nimport windowSize from '../../helpers/windowSize';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {setSendingStatus} from '../../components/sendingStatus';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport groupCallActiveIcon from '../../components/groupCallActiveIcon';\nimport {Chat, Message, NotifyPeer} from '../../layer';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport appNavigationController, {NavigationItem} from '../../components/appNavigationController';\nimport assumeType from '../../helpers/assumeType';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {AppManagers} from './managers';\nimport appSidebarRight from '../../components/sidebarRight';\nimport PopupElement from '../../components/popups';\nimport choosePhotoSize from './utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport isMessageRestricted from './utils/messages/isMessageRestricted';\nimport getMediaFromMessage from './utils/messages/getMediaFromMessage';\nimport getMessageSenderPeerIdOrName from './utils/messages/getMessageSenderPeerIdOrName';\nimport wrapStickerEmoji from '../../components/wrappers/stickerEmoji';\nimport getDialogIndexKey from './utils/dialogs/getDialogIndexKey';\nimport getProxiedManagers from './getProxiedManagers';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport appDownloadManager from './appDownloadManager';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport noop from '../../helpers/noop';\nimport DialogsPlaceholder from '../../helpers/dialogsPlaceholder';\nimport pause from '../../helpers/schedulers/pause';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {MiddlewareHelper} from '../../helpers/middleware';\nimport makeError from '../../helpers/makeError';\nimport getUnsafeRandomInt from '../../helpers/number/getUnsafeRandomInt';\nimport Row, {RowMediaSizeType} from '../../components/row'\n\nexport const DIALOG_LIST_ELEMENT_TAG = 'A';\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLElement,\n subtitleEl: HTMLElement,\n\n setLastMessagePromise?: CancellablePromise,\n setUnreadMessagePromise?: CancellablePromise\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom\n}\n\nfunction setPromiseMiddleware}, K extends keyof T>(obj: T, key: K) {\n const oldPromise: CancellablePromise = obj[key] as any;\n oldPromise?.reject();\n\n // @ts-ignore\n const deferred = obj[key] = deferredPromise();\n deferred.catch(() => {}).finally(() => {\n if((obj[key] as any) === deferred) {\n delete obj[key];\n }\n });\n\n const middleware = middlewarePromise(() => (obj[key] as any) === deferred);\n return {deferred, middleware};\n}\n\nconst BADGE_SIZE = 22;\n\nclass SortedDialogList extends SortedList {\n constructor(\n public managers: AppManagers,\n log: ReturnType,\n public list: HTMLUListElement,\n public indexKey: ReturnType,\n public onListLengthChange?: () => void\n ) {\n super({\n getIndex: (element) => managers.dialogsStorage.getDialogIndex(element.id, this.indexKey),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange?.();\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?.();\n }\n },\n onElementCreate: async(base) => {\n const loadPromises: Promise[] = [];\n\n const {dom} = appDialogsManager.addListDialog({peerId: base.id, loadPromises, isBatch: true});\n (base as SortedDialog).dom = dom;\n\n await Promise.all(loadPromises);\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional,\n log\n });\n }\n\n public clear() {\n this.list.replaceChildren();\n super.clear();\n }\n}\n\nexport type DialogElementSize = RowMediaSizeType;\nclass DialogElement extends Row {\n public dom: DialogDom;\n\n constructor({\n peerId,\n rippleEnabled = true,\n onlyFirstName = false,\n meAsSaved = true,\n avatarSize = 'bigger',\n autonomous,\n lazyLoadQueue,\n loadPromises,\n fromName,\n noIcons\n }: {\n peerId: PeerId,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n avatarSize?: RowMediaSizeType,\n autonomous?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n loadPromises?: Promise[],\n fromName?: string,\n noIcons?: boolean\n }) {\n super({\n clickable: true,\n noRipple: !rippleEnabled,\n havePadding: true,\n title: true,\n titleRightSecondary: true,\n subtitle: true,\n subtitleRight: true,\n noWrap: true,\n asLink: true\n });\n\n const avatarEl = new AvatarElement();\n const avatarSizeMap: {[k in DialogElementSize]?: number} = {\n bigger: 54,\n abitbigger: 42,\n small: 32\n };\n const s = avatarSizeMap[avatarSize];\n avatarEl.classList.add('dialog-avatar', 'avatar-' + s);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n const captionDiv = this.container;\n\n const titleSpanContainer = this.title;\n titleSpanContainer.classList.add('user-title');\n\n this.titleRow.classList.add('dialog-title');\n\n const peerTitle = new PeerTitle();\n const peerTitlePromise = peerTitle.update({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n plainText: false,\n withIcons: !noIcons\n });\n\n loadPromises?.push(peerTitlePromise);\n titleSpanContainer.append(peerTitle.element);\n\n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n\n // const titleIconsPromise = generateTitleIcons(peerId).then((elements) => {\n // titleSpanContainer.append(...elements);\n // });\n\n // if(loadPromises) {\n // loadPromises.push(titleIconsPromise);\n // }\n // }\n\n const span = this.subtitle;\n // span.classList.add('user-last-message');\n\n const li = this.container;\n li.classList.add('chatlist-chat', 'chatlist-chat-' + avatarSize);\n if(!autonomous) (li as HTMLAnchorElement).href = '#' + peerId;\n // if(rippleEnabled) {\n // ripple(li);\n // }\n\n if(avatarSize === 'bigger') {\n this.container.classList.add('row-big');\n } else if(avatarSize === 'small') {\n this.container.classList.add('row-small');\n }\n\n this.applyMediaElement(avatarEl, avatarSize);\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-' + BADGE_SIZE;\n\n const rightSpan = this.titleRight;\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n\n this.subtitleRow.classList.add('dialog-subtitle');\n\n const dom: DialogDom = this.dom = {\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: this.subtitleRow\n };\n\n if(!autonomous) {\n (li as any).dialogDom = dom;\n\n if(appImManager.chat?.peerId === peerId) {\n appDialogsManager.setDialogActive(li, true);\n }\n }\n }\n}\n\n// const testScroll = false;\n// let testTopSlice = 1;\n\nexport class AppDialogsManager {\n private chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n\n private loadDialogsPromise: Promise<{cached: boolean, renderPromise: AppDialogsManager['loadDialogsRenderPromise']}>;\n private loadDialogsRenderPromise: Promise;\n\n private scroll: Scrollable = null;\n\n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu: DialogsContextMenu;\n\n private sortedList: SortedDialogList;\n public placeholders: {[filterId: number]: DialogsPlaceholder} = {};\n public sortedLists: {[filterId: number]: SortedDialogList} = {};\n public scrollables: {[filterId: number]: Scrollable} = {};\n public filterId: number;\n private folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement,\n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n\n private sliceTimeout: number;\n\n private lastActiveElements: Set = new Set();\n\n private offsets: {top: number, bottom: number} = {top: 0, bottom: 0};\n\n private loadContacts: () => void;\n private processContact: (peerId: PeerId) => void;\n\n private indexKey: ReturnType;\n\n private initedListeners = false;\n\n private onListLengthChange: () => Promise;\n private loadedDialogsAtLeastOnce = false;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n private filtersNavigationItem: NavigationItem;\n\n private managers: AppManagers;\n private selectTab: ReturnType;\n\n private doNotRenderChatList: boolean;\n\n private stateMiddlewareHelper: MiddlewareHelper;\n\n public start() {\n const managers = this.managers = getProxiedManagers();\n\n this.contextMenu = new DialogsContextMenu(managers);\n this.stateMiddlewareHelper = new MiddlewareHelper();\n\n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n\n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff > 0 ? prevId + 1 : prevId - 1);\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n\n /* if(testScroll) {\n let i = 0;\n let add = () => {\n let li = document.createElement('li');\n li.dataset.id = '' + i;\n li.id = '' + i;\n li.innerHTML = `

${i}18:33

-_-_-_-: qweasd

`;\n i++;\n this.scroll.append(li);\n };\n for(let i = 0; i < 500; ++i) {\n add();\n }\n (window as any).addElement = add;\n } */\n\n rootScope.addEventListener('premium_toggle', async(isPremium) => {\n if(isPremium) {\n return;\n }\n\n const isFolderAvailable = await this.managers.filtersStorage.isFilterIdAvailable(this.filterId);\n if(!isFolderAvailable) {\n selectTab(whichChild(this.filtersRendered[FOLDER_ID_ALL].menu), false);\n }\n });\n\n rootScope.addEventListener('state_cleared', () => {\n const clearCurrent = REAL_FOLDERS.has(this.filterId);\n // setTimeout(() =>\n apiManagerProxy.getState().then(async(state) => {\n this.loadedDialogsAtLeastOnce = false;\n this.showFiltersPromise = undefined;\n\n /* const clearPromises: Promise[] = [];\n for(const name in this.managers.appStateManager.storagesResults) {\n const results = this.managers.appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = this.managers.appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n if(clearCurrent) {\n this.sortedList.clear();\n this.onTabChange();\n }\n\n this.onStateLoaded(state);\n })// , 5000);\n });\n\n this.setFilterId(FOLDER_ID_ALL, FOLDER_ID_ALL);\n this.addFilter({\n id: FOLDER_ID_ALL,\n title: '',\n localId: FOLDER_ID_ALL\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = this.selectTab = horizontalMenu(this.folders.menu, this.folders.container, async(id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n const _id = id;\n id = +tabContent.dataset.filterId || FOLDER_ID_ALL;\n\n const isFilterAvailable = this.filterId === -1 || REAL_FOLDERS.has(id) || await this.managers.filtersStorage.isFilterIdAvailable(id);\n if(!isFilterAvailable) {\n return false;\n }\n\n const wasFilterId = this.filterId;\n if(!IS_MOBILE_SAFARI) {\n if(_id) {\n if(!this.filtersNavigationItem) {\n this.filtersNavigationItem = {\n type: 'filters',\n onPop: () => {\n selectTab(0);\n this.filtersNavigationItem = undefined;\n }\n };\n\n appNavigationController.spliceItems(1, 0, this.filtersNavigationItem);\n }\n } else if(this.filtersNavigationItem) {\n appNavigationController.removeItem(this.filtersNavigationItem);\n this.filtersNavigationItem = undefined;\n }\n }\n\n if(wasFilterId === id) return;\n\n this.sortedLists[id].clear();\n const promise = this.setFilterIdAndChangeTab(id).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n\n if(wasFilterId !== -1) {\n return promise;\n }\n }, () => {\n for(const folderId in this.sortedLists) {\n if(+folderId !== this.filterId) {\n this.sortedLists[folderId].clear();\n const placeholder = this.placeholders[folderId];\n if(placeholder) {\n placeholder.remove();\n }\n }\n }\n }, undefined, foldersScrollable);\n\n apiManagerProxy.getState().then((state) => {\n // * it should've had a better place :(\n appMediaPlaybackController.setPlaybackParams(state.playbackParams);\n appMediaPlaybackController.addEventListener('playbackParams', (params) => {\n this.managers.appStateManager.pushToState('playbackParams', params);\n });\n\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n this.managers.appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.managers, this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n\n PopupElement.MANAGERS = rootScope.managers = managers;\n appDownloadManager.construct(managers);\n appSidebarLeft.construct(managers);\n appSidebarRight.construct(managers);\n groupCallsController.construct(managers);\n callsController.construct(managers);\n appImManager.construct(managers);\n\n // start\n\n this.sortedList = this.sortedLists[this.filterId];\n this.scroll = this.scrollables[this.filterId];\n\n // selectTab(0, false);\n }\n\n public get chatList() {\n return this.sortedList.list;\n }\n\n public setFilterId(filterId: number, localId: MyDialogFilter['localId']) {\n this.filterId = filterId;\n this.indexKey = getDialogIndexKey(REAL_FOLDERS.has(filterId) ? filterId as REAL_FOLDER_ID : localId);\n }\n\n public async setFilterIdAndChangeTab(filterId: number) {\n this.filterId = filterId;\n this.indexKey = await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId);\n return this.onTabChange();\n }\n\n private setOnlineStatus(element: HTMLElement, online: boolean) {\n const className = 'is-online';\n const hasClassName = element.classList.contains(className);\n !hasClassName && online && element.classList.add(className);\n SetTransition(element, 'is-visible', online, 250, online ? undefined : () => {\n element.classList.remove(className);\n }, online && !hasClassName ? 2 : 0);\n }\n\n private initListeners() {\n rootScope.addEventListener('user_update', async(userId) => {\n // console.log('updating user:', user, dialog);\n\n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(dom && peerId !== rootScope.myId && !(await this.managers.appUsersManager.isBot(userId))) {\n const user = await this.managers.appUsersManager.getUser(userId);\n const online = user.status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n }\n });\n\n rootScope.addEventListener('chat_update', async(chatId) => {\n const peerId = chatId.toPeerId(true);\n const dialog = await this.managers.appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForCallStatus(dialog);\n }\n });\n\n rootScope.addEventListener('folder_unread', (folder) => {\n this.setFilterUnreadCount(folder.id);\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact?.(userId.toPeerId());\n });\n\n rootScope.addEventListener('dialog_flush', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setLastMessageN({\n dialog,\n setUnread: true\n });\n this.validateDialogForFilter(dialog);\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('dialogs_multiupdate', (dialogs) => {\n for(const [peerId, dialog] of dialogs) {\n this.updateDialog(dialog);\n\n this.processContact?.(peerId.toPeerId());\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_drop', ({peerId}) => {\n this.deleteDialog(peerId);\n\n this.processContact?.(peerId);\n });\n\n rootScope.addEventListener('dialog_unread', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setUnreadMessagesN({dialog});\n this.validateDialogForFilter(dialog);\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.validateDialogForFilter(dialog);\n this.setUnreadMessagesN({dialog}); // возможно это не нужно, но нужно менять is-muted\n });\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 this.processContact?.(peerId);\n });\n\n appImManager.addEventListener('peer_changed', (peerId) => {\n // const perf = performance.now();\n for(const element of this.lastActiveElements) {\n if(element.dataset.peerId.toPeerId() !== peerId) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] .chatlist-chat[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n this.setDialogActive(element, true);\n });\n // this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', async(filter) => {\n if(REAL_FOLDERS.has(filter.id)) {\n return;\n }\n\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n } else if(filter.id === this.filterId) { // это нет тут смысла вызывать, так как будет dialogs_multiupdate\n const dialogs = await this.managers.dialogsStorage.getCachedDialogs(true);\n await this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n\n const elements = this.filtersRendered[filter.id];\n setInnerHTML(elements.title, wrapEmojiText(filter.title));\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n // (this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n 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 if(this.filterId === filter.id) {\n this.selectTab(0, false);\n }\n });\n\n rootScope.addEventListener('filter_order', async(order) => {\n order = order.slice();\n indexOfAndSplice(order, FOLDER_ID_ARCHIVE);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const r = await Promise.all(order.map(async(filterId) => {\n const [indexKey, filter] = await Promise.all([\n this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId),\n this.managers.filtersStorage.getFilter(filterId)\n ]);\n\n return {indexKey, filter};\n }));\n\n order.forEach((filterId, idx) => {\n const {indexKey, filter} = r[idx];\n const renderedFilter = this.filtersRendered[filterId];\n\n const sortedList = this.sortedLists[filterId];\n sortedList.indexKey = indexKey;\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n });\n\n this.indexKey = await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(this.filterId);\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n\n rootScope.addEventListener('peer_typings', async({peerId, typings}) => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(peerId);\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n }\n\n public setDialogActive(listEl: HTMLElement, active: boolean) {\n const dom = (listEl as any).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 this.stateMiddlewareHelper.clean();\n const middleware = this.stateMiddlewareHelper.get();\n const filtersArr = state.filtersArr;\n const haveFilters = filtersArr.length > REAL_FOLDERS.size;\n // const filter = filtersArr.find((filter) => filter.id !== FOLDER_ID_ARCHIVE);\n\n const addFilters = (filters: MyDialogFilter[]) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n };\n\n let addFiltersPromise: Promise;\n if(haveFilters) {\n addFilters(filtersArr);\n } else {\n addFiltersPromise = this.managers.filtersStorage.getDialogFilters().then(addFilters);\n }\n\n this.doNotRenderChatList = true;\n const loadDialogsPromise = this.onChatsScroll();\n const m = middlewarePromise(middleware);\n try {\n await m(loadDialogsPromise);\n } catch(err) {\n\n }\n\n // show the placeholder before the filters, and then will reset to the default tab again\n if(!haveFilters) {\n this.selectTab(0, false);\n }\n\n addFiltersPromise && await m(addFiltersPromise);\n // this.folders.menu.children[0].classList.add('active');\n\n this.doNotRenderChatList = undefined;\n\n this.filterId = -1;\n this.selectTab(0, false);\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n\n haveFilters && this.showFiltersPromise && await m(this.showFiltersPromise);\n\n this.managers.appNotificationsManager.getNotifyPeerTypeSettings();\n\n await (await m(loadDialogsPromise)).renderPromise.catch(noop);\n this.managers.appMessagesManager.fillConversations();\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = this.managers.appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n private getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scroll.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n private isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n // return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n\n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n\n const index = getDialogIndex(dialog, this.indexKey);\n return (!topOffset.index || index <= topOffset.index) && (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n private deleteDialog(peerId: PeerId) {\n this.sortedList.delete(peerId);\n }\n\n private updateDialog(dialog: Dialog) {\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(dialog.peerId) && this.loadedDialogsAtLeastOnce) {\n this.sortedList.add(dialog.peerId);\n return;\n }\n } else {\n this.deleteDialog(dialog.peerId);\n return;\n }\n\n const dom = this.getDialogDom(dialog.peerId);\n if(dom) {\n this.setLastMessageN({\n dialog,\n dom,\n setUnread: true\n });\n this.sortedList.update(dialog.peerId);\n }\n }\n\n public onTabChange = () => {\n this.scroll = this.scrollables[this.filterId];\n this.scroll.loadedAll.top = true;\n this.scroll.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n this.sortedList = this.sortedLists[this.filterId];\n return this.onChatsScroll();\n };\n\n private async setFilterUnreadCount(filterId: number) {\n // if(filterId === FOLDER_ID_ALL) {\n // return;\n // }\n\n const unreadSpan = this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const {unreadUnmutedCount, unreadCount} = await this.managers.dialogsStorage.getFolderUnreadCount(filterId);\n unreadSpan.classList.toggle('badge-gray', !unreadUnmutedCount);\n const count = filterId === FOLDER_ID_ALL ? unreadUnmutedCount : unreadCount;\n unreadSpan.innerText = count ? '' + count : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n private async validateListForFilter() {\n this.sortedList.getAll().forEach(async(element) => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(element.id);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n private validateDialogForFilter(dialog: Dialog) {\n if(!this.getDialogDom(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog.peerId);\n }\n }\n\n public testDialogForFilter(dialog: Dialog) {\n if(\n !dialog ||\n (!REAL_FOLDERS.has(this.filterId) ? getDialogIndex(dialog, this.indexKey) === undefined : this.filterId !== dialog.folder_id)\n // (filter && !(await this.managers.filtersStorage.testDialogForFilter(dialog, filter)))\n ) {\n return false;\n }\n\n return true;\n }\n\n public generateScrollable(list: HTMLUListElement, filter: Parameters[0]) {\n const filterId = filter.id;\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n scrollable.container.dataset.filterId = '' + filterId;\n scrollable.onScrolledTop = this.onChatsScrollTop;\n scrollable.onScrolledBottom = this.onChatsScroll;\n scrollable.setVirtualContainer(list);\n\n const sortedDialogList = new SortedDialogList(\n this.managers,\n this.log,\n list,\n getDialogIndexKey(filter.localId),\n this.onListLengthChange\n );\n\n this.scrollables[filterId] = scrollable;\n this.sortedLists[filterId] = sortedDialogList;\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n private addFilter(filter: Pick) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const renderedFilter = this.filtersRendered[filter.id];\n if(renderedFilter) {\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n return;\n }\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.id === FOLDER_ID_ALL) titleSpan.append(this.allChatsIntlElement.element);\n else setInnerHTML(titleSpan, wrapEmojiText(filter.title));\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n ripple(menuTab);\n menuTab.append(span);\n\n menuTab.dataset.filterId = '' + filter.id;\n\n positionElementByIndex(menuTab, containerToAppend, filter.localId);\n // containerToAppend.append(li);\n\n const ul = this.createChatList();\n const scrollable = this.generateScrollable(ul, filter);\n\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n\n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n\n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n\n const div = scrollable.container;\n // this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.localId);\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 let promise = this.showFiltersPromise;\n return promise ??= this.showFiltersPromise = pause(0).then(() => {\n if(this.showFiltersPromise !== promise) {\n return;\n }\n\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 });\n }\n\n private loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n\n const log = this.log.bindPrefix('load-' + getUnsafeRandomInt(1000, 9999));\n log('try', side);\n\n if(this.loadDialogsPromise || this.loadDialogsRenderPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n else if(this.scroll.loadedAll[side]) {\n return Promise.resolve({\n cached: true,\n renderPromise: Promise.resolve()\n });\n }\n\n log.warn('start', side);\n const middlewareError = makeError('MIDDLEWARE');\n\n const cachedInfoPromise = deferredPromise();\n const renderPromise = new Promise(async(resolve, reject) => {\n const {chatList, filterId, indexKey} = this;\n\n // return;\n\n // let loadCount = 30/*this.chatsLoadCount */;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n\n const doNotRenderChatList = this.doNotRenderChatList; // cache before awaits\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n // let offset = storage[storage.length - 1]?.index || 0;\n\n let placeholder = this.placeholders[filterId];\n try {\n const getConversationsResult = this.managers.acknowledged.appMessagesManager.getConversations('', offsetIndex, loadCount, filterId, true);\n if(\n !chatList.childElementCount &&\n !placeholder &&\n (\n !this.loadedDialogsAtLeastOnce ||\n !(await getConversationsResult).cached\n )\n ) {\n placeholder = this.placeholders[filterId] = new DialogsPlaceholder();\n const getRectFrom = filterId === FOLDER_ID_ARCHIVE ? this.chatsContainer : this.folders.container;\n placeholder.attach({\n container: chatList.parentElement,\n getRectFrom,\n onRemove: () => {\n delete this.placeholders[filterId];\n },\n blockScrollable: this.scroll\n });\n\n cachedInfoPromise.resolve(false);\n }\n\n const a = await getConversationsResult;\n const result = await a.result;\n // await pause(5000);\n if(this.loadDialogsRenderPromise !== renderPromise || doNotRenderChatList) {\n throw middlewareError;\n }\n\n cachedInfoPromise.resolve(a.cached);\n\n // console.timeEnd('getDialogs time');\n\n // * loaded all\n // if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n // if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scroll.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scroll.loadedAll[side] = true;\n }\n\n const length = result.dialogs.length;\n log(`will render ${length} dialogs`);\n if(length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n\n const loadPromises = dialogs.map((dialog) => {\n return this.sortedList.add(dialog.peerId);\n });\n\n await Promise.all(loadPromises).catch();\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : length - 1];\n if(offsetDialog) {\n this.offsets[side] = getDialogIndex(offsetDialog, indexKey);\n }\n\n // don't set it before - no need to fire length change with every dialog\n this.loadedDialogsAtLeastOnce = true;\n this.onListLengthChange();\n\n log('getDialogs ' + loadCount + ' dialogs by offset:', offsetIndex, result, chatList.childElementCount);\n\n setTimeout(() => {\n this.scroll.onScroll();\n }, 0);\n\n if(placeholder) {\n // await pause(500);\n placeholder.detach(chatList.childElementCount);\n }\n } catch(err) {\n if((err as ApiError)?.type !== 'MIDDLEWARE') {\n log.error(err);\n }\n\n reject(err);\n cachedInfoPromise.reject(err);\n return;\n }\n\n resolve();\n }).finally(() => {\n if(this.loadDialogsRenderPromise === renderPromise) {\n log('end');\n this.loadDialogsRenderPromise = undefined;\n } else {\n log('has been cleared');\n }\n });\n\n this.loadDialogsRenderPromise = renderPromise;\n const loadDialogsPromise = this.loadDialogsPromise = cachedInfoPromise.then((cached) => {\n return {\n cached,\n renderPromise\n };\n }).finally(() => {\n if(this.loadDialogsPromise === loadDialogsPromise) {\n this.loadDialogsPromise = undefined;\n }\n });\n\n return loadDialogsPromise;\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 === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find((el) => el.matches('.empty-placeholder'));\n const needPlaceholder = this.scroll.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType, type: 'dialogs' | 'folder';\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: type = 'dialogs'\n });\n\n placeholderContainer = placeholder.container;\n\n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n\n this.emptyDialogsPlaceholderSubtitle = new I18n.IntlElement({\n element: placeholder.subtitle\n });\n\n Promise.all([\n this.updateContactsLength(false),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(([usersLength]) => {\n placeholderContainer.classList.add('visible');\n part.classList.toggle('has-contacts', !!usersLength);\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: type = 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n const div = document.createElement('div');\n const emoji = '📂';\n const size = 128;\n wrapStickerEmoji({\n div,\n emoji: emoji,\n width: size,\n height: size\n });\n\n placeholderContainer.prepend(div);\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, async() => {\n appSidebarLeft.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(this.filterId));\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n part.dataset.placeholderType = type;\n }\n\n private updateContactsLength(updatePartClassName: boolean) {\n return this.updateContactsLengthPromise ??= this.managers.appUsersManager.getContacts().then((users) => {\n const subtitle = this.emptyDialogsPlaceholderSubtitle;\n if(subtitle) {\n let key: LangPackKey, args: FormatterArguments;\n\n if(users.length/* && false */) {\n key = 'ChatList.Main.EmptyPlaceholder.Subtitle';\n args = [i18n('Contacts.Count', [users.length])];\n } else {\n key = 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts';\n args = [];\n }\n\n subtitle.compareAndUpdate({\n key,\n args\n });\n }\n\n if(updatePartClassName) {\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n part.classList.toggle('has-contacts', !!users.length);\n }\n\n this.updateContactsLengthPromise = undefined;\n\n return users.length;\n });\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.replaceChildren();\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 !== FOLDER_ID_ALL) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n this.managers.appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then((contacts) => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n\n this.updateContactsLength(true);\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 'abitbigger',\n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false,\n onListLengthChange,\n managers: this.managers\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const promise = filterAsync(contacts.splice(0, pageCount), this.verifyPeerIdForContacts);\n\n promise.then((arr) => {\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = async(peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = await this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = async(peerId: PeerId) => {\n const [isContact, dialog] = await Promise.all([\n this.managers.appPeersManager.isContact(peerId),\n this.managers.appMessagesManager.getDialogOnly(peerId)\n ]);\n\n return isContact && !dialog;\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 const perf = performance.now();\n\n const scrollTopWas = this.scroll.scrollTop;\n\n const firstElementChild = this.chatList.firstElementChild;\n const rectContainer = this.scroll.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scroll.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scroll.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n\n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n // alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n // alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scroll.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scroll.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach((el) => {\n const peerId = el.dataset.peerId.toPeerId();\n this.deleteDialog(peerId);\n });\n\n this.setOffsets();\n\n // this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n // this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n // alert('left length:' + children.length);\n\n this.scroll.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n // this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n private async setOffsets() {\n const chatList = this.chatList;\n const firstDialog = await this.getDialogFromElement(chatList.firstElementChild as HTMLElement);\n const lastDialog = await this.getDialogFromElement(chatList.lastElementChild as HTMLElement);\n\n const indexKey = this.indexKey;\n this.offsets.top = getDialogIndex(firstDialog, indexKey);\n this.offsets.bottom = getDialogIndex(lastDialog, indexKey);\n }\n\n private getDialogFromElement(element: HTMLElement) {\n return this.managers.appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n\n public onChatsScrollTop = () => {\n return this.onChatsScroll('top');\n };\n\n public onChatsScroll = (side: SliceSides = 'bottom') => {\n if(this.scroll.loadedAll[side]) {\n if(this.loadContacts) {\n this.loadContacts();\n }\n }\n\n this.log('onChatsScroll', side);\n return this.loadDialogs(side);\n };\n\n public setListClickListener(list: HTMLUListElement, onFound?: () => void, withContext = false, autonomous = false, openInner = false) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, DIALOG_LIST_ELEMENT_TAG);\n\n if(!elem) {\n return;\n }\n\n const peerId = elem.dataset.peerId.toPeerId();\n\n if(e.ctrlKey || e.metaKey) {\n window.open((elem as HTMLAnchorElement).href || ('#' + peerId), '_blank');\n cancelEvent(e);\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(elem) {\n if(onFound) onFound();\n\n const lastMsgId = +elem.dataset.mid || undefined;\n\n setPeerFunc({\n peerId, lastMsgId\n });\n } else {\n setPeerFunc();\n }\n }, {capture: true});\n\n // cancel link click\n // ! do not change it to attachClickEvent\n list.addEventListener('click', (e) => {\n if(e.button === 0) {\n cancelEvent(e);\n }\n }, {capture: true});\n\n if(DEBUG) {\n list.addEventListener('dblclick', (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(li) {\n const peerId = li.dataset.peerId.toPeerId();\n this.log('debug dialog:', this.managers.appMessagesManager.getDialogByPeerId(peerId));\n }\n });\n }\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number,\n ignoreClick?: boolean\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* ,\n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n // if(options.ignoreClick) {\n // list.classList.add('disable-hover');\n // }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessageN(options: {\n dialog: Dialog,\n lastMessage?: Message.message | Message.messageService,\n dom?: DialogDom,\n highlightWord?: string,\n isBatch?: boolean,\n setUnread?: boolean\n }) {\n const promise = this.setLastMessage(options.dialog, options.lastMessage, options.dom, options.highlightWord, options.isBatch, options.setUnread);\n return promise.catch(noop);\n }\n\n private async setLastMessage(\n dialog: Dialog,\n lastMessage: Message.message | Message.messageService,\n dom: DialogDom,\n highlightWord?: string,\n isBatch = false,\n setUnread = false\n ) {\n if(!dom) {\n dom = this.getDialogDom(dialog.peerId);\n\n if(!dom) {\n return;\n }\n }\n\n const {deferred: promise, middleware} = setPromiseMiddleware(dom, 'setLastMessagePromise');\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(dialog.draft?._ === 'draftMessage') {\n draftMessage = dialog.draft;\n }\n\n lastMessage = dialog.topMessage;\n if(!lastMessage || lastMessage.mid !== dialog.top_message) {\n const promise = this.managers.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n lastMessage = await middleware(promise);\n }\n }\n\n if(setUnread) {\n this.setUnreadMessagesN({dialog, dom, isBatch, setLastMessagePromise: promise});\n }\n\n if(!lastMessage/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.textContent = '';\n dom.lastTimeSpan.textContent = '';\n delete dom.listEl.dataset.mid;\n\n promise.resolve();\n return;\n }\n\n const peerId = dialog.peerId;\n const isRestricted = lastMessage && isMessageRestricted(lastMessage as Message.message);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n let mediaContainer: HTMLElement;\n const willPrepend: (Promise | HTMLElement)[] = [];\n if(lastMessage && !draftMessage && !isRestricted) {\n const media: MyDocument | MyPhoto = getMediaFromMessage(lastMessage);\n const videoTypes: Set = new Set(['video', 'gif', 'round']);\n if(media && (media._ === 'photo' || videoTypes.has(media.type))) {\n const size = choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n\n if((media as MyDocument).type === 'round') {\n mediaContainer.classList.add('is-round');\n }\n\n willPrepend.push(wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size\n }).then(() => mediaContainer));\n\n if(videoTypes.has((media as MyDocument).type)) {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const span = document.createElement('span');\n span.classList.add('danger');\n span.append(i18n('Draft'), ': ');\n willPrepend.unshift(span);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !(lastMessage as Message.messageService).action) {\n const span = document.createElement('span');\n span.classList.add('primary-text');\n\n if(lastMessage.fromId === rootScope.myId) {\n span.append(i18n('FromYou'));\n willPrepend.unshift(span);\n } else {\n // str = sender.first_name || sender.last_name || sender.username;\n const p = middleware(wrapPeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true\n })).then((element) => {\n span.prepend(element);\n return span;\n }, noop);\n\n willPrepend.unshift(p);\n }\n\n span.append(': ');\n // console.log(sender, senderBold.innerText);\n }\n\n const withoutMediaType = !!mediaContainer && !!(lastMessage as Message.message)?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && (lastMessage as Message.message).message) {\n fragment = await middleware(wrapMessageForReply(lastMessage, undefined, undefined, false, highlightWord, withoutMediaType));\n } else if(draftMessage) {\n fragment = await middleware(wrapMessageForReply(draftMessage));\n } else if(lastMessage) {\n fragment = await middleware(wrapMessageForReply(lastMessage, undefined, undefined, false, undefined, withoutMediaType));\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(willPrepend.length) {\n const elements = await middleware(Promise.all(willPrepend));\n fragment.prepend(...elements);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n }\n\n if(lastMessage || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null && !setUnread) { // means search\n dom.listEl.dataset.mid = '' + lastMessage.mid;\n }\n\n promise.resolve();\n }\n\n private setUnreadMessagesN(options: {\n dialog: Dialog,\n dom?: DialogDom,\n isBatch?: boolean,\n setLastMessagePromise?: Promise\n }) {\n return this.setUnreadMessages(options.dialog, options.dom, options.isBatch, options.setLastMessagePromise).catch(() => {});\n }\n\n private async setUnreadMessages(\n dialog: Dialog,\n dom = this.getDialogDom(dialog.peerId),\n isBatch = false,\n setLastMessagePromise?: Promise\n ) {\n if(!dom) {\n // this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n const {deferred, middleware} = setPromiseMiddleware(dom, 'setUnreadMessagePromise');\n\n const isMuted = await middleware(this.managers.appNotificationsManager.isPeerLocalMuted(dialog.peerId, true));\n const wasMuted = dom.listEl.classList.contains('is-muted');\n\n let setStatusMessage: MyMessage;\n if(dialog.draft?._ !== 'draftMessage') {\n const lastMessage: MyMessage = await middleware(this.managers.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message));\n if(lastMessage && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n }\n\n const filter = await middleware(this.managers.filtersStorage.getFilter(this.filterId));\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(dialog.peerId) !== -1;\n } else {\n isPinned = !!dialog.pFlags.pinned;\n }\n\n const isDialogUnread = await middleware(this.managers.appMessagesManager.isDialogUnread(dialog));\n const hasUnreadBadge = isPinned || isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n // * have to await all promises before modifying something\n\n if(setLastMessagePromise) {\n try {\n await middleware(setLastMessagePromise);\n } catch(err) {\n // return;\n }\n }\n\n const transitionDuration = isBatch ? 0 : 200;\n\n if(isMuted !== wasMuted) {\n SetTransition(dom.listEl, 'is-muted', isMuted, transitionDuration);\n }\n\n setSendingStatus(dom.statusSpan, setStatusMessage, true);\n\n const isUnreadBadgeMounted = isInDOM(dom.unreadBadge);\n if(hasUnreadBadge && !isUnreadBadgeMounted) {\n dom.subtitleEl.append(dom.unreadBadge);\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionBadgeMounted = dom.mentionsBadge && isInDOM(dom.mentionsBadge);\n if(hasMentionsBadge) {\n if(!dom.mentionsBadge) {\n dom.mentionsBadge = document.createElement('div');\n dom.mentionsBadge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} mention mention-badge`;\n dom.mentionsBadge.innerText = '@';\n dom.subtitleEl.insertBefore(dom.mentionsBadge, dom.lastMessageSpan.nextSibling);\n }\n }\n\n SetTransition(dom.unreadBadge, 'is-visible', hasUnreadBadge, transitionDuration, hasUnreadBadge ? undefined : () => {\n dom.unreadBadge.remove();\n }, !isUnreadBadgeMounted ? 2 : 0);\n\n if(dom.mentionsBadge) {\n SetTransition(dom.mentionsBadge, 'is-visible', hasMentionsBadge, transitionDuration, hasMentionsBadge ? undefined : () => {\n dom.mentionsBadge.remove();\n delete dom.mentionsBadge;\n }, !isMentionBadgeMounted ? 2 : 0);\n }\n\n if(!hasUnreadBadge) {\n deferred.resolve();\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false;\n if(dialog.unread_mentions_count && dialog.unread_count === 1) {\n dom.unreadBadge.innerText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n // dom.unreadMessagesSpan.innerText = '' + (dialog.unread_count ? formatNumber(dialog.unread_count, 1) : ' ');\n dom.unreadBadge.innerText = '' + (dialog.unread_count || ' ');\n } else {\n dom.unreadBadge.innerText = '';\n isUnread = false;\n }\n\n dom.unreadBadge.classList.toggle('unread', isUnread);\n dom.unreadBadge.classList.toggle('mention', isMention);\n deferred.resolve();\n }\n\n private getDialogDom(peerId: PeerId) {\n // return this.doms[peerId];\n const element = this.sortedList.get(peerId);\n return element?.dom;\n }\n\n private async getDialog(dialog: Dialog | PeerId) {\n if(typeof(dialog) !== 'object') {\n const originalDialog = await this.managers.appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: await this.managers.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any as Dialog;\n }\n\n return originalDialog;\n }\n\n return dialog as Dialog;\n }\n\n private setCallStatus(dom: DialogDom, visible: boolean) {\n let {callIcon, listEl} = dom;\n if(!callIcon && visible) {\n const {canvas, startAnimation} = dom.callIcon = callIcon = groupCallActiveIcon(listEl.classList.contains('active'));\n canvas.classList.add('dialog-group-call-icon');\n listEl.append(canvas);\n startAnimation();\n }\n\n if(!callIcon) {\n return;\n }\n\n SetTransition(dom.callIcon.canvas, 'is-visible', visible, 200, visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n }, visible ? 2 : 0);\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const promise = this.getDialog(options.peerId).then((dialog) => {\n const {peerId} = dialog;\n const promises: Promise[] = [];\n if(!peerId.isUser()) {\n promises.push(this.processDialogForCallStatus(dialog, ret.dom));\n }\n\n if(peerId !== rootScope.myId && peerId.isUser()) {\n promises.push(this.managers.appUsersManager.getUser(peerId).then((user) => {\n if(user.status?._ === 'userStatusOnline') {\n this.setOnlineStatus(ret.dom.avatarEl, true);\n }\n }));\n }\n\n promises.push(this.setLastMessageN({\n dialog,\n dom: ret.dom,\n isBatch: options.isBatch,\n setUnread: true\n }));\n\n return Promise.all(promises);\n });\n\n if(options.loadPromises) {\n options.loadPromises.push(promise);\n }\n }\n\n return ret;\n }\n\n private async processDialogForCallStatus(dialog: Dialog, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(dialog.peerId);\n if(!dom) return;\n\n const chat: Chat.chat | Chat.channel = await this.managers.appChatsManager.getChat(dialog.peerId.toChatId());\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n /**\n * use for rendering search result\n */\n public addDialogAndSetLastMessage(options: Omit[0], 'dialog'> & {\n message: MyMessage,\n peerId: PeerId,\n query?: string\n }) {\n const {peerId, message, query} = options;\n const ret = this.addDialogNew({\n ...options,\n ...getMessageSenderPeerIdOrName(message),\n peerId\n });\n\n this.setLastMessage({_: 'dialog', peerId} as any, message, ret.dom, query);\n\n if(message.peerId !== peerId) {\n ret.dom.listEl.dataset.peerId = '' + message.peerId;\n }\n\n return ret;\n }\n\n public addDialogNew(options: {\n peerId: Parameters[0],\n container?: Parameters[1],\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n append?: boolean,\n avatarSize?: RowMediaSizeType,\n autonomous?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n loadPromises?: Promise[],\n fromName?: string,\n noIcons?: boolean\n }) {\n const d = new DialogElement({\n autonomous: !!options.container,\n avatarSize: 'bigger',\n ...options\n // avatarSize: !options.avatarSize || options.avatarSize >= 54 ? 'bigger' : 'abitbigger',\n });\n\n if(options.container) {\n const method = !options.append ? 'append' : 'prepend';\n options.container[method](d.container);\n }\n\n return d;\n // return this.addDialog(options.peerId, options.container, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName, options.noIcons);\n }\n\n public addDialog(\n peerId: PeerId,\n container?: HTMLElement | Scrollable | DocumentFragment | false,\n rippleEnabled = true,\n onlyFirstName = false,\n meAsSaved = true,\n append = true,\n avatarSize = 54,\n autonomous = !!container,\n lazyLoadQueue?: LazyLoadQueue,\n loadPromises?: Promise[],\n fromName?: string,\n noIcons?: boolean\n ) {\n // const dialog = await this.getDialog(_dialog);\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('dialog-avatar', 'avatar-' + avatarSize);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n const captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n\n const titleSpanContainer = document.createElement('span');\n titleSpanContainer.classList.add('user-title');\n\n const peerTitle = new PeerTitle();\n const peerTitlePromise = peerTitle.update({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n plainText: false,\n withIcons: !noIcons\n });\n\n if(loadPromises) {\n loadPromises.push(peerTitlePromise);\n }\n\n titleSpanContainer.append(peerTitle.element);\n // p.classList.add('')\n\n // в других случаях иконка верификации не нужна (а первый - это главные чатлисты)\n // if(!container) {\n\n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n\n // const titleIconsPromise = generateTitleIcons(peerId).then((elements) => {\n // titleSpanContainer.append(...elements);\n // });\n\n // if(loadPromises) {\n // loadPromises.push(titleIconsPromise);\n // }\n // }\n\n const span = document.createElement('span');\n span.classList.add('user-last-message');\n span.setAttribute('dir', 'auto');\n\n // captionDiv.append(titleSpan);\n // captionDiv.append(span);\n\n const li = document.createElement(DIALOG_LIST_ELEMENT_TAG);\n li.classList.add('chatlist-chat');\n if(!autonomous) (li as HTMLAnchorElement).href = '#' + peerId;\n if(rippleEnabled) {\n ripple(li);\n }\n\n li.append(avatarEl, captionDiv);\n li.dataset.peerId = '' + peerId;\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const unreadBadge = document.createElement('div');\n unreadBadge.className = 'dialog-subtitle-badge badge badge-' + BADGE_SIZE;\n\n const titleP = document.createElement('p');\n titleP.classList.add('dialog-title');\n\n const rightSpan = document.createElement('span');\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpanContainer, rightSpan);\n\n const subtitleEl = document.createElement('p');\n subtitleEl.classList.add('dialog-subtitle');\n subtitleEl.append(span);\n\n captionDiv.append(titleP, subtitleEl);\n\n const dom: DialogDom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n unreadBadge,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl\n };\n\n /* let good = false;\n for(const folderId in this.chatLists) {\n if(this.chatLists[folderId] === container) {\n good = true;\n }\n } */\n if(container) {\n const method = append ? 'append' : 'prepend';\n container[method](li);\n }\n\n if(!autonomous) {\n // @ts-ignore\n li.dialogDom = dom;\n\n if(appImManager.chat?.peerId === peerId) {\n this.setDialogActive(li, true);\n }\n }\n\n return {dom};\n }\n\n public async setTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = await appImManager.getPeerTyping(dialog.peerId, oldTypingElement);\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n dom.lastMessageSpan.classList.remove('user-typing');\n this.setLastMessageN({\n dialog,\n lastMessage: null,\n dom,\n setUnread: null\n });\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","export default function getUnsafeRandomInt(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {DownloadMediaOptions, DownloadOptions} from '../mtproto/apiFileManager';\r\nimport type {AppMessagesManager} from './appMessagesManager';\r\nimport type {MyDocument} from './appDocsManager';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport {InputFile, Photo, PhotoSize} from '../../layer';\r\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\r\nimport {AppManagers} from './managers';\r\nimport rootScope from '../rootScope';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport noop from '../../helpers/noop';\r\nimport getDownloadMediaDetails from './utils/download/getDownloadMediaDetails';\r\nimport getDownloadFileNameFromOptions from './utils/download/getDownloadFileNameFromOptions';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport makeError from '../../helpers/makeError';\r\nimport createDownloadAnchor from '../../helpers/dom/createDownloadAnchor';\r\nimport {getFileNameByLocation} from '../../helpers/fileName';\r\nimport getDocumentDownloadOptions from './utils/docs/getDocumentDownloadOptions';\r\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadUrl = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n// export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob | DownloadUrl/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\ntype DownloadType = 'url' | 'blob' | 'void' | 'disc';\r\n\r\nexport class AppDownloadManager {\r\n private downloads: {[fileName: string]: {main: Download} & {[type in DownloadType]?: Download}} = {};\r\n // private downloadsToDisc: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n // private progressCallbacks: {[fileName: string]: Array} = {};\r\n private managers: AppManagers;\r\n\r\n public construct(managers: AppManagers) {\r\n this.managers = managers;\r\n rootScope.addEventListener('download_progress', (details) => {\r\n // 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?.main?.notifyAll) {\r\n this.progress[details.fileName] = details;\r\n download.main.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string, type?: DownloadType) {\r\n const deferred = deferredPromise();\r\n\r\n let download = this.downloads[fileName];\r\n if(!download) {\r\n download = this.downloads[fileName] = {\r\n main: deferred as any\r\n };\r\n\r\n deferred.cancel = () => {\r\n const error = makeError('DOWNLOAD_CANCELED');\r\n\r\n this.managers.apiFileManager.cancelDownload(fileName);\r\n\r\n deferred.reject(error);\r\n deferred.cancel = noop;\r\n };\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName, type);\r\n }).finally(() => {\r\n delete this.progress[fileName];\r\n // delete this.progressCallbacks[fileName];\r\n });\r\n } else {\r\n const main = download.main;\r\n (['cancel', 'addNotifyListener', 'notify', 'notifyAll'] as (keyof CancellablePromise)[]).forEach((key) => {\r\n if(!main[key]) {\r\n return;\r\n }\r\n\r\n // @ts-ignore\r\n deferred[key] = main[key].bind(main);\r\n });\r\n }\r\n\r\n const haveToClear = type === 'disc';\r\n if(haveToClear) {\r\n deferred.catch(noop).finally(() => {\r\n this.clearDownload(fileName, type);\r\n });\r\n }\r\n\r\n return download[type] = deferred as any;\r\n }\r\n\r\n public getNewDeferredForUpload>(fileName: string, promise: T) {\r\n const deferred = this.getNewDeferred(fileName);\r\n promise.then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as CancellablePromise>;\r\n }\r\n\r\n private clearDownload(fileName: string, type?: DownloadType) {\r\n const downloads = this.downloads[fileName];\r\n if(!downloads) {\r\n return;\r\n }\r\n\r\n delete downloads[type];\r\n\r\n const length = Object.keys(downloads).length;\r\n if(!length || (downloads.main && length === 1)) {\r\n delete this.downloads[fileName];\r\n }\r\n }\r\n\r\n public getUpload(fileName: string): ReturnType['promise'] {\r\n let deferred: CancellablePromise = this.getDownload(fileName);\r\n if(deferred) {\r\n return deferred;\r\n }\r\n\r\n deferred = this.getNewDeferred(fileName);\r\n this.managers.appMessagesManager.getUploadPromise(fileName).then(deferred.resolve, deferred.reject);\r\n return deferred;\r\n }\r\n\r\n /* public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then((response) => response.blob())\r\n .then((blob) => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n } */\r\n\r\n private d(fileName: string, getPromise: () => Promise, type?: DownloadType) {\r\n let deferred = this.getDownload(fileName, type);\r\n if(deferred) return deferred;\r\n\r\n deferred = this.getNewDeferred(fileName, type);\r\n getPromise().then(deferred.resolve, deferred.reject);\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getDownloadFileNameFromOptions(options);\r\n return this.d(fileName, () => this.managers.apiFileManager.download(options), 'blob') as any;\r\n }\r\n\r\n public downloadMedia(options: DownloadMediaOptions, type: DownloadType = 'blob', promiseBefore?: Promise): DownloadBlob {\r\n const {downloadOptions, fileName} = getDownloadMediaDetails(options);\r\n\r\n return this.d(fileName, () => {\r\n let cb: any;\r\n if(type === 'url') {\r\n cb = this.managers.apiFileManager.downloadMediaURL;\r\n } else if(type === 'void'/* || type === 'disc' */) {\r\n cb = this.managers.apiFileManager.downloadMediaVoid;\r\n } else /* if(type === 'blob') */ {\r\n cb = this.managers.apiFileManager.downloadMedia;\r\n }\r\n\r\n if(promiseBefore) {\r\n return promiseBefore.then(() => cb(options));\r\n }\r\n\r\n return cb(options);\r\n }, type) as any;\r\n }\r\n\r\n public downloadMediaURL(options: DownloadMediaOptions): DownloadUrl {\r\n return this.downloadMedia(options, 'url') as any;\r\n }\r\n\r\n public downloadMediaVoid(options: DownloadMediaOptions): DownloadBlob {\r\n return this.downloadMedia(options, 'void');\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string, promise?: Promise) {\r\n if(!fileName) {\r\n fileName = getFileNameForUpload(file);\r\n }\r\n\r\n if(!promise) {\r\n promise = this.managers.apiFileManager.upload({file, fileName});\r\n }\r\n\r\n const deferred = this.getNewDeferredForUpload(fileName, promise);\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string, type?: DownloadType) {\r\n const d = this.downloads[fileName];\r\n return d && d[type];\r\n }\r\n\r\n // public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n // const progress = this.progress[fileName];\r\n // (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n // if(progress) {\r\n // callback(progress);\r\n // }\r\n // }\r\n\r\n public downloadToDisc(options: DownloadMediaOptions, justAttach?: boolean) {\r\n const media = options.media;\r\n const isDocument = media._ === 'document';\r\n if(!isDocument && !options.thumb) {\r\n options.thumb = (media as Photo.photo).sizes.slice().pop() as PhotoSize.photoSize;\r\n }\r\n\r\n // const {fileName: cacheFileName} = getDownloadMediaDetails(options);\r\n // if(justAttach) {\r\n // const promise = this.downloadsToDisc[cacheFileName];\r\n // if(promise) {\r\n // return promise;\r\n // }\r\n // }\r\n\r\n // const {downloadOptions, fileName} = getDownloadMediaDetails(options);\r\n // if(downloadOptions.size && downloadOptions.size > MAX_FILE_SAVE_SIZE) {\r\n const id = '' + (Math.random() * 0x7FFFFFFF | 0);\r\n // const id = 'test';\r\n const url = `download/${id}`;\r\n options.downloadId = id;\r\n\r\n const pingPromise = apiManagerProxy.pingServiceWorkerWithIframe();\r\n\r\n const promise = this.downloadMedia(options, 'disc', pingPromise);\r\n // this.downloadsToDisc[cacheFileName] = promise;\r\n\r\n if(justAttach) {\r\n return promise;\r\n }\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.hidden = true;\r\n\r\n pingPromise.then(() => {\r\n iframe.src = url;\r\n document.body.append(iframe);\r\n });\r\n\r\n // createDownloadAnchor(url, 'asd.txt');\r\n\r\n // const events = [\r\n // 'emptied',\r\n // 'abort',\r\n // 'suspend',\r\n // 'reset',\r\n // 'error',\r\n // 'ended',\r\n // 'load'\r\n // ].forEach((event) => {\r\n // iframe.addEventListener(event, () => alert(event));\r\n // iframe.contentWindow.addEventListener(event, () => alert(event));\r\n // });\r\n\r\n let element: HTMLElement, hadProgress = false;\r\n const onProgress = () => {\r\n if(hadProgress) {\r\n return;\r\n }\r\n\r\n hadProgress = true;\r\n element = iframe;\r\n\r\n indexOfAndSplice(promise.listeners, onProgress);\r\n };\r\n\r\n promise.addNotifyListener(onProgress);\r\n promise.then((blob) => {\r\n if(!blob) {\r\n return;\r\n }\r\n\r\n const url = URL.createObjectURL(blob);\r\n const downloadOptions = isDocument ?\r\n getDocumentDownloadOptions(media) :\r\n getPhotoDownloadOptions(media as any, options.thumb as PhotoSize.photoSize);\r\n const fileName = (options.media as MyDocument).file_name || getFileNameByLocation(downloadOptions.location);\r\n createDownloadAnchor(url, downloadOptions.fileName || fileName, () => {\r\n URL.revokeObjectURL(url);\r\n });\r\n }).catch(noop).finally(() => {\r\n if(!hadProgress) {\r\n onProgress();\r\n }\r\n\r\n setTimeout(() => {\r\n element?.remove();\r\n }, 1000);\r\n\r\n // if(this.downloadsToDisc[cacheFileName] === promise) {\r\n // delete this.downloadsToDisc[cacheFileName];\r\n // }\r\n });\r\n\r\n return promise;\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.target = '_blank';\n\n a.style.position = 'absolute';\n a.style.top = '1px';\n a.style.left = '1px';\n\n document.body.append(a);\n\n try {\n const clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n a.dispatchEvent(clickEvent);\n } catch(e) {\n console.error('Download click error', e);\n try {\n a.click();\n } catch(e) {\n window.open(url as string, '_blank');\n }\n }\n\n setTimeout(() => {\n a.remove();\n onRemove && onRemove();\n }, 100);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../../lib/rootScope';\r\n// import { generatePathData } from \"../../helpers/dom\";\r\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\r\nimport type Chat from './chat';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\r\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\r\nimport AvatarElement from '../avatar';\r\nimport {Message} from '../../layer';\r\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\r\nimport {SERVICE_AS_REGULAR, STICKY_OFFSET} from './bubbles';\r\nimport forEachReverse from '../../helpers/array/forEachReverse';\r\nimport partition from '../../helpers/array/partition';\r\n\r\ntype GroupItem = {\r\n bubble: HTMLElement,\r\n fromId: PeerId,\r\n mid: number,\r\n groupMid?: number,\r\n timestamp: number,\r\n dateTimestamp: number,\r\n mounted: boolean,\r\n single: boolean,\r\n group?: BubbleGroup,\r\n message: Message.message | Message.messageService // use it only to set avatar\r\n};\r\n\r\nclass BubbleGroup {\r\n container: HTMLElement;\r\n chat: Chat;\r\n groups: BubbleGroups;\r\n items: GroupItem[]; // descend sorted\r\n avatarContainer: HTMLElement;\r\n avatarLoadPromise: ReturnType;\r\n avatar: AvatarElement;\r\n mounted: boolean;\r\n dateTimestamp: number;\r\n offset: number;\r\n\r\n constructor(chat: Chat, groups: BubbleGroups, dateTimestamp: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('bubbles-group');\r\n this.chat = chat;\r\n this.groups = groups;\r\n this.items = [];\r\n this.dateTimestamp = dateTimestamp;\r\n this.offset = 0;\r\n }\r\n\r\n createAvatar(message: Message.message | Message.messageService) {\r\n if(this.avatarLoadPromise) {\r\n return this.avatarLoadPromise;\r\n } else if(message._ === 'messageService') {\r\n return;\r\n }\r\n\r\n this.avatarContainer = document.createElement('div');\r\n this.avatarContainer.classList.add('bubbles-group-avatar-container');\r\n ++this.offset;\r\n\r\n const fwdFrom = message.fwd_from;\r\n const fwdFromId = message.fwdFromId;\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\r\n const currentPeerId = this.chat.peerId;\r\n const avatar = this.avatar = new AvatarElement();\r\n this.avatar.classList.add('bubbles-group-avatar', 'user-avatar', 'avatar-40'/* , 'can-zoom-fade' */);\r\n const peerId = ((fwdFrom && (currentPeerId === rootScope.myId || currentPeerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID;\r\n const avatarLoadPromise = this.avatar.updateWithOptions({\r\n lazyLoadQueue: this.chat.bubbles.lazyLoadQueue,\r\n peerId,\r\n peerTitle: !fwdFromId && fwdFrom && fwdFrom.from_name ? /* '🔥 FF 🔥' */fwdFrom.from_name : undefined\r\n });\r\n\r\n // this.avatarLoadPromise = Promise.all([\r\n // avatarLoadPromise,\r\n // peerId && peerId.isUser() ? this.chat.managers.appUsersManager.getUser(peerId.toUserId()) : undefined\r\n // ]).then(([result, user]) => {\r\n // if(user?.pFlags?.premium) {\r\n // avatar.classList.add('is-premium', 'tgico-star');\r\n // }\r\n\r\n // return result;\r\n // });\r\n this.avatarLoadPromise = avatarLoadPromise;\r\n\r\n this.avatarContainer.append(this.avatar);\r\n this.container.append(this.avatarContainer);\r\n\r\n return this.avatarLoadPromise;\r\n }\r\n\r\n get firstTimestamp() {\r\n return this.firstItem.timestamp;\r\n }\r\n\r\n get firstMid() {\r\n return this.firstItem.mid;\r\n }\r\n\r\n get firstItem() {\r\n return this.items[this.items.length - 1];\r\n }\r\n\r\n get lastTimestamp() {\r\n return this.lastItem.timestamp;\r\n }\r\n\r\n get lastMid() {\r\n return this.lastItem.mid;\r\n }\r\n\r\n get lastItem() {\r\n return this.items[0];\r\n }\r\n\r\n updateClassNames() {\r\n const items = this.items;\r\n const length = items.length;\r\n if(!length) {\r\n return;\r\n }\r\n\r\n // const elements = Array.from(this.container.children);\r\n // if(this.offset) elements.splice(0, this.offset);\r\n\r\n // const length = elements.length;\r\n // if(!length) {\r\n // return;\r\n // }\r\n\r\n const first = items[length - 1].bubble;\r\n\r\n if(items.length === 1) {\r\n first.classList.add('is-group-first', 'is-group-last');\r\n // this.setClipIfNeeded(first);\r\n return;\r\n } else {\r\n first.classList.remove('is-group-last');\r\n first.classList.add('is-group-first');\r\n // this.setClipIfNeeded(first, true);\r\n }\r\n\r\n for(let i = 1, _length = length - 1; i < _length; ++i) {\r\n const bubble = items[i].bubble;\r\n bubble.classList.remove('is-group-last', 'is-group-first');\r\n // this.setClipIfNeeded(bubble, true);\r\n }\r\n\r\n const last = items[0].bubble;\r\n last.classList.remove('is-group-first');\r\n last.classList.add('is-group-last');\r\n // this.setClipIfNeeded(last);\r\n }\r\n\r\n insertItem(item: GroupItem) {\r\n const {items} = this;\r\n insertInDescendSortedArray(items, item, this.groups.sortGroupItemsKey);\r\n\r\n item.group = this;\r\n if(items.length === 1) {\r\n this.groups.insertGroup(this);\r\n }\r\n }\r\n\r\n removeItem(item: GroupItem) {\r\n indexOfAndSplice(this.items, item);\r\n\r\n if(!this.items.length) {\r\n indexOfAndSplice(this.groups.groups, this);\r\n }\r\n\r\n item.group = undefined;\r\n }\r\n\r\n mount(updateClassNames?: boolean) {\r\n if(!this.groups.groups.includes(this) || !this.items.length) { // group can be already removed\r\n debugger;\r\n\r\n if(this.mounted) {\r\n this.onItemUnmount();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const {offset, items} = this;\r\n const {length} = items;\r\n forEachReverse(items, (item, idx) => {\r\n this.mountItem(item, length - 1 - idx, offset);\r\n });\r\n\r\n if(updateClassNames) {\r\n this.updateClassNames();\r\n }\r\n\r\n this.onItemMount();\r\n }\r\n\r\n mountItem(item: GroupItem, idx = this.items.indexOf(item), offset = this.offset) {\r\n if(item.mounted) {\r\n return;\r\n }\r\n\r\n positionElementByIndex(item.bubble, this.container, offset + idx);\r\n item.mounted = true;\r\n }\r\n\r\n unmountItem(item: GroupItem) {\r\n if(!item.mounted) {\r\n return;\r\n }\r\n\r\n item.bubble.remove();\r\n item.mounted = false;\r\n this.onItemUnmount();\r\n }\r\n\r\n onItemMount() {\r\n if(this.mounted) {\r\n return;\r\n }\r\n\r\n const dateContainer = this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp / 1000);\r\n // const idx = this.groups.indexOf(group);\r\n const dateGroups = this.groups.groups.filter((_group) => _group.dateTimestamp === this.dateTimestamp);\r\n const dateGroupsLength = dateGroups.length;\r\n const idx = dateGroups.indexOf(this);\r\n const unmountedLength = dateGroups.slice(idx + 1).reduce((acc, v) => acc + (v.mounted ? 0 : 1), 0);\r\n positionElementByIndex(this.container, dateContainer.container, STICKY_OFFSET + dateGroupsLength - 1 - idx - unmountedLength);\r\n this.mounted = true;\r\n }\r\n\r\n onItemUnmount() {\r\n if(!this.mounted) {\r\n return;\r\n }\r\n\r\n if(!this.items.length) {\r\n this.container.remove();\r\n this.chat.bubbles.deleteEmptyDateGroups();\r\n this.mounted = false;\r\n } else {\r\n this.updateClassNames();\r\n }\r\n }\r\n}\r\n\r\n// class BubbleGroupItem implements GroupItem {\r\n// bubble: HTMLElement;\r\n// fromId: PeerId;\r\n// mid: number;\r\n// timestamp: number;\r\n// dateTimestamp: number;\r\n// mounted: boolean;\r\n// single: boolean;\r\n// group: BubbleGroup;\r\n\r\n// constructor(details: GroupItem) {\r\n// Object.assign(this, details);\r\n// }\r\n// }\r\n\r\nexport default class BubbleGroups {\r\n public itemsArr: Array = []; // descend sorted\r\n private itemsMap: Map = new Map();\r\n public groups: Array = []; // descend sorted\r\n private newGroupDiff = 121; // * 121 in scheduled messages\r\n private sortItemsKey: Extract;\r\n private sortGroupsKey: Extract;\r\n public sortGroupItemsKey: Extract;\r\n\r\n constructor(private chat: Chat) {\r\n this.sortItemsKey = chat.type === 'scheduled' ? 'timestamp' : 'mid';\r\n this.sortGroupsKey = chat.type === 'scheduled' ? 'lastTimestamp' : 'lastMid';\r\n this.sortGroupItemsKey = /* chat.type === 'scheduled' ? 'timestamp' : */'groupMid';\r\n }\r\n\r\n removeItem(item: GroupItem) {\r\n item.group?.removeItem(item);\r\n this.removeItemFromCache(item);\r\n }\r\n\r\n removeAndUnmountBubble(bubble: HTMLElement) {\r\n const item = this.getItemByBubble(bubble);\r\n if(!item) {\r\n if(bubble.parentElement) {\r\n bubble.remove(); // * can be a placeholder\r\n }\r\n\r\n return false;\r\n }\r\n\r\n const items = this.itemsArr;\r\n const index = items.indexOf(item);\r\n const siblings = this.getSiblingsAtIndex(index, items);\r\n\r\n const group = item.group;\r\n this.removeItem(item);\r\n\r\n const modifiedGroups: Set = new Set();\r\n if(group) {\r\n group.unmountItem(item);\r\n modifiedGroups.add(group);\r\n }\r\n\r\n const [previousSibling, nextSibling] = siblings;\r\n if(\r\n previousSibling &&\r\n nextSibling &&\r\n this.canItemsBeGrouped(previousSibling, nextSibling) &&\r\n previousSibling.group !== nextSibling.group\r\n ) {\r\n const group = nextSibling.group;\r\n this.f(nextSibling.group.items);\r\n group.onItemUnmount();\r\n modifiedGroups.add(previousSibling.group);\r\n this.groupUngrouped();\r\n }\r\n\r\n this.mountUnmountGroups(Array.from(modifiedGroups));\r\n\r\n return true;\r\n }\r\n\r\n mountUnmountGroups(groups: BubbleGroup[]) {\r\n // groups.sort((a, b) => (b.lastItem?.mid ?? 0) - (a.lastItem?.mid ?? 0));\r\n\r\n const [toMount, toUnmount] = partition(groups, (group) => !!group.items.length);\r\n toUnmount.forEach((group) => {\r\n group.onItemUnmount();\r\n })\r\n\r\n toMount.forEach((group) => {\r\n group.mount(true);\r\n });\r\n\r\n // toMount.forEach((group) => {\r\n // group.updateClassNames();\r\n // });\r\n }\r\n\r\n f(items: GroupItem[], index: number = 0, length = items.length) {\r\n for(; index < length; ++index) {\r\n const item = items[index];\r\n item.mounted = false;\r\n item.group.removeItem(item);\r\n --length;\r\n --index;\r\n }\r\n }\r\n\r\n getItemByBubble(bubble: HTMLElement) {\r\n return this.itemsMap.get(bubble);\r\n }\r\n\r\n getLastGroup() {\r\n return this.groups[0];\r\n }\r\n\r\n changeBubbleMid(bubble: HTMLElement, mid: number) {\r\n const item = this.getItemByBubble(bubble);\r\n if(!item) {\r\n return;\r\n }\r\n\r\n item.mid = mid;\r\n\r\n // indexOfAndSplice(item.group.items, item);\r\n // // const canChangeGroupMid = !item.group.items.length || item.group.items.every((item) => item.groupMid === item.mid);\r\n // // if(canChangeGroupMid) item.groupMid = mid;\r\n // item.group.insertItem(item);\r\n\r\n indexOfAndSplice(this.itemsArr, item);\r\n this.insertItemToArray(item, this.itemsArr);\r\n }\r\n\r\n changeItemBubble(item: GroupItem, bubble: HTMLElement) {\r\n this.itemsMap.delete(item.bubble);\r\n item.bubble = bubble;\r\n this.itemsMap.set(bubble, item);\r\n }\r\n\r\n changeBubbleByBubble(from: HTMLElement, to: HTMLElement) {\r\n const item = this.getItemByBubble(from);\r\n if(!item) {\r\n return;\r\n }\r\n\r\n this.changeItemBubble(item, to);\r\n }\r\n\r\n canItemsBeGrouped(item1: GroupItem, item2: GroupItem) {\r\n return item2.fromId === item1.fromId &&\r\n Math.abs(item2.timestamp - item1.timestamp) <= this.newGroupDiff &&\r\n item1.dateTimestamp === item2.dateTimestamp &&\r\n !item1.single &&\r\n !item2.single;\r\n }\r\n\r\n getSiblingsAtIndex(itemIndex: number, items: GroupItem[]) {\r\n return [items[itemIndex - 1], items[itemIndex + 1]] as const;\r\n }\r\n\r\n // findGroupSiblingInSiblings(item: GroupItem, siblings: ReturnType) {\r\n // return siblings.find((sibling) => sibling && this.canItemsBeGrouped(item, sibling));\r\n // }\r\n\r\n findGroupSiblingByItem(item: GroupItem, items: GroupItem[]) {\r\n items = items.slice();\r\n const idx = this.insertItemToArray(item, items);\r\n // return this.findGroupSiblingInSiblings(item, this.getSiblingsAtIndex(idx, items));\r\n return this.findGroupSiblingInItems(item, items, idx);\r\n }\r\n\r\n findGroupSiblingInItems(item: GroupItem, items: GroupItem[], index = items.indexOf(item), length = items.length) {\r\n const previousItem = items[index - 1];\r\n let siblingGroupedItem: GroupItem;\r\n if(previousItem?.group && this.canItemsBeGrouped(item, previousItem)) {\r\n siblingGroupedItem = previousItem;\r\n } else {\r\n for(let k = index + 1; k < length; ++k) {\r\n const nextItem = items[k];\r\n if(this.canItemsBeGrouped(item, nextItem)) {\r\n if(nextItem.group) {\r\n siblingGroupedItem = nextItem;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return siblingGroupedItem;\r\n }\r\n\r\n addItemToGroup(item: GroupItem, group: BubbleGroup) {\r\n group.insertItem(item);\r\n this.addItemToCache(item);\r\n }\r\n\r\n insertItemToArray(item: GroupItem, array: GroupItem[]) {\r\n return insertInDescendSortedArray(array, item, this.sortItemsKey);\r\n }\r\n\r\n insertGroup(group: BubbleGroup) {\r\n return insertInDescendSortedArray(this.groups, group, this.sortGroupsKey);\r\n }\r\n\r\n addItemToCache(item: GroupItem) {\r\n this.insertItemToArray(item, this.itemsArr);\r\n this.itemsMap.set(item.bubble, item);\r\n }\r\n\r\n removeItemFromCache(item: GroupItem) {\r\n indexOfAndSplice(this.itemsArr, item);\r\n this.itemsMap.delete(item.bubble);\r\n }\r\n\r\n getMessageFromId(message: MyMessage) {\r\n let fromId = message.viaBotId || message.fromId;\r\n\r\n // fix for saved messages forward to self\r\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as Message.message).fwdFromId === fromId) {\r\n fromId = fromId.toPeerId(true);\r\n }\r\n\r\n return fromId;\r\n }\r\n\r\n createItem(bubble: HTMLElement, message: MyMessage) {\r\n const single = !(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._)));\r\n const {mid, date: timestamp} = message;\r\n const {dateTimestamp} = this.chat.bubbles.getDateForDateContainer(timestamp);\r\n const item: GroupItem = {\r\n mid,\r\n groupMid: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : mid,\r\n fromId: this.getMessageFromId(message),\r\n bubble,\r\n // timestamp: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : timestamp,\r\n timestamp,\r\n dateTimestamp,\r\n mounted: false,\r\n single,\r\n message\r\n };\r\n\r\n return item;\r\n }\r\n\r\n splitSiblingsOnGrouping(siblings: ReturnType) {\r\n const [previousSibling, nextSibling] = siblings;\r\n const previousGroup = previousSibling?.group;\r\n const nextGroup = nextSibling?.group;\r\n\r\n if(!previousGroup) {\r\n return;\r\n }\r\n\r\n // will refresh group\r\n // if(previousGroup === nextGroup) {\r\n const items = previousGroup.items;\r\n const index = items.indexOf(previousSibling) + 1;\r\n const length = items.length;\r\n if(index === length) {\r\n return;\r\n }\r\n\r\n const modifiedGroups: BubbleGroup[] = [previousGroup];\r\n // if(previousGroup !== nextGroup && nextGroup) {\r\n // modifiedGroups.push(nextGroup);\r\n // }\r\n\r\n this.f(items, index, length);\r\n return modifiedGroups;\r\n // }\r\n }\r\n\r\n prepareForGrouping(bubble: HTMLElement, message: MyMessage) {\r\n const foundItem = this.getItemByBubble(bubble);\r\n if(foundItem) { // should happen only on edit\r\n // debugger;\r\n return;\r\n }\r\n\r\n const item = this.createItem(bubble, message);\r\n this.addItemToCache(item);\r\n }\r\n\r\n groupUngrouped() {\r\n const items = this.itemsArr;\r\n const length = items.length;\r\n const modifiedGroups: Set = new Set();\r\n // for(let i = length - 1; i >= 0; --i) {\r\n for(let i = 0; i < length; ++i) {\r\n const item = items[i];\r\n if(item.group) {\r\n continue;\r\n }\r\n\r\n let hadGroup = true;\r\n const siblings = this.getSiblingsAtIndex(i, items);\r\n const siblingGroupedItem = this.findGroupSiblingInItems(item, items, i, length);\r\n\r\n // const foundItem = this.findGroupSiblingInSiblings(item, siblings);\r\n const foundItem = siblingGroupedItem;\r\n const group = foundItem?.group ?? (hadGroup = false, new BubbleGroup(this.chat, this, item.dateTimestamp));\r\n\r\n modifiedGroups.add(group);\r\n group.insertItem(item);\r\n\r\n if(!hadGroup) {\r\n const splittedGroups = this.splitSiblingsOnGrouping(siblings);\r\n if(splittedGroups) {\r\n splittedGroups.forEach((group) => modifiedGroups.add(group));\r\n }\r\n }\r\n }\r\n\r\n return modifiedGroups;\r\n }\r\n\r\n // addBubble(bubble: HTMLElement, message: MyMessage, unmountIfFound?: boolean) {\r\n // const oldItem = this.getItemByBubble(bubble);\r\n // if(unmountIfFound) { // updating position\r\n // this.removeAndUnmountBubble(bubble);\r\n // } else if(oldItem) { // editing\r\n // const group = oldItem.group;\r\n // this.changeItemBubble(oldItem, bubble);\r\n // oldItem.mounted = false;\r\n\r\n // return {item: oldItem, group};\r\n // }\r\n\r\n // const item = this.createItem(bubble, message);\r\n\r\n // const foundItem = this.findSameGroupItem(item, this.itemsArr);\r\n\r\n // const group = foundItem?.group ?? new BubbleGroup(this.chat, this, item.dateTimestamp);\r\n // this.addItemToGroup(item, group);\r\n\r\n // return {item, group};\r\n // }\r\n\r\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\r\n //console.log('setClipIfNeeded', bubble, remove);\r\n const className = bubble.className;\r\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\r\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\r\n //console.log('setClipIfNeeded', bubble, remove, container);\r\n if(!container) return;\r\n\r\n try {\r\n Array.from(container.children).forEach((object) => {\r\n if(object instanceof SVGDefsElement) return;\r\n\r\n if(remove) {\r\n object.removeAttributeNS(null, 'clip-path');\r\n } else {\r\n let clipId = container.dataset.clipId;\r\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\r\n let width = +object.getAttributeNS(null, 'width');\r\n let height = +object.getAttributeNS(null, 'height');\r\n let isOut = className.includes('is-out');\r\n let isReply = className.includes('is-reply');\r\n let d = '';\r\n\r\n //console.log('setClipIfNeeded', object, width, height, isOut);\r\n\r\n let tr: number, tl: number;\r\n if(className.includes('forwarded') || isReply) {\r\n tr = tl = 0;\r\n } else if(isOut) {\r\n tr = className.includes('is-group-first') ? 12 : 6;\r\n tl = 12;\r\n } else {\r\n tr = 12;\r\n tl = className.includes('is-group-first') ? 12 : 6;\r\n }\r\n\r\n if(isOut) {\r\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\r\n } else {\r\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\r\n }\r\n\r\n path.setAttributeNS(null, 'd', d);\r\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\r\n }\r\n });\r\n } catch(err) {}\r\n }\r\n } */\r\n\r\n // updateGroupByMessageId(mid: number) {\r\n // const item = this.itemsArr.find((g) => g.mid === mid);\r\n // if(item) {\r\n // item.group.updateGroup();\r\n // }\r\n // }\r\n\r\n cleanup() {\r\n this.itemsArr = [];\r\n this.groups = [];\r\n this.itemsMap.clear();\r\n }\r\n\r\n // findIncorrentPositions() {\r\n // var bubbles = Array.from(this.chat.bubbles.chatInner.querySelectorAll('.bubbles-group .bubble')).reverse();\r\n // var items = this.itemsArr;\r\n // for(var i = 0, length = items.length; i < length; ++i) {\r\n // const item = items[i];\r\n // const foundBubble = bubbles[i];\r\n // if(item.bubble !== foundBubble) {\r\n // console.log('incorrect position', i, item, foundBubble);\r\n // // debugger;\r\n // // break;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function partition(arr: T[], callback: (item: T, idx: number, arr: T[]) => boolean) {\n const good: T[] = [], bad: T[] = [];\n for(let i = 0, length = arr.length; i < length; ++i) {\n const item = arr[i];\n (callback(item, i, arr) ? good : bad).push(item);\n }\n\n return [good, bad];\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, {PopupOptions} from '.';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport mediaSizes from '../../helpers/mediaSizes';\r\nimport I18n, {FormatterArguments, 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', {\r\n body: true,\r\n overlayClosable: true,\r\n buttons: 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 }],\r\n title: true,\r\n ...options\r\n });\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;\r\n const args: FormatterArguments = [];\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 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 {Middleware} from '../../helpers/middleware';\r\nimport limitSymbols from '../../helpers/string/limitSymbols';\r\nimport {Document, MessageMedia, Photo, WebPage} from '../../layer';\r\nimport appImManager from '../../lib/appManagers/appImManager';\r\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport DivAndCaption from '../divAndCaption';\r\nimport wrapMessageForReply from '../wrappers/messageForReply';\r\nimport wrapPhoto from '../wrappers/photo';\r\nimport wrapSticker from '../wrappers/sticker';\r\nimport wrapVideo from '../wrappers/video';\r\nimport {AnimationItemGroup} from '../animationIntersector';\r\n\r\nconst MEDIA_SIZE = 32;\r\n\r\nexport async function wrapReplyDivAndCaption(options: {\r\n title: string | HTMLElement | DocumentFragment,\r\n titleEl: HTMLElement,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleEl: HTMLElement,\r\n message: any,\r\n mediaEl: HTMLElement,\r\n loadPromises?: Promise[],\r\n animationGroup: AnimationItemGroup\r\n}) {\r\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises, animationGroup} = options;\r\n if(title !== undefined) {\r\n if(typeof(title) === 'string') {\r\n title = limitSymbols(title, 140);\r\n title = wrapEmojiText(title);\r\n }\r\n\r\n replaceContent(titleEl, title);\r\n }\r\n\r\n if(!loadPromises) {\r\n loadPromises = [];\r\n }\r\n\r\n let messageMedia: MessageMedia | WebPage.webPage = message?.media;\r\n let setMedia = false, isRound = false;\r\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\r\n let middleware: Middleware;\r\n if(messageMedia && mediaEl) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(await wrapMessageForReply(message, undefined, undefined, undefined, undefined, true));\r\n\r\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || messageMedia;\r\n const photo = (messageMedia as MessageMedia.messageMediaPhoto).photo as Photo.photo;\r\n const document = (messageMedia as MessageMedia.messageMediaDocument).document as Document.document;\r\n if(photo || (document && document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(document.type) !== -1) */) {\r\n middleware = appImManager.chat.bubbles.getMiddleware();\r\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\r\n\r\n if(document?.type === 'sticker') {\r\n await wrapSticker({\r\n doc: document,\r\n div: mediaEl,\r\n lazyLoadQueue,\r\n group: animationGroup,\r\n // onlyThumb: document.sticker === 2,\r\n width: MEDIA_SIZE,\r\n height: MEDIA_SIZE,\r\n middleware,\r\n loadPromises\r\n });\r\n setMedia = true;\r\n } else if(document?.type === 'gif' && document.video_thumbs) {\r\n setMedia = true;\r\n await wrapVideo({\r\n doc: document,\r\n container: mediaEl,\r\n boxWidth: MEDIA_SIZE,\r\n boxHeight: MEDIA_SIZE,\r\n lazyLoadQueue,\r\n noPlayButton: true,\r\n noInfo: true,\r\n middleware,\r\n loadPromises,\r\n withoutPreloader: true,\r\n videoSize: document.video_thumbs[0],\r\n group: animationGroup\r\n });\r\n } else {\r\n const m = photo || document;\r\n isRound = document?.type === 'round';\r\n\r\n try {\r\n await wrapPhoto({\r\n photo: m,\r\n container: mediaEl,\r\n boxWidth: MEDIA_SIZE,\r\n boxHeight: MEDIA_SIZE,\r\n size: choosePhotoSize(m, MEDIA_SIZE, MEDIA_SIZE),\r\n middleware,\r\n lazyLoadQueue,\r\n noBlur: true,\r\n withoutPreloader: true,\r\n loadPromises\r\n });\r\n setMedia = true;\r\n } catch(err) {\r\n\r\n }\r\n }\r\n }\r\n } else {\r\n if(message) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(await wrapMessageForReply(message));\r\n } else {\r\n if(typeof(subtitle) === 'string') {\r\n subtitle = limitSymbols(subtitle, 140);\r\n subtitle = wrapEmojiText(subtitle);\r\n }\r\n\r\n replaceContent(subtitleEl, subtitle || '');\r\n }\r\n }\r\n\r\n Promise.all(loadPromises).then(() => {\r\n if(middleware && !middleware()) return;\r\n mediaChildren.forEach((child) => child.remove());\r\n\r\n if(mediaEl) {\r\n mediaEl.classList.toggle('is-round', isRound);\r\n }\r\n });\r\n\r\n return setMedia;\r\n}\r\n\r\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => Promise> {\r\n private mediaEl: HTMLElement;\r\n\r\n constructor(protected className: string, protected animationGroup: AnimationItemGroup) {\r\n super(className, async(title, subtitle = '', message?) => {\r\n if(!this.mediaEl) {\r\n this.mediaEl = document.createElement('div');\r\n this.mediaEl.classList.add(this.className + '-media');\r\n }\r\n\r\n const isMediaSet = await wrapReplyDivAndCaption({\r\n title,\r\n titleEl: this.title,\r\n subtitle,\r\n subtitleEl: this.subtitle,\r\n mediaEl: this.mediaEl,\r\n message,\r\n animationGroup\r\n });\r\n\r\n this.container.classList.toggle('is-media', isMediaSet);\r\n if(isMediaSet) {\r\n this.content.prepend(this.mediaEl);\r\n } else {\r\n this.mediaEl.remove();\r\n }\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {hexToRgb} from '../../helpers/color';\nimport {Message} from '../../layer';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport ReplyContainer from '../chat/replyContainer';\n\nexport default function wrapReply(\n title: Parameters[0],\n subtitle: Parameters[1],\n animationGroup: AnimationItemGroup,\n message?: Message.message | Message.messageService,\n setColorPeerId?: PeerId\n) {\n const replyContainer = new ReplyContainer('reply', animationGroup);\n const fillPromise = replyContainer.fill(title, subtitle, message);\n\n if(setColorPeerId) {\n const hex = getPeerColorById(setColorPeerId, false);\n const [r, g, b] = hexToRgb(hex);\n replyContainer.container.style.setProperty('--override-color', `${r}, ${g}, ${b}`);\n replyContainer.container.classList.add('is-overriding-color');\n // replyContainer.border.style.backgroundColor = hex;\n // replyContainer.title.style.color = hex;\n }\n\n return {container: replyContainer.container, fillPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from './avatar';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\nconst CLASS_NAME = 'stacked-avatars';\nconst AVATAR_CLASS_NAME = CLASS_NAME + '-avatar';\nconst AVATAR_CONTAINER_CLASS_NAME = AVATAR_CLASS_NAME + '-container';\n\nexport default class StackedAvatars {\n public container: HTMLElement;\n private lazyLoadQueue: LazyLoadQueue;\n private avatarSize: number;\n\n constructor(options: {\n lazyLoadQueue?: StackedAvatars['lazyLoadQueue'],\n avatarSize: StackedAvatars['avatarSize']\n }) {\n this.lazyLoadQueue = options.lazyLoadQueue;\n this.avatarSize = options.avatarSize;\n\n this.container = document.createElement('div');\n this.container.classList.add(CLASS_NAME);\n\n this.container.style.setProperty('--avatar-size', options.avatarSize + 'px');\n }\n /**\n * MACOS, ANDROID - без реверса\n * WINDOWS DESKTOP - реверс\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\n */\n public render(peerIds: PeerId[], loadPromises?: Promise[]) {\n const children = this.container.children;\n peerIds = peerIds.slice().reverse();\n if(peerIds.length > 3) {\n peerIds = peerIds.slice(-3);\n }\n\n peerIds.forEach((peerId, idx) => {\n let avatarContainer = children[idx] as HTMLElement;\n if(!avatarContainer) {\n avatarContainer = document.createElement('div');\n avatarContainer.classList.add(AVATAR_CONTAINER_CLASS_NAME);\n }\n\n let avatarElem = avatarContainer.firstElementChild as AvatarElement;\n if(!avatarElem) {\n avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-' + this.avatarSize, AVATAR_CLASS_NAME);\n avatarElem.updateOptions({\n isDialog: false,\n loadPromises\n });\n }\n\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: peerId\n });\n\n if(!avatarElem.parentNode) {\n avatarContainer.append(avatarElem);\n }\n\n if(!avatarContainer.parentNode) {\n this.container.append(avatarContainer);\n }\n });\n\n // if were 3 and became 2\n (Array.from(children) as HTMLElement[]).slice(peerIds.length).forEach((el) => el.remove());\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {Message} from '../../layer';\r\nimport rootScope from '../../lib/rootScope';\r\nimport ripple from '../ripple';\r\nimport I18n from '../../lib/langPack';\r\nimport replaceContent from '../../helpers/dom/replaceContent';\r\nimport StackedAvatars from '../stackedAvatars';\r\nimport formatNumber from '../../helpers/number/formatNumber';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\r\nimport type LazyLoadQueue from '../lazyLoadQueue';\r\n\r\nconst TAG_NAME = 'replies-element';\r\n\r\nrootScope.addEventListener('replies_updated', (message) => {\r\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach((element) => {\r\n element.message = message;\r\n element.render();\r\n });\r\n});\r\n\r\nexport default class RepliesElement extends HTMLElement {\r\n public message: Message.message;\r\n public type: 'footer' | 'beside';\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueue;\r\n public stackedAvatars: StackedAvatars;\r\n public text: I18n.IntlElement;\r\n public managers: AppManagers;\r\n\r\n private updated = false;\r\n\r\n constructor() {\r\n super();\r\n this.managers = rootScope.managers;\r\n }\r\n\r\n public init() {\r\n this.render();\r\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\r\n this.classList.add('replies', 'replies-' + this.type);\r\n }\r\n\r\n public render() {\r\n const replies = this.message.replies;\r\n\r\n /* if(this.firstChild) {\r\n this.innerHTML = '';\r\n } */\r\n\r\n if(this.type === 'footer') {\r\n let leftPart: HTMLElement;\r\n if(this.firstElementChild) {\r\n leftPart = this.firstElementChild as HTMLElement;\r\n }\r\n\r\n if(replies?.recent_repliers) {\r\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\r\n this.innerHTML = '';\r\n leftPart = null;\r\n }\r\n\r\n if(!this.stackedAvatars) {\r\n this.stackedAvatars = new StackedAvatars({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n avatarSize: 30\r\n });\r\n\r\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\r\n }\r\n\r\n leftPart = this.stackedAvatars.container;\r\n\r\n this.stackedAvatars.render(replies.recent_repliers.map((peer) => getPeerId(peer)), this.loadPromises);\r\n } else {\r\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\r\n leftPart.remove();\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('span');\r\n leftPart.classList.add('tgico-comments');\r\n }\r\n }\r\n\r\n if(!leftPart.parentElement) {\r\n this.prepend(leftPart);\r\n }\r\n\r\n if(!this.text) {\r\n this.text = new I18n.IntlElement();\r\n }\r\n\r\n const text = this.text;\r\n if(replies) {\r\n if(replies.replies) {\r\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\r\n } else {\r\n text.compareAndUpdate({key: 'LeaveAComment'});\r\n }\r\n } else {\r\n text.compareAndUpdate({key: 'ViewInChat'});\r\n }\r\n\r\n if(replies) {\r\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\r\n let isUnread = false;\r\n if(replies.replies) {\r\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\r\n isUnread = replies.read_max_id < replies.max_id;\r\n }/* else {\r\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\r\n } */\r\n }\r\n this.classList.toggle('is-unread', isUnread);\r\n }\r\n\r\n let textSpan = this.children[1] as HTMLElement;\r\n if(!textSpan) {\r\n textSpan = document.createElement('span');\r\n textSpan.classList.add('replies-footer-text');\r\n\r\n const iconSpan = document.createElement('span');\r\n iconSpan.classList.add('tgico-next');\r\n\r\n const rippleContainer = document.createElement('div');\r\n ripple(rippleContainer);\r\n\r\n this.append(textSpan, iconSpan, rippleContainer);\r\n }\r\n\r\n replaceContent(textSpan, text.element);\r\n } else {\r\n this.classList.add('bubble-beside-button');\r\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\r\n }\r\n\r\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\r\n this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\r\n this.managers.appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\r\n this.updated = true;\r\n }\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises = undefined;\r\n }\r\n }\r\n}\r\n\r\ncustomElements.define(TAG_NAME, RepliesElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatTime, getFullDate} from '../../helpers/date';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Message} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\nimport type LazyLoadQueue from '../lazyLoadQueue';\nimport PeerTitle from '../peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport Chat, {ChatType} from './chat';\nimport RepliesElement from './replies';\n\nconst NBSP = ' ';\n\nconst makeEdited = () => {\n const edited = document.createElement('i');\n edited.classList.add('edited');\n _i18n(edited, 'EditedMessage');\n return edited;\n};\n\nconst makeSponsored = () => i18n('SponsoredMessage');\n\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (options: {\n chatType: ChatType,\n message: Message.message | Message.messageService,\n reactionsMessage?: Message.message\n }) => {\n const {chatType, message} = options;\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n\n let editedSpan: HTMLElement,\n sponsoredSpan: HTMLElement;\n // reactionsElement: ReactionsElement,\n // 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 const time: HTMLElement = isSponsored ? undefined : formatTime(date);\n if(isMessage) {\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n\n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n\n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n\n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(postAuthor));\n span.insertAdjacentHTML('beforeend', ',' + NBSP)\n args.push(span);\n }\n }\n\n if(message.edit_date && chatType !== 'scheduled' && !message.pFlags.edit_hide) {\n args.unshift(editedSpan = makeEdited());\n }\n\n if(chatType !== 'pinned' && message.pFlags.pinned) {\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n\n // if(USER_REACTIONS_INLINE && message.peer_id._ === 'peerUser'/* && message.reactions?.results?.length */) {\n // hasReactions = true;\n\n // reactionsMessage = options.reactionsMessage;\n // reactionsElement = new ReactionsElement();\n // reactionsElement.init(reactionsMessage, 'inline', true);\n // reactionsElement.render();\n // args.unshift(reactionsElement);\n // }\n } else if(isSponsored) {\n args.push(sponsoredSpan = makeSponsored());\n }\n\n if(time) {\n args.push(time);\n }\n\n let title = isSponsored ? undefined : getFullDate(date);\n if(isMessage) {\n title += (message.edit_date && !message.pFlags.edit_hide ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '') +\n (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n }\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n // if(title) timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n if(title) inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n if(sponsoredSpan) {\n clonedArgs[clonedArgs.indexOf(sponsoredSpan)] = makeSponsored();\n }\n // if(reactionsElement) {\n // const _reactionsElement = clonedArgs[clonedArgs.indexOf(reactionsElement)] = new ReactionsElement();\n // _reactionsElement.init(reactionsMessage, 'inline');\n // _reactionsElement.render();\n // }\n clonedArgs = clonedArgs.map((a) => a instanceof HTMLElement && !a.classList.contains('i18n') && !a.classList.contains('reactions') ? a.cloneNode(true) as HTMLElement : a);\n if(time) {\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n }\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueue\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = async({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n currentReplyDiv?.remove();\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n const originalMessage = await rootScope.managers.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n\n // ///////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n\n let titlePeerId: PeerId;\n // need to download separately\n if(!originalMessage) {\n // ////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n rootScope.managers.appMessagesManager.fetchMessageReplyTo(message);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n\n originalPeerTitle = i18n('Loading');\n } else {\n const originalMessageFwdFromId = (originalMessage as Message.message).fwdFromId;\n titlePeerId = message.fwdFromId && message.fwdFromId === originalMessageFwdFromId ? message.fwdFromId : originalMessage.fromId || originalMessageFwdFromId;\n originalPeerTitle = new PeerTitle({\n peerId: titlePeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const {container, fillPromise} = wrapReply(originalPeerTitle, undefined, chat.animationGroup, originalMessage, chat.isAnyGroup ? titlePeerId : undefined);\n await fillPromise;\n if(currentReplyDiv) {\n if(currentReplyDiv.classList.contains('floating-part')) {\n container.classList.add('floating-part');\n }\n currentReplyDiv.replaceWith(container);\n } else {\n bubbleContainer.append(container);\n }\n // bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n\n return 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 {MOUNT_CLASS_TO} from '../../config/debug';\r\n\r\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\r\n // return null;\r\n const rect = container.getBoundingClientRect();\r\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\r\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\r\n return document.elementFromPoint(x, y) as any;\r\n};\r\n\r\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function reflowScrollableElement(element: HTMLElement) {\r\n element.style.display = 'none';\r\n void element.offsetLeft; // reflow\r\n element.style.display = '';\r\n}\r\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","/*\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 INVOICE,\n EMOJI_SET\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat | InternalLink.InternalLinkUserPhoneNumber | InternalLink.InternalLinkInvoice | InternalLink.InternalLinkEmojiSet;\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 export interface InternalLinkInvoice {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: string\n }\n\n export interface InternalLinkEmojiSet {\n _: INTERNAL_LINK_TYPE.EMOJI_SET,\n set: 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 [INTERNAL_LINK_TYPE.INVOICE]: InternalLink.InternalLinkInvoice,\n [INTERNAL_LINK_TYPE.EMOJI_SET]: InternalLink.InternalLinkEmojiSet\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, {addCancelButton} from '.';\r\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\r\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\r\nimport {ChatInvite} from '../../layer';\r\nimport appImManager from '../../lib/appManagers/appImManager';\r\nimport {i18n, _i18n} from '../../lib/langPack';\r\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport AvatarElement from '../avatar';\r\nimport putPhoto from '../putPhoto';\r\nimport {toastNew} from '../toast';\r\nimport wrapPhoto from '../wrappers/photo';\r\n\r\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\r\n\r\nexport default class PopupJoinChatInvite extends PopupElement {\r\n constructor(\r\n private hash: string,\r\n private chatInvite: ChatInvite.chatInvite\r\n ) {\r\n super('popup-join-chat-invite', {\r\n closable: true,\r\n overlayClosable: true,\r\n body: true,\r\n buttons: addCancelButton([{\r\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\r\n callback: () => {\r\n this.managers.appChatsManager.importChatInvite(hash)\r\n .then((chatId) => {\r\n const peerId = chatId.toPeerId(true);\r\n appImManager.setInnerPeer({peerId});\r\n }, (error) => {\r\n if(error.type === 'INVITE_REQUEST_SENT') {\r\n toastNew({langPackKey: 'RequestToJoinSent'});\r\n }\r\n });\r\n }\r\n }])\r\n });\r\n\r\n this.construct();\r\n }\r\n\r\n private async construct() {\r\n this.header.remove();\r\n /* const fakeChat: Chat.channel | Chat.chat = {\r\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\r\n id: FAKE_CHAT_ID,\r\n title: chatInvite.title,\r\n photo: chatInvite.photo as any,\r\n date: Date.now() / 1000 | 0,\r\n version: 0,\r\n participants_count: chatInvite.participants_count,\r\n pFlags: chatInvite.pFlags as any\r\n };\r\n\r\n appChatsManager.saveApiChat(fakeChat); */\r\n\r\n const {chatInvite, managers, hash} = this;\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.classList.add('avatar-100');\r\n avatarElem.isDialog = false;\r\n if(chatInvite.photo._ === 'photo') {\r\n chatInvite.photo = await managers.appPhotosManager.savePhoto(chatInvite.photo);\r\n wrapPhoto({\r\n container: avatarElem,\r\n message: null,\r\n photo: chatInvite.photo,\r\n boxHeight: 100,\r\n boxWidth: 100,\r\n withoutPreloader: true\r\n });\r\n avatarElem.style.width = avatarElem.style.height = '';\r\n } else {\r\n putPhoto(avatarElem, NULL_PEER_ID, false, chatInvite.title);\r\n }\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('chat-title');\r\n setInnerHTML(title, wrapEmojiText(chatInvite.title));\r\n // avatarElem.setAttribute('peer', '' + -fakeChat.id);\r\n\r\n const isBroadcast = chatInvite.pFlags.broadcast;\r\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\r\n peopleCount.classList.add('chat-participants-count');\r\n\r\n this.body.append(avatarElem, title, peopleCount);\r\n\r\n if(chatInvite.pFlags.request_needed) {\r\n const caption = document.createElement('div');\r\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\r\n caption.classList.add('chat-participants-count', 'request-caption');\r\n\r\n this.body.append(caption);\r\n }\r\n\r\n this.show();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport callbackify from '../../helpers/callbackify';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Document, MessagePeerReaction, ReactionCount} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport rootScope from '../../lib/rootScope';\nimport SetTransition from '../singleTransition';\nimport StackedAvatars from '../stackedAvatars';\nimport {Awaited} from '../../types';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport wrapStickerAnimation from '../wrappers/stickerAnimation';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport {fastRaf} from '../../helpers/schedulers';\nimport noop from '../../helpers/noop';\nimport {Middleware} from '../../helpers/middleware';\n\nconst CLASS_NAME = 'reaction';\nconst TAG_NAME = CLASS_NAME + '-element';\nconst REACTION_INLINE_SIZE = 14;\nconst REACTION_BLOCK_SIZE = 22;\n\nexport const REACTION_DISPLAY_INLINE_COUNTER_AT = 2;\nexport const REACTION_DISPLAY_BLOCK_COUNTER_AT = 4;\n\nexport type ReactionLayoutType = 'block' | 'inline';\n\nexport default class ReactionElement extends HTMLElement {\n private type: ReactionLayoutType;\n private counter: HTMLElement;\n private stickerContainer: HTMLElement;\n private stackedAvatars: StackedAvatars;\n private canRenderAvatars: boolean;\n private _reactionCount: ReactionCount;\n private wrapStickerPromise: Awaited>['render'];\n private managers: AppManagers;\n private middleware: Middleware;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.managers = rootScope.managers;\n }\n\n public get reactionCount() {\n return this._reactionCount;\n }\n\n public set reactionCount(reactionCount: ReactionCount) {\n this._reactionCount = reactionCount;\n }\n\n public get count() {\n return this.reactionCount.count;\n }\n\n public init(type: ReactionLayoutType, middleware: Middleware) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n this.middleware = middleware;\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 reaction = reactionCount.reaction;\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = this.managers.appReactionsManager.getReaction(reaction.emoticon);\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 this.renderDoc(availableReaction.center_icon ?? availableReaction.static_icon);\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n this.stickerContainer.classList.add('is-custom');\n const wrapped = wrapCustomEmoji({\n docIds: [reaction.document_id],\n size: makeMediaSize(REACTION_BLOCK_SIZE, REACTION_BLOCK_SIZE)\n });\n\n this.stickerContainer.append(wrapped);\n }\n }\n }\n\n private renderDoc(doc: Document.document) {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc,\n width: size,\n height: size,\n static: true,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\n }\n\n public renderCounter() {\n const reactionCount = this.reactionCount;\n const displayOn = this.type === 'inline' ? REACTION_DISPLAY_INLINE_COUNTER_AT : REACTION_DISPLAY_BLOCK_COUNTER_AT;\n if(reactionCount.count >= displayOn || (this.type === 'block' && !this.canRenderAvatars)) {\n if(!this.counter) {\n this.counter = document.createElement(this.type === 'inline' ? 'i' : 'span');\n this.counter.classList.add(CLASS_NAME + '-counter');\n }\n\n const formatted = formatNumber(reactionCount.count);\n if(this.counter.textContent !== formatted) {\n this.counter.textContent = formatted;\n }\n\n if(!this.counter.parentElement) {\n this.append(this.counter);\n }\n } else if(this.counter?.parentElement) {\n this.counter.remove();\n this.counter = undefined;\n }\n }\n\n public renderAvatars(recentReactions: MessagePeerReaction[]) {\n if(this.type === 'inline') {\n return;\n }\n\n if(this.reactionCount.count >= REACTION_DISPLAY_BLOCK_COUNTER_AT || !this.canRenderAvatars) {\n if(this.stackedAvatars) {\n this.stackedAvatars.container.remove();\n this.stackedAvatars = undefined;\n }\n\n return;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n avatarSize: 24\n });\n\n this.append(this.stackedAvatars.container);\n }\n\n this.stackedAvatars.render(recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n public setIsChosen(isChosen = this.reactionCount.chosen_order !== undefined) {\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 const reaction = this.reactionCount.reaction;\n if(reaction._ !== 'reactionEmoji') return;\n callbackify(this.managers.appReactionsManager.getReaction(reaction.emoticon), (availableReaction) => {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE + 14 : REACTION_BLOCK_SIZE + 18;\n const div = document.createElement('div');\n div.classList.add(CLASS_NAME + '-sticker-activate');\n\n Promise.all([\n wrapSticker({\n div: div,\n doc: availableReaction.center_icon,\n width: size,\n height: size,\n withThumb: false,\n needUpscale: true,\n play: false,\n skipRatio: 1,\n group: 'none',\n needFadeIn: false,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render as Promise),\n\n wrapStickerAnimation({\n doc: availableReaction.around_animation,\n size: 80,\n target: this.stickerContainer,\n side: 'center',\n skipRatio: 1,\n play: false,\n managers: this.managers,\n middleware: this.middleware\n }).stickerPromise.catch(noop)\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n };\n\n if(!aroundPlayer) {\n remove();\n return;\n }\n\n const removeOnFrame = () => {\n // if(!isInDOM(div)) return;\n fastRaf(remove);\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(removeOnFrame, 1e3);\n });\n } else {\n removeOnFrame();\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 {Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport {Message, ReactionCount} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport reactionsEqual from '../../lib/appManagers/utils/reactions/reactionsEqual';\nimport rootScope from '../../lib/rootScope';\nimport ReactionElement, {ReactionLayoutType, REACTION_DISPLAY_BLOCK_COUNTER_AT} from './reaction';\n\nconst CLASS_NAME = 'reactions';\nconst TAG_NAME = CLASS_NAME + '-element';\n\nconst REACTIONS_ELEMENTS: Map> = new Map();\nexport {REACTIONS_ELEMENTS};\n\nexport default class ReactionsElement extends HTMLElement {\n private message: Message.message;\n private key: string;\n private isPlaceholder: boolean;\n private type: ReactionLayoutType;\n private sorted: ReactionElement[];\n private onConnectCallback: () => void;\n private managers: AppManagers;\n private middleware: Middleware;\n private middlewareHelpers: Map;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\n this.middlewareHelpers = new Map();\n this.managers = rootScope.managers;\n }\n\n connectedCallback() {\n let set = REACTIONS_ELEMENTS.get(this.key);\n if(!set) {\n REACTIONS_ELEMENTS.set(this.key, set = new Set());\n }\n\n set.add(this);\n\n if(this.onConnectCallback && this.isConnected) {\n this.onConnectCallback();\n this.onConnectCallback = undefined;\n }\n }\n\n disconnectedCallback() {\n const set = REACTIONS_ELEMENTS.get(this.key);\n set.delete(this);\n if(!set.size) {\n REACTIONS_ELEMENTS.delete(this.key);\n }\n }\n\n public getReactionCount(reactionElement: ReactionElement) {\n return this.sorted[this.sorted.indexOf(reactionElement)].reactionCount;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public init(\n message: Message.message,\n type: ReactionLayoutType,\n middleware: Middleware,\n isPlaceholder = this.isPlaceholder\n ) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n if(this.middleware !== middleware) {\n middleware.onDestroy(() => {\n this.middlewareHelpers.clear();\n });\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\n this.middleware = middleware;\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.middleware);\n }\n\n public update(message: Message.message, changedResults?: ReactionCount[]) {\n this.message = message;\n this.render(changedResults);\n }\n\n public render(changedResults?: ReactionCount[]) {\n const reactions = this.message.reactions;\n const hasReactions = !!(reactions && reactions.results.length);\n this.classList.toggle('has-no-reactions', !hasReactions);\n if(!hasReactions && !this.sorted.length) return;\n\n const availableReactionsResult = this.managers.appReactionsManager.getAvailableReactions();\n // callbackify(availableReactionsResult, () => {\n const counts = hasReactions ? (\n reactions.results\n // availableReactionsResult instanceof Promise ?\n // reactions.results :\n // reactions.results.filter((reactionCount) => {\n // return this.managers.appReactionsManager.isReactionActive(reactionCount.reaction);\n // })\n ) : [];\n\n // if(this.message.peerId.isUser()) {\n // counts.sort((a, b) => (b.count - a.count) || ((b.chosen_order ?? 0) - (a.chosen_order ?? 0)));\n // } else {\n counts.sort((a, b) => (b.count - a.count) || ((a.chosen_order ?? 0) - (b.chosen_order ?? 0)));\n // }\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some((reactionCount) => reactionsEqual(reactionCount.reaction, reaction));\n if(!found) {\n const middlewareHelper = this.middlewareHelpers.get(reactionElement);\n middlewareHelper.destroy();\n this.middlewareHelpers.delete(reactionElement);\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 || this.message.peerId.isUser()) && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n let reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n if(!reactionElement) {\n const middlewareHelper = this.middleware.create();\n reactionElement = new ReactionElement();\n reactionElement.init(this.type, middlewareHelper.get());\n this.middlewareHelpers.set(reactionElement, middlewareHelper);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n\n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter((reaction) => reactionsEqual(reaction.reaction, reactionCount.reaction)) : [];\n reactionElement.reactionCount = {...reactionCount};\n reactionElement.setCanRenderAvatars(canRenderAvatars);\n reactionElement.render(this.isPlaceholder);\n reactionElement.renderCounter();\n reactionElement.renderAvatars(recentReactions);\n reactionElement.setIsChosen();\n\n return reactionElement;\n });\n\n // this.sorted.forEach((reactionElement, idx) => {\n // /* if(this.type === 'block' && this.childElementCount !== this.sorted.length) { // because of appended time\n // idx += 1;\n // } */\n\n // positionElementByIndex(reactionElement, this, idx);\n // });\n\n if(!this.isPlaceholder && changedResults?.length) {\n if(this.isConnected) {\n this.handleChangedResults(changedResults);\n } else {\n this.onConnectCallback = () => {\n this.handleChangedResults(changedResults);\n };\n }\n }\n // });\n\n // ! тут вообще не должно быть этого кода, но пока он побудет тут\n if(!this.sorted.length && this.type === 'block') {\n const parentElement = this.parentElement;\n this.remove();\n\n if(parentElement.classList.contains('document-message') && !parentElement.childNodes.length) {\n parentElement.remove();\n return;\n }\n\n const timeSpan = this.querySelector('.time');\n if(timeSpan) {\n parentElement.append(timeSpan);\n }\n }\n }\n\n private handleChangedResults(changedResults: ReactionCount[]) {\n // ! temp\n if(this.message.peerId !== appImManager.chat.peerId) return;\n\n changedResults.forEach((reactionCount) => {\n const reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n reactionElement?.fireAroundAnimation();\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport getVisibleRect from './dom/getVisibleRect';\nimport reflowScrollableElement from './dom/reflowScrollableElement';\n\nexport default class ScrollSaver {\n private scrollHeight: number;\n private scrollHeightMinusTop: number;\n private scrollTop: number;\n private clientHeight: number;\n private elements: {element: HTMLElement, rect: DOMRect}[];\n\n /**\n *\n * @param scrollable to reset scroll position and direction\n * @param reverse true means top\n */\n constructor(\n private scrollable: Scrollable,\n private query: string,\n private reverse: boolean\n ) {\n\n }\n\n private get container() {\n return this.scrollable.container;\n }\n\n public getSaved() {\n return {\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n clientHeight: this.clientHeight\n };\n }\n\n public findElements() {\n if(!this.query) return [];\n\n const {container} = this;\n const containerRect = container.getBoundingClientRect();\n const bubbles = Array.from(container.querySelectorAll(this.query)) as HTMLElement[];\n const elements: ScrollSaver['elements'] = [];\n for(const bubble of bubbles) {\n const elementRect = bubble.getBoundingClientRect();\n const visibleRect = getVisibleRect(bubble, container, undefined, elementRect, containerRect);\n if(visibleRect) {\n elements.push({element: bubble, rect: elementRect});\n // break; // find first\n } else if(elements.length) { // find last\n break;\n }\n }\n\n if(!elements.length) {\n const bubble = bubbles[0];\n if(bubble) {\n elements.push({element: bubble, rect: bubble.getBoundingClientRect()});\n }\n }\n\n return elements;\n }\n\n public replaceSaved(from: HTMLElement, to: HTMLElement) {\n if(!this.elements) {\n return;\n }\n\n const idx = this.elements.findIndex(({element}) => from === element);\n if(idx !== -1) {\n this.elements[idx].element = to;\n }\n }\n\n public findAndSetElements() {\n this.elements = this.findElements();\n }\n\n public save() {\n this.findAndSetElements();\n // console.warn('scroll save', this.elements);\n this._save();\n }\n\n public _save() {\n const {scrollTop, scrollHeight, clientHeight} = this.container;\n\n // previousScrollHeight = scrollHeight;\n // previousScrollHeight = scrollHeight + padding;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n this.clientHeight = clientHeight;\n this.scrollHeightMinusTop = this.reverse ? scrollHeight - scrollTop : scrollTop;\n\n // this.chatInner.style.paddingTop = padding + 'px';\n /* if(reverse) {\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\n } else {\n previousScrollHeightMinusTop = scrollTop;\n } */\n }\n\n private onRestore(useReflow?: boolean) {\n if(IS_SAFARI && useReflow/* && !isAppleMobile */) { // * fix blinking and jumping\n reflowScrollableElement(this.container);\n }\n }\n\n private setScrollTop(newScrollTop: number, useReflow?: boolean) {\n // touchSupport for safari iOS\n // isTouchSupported && isApple && (container.container.style.overflow = 'hidden');\n this.scrollable.setScrollTopSilently(this.scrollTop = newScrollTop);\n // container.scrollTop = scrollHeight;\n // isTouchSupported && isApple && (container.container.style.overflow = '');\n\n this.onRestore(useReflow);\n }\n\n public restore(useReflow?: boolean) {\n const {scrollTop, scrollHeight} = this.scrollable;\n this.scrollHeight = scrollHeight;\n\n if(!this.elements.length) { // maybe all messages have been deleted\n this._restore(useReflow);\n return;\n }\n\n let anchor: ScrollSaver['elements'][0];\n // for(let i = this.elements.length - 1; i >= 0; --i) {\n // const _anchor = this.elements[i];\n // if(_anchor.element.parentElement) {\n // anchor = _anchor;\n // break;\n // }\n // }\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor?.element?.parentElement) { // try to find new anchor\n this.findAndSetElements();\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor) { // fallback to old method if smth is really strange\n this._restore(useReflow);\n return;\n }\n }\n\n const {element, rect} = anchor;\n const newRect = element.getBoundingClientRect();\n const diff = newRect.bottom - rect.bottom;\n this.setScrollTop(scrollTop + diff, useReflow);\n // if(diff) debugger;\n // console.warn('scroll restore', rect, diff, newRect);\n }\n\n public _restore(useReflow?: boolean) {\n const {scrollHeightMinusTop: previousScrollHeightMinusTop, scrollable} = this;\n // if(previousScrollHeightMinusTop === undefined) {\n // throw new Error('scroll was not saved');\n // }\n\n // const scrollHeight = container.scrollHeight;\n const scrollHeight = this.scrollHeight;\n // if(scrollHeight === this.scrollHeight) {\n // return;\n // }\n\n // this.scrollHeight = scrollHeight;\n\n /* const scrollHeight = container.scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\n /* const scrollHeight = scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\n\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n this.log('performHistoryResult: will set scrollTop',\n previousScrollHeightMinusTop, scrollHeight,\n newScrollTop, container.container.clientHeight); */\n // const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = this.reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n\n /* if(DEBUG) {\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\n } */\n\n this.setScrollTop(newScrollTop, useReflow);\n\n /* if(DEBUG) {\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, container.scrollTop, container.scrollHeight, this.isHeavyAnimationInProgress);\n } */\n }\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.ScrollSaver = ScrollSaver);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type IntersectionTarget = Element;\nexport type IntersectionCallback = (entry: IntersectionObserverEntry) => void;\n\nexport default class SuperIntersectionObserver {\n private observing: Map>;\n private observingQueue: SuperIntersectionObserver['observing'];\n private observer: IntersectionObserver;\n private freezedObservingNew: boolean;\n\n constructor(init?: IntersectionObserverInit) {\n this.observing = new Map();\n this.observingQueue = new Map();\n this.freezedObservingNew = false;\n\n this.observer = new IntersectionObserver((entries) => {\n const observing = this.observing;\n for(let i = 0, length = entries.length; i < length; ++i) {\n const entry = entries[i];\n const callbacks = observing.get(entry.target);\n if(!callbacks) {\n console.error('intersection process no callbacks:', entry);\n debugger;\n continue;\n }\n\n for(const callback of callbacks) {\n try {\n callback(entry);\n } catch(err) {\n console.error('intersection process callback error:', err);\n }\n }\n }\n }, init);\n }\n\n public disconnect() {\n this.observing.clear();\n this.observingQueue.clear();\n this.observer.disconnect();\n }\n\n public toggleObservingNew(value: boolean) {\n if(this.freezedObservingNew === value) {\n return;\n }\n\n this.freezedObservingNew = value;\n\n const queue = this.observingQueue;\n if(!value && queue.size) {\n for(const [target, callbacks] of queue) {\n for(const callback of callbacks) {\n this.observe(target, callback);\n }\n }\n\n queue.clear();\n }\n }\n\n public has(target: IntersectionTarget, callback: IntersectionCallback, observing = this.observing) {\n const callbacks = observing.get(target);\n return !!(callbacks && callbacks.has(callback));\n }\n\n public observe(target: IntersectionTarget, callback: IntersectionCallback) {\n if(this.freezedObservingNew && this.has(target, callback)) {\n return;\n }\n\n const observing = this.freezedObservingNew ? this.observingQueue : this.observing;\n let callbacks = observing.get(target);\n if(callbacks && callbacks.has(callback)) {\n return;\n }\n\n if(!callbacks) {\n callbacks = new Set();\n observing.set(target, callbacks);\n\n if(observing === this.observing) {\n this.observer.observe(target);\n }\n }\n\n callbacks.add(callback);\n }\n\n public unobserve(target: IntersectionTarget, callback: IntersectionCallback) {\n const observing = this.freezedObservingNew && !this.has(target, callback) ? this.observingQueue : this.observing;\n const callbacks = observing.get(target);\n if(!callbacks) {\n return;\n }\n\n callbacks.delete(callback);\n if(!callbacks.size) {\n observing.delete(target);\n this.observer.unobserve(target);\n }\n }\n}\n","import type {MyDocument} from '../../appDocsManager';\nimport type {MyMessage} from '../../appMessagesManager';\nimport {Message, MessageMedia} from '../../../../layer';\n\nexport default function isMentionUnread(message: MyMessage) {\n if(!message) {\n return false;\n }\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return !!(\n message.pFlags.media_unread &&\n message.pFlags.mentioned &&\n (\n !doc ||\n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n )\n );\n}\n","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","function cacheCallback(callback: (str: A) => T) {\n const stringResults: any = {}, numberResults: any = {};\n return (value: A): T => {\n const key = '_' + value;\n return (typeof(value) === 'string' ? stringResults : numberResults)[key] ??= callback(value);\n };\n}\n\nexport default cacheCallback;\n","export default function replaceNonNumber(str: string) {\n return str.replace(/\\D/g, '');\n}\n","import cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nconst CARD_BRAND_REGEXP: {[brand: string]: RegExp} = {\n visa: /^4/,\n mastercard: /^(51|52|53|54|55|222|23|24|25|26|27)/,\n amex: /^(34|37)/,\n discover: /^(60|64|65)/,\n diners: /^(30|38|39)/,\n diners14: /^(36)/,\n jcb: /^(35)/,\n unionpay: /^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,\n elo: /^(5067|509|636368|627780)/,\n mir: /^(220[0-4])/\n};\n\n// * taken from Stripe\nexport const CARD_BRANDS: {[b: string]: {\n minLength: number,\n maxLength: number,\n cvcMaxLength: number,\n cvcMinLength: number | null\n}} = {\n visa: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mastercard: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n amex: {\n minLength: 15,\n maxLength: 15,\n cvcMaxLength: 4,\n cvcMinLength: 3\n },\n unionpay: {\n minLength: 13,\n maxLength: 19,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners14: {\n minLength: 14,\n maxLength: 14,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n discover: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n jcb: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n elo: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mir: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n unknown: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 4,\n cvcMinLength: 3\n }\n};\n\nexport const detectCardBrand = cacheCallback((card: string = '') => {\n const keys = Object.keys(CARD_BRAND_REGEXP);\n const sanitizedCard = replaceNonNumber(card);\n let brand: string;\n let last = 0;\n keys.forEach((key) => {\n const regExp = CARD_BRAND_REGEXP[key];\n const match = sanitizedCard.match(regExp);\n if(match) {\n const result = match[0];\n if(result && result.length > last) {\n brand = key;\n last = result.length;\n }\n }\n });\n\n return brand || 'unknown';\n});\n\nexport function cardBrandToUnifiedBrand(brand: string) {\n return brand === 'diners14' ? 'diners' : brand;\n}\n\nexport function detectUnifiedCardBrand(card = '') {\n const brand = detectCardBrand(card);\n return cardBrandToUnifiedBrand(brand);\n}\n","export default function createArray(length: number, fill?: T1, map?: any): T1[] {\n const arr = new Array(length);\n arr.fill(fill);\n return map ? arr.map(map) : arr;\n}\n","const delta = '0'.charCodeAt(0) - '0'.charCodeAt(0);\nconst buggedRegExp = /[0-9]/g;\n\n// function hasBuggedNumbers(str: string) {\n// return !!str.match(a);\n// }\n\nfunction getDistanceFromBuggedToNormal(char: string) {\n return String.fromCharCode(char.charCodeAt(0) - delta);\n}\n\nexport function fixBuggedNumbers(str: string) {\n return str.replace(buggedRegExp, getDistanceFromBuggedToNormal);\n}\n","import {fixBuggedNumbers} from '../string/buggedNumbers';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternCharacter = {\n type: 'optional',\n result: string,\n consumed: number\n} | {\n type: 'required',\n result: string,\n consumed: number,\n partial?: boolean\n} | {\n type: 'formatting',\n result: string,\n consumed: number\n};\n\nexport type PatternFunction = (str: string) => ((str: string) => PatternCharacter)[];\n\nfunction makeOptionalCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'optional', result, consumed};\n}\n\nfunction makeRequiredCharacter(result: string, consumed: number, partial?: boolean): PatternCharacter {\n return {type: 'required', result, consumed, partial};\n}\n\nfunction makeFormattingCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'formatting', result, consumed};\n}\n\nfunction wrapCharacterRegExpFactory(regExp: RegExp, optional?: boolean) {\n return (str: string) => {\n const _regExp = new RegExp('^'.concat(regExp.source.replace(/^\\^/, '')));\n const match = str.match(_regExp);\n const makeCharacter = optional ? makeOptionalCharacter : makeRequiredCharacter;\n if(match) {\n const result = match[0];\n return makeCharacter(result, match.index + result.length);\n }\n\n return makeCharacter('', str.length);\n };\n}\n\nfunction makeCapitalPatternCharacter(str: string) {\n const char = wrapCharacterRegExpFactory(/\\w/)(str);\n return char.result ? makeRequiredCharacter(char.result.toUpperCase(), char.consumed) : char;\n}\n\nconst makeMonthDigitPatternCharacter = wrapCharacterRegExpFactory(/1[0-2]|0?[1-9]|0/);\n\nfunction digit(str: string) {\n return wrapCharacterRegExpFactory(/[0-9]/)(fixBuggedNumbers(str));\n}\n\nconst patternCharacters = {\n digit,\n capitalCharacter: makeCapitalPatternCharacter,\n month: (str: string) => {\n const char = makeMonthDigitPatternCharacter(fixBuggedNumbers(str));\n const cleanedResult = replaceNonNumber(char.result);\n const isPartial = ['0', '1'].includes(char.result) && str.length === 1;\n if(isPartial || (char.result === '0' && str.length >= 2)) {\n return makeRequiredCharacter(char.result, str.length, true);\n }\n\n return makeRequiredCharacter(cleanedResult.length === 1 ? '0' + cleanedResult : cleanedResult, char.consumed);\n },\n formattingCharacter: (str: string) => {\n return (str1: string) => {\n const consumed = str === str1[0] ? 1 : 0;\n return makeFormattingCharacter(str, consumed);\n }\n },\n optionalPattern: (regExp: RegExp) => {\n return (str: string) => {\n const char = wrapCharacterRegExpFactory(regExp, true)(str);\n return char.result ? char : makeOptionalCharacter('', 0);\n };\n }\n};\n\nexport default patternCharacters;\n","import {IS_ANDROID} from '../../environment/userAgent';\nimport createArray from '../array/createArray';\nimport cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\nimport {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport patternCharacters from './patternCharacters';\n\nconst digit = patternCharacters.digit;\nconst capitalCharacter = patternCharacters.capitalCharacter;\nconst spaceCharacter = patternCharacters.formattingCharacter(' ');\nconst yearOptionalPattern = patternCharacters.optionalPattern(/\\d\\d/);\nconst sixteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit];\nconst fifteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit];\n\nconst requiredPostcodes = new Set(['DZ', 'AR', 'AM', 'AU', 'AT', 'AZ', 'PT', 'BD', 'BY', 'BE', 'BA', 'BR', 'BN', 'BG', 'CA', 'IC', 'CN', 'CO', 'HR', 'CY', 'CZ', 'DK', 'EC', 'GB', 'EE', 'FO', 'FI', 'FR', 'GE', 'DE', 'GR', 'GL', 'GU', 'GG', 'NL', 'HU', 'IN', 'ID', 'IL', 'IT', 'JP', 'JE', 'KZ', 'KR', 'FM', 'KG', 'LV', 'LI', 'LT', 'LU', 'MK', 'MG', 'PT', 'MY', 'MH', 'MQ', 'YT', 'MX', 'MN', 'ME', 'NL', 'NZ', 'GB', 'NO', 'PK', 'PH', 'PL', 'FM', 'PT', 'PR', 'RE', 'RU', 'SA', 'SF', 'RS', 'SG', 'SK', 'SI', 'ZA', 'ES', 'LK', 'SX', 'VI', 'VI', 'SE', 'CH', 'TW', 'TJ', 'TH', 'TU', 'TN', 'TR', 'TM', 'VI', 'UA', 'GB', 'US', 'UY', 'UZ', 'VA', 'VN', 'GB', 'FM']);\n\nconst generateFourPattern = cacheCallback((length: number) => {\n const out: Array = [];\n\n for(let i = 0, k = 0; i < length;) {\n if(k === 4) {\n out.push(spaceCharacter);\n k = 0;\n } else {\n out.push(digit);\n ++i;\n ++k;\n }\n }\n\n return out;\n});\n\nfunction generateCardNumberPattern(card: string) {\n const brand = detectCardBrand(card);\n if(brand === 'amex') return sixteenPattern;\n if(brand === 'diners14') return fifteenPattern;\n const {minLength, maxLength} = CARD_BRANDS[brand];\n const s = replaceNonNumber(card).length;\n const d = Math.min(Math.max(minLength, s), maxLength);\n return generateFourPattern(d);\n}\n\nconst cardFormattingPatterns = {\n cardNumber: generateCardNumberPattern,\n cardExpiry: () => [patternCharacters.month, patternCharacters.formattingCharacter('/'), digit, digit, yearOptionalPattern],\n cardCvc: (card?: string) => cardFormattingPatterns.cardCvcFromBrand(detectCardBrand(card)),\n cardCvcFromBrand: cacheCallback((brand: string) => {\n const info = CARD_BRANDS[brand];\n const {cvcMinLength, cvcMaxLength} = info;\n const pattern = createArray(cvcMinLength || cvcMaxLength, digit);\n if(cvcMinLength && cvcMinLength < cvcMaxLength) {\n const i = cvcMaxLength - cvcMinLength;\n const h = patternCharacters.optionalPattern(/\\d/);\n if(i) {\n pattern.push(...createArray(i, h));\n }\n }\n\n return pattern;\n }),\n postalCodeFromCountry: cacheCallback((iso2: string) => {\n switch(iso2) {\n case 'US':\n return createArray(5, digit);\n case 'CA':\n return IS_ANDROID ? null : [capitalCharacter, capitalCharacter, capitalCharacter, spaceCharacter, capitalCharacter, capitalCharacter, capitalCharacter];\n default:\n const optionalDigits = createArray(10, patternCharacters.optionalPattern(/\\d/));\n if(requiredPostcodes.has(iso2)) {\n optionalDigits[0] = digit;\n }\n return optionalDigits;\n }\n })\n};\n\nexport default cardFormattingPatterns;\n","import accumulate from '../array/accumulate';\nimport {PatternFunction} from './patternCharacters';\n\nfunction accumulateLengths(strs: string[]) {\n return accumulate(strs.map((str) => str.length), 0);\n}\n\nfunction formatValueByPattern(\n getPattern: PatternFunction,\n value: string,\n options: Partial<{\n selectionStart: number,\n selectionEnd: number\n }> = {},\n pushRest?: boolean\n) {\n const pattern = getPattern(value);\n\n if(!pattern) {\n return {\n value: value,\n selection: null as typeof options,\n autocorrectComplete: !!value\n };\n }\n\n const length = pattern.length;\n const c: string[] = [];\n const s: string[] = [];\n\n let l = 0;\n let i = 0;\n let f = options.selectionStart === 0 ? 0 : null;\n let d = options.selectionEnd === 0 ? 0 : null;\n const p = () => {\n if(f === null && (i + 1) >= options.selectionStart) f = accumulateLengths(c) + (pushRest ? s.length : 0);\n if(d === null && (i + 1) >= options.selectionEnd) d = accumulateLengths(c) + (pushRest ? s.length : 0);\n };\n const m = (e: number) => {\n if(e > 0) {\n p();\n i += e;\n }\n };\n\n for(; l < length;) {\n const getCharacter = pattern[l];\n const character = getCharacter(value.slice(i));\n const {type, result, consumed} = character;\n if(type === 'required') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n ++l;\n\n if(character.partial) {\n m(value.length - i);\n break;\n }\n\n m(consumed);\n } else {\n if(!consumed) {\n break;\n }\n\n m(1);\n }\n } else if(type === 'optional') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n m(consumed);\n }\n\n ++l;\n } else if(type === 'formatting') {\n if(!pushRest && i >= value.length) {\n break;\n }\n\n s.push(result);\n ++l;\n m(consumed);\n }\n }\n\n if(pushRest) {\n c.push(...s);\n }\n\n return {\n value: c.join(''),\n selection: {\n selectionStart: f === null || value.length && options.selectionStart === value.length ? accumulateLengths(c) : f,\n selectionEnd: d === null || value.length && options.selectionEnd === value.length ? accumulateLengths(c) : d\n },\n autocorrectComplete: l === length\n };\n}\n\nexport default formatValueByPattern;\n","import {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport formatInputValueByPattern from './formatInputValueByPattern';\nimport NBSP from '../string/nbsp';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternValidationOptions = Partial<{\n ignoreIncomplete: boolean\n}>;\n\nconst nbspRegExp = new RegExp(NBSP, 'g');\n\nfunction makeValidationError(code?: string) {\n return code ? {\n type: 'invalid',\n code\n } : null;\n}\n\n// Luhn algorithm\nfunction validateCompleteCardNumber(card: string) {\n const t = '0'.charCodeAt(0);\n const n = card.length % 2;\n let a = 0;\n for(let i = card.length - 1; i >= 0; --i) {\n const c = n === (i % 2);\n let o = card.charCodeAt(i) - t;\n if(c) o *= 2;\n if(o > 9) o -= 9;\n a += o;\n }\n return !(a % 10);\n}\n\nfunction validateExpiry(year: number, month: number, options?: PatternValidationOptions) {\n const date = new Date(Date.now());\n const _year = year < 100 ? date.getFullYear() % 100 : date.getFullYear();\n const nextMonth = date.getMonth() + 1;\n\n if(isNaN(year) || isNaN(month)) {\n return options?.ignoreIncomplete ? null : 'incomplete';\n }\n\n if((year - _year) < 0) {\n return 'invalid_expiry_year_past';\n }\n\n if((year - _year) > 50) {\n return 'invalid_expiry_year';\n }\n\n return !(year - _year) && month < nextMonth ? 'invalid_expiry_month_past' : null;\n}\n\nfunction getCardInfoByNumber(card: string) {\n const sanitized = replaceNonNumber(card);\n const brand = detectCardBrand(card);\n return {\n sanitized,\n brand,\n minLength: CARD_BRANDS[brand].minLength\n };\n}\n\nfunction makeCardNumberError(str: string, length: number, ignoreIncomplete: boolean) {\n if(str.length >= length) {\n return validateCompleteCardNumber(str) || detectCardBrand(str) === 'mir' ? null : makeValidationError('invalid');\n }\n\n return ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n\nexport function validateCardNumber(str: string, options: PatternValidationOptions = {}) {\n const {sanitized, minLength} = getCardInfoByNumber(str);\n return makeCardNumberError(sanitized, minLength, options.ignoreIncomplete);\n}\n\nexport function validateCardExpiry(str: string, options: PatternValidationOptions = {}) {\n const sanitized = str.replace(nbspRegExp, '').split(/ ?\\/ ?/);\n const [monthStr, yearStr = ''] = sanitized;\n const [month, year] = [monthStr, yearStr].map((str) => +str);\n const s = yearStr.length === 2 ? year % 100 : year;\n return yearStr.length < 2 || yearStr.length === 3 ? (options.ignoreIncomplete ? null : makeValidationError('incomplete')) : makeValidationError(validateExpiry(s, month, options));\n}\n\nexport function validateAnyIncomplete(formatted: ReturnType, str: string, options: PatternValidationOptions = {}) {\n return formatted.meta.autocorrectComplete || options.ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n","const NBSP = '‎';\nexport default NBSP;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {TelegramWebviewEventCallback} from '../../types';\n\nconst weakMap: WeakMap = new WeakMap();\nwindow.addEventListener('message', (e) => {\n const callback = weakMap.get(e.source as Window);\n if(!callback) {\n return;\n }\n\n callback(JSON.parse(e.data));\n});\n\nexport function createVerificationIframe(url: string, callback: TelegramWebviewEventCallback) {\n const iframe = document.createElement('iframe');\n // iframe.title = 'Complete Payment';\n iframe.allow = 'payment';\n // iframe.setAttribute('sandbox', 'allow-forms allow-scripts allow-same-origin allow-top-navigation allow-modals');\n iframe.setAttribute('sandbox', 'allow-forms allow-scripts allow-same-origin allow-modals');\n iframe.classList.add('payment-verification');\n iframe.src = url;\n\n return {\n iframe,\n onMount: () => {\n weakMap.set(iframe.contentWindow, callback);\n }\n };\n}\n\nexport default class PopupPaymentVerification extends PopupElement<{\n finish: () => void\n}> {\n constructor(private url: string, private openPathAfter?: boolean) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n title: 'Checkout.WebConfirmation.Title'\n });\n\n this.d();\n }\n\n private d() {\n const {iframe, onMount} = createVerificationIframe(this.url, (event) => {\n if(event.eventType !== 'web_app_open_tg_link') {\n return;\n }\n\n this.dispatchEvent('finish');\n this.hide();\n if(this.openPathAfter) {\n appImManager.openUrl('https://t.me' + event.eventData.path_full);\n }\n });\n\n this.body.append(iframe);\n this.show();\n onMount();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport cardFormattingPatterns from '../../helpers/cards/cardFormattingPatterns';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport formatInputValueByPattern from '../../helpers/cards/formatInputValueByPattern';\nimport {validateAnyIncomplete, validateCardExpiry, validateCardNumber} from '../../helpers/cards/validateCard';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport noop from '../../helpers/noop';\nimport {PaymentsPaymentForm} from '../../layer';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\nimport CheckboxField from '../checkboxField';\nimport confirmationPopup from '../confirmationPopup';\nimport CountryInputField from '../countryInputField';\nimport InputField, {InputFieldOptions, InputState} from '../inputField';\nimport Row from '../row';\nimport {SettingSection} from '../sidebarLeft';\nimport {getPaymentBrandIconPath, PaymentButton, PaymentsCredentialsToken} from './payment';\nimport {createVerificationIframe} from './paymentVerification';\nimport {PasswordInputHelpers} from '../passwordInputField';\n\nexport type PaymentCardDetails = {\n cardNumber: string;\n cardholderName: string;\n expiryFull: string;\n expiryMonth: string;\n expiryYear: string;\n cvc: string;\n country: string;\n zip: string;\n save?: boolean;\n};\n\nexport type PaymentCardDetailsShort = {\n title: string,\n save?: boolean;\n icon?: string;\n};\n\nexport type PaymentCardDetailsResult = PaymentCardDetails | PaymentCardDetailsShort;\n\nexport class InputFieldCorrected extends InputField {\n private lastKeyDown: string;\n private lastTransformed: ReturnType;\n\n constructor(public options: InputFieldOptions & {\n formatMethod: typeof cardFormattingPatterns['cardNumber'],\n validateMethod?: typeof validateCardNumber,\n errorKeys?: {[code: string]: LangPackKey},\n optional?: boolean,\n onChange?: (transformed: InputFieldCorrected['lastTransformed']) => void,\n onKeyDown?: (e: KeyboardEvent) => void\n }) {\n super(options);\n\n // const handleIncomplete = (t?: any) => {\n // if(\n // (!lastTransformed.value && t) ||\n // lastTransformed.meta.autocorrectComplete ||\n // lastTransformed.meta.error ||\n // optional\n // ) {\n // return;\n // }\n\n\n // };\n\n this.input.addEventListener('keydown', this.onKeyDown);\n this.input.addEventListener('input', this.onInput);\n this.input.addEventListener('blur', this.onBlur);\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n this.lastKeyDown = e.key;\n this.options.onKeyDown?.(e);\n };\n\n private onInput = () => {\n const value = this.value;\n const deleting = this.lastKeyDown === 'Backspace' && (((this.lastTransformed && this.lastTransformed.value.length) || 0) - value.length) === 1;\n const result = this.lastTransformed = formatInputValueByPattern({\n value: value,\n getPattern: this.options.formatMethod,\n deleting,\n input: this.input\n });\n\n const transformedValue = result.value;\n if(transformedValue !== value) {\n this.setValueSilently(transformedValue);\n\n if(result.selection) {\n (this.input as HTMLInputElement).selectionStart = result.selection.selectionStart;\n (this.input as HTMLInputElement).selectionEnd = result.selection.selectionEnd;\n }\n }\n\n this.validateNew(transformedValue, {ignoreIncomplete: true/* !result.meta.autocorrectComplete */});\n\n this.options.onChange?.(result);\n };\n\n private onBlur = () => {\n const value = this.lastTransformed?.value;\n if(value) {\n this.validateNew(value);\n }\n };\n\n public update() {\n this.onInput();\n }\n\n public validate = () => {\n return this.validateNew();\n };\n\n public validateNew(\n value = this.lastTransformed?.value ?? '',\n t: any = {},\n justReturn?: boolean\n ) {\n let result: ReturnType;\n if(this.options.validateMethod) {\n result = this.options.validateMethod?.(value, t);\n } else {\n result = validateAnyIncomplete(this.lastTransformed, value, t);\n }\n\n if(result?.code) {\n const langPackKey: LangPackKey = this.options.errorKeys?.[result.code];\n !justReturn && this.setState(InputState.Error, langPackKey);\n return false;\n }\n\n !justReturn && this.setState(InputState.Neutral);\n return true;\n }\n}\n\nexport function handleInputFieldsOnChange(inputFields: (CountryInputField | InputField | InputFieldCorrected)[], _onChange: (valid: boolean) => void) {\n const onChange = () => {\n const valid = inputFields.every((inputField) => {\n return 'validateNew' in inputField ? inputField.validateNew(undefined, undefined, true) : inputField.isValid();\n });\n\n _onChange(valid);\n };\n\n inputFields.forEach((inputField) => {\n if(inputField instanceof InputFieldCorrected) {\n const original = inputField.options.onChange;\n inputField.options.onChange = (...args: any[]) => {\n // @ts-ignore\n original?.(...args);\n onChange();\n };\n\n if('update' in inputField) {\n inputField.update();\n }\n } else {\n inputField.input.addEventListener('input', onChange);\n }\n });\n\n return {validate: onChange};\n}\n\nexport function createCountryZipFields(country?: boolean, zip?: boolean) {\n let countryInputField: CountryInputField, postcodeInputField: InputFieldCorrected;\n if(country || zip) {\n if(country) countryInputField = new CountryInputField({\n noPhoneCodes: true,\n onCountryChange: () => {\n postcodeInputField?.update();\n },\n required: true,\n autocomplete: 'country'\n });\n if(zip) postcodeInputField = new InputFieldCorrected({\n label: 'PaymentShippingZipPlaceholder',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'postal-code',\n formatMethod: (/* ...args */) => {\n const {country} = countryInputField.getSelected();\n const iso2 = country?.iso2;\n return cardFormattingPatterns.postalCodeFromCountry(iso2 && iso2.toUpperCase());\n }\n });\n }\n\n return {countryInputField, postcodeInputField};\n}\n\nexport type PaymentsNativeProvider = 'stripe' | 'smartglocal';\nexport type PaymentsNativeParams = {\n need_country?: boolean,\n need_zip?: boolean,\n need_cardholder_name?: boolean,\n publishable_key?: string, // stripe\n public_token?: string, // smartglocal\n gpay_params: string,\n};\nconst SUPPORTED_NATIVE_PROVIDERS: Set = new Set(['stripe', 'smartglocal']);\n\nexport default class PopupPaymentCard extends PopupElement<{\n finish: (obj: {token: any, card: PaymentCardDetailsResult}) => void\n}> {\n constructor(private paymentForm: PaymentsPaymentForm, private savedCard?: PaymentCardDetails) {\n super('popup-payment popup-payment-card', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider),\n title: 'PaymentCardInfo'\n });\n\n if(SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider)) {\n this.d();\n } else {\n const {iframe, onMount} = createVerificationIframe(paymentForm.url, (event) => {\n if(event.eventType !== 'payment_form_submit') {\n return;\n }\n\n const data = event.eventData;\n\n const cardOut = {title: data.title, save: false} as any as PaymentCardDetails;\n this.dispatchEvent('finish', {\n token: data.credentials,\n card: cardOut\n });\n\n this.hide();\n\n if(paymentForm.pFlags.can_save_credentials) {\n confirmationPopup({\n titleLangKey: 'PaymentCardSavePaymentInformation',\n descriptionLangKey: 'PaymentCardSavePaymentInformationInfoLine1',\n button: {\n langKey: 'Save'\n }\n }).then(() => {\n cardOut.save = true;\n }, noop);\n }\n });\n\n // putPreloader(this.body, true);\n this.body.append(iframe);\n this.show();\n onMount();\n }\n }\n\n private d() {\n const savedCard = this.savedCard;\n const cardSection = new SettingSection({name: 'PaymentInfo.Card.Title', noDelimiter: true, noShadow: true});\n\n const nativeParams: PaymentsNativeParams = JSON.parse(this.paymentForm.native_params.data);\n\n let lastBrand: string, brandIconTempId = 0, lastBrandImg: HTMLImageElement;\n const setBrandIcon = (brand: string) => {\n if(lastBrand === brand) {\n return;\n }\n\n const tempId = ++brandIconTempId;\n lastBrand = brand;\n\n const path = getPaymentBrandIconPath(brand);\n if(!path) {\n if(lastBrandImg) {\n lastBrandImg.remove();\n lastBrandImg = undefined;\n }\n\n return;\n }\n\n const img = new Image();\n img.classList.add('input-field-icon');\n renderImageFromUrlPromise(img, path, false).then(() => {\n if(brandIconTempId !== tempId) {\n return;\n }\n\n if(lastBrandImg) {\n lastBrandImg.replaceWith(img);\n } else {\n cardInputField.container.append(img);\n }\n\n lastBrandImg = img;\n });\n };\n const cardInputField = new InputFieldCorrected({\n label: 'PaymentCardNumber',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-number',\n formatMethod: cardFormattingPatterns.cardNumber,\n validateMethod: validateCardNumber,\n errorKeys: {\n invalid: 'PaymentCard.Error.Invalid',\n incomplete: 'PaymentCard.Error.Incomplete'\n },\n onChange: (transformed) => {\n setBrandIcon(detectUnifiedCardBrand(transformed.value));\n cvcInputField.update(); // format cvc\n }\n });\n\n let nameInputField: InputField;\n if(nativeParams.need_cardholder_name) nameInputField = new InputField({\n label: 'Checkout.NewCard.CardholderNamePlaceholder',\n maxLength: 255,\n required: true,\n autocomplete: 'cc-name'\n });\n\n const expireInputField = new InputFieldCorrected({\n label: 'SecureId.Identity.Placeholder.ExpiryDate',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-exp',\n formatMethod: cardFormattingPatterns.cardExpiry,\n validateMethod: validateCardExpiry\n });\n\n // handle autocomplete: 01/2345 -> 01/45\n expireInputField.input.addEventListener('input', () => {\n let value = expireInputField.value;\n if(value.length < 5) {\n return;\n }\n\n const splitted = value.split('/');\n if(splitted[1].length !== 4) {\n return;\n }\n\n value = [splitted[0], splitted[1].slice(2)].join('/');\n expireInputField.setValueSilently(value);\n }, {capture: true});\n\n const cvcInputField = new InputFieldCorrected({\n labelText: 'CVC',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-csc',\n name: 'cvc',\n formatMethod: () => cardFormattingPatterns.cardCvc(cardInputField.value)\n // validateMethod: (...args) => _5AH3.a.cardCvc(cardInputField.value)(...args)\n });\n\n const passwordHelpers = new PasswordInputHelpers(cvcInputField.container, cvcInputField.input as HTMLInputElement);\n\n const switchFocusOrder: (InputFieldCorrected | InputField)[] = [\n cardInputField,\n expireInputField,\n cvcInputField,\n nameInputField\n ].filter(Boolean);\n switchFocusOrder.forEach((inputField) => {\n const onKeyDown = (e: KeyboardEvent) => {\n if(!inputField.value && e.key === 'Backspace') {\n const previousInputField = switchFocusOrder[switchFocusOrder.indexOf(inputField) - 1];\n if(previousInputField) {\n // previousInputField.value = previousInputField.value.slice(0, -1);\n placeCaretAtEnd(previousInputField.input, true);\n }\n }\n };\n\n if(inputField instanceof InputFieldCorrected) {\n inputField.options.onKeyDown = onKeyDown;\n\n const original = inputField.options.onChange;\n inputField.options.onChange = (transformed) => {\n original?.(transformed);\n\n if(document.activeElement === inputField.input && transformed.meta.autocorrectComplete) {\n for(let i = switchFocusOrder.indexOf(inputField), length = switchFocusOrder.length; i < length; ++i) {\n const nextInputField = switchFocusOrder[i];\n if(\n nextInputField instanceof InputFieldCorrected ?\n !nextInputField.validateNew(undefined, undefined, true) :\n !nextInputField.value\n ) {\n placeCaretAtEnd(nextInputField.input, true);\n break;\n }\n }\n }\n };\n } else {\n inputField.input.addEventListener('keydown', onKeyDown);\n }\n });\n\n const inputFieldsRow = document.createElement('div');\n inputFieldsRow.classList.add('input-fields-row');\n inputFieldsRow.append(expireInputField.container, cvcInputField.container);\n\n const form = document.createElement('form');\n form.append(...[\n cardInputField.container,\n inputFieldsRow,\n nameInputField?.container\n ].filter(Boolean))\n\n cardSection.content.append(form);\n\n let billingSection: SettingSection;\n // let saveCheckboxField: CheckboxField;\n const {countryInputField, postcodeInputField} = createCountryZipFields(nativeParams.need_country, nativeParams.need_zip);\n if(nativeParams.need_country || nativeParams.need_zip) {\n billingSection = new SettingSection({name: 'PaymentInfo.Billing.Title', noDelimiter: true, noShadow: true});\n\n // const inputFieldsRow2 = inputFieldsRow.cloneNode() as HTMLElement;\n // inputFieldsRow2.append(countryInputField.container, postcodeInputField.container);\n // billingSection.content.append(inputFieldsRow2);\n billingSection.content.append(...[countryInputField, postcodeInputField].filter(Boolean).map((i) => i.container));\n }\n\n const canSave = !!this.paymentForm.pFlags.can_save_credentials;\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentCardSavePaymentInformation',\n checked: !!canSave\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: canSave ? 'PaymentCardSavePaymentInformationInfoLine1' : 'Checkout.2FA.Text'\n });\n\n if(!canSave) {\n saveRow.container.classList.add('is-disabled');\n }\n\n (billingSection || cardSection).content.append(saveRow.container);\n\n this.scrollable.append(...[cardSection, billingSection].filter(Boolean).map((s) => s.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const data: PaymentCardDetails = {\n cardNumber: cardInputField.value,\n expiryFull: expireInputField.value,\n expiryMonth: expireInputField.value.split('/')[0],\n expiryYear: expireInputField.value.split('/')[1],\n cvc: cvcInputField.value,\n\n cardholderName: nameInputField?.value,\n country: countryInputField?.value,\n zip: postcodeInputField?.value,\n\n save: saveCheckboxField?.checked\n };\n\n const nativeProvider: PaymentsNativeProvider = this.paymentForm.native_provider as any;\n let out: PaymentsCredentialsToken;\n if(nativeProvider === 'stripe') {\n const url = new URL('https://api.stripe.com/v1/tokens');\n url.search = new URLSearchParams({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvc,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n 'card[name]': data.cardholderName\n }).toString();\n\n const response = await fetch(url.toString(), {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': `Bearer ${nativeParams.publishable_key}`\n }\n });\n\n out = await response.json();\n } else if(nativeProvider === 'smartglocal') {\n const params = {\n card: {\n number: data.cardNumber.replace(/[^\\d]+/g, ''),\n expiration_month: data.expiryMonth,\n expiration_year: data.expiryYear,\n security_code: data.cvc.replace(/[^\\d]+/g, '')\n }\n };\n\n const url = /* DEBUG_PAYMENT_SMART_GLOCAL */false ?\n 'https://tgb-playground.smart-glocal.com/cds/v1/tokenize/card' :\n 'https://tgb.smart-glocal.com/cds/v1/tokenize/card';\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'X-PUBLIC-TOKEN': nativeParams.public_token\n },\n body: JSON.stringify(params)\n });\n\n const json: { // smartglocal\n data: {\n info: {\n card_network: string,\n card_type: string,\n masked_card_number: string\n },\n token: string\n },\n status: 'ok'\n } = await response.json();\n\n out = {type: 'card', token: json.data.token}\n }\n\n this.dispatchEvent('finish', {token: out, card: data});\n this.hide();\n }\n });\n\n const inputFields = ([\n cardInputField,\n nameInputField,\n expireInputField,\n cvcInputField,\n countryInputField,\n postcodeInputField\n ] as const).filter(Boolean);\n handleInputFieldsOnChange(inputFields, (valid) => {\n payButton.disabled = !valid;\n // payButton.classList.toggle('btn-disabled', !valid);\n });\n\n if(savedCard) {\n cardInputField.value = savedCard.cardNumber;\n expireInputField.value = savedCard.expiryFull;\n cvcInputField.value = savedCard.cvc;\n nameInputField && (nameInputField.value = savedCard.cardholderName);\n countryInputField && (countryInputField.value = savedCard.country);\n postcodeInputField && (postcodeInputField.value = savedCard.zip);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n\n if(!cardInputField.validateNew(undefined, undefined, true)) {\n placeCaretAtEnd(cardInputField.input);\n }\n }\n}\n","import formatValueByPattern from './formatValueByPattern';\n\nexport default function formatInputValueByPattern(options: {\n value: string,\n getPattern: Parameters[0],\n deleting?: boolean,\n input?: HTMLElement\n}) {\n const {value: originalValue, getPattern, deleting, input} = options;\n const pushRest = !deleting && !!originalValue.length;\n const result = formatValueByPattern(getPattern, originalValue, {\n selectionStart: input ? (input as HTMLInputElement).selectionStart : 0,\n selectionEnd: input ? (input as HTMLInputElement).selectionEnd : 0\n }, pushRest)\n const {value, selection} = result;\n\n return {\n value,\n meta: {\n autocorrectComplete: result.autocorrectComplete,\n empty: !value\n },\n selection\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {AccountPassword, AccountTmpPassword} from '../../layer';\nimport {InputState} from '../inputField';\nimport PasswordInputField from '../passwordInputField';\nimport {SettingSection} from '../sidebarLeft';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentCardConfirmation extends PopupElement<{\n finish: (tmpPassword: AccountTmpPassword) => void\n}> {\n constructor(card: string, passwordState: AccountPassword) {\n super('popup-payment popup-payment-card-confirmation', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'Checkout.PasswordEntry.Title'\n });\n\n const section = new SettingSection({noDelimiter: true, noShadow: true, caption: 'Checkout.PasswordEntry.Text', captionArgs: [card]});\n const passwordInputField = new PasswordInputField({labelText: passwordState.hint});\n section.content.append(passwordInputField.container);\n this.scrollable.append(section.container);\n\n const onInput = () => {\n payButton.disabled = !passwordInputField.value;\n passwordInputField.setState(InputState.Neutral);\n };\n\n passwordInputField.input.addEventListener('input', onInput);\n\n const payButton = PaymentButton({\n key: 'Checkout.PasswordEntry.Pay',\n onClick: async() => {\n try {\n const inputCheckPassword = await this.managers.passwordManager.getInputCheckPassword(passwordInputField.value, passwordState);\n const tmpPassword = await this.managers.apiManager.invokeApi('account.getTmpPassword', {\n password: inputCheckPassword,\n period: 60\n });\n\n this.dispatchEvent('finish', tmpPassword);\n this.hide();\n } catch(err) {\n if((err as ApiError).type === 'PASSWORD_HASH_INVALID') {\n (err as ApiError).handled = true;\n passwordInputField.setError('PASSWORD_HASH_INVALID');\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n onInput();\n\n this.show();\n\n placeCaretAtEnd(passwordInputField.input);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {InputInvoice, PaymentRequestedInfo, PaymentsPaymentForm, PaymentsValidatedRequestedInfo} from '../../layer';\nimport matchEmail from '../../lib/richTextProcessor/matchEmail';\nimport CheckboxField from '../checkboxField';\nimport CountryInputField from '../countryInputField';\nimport InputField from '../inputField';\nimport Row from '../row';\nimport {SettingSection} from '../sidebarLeft';\nimport TelInputField from '../telInputField';\nimport {PaymentButton} from './payment';\nimport {createCountryZipFields, handleInputFieldsOnChange, InputFieldCorrected} from './paymentCard';\n\nexport type PaymentShippingAddress = PaymentRequestedInfo;\n\ntype ShippingFocusField = 'name' | 'email' | 'phone';\n\nexport default class PopupPaymentShipping extends PopupElement<{\n finish: (o: {shippingAddress: PaymentShippingAddress, requestedInfo: PaymentsValidatedRequestedInfo}) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private inputInvoice: InputInvoice,\n private focus?: ShippingFocusField\n ) {\n super('popup-payment popup-payment-shipping', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingInfo'\n });\n\n this.d();\n }\n\n private d() {\n const paymentForm = this.paymentForm;\n const invoice = paymentForm.invoice;\n const savedInfo = this.paymentForm.saved_info;\n\n let addressSection: SettingSection,\n address1InputField: InputField,\n address2InputField: InputField,\n cityInputField: InputField,\n stateInputField: InputField,\n countryInputField: CountryInputField,\n postcodeInputField: InputFieldCorrected;\n if(invoice.pFlags.shipping_address_requested) {\n addressSection = new SettingSection({name: 'PaymentShippingAddress', noDelimiter: true, noShadow: true});\n address1InputField = new InputField({label: 'PaymentShippingAddress1Placeholder', maxLength: 64, required: true});\n address2InputField = new InputField({label: 'PaymentShippingAddress2Placeholder', maxLength: 64});\n cityInputField = new InputField({label: 'PaymentShippingCityPlaceholder', maxLength: 64, required: true});\n stateInputField = new InputField({label: 'PaymentShippingStatePlaceholder', maxLength: 64});\n const res = createCountryZipFields(true, true);\n countryInputField = res.countryInputField;\n postcodeInputField = res.postcodeInputField;\n\n addressSection.content.append(...[\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n let receiverSection: SettingSection;\n let nameInputField: InputField, emailInputField: InputField, telInputField: TelInputField;\n if([invoice.pFlags.name_requested, invoice.pFlags.email_requested, invoice.pFlags.phone_requested].includes(true)) {\n receiverSection = new SettingSection({name: 'PaymentShippingReceiver', noDelimiter: true, noShadow: true});\n\n const validateEmail = () => {\n const value = emailInputField.value;\n const match = matchEmail(value);\n if(!match || match[0].length !== value.length) {\n return false;\n }\n\n return true;\n };\n\n const validatePhone = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n if(invoice.pFlags.name_requested) nameInputField = new InputField({label: 'PaymentShippingName', maxLength: 256, required: true});\n if(invoice.pFlags.email_requested) emailInputField = new InputField({label: 'PaymentShippingEmailPlaceholder', maxLength: 64, required: true, validate: validateEmail});\n if(invoice.pFlags.phone_requested) telInputField = new TelInputField({required: true, validate: validatePhone});\n\n receiverSection.content.append(...[\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentShippingSave',\n checked: true\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: 'PaymentShippingSaveInfo'\n });\n\n (receiverSection || addressSection).content.append(saveRow.container);\n\n this.scrollable.append(...[addressSection, receiverSection].filter(Boolean).map((section) => section.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const selectedCountry = countryInputField && countryInputField.getSelected().country;\n const data: PaymentShippingAddress = {\n _: 'paymentRequestedInfo',\n shipping_address: selectedCountry && {\n _: 'postAddress',\n street_line1: address1InputField.value,\n street_line2: address2InputField.value,\n city: cityInputField.value,\n state: stateInputField.value,\n // country: countryInputField.value,\n country_iso2: selectedCountry?.iso2,\n post_code: postcodeInputField.value\n },\n name: nameInputField?.value,\n email: emailInputField?.value,\n phone: telInputField?.value\n };\n\n try {\n const requestedInfo = await this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice, data, saveCheckboxField?.checked);\n\n this.dispatchEvent('finish', {\n shippingAddress: data,\n requestedInfo\n });\n\n this.hide();\n } catch(err: any) {\n const errorMap: {[err: string]: InputField} = {\n ADDRESS_STREET_LINE1_INVALID: address1InputField,\n ADDRESS_STREET_LINE2_INVALID: address2InputField,\n ADDRESS_COUNTRY_INVALID: countryInputField,\n ADDRESS_CITY_INVALID: cityInputField,\n ADDRESS_STATE_INVALID: stateInputField,\n ADDRESS_POSTCODE_INVALID: postcodeInputField,\n\n REQ_INFO_NAME_INVALID: nameInputField,\n REQ_INFO_EMAIL_INVALID: emailInputField,\n REQ_INFO_PHONE_INVALID: telInputField\n };\n\n const inputField = errorMap[(err as ApiError).type];\n if(inputField) {\n inputField.setError();\n (err as any).handled = true;\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n if(savedInfo) {\n const shippingAddress = savedInfo.shipping_address;\n if(shippingAddress) {\n address1InputField.value = shippingAddress.street_line1;\n address2InputField.value = shippingAddress.street_line2;\n cityInputField.value = shippingAddress.city;\n stateInputField.value = shippingAddress.state;\n countryInputField.selectCountryByIso2(shippingAddress.country_iso2);\n postcodeInputField.value = shippingAddress.post_code;\n }\n\n savedInfo.name && nameInputField && (nameInputField.value = savedInfo.name);\n savedInfo.email && emailInputField && (emailInputField.value = savedInfo.email);\n savedInfo.phone && telInputField && (telInputField.value = savedInfo.phone);\n }\n\n const {validate} = handleInputFieldsOnChange([\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField,\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean), (valid) => {\n payButton.disabled = !valid;\n });\n\n validate();\n\n this.show();\n\n let focusField: InputField;\n if(this.focus) {\n const focusMap: {[field in ShippingFocusField]?: InputField} = {\n name: nameInputField,\n email: emailInputField,\n phone: telInputField\n };\n\n focusField = focusMap[this.focus];\n } else {\n focusField = address1InputField;\n }\n\n if(focusField) {\n placeCaretAtEnd(focusField.input);\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 PopupElement from '.';\nimport accumulate from '../../helpers/array/accumulate';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {PaymentsPaymentForm, PaymentsValidatedRequestedInfo, ShippingOption} from '../../layer';\nimport Button from '../button';\nimport RadioField from '../radioField';\nimport Row, {RadioFormFromRows} from '../row';\nimport {SettingSection} from '../sidebarLeft';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentShippingMethods extends PopupElement<{\n finish: (shippingOption: ShippingOption) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private requestedInfo: PaymentsValidatedRequestedInfo,\n private shippingOption: ShippingOption\n ) {\n super('popup-payment popup-payment-shipping-methods', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingMethod'\n });\n\n this.d();\n }\n\n private d() {\n const section = new SettingSection({name: 'PaymentCheckoutShippingMethod', noDelimiter: true, noShadow: true});\n\n const rows = this.requestedInfo.shipping_options.map((shippingOption) => {\n return new Row({\n radioField: new RadioField({\n text: shippingOption.title,\n name: 'shipping-method',\n value: shippingOption.id\n }),\n subtitle: paymentsWrapCurrencyAmount(\n accumulate(shippingOption.prices.map(({amount}) => +amount), 0),\n this.paymentForm.invoice.currency\n )\n });\n });\n\n let lastShippingId: string;\n const form = RadioFormFromRows(rows, (value) => {\n lastShippingId = value;\n });\n\n if(this.shippingOption) {\n rows.find((row) => row.radioField.input.value === this.shippingOption.id).radioField.checked = true;\n } else {\n rows[0].radioField.checked = true;\n }\n\n section.content.append(form);\n\n this.scrollable.append(section.container);\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: () => {\n this.dispatchEvent('finish', this.requestedInfo.shipping_options.find((option) => option.id === lastShippingId));\n this.hide();\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport Currencies from '../../config/currencies';\nimport {FontFamily, FontSize} from '../../config/font';\nimport accumulate from '../../helpers/array/accumulate';\nimport getTextWidth from '../../helpers/canvas/getTextWidth';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport tsNow from '../../helpers/tsNow';\nimport {AccountTmpPassword, InputInvoice, InputPaymentCredentials, LabeledPrice, Message, MessageMedia, PaymentRequestedInfo, PaymentSavedCredentials, PaymentsPaymentForm, PaymentsPaymentReceipt, PaymentsValidatedRequestedInfo, PostAddress, ShippingOption} from '../../layer';\nimport I18n, {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport CheckboxField from '../checkboxField';\nimport PeerTitle from '../peerTitle';\nimport {putPreloader} from '../putPreloader';\nimport Row from '../row';\nimport {toastNew} from '../toast';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapPhoto from '../wrappers/photo';\nimport PopupPaymentCard, {PaymentCardDetails, PaymentCardDetailsResult} from './paymentCard';\nimport PopupPaymentCardConfirmation from './paymentCardConfirmation';\nimport PopupPaymentShipping, {PaymentShippingAddress} from './paymentShipping';\nimport PopupPaymentShippingMethods from './paymentShippingMethods';\nimport PopupPaymentVerification from './paymentVerification';\n\nconst iconPath = 'assets/img/';\nconst icons = [\n 'amex',\n 'card',\n 'diners',\n 'discover',\n 'jcb',\n 'mastercard',\n 'visa',\n 'unionpay',\n 'mir',\n 'logo'\n];\n\nexport function getPaymentBrandIconPath(brand: string) {\n if(!icons.includes(brand)) {\n return;\n }\n\n return `${iconPath}${brand}.svg`;\n}\n\nexport function PaymentButton(options: {\n onClick: () => Promise | void,\n key?: LangPackKey,\n textEl?: I18n.IntlElement\n}) {\n const textEl = options.textEl ?? new I18n.IntlElement({key: options.key ?? 'PaymentInfo.Done'});\n const key = textEl.key;\n const payButton = Button('btn-primary btn-color-primary payment-item-pay');\n payButton.append(textEl.element);\n attachClickEvent(payButton, async() => {\n const result = options.onClick();\n if(!(result instanceof Promise)) {\n return;\n }\n\n const d = putPreloader(payButton);\n const toggle = toggleDisability([payButton], true);\n textEl.compareAndUpdate({key: 'PleaseWait'});\n try {\n await result;\n } catch(err) {\n if(!(err as any).handled) {\n console.error('payment button error', err);\n }\n\n toggle();\n textEl.compareAndUpdate({key});\n d.remove();\n }\n });\n return payButton;\n}\n\nexport type PaymentsCredentialsToken = {type: 'card', token?: string, id?: string};\n\nexport default class PopupPayment extends PopupElement {\n private tipButtonsMap: Map;\n\n constructor(\n private message: Message.message,\n private inputInvoice: InputInvoice,\n private paymentForm?: PaymentsPaymentForm | PaymentsPaymentReceipt,\n private isReceipt?: boolean\n ) {\n super('popup-payment', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: true\n });\n\n this.tipButtonsMap = new Map();\n this.d().catch((err) => {\n console.error('payment popup error', err);\n this.hide();\n });\n }\n\n private async d() {\n this.element.classList.add('is-loading');\n this.show();\n\n let confirmed = false;\n const onConfirmed = () => {\n if(confirmed) {\n return;\n }\n\n confirmed = true;\n if(popupPaymentVerification) {\n popupPaymentVerification.hide();\n }\n\n this.hide();\n };\n\n let {paymentForm, message} = this;\n\n if(message) {\n this.listenerSetter.add(rootScope)('payment_sent', ({peerId, mid}) => {\n if(message.peerId === peerId && message.mid === mid) {\n onConfirmed();\n }\n });\n }\n\n const mediaInvoice = message?.media as MessageMedia.messageMediaInvoice;\n const isReceipt = this.isReceipt ??\n (\n mediaInvoice ?\n !!mediaInvoice.receipt_msg_id || mediaInvoice.extended_media?._ === 'messageExtendedMedia' :\n paymentForm._ === 'payments.paymentReceipt'\n );\n const isTest = mediaInvoice ? mediaInvoice.pFlags.test : paymentForm.invoice.pFlags.test;\n\n const photo = mediaInvoice ? mediaInvoice.photo : paymentForm.photo;\n const title = mediaInvoice ? mediaInvoice.title : paymentForm.title;\n const description = mediaInvoice ? mediaInvoice.description : paymentForm.description;\n\n _i18n(this.title, isReceipt ? 'PaymentReceipt' : 'PaymentCheckout');\n if(isTest) {\n this.title.append(' (Test)');\n }\n\n const className = 'payment-item';\n\n const itemEl = document.createElement('div');\n itemEl.classList.add(className);\n\n const detailsClassName = className + '-details';\n const details = document.createElement('div');\n details.classList.add(detailsClassName);\n\n let photoEl: HTMLElement;\n if(photo) {\n photoEl = document.createElement('div');\n photoEl.classList.add(detailsClassName + '-photo', 'media-container-contain');\n wrapPhoto({\n photo: photo,\n container: photoEl,\n boxWidth: 100,\n boxHeight: 100,\n size: {_: 'photoSizeEmpty', type: ''}\n });\n details.append(photoEl);\n }\n\n const linesClassName = detailsClassName + '-lines';\n const linesEl = document.createElement('div');\n linesEl.classList.add(linesClassName);\n\n const titleEl = document.createElement('div');\n titleEl.classList.add(linesClassName + '-title');\n\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add(linesClassName + '-description');\n\n const botName = document.createElement('div');\n botName.classList.add(linesClassName + '-bot-name');\n\n linesEl.append(titleEl, descriptionEl, botName);\n\n setInnerHTML(titleEl, wrapEmojiText(title));\n setInnerHTML(descriptionEl, wrapEmojiText(description));\n\n const peerTitle = new PeerTitle();\n botName.append(peerTitle.element);\n\n details.append(linesEl);\n itemEl.append(details);\n this.scrollable.append(itemEl);\n\n const preloaderContainer = document.createElement('div');\n preloaderContainer.classList.add(className + '-preloader-container');\n const preloader = putPreloader(preloaderContainer, true);\n this.scrollable.container.append(preloaderContainer);\n\n const inputInvoice = this.inputInvoice;\n if(!paymentForm) {\n if(isReceipt) paymentForm = await this.managers.appPaymentsManager.getPaymentReceipt(message.peerId, mediaInvoice.receipt_msg_id || (inputInvoice as InputInvoice.inputInvoiceMessage).msg_id);\n else paymentForm = await this.managers.appPaymentsManager.getPaymentForm(inputInvoice);\n this.paymentForm = paymentForm;\n }\n\n let savedInfo = (paymentForm as PaymentsPaymentForm).saved_info || (paymentForm as PaymentsPaymentReceipt).info;\n const savedCredentials = (paymentForm as PaymentsPaymentForm).saved_credentials?.[0];\n let [lastRequestedInfo, passwordState, providerPeerTitle] = await Promise.all([\n !isReceipt && savedInfo && this.managers.appPaymentsManager.validateRequestedInfo(inputInvoice, savedInfo),\n savedCredentials && this.managers.passwordManager.getState(),\n wrapPeerTitle({peerId: paymentForm.provider_id.toPeerId()})\n ]);\n\n // console.log(paymentForm, lastRequestedInfo);\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const wrapAmount = (amount: string | number, skipSymbol?: boolean) => {\n return paymentsWrapCurrencyAmount(amount, currency, skipSymbol);\n };\n\n const {invoice} = paymentForm;\n const currency = invoice.currency;\n\n const isRecurring = invoice.pFlags.recurring && !isReceipt;\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n const peerTitle2 = isRecurring ? await wrapPeerTitle({peerId: paymentForm.bot_id.toPeerId()}) : undefined;\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const makeLabel = () => {\n const labelEl = document.createElement('div');\n labelEl.classList.add(pricesClassName + '-price');\n\n const left = document.createElement('span');\n const right = document.createElement('span');\n labelEl.append(left, right);\n return {label: labelEl, left, right};\n };\n\n const pricesClassName = className + '-prices';\n const prices = document.createElement('div');\n prices.classList.add(pricesClassName);\n const makePricesElements = (prices: LabeledPrice[]) => {\n return prices.map((price) => {\n const {amount, label} = price;\n\n const _label = makeLabel();\n _label.left.textContent = label;\n\n const wrappedAmount = wrapAmount(amount);\n _label.right.textContent = wrappedAmount;\n\n return _label.label;\n });\n };\n\n const pricesElements = makePricesElements(invoice.prices);\n\n let getTipsAmount = (): number => 0;\n let shippingAmount = 0;\n\n const getTotalTotal = () => totalAmount + getTipsAmount() + shippingAmount;\n const setTotal = () => {\n const wrapped = wrapAmount(getTotalTotal());\n totalLabel.right.textContent = wrapped;\n payI18n.compareAndUpdate({\n key: 'PaymentCheckoutPay',\n args: [wrapped]\n });\n };\n\n const payI18n = new I18n.IntlElement();\n\n const totalLabel = makeLabel();\n totalLabel.label.classList.add('is-total');\n _i18n(totalLabel.left, 'PaymentTransactionTotal');\n const totalAmount = accumulate(invoice.prices.map(({amount}) => +amount), 0);\n\n const canTip = (invoice.max_tip_amount !== undefined && !isReceipt) || !!(paymentForm as PaymentsPaymentReceipt).tip_amount;\n if(canTip) {\n const tipsClassName = className + '-tips';\n\n const currencyData = Currencies[currency];\n\n getTipsAmount = () => +getInputValue().replace(/\\D/g, '');\n\n const getInputValue = () => {\n // return input.textContent;\n return input.value;\n };\n\n const setInputWidth = () => {\n const width = getTextWidth(getInputValue(), `500 ${FontSize} ${FontFamily}`);\n input.style.width = width + 'px';\n };\n\n const setInputValue = (amount: string | number) => {\n amount = Math.min(+amount, +invoice.max_tip_amount);\n const wrapped = wrapAmount(amount, true);\n\n input.value = wrapped;\n // input.textContent = wrapped;\n if(document.activeElement === input) {\n placeCaretAtEnd(input);\n }\n\n unsetActiveTip && unsetActiveTip();\n const tipEl = this.tipButtonsMap.get(amount);\n if(tipEl) {\n tipEl.classList.add('active');\n }\n\n setInputWidth();\n setTotal();\n };\n\n const tipsLabel = makeLabel();\n _i18n(tipsLabel.left, isReceipt ? 'PaymentTip' : 'PaymentTipOptional');\n const input = document.createElement('input');\n input.type = 'tel';\n // const input: HTMLElement = document.createElement('div');\n // input.contentEditable = 'true';\n input.classList.add('input-clear', tipsClassName + '-input');\n tipsLabel.right.append(input);\n\n if(!isReceipt) {\n tipsLabel.label.style.cursor = 'text';\n } else {\n tipsLabel.label.classList.add('disable-hover');\n }\n\n tipsLabel.label.addEventListener('mousedown', (e) => {\n if(!findUpAsChild(e.target as HTMLElement, input)) {\n placeCaretAtEnd(input);\n }\n });\n\n const haveToIgnoreEvents = input instanceof HTMLInputElement ? 1 : 2;\n const onSelectionChange = () => {\n if(ignoreNextSelectionChange) {\n --ignoreNextSelectionChange;\n return;\n }\n\n // setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n // }, 0);\n };\n\n const onFocus = () => {\n // cancelEvent(e);\n setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n document.addEventListener('selectionchange', onSelectionChange);\n }, 0);\n };\n\n const onFocusOut = () => {\n input.addEventListener('focus', onFocus, {once: true});\n document.removeEventListener('selectionchange', onSelectionChange);\n };\n\n let ignoreNextSelectionChange: number;\n input.addEventListener('focusout', onFocusOut);\n onFocusOut();\n\n input.addEventListener('input', () => {\n setInputValue(getTipsAmount());\n });\n\n const s = [currencyData.symbol, currencyData.space_between ? ' ' : ''];\n if(!currencyData.symbol_left) s.reverse();\n tipsLabel.right[currencyData.symbol_left ? 'prepend' : 'append'](s.join(''));\n\n pricesElements.push(tipsLabel.label);\n\n //\n let unsetActiveTip: () => void;\n if(!isReceipt) {\n const tipsEl = document.createElement('div');\n tipsEl.classList.add(tipsClassName);\n\n const tipClassName = tipsClassName + '-tip';\n const tipButtons = invoice.suggested_tip_amounts.map((tipAmount) => {\n const button = Button(tipClassName, {noRipple: true});\n button.textContent = wrapAmount(tipAmount);\n\n this.tipButtonsMap.set(+tipAmount, button);\n return button;\n });\n\n unsetActiveTip = () => {\n const prevTipEl = tipsEl.querySelector('.active');\n if(prevTipEl) {\n prevTipEl.classList.remove('active');\n }\n };\n\n attachClickEvent(tipsEl, (e) => {\n const tipEl = findUpClassName(e.target, tipClassName);\n if(!tipEl) {\n return;\n }\n\n let tipAmount = 0;\n if(tipEl.classList.contains('active')) {\n tipEl.classList.remove('active');\n } else {\n unsetActiveTip();\n tipEl.classList.add('active');\n\n for(const [amount, el] of this.tipButtonsMap) {\n if(el === tipEl) {\n tipAmount = amount;\n break;\n }\n }\n }\n\n setInputValue(tipAmount);\n });\n\n setInputValue(0);\n\n tipsEl.append(...tipButtons);\n pricesElements.push(tipsEl);\n } else {\n setInputValue((paymentForm as PaymentsPaymentReceipt).tip_amount);\n }\n } else {\n setTotal();\n }\n\n pricesElements.push(totalLabel.label);\n\n prices.append(...pricesElements);\n itemEl.append(prices);\n\n // /\n\n const setRowIcon = async(row: Row, icon?: string) => {\n const img = document.createElement('img');\n img.classList.add('media-photo');\n await renderImageFromUrlPromise(img, getPaymentBrandIconPath(icon));\n let container = row.media;\n if(!container) {\n container = row.createMedia('small');\n container.classList.add('media-container-cover');\n container.append(img);\n } else {\n replaceContent(container, img);\n }\n };\n\n const createRow = (options: ConstructorParameters[0]) => {\n if(options.titleLangKey) {\n options.subtitleLangKey = options.titleLangKey;\n }\n\n options.noWrap = true;\n const row = new Row(options);\n row.container.classList.add(className + '-row');\n\n if(options.titleLangKey) {\n row.subtitle.classList.add('hide');\n }\n\n return row;\n };\n\n const setRowTitle = (row: Row, textContent: string) => {\n row.title.textContent = textContent;\n if(!textContent) {\n const e = I18n.weakMap.get(row.subtitle.firstElementChild as HTMLElement) as I18n.IntlElement;\n row.title.append(i18n(e.key));\n }\n\n row.subtitle.classList.toggle('hide', !textContent);\n };\n\n const setCardSubtitle = (card: PaymentCardDetailsResult) => {\n let brand: string;\n let str: string;\n let icon: string;\n if('title' in card) {\n brand = card.title.split(' ').shift();\n str = card.title;\n icon = card.icon;\n } else {\n brand = detectUnifiedCardBrand(card.cardNumber);\n str = brand + ' *' + card.cardNumber.split(' ').pop();\n }\n\n methodRow.title.classList.remove('tgico', 'tgico-card_outline');\n setRowIcon(methodRow, icon || brand.toLowerCase());\n setRowTitle(methodRow, str);\n };\n\n const onMethodClick = () => {\n new PopupPaymentCard(paymentForm as PaymentsPaymentForm, previousCardDetails as PaymentCardDetails).addEventListener('finish', ({token, card}) => {\n previousToken = token, previousCardDetails = card;\n\n setCardSubtitle(card);\n });\n };\n\n let previousCardDetails: PaymentCardDetailsResult, previousToken: PaymentsCredentialsToken;\n const methodRow = createRow({\n titleLangKey: 'PaymentCheckoutMethod',\n clickable: isReceipt ? undefined : onMethodClick,\n icon: 'card_outline'\n });\n\n methodRow.container.classList.add(className + '-method-row');\n\n if(savedCredentials) {\n setCardSubtitle(savedCredentials);\n } else if((paymentForm as PaymentsPaymentReceipt).credentials_title) {\n setCardSubtitle({title: (paymentForm as PaymentsPaymentReceipt).credentials_title});\n }\n\n const providerRow = createRow({\n title: providerPeerTitle,\n subtitleLangKey: 'PaymentCheckoutProvider'\n });\n\n const providerAvatar = new AvatarElement();\n providerAvatar.classList.add('avatar-32');\n providerRow.createMedia('small').append(providerAvatar);\n /* await */ providerAvatar.updateWithOptions({peerId: paymentForm.provider_id.toPeerId()});\n\n let shippingAddressRow: Row, shippingNameRow: Row, shippingEmailRow: Row, shippingPhoneRow: Row, shippingMethodRow: Row;\n let lastShippingOption: ShippingOption, onShippingAddressClick: (focus?: ConstructorParameters[2]) => void, onShippingMethodClick: () => void;\n const setShippingTitle = invoice.pFlags.shipping_address_requested ? (shippingAddress?: PaymentShippingAddress) => {\n if(!shippingAddress) {\n shippingMethodRow.subtitle.classList.add('hide');\n replaceContent(shippingMethodRow.title, i18n('PaymentShippingAddress'));\n return;\n }\n\n const postAddress = shippingAddress.shipping_address;\n setRowTitle(shippingAddressRow, [postAddress.city, postAddress.street_line1, postAddress.street_line2].filter(Boolean).join(', '));\n\n shippingMethodRow.container.classList.toggle('hide', !lastRequestedInfo && !isReceipt);\n } : undefined;\n\n const setShippingInfo = (info: PaymentRequestedInfo) => {\n setShippingTitle && setShippingTitle(info);\n shippingNameRow && setRowTitle(shippingNameRow, info.name);\n shippingEmailRow && setRowTitle(shippingEmailRow, info.email);\n shippingPhoneRow && setRowTitle(shippingPhoneRow, info.phone && ('+' + formatPhoneNumber(info.phone).formatted));\n };\n\n if(!isReceipt) {\n onShippingAddressClick = (focus) => {\n new PopupPaymentShipping(paymentForm as PaymentsPaymentForm, inputInvoice, focus).addEventListener('finish', ({shippingAddress, requestedInfo}) => {\n lastRequestedInfo = requestedInfo;\n savedInfo = (paymentForm as PaymentsPaymentForm).saved_info = shippingAddress;\n setShippingInfo(shippingAddress);\n });\n };\n }\n\n if(invoice.pFlags.shipping_address_requested) {\n const setShippingOption = (shippingOption?: ShippingOption) => {\n const scrollSaver = new ScrollSaver(this.scrollable, undefined, true);\n scrollSaver.save();\n if(lastShippingPricesElements) {\n lastShippingPricesElements.forEach((node) => node.remove());\n }\n\n if(!shippingOption) {\n shippingAmount = 0;\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n return;\n }\n\n lastShippingOption = shippingOption;\n setRowTitle(shippingMethodRow, shippingOption.title);\n\n shippingAmount = accumulate(shippingOption.prices.map(({amount}) => +amount), 0);\n lastShippingPricesElements = makePricesElements(shippingOption.prices);\n let l = totalLabel.label;\n if(canTip) {\n l = l.previousElementSibling as any;\n if(!isReceipt) {\n l = l.previousElementSibling as any;\n }\n }\n\n lastShippingPricesElements.forEach((element) => l.parentElement.insertBefore(element, l));\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n };\n\n shippingAddressRow = createRow({\n icon: 'location',\n titleLangKey: 'PaymentShippingAddress',\n clickable: !isReceipt && onShippingAddressClick.bind(null, undefined)\n });\n\n let lastShippingPricesElements: HTMLElement[];\n shippingMethodRow = createRow({\n icon: 'shipping',\n titleLangKey: 'PaymentCheckoutShippingMethod',\n clickable: !isReceipt && (onShippingMethodClick = () => {\n new PopupPaymentShippingMethods(paymentForm as PaymentsPaymentForm, lastRequestedInfo, lastShippingOption).addEventListener('finish', (shippingOption) => {\n setShippingOption(shippingOption);\n });\n })\n });\n\n shippingMethodRow.container.classList.add('hide');\n\n const shippingOption = (paymentForm as PaymentsPaymentReceipt).shipping;\n if(shippingOption) {\n setShippingOption(shippingOption);\n }\n }\n\n if(invoice.pFlags.name_requested) {\n shippingNameRow = createRow({\n icon: 'newprivate',\n titleLangKey: 'PaymentCheckoutName',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'name')\n });\n }\n\n if(invoice.pFlags.email_requested) {\n shippingEmailRow = createRow({\n icon: 'mention',\n titleLangKey: 'PaymentShippingEmailPlaceholder',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'email')\n });\n }\n\n if(invoice.pFlags.phone_requested) {\n shippingPhoneRow = createRow({\n icon: 'phone',\n titleLangKey: 'PaymentCheckoutPhoneNumber',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'phone')\n });\n }\n\n if(savedInfo) {\n setShippingInfo(savedInfo);\n }\n\n const rows = [\n methodRow,\n providerRow,\n shippingAddressRow,\n shippingMethodRow,\n shippingNameRow,\n shippingEmailRow,\n shippingPhoneRow\n ].filter(Boolean);\n\n const acceptTermsCheckboxField = isRecurring && new CheckboxField({\n text: 'Payments.Recurrent.Accept',\n textArgs: [wrapRichText(invoice.recurring_terms_url), peerTitle2]\n });\n\n const acceptTermsRow = isRecurring && createRow({\n checkboxField: acceptTermsCheckboxField\n });\n\n const recurringElements = isRecurring ? [document.createElement('hr'), acceptTermsRow.container] : [];\n\n this.scrollable.append(...[\n document.createElement('hr'),\n ...rows.map((row) => row.container),\n ...recurringElements\n ].filter(Boolean));\n\n // /\n let popupPaymentVerification: PopupPaymentVerification, lastTmpPasword: AccountTmpPassword;\n const onClick = () => {\n const missingInfo = invoice.pFlags.name_requested && !savedInfo?.name ? 'name' : (invoice.pFlags.email_requested && !savedInfo?.email ? 'email' : (invoice.pFlags.phone_requested && !savedInfo?.phone ? 'phone' : undefined));\n if(invoice.pFlags.shipping_address_requested) {\n if(!lastRequestedInfo) {\n onShippingAddressClick();\n return;\n } else if(!lastShippingOption) {\n onShippingMethodClick();\n return;\n }\n } else if(missingInfo) {\n onShippingAddressClick(missingInfo);\n return;\n }\n\n if(!previousCardDetails && !lastTmpPasword) {\n if(!savedCredentials) {\n onMethodClick();\n return;\n }\n\n Promise.resolve(passwordState ?? this.managers.passwordManager.getState()).then((_passwordState) => {\n new PopupPaymentCardConfirmation(savedCredentials.title, _passwordState).addEventListener('finish', (tmpPassword) => {\n passwordState = undefined;\n lastTmpPasword = tmpPassword;\n simulateClickEvent(payButton);\n\n // * reserve 5 seconds\n const diff = tmpPassword.valid_until - tsNow(true) - 5;\n setTimeout(() => {\n if(lastTmpPasword === tmpPassword) {\n lastTmpPasword = undefined;\n }\n }, diff * 1000);\n });\n });\n\n return;\n }\n\n return Promise.resolve().then(async() => {\n const credentials: InputPaymentCredentials = lastTmpPasword ? {\n _: 'inputPaymentCredentialsSaved',\n id: savedCredentials.id,\n tmp_password: lastTmpPasword.tmp_password\n } : {\n _: 'inputPaymentCredentials',\n data: {\n _: 'dataJSON',\n data: JSON.stringify(previousToken.token ? previousToken : {type: previousToken.type, id: previousToken.id})\n },\n pFlags: {\n save: previousCardDetails.save || undefined\n }\n };\n\n try {\n const paymentResult = await this.managers.appPaymentsManager.sendPaymentForm(\n inputInvoice,\n (paymentForm as PaymentsPaymentForm).form_id,\n lastRequestedInfo?.id,\n lastShippingOption?.id,\n credentials,\n getTipsAmount()\n );\n\n if(paymentResult._ === 'payments.paymentResult') {\n onConfirmed();\n } else {\n popupPaymentVerification = new PopupPaymentVerification(paymentResult.url, !mediaInvoice.extended_media);\n popupPaymentVerification.addEventListener('finish', () => {\n popupPaymentVerification = undefined;\n\n onConfirmed();\n });\n await new Promise((resolve, reject) => {\n popupPaymentVerification.addEventListener('close', () => {\n popupPaymentVerification = undefined;\n if(confirmed) {\n resolve();\n } else {\n const err = new Error('payment not finished');\n (err as ApiError).handled = true;\n reject(err);\n }\n });\n });\n }\n } catch(err) {\n if((err as ApiError).type === 'BOT_PRECHECKOUT_TIMEOUT') {\n toastNew({langPackKey: 'Error.AnError'});\n (err as ApiError).handled = true;\n } else if((err as ApiError).type === 'TMP_PASSWORD_INVALID') {\n passwordState = lastTmpPasword = undefined;\n simulateClickEvent(payButton);\n (err as ApiError).handled = true;\n }\n\n throw err;\n }\n });\n };\n\n const onChange = () => {\n payButton.disabled = !!(acceptTermsCheckboxField && !acceptTermsCheckboxField.checked);\n };\n\n let payButton: HTMLButtonElement;\n if(isReceipt) {\n payButton = PaymentButton({\n onClick: () => this.hide(),\n key: 'Done'\n });\n } else {\n payButton = PaymentButton({\n onClick: onClick,\n textEl: payI18n\n });\n }\n\n onChange();\n if(acceptTermsCheckboxField) {\n acceptTermsCheckboxField.input.addEventListener('change', onChange);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.onContentUpdate();\n }\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 clamp(ratio, 1., kMaxRatio) :\r\n clamp(ratio, kMinRatio, 1.);\r\n });\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n const result = new Array(this.count);\r\n\r\n const 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 const heights: number[] = [];\r\n let offset = 0;\r\n for(const 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 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Layouter, RectPart} from './groupedLayout';\n\nexport default function prepareAlbum(options: {\n container: HTMLElement,\n items: {w: number, h: number}[],\n maxWidth: number,\n minWidth: number,\n spacing: number,\n maxHeight?: number,\n forMedia?: true\n}) {\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\n const layout = layouter.layout();\n\n const widthItem = layout.find((item) => item.sides & RectPart.Right);\n const width = widthItem.geometry.width + widthItem.geometry.x;\n\n const heightItem = layout.find((item) => item.sides & RectPart.Bottom);\n const height = heightItem.geometry.height + heightItem.geometry.y;\n\n const container = options.container;\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n const children = container.children;\n\n layout.forEach(({geometry, sides}, idx) => {\n let div: HTMLElement;\n div = children[idx] as HTMLElement;\n if(!div) {\n div = document.createElement('div');\n container.append(div);\n }\n\n div.classList.add('album-item', 'grouped-item');\n\n div.style.width = (geometry.width / width * 100) + '%';\n div.style.height = (geometry.height / height * 100) + '%';\n div.style.top = (geometry.y / height * 100) + '%';\n div.style.left = (geometry.x / width * 100) + '%';\n\n if(sides & RectPart.Left && sides & RectPart.Top) {\n div.style.borderTopLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\n div.style.borderBottomLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Top) {\n div.style.borderTopRightRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\n div.style.borderBottomRightRadius = 'inherit';\n }\n\n if(options.forMedia) {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n div.append(mediaDiv);\n }\n\n // @ts-ignore\n // div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\n });\n\n /* if(options.forMedia) {\n layout.forEach((_, i) => {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n options.container.children[i].append(mediaDiv);\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport {Message, PhotoSize} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport rootScope from '../../lib/rootScope';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport prepareAlbum from '../prepareAlbum';\nimport wrapPhoto from './photo';\nimport wrapVideo from './video';\n\nexport default function wrapAlbum({messages, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, autoDownload, managers = rootScope.managers}: {\n messages: Message.message[],\n attachmentDiv: HTMLElement,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n uploading?: boolean,\n isOut: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n managers?: AppManagers\n}) {\n const items: {size: PhotoSize.photoSize, media: any, message: any}[] = [];\n\n // !lowest msgID will be the FIRST in album\n for(const message of messages) {\n const media = getMediaFromMessage(message);\n\n const size: any = media._ === 'photo' ? choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\n items.push({size, media, message});\n }\n\n /* // * pending\n if(storage[0] < 0) {\n items.reverse();\n } */\n\n prepareAlbum({\n container: attachmentDiv,\n items: items.map((i) => ({w: i.size.w, h: i.size.h})),\n maxWidth: mediaSizes.active.album.width,\n minWidth: 100,\n spacing: 2,\n forMedia: true\n });\n\n items.forEach((item, idx) => {\n const {size, media, message} = item;\n\n const div = attachmentDiv.children[idx] as HTMLElement;\n div.dataset.mid = '' + message.mid;\n div.dataset.peerId = '' + message.peerId;\n const mediaDiv = div.firstElementChild as HTMLElement;\n const isPhoto = media._ === 'photo';\n let thumbPromise: Promise;\n if(isPhoto) {\n thumbPromise = wrapPhoto({\n photo: media,\n message,\n container: mediaDiv,\n boxWidth: 0,\n boxHeight: 0,\n isOut,\n lazyLoadQueue,\n middleware,\n size,\n loadPromises,\n autoDownloadSize: autoDownload.photo,\n managers\n });\n } else {\n thumbPromise = wrapVideo({\n doc: message.media.document,\n container: mediaDiv,\n message,\n boxWidth: 0,\n boxHeight: 0,\n withTail: false,\n isOut,\n lazyLoadQueue,\n middleware,\n loadPromises,\n autoDownload,\n managers\n });\n }\n\n if(thumbPromise && loadPromises) {\n loadPromises.push(thumbPromise);\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 {SliderSuperTab} from '../../slider';\r\nimport appSidebarRight from '..';\r\nimport {roundPercents} from '../../poll';\r\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\r\nimport {i18n} from '../../../lib/langPack';\r\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\r\nimport Button from '../../button';\r\nimport {Message, MessageMedia} from '../../../layer';\r\n\r\nexport default class AppPollResultsTab extends SliderSuperTab {\r\n private resultsDiv: HTMLElement;\r\n\r\n public async init(message: Message.message) {\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 const poll = await this.managers.appPollsManager.getPoll((message.media as MessageMedia.messageMediaPoll).poll.id);\r\n\r\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\r\n\r\n const title = document.createElement('h3');\r\n setInnerHTML(title, wrapEmojiText(poll.poll.question));\r\n\r\n const percents = poll.results.results.map((v) => v.voters / poll.results.total_voters * 100);\r\n roundPercents(percents);\r\n\r\n const fragment = document.createDocumentFragment();\r\n poll.results.results.forEach((result, idx) => {\r\n if(!result.voters) return;\r\n\r\n const hr = document.createElement('hr');\r\n\r\n const answer = poll.poll.answers[idx];\r\n\r\n // Head\r\n const answerEl = document.createElement('div');\r\n answerEl.classList.add('poll-results-answer');\r\n\r\n const answerTitle = document.createElement('div');\r\n setInnerHTML(answerTitle, wrapEmojiText(answer.text));\r\n\r\n const answerPercents = document.createElement('div');\r\n answerPercents.innerText = Math.round(percents[idx]) + '%';\r\n\r\n answerEl.append(answerTitle, answerPercents);\r\n\r\n // Humans\r\n const list = appDialogsManager.createChatList();\r\n list.classList.add('poll-results-voters');\r\n\r\n appDialogsManager.setListClickListener(list, () => {\r\n appSidebarRight.onCloseBtnClick();\r\n }, undefined, true);\r\n\r\n list.style.minHeight = Math.min(result.voters, 4) * 48 + 'px';\r\n\r\n fragment.append(hr, answerEl, list);\r\n\r\n let offset: string, limit = 4, loading = false, left = Math.max(0, result.voters - 4);\r\n const load = () => {\r\n if(loading) return;\r\n loading = true;\r\n\r\n this.managers.appPollsManager.getVotes(message, answer.option, offset, limit).then((votesList) => {\r\n votesList.votes.forEach((vote) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: vote.user_id.toPeerId(false),\r\n container: list,\r\n rippleEnabled: false,\r\n meAsSaved: false,\r\n avatarSize: 'small'\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n });\r\n\r\n if(offset) {\r\n left = Math.max(0, left - votesList.votes.length);\r\n\r\n if(left) {\r\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n }\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 const showMore = Button('poll-results-more btn btn-primary btn-transparent', {icon: 'down'});\r\n showMore.addEventListener('click', load);\r\n showMore.append(i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n\r\n fragment.append(showMore);\r\n\r\n load();\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}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport appImManager from '../lib/appManagers/appImManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport ripple from './ripple';\r\nimport appSidebarRight from './sidebarRight';\r\nimport AppPollResultsTab from './sidebarRight/tabs/pollResults';\r\nimport {FormatterArguments, 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, simulateClickEvent} from '../helpers/dom/clickEvent';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport windowSize from '../helpers/windowSize';\r\nimport {Message, MessageMedia, Poll, PollResults} from '../layer';\r\nimport toHHMMSS from '../helpers/string/toHHMMSS';\r\nimport StackedAvatars from './stackedAvatars';\r\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\r\n\r\nlet lineTotalLength = 0;\r\nconst tailLength = 9;\r\nconst times = 10;\r\nconst fullTime = 340;\r\nconst oneTime = fullTime / times;\r\n\r\nexport const roundPercents = (percents: number[]) => {\r\n // console.log('roundPercents before percents:', percents);\r\n\r\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\r\n if(sum > 100) {\r\n const diff = sum - 100;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, minRemainder = 1;\r\n for(let k = 0; k < length; ++k) {\r\n const 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 const remainder = percents[k] % 1;\r\n if(remainder < 0.5 && remainder > maxRemainder) {\r\n maxRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n // throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] += 1 - maxRemainder;\r\n }\r\n }\r\n\r\n // console.log('roundPercents after percents:', percents);\r\n};\r\n\r\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\r\nrootScope.on('poll_update', (e) => {\r\n const {poll, results} = e as {poll: Poll, results: PollResults};\r\n\r\n //console.log('poll_update', poll, results);\r\n for(const connected of connectedPolls) {\r\n if(connected.id === poll.id) {\r\n const pollElement = connected.element;\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n }\r\n }\r\n}); */\r\n\r\nrootScope.addEventListener('poll_update', ({poll, results}) => {\r\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\r\n pollElements.forEach((pollElement) => {\r\n // console.log('poll_update', poll, results);\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n });\r\n});\r\n\r\nmediaSizes.addEventListener('resize', () => {\r\n PollElement.setMaxLength();\r\n PollElement.resizePolls();\r\n});\r\n\r\nmediaSizes.addEventListener('changeScreen', () => {\r\n PollElement.setMaxLength();\r\n});\r\n\r\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\r\n element.classList.remove('active');\r\n\r\n clearTimeout(timeout);\r\n setTimeout(() => {\r\n onHide();\r\n element.remove();\r\n\r\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\r\n prevQuizHint = prevQuizHintOnHide = null;\r\n prevQuizHintTimeout = 0;\r\n }\r\n }, 200);\r\n};\r\n\r\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\r\nlet isListenerSet = false;\r\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n\r\n const element = document.createElement('div');\r\n element.classList.add('quiz-hint');\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('container', 'tgico');\r\n\r\n const textEl = document.createElement('div');\r\n textEl.classList.add('text');\r\n\r\n container.append(textEl);\r\n element.append(container);\r\n\r\n setInnerHTML(textEl, wrapRichText(solution, {entities: solution_entities}));\r\n appImManager.chat.bubbles.container.append(element);\r\n\r\n void element.offsetLeft; // reflow\r\n element.classList.add('active');\r\n\r\n prevQuizHint = element;\r\n prevQuizHintOnHide = onHide;\r\n prevQuizHintTimeout = window.setTimeout(() => {\r\n hideQuizHint(element, onHide, prevQuizHintTimeout);\r\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\r\n\r\n if(!isListenerSet) {\r\n isListenerSet = true;\r\n appImManager.addEventListener('peer_changed', () => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport default class PollElement extends HTMLElement {\r\n public static MAX_OFFSET = -46.5;\r\n public static MAX_LENGTH = 0;\r\n public svgLines: SVGSVGElement[];\r\n private numberDivs: HTMLDivElement[];\r\n private answerDivs: HTMLDivElement[];\r\n private descDiv: HTMLElement;\r\n private typeDiv: HTMLElement;\r\n private avatarsDiv: HTMLElement;\r\n private viewResults: HTMLElement;\r\n private votersCountDiv: HTMLDivElement;\r\n\r\n // private maxLength: number;\r\n // private maxLengths: number[];\r\n private maxPercents: number[];\r\n\r\n public isClosed = false;\r\n private isQuiz = false;\r\n private isRetracted = false;\r\n private isPublic = false;\r\n private isMultiple = false;\r\n private chosenIndexes: number[] = [];\r\n private percents: number[];\r\n\r\n public message: Message.message;\r\n public managers: AppManagers;\r\n\r\n private quizInterval: number;\r\n private quizTimer: SVGSVGElement;\r\n\r\n private sendVoteBtn: HTMLElement;\r\n private chosingIndexes: number[] = [];\r\n\r\n private sendVotePromise: Promise;\r\n private sentVote = false;\r\n\r\n public static setMaxLength() {\r\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\r\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\r\n }\r\n\r\n public static resizePolls() {\r\n if(!this.MAX_LENGTH) return;\r\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\r\n pollElements.forEach((pollElement) => {\r\n pollElement.svgLines.forEach((svg, idx) => {\r\n // void svg.getBoundingClientRect(); // reflow\r\n pollElement.setLineProgress(idx, 1);\r\n });\r\n });\r\n }\r\n\r\n public async render() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n if(!lineTotalLength) {\r\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\r\n // console.log('line total length:', lineTotalLength);\r\n PollElement.setMaxLength();\r\n }\r\n\r\n // const {poll, results} = this.managers.appPollsManager.getPoll(pollId);\r\n const {poll, results} = this.message.media as MessageMedia.messageMediaPoll;\r\n\r\n /* const timestamp = Date.now() / 1000 | 0;\r\n if(timestamp < this.message.date) { */\r\n if(this.message.pFlags.is_scheduled) {\r\n this.classList.add('disable-hover');\r\n }\r\n\r\n // console.log('pollElement poll:', poll, results);\r\n\r\n let descKey: LangPackKey;\r\n if(poll.pFlags) {\r\n this.isPublic = !!poll.pFlags.public_voters;\r\n this.isQuiz = !!poll.pFlags.quiz;\r\n this.isClosed = !!poll.pFlags.closed;\r\n this.isMultiple = !!poll.pFlags.multiple_choice;\r\n\r\n if(this.isClosed) {\r\n descKey = 'Chat.Poll.Type.Closed';\r\n this.classList.add('is-closed');\r\n } else if(this.isQuiz) {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\r\n } else {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\r\n }\r\n }\r\n\r\n this.classList.toggle('is-multiple', this.isMultiple);\r\n\r\n const multipleSelect = this.isMultiple ? '' : '';\r\n const votes = poll.answers.map((answer, idx) => {\r\n return `\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n ${multipleSelect}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\r\n\r\n setInnerHTML(this.firstElementChild, wrapEmojiText(poll.question));\r\n\r\n Array.from(this.querySelectorAll('.poll-answer-text')).forEach((el, idx) => {\r\n setInnerHTML(el, wrapEmojiText(poll.answers[idx].text));\r\n });\r\n\r\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\r\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\r\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\r\n\r\n if(descKey) {\r\n this.typeDiv.append(i18n(descKey));\r\n }\r\n\r\n if(this.isQuiz) {\r\n this.classList.add('is-quiz');\r\n\r\n if(poll.close_period && poll.close_date) {\r\n const timeLeftDiv = document.createElement('div');\r\n timeLeftDiv.classList.add('poll-time');\r\n this.descDiv.append(timeLeftDiv);\r\n\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n // svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\r\n svg.classList.add('poll-quiz-timer');\r\n\r\n this.quizTimer = svg;\r\n\r\n const strokeWidth = 2;\r\n const radius = 7;\r\n const circumference = 2 * Math.PI * radius;\r\n\r\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\r\n circle.classList.add('poll-quiz-timer-circle');\r\n circle.setAttributeNS(null, 'cx', '16');\r\n circle.setAttributeNS(null, 'cy', '16');\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\r\n\r\n svg.append(circle);\r\n this.descDiv.append(svg);\r\n\r\n const period = poll.close_period * 1000;\r\n const closeTime = (poll.close_date - await rootScope.managers.timeManager.getServerTimeOffset()) * 1000;\r\n\r\n // console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\r\n\r\n // let time = Date.now();\r\n // let percents = (closeTime - time) / period;\r\n\r\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\r\n\r\n // // @ts-ignore\r\n // circle.style.strokeDashoffset = circumference + percents * circumference;\r\n // circle.style.strokeDasharray = ${circumference} ${circumference};\r\n\r\n this.quizInterval = window.setInterval(() => {\r\n const time = Date.now();\r\n const percents = (closeTime - time) / period;\r\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\r\n timeLeftDiv.innerHTML = toHHMMSS(timeLeft);\r\n\r\n if(timeLeft <= 5) {\r\n timeLeftDiv.style.color = '#ee545c';\r\n circle.style.stroke = '#ee545c';\r\n }\r\n // timeLeftDiv.style.visibility = 'visible';\r\n\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference + percents * circumference;\r\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\r\n\r\n if(time >= closeTime) {\r\n clearInterval(this.quizInterval);\r\n timeLeftDiv.innerHTML = '';\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference;\r\n this.quizInterval = 0;\r\n\r\n setTimeout(() => {\r\n // нужно запросить апдейт чтобы опрос обновился\r\n this.managers.appPollsManager.getResults(this.message);\r\n }, 3e3);\r\n }\r\n }, 1e3);\r\n }\r\n }\r\n\r\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\r\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\r\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\r\n\r\n const footerDiv = document.createElement('div');\r\n footerDiv.classList.add('poll-footer');\r\n\r\n this.viewResults = document.createElement('div');\r\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\r\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\r\n\r\n this.votersCountDiv = document.createElement('div');\r\n this.votersCountDiv.className = 'poll-votes-count';\r\n\r\n footerDiv.append(this.viewResults, this.votersCountDiv);\r\n this.append(footerDiv);\r\n\r\n this.viewResults.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n\r\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\r\n appSidebarRight.createTab(AppPollResultsTab).open(this.message);\r\n }\r\n });\r\n ripple(this.viewResults);\r\n\r\n if(this.isMultiple) {\r\n this.sendVoteBtn = document.createElement('div');\r\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\r\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\r\n ripple(this.sendVoteBtn);\r\n\r\n if(!poll.chosenIndexes.length) {\r\n this.votersCountDiv.classList.add('hide');\r\n }\r\n\r\n attachClickEvent(this.sendVoteBtn, (e) => {\r\n cancelEvent(e);\r\n /* const indexes = this.answerDivs.filter((el) => el.classList.contains('is-chosing')).map((el) => +el.dataset.index);\r\n if(indexes.length) {\r\n\r\n } */\r\n if(this.chosingIndexes.length) {\r\n this.sendVotes(this.chosingIndexes).then(() => {\r\n this.chosingIndexes.length = 0;\r\n this.answerDivs.forEach((el) => {\r\n el.classList.remove('is-chosing');\r\n });\r\n });\r\n }\r\n });\r\n\r\n footerDiv.append(this.sendVoteBtn);\r\n }\r\n\r\n // const width = this.getBoundingClientRect().width;\r\n // const width = mediaSizes.active.poll.width;\r\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\r\n\r\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\r\n if(!canVote || this.isPublic) {\r\n this.performResults(results, poll.chosenIndexes, false);\r\n }\r\n\r\n if(canVote) {\r\n this.setVotersCount(results);\r\n attachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n initQuizHint(results: PollResults) {\r\n if(results.solution && results.solution_entities) {\r\n const toggleHint = document.createElement('div');\r\n toggleHint.classList.add('tgico-tip', 'poll-hint');\r\n this.descDiv.append(toggleHint);\r\n\r\n // let active = false;\r\n attachClickEvent(toggleHint, (e) => {\r\n cancelEvent(e);\r\n\r\n // active = true;\r\n toggleHint.classList.add('active');\r\n setQuizHint(results.solution, results.solution_entities, () => {\r\n // active = false;\r\n toggleHint.classList.remove('active');\r\n });\r\n });\r\n\r\n if(this.sentVote) {\r\n const correctResult = results.results.find((r) => r.pFlags.correct);\r\n if(correctResult && !correctResult.pFlags.chosen) {\r\n simulateClickEvent(toggleHint);\r\n }\r\n }\r\n }\r\n }\r\n\r\n clickHandler(e: Event) {\r\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n const answerIndex = +target.dataset.index;\r\n if(this.isMultiple) {\r\n target.classList.toggle('is-chosing');\r\n\r\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\r\n if(foundIndex !== -1) {\r\n this.chosingIndexes.splice(foundIndex, 1);\r\n } else {\r\n this.chosingIndexes.push(answerIndex);\r\n }\r\n } else {\r\n this.sendVotes([answerIndex]);\r\n }\r\n\r\n /* target.classList.add('is-voting');\r\n setTimeout(() => { // simulate\r\n this.setResults([100, 0], answerIndex);\r\n target.classList.remove('is-voting');\r\n }, 1000); */\r\n }\r\n\r\n sendVotes(indexes: number[]) {\r\n if(this.sendVotePromise) return this.sendVotePromise;\r\n\r\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\r\n targets.forEach((target) => {\r\n target.classList.add('is-voting');\r\n });\r\n\r\n this.classList.add('disable-hover');\r\n this.sentVote = true;\r\n return this.sendVotePromise = this.managers.appPollsManager.sendVote(this.message, indexes).then(() => {\r\n targets.forEach((target) => {\r\n target.classList.remove('is-voting');\r\n });\r\n\r\n this.classList.remove('disable-hover');\r\n }).catch(() => {\r\n this.sentVote = false;\r\n }).finally(() => {\r\n this.sendVotePromise = null;\r\n });\r\n }\r\n\r\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\r\n });\r\n\r\n if(this.initQuizHint) {\r\n this.initQuizHint(results);\r\n this.initQuizHint = null;\r\n }\r\n\r\n if(this.quizInterval) {\r\n clearInterval(this.quizInterval);\r\n this.quizInterval = 0;\r\n }\r\n\r\n if(this.quizTimer?.parentElement) {\r\n this.quizTimer.remove();\r\n }\r\n\r\n const timeEl = this.descDiv.querySelector('.poll-time');\r\n if(timeEl) {\r\n timeEl.remove();\r\n }\r\n }\r\n\r\n if(this.isClosed) {\r\n this.classList.add('is-closed');\r\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\r\n }\r\n\r\n // set chosen\r\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\r\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\r\n this.chosenIndexes = chosenIndexes.slice();\r\n\r\n if(this.isRetracted) {\r\n attachClickEvent(this, this.clickHandler);\r\n } else {\r\n detachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n // is need update\r\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\r\n const percents = results.results.map((v) => results.total_voters ? v.voters / results.total_voters * 100 : 0);\r\n\r\n this.classList.toggle('no-transition', !animate);\r\n if(animate) {\r\n SetTransition(this, '', !this.isRetracted, 340);\r\n }\r\n\r\n fastRaf(() => {\r\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\r\n this.percents = percents;\r\n this.isRetracted = false;\r\n });\r\n }\r\n\r\n this.setVotersCount(results);\r\n\r\n if(this.isPublic) {\r\n if(!this.isMultiple) {\r\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\r\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\r\n }\r\n\r\n const peerIds = (results.recent_voters || []).map((userId) => userId.toPeerId());\r\n const stackedAvatars = new StackedAvatars({avatarSize: 16});\r\n stackedAvatars.render(peerIds);\r\n replaceContent(this.avatarsDiv, stackedAvatars.container);\r\n }\r\n\r\n if(this.isMultiple) {\r\n const isVoted = !!this.chosenIndexes.length;\r\n\r\n const hideSendVoteBtn = this.isClosed || isVoted;\r\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\r\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\r\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\r\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\r\n }\r\n }\r\n\r\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\r\n this.svgLines.forEach((svg) => svg.style.display = '');\r\n\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\r\n });\r\n\r\n const maxValue = Math.max(...percents);\r\n // this.maxLengths = percents.map((p) => p / maxValue * this.maxLength);\r\n this.maxPercents = percents.map((p) => p / maxValue);\r\n\r\n // line\r\n if(this.isRetracted) {\r\n this.svgLines.forEach((svg, idx) => {\r\n this.setLineProgress(idx, -1);\r\n });\r\n } else {\r\n const cb = () => {\r\n this.svgLines.forEach((svg, idx) => {\r\n // void svg.getBoundingClientRect(); // reflow\r\n this.setLineProgress(idx, 1);\r\n });\r\n };\r\n\r\n animate ? fastRaf(cb) : cb();\r\n }\r\n\r\n percents = percents.slice();\r\n roundPercents(percents);\r\n let getPercentValue: (percents: number, index: number) => number;\r\n const iterate = (i: number) => {\r\n percents.forEach((percents, idx) => {\r\n const value = getPercentValue(percents, i);\r\n this.numberDivs[idx].innerText = value + '%';\r\n });\r\n };\r\n // numbers\r\n if(this.isRetracted) {\r\n getPercentValue = (percents, index) => Math.round(percents / times * index);\r\n\r\n if(animate) {\r\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * k);\r\n }\r\n } else {\r\n iterate(0);\r\n }\r\n } else {\r\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\r\n\r\n if(animate) {\r\n for(let i = 0; i < times; ++i) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * i);\r\n }\r\n } else {\r\n iterate(times - 1);\r\n }\r\n }\r\n\r\n if(this.isRetracted) {\r\n if(animate) {\r\n this.classList.add('is-retracting');\r\n }\r\n\r\n this.classList.remove('is-voted');\r\n const cb = () => {\r\n this.svgLines.forEach((svg) => svg.style.display = 'none');\r\n };\r\n\r\n if(animate) {\r\n setTimeout(() => {\r\n this.classList.remove('is-retracting');\r\n cb();\r\n }, fullTime);\r\n } else {\r\n cb();\r\n }\r\n } else {\r\n this.classList.add('is-voted');\r\n }\r\n }\r\n\r\n setVotersCount(results: PollResults) {\r\n const votersCount = results.total_voters || 0;\r\n let key: LangPackKey;\r\n const args: FormatterArguments = [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","// https://stackoverflow.com/a/14824756/6758968\nconst ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\n fullRtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']'),\n justRtlDirCheck = new RegExp('['+rtlChars+']');\n\nexport default function isRTL(s: string, anyChar?: boolean) {\n return anyChar ? justRtlDirCheck.test(s) : fullRtlDirCheck.test(s);\n}\n","/*\n * 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} from '../environment/userAgent';\nimport {animate} from '../helpers/animation';\nimport drawCircle, {drawCircleFromStart} from '../helpers/canvas/drawCircle';\nimport clamp from '../helpers/number/clamp';\nimport {AnimationItemWrapper} from './animationIntersector';\n\ntype DotRendererDot = {\n x: number,\n y: number,\n opacity: number,\n radius: number\n mOpacity: number,\n adding: boolean,\n counter: number,\n path: Path2D\n};\nexport default class DotRenderer implements AnimationItemWrapper {\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n private dots: DotRendererDot[];\n\n public paused: boolean;\n public autoplay: boolean;\n public tempId: number;\n\n private dpr: number;\n\n constructor(private width: number, private height: number) {\n const canvas = this.canvas = document.createElement('canvas');\n const dpr = this.dpr = window.devicePixelRatio;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.classList.add('canvas-thumbnail', 'canvas-dots');\n\n this.paused = true;\n this.autoplay = true;\n this.tempId = 0;\n this.context = canvas.getContext('2d');\n }\n\n private prepare() {\n let count = Math.round(this.width * this.height / (35 * (IS_MOBILE ? 2 : 1)));\n count = Math.min(IS_MOBILE ? 1000 : 2200, count);\n const dots: DotRendererDot[] = this.dots = new Array(count);\n\n for(let i = 0; i < count; ++i) {\n dots[i] = this.generateDot();\n }\n }\n\n private generateDot(adding?: boolean): DotRendererDot {\n const x = Math.floor(Math.random() * this.canvas.width);\n const y = Math.floor(Math.random() * this.canvas.height);\n const opacity = adding ? 0 : Math.random();\n const radius = (Math.random() >= .8 ? 1 : 0.5) * this.dpr;\n const path = new Path2D();\n path.arc(x, y, radius, 0, 2 * Math.PI, false);\n return {\n x,\n y,\n opacity,\n radius,\n mOpacity: opacity,\n adding: adding ?? Math.random() >= .5,\n counter: 0,\n path\n };\n }\n\n private draw() {\n const {context, canvas, dots} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n context.fillStyle = '#fff';\n\n const add = 0.02;\n for(let i = 0, length = dots.length; i < length; ++i) {\n const dot = dots[i];\n const addOpacity = dot.adding ? add : -add;\n\n dot.mOpacity += addOpacity;\n // if(dot.mOpacity <= 0) dot.mOpacity = dot.opacity;\n\n // const easedOpacity = easing(dot.mOpacity);\n const easedOpacity = clamp(dot.mOpacity, 0, 1);\n context.globalAlpha = easedOpacity;\n context.fill(dot.path);\n\n if(dot.mOpacity <= 0) {\n dot.adding = true;\n\n if(++dot.counter >= 1) {\n dots[i] = this.generateDot(dot.adding);\n }\n } else if(dot.mOpacity >= 1) {\n dot.adding = false;\n }\n }\n }\n\n public remove() {\n this.pause();\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n ++this.tempId;\n }\n\n public renderFirstFrame() {\n if(!this.dots) {\n this.prepare();\n }\n\n this.draw();\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n const tempId = ++this.tempId;\n\n if(!this.dots) {\n this.prepare();\n }\n\n animate(() => {\n if(this.tempId !== tempId || this.paused) {\n return false;\n }\n\n this.draw();\n return true;\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {AppImManager, ChatSavedPosition} from '../../lib/appManagers/appImManager';\r\nimport type {HistoryResult, MyMessage} from '../../lib/appManagers/appMessagesManager';\r\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\r\nimport type Chat from './chat';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\nimport {logger} from '../../lib/logger';\r\nimport rootScope from '../../lib/rootScope';\r\nimport BubbleGroups from './bubbleGroups';\r\nimport PopupDatePicker from '../popups/datePicker';\r\nimport PopupForward from '../popups/forward';\r\nimport PopupStickers from '../popups/stickers';\r\nimport ProgressivePreloader from '../preloader';\r\nimport Scrollable, {SliceSides} from '../scrollable';\r\nimport StickyIntersector from '../stickyIntersector';\r\nimport animationIntersector from '../animationIntersector';\r\nimport mediaSizes from '../../helpers/mediaSizes';\r\nimport {IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\r\nimport I18n, {FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n} from '../../lib/langPack';\r\nimport AvatarElement from '../avatar';\r\nimport ripple from '../ripple';\r\nimport {MessageRender} from './messageRender';\r\nimport LazyLoadQueue from '../lazyLoadQueue';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport PollElement from '../poll';\r\nimport AudioElement from '../audio';\r\nimport {ChatInvite, Document, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, User, WebPage} from '../../layer';\r\nimport {BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\r\nimport {FocusDirection, ScrollStartCallbackDimensions} from '../../helpers/fastSmoothScroll';\r\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation} from '../../hooks/useHeavyAnimationCheck';\r\nimport {fastRaf, fastRafPromise} from '../../helpers/schedulers';\r\nimport deferredPromise from '../../helpers/cancellablePromise';\r\nimport RepliesElement from './replies';\r\nimport DEBUG from '../../config/debug';\r\nimport {SliceEnd} from '../../helpers/slicedArray';\r\nimport PeerTitle from '../peerTitle';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport {toast, toastNew} from '../toast';\r\nimport {getElementByPoint} from '../../helpers/dom/getElementByPoint';\r\nimport {getMiddleware, Middleware} 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 reflowScrollableElement from '../../helpers/dom/reflowScrollableElement';\r\nimport replaceContent from '../../helpers/dom/replaceContent';\r\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\r\nimport whichChild from '../../helpers/dom/whichChild';\r\nimport {cancelAnimationByKey} from '../../helpers/animation';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport debounce, {DebounceReturnType} from '../../helpers/schedulers/debounce';\r\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\r\nimport windowSize from '../../helpers/windowSize';\r\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\r\nimport AppMediaViewer from '../appMediaViewer';\r\nimport SetTransition from '../singleTransition';\r\nimport handleHorizontalSwipe from '../../helpers/dom/handleHorizontalSwipe';\r\nimport findUpAttribute from '../../helpers/dom/findUpAttribute';\r\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\r\nimport formatCallDuration from '../../helpers/formatCallDuration';\r\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\r\nimport Button from '../button';\r\nimport {CallType} from '../../lib/calls/types';\r\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\r\nimport PopupJoinChatInvite from '../popups/joinChatInvite';\r\nimport {InternalLink, INTERNAL_LINK_TYPE} from '../../lib/appManagers/internalLink';\r\nimport ReactionsElement, {REACTIONS_ELEMENTS} from './reactions';\r\nimport type ReactionElement from './reaction';\r\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\r\nimport pause from '../../helpers/schedulers/pause';\r\nimport ScrollSaver from '../../helpers/scrollSaver';\r\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\r\nimport forEachReverse from '../../helpers/array/forEachReverse';\r\nimport formatNumber from '../../helpers/number/formatNumber';\r\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\r\nimport SuperIntersectionObserver from '../../helpers/dom/superIntersectionObserver';\r\nimport generateFakeIcon from '../generateFakeIcon';\r\nimport copyFromElement from '../../helpers/dom/copyFromElement';\r\nimport PopupElement from '../popups';\r\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\r\nimport wrapWebPageDescription from '../wrappers/webPageDescription';\r\nimport wrapWebPageTitle from '../wrappers/webPageTitle';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\r\nimport wrapMessageActionTextNew from '../wrappers/messageActionTextNew';\r\nimport isMentionUnread from '../../lib/appManagers/utils/messages/isMentionUnread';\r\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\r\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\r\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\r\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\r\nimport generateMessageId from '../../lib/appManagers/utils/messageId/generateMessageId';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\r\nimport idleController from '../../helpers/idleController';\r\nimport overlayCounter from '../../helpers/overlayCounter';\r\nimport {cancelContextMenuOpening} from '../../helpers/dom/attachContextMenuListener';\r\nimport contextMenuController from '../../helpers/contextMenuController';\r\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\r\nimport middlewarePromise from '../../helpers/middlewarePromise';\r\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport noop from '../../helpers/noop';\r\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\r\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\r\nimport PopupPayment from '../popups/payment';\r\nimport isInDOM from '../../helpers/dom/isInDOM';\r\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\r\nimport attachStickerViewerListeners from '../stickerViewer';\r\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\r\nimport wrapSticker, {onEmojiStickerClick} from '../wrappers/sticker';\r\nimport wrapAlbum from '../wrappers/album';\r\nimport wrapDocument from '../wrappers/document';\r\nimport wrapGroupedDocuments from '../wrappers/groupedDocuments';\r\nimport wrapPhoto from '../wrappers/photo';\r\nimport wrapPoll from '../wrappers/poll';\r\nimport wrapVideo from '../wrappers/video';\r\nimport isRTL from '../../helpers/string/isRTL';\r\nimport NBSP from '../../helpers/string/nbsp';\r\nimport DotRenderer from '../dotRenderer';\r\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\r\nimport {BatchProcessor} from '../../helpers/sortedList';\r\n\r\nexport const USER_REACTIONS_INLINE = false;\r\nconst USE_MEDIA_TAILS = false;\r\nconst IGNORE_ACTIONS: Set = new Set([\r\n 'messageActionHistoryClear',\r\n 'messageActionChatCreate'/* ,\r\n 'messageActionChannelMigrateFrom' */\r\n]);\r\n\r\nexport const SERVICE_AS_REGULAR: Set = new Set();\r\n\r\nif(IS_CALL_SUPPORTED) {\r\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\r\n}\r\n\r\nconst TEST_SCROLL_TIMES: number = undefined;\r\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\r\n\r\nlet queueId = 0;\r\n\r\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\r\n\r\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\r\nexport const STICKY_OFFSET = 3;\r\nconst SCROLLED_DOWN_THRESHOLD = 300;\r\nconst PEER_CHANGED_ERROR = new Error('peer changed');\r\n\r\nconst DO_NOT_SLICE_VIEWPORT = false;\r\nconst DO_NOT_SLICE_VIEWPORT_ON_RENDER = false;\r\nconst DO_NOT_UPDATE_MESSAGE_VIEWS = false;\r\nconst DO_NOT_UPDATE_MESSAGE_REACTIONS = false;\r\nconst DO_NOT_UPDATE_MESSAGE_REPLY = false;\r\n\r\nconst BIG_EMOJI_SIZES: {[size: number]: number} = {\r\n 1: 96,\r\n 2: 90,\r\n 3: 84,\r\n 4: 72,\r\n 5: 60,\r\n 6: 48,\r\n 7: 36\r\n};\r\nconst BIG_EMOJI_SIZES_LENGTH = Object.keys(BIG_EMOJI_SIZES).length;\r\n\r\ntype Bubble = {\r\n bubble: HTMLElement,\r\n mids: Set,\r\n groupedId?: string\r\n};\r\n\r\ntype MyHistoryResult = HistoryResult | {history: number[]};\r\n\r\nfunction getMainMidForGrouped(mids: number[]) {\r\n return Math.max(...mids);\r\n}\r\n\r\nexport default class ChatBubbles {\r\n public container: HTMLDivElement;\r\n public chatInner: HTMLDivElement;\r\n public scrollable: Scrollable;\r\n\r\n private getHistoryTopPromise: Promise;\r\n private getHistoryBottomPromise: Promise;\r\n\r\n // public messagesCount: number = -1;\r\n\r\n private unreadOut = new Set();\r\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\r\n\r\n public bubbles: {[mid: string]: HTMLElement} = {};\r\n public skippedMids: Set = new Set();\r\n public bubblesNewByGroupedId: {[groupId: string]: Bubble} = {};\r\n public bubblesNew: {[mid: string]: Bubble} = {};\r\n private dateMessages: {[timestamp: number]: {\r\n div: HTMLElement,\r\n firstTimestamp: number,\r\n container: HTMLElement,\r\n timeout?: number\r\n }} = {};\r\n\r\n private scrolledDown = true;\r\n private isScrollingTimeout = 0;\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private unreaded: Map = new Map();\r\n private unreadedSeen: Set = new Set();\r\n private readPromise: Promise;\r\n\r\n private bubbleGroups: BubbleGroups;\r\n\r\n private preloader: ProgressivePreloader = null;\r\n\r\n // 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 middlewareHelper = getMiddleware();\r\n\r\n private log: ReturnType;\r\n\r\n public listenerSetter: ListenerSetter;\r\n\r\n private replyFollowHistory: number[] = [];\r\n\r\n private isHeavyAnimationInProgress = false;\r\n private scrollingToBubble: HTMLElement;\r\n\r\n private isFirstLoad = true;\r\n private needReflowScroll: boolean;\r\n\r\n private fetchNewPromise: Promise;\r\n\r\n private passEntities: Partial<{\r\n [_ in MessageEntity['_']]: boolean\r\n }> = {};\r\n\r\n private onAnimateLadder: () => Promise | void;\r\n // private ladderDeferred: CancellablePromise;\r\n private resolveLadderAnimation: () => Promise;\r\n private emptyPlaceholderBubble: HTMLElement;\r\n\r\n private viewsMids: Set = new Set();\r\n private sendViewCountersDebounced: () => Promise;\r\n\r\n private isTopPaddingSet = false;\r\n\r\n private getSponsoredMessagePromise: Promise;\r\n\r\n private previousStickyDate: HTMLElement;\r\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\r\n\r\n private hoverBubble: HTMLElement;\r\n private hoverReaction: HTMLElement;\r\n private sliceViewportDebounced: DebounceReturnType;\r\n private resizeObserver: ResizeObserver;\r\n private willScrollOnLoad: boolean;\r\n public observer: SuperIntersectionObserver;\r\n\r\n private renderingMessages: Set = new Set();\r\n private setPeerCached: boolean;\r\n private attachPlaceholderOnRender: () => void;\r\n\r\n private bubblesToEject: Set = new Set();\r\n private bubblesToReplace: Map = new Map(); // TO -> FROM\r\n private updatePlaceholderPosition: () => void;\r\n private setPeerOptions: {lastMsgId: number; topMessage: number;};\r\n\r\n private setPeerTempId: number = 0;\r\n\r\n private renderNewPromises: Set> = new Set();\r\n private updateGradient: boolean;\r\n\r\n private extendedMediaMessages: Set = new Set();\r\n private pollExtendedMediaMessagesPromise: Promise;\r\n\r\n private batchProcessor: BatchProcessor>>;\r\n\r\n // private reactions: Map;\r\n\r\n constructor(\r\n private chat: Chat,\r\n private managers: AppManagers\r\n ) {\r\n this.log = this.chat.log;\r\n // this.chat.log.error('Bubbles construction');\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.constructBubbles();\r\n\r\n // * constructor end\r\n\r\n this.batchProcessor = new BatchProcessor({\r\n log: this.log,\r\n process: this.processBatch,\r\n possibleError: PEER_CHANGED_ERROR\r\n });\r\n this.bubbleGroups = new BubbleGroups(this.chat);\r\n this.preloader = new ProgressivePreloader({\r\n cancelable: false\r\n });\r\n this.lazyLoadQueue = new LazyLoadQueue(undefined, true);\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n\r\n // this.reactions = new Map();\r\n\r\n // * events\r\n\r\n // will call when sent for update pos\r\n this.listenerSetter.add(rootScope)('history_update', async({storageKey, sequential, message}) => {\r\n if(this.chat.messagesStorageKey !== storageKey || this.chat.type === 'scheduled') {\r\n return;\r\n }\r\n\r\n const {mid} = message;\r\n const log = false ? this.log.bindPrefix('history_update-' + mid) : undefined;\r\n log && log('start');\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n if(this.renderNewPromises.size) {\r\n log && log.error('will await new messages render');\r\n await Promise.all(Array.from(this.renderNewPromises));\r\n }\r\n\r\n if(this.messagesQueuePromise) {\r\n log && log.error('messages render in process');\r\n await this.messagesQueuePromise;\r\n }\r\n\r\n if(this.bubbles[mid] !== bubble) return;\r\n\r\n // await getHeavyAnimationPromise();\r\n\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(!item) { // probably a group item\r\n log && log.error('no item by bubble', bubble);\r\n return;\r\n } else if(item.mid === mid) {\r\n log && log.warn('wow what', item, mid);\r\n return;\r\n }\r\n\r\n if(sequential) {\r\n const group = item.group;\r\n const newItem = this.bubbleGroups.createItem(bubble, message);\r\n // newItem.mid = item.mid;\r\n const _items = this.bubbleGroups.itemsArr.slice();\r\n indexOfAndSplice(_items, item);\r\n const foundItem = this.bubbleGroups.findGroupSiblingByItem(newItem, _items);\r\n if(\r\n group === foundItem?.group ||\r\n (group === this.bubbleGroups.getLastGroup() && group.items.length === 1 && newItem.dateTimestamp === item.dateTimestamp) ||\r\n (this.peerId === rootScope.myId && sequential && newItem.dateTimestamp === item.dateTimestamp)\r\n ) {\r\n log && log('item has correct position', item);\r\n this.bubbleGroups.changeBubbleMid(bubble, mid);\r\n return;\r\n }\r\n }\r\n\r\n // return;\r\n\r\n // await fastRafPromise();\r\n // if(this.bubbles[mid] !== bubble) return;\r\n\r\n // const groupIndex = this.bubbleGroups.groups.indexOf(group);\r\n this.bubbleGroups.removeAndUnmountBubble(bubble);\r\n // if(!group.items.length) { // group has collapsed, next message can have higher mid so have to reposition them too\r\n // log && log('group has collapsed', item);\r\n\r\n // const siblingGroups = this.bubbleGroups.groups.slice(0, groupIndex + 1);\r\n // for(let length = siblingGroups.length, i = length - 2; i >= 0; --i) {\r\n // const siblingGroup = siblingGroups[i];\r\n // const siblingItems = siblingGroup.items;\r\n // const nextGroup = siblingGroups[i + 1];\r\n // const nextItems = nextGroup.items;\r\n\r\n // let _break = false, moved = false;\r\n // for(let j = siblingItems.length - 1; j >= 0; --j) {\r\n // const siblingItem = siblingItems[j];\r\n // const foundItem = this.bubbleGroups.findGroupSiblingByItem(siblingItem, nextItems);\r\n // if(!foundItem) {\r\n // _break = true;\r\n // break;\r\n // }\r\n\r\n // log('will move item', siblingItem, nextGroup);\r\n // this.bubbleGroups.removeAndUnmountBubble(siblingItem.bubble);\r\n // this.bubbleGroups.addItemToGroup(siblingItem, nextGroup);\r\n // moved = true;\r\n // }\r\n\r\n // if(moved) {\r\n // nextGroup.mount();\r\n // }\r\n\r\n // if(_break) {\r\n // break;\r\n // }\r\n // }\r\n // }\r\n\r\n const {groups} = this.groupBubbles([{bubble, message}]);\r\n this.bubbleGroups.mountUnmountGroups(groups);\r\n\r\n if(this.scrollingToBubble) {\r\n this.scrollToEnd();\r\n }\r\n\r\n log && log('end');\r\n\r\n // this.bubbleGroups.findIncorrentPositions();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n this.deleteMessagesByIds(Object.keys(this.bubbles).map((m) => +m));\r\n }\r\n });\r\n\r\n // Calls when message successfully sent and we have an id\r\n this.listenerSetter.add(rootScope)('message_sent', async(e) => {\r\n const {storageKey, tempId, tempMessage, mid, message} = e;\r\n\r\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\r\n if(this.chat.messagesStorageKey !== storageKey) {\r\n return;\r\n }\r\n\r\n const bubbles = this.bubbles;\r\n const _bubble = bubbles[tempId];\r\n if(_bubble) {\r\n const bubble = bubbles[tempId];\r\n bubbles[mid] = bubble;\r\n bubble.dataset.mid = '' + mid;\r\n delete bubbles[tempId];\r\n\r\n fastRaf(() => {\r\n const mid = +bubble.dataset.mid;\r\n if(bubbles[mid] === bubble && bubble.classList.contains('is-outgoing')) {\r\n bubble.classList.remove('is-sending', 'is-outgoing');\r\n bubble.classList.add((this.peerId === rootScope.myId && this.chat.type !== 'scheduled') || !this.unreadOut.has(mid) ? 'is-read' : 'is-sent');\r\n }\r\n });\r\n }\r\n\r\n if(this.unreadOut.has(tempId)) {\r\n this.unreadOut.delete(tempId);\r\n this.unreadOut.add(mid);\r\n }\r\n\r\n // * check timing of scheduled message\r\n if(this.chat.type === 'scheduled') {\r\n const timestamp = Date.now() / 1000 | 0;\r\n const maxTimestamp = tempMessage.date - 10;\r\n if(timestamp >= maxTimestamp) {\r\n this.deleteMessagesByIds([mid]);\r\n }\r\n }\r\n\r\n if(!_bubble) {\r\n return;\r\n }\r\n\r\n let messages: (Message.message | Message.messageService)[], tempIds: number[];\r\n const groupedId = (message as Message.message).grouped_id;\r\n if(groupedId) {\r\n messages = await this.managers.appMessagesManager.getMessagesByAlbum(groupedId);\r\n const mids = messages.map(({mid}) => mid);\r\n if(!mids.length || getMainMidForGrouped(mids) !== mid || bubbles[mid] !== _bubble) {\r\n return;\r\n }\r\n\r\n if(bubbles[mid] !== _bubble) {\r\n return;\r\n }\r\n\r\n tempIds = (Array.from(_bubble.querySelectorAll('.grouped-item')) as HTMLElement[]).map((el) => +el.dataset.mid);\r\n } else {\r\n messages = [message];\r\n tempIds = [tempId];\r\n }\r\n\r\n const reactionsElements = Array.from(_bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\r\n if(reactionsElements.length) {\r\n reactionsElements.forEach((reactionsElement) => {\r\n reactionsElement.changeMessage(message as Message.message);\r\n });\r\n }\r\n\r\n (messages as Message.message[]).forEach((message, idx) => {\r\n if(!message) {\r\n return;\r\n }\r\n\r\n const tempId = tempIds[idx];\r\n const mid = message.mid;\r\n const bubble: HTMLElement = _bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || _bubble;\r\n\r\n if(message._ !== 'message') {\r\n return;\r\n }\r\n\r\n if(message.replies) {\r\n const repliesElement = _bubble.querySelector('replies-element') as RepliesElement;\r\n if(repliesElement) {\r\n repliesElement.message = message;\r\n repliesElement.init();\r\n }\r\n }\r\n\r\n const media = message.media ?? {} as MessageMedia.messageMediaEmpty;\r\n const doc = (media as MessageMedia.messageMediaDocument).document as Document.document;\r\n const poll = (media as MessageMedia.messageMediaPoll).poll;\r\n const webPage = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage;\r\n if(doc) {\r\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\r\n if(div) {\r\n const container = findUpClassName(div, 'document-container');\r\n\r\n if(!tempMessage.media?.document?.thumbs?.length && doc.thumbs?.length) {\r\n getHeavyAnimationPromise().then(async() => {\r\n const timeSpan = div.querySelector('.time');\r\n const newDiv = await wrapDocument({message, fontSize: rootScope.settings.messagesTextSize});\r\n div.replaceWith(newDiv);\r\n\r\n if(timeSpan) {\r\n (newDiv.querySelector('.document') || newDiv).append(timeSpan);\r\n }\r\n });\r\n }\r\n\r\n if(container) {\r\n container.dataset.mid = '' + mid;\r\n }\r\n }\r\n\r\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\r\n if(element) {\r\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\r\n element.dataset.mid = '' + message.mid;\r\n delete element.dataset.isOutgoing;\r\n (element as any).message = message;\r\n (element as any).onLoad(true);\r\n } else {\r\n element.dataset.docId = '' + doc.id;\r\n (element as any).doc = doc;\r\n }\r\n }\r\n } else if(poll) {\r\n const pollElement = bubble.querySelector('poll-element') as PollElement;\r\n if(pollElement) {\r\n pollElement.message = message;\r\n pollElement.setAttribute('poll-id', '' + poll.id);\r\n pollElement.setAttribute('message-id', '' + mid);\r\n }\r\n } else if(webPage && !bubble.querySelector('.web')) {\r\n getHeavyAnimationPromise().then(() => {\r\n this.safeRenderMessage(message, true, bubble);\r\n this.scrollToBubbleIfLast(bubble);\r\n });\r\n }\r\n\r\n // set new mids to album items for mediaViewer\r\n if(groupedId) {\r\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\r\n if(item) {\r\n item.dataset.mid = '' + mid;\r\n }\r\n }\r\n });\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_edit', async({storageKey, message}) => {\r\n if(storageKey !== this.chat.messagesStorageKey) return;\r\n\r\n const bubble = this.bubbles[message.mid];\r\n if(!bubble) return;\r\n\r\n await getHeavyAnimationPromise();\r\n if(this.bubbles[message.mid] !== bubble) return;\r\n\r\n this.safeRenderMessage(message, true, bubble);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_error', async({storageKey, tempId}) => {\r\n if(storageKey !== this.chat.messagesStorageKey) return;\r\n\r\n const bubble = this.bubbles[tempId];\r\n if(!bubble) return;\r\n\r\n await getHeavyAnimationPromise();\r\n if(this.bubbles[tempId] !== bubble) return;\r\n\r\n bubble.classList.remove('is-outgoing');\r\n bubble.classList.add('is-error');\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, messages, deletedMids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n const mids = messages.map(({mid}) => mid);\r\n const oldMids = mids.concat(Array.from(deletedMids));\r\n const wasMainMid = getMainMidForGrouped(oldMids);\r\n const bubble = this.bubbles[wasMainMid];\r\n if(!bubble) {\r\n return;\r\n }\r\n\r\n const mainMid = getMainMidForGrouped(mids);\r\n const message = messages.find((message) => message.mid === mainMid);\r\n this.safeRenderMessage(message, true, bubble);\r\n });\r\n\r\n // this.listenerSetter.add(rootScope)('peer_title_edit', async(peerId) => {\r\n // if(peerId.isUser()) {\r\n // const middleware = this.getMiddleware();\r\n // const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\r\n // if(!middleware()) return;\r\n\r\n // const isPremium = user?.pFlags?.premium;\r\n // const groups = this.bubbleGroups.groups.filter((group) => group.avatar?.peerId === peerId);\r\n // groups.forEach((group) => {\r\n // group.avatar.classList.toggle('is-premium', isPremium);\r\n // group.avatar.classList.toggle('tgico-star', isPremium);\r\n // });\r\n // }\r\n // });\r\n\r\n if(this.chat.type !== 'scheduled' && !DO_NOT_UPDATE_MESSAGE_REACTIONS/* && false */) {\r\n this.listenerSetter.add(rootScope)('messages_reactions', async(arr) => {\r\n let scrollSaver: ScrollSaver;\r\n\r\n const a = arr.map(async({message, changedResults}) => {\r\n if(this.peerId !== message.peerId) {\r\n return;\r\n }\r\n\r\n const result = await this.getMountedBubble(message.mid, message);\r\n if(!result) {\r\n return;\r\n }\r\n\r\n return {bubble: result.bubble, message, changedResults};\r\n });\r\n\r\n let top: number;\r\n (await Promise.all(a)).filter(Boolean).forEach(({bubble, message, changedResults}) => {\r\n if(!scrollSaver) {\r\n scrollSaver = this.createScrollSaver(false);\r\n scrollSaver.save();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n const set = REACTIONS_ELEMENTS.get(key);\r\n if(set) {\r\n for(const element of set) {\r\n element.update(message, changedResults);\r\n }\r\n } else if(!message.reactions || !message.reactions.results.length) {\r\n return;\r\n } else {\r\n this.appendReactionsElementToBubble(bubble, message, message, changedResults);\r\n }\r\n });\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n }\r\n });\r\n }\r\n\r\n !DO_NOT_UPDATE_MESSAGE_REPLY && this.listenerSetter.add(rootScope)('messages_downloaded', async({peerId, mids}) => {\r\n const middleware = this.getMiddleware();\r\n await getHeavyAnimationPromise();\r\n if(!middleware()) return;\r\n\r\n (mids as number[]).forEach((mid) => {\r\n const needUpdate = this.needUpdate;\r\n const filtered: typeof needUpdate[0][] = [];\r\n forEachReverse(this.needUpdate, (obj, idx) => {\r\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\r\n this.needUpdate.splice(idx, 1)[0];\r\n filtered.push(obj);\r\n }\r\n });\r\n\r\n filtered.forEach(async({mid, replyMid, replyToPeerId}) => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const message = (await this.chat.getMessage(mid)) as Message.message;\r\n\r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n message\r\n });\r\n });\r\n });\r\n });\r\n\r\n attachStickerViewerListeners({\r\n listenTo: this.scrollable.container,\r\n listenerSetter: this.listenerSetter,\r\n findTarget: (e) => {\r\n const target = e.target as HTMLElement;\r\n const found = target.closest('.attachment.media-sticker-wrapper') || (findUpClassName(target, 'attachment') && target.closest('.custom-emoji'));\r\n return found as HTMLElement;\r\n }\r\n });\r\n attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});\r\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\r\n\r\n this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {\r\n if(e.button !== 0) return;\r\n\r\n const code: HTMLElement = findUpTag(e.target, 'CODE');\r\n if(code) {\r\n cancelEvent(e);\r\n copyFromElement(code);\r\n toastNew({langPackKey: 'TextCopied'});\r\n return;\r\n }\r\n });\r\n\r\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\r\n for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n if(dateMessage.container === target) {\r\n const dateBubble = dateMessage.div;\r\n\r\n // dateMessage.container.classList.add('has-sticky-dates');\r\n\r\n // SetTransition(dateBubble, 'kek', stuck, this.previousStickyDate ? 300 : 0);\r\n // if(this.previousStickyDate) {\r\n // dateBubble.classList.add('kek');\r\n // }\r\n\r\n dateBubble.classList.toggle('is-sticky', stuck);\r\n if(stuck) {\r\n this.previousStickyDate = dateBubble;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(this.previousStickyDate) {\r\n // fastRaf(() => {\r\n // this.bubblesContainer.classList.add('has-sticky-dates');\r\n // });\r\n }\r\n });\r\n\r\n if(!IS_SAFARI) {\r\n this.sliceViewportDebounced = debounce(this.sliceViewport.bind(this), 3000, false, true);\r\n }\r\n\r\n let middleware: ReturnType;\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n this.lazyLoadQueue.lock();\r\n middleware = this.getMiddleware();\r\n\r\n // if(this.sliceViewportDebounced) {\r\n // this.sliceViewportDebounced.clearTimeout();\r\n // }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(middleware?.()) {\r\n this.lazyLoadQueue.unlockAndRefresh();\r\n\r\n // if(this.sliceViewportDebounced) {\r\n // this.sliceViewportDebounced();\r\n // }\r\n }\r\n\r\n middleware = null;\r\n }, this.listenerSetter);\r\n }\r\n\r\n private constructBubbles() {\r\n const container = this.container = document.createElement('div');\r\n container.classList.add('bubbles', 'scrolled-down');\r\n\r\n const chatInner = this.chatInner = document.createElement('div');\r\n chatInner.classList.add('bubbles-inner');\r\n\r\n this.setScroll();\r\n\r\n container.append(this.scrollable.container);\r\n }\r\n\r\n public attachContainerListeners() {\r\n const container = this.container;\r\n\r\n this.chat.contextMenu.attachTo(container);\r\n this.chat.selection.attachListeners(container, new ListenerSetter());\r\n\r\n if(DEBUG) {\r\n this.listenerSetter.add(container)('dblclick', async(e) => {\r\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\r\n if(bubble) {\r\n const mid = +bubble.dataset.mid\r\n this.log('debug message:', await this.chat.getMessage(mid));\r\n this.highlightBubble(bubble);\r\n }\r\n });\r\n }\r\n\r\n if(this.chat.type !== 'pinned' && this.chat.type !== 'scheduled') {\r\n if(!IS_MOBILE) {\r\n this.listenerSetter.add(container)('dblclick', async(e) => {\r\n if(this.chat.selection.isSelecting ||\r\n !(await this.chat.canSend())) {\r\n return;\r\n }\r\n\r\n const target = e.target as HTMLElement;\r\n const bubble = target.classList.contains('bubble') ?\r\n target :\r\n (target.classList.contains('document-selection') ? target.parentElement : null);\r\n if(bubble && !bubble.classList.contains('bubble-first')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = await this.chat.getMessage(mid);\r\n if(message.pFlags.is_outgoing) {\r\n return;\r\n }\r\n\r\n this.chat.input.initMessageReply(mid);\r\n }\r\n });\r\n } else if(IS_TOUCH_SUPPORTED) {\r\n const className = 'is-gesturing-reply';\r\n const MAX = 64;\r\n const replyAfter = MAX * .75;\r\n let shouldReply = false;\r\n let target: HTMLElement;\r\n let icon: HTMLElement;\r\n handleHorizontalSwipe({\r\n element: container,\r\n verifyTouchTarget: async(e) => {\r\n if(this.chat.selection.isSelecting || !(await this.chat.canSend())) {\r\n return false;\r\n }\r\n\r\n // cancelEvent(e);\r\n target = findUpClassName(e.target, 'bubble');\r\n if(target) {\r\n SetTransition(target, className, true, 250);\r\n void target.offsetLeft; // reflow\r\n\r\n if(!icon) {\r\n icon = document.createElement('span');\r\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\r\n } else {\r\n icon.classList.remove('is-visible');\r\n icon.style.opacity = '';\r\n }\r\n\r\n target/* .querySelector('.bubble-content') */.append(icon);\r\n }\r\n\r\n return !!target;\r\n },\r\n onSwipe: (xDiff, yDiff) => {\r\n shouldReply = xDiff >= replyAfter;\r\n\r\n if(shouldReply && !icon.classList.contains('is-visible')) {\r\n icon.classList.add('is-visible');\r\n }\r\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\r\n\r\n const x = -Math.max(0, Math.min(MAX, xDiff));\r\n target.style.transform = `translateX(${x}px)`;\r\n cancelContextMenuOpening();\r\n },\r\n onReset: () => {\r\n const _target = target;\r\n SetTransition(_target, className, false, 250, () => {\r\n if(icon.parentElement === _target) {\r\n icon.classList.remove('is-visible');\r\n icon.remove();\r\n }\r\n });\r\n\r\n fastRaf(() => {\r\n _target.style.transform = ``;\r\n\r\n if(shouldReply) {\r\n const {mid} = _target.dataset;\r\n this.chat.input.initMessageReply(+mid);\r\n shouldReply = false;\r\n }\r\n });\r\n },\r\n listenerOptions: {capture: true}\r\n });\r\n }\r\n }\r\n }\r\n\r\n public constructPeerHelpers() {\r\n // will call when message is sent (only 1)\r\n this.listenerSetter.add(rootScope)('history_append', async({storageKey, message}) => {\r\n if(storageKey !== this.chat.messagesStorageKey) return;\r\n\r\n if(rootScope.settings.animationsEnabled) {\r\n this.updateGradient = true;\r\n }\r\n\r\n if(!this.scrollable.loadedAll.bottom) {\r\n this.chat.setMessageId();\r\n } else {\r\n this.renderNewMessage(message, true);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\r\n if(this.peerId !== message.peerId) return;\r\n this.renderNewMessage(message);\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.has(this.peerId)) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\r\n if(this.peerId === dialog.peerId) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\r\n if(this.peerId === chatId.toPeerId(true)) {\r\n const hadRights = this.chatInner.classList.contains('has-rights');\r\n const hasRights = await this.chat.canSend();\r\n\r\n if(hadRights !== hasRights) {\r\n const callbacks = await Promise.all([\r\n this.finishPeerChange(),\r\n this.chat.input.finishPeerChange()\r\n ]);\r\n\r\n callbacks.forEach((callback) => callback());\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', async({key}) => {\r\n if(key === 'settings.emoji.big') {\r\n const middleware = this.getMiddleware();\r\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n const m = mids.map(async(mid) => {\r\n const bubble = this.bubbles[mid];\r\n if(bubble.classList.contains('can-have-big-emoji')) {\r\n return {bubble, message: await this.chat.getMessage(mid)};\r\n }\r\n });\r\n\r\n const awaited = await Promise.all(m);\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n awaited.filter(Boolean).forEach(({bubble, message}) => {\r\n if(this.bubbles[message.mid] !== bubble) {\r\n return;\r\n }\r\n\r\n this.safeRenderMessage(message, true, bubble);\r\n });\r\n }\r\n });\r\n\r\n !DO_NOT_UPDATE_MESSAGE_VIEWS && this.listenerSetter.add(rootScope)('messages_views', (arr) => {\r\n fastRaf(() => {\r\n let scrollSaver: ScrollSaver;\r\n for(const {peerId, views, mid} of arr) {\r\n if(this.peerId !== peerId) continue;\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) continue;\r\n\r\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\r\n if(!postViewsElements.length) continue;\r\n\r\n const str = formatNumber(views, 1);\r\n let different = false;\r\n postViewsElements.forEach((postViews) => {\r\n if(different || postViews.textContent !== str) {\r\n if(!scrollSaver) {\r\n scrollSaver = this.createScrollSaver(true);\r\n scrollSaver.save();\r\n }\r\n\r\n different = true;\r\n postViews.textContent = str;\r\n }\r\n });\r\n }\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n }\r\n });\r\n });\r\n\r\n this.observer = new SuperIntersectionObserver({root: this.scrollable.container});\r\n\r\n this.sendViewCountersDebounced = debounce(() => {\r\n const mids = [...this.viewsMids];\r\n this.viewsMids.clear();\r\n\r\n this.managers.appMessagesManager.incrementMessageViews(this.peerId, mids);\r\n }, 1000, false, true);\r\n }\r\n\r\n private get peerId() {\r\n return this.chat.peerId;\r\n }\r\n\r\n public get messagesQueuePromise() {\r\n return this.batchProcessor.queuePromise;\r\n }\r\n\r\n private createScrollSaver(reverse = true) {\r\n const scrollSaver = new ScrollSaver(this.scrollable, '.bubble:not(.is-date)', reverse);\r\n return scrollSaver;\r\n }\r\n\r\n private unreadedObserverCallback = (entry: IntersectionObserverEntry) => {\r\n if(entry.isIntersecting) {\r\n const target = entry.target as HTMLElement;\r\n const mid = this.unreaded.get(target as HTMLElement);\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n };\r\n\r\n private viewsObserverCallback = (entry: IntersectionObserverEntry) => {\r\n if(entry.isIntersecting) {\r\n const mid = +(entry.target as HTMLElement).dataset.mid;\r\n this.observer.unobserve(entry.target, this.viewsObserverCallback);\r\n\r\n if(mid) {\r\n this.viewsMids.add(mid);\r\n this.sendViewCountersDebounced();\r\n } else {\r\n const {sponsoredMessage} = this;\r\n if(sponsoredMessage && sponsoredMessage.random_id) {\r\n delete sponsoredMessage.random_id;\r\n this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(), sponsoredMessage.random_id);\r\n }\r\n }\r\n }\r\n };\r\n\r\n private stickerEffectObserverCallback = (entry: IntersectionObserverEntry) => {\r\n if(entry.isIntersecting) {\r\n this.observer.unobserve(entry.target, this.stickerEffectObserverCallback);\r\n\r\n const attachmentDiv: HTMLElement = entry.target.querySelector('.attachment');\r\n getHeavyAnimationPromise().then(() => {\r\n if(isInDOM(attachmentDiv)) {\r\n simulateClickEvent(attachmentDiv);\r\n }\r\n });\r\n }\r\n };\r\n\r\n private createResizeObserver() {\r\n if(!('ResizeObserver' in window) || this.resizeObserver) {\r\n return;\r\n }\r\n\r\n const container = this.scrollable.container;\r\n let wasHeight = 0/* container.offsetHeight */;\r\n let resizing = false;\r\n let skip = false;\r\n let scrolled = 0;\r\n let part = 0;\r\n let rAF = 0;\r\n // let skipNext = true;\r\n\r\n const onResizeEnd = () => {\r\n const height = container.offsetHeight;\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\r\n part += wasHeight - height;\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(part) {\r\n this.scrollable.setScrollTopSilently(this.scrollable.scrollTop + Math.round(part));\r\n }\r\n\r\n wasHeight = height;\r\n scrolled = 0;\r\n rAF = 0;\r\n part = 0;\r\n resizing = false;\r\n skip = false;\r\n };\r\n\r\n const setEndRAF = (single: boolean) => {\r\n if(rAF) window.cancelAnimationFrame(rAF);\r\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\r\n rAF = window.requestAnimationFrame(onResizeEnd);\r\n // this.log('resize after RAF', part);\r\n });\r\n };\r\n\r\n const processEntries: ResizeObserverCallback = (entries) => {\r\n /* if(skipNext) {\r\n skipNext = false;\r\n return;\r\n } */\r\n\r\n if(skip) {\r\n setEndRAF(false);\r\n return;\r\n }\r\n\r\n const entry = entries[0];\r\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\r\n\r\n if(!wasHeight) {\r\n wasHeight = height;\r\n return;\r\n }\r\n\r\n const realDiff = wasHeight - height;\r\n let diff = realDiff + part;\r\n const _part = diff % 1;\r\n diff -= _part;\r\n\r\n if(!resizing) {\r\n resizing = true;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\r\n // if(isSafari) { // * fix opening keyboard while ESG is active\r\n part = -realDiff;\r\n // }\r\n\r\n skip = true;\r\n setEndRAF(false);\r\n return;\r\n }\r\n }\r\n\r\n scrolled += diff;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\r\n } */\r\n\r\n if(diff) {\r\n const needScrollTop = this.scrollable.scrollTop + diff;\r\n this.scrollable.setScrollTopSilently(needScrollTop);\r\n }\r\n\r\n setEndRAF(false);\r\n\r\n part = _part;\r\n wasHeight = height;\r\n };\r\n\r\n const resizeObserver = this.resizeObserver = new ResizeObserver(processEntries);\r\n resizeObserver.observe(container);\r\n }\r\n\r\n private destroyResizeObserver() {\r\n const resizeObserver = this.resizeObserver;\r\n if(!resizeObserver) {\r\n return;\r\n }\r\n\r\n resizeObserver.disconnect();\r\n this.resizeObserver = undefined;\r\n }\r\n\r\n private onBubblesMouseMove = async(e: MouseEvent) => {\r\n const content = findUpClassName(e.target, 'bubble-content');\r\n if(\r\n content &&\r\n !this.chat.selection.isSelecting &&\r\n !findUpClassName(e.target, 'service') &&\r\n !findUpClassName(e.target, 'bubble-beside-button')\r\n ) {\r\n const bubble = findUpClassName(content, 'bubble');\r\n if(!this.chat.selection.canSelectBubble(bubble)) {\r\n this.unhoverPrevious();\r\n return;\r\n }\r\n\r\n let {hoverBubble, hoverReaction} = this;\r\n if(bubble === hoverBubble) {\r\n return;\r\n }\r\n\r\n this.unhoverPrevious();\r\n\r\n hoverBubble = this.hoverBubble = bubble;\r\n hoverReaction = this.hoverReaction;\r\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\r\n if(!hoverReaction) {\r\n hoverReaction = this.hoverReaction = document.createElement('div');\r\n hoverReaction.classList.add('bubble-hover-reaction');\r\n\r\n const stickerWrapper = document.createElement('div');\r\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\r\n hoverReaction.append(stickerWrapper);\r\n\r\n content.append(hoverReaction);\r\n\r\n let message = await this.chat.getMessage(+bubble.dataset.mid);\r\n if(message?._ !== 'message') {\r\n this.unhoverPrevious();\r\n return;\r\n }\r\n\r\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\r\n\r\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\r\n Promise.all([\r\n this.managers.appReactionsManager.getAvailableReactionsByMessage(message),\r\n pause(400)\r\n ]).then(([availableReactions]) => {\r\n const availableReaction = availableReactions[0];\r\n if(!availableReaction) {\r\n hoverReaction.remove();\r\n return;\r\n }\r\n\r\n wrapSticker({\r\n div: stickerWrapper,\r\n doc: availableReaction.select_animation,\r\n width: 18,\r\n height: 18,\r\n needUpscale: true,\r\n middleware,\r\n group: this.chat.animationGroup,\r\n withThumb: false,\r\n needFadeIn: false\r\n }).then(({render}) => render).then((player) => {\r\n assumeType(player);\r\n\r\n player.addEventListener('firstFrame', () => {\r\n if(!middleware()) {\r\n // debugger;\r\n return;\r\n }\r\n\r\n hoverReaction.dataset.loaded = '1';\r\n this.setHoverVisible(hoverReaction, true);\r\n }, {once: true});\r\n\r\n attachClickEvent(hoverReaction, (e) => {\r\n cancelEvent(e); // cancel triggering selection\r\n\r\n this.managers.appReactionsManager.sendReaction(message as Message.message, availableReaction);\r\n this.unhoverPrevious();\r\n }, {listenerSetter: this.listenerSetter});\r\n }, noop);\r\n });\r\n } else if(hoverReaction.dataset.loaded) {\r\n this.setHoverVisible(hoverReaction, true);\r\n }\r\n } else {\r\n this.unhoverPrevious();\r\n }\r\n };\r\n\r\n public setReactionsHoverListeners() {\r\n this.listenerSetter.add(contextMenuController)('toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(overlayCounter)('change', this.unhoverPrevious);\r\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(this.container)('mousemove', this.onBubblesMouseMove);\r\n }\r\n\r\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\r\n if(hoverReaction.parentElement) {\r\n hoverReaction.parentElement.classList.toggle('hover-reaction-visible', visible);\r\n }\r\n\r\n SetTransition(hoverReaction, 'is-visible', visible, 200, visible ? undefined : () => {\r\n hoverReaction.remove();\r\n }, 2);\r\n }\r\n\r\n private unhoverPrevious = () => {\r\n const {hoverBubble, hoverReaction} = this;\r\n if(hoverBubble) {\r\n this.setHoverVisible(hoverReaction, false);\r\n this.hoverBubble = undefined;\r\n this.hoverReaction = undefined;\r\n }\r\n };\r\n\r\n public setStickyDateManually() {\r\n return;\r\n\r\n const timestamps = Object.keys(this.dateMessages).map((k) => +k).sort((a, b) => b - a);\r\n let lastVisible: HTMLElement;\r\n\r\n // if(this.chatInner.classList.contains('is-scrolling')) {\r\n const {scrollTop} = this.scrollable.container;\r\n const isOverflown = scrollTop > 0;\r\n if(isOverflown) {\r\n for(const timestamp of timestamps) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\r\n if(visibleRect && visibleRect.overflow.top) {\r\n lastVisible = dateMessage.div;\r\n } else if(lastVisible) {\r\n break;\r\n }\r\n }\r\n }\r\n // }\r\n\r\n if(lastVisible === this.previousStickyDate) {\r\n return;\r\n }\r\n\r\n if(lastVisible) {\r\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\r\n if(needReflow) {\r\n lastVisible.classList.add('no-transition');\r\n }\r\n\r\n lastVisible.classList.add('is-sticky');\r\n\r\n if(needReflow) {\r\n void lastVisible.offsetLeft; // reflow\r\n lastVisible.classList.remove('no-transition');\r\n }\r\n }\r\n\r\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\r\n this.previousStickyDate.classList.remove('is-sticky');\r\n }\r\n\r\n this.previousStickyDate = lastVisible;\r\n }\r\n\r\n public getRenderedLength() {\r\n return Object.keys(this.bubbles).length - this.skippedMids.size;\r\n }\r\n\r\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\r\n this.unreadedSeen.add(mid);\r\n this.observer.unobserve(target, this.unreadedObserverCallback);\r\n this.unreaded.delete(target);\r\n this.readUnreaded();\r\n }\r\n\r\n private readUnreaded() {\r\n if(this.readPromise) return;\r\n\r\n const middleware = this.getMiddleware();\r\n this.readPromise = idleController.getFocusPromise().then(async() => {\r\n if(!middleware()) return;\r\n let maxId = Math.max(...Array.from(this.unreadedSeen));\r\n\r\n // ? if message with maxId is not rendered ?\r\n if(this.scrollable.loadedAll.bottom) {\r\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map((i) => +i));\r\n if(maxId >= bubblesMaxId) {\r\n maxId = Math.max((await this.chat.getHistoryMaxId()) || 0, maxId);\r\n }\r\n }\r\n\r\n this.unreaded.forEach((mid, target) => {\r\n if(mid <= maxId) {\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n\r\n const readContents: number[] = [];\r\n for(const mid of this.unreadedSeen) {\r\n const message: MyMessage = await this.chat.getMessage(mid);\r\n if(isMentionUnread(message)) {\r\n readContents.push(mid);\r\n }\r\n }\r\n\r\n this.managers.appMessagesManager.readMessages(this.peerId, readContents);\r\n\r\n this.unreadedSeen.clear();\r\n\r\n if(DEBUG) {\r\n this.log('will readHistory by maxId:', maxId);\r\n }\r\n\r\n // return;\r\n\r\n return this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\r\n this.log.error('readHistory err:', err);\r\n this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\r\n }).finally(() => {\r\n if(!middleware()) return;\r\n this.readPromise = undefined;\r\n\r\n if(this.unreadedSeen.size) {\r\n this.readUnreaded();\r\n }\r\n });\r\n });\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', (e) => {\r\n const {peerId, mids, pinned} = e;\r\n if(peerId !== this.peerId) return;\r\n\r\n if(mids) {\r\n if(!pinned) {\r\n this.deleteMessagesByIds(mids);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public constructScheduledHelpers() {\r\n const onUpdate = async() => {\r\n this.chat.topbar.setTitle((await this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', (message) => {\r\n if(message.peerId !== this.peerId) return;\r\n\r\n this.renderNewMessage(message);\r\n onUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.deleteMessagesByIds(mids);\r\n onUpdate();\r\n });\r\n }\r\n\r\n public onBubblesClick = async(e: Event) => {\r\n let target = e.target as HTMLElement;\r\n let bubble: HTMLElement = null;\r\n try {\r\n bubble = findUpClassName(target, 'bubble');\r\n } catch(err) {}\r\n\r\n if(!bubble && !this.chat.selection.isSelecting) {\r\n const avatar = findUpClassName(target, 'user-avatar');\r\n if(!avatar) {\r\n return;\r\n }\r\n\r\n const peerId = avatar.dataset.peerId.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n return;\r\n }\r\n\r\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\r\n if(bubble.classList.contains('is-fake')) {\r\n bubble = bubble.previousElementSibling as HTMLElement;\r\n }\r\n\r\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n for(const timestamp in this.dateMessages) {\r\n const d = this.dateMessages[timestamp];\r\n if(d.div === bubble) {\r\n PopupElement.createPopup(PopupDatePicker, new Date(+timestamp), this.onDatePick).show();\r\n break;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\r\n this.chat.selection.toggleByElement(bubble);\r\n return;\r\n }\r\n\r\n // ! Trusted - due to audio autoclick\r\n if(this.chat.selection.isSelecting && e.isTrusted) {\r\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n // console.log('bubble click', e);\r\n\r\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\r\n this.chat.selection.selectedText = undefined;\r\n return;\r\n }\r\n\r\n // this.chatSelection.toggleByBubble(bubble);\r\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\r\n return;\r\n }\r\n\r\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\r\n if(contactDiv) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: contactDiv.dataset.peerId.toPeerId()\r\n });\r\n return;\r\n }\r\n\r\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\r\n if(callDiv) {\r\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\r\n return;\r\n }\r\n\r\n const buyButton: HTMLElement = findUpClassName(target, 'is-buy');\r\n if(buyButton) {\r\n cancelEvent(e);\r\n\r\n const message = await this.chat.getMessage(+bubble.dataset.mid);\r\n if(!message) {\r\n return;\r\n }\r\n\r\n new PopupPayment(\r\n message as Message.message,\r\n await this.managers.appPaymentsManager.getInputInvoiceByPeerId(message.peerId, message.mid)\r\n );\r\n return;\r\n }\r\n\r\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\r\n if(reactionElement) {\r\n cancelEvent(e);\r\n if(reactionElement.classList.contains('is-inactive')) {\r\n return;\r\n }\r\n\r\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\r\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\r\n\r\n const message = reactionsElement.getMessage();\r\n this.managers.appReactionsManager.sendReaction(message, reactionCount.reaction);\r\n\r\n return;\r\n }\r\n\r\n const stickerEmojiEl = findUpAttribute(target, 'data-sticker-emoji');\r\n if(stickerEmojiEl && stickerEmojiEl.parentElement.querySelectorAll('[data-sticker-emoji]').length === 1 && bubble.classList.contains('emoji-big')) {\r\n onEmojiStickerClick({\r\n event: e,\r\n container: stickerEmojiEl,\r\n managers: this.managers,\r\n middleware: this.getMiddleware(),\r\n peerId: this.peerId\r\n });\r\n\r\n return;\r\n }\r\n\r\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\r\n if(commentsDiv) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n if(this.peerId === REPLIES_PEER_ID) {\r\n const message = await this.chat.getMessage(bubbleMid) as Message.message;\r\n const peerId = getPeerId(message.reply_to.reply_to_peer_id);\r\n const threadId = message.reply_to.reply_to_top_id;\r\n const lastMsgId = message.fwd_from.saved_from_msg_id;\r\n this.chat.appImManager.openThread(peerId, lastMsgId, threadId);\r\n } else {\r\n const message1 = await this.chat.getMessage(bubbleMid);\r\n const message = await this.managers.appMessagesManager.getMessageWithReplies(message1 as Message.message);\r\n const replies = message.replies;\r\n if(replies) {\r\n this.managers.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then((message) => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replies.channel_id.toPeerId(true),\r\n type: 'discussion',\r\n threadId: (message as MyMessage).mid\r\n });\r\n });\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n const via = findUpClassName(target, 'is-via');\r\n if(via) {\r\n const el = via.querySelector('.peer-title') as HTMLElement;\r\n if(target === el || findUpAsChild(target, el)) {\r\n const message = el.innerText + ' ';\r\n this.managers.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\r\n cancelEvent(e);\r\n\r\n return;\r\n }\r\n }\r\n\r\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\r\n if(nameDiv && nameDiv !== bubble) {\r\n target = nameDiv || target;\r\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer') || (target as AvatarElement).peerId;\r\n const savedFrom = target.dataset.savedFrom;\r\n if(typeof(peerIdStr) === 'string' || savedFrom) {\r\n if(savedFrom) {\r\n const [peerId, mid] = savedFrom.split('_');\r\n if(target.classList.contains('is-receipt-link')) {\r\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId.toPeerId(), +mid);\r\n if(message) {\r\n const inputInvoice = await this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId, +bubble.dataset.mid);\r\n new PopupPayment(message as Message.message, inputInvoice, undefined, true);\r\n }\r\n } else {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(),\r\n lastMsgId: +mid\r\n });\r\n }\r\n } else {\r\n const peerId = peerIdStr.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n // this.log('chatInner click:', target);\r\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\r\n /* if(isVideoComponentElement) {\r\n const video = target.parentElement.querySelector('video') as HTMLElement;\r\n if(video) {\r\n video.click(); // hot-fix for time and play button\r\n return;\r\n }\r\n } */\r\n\r\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\r\n const messageId = +bubble.dataset.mid;\r\n const message = await this.chat.getMessage(messageId);\r\n\r\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as Document.document;\r\n\r\n if(doc?.stickerSetInput) {\r\n new PopupStickers(doc.stickerSetInput).show();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const documentDiv = findUpClassName(target, 'document-with-thumb');\r\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) ||\r\n target.classList.contains('album-item') ||\r\n // || isVideoComponentElement\r\n (target.tagName === 'VIDEO' && !bubble.classList.contains('round')) ||\r\n (documentDiv && !documentDiv.querySelector('.preloader-container')) ||\r\n target.classList.contains('canvas-thumbnail')) {\r\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\r\n const 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 cancelEvent(e);\r\n const messageId = +(groupedItem || bubble).dataset.mid;\r\n const message = await this.chat.getMessage(messageId);\r\n if(!message) {\r\n this.log.warn('no message by messageId:', messageId);\r\n return;\r\n }\r\n\r\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\r\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\r\n\r\n const f = documentDiv ? (media: any) => {\r\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\r\n } : (media: any) => {\r\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\r\n };\r\n\r\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\r\n const ids = isSingleMedia ? [messageId] : (await Promise.all(Object.keys(this.bubbles).map((k) => +k).map(async(mid) => {\r\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\r\n return false;\r\n } */\r\n // if(!this.scrollable.visibleElements.find((e) => e.element === this.bubbles[id])) return false;\r\n\r\n const message = await this.chat.getMessage(mid);\r\n const media = getMediaFromMessage(message);\r\n\r\n return media && f(media) && mid;\r\n }))).filter(Boolean).sort((a, b) => a - b);\r\n\r\n ids.forEach((id) => {\r\n let selector: string;\r\n if(documentDiv) {\r\n selector = '.document-container';\r\n } else {\r\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\r\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\r\n if(withTail) {\r\n selector += '.bubble__media-container';\r\n } else {\r\n selector += '.attachment video, .attachment img';\r\n }\r\n }\r\n\r\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\r\n const parents: Set = new Set();\r\n if(documentDiv) {\r\n elements.forEach((element) => {\r\n targets.push({\r\n element: element.querySelector('.document-ico'),\r\n mid: +element.dataset.mid,\r\n peerId: this.peerId\r\n });\r\n });\r\n } else {\r\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\r\n elements.forEach((element) => {\r\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\r\n const 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 const 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 // appMediaViewer.openMedia(message, target as HTMLImageElement);\r\n return;\r\n }\r\n\r\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\r\n\r\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\r\n if(target.classList.contains('goto-original')) {\r\n const savedFrom = bubble.dataset.savedFrom;\r\n const [peerId, mid] = savedFrom.split('_');\r\n // //this.log('savedFrom', peerId, msgID);\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(),\r\n lastMsgId: +mid\r\n });\r\n return;\r\n } else if(target.classList.contains('forward')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = await this.managers.appMessagesManager.getMessageByPeer(this.peerId, mid);\r\n new PopupForward({\r\n [this.peerId]: await this.managers.appMessagesManager.getMidsByMessage(message)\r\n });\r\n // appSidebarRight.forwardTab.open([mid]);\r\n return;\r\n }\r\n\r\n let isReplyClick = false;\r\n\r\n try {\r\n isReplyClick = !!findUpClassName(e.target, 'reply');\r\n } catch(err) {}\r\n\r\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n this.replyFollowHistory.push(bubbleMid);\r\n\r\n const message = (await this.chat.getMessage(bubbleMid)) as Message.message;\r\n\r\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\r\n const replyToMid = message.reply_to.reply_to_msg_id;\r\n\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replyToPeerId,\r\n lastMsgId: replyToMid,\r\n type: this.chat.type,\r\n threadId: this.chat.threadId\r\n });\r\n\r\n /* if(this.chat.type === 'discussion') {\r\n this.chat.appImManager.setMessageId(, originalMessageId);\r\n } else {\r\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\r\n } */\r\n // this.chat.setMessageId(, originalMessageId);\r\n }\r\n }\r\n\r\n // console.log('chatInner click', e);\r\n };\r\n\r\n public async onGoDownClick() {\r\n if(!this.replyFollowHistory.length) {\r\n // this.onScroll(true, undefined, true);\r\n this.chat.setMessageId(/* , dialog.top_message */);\r\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n\r\n // if(dialog) {\r\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\r\n // } else {\r\n // this.log('will scroll down 3');\r\n // this.scroll.scrollTop = this.scroll.scrollHeight;\r\n // }\r\n\r\n return;\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n const slice = this.replyFollowHistory.slice();\r\n const messages = await Promise.all(slice.map((mid) => this.chat.getMessage(mid)));\r\n if(!middleware()) return;\r\n\r\n slice.forEach((mid, idx) => {\r\n const message = messages[idx];\r\n\r\n const bubble = this.bubbles[mid];\r\n let bad = true;\r\n if(bubble) {\r\n const rect = bubble.getBoundingClientRect();\r\n bad = (windowSize.height / 2) > rect.top;\r\n } else if(message) {\r\n bad = false;\r\n }\r\n\r\n if(bad) {\r\n this.replyFollowHistory.splice(this.replyFollowHistory.indexOf(mid), 1);\r\n }\r\n });\r\n\r\n this.replyFollowHistory.sort((a, b) => b - a);\r\n\r\n const mid = this.replyFollowHistory.pop();\r\n this.chat.setMessageId(mid);\r\n }\r\n\r\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\r\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\r\n /* if(element) {\r\n if(element.classList.contains('bubbles-date-group')) {\r\n const children = Array.from(element.children) as HTMLElement[];\r\n if(verticalSide === 'top') {\r\n element = children[this.stickyIntersector ? 2 : 1];\r\n } else {\r\n element = children[children.length - 1];\r\n }\r\n } else {\r\n element = findUpClassName(element, 'bubble');\r\n if(element && element.classList.contains('is-date')) {\r\n element = element.nextElementSibling as HTMLElement;\r\n }\r\n }\r\n } */\r\n if(element) element = findUpClassName(element, 'bubble');\r\n\r\n return element;\r\n }\r\n\r\n public async getGroupedBubble(groupId: string) {\r\n const mids = await this.managers.appMessagesManager.getMidsByAlbum(groupId);\r\n for(const mid of mids) {\r\n if(this.bubbles[mid] && !this.skippedMids.has(mid)) {\r\n // const maxId = Math.max(...mids); // * because in scheduled album can be rendered by lowest mid during sending\r\n return {\r\n bubble: this.bubbles[mid],\r\n mid: mid\r\n // message: await this.chat.getMessage(maxId) as Message.message\r\n };\r\n }\r\n }\r\n }\r\n\r\n public getBubbleGroupedItems(bubble: HTMLElement) {\r\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\r\n }\r\n\r\n public async getMountedBubble(mid: number, message?: Message.message | Message.messageService) {\r\n if(message === undefined) {\r\n message = await this.chat.getMessage(mid);\r\n }\r\n\r\n if(!message) {\r\n return;\r\n }\r\n\r\n const groupedId = (message as Message.message).grouped_id;\r\n if(groupedId) {\r\n const a = await this.getGroupedBubble(groupedId);\r\n if(a) {\r\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\r\n return a;\r\n }\r\n }\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n return {bubble, mid};\r\n }\r\n\r\n private findNextMountedBubbleByMsgId(mid: number, prev?: boolean) {\r\n const mids = getObjectKeysAndSort(this.bubbles, prev ? 'desc' : 'asc');\r\n\r\n let filterCallback: (_mid: number) => boolean;\r\n if(prev) filterCallback = (_mid) => _mid < mid;\r\n else filterCallback = (_mid) => mid < _mid;\r\n\r\n const foundMid = mids.find((_mid) => {\r\n if(!filterCallback(_mid)) return false;\r\n return !!this.bubbles[_mid]?.parentElement;\r\n });\r\n\r\n return this.bubbles[foundMid];\r\n }\r\n\r\n public loadMoreHistory(top: boolean, justLoad = false) {\r\n // this.log('loadMoreHistory', top);\r\n if(\r\n !this.peerId ||\r\n /* TEST_SCROLL || */\r\n this.chat.setPeerPromise ||\r\n this.isHeavyAnimationInProgress ||\r\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) ||\r\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\r\n ) {\r\n return;\r\n }\r\n\r\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\r\n // some messages can have negative id (such as sponsored message)\r\n const history = Object.keys(this.bubbles)\r\n .map((id) => +id)\r\n .filter((id) => id > 0 && !this.skippedMids.has(id))\r\n .sort((a, b) => a - b);\r\n\r\n if(!history.length) {\r\n history.push(0);\r\n }\r\n\r\n if(top) {\r\n if(DEBUG) {\r\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n this.getHistory1(history[0], true, undefined, undefined, justLoad);\r\n } else {\r\n // let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n // const historyMaxId = await this.chat.getHistoryMaxId();\r\n\r\n // // if scroll down after search\r\n // if(history.indexOf(historyMaxId) !== -1) {\r\n // this.setLoaded('bottom', true);\r\n // return;\r\n // }\r\n\r\n if(DEBUG) {\r\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n this.getHistory1(history[history.length - 1], false, true, undefined, justLoad);\r\n }\r\n }\r\n\r\n public onScroll = (ignoreHeavyAnimation?: boolean, scrollDimensions?: ScrollStartCallbackDimensions, forceDown?: boolean) => {\r\n // return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.sliceViewportDebounced?.clearTimeout();\r\n\r\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\r\n if(this.scrolledDown && !ignoreHeavyAnimation) {\r\n return;\r\n }\r\n } else {\r\n this.chat.topbar.pinnedMessage?.setCorrectIndexThrottled(this.scrollable.lastScrollDirection);\r\n this.sliceViewportDebounced?.();\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 = forceDown ? 0 : scrollDimensions?.distanceToEnd ?? this.scrollable.getDistanceToEnd();\r\n if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) || scrollDimensions || forceDown) {\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 && (forceDown || this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\r\n this.container.classList.add('scrolled-down');\r\n this.scrolledDown = true;\r\n } else if(this.container.classList.contains('scrolled-down')) {\r\n this.container.classList.remove('scrolled-down');\r\n this.scrolledDown = false;\r\n }\r\n };\r\n\r\n public setScroll() {\r\n if(this.scrollable) {\r\n this.destroyScrollable();\r\n }\r\n\r\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\r\n this.setLoaded('top', false, false);\r\n this.setLoaded('bottom', false, false);\r\n\r\n this.scrollable.container.append(this.chatInner);\r\n\r\n /* const getScrollOffset = () => {\r\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\r\n return 300;\r\n };\r\n\r\n window.addEventListener('resize', () => {\r\n this.scrollable.onScrollOffset = getScrollOffset();\r\n });\r\n\r\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\r\n\r\n this.scrollable.onAdditionalScroll = this.onScroll;\r\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\r\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\r\n // this.scrollable.attachSentinels(undefined, 300);\r\n\r\n if(IS_TOUCH_SUPPORTED && false) {\r\n this.scrollable.container.addEventListener('touchmove', () => {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n }, {passive: true});\r\n\r\n this.scrollable.container.addEventListener('touchend', () => {\r\n if(!this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n }\r\n\r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }, {passive: true});\r\n }\r\n }\r\n\r\n public async updateUnreadByDialog() {\r\n const historyStorage = await this.chat.getHistoryStorage();\r\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\r\n\r\n // /////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\r\n\r\n for(const msgId of this.unreadOut) {\r\n if(msgId > 0 && msgId <= maxId) {\r\n const bubble = this.bubbles[msgId];\r\n if(bubble) {\r\n this.unreadOut.delete(msgId);\r\n\r\n if(bubble.classList.contains('is-outgoing') || bubble.classList.contains('is-error')) {\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 destroyBubble(bubble: HTMLElement, mid = +bubble.dataset.mid) {\r\n // this.log.warn('destroy bubble', bubble, mid);\r\n bubble.middlewareHelper.destroy();\r\n\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return; */\r\n\r\n if(this.bubbles[mid] === bubble) { // have to check because can clear bubble with same id later\r\n delete this.bubbles[mid];\r\n }\r\n\r\n this.skippedMids.delete(mid);\r\n\r\n if(this.firstUnreadBubble === bubble) {\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n this.bubbleGroups.removeAndUnmountBubble(bubble);\r\n if(this.observer) {\r\n this.observer.unobserve(bubble, this.unreadedObserverCallback);\r\n this.unreaded.delete(bubble);\r\n\r\n this.observer.unobserve(bubble, this.viewsObserverCallback);\r\n this.viewsMids.delete(mid);\r\n\r\n this.observer.unobserve(bubble, this.stickerEffectObserverCallback);\r\n }\r\n\r\n // this.reactions.delete(mid);\r\n }\r\n\r\n public deleteMessagesByIds(mids: number[], permanent = true, ignoreOnScroll?: boolean) {\r\n let deleted = false;\r\n mids.forEach((mid) => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n this.destroyBubble(bubble, mid);\r\n\r\n deleted = true;\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, this.chat.animationGroup);\r\n this.deleteEmptyDateGroups();\r\n\r\n if(!ignoreOnScroll) {\r\n this.scrollable.onScroll();\r\n // this.onScroll();\r\n }\r\n }\r\n\r\n private pollExtendedMediaMessages() {\r\n const mids = Array.from(this.extendedMediaMessages);\r\n return this.managers.appMessagesManager.getExtendedMedia(this.peerId, mids);\r\n }\r\n\r\n private setExtendedMediaMessagesPollInterval() {\r\n if(this.pollExtendedMediaMessagesPromise || !this.extendedMediaMessages.size) {\r\n return;\r\n }\r\n\r\n this.pollExtendedMediaMessagesPromise = pause(30000)\r\n .then(() => this.pollExtendedMediaMessages())\r\n .then(() => this.setExtendedMediaMessagesPollInterval());\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 && this.chat.type !== 'scheduled') {\r\n const {clientHeight, scrollHeight} = this.scrollable.container;\r\n isPaddingNeeded = clientHeight === scrollHeight;\r\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\r\n if(this.chatInner.firstElementChild) {\r\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\r\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\r\n } else {\r\n isPaddingNeeded = true;\r\n } */\r\n\r\n if(isPaddingNeeded) {\r\n /* const add = clientHeight - scrollHeight;\r\n this.chatInner.style.paddingTop = add + 'px';\r\n this.scrollable.scrollTop += add; */\r\n setPaddingTo = this.chatInner;\r\n setPaddingTo.style.paddingTop = clientHeight + 'px';\r\n this.scrollable.setScrollTopSilently(scrollHeight);\r\n this.isTopPaddingSet = true;\r\n }\r\n }\r\n\r\n return {\r\n isPaddingNeeded,\r\n unsetPadding: isPaddingNeeded ? () => {\r\n if(middleware() && isPaddingNeeded) {\r\n setPaddingTo.style.paddingTop = '';\r\n this.isTopPaddingSet = false;\r\n }\r\n } : undefined\r\n };\r\n }\r\n\r\n private renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\r\n const promise = this._renderNewMessage(message, scrolledDown);\r\n this.renderNewPromises.add(promise);\r\n promise.catch(noop).finally(() => {\r\n this.renderNewPromises.delete(promise);\r\n });\r\n return promise;\r\n }\r\n\r\n private async _renderNewMessage(message: MyMessage, 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(async() => {\r\n if(!middleware()) return;\r\n const newMessage = await this.chat.getMessage(message.mid);\r\n if(!middleware()) return;\r\n this.renderNewMessage(newMessage);\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(this.chat.threadId) {\r\n const replyTo = message?.reply_to as MessageReplyHeader;\r\n if(!(replyTo && (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) === this.chat.threadId)) {\r\n return;\r\n }\r\n }\r\n\r\n if(this.bubbles[message.mid]) {\r\n return;\r\n }\r\n // ! should scroll even without new messages\r\n /* if(!mids.length) {\r\n return;\r\n } */\r\n\r\n if(!scrolledDown) {\r\n scrolledDown = this.scrolledDown && (\r\n !this.scrollingToBubble ||\r\n this.scrollingToBubble === this.getLastBubble() ||\r\n this.scrollingToBubble === this.chatInner\r\n );\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n const {isPaddingNeeded, unsetPadding} = this.setTopPadding(middleware);\r\n\r\n const promise = this.performHistoryResult({history: [message]}, false);\r\n if(scrolledDown) {\r\n promise.then(() => {\r\n if(!middleware()) return;\r\n // this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\r\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\r\n // const bubble = this.bubbles[Math.max(...mids)];\r\n\r\n let bubble: HTMLElement;\r\n if(this.chat.type === 'scheduled') {\r\n bubble = this.bubbles[message.mid];\r\n }\r\n\r\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\r\n if(isPaddingNeeded) {\r\n // it will be called only once even if was set multiple times (that won't happen)\r\n promise.then(unsetPadding);\r\n }\r\n\r\n // this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\r\n\r\n /* setTimeout(() => {\r\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\r\n }, 10); */\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public getLastBubble() {\r\n const group = this.bubbleGroups.getLastGroup();\r\n return group?.lastItem?.bubble;\r\n }\r\n\r\n public scrollToBubble(\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number\r\n ) {\r\n const bubble = findUpClassName(element, 'bubble');\r\n\r\n if(!element.parentElement) {\r\n this.log.error('element is not connected', bubble);\r\n }\r\n\r\n let fallbackToElementStartWhenCentering: HTMLElement;\r\n // * if it's a start, then scroll to start of the group\r\n if(bubble && position !== 'end') {\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(item && item.group.firstItem === item && whichChild(item.group.container) === (this.stickyIntersector ? STICKY_OFFSET : 1)) {\r\n const dateGroup = item.group.container.parentElement;\r\n // if(whichChild(dateGroup) === 0) {\r\n fallbackToElementStartWhenCentering = dateGroup;\r\n // position = 'start';\r\n // element = dateGroup;\r\n // }\r\n }\r\n }\r\n\r\n // const isLastBubble = this.getLastBubble() === bubble;\r\n /* if(isLastBubble) {\r\n element = this.getLastDateGroup();\r\n } */\r\n\r\n const margin = 4; // * 4 = .25rem\r\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\r\n margin = 20;\r\n } */\r\n\r\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\r\n const promise = this.scrollable.scrollIntoViewNew({\r\n element,\r\n position,\r\n margin,\r\n forceDirection,\r\n forceDuration,\r\n axis: 'y',\r\n getNormalSize: isChangingHeight ? ({rect}) => {\r\n // return rect.height;\r\n\r\n let height = windowSize.height;\r\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\r\n height -= this.container.offsetTop;\r\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\r\n return height;\r\n\r\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\r\n const diff = rowsWrapperHeight - 54;\r\n return rect.height + diff; */\r\n } : undefined,\r\n fallbackToElementStartWhenCentering,\r\n startCallback: (dimensions) => {\r\n // this.onScroll(true, this.scrolledDown && dimensions.distanceToEnd <= SCROLLED_DOWN_THRESHOLD ? undefined : dimensions);\r\n this.onScroll(true, dimensions);\r\n\r\n if(this.updateGradient) {\r\n const {gradientRenderer} = this.chat;\r\n gradientRenderer?.toNextPosition(dimensions.getProgress);\r\n this.updateGradient = undefined;\r\n }\r\n }\r\n });\r\n\r\n // fix flickering date when opening unread chat and focusing message\r\n if(forceDirection === FocusDirection.Static) {\r\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public scrollToEnd() {\r\n return this.scrollToBubbleEnd(this.chatInner);\r\n }\r\n\r\n public async scrollToBubbleEnd(bubble: HTMLElement) {\r\n /* if(DEBUG) {\r\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\r\n } */\r\n\r\n if(bubble) {\r\n this.scrollingToBubble = bubble;\r\n const middleware = this.getMiddleware();\r\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\r\n if(!middleware()) return;\r\n this.scrollingToBubble = undefined;\r\n }\r\n }\r\n\r\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\r\n // private getLastDateGroup() {\r\n // let lastTime = 0, lastElem: HTMLElement;\r\n // for(const i in this.dateMessages) {\r\n // const dateMessage = this.dateMessages[i];\r\n // if(dateMessage.firstTimestamp > lastTime) {\r\n // lastElem = dateMessage.container;\r\n // lastTime = dateMessage.firstTimestamp;\r\n // }\r\n // }\r\n\r\n // return lastElem;\r\n // }\r\n\r\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\r\n if(this.getLastBubble() === bubble) {\r\n // return this.scrollToBubbleEnd(bubble);\r\n return this.scrollToEnd();\r\n }\r\n }\r\n\r\n public highlightBubble(element: HTMLElement) {\r\n const datasetKey = 'highlightTimeout';\r\n if(element.dataset[datasetKey]) {\r\n clearTimeout(+element.dataset[datasetKey]);\r\n element.classList.remove('is-highlighted');\r\n void element.offsetWidth; // reflow\r\n }\r\n\r\n element.classList.add('is-highlighted');\r\n element.dataset[datasetKey] = '' + setTimeout(() => {\r\n element.classList.remove('is-highlighted');\r\n delete element.dataset[datasetKey];\r\n }, 2000);\r\n }\r\n\r\n private createDateBubble(timestamp: number, date: Date = new Date(timestamp * 1000)) {\r\n let dateElement: HTMLElement;\r\n\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const isScheduled = this.chat.type === 'scheduled';\r\n\r\n if(today.getTime() === date.getTime()) {\r\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\r\n } else if(isScheduled && timestamp === SEND_WHEN_ONLINE_TIMESTAMP) {\r\n dateElement = i18n('MessageScheduledUntilOnline');\r\n } else {\r\n const options: Intl.DateTimeFormatOptions = {\r\n day: 'numeric',\r\n month: 'long'\r\n };\r\n\r\n if(date.getFullYear() !== today.getFullYear()) {\r\n options.year = 'numeric';\r\n }\r\n\r\n dateElement = new I18n.IntlDateElement({\r\n date,\r\n options\r\n }).element;\r\n\r\n if(isScheduled) {\r\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\r\n }\r\n }\r\n\r\n const bubble = document.createElement('div');\r\n bubble.className = 'bubble service is-date';\r\n const bubbleContent = document.createElement('div');\r\n bubbleContent.classList.add('bubble-content');\r\n const serviceMsg = document.createElement('div');\r\n serviceMsg.classList.add('service-msg');\r\n\r\n serviceMsg.append(dateElement);\r\n\r\n bubbleContent.append(serviceMsg);\r\n bubble.append(bubbleContent);\r\n\r\n return bubble;\r\n }\r\n\r\n public getDateForDateContainer(timestamp: number) {\r\n const date = new Date(timestamp * 1000);\r\n date.setHours(0, 0, 0);\r\n return {date, dateTimestamp: date.getTime()};\r\n }\r\n\r\n public getDateContainerByTimestamp(timestamp: number) {\r\n const {date, dateTimestamp} = this.getDateForDateContainer(timestamp);\r\n let ret = this.dateMessages[dateTimestamp];\r\n if(ret) {\r\n return ret;\r\n }\r\n\r\n const bubble = this.createDateBubble(timestamp, date);\r\n // bubble.classList.add('is-sticky');\r\n const fakeBubble = this.createDateBubble(timestamp, date);\r\n fakeBubble.classList.add('is-fake');\r\n\r\n const container = document.createElement('section');\r\n container.className = 'bubbles-date-group';\r\n container.append(bubble, fakeBubble);\r\n\r\n ret = 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 const length = haveTimestamps.length;\r\n let i = 0, 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 this.stickyIntersector?.observeStickyHeaderChanges(container);\r\n\r\n if(this.chatInner.parentElement) {\r\n this.container.classList.add('has-groups');\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n private destroyScrollable() {\r\n this.scrollable.destroy();\r\n }\r\n\r\n public destroy() {\r\n // this.chat.log.error('Bubbles destroying');\r\n\r\n this.destroyScrollable();\r\n\r\n this.listenerSetter.removeAll();\r\n\r\n this.lazyLoadQueue.clear();\r\n this.observer && this.observer.disconnect();\r\n this.stickyIntersector && this.stickyIntersector.disconnect();\r\n\r\n delete this.lazyLoadQueue;\r\n this.observer && delete this.observer;\r\n this.stickyIntersector && delete this.stickyIntersector;\r\n }\r\n\r\n public cleanup(bubblesToo = false) {\r\n this.log('cleanup');\r\n\r\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\r\n // //console.time('appImManager cleanup');\r\n this.setLoaded('top', false, false);\r\n this.setLoaded('bottom', false, false);\r\n\r\n // cancel scroll\r\n cancelAnimationByKey(this.scrollable.container);\r\n\r\n // do not wait ending of previous scale animation\r\n interruptHeavyAnimation();\r\n\r\n if(TEST_SCROLL !== undefined) {\r\n TEST_SCROLL = TEST_SCROLL_TIMES;\r\n }\r\n\r\n this.skippedMids.clear();\r\n this.dateMessages = {};\r\n this.bubbleGroups.cleanup();\r\n this.unreadOut.clear();\r\n this.needUpdate.length = 0;\r\n this.lazyLoadQueue.clear();\r\n this.renderNewPromises.clear();\r\n\r\n // clear messages\r\n if(bubblesToo) {\r\n this.scrollable.container.textContent = '';\r\n this.chatInner.textContent = '';\r\n this.cleanupPlaceholders();\r\n }\r\n\r\n this.firstUnreadBubble = null;\r\n this.attachedUnreadBubble = false;\r\n\r\n this.batchProcessor.clear();\r\n\r\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\r\n this.fetchNewPromise = undefined;\r\n this.getSponsoredMessagePromise = undefined;\r\n this.updateGradient = 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.middlewareHelper.clean();\r\n\r\n this.onAnimateLadder = undefined;\r\n this.resolveLadderAnimation = undefined;\r\n this.attachPlaceholderOnRender = undefined;\r\n this.emptyPlaceholderBubble = undefined;\r\n this.sponsoredMessage = undefined;\r\n this.previousStickyDate = undefined;\r\n\r\n this.scrollingToBubble = undefined;\r\n // //console.timeEnd('appImManager cleanup');\r\n\r\n this.isTopPaddingSet = false;\r\n\r\n this.renderingMessages.clear();\r\n this.bubblesToEject.clear();\r\n this.bubblesToReplace.clear();\r\n\r\n // this.reactions.clear();\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n this.isScrollingTimeout = 0;\r\n }\r\n\r\n this.container.classList.remove('has-sticky-dates');\r\n this.scrollable.cancelMeasure();\r\n }\r\n\r\n private cleanupPlaceholders(bubble = this.emptyPlaceholderBubble) {\r\n if(bubble) {\r\n this.destroyBubble(bubble);\r\n }\r\n }\r\n\r\n public async setPeer(samePeer: boolean, peerId: PeerId, lastMsgId?: number, startParam?: string): Promise<{cached?: boolean, promise: Chat['setPeerPromise']}> {\r\n const tempId = ++this.setPeerTempId;\r\n\r\n if(!peerId) {\r\n this.cleanup(true);\r\n this.preloader.detach();\r\n return null;\r\n }\r\n\r\n const perf = performance.now();\r\n const log = this.log.bindPrefix('setPeer');\r\n log.warn('start');\r\n\r\n const middleware = () => {\r\n return this.setPeerTempId === tempId;\r\n };\r\n\r\n const m = middlewarePromise(middleware, PEER_CHANGED_ERROR);\r\n\r\n if(!samePeer) {\r\n await m(this.chat.onChangePeer(m));\r\n }\r\n\r\n /* if(samePeer && this.chat.setPeerPromise) {\r\n return {cached: true, promise: this.chat.setPeerPromise};\r\n } */\r\n\r\n const chatType = this.chat.type;\r\n\r\n if(chatType === 'scheduled' || this.chat.isRestricted) {\r\n lastMsgId = 0;\r\n }\r\n\r\n const historyStorage = await m(this.chat.getHistoryStorage());\r\n const topMessage = chatType === 'pinned' ? await m(this.managers.appMessagesManager.getPinnedMessagesMaxId(peerId)) : historyStorage.maxId ?? 0;\r\n const isTarget = lastMsgId !== undefined;\r\n\r\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\r\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\r\n topMessage = 0;\r\n } */\r\n\r\n let followingUnread: boolean;\r\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\r\n if(!isTarget) {\r\n if(!samePeer) {\r\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\r\n }\r\n\r\n if(savedPosition) {\r\n\r\n } else if(topMessage) {\r\n readMaxId = await m(this.managers.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId));\r\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\r\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\r\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\r\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\r\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\r\n }\r\n\r\n followingUnread = !isTarget;\r\n lastMsgId = readMaxId;\r\n } else {\r\n lastMsgId = topMessage;\r\n // lastMsgID = topMessage;\r\n }\r\n }\r\n }\r\n\r\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\r\n\r\n if(startParam === undefined && await m(this.chat.isStartButtonNeeded())) {\r\n startParam = BOT_START_PARAM;\r\n }\r\n\r\n if(samePeer) {\r\n const mounted = await m(this.getMountedBubble(lastMsgId));\r\n if(mounted) {\r\n if(isTarget) {\r\n this.scrollToBubble(mounted.bubble, 'center');\r\n this.highlightBubble(mounted.bubble);\r\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\r\n } else if(topMessage && !isJump) {\r\n // log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\r\n // scrollable.setScrollTopSilently(scrollable.scrollHeight);\r\n this.scrollToEnd();\r\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\r\n }\r\n\r\n if(startParam !== undefined) {\r\n this.chat.input.setStartParam(startParam);\r\n }\r\n\r\n return null;\r\n }\r\n } else {\r\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\r\n }\r\n\r\n this.replyFollowHistory.length = 0;\r\n\r\n this.passEntities = {\r\n messageEntityBotCommand: await m(this.managers.appPeersManager.isAnyGroup(peerId)) || this.chat.isBot\r\n };\r\n }\r\n\r\n if(DEBUG) {\r\n log('setPeer peerId:', peerId, historyStorage, lastMsgId, topMessage);\r\n }\r\n\r\n // add last message, bc in getHistory will load < max_id\r\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\r\n\r\n let maxBubbleId = 0;\r\n if(samePeer) {\r\n const el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\r\n // this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(el) {\r\n maxBubbleId = +el.dataset.mid;\r\n }\r\n\r\n if(maxBubbleId <= 0) {\r\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map((mid) => +mid));\r\n }\r\n } else {\r\n this.isFirstLoad = true;\r\n this.destroyResizeObserver();\r\n }\r\n\r\n const oldChatInner = this.chatInner;\r\n const oldPlaceholderBubble = this.emptyPlaceholderBubble;\r\n this.cleanup();\r\n const chatInner = this.chatInner = document.createElement('div');\r\n if(samePeer) {\r\n chatInner.className = oldChatInner.className;\r\n chatInner.classList.remove('disable-hover', 'is-scrolling');\r\n } else {\r\n chatInner.classList.add('bubbles-inner');\r\n }\r\n\r\n this.lazyLoadQueue.lock();\r\n\r\n // const haveToScrollToBubble = (topMessage && (isJump || samePeer)) || isTarget;\r\n const haveToScrollToBubble = samePeer || (topMessage && isJump) || isTarget;\r\n const fromUp = maxBubbleId > 0 && (!lastMsgId || maxBubbleId < lastMsgId || lastMsgId < 0);\r\n const scrollFromDown = !fromUp && samePeer;\r\n const scrollFromUp = !scrollFromDown && fromUp/* && (samePeer || forwardingUnread) */;\r\n this.willScrollOnLoad = scrollFromDown || scrollFromUp;\r\n\r\n this.setPeerOptions = {\r\n lastMsgId,\r\n topMessage\r\n };\r\n\r\n let result: Awaited>;\r\n if(!savedPosition) {\r\n result = await m(this.getHistory1(lastMsgId, true, isJump, additionMsgId));\r\n } else {\r\n result = {\r\n promise: getHeavyAnimationPromise().then(() => {\r\n return this.performHistoryResult({history: savedPosition.mids}, true);\r\n }) as any,\r\n cached: true,\r\n waitPromise: Promise.resolve()\r\n };\r\n }\r\n\r\n this.setPeerCached = result.cached;\r\n\r\n log.warn('got history');// warning\r\n\r\n const {promise, cached} = result;\r\n\r\n if(!cached && !samePeer) {\r\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam));\r\n this.scrollable.container.textContent = '';\r\n // oldContainer.textContent = '';\r\n // oldChatInner.remove();\r\n this.preloader.attach(this.container);\r\n }\r\n\r\n /* this.ladderDeferred && this.ladderDeferred.resolve();\r\n this.ladderDeferred = deferredPromise(); */\r\n\r\n animationIntersector.lockGroup(this.chat.animationGroup);\r\n const setPeerPromise = m(promise).then(async() => {\r\n log.warn('promise fulfilled');\r\n\r\n const mountedByLastMsgId = haveToScrollToBubble ? await m(lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()}) : undefined;\r\n if(cached && !samePeer) {\r\n log.warn('finishing peer change');\r\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam)); // * костыль\r\n log.warn('finished peer change');\r\n }\r\n\r\n this.preloader.detach();\r\n\r\n if(this.resolveLadderAnimation) {\r\n this.resolveLadderAnimation();\r\n this.resolveLadderAnimation = undefined;\r\n }\r\n\r\n this.setPeerCached = undefined;\r\n\r\n // this.ladderDeferred.resolve();\r\n\r\n const scrollable = this.scrollable;\r\n scrollable.lastScrollDirection = 0;\r\n scrollable.lastScrollPosition = 0;\r\n replaceContent(scrollable.container, chatInner);\r\n // this.chat.topbar.container.nextElementSibling.replaceWith(container);\r\n\r\n if(oldPlaceholderBubble) {\r\n this.cleanupPlaceholders(oldPlaceholderBubble);\r\n }\r\n\r\n if(this.attachPlaceholderOnRender) {\r\n this.attachPlaceholderOnRender();\r\n }\r\n\r\n if(!isTarget && this.chat.type === 'chat' && this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndex(0);\r\n }\r\n\r\n this.container.classList.toggle('has-groups', !!Object.keys(this.dateMessages).length);\r\n\r\n log.warn('mounted chat', this.chatInner === chatInner, this.chatInner.parentElement, performance.now() - perf);\r\n\r\n animationIntersector.unlockGroup(this.chat.animationGroup);\r\n animationIntersector.checkAnimations(false, this.chat.animationGroup/* , true */);\r\n\r\n // fastRaf(() => {\r\n this.lazyLoadQueue.unlock();\r\n // });\r\n\r\n // if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\r\n if(savedPosition) {\r\n scrollable.setScrollTopSilently(savedPosition.top);\r\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n\r\n if(bubble) {\r\n const top = bubble.getBoundingClientRect().top;\r\n const distance = savedPosition.top - top;\r\n scrollable.scrollTop += distance;\r\n } */\r\n } else if(haveToScrollToBubble) {\r\n let unsetPadding: () => void;\r\n if(scrollFromDown) {\r\n scrollable.setScrollTopSilently(99999);\r\n } else if(scrollFromUp) {\r\n const set = this.setTopPadding();\r\n if(set.isPaddingNeeded) {\r\n unsetPadding = set.unsetPadding;\r\n }\r\n\r\n scrollable.setScrollTopSilently(0);\r\n }\r\n\r\n // const mountedByLastMsgId = lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()};\r\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId, false) || this.findNextMountedBubbleByMsgId(lastMsgId, true);\r\n }\r\n\r\n let promise: Promise;\r\n // ! sometimes there can be no bubble\r\n if(bubble) {\r\n const lastBubble = this.getLastBubble();\r\n const position: ScrollLogicalPosition = followingUnread ? 'start' : (!isJump && !isTarget && lastBubble === bubble ? 'end' : 'center');\r\n\r\n if(position === 'end' && lastBubble === bubble && samePeer) {\r\n promise = this.scrollToEnd();\r\n } else {\r\n promise = this.scrollToBubble(bubble, position, !samePeer ? FocusDirection.Static : undefined);\r\n }\r\n\r\n if(!followingUnread && isTarget) {\r\n this.highlightBubble(bubble);\r\n }\r\n }\r\n\r\n if(unsetPadding) {\r\n (promise || Promise.resolve()).then(() => {\r\n unsetPadding();\r\n });\r\n }\r\n } else {\r\n scrollable.setScrollTopSilently(99999);\r\n }\r\n\r\n // if(!cached) {\r\n this.onRenderScrollSet();\r\n // }\r\n\r\n this.onScroll();\r\n\r\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\r\n afterSetPromise.then(() => { // check whether list isn't full\r\n scrollable.checkForTriggers();\r\n\r\n // if(cached) {\r\n // this.onRenderScrollSet();\r\n // }\r\n });\r\n\r\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\r\n\r\n Promise.all([\r\n this.setFetchReactionsInterval(afterSetPromise),\r\n this.setFetchHistoryInterval({\r\n afterSetPromise,\r\n lastMsgId,\r\n samePeer,\r\n savedPosition,\r\n topMessage\r\n })\r\n ]).then(() => {\r\n log('scrolledAllDown:', scrollable.loadedAll.bottom);\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\r\n if(chatType === 'chat') {\r\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\r\n if(dialog?.pFlags.unread_mark) {\r\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\r\n }\r\n }\r\n\r\n // this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\r\n }).catch((err) => {\r\n log.error('getHistory promise error:', err);\r\n if(!middleware()) {\r\n this.preloader.detach();\r\n }\r\n\r\n throw err;\r\n });\r\n\r\n return {cached, promise: setPeerPromise};\r\n }\r\n\r\n private async setFetchReactionsInterval(afterSetPromise: Promise) {\r\n const middleware = this.getMiddleware();\r\n const needReactionsInterval = this.chat.isChannel;\r\n if(needReactionsInterval) {\r\n const fetchReactions = async() => {\r\n if(!middleware()) return;\r\n\r\n const mids: number[] = [];\r\n for(const mid in this.bubbles) {\r\n let message = await this.chat.getMessage(+mid);\r\n if(message?._ !== 'message') {\r\n continue;\r\n }\r\n\r\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\r\n mids.push(message.mid);\r\n }\r\n\r\n const promise = mids.length ? this.managers.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\r\n promise.then(() => {\r\n setTimeout(fetchReactions, 10e3);\r\n });\r\n };\r\n\r\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\r\n fetchReactions();\r\n });\r\n }\r\n }\r\n\r\n private async setFetchHistoryInterval({\r\n lastMsgId,\r\n topMessage,\r\n afterSetPromise,\r\n savedPosition,\r\n samePeer\r\n }: {\r\n lastMsgId: number,\r\n topMessage: number,\r\n afterSetPromise: Promise,\r\n savedPosition: ChatSavedPosition,\r\n samePeer: boolean\r\n }) {\r\n const middleware = this.getMiddleware();\r\n const peerId = this.peerId;\r\n\r\n const needFetchInterval = await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId);\r\n const needFetchNew = savedPosition || needFetchInterval;\r\n if(!needFetchNew) {\r\n return;\r\n }\r\n\r\n await afterSetPromise;\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.setLoaded('bottom', false);\r\n this.scrollable.checkForTriggers();\r\n\r\n if(!needFetchInterval) {\r\n return;\r\n }\r\n\r\n const f = () => {\r\n this.fetchNewPromise = new Promise(async(resolve) => {\r\n if(!middleware() || !(await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId))) {\r\n resolve();\r\n return;\r\n }\r\n\r\n this.managers.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((result) => {\r\n if(!middleware() || !result) {\r\n resolve();\r\n return;\r\n }\r\n\r\n const {isBottomEnd} = result;\r\n if(this.scrollable.loadedAll.bottom && this.scrollable.loadedAll.bottom !== isBottomEnd) {\r\n this.setLoaded('bottom', isBottomEnd);\r\n this.onScroll();\r\n }\r\n\r\n setTimeout(f, 30e3);\r\n resolve();\r\n });\r\n }).finally(() => {\r\n this.fetchNewPromise = undefined;\r\n });\r\n };\r\n\r\n if(samePeer) {\r\n setTimeout(f, 30e3);\r\n } else {\r\n f();\r\n }\r\n }\r\n\r\n public async onScrolledAllDown() {\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n const historyMaxId = await this.chat.getHistoryMaxId();\r\n this.managers.appMessagesManager.readHistory(this.peerId, historyMaxId, this.chat.threadId, true);\r\n }\r\n }\r\n\r\n public async finishPeerChange() {\r\n const [isChannel, canWrite, isAnyGroup] = await Promise.all([\r\n this.chat.isChannel,\r\n this.chat.canSend(),\r\n this.chat.isAnyGroup\r\n ]);\r\n\r\n return () => {\r\n this.chatInner.classList.toggle('has-rights', canWrite);\r\n this.container.classList.toggle('is-chat-input-hidden', !canWrite);\r\n\r\n this.chatInner.classList.toggle('is-chat', isAnyGroup);\r\n this.chatInner.classList.toggle('is-channel', isChannel);\r\n\r\n this.createResizeObserver();\r\n };\r\n }\r\n\r\n private processBatch = async(...args: Parameters) => {\r\n let [loadQueue, m, log] = args;\r\n\r\n const filterQueue = (queue: typeof loadQueue) => {\r\n return queue.filter((details) => {\r\n // message can be deleted during rendering\r\n return details && this.bubbles[details.bubble.dataset.mid] === details.bubble;\r\n });\r\n };\r\n\r\n loadQueue = filterQueue(loadQueue);\r\n\r\n log('messages rendered');\r\n\r\n const reverse = loadQueue[0]?.reverse;\r\n\r\n const {groups, avatarPromises} = this.groupBubbles(loadQueue.filter((details) => details.updatePosition));\r\n\r\n // if(groups.length > 2 && loadQueue.length === 1) {\r\n // debugger;\r\n // }\r\n\r\n const promises = loadQueue.reduce((acc, details) => {\r\n const perf = performance.now();\r\n\r\n const promises = details.promises.slice();\r\n const timePromises = promises.map(async(promise) => (await promise, performance.now() - perf));\r\n Promise.all(timePromises).then((times) => {\r\n log.groupCollapsed('media message time', performance.now() - perf, details, times);\r\n times.forEach((time, idx) => {\r\n log('media message time', time, idx, promises[idx]);\r\n });\r\n log.groupEnd();\r\n });\r\n\r\n // if(details.updatePosition) {\r\n // if(res) {\r\n // groups.add(res.group);\r\n // if(details.needAvatar) {\r\n // details.promises.push(res.group.createAvatar(details.message));\r\n // }\r\n // }\r\n // }\r\n\r\n acc.push(...details.promises);\r\n return acc;\r\n }, [] as Promise[]);\r\n\r\n promises.push(...avatarPromises);\r\n // promises.push(pause(200));\r\n\r\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\r\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\r\n // promises.push(getHeavyAnimationPromise());\r\n\r\n log('media promises to call', promises, loadQueue, this.isHeavyAnimationInProgress);\r\n await m(Promise.all([...promises, this.setUnreadDelimiter()])); // не нашёл места лучше\r\n await m(fastRafPromise()); // have to be the last\r\n log('media promises end');\r\n\r\n loadQueue = filterQueue(loadQueue);\r\n\r\n const {restoreScroll, scrollSaver} = this.prepareToSaveScroll(reverse);\r\n // if(this.messagesQueueOnRender) {\r\n // this.messagesQueueOnRender();\r\n // }\r\n\r\n this.messagesQueueOnRenderAdditional?.();\r\n\r\n this.ejectBubbles();\r\n for(const [bubble, oldBubble] of this.bubblesToReplace) {\r\n if(scrollSaver) {\r\n scrollSaver.replaceSaved(oldBubble, bubble);\r\n }\r\n\r\n if(!loadQueue.find((details) => details.bubble === bubble)) {\r\n continue;\r\n }\r\n\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(!item) {\r\n this.log.error('NO ITEM BY BUBBLE', bubble);\r\n } else {\r\n item.mounted = false;\r\n if(!groups.includes(item.group)) {\r\n groups.push(item.group);\r\n }\r\n }\r\n\r\n this.bubblesToReplace.delete(bubble);\r\n }\r\n\r\n if(this.chat.selection.isSelecting) {\r\n loadQueue.forEach(({bubble}) => {\r\n this.chat.selection.toggleElementCheckbox(bubble, true);\r\n });\r\n }\r\n\r\n loadQueue.forEach(({message, bubble, updatePosition}) => {\r\n if(message.pFlags.local && updatePosition) {\r\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\r\n return;\r\n }\r\n });\r\n\r\n this.bubbleGroups.mountUnmountGroups(groups);\r\n // this.bubbleGroups.findIncorrentPositions();\r\n\r\n this.updatePlaceholderPosition?.();\r\n\r\n restoreScroll?.();\r\n\r\n // this.setStickyDateManually();\r\n };\r\n\r\n public renderMessagesQueue(options: ReturnType) {\r\n return this.batchProcessor.addToQueue(options);\r\n }\r\n\r\n private ejectBubbles() {\r\n for(const bubble of this.bubblesToEject) {\r\n bubble.remove();\r\n // this.bubbleGroups.removeAndUnmountBubble(bubble);\r\n }\r\n\r\n this.bubblesToEject.clear();\r\n }\r\n\r\n public groupBubbles(items: Array<{\r\n // Awaited> &\r\n bubble: HTMLElement,\r\n message: Message.message | Message.messageService\r\n }/* & {\r\n unmountIfFound?: boolean\r\n } */>) {\r\n let modifiedGroups: typeof groups;\r\n\r\n if(this.chat.type === 'scheduled') {\r\n modifiedGroups = new Set();\r\n items.forEach(({bubble, message}) => {\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n const group = item?.group;\r\n if(group && item.message.date !== message.date) {\r\n this.bubbleGroups.removeItem(item);\r\n modifiedGroups.add(group);\r\n }\r\n });\r\n }\r\n\r\n items.forEach(({bubble, message}) => {\r\n this.bubbleGroups.prepareForGrouping(bubble, message);\r\n });\r\n\r\n const groups = this.bubbleGroups.groupUngrouped();\r\n\r\n const avatarPromises = Array.from(groups).map((group) => {\r\n if(group.avatar) return;\r\n const firstItem = group.firstItem;\r\n if(firstItem && this.chat.isAvatarNeeded(firstItem.message)) {\r\n return group.createAvatar(firstItem.message);\r\n }\r\n }).filter(Boolean);\r\n\r\n if(modifiedGroups) {\r\n for(const group of modifiedGroups) {\r\n groups.add(group);\r\n }\r\n }\r\n\r\n return {\r\n groups: [...groups],\r\n avatarPromises\r\n };\r\n }\r\n\r\n public getMiddleware(additionalCallback?: () => boolean) {\r\n return this.middlewareHelper.get(additionalCallback);\r\n }\r\n\r\n private async safeRenderMessage(\r\n message: Message.message | Message.messageService,\r\n reverse?: boolean,\r\n bubble?: HTMLElement,\r\n updatePosition = true,\r\n processResult?: (result: ReturnType, bubble: HTMLElement) => typeof result\r\n ) {\r\n if(!message || this.renderingMessages.has(message.mid) || (this.bubbles[message.mid] && !bubble)) {\r\n return;\r\n }\r\n\r\n const middlewareHelper = this.getMiddleware().create();\r\n const middleware = middlewareHelper.get();\r\n\r\n let result: Awaited> & {updatePosition: typeof updatePosition};\r\n try {\r\n this.renderingMessages.add(message.mid);\r\n\r\n // const groupedId = (message as Message.message).grouped_id;\r\n const newBubble = document.createElement('div');\r\n newBubble.middlewareHelper = middlewareHelper;\r\n newBubble.dataset.mid = '' + message.mid;\r\n newBubble.dataset.peerId = '' + message.peerId;\r\n newBubble.dataset.timestamp = '' + message.date;\r\n\r\n // const bubbleNew: Bubble = this.bubblesNew[message.mid] ??= {\r\n // bubble: newBubble,\r\n // mids: new Set(),\r\n // groupedId\r\n // };\r\n\r\n // bubbleNew.mids.add(message.mid);\r\n\r\n if(bubble) {\r\n bubble.middlewareHelper.destroy();\r\n this.skippedMids.delete(message.mid);\r\n\r\n this.bubblesToEject.add(bubble);\r\n this.bubblesToReplace.delete(bubble);\r\n this.bubblesToReplace.set(newBubble, bubble);\r\n this.bubbleGroups.changeBubbleByBubble(bubble, newBubble);\r\n }\r\n\r\n bubble = this.bubbles[message.mid] = newBubble;\r\n let originalPromise = this.renderMessage(message, reverse, bubble, middleware);\r\n if(processResult) {\r\n originalPromise = processResult(originalPromise, bubble);\r\n }\r\n\r\n const promise = originalPromise.then((r) => ((r && middleware() ? {...r, updatePosition} : undefined) as typeof result));\r\n\r\n this.renderMessagesQueue(promise.catch(() => undefined));\r\n\r\n result = await promise;\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!result) {\r\n this.skippedMids.add(+message.mid);\r\n }\r\n } catch(err) {\r\n this.log.error('renderMessage error:', err);\r\n }\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.renderingMessages.delete(message.mid);\r\n return result;\r\n }\r\n\r\n // reverse means top\r\n private async renderMessage(\r\n message: Message.message | Message.messageService,\r\n reverse = false,\r\n bubble: HTMLElement,\r\n middleware: Middleware\r\n ) {\r\n // if(DEBUG) {\r\n // this.log('message to render:', message);\r\n // }\r\n\r\n // if(!bubble && this.bubbles[message.mid]) {\r\n // return;\r\n // }\r\n\r\n // await pause(1000);\r\n\r\n const isMessage = message._ === 'message';\r\n const groupedId = isMessage && message.grouped_id;\r\n let albumMids: number[], reactionsMessage: Message.message;\r\n const albumMessages = groupedId ? await this.managers.appMessagesManager.getMessagesByAlbum(groupedId) : undefined;\r\n\r\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\r\n\r\n if(groupedId && albumMustBeRenderedFull) { // will render only last album's message\r\n albumMids = albumMessages.map((message) => message.mid);\r\n const mainMid = getMainMidForGrouped(albumMids);\r\n if(message.mid !== mainMid) {\r\n return;\r\n }\r\n }\r\n\r\n if(isMessage) {\r\n reactionsMessage = groupedId ? albumMessages[0] : message;\r\n }\r\n\r\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\r\n const our = this.chat.isOurMessage(message);\r\n\r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('message', 'spoilers-container');\r\n\r\n const contentWrapper = document.createElement('div');\r\n contentWrapper.classList.add('bubble-content-wrapper');\r\n\r\n const bubbleContainer = document.createElement('div');\r\n bubbleContainer.classList.add('bubble-content');\r\n\r\n bubble.classList.add('bubble');\r\n contentWrapper.append(bubbleContainer);\r\n bubble.append(contentWrapper);\r\n\r\n const isInUnread = !our && !message.pFlags.out && (message.pFlags.unread ||\r\n isMentionUnread(message)/* ||\r\n (this.historyStorage.readMaxId !== undefined && this.historyStorage.readMaxId < message.mid) */);\r\n if(isInUnread && this.observer) {\r\n // this.log('not our message', message, message.pFlags.unread);\r\n this.observer.observe(bubble, this.unreadedObserverCallback);\r\n this.unreaded.set(bubble, message.mid);\r\n }\r\n\r\n const loadPromises: Promise[] = [];\r\n const ret = {\r\n bubble,\r\n promises: loadPromises,\r\n message,\r\n reverse\r\n };\r\n\r\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\r\n const action = message.action;\r\n if(action) {\r\n const _ = action._;\r\n if(IGNORE_ACTIONS.has(_) || (langPack.hasOwnProperty(_) && !langPack[_])) {\r\n return;\r\n }\r\n }\r\n\r\n bubble.className = 'bubble service';\r\n\r\n bubbleContainer.innerHTML = '';\r\n const s = document.createElement('div');\r\n s.classList.add('service-msg');\r\n if(action) {\r\n let promise: Promise;\r\n if(action._ === 'messageActionChannelMigrateFrom') {\r\n const peerTitle = new PeerTitle();\r\n promise = peerTitle.update({peerId: action.chat_id.toPeerId(true), middleware});\r\n s.append(i18n('ChatMigration.From', [peerTitle.element]));\r\n } else if(action._ === 'messageActionChatMigrateTo') {\r\n const peerTitle = new PeerTitle();\r\n promise = peerTitle.update({peerId: action.channel_id.toPeerId(true), middleware});\r\n s.append(i18n('ChatMigration.To', [peerTitle.element]));\r\n } else {\r\n s.append(await wrapMessageActionTextNew(message));\r\n }\r\n }\r\n bubbleContainer.append(s);\r\n\r\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\r\n bubble.classList.add('is-group-last');\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n let messageMedia: MessageMedia = isMessage && message.media;\r\n let needToSetHTML = true;\r\n let messageMessage: string, totalEntities: MessageEntity[];\r\n if(isMessage) {\r\n if(groupedId && albumMustBeRenderedFull) {\r\n const t = getAlbumText(albumMessages);\r\n messageMessage = t.message;\r\n // totalEntities = t.entities;\r\n totalEntities = t.totalEntities;\r\n } else {\r\n messageMessage = message.message;\r\n // totalEntities = message.entities;\r\n totalEntities = message.totalEntities;\r\n }\r\n\r\n const document = (messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument;\r\n if(document) {\r\n if(document?.type === 'sticker') {\r\n messageMessage = totalEntities = undefined;\r\n } else if(!['video', 'gif'].includes(document.type)) {\r\n needToSetHTML = false;\r\n }\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 bigEmojis = 0, customEmojiSize: MediaSize;\r\n if(totalEntities && !messageMedia) {\r\n const emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji'/* || e._ === 'messageEntityCustomEmoji' */);\r\n const strLength = messageMessage.replace(/\\s/g, '').length;\r\n const 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 bigEmojis = Math.min(BIG_EMOJI_SIZES_LENGTH, emojiEntities.length);\r\n\r\n customEmojiSize = mediaSizes.active.customEmoji;\r\n\r\n const size = BIG_EMOJI_SIZES[bigEmojis];\r\n if(size) {\r\n customEmojiSize = makeMediaSize(size, size);\r\n bubble.style.setProperty('--emoji-size', size + 'px');\r\n }\r\n }\r\n }\r\n\r\n customEmojiSize ??= this.chat.appImManager.customEmojiSize;\r\n\r\n const richText = wrapRichText(messageMessage, {\r\n entities: totalEntities,\r\n passEntities: this.passEntities,\r\n loadPromises,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n customEmojiSize,\r\n middleware,\r\n animationGroup: this.chat.animationGroup\r\n });\r\n\r\n let canHaveTail = true;\r\n let isStandaloneMedia = false;\r\n if(bigEmojis) {\r\n if(rootScope.settings.emoji.big) {\r\n const sticker = bigEmojis === 1 &&\r\n !totalEntities.find((entity) => entity._ === 'messageEntityCustomEmoji') &&\r\n await this.managers.appStickersManager.getAnimatedEmojiSticker(messageMessage);\r\n if(bigEmojis === 1 && !messageMedia && sticker) {\r\n messageMedia = {\r\n _: 'messageMediaDocument',\r\n document: sticker\r\n };\r\n } else {\r\n const attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment', 'spoilers-container');\r\n\r\n setInnerHTML(attachmentDiv, richText);\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(needToSetHTML) {\r\n setInnerHTML(messageDiv, richText);\r\n }\r\n\r\n const haveRTLChar = isRTL(messageMessage, true);\r\n\r\n const timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type,\r\n message,\r\n reactionsMessage\r\n });\r\n messageDiv.append(timeSpan);\r\n bubbleContainer.prepend(messageDiv);\r\n // bubble.prepend(timeSpan, messageDiv); // that's bad\r\n\r\n if(haveRTLChar) {\r\n timeSpan.classList.add('is-block');\r\n }\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 let replyMarkupRows = replyMarkup?._ === 'replyInlineMarkup' && replyMarkup.rows;\r\n if(replyMarkupRows) {\r\n replyMarkupRows = replyMarkupRows.filter((row) => row.buttons.length);\r\n }\r\n\r\n if(replyMarkupRows) {\r\n const containerDiv = document.createElement('div');\r\n containerDiv.classList.add('reply-markup');\r\n replyMarkupRows.forEach((row) => {\r\n const buttons = row.buttons;\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 let text: DocumentFragment | HTMLElement | string = wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\r\n\r\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\r\n\r\n switch(button._) {\r\n case 'keyboardButtonUrl': {\r\n const r = wrapRichText(' ', {\r\n entities: [{\r\n _: 'messageEntityTextUrl',\r\n length: 1,\r\n offset: 0,\r\n url: button.url\r\n }]\r\n });\r\n\r\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\r\n buttonEl.classList.add('is-link');\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');\r\n attachClickEvent(buttonEl, (e) => {\r\n cancelEvent(e);\r\n\r\n const botId = message.viaBotId || message.fromId;\r\n let promise: Promise;\r\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\r\n else promise = this.managers.appInlineBotsManager.checkSwitchReturn(botId).then((peerId) => {\r\n if(peerId) {\r\n return peerId;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const popup = new PopupForward({\r\n [this.peerId]: []\r\n }, (peerId) => {\r\n resolve(peerId);\r\n }, true);\r\n\r\n popup.addEventListener('close', () => {\r\n reject();\r\n });\r\n });\r\n });\r\n\r\n promise.then((peerId) => {\r\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n this.managers.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\r\n });\r\n });\r\n break;\r\n }\r\n\r\n case 'keyboardButtonBuy': {\r\n const mediaInvoice = messageMedia._ === 'messageMediaInvoice' ? messageMedia : undefined;\r\n if(mediaInvoice?.extended_media) {\r\n break;\r\n }\r\n\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-buy');\r\n\r\n if(mediaInvoice?.receipt_msg_id) {\r\n text = i18n('Message.ReplyActionButtonShowReceipt');\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 if(!buttonEl) {\r\n return;\r\n }\r\n\r\n buttonEl.classList.add('reply-markup-button', 'rp', 'tgico');\r\n const t = document.createElement('span');\r\n t.classList.add('reply-markup-button-text');\r\n if(typeof(text) === 'string') {\r\n t.insertAdjacentHTML('beforeend', text);\r\n } else {\r\n t.append(text);\r\n }\r\n\r\n ripple(buttonEl);\r\n buttonEl.append(t);\r\n\r\n rowDiv.append(buttonEl);\r\n });\r\n\r\n if(!rowDiv.childElementCount) {\r\n return;\r\n }\r\n\r\n containerDiv.append(rowDiv);\r\n });\r\n\r\n const haveButtons = !!containerDiv.childElementCount;\r\n\r\n haveButtons && 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(\r\n !target ||\r\n target.classList.contains('is-link') ||\r\n target.classList.contains('is-switch-inline') ||\r\n target.classList.contains('is-buy')\r\n ) return;\r\n\r\n cancelEvent(e);\r\n\r\n const column = whichChild(target);\r\n const row = replyMarkupRows[whichChild(target.parentElement)];\r\n\r\n if(!row.buttons || !row.buttons[column]) {\r\n this.log.warn('no such button', row, column, message);\r\n return;\r\n }\r\n\r\n const button = row.buttons[column];\r\n this.managers.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button).then((callbackAnswer) => {\r\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\r\n toast(wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\r\n }\r\n\r\n // console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\r\n });\r\n });\r\n\r\n if(haveButtons) {\r\n // canHaveTail = false;\r\n bubble.classList.add('with-reply-markup');\r\n contentWrapper.append(containerDiv);\r\n }\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(message.error) status = 'is-error';\r\n else 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 && !message.error) {\r\n bubble.classList.add('is-outgoing');\r\n }\r\n\r\n const messageWithReplies = isMessage && await this.managers.appMessagesManager.getMessageWithCommentReplies(message);\r\n const withReplies = !!messageWithReplies && message.mid > 0;\r\n\r\n if(withReplies) {\r\n bubble.classList.add('with-replies');\r\n }\r\n\r\n const fwdFrom = isMessage && message.fwd_from;\r\n const fwdFromId = isMessage && message.fwdFromId;\r\n\r\n const isOut = this.chat.isOutMessage(message);\r\n let nameContainer: HTMLElement = bubbleContainer;\r\n\r\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\r\n\r\n // media\r\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n\r\n if(!messageMessage) {\r\n bubble.classList.add('is-message-empty');\r\n }\r\n\r\n let processingWebPage = false;\r\n\r\n /* if(isMessage) */switch(messageMedia._) {\r\n case 'messageMediaPhoto': {\r\n const photo = messageMedia.photo;\r\n // //////this.log('messageMediaPhoto', photo);\r\n\r\n if(!messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n bubble.classList.add('photo');\r\n\r\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n wrapAlbum({\r\n messages: albumMessages,\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 const 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 const box = document.createElement('div');\r\n box.classList.add('web');\r\n\r\n const 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 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: this.chat.animationGroup,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n noInfo: message.mid < 0\r\n });\r\n // }\r\n } else {\r\n const docDiv = await wrapDocument({\r\n message: message as Message.message,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises,\r\n sizeType: 'documentName',\r\n searchContext: {\r\n useSearch: false,\r\n peerId: this.peerId,\r\n inputFilter: {\r\n _: 'inputMessagesFilterEmpty'\r\n }\r\n },\r\n fontSize: rootScope.settings.messagesTextSize\r\n });\r\n preview.append(docDiv);\r\n preview.classList.add('preview-with-document');\r\n quoteTextDiv.classList.add('has-document');\r\n // messageDiv.classList.add((webpage.type || 'document') + '-message');\r\n // doc = null;\r\n }\r\n }\r\n\r\n if(previewResizer) {\r\n quoteTextDiv.append(previewResizer);\r\n }\r\n\r\n let t: HTMLElement;\r\n if(webPage.site_name) {\r\n const html = wrapRichText(webPage.url);\r\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\r\n a.classList.add('webpage-name');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, wrapEmojiText(webPage.site_name));\r\n a.textContent = '';\r\n a.append(strong);\r\n quoteTextDiv.append(a);\r\n t = a;\r\n }\r\n\r\n const title = wrapWebPageTitle(webPage);\r\n if(title.textContent) {\r\n const titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, title);\r\n titleDiv.append(strong);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n const description = wrapWebPageDescription(webPage);\r\n if(description.textContent) {\r\n const textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, description);\r\n quoteTextDiv.append(textDiv);\r\n t = textDiv;\r\n }\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } else {\r\n box.classList.add('no-text');\r\n } */\r\n\r\n quote.append(quoteTextDiv);\r\n\r\n if(photo && !doc) {\r\n bubble.classList.add('photo');\r\n\r\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\r\n let isSquare = false;\r\n if(size.w === size.h && t) {\r\n bubble.classList.add('is-square-photo');\r\n isSquare = true;\r\n setAttachmentSize(photo, preview, 48, 48, false);\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } */\r\n } else if(size.h > size.w) {\r\n bubble.classList.add('is-vertical-photo');\r\n }\r\n\r\n wrapPhoto({\r\n photo,\r\n message,\r\n container: preview,\r\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width,\r\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height,\r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n withoutPreloader: isSquare,\r\n autoDownloadSize: this.chat.autoDownload.photo\r\n });\r\n }\r\n\r\n box.append(quote);\r\n\r\n // bubble.prepend(box);\r\n // if(timeSpan.parentElement === messageDiv) {\r\n messageDiv.insertBefore(box, timeSpan);\r\n // } else {\r\n // messageDiv.append(box);\r\n // }\r\n\r\n // this.log('night running', bubble.scrollHeight);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaDocument': {\r\n const doc = messageMedia.document as MyDocument;\r\n\r\n // this.log('messageMediaDocument', doc, bubble);\r\n\r\n if(doc.sticker/* && doc.size <= 1e6 */) {\r\n bubble.classList.add('sticker');\r\n canHaveTail = false;\r\n isStandaloneMedia = true;\r\n\r\n if(doc.animated) {\r\n bubble.classList.add('sticker-animated');\r\n }\r\n\r\n const sizes = mediaSizes.active;\r\n const isEmoji = bubble.classList.contains('emoji-big');\r\n const boxSize = isEmoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\r\n setAttachmentSize(doc, attachmentDiv, boxSize.width, boxSize.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,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: this.chat.animationGroup,\r\n // play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n emoji: isEmoji ? messageMessage : undefined,\r\n withThumb: true,\r\n loadPromises,\r\n isOut,\r\n noPremium: messageMedia?.pFlags?.nopremium\r\n });\r\n\r\n if((getStickerEffectThumb(doc) || isEmoji) && (isInUnread || isOutgoing)/* || true */) {\r\n this.observer.observe(bubble, this.stickerEffectObserverCallback);\r\n }\r\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\r\n // this.log('never get free 2', doc);\r\n\r\n const isRound = doc.type === 'round';\r\n if(isRound) {\r\n isStandaloneMedia = true;\r\n }\r\n\r\n if(isRound || !messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n bubble.classList.add(isRound ? 'round' : 'video');\r\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n\r\n wrapAlbum({\r\n messages: albumMessages,\r\n attachmentDiv,\r\n middleware,\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,\r\n group: this.chat.animationGroup,\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 noInfo: message.mid < 0\r\n });\r\n }\r\n } else {\r\n const newNameContainer = await wrapGroupedDocuments({\r\n albumMustBeRenderedFull,\r\n message,\r\n bubble,\r\n messageDiv,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n sizeType: 'documentName',\r\n fontSize: rootScope.settings.messagesTextSize,\r\n richTextFragment: richText\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, .audio');\r\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\r\n lastContainer && lastContainer.append(timeSpan);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\r\n processingWebPage = true;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaCall': {\r\n const action = messageMedia.action;\r\n const div = document.createElement('div');\r\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\r\n\r\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\r\n div.dataset.type = type;\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('bubble-call-title');\r\n\r\n _i18n(title, isOut ?\r\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') :\r\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('bubble-call-subtitle');\r\n\r\n if(action.duration !== undefined) {\r\n subtitle.append(formatCallDuration(action.duration));\r\n } else {\r\n let langPackKey: LangPackKey;\r\n switch(action.reason._) {\r\n case 'phoneCallDiscardReasonBusy':\r\n langPackKey = 'Call.StatusBusy';\r\n break;\r\n case 'phoneCallDiscardReasonMissed':\r\n langPackKey = 'Chat.Service.Call.Missed';\r\n break;\r\n // case 'phoneCallDiscardReasonHangup':\r\n default:\r\n langPackKey = 'Chat.Service.Call.Cancelled';\r\n break;\r\n }\r\n\r\n subtitle.classList.add('is-reason');\r\n _i18n(subtitle, langPackKey);\r\n }\r\n\r\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\r\n\r\n div.append(title, subtitle);\r\n\r\n processingWebPage = true;\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('call-message');\r\n messageDiv.append(div);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaContact': {\r\n // this.log('wrapping contact', message);\r\n\r\n const contact = messageMedia;\r\n const contactDiv = document.createElement('div');\r\n contactDiv.classList.add('contact');\r\n contactDiv.dataset.peerId = '' + contact.user_id;\r\n\r\n processingWebPage = true;\r\n\r\n const contactDetails = document.createElement('div');\r\n contactDetails.className = 'contact-details';\r\n const contactNameDiv = document.createElement('div');\r\n contactNameDiv.className = 'contact-name';\r\n contactNameDiv.append(\r\n wrapEmojiText([\r\n contact.first_name,\r\n contact.last_name\r\n ].filter(Boolean).join(' '))\r\n );\r\n\r\n const contactNumberDiv = document.createElement('div');\r\n contactNumberDiv.className = 'contact-number';\r\n contactNumberDiv.textContent = contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number';\r\n\r\n contactDiv.append(contactDetails);\r\n contactDetails.append(contactNameDiv, contactNumberDiv);\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.updateWithOptions({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n peerId: contact.user_id.toPeerId()\r\n });\r\n avatarElem.classList.add('contact-avatar', 'avatar-54');\r\n\r\n contactDiv.prepend(avatarElem);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('contact-message');\r\n messageDiv.append(contactDiv);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaPoll': {\r\n bubble.classList.remove('is-message-empty');\r\n\r\n const pollElement = wrapPoll(message);\r\n messageDiv.prepend(pollElement);\r\n messageDiv.classList.add('poll-message');\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaInvoice': {\r\n const isTest = messageMedia.pFlags.test;\r\n const extendedMedia = messageMedia.extended_media;\r\n const isAlreadyPaid = extendedMedia?._ === 'messageExtendedMedia';\r\n const isNotPaid = extendedMedia?._ === 'messageExtendedMediaPreview';\r\n let innerMedia = isAlreadyPaid ?\r\n (extendedMedia.media as MessageMedia.messageMediaPhoto).photo as Photo.photo ||\r\n (extendedMedia.media as MessageMedia.messageMediaDocument).document as Document.document :\r\n messageMedia.photo;\r\n\r\n const wrappedPrice = paymentsWrapCurrencyAmount(messageMedia.total_amount, messageMedia.currency);\r\n let priceEl: HTMLElement;\r\n if(!extendedMedia) {\r\n priceEl = document.createElement(innerMedia ? 'span' : 'div');\r\n const f = document.createDocumentFragment();\r\n const l = i18n(messageMedia.receipt_msg_id ? 'PaymentReceipt' : (isTest ? 'PaymentTestInvoice' : 'PaymentInvoice'));\r\n l.classList.add('text-uppercase');\r\n const joiner = ' ' + NBSP;\r\n const p = document.createElement('span');\r\n p.classList.add('text-bold');\r\n p.textContent = wrappedPrice + joiner;\r\n f.append(p, l);\r\n if(isTest && messageMedia.receipt_msg_id) {\r\n const a = document.createElement('span');\r\n a.classList.add('text-uppercase', 'pre-wrap');\r\n a.append(joiner + '(Test)');\r\n f.append(a);\r\n }\r\n setInnerHTML(priceEl, f);\r\n } else if(isNotPaid) {\r\n priceEl = document.createElement('span');\r\n priceEl.classList.add('extended-media-buy', 'tgico-premium_lock');\r\n attachmentDiv.classList.add('is-buy');\r\n _i18n(priceEl, 'Checkout.PayPrice', [wrappedPrice]);\r\n\r\n if(extendedMedia.video_duration !== undefined) {\r\n const videoTime = document.createElement('span');\r\n videoTime.classList.add('video-time');\r\n videoTime.textContent = toHHMMSS(extendedMedia.video_duration, false);\r\n attachmentDiv.append(videoTime);\r\n }\r\n }\r\n\r\n if(isNotPaid) {\r\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).w = extendedMedia.w;\r\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).h = extendedMedia.h;\r\n innerMedia = {\r\n _: 'photo',\r\n access_hash: '',\r\n pFlags: {},\r\n date: 0,\r\n dc_id: 0,\r\n file_reference: [],\r\n id: 0,\r\n sizes: [extendedMedia.thumb]\r\n };\r\n }\r\n\r\n if(innerMedia) {\r\n const mediaSize = extendedMedia ? mediaSizes.active.extendedInvoice : mediaSizes.active.invoice;\r\n if(innerMedia._ === 'document') {\r\n wrapVideo({\r\n doc: innerMedia,\r\n container: attachmentDiv,\r\n withTail: false,\r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware,\r\n loadPromises,\r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height,\r\n group: this.chat.animationGroup,\r\n message: message as Message.message\r\n });\r\n bubble.classList.add('video');\r\n } else {\r\n wrapPhoto({\r\n photo: innerMedia,\r\n container: attachmentDiv,\r\n withTail: false,\r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware,\r\n loadPromises,\r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height,\r\n message: isAlreadyPaid ? message : undefined\r\n });\r\n bubble.classList.add('photo');\r\n }\r\n\r\n if(priceEl) {\r\n if(!extendedMedia) {\r\n priceEl.classList.add('video-time');\r\n }\r\n\r\n attachmentDiv.append(priceEl);\r\n }\r\n } else {\r\n attachmentDiv = undefined;\r\n }\r\n\r\n if(isNotPaid) {\r\n const {mid} = message;\r\n this.extendedMediaMessages.add(mid);\r\n middleware.onClean(() => {\r\n this.extendedMediaMessages.delete(mid);\r\n animationIntersector.removeAnimationByPlayer(dotRenderer);\r\n });\r\n this.setExtendedMediaMessagesPollInterval();\r\n\r\n const {width, height} = attachmentDiv.style;\r\n const dotRenderer = new DotRenderer(parseInt(width), parseInt(height));\r\n dotRenderer.renderFirstFrame();\r\n attachmentDiv.append(dotRenderer.canvas);\r\n\r\n animationIntersector.addAnimation(dotRenderer, this.chat.animationGroup, dotRenderer.canvas, true);\r\n }\r\n\r\n let titleDiv: HTMLElement;\r\n if(!extendedMedia) {\r\n titleDiv = document.createElement('div');\r\n titleDiv.classList.add('bubble-primary-color');\r\n setInnerHTML(titleDiv, wrapEmojiText(messageMedia.title));\r\n }\r\n\r\n const richText = isAlreadyPaid ? undefined : wrapEmojiText(messageMedia.description);\r\n messageDiv.prepend(...[titleDiv, !innerMedia && priceEl, richText].filter(Boolean));\r\n\r\n if(!richText) canHaveTail = false;\r\n else bubble.classList.remove('is-message-empty');\r\n bubble.classList.add('is-invoice');\r\n\r\n break;\r\n }\r\n\r\n default:\r\n attachmentDiv = undefined;\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 && attachmentDiv) {\r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\r\n bubble.classList.add('no-tail');\r\n\r\n if(!bubble.classList.contains('with-media-tail')) {\r\n bubble.classList.add('use-border-radius');\r\n }\r\n } */\r\n }\r\n\r\n if(isStandaloneMedia) {\r\n bubble.classList.add('just-media');\r\n }\r\n\r\n let savedFrom = '';\r\n\r\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\r\n const needName = (message.fromId !== rootScope.myId && this.chat.isAnyGroup) || message.viaBotId || (message as Message.message).pFlags.sponsored;\r\n if(needName || fwdFrom || message.reply_to_mid) { // chat\r\n let title: HTMLElement | DocumentFragment;\r\n let titleVia: typeof title;\r\n\r\n const isForwardFromChannel = message.from_id?._ === 'peerChannel' && message.fromId === fwdFromId;\r\n\r\n const isHidden = fwdFrom && !fwdFrom.from_id;\r\n if(message.viaBotId) {\r\n titleVia = document.createElement('span');\r\n titleVia.innerText = '@' + (await this.managers.appUsersManager.getUser(message.viaBotId)).username;\r\n titleVia.classList.add('peer-title');\r\n bubble.classList.add('must-have-name');\r\n }\r\n\r\n const isForward = fwdFromId || fwdFrom;\r\n if(isHidden) {\r\n // /////this.log('message to render hidden', message);\r\n title = document.createElement('span');\r\n setInnerHTML(title, wrapEmojiText(fwdFrom.from_name));\r\n title.classList.add('peer-title');\r\n // title = fwdFrom.from_name;\r\n bubble.classList.add('hidden-profile');\r\n } else {\r\n title = new PeerTitle({peerId: fwdFromId || message.fromId, withPremiumIcon: !isForward, middleware}).element;\r\n }\r\n\r\n let replyContainer: HTMLElement;\r\n if(message.reply_to_mid && message.reply_to_mid !== this.chat.threadId && isMessage) {\r\n replyContainer = await MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n bubbleContainer,\r\n message\r\n });\r\n }\r\n\r\n // this.log(title);\r\n\r\n let nameDiv: HTMLElement;\r\n if(isForward) {\r\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\r\n bubble.classList.add('forwarded');\r\n }\r\n\r\n if(message.savedFrom) {\r\n savedFrom = message.savedFrom;\r\n title.dataset.savedFrom = savedFrom;\r\n }\r\n\r\n nameDiv = document.createElement('div');\r\n title.dataset.peerId = '' + fwdFromId;\r\n\r\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\r\n nameDiv.style.color = getPeerColorById(fwdFromId, false);\r\n nameDiv.classList.add('colored-name');\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 const br = document.createElement('br');\r\n br.classList.add('hide-ol');\r\n args.unshift(br);\r\n }\r\n nameDiv.append(i18n('ForwardedFrom', [args]));\r\n }\r\n } else if(!message.viaBotId) {\r\n if(!isStandaloneMedia && needName) {\r\n nameDiv = document.createElement('div');\r\n nameDiv.append(title);\r\n\r\n const peer = await this.managers.appPeersManager.getPeer(message.fromId);\r\n const pFlags = (peer as User.user)?.pFlags;\r\n if(pFlags && (pFlags.scam || pFlags.fake)) {\r\n nameDiv.append(generateFakeIcon(pFlags.scam));\r\n }\r\n\r\n if(!our) {\r\n nameDiv.style.color = getPeerColorById(message.fromId, false);\r\n nameDiv.classList.add('colored-name');\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\r\n if(isStandaloneMedia) {\r\n nameContainer.append(nameContainer = document.createElement('div'));\r\n nameContainer.classList.add('name-with-reply', 'floating-part');\r\n } else {\r\n nameDiv.classList.add('floating-part');\r\n }\r\n\r\n nameContainer.append(nameDiv);\r\n\r\n if(isStandaloneMedia && replyContainer) {\r\n nameContainer.append(replyContainer);\r\n }\r\n } else if(isStandaloneMedia && replyContainer) {\r\n replyContainer.classList.add('floating-part');\r\n }\r\n } else {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n savedFrom = `${this.chat.peerId}_${message.mid}`;\r\n }\r\n\r\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\r\n if(isThreadStarter) {\r\n bubble.classList.add('is-thread-starter', 'is-group-last');\r\n }\r\n\r\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\r\n const goto = document.createElement('div');\r\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\r\n bubbleContainer.append(goto);\r\n bubble.dataset.savedFrom = savedFrom;\r\n bubble.classList.add('with-beside-button');\r\n }\r\n\r\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\r\n\r\n if(withReplies) {\r\n const isFooter = MessageRender.renderReplies({\r\n bubble,\r\n bubbleContainer,\r\n message: messageWithReplies,\r\n messageDiv,\r\n loadPromises,\r\n lazyLoadQueue: this.lazyLoadQueue\r\n });\r\n\r\n if(isFooter) {\r\n canHaveTail = true;\r\n } else {\r\n bubble.classList.add('with-beside-replies');\r\n }\r\n }\r\n\r\n if(isMessage) {\r\n this.appendReactionsElementToBubble(bubble, message, reactionsMessage);\r\n }\r\n\r\n /* if(isMessage) {\r\n const reactionHover = document.createElement('div');\r\n reactionHover.classList.add('bubble-reaction-hover');\r\n contentWrapper.append(reactionHover);\r\n } */\r\n\r\n if(canHaveTail) {\r\n bubble.classList.add('can-have-tail');\r\n\r\n bubbleContainer.append(generateTail());\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n private appendReactionsElementToBubble(\r\n bubble: HTMLElement,\r\n message: Message.message,\r\n reactionsMessage: Message.message,\r\n changedResults?: ReactionCount[]\r\n ) {\r\n if(this.peerId.isUser() && USER_REACTIONS_INLINE/* || true */) {\r\n return;\r\n }\r\n\r\n if(!reactionsMessage?.reactions || !reactionsMessage.reactions.results.length) {\r\n return;\r\n }\r\n\r\n // message = this.appMessagesManager.getMessageWithReactions(message);\r\n\r\n const reactionsElement = new ReactionsElement();\r\n reactionsElement.init(reactionsMessage, 'block', bubble.middlewareHelper.get());\r\n reactionsElement.render(changedResults);\r\n\r\n if(bubble.classList.contains('is-message-empty')) {\r\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\r\n } else {\r\n const messageDiv = bubble.querySelector('.message');\r\n if(bubble.classList.contains('is-multiple-documents')) {\r\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\r\n let documentMessageDiv = documentContainer.querySelector('.document-message');\r\n\r\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\r\n if(!timeSpan) {\r\n timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type,\r\n message,\r\n reactionsMessage\r\n });\r\n }\r\n\r\n reactionsElement.append(timeSpan);\r\n\r\n if(!documentMessageDiv) {\r\n documentMessageDiv = document.createElement('div');\r\n documentMessageDiv.classList.add('document-message');\r\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\r\n }\r\n\r\n documentMessageDiv.append(reactionsElement);\r\n } else {\r\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\r\n reactionsElement.append(timeSpan);\r\n\r\n messageDiv.append(reactionsElement);\r\n }\r\n }\r\n }\r\n\r\n private prepareToSaveScroll(reverse?: boolean) {\r\n const isMounted = !!this.chatInner.parentElement;\r\n if(!isMounted) {\r\n return {};\r\n }\r\n\r\n const log = this.log.bindPrefix('prepareToSaveScroll');\r\n log('save');\r\n const scrollSaver = this.createScrollSaver(reverse);\r\n scrollSaver.save(); // * let's save scroll position by point before the slicing, not after\r\n\r\n if(this.getRenderedLength() && !this.chat.setPeerPromise) {\r\n const viewportSlice = this.getViewportSlice();\r\n this.deleteViewportSlice(viewportSlice, true);\r\n }\r\n\r\n // scrollSaver.save(); // ! slicing will corrupt scroll position\r\n // const saved = scrollSaver.getSaved();\r\n // const hadScroll = saved.scrollHeight !== saved.clientHeight;\r\n\r\n return {\r\n restoreScroll: () => {\r\n log('restore');\r\n // scrollSaver.restore(_history.length === 1 && !reverse ? false : true);\r\n scrollSaver.restore(reverse);\r\n this.onRenderScrollSet(scrollSaver.getSaved());\r\n },\r\n scrollSaver\r\n };\r\n }\r\n\r\n public async performHistoryResult(\r\n historyResult: HistoryResult | {history: (Message.message | Message.messageService | number)[]},\r\n reverse: boolean\r\n ) {\r\n const log = false ? this.log.bindPrefix('perform-' + (Math.random() * 1000 | 0)) : undefined;\r\n log?.('start', this.chatInner.parentElement);\r\n\r\n let history = historyResult.history;\r\n history = history.slice(); // need\r\n\r\n if(this.needReflowScroll) {\r\n reflowScrollableElement(this.scrollable.container);\r\n this.needReflowScroll = false;\r\n }\r\n\r\n const cb = (message: Message.message | Message.messageService) => {\r\n if(!message) {\r\n return;\r\n } else if(message.pFlags.local) {\r\n return this.processLocalMessageRender(message);\r\n } else {\r\n return this.safeRenderMessage(message, reverse);\r\n }\r\n };\r\n\r\n const messages = await Promise.all(history.map((mid) => {\r\n return typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\r\n }));\r\n\r\n const setLoadedPromises: Promise[] = [];\r\n if(!this.scrollable.loadedAll['bottom'] || !this.scrollable.loadedAll['top']) {\r\n let isEnd = (historyResult as HistoryResult).isEnd;\r\n if(!isEnd) {\r\n const historyStorage = await this.chat.getHistoryStorage();\r\n const firstSlice = historyStorage.history.first;\r\n const lastSlice = historyStorage.history.last;\r\n isEnd = {top: false, bottom: false, both: false};\r\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\r\n isEnd.bottom = true;\r\n }\r\n\r\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\r\n isEnd.top = true;\r\n }\r\n }\r\n\r\n if(!isEnd.bottom && this.setPeerOptions) {\r\n const {lastMsgId, topMessage} = this.setPeerOptions;\r\n this.setPeerOptions = undefined;\r\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\r\n isEnd.bottom = true;\r\n }\r\n }\r\n\r\n if(isEnd.top) setLoadedPromises.push(this.setLoaded('top', true));\r\n if(isEnd.bottom) setLoadedPromises.push(this.setLoaded('bottom', true));\r\n }\r\n\r\n await Promise.all(setLoadedPromises);\r\n\r\n // ! it is important to insert bubbles to group reversed way\r\n // const length = history.length, promises: Promise[] = [];\r\n // if(reverse) for(let i = 0; i < length; ++i) promises.push(cb(messages[i]));\r\n // else for(let i = length - 1; i >= 0; --i) promises.push(cb(messages[i]));\r\n const promises = messages.map(cb);\r\n\r\n // cannot combine them into one promise\r\n await Promise.all(promises);\r\n await this.messagesQueuePromise;\r\n\r\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n this.messagesQueueOnRenderAdditional?.(); // * can set it second time\r\n }\r\n\r\n log?.('performHistoryResult end');\r\n }\r\n\r\n private onRenderScrollSet(state?: {scrollHeight: number, clientHeight: number}) {\r\n const className = 'has-sticky-dates';\r\n if(!this.container.classList.contains(className)) {\r\n const isLoading = !this.preloader.detached;\r\n\r\n if(isLoading ||\r\n (\r\n state ??= {\r\n scrollHeight: this.scrollable.scrollHeight,\r\n clientHeight: this.scrollable.container.clientHeight\r\n },\r\n state.scrollHeight !== state.clientHeight\r\n )\r\n ) {\r\n /* for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n dateMessage.div.classList.add('is-sticky');\r\n } */\r\n\r\n const middleware = this.getMiddleware();\r\n const callback = () => {\r\n if(!middleware()) return;\r\n this.container.classList.add(className);\r\n };\r\n\r\n if(this.willScrollOnLoad) {\r\n callback();\r\n } else {\r\n setTimeout(callback, 600);\r\n }\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.willScrollOnLoad = undefined;\r\n }\r\n\r\n public onDatePick = (timestamp: number) => {\r\n const peerId = this.peerId;\r\n this.managers.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then((history) => {\r\n if(!history?.messages?.length) {\r\n this.log.error('no history!');\r\n return;\r\n } else if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\r\n // console.log('got history date:', history);\r\n });\r\n };\r\n\r\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\r\n // const middleware = this.getMiddleware();\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n return this.managers.acknowledged.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\r\n } else if(this.chat.type === 'pinned') {\r\n return this.managers.acknowledged.appMessagesManager.getSearch({\r\n peerId: this.peerId,\r\n inputFilter: {_: 'inputMessagesFilterPinned'},\r\n maxId,\r\n limit: loadCount,\r\n backLimit\r\n }).then((ackedResult) => {\r\n return {\r\n cached: ackedResult.cached,\r\n result: Promise.resolve(ackedResult.result).then((value) => {\r\n return {history: value.history.map((m) => m.mid)};\r\n })\r\n };\r\n });\r\n } else if(this.chat.type === 'scheduled') {\r\n return this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((ackedResult) => {\r\n // this.setLoaded('top', true);\r\n // this.setLoaded('bottom', true);\r\n return {\r\n cached: ackedResult.cached,\r\n result: Promise.resolve(ackedResult.result).then((mids) => ({history: mids.slice().reverse()}))\r\n };\r\n });\r\n }\r\n }\r\n\r\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\r\n /* const middleware = this.getMiddleware();\r\n await this.ladderDeferred; */\r\n\r\n const log = this.log.bindPrefix('ladder');\r\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\r\n log.warn('will be delayed');\r\n // @ts-ignore\r\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n return;\r\n }\r\n\r\n /* if(!middleware()) {\r\n return;\r\n } */\r\n\r\n if(!Object.keys(this.bubbles).length) {\r\n log.warn('no bubbles');\r\n return;\r\n }\r\n\r\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n\r\n if(isAdditionRender && additionMsgIds.length) {\r\n sortedMids = sortedMids.filter((mid) => !additionMsgIds.includes(mid));\r\n }\r\n\r\n let targetMid: number;\r\n if(backLimit) {\r\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\r\n } else {\r\n if(additionMsgId) {\r\n targetMid = additionMsgId;\r\n } else { // * if maxId === 0\r\n targetMid = Math.max(...sortedMids);\r\n }\r\n }\r\n\r\n const topIds = sortedMids.slice(sortedMids.findIndex((mid) => targetMid > mid));\r\n const middleIds = isAdditionRender ? [] : [targetMid];\r\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex((mid) => targetMid >= mid)).reverse();\r\n\r\n if(DEBUG) {\r\n log('targeting mid:', targetMid, maxId, additionMsgId,\r\n topIds.map((m) => getServerMessageId(m)),\r\n bottomIds.map((m) => getServerMessageId(m)));\r\n }\r\n\r\n const setBubbles: HTMLElement[] = [];\r\n\r\n this.chatInner.classList.add('zoom-fading');\r\n const delay = isAdditionRender ? 10 : 40;\r\n const offsetIndex = isAdditionRender ? 0 : 1;\r\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\r\n const animationPromise = deferredPromise();\r\n let lastMsDelay = 0;\r\n mids.forEach((mid, idx) => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble || this.skippedMids.has(mid)) {\r\n log.warn('no bubble by mid:', mid);\r\n return;\r\n }\r\n\r\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\r\n // lastMsDelay = (idx + offsetIndex) * delay;\r\n // lastMsDelay = (idx || 0.1) * 1000;\r\n\r\n const contentWrapper = bubble.lastElementChild as HTMLElement;\r\n const elementsToAnimate: HTMLElement[] = [contentWrapper];\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(item && item.group.avatar && item.group.lastItem === item) {\r\n elementsToAnimate.push(item.group.avatar);\r\n }\r\n\r\n elementsToAnimate.forEach((element) => {\r\n element.classList.add('zoom-fade', 'can-zoom-fade');\r\n element.style.transitionDelay = lastMsDelay + 'ms';\r\n });\r\n\r\n if(idx === (mids.length - 1)) {\r\n const onTransitionEnd = (e: TransitionEvent) => {\r\n if(e.target !== contentWrapper) {\r\n return;\r\n }\r\n\r\n animationPromise.resolve();\r\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\r\n };\r\n\r\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\r\n }\r\n\r\n setBubbles.push(...elementsToAnimate);\r\n });\r\n\r\n if(!mids.length) {\r\n animationPromise.resolve();\r\n }\r\n\r\n return {lastMsDelay, animationPromise};\r\n };\r\n\r\n const topRes = animateAsLadder(topIds, offsetIndex);\r\n const middleRes = animateAsLadder(middleIds);\r\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\r\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\r\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\r\n\r\n if(this.onAnimateLadder) {\r\n await this.onAnimateLadder();\r\n }\r\n\r\n fastRaf(() => {\r\n this.setStickyDateManually(); // ! maybe it's not efficient\r\n\r\n setBubbles.forEach((element) => {\r\n element.classList.remove('zoom-fade');\r\n });\r\n });\r\n\r\n let promise: Promise;\r\n if(topIds.length || middleIds.length || bottomIds.length) {\r\n promise = Promise.all(promises);\r\n\r\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\r\n .then(() => {\r\n fastRaf(() => {\r\n setBubbles.forEach((element) => {\r\n element.style.transitionDelay = '';\r\n element.classList.remove('can-zoom-fade');\r\n });\r\n\r\n this.chatInner.classList.remove('zoom-fading');\r\n });\r\n\r\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх,\r\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\r\n // if(!IS_SAFARI) {\r\n // this.needReflowScroll = true;\r\n // }\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private async renderEmptyPlaceholder(\r\n type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted',\r\n bubble: HTMLElement,\r\n message: any,\r\n elements: (Node | string)[]\r\n ) {\r\n const BASE_CLASS = 'empty-bubble-placeholder';\r\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\r\n\r\n let title: HTMLElement;\r\n if(type === 'group') title = i18n('GroupEmptyTitle1');\r\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\r\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\r\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\r\n else if(type === 'restricted') {\r\n title = document.createElement('span');\r\n title.innerText = await this.managers.appPeersManager.getRestrictionReasonText(this.peerId);\r\n }\r\n title.classList.add('center', BASE_CLASS + '-title');\r\n\r\n elements.push(title);\r\n\r\n let listElements: HTMLElement[];\r\n if(type === 'group') {\r\n elements.push(i18n('GroupEmptyTitle2'));\r\n listElements = [\r\n i18n('GroupDescription1'),\r\n i18n('GroupDescription2'),\r\n i18n('GroupDescription3'),\r\n i18n('GroupDescription4')\r\n ];\r\n } else if(type === 'saved') {\r\n listElements = [\r\n i18n('ChatYourSelfDescription1'),\r\n i18n('ChatYourSelfDescription2'),\r\n i18n('ChatYourSelfDescription3'),\r\n i18n('ChatYourSelfDescription4')\r\n ];\r\n } else if(type === 'greeting') {\r\n const subtitle = i18n('NoMessagesGreetingsDescription');\r\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\r\n\r\n // findAndSplice(this.messagesQueue, q => q.bubble === bubble);\r\n\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\r\n\r\n const middleware = this.getMiddleware();\r\n\r\n await this.managers.appStickersManager.getGreetingSticker().then(async(doc) => {\r\n if(!middleware()) return;\r\n\r\n const loadPromises: Promise[] = [];\r\n await wrapSticker({\r\n doc,\r\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\r\n div: stickerDiv,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: this.chat.animationGroup,\r\n // play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n\r\n attachClickEvent(stickerDiv, (e) => {\r\n cancelEvent(e);\r\n EmoticonsDropdown.onMediaClick({target: e.target});\r\n });\r\n\r\n return Promise.all(loadPromises);\r\n });\r\n\r\n // this.renderMessagesQueue({\r\n // message,\r\n // bubble,\r\n // reverse: false,\r\n // promises: [loadPromise]\r\n // });\r\n\r\n elements.push(subtitle, stickerDiv);\r\n }\r\n\r\n if(listElements) {\r\n elements.push(\r\n ...listElements.map((elem) => {\r\n const span = document.createElement('span');\r\n span.classList.add(BASE_CLASS + '-list-item');\r\n span.append(elem);\r\n return span;\r\n })\r\n );\r\n\r\n if(type === 'group') {\r\n listElements.forEach((elem) => {\r\n const i = document.createElement('span');\r\n i.classList.add('tgico-check');\r\n elem.prepend(i);\r\n });\r\n } else if(type === 'saved') {\r\n listElements.forEach((elem) => {\r\n const i = document.createElement('span');\r\n i.classList.add(BASE_CLASS + '-list-bullet');\r\n i.innerText = '•';\r\n elem.prepend(i);\r\n });\r\n }\r\n }\r\n\r\n if(elements.length > 1) {\r\n bubble.classList.add('has-description');\r\n }\r\n\r\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\r\n }\r\n\r\n private async processLocalMessageRender(\r\n message: Message.message | Message.messageService,\r\n animate?: boolean,\r\n middleware = this.getMiddleware()\r\n ) {\r\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\r\n const m = middlewarePromise(middleware);\r\n\r\n const p: Parameters[4] = async(result) => {\r\n const {bubble} = await m(result);\r\n if(!bubble) {\r\n return result;\r\n }\r\n\r\n (bubble as any).message = message;\r\n\r\n bubble.classList.add('is-group-last', 'is-group-first');\r\n\r\n const updatePosition = () => {\r\n if(this.updatePlaceholderPosition === updatePosition) {\r\n this.updatePlaceholderPosition = undefined;\r\n }\r\n\r\n appendTo[method](bubble);\r\n };\r\n\r\n if(!isSponsored) {\r\n bubble.classList.add('bubble-first');\r\n bubble.classList.remove('can-have-tail', 'is-in');\r\n }\r\n\r\n const elements: (Node | string)[] = [];\r\n const isBot = this.chat.isBot;\r\n let renderPromise: Promise, appendTo = this.container, method: 'append' | 'prepend' = 'append';\r\n if(this.chat.isRestricted) {\r\n renderPromise = this.renderEmptyPlaceholder('restricted', bubble, message, elements);\r\n } else if(isSponsored) {\r\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\r\n\r\n bubble.classList.add('avoid-selection');\r\n bubble.style.order = '999999';\r\n\r\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\r\n const peerId = getPeerId(sponsoredMessage.from_id);\r\n // const peer = this.appPeersManager.getPeer(peerId);\r\n if(sponsoredMessage.channel_post) {\r\n text = 'OpenChannelPost';\r\n mid = generateMessageId(sponsoredMessage.channel_post);\r\n } else if(sponsoredMessage.start_param || isBot) {\r\n text = 'Chat.Message.ViewBot';\r\n startParam = sponsoredMessage.start_param;\r\n } else {\r\n text = await this.managers.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\r\n }\r\n\r\n if(sponsoredMessage.chat_invite) {\r\n callback = () => {\r\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite);\r\n };\r\n } else if(sponsoredMessage.chat_invite_hash) {\r\n callback = () => {\r\n const link: InternalLink = {\r\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\r\n invite: sponsoredMessage.chat_invite_hash\r\n };\r\n\r\n this.chat.appImManager.processInternalLink(link);\r\n };\r\n } else {\r\n callback = () => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId,\r\n lastMsgId: mid,\r\n startParam\r\n });\r\n };\r\n }\r\n\r\n const button = Button('btn-primary btn-primary-transparent bubble-view-button', {\r\n text\r\n });\r\n\r\n this.observer.observe(button, this.viewsObserverCallback);\r\n\r\n if(callback) {\r\n attachClickEvent(button, callback);\r\n }\r\n\r\n bubble.querySelector('.bubble-content').prepend(button);\r\n\r\n appendTo = this.chatInner;\r\n method = 'append';\r\n animate = false;\r\n\r\n // return result;\r\n } else if(isBot && message._ === 'message') {\r\n const b = document.createElement('b');\r\n b.append(i18n('BotInfoTitle'));\r\n elements.push(b, '\\n\\n');\r\n appendTo = this.chatInner;\r\n method = 'prepend';\r\n } else if(this.chat.isAnyGroup && (await m(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator) {\r\n renderPromise = this.renderEmptyPlaceholder('group', bubble, message, elements);\r\n } else if(this.chat.type === 'scheduled') {\r\n renderPromise = this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\r\n } else if(rootScope.myId === this.peerId) {\r\n renderPromise = this.renderEmptyPlaceholder('saved', bubble, message, elements);\r\n } else if(this.peerId.isUser() && !isBot && await m(this.chat.canSend()) && this.chat.type === 'chat') {\r\n renderPromise = this.renderEmptyPlaceholder('greeting', bubble, message, elements);\r\n } else {\r\n renderPromise = this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\r\n }\r\n\r\n if(renderPromise) {\r\n await renderPromise;\r\n }\r\n\r\n if(elements.length) {\r\n const messageDiv = bubble.querySelector('.message, .service-msg');\r\n messageDiv.prepend(...elements);\r\n }\r\n\r\n const isWaitingForAnimation = !!this.messagesQueueOnRenderAdditional;\r\n const noTransition = this.setPeerCached && !isWaitingForAnimation;\r\n if(noTransition) {\r\n const setOn = bubble.firstElementChild;\r\n setOn.classList.add('no-transition');\r\n\r\n if(this.chat.setPeerPromise) {\r\n this.chat.setPeerPromise.catch(noop).finally(() => {\r\n setOn.classList.remove('no-transition');\r\n });\r\n }\r\n }\r\n\r\n if(animate === undefined && !noTransition) {\r\n animate = true;\r\n }\r\n\r\n if(isWaitingForAnimation || animate) {\r\n this.updatePlaceholderPosition = updatePosition;\r\n\r\n this.onAnimateLadder = () => {\r\n // appendTo[method](bubble);\r\n this.onAnimateLadder = undefined;\r\n\r\n // need raf here because animation won't fire if this message is single\r\n if(!this.messagesQueuePromise) {\r\n return fastRafPromise();\r\n }\r\n };\r\n } else if(this.chat.setPeerPromise) {\r\n this.attachPlaceholderOnRender = () => {\r\n this.attachPlaceholderOnRender = undefined;\r\n updatePosition();\r\n // appendTo[method](bubble);\r\n };\r\n } else {\r\n this.updatePlaceholderPosition = updatePosition;\r\n // appendTo[method](bubble);\r\n }\r\n\r\n if(!isWaitingForAnimation && animate) {\r\n await m(getHeavyAnimationPromise());\r\n const additionMsgIds = getObjectKeysAndSort(this.bubbles);\r\n indexOfAndSplice(additionMsgIds, message.mid);\r\n this.animateAsLadder(message.mid, additionMsgIds, false, 0, 0);\r\n }\r\n\r\n bubble.middlewareHelper.onDestroy(() => {\r\n if(this.emptyPlaceholderBubble === bubble) {\r\n this.emptyPlaceholderBubble = undefined;\r\n }\r\n });\r\n\r\n this.emptyPlaceholderBubble = bubble;\r\n\r\n return result;\r\n };\r\n\r\n return this.safeRenderMessage(\r\n message,\r\n !isSponsored,\r\n undefined,\r\n false,\r\n p\r\n );\r\n }\r\n\r\n private generateLocalMessageId(addOffset = 0) {\r\n // const INCREMENT = 0x10;\r\n const offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\r\n // offset = generateMessageId(offset);\r\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\r\n const id = -Math.abs(offset);\r\n const mid = -Math.abs(generateMessageId(id));\r\n return {id, mid};\r\n }\r\n\r\n private async generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): Promise> {\r\n const {id, mid} = this.generateLocalMessageId(addOffset);\r\n let message: Omit & {message?: string} = {\r\n _: service ? 'messageService' : 'message',\r\n date: 0,\r\n id,\r\n mid,\r\n peer_id: await this.managers.appPeersManager.getOutputPeer(this.peerId),\r\n pFlags: {\r\n local: true\r\n }\r\n };\r\n\r\n if(!service) {\r\n message.message = '';\r\n }/* else {\r\n (message as Message.messageService).action = {} as any;\r\n } */\r\n\r\n assumeType>(message);\r\n\r\n fill && fill(message);\r\n\r\n const savedMessages = await this.managers.appMessagesManager.saveMessages([message], {storage: new Map() as any});\r\n message = savedMessages[0];\r\n message.mid = mid;\r\n return message as any;\r\n }\r\n\r\n public getViewportSlice() {\r\n // this.log.trace('viewport slice');\r\n return getViewportSlice({\r\n overflowElement: this.scrollable.container,\r\n selector: '.bubbles-date-group .bubble:not(.is-date)',\r\n extraSize: Math.max(700, windowSize.height) * 2\r\n });\r\n }\r\n\r\n public deleteViewportSlice(slice: ReturnType, ignoreScrollSaving?: boolean) {\r\n if(DO_NOT_SLICE_VIEWPORT_ON_RENDER) {\r\n return;\r\n }\r\n\r\n const {invisibleTop, invisibleBottom} = slice;\r\n const invisible = invisibleTop.concat(invisibleBottom);\r\n if(!invisible.length) {\r\n return;\r\n }\r\n\r\n if(invisibleTop.length) {\r\n this.setLoaded('top', false);\r\n this.getHistoryTopPromise = undefined;\r\n }\r\n\r\n if(invisibleBottom.length) {\r\n this.setLoaded('bottom', false);\r\n this.getHistoryBottomPromise = undefined;\r\n }\r\n\r\n const mids = invisible.map(({element}) => +element.dataset.mid);\r\n\r\n let scrollSaver: ScrollSaver;\r\n if(/* !!invisibleTop.length !== !!invisibleBottom.length && */!ignoreScrollSaving) {\r\n scrollSaver = this.createScrollSaver(!!invisibleTop.length);\r\n scrollSaver.save();\r\n }\r\n\r\n this.deleteMessagesByIds(mids, false, true);\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n } else if(invisibleTop.length) {\r\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\r\n }\r\n }\r\n\r\n public sliceViewport(ignoreHeavyAnimation?: boolean) {\r\n // Safari cannot reset the scroll.\r\n if(IS_SAFARI || (this.isHeavyAnimationInProgress && !ignoreHeavyAnimation) || DO_NOT_SLICE_VIEWPORT) {\r\n return;\r\n }\r\n\r\n // const scrollSaver = new ScrollSaver(this.scrollable, true);\r\n // scrollSaver.save();\r\n const slice = this.getViewportSlice();\r\n // if(IS_SAFARI) slice.invisibleTop = [];\r\n this.deleteViewportSlice(slice);\r\n // scrollSaver.restore();\r\n }\r\n\r\n private async setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\r\n const willChange = this.scrollable.loadedAll[side] !== value;\r\n if(!willChange) {\r\n return;\r\n }\r\n\r\n const log = this.log.bindPrefix('setLoaded');\r\n log('change', side, value);\r\n\r\n this.scrollable.loadedAll[side] = value;\r\n this.scrollable.onScroll(); // ! WARNING\r\n // return;\r\n\r\n if(!checkPlaceholders) {\r\n return;\r\n }\r\n\r\n if(!this.chat.isRestricted) {\r\n if(side === 'bottom' && this.chat.isBroadcast/* && false */) {\r\n this.toggleSponsoredMessage(value);\r\n }\r\n\r\n if(side === 'top' && value && this.chat.isBot) {\r\n return this.renderBotPlaceholder();\r\n }\r\n }\r\n\r\n return this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n private async toggleSponsoredMessage(value: boolean) {\r\n const log = this.log.bindPrefix('sponsored');\r\n log('checking');\r\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\r\n if(value) {\r\n const middleware = this.getMiddleware(() => {\r\n return this.scrollable.loadedAll.bottom && this.getSponsoredMessagePromise === promise;\r\n });\r\n\r\n const promise = this.getSponsoredMessagePromise = this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId())\r\n .then(async(sponsoredMessages) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const sponsoredMessage = sponsoredMessages.messages[0];\r\n if(!sponsoredMessage) {\r\n log('no message');\r\n return;\r\n }\r\n\r\n const messagePromise = this.generateLocalFirstMessage(false, (message) => {\r\n message.message = sponsoredMessage.message;\r\n message.from_id = sponsoredMessage.from_id;\r\n message.entities = sponsoredMessage.entities;\r\n message.pFlags.sponsored = true;\r\n message.sponsoredMessage = sponsoredMessage;\r\n }, SPONSORED_MESSAGE_ID_OFFSET);\r\n\r\n return Promise.all([\r\n messagePromise,\r\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\r\n this.messagesQueuePromise\r\n ]).then(([message]) => {\r\n if(!middleware()) return;\r\n // this.processLocalMessageRender(message);\r\n log('rendering', message);\r\n return this.performHistoryResult({history: [message]}, false);\r\n });\r\n }).finally(() => {\r\n if(this.getSponsoredMessagePromise === promise) {\r\n this.getSponsoredMessagePromise = undefined;\r\n }\r\n });\r\n } else {\r\n log('clearing rendered', mid);\r\n this.getSponsoredMessagePromise = undefined;\r\n this.deleteMessagesByIds([mid]);\r\n }\r\n }\r\n\r\n private async renderBotPlaceholder() {\r\n const _log = this.log.bindPrefix('bot placeholder');\r\n\r\n const middleware = this.getMiddleware();\r\n const result = await this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());\r\n _log('getting profile, cached:', result.cached);\r\n const processPromise = result.result.then(async(userFull) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!userFull.bot_info?.description) {\r\n _log.warn('no description');\r\n return this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n const message = await this.generateLocalFirstMessage(false, (message) => {\r\n const botInfo = userFull.bot_info;\r\n message.message = botInfo.description;\r\n if(botInfo.description_document) message.media = {_: 'messageMediaDocument', document: botInfo.description_document};\r\n if(botInfo.description_photo) message.media = {_: 'messageMediaPhoto', photo: botInfo.description_photo};\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n _log('rendering');\r\n const renderPromise = this.processLocalMessageRender(message, !result.cached).then(() => {\r\n _log('done');\r\n });\r\n\r\n return {renderPromise};\r\n });\r\n\r\n if(!result.cached) {\r\n return;\r\n }\r\n\r\n return processPromise;\r\n }\r\n\r\n public async checkIfEmptyPlaceholderNeeded() {\r\n if(this.scrollable.loadedAll.top &&\r\n this.scrollable.loadedAll.bottom &&\r\n this.emptyPlaceholderBubble === undefined &&\r\n (\r\n this.chat.isRestricted ||\r\n !(await this.chat.getHistoryStorage()).count ||\r\n (\r\n // !Object.keys(this.bubbles).length ||\r\n // ! WARNING ! ! ! ! ! ! REPLACE LINE ABOVE WITH THESE\r\n Object.keys(this.bubbles).length &&\r\n !this.getRenderedLength()\r\n ) ||\r\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\r\n )\r\n ) {\r\n this.log('inject empty peer placeholder');\r\n\r\n const message = await this.generateLocalFirstMessage(true);\r\n return {renderPromise: this.processLocalMessageRender(message)};\r\n }\r\n }\r\n\r\n public getHistory1(maxId?: number, reverse?: boolean, isBackLimit?: boolean, additionMsgId?: number, justLoad?: boolean) {\r\n const middleware = this.getMiddleware(justLoad ? undefined : () => {\r\n return (reverse ? this.getHistoryTopPromise : this.getHistoryBottomPromise) === waitPromise;\r\n });\r\n\r\n const result = this.getHistory(maxId, reverse, isBackLimit, additionMsgId, justLoad, middleware);\r\n const waitPromise = result.then((res) => res && (res.waitPromise || res.promise));\r\n\r\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\r\n waitPromise.then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\r\n\r\n if(!justLoad) {\r\n // preload more\r\n // if(!isFirstMessageRender) {\r\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\r\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\r\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\r\n setTimeout(() => {\r\n if(reverse) {\r\n this.loadMoreHistory(true, true);\r\n } else {\r\n this.loadMoreHistory(false, true);\r\n }\r\n }, 0);\r\n // }\r\n }\r\n // }\r\n\r\n // this.scrollable.onScroll();\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Load and render history\r\n * @param maxId max message id\r\n * @param reverse 'true' means up\r\n * @param isBackLimit is search\r\n * @param additionMsgId for the last message\r\n * @param justLoad do not render\r\n */\r\n public async getHistory(\r\n maxId = 0,\r\n reverse = false,\r\n isBackLimit = false,\r\n additionMsgId = 0,\r\n justLoad = false,\r\n middleware?: () => boolean\r\n ): Promise<{cached: boolean, promise: Promise, waitPromise: Promise}> {\r\n const peerId = this.peerId;\r\n\r\n const isBroadcast = this.chat.isBroadcast;\r\n // console.time('appImManager call getHistory');\r\n const pageCount = Math.min(30, windowSize.height / 40/* * 1.25 */ | 0);\r\n // const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\r\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\r\n // const realLoadCount = pageCount;//const realLoadCount = 50;\r\n let loadCount = realLoadCount;\r\n\r\n /* if(TEST_SCROLL) {\r\n //loadCount = 1;\r\n if(Object.keys(this.bubbles).length > 0)\r\n return {cached: false, promise: Promise.resolve(true)};\r\n } */\r\n if(TEST_SCROLL !== undefined) {\r\n if(TEST_SCROLL) {\r\n if(Object.keys(this.bubbles).length > 0) {\r\n --TEST_SCROLL;\r\n }\r\n } else {\r\n return {cached: false, promise: Promise.resolve(), waitPromise: Promise.resolve()};\r\n }\r\n }\r\n\r\n // //console.time('render history total');\r\n\r\n let backLimit = 0;\r\n if(isBackLimit) {\r\n backLimit = loadCount;\r\n\r\n if(!reverse) { // if not jump\r\n loadCount = 0;\r\n // maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\r\n }\r\n }\r\n\r\n let additionMsgIds: number[];\r\n if(additionMsgId && !isBackLimit) {\r\n if(this.chat.type === 'pinned') {\r\n additionMsgIds = [additionMsgId];\r\n } else {\r\n const historyStorage = await this.chat.getHistoryStorage();\r\n const slice = historyStorage.history.slice;\r\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\r\n additionMsgIds = slice.slice();\r\n\r\n // * filter last album, because we don't know is it the last item\r\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\r\n const message = await this.chat.getMessage(additionMsgIds[i]);\r\n if((message as Message.message)?.grouped_id) additionMsgIds.splice(i, 1);\r\n else break;\r\n }\r\n\r\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\r\n }\r\n }\r\n }\r\n\r\n /* const result = additionMsgID ?\r\n {history: [additionMsgID]} :\r\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\r\n let result: AckedResult = await this.requestHistory(maxId, loadCount, backLimit) as any;\r\n let resultPromise: typeof result['result'];\r\n\r\n // const isFirstMessageRender = !!additionMsgID && result.cached && !appMessagesManager.getMessage(additionMsgID).grouped_id;\r\n const isAdditionRender = additionMsgIds?.length && !result.cached;\r\n const isFirstMessageRender = (this.isFirstLoad && backLimit && !result.cached) || isAdditionRender;\r\n if(isAdditionRender) {\r\n resultPromise = result.result;\r\n\r\n result = {\r\n cached: true,\r\n result: Promise.resolve({history: additionMsgIds})\r\n };\r\n\r\n // additionMsgID = 0;\r\n }\r\n\r\n this.isFirstLoad = false;\r\n\r\n const processResult = async(historyResult: Awaited) => {\r\n if((historyResult as HistoryResult).isEnd?.top) {\r\n if(this.chat.type === 'discussion') { // * inject discussion start\r\n const serviceStartMessageId = await this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId, this.chat.threadId);\r\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\r\n const mids = await this.chat.getMidsByMid(this.chat.threadId);\r\n historyResult.history.push(...mids.reverse());\r\n }\r\n\r\n // synchronize bot placeholder appearance\r\n await this.managers.appProfileManager.getProfileByPeerId(peerId);\r\n\r\n // await this.setLoaded('top', true);\r\n }\r\n };\r\n\r\n const sup = (historyResult: Awaited) => {\r\n return getHeavyAnimationPromise().then(() => {\r\n return processResult(historyResult);\r\n }).then(() => {\r\n if(!isAdditionRender && additionMsgId) {\r\n historyResult.history.unshift(additionMsgId);\r\n }\r\n\r\n return this.performHistoryResult(historyResult, reverse);\r\n });\r\n };\r\n\r\n const processPromise = (_promise: typeof result['result']) => {\r\n const promise = Promise.resolve(_promise).then((result) => {\r\n if(middleware && !middleware()) {\r\n throw PEER_CHANGED_ERROR;\r\n }\r\n\r\n if(justLoad) {\r\n // нужно делать из-за ранней прогрузки\r\n this.scrollable.onScroll();\r\n // fastRaf(() => {\r\n // this.scrollable.checkForTriggers();\r\n // });\r\n return;\r\n }\r\n\r\n return sup(result);\r\n }, (err) => {\r\n this.log.error('getHistory error:', err);\r\n throw err;\r\n });\r\n\r\n return promise;\r\n };\r\n\r\n let promise: Promise, cached: boolean;\r\n if(!result.cached) {\r\n cached = false;\r\n promise = processPromise(result.result);\r\n } else if(justLoad) {\r\n // нужно делать из-за ранней прогрузки\r\n this.scrollable.onScroll();\r\n return null;\r\n } else {\r\n cached = true;\r\n promise = sup(await result.result);\r\n }\r\n\r\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\r\n\r\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\r\n let times = isAdditionRender ? 2 : 1;\r\n this.messagesQueueOnRenderAdditional = () => {\r\n this.log('messagesQueueOnRenderAdditional');\r\n\r\n if(--times) return;\r\n\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n\r\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n promise.then(() => {\r\n setTimeout(() => { // preload messages\r\n this.loadMoreHistory(reverse, true);\r\n }, 0);\r\n });\r\n };\r\n } else {\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n }\r\n\r\n if(justLoad) {\r\n return null;\r\n }\r\n\r\n return {cached, promise, waitPromise};\r\n }\r\n\r\n public async setUnreadDelimiter() {\r\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\r\n return;\r\n }\r\n\r\n if(this.attachedUnreadBubble) {\r\n return;\r\n }\r\n\r\n const historyMaxId = await this.chat.getHistoryMaxId();\r\n let readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\r\n if(!readMaxId) return;\r\n\r\n readMaxId = Object.keys(this.bubbles)\r\n .filter((mid) => !this.bubbles[mid].classList.contains('is-out'))\r\n .map((i) => +i)\r\n .sort((a, b) => a - b)\r\n .find((i) => i > readMaxId);\r\n\r\n if(readMaxId && this.bubbles[readMaxId]) {\r\n const bubble = this.bubbles[readMaxId];\r\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\r\n this.firstUnreadBubble.classList.remove('is-first-unread');\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n if(readMaxId !== historyMaxId) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n this.firstUnreadBubble = bubble;\r\n this.attachedUnreadBubble = true;\r\n }\r\n }\r\n\r\n public deleteEmptyDateGroups() {\r\n const mustBeCount = this.stickyIntersector ? STICKY_OFFSET : 1;\r\n let deleted = false;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n\r\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\r\n dateMessage.container.remove();\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\r\n }\r\n delete this.dateMessages[i];\r\n deleted = true;\r\n\r\n // * no sense in it\r\n /* if(dateMessage.div === this.previousStickyDate) {\r\n this.previousStickyDate = undefined;\r\n } */\r\n }\r\n }\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n if(!Object.keys(this.dateMessages).length) {\r\n this.container.classList.remove('has-groups');\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n this.setStickyDateManually();\r\n }\r\n}\r\n\r\nexport function generateTail() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\r\n svg.setAttributeNS(null, 'width', '11');\r\n svg.setAttributeNS(null, 'height', '20');\r\n svg.classList.add('bubble-tail');\r\n\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#message-tail-filled');\r\n\r\n svg.append(use);\r\n\r\n return svg;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {copyTextToClipboard} from '../clipboard';\n// import SelectionSaver from \"../selectionSaver\";\n// import selectElementContents from \"./selectElementContents\";\n\nexport default function copyFromElement(element: HTMLElement) {\n copyTextToClipboard(element.textContent);\n // const saver = new SelectionSaver();\n // saver.save();\n // selectElementContents(element);\n // document.execCommand('copy');\n // saver.restore();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport {Message} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapDocument from './document';\n\nexport default async function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch, sizeType, managers, fontWeight, fontSize, richTextFragment}: {\n albumMustBeRenderedFull: boolean,\n message: any,\n messageDiv: HTMLElement,\n bubble: HTMLElement,\n uploading?: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n searchContext?: MediaSearchContext,\n useSearch?: boolean,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n fontWeight?: number,\n fontSize?: number,\n richTextFragment?: DocumentFragment\n}) {\n let nameContainer: HTMLElement;\n const mids = albumMustBeRenderedFull ? await chat.getMidsByMid(message.mid) : [message.mid];\n /* if(isPending) {\n mids.reverse();\n } */\n\n const promises = mids.map(async(mid, idx) => {\n const message = (await chat.getMessage(mid)) as Message.message;\n const div = await wrapDocument({\n message,\n loadPromises,\n autoDownloadSize,\n lazyLoadQueue,\n searchContext,\n sizeType,\n managers,\n fontWeight,\n fontSize\n });\n\n const container = document.createElement('div');\n container.classList.add('document-container');\n container.dataset.mid = '' + mid;\n container.dataset.peerId = '' + message.peerId;\n\n const wrapper = document.createElement('div');\n wrapper.classList.add('document-wrapper');\n\n if(message.message) {\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('document-message');\n\n setInnerHTML(messageDiv, richTextFragment);\n wrapper.append(messageDiv);\n }\n\n if(mids.length > 1) {\n const selection = document.createElement('div');\n selection.classList.add('document-selection');\n container.append(selection);\n\n container.classList.add('grouped-item');\n\n if(idx === 0) {\n nameContainer = wrapper;\n }\n }\n\n wrapper.append(div);\n container.append(wrapper);\n return container;\n });\n\n const containers = await Promise.all(promises);\n messageDiv.append(...containers);\n\n if(mids.length > 1) {\n bubble.classList.add('is-multiple-documents', 'is-grouped');\n }\n\n return nameContainer;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport PollElement from '../poll';\n\nexport default function wrapPoll(message: any, managers: AppManagers = rootScope.managers) {\n const elem = new PollElement();\n elem.message = message;\n elem.managers = managers;\n elem.setAttribute('peer-id', '' + message.peerId);\n elem.setAttribute('poll-id', message.media.poll.id);\n elem.setAttribute('message-id', '' + message.mid);\n elem.render();\n return elem;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport rootScope from '../../lib/rootScope';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport PeerTitle from '../peerTitle';\n\nexport default class PopupPinMessage {\n constructor(private peerId: PeerId, private mid: number, private unpin?: true, private onConfirm?: () => void) {\n this.construct();\n }\n\n private async construct() {\n const {peerId, mid, unpin, onConfirm} = this;\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments;\n const buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const managers = PopupElement.MANAGERS;\n\n const canUnpin = await managers.appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = managers.appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = managers.appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = managers.appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + ((await managers.appMessagesManager.getPinnedMessagesCount(peerId)) || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n\n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n\n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(await managers.appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n\n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [new PeerTitle({peerId}).element],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function isSelectionEmpty(selection = window.getSelection()) {\r\n if(!selection?.rangeCount) {\r\n return true;\r\n }\r\n\r\n const selectionRange = selection.getRangeAt(0);\r\n if(selectionRange.collapsed || !selectionRange.START_TO_END) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport rootScope from '../lib/rootScope';\nimport {getEmojiToneIndex} from '../vendor/emoji';\nimport mediaSizes from './mediaSizes';\nimport {saveLottiePreview} from './saveLottiePreview';\n\nexport default function preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n return rootScope.managers.appStickersManager.preloadAnimatedEmojiSticker(emoji).then(({doc}) => {\n if(!doc) {\n return;\n }\n\n return appDownloadManager.downloadMedia({media: doc})\n .then(async(blob) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: blob,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false,\n toneIndex\n }, 'none');\n\n animation.addEventListener('firstFrame', () => {\n saveLottiePreview(doc, animation.canvas[0], toneIndex);\n animation.remove();\n }, {once: true});\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ReportReason} from '../../layer';\nimport InputField from '../inputField';\nimport {toastNew} from '../toast';\nimport wrapStickerEmoji from '../wrappers/stickerEmoji';\nimport PopupPeer from './peer';\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true,\n descriptionLangKey: 'ReportInfo',\n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n this.managers.appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then((bool) => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }],\n body: true\n });\n\n const div = document.createElement('div');\n const size = 100;\n wrapStickerEmoji({\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size\n }).then(({render}) => render).finally(() => {\n this.show();\n });\n\n this.header.append(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport whichChild from '../../helpers/dom/whichChild';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {ReportReason} from '../../layer';\nimport {LangPackKey} from '../../lib/langPack';\nimport Button from '../button';\nimport PopupPeer from './peer';\nimport PopupReportMessagesConfirm from './reportMessagesConfirm';\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther'],\n ['ReportChatPersonalDetails', 'inputReportReasonPersonalDetails'],\n ['ReportChatIllegalDrugs', 'inputReportReasonIllegalDrugs']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach((b) => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n\n // this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, {i18n} from '../../lib/langPack';\nimport 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 scrollable: true\n });\n\n this.scrollable.append(this.description);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport {Message, Reaction} from '../../layer';\nimport {SettingSection} from '../sidebarLeft';\nimport ReactionsElement from '../chat/reactions';\nimport {horizontalMenu} from '../horizontalMenu';\nimport Scrollable from '../scrollable';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport appDialogsManager from '../../lib/appManagers/appDialogsManager';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapSticker from '../wrappers/sticker';\nimport ReactionElement from '../chat/reaction';\nimport getUserStatusString from '../wrappers/getUserStatusString';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\n\nexport default class PopupReactedList extends PopupElement {\n constructor(\n private message: Message.message\n ) {\n super('popup-reacted-list', {closable: true, overlayClosable: true, body: true});\n\n this.init();\n }\n\n private async init() {\n const middleware = this.middlewareHelper.get();\n const message = await this.managers.appMessagesManager.getGroupsFirstMessage(this.message);\n if(!middleware()) return;\n const canViewReadParticipants = await this.managers.appMessagesManager.canViewMessageReadParticipants(message);\n if(!middleware()) return;\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 chosen_order: undefined,\n pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block', this.middlewareHelper.get());\n reactionsElement.render();\n reactionsElement.classList.add('no-stripe');\n reactionsElement.classList.remove('has-no-reactions');\n\n reactionsElement.append(this.btnClose);\n\n this.header.append(reactionsElement);\n\n const tabsContainer = document.createElement('div');\n tabsContainer.classList.add('tabs-container');\n tabsContainer.dataset.animation = 'tabs';\n\n const loaders: Map = new Map();\n\n let hasAllReactions = false;\n if(newMessage.reactions.results.length) {\n const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0));\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasAllReactions = true;\n }\n\n let hasReadParticipants = false;\n if(canViewReadParticipants) {\n try {\n const readUserIds = await this.managers.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid);\n if(!middleware()) return;\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 as any) !== 'checks';\n const skipReactionsList = (reactionCount.reaction as any) === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction as any)) {\n reactionCount.reaction = undefined;\n }\n\n const size = 24;\n const mediaSize = makeMediaSize(size, size);\n\n let nextOffset: string;\n const loader = new ScrollableLoader({\n scrollable,\n getPromise: async() => {\n const result = await this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList);\n nextOffset = result.nextOffset;\n\n await Promise.all(result.combined.map(async({peerId, reaction}) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n autonomous: true,\n container: chatlist,\n avatarSize: 'abitbigger',\n rippleEnabled: false,\n meAsSaved: false\n });\n\n if(reaction) {\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add('reacted-list-reaction-icon');\n\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = await this.managers.appReactionsManager.getReactionCached(reaction.emoticon);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24,\n middleware\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n stickerContainer.append(wrapCustomEmoji({\n docIds: [reaction.document_id],\n size: mediaSize,\n middleware\n }));\n }\n\n dom.listEl.append(stickerContainer);\n }\n\n replaceContent(dom.lastMessageSpan, getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())));\n }));\n\n return !nextOffset;\n }\n });\n\n loaders.set(scrollable.container, loader);\n\n tabsContainer.append(scrollable.container);\n });\n\n this.body.append(tabsContainer);\n\n const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => {\n if(id === (reactionsElement.childElementCount - 1)) {\n return false;\n }\n\n const reaction = reactionsElement.children[id] as ReactionElement;\n const prevId = selectTab.prevId();\n if(prevId !== -1) {\n (reactionsElement.children[prevId] as ReactionElement).setIsChosen(false);\n }\n\n reaction.setIsChosen(true);\n\n const loader = loaders.get(tabContent);\n loader.load();\n }, undefined, undefined, undefined, this.listenerSetter);\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', this.middlewareHelper.get());\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon as any\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, Reaction} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport Scrollable, {ScrollableBase, ScrollableX} from '../scrollable';\nimport wrapSticker from '../wrappers/sticker';\n\nconst REACTIONS_CLASS_NAME = 'btn-menu-reactions';\nconst REACTION_CLASS_NAME = REACTIONS_CLASS_NAME + '-reaction';\n\nconst REACTION_SIZE = 26;\nconst PADDING = 4;\nexport const REACTION_CONTAINER_SIZE = REACTION_SIZE + PADDING * 2;\n\nconst CAN_USE_TRANSFORM = !IS_SAFARI;\n\ntype ChatReactionsMenuPlayers = {\n select?: RLottiePlayer,\n appear?: RLottiePlayer,\n selectWrapper: HTMLElement,\n appearWrapper: HTMLElement,\n reaction: Reaction\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n public container: HTMLElement;\n private reactionsMap: Map;\n public scrollable: ScrollableBase;\n private animationGroup: AnimationItemGroup;\n private middleware: ReturnType;\n private message: Message.message;\n\n constructor(\n private managers: AppManagers,\n private type: 'horizontal' | 'vertical',\n middleware: ChatReactionsMenu['middleware']\n ) {\n const widthContainer = this.widthContainer = document.createElement('div');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container-' + type);\n\n const reactionsContainer = this.container = document.createElement('div');\n reactionsContainer.classList.add(REACTIONS_CLASS_NAME);\n\n const reactionsScrollable = this.scrollable = type === 'vertical' ? new Scrollable(undefined) : new ScrollableX(undefined);\n reactionsContainer.append(reactionsScrollable.container);\n reactionsScrollable.onAdditionalScroll = this.onScroll;\n reactionsScrollable.setListeners();\n\n reactionsScrollable.container.classList.add('no-scrollbar');\n\n // ['big'].forEach((type) => {\n // const bubble = document.createElement('div');\n // bubble.classList.add(REACTIONS_CLASS_NAME + '-bubble', REACTIONS_CLASS_NAME + '-bubble-' + type);\n // reactionsContainer.append(bubble);\n // });\n\n this.reactionsMap = new Map();\n this.animationGroup = `CHAT-MENU-REACTIONS-${Date.now()}`;\n animationIntersector.setOverrideIdleGroup(this.animationGroup, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n reactionsContainer.addEventListener('mousemove', this.onMouseMove);\n }\n\n attachClickEvent(reactionsContainer, (e) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) return;\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) return;\n\n this.managers.appReactionsManager.sendReaction(this.message, players.reaction);\n });\n\n widthContainer.append(reactionsContainer);\n\n this.middleware = middleware ?? getMiddleware();\n }\n\n public init(message: Message.message) {\n this.message = message;\n\n const middleware = this.middleware.get();\n // const result = Promise.resolve(this.appReactionsManager.getAvailableReactionsForPeer(message.peerId)).then((res) => pause(1000).then(() => res));\n const result = this.managers.appReactionsManager.getAvailableReactionsByMessage(message);\n callbackify(result, (reactions) => {\n if(!middleware() || !reactions.length) return;\n reactions.forEach((reaction) => {\n if(reaction.pFlags.premium && !rootScope.premium) return;\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: {_: 'reactionEmoji', emoticon: reaction.reaction}\n };\n this.reactionsMap.set(reactionDiv, players);\n\n const middleware = this.middleware.get();\n\n const hoverScale = IS_TOUCH_SUPPORTED ? 1 : 1.25;\n const size = REACTION_SIZE * hoverScale;\n\n const options = {\n width: size,\n height: size,\n skipRatio: 1,\n needFadeIn: false,\n withThumb: false,\n group: this.animationGroup,\n middleware\n };\n\n if(!this.canUseAnimations()) {\n delete options.needFadeIn;\n delete options.withThumb;\n\n wrapSticker({\n doc: reaction.static_icon,\n div: appearWrapper,\n ...options\n });\n } else {\n let isFirst = true;\n wrapSticker({\n doc: reaction.appear_animation,\n div: appearWrapper,\n play: true,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n players.appear = player;\n\n player.addEventListener('enterFrame', (frameNo) => {\n if(player.maxFrame === frameNo) {\n selectLoadPromise.then((selectPlayer) => {\n assumeType(selectPlayer);\n appearWrapper.classList.add('hide');\n selectWrapper.classList.remove('hide');\n\n if(isFirst) {\n players.select = selectPlayer;\n isFirst = false;\n }\n }, noop);\n }\n });\n }, noop);\n\n const selectLoadPromise = wrapSticker({\n doc: reaction.select_animation,\n div: selectWrapper,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n return lottieLoader.waitForFirstFrame(player);\n }).catch(noop);\n }\n\n scaleContainer.append(appearWrapper);\n selectWrapper && scaleContainer.append(selectWrapper);\n reactionDiv.append(scaleContainer);\n this.scrollable.append(reactionDiv);\n }\n\n private onScrollProcessItem(div: HTMLElement, players: ChatReactionsMenuPlayers) {\n // return;\n\n const scaleContainer = div.firstElementChild as HTMLElement;\n const visibleRect = getVisibleRect(div, this.scrollable.container);\n let transform: string;\n if(!visibleRect) {\n if(!players.appearWrapper.classList.contains('hide') || !players.appear) {\n return;\n }\n\n if(players.select) {\n players.select.stop();\n }\n\n players.appear.stop();\n players.appear.autoplay = true;\n players.appearWrapper.classList.remove('hide');\n players.selectWrapper.classList.add('hide');\n\n transform = '';\n } else if(visibleRect.overflow.left || visibleRect.overflow.right) {\n const diff = Math.abs(visibleRect.rect.left - visibleRect.rect.right);\n const scale = Math.min(diff ** 2 / REACTION_CONTAINER_SIZE ** 2, 1);\n\n transform = 'scale(' + scale + ')';\n } else {\n transform = '';\n }\n\n if(CAN_USE_TRANSFORM) {\n scaleContainer.style.transform = transform;\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) {\n return;\n }\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) {\n return;\n }\n\n // do not play select animation when appearing\n if(!players.appear?.paused) {\n return;\n }\n\n const player = players.select;\n if(!player) {\n return;\n }\n\n if(player.paused) {\n player.autoplay = true;\n player.restart();\n }\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\r\nimport type Chat from './chat';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport PopupForward from '../popups/forward';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport {copyTextToClipboard} from '../../helpers/clipboard';\r\nimport PopupSendNow from '../popups/sendNow';\r\nimport {toast} from '../toast';\r\nimport I18n, {i18n, LangPackKey} from '../../lib/langPack';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\r\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\r\nimport {Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction, MessageEntity, InputStickerSet, StickerSet, Document, Reaction} from '../../layer';\r\nimport PopupReportMessages from '../popups/reportMessages';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport PopupSponsored from '../popups/sponsored';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport {getMiddleware} from '../../helpers/middleware';\r\nimport PeerTitle from '../peerTitle';\r\nimport StackedAvatars from '../stackedAvatars';\r\nimport {IS_APPLE} from '../../environment/userAgent';\r\nimport PopupReactedList from '../popups/reactedList';\r\nimport {ChatReactionsMenu, REACTION_CONTAINER_SIZE} from './reactionsMenu';\r\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\r\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport positionMenu, {MenuPositionPadding} from '../../helpers/positionMenu';\r\nimport contextMenuController from '../../helpers/contextMenuController';\r\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\r\nimport filterAsync from '../../helpers/array/filterAsync';\r\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\r\nimport {SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\r\nimport {MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\r\nimport filterUnique from '../../helpers/array/filterUnique';\r\nimport replaceContent from '../../helpers/dom/replaceContent';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport PopupStickers from '../popups/stickers';\r\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\r\nimport canSaveMessageMedia from '../../lib/appManagers/utils/messages/canSaveMessageMedia';\r\n\r\nexport default class ChatContextMenu {\r\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise, notDirect?: () => boolean, withSelection?: true, isSponsored?: true, localName?: 'views' | 'emojis'})[];\r\n private element: HTMLElement;\r\n\r\n private isSelectable: boolean;\r\n private isSelected: boolean;\r\n private target: HTMLElement;\r\n private isTargetAGroupedItem: boolean;\r\n private isTextSelected: boolean;\r\n private isAnchorTarget: boolean;\r\n private isUsernameTarget: boolean;\r\n private isSponsored: boolean;\r\n private isOverBubble: boolean;\r\n private peerId: PeerId;\r\n private mid: number;\r\n private message: Message.message | Message.messageService;\r\n private noForwards: boolean;\r\n\r\n private reactionsMenu: ChatReactionsMenu;\r\n private listenerSetter: ListenerSetter;\r\n private attachListenerSetter: ListenerSetter;\r\n\r\n private viewerPeerId: PeerId;\r\n private middleware: ReturnType;\r\n private canOpenReactedList: boolean;\r\n\r\n private emojiInputsPromise: CancellablePromise;\r\n\r\n constructor(\r\n private chat: Chat,\r\n private managers: AppManagers\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n this.attachListenerSetter = new ListenerSetter();\r\n this.middleware = getMiddleware();\r\n }\r\n\r\n public attachTo(element: HTMLElement) {\r\n this.attachListenerSetter.removeAll();\r\n\r\n if(IS_TOUCH_SUPPORTED/* && false */) {\r\n attachClickEvent(element, (e) => {\r\n if(this.chat.selection.isSelecting) {\r\n return;\r\n }\r\n\r\n this.chat.log('touchend', e);\r\n\r\n const badSelectors = [\r\n '.name',\r\n '.peer-title',\r\n '.reply',\r\n '.document',\r\n 'audio-element',\r\n 'avatar-element',\r\n 'a',\r\n '.bubble-beside-button',\r\n 'replies-element',\r\n '[data-saved-from]:not(.bubble)',\r\n 'poll-element',\r\n '.attachment',\r\n '.reply-markup-button'\r\n ];\r\n const good = !(e.target as HTMLElement).closest(badSelectors.join(', '));\r\n if(good) {\r\n cancelEvent(e);\r\n // onContextMenu((e as TouchEvent).changedTouches[0]);\r\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\r\n this.onContextMenu(e);\r\n }\r\n }, {listenerSetter: this.attachListenerSetter});\r\n } else attachContextMenuListener(element, this.onContextMenu, this.attachListenerSetter);\r\n }\r\n\r\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\r\n let bubble: HTMLElement, contentWrapper: HTMLElement;\r\n\r\n try {\r\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\r\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\r\n } catch(e) {}\r\n\r\n // ! context menu click by date bubble (there is no pointer-events)\r\n if(!bubble || bubble.classList.contains('bubble-first')) return;\r\n\r\n let element = this.element;\r\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\r\n if(element && element.classList.contains('active')) {\r\n return false;\r\n }\r\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\r\n\r\n let mid = +bubble.dataset.mid;\r\n if(!mid) return;\r\n\r\n const r = async() => {\r\n const isSponsored = this.isSponsored = mid < 0;\r\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\r\n this.peerId = this.chat.peerId;\r\n // this.msgID = msgID;\r\n this.target = e.target as HTMLElement;\r\n this.isTextSelected = !isSelectionEmpty();\r\n this.isAnchorTarget = this.target.tagName === 'A' && (\r\n (this.target as HTMLAnchorElement).target === '_blank' ||\r\n this.target.classList.contains('anchor-url')\r\n );\r\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\r\n\r\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\r\n if(this.chat.selection.isSelecting && !contentWrapper) {\r\n if(isSponsored) {\r\n return;\r\n }\r\n\r\n const mids = await this.chat.getMidsByMid(mid);\r\n if(mids.length > 1) {\r\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ?\r\n mid :\r\n mids.find((mid) => this.chat.selection.isMidSelected(this.peerId, mid));\r\n if(selectedMid) {\r\n mid = selectedMid;\r\n }\r\n }\r\n }\r\n\r\n this.isOverBubble = !!contentWrapper;\r\n\r\n const groupedItem = findUpClassName(this.target, 'grouped-item');\r\n this.isTargetAGroupedItem = !!groupedItem;\r\n if(groupedItem) {\r\n this.mid = +groupedItem.dataset.mid;\r\n } else {\r\n this.mid = mid;\r\n }\r\n\r\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\r\n this.message = (bubble as any).message || await this.chat.getMessage(this.mid);\r\n this.noForwards = !isSponsored && !(await this.managers.appMessagesManager.canForward(this.message));\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n\r\n const initResult = await this.init();\r\n if(!initResult) {\r\n return;\r\n }\r\n\r\n element = initResult.element;\r\n const {cleanup, destroy, menuPadding, reactionsMenu, reactionsMenuPosition} = initResult;\r\n let isReactionsMenuVisible = false;\r\n if(reactionsMenu) {\r\n const className = 'is-visible';\r\n isReactionsMenuVisible = reactionsMenu.container.classList.contains(className);\r\n if(isReactionsMenuVisible) reactionsMenu.container.classList.remove(className);\r\n\r\n if(reactionsMenuPosition === 'horizontal') {\r\n const offsetSize = element[/* reactionsMenuPosition === 'vertical' ? 'offsetHeight' : */'offsetWidth'];\r\n // if(reactionsMenu.scrollable.container.scrollWidth > offsetWidth) {\r\n const INNER_CONTAINER_PADDING = 8;\r\n const visibleLength = (offsetSize - INNER_CONTAINER_PADDING) / REACTION_CONTAINER_SIZE;\r\n const nextVisiblePart = visibleLength % 1;\r\n const MIN_NEXT_VISIBLE_PART = 0.65;\r\n if(nextVisiblePart < MIN_NEXT_VISIBLE_PART) {\r\n const minSize = (offsetSize + (MIN_NEXT_VISIBLE_PART - nextVisiblePart) * REACTION_CONTAINER_SIZE) | 0;\r\n element.style[/* reactionsMenuPosition === 'vertical' ? 'minHeight' : */'minWidth'] = minSize + 'px';\r\n }\r\n // }\r\n }\r\n }\r\n\r\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\r\n // bubble.parentElement.append(element);\r\n // appImManager.log('contextmenu', e, bubble, side);\r\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\r\n\r\n if(reactionsMenu) {\r\n reactionsMenu.widthContainer.style.top = element.style.top;\r\n reactionsMenu.widthContainer.style.left = element.style.left;\r\n reactionsMenu.widthContainer.style.setProperty('--menu-width', element[reactionsMenuPosition === 'vertical' ? 'offsetHeight' : 'offsetWidth'] + 'px');\r\n element.parentElement.append(reactionsMenu.widthContainer);\r\n if(isReactionsMenuVisible) void reactionsMenu.container.offsetLeft; // reflow\r\n }\r\n\r\n contextMenuController.openBtnMenu(element, () => {\r\n if(reactionsMenu) {\r\n reactionsMenu.container.classList.remove('is-visible');\r\n }\r\n\r\n this.mid = 0;\r\n this.peerId = undefined;\r\n this.target = null;\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n cleanup();\r\n\r\n setTimeout(() => {\r\n destroy();\r\n }, 300);\r\n });\r\n\r\n if(isReactionsMenuVisible) {\r\n reactionsMenu.container.classList.add('is-visible');\r\n }\r\n };\r\n\r\n r();\r\n };\r\n\r\n public cleanup() {\r\n this.listenerSetter.removeAll();\r\n this.reactionsMenu && this.reactionsMenu.cleanup();\r\n this.middleware.clean();\r\n }\r\n\r\n public destroy() {\r\n this.cleanup();\r\n this.attachListenerSetter.removeAll();\r\n }\r\n\r\n private async filterButtons(buttons: ChatContextMenu['buttons']) {\r\n if(this.isSponsored) {\r\n return buttons.filter((button) => {\r\n return button.isSponsored;\r\n });\r\n } else {\r\n return filterAsync(buttons, async(button) => {\r\n let good: boolean;\r\n\r\n // if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\r\n if(this.chat.selection.isSelecting && !button.withSelection) {\r\n good = false;\r\n } else {\r\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ?\r\n await button.verify() :\r\n button.notDirect && await button.verify() && button.notDirect();\r\n }\r\n\r\n return !!good;\r\n });\r\n }\r\n }\r\n\r\n private setButtons() {\r\n const verifyFavoriteSticker = async(toAdd: boolean) => {\r\n const doc = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document;\r\n if(!(doc as MyDocument)?.sticker) {\r\n return false;\r\n }\r\n\r\n const favedStickers = await this.managers.acknowledged.appStickersManager.getFavedStickersStickers();\r\n if(!favedStickers.cached) {\r\n return false;\r\n }\r\n\r\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\r\n return toAdd ? !found : found;\r\n };\r\n\r\n this.buttons = [{\r\n icon: 'send2',\r\n text: 'MessageScheduleSend',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'send2',\r\n text: 'Message.Context.Selection.SendNow',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'schedule',\r\n text: 'MessageScheduleEditTime',\r\n onClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n assumeType(this.message);\r\n this.managers.appMessagesManager.editMessage(this.message, this.message.message, {\r\n scheduleDate: this.chat.input.scheduleDate,\r\n entities: this.message.entities\r\n });\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }, new Date(this.message.date * 1000));\r\n },\r\n verify: () => this.chat.type === 'scheduled'\r\n }, {\r\n icon: 'reply',\r\n text: 'Reply',\r\n onClick: this.onReplyClick,\r\n verify: async() => await this.chat.canSend() &&\r\n !this.message.pFlags.is_outgoing &&\r\n !!this.chat.input.messageInput &&\r\n this.chat.type !== 'scheduled'/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'favourites',\r\n text: 'AddToFavorites',\r\n onClick: this.onFaveStickerClick.bind(this, false),\r\n verify: () => verifyFavoriteSticker(true)\r\n }, {\r\n icon: 'favourites',\r\n text: 'DeleteFromFavorites',\r\n onClick: this.onFaveStickerClick.bind(this, true),\r\n verify: () => verifyFavoriteSticker(false)\r\n }, {\r\n icon: 'edit',\r\n text: 'Edit',\r\n onClick: this.onEditClick,\r\n verify: async() => (await this.managers.appMessagesManager.canEditMessage(this.message, 'text')) && !!this.chat.input.messageInput\r\n }, {\r\n icon: 'copy',\r\n text: 'Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\r\n }, {\r\n icon: 'copy',\r\n text: 'Chat.CopySelectedText',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\r\n }, {\r\n icon: 'copy',\r\n text: 'Message.Context.Selection.Copy',\r\n onClick: this.onCopyClick,\r\n verify: async() => {\r\n if(!this.isSelected || this.noForwards) {\r\n return false;\r\n }\r\n\r\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\r\n const storageKey: MessagesStorageKey = `${peerId}_${this.chat.type === 'scheduled' ? 'scheduled' : 'history'}`;\r\n for(const mid of mids) {\r\n const message = (await this.managers.appMessagesManager.getMessageFromStorage(storageKey, mid)) as Message.message;\r\n if(!!message.message) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'CopyLink',\r\n onClick: this.onCopyAnchorLinkClick,\r\n verify: () => this.isAnchorTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Username',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.isUsernameTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Hashtag',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.target.classList.contains('anchor-hashtag'),\r\n withSelection: true\r\n }, {\r\n icon: 'link',\r\n text: 'MessageContext.CopyMessageLink1',\r\n onClick: this.onCopyLinkClick,\r\n verify: async() => await this.managers.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'pin',\r\n text: 'Message.Context.Pin',\r\n onClick: this.onPinClick,\r\n verify: async() => !this.message.pFlags.is_outgoing &&\r\n this.message._ !== 'messageService' &&\r\n !this.message.pFlags.pinned &&\r\n await this.managers.appPeersManager.canPinMessage(this.peerId) &&\r\n this.chat.type !== 'scheduled'\r\n }, {\r\n icon: 'unpin',\r\n text: 'Message.Context.Unpin',\r\n onClick: this.onUnpinClick,\r\n verify: async() => (this.message as Message.message).pFlags.pinned && await this.managers.appPeersManager.canPinMessage(this.peerId)\r\n }, {\r\n icon: 'download',\r\n text: 'MediaViewer.Context.Download',\r\n onClick: () => {\r\n appDownloadManager.downloadToDisc({media: getMediaFromMessage(this.message)});\r\n },\r\n verify: () => {\r\n if(!canSaveMessageMedia(this.message) || this.noForwards) {\r\n return false;\r\n }\r\n\r\n const isPhoto: boolean = !!((this.message as Message.message).media as MessageMedia.messageMediaPhoto)?.photo;\r\n let isGoodType = false\r\n\r\n if(isPhoto) {\r\n isGoodType = true;\r\n } else {\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 // isGoodType = doc.type && (['gif', 'video', 'audio', 'voice', 'sticker'] as MyDocument['type'][]).includes(doc.type)\r\n isGoodType = true;\r\n }\r\n\r\n let hasTarget = !!IS_TOUCH_SUPPORTED;\r\n\r\n if(isGoodType) hasTarget ||= !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio') || !!findUpClassName(this.target, 'media-sticker-wrapper') || !!findUpClassName(this.target, 'media-photo') || !!findUpClassName(this.target, 'media-video');\r\n\r\n return isGoodType && hasTarget;\r\n }\r\n }, {\r\n icon: 'checkretract',\r\n text: 'Chat.Poll.Unvote',\r\n onClick: this.onRetractVote,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll as Poll;\r\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'stop',\r\n text: 'Chat.Poll.Stop',\r\n onClick: this.onStopPoll,\r\n verify: async() => {\r\n const poll = (this.message as any).media?.poll;\r\n return await this.managers.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'forward',\r\n text: 'Forward',\r\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\r\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || this.message.fromId === SERVICE_PEER_ID) && this.message._ !== 'messageService'\r\n }, {\r\n icon: 'forward',\r\n text: 'Message.Context.Selection.Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.selection.selectionForwardBtn &&\r\n this.isSelected &&\r\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'flag',\r\n text: 'ReportChat',\r\n onClick: () => {\r\n new PopupReportMessages(this.peerId, [this.mid]);\r\n },\r\n verify: async() => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && await this.managers.appPeersManager.isChannel(this.peerId),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Select',\r\n onClick: this.onSelectClick,\r\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Selection.Clear',\r\n onClick: this.onClearSelectionClick,\r\n verify: () => this.isSelected,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n onClick: () => {\r\n if(this.viewerPeerId) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: this.viewerPeerId\r\n });\r\n } else if(this.canOpenReactedList) {\r\n new PopupReactedList(this.message as Message.message);\r\n } else {\r\n return false;\r\n }\r\n },\r\n verify: async() => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)),\r\n notDirect: () => true,\r\n localName: 'views'\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Delete',\r\n onClick: this.onDeleteClick,\r\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(this.message)\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Message.Context.Selection.Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'info',\r\n text: 'Chat.Message.Sponsored.What',\r\n onClick: () => {\r\n new PopupSponsored();\r\n },\r\n verify: () => false,\r\n isSponsored: true\r\n }, {\r\n // icon: 'smile',\r\n text: 'Loading',\r\n onClick: () => {\r\n this.emojiInputsPromise.then((inputs) => {\r\n new PopupStickers(inputs, true).show();\r\n });\r\n },\r\n verify: () => !!this.getUniqueCustomEmojisFromMessage(this.message).length,\r\n notDirect: () => true,\r\n localName: 'emojis'\r\n }];\r\n }\r\n\r\n private getUniqueCustomEmojisFromMessage(message: Message) {\r\n const docIds: DocId[] = [];\r\n\r\n const entities = (message as Message.message).entities;\r\n if(entities) {\r\n const filtered = entities.filter((entity) => entity._ === 'messageEntityCustomEmoji') as MessageEntity.messageEntityCustomEmoji[];\r\n docIds.push(...filtered.map((entity) => entity.document_id));\r\n }\r\n\r\n const reactions = (message as Message.message).reactions;\r\n if(reactions) {\r\n const results = reactions.results.filter((reactionCount) => reactionCount.reaction._ === 'reactionCustomEmoji');\r\n docIds.push(...results.map((reactionCount) => (reactionCount.reaction as Reaction.reactionCustomEmoji).document_id));\r\n }\r\n\r\n return filterUnique(docIds);\r\n }\r\n\r\n private async init() {\r\n this.cleanup();\r\n this.setButtons();\r\n\r\n const filteredButtons = await this.filterButtons(this.buttons);\r\n if(!filteredButtons.length) {\r\n return;\r\n }\r\n\r\n const element = this.element = ButtonMenu(filteredButtons, this.listenerSetter);\r\n element.id = 'bubble-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n const viewsButton = filteredButtons.find((button) => button.localName === 'views');\r\n if(viewsButton) {\r\n const reactions = (this.message as Message.message).reactions;\r\n const recentReactions = reactions?.recent_reactions;\r\n const isViewingReactions = !!recentReactions?.length;\r\n const participantsCount = await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message) ?\r\n ((await this.managers.appPeersManager.getPeer(this.peerId)) as MTChat.chat).participants_count :\r\n undefined;\r\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\r\n\r\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\r\n const i18nElem = new I18n.IntlElement({\r\n key: isViewingReactions ? (\r\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\r\n ) : 'NobodyViewed',\r\n args: isViewingReactions ? (\r\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\r\n ) : undefined,\r\n element: viewsButton.textElement\r\n });\r\n\r\n let fakeText: HTMLElement;\r\n if(isViewingReactions) {\r\n if(participantsCount === undefined) {\r\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\r\n } else {\r\n fakeText = i18n(\r\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\r\n [recentReactions.length, participantsCount]\r\n );\r\n }\r\n } else {\r\n fakeText = i18n('Loading');\r\n }\r\n\r\n fakeText.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeText);\r\n\r\n const AVATAR_SIZE = 22;\r\n const MAX_AVATARS = 3;\r\n const PADDING_PER_AVATAR = 1.125;\r\n i18nElem.element.style.visibility = 'hidden';\r\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\r\n const middleware = this.middleware.get();\r\n this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(fakeText) {\r\n fakeText.remove();\r\n }\r\n\r\n const reactions = result.combined;\r\n const reactedLength = participantsCount === undefined ?\r\n result.reactionsCount :\r\n (\r\n isViewingReactions ?\r\n reactions.filter((reaction) => reaction.reaction).length :\r\n reactions.length\r\n );\r\n\r\n let fakeElem: HTMLElement;\r\n if(reactions.length === 1) {\r\n fakeElem = new PeerTitle({\r\n peerId: reactions[0].peerId,\r\n onlyFirstName: true,\r\n dialog: false\r\n }).element;\r\n\r\n if(!isViewingReactions || result.readParticipants.length <= 1) {\r\n this.viewerPeerId = reactions[0].peerId;\r\n }\r\n } else if(isViewingReactions) {\r\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\r\n fakeElem = i18n(\r\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\r\n isFull ? [reactedLength] : [reactedLength, reactions.length]\r\n );\r\n } else {\r\n if(!reactions.length) {\r\n i18nElem.element.style.visibility = '';\r\n } else {\r\n fakeElem = i18n('MessageSeen', [reactions.length]);\r\n }\r\n }\r\n\r\n if(fakeElem) {\r\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\r\n fakeElem.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeElem);\r\n }\r\n\r\n if(reactions.length) {\r\n const avatars = new StackedAvatars({avatarSize: AVATAR_SIZE});\r\n avatars.render(recentReactions ? recentReactions.map((r) => getPeerId(r.peer_id)) : reactions.map((reaction) => reaction.peerId));\r\n viewsButton.element.append(avatars.container);\r\n\r\n // if(reactions.length > 1) {\r\n // if(isViewingReactions) {\r\n this.canOpenReactedList = true;\r\n // }\r\n }\r\n });\r\n }\r\n\r\n let menuPadding: MenuPositionPadding;\r\n let reactionsMenu: ChatReactionsMenu;\r\n let reactionsMenuPosition: 'horizontal' | 'vertical';\r\n if(\r\n this.message._ === 'message' &&\r\n !this.chat.selection.isSelecting &&\r\n !this.message.pFlags.is_outgoing &&\r\n !this.message.pFlags.is_scheduled &&\r\n !this.message.pFlags.local\r\n ) {\r\n reactionsMenuPosition = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\r\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.managers, reactionsMenuPosition, this.middleware);\r\n reactionsMenu.init(await this.managers.appMessagesManager.getGroupsFirstMessage(this.message));\r\n // element.prepend(reactionsMenu.widthContainer);\r\n\r\n const size = 36;\r\n const margin = 8;\r\n const totalSize = size + margin;\r\n const paddingLeft = 0, paddingRight = 0;\r\n if(reactionsMenuPosition === 'vertical') {\r\n menuPadding = {\r\n top: paddingLeft,\r\n // bottom: 36, // positionMenu will detect it itself somehow\r\n left: totalSize\r\n };\r\n } else {\r\n menuPadding = {\r\n top: totalSize,\r\n right: paddingRight,\r\n left: paddingLeft\r\n };\r\n }\r\n }\r\n\r\n const emojisButton = filteredButtons.find((button) => button.localName === 'emojis');\r\n if(emojisButton) {\r\n emojisButton.element.classList.add('is-multiline');\r\n emojisButton.element.parentElement.insertBefore(document.createElement('hr'), emojisButton.element);\r\n\r\n const setPadding = () => {\r\n menuPadding ??= {};\r\n menuPadding.bottom = 24;\r\n };\r\n\r\n const docIds = this.getUniqueCustomEmojisFromMessage(this.message);\r\n const inputsPromise = this.emojiInputsPromise = deferredPromise();\r\n\r\n await this.managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then(async(docs) => {\r\n const p = async(docs: Document.document[]) => {\r\n const s: Map = new Map();\r\n docs.forEach((doc) => {\r\n if(!doc || s.has(doc.stickerSetInput.id)) {\r\n return;\r\n }\r\n\r\n s.set(doc.stickerSetInput.id, doc.stickerSetInput);\r\n });\r\n\r\n const inputs = [...s.values()];\r\n inputsPromise.resolve(inputs);\r\n if(s.size === 1) {\r\n const result = await this.managers.acknowledged.appStickersManager.getStickerSet(inputs[0]);\r\n const promise = result.result.then((set) => {\r\n const el = i18n('MessageContainsEmojiPack', [wrapEmojiText(set.set.title)]);\r\n replaceContent(emojisButton.textElement, el);\r\n });\r\n\r\n return result.cached ? promise : (setPadding(), undefined);\r\n }\r\n\r\n replaceContent(emojisButton.textElement, i18n('MessageContainsEmojiPacks', [s.size]));\r\n };\r\n\r\n if(docs.some((doc) => !doc)) {\r\n setPadding();\r\n this.managers.appEmojiManager.getCustomEmojiDocuments(docIds).then(p);\r\n } else {\r\n return p(docs);\r\n }\r\n });\r\n // emojisButton.element.append(i18n('Loading'));\r\n }\r\n\r\n this.chat.container.append(element);\r\n\r\n return {\r\n element,\r\n cleanup: () => {\r\n this.cleanup();\r\n reactionsMenu && reactionsMenu.cleanup();\r\n },\r\n destroy: () => {\r\n element.remove();\r\n reactionsMenu && reactionsMenu.widthContainer.remove();\r\n },\r\n menuPadding,\r\n reactionsMenu,\r\n reactionsMenuPosition\r\n };\r\n }\r\n\r\n private onSendScheduledClick = async() => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\r\n } else {\r\n new PopupSendNow(this.peerId, await this.chat.getMidsByMid(this.mid));\r\n }\r\n };\r\n\r\n private onReplyClick = () => {\r\n this.chat.input.initMessageReply(this.mid);\r\n };\r\n\r\n private onFaveStickerClick = (unfave?: boolean) => {\r\n const docId = ((this.message as Message.message).media as MessageMedia.messageMediaDocument).document.id;\r\n this.managers.appStickersManager.faveSticker(docId, unfave);\r\n };\r\n\r\n private onEditClick = () => {\r\n this.chat.input.initMessageEditing(this.mid);\r\n };\r\n\r\n private onCopyClick = async() => {\r\n if(isSelectionEmpty()) {\r\n const mids = this.chat.selection.isSelecting ?\r\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) :\r\n [this.mid];\r\n\r\n const parts: string[] = await Promise.all(mids.map(async(mid) => {\r\n const message = (await this.chat.getMessage(mid)) as Message.message;\r\n return message?.message ? message.message + '\\n' : '';\r\n }));\r\n\r\n const str = parts.join('');\r\n\r\n copyTextToClipboard(str);\r\n } else {\r\n document.execCommand('copy');\r\n // cancelSelection();\r\n }\r\n };\r\n\r\n private onCopyAnchorLinkClick = () => {\r\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\r\n };\r\n\r\n private onCopyLinkClick = async() => {\r\n let threadMessage: Message.message;\r\n const {peerId, mid} = this;\r\n const threadId = this.chat.threadId;\r\n if(this.chat.type === 'discussion') {\r\n threadMessage = (await this.managers.appMessagesManager.getMessageByPeer(peerId, threadId)) as Message.message;\r\n }\r\n\r\n const username = await this.managers.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : peerId);\r\n const msgId = getServerMessageId(mid);\r\n let url = 'https://t.me/';\r\n let key: LangPackKey;\r\n if(username) {\r\n url += username + '/' + (threadMessage ? getServerMessageId(threadMessage.fwd_from.channel_post) : msgId);\r\n if(threadMessage) url += '?comment=' + msgId;\r\n key = 'LinkCopied';\r\n } else {\r\n url += 'c/' + peerId.toChatId() + '/' + msgId;\r\n if(threadMessage) url += '?thread=' + getServerMessageId(threadMessage.mid);\r\n key = 'LinkCopiedPrivateInfo';\r\n }\r\n\r\n toast(I18n.format(key, true));\r\n\r\n copyTextToClipboard(url);\r\n };\r\n\r\n private onPinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid);\r\n };\r\n\r\n private onUnpinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid, true);\r\n };\r\n\r\n private onRetractVote = () => {\r\n this.managers.appPollsManager.sendVote(this.message as Message.message, []);\r\n };\r\n\r\n private onStopPoll = () => {\r\n this.managers.appPollsManager.stopPoll(this.message as Message.message);\r\n };\r\n\r\n private onForwardClick = async() => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\r\n } else {\r\n const peerId = this.peerId;\r\n const mids = this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid);\r\n new PopupForward({\r\n [peerId]: mids\r\n });\r\n }\r\n };\r\n\r\n private onSelectClick = () => {\r\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\r\n };\r\n\r\n private onClearSelectionClick = () => {\r\n this.chat.selection.cancelSelection();\r\n };\r\n\r\n private onDeleteClick = async() => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\r\n } else {\r\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid), this.chat.type);\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport contextMenuController from '../../helpers/contextMenuController';\r\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport rootScope from '../../lib/rootScope';\r\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\r\n\r\nexport default class SendMenu {\r\n public sendMenu: HTMLDivElement;\r\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\r\n private type: 'schedule' | 'reminder';\r\n\r\n constructor(options: {\r\n onSilentClick: () => void,\r\n onScheduleClick: () => void,\r\n listenerSetter?: ListenerSetter,\r\n openSide: string,\r\n onContextElement: HTMLElement,\r\n onOpen?: () => boolean\r\n }) {\r\n this.sendMenuButtons = [{\r\n icon: 'mute',\r\n text: 'Chat.Send.WithoutSound',\r\n onClick: options.onSilentClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.ScheduledMessage',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.SetReminder',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'reminder'\r\n }];\r\n\r\n this.sendMenu = ButtonMenu(this.sendMenuButtons, options.listenerSetter);\r\n this.sendMenu.classList.add('menu-send', options.openSide);\r\n\r\n attachContextMenuListener(options.onContextElement, (e: any) => {\r\n if(options.onOpen && !options.onOpen()) {\r\n return;\r\n }\r\n\r\n this.sendMenuButtons.forEach((button) => {\r\n button.element.classList.toggle('hide', !button.verify());\r\n });\r\n\r\n cancelEvent(e);\r\n contextMenuController.openBtnMenu(this.sendMenu);\r\n }, options.listenerSetter);\r\n }\r\n\r\n public setPeerId(peerId: PeerId) {\r\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from '../chat/chat';\r\nimport PopupElement from '.';\r\nimport CheckboxField from '../checkboxField';\r\nimport InputField from '../inputField';\r\nimport RadioField from '../radioField';\r\nimport Scrollable from '../scrollable';\r\nimport SendContextMenu from '../chat/sendContextMenu';\r\nimport I18n, {_i18n} from '../../lib/langPack';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport 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\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\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 protected 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', {closable: true, withConfirm: 'Create', body: true, title: 'NewPoll'});\r\n this.construct();\r\n }\r\n\r\n private async construct() {\r\n this.questionInputField = new InputField({\r\n placeholder: 'AskAQuestion',\r\n label: 'AskAQuestion',\r\n name: 'question',\r\n maxLength: MAX_LENGTH_QUESTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n this.optionInputFields = [];\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const sendMenu = new SendContextMenu({\r\n onSilentClick: () => {\r\n this.chat.input.sendSilent = true;\r\n this.send();\r\n },\r\n onScheduleClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n this.send();\r\n });\r\n },\r\n openSide: 'bottom-left',\r\n onContextElement: this.btnConfirm\r\n });\r\n\r\n sendMenu.setPeerId(this.chat.peerId);\r\n\r\n this.header.append(sendMenu.sendMenu);\r\n }\r\n\r\n this.header.append(this.questionInputField.container);\r\n\r\n const hr = document.createElement('hr');\r\n const d = document.createElement('div');\r\n d.classList.add('caption');\r\n _i18n(d, 'PollOptions');\r\n\r\n this.questions = document.createElement('form');\r\n this.questions.classList.add('poll-create-questions');\r\n\r\n const dd = document.createElement('div');\r\n dd.classList.add('poll-create-settings');\r\n\r\n const settingsCaption = document.createElement('div');\r\n settingsCaption.classList.add('caption');\r\n _i18n(settingsCaption, 'Settings');\r\n\r\n if(!(await this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))) {\r\n this.anonymousCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Anonymous',\r\n name: 'anonymous'\r\n });\r\n this.anonymousCheckboxField.input.checked = true;\r\n dd.append(this.anonymousCheckboxField.label);\r\n }\r\n\r\n this.multipleCheckboxField = new CheckboxField({\r\n text: 'NewPoll.MultipleChoice',\r\n name: 'multiple'\r\n });\r\n this.quizCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Quiz',\r\n name: 'quiz'\r\n });\r\n\r\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\r\n const checked = this.multipleCheckboxField.input.checked;\r\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\r\n });\r\n\r\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\r\n const checked = this.quizCheckboxField.input.checked;\r\n\r\n (Array.from(this.questions.children) as HTMLElement[]).map((el) => {\r\n el.classList.toggle('radio-field', checked);\r\n });\r\n\r\n if(!checked) {\r\n this.correctAnswers = undefined;\r\n this.quizSolutionField.setValueSilently('');\r\n }\r\n\r\n quizElements.forEach((el) => el.classList.toggle('hide', !checked));\r\n\r\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\r\n this.handleChange();\r\n });\r\n\r\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\r\n\r\n const quizElements: HTMLElement[] = [];\r\n\r\n const quizSolutionCaption = document.createElement('div');\r\n quizSolutionCaption.classList.add('caption');\r\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\r\n\r\n const quizHr = document.createElement('hr');\r\n\r\n const quizSolutionContainer = document.createElement('div');\r\n quizSolutionContainer.classList.add('poll-create-questions');\r\n\r\n this.quizSolutionField = new InputField({\r\n placeholder: 'NewPoll.Explanation.Placeholder',\r\n label: 'NewPoll.Explanation.Placeholder',\r\n name: 'solution',\r\n maxLength: MAX_LENGTH_SOLUTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n const quizSolutionSubtitle = document.createElement('div');\r\n quizSolutionSubtitle.classList.add('subtitle');\r\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\r\n\r\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\r\n\r\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\r\n quizElements.forEach((el) => el.classList.add('hide'));\r\n\r\n this.body.parentElement.insertBefore(hr, this.body);\r\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\r\n\r\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.scrollable = new Scrollable(this.body);\r\n this.appendMoreField();\r\n\r\n this.onEscape = () => {\r\n return !this.getFilledAnswers().length;\r\n };\r\n\r\n this.handleChange();\r\n }\r\n\r\n private getFilledAnswers() {\r\n const answers = Array.from(this.questions.children).map((el, idx) => {\r\n const input = el.querySelector('.input-field-input') as HTMLElement;\r\n return input instanceof HTMLInputElement ? input.value : getRichValueWithCaret(input, false, 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} = getRichValueWithCaret(this.quizSolutionField.input, false, false);\r\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleChange() {\r\n const valid = this.validate();\r\n this.btnConfirm.toggleAttribute('disabled', !valid);\r\n }\r\n\r\n public async send(force = false) {\r\n const question = this.questionInputField.value;\r\n\r\n const answers = this.getFilledAnswers();\r\n\r\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValueWithCaret(this.quizSolutionField.input, true, false);\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.chat.input.scheduleSending(() => {\r\n this.send(true);\r\n });\r\n\r\n return;\r\n }\r\n\r\n this.hide();\r\n\r\n // const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\r\n // const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\r\n\r\n const pFlags: Poll['pFlags'] = {};\r\n\r\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\r\n pFlags.public_voters = true;\r\n }\r\n\r\n if(this.multipleCheckboxField.input.checked) {\r\n pFlags.multiple_choice = true;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked) {\r\n pFlags.quiz = true;\r\n }\r\n\r\n const poll: Poll = {\r\n _: 'poll',\r\n pFlags,\r\n question,\r\n answers: answers.map((value, idx) => {\r\n return {\r\n _: 'pollAnswer',\r\n text: value,\r\n option: new Uint8Array([idx])\r\n };\r\n }),\r\n id: undefined\r\n };\r\n // poll.id = randomIDS;\r\n\r\n const inputMediaPoll = await this.chat.managers.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\r\n\r\n // console.log('Will try to create poll:', inputMediaPoll);\r\n\r\n this.chat.managers.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\r\n ...this.chat.getMessageSendingParams()\r\n });\r\n\r\n if(this.chat.input.helperType === 'reply') {\r\n this.chat.input.clearHelper();\r\n }\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }\r\n\r\n onInput = (e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n\r\n const radioLabel = findUpTag(target, 'LABEL');\r\n const isEmpty = isInputEmpty(target);\r\n if(!isEmpty) {\r\n target.parentElement.classList.add('is-filled');\r\n radioLabel.classList.remove('hidden-widget');\r\n radioLabel.firstElementChild.removeAttribute('disabled');\r\n }\r\n\r\n const isLast = !radioLabel.nextElementSibling;\r\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\r\n this.appendMoreField();\r\n }\r\n\r\n this.handleChange();\r\n };\r\n\r\n onDeleteClick = (e: MouseEvent) => {\r\n const target = e.target as HTMLSpanElement;\r\n const label = findUpTag(target, 'LABEL');\r\n const idx = whichChild(label);\r\n\r\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\r\n this.correctAnswers = undefined;\r\n }\r\n\r\n label.remove();\r\n this.optionInputFields.splice(idx, 1);\r\n\r\n this.optionInputFields.forEach((inputField, idx) => {\r\n inputField.options.labelOptions.length = 0;\r\n inputField.options.labelOptions.push(idx + 1);\r\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\r\n i18nElement.update();\r\n });\r\n\r\n this.handleChange();\r\n };\r\n\r\n private appendMoreField() {\r\n const tempId = this.tempId++;\r\n const idx = this.questions.childElementCount + 1;\r\n const questionField = new InputField({\r\n placeholder: 'NewPoll.OptionsAddOption',\r\n label: 'NewPoll.OptionLabel',\r\n labelOptions: [idx],\r\n name: 'question-' + tempId,\r\n maxLength: MAX_LENGTH_OPTION\r\n });\r\n this.listenerSetter.add(questionField.input)('input', this.onInput);\r\n\r\n const radioField = new RadioField({\r\n text: '',\r\n name: 'question'\r\n });\r\n radioField.main.append(questionField.container);\r\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\r\n radioField.label.classList.add('hidden-widget');\r\n radioField.input.disabled = true;\r\n if(!this.quizCheckboxField.input.checked) {\r\n radioField.label.classList.remove('radio-field');\r\n }\r\n this.listenerSetter.add(radioField.input)('change', () => {\r\n const checked = radioField.input.checked;\r\n if(checked) {\r\n const idx = whichChild(radioField.label);\r\n this.correctAnswers = [new Uint8Array([idx])];\r\n this.handleChange();\r\n }\r\n });\r\n\r\n const deleteBtn = document.createElement('span');\r\n deleteBtn.classList.add('btn-icon', 'tgico-close');\r\n questionField.container.append(deleteBtn);\r\n\r\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\r\n\r\n this.questions.append(radioField.label);\r\n\r\n this.scrollable.scrollIntoViewNew({\r\n element: this.questions.lastElementChild as HTMLElement,\r\n position: 'center'\r\n });\r\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\r\n\r\n this.optionInputFields.push(questionField);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from './schedulers/pause';\r\nimport {makeMediaSize} from './mediaSize';\r\nimport scaleMediaElement from './canvas/scaleMediaElement';\r\nimport preloadVideo from './preloadVideo';\r\n\r\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\r\n let width: number, height: number;\r\n if(media instanceof HTMLVideoElement) {\r\n width = media.videoWidth;\r\n height = media.videoHeight;\r\n } else {\r\n width = media.naturalWidth;\r\n height = media.naturalHeight;\r\n }\r\n\r\n return scaleMediaElement({\r\n media,\r\n mediaSize: makeMediaSize(width, height),\r\n boxSize: makeMediaSize(320, 240),\r\n quality: .9\r\n });\r\n}\r\n\r\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\r\n return new Promise((resolve, reject) => {\r\n video.onseeked = () => {\r\n video.onseeked = () => {\r\n createPosterFromMedia(video).then(resolve);\r\n\r\n video.onseeked = undefined;\r\n };\r\n\r\n video.currentTime = 0;\r\n };\r\n\r\n video.onerror = reject;\r\n video.currentTime = Math.min(video.duration, 1);\r\n });\r\n}\r\n\r\nexport async function createPosterForVideo(url: string) {\r\n const video = await preloadVideo(url);\r\n\r\n return Promise.race([\r\n pause(2000) as Promise,\r\n createPosterFromVideo(video)\r\n ]);\r\n}\r\n\r\n\r\n","/**\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 CheckboxField from '../checkboxField';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport {createPosterFromMedia, createPosterFromVideo} from '../../helpers/createPoster';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport calcImageInBox from '../../helpers/calcImageInBox';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from '../../helpers/getGifDuration';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport prepareAlbum from '../prepareAlbum';\nimport {MediaSize} from '../../helpers/mediaSize';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport wrapDocument from '../wrappers/document';\n\ntype SendFileParams = Partial<{\n file: File,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n width: number,\n height: number,\n duration: number,\n noSound: boolean,\n itemDiv: HTMLElement\n}>;\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private inputField: InputField;\n private captionLengthMax: number;\n\n constructor(private chat: Chat, private files: File[], willAttachType: PopupNewMedia['willAttach']['type']) {\n super('popup-send-photo popup-new-media', {closable: true, withConfirm: 'Modal.Send', confirmShortcutIsSendShortcut: true, body: true, title: true});\n this.construct(willAttachType);\n }\n\n private async construct(willAttachType: PopupNewMedia['willAttach']['type']) {\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n const config = await this.managers.apiManager.getConfig();\n this.captionLengthMax = config.caption_length_max;\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n\n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: this.captionLengthMax,\n withLinebreaks: true\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.isContentEditable) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n let caption = this.inputField.value;\n if(caption.length > this.captionLengthMax) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n this.hide();\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' ? true : undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n // console.log('will send files with options:', willAttach);\n\n const {peerId, input} = this.chat;\n\n sendFileDetails.forEach((d) => {\n d.itemDiv = undefined;\n });\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileDetails) => {\n if(caption && sendFileDetails.length !== length) {\n this.managers.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const w = {\n ...willAttach,\n sendFileDetails\n };\n\n this.managers.appMessagesManager.sendAlbum(peerId, w.sendFileDetails.map((d) => d.file), Object.assign({\n ...sendingParams,\n caption,\n isMedia: isMedia,\n clearDraft: true as true\n }, w));\n\n caption = undefined;\n });\n\n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n }\n\n private async attachMedia(params: SendFileParams, itemDiv: HTMLElement) {\n itemDiv.classList.add('popup-item-media');\n\n const file = params.file;\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = createVideo();\n const source = document.createElement('source');\n source.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n promise = onMediaLoad(video).then(async() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n\n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n const thumb = await createPosterFromVideo(video);\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n });\n\n video.append(source);\n } else {\n const img = new Image();\n promise = new Promise((resolve) => {\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n\n itemDiv.append(img);\n\n if(file.type === 'image/gif') {\n params.noSound = true;\n\n Promise.all([\n getGifDuration(img).then((duration) => {\n params.duration = Math.ceil(duration);\n }),\n\n createPosterFromMedia(img).then(async(thumb) => {\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {\n resolve();\n });\n } else {\n resolve();\n }\n };\n });\n\n img.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n return promise;\n }\n\n private async attachDocument(params: SendFileParams, itemDiv: HTMLElement): ReturnType {\n itemDiv.classList.add('popup-item-document');\n const file = params.file;\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio || file.size < 20e6) {\n params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n let cacheContext: ThumbCache;\n if(params.objectURL) {\n cacheContext = {\n url: params.objectURL,\n downloaded: file.size,\n type: THUMB_TYPE_FULL\n };\n }\n\n const docDiv = await wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any,\n cacheContext\n });\n\n const promise = new Promise((resolve) => {\n const finish = () => {\n itemDiv.append(docDiv);\n resolve();\n };\n\n if(isPhoto) {\n const img = new Image();\n img.src = params.objectURL;\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n\n finish();\n };\n\n img.onerror = finish;\n } else {\n finish();\n }\n });\n\n return promise;\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const params: SendFileParams = {};\n params.file = file;\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(params, itemDiv) : this.attachDocument(params, itemDiv);\n willAttach.sendFileDetails.push(params);\n return promise;\n };\n\n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach((file) => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter((n) => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else\n\n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(div: HTMLElement, params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n div.style.width = size.width + 'px';\n div.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(div);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach((p) => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n willAttach.sendFileDetails.length = 0;\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n Promise.all(files.map(this.attachFile)).then(() => {\n mediaContainer.innerHTML = '';\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n if(this.shouldCompress(sendFileDetails[0].file.type) && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map((s) => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map((o) => ({w: o.width, h: o.height})),\n maxWidth: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params.itemDiv, params);\n });\n }\n });\n }).then(() => {\n this.onRender();\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport fastSmoothScroll from '../fastSmoothScroll';\r\nimport cancelEvent from './cancelEvent';\r\nimport {attachClickEvent, detachClickEvent} from './clickEvent';\r\nimport findUpAsChild from './findUpAsChild';\r\nimport findUpClassName from './findUpClassName';\r\n\r\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\nconst HANDLE_EVENT = 'keydown';\r\nconst ACTIVE_CLASS_NAME = 'active';\r\n\r\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\r\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\r\n\r\nexport type ListNavigationOptions = {\r\n list: HTMLElement,\r\n type: 'xy' | 'x' | 'y',\r\n onSelect: (target: Element) => void | boolean | Promise,\r\n once: boolean,\r\n waitForKey?: string[]\r\n};\r\n\r\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: ListNavigationOptions) {\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 as HTMLElement, 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 as HTMLElement, 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 = async(target: Element) => {\r\n const canContinue = await 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, {ListNavigationOptions} 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: ListNavigationOptions['onSelect'];\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 type Chat from './chat';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport mediaSizes from '../../helpers/mediaSizes';\r\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\r\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport rootScope from '../../lib/rootScope';\r\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\r\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\r\nimport LazyLoadQueue from '../lazyLoadQueue';\r\nimport Scrollable from '../scrollable';\r\nimport attachStickerViewerListeners from '../stickerViewer';\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 private listenerSetter: ListenerSetter;\r\n\r\n constructor(\r\n appendTo: HTMLElement,\r\n controller: AutocompleteHelperController,\r\n private chat: Chat,\r\n private managers: AppManagers\r\n ) {\r\n super({\r\n appendTo,\r\n controller,\r\n listType: 'xy',\r\n onSelect: async(target) => {\r\n return !(await 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 this.listenerSetter.removeAll();\r\n this.listenerSetter = undefined;\r\n }\r\n\r\n rootScope.dispatchEvent('choosing_sticker', false);\r\n });\r\n }\r\n\r\n public checkEmoticon(emoticon: string) {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n preloadAnimatedEmojiSticker(emoticon);\r\n this.managers.appStickersManager.getStickersByEmoticon(emoticon)\r\n .then((stickers) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const container = this.list.cloneNode() as HTMLElement;\r\n\r\n let ready: Promise;\r\n\r\n this.lazyLoadQueue.clear();\r\n if(stickers.length) {\r\n ready = new Promise((resolve) => {\r\n const promises: Promise[] = [];\r\n stickers.forEach((sticker) => {\r\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\r\n });\r\n\r\n (Promise.all(promises) as Promise).finally(resolve);\r\n });\r\n } else {\r\n ready = Promise.resolve();\r\n }\r\n\r\n ready.then(() => {\r\n this.list.replaceWith(container);\r\n this.list = container;\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.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 this.listenerSetter = new ListenerSetter();\r\n attachStickerViewerListeners({listenTo: this.container, listenerSetter: this.listenerSetter});\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 public 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, this.chat.animationGroup, this.managers);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\r\nimport Button from '../button';\r\nimport PopupDatePicker from './datePicker';\r\n\r\nconst getMinDate = () => {\r\n const date = new Date();\r\n // date.setDate(date.getDate() - 1);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n};\r\n\r\nconst getMaxDate = () => {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() + 1);\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n};\r\n\r\nconst checkDate = (date: Date) => {\r\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\r\n};\r\n\r\nexport default class PopupSchedule extends PopupDatePicker {\r\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\r\n super(checkDate(initDate), onPick, {\r\n noButtons: true,\r\n noTitle: true,\r\n closable: true,\r\n withConfirm: true,\r\n minDate: getMinDate(),\r\n maxDate: getMaxDate(),\r\n withTime: true,\r\n showOverflowMonths: true,\r\n confirmShortcutIsSendShortcut: true,\r\n title: 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\r\nimport type ChatInput from './input';\r\nimport {appendEmoji, getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\r\nimport {ScrollableX} from '../scrollable';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\n\r\nexport default class EmojiHelper extends AutocompleteHelper {\r\n private scrollable: ScrollableX;\r\n\r\n constructor(\r\n appendTo: HTMLElement,\r\n controller: AutocompleteHelperController,\r\n chatInput: ChatInput,\r\n private managers: AppManagers\r\n ) {\r\n super({\r\n appendTo,\r\n controller,\r\n listType: 'x',\r\n onSelect: (target) => {\r\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\r\n }\r\n });\r\n\r\n this.container.classList.add('emoji-helper');\r\n }\r\n\r\n public init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new ScrollableX(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollLeft = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(emojis: string[], waitForKey: boolean) {\r\n if(this.init) {\r\n if(!emojis.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n emojis = emojis.slice(0, 80);\r\n\r\n if(emojis.length) {\r\n this.list.innerHTML = '';\r\n emojis.forEach((emoji) => {\r\n appendEmoji(emoji, this.list, false, true);\r\n });\r\n }\r\n\r\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\r\n this.toggle(!emojis.length);\r\n\r\n /* window.requestAnimationFrame(() => {\r\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\r\n }); */\r\n }\r\n\r\n public checkQuery(query: string, firstChar: string) {\r\n const middleware = this.controller.getMiddleware();\r\n this.managers.appEmojiManager.getBothEmojiKeywords().then(async() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const q = query.replace(/^:/, '');\r\n const emojis = await this.managers.appEmojiManager.searchEmojis(q);\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.render(emojis, firstChar !== ':');\r\n // console.log(emojis);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport AvatarElement from '../avatar';\r\nimport PeerTitle from '../peerTitle';\r\nimport Scrollable from '../scrollable';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\n\r\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\r\n protected static BASE_CLASS = 'autocomplete-peer-helper';\r\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\r\n private scrollable: Scrollable;\r\n\r\n constructor(\r\n appendTo: HTMLElement,\r\n controller: AutocompleteHelperController,\r\n protected className: string,\r\n onSelect: (target: Element) => boolean | void\r\n ) {\r\n super({\r\n appendTo,\r\n controller,\r\n listType: 'y',\r\n onSelect\r\n });\r\n\r\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\r\n }\r\n\r\n public init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\r\n if(this.init) {\r\n if(!data.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(data.length) {\r\n this.list.innerHTML = '';\r\n data.forEach((d) => {\r\n const div = AutocompletePeerHelper.listElement({\r\n className: this.className,\r\n peerId: d.peerId,\r\n name: d.name,\r\n description: d.description\r\n });\r\n\r\n this.list.append(div);\r\n });\r\n }\r\n\r\n if(!doNotShow) {\r\n this.toggle(!data.length);\r\n }\r\n }\r\n\r\n public static listElement(options: {\r\n className: string,\r\n peerId: PeerId,\r\n name?: string,\r\n description?: string\r\n }) {\r\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\r\n options.className += '-list-element';\r\n\r\n const div = document.createElement('div');\r\n div.classList.add(BASE, options.className);\r\n div.dataset.peerId = '' + options.peerId;\r\n\r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\r\n avatar.updateWithOptions({\r\n isDialog: false,\r\n peerId: options.peerId\r\n });\r\n\r\n const name = document.createElement('div');\r\n name.classList.add(BASE + '-name', options.className + '-name');\r\n if(!options.name) {\r\n name.append(new PeerTitle({\r\n peerId: options.peerId,\r\n dialog: false,\r\n onlyFirstName: false,\r\n plainText: false\r\n }).element);\r\n } else {\r\n setInnerHTML(name, wrapEmojiText(options.name));\r\n }\r\n\r\n div.append(avatar, name);\r\n\r\n if(options.description) {\r\n const description = document.createElement('div');\r\n description.classList.add(BASE + '-description', options.className + '-description');\r\n setInnerHTML(description, wrapEmojiText(options.description));\r\n div.append(description);\r\n }\r\n\r\n return div;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport type {BotInfo, ChatFull, UserFull} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport SearchIndex from '../../lib/searchIndex';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport function processPeerFullForCommands(peerId: PeerId, full: ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull, query?: string) {\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n let index: SearchIndex;\n\n if(query !== undefined) {\n index = new SearchIndex({\n ignoreCase: true\n });\n }\n\n type T = {peerId: PeerId, name: string, description: string, index: number, command: string};\n const commands: Map = new Map();\n botInfos.forEach((botInfo) => {\n if(!botInfo.commands) {\n return;\n }\n\n botInfo.commands.forEach(({command, description}, idx) => {\n const c = '/' + command;\n commands.set(command, {\n peerId: botInfo.user_id ? botInfo.user_id.toPeerId(false) : peerId,\n command: command,\n name: c,\n description: description,\n index: idx\n });\n\n if(index) {\n index.indexObject(command, c);\n }\n });\n });\n\n let out: T[];\n if(!index) {\n out = [...commands.values()];\n } else {\n const found = index.search(query);\n out = Array.from(found).map((command) => commands.get(command));\n }\n\n out = out.sort((a, b) => commands.get(a.command).index - commands.get(b.command).index);\n\n return out;\n}\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo,\n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public async checkQuery(query: string, peerId: PeerId) {\n if(!(await this.managers.appUsersManager.isBot(peerId))) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getProfileByPeerId(peerId).then((full) => {\n if(!middleware()) {\n return;\n }\n\n const filtered = processPeerFullForCommands(peerId, full, query);\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {getMiddleware} from '../../helpers/middleware';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\n\r\nexport default class AutocompleteHelperController {\r\n private helpers: Set = new Set();\r\n private middleware = getMiddleware();\r\n /* private tempId = 0;\r\n\r\n public incrementToggleCount() {\r\n return ++this.tempId;\r\n }\r\n\r\n public getToggleCount() {\r\n return this.tempId;\r\n } */\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n for(const helper of this.helpers) {\r\n helper.toggleListNavigation(enabled);\r\n }\r\n }\r\n\r\n public getMiddleware() {\r\n this.middleware.clean();\r\n return this.middleware.get();\r\n }\r\n\r\n public addHelper(helper: AutocompleteHelper) {\r\n this.helpers.add(helper);\r\n }\r\n\r\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\r\n this.helpers.forEach((helper) => {\r\n if(helper !== preserveHelper) {\r\n helper.toggle(true, true);\r\n }\r\n });\r\n\r\n if(!preserveHelper) {\r\n this.middleware.clean();\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport type {MessageEntity} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(\n appendTo,\n controller,\n 'mentions-helper',\n (target) => {\n const userId = (target as HTMLElement).dataset.peerId.toUserId();\n const user = Promise.resolve(managers.appUsersManager.getUser(userId)).then((user) => {\n let str = '', entity: MessageEntity;\n if(user.username) {\n str = '@' + user.username;\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(async(peerIds) => {\n if(!middleware()) return;\n\n const username = trimmed.slice(1).toLowerCase();\n\n const p = peerIds.map(async(peerId) => {\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion\n return;\n }\n\n return {\n peerId,\n description: user.username ? '@' + user.username : undefined\n };\n });\n\n this.render((await Promise.all(p)).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatInput from './input';\r\nimport DropdownHover from '../../helpers/dropdownHover';\r\nimport {KeyboardButton, ReplyMarkup} from '../../layer';\r\nimport rootScope from '../../lib/rootScope';\r\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\r\nimport confirmationPopup from '../confirmationPopup';\r\nimport safeAssign from '../../helpers/object/safeAssign';\r\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\n\r\nexport default class ReplyKeyboard extends DropdownHover {\r\n private static BASE_CLASS = 'reply-keyboard';\r\n private appendTo: HTMLElement;\r\n private listenerSetter: ListenerSetter;\r\n private managers: AppManagers;\r\n private btnHover: HTMLElement;\r\n private peerId: PeerId;\r\n private touchListener: Listener;\r\n private chatInput: ChatInput;\r\n\r\n constructor(options: {\r\n listenerSetter: ListenerSetter,\r\n managers: AppManagers,\r\n appendTo: HTMLElement,\r\n btnHover: HTMLElement,\r\n chatInput: ChatInput\r\n }) {\r\n super({\r\n element: document.createElement('div')\r\n });\r\n\r\n safeAssign(this, options);\r\n\r\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\r\n this.element.style.display = 'none';\r\n\r\n this.attachButtonListener(this.btnHover, this.listenerSetter);\r\n this.listenerSetter.add(rootScope)('history_reply_markup', async({peerId}) => {\r\n if(this.peerId === peerId) {\r\n if(this.checkAvailability() && this.isActive()) {\r\n await this.render();\r\n }\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.checkForceReply();\r\n });\r\n }\r\n });\r\n }\r\n\r\n public init() {\r\n this.appendTo.append(this.element);\r\n\r\n this.listenerSetter.add(this)('open', async() => {\r\n await this.render();\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\r\n this.listenerSetter.add(this)('close', () => {\r\n this.listenerSetter.remove(this.touchListener);\r\n }, {once: true});\r\n }\r\n });\r\n\r\n attachClickEvent(this.element, (e) => {\r\n const target = findUpClassName(e.target, 'btn');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n const type = target.dataset.type as KeyboardButton['_'];\r\n const {peerId} = this;\r\n switch(type) {\r\n case 'keyboardButtonRequestPhone': {\r\n confirmationPopup({\r\n titleLangKey: 'ShareYouPhoneNumberTitle',\r\n button: {\r\n langKey: 'OK'\r\n },\r\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\r\n }).then(() => {\r\n this.managers.appMessagesManager.sendContact(peerId, rootScope.myId);\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n this.managers.appMessagesManager.sendText(peerId, target.dataset.text);\r\n break;\r\n }\r\n }\r\n\r\n this.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n return super.init();\r\n }\r\n\r\n private onBodyTouchStart = (e: TouchEvent) => {\r\n const target = e.touches[0].target as HTMLElement;\r\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\r\n cancelEvent(e);\r\n this.toggle(false);\r\n }\r\n };\r\n\r\n public async checkForceReply() {\r\n const replyMarkup = await this.getReplyMarkup();\r\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\r\n !replyMarkup.pFlags.hidden &&\r\n !replyMarkup.pFlags.used) {\r\n replyMarkup.pFlags.used = true;\r\n this.chatInput.initMessageReply(replyMarkup.mid);\r\n }\r\n }\r\n\r\n private async getReplyMarkup() {\r\n return (await this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup ?? {\r\n _: 'replyKeyboardHide'\r\n };\r\n }\r\n\r\n public async render(replyMarkup?: ReplyMarkup.replyKeyboardMarkup) {\r\n if(replyMarkup === undefined) {\r\n replyMarkup = await this.getReplyMarkup() as any;\r\n }\r\n\r\n this.element.textContent = '';\r\n\r\n for(const row of replyMarkup.rows) {\r\n const div = document.createElement('div');\r\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\r\n\r\n for(const button of row.buttons) {\r\n const btn = document.createElement('button');\r\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\r\n setInnerHTML(btn, wrapEmojiText(button.text));\r\n btn.dataset.text = button.text;\r\n btn.dataset.type = button._;\r\n div.append(btn);\r\n }\r\n\r\n this.element.append(div);\r\n }\r\n }\r\n\r\n public async checkAvailability(replyMarkup?: ReplyMarkup) {\r\n if(replyMarkup === undefined) {\r\n replyMarkup = await this.getReplyMarkup();\r\n }\r\n\r\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\r\n this.btnHover.classList.toggle('hide', hide);\r\n\r\n if(hide) {\r\n this.toggle(false);\r\n }\r\n\r\n return !hide;\r\n }\r\n\r\n public setPeer(peerId: PeerId) {\r\n this.peerId = peerId;\r\n\r\n this.checkAvailability();\r\n this.checkForceReply();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from './chat';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport {WebDocument} from '../../layer';\r\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\r\nimport LazyLoadQueue from '../lazyLoadQueue';\r\nimport Scrollable from '../scrollable';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport Button from '../button';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport GifsMasonry from '../gifsMasonry';\r\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\r\nimport mediaSizes from '../../helpers/mediaSizes';\r\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\r\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\r\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\r\nimport generateQId from '../../lib/appManagers/utils/inlineBots/generateQId';\r\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\r\nimport {AnimationItemGroup} from '../animationIntersector';\r\nimport wrapPhoto from '../wrappers/photo';\r\n\r\nconst ANIMATION_GROUP: AnimationItemGroup = 'INLINE-HELPER';\r\n// const GRID_ITEMS = 5;\r\n\r\nexport default class InlineHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private gifsMasonry: GifsMasonry;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private onChangeScreen: () => void;\r\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\r\n\r\n constructor(\r\n appendTo: HTMLElement,\r\n controller: AutocompleteHelperController,\r\n private chat: Chat,\r\n private managers: AppManagers\r\n ) {\r\n super({\r\n appendTo,\r\n controller,\r\n listType: 'xy',\r\n waitForKey: ['ArrowUp', 'ArrowDown'],\r\n onSelect: (target) => {\r\n if(!target) return false; // can happen when there is only button\r\n const {peerId, botId, queryId} = this.list.dataset;\r\n return this.chat.input.getReadyToSend(() => {\r\n const queryAndResultIds = generateQId(queryId, (target as HTMLElement).dataset.resultId);\r\n this.managers.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\r\n ...this.chat.getMessageSendingParams(),\r\n clearDraft: true\r\n });\r\n\r\n this.chat.input.onMessageSent(true, true);\r\n });\r\n }\r\n });\r\n\r\n this.container.classList.add('inline-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n });\r\n\r\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n });\r\n }\r\n\r\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n const peer = await this.managers.appUsersManager.resolveUsername(username);\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(peer._ !== 'user') {\r\n throw 'NOT_A_BOT';\r\n }\r\n\r\n const renderPromise = this.managers.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then((botResults) => {\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const list = this.list.cloneNode() as HTMLElement;\r\n list.dataset.peerId = '' + peerId;\r\n list.dataset.botId = '' + peer.id;\r\n list.dataset.queryId = '' + botResults.query_id;\r\n\r\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\r\n\r\n this.lazyLoadQueue.clear();\r\n this.superStickerRenderer.clear();\r\n\r\n const loadPromises: Promise[] = [];\r\n const isGallery = !!botResults.pFlags.gallery;\r\n // botResults.results.length = 3;\r\n for(const item of botResults.results) {\r\n const container = document.createElement('div');\r\n container.classList.add('inline-helper-result');\r\n container.dataset.resultId = item.id;\r\n\r\n const preview = isGallery ? undefined : document.createElement('div');\r\n if(preview) {\r\n preview.classList.add('inline-helper-result-preview');\r\n\r\n container.append(preview);\r\n }\r\n\r\n list.append(container);\r\n\r\n if(!isGallery) {\r\n preview.classList.add('empty');\r\n setInnerHTML(preview, wrapEmojiText([...item.title.trim()][0]));\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('inline-helper-result-title');\r\n setInnerHTML(title, wrapEmojiText(item.title));\r\n\r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n setInnerHTML(description, wrapRichText(item.description, {\r\n noCommands: true,\r\n noLinks: true\r\n }));\r\n\r\n container.append(title, description);\r\n\r\n const separator = document.createElement('div');\r\n separator.classList.add('inline-helper-separator');\r\n\r\n list.append(separator);\r\n } else {\r\n container.classList.add('grid-item');\r\n }\r\n\r\n if(item._ === 'botInlineResult') {\r\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\r\n let mediaContainer: HTMLElement;\r\n if(preview) {\r\n mediaContainer = document.createElement('div');\r\n preview.append(mediaContainer);\r\n } else {\r\n mediaContainer = container;\r\n }\r\n\r\n mediaContainer.classList.add('media-container');\r\n isGallery && mediaContainer.classList.add('no-border-radius');\r\n\r\n this.lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n return appDownloadManager.download({\r\n dcId: 4,\r\n location: {\r\n _: 'inputWebFileLocation',\r\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\r\n url: item.thumb.url\r\n },\r\n size: item.thumb.size,\r\n mimeType: item.thumb.mime_type\r\n }).then((blob) => {\r\n const image = new Image();\r\n image.classList.add('media-photo');\r\n readBlobAsDataURL(blob).then((dataURL) => {\r\n renderMediaWithFadeIn(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.animated) {\r\n this.superStickerRenderer.observeAnimated(container);\r\n }\r\n }\r\n } else if(media) {\r\n const size = isGallery ? 48 : undefined;\r\n isGallery && container.classList.add('no-border-radius');\r\n wrapPhoto({\r\n photo: media,\r\n container: isGallery ? container : preview,\r\n boxWidth: size,\r\n boxHeight: size,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(loadPromises).then(() => {\r\n if(!middleware()) {\r\n gifsMasonry.clear();\r\n return;\r\n }\r\n\r\n list.classList.toggle('is-gallery', isGallery);\r\n list.classList.toggle('super-stickers', isGallery);\r\n this.container.classList.toggle('is-gallery', isGallery);\r\n\r\n /* if(isGallery) {\r\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\r\n }\r\n\r\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\r\n\r\n const parent = this.list.parentElement;\r\n parent.textContent = '';\r\n if(botResults.switch_pm) {\r\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\r\n setInnerHTML(btnSwitchToPM, wrapEmojiText(botResults.switch_pm.text));\r\n attachClickEvent(btnSwitchToPM, (e) => {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n this.managers.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\r\n });\r\n parent.append(btnSwitchToPM);\r\n }\r\n parent.append(this.list = list);\r\n\r\n if(this.gifsMasonry) {\r\n this.gifsMasonry.detach();\r\n }\r\n this.gifsMasonry = gifsMasonry;\r\n gifsMasonry.attach();\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n if(this.list.classList.contains('is-gallery')) {\r\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.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 public init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('inline-helper-results');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP, this.managers);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport callbackify from '../../helpers/callbackify';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {processPeerFullForCommands} from './commandsHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst CLASS_NAME = 'bot-commands';\nexport default class ChatBotCommands extends AutocompletePeerHelper {\n private userId: UserId;\n\n constructor(\n appendTo: HTMLElement,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo, undefined, CLASS_NAME, (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n this.toggle(true);\n });\n });\n }\n\n public setUserId(userId: UserId, middleware: () => boolean) {\n if(this.userId === userId && this.list?.childElementCount) {\n this.toggle(false);\n return;\n }\n\n this.userId = userId;\n return callbackify(this.managers.appProfileManager.getProfile(userId), (full) => {\n if(!middleware()) return;\n const filtered = processPeerFullForCommands(userId.toPeerId(false), full);\n\n const PADDING_TOP = 8;\n // const PADDING_BOTTOM = 8;\n const PADDING_BOTTOM = 24;\n const height = filtered.length * 50 + PADDING_TOP + PADDING_BOTTOM;\n this.container.style.setProperty('--height', height + 'px');\n\n this.render(filtered);\n\n // this.container.style.top =\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {AckedResult} from '../lib/mtproto/superMessagePort';\r\nimport {Modify} from '../types';\r\n\r\nexport default async function modifyAckedResult(acked: AckedResult): Promise, {result: T | Promise}>> {\r\n return {\r\n cached: acked.cached,\r\n result: acked.cached ? await acked.result : acked.result\r\n };\r\n}\r\n\r\nexport function modifyAckedPromise(promise: Promise>) {\r\n return promise.then(modifyAckedResult);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport {getMiddleware} from '../../helpers/middleware';\r\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\r\nimport {ChatFull} from '../../layer';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\r\nimport {i18n} from '../../lib/langPack';\r\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\r\nimport rootScope from '../../lib/rootScope';\r\nimport AvatarElement from '../avatar';\r\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport PeerTitle from '../peerTitle';\r\nimport SetTransition from '../singleTransition';\r\nimport getChatMembersString from '../wrappers/getChatMembersString';\r\n\r\nconst SEND_AS_ANIMATION_DURATION = 300;\r\n\r\nexport default class ChatSendAs {\r\n private avatar: AvatarElement;\r\n private container: HTMLElement;\r\n private closeBtn: HTMLElement;\r\n private btnMenu: HTMLElement;\r\n private sendAsPeerIds: PeerId[];\r\n private sendAsPeerId: PeerId;\r\n private updatingPromise: ReturnType;\r\n private middleware: ReturnType;\r\n private listenerSetter: ListenerSetter;\r\n private peerId: PeerId;\r\n private addedListener: boolean;\r\n\r\n constructor(\r\n private managers: AppManagers,\r\n private onReady: (container: HTMLElement, skipAnimation?: boolean) => void,\r\n private onChange: (sendAsPeerId: PeerId) => void\r\n ) {\r\n this.middleware = getMiddleware();\r\n this.listenerSetter = new ListenerSetter();\r\n this.construct();\r\n }\r\n\r\n private construct() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('new-message-send-as-container');\r\n\r\n this.closeBtn = document.createElement('div');\r\n this.closeBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\r\n\r\n const sendAsButtons: ButtonMenuItemOptions[] = [{\r\n text: 'SendMessageAsTitle',\r\n onClick: undefined\r\n }];\r\n\r\n let previousAvatar: HTMLElement;\r\n const onSendAsMenuToggle = (visible: boolean) => {\r\n if(visible) {\r\n previousAvatar = this.avatar;\r\n }\r\n\r\n const isChanged = this.avatar !== previousAvatar;\r\n const useRafs = !visible && isChanged ? 2 : 0;\r\n\r\n SetTransition(this.closeBtn, 'is-visible', visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n if(!isChanged) {\r\n SetTransition(previousAvatar, 'is-visible', !visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n }\r\n };\r\n\r\n ButtonMenuToggle({\r\n noRipple: true,\r\n listenerSetter: this.listenerSetter,\r\n container: this.container\r\n }, 'top-right', sendAsButtons, () => {\r\n onSendAsMenuToggle(true);\r\n }, () => {\r\n onSendAsMenuToggle(false);\r\n });\r\n\r\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\r\n this.btnMenu = this.container.firstElementChild as any;\r\n this.btnMenu.classList.add('scrollable', 'scrollable-y');\r\n this.container.append(this.closeBtn);\r\n }\r\n\r\n private async updateButtons(peerIds: PeerId[]) {\r\n const promises: Promise[] = peerIds.map(async(sendAsPeerId, idx) => {\r\n const textElement = document.createElement('div');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('btn-menu-item-subtitle');\r\n if(sendAsPeerId.isUser()) {\r\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\r\n } else if(sendAsPeerId === this.peerId) {\r\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\r\n } else {\r\n subtitle.append(await getChatMembersString(sendAsPeerId.toChatId()));\r\n }\r\n\r\n textElement.append(\r\n new PeerTitle({peerId: sendAsPeerId}).element,\r\n subtitle\r\n );\r\n\r\n return {\r\n onClick: idx ? async() => {\r\n const currentPeerId = this.peerId;\r\n this.changeSendAsPeerId(sendAsPeerId);\r\n\r\n const middleware = this.middleware.get();\r\n const executeButtonsUpdate = () => {\r\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\r\n const peerIds = this.sendAsPeerIds.slice();\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateButtons(peerIds);\r\n };\r\n\r\n if(rootScope.settings.animationsEnabled) {\r\n setTimeout(executeButtonsUpdate, 250);\r\n } else {\r\n executeButtonsUpdate();\r\n }\r\n\r\n // return;\r\n this.managers.appMessagesManager.saveDefaultSendAs(currentPeerId, sendAsPeerId);\r\n } : undefined,\r\n textElement\r\n };\r\n });\r\n\r\n const buttons = await Promise.all(promises);\r\n const btnMenu = ButtonMenu(buttons/* , this.listenerSetter */);\r\n buttons.forEach((button, idx) => {\r\n const peerId = peerIds[idx];\r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-26', 'btn-menu-item-icon');\r\n avatar.updateWithOptions({peerId});\r\n\r\n if(!idx) {\r\n avatar.classList.add('active');\r\n }\r\n\r\n button.element.prepend(avatar);\r\n });\r\n\r\n Array.from(this.btnMenu.children).slice(1).forEach((node) => node.remove());\r\n this.btnMenu.append(...Array.from(btnMenu.children));\r\n }\r\n\r\n private async updateAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\r\n const previousAvatar = this.avatar;\r\n if(previousAvatar) {\r\n if(previousAvatar.peerId === sendAsPeerId) {\r\n return;\r\n }\r\n }\r\n\r\n if(!previousAvatar) {\r\n skipAnimation = true;\r\n }\r\n\r\n const useRafs = skipAnimation ? 0 : 2;\r\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\r\n const avatar = this.avatar = new AvatarElement();\r\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\r\n await avatar.updateWithOptions({\r\n isDialog: false,\r\n peerId: sendAsPeerId\r\n });\r\n\r\n SetTransition(avatar, 'is-visible', true, duration, undefined, useRafs);\r\n if(previousAvatar) {\r\n SetTransition(previousAvatar, 'is-visible', false, duration, () => {\r\n previousAvatar.remove();\r\n }, useRafs);\r\n }\r\n\r\n this.container.append(avatar);\r\n }\r\n\r\n private changeSendAsPeerId(sendAsPeerId: PeerId, skipAnimation?: boolean) {\r\n this.sendAsPeerId = sendAsPeerId;\r\n this.onChange(sendAsPeerId);\r\n return this.updateAvatar(sendAsPeerId, skipAnimation);\r\n }\r\n\r\n private getDefaultSendAs(): Promise> {\r\n // return rootScope.myId;\r\n return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((acked) => {\r\n return {\r\n cached: acked.cached,\r\n result: acked.result.then((channelFull) => {\r\n return channelFull.default_send_as ? getPeerId(channelFull.default_send_as) : undefined\r\n })\r\n };\r\n });\r\n }\r\n\r\n public async updateManual(skipAnimation?: boolean): Promise<() => void> {\r\n const peerId = this.peerId;\r\n if(this.updatingPromise || !(await this.managers.appPeersManager.isChannel(peerId))) {\r\n return;\r\n }\r\n\r\n const middleware = this.middleware.get(() => {\r\n return !this.updatingPromise || this.updatingPromise === updatingPromise;\r\n });\r\n\r\n const {container} = this;\r\n const chatId = peerId.toChatId();\r\n const result = (await modifyAckedPromise(this.getDefaultSendAs())).result;\r\n // const result = Promise.resolve(this.getDefaultSendAs());\r\n\r\n const wasSkippingAnimation = skipAnimation;\r\n if(result instanceof Promise) {\r\n skipAnimation = undefined;\r\n }\r\n\r\n const auto = wasSkippingAnimation && !skipAnimation;\r\n\r\n const updatingPromise = this.updatingPromise = callbackify(result, async(sendAsPeerId) => {\r\n if(!middleware() || sendAsPeerId === undefined) return;\r\n\r\n await this.changeSendAsPeerId(sendAsPeerId, skipAnimation);\r\n if(!middleware()) return;\r\n\r\n this.managers.appChatsManager.getSendAs(chatId).then((sendAsPeers) => {\r\n if(!middleware()) return;\r\n\r\n const peers = sendAsPeers.filter((sendAsPeer) => !sendAsPeer.pFlags.premium_required).map((sendAsPeer) => sendAsPeer.peer);\r\n const peerIds = peers.map((peer) => getPeerId(peer));\r\n this.sendAsPeerIds = peerIds.slice();\r\n\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateButtons(peerIds);\r\n });\r\n\r\n const callback = () => {\r\n this.onReady(container, skipAnimation);\r\n\r\n if(!this.addedListener) {\r\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\r\n if(this.peerId === peerId) {\r\n this.update();\r\n }\r\n });\r\n\r\n this.addedListener = true;\r\n }\r\n };\r\n\r\n if(auto) {\r\n callback();\r\n return;\r\n }\r\n\r\n return callback;\r\n });\r\n\r\n updatingPromise.finally(() => {\r\n if(this.updatingPromise === updatingPromise) {\r\n this.updatingPromise = undefined;\r\n }\r\n });\r\n\r\n if(!auto) {\r\n return updatingPromise;\r\n }\r\n }\r\n\r\n public update(skipAnimation?: boolean) {\r\n return this.updateManual(skipAnimation).then((callback) => callback && callback());\r\n }\r\n\r\n public setPeerId(peerId?: PeerId) {\r\n /* if(this.avatar) {\r\n this.avatar.remove();\r\n this.avatar = undefined;\r\n } */\r\n\r\n this.middleware.clean();\r\n this.updatingPromise = undefined;\r\n this.peerId = peerId;\r\n }\r\n\r\n public destroy() {\r\n this.container.remove();\r\n this.setPeerId();\r\n this.listenerSetter.removeAll();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport BOM from '../helpers/string/bom';\nimport {_i18n} from '../lib/langPack';\nimport InputField, {InputFieldOptions} from './inputField';\nimport SetTransition from './singleTransition';\n\nconst USELESS_REG_EXP = new RegExp(`(${BOM})|()`, 'g');\n\nexport default class InputFieldAnimated extends InputField {\n public inputFake: HTMLElement;\n\n // public onLengthChange: (length: number, isOverflow: boolean) => void;\n // protected wasInputFakeClientHeight: number;\n // protected showScrollDebounced: () => void;\n\n constructor(options?: InputFieldOptions) {\n super(options);\n\n this.input.addEventListener('input', () => {\n this.updateInnerHTML();\n this.onFakeInput();\n });\n\n if(options.placeholder) {\n _i18n(this.inputFake, options.placeholder, undefined, 'placeholder');\n }\n\n this.input.classList.add('scrollable', 'scrollable-y');\n // this.wasInputFakeClientHeight = 0;\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\n this.inputFake = document.createElement('div');\n this.inputFake.contentEditable = 'true';\n this.inputFake.className = this.input.className + ' input-field-input-fake';\n }\n\n public onFakeInput(setHeight = true) {\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\n this.showScrollDebounced();\n } */\n\n const currentHeight = +this.input.style.height.replace('px', '');\n if(currentHeight === newHeight) {\n return;\n }\n\n const TRANSITION_DURATION_FACTOR = 50;\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight))\n );\n\n // this.wasInputFakeClientHeight = clientHeight;\n this.input.style.transitionDuration = `${transitionDuration}ms`;\n\n if(setHeight) {\n this.input.style.height = newHeight ? newHeight + 'px' : '';\n }\n\n const className = 'is-changing-height';\n SetTransition(this.input, className, true, transitionDuration, () => {\n this.input.classList.remove(className);\n });\n }\n\n protected updateInnerHTML(innerHTML = this.input.innerHTML) {\n innerHTML = innerHTML.replace(//, '')\n .replace(/().+?\\/custom-emoji-element>/g, '$1')\n\n if(USING_BOMS) {\n innerHTML = innerHTML.replace(USELESS_REG_EXP, '');\n }\n\n this.inputFake.innerHTML = innerHTML;\n }\n\n public setValueSilently(value: Parameters[0], fromSet?: boolean) {\n super.setValueSilently(value, fromSet);\n\n this.updateInnerHTML();\n if(!fromSet) {\n this.onFakeInput();\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 {markdownTags, MarkdownType} from './getRichElementValue';\n\nexport default function hasMarkupInSelection(types: T[]) {\n const result: Record = {} as any;\n types.forEach((tag) => result[tag] = false);\n const selection = window.getSelection();\n if(!selection.isCollapsed) {\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n const treeWalker = document.createTreeWalker(\n (commonAncestor.nodeType === commonAncestor.ELEMENT_NODE ? commonAncestor as HTMLElement : (commonAncestor as ChildNode).parentElement).closest('[contenteditable=\"true\"]'),\n NodeFilter.SHOW_ELEMENT,\n {acceptNode: (node) => range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let element: HTMLElement;\n while(element = treeWalker.nextNode() as HTMLElement) {\n for(const type of types) {\n if(result[type]) {\n continue;\n }\n\n const tag = markdownTags[type];\n if(element.matches(tag.match)) {\n result[type] = true;\n }\n }\n }\n }\n\n return result;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\r\nimport type {AppImManager} from '../../lib/appManagers/appImManager';\r\nimport type {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\r\nimport type Chat from './chat';\r\nimport Recorder from '../../../public/recorder.min';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\n// import Recorder from '../opus-recorder/dist/recorder.min';\r\nimport opusDecodeController from '../../lib/opusDecodeController';\r\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\r\nimport emoticonsDropdown from '../emoticonsDropdown';\r\nimport PopupCreatePoll from '../popups/createPoll';\r\nimport PopupForward from '../popups/forward';\r\nimport PopupNewMedia from '../popups/newMedia';\r\nimport {toast, toastNew} from '../toast';\r\nimport {MessageEntity, DraftMessage, WebPage, Message, UserFull} from '../../layer';\r\nimport StickersHelper from './stickersHelper';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\r\nimport Button from '../button';\r\nimport PopupSchedule from '../popups/schedule';\r\nimport SendMenu from './sendContextMenu';\r\nimport rootScope from '../../lib/rootScope';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\r\nimport {IS_MOBILE, IS_MOBILE_SAFARI} from '../../environment/userAgent';\r\nimport I18n, {i18n, join, LangPackKey} from '../../lib/langPack';\r\nimport {generateTail} from './bubbles';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport ButtonCorner from '../buttonCorner';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport cancelSelection from '../../helpers/dom/cancelSelection';\r\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\r\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\r\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\r\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\r\nimport EmojiHelper from './emojiHelper';\r\nimport CommandsHelper from './commandsHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport MentionsHelper from './mentionsHelper';\r\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\r\nimport ReplyKeyboard from './replyKeyboard';\r\nimport InlineHelper from './inlineHelper';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport noop from '../../helpers/noop';\r\nimport {putPreloader} from '../putPreloader';\r\nimport SetTransition from '../singleTransition';\r\nimport PeerTitle from '../peerTitle';\r\nimport {fastRaf} from '../../helpers/schedulers';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport fixSafariStickyInputFocusing, {IS_STICKY_INPUT_BUGGED} from '../../helpers/dom/fixSafariStickyInputFocusing';\r\nimport PopupPeer from '../popups/peer';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\r\nimport appMediaPlaybackController from '../appMediaPlaybackController';\r\nimport {BOT_START_PARAM, NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\r\nimport setCaretAt from '../../helpers/dom/setCaretAt';\r\nimport CheckboxField from '../checkboxField';\r\nimport DropdownHover from '../../helpers/dropdownHover';\r\nimport RadioForm from '../radioForm';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport toggleDisability from '../../helpers/dom/toggleDisability';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport ChatBotCommands from './botCommands';\r\nimport copy from '../../helpers/object/copy';\r\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\r\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\r\nimport PopupElement from '../popups';\r\nimport getEmojiEntityFromEmoji from '../../lib/richTextProcessor/getEmojiEntityFromEmoji';\r\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\r\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\r\nimport parseMarkdown from '../../lib/richTextProcessor/parseMarkdown';\r\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\r\nimport wrapDraft from '../wrappers/draft';\r\nimport wrapMessageForReply from '../wrappers/messageForReply';\r\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport contextMenuController from '../../helpers/contextMenuController';\r\nimport {emojiFromCodePoints} from '../../vendor/emoji';\r\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\r\nimport ChatSendAs from './sendAs';\r\nimport filterAsync from '../../helpers/array/filterAsync';\r\nimport InputFieldAnimated from '../inputFieldAnimated';\r\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\r\nimport PopupStickers from '../popups/stickers';\r\nimport wrapPeerTitle from '../wrappers/peerTitle';\r\nimport wrapReply from '../wrappers/reply';\r\nimport {getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\r\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\r\nimport {insertRichTextAsHTML} from '../inputField';\r\nimport getCaretPosNew from '../../helpers/dom/getCaretPosNew';\r\nimport draftsAreEqual from '../../lib/appManagers/utils/drafts/draftsAreEqual';\r\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\r\n\r\nconst RECORD_MIN_TIME = 500;\r\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\r\n\r\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\r\n\r\nexport default class ChatInput {\r\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\r\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\r\n public messageInput: HTMLElement;\r\n public messageInputField: InputFieldAnimated;\r\n private fileInput: HTMLInputElement;\r\n private inputMessageContainer: HTMLDivElement;\r\n private btnSend: HTMLButtonElement;\r\n private btnCancelRecord: HTMLButtonElement;\r\n private lastUrl = '';\r\n private lastTimeType = 0;\r\n\r\n public chatInput: HTMLElement;\r\n public inputContainer: HTMLElement;\r\n public rowsWrapper: HTMLDivElement;\r\n private newMessageWrapper: HTMLDivElement;\r\n private btnToggleEmoticons: HTMLButtonElement;\r\n private btnToggleReplyMarkup: HTMLButtonElement;\r\n private btnSendContainer: HTMLDivElement;\r\n\r\n private replyKeyboard: ReplyKeyboard;\r\n\r\n private attachMenu: HTMLElement;\r\n private attachMenuButtons: (ButtonMenuItemOptions & {verify: (peerId: PeerId, threadId: number) => boolean | Promise})[];\r\n\r\n private sendMenu: SendMenu;\r\n\r\n private replyElements: {\r\n container: HTMLElement,\r\n cancelBtn: HTMLButtonElement,\r\n iconBtn: HTMLButtonElement\r\n } = {} as any;\r\n\r\n private forwardElements: {\r\n changePeer: ButtonMenuItemOptions,\r\n showSender: ButtonMenuItemOptions,\r\n hideSender: ButtonMenuItemOptions,\r\n showCaption: ButtonMenuItemOptions,\r\n hideCaption: ButtonMenuItemOptions,\r\n container: HTMLElement,\r\n modifyArgs?: ButtonMenuItemOptions[]\r\n };\r\n private forwardHover: DropdownHover;\r\n private forwardWasDroppingAuthor: boolean;\r\n\r\n private getWebPagePromise: Promise;\r\n private willSendWebPage: WebPage = null;\r\n private forwarding: {[fromPeerId: PeerId]: number[]};\r\n public replyToMsgId: number;\r\n public editMsgId: number;\r\n public editMessage: Message.message;\r\n private noWebPage: true;\r\n public scheduleDate: number;\r\n public sendSilent: true;\r\n public startParam: string;\r\n\r\n private recorder: any;\r\n public recording = false;\r\n private recordCanceled = false;\r\n private recordTimeEl: HTMLElement;\r\n private recordRippleEl: HTMLElement;\r\n private recordStartTime = 0;\r\n private recordingOverlayListener: Listener;\r\n private recordingNavigationItem: NavigationItem;\r\n\r\n // private scrollTop = 0;\r\n // private scrollOffsetTop = 0;\r\n // private scrollDiff = 0;\r\n\r\n public helperType: Exclude;\r\n private helperFunc: () => void | Promise;\r\n private helperWaitingForward: boolean;\r\n\r\n public willAttachType: 'document' | 'media';\r\n\r\n private lockRedo = false;\r\n private canRedoFromHTML = '';\r\n private readonly undoHistory: string[] = [];\r\n private readonly executedHistory: string[] = [];\r\n private canUndoFromHTML = '';\r\n\r\n private autocompleteHelperController: AutocompleteHelperController;\r\n private stickersHelper: StickersHelper;\r\n private emojiHelper: EmojiHelper;\r\n private commandsHelper: CommandsHelper;\r\n private mentionsHelper: MentionsHelper;\r\n private inlineHelper: InlineHelper;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private pinnedControlBtn: HTMLButtonElement;\r\n\r\n private goDownBtn: HTMLButtonElement;\r\n private goDownUnreadBadge: HTMLElement;\r\n private goMentionBtn: HTMLButtonElement;\r\n private goMentionUnreadBadge: HTMLSpanElement;\r\n private btnScheduled: HTMLButtonElement;\r\n\r\n private btnPreloader: HTMLButtonElement;\r\n\r\n private saveDraftDebounced: () => void;\r\n\r\n private fakeRowsWrapper: HTMLDivElement;\r\n\r\n private previousQuery: string;\r\n\r\n private releaseMediaPlayback: () => void;\r\n\r\n private botStartBtn: HTMLButtonElement;\r\n private rowsWrapperWrapper: HTMLDivElement;\r\n private controlContainer: HTMLElement;\r\n private fakeSelectionWrapper: HTMLDivElement;\r\n\r\n private fakeWrapperTo: HTMLElement;\r\n private toggleBotStartBtnDisability: () => void;\r\n\r\n private botCommandsToggle: HTMLElement;\r\n private botCommands: ChatBotCommands;\r\n private botCommandsIcon: HTMLDivElement;\r\n private hasBotCommands: boolean;\r\n\r\n // private activeContainer: HTMLElement;\r\n\r\n private sendAs: ChatSendAs;\r\n public sendAsPeerId: PeerId;\r\n\r\n constructor(\r\n private chat: Chat,\r\n private appImManager: AppImManager,\r\n private managers: AppManagers\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public construct() {\r\n this.chatInput = document.createElement('div');\r\n this.chatInput.classList.add('chat-input', 'hide');\r\n\r\n this.inputContainer = document.createElement('div');\r\n this.inputContainer.classList.add('chat-input-container');\r\n\r\n this.rowsWrapperWrapper = document.createElement('div');\r\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\r\n\r\n this.rowsWrapper = document.createElement('div');\r\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\r\n\r\n this.rowsWrapperWrapper.append(this.rowsWrapper);\r\n\r\n const tail = generateTail();\r\n this.rowsWrapper.append(tail);\r\n\r\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\r\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\r\n\r\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\r\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\r\n\r\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\r\n this.chatInput.append(this.inputContainer);\r\n\r\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button chat-secondary-button bubbles-go-down hide'});\r\n this.inputContainer.append(this.goDownBtn);\r\n\r\n attachClickEvent(this.goDownBtn, (e) => {\r\n cancelEvent(e);\r\n this.chat.bubbles.onGoDownClick();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n // * constructor end\r\n\r\n /* let setScrollTopTimeout: number;\r\n // @ts-ignore\r\n let height = window.visualViewport.height; */\r\n // @ts-ignore\r\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n // const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // /* if(wasScrolledDown) {\r\n // this.saveScroll();\r\n // } */\r\n\r\n // // @ts-ignore\r\n // let newHeight = window.visualViewport.height;\r\n // const diff = height - newHeight;\r\n // const scrollTop = scrollable.scrollTop;\r\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n // setScrollTopTimeout = window.setTimeout(() => {\r\n // const diff = height - newHeight;\r\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\r\n // height = newHeight;\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n\r\n // /* if(isScrolledDown) {\r\n // scrollable.scrollTop = scrollable.scrollHeight;\r\n // } */\r\n\r\n // //scrollable.scrollTop += diff;\r\n // setScrollTopTimeout = 0;\r\n // }, 0);\r\n // });\r\n\r\n // ! Can't use it with resizeObserver\r\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n const scrollable = this.chat.bubbles.scrollable;\r\n const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // @ts-ignore\r\n let newHeight = window.visualViewport.height;\r\n const diff = height - newHeight;\r\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n scrollable.scrollTop = needScrollTop;\r\n height = newHeight;\r\n\r\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\r\n scrollable.scrollTop = needScrollTop;\r\n\r\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n setScrollTopTimeout = 0;\r\n }, 0);\r\n }); */\r\n\r\n const c = this.controlContainer = document.createElement('div');\r\n c.classList.add('chat-input-control', 'chat-input-wrapper');\r\n this.inputContainer.append(c);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n this.replyElements.container = document.createElement('div');\r\n this.replyElements.container.classList.add('reply-wrapper');\r\n\r\n this.replyElements.iconBtn = ButtonIcon('');\r\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\r\n\r\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\r\n\r\n //\r\n\r\n const onHideAuthorClick = () => {\r\n isChangingAuthor = true;\r\n return this.canToggleHideAuthor();\r\n };\r\n\r\n const onHideCaptionClick = () => {\r\n isChangingAuthor = false;\r\n };\r\n\r\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\r\n let isChangingAuthor = false;\r\n const forwardButtons: ButtonMenuItemOptions[] = [\r\n forwardElements.showSender = {\r\n text: 'Chat.Alert.Forward.Action.Show1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideSender = {\r\n text: 'Chat.Alert.Forward.Action.Hide1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.showCaption = {\r\n text: 'Chat.Alert.Forward.Action.ShowCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideCaption = {\r\n text: 'Chat.Alert.Forward.Action.HideCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.changePeer = {\r\n text: 'Chat.Alert.Forward.Action.Another',\r\n onClick: () => {\r\n this.changeForwardRecipient();\r\n },\r\n icon: 'replace'\r\n }\r\n ];\r\n const forwardBtnMenu = forwardElements.container = ButtonMenu(forwardButtons, this.listenerSetter);\r\n // forwardBtnMenu.classList.add('top-center');\r\n\r\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\r\n const groups: {\r\n elements: HTMLElement[],\r\n onChange: (value: string, event: Event) => void\r\n }[] = [{\r\n elements: children.slice(0, 2),\r\n onChange: (value, e) => {\r\n const checked = !!+value;\r\n if(isChangingAuthor) {\r\n this.forwardWasDroppingAuthor = !checked;\r\n }\r\n\r\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\r\n if(replyTitle) {\r\n const el = replyTitle.firstElementChild as HTMLElement;\r\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\r\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n i.key = langPackKey;\r\n i.update();\r\n }\r\n }\r\n }, {\r\n elements: children.slice(2, 4),\r\n onChange: (value) => {\r\n const checked = !!+value;\r\n let b: ButtonMenuItemOptions;\r\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\r\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\r\n } else {\r\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\r\n }\r\n\r\n b.checkboxField.checked = true;\r\n }\r\n }];\r\n groups.forEach((group) => {\r\n const container = RadioForm(group.elements.map((e) => {\r\n return {\r\n container: e,\r\n input: e.querySelector('input')\r\n };\r\n }), group.onChange);\r\n\r\n const hr = document.createElement('hr');\r\n container.append(hr);\r\n forwardBtnMenu.append(container);\r\n });\r\n\r\n forwardBtnMenu.append(forwardElements.changePeer.element);\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const forwardHover = this.forwardHover = new DropdownHover({\r\n element: forwardBtnMenu\r\n });\r\n }\r\n\r\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\r\n this.replyElements.container.append(forwardBtnMenu);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const {input} = b.checkboxField;\r\n input.type = 'radio';\r\n input.name = idx < 2 ? 'author' : 'caption';\r\n input.value = '' + +!(idx % 2);\r\n });\r\n\r\n //\r\n\r\n this.newMessageWrapper = document.createElement('div');\r\n this.newMessageWrapper.classList.add('new-message-wrapper');\r\n\r\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\r\n\r\n this.inputMessageContainer = document.createElement('div');\r\n this.inputMessageContainer.classList.add('input-message-container');\r\n\r\n if(this.chat.type === 'chat') {\r\n this.goDownUnreadBadge = document.createElement('span');\r\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goDownBtn.append(this.goDownUnreadBadge);\r\n\r\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button chat-secondary-button bubbles-go-mention'});\r\n this.goMentionUnreadBadge = document.createElement('span');\r\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goMentionBtn.append(this.goMentionUnreadBadge);\r\n this.inputContainer.append(this.goMentionBtn);\r\n\r\n attachClickEvent(this.goMentionBtn, (e) => {\r\n cancelEvent(e);\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n this.managers.appMessagesManager.goToNextMention(this.chat.peerId).then((mid) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(mid) {\r\n this.chat.setMessageId(mid);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\r\n\r\n attachClickEvent(this.btnScheduled, (e) => {\r\n this.appImManager.openScheduled(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.btnScheduled.classList.remove('hide');\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((value) => {\r\n this.btnScheduled.classList.toggle('hide', !value.length);\r\n });\r\n });\r\n\r\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\r\n this.replyKeyboard = new ReplyKeyboard({\r\n appendTo: this.rowsWrapper,\r\n listenerSetter: this.listenerSetter,\r\n managers: this.managers,\r\n btnHover: this.btnToggleReplyMarkup,\r\n chatInput: this\r\n });\r\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\r\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\r\n\r\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.managers);\r\n this.botCommandsToggle = document.createElement('div');\r\n this.botCommandsToggle.classList.add('new-message-bot-commands');\r\n\r\n const scaler = document.createElement('div');\r\n scaler.classList.add('new-message-bot-commands-icon-scale');\r\n\r\n const icon = this.botCommandsIcon = document.createElement('div');\r\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\r\n scaler.append(icon);\r\n this.botCommandsToggle.append(scaler);\r\n\r\n attachClickEvent(this.botCommandsToggle, (e) => {\r\n cancelEvent(e);\r\n const isShown = icon.classList.contains('state-back');\r\n if(isShown) {\r\n this.botCommands.toggle(true);\r\n icon.classList.remove('state-back');\r\n } else {\r\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\r\n icon.classList.add('state-back');\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.botCommands.addEventListener('visible', () => {\r\n icon.classList.add('state-back');\r\n });\r\n\r\n this.botCommands.addEventListener('hiding', () => {\r\n icon.classList.remove('state-back');\r\n });\r\n }\r\n\r\n this.attachMenuButtons = [{\r\n icon: 'image',\r\n text: 'Chat.Input.Attach.PhotoOrVideo',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\r\n this.fileInput.setAttribute('accept', accept);\r\n this.willAttachType = 'media';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'document',\r\n text: 'Chat.Input.Attach.Document',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n this.fileInput.removeAttribute('accept');\r\n this.willAttachType = 'document';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'poll',\r\n text: 'Poll',\r\n onClick: () => {\r\n PopupElement.createPopup(PopupCreatePoll, this.chat).show();\r\n },\r\n verify: (peerId) => peerId.isAnyChat() && this.chat.canSend('send_polls')\r\n }];\r\n\r\n this.attachMenu = ButtonMenuToggle({noRipple: true, listenerSetter: this.listenerSetter}, 'top-left', this.attachMenuButtons);\r\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\r\n this.attachMenu.classList.remove('tgico-more');\r\n\r\n // this.inputContainer.append(this.sendMenu);\r\n\r\n this.recordTimeEl = document.createElement('div');\r\n this.recordTimeEl.classList.add('record-time');\r\n\r\n this.fileInput = document.createElement('input');\r\n this.fileInput.type = 'file';\r\n this.fileInput.multiple = true;\r\n this.fileInput.style.display = 'none';\r\n\r\n this.newMessageWrapper.append(...[this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\r\n\r\n this.rowsWrapper.append(this.replyElements.container);\r\n this.autocompleteHelperController = new AutocompleteHelperController();\r\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\r\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\r\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\r\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\r\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\r\n this.rowsWrapper.append(this.newMessageWrapper);\r\n\r\n this.btnCancelRecord = ButtonIcon('binfilled btn-circle btn-record-cancel chat-secondary-button');\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 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 this.messageInputField?.onFakeInput();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\r\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId) return;\r\n this.setDraft(draft, true, force);\r\n });\r\n\r\n this.listenerSetter.add(this.appImManager)('peer_changing', (chat) => {\r\n if(this.chat === chat) {\r\n this.saveDraft();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(this.appImManager)('chat_changing', ({from, to}) => {\r\n if(this.chat === from) {\r\n this.autocompleteHelperController.toggleListNavigation(false);\r\n } else if(this.chat === to) {\r\n this.autocompleteHelperController.toggleListNavigation(true);\r\n }\r\n });\r\n\r\n if(this.chat.type === 'scheduled') {\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n });\r\n } else {\r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(this.chat.peerId === peerId) {\r\n if(msgs.has(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n\r\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\r\n this.clearHelper('reply');\r\n }\r\n\r\n /* if(this.chat.isStartButtonNeeded()) {\r\n this.setStartParam(BOT_START_PARAM);\r\n } */\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs.has(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 const files = (e.target as HTMLInputElement & EventTarget).files;\r\n if(!files.length) {\r\n return;\r\n }\r\n\r\n PopupElement.createPopup(PopupNewMedia, this.chat, Array.from(files).slice(), this.willAttachType);\r\n this.fileInput.value = '';\r\n }, false);\r\n\r\n /* let time = Date.now();\r\n this.btnSend.addEventListener('touchstart', (e) => {\r\n time = Date.now();\r\n });\r\n\r\n let eventName1 = 'touchend';\r\n this.btnSend.addEventListener(eventName1, (e: Event) => {\r\n //cancelEvent(e);\r\n console.log(eventName1 + ', time: ' + (Date.now() - time));\r\n });\r\n\r\n let eventName = 'mousedown';\r\n this.btnSend.addEventListener(eventName, (e: Event) => {\r\n cancelEvent(e);\r\n console.log(eventName + ', time: ' + (Date.now() - time));\r\n }); */\r\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\r\n\r\n if(this.recorder) {\r\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.recorder.onstop = () => {\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n this.recordRippleEl.style.transform = '';\r\n };\r\n\r\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\r\n if(this.releaseMediaPlayback) {\r\n this.releaseMediaPlayback();\r\n this.releaseMediaPlayback = undefined;\r\n }\r\n\r\n if(this.recordingOverlayListener) {\r\n this.listenerSetter.remove(this.recordingOverlayListener);\r\n this.recordingOverlayListener = undefined;\r\n }\r\n\r\n if(this.recordingNavigationItem) {\r\n appNavigationController.removeItem(this.recordingNavigationItem);\r\n this.recordingNavigationItem = undefined;\r\n }\r\n\r\n if(this.recordCanceled) {\r\n return;\r\n }\r\n\r\n const {peerId, threadId} = this.chat;\r\n const replyToMsgId = this.replyToMsgId;\r\n\r\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\r\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\r\n /* const fileName = new Date().toISOString() + \".opus\";\r\n console.log('Recorder data received', typedArray, dataBlob); */\r\n\r\n // let perf = performance.now();\r\n opusDecodeController.decode(typedArray, true).then((result) => {\r\n // console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\r\n\r\n opusDecodeController.setKeepAlive(false);\r\n\r\n // тут objectURL ставится уже с audio/wav\r\n this.managers.appMessagesManager.sendFile(peerId, dataBlob, {\r\n isVoiceMessage: true,\r\n isMedia: true,\r\n duration,\r\n waveform: result.waveform,\r\n objectURL: result.url,\r\n replyToMsgId,\r\n threadId,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, true);\r\n });\r\n };\r\n }\r\n\r\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\r\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\r\n\r\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\r\n this.botStartBtn.append(i18n('BotStart'));\r\n\r\n attachClickEvent(this.botStartBtn, () => {\r\n const {startParam} = this;\r\n if(startParam === undefined) {\r\n return;\r\n }\r\n\r\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\r\n const peerId = this.chat.peerId;\r\n const middleware = this.chat.bubbles.getMiddleware(() => {\r\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\r\n });\r\n\r\n this.managers.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\r\n if(middleware()) {\r\n toggle();\r\n this.toggleBotStartBtnDisability = undefined;\r\n this.setStartParam();\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.controlContainer.append(this.botStartBtn);\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\r\n this.controlContainer.append(this.pinnedControlBtn);\r\n\r\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\r\n const peerId = this.chat.peerId;\r\n\r\n new PopupPinMessage(peerId, 0, true, () => {\r\n this.chat.appImManager.setPeer(); // * close tab\r\n\r\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\r\n const originalChat = this.chat.appImManager.chat;\r\n if(originalChat.topbar.pinnedMessage) {\r\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\r\n }\r\n });\r\n });\r\n\r\n this.chatInput.classList.add('type-pinned');\r\n }\r\n\r\n public _center(neededFakeContainer: HTMLElement, animate?: boolean) {\r\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\r\n return;\r\n }\r\n\r\n if(neededFakeContainer === this.fakeWrapperTo) {\r\n return;\r\n }\r\n\r\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\r\n this.inputContainer.classList.remove('is-centering');\r\n void this.rowsWrapper.offsetLeft; // reflow\r\n // this.inputContainer.classList.add('is-centering');\r\n // void this.rowsWrapper.offsetLeft; // reflow\r\n } */\r\n\r\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\r\n const forwards = !!neededFakeContainer;\r\n const oldFakeWrapperTo = this.fakeWrapperTo;\r\n let transform = '', borderRadius = '', needTranslateX: number;\r\n // if(forwards) {]\r\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\r\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\r\n const widthFrom = fakeRowsRect.width;\r\n const widthTo = fakeSelectionRect.width;\r\n\r\n if(widthFrom !== widthTo) {\r\n const scale = (widthTo/* - 8 */) / widthFrom;\r\n const initTranslateX = (widthFrom - widthTo) / 2;\r\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\r\n\r\n if(forwards) {\r\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\r\n // transform = `translateX(0px) scaleX(${scale})`;\r\n\r\n if(scale < 1) {\r\n const br = 16;\r\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\r\n }\r\n }\r\n // scale = widthTo / widthFrom;\r\n }\r\n // }\r\n\r\n this.fakeWrapperTo = neededFakeContainer;\r\n\r\n const duration = animate ? 200 : 0;\r\n SetTransition(this.inputContainer, 'is-centering', forwards, duration);\r\n SetTransition(this.rowsWrapperWrapper, 'is-centering-to-control', !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')), duration);\r\n this.rowsWrapper.style.transform = transform;\r\n this.rowsWrapper.style.borderRadius = borderRadius;\r\n\r\n return {\r\n transform,\r\n borderRadius,\r\n needTranslateX: oldFakeWrapperTo && (\r\n (\r\n neededFakeContainer &&\r\n neededFakeContainer.classList.contains('chat-input-control') &&\r\n oldFakeWrapperTo === this.fakeSelectionWrapper\r\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\r\n ) ? needTranslateX * -.5 : needTranslateX,\r\n widthFrom,\r\n widthTo\r\n };\r\n }\r\n\r\n public async center(animate = false) {\r\n return this._center(await this.getNeededFakeContainer(), animate);\r\n }\r\n\r\n public setStartParam(startParam?: string) {\r\n if(this.startParam === startParam) {\r\n return;\r\n }\r\n\r\n this.startParam = startParam;\r\n this.center(true);\r\n }\r\n\r\n public async getNeededFakeContainer(startParam = this.startParam) {\r\n if(this.chat.selection.isSelecting) {\r\n return this.fakeSelectionWrapper;\r\n } else if(\r\n startParam !== undefined ||\r\n !(await this.chat.canSend()) ||\r\n this.chat.type === 'pinned' ||\r\n await this.chat.isStartButtonNeeded()\r\n ) {\r\n return this.controlContainer;\r\n }\r\n }\r\n\r\n // public getActiveContainer() {\r\n // if(this.chat.selection.isSelecting) {\r\n // return this.chat\r\n // }\r\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\r\n // }\r\n\r\n // public setActiveContainer() {\r\n // const container = this.activeContainer;\r\n // const newContainer = this.getActiveContainer();\r\n // if(newContainer === container) {\r\n // return;\r\n // }\r\n\r\n\r\n // }\r\n\r\n private onCancelRecordClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n this.recordCanceled = true;\r\n this.recorder.stop();\r\n opusDecodeController.setKeepAlive(false);\r\n };\r\n\r\n private onEmoticonsOpen = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\r\n };\r\n\r\n private onEmoticonsClose = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\r\n };\r\n\r\n public getReadyToSend(callback: () => void) {\r\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\r\n }\r\n\r\n public scheduleSending = async(callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\r\n const {peerId} = this.chat;\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && await this.managers.appUsersManager.isUserOnlineVisible(peerId);\r\n\r\n new PopupSchedule(initDate, (timestamp) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\r\n if(timestamp <= minTimestamp) {\r\n timestamp = undefined;\r\n }\r\n\r\n this.scheduleDate = timestamp;\r\n callback();\r\n\r\n if(this.chat.type !== 'scheduled' && timestamp) {\r\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const popups = PopupElement.getPopups(PopupStickers);\r\n popups.forEach((popup) => popup.hide());\r\n\r\n this.appImManager.openScheduled(peerId);\r\n }, 0);\r\n }\r\n }, canSendWhenOnline).show();\r\n };\r\n\r\n public async setUnreadCount() {\r\n if(!this.goDownUnreadBadge) {\r\n return;\r\n }\r\n\r\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.chat.peerId);\r\n const count = dialog?.unread_count;\r\n this.goDownUnreadBadge.innerText = '' + (count || '');\r\n this.goDownUnreadBadge.classList.toggle('badge-gray', await this.managers.appNotificationsManager.isPeerLocalMuted(this.chat.peerId, true));\r\n\r\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\r\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\r\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\r\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\r\n }\r\n }\r\n\r\n public getCurrentInputAsDraft() {\r\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\r\n\r\n let draft: DraftMessage.draftMessage;\r\n if(value.length || this.replyToMsgId) {\r\n draft = {\r\n _: 'draftMessage',\r\n date: tsNow(true),\r\n message: value,\r\n entities: entities.length ? entities : undefined,\r\n pFlags: {\r\n no_webpage: this.noWebPage\r\n },\r\n reply_to_msg_id: this.replyToMsgId\r\n };\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public saveDraft() {\r\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\r\n const draft = this.getCurrentInputAsDraft();\r\n this.managers.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\r\n }\r\n\r\n public destroy() {\r\n // this.chat.log.error('Input destroying');\r\n\r\n this.listenerSetter.removeAll();\r\n }\r\n\r\n public cleanup(helperToo = true) {\r\n if(!this.chat.peerId) {\r\n this.chatInput.classList.add('hide');\r\n this.goDownBtn.classList.add('hide');\r\n }\r\n\r\n cancelSelection();\r\n\r\n this.lastTimeType = 0;\r\n this.startParam = undefined;\r\n\r\n if(this.toggleBotStartBtnDisability) {\r\n this.toggleBotStartBtnDisability();\r\n this.toggleBotStartBtnDisability = undefined;\r\n }\r\n\r\n if(this.messageInput) {\r\n this.clearInput();\r\n helperToo && this.clearHelper();\r\n }\r\n }\r\n\r\n public async setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\r\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\r\n\r\n if(!draft) {\r\n draft = await this.managers.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\r\n\r\n if(!draft) {\r\n if(force) { // this situation can only happen when sending message with clearDraft\r\n /* const height = this.chatInput.getBoundingClientRect().height;\r\n const willChangeHeight = 78 - height;\r\n this.willChangeHeight = willChangeHeight; */\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n this.t();\r\n }\r\n\r\n this.messageInputField.inputFake.textContent = '';\r\n this.messageInputField.onFakeInput(false);\r\n\r\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\r\n fastRaf(() => {\r\n this.onMessageSent();\r\n });\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n }\r\n\r\n const wrappedDraft = wrapDraft(draft, this.chat.peerId);\r\n const currentDraft = this.getCurrentInputAsDraft();\r\n\r\n if(draftsAreEqual(draft, currentDraft) &&/* this.messageInputField.value === wrappedDraft && */this.replyToMsgId === draft.reply_to_msg_id) return false;\r\n\r\n if(fromUpdate) {\r\n this.clearHelper();\r\n }\r\n\r\n this.noWebPage = draft.pFlags.no_webpage;\r\n if(draft.reply_to_msg_id) {\r\n this.initMessageReply(draft.reply_to_msg_id);\r\n }\r\n\r\n this.setInputValue(wrappedDraft, fromUpdate, fromUpdate);\r\n return true;\r\n }\r\n\r\n private createSendAs() {\r\n this.sendAsPeerId = undefined;\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n let firstChange = true;\r\n this.sendAs = new ChatSendAs(\r\n this.managers,\r\n (container, skipAnimation) => {\r\n let useRafs = 0;\r\n if(!container.parentElement) {\r\n this.newMessageWrapper.prepend(container);\r\n useRafs = 2;\r\n }\r\n\r\n this.updateOffset('as', true, skipAnimation, useRafs);\r\n },\r\n (sendAsPeerId) => {\r\n this.sendAsPeerId = sendAsPeerId;\r\n\r\n // do not change placeholder earlier than finishPeerChange does\r\n if(firstChange) {\r\n firstChange = false;\r\n return;\r\n }\r\n\r\n this.getPlaceholderKey().then((key) => {\r\n this.updateMessageInputPlaceholder(key);\r\n });\r\n }\r\n );\r\n } else {\r\n this.sendAs = undefined;\r\n }\r\n\r\n return this.sendAs;\r\n }\r\n\r\n public async finishPeerChange(startParam?: string) {\r\n const peerId = this.chat.peerId;\r\n\r\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, botCommandsToggle} = this;\r\n\r\n const previousSendAs = this.sendAs;\r\n const sendAs = this.createSendAs();\r\n\r\n const [\r\n isBroadcast,\r\n canPinMessage,\r\n isBot,\r\n canSend,\r\n neededFakeContainer,\r\n ackedPeerFull,\r\n ackedScheduledMids,\r\n setSendAsCallback,\r\n filteredAttachMenuButtons\r\n ] = await Promise.all([\r\n this.managers.appPeersManager.isBroadcast(peerId),\r\n this.managers.appPeersManager.canPinMessage(peerId),\r\n this.managers.appPeersManager.isBot(peerId),\r\n this.chat.canSend(),\r\n this.getNeededFakeContainer(startParam),\r\n modifyAckedPromise(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId)),\r\n btnScheduled ? modifyAckedPromise(this.managers.acknowledged.appMessagesManager.getScheduledMessages(peerId)) : undefined,\r\n sendAs ? (sendAs.setPeerId(this.chat.peerId), sendAs.updateManual(true)) : undefined,\r\n this.filterAttachMenuButtons()\r\n ]);\r\n\r\n const placeholderKey = this.messageInput ? await this.getPlaceholderKey() : undefined;\r\n\r\n return () => {\r\n // console.warn('[input] finishpeerchange start');\r\n\r\n chatInput.classList.remove('hide');\r\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\r\n goDownBtn.classList.remove('hide');\r\n\r\n this.messageInputField?.onFakeInput();\r\n\r\n if(this.goDownUnreadBadge) {\r\n this.setUnreadCount();\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n chatInput.classList.toggle('can-pin', canPinMessage);\r\n }/* else if(this.chat.type === 'chat') {\r\n } */\r\n\r\n if(forwardElements) {\r\n this.forwardWasDroppingAuthor = false;\r\n forwardElements.showCaption.checkboxField.setValueSilently(true);\r\n forwardElements.showSender.checkboxField.setValueSilently(true);\r\n }\r\n\r\n if(btnScheduled && ackedScheduledMids) {\r\n btnScheduled.classList.add('hide');\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n callbackify(ackedScheduledMids.result, (mids) => {\r\n if(!middleware() || !mids) return;\r\n btnScheduled.classList.toggle('hide', !mids.length);\r\n });\r\n }\r\n\r\n if(this.newMessageWrapper) {\r\n this.updateOffset(null, false, true);\r\n }\r\n\r\n if(botCommandsToggle) {\r\n this.hasBotCommands = undefined;\r\n this.botCommands.toggle(true, undefined, true);\r\n this.updateBotCommandsToggle(true);\r\n botCommandsToggle.remove();\r\n if(isBot) {\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const result = ackedPeerFull.result;\r\n callbackify(result, (userFull) => {\r\n if(!middleware()) return;\r\n this.updateBotCommands(userFull as UserFull.userFull, !(result instanceof Promise));\r\n });\r\n }\r\n }\r\n\r\n if(previousSendAs) {\r\n previousSendAs.destroy();\r\n }\r\n\r\n if(setSendAsCallback) {\r\n setSendAsCallback();\r\n }\r\n\r\n if(replyKeyboard) {\r\n replyKeyboard.setPeer(peerId);\r\n }\r\n\r\n if(sendMenu) {\r\n sendMenu.setPeerId(peerId);\r\n }\r\n\r\n if(this.messageInput) {\r\n this.updateMessageInput(canSend, placeholderKey, filteredAttachMenuButtons);\r\n this.messageInput.dataset.peerId = '' + peerId;\r\n } else if(this.pinnedControlBtn) {\r\n this.pinnedControlBtn.append(i18n(canPinMessage ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\r\n }\r\n\r\n // * testing\r\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\r\n\r\n this.startParam = startParam;\r\n\r\n this._center(neededFakeContainer, false);\r\n\r\n // console.warn('[input] finishpeerchange ends');\r\n };\r\n }\r\n\r\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\r\n if(type) {\r\n this.newMessageWrapper.dataset.offset = type;\r\n } else {\r\n delete this.newMessageWrapper.dataset.offset;\r\n }\r\n\r\n SetTransition(this.newMessageWrapper, 'has-offset', forwards, skipAnimation ? 0 : 300, undefined, useRafs);\r\n }\r\n\r\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\r\n this.hasBotCommands = !!userFull.bot_info?.commands?.length;\r\n this.updateBotCommandsToggle(skipAnimation);\r\n }\r\n\r\n private updateBotCommandsToggle(skipAnimation?: boolean) {\r\n const {botCommandsToggle, hasBotCommands} = this;\r\n\r\n const show = !!hasBotCommands && this.isInputEmpty();\r\n if(!hasBotCommands) {\r\n if(!botCommandsToggle.parentElement) {\r\n return;\r\n }\r\n\r\n botCommandsToggle.remove();\r\n }\r\n\r\n const forwards = show;\r\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\r\n\r\n if(!botCommandsToggle.parentElement) {\r\n this.newMessageWrapper.prepend(botCommandsToggle);\r\n }\r\n\r\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\r\n }\r\n\r\n private async getPlaceholderKey() {\r\n const {peerId, threadId} = this.chat;\r\n let key: LangPackKey;\r\n if(threadId) {\r\n key = 'Comment';\r\n } else if(await this.managers.appPeersManager.isBroadcast(peerId)) {\r\n key = 'ChannelBroadcast';\r\n } else if(\r\n (this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) ||\r\n await this.managers.appMessagesManager.isAnonymousSending(peerId)\r\n ) {\r\n key = 'SendAnonymously';\r\n } else {\r\n key = 'Message';\r\n }\r\n\r\n return key;\r\n }\r\n\r\n private updateMessageInputPlaceholder(key: LangPackKey) {\r\n // console.warn('[input] update placeholder');\r\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\r\n if(!i) {\r\n return;\r\n }\r\n\r\n i.compareAndUpdate({key});\r\n }\r\n\r\n private filterAttachMenuButtons() {\r\n if(!this.attachMenuButtons) return;\r\n const {peerId, threadId} = this.chat;\r\n return filterAsync(this.attachMenuButtons, (button) => {\r\n return button.verify(peerId, threadId);\r\n });\r\n }\r\n\r\n public updateMessageInput(canSend: boolean, placeholderKey: LangPackKey, visible: ChatInput['attachMenuButtons']) {\r\n const {chatInput, attachMenu, messageInput} = this;\r\n const {peerId, threadId} = this.chat;\r\n const isHidden = chatInput.classList.contains('is-hidden');\r\n const willBeHidden = !canSend;\r\n if(isHidden !== willBeHidden) {\r\n chatInput.classList.add('no-transition');\r\n chatInput.classList.toggle('is-hidden', !canSend);\r\n void chatInput.offsetLeft; // reflow\r\n chatInput.classList.remove('no-transition');\r\n }\r\n\r\n this.updateMessageInputPlaceholder(placeholderKey);\r\n\r\n this.attachMenuButtons && this.attachMenuButtons.forEach((button) => {\r\n button.element.classList.toggle('hide', !visible.includes(button));\r\n });\r\n\r\n if(!canSend) {\r\n messageInput.contentEditable = 'inherit';\r\n } else {\r\n messageInput.contentEditable = 'true';\r\n this.setDraft(undefined, false);\r\n\r\n if(!messageInput.innerHTML) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n }\r\n\r\n if(attachMenu) {\r\n attachMenu.toggleAttribute('disabled', !visible.length);\r\n attachMenu.classList.toggle('btn-disabled', !visible.length);\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n private attachMessageInputField() {\r\n const oldInputField = this.messageInputField;\r\n this.messageInputField = new InputFieldAnimated({\r\n placeholder: 'Message',\r\n name: 'message',\r\n withLinebreaks: 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) => {\r\n const key = e.key;\r\n\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 if(emoticonsDropdown.isActive()) {\r\n emoticonsDropdown.toggle(false);\r\n blurActiveElement();\r\n cancelEvent(e);\r\n // this.messageInput.focus();\r\n return;\r\n }\r\n\r\n this.appImManager.selectTab(1); // * set chat tab for album orientation\r\n // this.saveScroll();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n /* this.listenerSetter.add(window)('resize', () => {\r\n this.restoreScroll();\r\n }); */\r\n\r\n /* if(isSafari) {\r\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n emoticonsDropdown.toggle(false);\r\n });\r\n });\r\n });\r\n } */\r\n }\r\n\r\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n const inputType = (e as InputEvent).inputType;\r\n //console.log('message beforeinput event', e);\r\n\r\n if(inputType.indexOf('format') === 0) {\r\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\r\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\r\n if(this.applyMarkdown(markdownType)) {\r\n cancelEvent(e); // * cancel legacy markdown event\r\n }\r\n }\r\n }); */\r\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\r\n this.listenerSetter.add(this.messageInput)('keyup', () => {\r\n this.checkAutocomplete();\r\n });\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n this.listenerSetter.add(this.messageInput)('focusin', () => {\r\n if(this.chat.bubbles.scrollable.loadedAll.bottom) {\r\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private prepareDocumentExecute = () => {\r\n this.executedHistory.push(this.messageInput.innerHTML);\r\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\r\n };\r\n\r\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\r\n cancelEvent(e); // cancel legacy event\r\n\r\n let html = this.messageInput.innerHTML;\r\n if(html && html !== needHTML) {\r\n this.lockRedo = true;\r\n\r\n let sameHTMLTimes = 0;\r\n do {\r\n document.execCommand(type, false, null);\r\n const currentHTML = this.messageInput.innerHTML;\r\n if(html === currentHTML) {\r\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\r\n break;\r\n }\r\n } else {\r\n sameHTMLTimes = 0;\r\n }\r\n\r\n html = currentHTML;\r\n } while(html !== needHTML);\r\n\r\n this.lockRedo = false;\r\n }\r\n };\r\n\r\n public applyMarkdown(type: MarkdownType, href?: string) {\r\n // const MONOSPACE_FONT = 'var(--font-monospace)';\r\n // const SPOILER_FONT = 'spoiler';\r\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\r\n // bold: 'Bold',\r\n // italic: 'Italic',\r\n // underline: 'Underline',\r\n // strikethrough: 'Strikethrough',\r\n // monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),\r\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null)\r\n // spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)\r\n };\r\n\r\n const c = (type: MarkdownType) => {\r\n commandsMap[type] = () => {\r\n const k = (canCombine.includes(type) ? canCombine : [type]).filter((type) => hasMarkup[type]);\r\n if(!indexOfAndSplice(k, type)) {\r\n k.push(type);\r\n }\r\n\r\n if(!k.length) {\r\n return this.resetCurrentFontFormatting();\r\n } else {\r\n return document.execCommand('fontName', false, 'markup-' + k.join('-'));\r\n }\r\n };\r\n };\r\n\r\n const canCombine = ['bold', 'italic', 'underline', 'strikethrough', 'spoiler'] as (typeof type)[];\r\n canCombine.forEach((type) => {\r\n c(type);\r\n });\r\n\r\n c('monospace');\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 // fix applying markdown when range starts from contenteditable=\"false\"\r\n let textNode: Text;\r\n // do {\r\n // // const {node, offset, selection} = getCaretPosNew(this.messageInput, true);\r\n // const selection = document.getSelection();\r\n // const range = selection.getRangeAt(0);\r\n // const {node, offset} = getCaretPosF(this.messageInput, range.startContainer, range.startOffset);\r\n // // const node = range.startContainer as ChildNode;\r\n // if(node?.textContent === BOM || (node as HTMLElement)?.isContentEditable === false) {\r\n // // selection.modify('extend', 'backward', 'character');\r\n // textNode = document.createTextNode(BOM);\r\n // (node.nodeType === node.ELEMENT_NODE ? node : node.parentElement).before(textNode);\r\n // range.setStart(textNode, 0);\r\n // }/* else {\r\n // break;\r\n // } */\r\n\r\n // break;\r\n // } while(true);\r\n\r\n const richInputHandler = RichInputHandler.getInstance();\r\n const restore = richInputHandler.prepareApplyingMarkdown();\r\n\r\n const listener = this.listenerSetter.add(this.messageInput)('input', cancelEvent, {capture: true, passive: false}) as any as Listener;\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const hasMarkup = hasMarkupInSelection(Object.keys(commandsMap) as (typeof type)[]);\r\n\r\n // * monospace can't be combined with different types\r\n /* if(type === 'monospace' || type === 'spoiler') {\r\n // executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const haveThisType = hasMarkup[type];\r\n // executed.push(document.execCommand('removeFormat', false, null));\r\n\r\n if(haveThisType) {\r\n executed.push(this.resetCurrentFontFormatting());\r\n } else {\r\n // if(type === 'monospace' || hasMarkup['monospace']) {\r\n // executed.push(this.resetCurrentFormatting());\r\n // }\r\n\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n } else */{\r\n if(hasMarkup['monospace'] && type === 'link') {\r\n executed.push(this.resetCurrentFormatting());\r\n }\r\n\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 restore();\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 if(textNode) {\r\n (textNode.parentElement === this.messageInput ? textNode : textNode.parentElement).remove();\r\n textNode.nodeValue = '';\r\n }\r\n\r\n this.listenerSetter.remove(listener);\r\n this.messageInputField.simulateInputEvent();\r\n\r\n return true;\r\n }\r\n\r\n private resetCurrentFormatting() {\r\n return document.execCommand('removeFormat', false, null);\r\n }\r\n\r\n private resetCurrentFontFormatting() {\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(!isSelectionEmpty(selection) && applyMarkdown) {\r\n // * костыльчик\r\n if(code === 'KeyK') {\r\n this.appImManager.markupTooltip.showLinkEditor();\r\n } else {\r\n this.applyMarkdown(applyMarkdown);\r\n }\r\n\r\n cancelEvent(e); // cancel legacy event\r\n }\r\n\r\n // return;\r\n if(code === 'KeyZ') {\r\n let html = this.messageInput.innerHTML;\r\n\r\n if(e.shiftKey) {\r\n if(this.undoHistory.length) {\r\n this.executedHistory.push(html);\r\n html = this.undoHistory.pop();\r\n this.undoRedo(e, 'redo', html);\r\n html = this.messageInput.innerHTML;\r\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\r\n this.canUndoFromHTML = html;\r\n }\r\n } else {\r\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\r\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\r\n this.undoHistory.push(html);\r\n html = this.executedHistory.pop();\r\n this.undoRedo(e, 'undo', html);\r\n\r\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\r\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onMessageInput = (e?: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n /* const inputType = (e as InputEvent).inputType;\r\n console.log('message input event', e);\r\n if(inputType === 'formatBold') {\r\n console.log('message input format', this.messageInput.innerHTML);\r\n cancelEvent(e);\r\n }\r\n\r\n if(!isSelectionSingle()) {\r\n alert('not single');\r\n } */\r\n\r\n // console.log('messageInput input', this.messageInput.innerText);\r\n // const value = this.messageInput.innerText;\r\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\r\n\r\n // const entities = parseEntities(value);\r\n const value = parseMarkdown(richValue, markdownEntities, true);\r\n const entities = mergeEntities(markdownEntities, parseEntities(value));\r\n\r\n // this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\r\n\r\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n }\r\n\r\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter((e) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\r\n if(urlEntities.length) {\r\n for(const entity of urlEntities) {\r\n let url: string;\r\n if(entity._ === 'messageEntityTextUrl') {\r\n url = entity.url;\r\n } else {\r\n url = richValue.slice(entity.offset, entity.offset + entity.length);\r\n\r\n if(!(url.includes('http://') || url.includes('https://'))) {\r\n continue;\r\n }\r\n }\r\n\r\n // console.log('messageInput url:', url);\r\n\r\n if(this.lastUrl !== url) {\r\n this.lastUrl = url;\r\n // this.willSendWebPage = null;\r\n const promise = this.getWebPagePromise = this.managers.appWebPagesManager.getWebPage(url).then((webpage) => {\r\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\r\n if(this.lastUrl !== url) return;\r\n if(webpage._ === 'webPage') {\r\n // console.log('got webpage: ', webpage);\r\n\r\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\r\n delete this.noWebPage;\r\n this.willSendWebPage = webpage;\r\n } else if(this.willSendWebPage) {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n break;\r\n }\r\n } else if(this.lastUrl) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n\r\n if(this.helperType) {\r\n this.helperFunc();\r\n } else {\r\n this.clearHelper();\r\n }\r\n }\r\n\r\n const isEmpty = !richValue.trim();\r\n if(isEmpty) {\r\n if(this.lastTimeType) {\r\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'});\r\n }\r\n\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.hide();\r\n }\r\n\r\n // * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared\r\n // * so have to reset formatting\r\n if(document.activeElement === this.messageInput) {\r\n // document.execCommand('styleWithCSS', false, 'true');\r\n setTimeout(() => {\r\n if(document.activeElement === this.messageInput) {\r\n this.resetCurrentFontFormatting();\r\n }\r\n }, 0);\r\n // document.execCommand('styleWithCSS', false, 'false');\r\n }\r\n } else {\r\n const time = Date.now();\r\n if((time - this.lastTimeType) >= 6000) {\r\n this.lastTimeType = time;\r\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'});\r\n }\r\n\r\n if(this.botCommands) {\r\n this.botCommands.toggle(true);\r\n }\r\n }\r\n\r\n if(this.botCommands) {\r\n this.updateBotCommandsToggle();\r\n }\r\n\r\n if(!this.editMsgId) {\r\n this.saveDraftDebounced();\r\n }\r\n\r\n this.checkAutocomplete(richValue, caretPos, entities);\r\n\r\n this.updateSendBtn();\r\n };\r\n\r\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\r\n RichInputHandler.getInstance().makeFocused(this.messageInput);\r\n\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 if(isHelper && caretPos !== -1) {\r\n const match = matches[2];\r\n // const {node, selection} = getCaretPosNew(this.messageInput);\r\n\r\n const selection = document.getSelection();\r\n // const range = document.createRange();\r\n let counter = 0;\r\n while(selection.toString() !== match) {\r\n if(++counter >= 10000) {\r\n throw new Error('lolwhat');\r\n }\r\n\r\n // for(let i = 0; i < match.length; ++i) {\r\n selection.modify('extend', 'backward', 'character');\r\n }\r\n }\r\n\r\n {\r\n // const fragment = wrapDraftText(insertText, {entities: insertEntity ? [insertEntity] : undefined, wrappingForPeerId: this.chat.peerId});\r\n insertRichTextAsHTML(this.messageInput, insertText, insertEntity ? [insertEntity] : undefined, this.chat.peerId);\r\n // const {node, offset} = getCaretPos(this.messageInput);\r\n // const fragmentLastChild = fragment.lastChild;\r\n // if(node?.nodeType === node.TEXT_NODE) {\r\n // const prefix = node.nodeValue.slice(0, offset);\r\n // const suffix = node.nodeValue.slice(offset);\r\n\r\n // const suffixNode = document.createTextNode(suffix);\r\n\r\n // node.nodeValue = prefix;\r\n // node.parentNode.insertBefore(suffixNode, node.nextSibling);\r\n // node.parentNode.insertBefore(fragment, suffixNode);\r\n\r\n // setCaretAt(fragmentLastChild.nextSibling);\r\n\r\n // this.messageInputField.simulateInputEvent();\r\n // }\r\n }\r\n return;\r\n\r\n // merge emojis\r\n const hadEntities = parseEntities(fullValue);\r\n mergeEntities(entities, hadEntities);\r\n\r\n // max for additional whitespace\r\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\r\n const addEntities: MessageEntity[] = [];\r\n if(insertEntity) {\r\n addEntities.push(insertEntity);\r\n insertEntity.offset = matchIndex;\r\n }\r\n\r\n // add offset to entities next to emoji\r\n const diff = matches ? insertLength - matches[2].length : insertLength;\r\n entities.forEach((entity) => {\r\n if(entity.offset >= matchIndex) {\r\n entity.offset += diff;\r\n }\r\n });\r\n\r\n mergeEntities(entities, addEntities);\r\n\r\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\r\n const caretEntity: MessageEntity.messageEntityCaret = {\r\n _: 'messageEntityCaret',\r\n offset: matchIndex + insertLength,\r\n length: 0\r\n };\r\n\r\n let insertCaretAtIndex = 0;\r\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\r\n const entity = entities[insertCaretAtIndex];\r\n if(entity.offset > caretEntity.offset) {\r\n break;\r\n }\r\n }\r\n\r\n entities.splice(insertCaretAtIndex, 0, caretEntity);\r\n }\r\n\r\n // const saveExecuted = this.prepareDocumentExecute();\r\n // can't exec .value here because it will instantly check for autocomplete\r\n const value = documentFragmentToHTML(wrapDraftText(newValue, {entities}));\r\n this.messageInputField.setValueSilently(value);\r\n\r\n const caret = this.messageInput.querySelector('.composer-sel');\r\n if(caret) {\r\n setCaretAt(caret);\r\n caret.remove();\r\n }\r\n\r\n // but it's needed to be checked only here\r\n this.onMessageInput();\r\n\r\n // saveExecuted();\r\n\r\n // document.execCommand('insertHTML', true, wrapEmojiText(emoji));\r\n }\r\n\r\n public onEmojiSelected = (emoji: ReturnType, autocomplete: boolean) => {\r\n const entity: MessageEntity = emoji.docId ? {_: 'messageEntityCustomEmoji', document_id: emoji.docId, length: emoji.emoji.length, offset: 0} : getEmojiEntityFromEmoji(emoji.emoji);\r\n this.insertAtCaret(emoji.emoji, entity, autocomplete);\r\n };\r\n\r\n private async checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\r\n // return;\r\n\r\n if(value === undefined) {\r\n const r = getRichValueWithCaret(this.messageInputField.input, true, true);\r\n value = r.value;\r\n caretPos = r.caretPos;\r\n entities = r.entities;\r\n }\r\n\r\n if(caretPos === -1) {\r\n caretPos = value.length;\r\n }\r\n\r\n if(entities === undefined) {\r\n const _value = parseMarkdown(value, entities, true);\r\n entities = mergeEntities(entities, parseEntities(_value));\r\n }\r\n\r\n value = value.slice(0, caretPos);\r\n\r\n if(this.previousQuery === value) {\r\n return;\r\n }\r\n\r\n this.previousQuery = value;\r\n\r\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\r\n let foundHelper: AutocompleteHelper;\r\n if(matches) {\r\n const entity = entities[0];\r\n\r\n let query = matches[2];\r\n const firstChar = query[0];\r\n\r\n if(this.stickersHelper &&\r\n rootScope.settings.stickers.suggest &&\r\n await this.chat.canSend('send_stickers') &&\r\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\r\n foundHelper = this.stickersHelper;\r\n this.stickersHelper.checkEmoticon(value);\r\n } else if(firstChar === '@') { // mentions\r\n const topMsgId = this.chat.threadId ? getServerMessageId(this.chat.threadId) : undefined;\r\n if(await this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\r\n foundHelper = this.mentionsHelper;\r\n }\r\n } else if(!matches[1] && firstChar === '/') { // commands\r\n if(await this.commandsHelper.checkQuery(query, this.chat.peerId)) {\r\n foundHelper = this.commandsHelper;\r\n }\r\n } else if(rootScope.settings.emoji.suggest) { // emoji\r\n query = query.replace(/^\\s*/, '');\r\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\r\n foundHelper = this.emojiHelper;\r\n this.emojiHelper.checkQuery(query, firstChar);\r\n }\r\n }\r\n }\r\n\r\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\r\n\r\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\r\n }\r\n\r\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\r\n let needPlaceholder = false;\r\n\r\n if(!foundHelper) {\r\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\r\n if(inlineMatch) {\r\n const username = inlineMatch[1];\r\n const query = value.slice(inlineMatch[0].length);\r\n needPlaceholder = inlineMatch[0].length === value.length;\r\n\r\n foundHelper = this.inlineHelper;\r\n\r\n if(!this.btnPreloader) {\r\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\r\n putPreloader(this.btnPreloader, true);\r\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\r\n } else {\r\n SetTransition(this.btnPreloader, 'show', true, 400);\r\n }\r\n\r\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\r\n if(needPlaceholder && user.bot_inline_placeholder) {\r\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\r\n }\r\n\r\n renderPromise.then(() => {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n });\r\n }).catch(noop);\r\n }\r\n }\r\n\r\n if(!needPlaceholder) {\r\n delete this.messageInput.dataset.inlinePlaceholder;\r\n }\r\n\r\n if(foundHelper !== this.inlineHelper) {\r\n if(this.btnPreloader) {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n }\r\n }\r\n\r\n return foundHelper;\r\n }\r\n\r\n private setRecording(value: boolean) {\r\n if(this.recording === value) {\r\n return;\r\n }\r\n\r\n SetTransition(this.chatInput, 'is-recording', value, 200);\r\n this.recording = value;\r\n this.updateSendBtn();\r\n }\r\n\r\n private onBtnSendClick = async(e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\r\n if(this.recording) {\r\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\r\n this.onCancelRecordClick();\r\n } else {\r\n this.recorder.stop();\r\n }\r\n } else {\r\n this.sendMessage();\r\n }\r\n } else {\r\n const isAnyChat = this.chat.peerId.isAnyChat();\r\n if(isAnyChat && !(await this.chat.canSend('send_media'))) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return;\r\n }\r\n\r\n this.chatInput.classList.add('is-locked');\r\n blurActiveElement();\r\n\r\n let restricted = false;\r\n if(!isAnyChat) {\r\n const userFull = await this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());\r\n if(userFull?.pFlags.voice_messages_forbidden) {\r\n toastNew({\r\n langPackKey: 'Chat.SendVoice.PrivacyError',\r\n langPackArguments: [await wrapPeerTitle({peerId: this.chat.peerId})]\r\n });\r\n restricted = true;\r\n }\r\n }\r\n\r\n if(restricted) {\r\n this.chatInput.classList.remove('is-locked');\r\n return;\r\n }\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 const 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 const 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 const diff = Date.now() - this.recordStartTime;\r\n const ms = diff % 1000;\r\n\r\n const 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 = async(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 await 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 draft = this.getCurrentInputAsDraft();\r\n if(draft) {\r\n delete draft.pFlags.no_webpage;\r\n }\r\n // const value = parseMarkdown(this.messageInputField.value, []);\r\n // if(message.message !== value) {\r\n if(!draftsAreEqual(draft, {...message, _: 'draftMessage'} as any)) {\r\n new PopupPeer('discard-editing', {\r\n buttons: [{\r\n langKey: 'Alert.Confirm.Discard',\r\n callback: () => {\r\n this.onHelperCancel(undefined, true);\r\n }\r\n }],\r\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\r\n }).show();\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n };\r\n\r\n private onHelperClick = (e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!findUpClassName(e.target, 'reply')) return;\r\n if(this.helperType === 'forward') {\r\n const {forwardElements} = this;\r\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\r\n contextMenuController.openBtnMenu(forwardElements.container);\r\n }\r\n } else if(this.helperType === 'reply') {\r\n this.chat.setMessageId(this.replyToMsgId);\r\n } else if(this.helperType === 'edit') {\r\n this.chat.setMessageId(this.editMsgId);\r\n }\r\n };\r\n\r\n private changeForwardRecipient() {\r\n if(this.helperWaitingForward) return;\r\n this.helperWaitingForward = true;\r\n\r\n const forwarding = copy(this.forwarding);\r\n const helperFunc = this.helperFunc;\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n let selected = false;\r\n const popup = new PopupForward(forwarding, () => {\r\n selected = true;\r\n });\r\n\r\n popup.addEventListener('close', () => {\r\n this.helperWaitingForward = false;\r\n\r\n if(!selected) {\r\n helperFunc();\r\n }\r\n });\r\n }\r\n\r\n public async clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\r\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\r\n const i = document.createElement('input');\r\n document.body.append(i);\r\n fixSafariStickyInput(i);\r\n this.messageInputField.setValueSilently(clearValue);\r\n fixSafariStickyInput(this.messageInput);\r\n i.remove();\r\n } else {\r\n this.messageInputField.setValueSilently(clearValue);\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n // this.messageInput.innerText = '';\r\n } else {\r\n // this.attachMessageInputField();\r\n // this.messageInput.innerText = '';\r\n\r\n // clear executions\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n this.executedHistory.length = 0;\r\n this.canUndoFromHTML = '';\r\n }\r\n\r\n let set = false;\r\n if(canSetDraft) {\r\n set = await this.setDraft(undefined, false);\r\n }\r\n\r\n if(!set && fireEvent) {\r\n this.onMessageInput();\r\n }\r\n }\r\n\r\n public isInputEmpty() {\r\n return isInputEmpty(this.messageInput);\r\n }\r\n\r\n public updateSendBtn() {\r\n let icon: 'send' | 'record' | 'edit' | 'schedule';\r\n\r\n const isInputEmpty = this.isInputEmpty();\r\n\r\n if(this.editMsgId) icon = 'edit';\r\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\r\n else icon = 'record';\r\n\r\n ['send', 'record', 'edit', 'schedule'].forEach((i) => {\r\n this.btnSend.classList.toggle(i, icon === i);\r\n });\r\n\r\n if(this.btnScheduled) {\r\n this.btnScheduled.classList.toggle('show', isInputEmpty);\r\n }\r\n\r\n if(this.btnToggleReplyMarkup) {\r\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty);\r\n }\r\n }\r\n\r\n private getValueAndEntities(input: HTMLElement) {\r\n const {entities: apiEntities, value} = getRichValueWithCaret(this.messageInput, true, false);\r\n const myEntities = parseEntities(value);\r\n const totalEntities = mergeEntities(apiEntities, myEntities);\r\n\r\n return {value, totalEntities};\r\n }\r\n\r\n public onMessageSent(clearInput = true, clearReply?: boolean) {\r\n if(this.chat.type !== 'scheduled') {\r\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\r\n }\r\n\r\n this.scheduleDate = undefined;\r\n this.sendSilent = undefined;\r\n\r\n const {totalEntities} = this.getValueAndEntities(this.messageInput);\r\n let nextOffset = 0;\r\n const emojiEntities: (MessageEntity.messageEntityEmoji | MessageEntity.messageEntityCustomEmoji)[] = totalEntities.filter((entity) => {\r\n if(entity._ === 'messageEntityEmoji' || entity._ === 'messageEntityCustomEmoji') {\r\n const endOffset = entity.offset + entity.length;\r\n return endOffset <= nextOffset ? false : (nextOffset = endOffset, true);\r\n }\r\n\r\n return false;\r\n }) as any;\r\n emojiEntities.forEach((entity) => {\r\n const emoji: AppEmoji = entity._ === 'messageEntityEmoji' ? {emoji: emojiFromCodePoints(entity.unicode)} : {docId: entity.document_id, emoji: ''};\r\n this.managers.appEmojiManager.pushRecentEmoji(emoji);\r\n });\r\n\r\n if(clearInput) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n this.clearInput();\r\n }\r\n\r\n if(clearReply || clearInput) {\r\n this.clearHelper();\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n public sendMessage(force = false) {\r\n const {editMsgId, chat} = this;\r\n if(chat.type === 'scheduled' && !force && !editMsgId) {\r\n this.scheduleSending();\r\n return;\r\n }\r\n\r\n const {peerId} = chat;\r\n const {noWebPage} = this;\r\n const sendingParams = this.chat.getMessageSendingParams();\r\n\r\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\r\n\r\n // return;\r\n if(editMsgId) {\r\n const message = this.editMessage;\r\n if(value.trim() || message.media) {\r\n this.managers.appMessagesManager.editMessage(message, value, {\r\n entities,\r\n noWebPage: noWebPage\r\n });\r\n\r\n this.onMessageSent();\r\n } else {\r\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\r\n\r\n return;\r\n }\r\n } else if(value.trim()) {\r\n this.managers.appMessagesManager.sendText(peerId, value, {\r\n entities,\r\n ...sendingParams,\r\n noWebPage: noWebPage,\r\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\r\n clearDraft: true\r\n });\r\n\r\n if(this.chat.type === 'scheduled') {\r\n this.onMessageSent(true);\r\n } else {\r\n this.onMessageSent(false, false);\r\n }\r\n // this.onMessageSent();\r\n }\r\n\r\n // * wait for sendText set messageId for invokeAfterMsg\r\n if(this.forwarding) {\r\n const forwarding = copy(this.forwarding);\r\n // setTimeout(() => {\r\n for(const fromPeerId in forwarding) {\r\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\r\n ...sendingParams,\r\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\r\n dropCaptions: this.isDroppingCaptions()\r\n }).catch(async(err: ApiError) => {\r\n if(err.type === 'VOICE_MESSAGES_FORBIDDEN') {\r\n toastNew({\r\n langPackKey: 'Chat.SendVoice.PrivacyError',\r\n langPackArguments: [await wrapPeerTitle({peerId})]\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(!value) {\r\n this.onMessageSent();\r\n }\r\n // }, 0);\r\n }\r\n\r\n // this.onMessageSent();\r\n }\r\n\r\n public async sendMessageWithDocument(\r\n document: MyDocument | DocId,\r\n force = false,\r\n clearDraft = false,\r\n silent = false\r\n ) {\r\n document = await this.managers.appDocsManager.getDoc(document);\r\n\r\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\r\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend(flag))) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return false;\r\n }\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft, silent));\r\n return false;\r\n }\r\n\r\n if(!document) {\r\n return false;\r\n }\r\n\r\n if(document.sticker && getStickerEffectThumb(document) && !rootScope.premium) {\r\n return false;\r\n }\r\n\r\n this.managers.appMessagesManager.sendFile(this.chat.peerId, document, {\r\n ...this.chat.getMessageSendingParams(),\r\n isMedia: true,\r\n clearDraft: clearDraft || undefined,\r\n silent\r\n });\r\n this.onMessageSent(clearDraft, true);\r\n\r\n if(document.type === 'sticker') {\r\n this.managers.appStickersManager.saveRecentSticker(document.id);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private canToggleHideAuthor() {\r\n const {forwardElements} = this;\r\n if(!forwardElements) return false;\r\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\r\n return !hideCaptionCheckboxField.checked ||\r\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\r\n }\r\n\r\n private isDroppingCaptions() {\r\n return !this.canToggleHideAuthor();\r\n }\r\n\r\n /* public sendSomething(callback: () => void, force = false) {\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendSomething(callback, true));\r\n return false;\r\n }\r\n\r\n callback();\r\n this.onMessageSent(false, true);\r\n\r\n return true;\r\n } */\r\n\r\n public async initMessageEditing(mid: number) {\r\n const message = (await this.chat.getMessage(mid)) as Message.message;\r\n\r\n let input = wrapDraftText(message.message, {entities: message.totalEntities, wrappingForPeerId: this.chat.peerId});\r\n const f = async() => {\r\n const replyFragment = await wrapMessageForReply(message, undefined, [message.mid]);\r\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\r\n\r\n this.editMsgId = mid;\r\n this.editMessage = message;\r\n input = undefined;\r\n };\r\n f();\r\n }\r\n\r\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\r\n const f = async() => {\r\n // const peerTitles: string[]\r\n const fromPeerIds = Object.keys(fromPeerIdsMids).map((fromPeerId) => fromPeerId.toPeerId());\r\n const smth: Set = new Set();\r\n let length = 0, messagesWithCaptionsLength = 0;\r\n\r\n const p = fromPeerIds.map(async(fromPeerId) => {\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n const promises = mids.map(async(mid) => {\r\n const message = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mid)) as Message.message;\r\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\r\n smth.add('N' + message.fwd_from.from_name);\r\n } else {\r\n smth.add('P' + message.fromId);\r\n }\r\n\r\n if(message.media && message.message) {\r\n ++messagesWithCaptionsLength;\r\n }\r\n });\r\n\r\n await Promise.all(promises);\r\n\r\n length += mids.length;\r\n });\r\n\r\n await Promise.all(p);\r\n\r\n const onlyFirstName = smth.size > 2;\r\n const peerTitles = [...smth].map((smth) => {\r\n const type = smth[0];\r\n smth = smth.slice(1);\r\n if(type === 'P') {\r\n const peerId = smth.toPeerId();\r\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\r\n } else {\r\n return onlyFirstName ? smth.split(' ')[0] : smth;\r\n }\r\n });\r\n\r\n const {forwardElements} = this;\r\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\r\n form.classList.toggle('hide', !messagesWithCaptionsLength);\r\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\r\n if(messagesWithCaptionsLength && hideCaption) {\r\n forwardElements.hideSender.checkboxField.setValueSilently(true);\r\n } else if(this.forwardWasDroppingAuthor !== undefined) {\r\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\r\n }\r\n\r\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n const title = i18n(titleKey, [length]);\r\n\r\n const senderTitles = document.createDocumentFragment();\r\n if(peerTitles.length < 3) {\r\n senderTitles.append(...join(peerTitles, false));\r\n } else {\r\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\r\n }\r\n\r\n let firstMessage: Message.message, usingFullAlbum: boolean;\r\n if(fromPeerIds.length === 1) {\r\n const fromPeerId = fromPeerIds[0];\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n firstMessage = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mids[0])) as Message.message;\r\n\r\n usingFullAlbum = !!firstMessage.grouped_id;\r\n if(usingFullAlbum) {\r\n const albumMids = await this.managers.appMessagesManager.getMidsByMessage(firstMessage);\r\n if(albumMids.length !== length || albumMids.find((mid) => !mids.includes(mid))) {\r\n usingFullAlbum = false;\r\n }\r\n }\r\n }\r\n\r\n const subtitleFragment = document.createDocumentFragment();\r\n const delimiter = ': ';\r\n if(usingFullAlbum || length === 1) {\r\n const mids = fromPeerIdsMids[fromPeerIds[0]];\r\n const replyFragment = await wrapMessageForReply(firstMessage, undefined, mids);\r\n subtitleFragment.append(\r\n senderTitles,\r\n delimiter,\r\n replyFragment\r\n );\r\n } else {\r\n subtitleFragment.append(\r\n i18n('Chat.Accessory.Forward.From'),\r\n delimiter,\r\n senderTitles\r\n );\r\n }\r\n\r\n const newReply = this.setTopInfo('forward', f, title, subtitleFragment);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const text = b.textElement;\r\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\r\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\r\n intl.update();\r\n });\r\n\r\n if(this.forwardHover) {\r\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\r\n }\r\n\r\n this.forwarding = fromPeerIdsMids;\r\n };\r\n\r\n f();\r\n }\r\n\r\n public async initMessageReply(mid: number) {\r\n if(this.replyToMsgId === mid) {\r\n return;\r\n }\r\n\r\n let message = await this.chat.getMessage(mid);\r\n const f = () => {\r\n let peerTitleEl: HTMLElement;\r\n if(!message) { // load missing replying message\r\n peerTitleEl = i18n('Loading');\r\n\r\n this.managers.appMessagesManager.reloadMessages(this.chat.peerId, mid).then((_message) => {\r\n if(this.replyToMsgId !== mid) {\r\n return;\r\n }\r\n\r\n message = _message;\r\n if(!message) {\r\n this.clearHelper('reply');\r\n } else {\r\n f();\r\n }\r\n });\r\n } else {\r\n peerTitleEl = new PeerTitle({\r\n peerId: message.fromId,\r\n dialog: false\r\n }).element;\r\n }\r\n\r\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\r\n this.replyToMsgId = mid;\r\n };\r\n f();\r\n }\r\n\r\n public clearHelper(type?: ChatInputHelperType) {\r\n if(this.helperType === 'edit' && type !== 'edit') {\r\n this.clearInput();\r\n }\r\n\r\n if(type) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n }\r\n\r\n if(type !== 'reply') {\r\n this.replyToMsgId = undefined;\r\n this.forwarding = undefined;\r\n }\r\n\r\n this.editMsgId = this.editMessage = undefined;\r\n this.helperType = this.helperFunc = undefined;\r\n\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n appNavigationController.removeByType('input-helper');\r\n this.chat.container.classList.remove('is-helper-active');\r\n this.t();\r\n }\r\n }\r\n\r\n private t() {\r\n const className = 'is-toggling-helper';\r\n SetTransition(this.chat.container, className, true, 150, () => {\r\n this.chat.container.classList.remove(className);\r\n });\r\n }\r\n\r\n public setInputValue(value: Parameters[0], clear = true, focus = true) {\r\n if(!value) value = '';\r\n\r\n if(clear) this.clearInput(false, false, value as string);\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?: Parameters[0],\r\n message?: any\r\n ) {\r\n if(this.willSendWebPage && type === 'reply') {\r\n return;\r\n }\r\n\r\n if(type !== 'webpage') {\r\n this.clearHelper(type);\r\n this.helperType = type;\r\n this.helperFunc = callerFunc;\r\n }\r\n\r\n const replyParent = this.replyElements.container;\r\n const oldReply = replyParent.lastElementChild.previousElementSibling;\r\n const haveReply = oldReply.classList.contains('reply');\r\n\r\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\r\n const {container} = wrapReply(title, subtitle, this.chat.animationGroup, message);\r\n if(haveReply) {\r\n oldReply.replaceWith(container);\r\n } else {\r\n replyParent.insertBefore(container, replyParent.lastElementChild);\r\n }\r\n\r\n if(type === 'webpage') {\r\n container.style.cursor = 'default';\r\n }\r\n\r\n if(!this.chat.container.classList.contains('is-helper-active')) {\r\n this.chat.container.classList.add('is-helper-active');\r\n this.t();\r\n }\r\n\r\n /* const scroll = appImManager.scrollable;\r\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\r\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\r\n } */\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'input-helper',\r\n onPop: () => {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n if(input !== undefined) {\r\n this.setInputValue(input);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateSendBtn();\r\n }, 0);\r\n\r\n return container;\r\n }\r\n\r\n // public saveScroll() {\r\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\r\n // this.scrollOffsetTop = this.chatInput.offsetTop;\r\n // }\r\n\r\n // public restoreScroll() {\r\n // if(this.chatInput.style.display) return;\r\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\r\n // let newOffsetTop = this.chatInput.offsetTop;\r\n // let container = this.chat.bubbles.scrollable.container;\r\n // let scrollTop = container.scrollTop;\r\n // let clientHeight = container.clientHeight;\r\n // let maxScrollTop = container.scrollHeight;\r\n\r\n // if(newOffsetTop < this.scrollOffsetTop) {\r\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\r\n // container.scrollTop += this.scrollDiff;\r\n // } else if(scrollTop !== this.scrollTop) {\r\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\r\n // if(endDiff < this.scrollDiff/* && false */) {\r\n // //container.scrollTop -= endDiff;\r\n // } else {\r\n // container.scrollTop -= this.scrollDiff;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DraftMessage} from '../../layer';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\n\nexport default function wrapDraft(draft: DraftMessage.draftMessage, wrappingForPeerId: PeerId, loadPromises?: Promise[]) {\n const myEntities = parseEntities(draft.message);\n const apiEntities = draft.entities || [];\n const totalEntities = mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n\n return wrapDraftText(draft.message, {entities: totalEntities, wrappingForPeerId, loadPromises});\n}\n","/*\r\n * https://github.com/morethanwords/tweb\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","// 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}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppMessagesManager} from '../../lib/appManagers/appMessagesManager';\nimport type ChatTopbar from './topbar';\nimport rootScope from '../../lib/rootScope';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from '../appMediaPlaybackController';\nimport DivAndCaption from '../divAndCaption';\nimport PinnedContainer from './pinnedContainer';\nimport Chat from './chat';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport PeerTitle from '../peerTitle';\nimport {i18n} from '../../lib/langPack';\nimport {formatFullSentTime} from '../../helpers/date';\nimport ButtonIcon from '../buttonIcon';\nimport {DocumentAttribute} from '../../layer';\nimport MediaProgressLine from '../mediaProgressLine';\nimport VolumeSelector from '../volumeSelector';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n private fasterEl: HTMLElement;\n private repeatEl: HTMLButtonElement;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected managers: AppManagers) {\n super({\n topbar,\n chat,\n listenerSetter: topbar.listenerSetter,\n className: 'audio',\n divAndCaption: new DivAndCaption(\n 'pinned-audio',\n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ),\n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('fast_rewind active', {noRipple: true});\n const nextEl = ButtonIcon('fast_forward active', {noRipple: true});\n\n const attachClick = (elem: HTMLElement, callback: () => void) => {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n callback();\n }, {listenerSetter: this.topbar.listenerSetter});\n };\n\n attachClick(prevEl, () => {\n appMediaPlaybackController.previous();\n });\n\n attachClick(nextEl, () => {\n appMediaPlaybackController.next();\n });\n\n this.toggleEl = ButtonIcon('', {noRipple: true});\n this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico');\n attachClick(this.toggleEl, () => {\n appMediaPlaybackController.toggle();\n });\n this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl);\n\n this.volumeSelector = new VolumeSelector(this.listenerSetter, true);\n const volumeProgressLineContainer = document.createElement('div');\n volumeProgressLineContainer.classList.add('progress-line-container');\n volumeProgressLineContainer.append(this.volumeSelector.container);\n const tunnel = document.createElement('div');\n tunnel.classList.add('pinned-audio-volume-tunnel');\n this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active');\n this.volumeSelector.btn.prepend(tunnel);\n this.volumeSelector.btn.append(volumeProgressLineContainer);\n\n this.repeatEl = ButtonIcon('audio_repeat', {noRipple: true});\n attachClick(this.repeatEl, () => {\n const params = appMediaPlaybackController.getPlaybackParams();\n if(!params.round) {\n appMediaPlaybackController.round = true;\n } else if(params.loop) {\n appMediaPlaybackController.round = false;\n appMediaPlaybackController.loop = false;\n } else {\n appMediaPlaybackController.loop = !appMediaPlaybackController.loop;\n }\n });\n\n const fasterEl = this.fasterEl = ButtonIcon('playback_2x', {noRipple: true});\n attachClick(fasterEl, () => {\n appMediaPlaybackController.playbackRate = fasterEl.classList.contains('active') ? 1 : 1.75;\n });\n\n this.wrapperUtils.prepend(this.volumeSelector.btn, fasterEl, this.repeatEl);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(appMediaPlaybackController)('play', this.onMediaPlay);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('pause', this.onPause);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('stop', this.onStop);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.onPlaybackParams);\n\n const playingDetails = appMediaPlaybackController.getPlayingDetails();\n if(playingDetails) {\n this.onMediaPlay(playingDetails);\n this.onPlaybackParams(playingDetails.playbackParams);\n }\n }\n\n public destroy() {\n if(this.progressLine) {\n this.progressLine.removeListeners();\n }\n }\n\n private onPlaybackParams = (playbackParams: ReturnType) => {\n this.fasterEl.classList.toggle('active', playbackParams.playbackRate > 1);\n\n this.repeatEl.classList.remove('tgico-audio_repeat', 'tgico-audio_repeat_single');\n this.repeatEl.classList.add(playbackParams.loop ? 'tgico-audio_repeat_single' : 'tgico-audio_repeat');\n this.repeatEl.classList.toggle('active', playbackParams.loop || playbackParams.round);\n };\n\n private onPause = () => {\n this.toggleEl.classList.remove('flip-icon');\n };\n\n private onStop = () => {\n this.toggle(true);\n };\n\n private onMediaPlay = ({doc, message, media, playbackParams}: ReturnType) => {\n let title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment;\n const isMusic = doc.type !== 'voice' && doc.type !== 'round';\n if(!isMusic) {\n title = new PeerTitle({peerId: message.fromId, fromName: message.fwd_from?.from_name}).element;\n\n // subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = wrapEmojiText(audioAttribute?.title ?? doc.file_name);\n subtitle = audioAttribute?.performer ? wrapEmojiText(audioAttribute.performer) : i18n('AudioUnknownArtist');\n }\n\n this.fasterEl.classList.toggle('hide', isMusic);\n this.repeatEl.classList.toggle('hide', !isMusic);\n\n this.onPlaybackParams(playbackParams);\n this.volumeSelector.setVolume();\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n // this.toggleEl.classList.add('flip-icon');\n this.toggleEl.classList.toggle('flip-icon', !media.paused);\n this.toggle(false);\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from './topbar';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport PinnedContainer from './pinnedContainer';\r\nimport PinnedMessageBorder from './pinnedMessageBorder';\r\nimport ReplyContainer, {wrapReplyDivAndCaption} from './replyContainer';\r\nimport rootScope from '../../lib/rootScope';\r\nimport Chat from './chat';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\r\nimport {i18n} from '../../lib/langPack';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport handleScrollSideEvent from '../../helpers/dom/handleScrollSideEvent';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport throttle from '../../helpers/schedulers/throttle';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport {Message} from '../../layer';\r\nimport {logger} from '../../lib/logger';\r\n\r\nclass AnimatedSuper {\r\n static DURATION = 200;\r\n static BASE_CLASS = 'animated-super';\r\n container: HTMLDivElement;\r\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\r\n clearTimeout: number;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedSuper.BASE_CLASS;\r\n }\r\n\r\n public getRow(index: number, animateFirst = false) {\r\n if(this.rows[index]) return this.rows[index].element;\r\n const row = document.createElement('div');\r\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\r\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\r\n this.rows[index] = {element: row, new: true};\r\n this.container.append(row);\r\n return row;\r\n }\r\n\r\n public clearRow(index: number) {\r\n if(!this.rows[index]) return;\r\n this.rows[index].element.remove();\r\n delete this.rows[index];\r\n }\r\n\r\n public clearRows(currentIndex?: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n this.clearTimeout = window.setTimeout(() => {\r\n for(const i in this.rows) {\r\n if(+i === currentIndex) continue;\r\n this.clearRow(+i);\r\n }\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n public setNewRow(index: number, reflow = false) {\r\n const row = this.rows[index];\r\n if(row.new) {\r\n if(reflow) {\r\n row.element.classList.remove('hide');\r\n void row.element.offsetLeft; // reflow\r\n } else {\r\n row.element.classList.remove('is-hiding', 'hide');\r\n }\r\n\r\n delete row.new;\r\n }\r\n\r\n this.clearRows(index);\r\n }\r\n\r\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\r\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\r\n return this.setNewRow(index);\r\n }\r\n\r\n const row = this.rows[index];\r\n const previousRow = this.rows[previousIndex];\r\n if(!previousRow && !ignorePrevious) {\r\n return this.setNewRow(index);\r\n }\r\n\r\n const sides = ['from-top', 'from-bottom'];\r\n if(!fromTop) sides.reverse();\r\n\r\n row.element.classList.add(sides[0]);\r\n row.element.classList.remove(sides[1]);\r\n if(previousRow) {\r\n previousRow.element.classList.add(sides[1]);\r\n previousRow.element.classList.remove(sides[0]);\r\n }\r\n\r\n if(row.new) {\r\n this.setNewRow(index, true);\r\n }\r\n\r\n row.element.classList.toggle('is-hiding', false);\r\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\r\n\r\n /* const height = row.element.getBoundingClientRect().height;\r\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\r\n if(previousRow) {\r\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\r\n } */\r\n\r\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\r\n if(previousRow) {\r\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\r\n } */\r\n\r\n this.clearRows(index);\r\n }\r\n}\r\n\r\nclass AnimatedCounter {\r\n static EMPTY_INDEX = -1;\r\n static BASE_CLASS = 'animated-counter';\r\n container: HTMLElement;\r\n decimals: {\r\n container: HTMLElement,\r\n placeholder: HTMLElement,\r\n animatedSuper: AnimatedSuper\r\n }[] = [];\r\n previousNumber = 0;\r\n clearTimeout: number;\r\n\r\n constructor(private reverse = false) {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedCounter.BASE_CLASS;\r\n }\r\n\r\n getDecimal(index: number) {\r\n if(this.decimals[index]) return this.decimals[index];\r\n const item = document.createElement('div');\r\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\r\n\r\n const animatedSuper = new AnimatedSuper();\r\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\r\n\r\n item.append(placeholder, animatedSuper.container);\r\n\r\n this.container.append(item);\r\n\r\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\r\n }\r\n\r\n clear(number: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n\r\n const decimals = ('' + number).length;\r\n if(decimals >= this.decimals.length) {\r\n return;\r\n }\r\n\r\n this.clearTimeout = window.setTimeout(() => {\r\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\r\n byDecimal.forEach((decimal) => {\r\n decimal.container.remove();\r\n });\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n /* prepareNumber(number: number) {\r\n const decimals = ('' + number).length;\r\n if(this.decimals.length < decimals) {\r\n for(let i = this.decimals.length; i < decimals; ++i) {\r\n this.getDecimal(i);\r\n }\r\n }\r\n } */\r\n\r\n hideLeft(number: number) {\r\n const decimals = ('' + number).length;\r\n const byDecimal = this.decimals.slice(decimals);// this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\r\n byDecimal.forEach((decimal) => {\r\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\r\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\r\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.clear(number);\r\n }\r\n\r\n setCount(number: number) {\r\n // this.prepareNumber(number);\r\n\r\n const previousByDecimal = Array.from('' + this.previousNumber).map((n) => +n);\r\n const byDecimal = Array.from('' + number).map((n) => +n);\r\n byDecimal.forEach((decimalNumber, idx) => {\r\n const decimal = this.getDecimal(idx);\r\n // const row = decimal.animatedSuper.getRow(number, true);\r\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\r\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\r\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\r\n // decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.hideLeft(number);\r\n // this.clear(number);\r\n this.previousNumber = number;\r\n }\r\n}\r\n\r\nexport default class ChatPinnedMessage {\r\n private static LOAD_COUNT = 50;\r\n private static LOAD_OFFSET = 5;\r\n\r\n public pinnedMessageContainer: PinnedContainer;\r\n private pinnedMessageBorder: PinnedMessageBorder;\r\n\r\n private pinnedMaxMid = 0;\r\n public pinnedMid = 0;\r\n public pinnedIndex = -1;\r\n private wasPinnedIndex = 0;\r\n private wasPinnedMediaIndex = 0;\r\n\r\n public locked = false;\r\n private waitForScrollBottom = false;\r\n\r\n public count = 0;\r\n private mids: number[] = [];\r\n private offsetIndex = 0;\r\n\r\n private loading = false;\r\n private loadedBottom = false;\r\n private loadedTop = false;\r\n\r\n private animatedSubtitle: AnimatedSuper;\r\n private animatedMedia: AnimatedSuper;\r\n private animatedCounter: AnimatedCounter;\r\n\r\n private listenerSetter: ListenerSetter;\r\n private scrollDownListenerSetter: ListenerSetter = null;\r\n\r\n public hidden = false;\r\n\r\n private getCurrentIndexPromise: Promise = null;\r\n private btnOpen: HTMLButtonElement;\r\n\r\n private setPinnedMessage: () => void;\r\n\r\n private isStatic: boolean;\r\n\r\n private debug: boolean;\r\n\r\n public setCorrectIndexThrottled: (lastScrollDirection?: number) => void;\r\n\r\n private log: ReturnType;\r\n\r\n constructor(private topbar: ChatTopbar, private chat: Chat, private managers: AppManagers) {\r\n this.listenerSetter = new ListenerSetter();\r\n this.log = logger('PM');\r\n this.debug = true;\r\n this.isStatic = false;\r\n\r\n const dAC = new ReplyContainer('pinned-message', chat.animationGroup);\r\n this.pinnedMessageContainer = new PinnedContainer({\r\n topbar,\r\n chat,\r\n listenerSetter: this.listenerSetter,\r\n className: 'message',\r\n divAndCaption: dAC,\r\n onClose: async() => {\r\n if(await managers.appPeersManager.canPinMessage(this.chat.peerId)) {\r\n new PopupPinMessage(this.chat.peerId, this.pinnedMid, true);\r\n } else {\r\n new PopupPinMessage(this.chat.peerId, 0, true);\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.pinnedMessageBorder = new PinnedMessageBorder();\r\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\r\n\r\n this.animatedSubtitle = new AnimatedSuper();\r\n dAC.subtitle.append(this.animatedSubtitle.container);\r\n\r\n this.animatedMedia = new AnimatedSuper();\r\n this.animatedMedia.container.classList.add('pinned-message-media-container');\r\n dAC.content.prepend(this.animatedMedia.container);\r\n\r\n this.animatedCounter = new AnimatedCounter(true);\r\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\r\n\r\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\r\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\r\n dAC.container.prepend(btnClose);\r\n\r\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\r\n\r\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\r\n\r\n attachClickEvent(this.btnOpen, (e) => {\r\n cancelEvent(e);\r\n this.topbar.openPinned(true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\r\n if(peerId === this.chat.peerId) {\r\n // this.wasPinnedIndex = 0;\r\n // setTimeout(() => {\r\n if(this.hidden) {\r\n this.pinnedMessageContainer.toggle(this.hidden = false);\r\n }\r\n\r\n this.loadedTop = this.loadedBottom = false;\r\n this.pinnedIndex = -1;\r\n this.pinnedMid = 0;\r\n this.count = 0;\r\n this.mids = [];\r\n this.offsetIndex = 0;\r\n this.pinnedMaxMid = 0;\r\n this.setCorrectIndex(0);\r\n // }, 300);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\r\n if(peerId === this.chat.peerId) {\r\n this.pinnedMessageContainer.toggle(this.hidden = true);\r\n }\r\n });\r\n\r\n // * 200 - no lags\r\n // * 100 - need test\r\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\r\n this.setCorrectIndexThrottled = throttle(this.setCorrectIndex.bind(this), 100, false);\r\n\r\n this.isStatic = this.chat.type === 'discussion';\r\n }\r\n\r\n public destroy() {\r\n this.pinnedMessageContainer.divAndCaption.container.remove();\r\n this.pinnedMessageContainer.toggle(true);\r\n this.listenerSetter.removeAll();\r\n this.unsetScrollDownListener(false);\r\n }\r\n\r\n public setCorrectIndex(lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n // return;\r\n\r\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\r\n return;\r\n }\r\n\r\n if((this.loadedBottom || this.loadedTop) && !this.count) {\r\n return;\r\n }\r\n\r\n // const perf = performance.now();\r\n const el = this.chat.bubbles.getBubbleByPoint('bottom');\r\n // this.log('setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(!el) return;\r\n\r\n // return;\r\n\r\n const mid = el.dataset.mid;\r\n if(el && mid !== undefined) {\r\n // this.log('setCorrectIndex will test mid:', mid);\r\n this.testMid(+mid, lastScrollDirection);\r\n }\r\n }\r\n\r\n public testMid(mid: number, lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n\r\n // if(lastScrollDirection !== undefined) return;\r\n if(this.hidden) return;\r\n\r\n // this.log('testMid', mid);\r\n\r\n let currentIndex: number = this.mids.findIndex((_mid) => _mid <= mid);\r\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\r\n currentIndex += this.offsetIndex;\r\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\r\n // currentIndex = 0;\r\n currentIndex = this.mids.length - 1 + this.offsetIndex;\r\n } else {\r\n if(!this.getCurrentIndexPromise) {\r\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\r\n }\r\n\r\n return;\r\n }\r\n\r\n // const idx = Math.max(0, this.mids.indexOf(mid));\r\n\r\n /* if(currentIndex === this.count) {\r\n currentIndex = 0;\r\n } */\r\n\r\n // this.log('testMid: pinned currentIndex', currentIndex, mid);\r\n\r\n const changed = this.pinnedIndex !== currentIndex;\r\n if(changed) {\r\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\r\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\r\n return;\r\n }\r\n }\r\n\r\n this.pinnedIndex = currentIndex;\r\n this.pinnedMid = this.mids.find((_mid) => _mid <= mid) || this.mids[this.mids.length - 1];\r\n this.setPinnedMessage();\r\n }\r\n }\r\n\r\n private isNeededMore(currentIndex: number) {\r\n return (this.count > ChatPinnedMessage.LOAD_COUNT &&\r\n (\r\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) ||\r\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\r\n )\r\n );\r\n }\r\n\r\n private async getCurrentIndex(mid: number, correctAfter = true) {\r\n if(this.loading) return;\r\n this.loading = true;\r\n\r\n try {\r\n const log = this.debug ? this.log.bindPrefix('getCurrentIndex') : undefined;\r\n log && log('start', mid, correctAfter);\r\n\r\n let gotRest = false;\r\n const promises = [\r\n this.managers.appMessagesManager.getSearch({\r\n peerId: this.chat.peerId,\r\n inputFilter: {_: 'inputMessagesFilterPinned'},\r\n maxId: mid,\r\n limit: ChatPinnedMessage.LOAD_COUNT,\r\n backLimit: ChatPinnedMessage.LOAD_COUNT\r\n })\r\n .then((r) => {\r\n gotRest = true;\r\n return r;\r\n })\r\n ];\r\n\r\n if(!this.pinnedMaxMid) {\r\n const promise = this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId).then((p) => {\r\n if(!p.maxId) return;\r\n this.pinnedMaxMid = p.maxId;\r\n\r\n if(!gotRest && correctAfter) {\r\n this.mids = [this.pinnedMaxMid];\r\n this.count = p.count;\r\n this.pinnedIndex = 0;\r\n this.pinnedMid = this.mids[0];\r\n this.setPinnedMessage();\r\n // this.pinnedMessageContainer.toggle(false);\r\n }\r\n });\r\n\r\n promises.push(promise as any);\r\n }\r\n\r\n const result = (await Promise.all(promises))[0];\r\n\r\n let backLimited = result.history.findIndex((message) => message.mid <= mid);\r\n if(backLimited === -1) {\r\n backLimited = result.history.length;\r\n }/* else {\r\n backLimited -= 1;\r\n } */\r\n\r\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\r\n this.mids = result.history.map((message) => message.mid).slice();\r\n this.count = result.count;\r\n\r\n if(!this.count) {\r\n this.pinnedMessageContainer.toggle(true);\r\n }\r\n\r\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\r\n this.loadedBottom = !this.offsetIndex;\r\n\r\n log && log('result', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\r\n } catch(err) {\r\n this.log.error('getCurrentIndex error', err);\r\n }\r\n\r\n this.loading = false;\r\n\r\n if(this.locked) {\r\n this.testMid(mid);\r\n } else if(correctAfter) {\r\n this.setCorrectIndex(0);\r\n }\r\n\r\n this.getCurrentIndexPromise = null;\r\n // return result.offset_id_offset || 0;\r\n }\r\n\r\n public setScrollDownListener() {\r\n this.waitForScrollBottom = true;\r\n\r\n if(!this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter = new ListenerSetter();\r\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\r\n this.unsetScrollDownListener();\r\n }, this.scrollDownListenerSetter);\r\n }\r\n }\r\n\r\n public unsetScrollDownListener(refreshPosition = true) {\r\n this.waitForScrollBottom = false;\r\n\r\n if(this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter.removeAll();\r\n this.scrollDownListenerSetter = null;\r\n }\r\n\r\n if(refreshPosition) {\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async handleFollowingPinnedMessage() {\r\n this.locked = true;\r\n\r\n this.debug && this.log('handleFollowingPinnedMessage');\r\n try {\r\n this.setScrollDownListener();\r\n\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise instanceof Promise) {\r\n await setPeerPromise;\r\n }\r\n\r\n // await this.chat.bubbles.scrollable.scrollLockedPromise;\r\n await getHeavyAnimationPromise();\r\n\r\n if(this.getCurrentIndexPromise) {\r\n await this.getCurrentIndexPromise;\r\n }\r\n\r\n this.debug && this.log('handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n\r\n /* // подождём, пока скролл остановится\r\n setTimeout(() => {\r\n this.log('handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n }, 50); */\r\n } catch(err) {\r\n this.log.error('handleFollowingPinnedMessage error:', err);\r\n\r\n this.locked = false;\r\n this.waitForScrollBottom = false;\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async followPinnedMessage(mid: number) {\r\n const message = await this.chat.getMessage(mid);\r\n if(!message) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId(mid);\r\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\r\n this.handleFollowingPinnedMessage();\r\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\r\n });\r\n }\r\n\r\n public async _setPinnedMessage() {\r\n // ///this.log('setting pinned message', message);\r\n // return;\r\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\r\n Promise.all([\r\n promise\r\n ]).then(() => { */\r\n // const mids = results[0];\r\n const count = this.count;\r\n if(count) {\r\n const pinnedIndex = this.pinnedIndex;\r\n const message = await this.chat.getMessage(this.pinnedMid);\r\n\r\n // this.animatedCounter.prepareNumber(count);\r\n\r\n // setTimeout(() => {\r\n const isLast = pinnedIndex === 0;\r\n this.animatedCounter.container.classList.toggle('is-last', isLast);\r\n // SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\r\n if(!isLast) {\r\n this.animatedCounter.setCount(count - pinnedIndex);\r\n }\r\n // }, 100);\r\n\r\n // this.pinnedMessageContainer.fill(undefined, message.message, message);\r\n this.pinnedMessageContainer.toggle(false);\r\n\r\n const fromTop = pinnedIndex > this.wasPinnedIndex;\r\n\r\n this.debug && this.log('setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\r\n\r\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\r\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\r\n writeMediaTo.classList.add('pinned-message-media');\r\n // writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\r\n const loadPromises: Promise[] = [];\r\n const isMediaSet = await wrapReplyDivAndCaption({\r\n title: undefined,\r\n titleEl: null,\r\n subtitle: (message as Message.message).message,\r\n subtitleEl: writeTo,\r\n message,\r\n mediaEl: writeMediaTo,\r\n loadPromises,\r\n animationGroup: this.chat.animationGroup\r\n });\r\n\r\n await Promise.all(loadPromises);\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\r\n\r\n // if(this.wasPinnedIndex !== this.pinnedIndex) {\r\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\r\n if(isMediaSet) {\r\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\r\n this.wasPinnedMediaIndex = pinnedIndex;\r\n } else {\r\n this.animatedMedia.clearRows();\r\n }\r\n // }\r\n\r\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\r\n this.wasPinnedIndex = pinnedIndex;\r\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\r\n } else {\r\n this.pinnedMessageContainer.toggle(true);\r\n this.wasPinnedIndex = 0;\r\n }\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\r\n // });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from '../listenerSetter';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\n\r\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n let lastY: number;\r\n const options = {passive: true};\r\n listenerSetter.add(elem)('touchstart', (e) => {\r\n if(e.touches.length > 1) {\r\n onTouchEnd();\r\n return;\r\n }\r\n\r\n lastY = e.touches[0].clientY;\r\n\r\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\r\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\r\n }, options);\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n const clientY = e.touches[0].clientY;\r\n\r\n const isDown = clientY < lastY;\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n lastY = clientY;\r\n // alert('isDown: ' + !!isDown);\r\n };\r\n\r\n const onTouchEnd = () => {\r\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\r\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\r\n };\r\n } else {\r\n listenerSetter.add(elem)('wheel', (e) => {\r\n const isDown = e.deltaY > 0;\r\n // this.log('wheel', e, isDown);\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Channel} from '../../lib/appManagers/appChatsManager';\nimport type {AppSidebarRight} from '../sidebarRight';\nimport type Chat from './chat';\nimport {RIGHT_COLUMN_ACTIVE_CLASSNAME} from '../sidebarRight';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ChatAudio from './audio';\nimport ChatPinnedMessage from './pinnedMessage';\nimport {ButtonMenuItemOptions} from '../buttonMenu';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PopupDeleteDialog from '../popups/deleteDialog';\nimport appNavigationController from '../appNavigationController';\nimport {LEFT_COLUMN_ACTIVE_CLASSNAME} from '../sidebarLeft';\nimport PeerTitle from '../peerTitle';\nimport {i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {ChatFull, Chat as MTChat, GroupCall} from '../../layer';\nimport PopupPickUser from '../popups/pickUser';\nimport PopupPeer from '../popups/peer';\nimport 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 {AppManagers} from '../../lib/appManagers/managers';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport groupCallsController from '../../lib/calls/groupCallsController';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean | Promise};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnCall: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLElement;\n\n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: (ButtonMenuItemOptions & {verify: ButtonToVerify['verify']})[];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appSidebarRight: AppSidebarRight,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n // this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar', 'hide');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.managers);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', this.menuButtons, this.verifyButtons);\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null,\n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null,\n this.btnJoin,\n this.btnPinned,\n this.btnCall,\n this.btnGroupCall,\n this.btnMute,\n this.btnSearch,\n this.btnMore\n ].filter(Boolean));\n\n this.pushButtonToVerify(this.btnCall, this.verifyCallButton.bind(this, 'voice'));\n this.pushButtonToVerify(this.btnGroupCall, this.verifyVideoChatButton);\n\n this.chatInfoContainer.append(this.btnBack, this.chatInfo, this.chatUtils);\n this.container.append(this.chatInfoContainer);\n\n if(this.chatAudio) {\n // this.container.append(this.chatAudio.divAndCaption.container, this.chatUtils);\n this.container.append(this.chatAudio.divAndCaption.container);\n }\n\n // * construction end\n\n // * fix topbar overflow section\n\n this.listenerSetter.add(window)('resize', this.onResize);\n this.listenerSetter.add(mediaSizes)('changeScreen', this.onChangeScreen);\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'pinned-container');\n blurActiveElement();\n if(container) {\n cancelEvent(e);\n\n if(findUpClassName(e.target, 'progress-line')) {\n return;\n }\n\n const mid = +container.dataset.mid;\n if(container.classList.contains('pinned-message')) {\n // if(!this.pinnedMessage.locked) {\n this.pinnedMessage.followPinnedMessage(mid);\n // }\n } else {\n const peerId = container.dataset.peerId.toPeerId();\n const searchContext = appMediaPlaybackController.getSearchContext();\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n type: searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined),\n threadId: searchContext.threadId\n });\n }\n } else {\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n onBtnBackClick();\n } else if(findUpTag(e.target, 'AVATAR-ELEMENT')) {\n this.appSidebarRight.toggleSidebar(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME));\n } else {\n this.appSidebarRight.toggleSidebar(true);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onBtnBackClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n // const item = appNavigationController.findItemByType('chat');\n // * return manually to chat by arrow, since can't get back to\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.chat.appImManager.setPeer({peerId: this.peerId});\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: ButtonToVerify['verify']) {\n if(!element) {\n return;\n }\n\n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const r = async() => {\n const deleteButtonText = await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n if(isMenuOpen) {\n // delete button\n this.menuButtons[this.menuButtons.length - 1].element.lastChild.replaceWith(i18n(deleteButtonText));\n }\n\n const buttons = this.buttonsToVerify.concat(isMenuOpen ? this.menuButtons : []);\n const results = await Promise.all(buttons.map(async(button) => {\n return {\n result: await button.verify(),\n button\n }\n }));\n\n results.forEach(({button, result}) => {\n button.element.classList.toggle('hide', !result);\n });\n };\n\n r();\n };\n\n private verifyVideoChatButton = async(type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser()) return false;\n\n const currentGroupCall = groupCallsController.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if(((await this.managers.appPeersManager.isBroadcast(this.peerId)) && type === 'group') ||\n ((await this.managers.appPeersManager.isAnyGroup(this.peerId)) && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = await this.managers.appChatsManager.getChatTyped(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || hasRights(chat, 'manage_call');\n };\n\n private verifyCallButton = async(type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = await this.managers.appProfileManager.getCachedFullUser(userId);\n\n return !!userFull && !!(type === 'voice' ? userFull.pFlags.phone_calls_available : userFull.pFlags.video_calls_available);\n };\n\n public constructUtils() {\n this.menuButtons = [{\n icon: 'search',\n text: 'Search',\n onClick: () => {\n this.chat.initSearch();\n },\n verify: () => mediaSizes.isMobile\n }, /* {\n icon: 'pinlist',\n text: 'Pinned Messages',\n onClick: () => this.openPinned(false),\n verify: () => mediaSizes.isMobile\n }, */{\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !(await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false))\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.managers.appMessagesManager.togglePeerMute(this.peerId);\n },\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && (await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false))\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((channelFull) => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer({\n peerId: channelFull.linked_chat_id.toPeerId(true)\n });\n }\n });\n },\n verify: async() => {\n const chatFull = await this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'phone',\n text: 'Call',\n onClick: this.onCallClick.bind(this, 'voice'),\n verify: this.verifyCallButton.bind(this, 'voice')\n }, {\n icon: 'videocamera',\n text: 'VideoCall',\n onClick: this.onCallClick.bind(this, 'video'),\n verify: this.verifyCallButton.bind(this, 'video')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n apiManagerProxy.getState().then((state) => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = async(bubble) => {\n this.managers.appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!this.chat.bubbles.getRenderedLength()\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = this.appSidebarRight.createTab(AppEditContactTab);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: async() => this.peerId.isUser() && !(await this.managers.appPeersManager.isContact(this.peerId))\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.managers.appMessagesManager.sendContact(peerId, contactPeerId);\n this.chat.appImManager.setInnerPeer({peerId});\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: async() => rootScope.myId !== this.peerId && this.peerId.isUser() && (await this.managers.appPeersManager.isContact(this.peerId)) && !!(await this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, true).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: async() => {\n if(!this.peerId.isUser()) return false;\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, false).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: async() => {\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: async() => this.chat.type === 'chat' && !!(await this.managers.appMessagesManager.getDialogOnly(this.peerId))\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onCallClick(type: CallType) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), type);\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n private constructAvatar() {\n const avatarElement = new AvatarElement();\n avatarElement.isDialog = true;\n avatarElement.classList.add('avatar-42', 'person-avatar');\n return avatarElement;\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public constructPeerHelpers() {\n this.avatarElement = this.constructAvatar();\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnCall = ButtonIcon('phone');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnCall, this.onCallClick.bind(this, 'voice'));\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, this.onMuteClick);\n\n this.attachClickEvent(this.btnJoin, async() => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(await this.managers.appChatsManager.isChannel(chatId)) {\n promise = this.managers.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.managers.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = await this.managers.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n\n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n if(this.pinnedMessage) {\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n apiManagerProxy.getState().then((state) => {\n if(!middleware()) return;\n\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n\n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n }\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public constructPinnedHelpers() {\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(peerId !== this.peerId) return;\n\n if(mids) {\n this.setTitle();\n }\n });\n }\n\n public constructDiscussionHelpers() {\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0,\n type: 'pinned'\n });\n }\n\n private onMuteClick = () => {\n new PopupMute(this.peerId);\n };\n\n private onResize = () => {\n this.setUtilsWidth(true);\n this.setFloating();\n };\n\n private onChangeScreen = (from: ScreenSize, to: ScreenSize) => {\n this.container.classList.toggle('is-pinned-floating', mediaSizes.isMobile);\n // this.chatAudio && this.chatAudio.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.onResize();\n };\n\n public destroy() {\n // this.chat.log.error('Topbar destroying');\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n\n if(this.pinnedMessage) {\n this.pinnedMessage.destroy(); // * возможно это можно не делать\n }\n\n if(this.chatAudio) {\n this.chatAudio.destroy();\n }\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public cleanup() {\n if(!this.chat.peerId) {\n this.container.classList.add('hide');\n }\n }\n\n public async finishPeerChange(isTarget: boolean) {\n const peerId = this.peerId;\n\n let newAvatar: AvatarElement;\n if(this.avatarElement) {\n newAvatar = this.constructAvatar();\n }\n\n const [isBroadcast, isAnyChat, chat, _, setTitleCallback, setStatusCallback, state] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isAnyChat(peerId),\n peerId.isAnyChat() ? this.managers.appChatsManager.getChat(peerId.toChatId()) : undefined,\n newAvatar ? newAvatar.updateWithOptions({peerId}) : undefined,\n this.setTitleManual(),\n this.setPeerStatusManual(true),\n apiManagerProxy.getState()\n ]);\n\n return () => {\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast);\n if(this.btnJoin) {\n if(isAnyChat && !this.chat.isRestricted) {\n replaceContent(this.btnJoin, i18n(isBroadcast ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !chat?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n if(newAvatar) {\n this.avatarElement.replaceWith(newAvatar);\n this.avatarElement = newAvatar;\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n if(this.pinnedMessage) { // * replace with new one\n if(this.chat.type === 'chat') {\n if(this.chat.wasAlreadyUsed) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n // this.pinnedMessage.pinnedMessageContainer.toggle(true);\n this.pinnedMessage = newPinnedMessage;\n }\n\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n }\n\n setTitleCallback();\n setStatusCallback && setStatusCallback();\n this.setMutedState();\n\n this.container.classList.remove('hide');\n };\n }\n\n public async setTitleManual(count?: number) {\n const peerId = this.peerId;\n const middleware = () => this.peerId === peerId;\n let titleEl: HTMLElement, icons: Element[];\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.managers.appMessagesManager.getSearchCounters(peerId, [{_: 'inputMessagesFilterPinned'}], false).then((result) => {\n if(!middleware()) return;\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n titleEl = i18n(peerId === rootScope.myId ? 'Reminders' : 'ScheduledMessages');\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) {\n const result = await this.managers.acknowledged.appMessagesManager.getHistory(peerId, 0, 1, 0, this.chat.threadId);\n if(!middleware()) return;\n if(result.cached) {\n const historyResult = await result.result;\n if(!middleware()) return;\n count = historyResult.count;\n } else result.result.then((historyResult) => {\n if(!middleware()) return;\n this.setTitle(historyResult.count);\n });\n }\n\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n } else if(this.chat.type === 'chat') {\n [titleEl/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: true,\n withIcons: true\n })\n // generateTitleIcons(peerId)\n ]);\n\n if(!middleware()) {\n return;\n }\n }\n\n return () => {\n replaceContent(this.title, titleEl);\n // if(icons) {\n // this.title.append(...icons);\n // }\n };\n }\n\n public setTitle(count?: number) {\n this.setTitleManual(count).then((setTitleCallback) => setTitleCallback());\n }\n\n public async setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted(peerId, false);\n if(await this.managers.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n // return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n // mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n // mutationRAF = window.requestAnimationFrame(() => {\n\n // setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n // this.chatInfo.classList.toggle('have-utils-width', !!width);\n // }, 0);\n\n this.setUtilsRAF = 0;\n\n // mutationObserver.observe(chatUtils, observeOptions);\n // });\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.isFloating();\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n\n if(!container.isVisible()) {\n return acc;\n }\n\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatusManual = async(needClear = false) => {\n if(!this.subtitle) return;\n\n const peerId = this.peerId;\n return this.chat.appImManager.setPeerStatus(\n peerId,\n this.subtitle,\n needClear,\n false,\n () => peerId === this.peerId\n );\n };\n\n public setPeerStatus = (needClear?: boolean) => {\n return this.setPeerStatusManual(needClear).then((callback) => {\n if(callback) {\n callback();\n }\n });\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarRight from '..';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport AppSearch, {SearchGroup} from '../../appSearch';\r\nimport ButtonIcon from '../../buttonIcon';\r\nimport InputSearch from '../../inputSearch';\r\nimport PopupElement from '../../popups';\r\nimport PopupDatePicker from '../../popups/datePicker';\r\nimport {SliderSuperTab} from '../../slider';\r\n\r\nexport default class AppPrivateSearchTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private appSearch: AppSearch;\r\n private btnPickDate: HTMLElement;\r\n\r\n private peerId: PeerId;\r\n private threadId = 0;\r\n private query = '';\r\n private onDatePick: (timestamp: number) => void;\r\n\r\n onOpenAfterTimeout() {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\r\n }\r\n\r\n public init(\r\n peerId: PeerId,\r\n threadId?: number,\r\n onDatePick?: AppPrivateSearchTab['onDatePick'],\r\n query?: string\r\n ) {\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 if(!this.peerId) {\r\n this.query = query;\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n this.onDatePick = onDatePick;\r\n\r\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\r\n if(this.onDatePick) {\r\n attachClickEvent(this.btnPickDate, () => {\r\n PopupElement.createPopup(PopupDatePicker, new Date(), this.onDatePick).show();\r\n });\r\n }\r\n\r\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\r\n\r\n appSidebarRight.toggleSidebar(true);\r\n } else {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from './topbar';\r\nimport AppSearch, {SearchGroup} from '../appSearch';\r\nimport PopupDatePicker from '../popups/datePicker';\r\nimport ripple from '../ripple';\r\nimport InputSearch from '../inputSearch';\r\nimport type Chat from './chat';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport whichChild from '../../helpers/dom/whichChild';\r\nimport replaceContent from '../../helpers/dom/replaceContent';\r\nimport {i18n} from '../../lib/langPack';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\r\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\r\nimport PopupElement from '../popups';\r\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\r\n\r\nexport default class ChatSearch {\r\n private element: HTMLElement;\r\n private backBtn: HTMLElement;\r\n private inputSearch: InputSearch;\r\n\r\n private results: HTMLElement;\r\n\r\n private footer: HTMLElement;\r\n private dateBtn: HTMLElement;\r\n private foundCountEl: HTMLElement;\r\n private controls: HTMLElement;\r\n private downBtn: HTMLElement;\r\n private upBtn: HTMLElement;\r\n\r\n private appSearch: AppSearch;\r\n private searchGroup: SearchGroup;\r\n\r\n private foundCount = 0;\r\n private selectedIndex = 0;\r\n private setPeerPromise: Promise;\r\n private listenerSetter: ListenerSetter;\r\n private navigationItem: NavigationItem;\r\n\r\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\r\n this.element = document.createElement('div');\r\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\r\n\r\n this.backBtn = document.createElement('button');\r\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\r\n ripple(this.backBtn);\r\n\r\n const listenerSetter = this.listenerSetter = new ListenerSetter();\r\n\r\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\r\n attachClickEvent(element, callback, {listenerSetter});\r\n };\r\n\r\n attachClick(this.backBtn, () => {\r\n this.destroy();\r\n });\r\n\r\n this.inputSearch = new InputSearch('Search');\r\n\r\n // Results\r\n this.results = document.createElement('div');\r\n this.results.classList.add('chat-search-results', 'chatlist-container');\r\n\r\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\r\n attachClick(this.searchGroup.list, this.onResultsClick);\r\n\r\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\r\n messages: this.searchGroup\r\n }, (count) => {\r\n this.foundCount = count;\r\n\r\n if(!this.foundCount) {\r\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.container.classList.remove('search-results-active');\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\r\n }\r\n });\r\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\r\n\r\n // appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\r\n this.chat.bubbles.container.append(this.results);\r\n\r\n // Footer\r\n this.footer = document.createElement('div');\r\n this.footer.classList.add('chat-search-footer');\r\n\r\n attachClick(this.footer, this.onFooterClick);\r\n ripple(this.footer);\r\n\r\n this.foundCountEl = document.createElement('span');\r\n this.foundCountEl.classList.add('chat-search-count');\r\n\r\n this.dateBtn = document.createElement('button');\r\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\r\n\r\n this.controls = document.createElement('div');\r\n this.controls.classList.add('chat-search-controls');\r\n\r\n this.upBtn = document.createElement('button');\r\n this.upBtn.classList.add('btn-icon', 'tgico-up');\r\n this.downBtn = document.createElement('button');\r\n this.downBtn.classList.add('btn-icon', 'tgico-down');\r\n\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n\r\n attachClick(this.dateBtn, this.onDateClick);\r\n attachClick(this.upBtn, this.onUpClick);\r\n attachClick(this.downBtn, this.onDownClick);\r\n this.controls.append(this.upBtn, this.downBtn);\r\n\r\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\r\n\r\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\r\n\r\n // Append container\r\n this.element.append(this.backBtn, this.inputSearch.container);\r\n\r\n this.topbar.container.classList.add('hide-pinned');\r\n this.topbar.container.parentElement.append(this.element);\r\n\r\n this.inputSearch.input.focus();\r\n\r\n if(query) {\r\n this.setQuery(query);\r\n }\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n this.navigationItem = {\r\n type: 'mobile-search',\r\n onPop: () => {\r\n this.destroy();\r\n }\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.topbar.container.classList.remove('hide-pinned');\r\n this.element.remove();\r\n this.inputSearch.remove();\r\n this.results.remove();\r\n this.footer.remove();\r\n this.listenerSetter.removeAll();\r\n this.chat.bubbles.container.classList.remove('search-results-active');\r\n this.chat.search = undefined;\r\n appNavigationController.removeItem(this.navigationItem);\r\n }\r\n\r\n public setQuery(query: string) {\r\n this.inputSearch.inputField.value = query;\r\n }\r\n\r\n private onDateClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n PopupElement.createPopup(PopupDatePicker, new Date(), this.chat.bubbles.onDatePick).show();\r\n };\r\n\r\n private selectResult(elem: HTMLElement) {\r\n if(this.setPeerPromise) return this.setPeerPromise;\r\n\r\n const peerId = elem.dataset.peerId.toPeerId();\r\n const lastMsgId = +elem.dataset.mid || undefined;\r\n\r\n const index = whichChild(elem);\r\n\r\n if(index === (this.foundCount - 1)) {\r\n this.upBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.upBtn.removeAttribute('disabled');\r\n }\r\n\r\n if(!index) {\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.downBtn.removeAttribute('disabled');\r\n }\r\n\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.container.classList.remove('search-results-active');\r\n\r\n const res = this.chat.setPeer(peerId, lastMsgId);\r\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\r\n this.selectedIndex = index;\r\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\r\n\r\n const renderedCount = this.searchGroup.list.childElementCount;\r\n if(this.selectedIndex >= (renderedCount - 6)) {\r\n this.appSearch.searchMore();\r\n }\r\n }).finally(() => {\r\n this.setPeerPromise = null;\r\n });\r\n }\r\n\r\n private onResultsClick = (e: MouseEvent) => {\r\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\r\n if(target) {\r\n this.selectResult(target);\r\n }\r\n };\r\n\r\n private onFooterClick = (e: MouseEvent) => {\r\n if(this.foundCount) {\r\n this.chat.bubbles.container.classList.toggle('search-results-active');\r\n this.results.classList.toggle('active');\r\n }\r\n };\r\n\r\n private onUpClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\r\n };\r\n\r\n private onDownClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport windowSize from '../../helpers/windowSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\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 image: HTMLImageElement;\n private imageBitmap: ImageBitmap;\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.image = document.createElement('img');\n img.crossOrigin = 'anonymous';\n return this.renderImageFromUrlPromise = renderImageFromUrlPromise(img, url, false).then(() => {\n if(!IS_IMAGE_BITMAP_SUPPORTED) {\n return img;\n }\n\n return createImageBitmap(img, {\n resizeWidth: 1440,\n resizeHeight: 2960\n }).then((imageBitmap) => {\n this.imageBitmap = imageBitmap;\n return img;\n });\n });\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 this.imageBitmap?.close();\n URL.revokeObjectURL(this.objectUrl);\n }\n }\n }\n\n public fillCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const {width, height} = canvas;\n // const perf = performance.now();\n // if(context.fillStyle instanceof CanvasPattern) {\n // context.clearRect(0, 0, width, height);\n // }\n\n const source = this.imageBitmap || this.image;\n\n let imageWidth = source.width, imageHeight = source.height;\n // let patternHeight = 1480 * canvas.dpr;\n // if(+canvas.dataset.originalHeight !== height) patternHeight *= .6875;\n const patternHeight = (500 + (windowSize.height / 2.5)) * canvas.dpr;\n const ratio = patternHeight / imageHeight;\n imageWidth *= ratio;\n imageHeight = patternHeight;\n\n if(this.options.mask) {\n context.fillStyle = '#000';\n context.fillRect(0, 0, width, height);\n context.globalCompositeOperation = 'destination-out';\n } else {\n context.globalCompositeOperation = 'source-over';\n }\n\n const d = (y: number) => {\n for(let x = 0; x < width; x += imageWidth) {\n context.drawImage(source, x, y, imageWidth, imageHeight);\n }\n };\n\n const centerY = (height - imageHeight) / 2;\n d(centerY);\n\n if(centerY > 0) {\n let topY = centerY;\n do {\n d(topY -= imageHeight);\n } while(topY >= 0);\n }\n\n const endY = height - 1;\n for(let bottomY = centerY + imageHeight; bottomY < endY; bottomY += imageHeight) {\n d(bottomY);\n }\n\n // for(let x = 0; x < width; x += imageWidth) {\n // for(let y = 0; y < height; y += imageHeight) {\n // context.drawImage(img, x, y, imageWidth, imageHeight);\n // }\n // }\n // context.fillStyle = this.pattern;\n // context.fillRect(0, 0, width, 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 const width = this.options.width * devicePixelRatio;\n let height = this.options.height * devicePixelRatio;\n\n canvas.dpr = devicePixelRatio;\n canvas.dataset.originalHeight = '' + height;\n if(mediaSizes.activeScreen === ScreenSize.large) height *= 1.5;\n canvas.width = width;\n canvas.height = height;\n }\n\n public createCanvas() {\n const canvas = document.createElement('canvas');\n this.canvases.add(canvas);\n this.setCanvasDimensions(canvas);\n return canvas;\n }\n\n public resize(width: number, height: number) {\n this.init({\n ...this.options,\n width,\n height\n });\n\n const promises: Promise[] = [];\n for(const canvas of this.canvases) {\n this.setCanvasDimensions(canvas);\n promises.push(this.renderToCanvas(canvas));\n }\n\n return Promise.all(promises);\n }\n\n public static resizeInstances(width: number, height: number) {\n return Promise.all(this.INSTANCES.map((instance) => instance.resize(width, height)));\n }\n\n /* public setResizeMode(resizing: boolean) {\n const canvases = Array.from(this.canvases);\n const canvas = canvases[canvases.length - 1];\n canvas.style.display = resizing ? 'none' : '';\n const img = this.img;\n img.style.display = resizing ? '' : 'none';\n\n return {img, canvas};\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatRights} from '../../lib/appManagers/appChatsManager';\nimport type {AppImManager} from '../../lib/appManagers/appImManager';\nimport type {MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {logger, LogTypes} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport appSidebarRight from '../sidebarRight';\nimport ChatBubbles from './bubbles';\nimport ChatContextMenu from './contextMenu';\nimport ChatInput from './input';\nimport ChatSelection from './selection';\nimport ChatTopbar from './topbar';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport SetTransition from '../singleTransition';\nimport AppPrivateSearchTab from '../sidebarRight/tabs/search';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport ChatSearch from './search';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport getAutoDownloadSettingsByPeerId, {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport ChatBackgroundGradientRenderer from './gradientRenderer';\nimport ChatBackgroundPatternRenderer from './patternRenderer';\nimport pause from '../../helpers/schedulers/pause';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport SlicedArray from '../../helpers/slicedArray';\nimport themeController from '../../helpers/themeController';\nimport AppSharedMediaTab from '../sidebarRight/tabs/sharedMedia';\nimport noop from '../../helpers/noop';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {Message} from '../../layer';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\n\nexport type ChatType = 'chat' | 'pinned' | 'replies' | 'discussion' | 'scheduled';\n\nexport default class Chat extends EventListenerBase<{\n setPeer: (mid: number, isTopMessage: boolean) => void\n}> {\n public container: HTMLElement;\n public backgroundEl: HTMLElement;\n\n public topbar: ChatTopbar;\n public bubbles: ChatBubbles;\n public input: ChatInput;\n public selection: ChatSelection;\n public contextMenu: ChatContextMenu;\n public search: ChatSearch;\n\n public wasAlreadyUsed: boolean;\n // public initPeerId = 0;\n public peerId: PeerId;\n public threadId: number;\n public setPeerPromise: Promise;\n public peerChanged: boolean;\n\n public log: ReturnType;\n\n public type: ChatType;\n public messagesStorageKey: MessagesStorageKey;\n\n public noForwards: boolean;\n\n public inited: boolean;\n\n public isRestricted: boolean;\n public autoDownload: ChatAutoDownloadSettings;\n\n public gradientRenderer: ChatBackgroundGradientRenderer;\n public patternRenderer: ChatBackgroundPatternRenderer;\n public gradientCanvas: HTMLCanvasElement;\n public patternCanvas: HTMLCanvasElement;\n public backgroundTempId: number;\n public setBackgroundPromise: Promise;\n public sharedMediaTab: AppSharedMediaTab;\n public sharedMediaTabs: AppSharedMediaTab[];\n // public renderDarkPattern: () => Promise;\n\n public isBot: boolean;\n public isChannel: boolean;\n public isBroadcast: boolean;\n public isAnyGroup: boolean;\n public isMegagroup: boolean;\n\n public animationGroup: AnimationItemGroup;\n\n constructor(\n public appImManager: AppImManager,\n public managers: AppManagers\n ) {\n super();\n\n this.type = 'chat';\n this.animationGroup = `chat-${Math.round(Math.random() * 65535)}`;\n\n this.container = document.createElement('div');\n this.container.classList.add('chat', 'tabs-tab');\n\n this.backgroundEl = document.createElement('div');\n this.backgroundEl.classList.add('chat-background');\n\n // * constructor end\n\n this.log = logger('CHAT', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n // this.log.error('Chat construction');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n\n this.backgroundTempId = 0;\n this.sharedMediaTabs = [];\n }\n\n public setBackground(url: string, skipAnimation?: boolean): Promise {\n const theme = themeController.getTheme();\n\n let item: HTMLElement;\n const isColorBackground = !!theme.background.color && !theme.background.slug && !theme.background.intensity;\n if(\n isColorBackground &&\n document.documentElement.style.cursor === 'grabbing' &&\n this.gradientRenderer &&\n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = theme.background.color;\n this.gradientRenderer.init(this.gradientCanvas);\n return Promise.resolve();\n }\n\n const tempId = ++this.backgroundTempId;\n\n const previousGradientRenderer = this.gradientRenderer;\n const previousPatternRenderer = this.patternRenderer;\n const previousGradientCanvas = this.gradientCanvas;\n const previousPatternCanvas = this.patternCanvas;\n\n this.gradientRenderer =\n this.patternRenderer =\n this.gradientCanvas =\n this.patternCanvas =\n // this.renderDarkPattern =\n undefined;\n\n const intensity = theme.background.intensity && theme.background.intensity / 100;\n const isDarkPattern = !!intensity && intensity < 0;\n\n let patternRenderer: ChatBackgroundPatternRenderer;\n let patternCanvas = item?.firstElementChild as HTMLCanvasElement;\n let gradientCanvas: HTMLCanvasElement;\n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n\n if(url) {\n if(intensity) {\n item.classList.add('is-pattern');\n\n const rect = this.appImManager.chatsContainer.getBoundingClientRect();\n patternRenderer = this.patternRenderer = ChatBackgroundPatternRenderer.getInstance({\n url,\n width: rect.width,\n height: rect.height,\n mask: isDarkPattern\n });\n\n patternCanvas = this.patternCanvas = patternRenderer.createCanvas();\n patternCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-pattern-canvas');\n\n if(isDarkPattern) {\n item.classList.add('is-dark');\n }\n\n // if(isDarkPattern) {\n // this.renderDarkPattern = () => {\n // return patternRenderer.exportCanvasPatternToImage(patternCanvas).then((url) => {\n // if(this.backgroundTempId !== tempId) {\n // return;\n // }\n\n // gradientCanvas.style.webkitMaskImage = `url(${url})`;\n // });\n // };\n // }\n } else if(theme.background.slug) {\n item.classList.add('is-image');\n }\n } else if(theme.background.color) {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n const color = theme.background.color;\n if(color) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(color);\n gradientRenderer = this.gradientRenderer = _gradientRenderer;\n gradientCanvas = this.gradientCanvas = canvas;\n gradientCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-color-canvas');\n\n if(rootScope.settings.animationsEnabled) {\n gradientRenderer.scrollAnimate(true);\n }\n // } else {\n // item.style.backgroundColor = color;\n // item.style.backgroundImage = 'none';\n // }\n }\n\n if(patternRenderer) {\n const setOpacityTo = isDarkPattern ? gradientCanvas : patternCanvas;\n setOpacityTo.style.setProperty('--opacity-max', '' + (Math.abs(intensity) * (isDarkPattern ? .5 : 1)));\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 // const promise = Promise.resolve();\n // }\n\n // promise.then(cb);\n cb();\n });\n } else if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n\n return this.setBackgroundPromise = Promise.race([\n pause(500),\n promise\n ]);\n }\n\n public setType(type: ChatType) {\n this.type = type;\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.managers);\n this.bubbles = new ChatBubbles(this, this.managers);\n this.input = new ChatInput(this, this.appImManager, this.managers);\n this.contextMenu = new ChatContextMenu(this, this.managers);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.managers);\n\n if(this.type === 'chat') {\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.topbar.constructPinnedHelpers();\n } else if(this.type === 'discussion') {\n this.topbar.constructUtils();\n this.topbar.constructDiscussionHelpers();\n }\n\n this.topbar.construct();\n this.input.construct();\n\n if(this.type === 'chat') { // * гений в деле, разный порядок из-за разной последовательности действий\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.bubbles.constructPinnedHelpers();\n this.input.constructPinnedHelpers();\n } else if(this.type === 'scheduled') {\n this.bubbles.constructScheduledHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'discussion') {\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n }\n\n if(this.type !== 'scheduled' && !IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.bubbles.attachContainerListeners();\n\n this.container.classList.add('type-' + this.type);\n this.container.append(this.topbar.container, this.bubbles.container, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer(migrateTo);\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (e) => {\n if(e.peerId === this.peerId) {\n this.appImManager.setPeer();\n }\n });\n\n this.bubbles.listenerSetter.add(this.appImManager)('chat_changing', ({to}) => {\n const freeze = to !== this;\n\n const cb = () => {\n this.bubbles.observer?.toggleObservingNew(freeze);\n animationIntersector.toggleIntersectionGroup(this.animationGroup, freeze);\n if(freeze) {\n animationIntersector.checkAnimations(freeze, this.animationGroup);\n }\n };\n\n if(!freeze) {\n setTimeout(() => {\n cb();\n }, 400);\n } else {\n cb();\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.destroySharedMediaTab();\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n this.contextMenu && this.contextMenu.destroy();\n this.selection && this.selection.attachListeners(undefined, undefined);\n\n this.cleanupBackground();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n // this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.topbar.cleanup();\n this.selection.cleanup();\n }\n\n public async onChangePeer(m: ReturnType) {\n const {peerId} = this;\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n\n const [\n noForwards,\n isRestricted,\n isAnyGroup,\n _,\n isMegagroup,\n isBroadcast,\n isChannel,\n isBot\n ] = await m(Promise.all([\n this.managers.appPeersManager.noForwards(peerId),\n this.managers.appPeersManager.isRestricted(peerId),\n this._isAnyGroup(peerId),\n this.setAutoDownloadMedia(),\n this.managers.appPeersManager.isMegagroup(peerId),\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isChannel(peerId),\n this.managers.appPeersManager.isBot(peerId)\n ]));\n\n this.noForwards = noForwards;\n this.isRestricted = isRestricted;\n this.isAnyGroup = isAnyGroup;\n this.isMegagroup = isMegagroup;\n this.isBroadcast = isBroadcast;\n this.isChannel = isChannel;\n this.isBot = isBot;\n\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n this.sharedMediaTab = appSidebarRight.createSharedMediaTab();\n this.sharedMediaTabs.push(this.sharedMediaTab);\n\n this.sharedMediaTab.setPeer(peerId, this.threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string) {\n if(!peerId) {\n this.inited = undefined;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n // const appMediaViewer = (window as any).appMediaViewer as AppMediaViewerBase;\n // if(appMediaViewer) {\n // appMediaViewer.close();\n // }\n\n const samePeer = this.peerId === peerId;\n if(!samePeer) {\n this.appImManager.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n this.messagesStorageKey = `${this.peerId}_${this.type === 'scheduled' ? 'scheduled' : 'history'}`;\n } else if(this.setPeerPromise) {\n return;\n }\n\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.bubbles.setPeer(false, peerId);\n this.appImManager.dispatchEvent('peer_changed', peerId);\n\n appSidebarRight.replaceSharedMediaTab();\n this.destroySharedMediaTab();\n this.sharedMediaTab = undefined;\n\n return;\n }\n\n this.peerChanged = samePeer;\n\n const bubblesSetPeerPromise = this.bubbles.setPeer(samePeer, peerId, lastMsgId, startParam);\n const setPeerPromise = this.setPeerPromise = bubblesSetPeerPromise.then((result) => {\n return result.promise;\n }).catch(noop).finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n return bubblesSetPeerPromise;\n }\n\n public destroySharedMediaTab(tab = this.sharedMediaTab) {\n if(!tab) {\n return;\n }\n\n indexOfAndSplice(this.sharedMediaTabs, tab);\n tab.destroy();\n }\n\n public async setAutoDownloadMedia() {\n this.autoDownload = await getAutoDownloadSettingsByPeerId(this.peerId);\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer(this.peerId, messageId);\n }\n\n public async finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n const peerId = this.peerId;\n this.peerChanged = true;\n this.wasAlreadyUsed = true;\n\n const middleware = this.bubbles.getMiddleware();\n\n this.cleanup(false);\n\n const sharedMediaTab = this.sharedMediaTab;\n sharedMediaTab.loadSidebarMedia(true);\n\n const callbacksPromise = Promise.all([\n this.topbar.finishPeerChange(isTarget),\n this.bubbles.finishPeerChange(),\n this.input.finishPeerChange(startParam)\n ]);\n\n const [callbacks] = await Promise.all([\n callbacksPromise,\n sharedMediaTab.fillProfileElements()\n ]);\n\n if(!middleware()) {\n return;\n }\n\n callbacks.forEach((callback) => {\n callback();\n });\n\n appSidebarRight.replaceSharedMediaTab(sharedMediaTab);\n\n this.sharedMediaTabs.filter((tab) => tab !== sharedMediaTab).forEach((tab) => this.destroySharedMediaTab(tab));\n\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n this.appImManager.dispatchEvent('peer_changed', peerId);\n }\n\n public getMessage(mid: number) {\n return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey, mid);\n }\n\n public async getMidsByMid(mid: number) {\n return this.managers.appMessagesManager.getMidsByMessage(await this.getMessage(mid));\n }\n\n public getHistoryStorage(ignoreThreadId?: boolean) {\n return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId, ignoreThreadId ? undefined : this.threadId)\n .then((historyStorageTransferable) => {\n return {\n ...historyStorageTransferable,\n history: SlicedArray.fromJSON(historyStorageTransferable.historySerialized)\n }\n });\n }\n\n public getHistoryMaxId() {\n return this.getHistoryStorage().then((historyStorage) => historyStorage.maxId);\n }\n\n public async _isAnyGroup(peerId: PeerId) {\n return peerId === rootScope.myId || peerId === REPLIES_PEER_ID || (await this.managers.appPeersManager.isAnyGroup(peerId));\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n if(!this.search) {\n this.search = new ChatSearch(this.topbar, this, query);\n } else {\n this.search.setQuery(query);\n }\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = appSidebarRight.createTab(AppPrivateSearchTab);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.managers.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return Promise.all([\n this.managers.appPeersManager.isBot(this.peerId),\n this.managers.appMessagesManager.getDialogOnly(this.peerId),\n this.getHistoryStorage(true)\n ]).then(([isBot, dialog, historyStorage]) => {\n return isBot && !dialog && !historyStorage.history.length;\n });\n }\n\n public getMessageSendingParams() {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n sendSilent: this.input.sendSilent,\n sendAsPeerId: this.input.sendAsPeerId\n };\n }\n\n public isOurMessage(message: Message.message | Message.messageService) {\n return message.fromId === rootScope.myId || (!!message.pFlags.out && this.isMegagroup);\n }\n\n public isOutMessage(message: Message.message | Message.messageService) {\n const fwdFrom = (message as Message.message).fwd_from;\n const isOut = this.isOurMessage(message) && (!fwdFrom || this.peerId !== rootScope.myId);\n return !!isOut;\n }\n\n public isAvatarNeeded(message: Message.message | Message.messageService) {\n return this.isAnyGroup && !this.isOutMessage(message);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {State} from '../config/state';\nimport rootScope from '../lib/rootScope';\n\nexport type ChatAutoDownloadSettings = {\n photo: number,\n video: number,\n file: number\n};\n\nexport default async function getAutoDownloadSettingsByPeerId(peerId: PeerId): Promise {\n let type: keyof State['settings']['autoDownload'];\n\n let photoSizeMax = 0, videoSizeMax = 0, fileSizeMax = 0;\n const settings = rootScope.settings;\n const appPeersManager = rootScope.managers.appPeersManager;\n if(!settings.autoDownloadNew.pFlags.disabled && peerId) {\n if(peerId.isUser()) {\n if(await appPeersManager.isContact(peerId)) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n } else if(await appPeersManager.isBroadcast(peerId)) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n\n if(settings.autoDownload.photo[type]) photoSizeMax = settings.autoDownloadNew.photo_size_max;\n if(settings.autoDownload.video[type]) videoSizeMax = settings.autoDownloadNew.video_size_max;\n if(settings.autoDownload.file[type]) fileSizeMax = settings.autoDownloadNew.file_size_max;\n }\n\n return {\n photo: photoSizeMax,\n video: videoSizeMax,\n file: fileSizeMax\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {AppImManager} from '../../lib/appManagers/appImManager';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\nimport {IS_APPLE, IS_MOBILE} from '../../environment/userAgent';\r\nimport appNavigationController from '../appNavigationController';\r\nimport {_i18n} from '../../lib/langPack';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\r\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\r\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\r\nimport clamp from '../../helpers/number/clamp';\r\nimport matchUrl from '../../lib/richTextProcessor/matchUrl';\r\nimport matchUrlProtocol from '../../lib/richTextProcessor/matchUrlProtocol';\r\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\r\n\r\nexport default class MarkupTooltip {\r\n public container: HTMLElement;\r\n private wrapper: HTMLElement;\r\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\r\n private linkBackButton: HTMLElement;\r\n private linkApplyButton: HTMLButtonElement;\r\n private hideTimeout: number;\r\n private addedListener = false;\r\n private waitingForMouseUp = false;\r\n private linkInput: HTMLInputElement;\r\n private savedRange: Range;\r\n private mouseUpCounter: number = 0;\r\n // private log: ReturnType;\r\n\r\n constructor(private appImManager: AppImManager) {\r\n // this.log = logger('MARKUP');\r\n }\r\n\r\n private init() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\r\n\r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add('markup-tooltip-wrapper');\r\n\r\n const tools1 = document.createElement('div');\r\n const tools2 = document.createElement('div');\r\n tools1.classList.add('markup-tooltip-tools');\r\n tools2.classList.add('markup-tooltip-tools');\r\n\r\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\r\n arr.forEach((c) => {\r\n const button = ButtonIcon(c, {noRipple: true});\r\n tools1.append(this.buttons[c] = button);\r\n\r\n if(c !== 'link') {\r\n button.addEventListener('mousedown', (e) => {\r\n cancelEvent(e);\r\n this.appImManager.chat.input.applyMarkdown(c);\r\n this.cancelClosening();\r\n\r\n /* this.mouseUpCounter = 0;\r\n this.setMouseUpEvent(); */\r\n // this.hide();\r\n });\r\n } else {\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n this.showLinkEditor();\r\n this.cancelClosening();\r\n });\r\n }\r\n });\r\n\r\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\r\n this.linkInput = document.createElement('input');\r\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\r\n this.linkInput.classList.add('input-clear');\r\n this.linkInput.addEventListener('keydown', (e) => {\r\n const valid = !this.linkInput.value.length || !!matchUrl(this.linkInput.value);// /^(http)|(https):\\/\\//i.test(this.linkInput.value);\r\n\r\n if(e.key === 'Enter') {\r\n if(!valid) {\r\n if(this.linkInput.classList.contains('error')) {\r\n this.linkInput.classList.remove('error');\r\n void this.linkInput.offsetLeft; // reflow\r\n }\r\n\r\n this.linkInput.classList.add('error');\r\n } else {\r\n this.applyLink(e);\r\n }\r\n }\r\n });\r\n\r\n this.linkInput.addEventListener('input', (e) => {\r\n const valid = this.isLinkValid();\r\n\r\n this.linkInput.classList.toggle('is-valid', valid);\r\n this.linkInput.classList.remove('error');\r\n });\r\n\r\n this.linkBackButton.addEventListener('mousedown', (e) => {\r\n // this.log('linkBackButton click');\r\n cancelEvent(e);\r\n this.container.classList.remove('is-link');\r\n // input.value = '';\r\n this.resetSelection();\r\n this.setTooltipPosition();\r\n this.cancelClosening();\r\n });\r\n\r\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\r\n this.linkApplyButton.addEventListener('mousedown', (e) => {\r\n // this.log('linkApplyButton click');\r\n this.applyLink(e);\r\n });\r\n\r\n const applyDiv = document.createElement('div');\r\n applyDiv.classList.add('markup-tooltip-link-apply-container');\r\n\r\n const delimiter1 = document.createElement('span');\r\n const delimiter2 = document.createElement('span');\r\n const delimiter3 = document.createElement('span');\r\n delimiter1.classList.add('markup-tooltip-delimiter');\r\n delimiter2.classList.add('markup-tooltip-delimiter');\r\n delimiter3.classList.add('markup-tooltip-delimiter');\r\n tools1.insertBefore(delimiter1, this.buttons.link);\r\n applyDiv.append(delimiter3, this.linkApplyButton);\r\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\r\n // tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\r\n\r\n this.wrapper.append(tools1, tools2);\r\n this.container.append(this.wrapper);\r\n document.body.append(this.container);\r\n\r\n window.addEventListener('resize', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n public showLinkEditor() {\r\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\r\n this.show();\r\n }\r\n\r\n const button = this.buttons.link;\r\n this.container.classList.add('is-link');\r\n\r\n const selection = document.getSelection();\r\n this.savedRange = selection.getRangeAt(0);\r\n\r\n if(button.classList.contains('active')) {\r\n const startContainer = this.savedRange.startContainer;\r\n const anchor = startContainer.parentElement as HTMLAnchorElement;\r\n this.linkInput.value = anchor.href;\r\n } else {\r\n this.linkInput.value = '';\r\n }\r\n\r\n this.setTooltipPosition(true);\r\n\r\n setTimeout(() => {\r\n this.linkInput.focus(); // !!! instant focus will break animation\r\n }, 200);\r\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\r\n }\r\n\r\n private applyLink(e: Event) {\r\n cancelEvent(e);\r\n this.resetSelection();\r\n let url = this.linkInput.value;\r\n if(url && !matchUrlProtocol(url)) {\r\n url = 'https://' + url;\r\n }\r\n this.appImManager.chat.input.applyMarkdown('link', url);\r\n setTimeout(() => {\r\n this.hide();\r\n }, 0);\r\n }\r\n\r\n private isLinkValid() {\r\n return !this.linkInput.value.length || !!matchUrl(this.linkInput.value);\r\n }\r\n\r\n private resetSelection(range: Range = this.savedRange) {\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n this.appImManager.chat.input.messageInput.focus();\r\n }\r\n\r\n public hide() {\r\n // return;\r\n\r\n if(this.init) return;\r\n\r\n this.container.classList.remove('is-visible');\r\n // document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n this.waitingForMouseUp = false;\r\n\r\n appNavigationController.removeByType('markup');\r\n\r\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hideTimeout = undefined;\r\n this.container.classList.add('hide');\r\n this.container.classList.remove('is-link');\r\n }, 200);\r\n }\r\n\r\n public getActiveMarkupButton() {\r\n const currentMarkups: Set = new Set();\r\n\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 // (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=\"true\"]');\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 const types = Object.keys(this.buttons) as MarkdownType[];\r\n const markup = hasMarkupInSelection(types);\r\n types.forEach((type) => {\r\n if(markup[type]) {\r\n currentMarkups.add(this.buttons[type as MarkdownType]);\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 document.addEventListener('beforeinput', (e) => {\r\n if(e.inputType === 'historyRedo' || e.inputType === 'historyUndo') {\r\n e.target.addEventListener('input', () => this.setActiveMarkupButton(), {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 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 noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport rootScope from '../rootScope';\nimport lottieLoader, {LottieAssetName} from './lottieLoader';\nimport type RLottiePlayer from './rlottiePlayer';\nimport {RLottieColor} from './rlottiePlayer';\n\nexport type RLottieIconOptions = {\n width: number,\n height: number,\n container?: HTMLElement,\n skipAnimation?: boolean\n};\n\nexport type RLottieIconItemPartOptions = {\n startFrame: number,\n endFrame: number,\n name?: string\n};\n\nexport type RLottieIconItemOptions = {\n name: LottieAssetName,\n parts: RLottieIconItemPartOptions[],\n initFrame?: number,\n player?: RLottiePlayer,\n autoplay?: boolean,\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n};\n\nexport class RLottieIconItemPart implements RLottieIconItemPartOptions {\n public startFrame: number;\n public endFrame: number;\n public name?: string;\n\n constructor(public item: RLottieIconItem, options: RLottieIconItemPartOptions) {\n safeAssign(this, options);\n }\n\n public play(callback?: () => void) {\n return this.item.playPart(this, callback);\n }\n}\n\n// export type RLottieIconItemPart = RLottieIconItemPartOptions;\n\nexport class RLottieIconItem implements RLottieIconItemOptions {\n public name: LottieAssetName;\n public parts: RLottieIconItemPart[];\n public player: RLottiePlayer;\n public initFrame: number;\n public autoplay: boolean;\n public color: RLottieColor;\n public inverseColor: RLottieColor;\n public loadPromise: Promise;\n public onLoadForPart: () => void;\n public onLoadForColor: () => void;\n\n constructor(public icon: RLottieIcon, options: RLottieIconItemOptions) {\n this.autoplay = false;\n\n safeAssign(this, options);\n\n this.parts = this.parts.map((options) => this.createPart(options));\n }\n\n public load() {\n let loadPromise = this.loadPromise;\n if(loadPromise) {\n return loadPromise;\n }\n\n const {container, canvas, width, height} = this.icon;\n loadPromise = lottieLoader.loadAnimationAsAsset({\n container,\n canvas,\n width,\n height,\n group: 'none',\n loop: false,\n autoplay: this.autoplay ?? false,\n initFrame: this.initFrame,\n skipFirstFrameRendering: this.initFrame === undefined,\n color: this.color,\n inverseColor: this.inverseColor\n }, this.name).then((player) => {\n return lottieLoader.waitForFirstFrame(player);\n }).then((player) => {\n this.player = player;\n\n if(this.onLoadForColor) {\n this.onLoadForColor();\n this.onLoadForColor = undefined;\n }\n\n if(this.onLoadForPart) {\n this.onLoadForPart();\n this.onLoadForPart = undefined;\n }\n });\n\n this.loadPromise = loadPromise;\n this.icon.loadPromises.set(this.name, loadPromise);\n return loadPromise;\n }\n\n public createPart(options: RLottieIconItemPartOptions) {\n return new RLottieIconItemPart(this, options);\n }\n\n public getPart(index: string | number | RLottieIconItemPart) {\n if(index instanceof RLottieIconItemPart) return index;\n else if(typeof(index) === 'string') return this.parts.find((part) => part.name === index);\n else return this.parts[index];\n }\n\n public playPart(part: RLottieIconItemPart, callback?: () => void) {\n return this.icon.playPart(this, part, callback);\n }\n}\n\nexport default class RLottieIcon {\n public container: HTMLElement;\n public canvas: HTMLCanvasElement;\n public width: number;\n public height: number;\n\n protected items: Map;\n public loadPromises: Map>;\n\n protected skipAnimation: boolean;\n\n constructor(options: RLottieIconOptions) {\n safeAssign(this, options);\n\n if(!this.container) this.container = document.createElement('div');\n this.container.classList.add('rlottie-icon');\n\n const {width, height} = this;\n this.container.style.width = width + 'px';\n this.container.style.height = height + 'px';\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = width;\n canvas.height = height;\n\n this.items = new Map();\n this.loadPromises = new Map();\n }\n\n public get loadPromise() {\n return Promise.all([...this.loadPromises.values()]).then(noop);\n }\n\n public getItem(name?: LottieAssetName): RLottieIconItem {\n return !name && this.items.size === 1 ? this.items.values().next().value : this.items.get(name);\n }\n\n public add(options: Omit) {\n const item = new RLottieIconItem(this, options);\n this.items.set(options.name, item);\n\n return item;\n }\n\n public playPart(item: RLottieIconItem, index: Parameters[0], callback?: () => void) {\n if(!item.player) {\n item.onLoadForPart = () => {\n this.playPart(item, index, callback);\n };\n\n return;\n }\n\n const part = item.getPart(index);\n item.player.playPart({\n from: rootScope.settings.animationsEnabled && !this.skipAnimation ? part.startFrame : part.endFrame,\n to: part.endFrame,\n callback\n });\n }\n\n /* public playToPart(item: RLottieIconItem, index: Parameters[0], toEnd: boolean) {\n if(!item.player) return;\n const part = item.getPart(index);\n const toFrame = toEnd ? part.endFrame : part.startFrame;\n item.player.playToFrame({\n frame: toFrame\n });\n } */\n\n public static generateEqualParts(length: number, frameCount: number): RLottieIconItemPartOptions[] {\n return new Array(length).fill(0).map((_, idx) => {\n const startFrame = idx * frameCount;\n return {startFrame, endFrame: startFrame + frameCount - 1};\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../helpers/noop';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {LottieAssetName} from '../lib/rlottie/lottieLoader';\nimport RLottieIcon, {RLottieIconItemPartOptions, RLottieIconItemPart} from '../lib/rlottie/rlottieIcon';\nimport {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};\nexport type SuperRLottieIconGetInfoResult = RLottieIconItemPart;\nexport class SuperRLottieIcon extends RLottieIcon {\n protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;\n protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;\n\n protected partState: Options['PartState'];\n protected colorState: Options['ColorState'];\n protected loaded: boolean;\n\n constructor(options: {\n width: number,\n height: number,\n skipAnimation?: boolean,\n getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,\n getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,\n }) {\n super({\n width: options.width,\n height: options.height\n });\n\n safeAssign(this, options);\n\n // hook the first call\n /* const originalFunction = this.setState.bind(this);\n this.setState = (partState, colorState) => {\n this.setState = originalFunction;\n this.load(partState, colorState);\n return originalFunction(partState, colorState);\n }; */\n }\n\n public load(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(this.loaded) {\n return this.loadPromise;\n }\n\n this.loaded = true;\n this.partState = partState;\n this.colorState = colorState;\n\n const part = this.getPart(partState);\n const color = colorState !== undefined && this.getColor && this.getColor(colorState);\n\n const item = part.item;\n item.initFrame = part.endFrame;\n item.color = color;\n\n const promises = [...this.items.values()].map((item) => item.load());\n return Promise.all(promises).then(noop);\n }\n\n /**\n * Will redirect setting color state to part callback to synchronize the rendering\n */\n public setState(partState: Options['PartState'], colorState?: Options['ColorState'], partCallback?: () => void) {\n if(!this.loaded) this.load(partState, colorState);\n\n let changedPartState = false, changedColorState = false;\n if(partState !== undefined) changedPartState = this.setPartState(partState, colorState, partCallback);\n else if(colorState !== undefined) changedColorState = this.setColorState(colorState);\n\n return changedPartState || changedColorState;\n }\n\n public setPartState(state: Options['PartState'], colorState?: Options['ColorState'], callback?: () => void) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return colorState !== undefined ? this.setColorState(colorState) : false;\n }\n\n if(colorState !== undefined) {\n this.setColorState(colorState, false);\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play(callback);\n\n return true;\n }\n\n public setColorState(state: Options['ColorState'], renderIfPaused = true) {\n const {colorState: prevState} = this;\n if(prevState === state || !this.getColor) {\n return false;\n }\n\n this.colorState = state;\n\n const item = this.getItem();\n const color = this.getColor(state, prevState);\n const invoke = () => {\n item.player.setColor(color, renderIfPaused);\n };\n\n if(item.player) {\n invoke();\n } else {\n item.onLoadForColor = invoke;\n }\n\n return true;\n }\n\n public destroy() {\n this.items.forEach((item) => {\n item.loadPromise.then(() => {\n item.player.remove();\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {RLottieIconItemPartOptions} from '../../lib/rlottie/rlottieIcon';\nimport {GROUP_CALL_MICROPHONE_BUTTON_STATE} from '.';\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallMicrophoneIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_MICROPHONE_BUTTON_STATE\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n let partName: string;\n switch(state) {\n case states.HAND:\n partName = prevState === states.MUTED ? 'muted-to-hand' : 'unmuted-to-hand';\n break;\n case states.MUTED:\n partName = prevState === states.HAND ? 'hand-to-muted' : 'mute';\n break;\n case states.UNMUTED:\n partName = 'unmute';\n break;\n }\n\n return this.getItem().getPart(partName);\n }\n });\n\n const className = 'group-call-microphone-icon';\n this.container.classList.add(className + '-container');\n\n const parts: RLottieIconItemPartOptions[] = [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 172,\n name: 'unmuted-to-hand'\n }, {\n startFrame: 173,\n endFrame: 201,\n name: 'scheduled-crossing'\n }, {\n startFrame: 202,\n endFrame: 236,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 237,\n endFrame: 273,\n name: 'scheduled-to-hand'\n }, {\n startFrame: 274,\n endFrame: 310,\n name: 'scheduled-crossed-to-hand'\n }, {\n startFrame: 311,\n endFrame: 343,\n name: 'scheduled-uncrossing'\n }, {\n startFrame: 344,\n endFrame: 375,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 376,\n endFrame: 403,\n name: 'play-to-muted'\n }];\n\n this.add({\n name: 'voip_filled',\n parts\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RLottieIcon from '../../lib/rlottie/rlottieIcon';\nimport {GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, GROUP_CALL_PARTICIPANT_MUTED_STATE, getColorByMutedState, clearMutedStateModifier} from '.';\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallParticipantMutedIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE,\n ColorState: GROUP_CALL_PARTICIPANT_MUTED_STATE\n}> {\n constructor(private colored: boolean) {\n super({\n width: 32,\n height: 32,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n\n let index: number;\n switch(state) {\n case states.HAND:\n index = 3;\n break;\n case states.MUTED:\n index = prevState === states.HAND ? 0 : 2;\n break;\n case states.UNMUTED:\n index = 1;\n break;\n }\n\n return this.getItem().getPart(index);\n },\n getColor: colored ? (state, prevState) => {\n return getColorByMutedState(state);\n } : undefined\n });\n\n const className = 'group-call-participant-muted-icon';\n this.container.classList.add(className + '-container');\n\n const parts = RLottieIcon.generateEqualParts(4, 21);\n this.add({\n name: 'voice_outlined2',\n parts\n });\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n return super.setState(clearMutedStateModifier(state), state);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '../popups';\nimport {hexToRgb} from '../../helpers/color';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport customProperties from '../../helpers/dom/customProperties';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport type {AppChatsManager} from '../../lib/appManagers/appChatsManager';\nimport type {AppGroupCallsManager} from '../../lib/appManagers/appGroupCallsManager';\nimport type {AppPeersManager} from '../../lib/appManagers/appPeersManager';\nimport GROUP_CALL_STATE from '../../lib/calls/groupCallState';\nimport {RLottieColor} from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIcon from './microphoneIcon';\nimport GroupCallParticipantsElement from './participants';\nimport GroupCallParticipantsVideoElement from './participantVideos';\nimport PopupPeer from '../popups/peer';\nimport GroupCallDescriptionElement from './description';\nimport GroupCallTitleElement from './title';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../../helpers/dom/fullScreen';\nimport Scrollable from '../scrollable';\nimport {MovableState} from '../movableElement';\nimport animationIntersector from '../animationIntersector';\nimport {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport throttle from '../../helpers/schedulers/throttle';\nimport IS_SCREEN_SHARING_SUPPORTED from '../../environment/screenSharingSupport';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport makeButton from '../call/button';\nimport MovablePanel from '../../helpers/movablePanel';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport groupCallsController from '../../lib/calls/groupCallsController';\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let 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 const color: RLottieColor = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nconst className = 'group-call';\n\nexport default class PopupGroupCall extends PopupElement {\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movablePanel: MovablePanel;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n private btnVideo: HTMLDivElement;\n private btnScreen: HTMLDivElement;\n\n constructor() {\n super('popup-group-call', {\n body: true,\n withoutOverlay: true,\n closable: true,\n title: true\n });\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = groupCallsController.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen ' + className + '-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n\n attachClickEvent(btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(btnFullScreen2, this.onFullScreenClick, {listenerSetter});\n\n attachClickEvent(btnExitFullScreen, () => {\n cancelFullScreen();\n }, {listenerSetter});\n\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n }\n\n const btnInvite = this.btnInvite = ButtonIcon('adduser');\n const btnShowColumn = this.btnShowColumn = ButtonIcon('rightpanel ' + className + '-only-big');\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add(className + '-header-info');\n\n this.title.classList.add(className + '-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add(className + '-header');\n this.header.append(...[this.btnExitFullScreen, headerInfo/* , btnInvite */, this.btnFullScreen, btnShowColumn].filter(Boolean));\n\n const newHeader = this.header.cloneNode(false) as HTMLElement;\n const newHeaderInfo = headerInfo.cloneNode(false) as HTMLElement;\n const newHeaderTitle = this.title.cloneNode(false) as HTMLElement;\n\n newHeaderInfo.append(newHeaderTitle);\n\n const btnHideColumn = ButtonIcon('rightpanel');\n newHeader.append(...[btnHideColumn, newHeaderInfo, this.btnFullScreen2].filter(Boolean));\n\n attachClickEvent(btnHideColumn, this.toggleRightColumn, {listenerSetter});\n\n this.body.prepend(newHeader);\n\n const videosScrollable = new Scrollable(undefined);\n videosScrollable.container.classList.add('group-call-big-video-container');\n this.container.append(videosScrollable.container);\n\n this.groupCallTitle = new GroupCallTitleElement(this.title);\n this.groupCallDescription = new GroupCallDescriptionElement(subtitle);\n this.groupCallBodyHeaderDescription = new GroupCallDescriptionElement(newHeaderTitle);\n this.constructButtons();\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n managers: this.managers\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n managers: this.managers\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: 400,\n minHeight: 480,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'chatlist') ||\n findUpClassName(target, 'group-call-button') ||\n findUpClassName(target, 'btn-icon') ||\n findUpClassName(target, 'group-call-participants-video-container') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n onResize: () => this.toggleBigLayout(),\n previousState\n });\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n if(this.instance?.id === groupCall.id) {\n this.updateInstance();\n }\n });\n\n listenerSetter.add(instance)('pinned', () => {\n this.setHasPinned();\n });\n\n listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', this.onToggleControls);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n private constructButtons() {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n const _makeButton = makeButton.bind(null, className, this.listenerSetter);\n\n const btnVideo = this.btnVideo = _makeButton({\n // text: 'VoiceChat.Video.Stream.Video',\n callback: this.onVideoClick,\n icon: 'videocamera_filled'\n });\n\n const btnScreen = this.btnScreen = _makeButton({\n // text: 'VoiceChat.Video.Stream.Screencast',\n callback: this.onScreenClick,\n icon: 'sharescreen_filled'\n });\n\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnMute = _makeButton({\n noRipple: true,\n callback: throttle(this.onMuteClick, 600, true)\n });\n btnMute.classList.add(className + '-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const btnMore = _makeButton({\n // text: 'VoiceChat.Video.Stream.More'\n icon: 'settings_filled'\n });\n\n btnMore.classList.add('btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = _makeButton({\n // text: 'VoiceChat.Leave',\n isDanger: true,\n callback: this.onLeaveClick,\n icon: 'close'\n });\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onToggleControls = (show: boolean) => {\n this.container.classList.toggle('show-controls', show);\n this.buttonsContainer.classList.toggle('show-controls', show);\n };\n\n private toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n private onVideoClick = () => {\n const toggle = this.toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = this.toggleDisability([this.btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n };\n\n private onMuteClick = () => {\n const participant = this.instance.participant;\n if(!participant.pFlags.can_self_unmute) {\n if(participant.raise_hand_rating === undefined) {\n this.instance.changeRaiseHand(true);\n }\n } else {\n this.instance.toggleMuted();\n }\n };\n\n private onLeaveClick = async() => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(await this.managers.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true\n }]\n }).show();\n } else {\n hangUp(false);\n }\n };\n\n public getContainer() {\n return this.container;\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations2(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const movable = this.movablePanel?.movable;\n const isBig = (isFull || !!(movable && movable.width >= 680)) && !!this.videosCount;\n\n /* if(!isBig && isFull) {\n cancelFullScreen();\n return;\n } */\n\n const wasBig = this.container.classList.contains('is-big-layout');\n let buttons: HTMLElement[];\n if(isBig && !wasBig) { // fix buttons transition to 0 opacity\n buttons = Array.from(this.buttonsContainer.children) as HTMLElement[];\n buttons.forEach((element) => {\n element.style.opacity = '0';\n });\n\n void this.buttonsContainer.offsetLeft;\n }\n\n this.container.classList.toggle('is-big-layout', isBig);\n this.btnInvite.classList.toggle('hide', isBig);\n this.btnShowColumn.classList.toggle('hide', !isBig);\n\n if(buttons) {\n // window.requestAnimationFrame(() => {\n buttons.forEach((element) => {\n element.style.opacity = '';\n });\n // });\n }\n };\n\n private toggleRightColumn = () => {\n this.container.classList.toggle('is-right-column-shown');\n };\n\n private setHasPinned() {\n this.container.classList.toggle('has-pinned', !!this.instance.pinnedSource);\n }\n\n private updateInstance() {\n if(this.instance.state === GROUP_CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.hide();\n return;\n }\n\n const {participant, groupCall} = this.instance;\n if(!participant) {\n return;\n }\n\n this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(groupCall as any, participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {GroupCallParticipant} from '../../layer';\nimport {i18n} from '../../lib/langPack';\nimport {GROUP_CALL_PARTICIPANT_MUTED_STATE} from '.';\nimport {GroupCallParticipantVideoType} from './participantVideo';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter((type) => !!participant[type]).map((type) => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n\n replaceContent(this.container, span);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {fastRaf} from '../../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport appDialogsManager, {DialogDom, AppDialogsManager, DialogElementSize} from '../../lib/appManagers/appDialogsManager';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport type GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: async(element) => (await this.instance.getParticipantByPeerId(element.id)).date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: async(element) => {\n const participant = await this.instance.getParticipantByPeerId(element.id);\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n /* instance.getParticipantByPeerId(base.id).then((participant) => {\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n }); */\n\n (base as SortedParticipant).dom = dom;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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', {alpha: false});\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCallParticipant} from '../../layer';\nimport type {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {i18n} from '../../lib/langPack';\nimport PeerTitle from '../peerTitle';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport callVideoCanvasBlur from '../call/videoCanvasBlur';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private managers: AppManagers, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n\n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n\n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n\n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n\n this.container.append(this.header);\n // }\n\n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n video.classList.add(className, 'call-video');\n\n if(video.paused) {\n video.play();\n }\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(className + '-blur');\n\n this.container.prepend(canvas, video);\n\n this.updateParticipant(participant);\n }\n\n public updateParticipant(participant: GroupCallParticipant) {\n const state = getGroupCallParticipantMutedState(participant);\n\n this.groupCallParticipantMutedIcon.setState(state);\n this.groupCallParticipantStatus.setState(state, participant);\n }\n\n public destroy() {\n this.groupCallParticipantMutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ControlsHover from '../../helpers/dom/controlsHover';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipant} from '../../layer';\nimport {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport GroupCallParticipantVideoElement, {GroupCallParticipantVideoType} from './participantVideo';\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange'],\n managers: AppManagers\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(this.instance)('pinned', (source) => {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return;\n }\n\n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some((type) => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach((type) => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.managers, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n\n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n\n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n (await instance.participants).forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupGroupCall from '.';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {addFullScreenListener, isFullScreen} from '../../helpers/dom/fullScreen';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport positionMenu from '../../helpers/positionMenu';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport {GroupCallParticipant} from '../../layer';\nimport type {AppChatsManager} from '../../lib/appManagers/appChatsManager';\nimport type {AppGroupCallsManager} from '../../lib/appManagers/appGroupCallsManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport type {AppPeersManager} from '../../lib/appManagers/appPeersManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\nimport confirmationPopup from '../confirmationPopup';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport Scrollable from '../scrollable';\nimport GroupCallParticipantsList from './participantsList';\nimport GroupCallParticipantsVideoElement from './participantVideos';\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean | Promise})[];\n private element: HTMLDivElement;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n private managers: AppManagers;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n managers: AppManagers,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.managers.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: async() => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: await this.managers.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.managers.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.managers = options.managers;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n\n this.element = ButtonMenu(this.buttons, listenerSetter);\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener(options.onContextElement, async(e: any) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n cancelEvent(e);\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = await this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = await this.managers.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n await filterAsync(this.buttons, async(button) => {\n const good = await button.verify(peerId);\n button.element.classList.toggle('hide', !good);\n return good;\n });\n\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n contextMenuController.openBtnMenu(this.element);\n }, listenerSetter);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n contextMenuController.close();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? PopupElement.getPopups(PopupGroupCall)[0].getContainer(): document.body;\n\n if(!isFull) {\n contextMenuController.close();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopups(PopupGroupCall)[0];\n if(popup) {\n popup.hide();\n }\n\n appImManager.setInnerPeer({peerId: this.targetPeerId});\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.instance.editParticipant(this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n\n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n\n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n const participants = await instance.participants;\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCall} from '../../layer';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport GROUP_CALL_STATE from '../../lib/calls/groupCallState';\nimport I18n, {LangPackKey, FormatterArguments} from '../../lib/langPack';\n\nexport default class GroupCallDescriptionElement {\n private descriptionIntl: I18n.IntlElement;\n\n constructor(private appendTo: HTMLElement) {\n this.descriptionIntl = new I18n.IntlElement({\n key: 'VoiceChat.Status.Connecting'\n });\n\n this.descriptionIntl.element.classList.add('group-call-description');\n }\n\n public detach() {\n this.descriptionIntl.element.remove();\n }\n\n public update(instance: GroupCallInstance) {\n const {state} = instance;\n\n let key: LangPackKey, args: FormatterArguments;\n if(state === GROUP_CALL_STATE.CONNECTING) {\n key = 'VoiceChat.Status.Connecting';\n } else {\n key = 'VoiceChat.Status.Members';\n args = [(instance.groupCall as GroupCall.groupCall).participants_count];\n }\n\n const {descriptionIntl} = this;\n descriptionIntl.compareAndUpdate({\n key,\n args\n });\n\n if(!this.descriptionIntl.element.parentElement) {\n this.appendTo.append(this.descriptionIntl.element);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {GroupCall} from '../../layer';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport PeerTitle from '../peerTitle';\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.peerId !== peerId) {\n peerTitle.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport ripple from '../ripple';\n\nexport default function makeButton(className: string, listenerSetter: ListenerSetter, options: {\n text?: LangPackKey | HTMLElement,\n isDanger?: boolean,\n noRipple?: boolean,\n callback?: () => void,\n icon?: string,\n isConfirm?: boolean,\n}) {\n const _className = className + '-button';\n const buttonDiv = document.createElement('div');\n buttonDiv.classList.add(_className, 'call-button', 'rp-overflow');\n\n if(options.icon) {\n buttonDiv.classList.add('tgico-' + options.icon);\n }\n\n if(!options.noRipple) {\n ripple(buttonDiv);\n }\n\n if(options.isDanger) {\n buttonDiv.classList.add(_className + '-red');\n }\n\n if(options.isConfirm) {\n buttonDiv.classList.add(_className + '-green');\n }\n\n if(options.callback) {\n attachClickEvent(buttonDiv, options.callback, {listenerSetter});\n }\n\n let ret = buttonDiv;\n if(options.text) {\n const div = document.createElement('div');\n div.classList.add(_className + '-container', 'call-button-container');\n\n const textEl = typeof(options.text) === 'string' ? i18n(options.text) : options.text;\n textEl.classList.add(_className + '-text', 'call-button-text');\n\n div.append(buttonDiv, textEl);\n\n ret = div;\n }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\nimport windowSize from '../helpers/windowSize';\nimport SwipeHandler from './swipeHandler';\n\ntype ResizeSide = 'n' | 'e' | 's' | 'w' | 'ne' | 'se' | 'sw' | 'nw';\nexport type MovableState = {\n top?: number;\n left?: number;\n width: number;\n height: number;\n};\n\nconst className = 'movable-element';\nconst resizeHandlerClassName = className + '-resize-handler';\n\nexport type MovableElementOptions = {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element'],\n verifyTouchTarget?: MovableElement['verifyTouchTarget']\n};\n\nexport default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\n private verifyTouchTarget: (e: TouchEvent | MouseEvent) => boolean;\n\n private top: number;\n private left: number;\n private _width: number;\n private _height: number;\n\n private swipeHandler: SwipeHandler;\n private handlers: HTMLElement[];\n\n constructor(options: MovableElementOptions) {\n super(true);\n safeAssign(this, options);\n\n this.top = this.left = this.width = this.height = 0;\n this.element.classList.add(className);\n\n this.addResizeHandlers();\n this.setSwipeHandler();\n\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private onResize = () => {\n this.fixDimensions();\n this.fixPosition();\n this.setPosition();\n };\n\n public destroyElements() {\n this.element.classList.remove(className);\n\n if(this.handlers) {\n this.handlers.forEach((handler) => {\n handler.remove();\n });\n }\n }\n\n public destroy() {\n mediaSizes.removeEventListener('resize', this.onResize);\n this.swipeHandler.removeListeners();\n }\n\n private addResizeHandlers() {\n const sides: ResizeSide[] = ['n', 'e', 's', 'w', 'ne', 'se', 'sw', 'nw'];\n this.handlers = sides.map((side) => {\n const div = document.createElement('div');\n div.dataset.side = side;\n div.classList.add(resizeHandlerClassName, resizeHandlerClassName + '-side-' + side);\n this.element.append(div);\n return div;\n });\n }\n\n private setSwipeHandler() {\n let startTop: number, startLeft: number, startWidth: number, startHeight: number, resizingSide: ResizeSide;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.element,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1; // to right will be positive\n yDiff *= -1; // to bottom will be positive\n // console.log(xDiff, yDiff, e);\n\n if(resizingSide) {\n if(resizingSide.includes('e') || resizingSide.includes('w')) {\n const isEnlarging = resizingSide.includes('e') && xDiff > 0 || resizingSide.includes('w') && xDiff < 0;\n const resizeDiff = Math.abs(xDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('e') ? windowSize.width - startLeft : startWidth + startLeft;\n this.width = Math.min(maxPossible, startWidth + resizeDiff);\n }\n\n if(resizingSide.includes('n') || resizingSide.includes('s')) {\n const isEnlarging = resizingSide.includes('s') && yDiff > 0 || resizingSide.includes('n') && yDiff < 0;\n const resizeDiff = Math.abs(yDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('s') ? windowSize.height - startTop : startHeight + startTop;\n this.height = Math.min(maxPossible, startHeight + resizeDiff);\n }\n\n this.fixDimensions();\n\n if(resizingSide.includes('w')) {\n this.left = Math.min(startLeft + startWidth - this.minWidth, startLeft + xDiff);\n }\n\n if(resizingSide.includes('n')) {\n this.top = Math.min(startTop + startHeight - this.minHeight, startTop + yDiff);\n }\n } else {\n this.top = startTop + yDiff;\n this.left = startLeft + xDiff;\n }\n\n this.fixPosition();\n this.setPosition();\n },\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(this.verifyTouchTarget && !this.verifyTouchTarget(e)) {\n return false;\n }\n\n const resizeHandler = findUpClassName(target, resizeHandlerClassName);\n if(resizeHandler) {\n resizingSide = resizeHandler.dataset.side as ResizeSide;\n swipeHandler.setCursor('');\n } else {\n resizingSide = undefined;\n swipeHandler.setCursor('grabbing');\n }\n\n return true;\n },\n onFirstSwipe: () => {\n startTop = this.top;\n startLeft = this.left;\n startWidth = this.width;\n startHeight = this.height;\n }\n });\n }\n\n public setPositionToCenter() {\n this.top = (windowSize.height / 2) - (this.height / 2);\n this.left = (windowSize.width / 2) - (this.width / 2);\n this.setPosition();\n }\n\n private fixDimensions() {\n this.width = clamp(this.width, this.minWidth, windowSize.width);\n this.height = clamp(this.height, this.minHeight, windowSize.height);\n }\n\n private fixPosition() {\n this.top = clamp(this.top, 0, windowSize.height - this.height);\n this.left = clamp(this.left, 0, windowSize.width - this.width);\n }\n\n private setPosition() {\n this.element.style.top = this.top + 'px';\n this.element.style.left = this.left + 'px';\n this.element.style.right = 'auto';\n this.element.style.bottom = 'auto';\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n this.dispatchEvent('resize');\n }\n\n public get width() {\n return this._width;\n }\n\n public get height() {\n return this._height;\n }\n\n private set width(value: number) {\n this._width = value;\n }\n\n private set height(value: number) {\n this._height = value;\n }\n\n public get state(): MovableState {\n const {top, left, width, height} = this;\n return {\n top,\n left,\n width,\n height\n };\n }\n\n public set state(state: MovableState) {\n const {top, left, width, height} = state;\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n this.onResize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MovableElement, {MovableElementOptions, MovableState} from '../components/movableElement';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport ListenerSetter from './listenerSetter';\nimport mediaSizes, {ScreenSize} from './mediaSizes';\nimport safeAssign from './object/safeAssign';\n\nexport default class MovablePanel {\n #movable: MovableElement;\n private listenerSetter: ListenerSetter;\n private previousState: MovableState;\n private onResize: () => void;\n private movableOptions: MovableElementOptions;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n previousState: MovableState,\n onResize?: () => void,\n movableOptions: MovableElementOptions\n }) {\n safeAssign(this, options);\n\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n this.listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n }\n\n public destroy() {\n const movable = this.movable;\n if(movable) {\n movable.destroy();\n }\n }\n\n public get movable() {\n return this.#movable;\n }\n\n public get state() {\n return this.movable ? this.movable.state : this.previousState;\n }\n\n public set state(state: MovableState) {\n this.previousState = state;\n }\n\n private toggleMovable(enabled: boolean) {\n let {movable} = this;\n if(enabled) {\n if(movable) {\n return;\n }\n\n movable = this.#movable = new MovableElement(this.movableOptions);\n\n movable.state = this.previousState;\n if(this.previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n\n if(this.onResize) {\n this.listenerSetter.add(movable)('resize', this.onResize);\n }\n } else {\n if(!movable) {\n return;\n }\n\n this.previousState = movable.state;\n movable.destroyElements();\n movable.destroy();\n this.#movable = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function toggleClassName(className: string, elements: HTMLElement[], disable: boolean) {\n elements.forEach((element) => {\n element.classList.toggle(className, disable);\n });\n\n return () => toggleClassName(className, elements, !disable);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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 replaceContent from '../../helpers/dom/replaceContent';\nimport MovablePanel from '../../helpers/movablePanel';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport themeController from '../../helpers/themeController';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport CallInstance from '../../lib/calls/callInstance';\nimport CALL_STATE from '../../lib/calls/callState';\nimport I18n, {i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport animationIntersector from '../animationIntersector';\nimport AvatarElement from '../avatar';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIconMini from '../groupCall/microphoneIconMini';\nimport {MovableState} from '../movableElement';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport SetTransition from '../singleTransition';\nimport makeButton from './button';\nimport CallDescriptionElement from './description';\nimport callVideoCanvasBlur from './videoCanvasBlur';\n\nconst className = 'call';\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 580;\n\nconst INIT_STATE: MovableState = {\n width: MIN_WIDTH,\n height: MIN_HEIGHT\n};\n\nlet previousState: MovableState = {...INIT_STATE};\n\nexport default class PopupCall extends PopupElement {\n private peerId: PeerId;\n\n private description: CallDescriptionElement;\n private emojisSubtitle: HTMLElement;\n\n private partyStates: HTMLElement;\n private partyMutedState: HTMLElement;\n\n private firstButtonsRow: HTMLElement;\n private secondButtonsRow: HTMLElement;\n\n private declineI18nElement: I18n.IntlElement;\n\n private makeButton: (options: Parameters[2]) => HTMLElement;\n private btnAccept: HTMLElement;\n private btnDecline: HTMLElement;\n private btnVideo: HTMLElement;\n private btnScreen: HTMLElement;\n private btnMute: HTMLElement;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n\n private movablePanel: MovablePanel;\n private microphoneIcon: GroupCallMicrophoneIconMini;\n private muteI18nElement: I18n.IntlElement;\n\n private videoContainers: {\n input?: HTMLElement,\n output?: HTMLElement\n };\n\n private controlsHover: ControlsHover;\n\n constructor(private instance: CallInstance) {\n super('popup-call', {\n withoutOverlay: true,\n closable: true\n });\n\n this.videoContainers = {};\n\n const {container, listenerSetter} = this;\n container.classList.add(className, 'night');\n\n const avatarContainer = document.createElement('div');\n avatarContainer.classList.add(className + '-avatar');\n\n const peerId = this.peerId = this.instance.interlocutorUserId.toPeerId();\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-full');\n avatar.updateWithOptions({\n isBig: true,\n peerId: peerId\n });\n avatarContainer.append(avatar);\n\n const title = new PeerTitle({\n peerId\n }).element;\n\n title.classList.add(className + '-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-subtitle');\n\n const description = this.description = new CallDescriptionElement(subtitle);\n\n const emojisSubtitle = this.emojisSubtitle = document.createElement('div');\n emojisSubtitle.classList.add(className + '-emojis');\n\n container.append(avatarContainer, title, subtitle);\n\n if(!IS_MOBILE) {\n this.btnFullScreen = ButtonIcon('fullscreen');\n this.btnExitFullScreen = ButtonIcon('smallscreen hide');\n attachClickEvent(this.btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(this.btnExitFullScreen, () => cancelFullScreen(), {listenerSetter});\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n this.header.prepend(this.btnExitFullScreen);\n this.header.append(this.btnFullScreen);\n\n container.append(emojisSubtitle);\n } else {\n this.header.append(emojisSubtitle);\n }\n\n this.partyStates = document.createElement('div');\n this.partyStates.classList.add(className + '-party-states');\n\n this.partyMutedState = document.createElement('div');\n this.partyMutedState.classList.add(className + '-party-state');\n const stateText = i18n('VoipUserMicrophoneIsOff', [new PeerTitle({peerId, onlyFirstName: true, limitSymbols: 18}).element]);\n stateText.classList.add(className + '-party-state-text');\n const mutedIcon = new GroupCallMicrophoneIconMini(false, true);\n mutedIcon.setState(false, false);\n this.partyMutedState.append(\n mutedIcon.container,\n stateText\n );\n\n this.partyStates.append(this.partyMutedState);\n this.container.append(this.partyStates);\n\n this.makeButton = makeButton.bind(null, className, this.listenerSetter);\n this.constructFirstButtons();\n this.constructSecondButtons();\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(instance)('mediaState', () => {\n this.updateInstance();\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: MIN_WIDTH,\n minHeight: MIN_HEIGHT,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'call-button') ||\n findUpClassName(target, 'btn-icon') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n // onResize: () => this.toggleBigLayout(),\n previousState: !this.instance.wasTryingToJoin && !this.instance.isOutgoing ? {...INIT_STATE} : previousState\n });\n\n const movableElement = this.movablePanel.movable;\n if(movableElement) {\n this.listenerSetter.add(movableElement)('resize', () => {\n this.resizeVideoContainers();\n });\n }\n\n const controlsHover = this.controlsHover = new ControlsHover();\n controlsHover.setup({\n element: this.container,\n listenerSetter: this.listenerSetter,\n showOnLeaveToClassName: 'call-buttons'\n });\n controlsHover.showControls(false);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.microphoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.updateInstance();\n }\n\n public getCallInstance() {\n return this.instance;\n }\n\n private constructFirstButtons() {\n const buttons = this.firstButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-first');\n\n const toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n const btnVideo = this.btnVideo = this.makeButton({\n text: 'Call.Camera',\n icon: 'videocamera_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleVideoSharing().finally(toggle);\n }\n });\n\n const btnScreen = this.btnScreen = this.makeButton({\n text: 'Call.Screen',\n icon: 'sharescreen_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleScreenSharing().finally(toggle);\n }\n });\n\n if(!IS_SCREEN_SHARING_SUPPORTED) {\n btnScreen.classList.add('hide');\n this.container.classList.add('no-screen');\n }\n\n this.muteI18nElement = new I18n.IntlElement({\n key: 'Call.Mute'\n });\n const btnMute = this.btnMute = this.makeButton({\n text: this.muteI18nElement.element,\n callback: () => {\n this.instance.toggleMuted();\n }\n });\n\n const microphoneIcon = this.microphoneIcon = new GroupCallMicrophoneIconMini(true, true);\n btnMute.firstElementChild.append(microphoneIcon.container);\n\n // btnVideo.classList.add('disabled');\n // btnScreen.classList.add('disabled');\n\n buttons.append(btnVideo, btnScreen, btnMute);\n this.container.append(buttons);\n }\n\n private constructSecondButtons() {\n const buttons = this.secondButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-second');\n\n this.declineI18nElement = new I18n.IntlElement({\n key: 'Call.Decline'\n });\n const btnDecline = this.btnDecline = this.makeButton({\n text: this.declineI18nElement.element,\n icon: 'endcall_filled',\n callback: () => {\n this.instance.hangUp('phoneCallDiscardReasonHangup');\n },\n isDanger: true\n });\n\n const btnAccept = this.btnAccept = this.makeButton({\n text: 'Call.Accept',\n icon: 'phone_filled',\n callback: () => {\n this.instance.acceptCall();\n },\n isConfirm: true\n });\n\n buttons.append(btnDecline, btnAccept);\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onFullScreenChange = () => {\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n\n this.resizeVideoContainers();\n }\n };\n\n private createVideoContainer(video: HTMLVideoElement) {\n const _className = className + '-video';\n const container = document.createElement('div');\n container.classList.add(_className + '-container');\n\n video.classList.add(_className);\n if(video.paused) {\n video.play();\n }\n\n attachClickEvent(container, () => {\n if(!container.classList.contains('small')) {\n return;\n }\n\n const big = Object.values(this.videoContainers).find((container) => !container.classList.contains('small'));\n big.classList.add('small');\n big.style.cssText = container.style.cssText;\n container.classList.remove('small');\n container.style.cssText = '';\n\n this.resizeVideoContainers();\n });\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(_className + '-blur');\n\n container.append(canvas, video);\n\n return container;\n }\n\n private updateInstance() {\n const {instance} = this;\n const {connectionState} = instance;\n if(connectionState === CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.btnVideo.classList.add('disabled');\n\n this.hide();\n return;\n }\n\n const isPendingIncoming = !instance.isOutgoing && connectionState === CALL_STATE.PENDING;\n this.declineI18nElement.compareAndUpdate({\n key: connectionState === CALL_STATE.PENDING ? 'Call.Decline' : 'Call.End'\n });\n this.btnAccept.classList.toggle('disable', !isPendingIncoming);\n this.btnAccept.classList.toggle('hide-me', !isPendingIncoming);\n this.container.classList.toggle('two-button-rows', isPendingIncoming);\n\n const isMuted = instance.isMuted;\n const onFrame = () => {\n this.btnMute.firstElementChild.classList.toggle('active', isMuted);\n };\n\n const player = this.microphoneIcon.getItem().player;\n this.microphoneIcon.setState(!isMuted, !isMuted, onFrame);\n if(!player) {\n onFrame();\n }\n\n this.muteI18nElement.compareAndUpdate({\n key: isMuted ? 'VoipUnmute' : 'Call.Mute'\n });\n\n const isSharingVideo = instance.isSharingVideo;\n this.btnVideo.firstElementChild.classList.toggle('active', isSharingVideo);\n\n const isSharingScreen = instance.isSharingScreen;\n this.btnScreen.firstElementChild.classList.toggle('active', isSharingScreen);\n\n const outputState = instance.getMediaState('output');\n\n SetTransition(this.partyMutedState, 'is-visible', !!outputState?.muted, 300);\n\n const containers = this.videoContainers;\n const oldContainers = {...containers};\n ['input' as const, 'output' as const].forEach((type) => {\n const mediaState = instance.getMediaState(type);\n const video = instance.getVideoElement(type) as HTMLVideoElement;\n\n const hasFrame = !!(video && video.videoWidth && video.videoHeight);\n if(video && !hasFrame && !video.dataset.hasPromise) {\n video.dataset.hasPromise = '1';\n // container.classList.add('hide');\n onMediaLoad(video).then(() => {\n delete video.dataset.hasPromise;\n this.updateInstance();\n // this.resizeVideoContainers();\n // container.classList.remove('hide');\n });\n }\n\n const isActive = !!video && hasFrame && !!(mediaState && (mediaState.videoState === 'active' || mediaState.screencastState === 'active'));\n let videoContainer = containers[type];\n\n if(isActive && video && !videoContainer) {\n videoContainer = containers[type] = this.createVideoContainer(video);\n this.container.append(videoContainer);\n }\n\n if(!isActive && videoContainer) {\n videoContainer.remove();\n delete containers[type];\n }\n });\n\n {\n const input = containers.input;\n const output = containers.output;\n if(Object.keys(oldContainers).length !== Object.keys(containers).length && input) {\n input.classList.toggle('small', !!output);\n }\n\n if(output && !input) {\n output.classList.remove('small');\n }\n }\n\n this.resizeVideoContainers();\n\n this.container.classList.toggle('no-video', !Object.keys(containers).length);\n\n if(!this.emojisSubtitle.textContent && connectionState < CALL_STATE.EXCHANGING_KEYS) {\n Promise.resolve(instance.getEmojisFingerprint()).then((emojis) => {\n replaceContent(this.emojisSubtitle, 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 cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport rootScope from '../lib/rootScope';\nimport ButtonIcon from './buttonIcon';\nimport TopbarWeave from './topbarWeave';\nimport SetTransition from './singleTransition';\nimport PopupGroupCall from './groupCall';\nimport GroupCallDescriptionElement from './groupCall/description';\nimport GroupCallTitleElement from './groupCall/title';\nimport PopupElement from './popups';\nimport throttle from '../helpers/schedulers/throttle';\nimport GroupCallInstance from '../lib/calls/groupCallInstance';\nimport CALL_STATE from '../lib/calls/callState';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport PeerTitle from './peerTitle';\nimport CallDescriptionElement from './call/description';\nimport PopupCall from './call';\nimport GroupCallMicrophoneIconMini from './groupCall/microphoneIconMini';\nimport CallInstance from '../lib/calls/callInstance';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport groupCallsController from '../lib/calls/groupCallsController';\nimport StreamManager from '../lib/calls/streamManager';\nimport callsController from '../lib/calls/callsController';\n\nfunction convertCallStateToGroupState(state: CALL_STATE, isMuted: boolean) {\n switch(state) {\n case CALL_STATE.CLOSING:\n case CALL_STATE.CLOSED:\n return GROUP_CALL_STATE.CLOSED;\n case CALL_STATE.CONNECTED:\n return isMuted ? GROUP_CALL_STATE.MUTED : GROUP_CALL_STATE.UNMUTED;\n default:\n return GROUP_CALL_STATE.CONNECTING;\n }\n}\n\nconst CLASS_NAME = 'topbar-call';\n\nexport default class TopbarCall {\n public container: HTMLElement;\n private listenerSetter: ListenerSetter;\n private weave: TopbarWeave;\n private center: HTMLDivElement;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallMicrophoneIconMini: GroupCallMicrophoneIconMini;\n private callDescription: CallDescriptionElement;\n\n private currentDescription: GroupCallDescriptionElement | CallDescriptionElement;\n\n private instance: GroupCallInstance | any/* CallInstance */;\n private instanceListenerSetter: ListenerSetter;\n\n constructor(\n private managers: AppManagers\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(callsController)('instance', ({instance}) => {\n if(!this.instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(callsController)('accepting', (instance) => {\n if(this.instance !== instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(groupCallsController)('instance', (instance) => {\n this.updateInstance(instance);\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = groupCallsController.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(StreamManager.ANALYSER_LISTENER)('amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private onState = () => {\n this.updateInstance(this.instance);\n };\n\n private clearCurrentInstance() {\n if(!this.instance) return;\n this.center.textContent = '';\n\n if(this.currentDescription) {\n this.currentDescription.detach();\n this.currentDescription = undefined;\n }\n\n this.instance = undefined;\n this.instanceListenerSetter.removeAll();\n }\n\n private updateInstance(instance: TopbarCall['instance']) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n const isChangingInstance = this.instance !== instance;\n if(isChangingInstance) {\n this.clearCurrentInstance();\n\n this.instance = instance;\n this.instanceListenerSetter = new ListenerSetter();\n\n this.instanceListenerSetter.add(instance as GroupCallInstance)('state', this.onState);\n\n if(instance instanceof GroupCallInstance) {\n this.currentDescription = this.groupCallDescription;\n } else {\n this.currentDescription = this.callDescription;\n this.instanceListenerSetter.add(instance)('muted', this.onState);\n }\n\n this.container.classList.toggle('is-call', !(instance instanceof GroupCallInstance));\n }\n\n const isMuted = this.instance.isMuted;\n const state = instance instanceof GroupCallInstance ? instance.state : convertCallStateToGroupState(instance.connectionState, isMuted);\n\n const {weave} = this;\n\n weave.componentDidMount();\n\n const isClosed = state === GROUP_CALL_STATE.CLOSED;\n if((!document.body.classList.contains('is-calling') || isChangingInstance) || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition(document.body, 'is-calling', !isClosed, 250, isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n }: undefined);\n }\n\n if(isClosed) {\n return;\n }\n\n weave.setCurrentState(state, true);\n // if(state === GROUP_CALL_STATE.CONNECTING) {\n // weave.setCurrentState(state, true);\n // } else {\n // /* var a = 0;\n // animate(() => {\n // a += 0.1;\n // if(a > 1) a = 0;\n // weave.setAmplitude(a);\n // return true;\n // });\n // weave.setAmplitude(1); */\n // weave.setCurrentState(state, true);\n // }\n\n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(!isMuted);\n }\n\n private setDescription(instance: TopbarCall['instance']) {\n return this.currentDescription.update(instance as any);\n }\n\n private setTitle(instance: TopbarCall['instance']) {\n if(instance instanceof GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n } else {\n replaceContent(this.center, new PeerTitle({peerId: instance.interlocutorUserId.toPeerId()}).element);\n }\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', CLASS_NAME + '-container');\n\n const left = document.createElement('div');\n left.classList.add(CLASS_NAME + '-left');\n\n const groupCallMicrophoneIconMini = this.groupCallMicrophoneIconMini = new GroupCallMicrophoneIconMini();\n\n const mute = ButtonIcon();\n mute.append(groupCallMicrophoneIconMini.container);\n left.append(mute);\n\n const throttledMuteClick = throttle(() => {\n this.instance.toggleMuted();\n }, 600, true);\n\n attachClickEvent(mute, (e) => {\n cancelEvent(e);\n throttledMuteClick();\n }, {listenerSetter});\n\n const center = this.center = document.createElement('div');\n center.classList.add(CLASS_NAME + '-center');\n\n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n\n this.callDescription = new CallDescriptionElement(left);\n\n const right = document.createElement('div');\n right.classList.add(CLASS_NAME + '-right');\n\n const end = ButtonIcon('endcall_filled');\n right.append(end);\n\n attachClickEvent(end, (e) => {\n cancelEvent(e);\n\n const {instance} = this;\n if(!instance) {\n return;\n }\n\n if(instance instanceof GroupCallInstance) {\n instance.hangUp();\n } else {\n instance.hangUp('phoneCallDiscardReasonHangup');\n }\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(this.instance instanceof GroupCallInstance) {\n if(PopupElement.getPopups(PopupGroupCall).length) {\n return;\n }\n\n new PopupGroupCall().show();\n } else if(this.instance instanceof CallInstance) {\n const popups = PopupElement.getPopups(PopupCall);\n if(popups.find((popup) => popup.getCallInstance() === this.instance)) {\n return;\n }\n\n new PopupCall(this.instance).show();\n }\n }, {listenerSetter});\n\n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render(CLASS_NAME + '-weave');\n container.prepend(weaveContainer);\n\n document.getElementById('column-center').prepend(container);\n weave.componentDidMount();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getPeerTitle from '../../components/wrappers/getPeerTitle';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {FontFamily} from '../../config/font';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport idleController from '../../helpers/idleController';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport tsNow from '../../helpers/tsNow';\nimport {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport I18n, {FormatterArguments, LangPackKey} from '../langPack';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport singleInstance from '../mtproto/singleInstance';\nimport webPushApiManager, {PushSubscriptionNotify} from '../mtproto/webPushApiManager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport rootScope from '../rootScope';\nimport appImManager from './appImManager';\nimport appRuntimeManager from './appRuntimeManager';\nimport {AppManagers} from './managers';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getPeerId from './utils/peers/getPeerId';\n\ntype MyNotification = Notification & {\n hidden?: boolean,\n show?: () => void,\n};\n\nexport type NotifyOptions = Partial<{\n tag: string;\n image: string;\n key: string;\n title: string;\n message: string;\n silent: boolean;\n onclick: () => void;\n noIncrement: boolean;\n}>;\n\nexport type NotificationSettings = {\n nodesktop: boolean,\n volume: number,\n novibrate: boolean,\n nopreview: boolean,\n nopush: boolean,\n nosound: boolean\n};\n\nexport class UiNotificationsManager {\n private notificationsUiSupport: boolean;\n private notificationsShown: {[key: string]: MyNotification | true} = {};\n private notificationIndex = 0;\n private notificationsCount = 0;\n private soundsPlayed: {[tag: string]: number} = {};\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\n private nextSoundAt: number;\n private prevSoundVolume: number;\n\n private faviconEl: HTMLLinkElement = document.head.querySelector('link[rel=\"icon\"]');\n\n private titleBackup = document.title;\n private titleChanged = false;\n private titleInterval: number;\n private prevFavicon: string;\n\n private notifySoundEl: HTMLElement;\n\n private stopped = false;\n\n private topMessagesDeferred: CancellablePromise;\n\n private settings: NotificationSettings = {} as any;\n\n private registeredDevice: any;\n private pushInited = false;\n\n private managers: AppManagers;\n private setAppBadge: (contents?: any) => Promise;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n navigator.vibrate = navigator.vibrate || (navigator as any).mozVibrate || (navigator as any).webkitVibrate;\n this.setAppBadge = (navigator as any).setAppBadge && (navigator as any).setAppBadge.bind(navigator);\n this.setAppBadge && this.setAppBadge(0);\n\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\n\n this.notifySoundEl = document.createElement('div');\n this.notifySoundEl.id = 'notify-sound';\n document.body.append(this.notifySoundEl);\n\n this.topMessagesDeferred = deferredPromise();\n\n singleInstance.addEventListener('deactivated', () => {\n this.stop();\n });\n\n singleInstance.addEventListener('activated', () => {\n if(this.stopped) {\n this.start();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n if(this.stopped) {\n return;\n }\n\n if(!idle) {\n this.clear();\n }\n\n this.toggleToggler();\n });\n\n rootScope.addEventListener('notification_reset', (peerString) => {\n this.soundReset(peerString);\n });\n\n rootScope.addEventListener('notification_cancel', (str) => {\n this.cancel(str);\n });\n\n if(this.setAppBadge) {\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 0) {\n this.setAppBadge(folder.unreadUnmutedPeerIds.size);\n }\n });\n }\n\n webPushApiManager.addEventListener('push_init', (tokenData) => {\n this.pushInited = true;\n if(!this.settings.nodesktop && !this.settings.nopush) {\n if(tokenData) {\n this.registerDevice(tokenData);\n } else {\n webPushApiManager.subscribe();\n }\n } else {\n this.unregisterDevice(tokenData);\n }\n });\n webPushApiManager.addEventListener('push_subscribe', (tokenData) => {\n this.registerDevice(tokenData);\n });\n webPushApiManager.addEventListener('push_unsubscribe', (tokenData) => {\n this.unregisterDevice(tokenData);\n });\n\n rootScope.addEventListener('dialogs_multiupdate', () => {\n // unregisterTopMsgs()\n this.topMessagesDeferred.resolve();\n }, {once: true});\n\n webPushApiManager.addEventListener('push_notification_click', (notificationData) => {\n if(notificationData.action === 'push_settings') {\n /* this.topMessagesDeferred.then(() => {\n $modal.open({\n templateUrl: templateUrl('settings_modal'),\n controller: 'SettingsModalController',\n windowClass: 'settings_modal_window mobile_modal',\n backdrop: 'single'\n })\n }); */\n return;\n }\n\n if(notificationData.action === 'mute1d') {\n this.managers.apiManager.invokeApi('account.updateDeviceLocked', {\n period: 86400\n }).then(() => {\n // var toastData = toaster.pop({\n // type: 'info',\n // body: _('push_action_mute1d_success'),\n // bodyOutputType: 'trustedHtml',\n // clickHandler: () => {\n // toaster.clear(toastData)\n // },\n // showCloseButton: false\n // })\n });\n\n return;\n }\n\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\n console.log('click', notificationData, peerId);\n if(peerId) {\n this.topMessagesDeferred.then(async() => {\n if(notificationData.custom.channel_id &&\n !(await this.managers.appChatsManager.hasChat(notificationData.custom.channel_id))) {\n return;\n }\n\n if(peerId.isUser() && !(await this.managers.appUsersManager.hasUser(peerId))) {\n return;\n }\n\n appImManager.setInnerPeer({\n peerId,\n lastMsgId: generateMessageId(+notificationData.custom.msg_id)\n });\n });\n }\n });\n }\n\n public async buildNotification({message, fwdCount, peerReaction, peerTypeNotifySettings}: {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n }) {\n const peerId = message.peerId;\n const isAnyChat = peerId.isAnyChat();\n const notification: NotifyOptions = {};\n const peerString = await this.managers.appPeersManager.getPeerString(peerId);\n let notificationMessage: string;\n\n if(peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && fwdCount > 1) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [fwdCount]);\n } else {\n notificationMessage = await wrapMessageForReply(message, undefined, undefined, true);\n\n const reaction = peerReaction?.reaction;\n if(reaction?._ === 'reactionEmoji') {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n fixEmoji(reaction.emoticon), // can be plain heart\n notificationMessage\n ];\n\n /* if(isAnyChat) {\n args.unshift(appPeersManager.getPeerTitle(message.fromId, true));\n } */\n\n notificationMessage = I18n.format(langPackKey, true, args);\n }\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n if(peerReaction) {\n notification.noIncrement = true;\n notification.silent = true;\n }\n\n const notificationFromPeerId = peerReaction ? getPeerId(peerReaction.peer_id) : message.fromId;\n notification.title = await getPeerTitle(peerId, true, undefined, undefined, this.managers);\n if(isAnyChat && notificationFromPeerId !== message.peerId) {\n notification.title = await getPeerTitle(notificationFromPeerId, true, undefined, undefined, this.managers) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = wrapPlainText(notification.title);\n\n notification.onclick = () => {\n appImManager.setInnerPeer({peerId, lastMsgId: message.mid});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;// message.pFlags.silent || false;\n\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').then((url) => {\n // ! WARNING, message can be already read\n if(message.pFlags.unread || peerReaction) {\n notification.image = url;\n this.notify(notification);\n }\n });\n } else {\n this.notify(notification);\n }\n }\n\n private toggleToggler(enable = idleController.isIdle) {\n if(IS_MOBILE) return;\n\n const resetTitle = (isBlink?: boolean) => {\n this.titleChanged = false;\n document.title = this.titleBackup;\n this.setFavicon();\n };\n\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n\n if(!enable) {\n resetTitle();\n } else {\n this.titleInterval = window.setInterval(() => {\n const count = this.notificationsCount;\n if(!count) {\n this.toggleToggler(false);\n } else if(this.titleChanged) {\n resetTitle(true);\n } else {\n this.titleChanged = true;\n document.title = I18n.format('Notifications.Count', true, [count]);\n // this.setFavicon('assets/img/favicon_unread.ico');\n\n // fetch('assets/img/favicon.ico')\n // .then((res) => res.blob())\n // .then((blob) => {\n // const img = document.createElement('img');\n // img.src = URL.createObjectURL(blob);\n\n const canvas = document.createElement('canvas');\n canvas.width = 32 * window.devicePixelRatio;\n canvas.height = canvas.width;\n\n const ctx = canvas.getContext('2d');\n ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\n ctx.fillStyle = '#3390ec';\n ctx.fill();\n\n let fontSize = 24;\n let str = '' + count;\n if(count < 10) {\n fontSize = 22;\n } else if(count < 100) {\n fontSize = 20;\n } else {\n str = '99+';\n fontSize = 16;\n }\n\n fontSize *= window.devicePixelRatio;\n\n ctx.font = `700 ${fontSize}px ${FontFamily}`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = 'white';\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\n\n /* const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\n\n this.setFavicon(canvas.toDataURL());\n // });\n }\n }, 1000);\n }\n }\n\n private setFavicon(href: string = 'assets/img/favicon.ico') {\n if(this.prevFavicon === href) {\n return;\n }\n\n const link = this.faviconEl.cloneNode() as HTMLLinkElement;\n link.href = href;\n this.faviconEl.parentNode.replaceChild(link, this.faviconEl);\n this.faviconEl = link;\n\n this.prevFavicon = href;\n }\n\n public notify(data: NotifyOptions) {\n // console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\n\n if(this.stopped) {\n return;\n }\n\n // FFOS Notification blob src bug workaround\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\n data.image = 'https://telegram.org/img/t_logo.png'\n }\n else if (data.image && !angular.isString(data.image)) {\n if (Config.Navigator.ffos2p) {\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\n data.image = url\n notify(data)\n })\n return false\n } else {\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\n }\n }\n else */ if(!data.image) {\n data.image = 'assets/img/logo_filled_rounded.png';\n }\n // console.log('notify image', data.image)\n\n if(!data.noIncrement) {\n ++this.notificationsCount;\n }\n\n if(!this.titleInterval) {\n this.toggleToggler();\n }\n\n const idx = ++this.notificationIndex;\n const key = data.key || 'k' + idx;\n this.notificationsShown[key] = true;\n\n const now = tsNow();\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\n (\n !data.tag ||\n !this.soundsPlayed[data.tag] ||\n now > this.soundsPlayed[data.tag] + 60000\n ) */\n ) {\n this.testSound(this.settings.volume);\n this.soundsPlayed[data.tag] = now;\n }\n\n if(!this.notificationsUiSupport ||\n 'Notification' in window && Notification.permission !== 'granted') {\n return false;\n }\n\n if(this.settings.nodesktop) {\n if(this.vibrateSupport && !this.settings.novibrate) {\n navigator.vibrate([200, 100, 200]);\n return;\n }\n\n return;\n }\n\n let notification: MyNotification;\n\n if('Notification' in window) {\n try {\n if(data.tag) {\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\n notification.hidden = true;\n }\n }\n }\n\n notification = new Notification(data.title, {\n icon: data.image || '',\n body: data.message || '',\n tag: data.tag || '',\n silent: data.silent || false\n });\n\n // console.log('notify constructed notification');\n } catch(e) {\n this.notificationsUiSupport = false;\n webPushApiManager.setLocalNotificationsDisabled();\n return;\n }\n } /* else if('mozNotification' in navigator) {\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\n } else if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\n window.external.msSiteModeActivate()\n notification = {\n index: idx\n }\n } */ else {\n return;\n }\n\n notification.onclick = () => {\n notification.close();\n appRuntimeManager.focus();\n this.clear();\n if(data.onclick) {\n data.onclick();\n }\n };\n\n notification.onclose = () => {\n if(!notification.hidden) {\n delete this.notificationsShown[key];\n this.clear();\n }\n };\n\n if(notification.show) {\n notification.show();\n }\n this.notificationsShown[key] = notification;\n\n if(!IS_MOBILE) {\n setTimeout(() => {\n this.hide(key);\n }, 8000);\n }\n }\n\n public updateLocalSettings = () => {\n const keys = ['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'];\n const promises = keys.map(() => undefined);\n // const promises = keys.map((k) => stateStorage.get(k as any));\n Promise.all(promises)\n .then((updSettings) => {\n this.settings.nodesktop = updSettings[0];\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\n this.settings.novibrate = updSettings[2];\n this.settings.nopreview = updSettings[3];\n this.settings.nopush = updSettings[4];\n\n if(this.pushInited) {\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\n const hasPush = this.registeredDevice !== false;\n if(needPush !== hasPush) {\n if(needPush) {\n webPushApiManager.subscribe();\n } else {\n webPushApiManager.unsubscribe();\n }\n }\n }\n\n webPushApiManager.setSettings(this.settings);\n });\n\n apiManagerProxy.getState().then((state) => {\n this.settings.nosound = !state.settings.notifications.sound;\n });\n }\n\n public getLocalSettings() {\n return this.settings;\n }\n\n private hide(key: string) {\n const notification = this.notificationsShown[key];\n if(notification && typeof(notification) !== 'boolean') {\n try {\n if(notification.close) {\n notification.hidden = true;\n notification.close();\n }\n } catch(e) {}\n }\n }\n\n public soundReset(tag: string) {\n delete this.soundsPlayed[tag];\n }\n\n private requestPermission = () => {\n Notification.requestPermission();\n window.removeEventListener('click', this.requestPermission);\n };\n\n public testSound(volume: number) {\n const now = tsNow();\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\n return;\n }\n\n this.nextSoundAt = now + 1000;\n this.prevSoundVolume = volume;\n const filename = 'assets/audio/notification.mp3';\n const audio = document.createElement('audio');\n audio.autoplay = true;\n audio.setAttribute('mozaudiochannel', 'notification');\n audio.volume = volume;\n audio.innerHTML = `\n \n \n `;\n this.notifySoundEl.append(audio);\n\n audio.addEventListener('ended', () => {\n audio.remove();\n }, {once: true});\n }\n\n public cancel(key: string) {\n const notification = this.notificationsShown[key];\n if(notification) {\n if(this.notificationsCount > 0) {\n --this.notificationsCount;\n }\n\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.hidden = true;\n notification.close();\n }/* else if(notificationsMsSiteMode &&\n notification.index === notificationIndex) {\n window.external.msSiteModeClearIconOverlay()\n } */\n } catch(e) {}\n\n delete this.notificationsShown[key];\n }\n }\n\n public clear() {\n /* if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n } else { */\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.close();\n }\n } catch(e) {}\n }\n /* } */\n this.notificationsShown = {};\n this.notificationsCount = 0;\n\n webPushApiManager.hidePushNotifications();\n }\n\n public start() {\n this.updateLocalSettings();\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\n webPushApiManager.start();\n\n if(!this.notificationsUiSupport) {\n return false;\n }\n\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\n window.addEventListener('click', this.requestPermission);\n }\n\n try {\n if('onbeforeunload' in window) {\n window.addEventListener('beforeunload', this.clear);\n }\n } catch(e) {}\n }\n\n private stop() {\n this.clear();\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n this.setFavicon();\n this.stopped = true;\n }\n\n private registerDevice(tokenData: PushSubscriptionNotify) {\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.registerDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: [],\n app_sandbox: false,\n secret: new Uint8Array()\n }).then(() => {\n this.registeredDevice = tokenData;\n }, (error) => {\n error.handled = true;\n });\n }\n\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\n if(!this.registeredDevice) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.unregisterDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: []\n }).then(() => {\n this.registeredDevice = false;\n }, (error) => {\n error.handled = true;\n });\n }\n}\n\nconst uiNotificationsManager = new UiNotificationsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.uiNotificationsManager = uiNotificationsManager);\nexport default uiNotificationsManager;\n","export default async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\n const files: any[] = [];\n\n const scanFiles = async(entry: any, item: DataTransferItem) => {\n if(entry.isDirectory) {\n const directoryReader = entry.createReader();\n await new Promise((resolve, reject) => {\n directoryReader.readEntries(async(entries: any) => {\n for(const entry of entries) {\n await scanFiles(entry, item);\n }\n\n resolve();\n });\n });\n } else if(entry) {\n if(onlyTypes) {\n files.push(entry.type);\n } else {\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\n const file = entry instanceof File ?\n entry :\n (\n entry instanceof DataTransferItem ?\n entry.getAsFile() :\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\n );\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got file', item, file);\n } */\n\n if(!file) return;\n files.push(file);\n }\n }\n };\n\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\n const file = e.dataTransfer.files[i];\n files.push(onlyTypes ? file.type : file);\n }\n } else {\n // @ts-ignore\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\n\n const promises: Promise[] = [];\n for(let i = 0; i < items.length; ++i) {\n const item: DataTransferItem = items[i];\n if(item.kind === 'file') {\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\n promises.push(scanFiles(entry, item));\n }\n }\n\n await Promise.all(promises);\n }\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got files:', e, files);\n } */\n\n return files;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from './dom/cancelEvent';\nimport parseUriParams from './string/parseUriParams';\n\nexport default function addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join' | 'invoice' |\n 'addemoji',\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 let href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n const u = new URL(href);\n const match = u.host.match(/(.+?)\\.t(?:elegram)?\\.me/);\n if(match) {\n u.pathname = match[1] + (u.pathname === '/' ? '' : u.pathname);\n href = u.toString();\n }\n\n if(!options.noPathnameParams) pathnameParams = new URL(href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport appSidebarLeft, {LEFT_COLUMN_ACTIVE_CLASSNAME} from '../../components/sidebarLeft';\nimport appSidebarRight, {RIGHT_COLUMN_ACTIVE_CLASSNAME} from '../../components/sidebarRight';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport Chat, {ChatType} from '../../components/chat/chat';\nimport PopupNewMedia, {getCurrentNewMediaPopup} from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport {doubleRaf} from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport stateStorage from '../stateStorage';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, {i18n, join, LangPackKey} from '../langPack';\nimport {ChatFull, ChatInvite, ChatParticipant, ChatParticipants, Message, MessageAction, MessageMedia, SendMessageAction} from '../../layer';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer from '../../components/popups/peer';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport PopupElement from '../../components/popups';\nimport singleInstance, {InstanceDeactivateReason, SingleInstance} from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport {toast, toastNew} from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport pause from '../../helpers/schedulers/pause';\nimport {InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE} from './internalLink';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {ONE_DAY} from '../../helpers/date';\nimport type {GroupCallId, MyGroupCall} from './appGroupCallsManager';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport {CallType} from '../calls/types';\nimport {Awaited, Modify, SendMessageEmojiInteractionData} from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport ChatBackgroundPatternRenderer from '../../components/chat/patternRenderer';\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport compareVersion from '../../helpers/compareVersion';\nimport {AppManagers} from './managers';\nimport uiNotificationsManager from './uiNotificationsManager';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport {PHONE_NUMBER_REG_EXP} from '../richTextProcessor';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapRichText, {CustomEmojiRendererElement, renderEmojis} from '../richTextProcessor/wrapRichText';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getUserStatusString from '../../components/wrappers/getUserStatusString';\nimport getChatMembersString from '../../components/wrappers/getChatMembersString';\nimport {STATE_INIT} from '../../config/state';\nimport CacheStorageController from '../files/cacheStorage';\nimport themeController from '../../helpers/themeController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport appDialogsManager from './appDialogsManager';\nimport idleController from '../../helpers/idleController';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport getFilesFromEvent from '../../helpers/files/getFilesFromEvent';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport appRuntimeManager from './appRuntimeManager';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport PopupPayment from '../../components/popups/payment';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport NBSP from '../../helpers/string/nbsp';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {MiddleEllipsisElement} from '../../components/middleEllipsis';\nimport addAnchorListener from '../../helpers/addAnchorListener';\nimport parseUriParams from '../../helpers/string/parseUriParams';\n\nexport type ChatSavedPosition = {\n mids: number[],\n top: number\n};\n\nexport type ChatSetPeerOptions = {\n peerId?: PeerId,\n lastMsgId?: number,\n threadId?: number,\n startParam?: string\n};\n\nexport type ChatSetInnerPeerOptions = Modify & {\n type?: ChatType\n};\n\nexport class AppImManager extends EventListenerBase<{\n chat_changing: (details: {from: Chat, to: Chat}) => void,\n peer_changed: (peerId: PeerId) => void,\n peer_changing: (chat: Chat) => void,\n}> {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n public tabId = -1;\n\n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n\n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise};\n\n private topbarCall: TopbarCall;\n public emojiAnimationContainer: HTMLDivElement;\n\n private lastBackgroundUrl: string;\n\n public managers: AppManagers;\n\n public cacheStorage = new CacheStorageController('cachedFiles');\n public customEmojiSize: MediaSize;\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n\n const {\n apiUpdatesManager\n } = managers;\n apiUpdatesManager.attach(I18n.lastRequestedLangCode);\n\n appMediaPlaybackController.construct(managers);\n uiNotificationsManager.construct(managers);\n uiNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.backgroundPromises = {};\n STATE_INIT.settings.themes.forEach((theme) => {\n if(theme.background.slug) {\n const url = 'assets/img/' + theme.background.slug + '.svg' + (IS_FIREFOX ? '?1' : '');\n this.backgroundPromises[theme.background.slug] = Promise.resolve(url);\n }\n });\n\n this.selectTab(0);\n\n idleController.addEventListener('change', (idle) => {\n this.offline = idle;\n this.updateStatus();\n if(idle) {\n clearInterval(this.updateStatusInterval);\n } else {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n }\n });\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.emojiAnimationContainer = document.createElement('div');\n this.emojiAnimationContainer.classList.add('emoji-animation-container');\n this.appendEmojiAnimationContainer(mediaSizes.activeScreen);\n\n this.columnEl.append(this.chatsContainer);\n\n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n // window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n const onPremiumToggle = (isPremium: boolean) => {\n document.body.classList.toggle('is-premium', isPremium);\n };\n rootScope.addEventListener('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations2(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup();\n animationIntersector.checkAnimations2(false);\n });\n\n if(IS_FIREFOX && apiManagerProxy.oldVersion && compareVersion(apiManagerProxy.oldVersion, '1.4.3') === -1) {\n this.deleteFilesIterative((response) => {\n return response.headers.get('Content-Type') === 'image/svg+xml';\n }).then(() => {\n this.applyCurrentTheme();\n });\n } else {\n this.applyCurrentTheme();\n }\n\n // * fix simultaneous opened both sidebars, can happen when floating sidebar is opened with left sidebar\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME) &&\n document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\n appSidebarRight.toggleSidebar(false);\n }\n\n this.appendEmojiAnimationContainer(to);\n });\n\n mediaSizes.addEventListener('resize', () => {\n // const perf = performance.now();\n const rect = this.chatsContainer.getBoundingClientRect();\n ChatBackgroundPatternRenderer.resizeInstances(rect.width, rect.height).then(() => {\n // this.log.warn('resize bg time:', performance.now() - perf);\n // for(const chat of this.chats) {\n // if(chat.renderDarkPattern) {\n // chat.renderDarkPattern();\n // }\n // }\n });\n });\n\n this.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat ||\n chat.peerId !== peerId ||\n overlayCounter.isOverlayActive || (\n mediaSizes.activeScreen === ScreenSize.mobile &&\n this.tabId !== 1\n )\n ) {\n return;\n }\n\n const typing = typings.find((typing) => typing.action._ === 'sendMessageEmojiInteraction');\n if(typing?.action?._ === 'sendMessageEmojiInteraction') {\n const action = typing.action;\n const bubble = chat.bubbles.bubbles[generateMessageId(typing.action.msg_id)];\n if(bubble && bubble.classList.contains('emoji-big') && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)');\n\n const data: SendMessageEmojiInteractionData = JSON.parse(action.interaction.data);\n data.a.forEach((a) => {\n setTimeout(() => {\n simulateClickEvent(stickerWrapper);\n }, a.t * 1000);\n });\n\n this.managers.appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n const onInstanceDeactivated = (reason: InstanceDeactivateReason) => {\n const isUpdated = reason === 'version';\n const popup = new PopupElement('popup-instance-deactivated', {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n(isUpdated ? 'Deactivated.Version.Title' : 'Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n(isUpdated ? 'Deactivated.Version.Subtitle' : 'Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n const onClose = isUpdated ? () => {\n appRuntimeManager.reload();\n } : () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n };\n\n popup.addEventListener('close', onClose);\n popup.show();\n };\n\n singleInstance.addEventListener('deactivated', onInstanceDeactivated);\n if(singleInstance.deactivatedReason) {\n onInstanceDeactivated(singleInstance.deactivatedReason);\n }\n\n // remove scroll listener when setting chat to tray\n this.addEventListener('chat_changing', ({to}) => {\n this.toggleChatGradientAnimation(to);\n });\n\n rootScope.addEventListener('service_notification', (update) => {\n confirmationPopup({\n button: {langKey: 'OK', isCancel: true},\n description: wrapRichText(update.message)\n });\n });\n\n rootScope.addEventListener('payment_sent', async({peerId, mid, receiptMessage}) => {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n if(!message) {\n return;\n }\n\n const action = receiptMessage.action as MessageAction.messageActionPaymentSent;\n toastNew({\n langPackKey: 'PaymentInfoHint',\n langPackArguments: [\n paymentsWrapCurrencyAmount(action.total_amount, action.currency),\n wrapEmojiText(((message as Message.message).media as MessageMedia.messageMediaInvoice).title)\n ]\n });\n });\n\n (window as any).onSpoilerClick = (e: MouseEvent) => {\n const spoiler = findUpClassName(e.target, 'spoiler');\n const parentElement = findUpClassName(spoiler, 'spoilers-container') || spoiler.parentElement;\n\n const className = 'is-spoiler-visible';\n const isVisible = parentElement.classList.contains(className);\n if(!isVisible) {\n cancelEvent(e);\n\n if(CLICK_EVENT_NAME !== 'click') {\n window.addEventListener('click', cancelEvent, {capture: true, once: true});\n }\n }\n\n const duration = 400 / 2;\n const showDuration = 5000;\n const useRafs = !isVisible ? 2 : 0;\n if(useRafs) {\n parentElement.classList.add('will-change');\n }\n\n const spoilerTimeout = parentElement.dataset.spoilerTimeout;\n if(spoilerTimeout !== null) {\n clearTimeout(+spoilerTimeout);\n delete parentElement.dataset.spoilerTimeout;\n }\n\n SetTransition(parentElement, className, true, duration, () => {\n parentElement.dataset.spoilerTimeout = '' + window.setTimeout(() => {\n SetTransition(parentElement, className, false, duration, () => {\n parentElement.classList.remove('will-change');\n delete parentElement.dataset.spoilerTimeout;\n });\n }, showDuration);\n }, useRafs);\n };\n\n rootScope.addEventListener('sticker_updated', ({type, faved}) => {\n if(type === 'faved') {\n toastNew({\n langPackKey: faved ? 'AddedToFavorites' : 'RemovedFromFavorites'\n });\n } else if(!faved) {\n toastNew({\n langPackKey: 'RemovedFromRecent'\n });\n }\n });\n\n apiManagerProxy.addEventListener('notificationBuild', (options) => {\n if(this.chat.peerId === options.message.peerId && !idleController.isIdle) {\n return;\n }\n\n uiNotificationsManager.buildNotification(options);\n });\n\n this.addEventListener('peer_changed', async(peerId) => {\n document.body.classList.toggle('has-chat', !!peerId);\n\n this.emojiAnimationContainer.textContent = '';\n\n this.overrideHash(peerId);\n\n apiManagerProxy.updateTabState('chatPeerIds', this.chats.map((chat) => chat.peerId).filter(Boolean));\n });\n\n // stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', /* c || */{});\n // });\n\n if(IS_CALL_SUPPORTED || IS_GROUP_CALL_SUPPORTED) {\n this.topbarCall = new TopbarCall(managers);\n }\n\n if(IS_CALL_SUPPORTED) {\n callsController.addEventListener('instance', ({instance/* , hasCurrent */}) => {\n // if(hasCurrent) {\n // return;\n // }\n\n const popup = new PopupCall(instance);\n\n instance.addEventListener('acceptCallOverride', () => {\n return this.discardCurrentCall(instance.interlocutorUserId.toPeerId(), undefined, instance)\n .then(() => {\n callsController.dispatchEvent('accepting', instance);\n return true;\n })\n .catch(() => false);\n });\n\n popup.addEventListener('close', () => {\n const currentCall = callsController.currentCall;\n if(currentCall && currentCall !== instance && !instance.wasTryingToJoin) {\n instance.hangUp('phoneCallDiscardReasonBusy');\n }\n }, {once: true});\n\n popup.show();\n });\n\n callsController.addEventListener('incompatible', async(userId) => {\n toastNew({\n langPackKey: 'VoipPeerIncompatible',\n langPackArguments: [\n await wrapPeerTitle({peerId: userId.toPeerId()})\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 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 addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand',\n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then((peerId) => {\n this.managers.appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n this.managers.appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n // console.log(command, bot);\n }\n });\n\n 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 ([\n ['addstickers', INTERNAL_LINK_TYPE.STICKER_SET],\n ['addemoji', INTERNAL_LINK_TYPE.EMOJI_SET]\n ] as [\n 'addstickers' | 'addemoji',\n INTERNAL_LINK_TYPE.STICKER_SET | INTERNAL_LINK_TYPE.EMOJI_SET\n ][]).forEach(([name, type]) => {\n addAnchorListener<{pathnameParams: [typeof name, string]}>({\n name,\n callback: ({pathnameParams}) => {\n if(!pathnameParams[1]) {\n return;\n }\n\n const link: InternalLink = {\n _: type,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(type, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n // * t.me/invoice/asdasdad\n // * t.me/$asdasdad\n addAnchorListener<{pathnameParams: ['invoice', string] | string}>({\n name: 'invoice',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: pathnameParams.length > 1 ? pathnameParams[1] : pathnameParams[0].slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n 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 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 addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string, start?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}) => {\n let link: InternalLink;\n if(PHONE_NUMBER_REG_EXP.test(pathnameParams[0])) {\n link = {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: pathnameParams[0].slice(1)\n };\n } else if(pathnameParams[0] === 'c') {\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[1],\n post: pathnameParams[2],\n thread: 'thread' in uriParams && uriParams.thread,\n comment: uriParams.comment\n };\n } else {\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[1],\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n 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 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 addAnchorListener<{\n uriParams: {\n slug: string\n }\n }>({\n name: 'invoice',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.INVOICE, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach((name) => {\n addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.JOIN_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n this.onHashChange(true);\n this.attachKeydownListener();\n }\n\n private deleteFilesIterative(callback: (response: Response) => boolean) {\n return this.cacheStorage.timeoutOperation((cache) => {\n const perf = performance.now();\n return cache.keys().then((requests) => {\n const promises = requests.map((request) => {\n return cache.match(request).then((response) => {\n return callback(response);\n });\n });\n\n return Promise.all(promises).then((values) => {\n values.map((isBad, idx) => {\n if(!isBad) {\n return;\n }\n\n const request = requests[idx];\n return cache.delete(request);\n });\n\n return Promise.all(values.filter(Boolean));\n });\n }).then(() => {\n this.log('deleted files', performance.now() - perf);\n });\n });\n }\n\n private toggleChatGradientAnimation(activatingChat: Chat) {\n this.chats.forEach((chat) => {\n if(chat.gradientRenderer) {\n chat.gradientRenderer.scrollAnimate(rootScope.settings.animationsEnabled && chat === activatingChat);\n }\n });\n }\n\n private appendEmojiAnimationContainer(screen: ScreenSize) {\n const appendTo = screen === ScreenSize.mobile ? this.columnEl : document.body;\n if(this.emojiAnimationContainer.parentElement !== appendTo) {\n appendTo.append(this.emojiAnimationContainer)\n }\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n const isSelectionCollapsed = document.getSelection().isCollapsed;\n if(overlayCounter.isOverlayActive || IGNORE_KEYS.has(key)) return;\n\n const target = e.target as HTMLElement;\n\n // if(target.tagName === 'INPUT') return;\n\n // this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if((key.startsWith('Arrow') || (e.shiftKey && key === 'Shift')) && !isSelectionCollapsed) {\n return;\n } else if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n cancelEvent(e);\n this.managers.dialogsStorage.getNextDialog(this.chat.peerId, key === 'ArrowDown', appDialogsManager.filterId).then((dialog) => {\n if(dialog) {\n this.setPeer({peerId: dialog.peerId});\n }\n });\n } else if(key === 'ArrowUp' && this.chat.type !== 'scheduled') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n this.managers.appMessagesManager.getFirstMessageToEdit(chat.peerId, chat.threadId).then((message) => {\n if(message) {\n chat.input.initMessageEditing(message.mid);\n cancelEvent(e); // * prevent from scrolling\n }\n });\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n\n if(\n chat?.input?.messageInput &&\n e.target !== chat.input.messageInput &&\n target.tagName !== 'INPUT' &&\n !target.isContentEditable &&\n !IS_TOUCH_SUPPORTED &&\n (!mediaSizes.isMobile || this.tabId === 1) &&\n !chat.selection.isSelecting &&\n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n\n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? generateMessageId(+link.comment) : undefined;\n\n this.openUsername({\n userName: link.domain,\n lastMsgId: postId,\n commentId,\n startParam: link.start\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(chat.deleted) {\n try {\n await this.managers.appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = generateMessageId(+link.post);\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n if(threadId) this.openThread(peerId, postId, threadId);\n else this.setInnerPeer({\n peerId,\n lastMsgId: postId,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.EMOJI_SET:\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}, link._ === INTERNAL_LINK_TYPE.EMOJI_SET).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n this.managers.appChatsManager.checkChatInvite(link.invite).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.managers.appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer({\n peerId: chatInvite.chat.id.toPeerId(true)\n });\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite);\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.USER_PHONE_NUMBER: {\n this.managers.appUsersManager.resolvePhone(link.phone).then((user) => {\n this.setInnerPeer({\n peerId: user.id.toPeerId(false)\n });\n }).catch((err) => {\n if(err.type === 'PHONE_NOT_OCCUPIED') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.INVOICE: {\n this.managers.appPaymentsManager.getInputInvoiceBySlug(link.slug).then((inputInvoice) => {\n this.managers.appPaymentsManager.getPaymentForm(inputInvoice).then((paymentForm) => {\n // const message: Message.message = {\n // _: 'message',\n // date: 0,\n // id: 0,\n // peerId: 0,\n // peer_id: undefined,\n // message: '',\n // media: {\n // _: 'messageMediaInvoice',\n // currency: paymentForm.invoice.currency,\n // description: paymentForm.description,\n\n // }\n // };\n new PopupPayment(undefined, inputInvoice, paymentForm);\n });\n });\n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n public openUrl(url: string) {\n const {url: wrappedUrl, onclick} = wrapUrl(url);\n if(!onclick) {\n return;\n }\n\n const a = document.createElement('a');\n a.href = wrappedUrl;\n (window as any)[onclick](a);\n }\n\n private onHashChange = (saveState?: boolean) => {\n try {\n this.onHashChangeUnsafe(saveState);\n } catch(err) {\n this.log.error('hash change error', err);\n }\n };\n\n private onHashChangeUnsafe = (saveState?: boolean) => {\n const hash = location.hash;\n if(!saveState) {\n appNavigationController.replaceState();\n }\n\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n this.log('hashchange', hash, splitted[0], params);\n if(!hash) {\n return;\n }\n\n if(params.tgaddr) {\n this.openUrl(params.tgaddr);\n return;\n }\n\n switch(splitted[0]) {\n default: {\n params.p = splitted[0].slice(1);\n }\n\n case '#/im': {\n if(!Object.keys(params).length) {\n break;\n }\n\n const p: string = params.p;\n const postId = params.post !== undefined ? generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername({\n userName: p,\n lastMsgId: postId\n });\n break;\n }\n\n default: { // peerId\n this.setInnerPeer({\n peerId: postId ? p.toPeerId(true) : p.toPeerId(),\n lastMsgId: postId\n });\n break;\n }\n }\n }\n }\n\n // appNavigationController.replaceState();\n // location.hash = '';\n };\n\n public openUsername(options: {\n userName: string,\n lastMsgId?: number,\n threadId?: number,\n commentId?: number,\n startParam?: string\n }) {\n const {userName, lastMsgId, threadId, commentId, startParam} = options;\n return this.managers.appUsersManager.resolveUsername(userName).then((peer) => {\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n if(threadId) {\n return this.openThread(peerId, lastMsgId, threadId);\n } else if(commentId) {\n return this.openComment(peerId, lastMsgId, commentId);\n }\n\n return this.setInnerPeer({\n peerId,\n lastMsgId,\n startParam: startParam\n });\n }, (err) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public openThread(peerId: PeerId, lastMsgId: number, threadId: number) {\n return this.managers.appMessagesManager.reloadMessages(peerId, threadId).then((message) => {\n // const message: Message = this.managers.appMessagesManager.getMessageByPeer(peerId, threadId);\n if(!message) {\n lastMsgId = undefined;\n } else {\n this.managers.appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n peerId,\n lastMsgId,\n threadId,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(peerId: PeerId, msgId: number, commentId: number) {\n return this.managers.appMessagesManager.getDiscussionMessage(peerId, msgId).then((message) => {\n return this.openThread(message.peerId, commentId, message.mid);\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n const call = callsController.getCallByUserId(userId);\n if(call) {\n return;\n }\n\n const userFull = await this.managers.appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n wrapPeerTitle({peerId: userId.toPeerId()}).then((element) => {\n return confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n callsController.startCallInternal(userId, type === 'video');\n }\n\n private discardCurrentCall(toPeerId: PeerId, ignoreGroupCall?: GroupCallInstance, ignoreCall?: CallInstance) {\n if(groupCallsController.groupCall && groupCallsController.groupCall !== ignoreGroupCall) return this.discardGroupCallConfirmation(toPeerId);\n else if(callsController.currentCall && callsController.currentCall !== ignoreCall) return this.discardCallConfirmation(toPeerId);\n else return Promise.resolve();\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n const currentCall = callsController.currentCall;\n if(currentCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return 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: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(!currentCall.isClosing) {\n await currentCall.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = groupCallsController.groupCall;\n if(currentGroupCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return 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: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(groupCallsController.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = this.managers.appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await this.managers.appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n\n call = await this.managers.appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = chatFull.call;\n }\n\n groupCallsController.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n // await this.discardCurrentCall(peerId);\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false): ReturnType {\n const theme = themeController.getTheme();\n\n if(theme.background.slug) {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur &&\n // theme.background.slug === defaultTheme.background.slug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * reset background\n return this.setCurrentBackground(true);\n });\n // }\n }\n\n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = this.cacheStorage.getFile('backgrounds/' + slug).then((blob) => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n this.lastBackgroundUrl = url;\n const promises = this.chats.map((chat) => chat.setBackground(url));\n return promises[promises.length - 1].then(() => {\n if(broadcastEvent) {\n rootScope.dispatchEvent('background_change');\n }\n });\n }\n\n public saveChatPosition(chat: Chat) {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n // const bubble = chat.bubbles.getBubbleByPoint('top');\n // if(bubble) {\n // const top = bubble.getBoundingClientRect().top;\n const chatBubbles = chat.bubbles;\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && chatBubbles.getRenderedLength()) {\n chatBubbles.sliceViewport(true);\n const top = chatBubbles.scrollable.scrollTop;\n\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc').filter((mid) => mid > 0 && !chatBubbles.skippedMids.has(mid)),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n // }\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n\n themeController.setTheme();\n\n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n const {messagesTextSize} = rootScope.settings;\n\n this.customEmojiSize = makeMediaSize(messagesTextSize + 4, messagesTextSize + 4);\n document.documentElement.style.setProperty('--messages-text-size', messagesTextSize + 'px');\n\n const firstTime = !this.customEmojiSize;\n if(!firstTime) {\n const ellipsisElements = document.querySelectorAll('middle-ellipsis-element');\n ellipsisElements.forEach((element) => {\n element.disconnectedCallback();\n element.dataset.fontSize = '' + messagesTextSize;\n if(element.title) element.textContent = element.title;\n element.connectedCallback();\n });\n\n const renderers = document.querySelectorAll('.chat custom-emoji-renderer-element');\n renderers.forEach((renderer) => {\n renderer.forceRenderAfterSize = true;\n });\n }\n\n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n if(topbar.pinnedMessage) { // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n topbar.pinnedMessage.setCorrectIndex(0);\n }\n\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations2(false);\n\n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n\n I18n.setTimeFormat(rootScope.settings.timeFormat);\n\n this.toggleChatGradientAnimation(this.chat);\n };\n\n // * не могу использовать тут TransitionSlider, так как мне нужен отрисованный блок рядом\n // * (или под текущим чатом) чтобы правильно отрендерить чат (напр. scrollTop)\n private chatsSelectTab(tab: HTMLElement, animate?: boolean) {\n if(this.prevTab === tab) {\n return;\n }\n\n if(animate === false && this.prevTab) { // * will be used for Safari iOS history swipe\n disableTransition([tab, this.prevTab].filter(Boolean));\n }\n\n if(this.prevTab) {\n this.prevTab.classList.remove('active');\n this.chatsSelectTabDebounced();\n\n // ! нужно переделать на animation, так как при лаге анимация будет длиться не 250мс\n if(rootScope.settings.animationsEnabled && animate !== false) {\n dispatchHeavyAnimationEvent(pause(250 + 150), 250 + 150);\n }\n\n const prevIdx = whichChild(this.prevTab);\n const idx = whichChild(tab);\n if(idx > prevIdx) {\n appNavigationController.pushItem({\n type: 'chat',\n onPop: (canAnimate) => {\n this.setPeer({}, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n // if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n // }\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n const types: string[] = await getFilesFromEvent(e, true);\n if(!isFiles || (!(await this.canDrag()) && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n\n const foundMedia = types.filter((t) => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n\n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n\n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n // if(!mount) return;\n\n SetTransition(_dropsContainer, 'is-visible', mount, 200, () => {\n if(!mount) {\n _drops.forEach((drop) => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n });\n\n if(mount) {\n _drops.forEach((drop) => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n // this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n // this.log('dragleave', e, counter);\n // if((e.pageX <= 0 || e.pageX >= this.managers.appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= this.managers.appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) {\n // if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private async canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || overlayCounter.isOverlayActive || !(await chat.canSend('send_media')));\n }\n\n private onDocumentPaste = async(e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n\n // console.log('document paste');\n // console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n\n const files = await getFilesFromEvent(e);\n if(!(await this.canDrag()) && !newMediaPopup) return;\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n\n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n PopupElement.createPopup(PopupNewMedia, this.chat, files, chatInput.willAttachType);\n }\n };\n\n private async overrideHash(peerId?: PeerId) {\n let str: string;\n if(peerId) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n str = username ? '@' + username : '' + peerId;\n }\n\n appNavigationController.overrideHash(str);\n }\n\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 if(prevTabId !== -1) {\n this.overrideHash(id > 0 ? this.chat?.peerId : undefined);\n }\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(prevTabId !== -1 && prevTabId !== id && rootScope.settings.animationsEnabled && animate !== false && mediaSizes.activeScreen !== ScreenSize.large) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im',\n onPop: (canAnimate) => {\n // this.selectTab(prevTabId, !isSafari);\n this.setPeer({}, canAnimate);\n }\n });\n }\n }\n\n const onImTabChange = (window as any).onImTabChange;\n onImTabChange && onImTabChange(id);\n\n // this._selectTab(id, mediaSizes.isMobile);\n // document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n\n public updateStatus() {\n return this.managers.appUsersManager.updateMyOnlineStatus(this.offline);\n }\n\n private createNewChat() {\n const chat = new Chat(\n this,\n this.managers\n );\n\n if(this.chats.length) {\n chat.setBackground(this.lastBackgroundUrl, true);\n }\n\n this.chats.push(chat);\n\n return chat;\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n const chatFrom = this.chat;\n if(this.chats.length > 1 && justReturn) {\n this.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n const chatTo = this.chat;\n this.dispatchEvent('chat_changing', {from: chatFrom, to: chatTo});\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach((chat) => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(chatTo.container, animate);\n\n if(justReturn) {\n this.dispatchEvent('peer_changed', chatTo.peerId);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n appSidebarRight.replaceSharedMediaTab(chatTo.sharedMediaTab);\n }\n\n spliced.forEach((chat) => {\n chat.beforeDestroy();\n });\n\n setTimeout(() => {\n // chat.setPeer(0);\n spliced.forEach((chat) => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public async setPeer(options: ChatSetPeerOptions = {}, animate?: boolean): Promise {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n\n if(!peerId) {\n if(chatIndex > 0) {\n this.spliceChats(chatIndex, undefined, animate);\n return;\n } else if(mediaSizes.activeScreen === ScreenSize.medium) { // * floating sidebar case\n this.selectTab(+!this.tabId, animate);\n return;\n }\n } else if(chatIndex > 0 && chat.peerId && chat.peerId !== peerId) {\n // const firstChat = this.chats[0];\n // if(firstChat.peerId !== chat.peerId) {\n /* // * slice idx > 0, set background and slice first, so new one will be the first\n const spliced = this.chats.splice(1, this.chats.length - 1);\n this.createNewChat();\n this.chats.splice(0, 1); */\n const spliced = this.chats.splice(1, this.chats.length - 1);\n if(this.chat.peerId === peerId) {\n this.spliceChats(0, true, true, spliced);\n return;\n } else {\n const ret = this.setPeer(options);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n // return ret;\n }\n\n // * don't reset peer if returning\n if(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = await chat.setPeer(peerId, lastMsgId, options.startParam);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n Promise.all([\n promise,\n chat.setBackgroundPromise\n ]).then(() => {\n // window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(1, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(0, animate);\n return false;\n }\n }\n\n public setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n if(options.threadId) {\n options.type = 'discussion';\n }\n\n const type = options.type ??= 'chat';\n\n // * prevent opening already opened peer\n const existingIndex = this.chats.findIndex((chat) => chat.peerId === peerId && chat.type === type);\n if(existingIndex !== -1) {\n this.spliceChats(existingIndex + 1);\n return this.setPeer(options);\n }\n\n const oldChat = this.chat;\n let chat = oldChat;\n if(oldChat.inited) { // * use first not inited chat\n chat = this.createNewChat();\n }\n\n if(type) {\n chat.setType(type);\n\n if(options.threadId) {\n chat.threadId = options.threadId;\n }\n }\n\n this.dispatchEvent('chat_changing', {from: oldChat, to: chat});\n\n // this.chatsSelectTab(chat.container);\n\n return this.setPeer(options);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer({\n peerId,\n type: 'scheduled'\n });\n }\n\n private getTypingElement(action: SendMessageAction) {\n const el = document.createElement('span');\n let c = 'peer-typing';\n el.classList.add(c);\n el.dataset.action = action._;\n switch(action._) {\n case 'sendMessageTypingAction': {\n // default: {\n c += '-text';\n for(let i = 0; i < 3; ++i) {\n const dot = document.createElement('span');\n dot.className = c + '-dot';\n el.append(dot);\n }\n break;\n }\n\n case 'sendMessageUploadAudioAction':\n case 'sendMessageUploadDocumentAction':\n case 'sendMessageUploadRoundAction':\n case 'sendMessageUploadVideoAction':\n case 'sendMessageUploadPhotoAction': {\n c += '-upload';\n /* const trail = document.createElement('span');\n trail.className = c + '-trail';\n el.append(trail); */\n break;\n }\n\n case 'sendMessageRecordAudioAction':\n case 'sendMessageRecordRoundAction':\n case 'sendMessageRecordVideoAction': {\n c += '-record';\n break;\n }\n\n case 'sendMessageEmojiInteractionSeen':\n case 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public async getPeerTyping(peerId: PeerId, container?: HTMLElement) {\n // const log = this.log.bindPrefix('getPeerTyping-' + peerId);\n // log('getting peer typing');\n\n const isUser = peerId.isUser();\n if(isUser && await this.managers.appUsersManager.isBot(peerId)) {\n // log('a bot');\n return;\n }\n\n const typings = await this.managers.appProfileManager.getPeerTypings(peerId);\n if(!typings?.length) {\n // log('have no typing');\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.User.EnjoyingAnimations'\n },\n chat: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.Chat.EnjoyingAnimations'\n },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = isUser ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach((typing) => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n // log('no langPackKey');\n return;\n }\n\n let peerTitlePromise: Promise;\n let args: any[];\n if(peerId.isAnyChat()) {\n const peerTitle = new PeerTitle();\n peerTitlePromise = peerTitle.update({peerId: typing.userId.toPeerId(false), onlyFirstName: true});\n args = [\n peerTitle.element,\n typings.length - 1\n ];\n\n await peerTitlePromise;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n container.classList.toggle('peer-typing-flex', action._ === 'sendMessageChooseStickerAction' || action._ === 'sendMessageEmojiInteractionSeen');\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(wrapEmojiText(action.emoticon));\n args.push(span);\n }\n\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n\n // log('returning typing');\n return container;\n }\n\n private async getChatStatus(chatId: ChatId): Promise> {\n const typingEl = await this.getPeerTyping(chatId.toPeerId(true));\n if(typingEl) {\n return {cached: true, result: Promise.resolve(typingEl)};\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getChatFull(chatId);\n const dooo = async(chatInfo: ChatFull) => {\n // this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = (chatInfo as ChatFull.channelFull).participants_count ||\n ((chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants)?.participants?.length ||\n 1;\n // if(participants_count) {\n let subtitle = await getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await this.managers.appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n\n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n\n return subtitle;\n // }\n };\n\n const promise = Promise.resolve(result.result).then(dooo);\n return {\n cached: result.cached,\n result: promise\n };\n }\n\n private async getUserStatus(userId: UserId, ignoreSelf?: boolean) {\n const result: AckedResult = {\n cached: true,\n result: Promise.resolve(undefined as HTMLElement)\n };\n\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user || (user.pFlags.self && !ignoreSelf)) {\n return result;\n }\n\n const subtitle = getUserStatusString(user);\n\n if(!user.pFlags.bot) {\n let typingEl = await this.getPeerTyping(userId.toPeerId());\n if(!typingEl && user.status?._ === 'userStatusOnline') {\n typingEl = document.createElement('span');\n typingEl.classList.add('online');\n typingEl.append(subtitle);\n }\n\n if(typingEl) {\n result.result = Promise.resolve(typingEl);\n return result;\n }\n }\n\n result.result = Promise.resolve(subtitle);\n return result;\n }\n\n private async getPeerStatus(peerId: PeerId, ignoreSelf?: boolean) {\n if(!peerId) return;\n let promise: Promise>;\n if(peerId.isAnyChat()) {\n promise = this.getChatStatus(peerId.toChatId());\n } else {\n promise = this.getUserStatus(peerId.toUserId(), ignoreSelf);\n }\n\n return promise;\n }\n\n public async setPeerStatus(\n peerId: PeerId,\n element: HTMLElement,\n needClear: boolean,\n useWhitespace: boolean,\n middleware: () => boolean,\n ignoreSelf?: boolean\n ) {\n // const log = this.log.bindPrefix('status-' + peerId);\n // log('setting status', element);\n\n if(!needClear) {\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && await this.getPeerTyping(peerId, typingContainer)) {\n // log('already have a status');\n return;\n }\n }\n\n const result = await this.getPeerStatus(peerId, ignoreSelf);\n // log('getPeerStatus result', result);\n if(!middleware()) {\n // log.warn('middleware');\n return;\n }\n\n const set = async() => {\n const subtitle = result && await result.result;\n if(!middleware()) {\n return;\n }\n\n return () => replaceContent(element, subtitle || placeholder);\n };\n\n const placeholder = useWhitespace ? NBSP : ''; // ! HERE U CAN FIND WHITESPACE\n if(!result || result.cached) {\n return await set();\n } else if(needClear) {\n return () => {\n element.textContent = placeholder;\n return set().then((callback) => callback && callback());\n };\n }\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'});\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","import {Message, MessageMedia} from '../../../../layer';\n\nexport default function canSaveMessageMedia(message: Message.message | Message.messageService) {\n return message &&\n !message.pFlags.is_outgoing &&\n !(message as Message.message).pFlags.noforwards &&\n !((message as Message.message).media as MessageMedia.messageMediaInvoice)?.extended_media\n}\n","import {Document, Message, MessageAction, MessageExtendedMedia, MessageMedia, Photo, WebPage} from '../../../../layer';\n\nexport default function getMediaFromMessage(message: Message) {\n if(!message) return;\n\n let media: any;\n if((message as Message.messageService).action) {\n media = ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo;\n } else if((message as Message.message).media) {\n let messageMedia = (message as Message.message).media;\n if((messageMedia as MessageMedia.messageMediaWebPage).webpage) {\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as any as MessageMedia;\n } else if((messageMedia as MessageMedia.messageMediaInvoice).extended_media?._ === 'messageExtendedMedia') {\n messageMedia = ((messageMedia as MessageMedia.messageMediaInvoice).extended_media as MessageExtendedMedia.messageExtendedMedia).media;\n }\n\n media = (messageMedia as MessageMedia.messageMediaPhoto).photo ||\n (messageMedia as MessageMedia.messageMediaDocument).document;\n }\n\n return media as Photo.photo | Document.document;\n}\n","import {Message} from '../../../../layer';\nimport type {MyMessage} from '../../appMessagesManager';\n\nexport default function getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n}\n","import {isRestricted} from '../../../../helpers/restrictions';\nimport {Message} from '../../../../layer';\n\nexport default function isMessageRestricted(message: Message.message) {\n return !!(message.restriction_reason && isRestricted(message.restriction_reason));\n}\n","// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\n/*\n HTML-color IRC-color Description\n #c03d33 4 red\n #4fad2d 3 green\n #d09306 7 yellow\n #168acd 10 blue\n #8544d6 6 purple\n #cd4073 13 pink\n #2996ad 11 sea\n #ce671b 5 orange\n*/\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\n\nexport default function getPeerColorById(peerId: PeerId, pic = true) {\n if(!peerId) return '';\n\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\n return color;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\nimport type {PhotoSize, VideoSize, WebDocument} from '../../../../layer';\nimport calcImageInBox from '../../../../helpers/calcImageInBox';\nimport {THUMB_TYPE_FULL} from '../../../mtproto/mtproto_config';\n\nexport default function choosePhotoSize(\n photo: MyPhoto | MyDocument | WebDocument,\n boxWidth = 0,\n boxHeight = 0,\n useBytes = false,\n pushDocumentSize = false\n) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n\n /*\n s box 100x100\n m box 320x320\n x box 800x800\n y box 1280x1280\n w box 2560x2560\n a crop 160x160\n b crop 320x320\n c crop 640x640\n d crop 1280x1280 */\n\n let sizes: PhotoSize[] = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n let bestPhotoSize: typeof sizes[0] = {_: 'photoSizeEmpty', type: THUMB_TYPE_FULL};\n if(pushDocumentSize && sizes && photo._ !== 'photo') {\n sizes = sizes.concat({\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\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 * 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 const promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Logger, logger} from '../../logger';\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Logger, logger} from '../../logger';\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport bufferConcats from '../../../helpers/bytes/bufferConcats';\nimport subtle from '../../crypto/subtle';\nimport sha256 from '../../crypto/utils/sha256';\n\nconst kMaxIncomingPacketSize = 128 * 1024 * 1024;\n\nexport default class P2PEncryptor {\n private type: 'Signaling';\n private counter: number;\n private seqMap: Map;\n\n constructor(private isOutgoing: boolean, private p2pKey: Uint8Array) {\n this.type = 'Signaling';\n this.counter = 0;\n this.seqMap = new Map();\n }\n\n private concatSHA256(parts: Uint8Array[]) {\n return sha256(bufferConcats(...parts));\n }\n\n private async encryptPrepared(buffer: Uint8Array) {\n const result = {\n counter: 0, // this.counterFromSeq(this.readSeq(buffer)),\n bytes: new Uint8Array(16 + buffer.length)\n };\n\n const x = (this.isOutgoing ? 0 : 8) + (this.type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKeyLarge = await this.concatSHA256([key.subarray(x + 88, x + 88 + 32), buffer]);\n const msgKey = result.bytes;\n for(let i = 0; i < 16; ++i) {\n msgKey[i] = msgKeyLarge[i + 8];\n }\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const bytes = await this.aesProcessCtr(buffer, buffer.length, aesKeyIv, true);\n\n result.bytes = new Uint8Array([...result.bytes.subarray(0, 16), ...bytes]);\n\n return result;\n }\n\n public encryptRawPacket(buffer: Uint8Array) {\n const seq = ++this.counter;\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, seq >>> 0, false); // byteOffset = 0; litteEndian = false\n\n const result = new Uint8Array([...new Uint8Array(arr), ...buffer]);\n\n return this.encryptPrepared(result);\n }\n\n private async prepareAesKeyIv(key: Uint8Array, msgKey: Uint8Array, x: number) {\n const [sha256a, sha256b] = await Promise.all([\n this.concatSHA256([\n msgKey.subarray(0, 16),\n key.subarray(x, x + 36)\n ]),\n\n this.concatSHA256([\n key.subarray(40 + x, 40 + x + 36),\n msgKey.subarray(0, 16)\n ])\n ]);\n\n return {\n key: new Uint8Array([\n ...sha256a.subarray(0, 8),\n ...sha256b.subarray(8, 8 + 16),\n ...sha256a.subarray(24, 24 + 8)\n ]),\n iv: new Uint8Array([\n ...sha256b.subarray(0, 4),\n ...sha256a.subarray(8, 8 + 8),\n ...sha256b.subarray(24, 24 + 4)\n ])\n };\n }\n\n private async aesProcessCtr(encryptedData: Uint8Array, dataSize: number, aesKeyIv: {key: Uint8Array, iv: Uint8Array}, encrypt = true) {\n const cryptoKey = await subtle.importKey(\n 'raw',\n aesKeyIv.key,\n {name: 'AES-CTR'},\n false,\n [encrypt ? 'encrypt' : 'decrypt']\n );\n\n const buffer: ArrayBuffer = await subtle[encrypt ? 'encrypt' : 'decrypt']({\n name: 'AES-CTR',\n counter: aesKeyIv.iv,\n length: aesKeyIv.iv.length * 8\n },\n cryptoKey,\n encryptedData\n );\n\n return new Uint8Array(buffer);\n }\n\n private constTimeIsDifferent(a: Uint8Array, b: Uint8Array, count: number) {\n let msgKeyEquals = true;\n for(let i = 0; i < count; ++i) {\n if(a[i] !== b[i]) {\n msgKeyEquals = false;\n }\n }\n\n return !msgKeyEquals;\n }\n\n public async decryptRawPacket(buffer: Uint8Array) {\n if(buffer.length < 21 || buffer.length > kMaxIncomingPacketSize) {\n return;\n }\n\n const {isOutgoing, type} = this;\n\n const x = (isOutgoing ? 8 : 0) + (type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKey = buffer.subarray(0, 16);\n const encryptedData = buffer.subarray(16);\n const encryptedDataSize = buffer.length - 16;\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const decryptionBuffer = await this.aesProcessCtr(encryptedData, encryptedDataSize, aesKeyIv, false);\n\n const msgKeyLarge = await this.concatSHA256([\n key.subarray(88 + x, 88 + x + 32),\n decryptionBuffer\n ]);\n\n if(this.constTimeIsDifferent(msgKeyLarge.subarray(8), msgKey, 16)) {\n return;\n }\n\n const dataView = new DataView(decryptionBuffer.buffer);\n const seq = dataView.getUint32(0);\n if(this.seqMap.has(seq)) {\n return;\n }\n this.seqMap.set(seq, seq);\n\n return decryptionBuffer.slice(4);\n }\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n // console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n\n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport StringFromLineBuilder from '../stringFromLineBuilder';\nimport {addDataChannel, addExtmap, addPayloadTypes, addSsrc} from './p2PSdpBuilder';\n\nexport default class ChromeP2PSdpBuilder {\n static generateOffer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n\n static generateAnswer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n}\n","/*\n* Copyright (c) 2018-present, Evgeny Nadymov\n*\n* This source code is licensed under the GPL v.3.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport ChromeP2PSdpBuilder from './chromeP2PSdpBuilder';\nimport { FirefoxP2PSdpBuilder } from './firefoxP2PSdpBuilder';\nimport { SafariP2PSdpBuilder } from './safariP2PSdpBuilder';\n// import { TG_CALLS_SDP_STRING } from '../../Stores/CallStore';\n\nexport function p2pParseCandidate(candidate) {\n if(!candidate || !candidate.startsWith('candidate:')) {\n return;\n }\n \n const sdpString = candidate;\n candidate = candidate.substr('candidate:'.length);\n \n const [foundation, component, protocol, priority, ip, port, ...other] = candidate.split(' ');\n const c = {\n sdpString,\n foundation,\n component,\n protocol,\n priority,\n address: { ip, port }\n };\n \n for(let i = 0; i < other.length; i += 2) {\n switch(other[i]) {\n case 'typ': {\n c.type = other[i + 1];\n break;\n }\n case 'raddr': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.ip = other[i + 1];\n break;\n }\n case 'rport': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.port = other[i + 1];\n break;\n }\n case 'generation': {\n c.generation = other[i + 1];\n break;\n }\n case 'tcptype': {\n c.tcpType = other[i + 1];\n break;\n }\n case 'network-id': {\n c.networkId = other[i + 1];\n break;\n }\n case 'network-cost': {\n c.networkCost = other[i + 1];\n break;\n }\n case 'ufrag': {\n c.username = other[i + 1];\n break;\n }\n }\n }\n \n return c;\n}\n\nexport function p2pParseSdp(sdp) {\n const lines = sdp.split('\\r\\n');\n const lookup = (prefix, force = true, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return line.substr(prefix.length);\n }\n }\n \n if (force) {\n console.error(\"Can't find prefix\", prefix);\n }\n \n return null;\n };\n const findIndex = (prefix, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return i;\n }\n }\n \n return -1;\n };\n \n const pwdIndex = findIndex('a=ice-pwd:');\n const ufragIndex = findIndex('a=ice-ufrag:');\n if (pwdIndex === -1 && ufragIndex === -1) {\n return {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n }\n \n const info = {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n \n let mediaIndex = findIndex('m=');\n const fingerprint = lookup('a=fingerprint:', false);\n const setup = lookup('a=setup:', false);\n if (fingerprint && setup) {\n info.fingerprints.push({\n hash: fingerprint.split(' ')[0],\n fingerprint: fingerprint.split(' ')[1],\n setup\n });\n }\n \n const ufrag = lookup('a=ice-ufrag:', false);\n const pwd = lookup('a=ice-pwd:', false);\n if (ufrag && pwd) {\n info.ufrag = ufrag;\n info.pwd = pwd;\n }\n \n while (mediaIndex !== -1) {\n let nextMediaIndex = findIndex('m=', mediaIndex + 1);\n \n const extmap = [];\n const types = [];\n const mediaType = lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0];\n const media = {\n // type: lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0],\n // mid: lookup('a=mid:', true, mediaIndex, nextMediaIndex),\n // dir: findDirection(mediaIndex, nextMediaIndex),\n rtpExtensions: extmap,\n payloadTypes: types\n }\n \n const lineTo = nextMediaIndex === -1 ? lines.length : nextMediaIndex;\n const fmtp = new Map();\n const rtcpFb = new Map();\n for (let i = mediaIndex; i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith('a=extmap:')) {\n const [ id, uri ] = line.substr('a=extmap:'.length).split(' ');\n extmap.push({ id: parseInt(id), uri });\n } else if (line.startsWith('a=fmtp:')) {\n const [ id, str ] = line.substr('a=fmtp:'.length).split(' ');\n const obj = { };\n const arr = str.split(';').map(x => {\n const [ key, value ] = x.split('=');\n obj[key] = value;\n return { [key]: value };\n });\n fmtp.set(parseInt(id), obj);\n } else if (line.startsWith('a=rtcp-fb:')) {\n const [ id, type = '', subtype = '' ] = line.substr('a=rtcp-fb:'.length).split(' ');\n if (rtcpFb.has(parseInt(id))) {\n rtcpFb.get(parseInt(id)).push({ type, subtype });\n } else {\n rtcpFb.set(parseInt(id), [{ type, subtype }])\n }\n } else if (line.startsWith('a=rtpmap')) {\n const [ id, str ] = line.substr('a=rtpmap:'.length).split(' ');\n const [ name, clockrate, channels = '0' ] = str.split('/');\n const obj = { id: parseInt(id), name, clockrate: parseInt(clockrate), channels: parseInt(channels) };\n \n types.push(obj);\n }\n }\n \n for (let i = 0; i < types.length; i++) {\n const { id } = types[i];\n if (rtcpFb.has(id)) {\n types[i].feedbackTypes = rtcpFb.get(id);\n }\n if (fmtp.has(id)) {\n types[i].parameters = fmtp.get(id);\n }\n }\n \n const ssrc = lookup('a=ssrc:', false, mediaIndex, nextMediaIndex);\n if (ssrc) {\n media.ssrc = ssrc.split(' ')[0];\n }\n \n const ssrcGroup = lookup('a=ssrc-group:', false, mediaIndex, nextMediaIndex);\n if (ssrcGroup) {\n const [ semantics, ...ssrcs ] = ssrcGroup.split(' ');\n media.ssrcGroups = [{\n semantics,\n ssrcs\n }]\n }\n \n switch (mediaType) {\n case 'audio': {\n info.audio = media;\n break;\n }\n case 'video': {\n info.video = media;\n break;\n }\n }\n \n mediaIndex = nextMediaIndex;\n }\n\n if(!info.video.ssrcGroups) {\n info.video.ssrcGroups = [];\n }\n\n info['@type'] = 'InitialSetup';\n \n // console.log('[p2pParseSdp]', sdp, info);\n return info;\n}\n\nexport function isFirefox() {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome') === -1;\n}\n\nexport function addExtmap(extmap) {\n let sdp = [];\n // return sdp;\n for (let j = 0; j < extmap.length; j++) {\n const ext = extmap[j];\n const { id, uri } = ext;\n // if (isFirefox() && uri.indexOf(''))\n console.log('[extmap] add', id, uri);\n sdp.push(`a=extmap:${id} ${uri}`);\n }\n \n return sdp.join('\\n');\n}\n\nexport function addPayloadTypes(types) {\n let sdp = [];\n console.log('[SDP] addPayloadTypes', types);\n for (let i = 0; i < types.length; i++) {\n const type = types[i];\n const { id, name, clockrate, channels, feedbackTypes, parameters } = type;\n sdp.push(`a=rtpmap:${id} ${name}/${clockrate}${channels ? '/' + channels : ''}`);\n if (feedbackTypes) {\n feedbackTypes.forEach(x => {\n const { type, subtype } = x;\n sdp.push(`a=rtcp-fb:${id} ${[type, subtype].join(' ')}`);\n });\n }\n if (parameters) {\n const fmtp = [];\n Object.getOwnPropertyNames(parameters).forEach(pName => {\n fmtp.push(`${pName}=${parameters[pName]}`);\n });\n \n sdp.push(`a=fmtp:${id} ${fmtp.join(';')}`);\n }\n }\n \n return sdp.join('\\n');\n}\n\nexport function addSsrc(type, ssrc, ssrcGroups, streamName) {\n let sdp = [];\n \n if (ssrcGroups && ssrcGroups.length > 0) {\n ssrcGroups.forEach(ssrcGroup => {\n if (ssrcGroup && ssrcGroup.ssrcs.length > 0) {\n sdp.push(`a=ssrc-group:${ssrcGroup.semantics} ${ssrcGroup.ssrcs.join(' ')}`);\n ssrcGroup.ssrcs.forEach(ssrc => {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n });\n }\n });\n } else if (ssrc) {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n }\n \n return sdp.join('\\n');\n}\n\nexport function addDataChannel(mid) {\n return `m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144`;\n}\n\nexport class P2PSdpBuilder {\n static generateCandidate(info) {\n if (!info) return null;\n \n const { sdpString, sdpMLineIndex, sdpMid, foundation, component, protocol, priority, address, type, relAddress, generation, tcpType, networkId, networkCost, username } = info;\n if (/* TG_CALLS_SDP_STRING */true) {\n if (sdpString) {\n return {\n candidate: sdpString,\n sdpMLineIndex,\n sdpMid\n };\n }\n }\n throw 'no sdpString';\n \n let candidate = `candidate:${foundation} ${component} ${protocol} ${priority} ${address.ip} ${address.port}`;\n const attrs = []\n if (type) {\n attrs.push(`typ ${type}`);\n }\n if (relAddress) {\n attrs.push(`raddr ${relAddress.ip}`);\n attrs.push(`rport ${relAddress.port}`);\n }\n if (tcpType) {\n attrs.push(`tcptype ${tcpType}`);\n }\n if (generation) {\n attrs.push(`generation ${generation}`);\n }\n if (username) {\n attrs.push(`ufrag ${username}`);\n }\n if (networkId) {\n attrs.push(`network-id ${networkId}`);\n }\n if (networkCost) {\n attrs.push(`network-cost ${networkCost}`);\n }\n if (attrs.length > 0) {\n candidate += ` ${attrs.join(' ')}`;\n }\n \n return { candidate, sdpMid, sdpMLineIndex };\n }\n \n static generateOffer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateOffer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateOffer(info);\n }\n \n return ChromeP2PSdpBuilder.generateOffer(info);\n }\n \n static generateAnswer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateAnswer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateAnswer(info);\n }\n \n return ChromeP2PSdpBuilder.generateAnswer(info);\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class FirefoxP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, mid, ssrc, ssrcGroups, payloadTypes, dir, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class SafariP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../../environment/ctx';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {GroupCallParticipantVideoSourceGroup, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, Update} from '../../layer';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport type {CallId} from '../appManagers/appCallsManager';\nimport type {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport CallConnectionInstance from './callConnectionInstance';\nimport CallInstanceBase from './callInstanceBase';\nimport callsController from './callsController';\nimport CALL_STATE from './callState';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from './constants';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription, {ConferenceEntry, generateSsrc} from './localConferenceDescription';\nimport getCallProtocol from './p2P/getCallProtocol';\nimport getRtcConfiguration from './p2P/getRtcConfiguration';\nimport P2PEncryptor from './p2P/p2PEncryptor';\nimport {p2pParseCandidate, P2PSdpBuilder} from './p2P/p2PSdpBuilder';\nimport {parseSdp} from './sdp/utils';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {AudioCodec, CallMediaState, CallSignalingData, DiffieHellmanInfo, P2PAudioCodec, P2PVideoCodec, VideoCodec} from './types';\n\nexport default class CallInstance extends CallInstanceBase<{\n state: (state: CALL_STATE) => void,\n id: (id: CallId, prevId: CallId) => void,\n muted: (muted: boolean) => void,\n mediaState: (mediaState: CallMediaState) => void,\n acceptCallOverride: () => Promise,\n}> {\n public dh: Partial;\n public id: CallId;\n public call: PhoneCall;\n public interlocutorUserId: UserId;\n public protocol: PhoneCallProtocol;\n public isOutgoing: boolean;\n public encryptionKey: Uint8Array;\n public connectionInstance: CallConnectionInstance;\n public encryptor: P2PEncryptor;\n public decryptor: P2PEncryptor;\n public candidates: RTCIceCandidate[];\n\n public offerReceived: boolean;\n public offerSent: boolean;\n\n public createdParticipantEntries: boolean;\n public release: () => Promise;\n public _connectionState: CALL_STATE;\n\n public createdAt: number;\n public connectedAt: number;\n public discardReason: string;\n\n private managers: AppManagers;\n\n private hangUpTimeout: number;\n\n private mediaStates: {\n input: CallMediaState,\n output?: CallMediaState\n };\n\n private sendMediaState: () => Promise;\n\n private decryptQueue: Uint8Array[];\n\n private getEmojisFingerprintPromise: Promise;\n private emojisFingerprint: [string, string, string, string];\n\n private wasStartingScreen: boolean;\n private wasStartingVideo: boolean;\n public wasTryingToJoin: boolean;\n\n public streamManager: StreamManager;\n\n constructor(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n managers: CallInstance['managers'],\n protocol?: PhoneCallProtocol\n }) {\n super();\n\n this.log = logger('CALL');\n\n if(!this.protocol) {\n this.protocol = getCallProtocol();\n }\n\n safeAssign(this, options);\n\n this.createdAt = Date.now();\n this.offerReceived = false;\n this.offerSent = false;\n this.decryptQueue = [];\n this.candidates = [];\n\n this.addEventListener('state', (state) => {\n this.log('state', CALL_STATE[state]);\n\n if(state === CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n\n const streamManager = this.streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n streamManager.direction = 'sendrecv';\n streamManager.types.push('screencast');\n if(!this.isOutgoing) {\n streamManager.locked = true;\n streamManager.canCreateConferenceEntry = false;\n }\n\n let mediaState: CallMediaState = {\n '@type': 'MediaState',\n 'type': 'input',\n 'lowBattery': false,\n 'muted': true,\n 'screencastState': 'inactive',\n 'videoRotation': 0,\n 'videoState': 'inactive'\n };\n\n const self = this;\n mediaState = new Proxy(mediaState, {\n set: function(target, key, value) {\n // @ts-ignore\n target[key] = value;\n self.setMediaState(mediaState);\n self.sendMediaState();\n return true;\n }\n });\n\n this.mediaStates = {\n input: mediaState\n };\n\n this.sendMediaState = debounce(this._sendMediaState.bind(this), 0, false, true);\n }\n\n get connectionState() {\n const {_connectionState, connectionInstance} = this;\n if(_connectionState !== undefined) {\n return _connectionState;\n } else if(!connectionInstance) {\n return CALL_STATE.CONNECTING;\n } else {\n const {iceConnectionState} = connectionInstance.connection;\n if(iceConnectionState === 'closed') {\n return CALL_STATE.CLOSED;\n } else if(iceConnectionState !== 'connected' && (!IS_SAFARI || iceConnectionState !== 'completed')) {\n return CALL_STATE.CONNECTING;\n } else {\n return CALL_STATE.CONNECTED;\n }\n }\n }\n\n get sortIndex() {\n const connectionState = this.connectionState;\n const state = CALL_STATE.CLOSED - connectionState + 1;\n let index = state * 10000000000000;\n index += 2147483647000 - (connectionState === CALL_STATE.PENDING && this.isOutgoing ? 0 : this.createdAt);\n return index;\n }\n\n public getVideoElement(type: CallMediaState['type']) {\n if(type === 'input') return this.elements.get('main');\n else {\n const mediaState = this.getMediaState('output');\n if(!mediaState) {\n return;\n }\n\n const type: WebRTCLineType = mediaState.videoState === 'active' ? 'video' : (mediaState.screencastState === 'active' ? 'screencast' : undefined);\n if(!type) {\n return;\n }\n\n const entry = this.description.findEntry((entry) => entry.type === type);\n if(!entry) {\n return;\n }\n\n return this.elements.get('' + entry.recvEntry.source);\n }\n }\n\n public async startScreenSharingInternal() {\n try {\n this.wasStartingScreen = true;\n this.wasStartingVideo = false;\n this.streamManager.types = ['audio', 'screencast'];\n await this.requestScreen();\n } catch(err) {\n this.log.error('startScreenSharing error', err);\n }\n }\n\n public async toggleScreenSharing() {\n if(this.isSharingVideo) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingScreen) {\n return this.stopVideoSharing();\n } else {\n return this.startScreenSharingInternal();\n }\n }\n\n public async startVideoSharingInternal() {\n try {\n this.wasStartingScreen = false;\n this.wasStartingVideo = true;\n this.streamManager.types = ['audio', 'video'];\n await this.requestInputSource(false, true, false);\n } catch(err) {\n this.log.error('startVideoSharing error', err);\n }\n }\n\n public async stopVideoSharing() {\n const mediaState = this.getMediaState('input');\n mediaState.videoState = mediaState.screencastState = 'inactive';\n\n const {streamManager, description} = this;\n const track = streamManager.inputStream.getVideoTracks()[0];\n if(track) {\n stopTrack(track);\n streamManager.appendToConference(description); // clear sender track\n }\n }\n\n public async toggleVideoSharing() {\n if(this.isSharingScreen) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharingInternal();\n }\n }\n\n public getMediaState(type: CallMediaState['type']) {\n return this.mediaStates[type];\n }\n\n public setMediaState(mediaState: CallMediaState) {\n this.mediaStates[mediaState.type] = mediaState;\n this.dispatchEvent('mediaState', mediaState);\n }\n\n public isSharingVideoType(type: 'video' | 'screencast') {\n try {\n const hasVideoTrack = super.isSharingVideo;\n return hasVideoTrack && !!((this.wasStartingScreen && type === 'screencast') || (this.wasStartingVideo && type === 'video'));\n\n // ! it will be used before the track appears\n // return !!this.description.entries.find((entry) => entry.type === type && entry.transceiver.sender.track.enabled);\n } catch(err) {\n return false;\n }\n }\n\n public get isSharingVideo() {\n return this.isSharingVideoType('video');\n }\n\n public get isSharingScreen() {\n return this.isSharingVideoType('screencast');\n }\n\n public get isMuted() {\n const audioTrack = this.streamManager.inputStream.getAudioTracks()[0];\n return !audioTrack?.enabled;\n }\n\n public get isClosing() {\n const {connectionState} = this;\n return connectionState === CALL_STATE.CLOSING || connectionState === CALL_STATE.CLOSED;\n }\n\n public get description(): localConferenceDescription {\n return this.connectionInstance?.description;\n }\n\n public setHangUpTimeout(timeout: number, reason: PhoneCallDiscardReason['_']) {\n this.clearHangUpTimeout();\n this.hangUpTimeout = ctx.setTimeout(() => {\n this.hangUpTimeout = undefined;\n this.hangUp(reason);\n }, timeout);\n }\n\n public clearHangUpTimeout() {\n if(this.hangUpTimeout !== undefined) {\n clearTimeout(this.hangUpTimeout);\n this.hangUpTimeout = undefined;\n }\n }\n\n public setPhoneCall(phoneCall: PhoneCall) {\n this.call = phoneCall;\n\n const {id} = phoneCall;\n if(this.id !== id) {\n const prevId = this.id;\n this.id = id;\n this.dispatchEvent('id', id, prevId);\n }\n }\n\n public async acceptCall() {\n const canAccept = (await Promise.all(this.dispatchResultableEvent('acceptCallOverride')))[0] ?? true;\n if(this.isClosing || !canAccept) {\n return;\n }\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n\n const call = this.call as PhoneCall.phoneCallRequested;\n this.requestInputSource(true, !!call.pFlags.video, false);\n\n const g_a_hash = call.g_a_hash;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n this.dh = { // ! it is correct\n g_a_hash,\n b: dh.a,\n g_b: dh.g_a,\n g_b_hash: dh.g_a_hash,\n p: dh.p\n };\n\n return this.managers.apiManager.invokeApi('phone.acceptCall', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n protocol: this.protocol,\n g_b: this.dh.g_b\n });\n }).then(async(phonePhoneCall) => {\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n }).catch((err) => {\n this.log.error('accept call error', err);\n // if(err.type === 'CALL_PROTOCOL_COMPAT_LAYER_INVALID') {\n\n // }\n\n this.hangUp('phoneCallDiscardReasonHangup');\n });\n }\n\n public joinCall() {\n this.log('joinCall');\n\n this.getEmojisFingerprint();\n\n this.overrideConnectionState();\n\n const {isOutgoing, encryptionKey, streamManager} = this;\n\n const configuration = getRtcConfiguration(this.call as PhoneCall.phoneCall);\n this.log('joinCall configuration', configuration);\n if(!configuration) return;\n\n const connectionInstance = this.connectionInstance = new CallConnectionInstance({\n call: this,\n streamManager,\n log: this.log.bindPrefix('connection')\n });\n\n const connection = connectionInstance.createPeerConnection(configuration);\n connection.addEventListener('iceconnectionstatechange', () => {\n const state = this.connectionState;\n if(this.connectedAt === undefined && state === CALL_STATE.CONNECTED) {\n this.connectedAt = Date.now();\n }\n\n this.dispatchEvent('state', state);\n });\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n connection.addEventListener('icecandidate', (event) => {\n const {candidate} = event;\n connection.log('onicecandidate', candidate);\n if(candidate?.candidate) {\n this.sendIceCandidate(candidate);\n }\n });\n connection.addEventListener('track', (event) => {\n const {track} = event;\n connection.log('ontrack', track);\n this.onTrack(event);\n });\n\n const description = connectionInstance.createDescription();\n\n this.encryptor = new P2PEncryptor(isOutgoing, encryptionKey);\n this.decryptor = new P2PEncryptor(!isOutgoing, encryptionKey);\n\n this.log('currentCall', this);\n\n if(isOutgoing) {\n connectionInstance.appendStreamToConference();\n }\n\n this.createDataChannel();\n\n this.processDecryptQueue();\n }\n\n private createDataChannelEntry() {\n const dataChannelEntry = this.description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n dataChannelEntry.sendEntry = dataChannelEntry.recvEntry = dataChannelEntry;\n }\n\n private createDataChannel() {\n if(this.connectionInstance.dataChannel) {\n return;\n }\n\n const channel = this.connectionInstance.createDataChannel({\n id: 0,\n negotiated: true\n });\n channel.addEventListener('message', (e) => {\n this.applyDataChannelData(JSON.parse(e.data));\n });\n channel.addEventListener('open', () => {\n this.sendMediaState();\n });\n }\n\n private applyDataChannelData(data: CallMediaState) {\n switch(data['@type']) {\n case 'MediaState': {\n data.type = 'output';\n this.log('got output media state', data);\n this.setMediaState(data);\n break;\n }\n\n default:\n this.log.error('unknown data channel data:', data);\n break;\n }\n }\n\n private _sendMediaState() {\n const {connectionInstance} = this;\n if(!connectionInstance) return;\n\n const mediaState = {...this.getMediaState('input')};\n // mediaState.videoRotation = 90;\n delete mediaState.type;\n this.log('sendMediaState', mediaState);\n\n connectionInstance.sendDataChannelData(mediaState);\n }\n\n public async sendCallSignalingData(data: CallSignalingData) {\n /* if(data['@type'] === 'InitialSetup') {\n this.filterNotVP8(data);\n } */\n\n const json = JSON.stringify(data);\n const arr = new TextEncoder().encode(json);\n const {bytes} = await this.encryptor.encryptRawPacket(arr);\n\n this.log('sendCallSignalingData', this.id, json);\n await this.managers.apiManager.invokeApi('phone.sendSignalingData', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n data: bytes\n });\n }\n\n public sendIceCandidate(iceCandidate: RTCIceCandidate) {\n this.log('sendIceCandidate', iceCandidate);\n const {candidate, sdpMLineIndex} = iceCandidate;\n if(sdpMLineIndex !== 0) {\n return;\n }\n\n const parsed = p2pParseCandidate(candidate);\n // const parsed = {sdpString: candidate};\n /* if(parsed.address.ip !== '') {\n return;\n } */\n\n this.sendCallSignalingData({\n '@type': 'Candidates',\n 'candidates': [parsed]\n });\n }\n\n public async confirmCall() {\n const {protocol, id, call} = this;\n const dh = this.dh as DiffieHellmanInfo.a;\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey((call as PhoneCall.phoneCallAccepted).g_b, dh.a, dh.p);\n\n const phonePhoneCall = await this.managers.apiManager.invokeApi('phone.confirmCall', {\n peer: await this.managers.appCallsManager.getCallInput(id),\n protocol: protocol,\n g_a: dh.g_a,\n key_fingerprint: key_fingerprint\n });\n\n this.encryptionKey = key;\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n this.joinCall();\n }\n\n public getEmojisFingerprint() {\n if(this.emojisFingerprint) return this.emojisFingerprint;\n if(this.getEmojisFingerprintPromise) return this.getEmojisFingerprintPromise;\n return this.getEmojisFingerprintPromise = apiManagerProxy.invokeCrypto('get-emojis-fingerprint', this.encryptionKey, this.dh.g_a).then((codePoints) => {\n this.getEmojisFingerprintPromise = undefined;\n return this.emojisFingerprint = codePoints.map((codePoints) => emojiFromCodePoints(codePoints)) as [string, string, string, string];\n });\n }\n\n private unlockStreamManager() {\n this.connectionInstance.streamManager.locked = false;\n this.connectionInstance.appendStreamToConference();\n }\n\n private async doTheMagic() {\n this.connectionInstance.appendStreamToConference();\n\n const connection = this.connectionInstance.connection;\n\n let answer = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n connection.getTransceivers().filter((transceiver) => transceiver.direction === 'recvonly').forEach((transceiver) => {\n const entry = this.connectionInstance.description.getEntryByMid(transceiver.mid);\n entry.transceiver = entry.recvEntry.transceiver = transceiver;\n transceiver.direction = 'sendrecv';\n });\n\n const isAnswer = false;\n\n const description = this.description;\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n await connection.setRemoteDescription(sdpDescription);\n\n answer = await connection.createAnswer();\n\n await connection.setLocalDescription(answer);\n\n const initialSetup = parseSignalingData(parseSdp(answer.sdp));\n this.log('[InitialSetup] send 1');\n this.sendCallSignalingData(initialSetup);\n\n this.unlockStreamManager();\n }\n\n public overrideConnectionState(state?: CALL_STATE) {\n this._connectionState = state;\n this.dispatchEvent('state', this.connectionState);\n }\n\n public get duration() {\n return this.connectedAt !== undefined ? (Date.now() - this.connectedAt) / 1000 | 0 : 0;\n }\n\n protected onInputStream(stream: MediaStream): void {\n super.onInputStream(stream);\n\n const videoTrack = stream.getVideoTracks()[0];\n if(videoTrack) {\n const state = this.getMediaState('input');\n\n // handle starting camera\n if(!this.wasStartingScreen && !this.wasStartingVideo) {\n this.wasStartingVideo = true;\n }\n\n if(this.isSharingVideo) {\n state.videoState = 'active';\n } else if(this.isSharingScreen) {\n state.screencastState = 'active';\n }\n\n videoTrack.addEventListener('ended', () => {\n this.stopVideoSharing();\n }, {once: true});\n }\n\n if(stream.getAudioTracks().length) {\n this.onMutedChange();\n }\n }\n\n private onMutedChange() {\n const isMuted = this.isMuted;\n this.dispatchEvent('muted', isMuted);\n\n const state = this.getMediaState('input');\n state.muted = isMuted;\n }\n\n public toggleMuted(): Promise {\n return this.requestAudioSource(true).then(() => {\n this.setMuted();\n this.onMutedChange();\n });\n }\n\n public async hangUp(discardReason?: PhoneCallDiscardReason['_'], discardedByOtherParty?: boolean) {\n if(this.isClosing) {\n return;\n }\n\n this.discardReason = discardReason;\n this.log('hangUp', discardReason);\n this.overrideConnectionState(CALL_STATE.CLOSED);\n\n if(this.connectionInstance) {\n this.connectionInstance.closeConnectionAndStream(true);\n }\n\n if(discardReason && !discardedByOtherParty) {\n let hasVideo = false;\n for(const type in this.mediaStates) {\n const mediaState = this.mediaStates[type as 'input' | 'output'];\n hasVideo = mediaState.videoState === 'active' || mediaState.screencastState === 'active' || hasVideo;\n }\n\n await this.managers.appCallsManager.discardCall(this.id, this.duration, discardReason, hasVideo);\n }\n }\n\n private performCodec(_codec: P2PAudioCodec | P2PVideoCodec) {\n const payloadTypes: AudioCodec['payload-types'] = _codec.payloadTypes.map((payloadType) => {\n return {\n ...payloadType,\n 'rtcp-fbs': payloadType.feedbackTypes\n }\n });\n\n const codec: AudioCodec = {\n 'rtp-hdrexts': _codec.rtpExtensions,\n 'payload-types': payloadTypes\n };\n\n return codec;\n }\n\n private setDataToDescription(data: CallSignalingData.initialSetup) {\n this.description.setData({\n transport: {\n 'pwd': data.pwd,\n 'ufrag': data.ufrag,\n 'fingerprints': data.fingerprints,\n 'rtcp-mux': true\n },\n audio: this.performCodec(data.audio),\n video: data.video ? this.performCodec(data.video) as VideoCodec : undefined,\n screencast: data.screencast ? this.performCodec(data.screencast) as VideoCodec : undefined\n });\n }\n\n private filterNotVP8(initialSetup: CallSignalingData.initialSetup) {\n if(!this.isOutgoing) { // only VP8 works now\n [initialSetup.video, initialSetup.screencast].filter(Boolean).forEach((codec) => {\n const payloadTypes = codec.payloadTypes;\n const idx = payloadTypes.findIndex((payloadType) => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex((payloadType) => +payloadType.parameters?.apt === vp8PayloadType.id);\n codec.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n });\n }\n }\n\n public async applyCallSignalingData(data: CallSignalingData) {\n this.log('applyCallSignalingData', this, data);\n\n const {connection, description} = this.connectionInstance;\n\n switch(data['@type']) {\n case 'InitialSetup': {\n this.log('[sdp] InitialSetup', data);\n\n this.filterNotVP8(data);\n this.setDataToDescription(data);\n\n const performSsrcGroups = (ssrcGroups: P2PVideoCodec['ssrcGroups']): GroupCallParticipantVideoSourceGroup[] => {\n return ssrcGroups.map((ssrcGroup) => {\n return {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics: ssrcGroup.semantics,\n sources: ssrcGroup.ssrcs.map((source) => +source)\n };\n });\n };\n\n const ssrcs = [\n generateSsrc('audio', +data.audio.ssrc),\n data.video ? generateSsrc('video', performSsrcGroups(data.video.ssrcGroups)) : undefined,\n data.screencast ? generateSsrc('screencast', performSsrcGroups(data.screencast.ssrcGroups)) : undefined\n ].filter(Boolean);\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n return;\n }\n\n const sendRecvEntry = description.findFreeSendRecvEntry(ssrc.type, false);\n entry = new ConferenceEntry(sendRecvEntry.mid, ssrc.type);\n entry.setDirection('sendrecv');\n sendRecvEntry.recvEntry = entry;\n\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n });\n\n this.createDataChannelEntry();\n\n const isAnswer = this.offerSent;\n this.offerSent = false;\n\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n this.log('[sdp] remote', sdpDescription.sdp);\n\n await connection.setRemoteDescription(sdpDescription);\n\n await this.tryToReleaseCandidates();\n\n if(!isAnswer) {\n await this.doTheMagic();\n }\n\n break;\n }\n\n case 'Candidates': {\n for(const candidate of data.candidates) {\n const init: RTCIceCandidateInit = P2PSdpBuilder.generateCandidate(candidate);\n init.sdpMLineIndex = 0;\n const iceCandidate = new RTCIceCandidate(init);\n this.candidates.push(iceCandidate);\n }\n\n await this.tryToReleaseCandidates();\n break;\n }\n\n default: {\n this.log.error('unrecognized signaling data', data);\n }\n }\n }\n\n public async tryToReleaseCandidates() {\n const {connectionInstance} = this;\n if(!connectionInstance) {\n return;\n }\n\n const {connection} = connectionInstance;\n if(connection.remoteDescription) {\n const promises: Promise[] = this.candidates.map((candidate) => this.addIceCandidate(connection, candidate));\n this.candidates.length = 0;\n\n await Promise.all(promises);\n } else {\n this.log('[candidates] postpone');\n }\n }\n\n private async addIceCandidate(connection: RTCPeerConnection, candidate: RTCIceCandidate) {\n this.log('[candidate] start', candidate);\n try {\n // if(!candidate.address) return;\n await connection.addIceCandidate(candidate);\n this.log('[candidate] add', candidate);\n } catch(e) {\n this.log.error('[candidate] error', candidate, e);\n }\n }\n\n private async processDecryptQueue() {\n const {encryptor} = this;\n if(!encryptor) {\n this.log.warn('got encrypted signaling data before the encryption key');\n return;\n }\n\n const length = this.decryptQueue.length;\n if(!length) {\n return;\n }\n\n const queue = this.decryptQueue.slice();\n this.decryptQueue.length = 0;\n\n for(const data of queue) {\n const decryptedData = await encryptor.decryptRawPacket(data);\n if(!decryptedData) {\n continue;\n }\n\n // this.log('[update] updateNewCallSignalingData', update, decryptedData);\n\n const str = new TextDecoder().decode(decryptedData);\n try {\n const signalingData: CallSignalingData = JSON.parse(str);\n this.log('[update] updateNewCallSignalingData', signalingData);\n this.applyCallSignalingData(signalingData);\n } catch(err) {\n this.log.error('wrong signaling data', str);\n this.hangUp('phoneCallDiscardReasonDisconnect');\n callsController.dispatchEvent('incompatible', this.interlocutorUserId);\n }\n }\n }\n\n public onUpdatePhoneCallSignalingData(data: Uint8Array) {\n this.decryptQueue.push(data);\n this.processDecryptQueue();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {PhoneCallProtocol} from '../../../layer';\n\nexport default function getCallProtocol(): PhoneCallProtocol {\n return {\n _: 'phoneCallProtocol',\n pFlags: {\n udp_p2p: true,\n udp_reflector: true\n },\n min_layer: 92,\n max_layer: 92,\n library_versions: ['4.0.0']\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {PhoneCall} from '../../../layer';\n\nexport default function getRtcConfiguration(call: PhoneCall.phoneCall): RTCConfiguration {\n const iceServers: RTCIceServer[] = [];\n call.connections.forEach((connection) => {\n switch(connection._) {\n /* case 'callServerTypeTelegramReflector': {\n break;\n } */\n case 'phoneConnectionWebrtc': {\n const {ip, ipv6, port, username, password} = connection;\n const urls: string[] = [];\n if(connection.pFlags.turn) {\n if(ip) {\n urls.push(`turn:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`turn:[${ipv6}]:${port}`);\n }\n } else if(connection.pFlags.stun) {\n if(ip) {\n urls.push(`stun:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`stun:[${ipv6}]:${port}`);\n }\n }\n\n if(urls.length > 0) {\n iceServers.push({\n urls,\n username,\n credential: password\n });\n }\n break;\n }\n }\n });\n\n return {\n iceServers,\n iceTransportPolicy: call.pFlags.p2p_allowed ? 'all' : 'relay'\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\r\n\r\nexport type CallAudioAssetName = 'call_busy.mp3' | 'call_connect.mp3' | 'call_end.mp3' | 'call_incoming.mp3' | 'call_outgoing.mp3' | 'voip_failed.mp3' | 'voip_connecting.mp3';\r\n\r\nlet audioAsset: AudioAssetPlayer;\r\nexport default function getCallAudioAsset() {\r\n return audioAsset ??= new AudioAssetPlayer([\r\n 'call_busy.mp3',\r\n 'call_connect.mp3',\r\n 'call_end.mp3',\r\n 'call_incoming.mp3',\r\n 'call_outgoing.mp3',\r\n 'voip_failed.mp3'\r\n ]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getCallAudioAsset, {CallAudioAssetName} from '../../components/call/getAudioAsset';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\r\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\r\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\r\nimport EventListenerBase from '../../helpers/eventListenerBase';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport {PhoneCallProtocol} from '../../layer';\r\nimport {CallId} from '../appManagers/appCallsManager';\r\nimport {AppManagers} from '../appManagers/managers';\r\nimport {logger} from '../logger';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\r\nimport rootScope from '../rootScope';\r\nimport CallInstance from './callInstance';\r\nimport CALL_STATE from './callState';\r\n\r\nconst CALL_REQUEST_TIMEOUT = 45e3;\r\n\r\nexport class CallsController extends EventListenerBase<{\r\n instance: (details: {hasCurrent: boolean, instance: CallInstance}) => void,\r\n accepting: (instance: CallInstance) => void, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\r\n incompatible: (userId: UserId) => void,\r\n}> {\r\n private log: ReturnType;\r\n private managers: AppManagers;\r\n private audioAsset: AudioAssetPlayer;\r\n private instances: Map;\r\n private sortedInstances: Array;\r\n private tempId: number;\r\n\r\n public construct(managers: AppManagers) {\r\n this.managers = managers;\r\n this.log = logger('CC');\r\n\r\n if(!IS_CALL_SUPPORTED) {\r\n return;\r\n }\r\n\r\n this.audioAsset = getCallAudioAsset();\r\n this.tempId = 0;\r\n this.instances = new Map();\r\n this.sortedInstances = [];\r\n\r\n rootScope.addEventListener('call_update', async(call) => {\r\n let instance = this.instances.get(call.id);\r\n\r\n if(instance) {\r\n instance.setPhoneCall(call);\r\n }\r\n\r\n switch(call._) {\r\n case 'phoneCallDiscarded': {\r\n if(instance) {\r\n instance.hangUp(call.reason?._, true);\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'phoneCallAccepted': {\r\n if(instance) {\r\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\r\n instance.hangUp('phoneCallDiscardReasonDisconnect');\r\n rootScope.dispatchEvent('call_incompatible', instance.interlocutorUserId);\r\n break;\r\n } */\r\n\r\n instance.confirmCall();\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'phoneCallRequested': {\r\n if(!instance) {\r\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\r\n rootScope.dispatchEvent('call_incompatible', call.admin_id);\r\n break;\r\n } */\r\n\r\n instance = this.createCallInstance({\r\n isOutgoing: false,\r\n interlocutorUserId: call.admin_id\r\n });\r\n\r\n instance.overrideConnectionState(CALL_STATE.PENDING);\r\n instance.setPhoneCall(call);\r\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'phoneCall': {\r\n if(!instance || instance.encryptionKey) {\r\n break;\r\n }\r\n\r\n const g_a = instance.dh.g_a = call.g_a_or_b;\r\n const dh = instance.dh;\r\n const g_a_hash = await apiManagerProxy.invokeCrypto('sha256', g_a);\r\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\r\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\r\n break;\r\n }\r\n\r\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey(g_a, dh.b, dh.p);\r\n if(call.key_fingerprint !== key_fingerprint) {\r\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint, g_a, dh);\r\n instance.hangUp('phoneCallDiscardReasonDisconnect');\r\n break;\r\n }\r\n\r\n instance.encryptionKey = key;\r\n instance.joinCall();\r\n\r\n break;\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('call_signaling', ({callId, data}) => {\r\n const instance = this.instances.get(callId);\r\n if(instance?.id !== callId) {\r\n return;\r\n }\r\n\r\n instance.onUpdatePhoneCallSignalingData(data);\r\n });\r\n }\r\n\r\n public get currentCall() {\r\n return this.sortedInstances[0];\r\n }\r\n\r\n public getCallByUserId(userId: UserId) {\r\n for(const [callId, instance] of this.instances) {\r\n if(instance.interlocutorUserId === userId) {\r\n return instance;\r\n }\r\n }\r\n }\r\n\r\n private createCallInstance(options: {\r\n isOutgoing: boolean,\r\n interlocutorUserId: UserId,\r\n protocol?: PhoneCallProtocol\r\n }) {\r\n const call = new CallInstance({\r\n managers: this.managers,\r\n ...options\r\n });\r\n\r\n call.addEventListener('state', (state) => {\r\n const currentCall = this.currentCall;\r\n if(state === CALL_STATE.CLOSED) {\r\n this.instances.delete(call.id);\r\n indexOfAndSplice(this.sortedInstances, call);\r\n } else {\r\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\r\n }\r\n\r\n if(state === CALL_STATE.EXCHANGING_KEYS) {\r\n call.wasTryingToJoin = true;\r\n }\r\n\r\n const hasConnected = call.connectedAt !== undefined;\r\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\r\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\r\n } else {\r\n call.clearHangUpTimeout();\r\n }\r\n\r\n if(currentCall === call || !currentCall) {\r\n if(state === CALL_STATE.CLOSED) {\r\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\r\n this.audioAsset.stopSound();\r\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\r\n this.audioAsset.playSound('voip_failed.mp3');\r\n } else {\r\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\r\n }\r\n } else if(state === CALL_STATE.PENDING) {\r\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\r\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\r\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\r\n } else if(state === CALL_STATE.CONNECTING) {\r\n if(call.duration) {\r\n this.audioAsset.playSound('voip_connecting.mp3', true);\r\n }\r\n } else {\r\n this.audioAsset.stopSound();\r\n }\r\n }\r\n });\r\n\r\n call.addEventListener('id', (id, prevId) => {\r\n if(prevId !== undefined) {\r\n this.instances.delete(prevId);\r\n }\r\n\r\n const hasCurrent = !!this.currentCall;\r\n this.instances.set(id, call);\r\n\r\n if(prevId === undefined) {\r\n this.dispatchEvent('instance', {instance: call, hasCurrent: hasCurrent});\r\n }\r\n });\r\n\r\n return call;\r\n }\r\n\r\n public async startCallInternal(userId: UserId, isVideo: boolean) {\r\n this.log('p2pStartCallInternal', userId, isVideo);\r\n\r\n const fullInfo = await this.managers.appProfileManager.getProfile(userId);\r\n if(!fullInfo) return;\r\n\r\n const {video_calls_available} = fullInfo.pFlags;\r\n\r\n const call = this.createCallInstance({\r\n isOutgoing: true,\r\n interlocutorUserId: userId\r\n });\r\n\r\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\r\n\r\n call.overrideConnectionState(CALL_STATE.REQUESTING);\r\n call.setPhoneCall({\r\n _: 'phoneCallWaiting',\r\n access_hash: '',\r\n admin_id: NULL_PEER_ID,\r\n date: tsNow(true),\r\n id: --this.tempId,\r\n participant_id: userId,\r\n protocol: call.protocol,\r\n pFlags: {\r\n video: isVideo || undefined\r\n }\r\n });\r\n\r\n // return;\r\n this.managers.appCallsManager.generateDh().then(async(dh) => {\r\n call.dh = dh;\r\n\r\n return this.managers.appCallsManager.requestCall(userId, call.protocol, call.dh.g_a_hash, isVideo && video_calls_available);\r\n }).then((phoneCall) => {\r\n call.overrideConnectionState(CALL_STATE.PENDING);\r\n call.setPhoneCall(phoneCall);\r\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\r\n });\r\n }\r\n}\r\n\r\nconst callsController = new CallsController();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.callsController = callsController);\r\nexport default callsController;\r\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCallConnectionType, JoinGroupCallJsonPayload} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport rootScope from '../rootScope';\nimport CallConnectionInstanceBase, {CallConnectionInstanceOptions} from './callConnectionInstanceBase';\nimport GroupCallInstance from './groupCallInstance';\nimport filterServerCodecs from './helpers/filterServerCodecs';\nimport fixLocalOffer from './helpers/fixLocalOffer';\nimport processMediaSection from './helpers/processMediaSection';\nimport {ConferenceEntry} from './localConferenceDescription';\nimport SDP from './sdp';\nimport SDPMediaSection from './sdp/mediaSection';\nimport {WebRTCLineType} from './sdpBuilder';\nimport {UpdateGroupCallConnectionData} from './types';\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract,\n isMuted?: boolean,\n joinVideo?: boolean,\n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n private managers: AppManagers;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n managers: AppManagers\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({\n iceServers: [],\n iceTransportPolicy: 'all',\n bundlePolicy: 'max-bundle',\n rtcpMuxPolicy: 'require',\n iceCandidatePoolSize: 0\n // sdpSemantics: \"unified-plan\",\n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach((type) => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map((section) => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n\n return processed;\n });\n\n const audioChannel = processedChannels.find((channel) => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find((channel) => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach((entry) => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n\n const update = await this.managers.appGroupCallsManager.joinGroupCall(groupCallId, params, options);\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n\n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer,\n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter((media) => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n\n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find((section) => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle,\n entries,\n isAnswer\n })\n };\n\n entriesToDelete.forEach((entry) => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n if(this.options.type === 'presentation') {\n promise.then(() => {\n this.connection.getTransceivers().find((transceiver) => {\n if(transceiver.sender?.track?.kind === 'video') {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n }\n });\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n\n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n\n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DataJSON} from '../../../layer';\nimport {JoinGroupCallJsonPayload} from '../../appManagers/appGroupCallsManager';\nimport SDP from '../sdp';\nimport {Ssrc} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n 'fingerprints': [sectionInfo.fingerprint],\n 'pwd': sectionInfo.pwd,\n 'ssrc': sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n 'ufrag': sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params,\n source: sectionInfo.source,\n media,\n sourceGroups: sectionInfo.sourceGroups,\n entry\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport SDPMediaSection from '../sdp/mediaSection';\nimport {UpdateGroupCallConnectionData, Codec} from '../types';\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map((data) => {\n return */['audio' as const, 'video' as const].filter((type) => data[type]).map((type) => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find((line) => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec['rtp-hdrexts'], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport copy from '../../../helpers/object/copy';\nimport {ConferenceEntry} from '../localConferenceDescription';\nimport {parseSdp, addSimulcast} from '../sdp/utils';\nimport {generateMediaFirstLine, SDPBuilder} from '../sdpBuilder';\nimport {UpdateGroupCallConnectionData} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit,\n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find((line) => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map((payload) => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n\n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n const newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {GroupCallConnectionType, GroupCallId, GroupCallOutputSource} from '../appManagers/appGroupCallsManager';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstanceBase, {TryAddTrackOptions} from './callInstanceBase';\nimport GroupCallConnectionInstance from './groupCallConnectionInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport getScreenConstraints from './helpers/getScreenConstraints';\nimport getScreenStream from './helpers/getScreenStream';\nimport getStream from './helpers/getStream';\nimport getVideoConstraints from './helpers/getVideoConstraints';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\nimport getPeerId from '../appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../appManagers/managers';\nimport {generateSelfVideo, makeSsrcFromParticipant, makeSsrcsFromParticipant} from './groupCallsController';\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n\n // will be set with negotiation\n public joined: boolean;\n\n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n private startScreenSharingPromise: Promise;\n\n private managers: AppManagers;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections'],\n managers: AppManagers\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return this.managers.appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public async getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : (await this.participants).get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => this.changeUserMuted(NULL_PEER_ID));\n }\n\n public async changeUserMuted(peerId: PeerId, muted?: boolean) {\n const participant = await this.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(participant, {muted});\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n managers: this.managers,\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return this.editParticipant(this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n\n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n\n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise ??= this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n });\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n this.managers.appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id);\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await this.editParticipant(this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise ??= this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n });\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await this.editParticipant(this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n\n if(!rejoin) {\n const d = discard || (this.joined ? this.connections.main.sources.audio.source : undefined);\n this.managers.appGroupCallsManager.hangUp(this.id, d);\n }\n }\n\n public tryAddTrack(options: Omit) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n\n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n this.getParticipantByPeerId(entry.peerId).then((participant) => {\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n });\n }\n\n return source;\n }\n\n public async editParticipant(participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n // let processUpdate = true;\n if(participant) {\n // const {currentGroupCall} = this;\n // const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isCurrentCall = true;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !this.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = generateSelfVideo(this.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n this.setMuted(false);\n }\n\n this.dispatchEvent('state', this.state);\n }\n\n // rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n return this.managers.appGroupCallsManager.editParticipant(this.id, participant, options);\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach((oldSsrc) => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find((ssrc) => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\n","/*\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\r\n\r\nexport type GroupCallAudioAssetName = 'group_call_connect.mp3' | 'group_call_end.mp3' | 'group_call_start.mp3' | 'voip_onallowtalk.mp3';\r\n\r\nlet audioAsset: AudioAssetPlayer;\r\nexport default function getGroupCallAudioAsset() {\r\n return audioAsset ??= new AudioAssetPlayer([\r\n 'group_call_connect.mp3',\r\n 'group_call_end.mp3',\r\n 'group_call_start.mp3',\r\n 'voip_onallowtalk.mp3'\r\n ]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getGroupCallAudioAsset from '../../components/groupCall/getAudioAsset';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport EventListenerBase from '../../helpers/eventListenerBase';\r\nimport {GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup} from '../../layer';\r\nimport {GroupCallId, GroupCallConnectionType} from '../appManagers/appGroupCallsManager';\r\nimport {AppManagers} from '../appManagers/managers';\r\nimport {logger} from '../logger';\r\nimport rootScope from '../rootScope';\r\nimport GroupCallInstance from './groupCallInstance';\r\nimport GROUP_CALL_STATE from './groupCallState';\r\nimport createMainStreamManager from './helpers/createMainStreamManager';\r\nimport {generateSsrc} from './localConferenceDescription';\r\nimport {WebRTCLineType} from './sdpBuilder';\r\nimport StreamManager from './streamManager';\r\nimport {Ssrc} from './types';\r\n\r\nconst IS_MUTED = true;\r\n\r\nexport function makeSsrcsFromParticipant(participant: GroupCallParticipant) {\r\n return [\r\n makeSsrcFromParticipant(participant, 'audio', participant.source),\r\n participant.video?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\r\n participant.video && makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\r\n participant.presentation?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\r\n participant.presentation && makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\r\n ].filter(Boolean);\r\n};\r\n\r\nexport function makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\r\n return generateSsrc(type, source, endpoint);\r\n}\r\n\r\nexport function generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\r\n return source && {\r\n _: 'groupCallParticipantVideo',\r\n pFlags: {},\r\n endpoint: '',\r\n source_groups: source.sourceGroups,\r\n audio_source: audioSource\r\n };\r\n}\r\n\r\nexport class GroupCallsController extends EventListenerBase<{\r\n instance: (instance: GroupCallInstance) => void\r\n}> {\r\n private audioAsset: ReturnType;\r\n private log: ReturnType;\r\n private currentGroupCall: GroupCallInstance;\r\n private managers: AppManagers;\r\n\r\n public construct(managers: AppManagers) {\r\n this.managers = managers;\r\n this.audioAsset = getGroupCallAudioAsset();\r\n this.log = logger('GCC');\r\n\r\n rootScope.addEventListener('group_call_update', (groupCall) => {\r\n const {currentGroupCall} = this;\r\n if(currentGroupCall?.id === groupCall.id) {\r\n currentGroupCall.groupCall = groupCall;\r\n\r\n if(groupCall._ === 'groupCallDiscarded') {\r\n currentGroupCall.hangUp(false, false, true);\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('group_call_participant', ({groupCallId, participant}) => {\r\n const {currentGroupCall} = this;\r\n if(currentGroupCall?.id === groupCallId) {\r\n currentGroupCall.onParticipantUpdate(participant/* , this.doNotDispatchParticipantUpdate */);\r\n }\r\n });\r\n }\r\n\r\n get groupCall() {\r\n return this.currentGroupCall;\r\n }\r\n\r\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\r\n this.currentGroupCall = groupCall;\r\n\r\n if(groupCall) {\r\n this.dispatchEvent('instance', groupCall);\r\n }\r\n }\r\n\r\n public startConnectingSound() {\r\n this.stopConnectingSound();\r\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\r\n }\r\n\r\n public stopConnectingSound() {\r\n this.audioAsset.stopSound();\r\n this.audioAsset.cancelDelayedPlay();\r\n }\r\n\r\n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\r\n this.audioAsset.createAudio();\r\n\r\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\r\n\r\n let streamManager: StreamManager;\r\n if(rejoin) {\r\n streamManager = this.currentGroupCall.connections.main.streamManager;\r\n } else {\r\n streamManager = await createMainStreamManager(muted, joinVideo);\r\n }\r\n\r\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo);\r\n }\r\n\r\n public async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\r\n const log = this.log.bindPrefix('joinGroupCallInternal');\r\n log('start', groupCallId);\r\n\r\n const type: GroupCallConnectionType = 'main';\r\n\r\n let {currentGroupCall} = this;\r\n if(currentGroupCall && rejoin) {\r\n // currentGroupCall.connections.main.connection = connection;\r\n currentGroupCall.handleUpdateGroupCallParticipants = false;\r\n currentGroupCall.updatingSdp = false;\r\n log('update currentGroupCall', groupCallId, currentGroupCall);\r\n } else {\r\n currentGroupCall = new GroupCallInstance({\r\n chatId,\r\n id: groupCallId,\r\n managers: this.managers\r\n });\r\n\r\n currentGroupCall.fixSafariAudio();\r\n\r\n currentGroupCall.addEventListener('state', (state) => {\r\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\r\n this.setCurrentGroupCall(null);\r\n this.stopConnectingSound();\r\n this.audioAsset.playSound('group_call_end.mp3');\r\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\r\n }\r\n });\r\n\r\n currentGroupCall.groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\r\n\r\n const connectionInstance = currentGroupCall.createConnectionInstance({\r\n streamManager,\r\n type,\r\n options: {\r\n type,\r\n isMuted: muted,\r\n joinVideo,\r\n rejoin\r\n }\r\n });\r\n\r\n const connection = connectionInstance.createPeerConnection();\r\n connection.addEventListener('negotiationneeded', () => {\r\n connectionInstance.negotiate();\r\n });\r\n\r\n connection.addEventListener('track', (event) => {\r\n log('ontrack', event);\r\n currentGroupCall.onTrack(event);\r\n });\r\n\r\n connection.addEventListener('iceconnectionstatechange', () => {\r\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\r\n\r\n const {iceConnectionState} = connection;\r\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\r\n this.startConnectingSound();\r\n } else {\r\n this.stopConnectingSound();\r\n }\r\n\r\n switch(iceConnectionState) {\r\n case 'checking': {\r\n break;\r\n }\r\n\r\n case 'closed': {\r\n currentGroupCall.hangUp();\r\n break;\r\n }\r\n\r\n case 'completed': {\r\n break;\r\n }\r\n\r\n case 'connected': {\r\n if(!currentGroupCall.joined) {\r\n currentGroupCall.joined = true;\r\n this.audioAsset.playSound('group_call_start.mp3');\r\n this.managers.appGroupCallsManager.getGroupCallParticipants(groupCallId);\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'disconnected': {\r\n break;\r\n }\r\n\r\n case 'failed': {\r\n // TODO: replace with ICE restart\r\n currentGroupCall.hangUp();\r\n // connection.restartIce();\r\n break;\r\n }\r\n\r\n case 'new': {\r\n break;\r\n }\r\n }\r\n });\r\n\r\n connectionInstance.createDescription();\r\n connectionInstance.createDataChannel();\r\n\r\n connectionInstance.appendStreamToConference();\r\n\r\n this.setCurrentGroupCall(currentGroupCall);\r\n log('set currentGroupCall', groupCallId, currentGroupCall);\r\n\r\n this.startConnectingSound();\r\n\r\n return connectionInstance.negotiate();\r\n }\r\n }\r\n}\r\n\r\nconst groupCallsController = new GroupCallsController();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.groupCallController = groupCallsController);\r\nexport default groupCallsController;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from '../constants';\nimport StreamManager from '../streamManager';\nimport getAudioConstraints from './getAudioConstraints';\nimport getStream from './getStream';\nimport getVideoConstraints from './getVideoConstraints';\n\nexport default async function createMainStreamManager(muted?: boolean, joinVideo?: boolean) {\n const constraints: MediaStreamConstraints = {\n audio: getAudioConstraints(),\n video: joinVideo && getVideoConstraints()\n };\n\n const streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n\n try {\n const stream = await getStream(constraints, muted);\n streamManager.addStream(stream, 'input');\n } catch(err) {\n console.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n\n return streamManager;\n}\n","import constraintSupported, {MyMediaTrackSupportedConstraints} from '../../../environment/constraintSupport';\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach((constraint) => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean,\n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n","export default function getScreenConstraints(skipAudio?: boolean) {\n const constraints: DisplayMediaStreamConstraints = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n }\n };\n\n if(!skipAudio) {\n constraints.audio = true;\n }\n\n return constraints;\n}\n","export default async function getScreenStream(constraints: DisplayMediaStreamConstraints) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n const track = screenStream.getVideoTracks()[0];\n track.contentHint = 'text';\n return screenStream;\n}\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n stream.getTracks().forEach((x) => {\n x.enabled = !muted;\n });\n\n // console.log('getStream result', stream);\n return 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","/*\n * 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","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 indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {fixMediaLineType, SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT} from './sdpBuilder';\nimport {AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec} from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n\n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(fixMediaLineType(this.type), init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n return {\n endpoint,\n type,\n source,\n sourceGroups\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n public readonly screencast?: VideoCodec;\n\n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map;\n private entriesBySource: Map;\n private entriesByPeerId: Map>;\n\n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n\n public findEntry(verify: Parameters[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find((entry) => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n\n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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, lines: SDPLine[] = [];\n const mediaSections: SDPMediaSection[] = [];\n str.split(/\\r?\\n/).forEach((lineStr) => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach((ssrc) => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport LocalConferenceDescription, {ConferenceEntry} from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport {GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData} from './types';\nimport {fromTelegramSource} from './utils';\n\n// screencast is for Peer-to-Peer only\nexport type WebRTCLineTypeTrue = 'video' | 'audio' | 'application';\nexport type WebRTCLineType = WebRTCLineTypeTrue | 'screencast';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function fixMediaLineType(mediaType: WebRTCLineType) {\n return mediaType === 'screencast' ? 'video' : mediaType;\n}\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n // return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n return mediaType === 'application' ? 'DTLS/SCTP' : 'UDP/TLS/RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${fixMediaLineType(mediaType)} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData | LocalConferenceDescription;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n\n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n // 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n\n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach((ssrcGroup) => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n\n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n\n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${fixMediaLineType(type)} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n\n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map((type) => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n\n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach((hdrext) => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n\n payloadTypes.forEach((type) => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n\n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n\n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach((fb) => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n\n public addConference(options: {\n conference: LocalConferenceDescription,\n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean,\n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n\n public static fromConference(options: Parameters[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX} from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport {fixMediaLineType, WebRTCLineType} from './sdpBuilder';\nimport {getAmplitude, toTelegramSource} from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: 'input' | 'output';\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n\n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n\n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n public static ANALYSER_LISTENER = new EventListenerBase<{amplitude: (details: {amplitudes: StreamAmplitude[], type: 'all' | 'input'}) => void}>();\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public locked: boolean;\n public types: WebRTCLineType[];\n\n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n this.types = ['audio', 'video'];\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach((track) => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n\n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n\n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n\n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find((item) => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n\n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n\n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n\n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n\n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n\n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n\n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n\n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n\n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n\n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter((x) => x.type === 'input');\n const audioItems = filteredItems.filter((x) => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n\n StreamManager.ANALYSER_LISTENER.dispatchEvent('amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach((track) => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.locked) {\n return;\n }\n\n const {inputStream, direction, canCreateConferenceEntry} = this;\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types = this.types.map((type) => {\n return [\n type,\n /* type === 'video' || type === 'screencast' ?\n {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} : */\n transceiverInit\n ] as const;\n });\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry((entry) => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find((transceiver) => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n\n /* if(this.isScreenSharingManager) {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n } */\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const mediaTrackType = fixMediaLineType(type);\n const trackIdx = tracks.findIndex((track) => track.kind === mediaTrackType);\n const track = trackIdx !== -1 ? tracks.splice(trackIdx, 1)[0] : undefined;\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch((err) => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach((track) => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[];\n private newLine: string[];\n\n constructor(private joiner = '\\r\\n') {\n this.lines = [];\n this.newLine = [];\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n\n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n// unsign => sign\nexport function toTelegramSource(source: number) {\n return 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 return source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n if(!array) return 0;\n\n const {length} = array;\n let total = 0;\n for(let i = 0; i < length; ++i) {\n total += array[i] * array[i];\n }\n const rms = Math.sqrt(total / length) / 255;\n\n return Math.min(1, rms * scale);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport wrapEmojiText from './wrapEmojiText';\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\n\nconst EMOJI_REG_EXP = new RegExp(`(^${emojiRegExp})`);\nexport default function getAbbreviation(str: string, onlyFirst = false) {\n if(!str) return '';\n const splitted = str.trim().split(' ');\n if(!splitted[0]) return '';\n\n const entities: MessageEntity.messageEntityEmoji[] = [];\n\n const firstEmojiMatch = splitted[0].match(EMOJI_REG_EXP);\n const first = firstEmojiMatch?.[0] || splitted[0][0];\n if(firstEmojiMatch) {\n entities.push(getEmojiEntityFromEmoji(first));\n }\n\n if(onlyFirst || splitted.length === 1) return wrapEmojiText(first, undefined, entities);\n\n const lastEmojiMatch = splitted[1].match(EMOJI_REG_EXP);\n const last = lastEmojiMatch?.[0] || splitted[1][0];\n if(lastEmojiMatch) {\n entities.push({\n ...getEmojiEntityFromEmoji(last),\n offset: last.length\n });\n }\n\n return wrapEmojiText(first + last, undefined, entities);\n}\n","import {MessageEntity} from '../../layer';\nimport {toCodePoints} from '../../vendor/emoji';\n\nexport default function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n}\n","import {EMAIL_REG_EXP} from '.';\n\nexport default function matchEmail(text: string) {\n return !text ? null : text.match(EMAIL_REG_EXP);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../rootScope';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapDraftText(text: string, options: Partial<{\n wrappingForPeerId: PeerId\n}> & Parameters[1] = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n let entities = options.entities;\n if(entities && !rootScope.premium && options.wrappingForPeerId !== rootScope.myId) {\n entities = entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n const fragment = wrapRichText(text, {\n ...options,\n entities,\n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n\n return fragment;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport parseEntities from './parseEntities';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapEmojiText(text: string, isDraft = false, entities?: MessageEntity[]) {\n if(!text) return wrapRichText('');\n\n entities ??= parseEntities(text).filter((e) => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n}\n","export default function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\n}\n","import IS_EMOJI_SUPPORTED from './emojiSupport';\n\nexport type EMOJI_VERSION = '' | '14';\n\nconst EMOJI_VERSIONS_SUPPORTED: {\n [v in EMOJI_VERSION]: boolean\n} = {} as any;\n\n// Thanks to WebZ for the detect\nfunction isEmojiSupported(emoji: string) {\n const ALLOWABLE_CALCULATION_ERROR_SIZE = 5;\n const inlineEl = document.createElement('span');\n inlineEl.classList.add('emoji');\n document.body.appendChild(inlineEl);\n\n inlineEl.innerText = emoji; // Emoji from 14.0 version\n const newEmojiWidth = inlineEl.offsetWidth;\n inlineEl.innerText = '❤️'; // Emoji from 1.0 version\n const legacyEmojiWidth = inlineEl.offsetWidth;\n\n document.body.removeChild(inlineEl);\n\n return Math.abs(newEmojiWidth - legacyEmojiWidth) < ALLOWABLE_CALCULATION_ERROR_SIZE;\n}\n\nif(IS_EMOJI_SUPPORTED) {\n EMOJI_VERSIONS_SUPPORTED[''] = true;\n\n const a: [keyof typeof EMOJI_VERSIONS_SUPPORTED, string][] = [\n ['14', '🫱🏻']\n ];\n\n a.forEach(([version, emoji]) => {\n EMOJI_VERSIONS_SUPPORTED[version] = isEmojiSupported(emoji);\n });\n}\n\nexport default EMOJI_VERSIONS_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../../environment/emojiVersionsSupport';\nimport {SITE_HASHTAGS} from '.';\nimport {EmojiVersions} from '../../config/emoji';\nimport IS_EMOJI_SUPPORTED from '../../environment/emojiSupport';\nimport buildURLHash from '../../helpers/buildURLHash';\nimport copy from '../../helpers/object/copy';\nimport encodeEntities from '../../helpers/string/encodeEntities';\nimport {MessageEntity} from '../../layer';\nimport encodeSpoiler from './encodeSpoiler';\nimport parseEntities from './parseEntities';\nimport setBlankToAnchor from './setBlankToAnchor';\nimport wrapUrl from './wrapUrl';\nimport EMOJI_VERSIONS_SUPPORTED from '../../environment/emojiVersionsSupport';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport IS_CUSTOM_EMOJI_SUPPORTED from '../../environment/customEmojiSupport';\nimport rootScope from '../rootScope';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport wrapSticker, {videosCache} from '../../components/wrappers/sticker';\nimport RLottiePlayer, {getLottiePixelRatio} from '../rlottie/rlottiePlayer';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport LazyLoadQueue from '../../components/lazyLoadQueue';\nimport {Awaited} from '../../types';\nimport {MediaSize} from '../../helpers/mediaSize';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport {getMiddleware, Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport BOM from '../../helpers/string/bom';\nimport framesCache from '../../helpers/framesCache';\n\nconst resizeObserver = new ResizeObserver((entries) => {\n for(const entry of entries) {\n const renderer = entry.target.parentElement as CustomEmojiRendererElement;\n renderer.setDimensionsFromRect(entry.contentRect);\n }\n});\n\nconst globalLazyLoadQueue = new LazyLoadQueue();\n\nexport class CustomEmojiElement extends HTMLElement {\n public elements: CustomEmojiElements;\n public renderer: CustomEmojiRendererElement;\n public player: RLottiePlayer | HTMLVideoElement;\n public paused: boolean;\n public syncedPlayer: SyncedPlayer;\n public clean: boolean;\n public lastChildWas: Node;\n // public docId: DocId;\n public placeholder: HTMLImageElement;\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.paused = true;\n this.classList.add('custom-emoji');\n }\n\n public get docId() {\n return this.dataset.docId;\n }\n\n public static create(docId: DocId) {\n const element = new CustomEmojiElement();\n // element.docId = docId;\n element.dataset.docId = '' + docId;\n return element;\n }\n\n public get isConnected() {\n return this.placeholder?.isConnected ?? super.isConnected;\n }\n\n public connectedCallback() {\n // if(this.isConnected) {\n // return;\n // }\n\n if(this.player) {\n animationIntersector.addAnimation(this, this.renderer.animationGroup);\n }\n\n // this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected) { // prepend on sibling can invoke disconnectedCallback\n return;\n }\n\n this.clear();\n }\n\n public clear(replaceChildren = true) {\n if(this.clean) {\n return;\n }\n\n // if(this.docId === '5399836826758290421') {\n // console.log('clear', this, this.isConnected);\n // }\n\n this.clean = true;\n this.pause();\n\n const {syncedPlayer} = this;\n if(syncedPlayer) {\n syncedPlayer.pausedElements.delete(this);\n }\n\n this.middlewareHelper?.clean();\n\n if(this.renderer) {\n const elements = this.renderer.customEmojis.get(this.docId);\n if(elements?.delete(this) && !elements.size) {\n this.renderer.customEmojis.delete(this.docId);\n this.renderer.playersSynced.delete(elements);\n }\n\n if(replaceChildren) {\n if(this.renderer.isSelectable) {\n this.replaceChildren(createCustomFiller(true));\n } else {\n // otherwise https://bugs.chromium.org/p/chromium/issues/detail?id=1144736#c27 will happen\n this.replaceChildren();\n }\n }\n }\n\n if(this.player) {\n animationIntersector.removeAnimationByPlayer(this);\n }\n\n if(globalLazyLoadQueue) {\n globalLazyLoadQueue.delete({div: this});\n }\n\n /* this.disconnectedCallback = */this.elements =\n this.renderer =\n this.player =\n this.syncedPlayer =\n undefined;\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n\n if(this.player instanceof HTMLVideoElement && !this.syncedPlayer) {\n this.renderer.lastPausedVideo = this.player;\n this.player.pause();\n }\n\n if(this.syncedPlayer && !this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.add(this);\n\n if(this.syncedPlayer.player && this.syncedPlayer.pausedElements.size === this.syncedPlayer.middlewares.size) {\n this.syncedPlayer.player.pause();\n }\n }\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n\n if(this.player instanceof HTMLVideoElement) {\n this.player.currentTime = this.renderer.lastPausedVideo?.currentTime || this.player.currentTime;\n this.player.play().catch(noop);\n }\n\n if(this.syncedPlayer && this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.delete(this);\n\n if(this.syncedPlayer.pausedElements.size !== this.syncedPlayer.middlewares.size) {\n this.player.play();\n }\n }\n }\n\n public remove() {\n this.clear();\n // this.elements = this.renderer = this.player = undefined;\n }\n\n public get autoplay() {\n return true;\n }\n}\n\ntype CustomEmojiElements = Set;\n\nexport class CustomEmojiRendererElement extends HTMLElement {\n public canvas: HTMLCanvasElement;\n public context: CanvasRenderingContext2D;\n\n public playersSynced: Map;\n public clearedElements: WeakSet;\n public customEmojis: Parameters[1]['customEmojis'];\n public lastPausedVideo: HTMLVideoElement;\n\n public lastRect: DOMRect;\n public isDimensionsSet: boolean;\n\n public animationGroup: AnimationItemGroup;\n public size: MediaSize;\n\n public isSelectable: boolean;\n public isCanvasClean: boolean;\n\n public ignoreSettingDimensions: boolean;\n\n public forceRenderAfterSize: boolean;\n\n constructor() {\n super();\n\n this.classList.add('custom-emoji-renderer');\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('custom-emoji-canvas');\n this.context = this.canvas.getContext('2d');\n this.append(this.canvas);\n\n this.playersSynced = new Map();\n this.clearedElements = new WeakSet();\n this.customEmojis = new Map();\n\n this.animationGroup = 'EMOJI';\n this.isCanvasClean = false;\n }\n\n public connectedCallback() {\n if(emojiRenderers.has(this)) {\n return;\n }\n\n // this.setDimensions();\n // animationIntersector.addAnimation(this, this.animationGroup);\n resizeObserver.observe(this.canvas);\n emojiRenderers.add(this);\n\n this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected) {\n return;\n }\n\n resizeObserver.unobserve(this.canvas);\n\n this.customEmojis.forEach((elements) => {\n elements.forEach((element) => {\n element.clear();\n });\n });\n\n emojiRenderers.delete(this);\n this.playersSynced.clear();\n this.middlewareHelper?.clean();\n this.customEmojis.clear();\n\n this.disconnectedCallback =\n this.lastPausedVideo =\n undefined;\n }\n\n public getOffsets(offsetsMap: Map = new Map()) {\n if(!this.playersSynced.size) {\n return offsetsMap;\n }\n\n const overflowElement = findUpClassName(this, 'scrollable') || this.offsetParent as HTMLElement;\n if(!overflowElement) {\n return offsetsMap;\n }\n\n const overflowRect = overflowElement.getBoundingClientRect();\n const rect = this.getBoundingClientRect();\n\n for(const elements of this.playersSynced.keys()) {\n const elementsArr = Array.from(elements);\n const placeholders = this.isSelectable ? elementsArr.map((element) => element.placeholder) : elementsArr;\n const {visible} = getViewportSlice({\n overflowElement,\n overflowRect,\n elements: placeholders,\n extraSize: this.size.height * 2.5 // let's add some margin\n });\n\n const offsets = visible.map(({rect: elementRect}) => {\n const top = elementRect.top - rect.top;\n const left = elementRect.left - rect.left;\n return {top, left, width: elementRect.width};\n });\n\n if(offsets.length) {\n offsetsMap.set(elements, offsets);\n }\n }\n\n // const rect = this.getBoundingClientRect();\n // const visibleRect = getVisibleRect(this, overflowElement, undefined, rect);\n // const minTop = visibleRect ? visibleRect.rect.top - this.size.height : 0;\n // const maxTop = Infinity;\n // for(const elements of this.playersSynced.keys()) {\n // const offsets = elements.map((element) => {\n // const elementRect = element.getBoundingClientRect();\n // const top = elementRect.top - rect.top;\n // const left = elementRect.left - rect.left;\n // return top >= minTop && (top + elementRect.height) <= maxTop ? {top, left} : undefined;\n // }).filter(Boolean);\n\n // if(offsets.length) {\n // offsetsMap.set(elements, offsets);\n // }\n // }\n\n return offsetsMap;\n }\n\n public clearCanvas() {\n if(this.isCanvasClean) {\n return;\n }\n\n const {context, canvas} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n this.isCanvasClean = true;\n }\n\n public render(offsetsMap: ReturnType) {\n const {context, canvas, isDimensionsSet} = this;\n if(!isDimensionsSet) {\n this.setDimensionsFromRect(undefined, false);\n }\n\n this.isCanvasClean = false;\n\n const {width, height, dpr} = canvas;\n for(const [elements, offsets] of offsetsMap) {\n const player = this.playersSynced.get(elements);\n const frame = syncedPlayersFrames.get(player) || (player instanceof HTMLVideoElement ? player : undefined);\n if(!frame) {\n continue;\n }\n\n const isImageData = frame instanceof ImageData;\n let frameWidth: number, frameHeight: number;\n if(player instanceof HTMLVideoElement) {\n frameWidth = this.size.width * dpr;\n frameHeight = this.size.height * dpr;\n } else {\n frameWidth = frame.width;\n frameHeight = frame.height;\n }\n\n // ! check performance of scaling\n const elementWidth = Math.round(offsets[0].width * dpr);\n if(elementWidth !== frameWidth) {\n // if(this.size.width === 36) {\n // console.warn('different width', elementWidth, frameWidth, this);\n // }\n\n frameWidth = elementWidth;\n frameHeight = elementWidth;\n }\n\n const maxTop = height - frameHeight;\n const maxLeft = width - frameWidth;\n\n if(!this.clearedElements.has(elements) && !this.isSelectable) {\n if(this.isSelectable/* && false */) {\n elements.forEach((element) => {\n element.lastChildWas ??= element.lastChild;\n replaceContent(element, element.firstChild);\n });\n } else {\n elements.forEach((element) => {\n element.replaceChildren();\n });\n }\n\n this.clearedElements.add(elements);\n }\n\n offsets.forEach(({top, left}) => {\n top = Math.round(top * dpr), left = Math.round(left * dpr);\n if(left < 0 ||/* top > maxTop || */left > maxLeft) {\n return;\n }\n\n if(isImageData) {\n context.putImageData(frame, left, top);\n } else {\n // context.clearRect(left, top, width, height);\n context.drawImage(frame, left, top, frameWidth, frameHeight);\n }\n });\n }\n }\n\n public checkForAnyFrame() {\n for(const player of this.playersSynced.values()) {\n if(syncedPlayersFrames.has(player) || player instanceof HTMLVideoElement) {\n return true;\n }\n }\n\n return false;\n }\n\n public remove() {\n super.remove();\n // this.canvas.remove();\n }\n\n // public setDimensions() {\n // const {canvas} = this;\n // sequentialDom.mutateElement(canvas, () => {\n // const rect = canvas.getBoundingClientRect();\n // this.setDimensionsFromRect(rect);\n // });\n // }\n\n public setDimensionsFromRect(rect: DOMRect = this.lastRect, forceRenderAfter = true) {\n const {canvas} = this;\n const {dpr} = canvas;\n\n if(this.lastRect !== rect) {\n this.lastRect = rect;\n }\n\n if(!rect || !dpr || this.ignoreSettingDimensions) {\n return;\n }\n\n const {width, height} = rect;\n // if(this.isSelectable) {\n // height = this.parentElement.scrollHeight || height;\n\n // this.style.width = width + 'px';\n // this.style.height = height + 'px';\n // }\n\n const newWidth = Math.floor(Math.round(width * dpr));\n const newHeight = Math.floor(Math.round(height * dpr));\n if(canvas.width === newWidth && canvas.height === newHeight) {\n return;\n }\n\n canvas.width = newWidth;\n canvas.height = newHeight;\n this.isDimensionsSet = true;\n this.isCanvasClean = true;\n\n if(this.forceRenderAfterSize || (this.isSelectable && forceRenderAfter)) {\n this.forceRenderAfterSize = undefined;\n this.forceRender();\n }\n }\n\n public forceRender() {\n if(!this.isDimensionsSet) {\n return;\n }\n\n if(!renderEmojis(new Set([this]))) {\n this.clearCanvas();\n }\n }\n\n public add(\n addCustomEmojis: Parameters[1]['customEmojis'],\n lazyLoadQueue?: LazyLoadQueue | false,\n onlyThumb?: boolean,\n withThumb?: boolean\n ) {\n const renderer = this;\n\n addCustomEmojis.forEach((addElements, docId) => { // prevent adding old elements\n let elements = this.customEmojis.get(docId);\n if(!elements) this.customEmojis.set(docId, elements = new Set());\n else this.clearedElements.delete(elements);\n\n for(const el of addElements) {\n if(elements.has(el)) {\n addElements.delete(el);\n } else {\n el.clean = false;\n el.renderer = renderer;\n el.elements = elements;\n el.middlewareHelper = this.middlewareHelper.get().create();\n elements.add(el);\n\n if(el.lastChildWas && !el.lastChildWas.parentNode) {\n el.append(el.lastChildWas);\n }\n }\n }\n\n if(!addElements.size) {\n addCustomEmojis.delete(docId);\n }\n });\n\n if(!addCustomEmojis.size) {\n return;\n }\n\n const usingOwnQueue = !!(!lazyLoadQueue && lazyLoadQueue !== false && globalLazyLoadQueue);\n\n const docIds = Array.from(addCustomEmojis.keys());\n\n const managers = rootScope.managers;\n const middleware = this.middlewareHelper.get();\n const size = this.size;\n\n const loadPromise = managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then((docs) => {\n if(middleware && !middleware()) return;\n\n const loadPromises: Promise[] = [];\n const wrap = (doc: MyDocument, _loadPromises?: Promise[]) => {\n const docId = doc.id;\n const newElements = addCustomEmojis.get(docId);\n const customEmojis = renderer.customEmojis.get(docId);\n const isLottie = doc.sticker === 2;\n const isStatic = doc.mime_type === 'video/webm' && !IS_WEBM_SUPPORTED;\n const willHaveSyncedPlayer = (isLottie || (doc.sticker === 3 && this.isSelectable)) && !onlyThumb && !isStatic;\n\n const loadPromises: Promise[] = [];\n const newElementsArray = Array.from(newElements);\n const promise = wrapSticker({\n div: newElementsArray,\n doc,\n width: size.width,\n height: size.height,\n loop: true,\n play: CUSTOM_EMOJI_INSTANT_PLAY,\n managers,\n isCustomEmoji: true,\n group: 'none',\n loadPromises,\n middleware,\n exportLoad: usingOwnQueue || lazyLoadQueue === false ? 2 : 1, // 2 - export load always, 1 - do not export load if cached static\n needFadeIn: false,\n loadStickerMiddleware: willHaveSyncedPlayer && middleware ? middleware.create().get(() => {\n // if(syncedPlayers.get(key) !== syncedPlayer) {\n // return false;\n // }\n\n // let good = false;\n // for(const middleware of syncedPlayer.middlewares) {\n // if(middleware()) {\n // good = true;\n // break;\n // }\n // }\n\n // return good;\n return !!syncedPlayer.middlewares.size;\n }) : undefined,\n static: isStatic,\n onlyThumb,\n withThumb: withThumb ?? (renderer.clearedElements.has(customEmojis) ? false : undefined),\n syncedVideo: this.isSelectable\n });\n\n if(_loadPromises) {\n promise.then(() => _loadPromises.push(...loadPromises));\n }\n\n const addition: {\n onRender?: (_p: Awaited['render']>) => Promise,\n elements: typeof newElements\n } = {\n elements: newElements\n };\n\n if(doc.sticker === 1 || onlyThumb || isStatic) {\n if(this.isSelectable) {\n addition.onRender = () => Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n newElementsArray.forEach((element) => {\n const {placeholder} = element;\n placeholder.src = (element.firstElementChild as HTMLImageElement).src;\n });\n });\n }\n\n return promise.then((res) => ({...res, ...addition}));\n }\n\n // eslint-disable-next-line prefer-const\n addition.onRender = (_p) => Promise.all(loadPromises).then(() => {\n if((middleware && !middleware()) || !doc.animated) {\n return;\n }\n\n const players = Array.isArray(_p) ? _p as HTMLVideoElement[] : [_p as RLottiePlayer];\n const player = Array.isArray(players) ? players[0] : players;\n assumeType(player);\n newElementsArray.forEach((element, idx) => {\n const player = players[idx] || players[0];\n element.player = player;\n\n if(syncedPlayer) {\n element.syncedPlayer = syncedPlayer;\n if(element.paused) {\n element.syncedPlayer.pausedElements.add(element);\n } else if(player.paused) {\n player.play();\n }\n }\n\n if(element.isConnected) {\n animationIntersector.addAnimation(element, element.renderer.animationGroup);\n }\n });\n\n if(player instanceof RLottiePlayer || (player instanceof HTMLVideoElement && this.isSelectable)) {\n syncedPlayer.player = player;\n renderer.playersSynced.set(customEmojis, player);\n }\n\n if(player instanceof RLottiePlayer) {\n player.group = renderer.animationGroup;\n\n player.overrideRender ??= (frame) => {\n syncedPlayersFrames.set(player, frame);\n // frames.set(containers, frame);\n };\n } else if(player instanceof HTMLVideoElement) {\n // player.play();\n\n // const cache = framesCache.getCache(key);\n // let {width, height} = renderer.size;\n // width *= dpr;\n // height *= dpr;\n\n // const onFrame = (frame: ImageBitmap | HTMLCanvasElement) => {\n // topFrames.set(player, frame);\n // player.requestVideoFrameCallback(callback);\n // };\n\n // let frameNo = -1, lastTime = 0;\n // const callback: VideoFrameRequestCallback = (now, metadata) => {\n // const time = player.currentTime;\n // if(lastTime > time) {\n // frameNo = -1;\n // }\n\n // const _frameNo = ++frameNo;\n // lastTime = time;\n // // const frameNo = Math.floor(player.currentTime * 1000 / CUSTOM_EMOJI_FRAME_INTERVAL);\n // // const frameNo = metadata.presentedFrames;\n // const imageBitmap = cache.framesNew.get(_frameNo);\n\n // if(imageBitmap) {\n // onFrame(imageBitmap);\n // } else if(IS_IMAGE_BITMAP_SUPPORTED) {\n // createImageBitmap(player, {resizeWidth: width, resizeHeight: height}).then((imageBitmap) => {\n // cache.framesNew.set(_frameNo, imageBitmap);\n // if(frameNo === _frameNo) onFrame(imageBitmap);\n // });\n // } else {\n // const canvas = document.createElement('canvas');\n // const context = canvas.getContext('2d');\n // canvas.width = width;\n // canvas.height = height;\n // context.drawImage(player, 0, 0);\n // cache.framesNew.set(_frameNo, canvas);\n // onFrame(canvas);\n // }\n // };\n\n // // player.requestVideoFrameCallback(callback);\n // // setInterval(callback, CUSTOM_EMOJI_FRAME_INTERVAL);\n }\n\n if(willHaveSyncedPlayer) {\n const dpr = getLottiePixelRatio(this.size.width, this.size.height);\n renderer.canvas.dpr = dpr;\n setRenderInterval();\n }\n });\n\n let syncedPlayer: SyncedPlayer;\n const key = [docId, size.width, size.height].join('-');\n if(willHaveSyncedPlayer) {\n syncedPlayer = syncedPlayers.get(key);\n if(!syncedPlayer) {\n syncedPlayer = {\n player: undefined,\n middlewares: new Set(),\n pausedElements: new Set(),\n key\n };\n\n syncedPlayers.set(key, syncedPlayer);\n }\n\n for(const element of newElements) {\n const middleware = element.middlewareHelper.get();\n syncedPlayer.middlewares.add(middleware);\n middleware.onClean(() => {\n syncedPlayer.middlewares.delete(middleware);\n\n if(!syncedPlayer.middlewares.size) {\n if(syncedPlayer.player) {\n const frame = syncedPlayersFrames.get(syncedPlayer.player);\n if(frame) {\n (frame as ImageBitmap).close?.();\n syncedPlayersFrames.delete(syncedPlayer.player);\n }\n\n syncedPlayersFrames.delete(syncedPlayer.player);\n if(syncedPlayer.player instanceof RLottiePlayer) {\n syncedPlayer.player.overrideRender = noop;\n syncedPlayer.player.remove();\n } else if(syncedPlayer.player instanceof HTMLVideoElement) {\n const cacheName = framesCache.generateName('' + element.docId, 0, 0, undefined, undefined);\n delete videosCache[cacheName];\n }\n\n syncedPlayer.player = undefined;\n }\n\n if(syncedPlayers.get(syncedPlayer.key) === syncedPlayer && syncedPlayers.delete(syncedPlayer.key) && !syncedPlayers.size) {\n clearRenderInterval();\n }\n }\n });\n }\n }\n\n return promise.then((res) => ({...res, ...addition}));\n };\n\n const missing: DocId[] = [];\n const cachedPromises = docs.map((doc, idx) => {\n if(!doc) {\n missing.push(docIds[idx]);\n return;\n }\n\n return wrap(doc, loadPromises);\n }).filter(Boolean);\n\n const uncachedPromisesPromise = !missing.length ?\n Promise.resolve([] as typeof cachedPromises) :\n managers.appEmojiManager.getCustomEmojiDocuments(missing).then((docs) => {\n if(middleware && !middleware()) return [];\n return docs.filter(Boolean).map((doc) => wrap(doc));\n });\n\n const loadFromPromises = (promises: typeof cachedPromises) => {\n return Promise.all(promises).then((arr) => {\n const promises = arr.map(({load, onRender, elements}) => {\n if(!load) {\n return;\n }\n\n const l = () => load().then(onRender);\n\n if(usingOwnQueue) {\n elements.forEach((element) => {\n globalLazyLoadQueue.push({\n div: element,\n load: () => {\n elements.forEach((element) => {\n globalLazyLoadQueue.delete({div: element});\n });\n\n return l();\n }\n });\n });\n } else {\n return l();\n }\n });\n\n return Promise.all(promises);\n });\n };\n\n const load = () => {\n if(middleware && !middleware()) return;\n const cached = loadFromPromises(cachedPromises);\n const uncached = uncachedPromisesPromise.then((promises) => loadFromPromises(promises));\n return Promise.all([cached, uncached]);\n };\n\n if(lazyLoadQueue) {\n lazyLoadQueue.push({\n div: renderer.canvas,\n load\n });\n } else {\n load();\n }\n\n return Promise.all(cachedPromises).then(() => Promise.all(loadPromises)).then(() => {});\n });\n\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n\n return loadPromise;\n }\n\n public static create(options: CustomEmojiRendererElementOptions) {\n const renderer = new CustomEmojiRendererElement();\n renderer.animationGroup = options.animationGroup;\n renderer.size = options.customEmojiSize || mediaSizes.active.customEmoji;\n renderer.isSelectable = options.isSelectable;\n if(options.wrappingDraft) {\n renderer.contentEditable = 'false';\n renderer.style.height = 'inherit';\n }\n // const middleware = () => !!renderer.disconnectedCallback && (!options.middleware || options.middleware());\n let middleware = options.middleware;\n if(middleware) {\n renderer.middlewareHelper = middleware.create();\n middleware = renderer.middlewareHelper.get();\n middleware.onDestroy(() => {\n renderer.disconnectedCallback?.();\n });\n } else {\n renderer.middlewareHelper = getMiddleware();\n }\n\n return renderer;\n }\n}\n\ntype CustomEmojiRenderer = CustomEmojiRendererElement;\ntype SyncedPlayer = {\n player: RLottiePlayer | HTMLVideoElement,\n middlewares: Set,\n pausedElements: Set,\n key: string\n};\ntype CustomEmojiFrame = Parameters[0] | HTMLVideoElement;\n\nconst CUSTOM_EMOJI_INSTANT_PLAY = true; // do not wait for animationIntersector\nlet emojiRenderInterval: number;\nconst emojiRenderers: Set = new Set();\nconst syncedPlayers: Map = new Map();\nconst syncedPlayersFrames: Map = new Map();\nexport const renderEmojis = (renderers = emojiRenderers) => {\n const r = Array.from(renderers);\n const t = r.filter((r) => r.isConnected && r.checkForAnyFrame() && !r.ignoreSettingDimensions);\n if(!t.length) {\n return false;\n }\n\n const o = t.map((renderer) => {\n const paused = [...renderer.playersSynced.values()].reduce((acc, v) => acc + +!!v.paused, 0);\n if(renderer.playersSynced.size === paused) {\n return;\n }\n\n const offsets = renderer.getOffsets();\n if(offsets.size) {\n return [renderer, offsets] as const;\n }\n }).filter(Boolean);\n\n for(const [renderer] of o) {\n renderer.clearCanvas();\n }\n\n for(const [renderer, offsets] of o) {\n renderer.render(offsets);\n }\n\n return true;\n};\nconst CUSTOM_EMOJI_FPS = 60;\nconst CUSTOM_EMOJI_FRAME_INTERVAL = 1000 / CUSTOM_EMOJI_FPS;\nconst setRenderInterval = () => {\n if(emojiRenderInterval) {\n return;\n }\n\n emojiRenderInterval = window.setInterval(renderEmojis, CUSTOM_EMOJI_FRAME_INTERVAL);\n renderEmojis();\n};\nconst clearRenderInterval = () => {\n if(!emojiRenderInterval) {\n return;\n }\n\n clearInterval(emojiRenderInterval);\n emojiRenderInterval = undefined;\n};\n\n(window as any).syncedPlayers = syncedPlayers;\n(window as any).emojiRenderers = emojiRenderers;\n\ncustomElements.define('custom-emoji-element', CustomEmojiElement);\ncustomElements.define('custom-emoji-renderer-element', CustomEmojiRendererElement);\n\ntype CustomEmojiRendererElementOptions = Partial<{\n loadPromises: Promise[],\n middleware: Middleware,\n lazyLoadQueue: LazyLoadQueue,\n customEmojiSize: MediaSize,\n animationGroup: AnimationItemGroup\n customEmojiRenderer: CustomEmojiRendererElement,\n\n isSelectable: boolean,\n wrappingDraft: boolean\n}>;\n\n/**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\nexport default function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n // mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n isSelectable: boolean,\n\n contextHashtag?: string,\n\n // ! recursive, do not provide\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean,\n customEmojis?: Map,\n customWraps?: Set,\n}> & CustomEmojiRendererElementOptions = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const wrapSomething = (wrapElement: HTMLElement, noFiller?: boolean) => {\n const element = document.createElement('span');\n // element.append(BOM, a, BOM);\n if(options.wrappingDraft) {\n element.contentEditable = 'false';\n }\n // element.style.display = 'inline-block';\n element.classList.add('input-something');\n element.append(/* BOM, */wrapElement);\n\n (lastElement || fragment).append(element);\n\n wrapElement.classList.add('input-selectable');\n // if(wrapElement instanceof HTMLImageElement) {\n // element.prepend(f());\n // } else {\n !noFiller && wrapElement.append(createCustomFiller(true));\n // }\n\n customWraps.add(element);\n\n return element;\n };\n\n options.isSelectable ||= options.wrappingDraft;\n\n const customEmojis = options.customEmojis ??= new Map() as Map;\n const customWraps = options.customWraps ??= new Set();\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n // entity.length = entity.offset + entity.length - textLength;\n entity.length = textLength - entity.offset;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement,\n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontWeight = 'bold';\n element.style.fontFamily = 'markup-bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontStyle = 'italic';\n element.style.fontFamily = 'markup-italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: line-through;`;\n element.style.fontFamily = 'markup-strikethrough';\n } else/* if(!options.noTextFormat) */ {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: underline;`;\n element.style.fontFamily = 'markup-underline';\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n\n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n element.style.fontFamily = 'markup-monospace';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n\n break;\n }\n\n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n\n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityCustomEmoji': {\n if(!IS_CUSTOM_EMOJI_SUPPORTED) {\n break;\n }\n\n while(nextEntity?._ === 'messageEntityEmoji' && nextEntity.offset < endOffset) {\n ++nasty.i;\n nasty.lastEntity = nextEntity;\n nasty.usedLength += nextEntity.length;\n nextEntity = entities[nasty.i + 1];\n }\n\n const customEmojiElement = element = CustomEmojiElement.create(entity.document_id);\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) customEmojis.set(docId, set = new Set());\n set.add(customEmojiElement);\n customEmojiElement.dataset.stickerEmoji = fullEntityText;\n\n if(options.wrappingDraft) {\n element = document.createElement('img');\n (element as HTMLImageElement).alt = fullEntityText;\n for(const i in customEmojiElement.dataset) {\n element.dataset[i] = customEmojiElement.dataset[i];\n }\n (element as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = element as HTMLImageElement;\n element.classList.add('custom-emoji-placeholder');\n (element as HTMLImageElement).src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC';\n property = 'alt';\n break;\n }\n\n if(options.isSelectable) {\n // const s = document.createElement('span');\n // s.append(fullEntityText);\n // element.append(s);\n // element.textContent = fullEntityText;\n // element.textContent = 'a';\n // element.contentEditable = 'false';\n\n // const x = f();\n // x.style.display = 'inline-block';\n // x.contentEditable = 'false';\n // (lastElement || fragment).append(BOM);\n // (lastElement || fragment).append(x);\n\n element = wrapSomething(element, !!options.customEmojiRenderer);\n\n // const a = element;\n // element = document.createElement('span');\n // element.append(BOM, a, BOM);\n // element.contentEditable = 'false';\n }\n\n property = 'alt';\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 as EMOJI_VERSION];\n if(emojiData.hasOwnProperty(entity.unicode) && !EMOJI_VERSIONS_SUPPORTED[version as EMOJI_VERSION]) {\n isSupported = false;\n break;\n }\n }\n }\n }\n\n // if(!(options.wrappingDraft && isSupported)) { // * fix safari emoji\n if(!isSupported) { // no wrapping needed\n // if(isSupported) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n element = document.createElement('img');\n (element as HTMLImageElement).src = `assets/img/emoji/${entity.unicode}.png`;\n property = 'alt';\n element.className = 'emoji';\n\n // if(options.isSelectable) {\n // usedText = true;\n // (element as HTMLImageElement).alt = partText;\n // element = wrapSomething(element);\n // }\n\n // const a = element;\n // a.contentEditable = 'false';\n // element = document.createElement('span');\n // element.append(a);\n // element.contentEditable = 'false';\n // }\n // } else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n element = document.createElement('span');\n element.className = 'emoji';\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!isSupported) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n\n case 'messageEntityCaret': {\n element = document.createElement('span');\n element.className = 'composer-sel';\n break;\n }\n\n // case 'messageEntityLinebreak': {\n // if(options.noLinebreaks) {\n // insertPart(entity, ' ');\n // } else {\n // insertPart(entity, '
');\n // }\n\n // break;\n // }\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || fullEntityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n if(nextEntity?._ === 'messageEntityUrl' &&\n nextEntity.length === entity.length &&\n nextEntity.offset === entity.offset) {\n nasty.lastEntity = nextEntity;\n ++nasty.i;\n }\n\n if(url !== fullEntityText) {\n masked = true;\n }\n } else {\n // inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') ?\n url :\n `javascript:electronHelpers.openExternal('${url}');`;\n\n element = document.createElement('a');\n element.className = 'anchor-url';\n (element as HTMLAnchorElement).href = href;\n\n if(!(currentContext || typeof electronHelpers !== 'undefined')) {\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n if(onclick) {\n element.setAttribute('onclick', onclick + '(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('mailto:' + fullEntityText);\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n break;\n }\n\n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && SITE_HASHTAGS[contextSite];\n if(contextUrl) {\n const hashtag = fullEntityText.slice(1);\n element = document.createElement('a');\n element.className = 'anchor-hashtag';\n (element as HTMLAnchorElement).href = contextUrl.replace('{1}', encodeURIComponent(hashtag));\n if(contextExternal) {\n setBlankToAnchor(element as HTMLAnchorElement);\n } else {\n element.setAttribute('onclick', 'searchByHashtag(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = buildURLHash('' + entity.user_id);\n element.className = 'follow';\n element.dataset.follow = '' + entity.user_id;\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const username = fullEntityText.slice(1);\n\n const {url, onclick} = wrapUrl('t.me/' + username);\n\n element = document.createElement('a');\n element.className = 'mention';\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n // insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const encoded = encodeSpoiler(nasty.text, entity);\n nasty.text = encoded.text;\n partText = encoded.entityText;\n if(endPartOffset !== endOffset) {\n nasty.usedLength += endOffset - endPartOffset;\n }\n let n: MessageEntity;\n for(; n = entities[nasty.i + 1], n && n.offset < endOffset;) {\n // nasty.usedLength += n.length;\n ++nasty.i;\n nasty.lastEntity = n;\n nextEntity = entities[nasty.i + 1];\n }\n } else if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'spoiler';\n element.style.fontFamily = 'markup-spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n\n container[`on${CLICK_EVENT_NAME}`] = (window as any).onSpoilerClick;\n }\n\n break;\n }\n }\n\n if(!usedText && partText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentNode) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < endOffset) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentNode) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(nasty.usedLength <= endOffset) {\n if(nasty.usedLength < endOffset) {\n (element || fragment).append(nasty.text.slice(nasty.usedLength, endOffset));\n nasty.usedLength = endOffset;\n }\n\n lastElement = fragment;\n nasty.lastEntity = undefined;\n } else if(entity.length > partText.length && element) {\n lastElement = element;\n } else {\n lastElement = fragment;\n }\n\n if(options.voodoo) {\n return fragment;\n }\n }\n\n if(nasty.lastEntity) {\n nasty.usedLength = nasty.lastEntity.offset + nasty.lastEntity.length;\n }\n\n if(nasty.usedLength < textLength) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength));\n }\n\n if((!options.wrappingDraft || options.customEmojiRenderer) && customEmojis.size) {\n let renderer = options.customEmojiRenderer;\n if(!renderer) {\n renderer = CustomEmojiRendererElement.create(options);\n fragment.prepend(renderer);\n }\n\n const loadPromise = renderer.add(customEmojis, options.lazyLoadQueue, options.wrappingDraft);\n options.loadPromises?.push(loadPromise);\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n }\n\n if(customWraps.size) {\n insertCustomFillers(customWraps);\n }\n\n return fragment;\n}\n\nexport const createCustomFiller = (notFiller?: boolean) => {\n const x = document.createElement('span');\n x.classList.add(notFiller ? 'input-filler2' : 'input-filler');\n x.textContent = BOM;\n return x;\n};\n\nexport function isCustomFillerNeededBySiblingNode(node: ChildNode) {\n if(\n // !node?.textContent ||\n // node.textContent.endsWith('\\n') ||\n node?.textContent !== BOM ||\n (node as HTMLElement)?.getAttribute?.('contenteditable') === 'false'\n ) {\n // if(!node || (node as HTMLElement).firstElementChild || node.textContent.endsWith('\\n')) {\n if(!node || node.textContent !== BOM || (node as HTMLElement).firstElementChild) {\n return 2;\n } else if(node.nodeType === node.ELEMENT_NODE) {\n return 1;\n }/* else if(node.nodeType === node.TEXT_NODE && !node.nodeValue) {\n (node as CharacterData).insertData(0, BOM);\n } */\n }\n\n return 0;\n}\n\nexport function insertCustomFillers(elements: Iterable) {\n const check = (element: HTMLElement, node: ChildNode, method: 'before' | 'after') => {\n const needed = isCustomFillerNeededBySiblingNode(node);\n if(needed === 2) {\n element[method](createCustomFiller());\n } else if(needed === 1) {\n node.appendChild(document.createTextNode(BOM));\n }\n };\n\n for(const element of elements) {\n const {previousSibling, nextSibling} = element;\n check(element, previousSibling, 'before');\n check(element, nextSibling, 'after');\n }\n}\n\n(window as any).wrapRichText = wrapRichText;\n","// just for the future\nexport default function buildURLHash(str: string) {\n return '#' + encodeURIComponent(str);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n\n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.postMessage({\n queryMethod: args.shift(),\n queryMethodArguments: args\n }, CAN_USE_TRANSFERABLES ? transfer: undefined);\n }\n}\n","const IS_WEB_ASSEMBLY_SUPPORTED = typeof(WebAssembly) !== 'undefined';\n\nexport default IS_WEB_ASSEMBLY_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\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport pause from '../../helpers/schedulers/pause';\r\nimport {logger, LogTypes} from '../logger';\r\nimport RLottiePlayer, {RLottieOptions} from './rlottiePlayer';\r\nimport QueryableWorker from './queryableWorker';\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\nimport IS_WEB_ASSEMBLY_SUPPORTED from '../../environment/webAssemblySupport';\r\nimport makeError from '../../helpers/makeError';\r\nimport App from '../../config/app';\r\n\r\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' |\r\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' |\r\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' |\r\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' |\r\n 'voice_outlined2' | 'voip_filled' | 'voice_mini';\r\n\r\nexport class LottieLoader {\r\n private loadPromise: Promise = !IS_WEB_ASSEMBLY_SUPPORTED ? Promise.reject() : undefined;\r\n private loaded = false;\r\n\r\n private workersLimit = App.threads;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n private playersByCacheName: {[cacheName: string]: Set} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogTypes.Error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el.includes(element)) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = new Worker(new URL('./rlottie.worker.ts', import.meta.url));\r\n const queryableWorker = this.workers[i] = new QueryableWorker(worker);\r\n\r\n queryableWorker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n queryableWorker.addEventListener('frame', this.onFrame);\r\n queryableWorker.addEventListener('loaded', this.onPlayerLoaded);\r\n queryableWorker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n }, {once: true});\r\n\r\n queryableWorker.addEventListener('workerError', (error) => {\r\n reject('rlottie load error: ' + error.message);\r\n this.loaded = false;\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n private makeAssetUrl(name: LottieAssetName) {\r\n return 'assets/tgs/' + name + '.json';\r\n }\r\n\r\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\r\n // (params as RLottieOptions).name = name;\r\n return this.loadAnimationFromURL(params, this.makeAssetUrl(name));\r\n }\r\n\r\n public loadAnimationDataFromURL(url: string): Promise {\r\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\r\n return this.loadPromise as any;\r\n }\r\n\r\n this.loadLottieWorkers();\r\n\r\n return fetch(url)\r\n .then((res) => {\r\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\r\n return res.arrayBuffer()\r\n .then((data) => apiManagerProxy.invokeCrypto('gzipUncompress', data))\r\n .then((arr) => blobConstruct(arr as Uint8Array, ''));\r\n } else {\r\n return res.blob();\r\n }\r\n });\r\n /* .then((str) => {\r\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n }\r\n\r\n public loadAnimationFromURLManually(name: LottieAssetName) {\r\n const url = this.makeAssetUrl(name);\r\n return this.loadAnimationDataFromURL(url).then((blob) => {\r\n return (params: Omit) => this.loadAnimationFromURLNext(blob, params, url);\r\n });\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit, url: string) {\r\n return this.loadAnimationDataFromURL(url).then((blob) => {\r\n return this.loadAnimationFromURLNext(blob, params, url);\r\n });\r\n }\r\n\r\n public loadAnimationFromURLNext(blob: Blob, params: Omit, url: string) {\r\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\r\n newParams.name ||= url;\r\n return this.loadAnimationWorker(newParams);\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer) {\r\n return Promise.race([\r\n /* new Promise((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise((resolve) => {\r\n player.addEventListener('firstFrame', resolve, {once: true});\r\n }),\r\n pause(2500)\r\n ]).then(() => player);\r\n }\r\n\r\n public async loadAnimationWorker(\r\n params: RLottieOptions,\r\n group: AnimationItemGroup = params.group || '',\r\n middleware?: () => boolean\r\n ): Promise {\r\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\r\n return this.loadPromise as any;\r\n }\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(middleware && !middleware()) {\r\n throw makeError('MIDDLEWARE');\r\n }\r\n\r\n if(params.sync) {\r\n const cacheName = RLottiePlayer.CACHE.generateName(params.name, params.width, params.height, params.color, params.toneIndex);\r\n const players = this.playersByCacheName[cacheName];\r\n if(players?.size) {\r\n return Promise.resolve(players.entries().next().value[0]);\r\n }\r\n }\r\n\r\n const containers = Array.isArray(params.container) ? params.container : [params.container];\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(containers[0].style.width);\r\n params.height = parseInt(containers[0].style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(containers, params);\r\n\r\n animationIntersector.addAnimation(player, group);\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const player = this.players[reqId];\r\n if(!player) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n player.onLoad(frameCount, fps);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => {\r\n const player = this.players[reqId];\r\n if(!player) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n if(player.clamped !== undefined && frame instanceof Uint8ClampedArray) {\r\n player.clamped = frame;\r\n }\r\n\r\n player.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const player = this.players[reqId];\r\n if(!player) {\r\n return;\r\n }\r\n\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(player.el[0]);\r\n animations.forEach((animation) => {\r\n animationIntersector.removeAnimation(animation);\r\n });\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\r\n return;\r\n }\r\n\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n this.curWorkerNum = 0;\r\n this.loaded = false;\r\n this.loadPromise = undefined;\r\n }\r\n\r\n private initPlayer(el: RLottiePlayer['el'], options: RLottieOptions) {\r\n const player = new RLottiePlayer({\r\n el,\r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n const {reqId, cacheName} = player;\r\n this.players[reqId] = player;\r\n\r\n const playersByCacheName = cacheName ? this.playersByCacheName[cacheName] ??= new Set() : undefined;\r\n if(cacheName) {\r\n playersByCacheName.add(player);\r\n }\r\n\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n player.addEventListener('destroy', () => {\r\n this.onDestroy(reqId);\r\n if(playersByCacheName.delete(player) && !playersByCacheName.size) {\r\n delete this.playersByCacheName[cacheName];\r\n }\r\n });\r\n\r\n player.loadFromData(options.animationData);\r\n\r\n return player;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AnimationItemGroup, AnimationItemWrapper} from '../../components/animationIntersector';\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_APPLE_MX from '../../environment/appleMx';\nimport {IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI} from '../../environment/userAgent';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport clamp from '../../helpers/number/clamp';\nimport QueryableWorker from './queryableWorker';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport framesCache, {FramesCache, FramesCacheItem} from '../../helpers/framesCache';\n\nexport type RLottieOptions = {\n container: HTMLElement | HTMLElement[],\n canvas?: HTMLCanvasElement,\n autoplay?: boolean,\n animationData: Blob,\n loop?: RLottiePlayer['loop'],\n width?: number,\n height?: number,\n group?: AnimationItemGroup,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number,\n sync?: boolean\n};\n\nexport type RLottieColor = [number, number, number];\n\nexport function getLottiePixelRatio(width: number, height: number, needUpscale?: boolean) {\n let pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1 && !needUpscale) {\n if(width > 90 && height > 90) {\n if(!IS_APPLE && mediaSizes.isMobile) {\n pixelRatio = 1;\n }\n } else if((width > 60 && height > 60) || IS_ANDROID) {\n pixelRatio = Math.max(1.5, pixelRatio - 1.5);\n }\n }\n\n return pixelRatio;\n}\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void,\n destroy: () => void\n}> implements AnimationItemWrapper {\n public static CACHE = framesCache;\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n public name: string;\n public cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n\n private width = 0;\n private height = 0;\n\n public el: HTMLElement[];\n public canvas: HTMLCanvasElement[];\n private contexts: CanvasRenderingContext2D[];\n\n public paused = true;\n // public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop: number | boolean = true;\n private _loop: RLottiePlayer['loop']; // ! will be used to store original value for settings.stickers.loop\n public group: AnimationItemGroup = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n // private caching = false;\n // private removed = false;\n\n private cache: FramesCacheItem;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n public overrideRender: (frame: ImageData | HTMLCanvasElement | ImageBitmap) => void;\n private renderedFirstFrame: boolean;\n\n private raw: boolean;\n\n constructor({el, worker, options}: {\n el: RLottiePlayer['el'],\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(const i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n this.raw = this.color !== undefined;\n\n if(this.name) {\n this.cacheName = RLottiePlayer.CACHE.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n }\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI && !IS_APPLE_MX)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n // options.needUpscale = true;\n\n // * Pixel ratio\n const pixelRatio = getLottiePixelRatio(this.width, this.height, options.needUpscale);\n\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n\n // options.noCache = true;\n\n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; // 2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n\n // this.cachingDelta = Infinity;\n // this.cachingDelta = 0;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n if(!this.canvas) {\n this.canvas = this.el.map(() => {\n const canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = this.width;\n canvas.height = this.height;\n canvas.dpr = pixelRatio;\n return canvas;\n });\n }\n\n this.contexts = this.canvas.map((canvas) => canvas.getContext('2d'));\n\n if(!IS_IMAGE_BITMAP_SUPPORTED || this.raw) {\n this.imageData = new ImageData(this.width, this.height);\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n }\n\n if(this.name) {\n this.cache = RLottiePlayer.CACHE.getCache(this.cacheName);\n } else {\n this.cache = FramesCache.createCache();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n\n if(this.cacheName && this.cache.counter > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n\n this.cache.clearCache();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.sendQuery([args.shift(), this.reqId, ...args], transfer);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery(['loadFromData', data, this.width, this.height, this.toneIndex, this.color !== undefined/* , this.canvas.transferControlToOffscreen() */]);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n this.rafId = undefined;\n }\n // window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n // this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n this.pause();\n this.sendQuery(['destroy']);\n if(this.cacheName) RLottiePlayer.CACHE.releaseCache(this.cacheName);\n this.dispatchEvent('destroy');\n this.cleanup();\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray | HTMLCanvasElement | ImageBitmap, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(frame instanceof Uint8ClampedArray) {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n }\n\n // this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n this.contexts.forEach((context, idx) => {\n let cachedSource: HTMLCanvasElement | ImageBitmap = this.cache.framesNew.get(frameNo);\n if(!(frame instanceof Uint8ClampedArray)) {\n cachedSource = frame;\n } else if(idx > 0) {\n cachedSource = this.canvas[0];\n }\n\n if(!cachedSource) {\n // console.log('drawing from data');\n const c = document.createElement('canvas');\n c.width = context.canvas.width;\n c.height = context.canvas.height;\n c.getContext('2d').putImageData(this.imageData, 0, 0);\n this.cache.framesNew.set(frameNo, c);\n cachedSource = c;\n }\n\n if(this.overrideRender && this.renderedFirstFrame) {\n this.overrideRender(cachedSource || this.imageData);\n } else if(cachedSource) {\n // console.log('drawing from canvas');\n context.clearRect(0, 0, cachedSource.width, cachedSource.height);\n context.drawImage(cachedSource, 0, 0);\n } else {\n context.putImageData(this.imageData, 0, 0);\n }\n\n if(!this.renderedFirstFrame) {\n this.renderedFirstFrame = true;\n }\n });\n\n this.dispatchEvent('enterFrame', frameNo);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n }\n }\n\n public renderFrame(frame: Parameters[0], frameNo: number) {\n const canCacheFrame = this.cachingDelta && (frameNo % this.cachingDelta || !frameNo);\n if(canCacheFrame) {\n if(frame instanceof Uint8ClampedArray && !this.cache.frames.has(frameNo)) {\n this.cache.frames.set(frameNo, new Uint8ClampedArray(frame));// frame;\n } else if(IS_IMAGE_BITMAP_SUPPORTED && frame instanceof ImageBitmap && !this.cache.framesNew.has(frameNo)) {\n this.cache.framesNew.set(frameNo, frame);\n }\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n\n if(delta < 0) {\n const timeout = this.frInterval > -delta ? -delta % this.frInterval : this.frInterval;\n if(this.rafId) clearTimeout(this.rafId);\n this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, timeout);\n // await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n return;\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.cache.frames.get(frameNo);\n const frameNew = this.cache.framesNew.get(frameNo);\n if(frameNew) {\n this.renderFrame(frameNew, frameNo);\n } else if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.sendQuery(['renderFrame', frameNo], this.clamped ? [this.clamped.buffer] : undefined);\n }\n }\n\n private onLap() {\n if(++this.playedTimes === this.loop) {\n this.loop = false;\n }\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n // window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n this.rafId = undefined;\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n // console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n // this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n // setTimeout(() => {\n // this.addListener('enterFrame', this.frameListener);\n // }, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n\n // this.mainLoop(method);\n // this.r(method);\n // method();\n }\n\n public playPart(options: {\n from: number,\n to: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number,\n speed?: number,\n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n\n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n // this.sendQuery('renderFrame', 0);\n\n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс,\n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс.\n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n\n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n });\n }\n }\n\n console.timeEnd('cache' + this.reqId); */\n // console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas[0].parentNode && this.el && !this.overrideRender) {\n this.el.forEach((container, idx) => container.append(this.canvas[idx]));\n }\n\n // console.log('enterFrame firstFrame');\n\n // let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused || !this.currentMethod) {\n return;\n }\n\n const time = Date.now();\n // console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n // lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n // setInterval(this.frameListener, this.frInterval);\n\n // ! fix autoplaying since there will be no animationIntersector for it\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Page from './page';\r\nimport lottieLoader from '../lib/rlottie/lottieLoader';\r\nimport {horizontalMenu} from '../components/horizontalMenu';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\r\nimport whichChild from '../helpers/dom/whichChild';\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n const id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll({\r\n container: this.scrollableDiv,\r\n element: this.scrollableDiv.firstElementChild as HTMLElement,\r\n position: 'start'\r\n });\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pagesManager from './pagesManager';\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n // this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n\r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\r\n }\r\n}\r\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if(char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n const 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}\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}])}));","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n"],"names":["animationIntersector","constructor","this","observer","IntersectionObserver","entries","entry","target","group","byGroups","intersectionLockedGroups","animation","find","p","el","isIntersecting","visible","add","checkAnimation","delete","_animation","clearCache","Set","overrideIdleGroups","byPlayer","Map","lockedGroups","onlyOnePlayableGroup","videosLocked","doc","type","checkAnimations2","idle","setOverrideIdleGroup","override","getAnimations","element","found","player","push","removeAnimation","remove","HTMLVideoElement","IS_SAFARI","setTimeout","src","load","length","unobserve","removeAnimationByPlayer","item","get","addAnimation","observeElement","controlled","has","canvas","placeholder","HTMLElement","loop","observe","set","checkAnimations","blurred","destroy","imitateIntersection","undefined","groups","Object","keys","animations","paused","pause","autoplay","play","getOnlyOnePlayableGroup","setOnlyOnePlayableGroup","lockGroup","unlockGroup","refreshGroup","forEach","lockIntersectionGroup","unlockIntersectionGroup","toggleIntersectionGroup","lock","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","err","AppMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","Math","max","seekOffset","seekForward","min","duration","seekTo","seekTime","onMediaDocumentLoad","managers","appDocsManager","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","thumbsStorage","getCacheContext","url","playbackRate","id","size","onPlay","e","peerId","mid","pip","message","getMessageByMedia","stop","setMedia","verify","listLoader","current","getCurrent","jumpLength","withOtherSide","previous","getPrevious","idx","findIndex","getNext","go","setTargets","dispatchEvent","getPlayingDetails","pauseMediaInOtherTabs","onPause","onEnded","isTrusted","lockedSwitchers","round","next","toggle","clean","s","isScheduled","storage","playingMediaType","playItem","searchContext","getMedia","resolveWaitingForLoadMedia","dispatchJump","goRound","browserPlay","bindBrowserCallback","browserPause","browserStop","browserSeekBackward","browserSeekForward","browserSeekTo","browserNext","browserPrevious","seekToStart","construct","container","document","createElement","style","cssText","body","append","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","action","setActionHandler","console","warn","skipMediaPlayEvent","properties","key","_key","value","dispatchPlaybackParams","defineProperties","getPlaybackParams","volume","muted","setPlaybackParams","params","_volume","_muted","_playbackRate","_loop","_round","addMedia","autoload","pFlags","is_scheduled","setAttribute","addEventListener","media_unread","fromId","appMessagesManager","readMessages","once","deferred","resolve","w","waitingStorage","then","promise","isSafariBuffering","safariBuffering","setSafariBuffering","setNewMediadata","pictureInPictureElement","artwork","isVoice","title","artist","thumbs","bytes","sizes","h","thumb","appPeersManager","getPeerPhoto","attribute","attributes","_","file_name","performer","IS_APPLE","metadata","MediaMetadata","setCurrentMediadata","playbackParams","cb","willBePlayed","willBePlayedMedia","setSearchContext","context","getSearchContext","prev","reset","loadCount","loadWhenLeft","processItem","onJump","older","onEmptied","reverse","folderId","getPlaybackMediaTypeFromMessage","mediaType","setSingleMedia","wasPlaying","toggleSwitchers","playPaused","removeEventListener","enabled","setPictureInPicture","listenerSetter","removeAll","appMediaPlaybackController","AppMediaViewer","captionTimeout","super","isForDocument","inputFilter","isMediaCompatibleForDocumentViewer","onPrevClick","openMedia","getMessageByPeer","onNextClick","onDeleteClick","content","close","onForwardClick","onAuthorClick","Number","MAX_SAFE_INTEGER","threadId","tab","lastMsgId","onDownloadClick","queueId","caption","classList","setCaptionTimeout","clearTimeout","window","onAdditionalScroll","wholeDiv","buttons","btnMenuForward","icon","text","onClick","btnMenuDownload","btnMenuDelete","setBtnMenuToggle","setListeners","forward","author","onCaptionClick","a","spoiler","HTMLAnchorElement","contains","onclick","getAttribute","includes","capture","click","getScheduledMessageByPeer","setCaption","html","entities","totalEntities","firstElementChild","fromRight","prevTargets","nextTargets","setMoverPromise","fwd_from","from_name","noForwards","isServiceMessage","cantForwardMessage","canForward","cantDownloadMessage","button","download","canDeleteMessage","_openMedia","date","static","mime_type","VideoPlayer","streamable","onPlaybackRackMenuToggle","onPip","onPipClose","wrapper","setup","canHideControls","playbackRateButton","showOnLeaveToClassName","ignoreClickClassName","parentNode","insertBefore","appendChild","skin","stylePlayer","controls","querySelector","progress","prepend","catch","name","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","pipButton","querySelectorAll","fullScreenButton","timeElapsed","textContent","toHHMMSS","volumeSelector","leftControls","btn","parentElement","Array","from","togglePlay","requestPictureInPicture","visibility","debounceTime","debouncedPip","debounce","listener","timeout","overlayCounter","code","good","toggleFullScreen","altKey","nextIdx","PLAYBACK_RATES","indexOf","cancelEvent","onFullScreen","bind","hideControls","showControls","setPlaybackRateIcon","onMediaLoad","IS_MOBILE","pictureInPictureEnabled","map","rate","regularText","btnMenu","PLAYBACK_RATES_ICONS","className","IS_APPLE_MOBILE","webkitEnterFullscreen","enterFullscreen","isFull","cleanup","removeListeners","MEDIA_VIEWER_CLASSNAME","AppMediaViewerBase","topButtons","tempId","preloader","preloaderStreamable","isFirstOpen","pageEl","getElementById","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","transform","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","tagName","highlightSwitchersTimeout","isZooming","mover","classNames","findUpClassName","onKeyDown","ctrlKeyDown","changeZoom","ctrlKey","metaKey","onKeyUp","onWheel","scrollingUp","deltaY","rootScope","log","logger","cancelable","lazyLoadQueue","overlaysDiv","mainDiv","topbar","topbarLeft","onlyMobile","authorRight","avatarEl","nameEl","buttonsDiv","concat","noRipple","zoom","step","withTransition","setHandlers","onScrub","onMouseUp","main","innerHTML","onLoadedMore","setNewMover","moveLength","onSwipe","xDiff","yDiff","abs","windowSize","verifyTouchTarget","evt","enable","isVisible","mousedown","zoomValue","setProgress","videoPlayer","lockControls","zoomSwipeHandler","lastDiffX","lastDiffY","multiplier","onFirstSwipe","onReset","cursor","addProgress","btnMenuToggle","Promise","reject","navigationItem","appNavigationController","clear","setMoverToTarget","onAnimationEnd","appMediaViewer","removeGlobalListeners","toggleOverlay","active","toggleGlobalListeners","setGlobalListeners","passive","closing","removeCenterFromMover","wasActive","delay","realParent","rect","getBoundingClientRect","SVGImageElement","SVGForeignObjectElement","left","needOpacity","overflowElement","visibleRect","getVisibleRect","overflow","vertical","horizontal","containerRect","top","aspecter","width","HTMLImageElement","setFullAspect","offsetLeft","height","scaleX","scaleY","borderRadius","getComputedStyle","getPropertyValue","brSplitted","str","splitted","split","i","fillPropertyValue","r","parseInt","join","willBeLeft","willBeTop","path","opacity","isOut","ret","isFulfilled","isRejected","SVGSVGElement","sizeTailPath","toggleWholeActive","mediaElement","selector","queryFrom","matches","elements","pop","getContext","naturalWidth","naturalHeight","videoWidth","videoHeight","HTMLCanvasElement","drawImage","image","Image","createVideo","clipId","dataset","newClipId","newSvg","createElementNS","setAttributeNS","outerHTML","replace","lastElementChild","defs","use","SVGUseElement","d","getAttributeNS","x","y","sX","sY","br","v","generatePathData","foreignObject","renderImageFromUrl","display","proportion","upscale","start","Date","now","diff","_br","moveTheMover","toLeft","windowW","newTransform","p1","newMover","updateMediaSource","toLowerCase","setAuthorInfo","timestamp","isPeerId","wrapTitlePromise","dialog","onlyFirstName","plainText","wrapEmojiText","oldAvatar","newAvatar","cloneNode","all","updateWithOptions","peerTitle","replaceContent","replaceWith","setAuthorPromise","isDocument","isVideo","useContainerAsTarget","IS_MOBILE_SAFARI","onPop","canAnimate","maxWidth","padding","windowH","mediaSizes","maxHeight","thumbPromise","setAttachmentSize","photoSize","img","downloaded","gotThumb","getStrippedThumbIfNeeded","loadPromise","useController","div","moverVideo","canPlayThrough","createPlayer","ckin","overlay","open","otherMediaViewer","releaseSingleMedia","show","readyState","HAVE_FUTURE_DATA","attach","attachCanPlay","detach","loading","networkState","NETWORK_LOADING","isntEnoughData","unshift","appDownloadManager","error","cancellablePromise","attachPromise","imgs","haveImage","setManual","onPopState","hash","location","state","debug","isPossibleSwipe","currentHash","overriddenHash","overrideHash","onHashChange","pushState","navigations","manual","handleItem","onEscape","back","onTouchStart","touches","options","history","scrollRestoration","replaceState","pushItem","noBlurOnPop","findItemByType","index","backByItem","splice","onItemAdded","noHistory","unshiftItem","spliceItems","items","origin","pathname","search","removeItem","removeByType","single","SearchGroup","clearable","clickable","autonomous","onFound","noIcons","list","setActive","childElementCount","AppSearch","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","scrollable","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","beginSearch","inputField","input","focus","maxId","limit","res","count","shift","searchGroup","avatarSize","meAsSaved","SearchContextMenu","attachTo","searchSuper","onGotoClick","appImManager","selection","isSelecting","selectionForwardBtn","onSelectClick","toggleByElement","onClearSelectionClick","cancelSelection","selectionDeleteBtn","attachContextMenuListener","init","MouseEvent","preventDefault","cancelBubble","toPeerId","isSelected","isMidSelected","withSelection","positionMenu","contextMenuController","AppSearchSuper","tabs","prevTabId","middleware","historyStorage","usedFromHistory","urlsToRevoke","loadMutex","nextRates","loadPromises","loaded","loadedChats","firstLoad","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","showSender","onTransitionStart","onTransitionEnd","safeAssign","searchContextMenu","navScrollableContainer","navScrollable","nav","tabsMenu","mediaTab","mediaTabs","menuTab","span","ripple","unlockScroll","tabsContainer","swipeHandler","handleTabSwipe","prevId","selectTab","children","onTouchMove","lockers","lockTouchScroll","contentTab","searchGroupMedia","canLoadMediaTab","horizontalMenu","tabContent","animate","skipScroll","scrollIntoViewNew","position","startCallback","scrollStartCallback","newMediaTab","onChangeTab","fromMediaTab","offsetTop","scrollTop","scroll","scrollHeight","rect2","onScroll","onMediaClick","targetClassName","targets","containerEl","copySearchContext","slice","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","unlockAndRefresh","filterMessagesByType","filterMessagesByInputFilter","processEmptyFilter","dom","appDialogsManager","setLastMessagePromise","lastMessage","highlightWord","noop","processPhotoVideoFilter","promises","getMediaFromMessage","wrapped","choosePhotoSize","boxWidth","boxHeight","onlyPreview","withoutPreloader","noPlayButton","photo","noBlur","images","full","filter","Boolean","processDocumentFilter","withTime","fontWeight","voiceAsMusic","autoDownloadSize","processUrlFilter","webpage","entity","display_url","sliced","offset","matchUrl","same","URL","hostname","description","previewDiv","setInnerHTML","getAbbreviation","subtitleFragment","htmlToDocumentFragment","wrapRichText","innerText","decodeURIComponent","href","firstChild","wrapPlainText","row","titleRight","subtitle","havePadding","applyMediaElement","performSearchResult","elemsToAppend","sharedMediaDiv","processCallback","results","awaited","method","monthContainer","getMonthContainerByTimestamp","toggleElementCheckbox","afterPerforming","parent","child","loadChats","renderedPeerIds","inputMessagesFilterEmpty","setResults","showMembersCount","peer","getPeer","participants_count","participants","regExp","RegExp","escapeRegExp","cleanSearchText","titleSpan","lastMessageSpan","getChatMembersString","toChatId","username","getPeerUsername","user","appUsersManager","getUser","phone","formatPhoneNumber","formatted","onLoad","arg","getContactsPeerIds","contacts","searchContacts","my_results","globalContacts","showMore","intlElement","isShort","update","getConversations","dialogs","minDate","renderRecentSearch","recent","recentSearch","isUser","getUserStatusString","toUserId","getTopPeers","peers","people","subtitleEl","loadMembers","renderParticipants","membersList","rippleEnabled","li","findUpTag","DIALOG_LIST_ELEMENT_TAG","participant","getParticipantPeerId","isAnyChat","deleted","appChatsManager","isChannel","LOAD_COUNT","appProfileManager","getChannelParticipants","getChatFull","chatFull","loadType","justLoad","used","slicedLength","ids","notFilteredMessages","m","checkForTriggers","getSearch","nextRate","next_rate","loadFirstTime","filters","counters","canViewMembers","getSearchCounters","firstMediaTab","counter","c","membersTab","loadFirstTimePromise","toLoad","t","findAndSplice","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","haveTimestamps","getObjectKeysAndSort","positionElementByIndex","isBroadcast","hasRights","cleanScrollPositions","cleanupHTML","goFirst","revokeObjectURL","putPreloader","empty","newInputFilter","copy","setQuery","maxDate","AppSelectPeers","chatsContainer","selected","freezed","offsetIndex","loadedWhat","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","design","onInput","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","peerIds","splitUp","notRendered","filterPeerTypeBy","section","innerContainer","topContainer","selectedContainer","selectedScrollable","sectionNameLangPackKey","noShadow","checkbox","checked","debouncedInput","appendTo","getResultsPromise","onFirstRender","renderSaved","testSelfSearch","getTempId","getMoreDialogs","archived","pageCount","newOffsetIndex","chatRightsAction","filterByRights","isEnd","getMoreContacts","isGlobalSearch","searchResult","resultPeerIds","arr","getMoreChannelParticipants","channelParticipants","q","isNonContactUser","checkboxField","label","isDialog","insertAdjacentElement","offsetWidth","getSelected","addInitial","values","requestAnimationFrame","forceDirection","constructDownloadPreloader","tryAgainOnFail","circle","totalLength","mids","attr","elem","findMediaTargets","anchor","anchorMid","isBubbles","justAudioSelector","selectors","prefix","mediaItems","AudioElement","render","isRealVoice","isOutgoing","is_outgoing","uploadingFileName","durationStr","downloadDiv","onTypeLoad","audioEl","out","waveform","Uint8Array","valueCount","result","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","minW","maxW","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","onTimeUpdate","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","scrub","offsetX","targetTouches","pageX","scrubTime","wrapVoiceMessage","descriptionEl","audioAttribute","parts","titleEl","middleEllipsisEl","fontSize","sizeType","subtitleDiv","launched","progressLine","lastChild","wrapAudio","audioTimeDiv","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","hadSearchContext","useSearch","autoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","playListener","setDownloadFunction","disconnectedCallback","isConnected","customElements","define","AvatarListLoader","loadMore","photoId","appPhotosManager","getUserPhotos","photos","loadedAllUp","AppMediaViewerAvatar","getPhoto","onAvatarUpdate","openAvatarViewer","getTarget","hadMessage","isObject","believeMe","seen","AvatarElement","addedToQueue","attachClickEvent","updateOptions","wasPeerId","newPeerId","onlyThumb","putPhoto","isBig","AvatarEdit","clearRect","asDiv","rippleSquare","disabled","ButtonMenuItem","noCheckboxClickListener","textElement","textArgs","keepOpen","menu","b","ButtonMenuToggleHandler","onOpen","onClose","openedMenu","direction","ChatBackgroundGradientRenderer","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","_animatingToNextPosition","_scrollDelta","_onWheelRAF","drawOnWheel","floor","ceil","changeTailAndDraw","drawNextPositionAnimated","getProgress","transitionValue","nextPositionTail","_nextPositionTail","_nextPositionTails","_nextPositionLeft","frames","_frames","drawImageData","_incrementalCurve","hexToRgb","hex","g","getPositions","positions","getNextPositions","phase","curveMax","curve","pos","distances","nextPos","distance","curPosition","tail","changeTail","_tail","_phase","curPos","drawGradient","getGradientImageData","_hctx","createImageData","pixels","data","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","sqrt","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","cancelAnimationFrame","colors","color","alpha","_canvas","fillStyle","fillRect","toNextPosition","tails","nextPhaseOnIdx","inc","toFixed","curves","last","scrollAnimate","createCanvas","gradientRenderer","accumulateMapSet","reduce","acc","AppSelection","selectedMids","onMouseDown","targetLookupClassName","verifyTarget","selecting","firstTarget","processElement","checkBetween","isInDOM","seenSet","seenLength","findUpAsChild","elementsBetween","getElementsBetween","toggleByMid","canceledSelection","onMouseMove","getElementFromTarget","verifyMouseMoveTarget","removeManual","listenElement","documentListenerOptions","first","firstRect","lastRect","isHigher","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","doNotAnimate","onCancelSelection","toggleSelection","navigationType","random","attachListeners","selectedText","getSelection","toString","createRange","verifyTouchLongPress","isElementShouldBeSelected","appendCheckbox","hasCheckbox","getCheckboxInputFromElement","updateContainer","forceSelection","cantForward","cantDelete","cantSend","storageKey","cantForwardDeleteMids","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","forwards","toggleResult","onToggleSelection","updateElementSelection","toggleMid","unselect","deleteSelectedMids","SearchSelection","selectionCountEl","selectionGotoBtn","selectionContainer","BASE_CLASS","btnCancel","attachClickOptions","obj","fromPeerId","sort","isPrivate","transitionElement","ChatSelection","chat","bubbles","recording","bubble","canSelectBubble","isGroupedBubbleSelected","getMidsFromGroupContainer","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","right","inputContainer","toggleAttribute","skippedMids","isGrouped","groupedCheckboxInput","CheckboxField","restriction","toggleDisability","stateKey","stateValues","stateValue","setValueSilently","box","checkSvg","bg","border","withRipple","withHover","event","Event","disable","CodeInputField","autocomplete","lastLength","setLabel","onFill","confirmationPopup","callback","cancelButton","isCancel","checkboxes","countries","setCountries","country","hidden","default_name","localeCompare","CountryInputField","hidePicker","hideTimeout","selectWrapper","selectCountryByTarget","defaultName","phoneCodeEl","phoneCode","countryCode","simulateInputEvent","lastCountrySelected","lastCountryCodeSelected","country_codes","_countryCode","country_code","onCountryChange","liMap","arrowDown","selectList","initSelect","emoji","iso2","liArr","noPhoneCodes","Infinity","spanEmoji","select","margin","mouseDownHandlerAttached","onKeyPress","_value","names","abbr","word","test","blur","selectCountryByIso2","countryName","EditPeer","_disabled","isChanged","uploadAvatar","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","nextBtn","withoutAvatar","avatarElem","doNotEditAvatar","avatarEdit","_upload","lockWithPromise","unlockOnSuccess","GifsTab","gifsContainer","EmoticonsDropdown","masonry","EMOTICONSSTICKERGROUP","getGifs","docs","processInvisibleDiv","ANIMATIONGROUP","AppGifsTab","nextOffset","loadedAll","onGifsClick","fileId","inputSearch","gifsDiv","onCloseAfterTimeout","newSearch","gifBotPeerId","resolveUsername","appInlineBotsManager","getInlineResults","next_offset","AppStickersTab","setsDiv","listenTo","sticker","stickerSet","access_hash","appStickersManager","getStickerSet","toggleStickerSet","changed","installed_date","removeAttribute","renderFeatured","renderSet","header","countDiv","stickersDiv","stickerDiv","documents","withLock","getFeaturedStickers","coveredSets","filterRendered","forEachReverse","covered","searchStickerSets","scrollOptions","forceDuration","transitionFunction","ignoreOutClickClassName","tabId","onSelectTabClick","searchButton","emojiTab","deleteBtn","scrollTo","checkRights","tabsEl","tabsElements","canSendStickers","canSendGifs","canSendToPeer","stickersTab","gifsTab","whichChild","savedRange","getGoodRange","onOpened","unlock","refresh","onClosed","range","getSavedRange","setStartAfter","newRange","cloneRange","collapsed","node","endContainer","endOffset","newStartNode","previousSibling","nodeType","TEXT_NODE","nodeValue","ELEMENT_NODE","isContentEditable","selectNode","newOffset","setStart","deleteContents","HIDE_EMOJI_TAB","INIT_TAB_ID","lastMouseMoveEvent","mouseMoveEventAttached","isActive","onMouseOut","getElement","axis","clearDraft","silent","emoticonsDropdown","forceClose","addLazyLoadQueueRepeat","divs","intersector","getVisible","clearVisible","sel","rangeCount","activeElement","getRangeAt","menuOnClick","emoticons","menuScroll","prevTab","jumpedTo","getElementPosition","elementPosition","scrollToTab","scrollingToContent","stickyIntersector","stuck","getCategoryByContainer","which","getCategoryByMenuTab","additionalOffset","setActiveStatic","local","scrollLeft","clientWidth","sendDocId","loadedURLs","appendEmoji","unify","kek","getEmojiEntityFromEmoji","wrapSingleEmoji","fixEmoji","getEmojiFromElement","superEmoji","stickerEmoji","EMOJI_RECENT_ID","EMOJI_RECENT_CATEGORY","CUSTOM_EMOJI_RECENT_CATEGORY","EMOJI_CATEGORIES","EMOJI_ELEMENT_SIZE","EmojiTab","onCategoryVisibility","category","categoriesMap","renderer","newChildren","customEmojis","customEmojiElement","clearCanvas","middlewareHelper","replaceChildren","onContentClick","userName","toast","langPackKey","langPackArguments","menuWrapper","previousElementSibling","emojiScroll","intersectionOptions","root","categoriesIntersector","menuOnClickResult","innerScrollWrapper","sorted","order","prepare","emojis","titleLangPackKey","createLocalCategory","unified","addEmojiToCategory","appEmojiManager","getRecentEmojis","getCustomEmojis","recentCustom","sets","recentCategory","categories","recentCustomCategory","CUSTOM_EMOJI_RECENT_ID","createRendererForCategory","paddingTop","toggleLocalCategory","resizeCategories","after","renderStickerSet","toggleCustomCategory","postponedEvent","positionCategory","toggleRenderers","ignore","ignoreSettingDimensions","setDimensionsFromRect","deleteCategory","isCategoryVisible","forceRender","closeScrollTop","createCategory","menuTabPadding","stickerEmojiRaw","setCategoryItemsHeight","hasPremium","animationGroup","customEmojiSize","batch","spliceExceed","onLocalCategoryUpdate","LazyLoadQueueRepeat","parallelLimit","onVisibilityChange","elementsMap","queueItem","wasSeen","queue","indexOfAndSplice","setProcessQueueTimeout","SuperStickerRenderer","regularLazyLoadQueue","animated","checkAnimationContainer","processVisible","processInvisible","renderSticker","observeAnimated","unobserveAnimated","StickersTabCategory","noMenuTab","getContainerSize","getElementMediaSize","gapX","gapY","containerWidth","elementSize","itemsPerRow","rows","minHeight","EmoticonsTabC","categoryItemsClassName","args","postponedEvents","categoriesByMenuTabMap","localCategories","isLocal","observeStickyHeaderChanges","posItems","foundMenuScroll","posMenu","notMountedItems","notMountedMenus","itemsIdx","menuIdx","StickersTab","setTyping","setFavedLimit","categoryAppendStickers","superStickerRenderer","clearCategoryItems","onCategoryStickers","stickers","deleteSticker","unshiftSticker","favedCategory","clearButton","titleLangKey","descriptionLangKey","langKey","clearRecentStickers","premiumCategory","apiManager","getLimit","getFavedStickersStickers","getRecentStickersStickers","getAllStickers","getPremiumStickers","isPremium","race","rendererLazyLoadQueue","faved","createStickersContextMenu","verifyRecent","unshiftRecentSticker","saveRecentSticker","deleteRecentSticker","generateFakeIcon","isScam","LazyLoadQueueRepeat2","spliced","findAndSpliceAll","GifsMasonry","scrollPromise","processVisibleDiv","noInfo","noPreview","transitionTime","scrollableX","proxy","Proxy","apply","that","selectTarget","result1","canChange","mutateCallback","useStripe","indicator","currentIndicator","shiftLeft","scaleFactor","insertRichTextAsHTML","wrappingForPeerId","some","createCustomEmojiRendererForInput","fragment","wrapDraftText","customEmojiRenderer","contentEditable","richInputHandler","customEmojiElements","ces","documentFragmentToHTML","pre","getCaretPosNew","createTextNode","collapse","removeAllRanges","addRange","onBeforeInput","inputType","execCommand","removeExtraBOMs","findUpAttribute","noLinebreaks","originalEvent","clipboardData","getData","usePlainText","filterEntity","DOMParser","parseFromString","curChild","nextSibling","richValue","getRichValueWithCaret","entities2","parseEntities","mergeEntities","InputState","wrappingDraft","isSelectable","processCustomEmojisInInput","hasSet","connectedCallback","InputField","validate","maxLength","showLengthOn","canBeEdited","labelText","onInputCallbacks","isCollapsed","centerX","focusOnNext","clientX","isInputEmpty","inputMode","labelEl","showingLength","wasError","inputLength","isError","withLinebreaks","selectNodeContents","selectElementContents","labelOptions","fromSet","originalValue","isValidToChange","setDraftValue","setOriginalValue","setState","Valid","setError","InputSearch","prevValue","onClearClick","onClear","searchIcon","clearBtn","LazyLoadQueue","ignoreHeavyAnimation","getItem","addElement","LazyLoadQueueIntersector","inProcess","disconnect","loadItem","intersectorTimeout","processQueue","MediaProgressLine","useTransform","progressRAF","onLoadedData","seek","setLoadProgress","onProgress","filledLoad","setSeekMax","buf","buffered","numRanges","nearestStart","end","percents","testQueue","pendingTest","setTestQueue","testElement","getElementWidth","mapped","firstTime","textLength","font","textWidth","elementWidth","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","substr","half2","MiddleEllipsisElement","PasswordMonkey","passwordInputField","needFrame","noCache","currentFrame","setSpeed","helpers","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","TrackingMonkey","playAnimation","frame","idleAnimation","PasswordInputHelpers","onVisibilityClick","toggleVisible","stealthy","tabIndex","PasswordInputField","PeerProfileAvatars","avatar","avatars","draggable","loadCallback","intersectionObserver","loadCallbacks","addTab","gradient","info","arrowPrevious","arrowNext","checkScrollTop","SWITCH_ZONE","freeze","_e","clickX","toRight","cancelNextClick","minX","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","loadNearestToTarget","setPeer","backLimit","filterChatPhotosMessages","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","setText","PeerProfile","setPeerStatus","needClear","noDelimiter","bio","subtitleLangKey","getProfileByPeerId","about","link","notifications","togglePeerMute","appNotificationsManager","isPeerLocalMuted","setMoreDetails","fillUsername","userId","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","clearSetMoreDetailsTimeout","canBeDetailed","oldAvatars","formatUserPhone","fillNotifications","notificationsRow","fillRows","withIcons","fillProfileElements","cleaned","_setMoreDetails","peerFull","getChat","exportedInvite","exported_invite","address","setMoreDetailsTimeout","isRestricted","acknowledged","setPromise","cached","clearInterval","generateTitleIcons","noVerifiedIcon","noFakeIcon","noPremiumIcon","verified","use2","generateVerifiedIcon","fake","scam","premium","emojiStatus","emoji_status","generatePremiumIcon","weakMap","WeakMap","PeerTitle","setOptions","hasInner","fromName","limitSymbols","icons","getPeerTitle","withPremiumIcon","inner","createDocumentFragment","PopupAvatar","closable","withConfirm","cropper","crop","removeHandlers","h6","btnClose","cropContainer","file","files","readBlobAsDataURL","contents","onload","originalImage","cropComponent","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","overlayColor","CROPWIDTH","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","startMoving","resizing","keyHandler","imgZoom","PI","bottom","newWidth","newHeight","clientHeight","String","fromCharCode","charCode","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","currentTouch","complete","btnConfirm","hide","toBlob","blob","darkenCanvas","onCrop","postCanvas","ctx","PopupDeleteDialog","onSelect","peerTitleElement","getDialogType","callbackLeave","flush","leave","flushHistory","callbackDelete","descriptionArgs","isDanger","descriptionLangArgs","PopupDeleteMessages","onConfirm","revoke","deleteScheduledMessages","deleteMessages","titleArgs","isMegagroup","_hasRights","canRevoke","titleLangArgs","PopupForward","peerIdMids","overrideOnSelect","peerTypes","attachScrollableListeners","DEFAULT_APPEND_TO","appendPopupTo","onFullScreenChange","PopupElement","reAppend","MANAGERS","confirmShortcutIsSendShortcut","withoutOverlay","overlayClosable","btnConfirmOnEnter","buttonsEl","buttonsElements","langArgs","POPUPS","isScrolledDown","onContentUpdate","popup","popupConstructor","ctor","addCancelButton","times","ONE_HOUR","PopupMute","time","mutePeer","radioForm","PopupPeer","noTitle","o","original","nextElementSibling","PopupPickUser","PopupSendNow","sendScheduledMessages","ANIMATION_GROUP","PopupStickers","stickerSetInput","isEmojis","onStickersClick","updateAdded","stickersFooter","onStickerSetUpdate","_set","updateButton","loadStickerSet","createStickerSetElements","headerRow","buttonRight","added","itemsContainer","setsPromises","isArray","firstSet","isStickerPack","onSend","containersPromises","docIds","toggleStickerSets","isAdd","buttonAppend","installed","ProgressivePreloader","detached","isUpload","attachMethod","loadFunc","constructContainer","bold","constructDownloadIcon","downloadSvg","cancelSvg","func","startTime","onEnd","notify","elapsedTime","TRANSITION_TIME","addNotifyListener","useRafs","getTotalLength","strokeDasharray","putAvatar","renderThumbPromise","thumbImage","isFullLoaded","stripped_thumb","getPreviewURLFromBytes","sequentialDom","renderPromise","myId","getPeerColorById","avatarAvailable","avatarRendered","appAvatarsManager","isAvatarCached","first_name","last_name","getPeerInitials","returnDiv","setButtonLoader","RadioField","alignRight","RadioForm","radios","form","RangeSelector","events","setFilled","filled","stepStr","decimals","_removeListeners","rectMax","offsetAxisValue","rippleClickId","attachListenerTo","handler","drawRipple","clickId","touchStartFired","clickY","isRippleUnneeded","touchEnd","setContent","Row","checkboxFieldOptions","asLink","radioField","noWrap","subtitleRight","subtitleRow","createRow","subtitleLangArgs","isToggle","withCheckboxSubtitle","titleRightContent","titleRightSecondary","titleRow","createTitle","navigationTab","buttonRightLangKey","_subtitle","createSubtitle","createMedia","CreateRowFromCheckboxField","RadioFormFromRows","RadioFormFromValues","checkedRadioField","SCROLL_THROTTLE","IS_ANDROID","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","cancelMeasure","onScrolledTop","scrollPosition","scrollProperty","addScrollListener","addedScrollListener","removeScrollListener","removeHeavyAnimationListener","Scrollable","onScrollOffset","withPaddingContainer","maxScrollTop","getDistanceToEnd","setScrollTopSilently","ignoreNextScrollEvent","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","AppNewGroupTab","isGeoChat","setTitle","SettingSection","inputWrapper","groupNameInputField","groupLocationInputField","valueCheck","userLocationCoords","userLocationAddress","createChannel","geo_point","megagroup","chatId","inputFile","editPhoto","inviteToChannel","createChat","chatsSection","nameArgs","new","startLocating","geolocation","getCurrentPosition","lat","coords","latitude","long","longitude","uri","fetch","response","json","display_name","GeolocationPositionError","PrivacyType","getPrivacyRulesDetails","rules","types","allowPeers","users","chats","disallowPeers","rule","PrivacySection","onRadioChange","captions","captionElement","radioSection","exceptions","radioRows","skipTypes","noExceptions","generateSection","exceptionTexts","exception","_peerIds","slider","createTab","skippable","takeOut","newPeerIds","generateStr","splitPeersByType","selectedPeerIds","appPrivacyManager","getPrivacy","inputKey","setRadio","k","eventListener","chatKey","usersKey","getUserInput","setPrivacy","anchorCopy","mePath","AppPrivacyPhoneNumberTab","getSelf","captionEl","phoneSection","sCaption","AppTwoStepVerificationSetTab","captionOld","stickerContainer","inputContent","generateContentElement","btnReturn","sliceTabsUntilTab","AppSettingsTab","canFocus","isFirstInput","AppTwoStepVerificationEmailConfirmationTab","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","cancelPasswordEmail","AppTwoStepVerificationEmailTab","resendPasswordEmail","onOpenAfterTimeout","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","hint","currentPassword","plainPassword","newPassword","symbols","AppTwoStepVerificationHintTab","onSkipClick","saveHint","AppTwoStepVerificationReEnterPasswordTab","monkey","verifyInput","AppTwoStepVerificationEnterPasswordTab","isNew","has_password","textEl","getStateInterval","getState","_state","check","auth","AppTwoStepVerificationTab","removeTabFromHistory","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","AppPrivacyLastSeenTab","AppPrivacyProfilePhotoTab","AppPrivacyForwardMessagesTab","AppPrivacyAddToGroupsTab","AppPrivacyCallsTab","AppActiveSessionsTab","Session","app_name","app_version","ip","date_active","date_created","midtitle","device_model","system_version","platform","authorizations","session","btnTerminate","invokeApi","otherSection","onError","onTerminateClick","menuElement","AppBlockedUsersTab","btnAdd","toggleBlock","bot","blocked","getBlocked","convertKeyToInputKey","toUpperCase","AppPrivacyVoicesTab","AppPrivacyAndSecurityTab","fromTab","appConfig","getAppConfig","globalPrivacy","getGlobalPrivacySettings","contentSettings","SUBTITLE","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRowOptions","email_unconfirmed_pattern","twoFactorRow","activeSessionsRow","updateActiveSessions","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","voicesRow","updatePrivacyRow","disallowLength","allowLength","destroyed","setGlobalPrivacySettings","archive_and_mute_new_noncontact_peers","settings","onPremiumToggle","autoarchive_setting_available","_enabled","sensitive_enabled","sensitive_can_change","payment","appPaymentsManager","clearSavedInfo","deleteButton","appDraftsManager","clearAllDrafts","auths","averageColorFromCanvas","pixel","fill","getImageData","pixelsLength","outPixel","Uint8ClampedArray","highlightningColor","rgba","l","ColorPicker","hue","saturation","lightness","onGrabStart","documentElement","boxDragger","onGrabEnd","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","attachGrabListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","getCurrentColor","rgbaArray","hexa","hsl","hsla","clamp","maxX","maxY","posX","posY","lightnessX","lightnessY","AppBackgroundColorTab","_applyColor","updateColorPicker","colorPicker","background","theme","intensity","slug","appStateManager","pushToState","onColorChange","applyColor","themeController","gridSection","grid","backgroundColor","throttle","isColored","AppBackgroundTab","clicked","wallPapersByElement","elementsByKey","onUploadClick","accept","requestFile","endsWith","createObjectURL","mimeType","scaleMediaElement","File","wallPaper","prepareWallPaperUpload","uploadPromise","uploadWallPaper","uploadDeferred","newKey","getWallPaperKey","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","blurCheckboxField","onGridClick","wallpaper","saveToCache","_tempId","onReady","getPixelPromise","getColorsFromWallPaper","imageUrl","imageSource","ratio","averageColorFromImageSource","averageColor","toDataURL","getWallPaperKeyFromTheme","uploadButton","colorButton","resetButton","pattern","getWallPapers","wallPapers","gridContainer","background_color","second_background_color","third_background_color","fourth_background_color","hasFile","isDark","dark","noFadeIn","webkitMaskImage","AppQuickReactionTab","appReactionsManager","getQuickReaction","getAvailableReactions","quickReaction","availableReactions","reaction","inactive","availableReaction","static_icon","setDefaultReaction","emoticon","RangeSettingSelector","initialValue","minValue","writeValue","nameDiv","valueDiv","valueContainer","AppGeneralSettingsTab","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","format","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","eachMinute","toLocaleTimeString","hour","minute","suggestCheckboxField","bigCheckboxField","reactionsRow","renderQuickReaction","getCustomEmojiDocument","document_id","loopCheckboxField","stickerSets","stickersContent","allStickers","assumeType","AppEditProfileTab","bioMaxLength","userFull","firstNameInputField","lastNameInputField","bioInputField","editPeer","usernameInputField","setProfileUrl","availableText","takenText","invalidText","profileUrlContainer","profileUrlAnchor","profilePromise","updateProfile","uploadProfilePhoto","updateUsername","AppNotificationsTab","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","isMuted","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","notify_settings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","AppLanguageTab","languages1","lang_pack","languages2","rendered","webLangCodes","language","lang_code","native_name","langPack","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","AppAutoDownloadPhotoTab","AppAutoDownloadFileTab","debouncedSave","sizeMax","setByKey","MIN","MAX_RANGE","MAX","upTo","formatBytes","compareAndUpdate","AppAutoDownloadVideoTab","AUTO_DOWNLOAD_FOR_KEYS","private","channels","AppDataAndStorageTab","autoCheckboxField","autoDownloadNew","autoRow","deepEqual","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","file_size_max","openTab","tabConstructor","onDisabledChange","peerKeys","enabledKeys","isAll","logOut","edit","profile","fillPromise","changeAvatarBtn","upload","updateChangeAvatarBtn","getInitArgs","languageArgs","devicesRow","languageRow","buttonsSection","getEditProfileArgs","editProfileArgs","lottieLoader","getAuthorizations","overwrite","getAuthorizationsPromise","AppNewChannelTab","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","channelId","PopupCreateContact","importContact","nameInputField","telInputField","AppContactsTab","openContacts","isContact","sortedUserList","createList","renderPage","AppArchivedTab","wasFilterId","filterId","chatList","localId","AppPeopleNearbyTab","isLocationWatched","parseDistance","startWatching","latestLocationSaved","getLocated","accuracy","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","stopWatching","lat1","long1","lat2","long2","asin","LEFT_COLUMN_ACTIVE_CLASSNAME","AppSidebarLeft","sidebarEl","sidebarHeader","onContactsClick","backBtn","btnArchive","dialogsStorage","getFolderDialogs","isDialogsLoaded","themeCheckboxField","filteredButtons","sessionStorage","kz_version","toolsBtn","btnMenuFooter","rel","newBtnMenu","updateBtn","reload","initSearch","archivedCount","folder","unreadPeerIds","formatNumber","checkUpdateInterval","cache","status","ok","hasUpdate","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","setProperty","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","pushRecentSearch","peopleContainer","hideNewBtnMenuTimeout","transition","activeClassName","onFocus","clearRecentSearchBtn","clearRecentSearch","fakeGradientDelimiter","generateDelimiter","hr","captionArgs","delimiter","appSidebarLeft","AppAddMembersTab","attachToPromise","isPrivacy","removeLoader","AppChatFoldersTab","filtersRendered","renderFolder","dialogFilter","non_contacts","broadcasts","bots","isAnyGroup","filtersStorage","getFilter","createFolderBtn","foldersSection","suggestedSection","canCreateFolder","onFiltersContainerUpdate","getDialogFilters","toggleAllChats","getSuggestedFilters","loadAnimationPromise","getSuggestedDialogsFilters","suggestedFilters","includePeerIds","excludePeerIds","pinnedPeerIds","createDialogFilter","bool","AppIncludedChatsTab","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","editFolderTab","originalFilter","cmp","pinned_peers","other","otherLegacy","getInputPeerById","setFilter","onAppConfig","dialog_filters_chats_limit_premium","dialog_filters_chats_limit_default","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","selectedPeers","addedInitial","_add","flag","hasOwnProperty","AppEditFolderTab","flags","deleteFolderButton","updateDialogFilter","menuBtn","inputSection","generateList","h2Text","to","includedFlagsContainer","excludedFlagsContainer","include","include_peers","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","onCreateOpen","onEditOpen","ul","ignoreClick","hasPeer","getDialogOnly","filtered","filterAsync","renderMore","_length","exclude_peers","RIGHT_COLUMN_ACTIVE_CLASSNAME","AppSidebarRight","canHideFirst","isColumnProportionSet","toggleSidebar","setColumnProportion","createSharedMediaTab","replaceSharedMediaTab","previousTab","sharedMediaTab","historyTabIds","_selectTab","getFrom","setFrom","onCloseTab","isNavigation","willChange","animationPromise","appSidebarRight","AppEditContactTab","notificationsCheckboxField","profileNameDiv","profileSubtitleDiv","phoneRow","addContact","btnDelete","deleteContacts","AppChatTypeTab","privateRow","publicRow","privateSection","publicSection","linkRow","btnRevoke","getChatInviteLink","linkInputField","applyBtn","head","getValue","migrateChat","toggleNoForwards","onChatUpdate","noforwards","AppUserPermissionsTab","destroyListener","ChatPermissions","rights","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","kickFromChannel","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","defaultRights","combineParticipantBannedRights","restrictionText","mainFlag","until_date","AppGroupPermissionsTab","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","setSubtitle","bannedRights","cantWhat","getPeerId","listEl","setLength","exceptionsCount","loader","setLoader","getPromise","migrateFrom","migrateTo","AppChatReactionsTab","getActiveAvailableReactions","_chatReactions","available_reactions","chatReactions","reactions","makeReactionFromEmoticons","getCaptionLangPackKey","toggleSection","reactionsSection","toggleCheckboxFieldsByEmoticons","checkboxFieldsByEmoticon","toggleCheckboxField","toggleRow","save","checkboxFields","every","saveReactionsDebounced","allow_custom","saveReactions","setChatAvailableReactions","isDebounced","AppEditChatTab","_init","chatUpdateListeners","addChatUpdateListener","getCachedFullChat","canChangeType","canChangePermissions","chatNameInputField","descriptionInputField","chatTypeRow","setChatTypeSubtitle","setReactionsLength","availableReactionsLength","chatAvailableReactions","permissionsRow","setPermissionsLength","getChatTyped","editTitle","editAbout","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","historiesStorage","AppSharedMediaTab","newCloseBtn","closeBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","editBtn","transitionLastItem","secondTitle","setIsSharedMedia","isSharedMedia","onCloseBtnClick","toggleEditBtn","renderNewMessages","msgs","deleteDeletedMessages","btnAddMembers","showConfirmation","addChatUser","setLoadMutex","peerChanged","loadSidebarMedia","destroyable","SetTransition","raf","afterTimeout","SidebarSlider","closeTab","closingId","preserveTab","getTab","isTabExists","doNotAppend","SliderSuperTab","_constructor","SliderSuperTabEventable","dispatchResultableEvent","SortedUserList","getIndex","getUserStatusForSort","onDelete","onListLengthChange","onUpdate","onSort","willChangeLength","onElementCreate","base","updateElementWith","updateListWith","createChatListOptions","doTimeout","updateList","SORT_INTERVAL","hasViewer","attachStickerViewerListeners","findTarget","originalFindTarget","checkForParent","closest","mediaContainer","previousGroup","_middleware","previousTransformer","doThatSticker","lockGroups","isSwitching","effectThumb","mediaRect","boxSize","fitted","aspectFitted","transformer","transformX","transformY","needFadeIn","withThumb","relativeEffect","loopEffect","firstFramePromise","prevPlayer","ready","onMousePreMove","newMediaContainer","_previousTransformer","StickyIntersector","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","elementsObserver","addSentinel","sentinel","headerSentinel","getEvent","attachGlobalListenerTo","RESET_GLOBAL","SwipeHandler","listenerOptions","hadMove","xDown","yDown","handleMove","setCursorTo","handleStart","xUp","yUp","onSwipeResult","setCursor","TelInputField","pasted","lastValue","telEl","HTMLInputElement","pixelRatio","devicePixelRatio","letterSpacing","originalFunc","formattedPhoneNumber","leftPattern","shiftKey","toastEl","hideToast","toastNew","slideNavigation","prevTabContent","slideTabs","TransitionSlider","isHeavy","animationFunction","Transition","withAnimationListener","onTransitionEndCallbacks","animationDeferred","listenerName","onEndEvent","overrideFrom","onTransitionEndCallback","transitionTimeout","_from","isUsernameValid","UsernameInputField","checkUsernameDebounced","checkUsername","checkUsernamePromise","available","VisibilityIntersector","locked","change","refreshVisible","VolumeSelector","onMuteClick","setVolume","iconIndex","ICONS","wrapCustomEmoji","repeat","wrapDocument","noAutoDownload","uploadFileName","audioElement","extSplitted","ext","docDiv","icoDiv","icoTextEl","hadContext","hasThumb","performance","fileName","bytesContainer","descriptionParts","bytesMaxEl","sizeDiv","_downloadDiv","addByteProgress","sizeContainer","_bytesContainer","_d","canOpenAfter","downloadFileName","downloadId","apiFileManager","isDownloading","_limitSymbols","support","was_online","today","getDate","dateEl","timeEl","wrapJoinVoiceChatAnchor","wrapUrl","call","wrapLinkToMessage","plain","savedFrom","dir","wrapMessageActionTextNew","unsafeMessage","getNameDivHTML","formatCallDuration","post","schedule_date","daysToStart","tomorrowDate","_args","day","pinnedMessage","reply_to_mid","fetchMessageReplyTo","htmlToSpan","user_id","joined","anchorHTML","domain","isRecurringInit","recurring_init","isRecurringUsed","recurring_used","paymentsWrapCurrencyAmount","total_amount","currency","invoiceMessage","reply_to","reply_to_peer_id","period","waited","wrapMessageActionTextNewUnsafe","wrapMessageForReply","usingMids","withoutMediaType","hasAlbumKey","addPart","part","usingFullAlbum","grouped_id","getMidsByMessage","albumText","getAlbumText","poll","question","game","extended_media","actionWrapped","restriction_reason","exec","messageWrapped","noLinks","noTextFormat","wrapPeerTitle","wrapPhoto","withTail","noThumb","blurAfter","isWebDoc","isFit","loadThumbPromise","isGif","renderOnLoad","canAttachPreloader","haveToDownload","onlyCache","getDownloadPromise","wrapSenderToPeer","senderTitle","fromMe","wrapSentTime","STICKER_EFFECT_MULTIPLIER","locksUrls","videosCache","wrapSticker","loadStickerMiddleware","exportLoad","needUpscale","skipRatio","asStatic","fullThumb","noPremium","isCustomEmoji","syncedVideo","stickerType","emojiSticker","animatedSticker","staticSticker","isAnimated","getStickerEffectThumb","willHaveLock","lockUrl","toneIndex","isThumbNeededForType","lottieCachedThumb","getLottieCachedThumb","haveThumbCached","afterRender","num","getPathFromBytes","ns","getPreviewURLFromThumb","stickerThumbConverted","webpWorkerController","saveWebPConvertedStrippedThumb","getImageFromStrippedThumb","middlewareError","makeError","animationData","sync","setLockColor","dpr","skipx","skipy","imageData","sr","sg","sb","sa","outCanvas","outContext","computeLockColor","saveLottiePreview","onFirstFrame","preloadAnimatedEmojiStickerAnimation","isSingleVideo","cacheName","framesCache","cachePromise","previousTime","playedTimes","onTimeupdate","mediaLength","lastPromise","_media","preloadSticker","playing","animationDiv","stickerPromise","side","attachStickerEffectHandler","onEmojiStickerClick","getAnimatedEmojiSoundDocument","restart","getAnimatedEmojiSticker","emojiData","sendInteractionThrottled","msg_id","getServerMessageId","interaction","JSON","stringify","withRandomOffset","wrapStickerAnimation","unmountAnimation","create","frameNo","maxFrame","vibrate","generateRandomSigned","randomOffsetX","randomOffsetY","setPosition","factor","stableOffsetX","stableOffsetY","rectX","rectY","addOffsetX","addOffsetY","wrapStickerEmoji","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","videos","getDocPromise","thumb_document_id","wrapStickerToRow","previousMedia","_size","roundVideoCircumference","wrapVideo","videoSize","isAlbumItem","canAutoplay","spanTime","spanPlay","needPlayButton","photoRes","divRound","halfSize","strokeWidth","radius","strokeDashoffset","globalVideo","onPaused","onFrame","renderDeferred","loadPhotoThumbFunc","wrapWebPageDescription","webPage","shortDescriptionText","wrapWebPageTitle","shortTitle","site_name","EmojiVersions","Emoji","version","assign","FontFamily","FontSize","FontWeight","instances","getAnimationInstance","cancelAnimationByKey","instance","isCancelled","animateSingle","tick","createAnimationInstance","array","AudioAssetPlayer","assets","playSound","assetName","createAudio","playSoundIfDifferent","Audio","stopSound","cancelDelayedPlay","playSoundWithTimeout","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","possiblePromise","process","realResult","timedChunk","requireBlurPromise","fastBlurFunc","processBlurNext","iterations","default","dataUri","JPEG_HEADER","bytesFromHex","JPEG_TAIL","isSticker","btoa","bytesToDataURL","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","getTextWidth","measureText","mediaSize","quality","badCharsRe","trimRe","C2L","clearBadCharsAndTrim","latinize","processSearchText","clearBadChars","ignoreCase","hasTag","includeTag","charAt","originalText","ch","latinizeCh","latinizeString","fixCyrillic","copyTextToClipboard","clipboard","writeText","textArea","removeChild","fallbackCopyTextToClipboard","ContextMenuController","diffX","diffY","isOpened","openBtnMenu","months","days","ONE_DAY","getWeekNumber","UTC","getMonth","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","formatDateAccordingToTodayNew","weekday","formatFullSentTimeRaw","formatTime","capitalize","textTransform","formatFullSentTime","getFullDate","joiner","monthAsNumber","getHours","getMinutes","noSeconds","leadingZero","noTime","minYear","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","setFullYear","dayOfWeek","formatWeekLong","getDay","getDayOfWeek","setTime","g1","g2","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","onCancel","onStart","onMove","isTouch","onTouchEnd","CLICK_EVENT_NAME","touchMouseDown","detachClickEvent","simulateClickEvent","ControlsHover","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","toggleControls","relatedTarget","verifyFavoriteSticker","toAdd","favedStickers","_doc","findElement","filterButtons","attachListenerSetter","_element","initResult","createContextMenu","disablePictureInPicture","computedStyle","getProperty","simulateEvent","childNodes","tag","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getCaretPosF","childNodesLength","alt","markdownTags","entityName","underline","italic","monospace","strikethrough","mentionName","BLOCK_TAG_NAMES","BOM_REG_EXP","checkNodeForEntity","follow","getRichElementValue","lines","line","selNode","selOffset","isBlock","isTableCell","wasEntitiesLength","wasLength","field","withEntities","withCaret","DocumentFragment","startOffset","startContainer","possibleChildrenFocusOffset","getCaretPos","caretPos","getViewportSlice","overflowRect","extraSize","invisibleTop","invisibleBottom","foundVisible","lookForSticky","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","windowWidth","windowHeight","handleHorizontalSwipe","cancelY","template","isSendShortcutPressed","isComposing","secondaryKey","isSwipingBackSafari","TouchEvent","placeCaretAtEnd","ignoreTouchCheck","selectionStart","selectionEnd","prevPos","backgroundImage","useCache","isImage","renderImageFromUrlPromise","renderMediaWithFadeIn","compareNodes","node1","node1Offset","node2","node2Offset","parents","commonAncestorContainer","NOT_ONLY_BOMS_REG_EXP","USING_BOMS","RichInputHandler","saveSelectionOnChange","saveRangeForElement","onFocusOut","lastNode","lastOffset","onSelectionChange","setSelectionClassName","caret","getCaretPosN","move","superMove","modify","getFiller","addInputCallback","startsWith","processEmptiedFillers","fixInsertedLineBreaks","moveFirst","setEnd","isBOM","deleteData","processFilledFillers","removeEmptyTextNodes","fixBuggedCaret","savedRanges","IS_FIREFOX","inputCaptureCallbacks","anchorNode","findPreviousSmthIndex","something","fromSelectionChange","smthIndex","moved","idxidx","rangeString","onlyBOMs","restoreSavedRange","makeFocused","newCallback","sibling","needed","treeWalker","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","textNode","nextNode","removePossibleBOMSiblings","removePossibleBOMSiblingsByNode","cleanSiblings","insertData","bomNode","intersectsNode","focusNode","focusNodeBefore","focusOffset","focusOffsetBefore","collapseToStart","collapseToEnd","focusNodeAfter","focusOffsetAfter","prepareApplyingMarkdown","fillers","smths","INSTANCE","countNonElements","DropdownHover","onClickOut","ignoreButtons","ignoreMouseOut","toElement","willBeActive","inited","timeouts","attachButtonListener","setIgnoreMouseOut","onmouseout","onmouseover","FocusDirection","fastSmoothScroll","maxDistance","Static","scrollWithJs","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","elementScrollSizeKey","scrollPositionKey","elementRect","possibleElementPosition","containerSize","scrollSize","fallbackToElementStartWhenCentering","remainingPath","absPath","startAt","shortTransition","longTransition","currentPath","distanceToEnd","FILENAME_JOINER","getFileNameByLocation","thumb_size","big","stickerset","short_name","thumb_version","volume_id","local_id","strictDecimals","_decimals","dm","fixed","pow","parseFloat","CALL_DURATION_LANG_KEYS","mm","showLast","dd","formatDuration","strings","prefixes","maxPrefixLength","setPrefix","originalStr","prefixCountry","patterns","searchForPattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","FramesCache","framesNew","framesURLs","getCache","createCache","releaseCache","getCacheCounter","generateName","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","tl","tr","bl","useBlur","ignoreCache","ListLoader","loadedAllDown","setLoaded","unsetCurrent","toPrevious","goUnsafe","leftLength","down","loadPromiseDown","loadPromiseUp","processedArr","processed","ListenerSetter","listeners","addManual","onceCallback","onceFired","_listener","MediaSize","aspect","aspectCovered","makeMediaSize","ScreenSize","CUSTOM_EMOJI_SIZE","ESG_CUSTOM_EMOJI_SIZE","EMOJI_STATUS_SIZE","MediaSizes","screenSizes","mobile","medium","large","handhelds","regular","album","esgSticker","documentName","invoice","extendedInvoice","customEmoji","esgCustomEmoji","popupSticker","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","MIDDLEWARE_ERROR","MiddlewareHelper","onCleanCallbacks","onDestroyCallbacks","onDestroy","additionalCallback","onClean","getMiddleware","middlewarePromise","throwWhat","numberThousandSplitter","HAVE_METADATA","useCanplayOnIos","loadEventName","errorEventName","OverlayClickHandler","withOverlay","amount","skipSymbol","isNegative","currencyData","amountExp","exp","number","dec_point","thousands_sep","n","isFinite","prec","sep","dec","toFixedFix","number_format","decimal_sep","space_between","symbol_left","splitter","additionalPadding","getScrollWidthFromElement","menuWidth","menuHeight","paddingRight","paddingBottom","paddingLeft","verticalSide","maxTop","maxLeft","minLeft","sides","intermediateX","intermediateY","possibleSides","platforms","getRestrictionReason","reasons","reason","savingLottiePreview","isSavingLottiePreview","saving","throttleWithRaf","fn","schedulerFn","waiting","throttleWith","ScrollableLoader","SearchListLoader","messageId","generateMessageId","filterMids","onHistoryDelete","shouldBeDeleted","onHistoryMultiappend","onMessageSent","isInner","otherSideLoader","filterMessagesByInputFilterFromStorage","goToOtherEnd","do","kind","scheduleFlush","measure","mutate","mutateElement","read","write","pushDocumentSize","_isWebDocument","replies","comments","channel_id","BatchProcessor","bindPrefix","queuePromise","addToQueue","setQueue","possibleError","perf","renderedQueue","SortedList","batchProcessor","_updateList","canUpdate","getAll","createPromise","noScheduler","encodeEntities","charCodeAt","limitFrom","leadZero","sec_num","hours","minutes","seconds","visualViewport","innerHeight","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","_heavyAnimationPromise","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","DialogsContextMenu","onArchiveClick","selectedId","editPeerFolders","folder_id","onPinClick","toggleDialogPin","config","getConfig","pinned_dialogs_count_max","onUnmuteClick","onUnreadClick","unread_count","readHistory","top_message","markDialogUnread","onContextMenu","getDeleteButtonText","isDialogUnread","pinned","ConnectionStatusComponent","hadConnect","connecting","timedOut","updating","setConnectionStatus","overrideStatus","baseDcId","connectionStatus","setFirstConnectionTimeout","online","apiUpdatesManager","forceGetDifference","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","singleInstance","CHANGE_STATE_DELAY","getA","networkerFactory","forceReconnect","timerSpan","interval","forceReconnectTimeout","setStateTimeout","statusContainer","SENDING_STATUS","easeInOutSine","easeInOutSineApply","roundRect","stroke","defaultRadius","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","DPR","SIZE","MARGIN","WIDTH","RADIUS","Shimmer","currTime","diffTime","spread","pausedTime","pauseInterval","lightSource","lightSpread","currentAnimationIndex","keepTime","cycleAnimation","currentAnimation","animateGlow","animateSlide","smartInc","lightLeft","lightRight","lightCenter","createLinearGradient","customProperties","shimmerColor","addColorStop","dict","on","fillText","DialogsPlaceholder","onThemeChange","stopAnimation","startAnimation","onResize","updateCanvasSize","shimmer","generatedValues","marginVertical","lineHeight","lineBorderRadius","lineMarginVertical","statusWidth","getRectFrom","onRemove","blockScrollable","overflowY","availableLength","detachTime","renderDetachAnimationFrame","globalCompositeOperation","completed","elapsedRowTime","dialogHeight","renderFrame","createPattern","patternCanvas","patternContext","drawChat","firstLineWidth","secondLineWidth","marginLeft","arc","drawCircle","drawCircleFromStart","setPromiseMiddleware","oldPromise","SortedDialogList","indexKey","getDialogIndex","addListDialog","isBatch","DialogElement","bigger","abitbigger","small","captionDiv","titleSpanContainer","peerTitlePromise","statusSpan","lastTimeSpan","unreadBadge","rightSpan","dialogDom","setDialogActive","AppDialogsManager","Log","placeholders","sortedLists","scrollables","folders","menuScrollContainer","lastActiveElements","offsets","initedListeners","loadedDialogsAtLeastOnce","onTabChange","loadDialogsRenderPromise","loadDialogsPromise","sortedList","onChatsScroll","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","dialogSize","loadContacts","verifyPeerIdForContacts","processContact","setListClickListener","onChatsRegularScroll","sliceTimeout","scrollTopWas","rectContainer","rectTarget","firstY","lastY","firstElement","elementFromPoint","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","getProxiedManagers","contextMenu","stateMiddlewareHelper","bottomPart","allChatsIntlElement","isFilterIdAvailable","clearCurrent","showFiltersPromise","onStateLoaded","setFilterId","addFilter","foldersScrollable","_id","filtersNavigationItem","setFilterIdAndChangeTab","changeFiltersAllChatsKey","groupCallsController","callsController","getDialogIndexKey","getDialogIndexKeyByFilterId","setOnlineStatus","hasClassName","initListeners","getDialogDom","isBot","processDialogForCallStatus","setFilterUnreadCount","setLastMessageN","setUnread","validateDialogForFilter","setFiltersUnreadCount","updateDialog","setUnreadMessagesN","drop","getCachedDialogs","validateListForFilter","onFiltersLengthChange","containerToAppend","renderedFilter","typings","unsetTyping","callIcon","filtersArr","haveFilters","addFilters","addFiltersPromise","doNotRenderChatList","getNotifyPeerTypeSettings","fillConversations","getOffsetIndex","isDialogMustBeInViewport","migratedTo","testDialogForFilter","topOffset","bottomOffset","unreadSpan","unread","unreadUnmutedCount","unreadCount","getFolderUnreadCount","generateScrollable","sortedDialogList","createChatList","wasShowing","cachedInfoPromise","currentOffsetIndex","needIndex","getConversationsResult","isTopEnd","offsetDialog","generateEmptyPlaceholder","classNameType","subtitleArgs","placeholderContainer","needPlaceholder","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","firstDialog","getDialogFromElement","lastDialog","withContext","openInner","lastActiveListElement","setPeerFunc","sameElement","getDialogByPeerId","setLastMessage","draftMessage","draft","topMessage","isMessageRestricted","willPrepend","videoTypes","playIcon","setUnreadMessages","wasMuted","setStatusMessage","isPinned","hasUnreadBadge","transitionDuration","disableAnimationIfRippleFound","iconClassName","setSendingStatus","isUnreadBadgeMounted","hasMentionsBadge","unread_mentions_count","isMentionBadgeMounted","mentionsBadge","isUnread","isMention","getDialog","originalDialog","getOutputPeer","setCallStatus","START_X","wasMounted","itemProgress","groupCallActiveIcon","addDialogNew","call_active","call_not_empty","addDialogAndSetLastMessage","getMessageSenderPeerIdOrName","addDialog","titleP","oldTypingElement","newTypingElement","downloads","getNewDeferred","cancelDownload","clearDownload","getNewDeferredForUpload","getUpload","getDownload","getUploadPromise","getDownloadFileNameFromOptions","downloadMedia","promiseBefore","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","getFileNameForUpload","downloadToDisc","justAttach","pingPromise","iframe","hadProgress","getDocumentDownloadOptions","getPhotoDownloadOptions","clickEvent","createEvent","initMouseEvent","createDownloadAnchor","BubbleGroup","createAvatar","avatarLoadPromise","avatarContainer","fwdFrom","fwdFromId","isForwardFromChannel","from_id","currentPeerId","firstTimestamp","firstItem","firstMid","lastTimestamp","lastItem","lastMid","updateClassNames","insertItem","insertInDescendSortedArray","sortGroupItemsKey","insertGroup","mount","onItemUnmount","mountItem","onItemMount","unmountItem","dateContainer","getDateContainerByTimestamp","dateGroups","_group","dateGroupsLength","unmountedLength","STICKY_OFFSET","deleteEmptyDateGroups","BubbleGroups","itemsArr","itemsMap","newGroupDiff","sortItemsKey","sortGroupsKey","removeItemFromCache","removeAndUnmountBubble","getItemByBubble","siblings","getSiblingsAtIndex","modifiedGroups","canItemsBeGrouped","groupUngrouped","mountUnmountGroups","toMount","toUnmount","bad","partition","getLastGroup","changeBubbleMid","insertItemToArray","changeItemBubble","changeBubbleByBubble","item1","item2","itemIndex","findGroupSiblingByItem","findGroupSiblingInItems","previousItem","siblingGroupedItem","nextItem","addItemToGroup","addItemToCache","getMessageFromId","viaBotId","createItem","SERVICE_AS_REGULAR","getDateForDateContainer","groupMid","splitSiblingsOnGrouping","prepareForGrouping","hadGroup","foundItem","splittedGroups","PopupDatePicker","initDate","onPick","noButtons","selectedDate","selectedMonth","minMonth","prevBtn","maxMonth","onDateClick","selectedEl","setTimeTitle","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","setMinutes","popupCenterer","timeOptions","sendDate","dateOptions","renderElement","firstDate","weekStartDate","dayIndex","clonedDate","showOverflowMonths","remainder","DivAndCaption","MEDIA_SIZE","wrapReplyDivAndCaption","mediaEl","messageMedia","isRound","mediaChildren","video_thumbs","ReplyContainer","isMediaSet","wrapReply","setColorPeerId","replyContainer","CLASS_NAME","StackedAvatars","AVATAR_CLASS_NAME","RepliesElement","updated","postKey","leftPart","recent_repliers","stackedAvatars","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","chatType","editedSpan","sponsoredSpan","isSponsored","sponsored","isMessage","views","postAuthor","post_author","postViewsSpan","channelViews","edit_date","edit_hide","timeSpan","clonedArgs","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","replyToPeerId","originalMessage","originalPeerTitle","titlePeerId","originalMessageFwdFromId","needUpdate","replyMid","getElementByPoint","horizontalSide","reflowScrollableElement","SEND_WHEN_ONLINE_TIMESTAMP","INTERNAL_LINK_TYPE","PopupJoinChatInvite","chatInvite","request_needed","importChatInvite","savePhoto","peopleCount","ReactionElement","reactionCount","_reactionCount","setCanRenderAvatars","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","callbackify","center_icon","renderDoc","wrapPromise","wrapStickerPromise","renderCounter","displayOn","renderAvatars","recentReactions","peer_id","setIsChosen","isChosen","chosen_order","fireAroundAnimation","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","removeOnFrame","REACTIONS_ELEMENTS","ReactionsElement","middlewareHelpers","onConnectCallback","getReactionCount","reactionElement","getMessage","isPlaceholder","changeMessage","changedResults","hasReactions","counts","reactionsEqual","totalReactions","can_see_list","recent_reactions","handleChangedResults","ScrollSaver","getSaved","findElements","replaceSaved","findAndSetElements","_save","scrollHeightMinusTop","onRestore","useReflow","setScrollTop","newScrollTop","restore","_restore","previousScrollHeightMinusTop","SuperIntersectionObserver","observing","observingQueue","freezedObservingNew","callbacks","toggleObservingNew","isMentionUnread","mentioned","accumulate","stringResults","numberResults","replaceNonNumber","CARD_BRAND_REGEXP","visa","mastercard","amex","discover","diners","diners14","jcb","unionpay","elo","mir","CARD_BRANDS","minLength","cvcMaxLength","cvcMinLength","unknown","detectCardBrand","card","sanitizedCard","brand","detectUnifiedCardBrand","createArray","delta","buggedRegExp","getDistanceFromBuggedToNormal","char","fixBuggedNumbers","makeOptionalCharacter","consumed","makeRequiredCharacter","partial","wrapCharacterRegExpFactory","optional","_regExp","source","makeCharacter","makeMonthDigitPatternCharacter","digit","capitalCharacter","cleanedResult","formattingCharacter","str1","makeFormattingCharacter","optionalPattern","spaceCharacter","yearOptionalPattern","sixteenPattern","fifteenPattern","requiredPostcodes","generateFourPattern","cardFormattingPatterns","cardNumber","cardExpiry","cardCvc","cardCvcFromBrand","postalCodeFromCountry","optionalDigits","accumulateLengths","strs","nbspRegExp","makeValidationError","validateCardNumber","sanitized","getCardInfoByNumber","ignoreIncomplete","validateCompleteCardNumber","makeCardNumberError","validateCardExpiry","monthStr","yearStr","_year","nextMonth","isNaN","validateExpiry","createVerificationIframe","allow","onMount","contentWindow","parse","PopupPaymentVerification","openPathAfter","eventType","eventData","path_full","InputFieldCorrected","lastKeyDown","deleting","lastTransformed","getPattern","pushRest","autocorrectComplete","character","getCharacter","meta","formatInputValueByPattern","formatMethod","transformedValue","validateNew","onBlur","justReturn","validateMethod","validateAnyIncomplete","errorKeys","handleInputFieldsOnChange","_onChange","createCountryZipFields","zip","countryInputField","postcodeInputField","SUPPORTED_NATIVE_PROVIDERS","PopupPaymentCard","paymentForm","savedCard","native_provider","cardOut","token","credentials","can_save_credentials","cardSection","nativeParams","native_params","lastBrand","lastBrandImg","brandIconTempId","cardInputField","invalid","incomplete","transformed","getPaymentBrandIconPath","setBrandIcon","cvcInputField","need_cardholder_name","expireInputField","switchFocusOrder","previousInputField","nextInputField","inputFieldsRow","billingSection","need_country","need_zip","canSave","saveCheckboxField","saveRow","payButton","PaymentButton","expiryFull","expiryMonth","expiryYear","cvc","cardholderName","nativeProvider","URLSearchParams","headers","publishable_key","expiration_month","expiration_year","security_code","public_token","PopupPaymentCardConfirmation","inputCheckPassword","getInputCheckPassword","tmpPassword","password","handled","PopupPaymentShipping","inputInvoice","savedInfo","saved_info","addressSection","address1InputField","address2InputField","cityInputField","stateInputField","receiverSection","emailInputField","shipping_address_requested","name_requested","email_requested","phone_requested","validateEmail","validatePhone","selectedCountry","shipping_address","street_line1","street_line2","city","country_iso2","post_code","requestedInfo","validateRequestedInfo","shippingAddress","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_CITY_INVALID","ADDRESS_STATE_INVALID","ADDRESS_POSTCODE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_EMAIL_INVALID","REQ_INFO_PHONE_INVALID","focusField","PopupPaymentShippingMethods","shippingOption","shipping_options","prices","lastShippingId","option","PopupPayment","isReceipt","tipButtonsMap","confirmed","onConfirmed","popupPaymentVerification","mediaInvoice","receipt_msg_id","isTest","itemEl","detailsClassName","photoEl","linesClassName","linesEl","botName","preloaderContainer","getPaymentReceipt","getPaymentForm","savedCredentials","saved_credentials","lastRequestedInfo","providerPeerTitle","provider_id","bot_id","wrapAmount","isRecurring","recurring","peerTitle2","makeLabel","pricesClassName","makePricesElements","price","_label","wrappedAmount","pricesElements","getTipsAmount","shippingAmount","setTotal","totalAmount","totalLabel","payI18n","canTip","max_tip_amount","tip_amount","tipsClassName","getInputValue","setInputWidth","setInputValue","unsetActiveTip","tipEl","tipsLabel","haveToIgnoreEvents","ignoreNextSelectionChange","tipsEl","tipClassName","tipButtons","suggested_tip_amounts","tipAmount","prevTipEl","setRowIcon","setRowTitle","setCardSubtitle","methodRow","onMethodClick","previousCardDetails","previousToken","credentials_title","providerRow","providerAvatar","shippingAddressRow","shippingNameRow","shippingEmailRow","shippingPhoneRow","shippingMethodRow","lastShippingOption","onShippingAddressClick","onShippingMethodClick","setShippingTitle","postAddress","setShippingInfo","setShippingOption","scrollSaver","lastShippingPricesElements","shipping","acceptTermsCheckboxField","recurring_terms_url","acceptTermsRow","recurringElements","lastTmpPasword","missingInfo","tmp_password","paymentResult","sendPaymentForm","form_id","_passwordState","valid_until","tsNow","Layouter","minWidth","spacing","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","ComplexLayouter","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","RectPart","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","cropRatios","attempts","multiHeight","sum","pushAttempt","lineCounts","heights","second","third","fourth","optimalAttempt","optimalDiff","attempt","lineCount","totalHeight","minLineHeight","bad1","bad2","optimalCounts","optimalHeights","rowCount","colCount","col","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","attachmentDiv","uploading","AppPollResultsTab","resultsDiv","appPollsManager","getPoll","quiz","voters","total_voters","roundPercents","answer","answers","answerEl","answerTitle","answerPercents","getVotes","votesList","votes","vote","lineTotalLength","minIndex","minRemainder","maxRemainder","pollElement","isClosed","closed","performResults","chosenIndexes","PollElement","setMaxLength","resizePolls","hideQuizHint","onHide","prevQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","isListenerSet","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","circumference","closeTime","quizInterval","timeLeft","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","initQuizHint","solution","solution_entities","toggleHint","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","getPercentValue","iterate","fullTime","votersCount","justRtlDirCheck","DotRenderer","dots","generateDot","adding","Path2D","mOpacity","draw","dot","addOpacity","easedOpacity","globalAlpha","renderFirstFrame","IGNORE_ACTIONS","TEST_SCROLL_TIMES","TEST_SCROLL","PEER_CHANGED_ERROR","BIG_EMOJI_SIZES","BIG_EMOJI_SIZES_LENGTH","getMainMidForGrouped","ChatBubbles","unreadOut","bubblesNewByGroupedId","bubblesNew","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","messagesQueueOnRenderAdditional","firstUnreadBubble","replyFollowHistory","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","renderingMessages","bubblesToEject","bubblesToReplace","setPeerTempId","renderNewPromises","extendedMediaMessages","unreadedObserverCallback","onUnreadedInViewport","viewsObserverCallback","sendViewCountersDebounced","sponsoredMessage","random_id","viewSponsoredMessage","stickerEffectObserverCallback","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getGroupsFirstMessage","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","setInnerPeer","chatInner","onDatePick","contactDiv","callDiv","callUser","getInputInvoiceByPeerId","reactionsElement","stickerEmojiEl","bubbleMid","reply_to_top_id","saved_from_msg_id","openThread","message1","getMessageWithReplies","getDiscussionMessage","via","setDraft","peerIdStr","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","hasAspecter","albumItem","isReplyClick","replyToMid","reply_to_msg_id","scrollDimensions","forceDown","sliceViewportDebounced","setCorrectIndexThrottled","setStickyDateManually","setPeerPromise","processBatch","loadQueue","filterQueue","avatarPromises","groupBubbles","updatePosition","timePromises","groupCollapsed","groupEnd","setUnreadDelimiter","restoreScroll","prepareToSaveScroll","ejectBubbles","oldBubble","bubbleGroups","updatePlaceholderPosition","requestHistory","setMessageId","constructBubbles","sequential","messagesStorageKey","messagesQueuePromise","newItem","_items","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","_bubble","groupedId","getMessagesByAlbum","reactionsElements","repliesElement","newDiv","safeRenderMessage","scrollToBubbleIfLast","deletedMids","wasMainMid","mainMid","createScrollSaver","appendReactionsElementToBubble","dateMessage","dateBubble","previousStickyDate","sliceViewport","setScroll","attachContainerListeners","highlightBubble","replyAfter","shouldReply","canSend","_target","initMessageReply","constructPeerHelpers","updateGradient","renderNewMessage","setUnreadCount","updateUnreadByDialog","finishPeerChange","postViewsElements","different","postViews","incrementMessageViews","createResizeObserver","resizeObserver","wasHeight","skip","scrolled","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","destroyResizeObserver","setReactionsHoverListeners","getRenderedLength","readUnreaded","readPromise","idleController","bubblesMaxId","getHistoryMaxId","readContents","constructPinnedHelpers","constructScheduledHelpers","getScheduledMessagesStorage","onGoDownClick","getBubbleByPoint","getGroupedBubble","groupId","getMidsByAlbum","findNextMountedBubbleByMsgId","filterCallback","_mid","foundMid","loadMoreHistory","getHistoryTopPromise","getHistoryBottomPromise","getHistory1","destroyScrollable","getHistoryStorage","readMaxId","readOutboxMaxId","msgId","destroyBubble","permanent","ignoreOnScroll","pollExtendedMediaMessages","getExtendedMedia","setExtendedMediaMessagesPollInterval","pollExtendedMediaMessagesPromise","setTopPadding","setPaddingTo","isPaddingNeeded","unsetPadding","_renderNewMessage","newMessage","replyTo","getLastBubble","performHistoryResult","scrollToBubbleEnd","scrollToBubble","isChangingHeight","messageInput","dimensions","datasetKey","createDateBubble","bubbleContent","serviceMsg","fakeBubble","bubblesToo","cleanupPlaceholders","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","attachPlaceholderOnRender","emptyPlaceholderBubble","samePeer","startParam","onChangePeer","getPinnedMessagesMaxId","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","foundSlice","findSliceOffset","isJump","isStartButtonNeeded","setStartParam","setQueueId","messageEntityBotCommand","additionMsgId","maxBubbleId","oldChatInner","oldPlaceholderBubble","haveToScrollToBubble","fromUp","scrollFromDown","scrollFromUp","willScrollOnLoad","setPeerOptions","waitPromise","setPeerCached","mountedByLastMsgId","setCorrectIndex","lastBubble","onRenderScrollSet","afterSetPromise","setFetchReactionsInterval","setFetchHistoryInterval","onScrolledAllDown","unread_mark","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","getNewHistory","isBottomEnd","historyMaxId","canWrite","renderMessagesQueue","isAvatarNeeded","processResult","newBubble","originalPromise","renderMessage","albumMids","reactionsMessage","albumMessages","albumMustBeRenderedFull","our","isOurMessage","contentWrapper","isInUnread","chat_id","is_single","messageMessage","needToSetHTML","bigEmojis","emojiEntities","strLength","curr","richText","canHaveTail","isStandaloneMedia","haveRTLChar","replyMarkup","reply_markup","replyMarkupRows","containerDiv","rowDiv","buttonEl","botId","same_peer","checkSwitchReturn","switchInlineQuery","haveButtons","column","callbackButtonClick","callbackAnswer","messageWithReplies","getMessageWithCommentReplies","withReplies","isOutMessage","nameContainer","canHideNameIfMedia","processingWebPage","quote","previewResizer","preview","quoteTextDiv","strong","titleDiv","textDiv","isSquare","isEmoji","nopremium","newNameContainer","richTextFragment","getMidsByMid","wrapGroupedDocuments","lastContainer","contact","contactDetails","contactNameDiv","contactNumberDiv","phone_number","wrapPoll","extendedMedia","isAlreadyPaid","isNotPaid","innerMedia","wrappedPrice","priceEl","video_duration","videoTime","dc_id","file_reference","dotRenderer","needName","titleVia","isHidden","isForward","goto","generateTail","documentContainer","documentMessageDiv","viewportSlice","deleteViewportSlice","historyResult","needReflowScroll","setLoadedPromises","firstSlice","lastSlice","both","processLocalMessageRender","getHistory","ackedResult","getScheduledMessages","animateAsLadder","additionMsgIds","isAdditionRender","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","lastMsDelay","elementsToAnimate","transitionDelay","topRes","middleRes","bottomRes","delays","renderEmptyPlaceholder","listElements","getRestrictionReasonText","getGreetingSticker","channel_post","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","isWaitingForAnimation","noTransition","setOn","generateLocalMessageId","addOffset","generateLocalFirstMessage","service","saveMessages","ignoreScrollSaving","invisible","checkPlaceholders","toggleSponsoredMessage","renderBotPlaceholder","checkIfEmptyPlaceholderNeeded","getSponsoredMessage","sponsoredMessages","messagePromise","_log","getProfile","processPromise","bot_info","botInfo","description_document","description_photo","isBackLimit","resultPromise","isFirstMessageRender","serviceStartMessageId","getThreadServiceMessageId","sup","_promise","mustBeCount","PopupPinMessage","unpin","canUnpin","canPinMessage","oneSide","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","getPinnedMessagesCount","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","preloadAnimatedEmojiSticker","PopupReportMessagesConfirm","reportMessages","STICKER_EMOJI","PopupReportMessages","preloadStickerPromise","marginTop","PopupSponsored","PopupReactedList","canViewReadParticipants","canViewMessageReadParticipants","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTION_CLASS_NAME","REACTIONS_CLASS_NAME","CAN_USE_TRANSFORM","ChatReactionsMenu","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","renderReaction","setVisible","canUseAnimations","scaleContainer","appearWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","ChatContextMenu","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","viewerPeerId","canOpenReactedList","menuPadding","reactionsMenu","reactionsMenuPosition","isReactionsMenuVisible","offsetSize","nextVisiblePart","MIN_NEXT_VISIBLE_PART","minSize","onSendScheduledClick","onReplyClick","onFaveStickerClick","unfave","faveSticker","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","onUnpinClick","onRetractVote","onStopPoll","stopPoll","setButtons","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","getMessageFromStorage","canSaveMessageMedia","isGoodType","hasTarget","localName","emojiInputsPromise","getUniqueCustomEmojisFromMessage","filterUnique","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","AVATAR_SIZE","MAX_AVATARS","PADDING_PER_AVATAR","reactionsCount","fakeElem","readParticipants","totalSize","emojisButton","setPadding","inputsPromise","getCachedCustomEmojiDocuments","getCustomEmojiDocuments","SendMenu","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","setPeerId","PopupCreatePoll","onSubmitClick","send","radioLabel","isEmpty","questions","appendMoreField","correctAnswers","optionInputFields","questionInputField","sendSilent","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","getFilledAnswers","quizSolution","force","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","sendOther","getMessageSendingParams","helperType","clearHelper","questionField","createPosterFromMedia","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","PopupNewMedia","willAttachType","attachFile","willAttach","shouldCompress","itemDiv","attachMedia","attachDocument","sendFileDetails","captionLengthMax","caption_length_max","wasInputValue","messageInputField","attachFiles","appendDrops","appendGroupCheckboxField","groupCheckboxField","mediaCheckboxField","appendMediaCheckboxField","addFiles","toPush","_file","lastModified","isMedia","sendingParams","sendText","sendAlbum","replyToMsgId","objectURL","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onseeked","onerror","createPosterFromVideo","isPhoto","isAudio","finish","onRender","foundPhotos","foundVideos","foundFiles","appendMediaToContainer","firstType","albumContainer","HANDLE_EVENT","ACTIVE_CLASS_NAME","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","hadTarget","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","property","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","AutocompleteHelper","onVisible","listType","attachNavigation","controller","addHelper","toggleListNavigation","fromController","skipAnimation","hideOtherHelpers","StickersHelper","onChangeScreen","checkEmoticon","getStickersByEmoticon","getMinDate","getMaxDate","PopupSchedule","canSendWhenOnline","btnSendWhenOnline","EmojiHelper","chatInput","onEmojiSelected","checkQuery","firstChar","getBothEmojiKeywords","searchEmojis","AutocompletePeerHelper","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","commands","command","indexObject","CommandsHelper","getReadyToSend","sendMessage","AutocompleteHelperController","preserveHelper","MentionsHelper","insertAtCaret","topMsgId","trimmed","getMentions","ReplyKeyboard","onBodyTouchStart","btnHover","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","getHistoryStorageTransferable","InlineHelper","queryId","queryAndResultIds","generateQId","resultId","sendInlineResult","_checkQuery","botResults","query_id","gifsMasonry","isGallery","gallery","noCommands","separator","dcId","dataURL","switch_pm","btnSwitchToPM","switchToPM","ChatBotCommands","setUserId","modifyAckedResult","acked","modifyAckedPromise","ChatSendAs","sendAsButtons","previousAvatar","onSendAsMenuToggle","updateButtons","sendAsPeerId","changeSendAsPeerId","executeButtonsUpdate","sendAsPeerIds","saveDefaultSendAs","updateAvatar","getDefaultSendAs","getChannelFull","channelFull","default_send_as","updateManual","updatingPromise","wasSkippingAnimation","auto","getSendAs","sendAsPeers","sendAsPeer","premium_required","addedListener","USELESS_REG_EXP","InputFieldAnimated","updateInnerHTML","onFakeInput","inputFake","setHeight","currentHeight","hasMarkupInSelection","commonAncestor","SHOW_ELEMENT","POSTING_MEDIA_NOT_ALLOWED","ChatInput","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","onMessageInput","markdownEntities","parseMarkdown","urlEntities","getWebPagePromise","appWebPagesManager","getWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","resetCurrentFontFormatting","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","onBtnSendClick","forwarding","restricted","voice_messages_forbidden","releaseMediaPlayback","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","ms","recordTimeEl","needReturn","getCurrentInputAsDraft","no_webpage","draftsAreEqual","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","canToggleHideAuthor","onHideCaptionClick","forwardButtons","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","attachMenuButtons","fileInput","attachMenu","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","onstop","ondataavailable","typedArray","dataBlob","Blob","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","startBot","pinnedControlBtn","originalChat","pinnedMessageContainer","_center","neededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","getNeededFakeContainer","hasMentions","syncDraft","helperToo","clearInput","fromUpdate","getDraft","wrappedDraft","myEntities","apiEntities","wrapDraft","currentDraft","createSendAs","firstChange","sendAs","updateOffset","getPlaceholderKey","updateMessageInputPlaceholder","previousSendAs","ackedPeerFull","ackedScheduledMids","setSendAsCallback","filteredAttachMenuButtons","filterAttachMenuButtons","placeholderKey","hasBotCommands","updateBotCommands","updateMessageInput","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","readAllHistory","commandsMap","canCombine","hasMarkup","executed","resetCurrentFormatting","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","foundHelper","checkInlineAutocomplete","inlineMatch","btnPreloader","bot_inline_placeholder","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","getValueAndEntities","clearReply","unicode","pushRecentEmoji","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","sendMessageWithDocument","hideCaptionCheckboxField","replyFragment","initMessagesForward","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","newReply","intl","peerTitleEl","reloadMessages","_message","callerFunc","replyParent","oldReply","haveReply","CLASSNAME_BASE","PinnedContainer","floating","divAndCaption","wrapperUtils","attachOnCloseEvent","needClose","isFloating","setFloating","setUtilsWidth","BAR_HEIGHTS","ChatAudio","onPlaybackParams","fasterEl","repeatEl","toggleEl","onStop","onMediaPlay","isMusic","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","mark","AnimatedSuper","getRow","animateFirst","clearRow","clearRows","currentIndex","DURATION","setNewRow","reflow","previousIndex","fromTop","ignorePrevious","previousRow","AnimatedCounter","previousNumber","getDecimal","animatedSuper","decimal","hideLeft","previousDecimalNumber","EMPTY_INDEX","setCount","previousByDecimal","decimalNumber","ChatPinnedMessage","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","setScrollDownListener","isDown","handleScrollSideEvent","refreshPosition","handleFollowingPinnedMessage","followPinnedMessage","isLast","writeTo","writeMediaTo","ChatTopbar","verifyButtons","isMenuOpen","btnMore","deleteButtonText","menuButtons","buttonsToVerify","verifyVideoChatButton","currentGroupCall","groupCall","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","resize","setUtilsRAF","chatUtils","chatAudio","setPeerStatusManual","btnBack","chatInfoContainer","chatInfo","person","avatarElement","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","onBtnBackClick","isFirstChat","constructUtils","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","constructAvatar","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","constructDiscussionHelpers","byCurrent","setTitleCallback","setStatusCallback","setTitleManual","wasAlreadyUsed","newPinnedMessage","AppPrivateSearchTab","appSearch","btnPickDate","ChatSearch","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","ChatBackgroundPatternRenderer","canvases","INSTANCES","renderToCanvas","fillCanvas","crossOrigin","createImageBitmap","resizeWidth","resizeHeight","imageBitmap","objectUrl","imageWidth","imageHeight","patternHeight","mask","centerY","topY","endY","bottomY","setCanvasDimensions","originalHeight","Chat","backgroundEl","backgroundTempId","sharedMediaTabs","setBackground","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","isDarkPattern","getInstance","_gradientRenderer","setBackgroundPromise","setType","beforeDestroy","cleanupBackground","destroySharedMediaTab","searchTab","_isAnyGroup","setAutoDownloadMedia","bubblesSetPeerPromise","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","callbacksPromise","ignoreThreadId","historyStorageTransferable","historySerialized","MarkupTooltip","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","getActiveMarkupButton","currentMarkups","markup","activeButtons","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","isFirstShow","setMouseUpEvent","handleSelection","ChatDragAndDrop","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","setPath","sizeX","sizeY","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","generateNextBlob","amplitude","speedScale","paint","pinnedTop","progressToPinned","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","WeavingState","stateId","createGradient","shader","getGradientFromType","x0","y0","dt","TopbarWeave","handleDevicePixelRatioChanged","setSize","forceUpdate","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","setCurrentState","states","componentDidMount","matchMedia","setAmplitude","componentWillUnmount","setCanvasSize","RLottieIconItemPart","playPart","RLottieIconItem","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","RLottieIcon","startFrame","endFrame","frameCount","SuperRLottieIcon","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","invoke","GroupCallMicrophoneIcon","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","MUTED","UNMUTED","GroupCallParticipantMutedIcon","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","MUTED_BY_ADMIN","propertyValue","getColorByMutedState","generateEqualParts","clearMutedStateModifier","GroupCallParticipantStatusElement","element2","actionClassName","GroupCallParticipantsList","getParticipantByPeerId","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","callVideoCanvasBlur","GroupCallParticipantVideoElement","setPinned","setParticipant","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","GroupCallParticipantsVideoElement","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","shouldDisplayElement","displayPinned","shouldDisplay","hasAnyVideo","participantElements","participantVideo","getVideoElementFromParticipantByType","_onLengthChange","GroupCallParticipantContextMenu","onOpenProfileClick","PopupGroupCall","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getContainer","GroupCallParticipantsElement","groupCallParticipantsVideo","appGroupCallsManager","getGroupCallParticipants","GroupCallDescriptionElement","descriptionIntl","GroupCallTitleElement","makeButton","_className","buttonDiv","isConfirm","resizeHandlerClassName","MovableElement","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","destroyElements","handlers","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setPositionToCenter","MovablePanel","toggleMovable","movable","movableOptions","toggleClassName","raise_hand_rating","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","movablePanel","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CallDescriptionElement","connectionState","connectedAt","GroupCallMicrophoneIconMini","INIT_STATE","PopupCall","resizeVideoContainers","videoContainers","interlocutorUserId","emojisSubtitle","partyStates","partyMutedState","stateText","constructFirstButtons","constructSecondButtons","wasTryingToJoin","movableElement","controlsHover","getCallInstance","firstButtonsRow","muteI18nElement","secondButtonsRow","declineI18nElement","btnDecline","btnAccept","acceptCall","createVideoContainer","isPendingIncoming","isSharingVideo","isSharingScreen","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","isVertical","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","TopbarCall","onState","amplitudes","weave","clearCurrentInstance","currentDescription","instanceListenerSetter","isChangingInstance","callDescription","convertCallStateToGroupState","groupCallMicrophoneIconMini","throttledMuteClick","weaveContainer","uiNotificationsManager","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","faviconEl","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","webPushApiManager","registeredDevice","nosound","requestPermission","Notification","mozVibrate","webkitVibrate","setAppBadge","notificationsUiSupport","notifySoundEl","topMessagesDeferred","toggleToggler","peerString","soundReset","unreadUnmutedPeerIds","tokenData","unregisterDevice","registerDevice","notificationData","custom","hasChat","hasUser","buildNotification","fwdCount","peerReaction","peerTypeNotifySettings","notification","getPeerString","notificationMessage","noIncrement","notificationFromPeerId","peerPhoto","loadAvatar","resetTitle","isBlink","setFavicon","titleInterval","textBaseline","textAlign","prevFavicon","replaceChild","testSound","permission","appRuntimeManager","onclose","getLocalSettings","nextSoundAt","prevSoundVolume","filename","token_type","tokenType","tokenValue","other_uids","app_sandbox","secret","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","webkitGetAsEntry","addAnchorListener","protocol","pathnameParams","uriParams","u","host","noPathnameParams","noUriParams","parseUriParams","AppImManager","columnEl","offline","updateStatusInterval","cacheStorage","saveState","onHashChangeUnsafe","tgaddr","openUrl","postId","openUsername","setSettings","messagesTextSize","forceRenderAfterSize","chatsSelectTabDebounced","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","_types","canDrag","backgroundPromises","updateStatus","emojiAnimationContainer","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","compareVersion","deleteFilesIterative","applyCurrentTheme","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typing","onInstanceDeactivated","isUpdated","receiptMessage","onSpoilerClick","spoilerTimeout","stateStorage","topbarCall","discardCurrentCall","currentCall","setAuthorized","telegramMeWebManager","hashtag","STICKER_SET","EMOJI_SET","makeLink","INVOICE","VOICE_CHAT","USER_PHONE_NUMBER","PRIVATE_POST","channel","thread","comment","MESSAGE","attachKeydownListener","timeoutOperation","requests","request","isBad","activatingChat","screen","IGNORE_KEYS","isSelectionCollapsed","getFirstMessageToEdit","getNextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","checkChatInvite","saveApiChat","resolvePhone","getInputInvoiceBySlug","wrappedUrl","openComment","generateThreadServiceStartMessage","phone_calls_private","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","title1","title2","isClosing","getGroupCallFull","createGroupCall","setCurrentBackground","broadcastEvent","getBackground","getFile","lastBackgroundUrl","chatBubbles","chatPositions","backgroundUrl","prevIdx","attachDragAndDropListeners","drops","mediaDrops","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","onImTabChange","updateMyOnlineStatus","spliceChats","fromIndex","chatFrom","chatTo","chatIndex","existingIndex","oldChat","getTypingElement","eye","getPeerTyping","getPeerTypings","langPackKeys","multi","mapa","typingElement","descriptionElement","getChatStatus","typingEl","onlines","getOnlines","getUserStatus","ignoreSelf","getPeerStatus","useWhitespace","typingContainer","DialogColorsFg","DialogColors","DialogColorsMap","pic","useBytes","bestPhotoSize","CallConnectionInstanceBase","connection","sources","createPeerConnection","RTCPeerConnection","signalingState","iceConnectionState","createDataChannel","dataChannel","createDescription","appendStreamToConference","streamManager","appendToConference","closeConnection","closeConnectionAndStream","stopStream","negotiate","negotiating","negotiateInternal","sendDataChannelData","parseSignalingData","sdp","parseMediaSectionInfo","fingerprint","ufrag","pwd","convertNumber","isSending","codec","ssrc","sourceGroups","ssrcGroups","sourceGroup","semantics","ssrcs","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","clockrate","feedbackTypes","subtype","parameters","payloadTypes","CallConnectionInstance","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","setLocalDescription","offer","createOffer","offerSent","initialSetup","sendCallSignalingData","crypto","subtle","P2PEncryptor","p2pKey","seqMap","concatSHA256","bufferConcats","convertToUint8Array","encryptPrepared","msgKeyLarge","subarray","msgKey","aesKeyIv","prepareAesKeyIv","aesProcessCtr","encryptRawPacket","seq","ArrayBuffer","setUint32","sha256a","sha256b","iv","encryptedData","dataSize","encrypt","cryptoKey","constTimeIsDifferent","msgKeyEquals","decryptRawPacket","encryptedDataSize","decryptionBuffer","getUint32","ChromeP2PSdpBuilder","fingerprints","stringBuilder","streamName","addExtmap","addPayloadTypes","addSsrc","finalize","FirefoxP2PSdpBuilder","SafariP2PSdpBuilder","isFirefox","isSafari","extmap","j","fmtp","getOwnPropertyNames","pName","ssrcGroup","P2PSdpBuilder","sdpString","sdpMLineIndex","sdpMid","foundation","component","priority","relAddress","generation","tcpType","networkId","networkCost","candidate","generateOffer","generateAnswer","CallInstance","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","candidates","canCreateConferenceEntry","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","connectionInstance","sortIndex","findEntry","recvEntry","startScreenSharingInternal","wasStartingScreen","wasStartingVideo","requestScreen","stopVideoSharing","startVideoSharingInternal","requestInputSource","track","inputStream","getVideoTracks","stopTrack","isSharingVideoType","audioTrack","getAudioTracks","setHangUpTimeout","clearHangUpTimeout","hangUpTimeout","setPhoneCall","phoneCall","canAccept","overrideConnectionState","g_a_hash","appCallsManager","generateDh","dh","g_b","g_a","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","joinCall","encryptionKey","configuration","iceServers","connections","ipv6","port","urls","turn","stun","credential","iceTransportPolicy","p2p_allowed","getRtcConfiguration","sendIceCandidate","onTrack","encryptor","decryptor","processDecryptQueue","createDataChannelEntry","dataChannelEntry","createEntry","sendEntry","negotiated","applyDataChannelData","TextEncoder","encode","iceCandidate","parsed","p2pParseCandidate","confirmCall","key_fingerprint","computeKey","emojisFingerprint","getEmojisFingerprintPromise","codePoints","unlockStreamManager","doTheMagic","getTransceivers","transceiver","getEntryByMid","bundle","sdpDescription","generateSdp","isAnswer","setRemoteDescription","onInputStream","stream","videoTrack","onMutedChange","requestAudioSource","setMuted","discardReason","discardedByOtherParty","hasVideo","discardCall","performCodec","_codec","setDataToDescription","setData","transport","screencast","filterNotVP8","vp8PayloadType","rtxIdx","apt","applyCallSignalingData","performSsrcGroups","getEntryBySource","sendRecvEntry","findFreeSendRecvEntry","setEntrySource","tryToReleaseCandidates","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","TextDecoder","decode","signalingData","onUpdatePhoneCallSignalingData","getStreamCached","_cache","isScreen","constraints","getScreenStream","getStream","CallInstanceBase","fixSafariAudio","isSharingAudio","hasInputTrackKind","isAudioGood","isVideoGood","getAudioConstraints","getVideoConstraints","getScreenConstraints","endpoint","tryAddTrack","streams","saveInputVideoStream","isOutput","elementEndpoint","addTrack","useStream","outputStream","srcObject","sinkId","outputDeviceId","setSinkId","getTracks","addStream","CALL_STATE","audioAsset","CALL_REQUEST_TIMEOUT","CallsController","sortedInstances","createCallInstance","admin_id","g_a_or_b","bytesCmp","callId","getCallByUserId","hasConnected","hasCurrent","startCallInternal","fullInfo","participant_id","requestCall","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","GroupCallConnectionInstance","negotiateThrottled","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","invokeJoinGroupCall","localSdp","mainChannels","processedChannels","sectionInfo","payload","processMediaSection","audioChannel","videoChannel","useChannel","setEntryPeerId","performExtmap","filterServerCodecs","isNewConnection","originalOffer","iceRestart","hasMunged","skipAddingMulticast","mediaLine","mediaLineParts","localMLine","codecIds","newData","setPort","setSource","newSdp","addSsrcEntry","newChannel","mungedSdp","fixLocalOffer","entriesToDelete","shouldBeSkipped","answerDescription","deleteEntry","iceGatheringState","updateConstraints","sender","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","onStageEndpoints","addInputVideoStream","GroupCallInstance","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","getCachedParticipants","presentation","unpinSource","changeUserMuted","source_groups","clone","createConnectionInstance","raise","raiseHand","stopScreenSharing","startScreenSharing","startScreenSharingPromise","saveApiParticipant","leaveGroupCallPresentation","videoPaused","videoStopped","startVideoSharing","startVideoSharingPromise","rejoin","isDiscarded","isUpdatingMeInCurrentCall","onParticipantUpdate","doNotDispatchParticipantUpdate","hasLeft","oldSsrcs","modifiedTypes","oldSsrc","oldSource","oldEntry","originalDirection","setEndpoint","createTransceiver","GROUP_CALL_STATE","makeSsrcsFromParticipant","makeSsrcFromParticipant","audio_source","generateSelfVideo","audioSource","GroupCallsController","setCurrentGroupCall","startConnectingSound","stopConnectingSound","joinVideo","MediaStream","createMainStreamManager","joinGroupCallInternal","handleUpdateGroupCallParticipants","updatingSdp","channelCount","constraint","mediaDevices","getSupportedConstraints","constraintSupported","skipAudio","frameRate","screenStream","getDisplayMedia","contentHint","getUserMedia","clientInfo","lookupAttributeKeys","telegramSourceGroups","sdpLines","rest","parseSourceGroups","raw","ConferenceEntry","addTransceiver","generateSsrc","LocalConferenceDescription","sessionId","maxSeenId","entriesByMid","entriesBySource","entriesByPeerId","getEntriesByPeerId","conference","SDP","mediaSections","splitStringByLimitWithRest","UniqueNumberGenerator","generate","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","SDPLine","SDPAttributeInner","missed","exists","nestedMap","makeAttributes","innerParts","SDPAttributes","fillAttributes","attributesMap","linesArray","SDPMediaSection","isReceiving","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","addSimulcast","generator","originalSsrcs","ssrcs2","ssrcsStrLines","ssrc2","WEBRTC_MEDIA_PORT","fixMediaLineType","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","connectionType","SDPBuilder","addCandidate","performCandidate","addHeader","sId","bundleMids","addTransport","skipCandidates","addSource","addMsid","isApplication","isInactive","hdrexts","hdrext","fbs","fb","addConference","AudioStreamAnalyser","streamSource","createMediaStreamSource","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","StreamManager","getAmplitude","streamAnalyser","analyse","ANALYSER_LISTENER","AudioContext","webkitAudioContext","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","substring","replaceInputAudio","oldTrack","timer","transceiverInit","tracks","mediaTrackType","trackIdx","replaceTrack","StringFromLineBuilder","newLine","addJoined","toTelegramSource","fromTelegramSource","rms","EMOJI_REG_EXP","onlyFirst","firstEmojiMatch","lastEmojiMatch","E","messageEntityTextUrl","messageEntityMentionName","isDraft","setBlankToAnchor","EMOJI_VERSIONS_SUPPORTED","inlineEl","newEmojiWidth","legacyEmojiWidth","isEmojiSupported","globalLazyLoadQueue","CustomEmojiElement","syncedPlayer","pausedElements","playersSynced","createCustomFiller","lastPausedVideo","middlewares","CustomEmojiRendererElement","clearedElements","WeakSet","isCanvasClean","emojiRenderers","getOffsets","offsetsMap","offsetParent","elementsArr","isDimensionsSet","syncedPlayersFrames","isImageData","ImageData","frameWidth","frameHeight","lastChildWas","checkForAnyFrame","forceRenderAfter","renderEmojis","addCustomEmojis","addElements","usingOwnQueue","wrap","_loadPromises","newElements","isLottie","willHaveSyncedPlayer","newElementsArray","CUSTOM_EMOJI_INSTANT_PLAY","addition","_p","overrideRender","setRenderInterval","syncedPlayers","clearRenderInterval","missing","cachedPromises","uncachedPromisesPromise","loadFromPromises","uncached","emojiRenderInterval","renderers","nasty","usedLength","wrapSomething","wrapElement","noFiller","customWraps","contextSite","contextExternal","lastEntity","nextEntity","endPartOffset","fullEntityText","partText","usedText","fontFamily","atPos","fromBot","encodeURIComponent","isSupported","masked","currentContext","electronHelpers","contextUrl","encoded","encodeSpoiler","entityText","voodoo","insertCustomFillers","notFiller","isCustomFillerNeededBySiblingNode","QueryableWorker","worker","terminate","onmessage","queryMethodListener","queryMethodArguments","postMessage","sendQuery","transfer","queryMethod","workersLimit","playersByCacheName","workers","curWorkerNum","onPlayerLoaded","reqId","fps","clamped","onPlayerError","getAnimation","setLoop","_autoplay","loadLottieWorkers","remain","Worker","queryableWorker","makeAssetUrl","loadAnimationAsAsset","loadAnimationFromURL","loadAnimationDataFromURL","blobConstruct","loadAnimationFromURLManually","loadAnimationFromURLNext","newParams","loadAnimationWorker","waitForFirstFrame","initPlayer","destroyWorkers","loadFromData","getLottiePixelRatio","RLottiePlayer","cachingDelta","CACHE","skipDelta","contexts","setMainLoop","clearPendingRAF","rafId","resetCurrentFrame","minFrame","requestFrame","applyInversing","renderFrame2","cachedSource","renderedFirstFrame","ImageBitmap","frInterval","frThen","frameNew","onLap","mainLoopForwards","mainLoopBackwards","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","bounds","setMinMax","playToFrameOnFrameCallback","setInverseColor","pagesManager","pageId","pagesDiv","scrollableDiv","page","onShown","setPage","isAuthPage","Page","onFirstMount","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","unicodeSurrogates","points","getEmojiToneIndex","getCountryEmoji","emojiFromCodePoints","fromCodePoint","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","prototype","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","WebAssembly","clearStream","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","loadWorker","initWorker","streamPage","storePage","recordedPages","samplePosition","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","setTargetAtTime","onstart","destroyWorker","Function","kSampleStepSize","float32ArraySupported","Float32Array","A","aA1","aA2","B","C","calcBezier","aT","getSlope","LinearEasing","mX1","mY1","mX2","mY2","sampleValues","aX","intervalStart","currentSample","kSplineTableSize","guessForT","initialSlope","aGuessT","currentSlope","newtonRaphsonIterate","aA","aB","currentX","currentT","binarySubdivide","getTForX"],"sourceRoot":""} \ No newline at end of file diff --git a/public/436.a3c8c35b715fcb7c4d9f.chunk.js b/public/436.4f0c85770e373a7fe5e5.chunk.js similarity index 84% rename from public/436.a3c8c35b715fcb7c4d9f.chunk.js rename to public/436.4f0c85770e373a7fe5e5.chunk.js index 5bd07713..6c80c9b4 100644 --- a/public/436.a3c8c35b715fcb7c4d9f.chunk.js +++ b/public/436.4f0c85770e373a7fe5e5.chunk.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[436,781],{5436:(e,t,a)=>{a.r(t),a.d(t,{default:()=>h});var n=a(8799),s=a(4541),r=a(2325),l=a(3512);const o=new(a(4874).Z)("page-chats",!1,(()=>(l.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignedIn"}),r.ZP.requestedServerLanguage||r.ZP.getCacheLangPack().then((e=>{e.local&&r.ZP.getLangPack(e.lang_code)})),o.pageEl.style.display="",(0,n.Z)(),Promise.all([(0,s.Z)(),Promise.resolve().then(a.bind(a,9893)),"requestVideoFrameCallback"in HTMLVideoElement.prototype?Promise.resolve():a.e(783).then(a.bind(a,7482))]).then((([e,t,a])=>{t.default.start(),setTimeout((()=>{document.getElementById("auth-pages").remove()}),1e3)}))))),h=o}}]); -//# sourceMappingURL=436.a3c8c35b715fcb7c4d9f.chunk.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[436,781],{5436:(e,t,a)=>{a.r(t),a.d(t,{default:()=>h});var n=a(8799),s=a(4541),r=a(2325),l=a(3512);const o=new(a(4874).Z)("page-chats",!1,(()=>(l.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignedIn"}),r.ZP.requestedServerLanguage||r.ZP.getCacheLangPack().then((e=>{e.local&&r.ZP.getLangPack(e.lang_code)})),o.pageEl.style.display="",(0,n.Z)(),Promise.all([(0,s.Z)(),Promise.resolve().then(a.bind(a,8130)),"requestVideoFrameCallback"in HTMLVideoElement.prototype?Promise.resolve():a.e(783).then(a.bind(a,7482))]).then((([e,t,a])=>{t.default.start(),setTimeout((()=>{document.getElementById("auth-pages").remove()}),1e3)}))))),h=o}}]); +//# sourceMappingURL=436.4f0c85770e373a7fe5e5.chunk.js.map \ No newline at end of file diff --git a/public/436.4f0c85770e373a7fe5e5.chunk.js.map b/public/436.4f0c85770e373a7fe5e5.chunk.js.map new file mode 100644 index 00000000..060dfa6b --- /dev/null +++ b/public/436.4f0c85770e373a7fe5e5.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"436.4f0c85770e373a7fe5e5.chunk.js","mappings":"yKAYA,MA0CMA,EAAO,I,QAAI,GAAK,cAAc,GA1Cf,KACnB,yCAA+C,YAAa,CAACC,EAAG,sBAI5D,8BACF,wBAAwBC,MAAMC,IACzBA,EAASC,OACV,iBAAiBD,EAASE,cAKhCL,EAAKM,OAAOC,MAAMC,QAAU,IAe5B,SAEOC,QAAQC,IAAI,EACjB,SACA,uCACA,8BAA+BC,iBAAiBC,UAAYH,QAAQI,UAAY,gCAC/EX,MAAK,EAAED,EAAGa,EAAmBC,MAC9BD,EAAkBE,QAAQC,QAC1BC,YAAW,KACTC,SAASC,eAAe,cAAcC,WACrC,WAKP","sources":["webpack://tweb/./src/pages/pageIm.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport I18n from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Page from './page';\n\nconst onFirstMount = () => {\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\n // ! TOO SLOW\n /* appStateManager.saveState(); */\n\n if(!I18n.requestedServerLanguage) {\n I18n.getCacheLangPack().then((langPack) => {\n if(langPack.local) {\n I18n.getLangPack(langPack.lang_code);\n }\n });\n }\n\n page.pageEl.style.display = '';\n\n // AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\n\n /* // @ts-ignore\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\n alert('AudioContext:' + typeof(AudioContext));\n // @ts-ignore\n alert('global.navigator:' + typeof(navigator));\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\n\n // (Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach((el) => ripple(el));\n\n blurActiveElement();\n\n return Promise.all([\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\n import('../lib/appManagers/appDialogsManager'),\n 'requestVideoFrameCallback' in HTMLVideoElement.prototype ? Promise.resolve() : import('../helpers/dom/requestVideoFrameCallbackPolyfill')\n ]).then(([_, appDialogsManager, __]) => {\n appDialogsManager.default.start();\n setTimeout(() => {\n document.getElementById('auth-pages').remove();\n }, 1e3);\n });\n};\n\nconst page = new Page('page-chats', false, onFirstMount);\nexport default page;\n"],"names":["page","_","then","langPack","local","lang_code","pageEl","style","display","Promise","all","HTMLVideoElement","prototype","resolve","appDialogsManager","__","default","start","setTimeout","document","getElementById","remove"],"sourceRoot":""} \ No newline at end of file diff --git a/public/436.a3c8c35b715fcb7c4d9f.chunk.js.map b/public/436.a3c8c35b715fcb7c4d9f.chunk.js.map deleted file mode 100644 index fdd86b81..00000000 --- a/public/436.a3c8c35b715fcb7c4d9f.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"436.a3c8c35b715fcb7c4d9f.chunk.js","mappings":"yKAYA,MA0CMA,EAAO,I,QAAI,GAAK,cAAc,GA1Cf,KACnB,yCAA+C,YAAa,CAACC,EAAG,sBAI5D,8BACF,wBAAwBC,MAAMC,IACzBA,EAASC,OACV,iBAAiBD,EAASE,cAKhCL,EAAKM,OAAOC,MAAMC,QAAU,IAe5B,SAEOC,QAAQC,IAAI,EACjB,SACA,uCACA,8BAA+BC,iBAAiBC,UAAYH,QAAQI,UAAY,gCAC/EX,MAAK,EAAED,EAAGa,EAAmBC,MAC9BD,EAAkBE,QAAQC,QAC1BC,YAAW,KACTC,SAASC,eAAe,cAAcC,WACrC,WAKP","sources":["webpack://tweb/./src/pages/pageIm.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport loadFonts from '../helpers/dom/loadFonts';\r\nimport I18n from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport Page from './page';\r\n\r\nconst onFirstMount = () => {\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then((langPack) => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n\r\n // AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n // (Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach((el) => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager'),\r\n 'requestVideoFrameCallback' in HTMLVideoElement.prototype ? Promise.resolve() : import('../helpers/dom/requestVideoFrameCallbackPolyfill')\r\n ]).then(([_, appDialogsManager, __]) => {\r\n appDialogsManager.default.start();\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"names":["page","_","then","langPack","local","lang_code","pageEl","style","display","Promise","all","HTMLVideoElement","prototype","resolve","appDialogsManager","__","default","start","setTimeout","document","getElementById","remove"],"sourceRoot":""} \ No newline at end of file diff --git a/public/437.77e92ccb32c21ff43a10.bundle.js b/public/437.77e92ccb32c21ff43a10.bundle.js deleted file mode 100644 index d0517363..00000000 --- a/public/437.77e92ccb32c21ff43a10.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[437],{410:(s,e,t)=>{t.d(e,{GO:()=>n,ZP:()=>o});const i=t(1267).Z.debug,n="undefined"!=typeof window?window:self,o=i},1267:(s,e,t)=>{t.d(e,{Z:()=>n});const i={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};i.http=location.search.indexOf("http=1")>0,i.http&&(i.transport="https");const n=i},2219:(s,e,t)=>{t.d(e,{Z:()=>i});const i=Date.now()%Math.random()*1e8|0},6761:(s,e,t)=>{t.d(e,{Z:()=>i});const i="undefined"!=typeof window?window:self},4064:(s,e,t)=>{function i(s,e){const t=s.findIndex(e);return-1!==t?s.splice(t,1)[0]:void 0}t.d(e,{Z:()=>i})},1655:(s,e,t)=>{function i(s,e){const t=s.indexOf(e),i=-1===t?void 0:s.splice(t,1);return null==i?void 0:i[0]}t.d(e,{Z:()=>i})},5289:(s,e,t)=>{t.d(e,{Z:()=>n});const i=Date.now();function n(){return"["+((Date.now()-i)/1e3).toFixed(3)+"]"}},3241:(s,e,t)=>{t.d(e,{Z:()=>n});var i=t(4064);class n{constructor(s){this._constructor(s)}_constructor(s){this.reuseResults=s,this.listeners={},this.listenerResults={}}addEventListener(s,e,t){var i,n;(null!==(i=(n=this.listeners)[s])&&void 0!==i?i:n[s]=[]).push({callback:e,options:t}),this.listenerResults.hasOwnProperty(s)&&(e(...this.listenerResults[s]),null==t?void 0:t.once)&&this.listeners[s].pop()}addMultipleEventsListeners(s){for(const e in s)this.addEventListener(e,s[e])}removeEventListener(s,e,t){this.listeners[s]&&(0,i.Z)(this.listeners[s],(s=>s.callback===e))}invokeListenerCallback(s,e,...t){var i;let n;try{n=e.callback(...t)}catch(s){console.error(s)}return(null===(i=e.options)||void 0===i?void 0:i.once)&&this.removeEventListener(s,e.callback),n}_dispatchEvent(s,e,...t){this.reuseResults&&(this.listenerResults[s]=t);const i=e&&[],n=this.listeners[s];return n&&n.slice().forEach((e=>{if(-1===n.findIndex((s=>s.callback===e.callback)))return;const o=this.invokeListenerCallback(s,e,...t);i&&i.push(o)})),i}dispatchResultableEvent(s,...e){return this._dispatchEvent(s,!0,...e)}dispatchEvent(s,...e){this._dispatchEvent(s,!1,...e)}cleanup(){this.listeners={},this.listenerResults={}}}},5471:(s,e,t)=>{function i(s){return{type:s}}t.d(e,{Z:()=>i})},153:(s,e,t)=>{t.d(e,{Z:()=>d});var i=t(410),n=t(2219),o=t(6761),r=t(1655),a=t(1352),c=t(3241),h=t(5471),l=t(5003);class d extends c.Z{constructor(s){super(!1),this.logSuffix=s,this.onMessage=s=>{const e=s.data,t=s.source||s.currentTarget;this.processTaskMap[e.type](e,t,s)},this.processResultTask=s=>{const{taskId:e,result:t,error:i}=s.payload,n=this.awaiting[e];n&&(this.debug&&this.log.debug("done",n.taskType,t,i),"error"in s.payload?n.reject(i):n.resolve(t),delete this.awaiting[e])},this.processAckTask=s=>{const e=s.payload,t=this.awaiting[e.taskId];t&&((0,t.resolve)({cached:e.cached,result:e.cached?"result"in e?Promise.resolve(e.result):Promise.reject(e.error):new Promise(((s,e)=>{t.resolve=s,t.reject=e}))}),e.cached&&delete this.awaiting[e.taskId])},this.processPingTask=(s,e,t)=>{this.pushTask(this.createTask("pong",void 0),t.source)},this.processPongTask=(s,e,t)=>{const i=this.pingResolves.get(e);i&&(this.pingResolves.delete(e),i())},this.processCloseTask=(s,e,t)=>{this.detachPort(e)},this.processLockTask=(s,e,t)=>{const i=s.payload;this.requestedLocks.has(i)||(this.requestedLocks.set(i,e),navigator.locks.request(i,(()=>{this.processCloseTask(void 0,e,void 0),this.requestedLocks.delete(i)})))},this.processInvokeTask=(s,e,t)=>{return i=this,n=void 0,r=function*(){const i=s.id,n=s.payload;let o,r,a,c;n.void||(o={taskId:i},r=this.createTask("result",o)),n.withAck&&(a=this.createTask("ack",{taskId:i,cached:!0}));try{const s=this.listeners[n.type];if(!(null==s?void 0:s.length))throw new Error("no listener");const i=s[0];let r=this.invokeListenerCallback(n.type,i,n.payload,e,t);if(n.void)return;if(c=r instanceof Promise,a){const s=!c;if(a.payload.cached=s,s&&(a.payload.result=r),this.pushTask(a,e),s)return}c&&(r=yield r),o.result=r}catch(t){if(this.log.error("worker task error:",t,s),n.void)return;if(a&&a.payload.cached)return a.payload.error=t,void this.pushTask(a,e);o.error=t}this.pushTask(r,e)},new((o=void 0)||(o=Promise))((function(s,e){function t(s){try{c(r.next(s))}catch(s){e(s)}}function a(s){try{c(r.throw(s))}catch(s){e(s)}}function c(e){var i;e.done?s(e.value):(i=e.value,i instanceof o?i:new o((function(s){s(i)}))).then(t,a)}c((r=r.apply(i,n||[])).next())}));var i,n,o,r},this.listenPorts=[],this.sendPorts=[],this.pingResolves=new Map,this.taskId=0,this.awaiting={},this.pending=new Map,this.log=(0,l.kg)("MP"+(s?"-"+s:"")),this.debug=i.ZP,this.heldLocks=new Map,this.requestedLocks=new Map,this.processTaskMap={result:this.processResultTask,ack:this.processAckTask,invoke:this.processInvokeTask,ping:this.processPingTask,pong:this.processPongTask,close:this.processCloseTask,lock:this.processLockTask}}setOnPortDisconnect(s){this.onPortDisconnect=s}attachPort(s){this.attachListenPort(s),this.attachSendPort(s)}attachListenPort(s){this.listenPorts.push(s),s.addEventListener("message",this.onMessage)}attachSendPort(s){var e,t;if(this.log.warn("attaching send port"),null===(t=(e=s).start)||void 0===t||t.call(e),this.sendPorts.push(s),"undefined"!=typeof window)if("locks"in navigator){const e=["lock",n.Z,this.logSuffix||"",2147483647*Math.random()|0].join("-");this.log.warn("created lock",e);const t=new Promise((t=>this.heldLocks.set(s,{resolve:t,id:e}))).then((()=>this.heldLocks.delete(s)));navigator.locks.request(e,(()=>(this.resendLockTask(s),t)))}else window.addEventListener("beforeunload",(()=>{const s=this.createTask("close",void 0);this.postMessage(void 0,s)}));this.releasePending()}resendLockTask(s){const e=this.heldLocks.get(s);e&&this.pushTask(this.createTask("lock",e.id),s)}detachPort(s){var e,t,i,n;this.log.warn("disconnecting port"),(0,r.Z)(this.listenPorts,s),(0,r.Z)(this.sendPorts,s),null===(e=s.removeEventListener)||void 0===e||e.call(s,"message",this.onMessage),null===(i=(t=s).close)||void 0===i||i.call(t),null===(n=this.onPortDisconnect)||void 0===n||n.call(this,s);const o=this.heldLocks.get(s);null==o||o.resolve();const a=(0,h.Z)("PORT_DISCONNECTED");for(const e in this.awaiting){const t=this.awaiting[e];t.port===s&&(t.reject(a),delete this.awaiting[e])}}postMessage(s,e){(Array.isArray(s)?s:s?[s]:this.sendPorts).forEach((s=>{s.postMessage(e,e.transfer)}))}releasePending(){this.releasingPending||(this.releasingPending=!0,this.debug&&this.log.debug("releasing tasks, length:",this.pending.size),this.pending.forEach(((s,e)=>{const t=s,i=e?[e]:this.sendPorts;i.length&&(t.forEach((s=>{try{this.postMessage(i,s)}catch(e){this.log.error("postMessage error:",e,s,i)}})),this.pending.delete(e))})),this.debug&&this.log.debug("released tasks"),this.releasingPending=!1)}createTask(s,e,t){return{type:s,payload:e,id:this.taskId++,transfer:t}}createInvokeTask(s,e,t,i,n){return this.createTask("invoke",{type:s,payload:e,withAck:t,void:i},n)}pushTask(s,e){let t=this.pending.get(e);t||this.pending.set(e,t=[]),t.push(s),this.releasePending()}invokeVoid(s,e,t,i){const n=this.createInvokeTask(s,e,void 0,!0,i);this.pushTask(n,t)}invoke(s,e,t,i,n){let r;this.debug&&this.log.debug("start",s,e);const c=new Promise(((o,a)=>{r=this.createInvokeTask(s,e,t,void 0,n),this.awaiting[r.id]={resolve:o,reject:a,taskType:s,port:i},this.pushTask(r,i)}));if(a.kC){c.finally((()=>{clearInterval(s)}));const s=o.Z.setInterval((()=>{this.log.error("task still has no result",r,i)}),6e4)}return c}invokeExceptSource(s,e,t){const i=this.sendPorts.slice();(0,r.Z)(i,t),i.forEach((t=>{this.invokeVoid(s,e,t)}))}}}}]); -//# sourceMappingURL=437.77e92ccb32c21ff43a10.bundle.js.map \ No newline at end of file diff --git a/public/437.77e92ccb32c21ff43a10.bundle.js.map b/public/437.77e92ccb32c21ff43a10.bundle.js.map deleted file mode 100644 index d663f261..00000000 --- a/public/437.77e92ccb32c21ff43a10.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"437.77e92ccb32c21ff43a10.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/modes.ts","webpack://tweb/./src/config/tabId.ts","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/helpers/array/findAndSplice.ts","webpack://tweb/./src/helpers/array/indexOfAndSplice.ts","webpack://tweb/./src/helpers/dT.ts","webpack://tweb/./src/helpers/eventListenerBase.ts","webpack://tweb/./src/helpers/makeError.ts","webpack://tweb/./src/lib/mtproto/superMessagePort.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from './modes';\r\n\r\nexport const DEBUG = (process.env.NODE_ENV !== 'production' || Modes.debug)/* && false */;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n// let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n\r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\r\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {TransportType} from '../lib/mtproto/dcConfigurator';\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n multipleConnections: true,\n asServiceWorker: false,\n transport: 'websocket' as TransportType\n};\n\n \nModes.http = location.search.indexOf('http=1') > 0;\n \n\n \n \n \n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\n \n \n \n\nexport default Modes;\n","const tabId = Date.now() % Math.random() * 100000000 | 0;\nexport default tabId;\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","export default function findAndSplice(array: Array, verify: (value: T, index?: number, array?: Array) => boolean) {\n const index = array.findIndex(verify);\n return index !== -1 ? array.splice(index, 1)[0] : undefined;\n};\n","export default function indexOfAndSplice(array: Array, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx === -1 ? undefined : array.splice(idx, 1);\n return spliced?.[0];\n}\n","const _logTimer = Date.now();\r\nexport default function dT() {\r\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type {ArgumentTypes, SuperReturnType} from '../types';\r\nimport findAndSplice from './array/findAndSplice';\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n\r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous.\r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\ntype ListenerObject = {callback: T, options: boolean | AddEventListenerOptions};\r\n\r\n// type EventLitenerCallback = (data: T) =>\r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults?: boolean): 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] ??= []).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n\r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n\r\n // e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n findAndSplice(this.listeners[name], (l) => l.callback === callback);\r\n }\r\n // e.remove(this, name, callback);\r\n }\r\n\r\n protected invokeListenerCallback>(name: T, listener: L, ...args: ArgumentTypes) {\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n const result = this.invokeListenerCallback(name, listener, ...args);\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n}\r\n","export default function makeError(type: Error['type']) {\n const error: ApiError = {\n type\n };\n\n return error;\n}\n","/*\n * 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 tabId from '../../config/tabId';\nimport ctx from '../../environment/ctx';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {IS_WORKER} from '../../helpers/context';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport makeError from '../../helpers/makeError';\nimport {Awaited, WorkerTaskTemplate, WorkerTaskVoidTemplate} from '../../types';\nimport {logger} from '../logger';\n\ntype SuperMessagePortTask = WorkerTaskTemplate & {\n transfer?: Transferable[]\n};\n\ninterface InvokeTask extends SuperMessagePortTask {\n type: 'invoke',\n payload: WorkerTaskVoidTemplate & {withAck?: boolean, void?: boolean}\n}\n\ninterface ResultTask extends SuperMessagePortTask {\n type: 'result',\n payload: {\n taskId: number,\n result?: any,\n error?: any\n }\n}\n\ninterface AckTask extends SuperMessagePortTask {\n type: 'ack',\n payload: {\n cached: boolean,\n taskId: number\n result?: any,\n error?: any,\n }\n}\n\ninterface PingTask extends SuperMessagePortTask {\n type: 'ping'\n}\n\ninterface PongTask extends SuperMessagePortTask {\n type: 'pong'\n}\n\ninterface BatchTask extends SuperMessagePortTask {\n type: 'batch',\n payload: Task[]\n}\n\ninterface CloseTask extends SuperMessagePortTask {\n type: 'close'\n}\n\n// interface OpenTask extends SuperMessagePortTask {\n// type: 'open'\n// }\n\ninterface LockTask extends SuperMessagePortTask {\n type: 'lock',\n payload: string\n}\n\ntype Task = InvokeTask | ResultTask | AckTask | PingTask | PongTask | BatchTask | CloseTask/* | OpenTask */ | LockTask;\ntype TaskMap = {\n [type in Task as type['type']]?: (task: Extract, source: MessageEventSource, event: MessageEvent) => void | Promise\n};\n\nexport type AckedResult = {\n cached: boolean,\n result: Promise\n};\n// export type AckedResult = {\n// cached: true,\n// result: T\n// } | {\n// cached: false,\n// result: Promise\n// };\n\ntype ListenPort = WindowProxy | MessagePort | ServiceWorker | Worker | ServiceWorkerContainer;\ntype SendPort = Pick/* WindowProxy | MessagePort | ServiceWorker | Worker */;\n\nexport type MessageListenPort = ListenPort;\nexport type MessageSendPort = SendPort;\n\ntype ListenerCallback = (payload: any, source: MessageEventSource, event: MessageEvent) => any;\ntype Listeners = Record;\n\n// const PING_INTERVAL = DEBUG && false ? 0x7FFFFFFF : 5000;\n// const PING_TIMEOUT = DEBUG && false ? 0x7FFFFFFF : 10000;\n\nexport default class SuperMessagePort<\n Workers extends Listeners,\n Masters extends Listeners,\n IsMaster extends boolean,\n Receive extends Listeners = IsMaster extends true ? Masters : Workers,\n Send extends Listeners = IsMaster extends true ? Workers : Masters\n> extends EventListenerBase {\n protected listenPorts: Array;\n protected sendPorts: Array;\n protected pingResolves: Map void>;\n\n protected taskId: number;\n protected awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskType: string,\n port?: SendPort\n }\n };\n protected pending: Map;\n\n protected log: ReturnType;\n protected debug: boolean;\n protected releasingPending: boolean;\n\n protected processTaskMap: TaskMap;\n\n protected onPortDisconnect: (source: MessageEventSource) => void;\n // protected onPortConnect: (source: MessageEventSource) => void;\n\n protected heldLocks: Map void, id: string}>;\n protected requestedLocks: Map;\n\n constructor(protected logSuffix?: string) {\n super(false);\n\n this.listenPorts = [];\n this.sendPorts = [];\n this.pingResolves = new Map();\n this.taskId = 0;\n this.awaiting = {};\n this.pending = new Map();\n this.log = logger('MP' + (logSuffix ? '-' + logSuffix : ''));\n this.debug = DEBUG;\n this.heldLocks = new Map();\n this.requestedLocks = new Map();\n\n this.processTaskMap = {\n result: this.processResultTask,\n ack: this.processAckTask,\n invoke: this.processInvokeTask,\n ping: this.processPingTask,\n pong: this.processPongTask,\n close: this.processCloseTask,\n // open: this.processOpenTask,\n lock: this.processLockTask\n };\n }\n\n public setOnPortDisconnect(callback: (source: MessageEventSource) => void) {\n this.onPortDisconnect = callback;\n }\n\n // public setOnPortConnect(callback: (source: MessageEventSource) => void) {\n // this.onPortConnect = callback;\n // }\n\n public attachPort(port: MessageEventSource) {\n this.attachListenPort(port);\n this.attachSendPort(port);\n }\n\n public attachListenPort(port: ListenPort) {\n this.listenPorts.push(port);\n port.addEventListener('message', this.onMessage as any);\n }\n\n public attachSendPort(port: SendPort) {\n this.log.warn('attaching send port');\n\n (port as MessagePort).start?.();\n\n this.sendPorts.push(port);\n // this.sendPing(port);\n\n // const task = this.createTask('open', undefined);\n // this.postMessage(port, task);\n\n if(typeof(window) !== 'undefined') {\n if('locks' in navigator) {\n const id = ['lock', tabId, this.logSuffix || '', Math.random() * 0x7FFFFFFF | 0].join('-');\n this.log.warn('created lock', id);\n const promise = new Promise((resolve) => this.heldLocks.set(port, {resolve, id}))\n .then(() => this.heldLocks.delete(port));\n navigator.locks.request(id, () => {\n this.resendLockTask(port);\n return promise;\n });\n } else {\n window.addEventListener('beforeunload', () => {\n const task = this.createTask('close', undefined);\n this.postMessage(undefined, task);\n });\n }\n }\n\n this.releasePending();\n }\n\n public resendLockTask(port: SendPort) {\n const lock = this.heldLocks.get(port);\n if(!lock) {\n return;\n }\n\n this.pushTask(this.createTask('lock', lock.id), port);\n }\n\n // ! Can't rely on ping because timers can be suspended\n // protected sendPing(port: SendPort, loop = IS_WORKER) {\n // let timeout: number;\n // const promise = new Promise((resolve, reject) => {\n // this.pingResolves.set(port, resolve);\n // this.pushTask(this.createTask('ping', undefined), port);\n\n // timeout = ctx.setTimeout(() => {\n // reject();\n // }, PING_TIMEOUT);\n // });\n\n // promise.then(() => {\n // // this.log('got pong');\n\n // clearTimeout(timeout);\n // this.pingResolves.delete(port);\n\n // if(loop) {\n // this.sendPingWithTimeout(port);\n // }\n // }, () => {\n // this.pingResolves.delete(port);\n // this.detachPort(port);\n // });\n // }\n\n // protected sendPingWithTimeout(port: SendPort, timeout = PING_INTERVAL) {\n // ctx.setTimeout(() => {\n // if(!this.sendPorts.includes(port)) {\n // return;\n // }\n\n // this.sendPing(port);\n // }, timeout);\n // }\n\n public detachPort(port: ListenPort) {\n this.log.warn('disconnecting port');\n\n indexOfAndSplice(this.listenPorts, port);\n indexOfAndSplice(this.sendPorts, port as any);\n\n port.removeEventListener?.('message', this.onMessage as any);\n (port as MessagePort).close?.();\n\n this.onPortDisconnect?.(port as any);\n\n const heldLock = this.heldLocks.get(port as SendPort);\n heldLock?.resolve();\n\n const error = makeError('PORT_DISCONNECTED');\n for(const id in this.awaiting) {\n const task = this.awaiting[id];\n if(task.port === port) {\n task.reject(error);\n delete this.awaiting[id];\n }\n }\n }\n\n protected postMessage(port: SendPort | SendPort[], task: Task) {\n const ports = Array.isArray(port) ? port : (port ? [port] : this.sendPorts);\n ports.forEach((port) => {\n port.postMessage(task, task.transfer as any);\n });\n }\n\n protected onMessage = (event: MessageEvent) => {\n const task: Task = event.data;\n // this.log('got message', task);\n\n const source: MessageEventSource = event.source || event.currentTarget as any; // can have no source\n /* if(task.type === 'batch') {\n const newEvent: MessageEvent = {data: event.data, source: event.source, currentTarget: event.currentTarget} as any;\n task.payload.forEach((task) => {\n // @ts-ignore\n newEvent.data = task;\n this.onMessage(newEvent);\n });\n } */\n\n // @ts-ignore\n this.processTaskMap[task.type](task, source, event);\n };\n\n protected /* async */ releasePending() {\n // return;\n\n if(/* !this.listenPorts.length || !this.sendPorts.length || */this.releasingPending) {\n return;\n }\n\n this.releasingPending = true;\n // const perf = performance.now();\n // await pause(0);\n\n this.debug && this.log.debug('releasing tasks, length:', this.pending.size/* , performance.now() - perf */);\n\n this.pending.forEach((portTasks, port) => {\n // let batchTask: BatchTask;\n // const tasks: Task[] = [];\n // portTasks.forEach((task) => {\n // if(task.transfer) {\n // batchTask = undefined;\n // tasks.push(task);\n // } else {\n // if(!batchTask) {\n // batchTask = this.createTask('batch', []);\n // tasks.push(batchTask);\n // }\n\n // batchTask.payload.push(task);\n // }\n // });\n\n const tasks = portTasks;\n const ports = port ? [port] : this.sendPorts;\n if(!ports.length) {\n return;\n }\n\n tasks.forEach((task) => {\n // if(task.type === 'batch') {\n // this.log(`batching ${task.payload.length} tasks`);\n // }\n\n try {\n // if(IS_SERVICE_WORKER && !port) {\n // notifyAll(task);\n // } else {\n this.postMessage(ports, task);\n // }\n } catch(err) {\n this.log.error('postMessage error:', err, task, ports);\n }\n });\n\n this.pending.delete(port);\n });\n\n this.debug && this.log.debug('released tasks');\n\n this.releasingPending = false;\n }\n\n protected processResultTask = (task: ResultTask) => {\n const {taskId, result, error} = task.payload;\n const deferred = this.awaiting[taskId];\n if(!deferred) {\n return;\n }\n\n this.debug && this.log.debug('done', deferred.taskType, result, error);\n 'error' in task.payload ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n };\n\n protected processAckTask = (task: AckTask) => {\n const payload = task.payload;\n const deferred = this.awaiting[payload.taskId];\n if(!deferred) {\n return;\n }\n\n // * will finish the init promise with incoming result\n const previousResolve: (acked: AckedResult) => void = deferred.resolve;\n // const previousReject = deferred.reject;\n\n // if(payload.cached) {\n // if('result' in payload) {\n // previousResolve({\n // cached: true,\n // result: payload.result\n // });\n // } else {\n // previousReject(payload.error);\n // }\n // } else {\n // const ret: AckedResult = {\n // cached: false,\n // result: new Promise((resolve, reject) => {\n // deferred.resolve = resolve;\n // deferred.reject = reject;\n // })\n // };\n\n // previousResolve(ret);\n // }\n\n const ret: AckedResult = {\n cached: payload.cached,\n result: payload.cached ? ('result' in payload ? Promise.resolve(payload.result) : Promise.reject(payload.error)) : new Promise((resolve, reject) => {\n deferred.resolve = resolve;\n deferred.reject = reject;\n })\n };\n\n previousResolve(ret);\n\n if(payload.cached) {\n delete this.awaiting[payload.taskId];\n }\n };\n\n protected processPingTask = (task: PingTask, source: MessageEventSource, event: MessageEvent) => {\n this.pushTask(this.createTask('pong', undefined), event.source);\n };\n\n protected processPongTask = (task: PongTask, source: MessageEventSource, event: MessageEvent) => {\n const pingResolve = this.pingResolves.get(source);\n if(pingResolve) {\n this.pingResolves.delete(source);\n pingResolve();\n }\n };\n\n protected processCloseTask = (task: CloseTask, source: MessageEventSource, event: MessageEvent) => {\n this.detachPort(source);\n };\n\n // * it's just an 'open' callback, DO NOT attach port from here\n // protected processOpenTask = (task: OpenTask, source: MessageEventSource, event: MessageEvent) => {\n // this.onPortConnect?.(source);\n // };\n\n protected processLockTask = (task: LockTask, source: MessageEventSource, event: MessageEvent) => {\n const id = task.payload;\n if(this.requestedLocks.has(id)) {\n return;\n }\n\n this.requestedLocks.set(id, source);\n navigator.locks.request(id, () => {\n this.processCloseTask(undefined, source, undefined);\n this.requestedLocks.delete(id);\n });\n };\n\n protected processInvokeTask = async(task: InvokeTask, source: MessageEventSource, event: MessageEvent) => {\n const id = task.id;\n const innerTask = task.payload;\n\n let resultTaskPayload: ResultTask['payload'];\n let resultTask: ResultTask, ackTask: AckTask;\n if(!innerTask.void) {\n resultTaskPayload = {taskId: id};\n resultTask = this.createTask('result', resultTaskPayload);\n }\n\n if(innerTask.withAck) {\n ackTask = this.createTask('ack', {\n taskId: id,\n cached: true\n });\n }\n\n let isPromise: boolean;\n try {\n const listeners = this.listeners[innerTask.type];\n if(!listeners?.length) {\n throw new Error('no listener');\n }\n\n const listener = listeners[0];\n\n // @ts-ignore\n let result = this.invokeListenerCallback(innerTask.type, listener, innerTask.payload, source, event);\n if(innerTask.void) {\n return;\n }\n\n isPromise = result instanceof Promise;\n\n if(ackTask) {\n const cached = !isPromise;\n ackTask.payload.cached = cached;\n if(cached) ackTask.payload.result = result;\n this.pushTask(ackTask, source);\n\n if(cached) {\n return;\n }\n }\n\n if(isPromise) {\n result = await result;\n }\n\n resultTaskPayload.result = result;\n } catch(error) {\n this.log.error('worker task error:', error, task);\n if(innerTask.void) {\n return;\n }\n\n if(ackTask && ackTask.payload.cached) {\n ackTask.payload.error = error;\n this.pushTask(ackTask, source);\n return;\n }\n\n resultTaskPayload.error = error;\n }\n\n this.pushTask(resultTask, source);\n };\n\n protected createTask[0]>(type: T, payload: K['payload'], transfer?: Transferable[]): K {\n return {\n type,\n payload,\n id: this.taskId++,\n transfer\n } as K;\n }\n\n protected createInvokeTask(type: string, payload: any, withAck?: boolean, _void?: boolean, transfer?: Transferable[]): InvokeTask {\n return this.createTask('invoke', {\n type,\n payload,\n withAck,\n void: _void\n }, transfer);\n }\n\n protected pushTask(task: Task, port?: SendPort) {\n let tasks = this.pending.get(port);\n if(!tasks) {\n this.pending.set(port, tasks = []);\n }\n\n tasks.push(task);\n this.releasePending();\n }\n\n public invokeVoid(type: T, payload: Parameters[0], port?: SendPort, transfer?: Transferable[]) {\n const task = this.createInvokeTask(type as string, payload, undefined, true, transfer);\n this.pushTask(task, port);\n }\n\n public invoke(type: T, payload: Parameters[0], withAck?: false, port?: SendPort, transfer?: Transferable[]): Promise>>;\n public invoke(type: T, payload: Parameters[0], withAck?: true, port?: SendPort, transfer?: Transferable[]): Promise>>>;\n public invoke(type: T, payload: Parameters[0], withAck?: boolean, port?: SendPort, transfer?: Transferable[]) {\n this.debug && this.log.debug('start', type, payload);\n\n let task: InvokeTask;\n const promise = new Promise>>((resolve, reject) => {\n task = this.createInvokeTask(type as string, payload, withAck, undefined, transfer);\n this.awaiting[task.id] = {resolve, reject, taskType: type as string, port};\n this.pushTask(task, port);\n });\n\n if(IS_WORKER) {\n promise.finally(() => {\n clearInterval(interval);\n });\n\n const interval = ctx.setInterval(() => {\n this.log.error('task still has no result', task, port);\n }, 60e3);\n } else if(false) {\n // let timedOut = false;\n const startTime = Date.now();\n promise.finally(() => {\n const elapsedTime = Date.now() - startTime;\n if(elapsedTime >= TIMEOUT) {\n this.log.error(`task was processing ${Date.now() - startTime}ms`, task.payload.payload, port);\n }/* else {\n clearTimeout(timeout);\n } */\n });\n\n const TIMEOUT = 10;\n // const timeout = ctx.setTimeout(() => {\n // timedOut = true;\n // // this.log.error(`task is processing more than ${TIMEOUT} milliseconds`, task, port);\n // }, TIMEOUT);\n }\n\n return promise;\n }\n\n public invokeExceptSource(type: T, payload: Parameters[0], source?: SendPort) {\n const ports = this.sendPorts.slice();\n indexOfAndSplice(ports, source);\n\n ports.forEach((target) => {\n this.invokeVoid(type, payload, target);\n });\n }\n}\n"],"names":["DEBUG","MOUNT_CLASS_TO","window","self","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","Date","now","Math","random","findAndSplice","array","verify","index","findIndex","splice","undefined","indexOfAndSplice","item","idx","spliced","_logTimer","dT","toFixed","EventListenerBase","constructor","reuseResults","this","_constructor","listeners","listenerResults","addEventListener","name","callback","options","push","hasOwnProperty","once","pop","addMultipleEventsListeners","obj","i","removeEventListener","l","invokeListenerCallback","listener","args","result","err","console","error","_dispatchEvent","collectResults","arr","slice","forEach","dispatchResultableEvent","dispatchEvent","cleanup","makeError","type","SuperMessagePort","logSuffix","super","onMessage","event","task","data","source","currentTarget","processTaskMap","processResultTask","taskId","payload","deferred","awaiting","log","taskType","reject","resolve","processAckTask","previousResolve","cached","Promise","processPingTask","pushTask","createTask","processPongTask","pingResolve","pingResolves","get","delete","processCloseTask","detachPort","processLockTask","id","requestedLocks","has","set","navigator","locks","request","processInvokeTask","innerTask","resultTaskPayload","resultTask","ackTask","isPromise","void","withAck","length","Error","listenPorts","sendPorts","Map","pending","heldLocks","ack","invoke","ping","pong","close","lock","setOnPortDisconnect","onPortDisconnect","attachPort","port","attachListenPort","attachSendPort","warn","start","join","promise","then","resendLockTask","postMessage","releasePending","heldLock","Array","isArray","transfer","releasingPending","size","portTasks","tasks","ports","createInvokeTask","_void","invokeVoid","finally","clearInterval","interval","invokeExceptSource","target"],"sourceRoot":""} \ No newline at end of file diff --git a/public/437.a80d805671a4b222696d.bundle.js b/public/437.a80d805671a4b222696d.bundle.js new file mode 100644 index 00000000..1ff97d6a --- /dev/null +++ b/public/437.a80d805671a4b222696d.bundle.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[437],{410:(s,e,t)=>{t.d(e,{GO:()=>n,ZP:()=>o});const i=t(1267).Z.debug,n="undefined"!=typeof window?window:self,o=i},1267:(s,e,t)=>{t.d(e,{Z:()=>n});const i={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket",noSharedWorker:location.search.indexOf("noSharedWorker=1")>0};i.http=location.search.indexOf("http=1")>0,i.http&&(i.transport="https");const n=i},2219:(s,e,t)=>{t.d(e,{Z:()=>i});const i=Date.now()%Math.random()*1e8|0},6761:(s,e,t)=>{t.d(e,{Z:()=>i});const i="undefined"!=typeof window?window:self},4064:(s,e,t)=>{function i(s,e){const t=s.findIndex(e);return-1!==t?s.splice(t,1)[0]:void 0}t.d(e,{Z:()=>i})},1655:(s,e,t)=>{function i(s,e){const t=s.indexOf(e),i=-1===t?void 0:s.splice(t,1);return null==i?void 0:i[0]}t.d(e,{Z:()=>i})},5289:(s,e,t)=>{t.d(e,{Z:()=>n});const i=Date.now();function n(){return"["+((Date.now()-i)/1e3).toFixed(3)+"]"}},3241:(s,e,t)=>{t.d(e,{Z:()=>n});var i=t(4064);class n{constructor(s){this._constructor(s)}_constructor(s){this.reuseResults=s,this.listeners={},this.listenerResults={}}addEventListener(s,e,t){var i,n;(null!==(i=(n=this.listeners)[s])&&void 0!==i?i:n[s]=[]).push({callback:e,options:t}),this.listenerResults.hasOwnProperty(s)&&(e(...this.listenerResults[s]),null==t?void 0:t.once)&&this.listeners[s].pop()}addMultipleEventsListeners(s){for(const e in s)this.addEventListener(e,s[e])}removeEventListener(s,e,t){this.listeners[s]&&(0,i.Z)(this.listeners[s],(s=>s.callback===e))}invokeListenerCallback(s,e,...t){var i;let n,o;try{n=e.callback(...t)}catch(s){o=s}if((null===(i=e.options)||void 0===i?void 0:i.once)&&this.removeEventListener(s,e.callback),o)throw o;return n}_dispatchEvent(s,e,...t){this.reuseResults&&(this.listenerResults[s]=t);const i=e&&[],n=this.listeners[s];return n&&n.slice().forEach((e=>{if(-1===n.findIndex((s=>s.callback===e.callback)))return;const o=this.invokeListenerCallback(s,e,...t);i&&i.push(o)})),i}dispatchResultableEvent(s,...e){return this._dispatchEvent(s,!0,...e)}dispatchEvent(s,...e){this._dispatchEvent(s,!1,...e)}cleanup(){this.listeners={},this.listenerResults={}}}},5471:(s,e,t)=>{t.d(e,{Z:()=>n});const i={};function n(s){var e;return null!==(e=i[s])&&void 0!==e?e:i[s]={type:s}}},153:(s,e,t)=>{t.d(e,{Z:()=>d});var i=t(410),n=t(2219),o=t(6761),r=t(1655),a=t(1352),c=t(3241),h=t(5471),l=t(5003);class d extends c.Z{constructor(s){super(!1),this.logSuffix=s,this.onMessage=s=>{const e=s.data,t=s.source||s.currentTarget;this.processTaskMap[e.type](e,t,s)},this.processResultTask=s=>{const{taskId:e,result:t,error:i}=s.payload,n=this.awaiting[e];n&&(this.debug&&this.log.debug("done",n.taskType,t,i),"error"in s.payload?n.reject(i):n.resolve(t),delete this.awaiting[e])},this.processAckTask=s=>{const e=s.payload,t=this.awaiting[e.taskId];t&&((0,t.resolve)({cached:e.cached,result:e.cached?"result"in e?Promise.resolve(e.result):Promise.reject(e.error):new Promise(((s,e)=>{t.resolve=s,t.reject=e}))}),e.cached&&delete this.awaiting[e.taskId])},this.processPingTask=(s,e,t)=>{this.pushTask(this.createTask("pong",void 0),t.source)},this.processPongTask=(s,e,t)=>{const i=this.pingResolves.get(e);i&&(this.pingResolves.delete(e),i())},this.processCloseTask=(s,e,t)=>{this.detachPort(e)},this.processLockTask=(s,e,t)=>{const i=s.payload;this.requestedLocks.has(i)||(this.requestedLocks.set(i,e),navigator.locks.request(i,(()=>{this.processCloseTask(void 0,e,void 0),this.requestedLocks.delete(i)})))},this.processInvokeTask=(s,e,t)=>{return i=this,n=void 0,r=function*(){const i=s.id,n=s.payload;let o,r,a,c;n.void||(o={taskId:i},r=this.createTask("result",o)),n.withAck&&(a=this.createTask("ack",{taskId:i,cached:!0}));try{const s=this.listeners[n.type];if(!(null==s?void 0:s.length))throw new Error("no listener");const i=s[0];let r=this.invokeListenerCallback(n.type,i,n.payload,e,t);if(n.void)return;if(c=r instanceof Promise,a){const s=!c;if(a.payload.cached=s,s&&(a.payload.result=r),this.pushTask(a,e),s)return}c&&(r=yield r),o.result=r}catch(t){if(this.log.error("worker task error:",t,s),n.void)return;if(a&&a.payload.cached)return a.payload.error=t,void this.pushTask(a,e);o.error=t}this.pushTask(r,e)},new((o=void 0)||(o=Promise))((function(s,e){function t(s){try{c(r.next(s))}catch(s){e(s)}}function a(s){try{c(r.throw(s))}catch(s){e(s)}}function c(e){var i;e.done?s(e.value):(i=e.value,i instanceof o?i:new o((function(s){s(i)}))).then(t,a)}c((r=r.apply(i,n||[])).next())}));var i,n,o,r},this.listenPorts=[],this.sendPorts=[],this.pingResolves=new Map,this.taskId=0,this.awaiting={},this.pending=new Map,this.log=(0,l.kg)("MP"+(s?"-"+s:"")),this.debug=i.ZP,this.heldLocks=new Map,this.requestedLocks=new Map,this.processTaskMap={result:this.processResultTask,ack:this.processAckTask,invoke:this.processInvokeTask,ping:this.processPingTask,pong:this.processPongTask,close:this.processCloseTask,lock:this.processLockTask}}setOnPortDisconnect(s){this.onPortDisconnect=s}attachPort(s){this.attachListenPort(s),this.attachSendPort(s)}attachListenPort(s){this.listenPorts.push(s),s.addEventListener("message",this.onMessage)}attachSendPort(s){var e,t;if(this.log.warn("attaching send port"),null===(t=(e=s).start)||void 0===t||t.call(e),this.sendPorts.push(s),"undefined"!=typeof window)if("locks"in navigator){const e=["lock",n.Z,this.logSuffix||"",2147483647*Math.random()|0].join("-");this.log.warn("created lock",e);const t=new Promise((t=>this.heldLocks.set(s,{resolve:t,id:e}))).then((()=>this.heldLocks.delete(s)));navigator.locks.request(e,(()=>(this.resendLockTask(s),t)))}else window.addEventListener("beforeunload",(()=>{const s=this.createTask("close",void 0);this.postMessage(void 0,s)}));this.releasePending()}resendLockTask(s){const e=this.heldLocks.get(s);e&&this.pushTask(this.createTask("lock",e.id),s)}detachPort(s){var e,t,i,n;this.log.warn("disconnecting port"),(0,r.Z)(this.listenPorts,s),(0,r.Z)(this.sendPorts,s),null===(e=s.removeEventListener)||void 0===e||e.call(s,"message",this.onMessage),null===(i=(t=s).close)||void 0===i||i.call(t),null===(n=this.onPortDisconnect)||void 0===n||n.call(this,s);const o=this.heldLocks.get(s);null==o||o.resolve();const a=(0,h.Z)("PORT_DISCONNECTED");for(const e in this.awaiting){const t=this.awaiting[e];t.port===s&&(t.reject(a),delete this.awaiting[e])}}postMessage(s,e){(Array.isArray(s)?s:s?[s]:this.sendPorts).forEach((s=>{s.postMessage(e,e.transfer)}))}releasePending(){this.releasingPending||(this.releasingPending=!0,this.debug&&this.log.debug("releasing tasks, length:",this.pending.size),this.pending.forEach(((s,e)=>{const t=s,i=e?[e]:this.sendPorts;i.length&&(t.forEach((s=>{try{this.postMessage(i,s)}catch(e){this.log.error("postMessage error:",e,s,i)}})),this.pending.delete(e))})),this.debug&&this.log.debug("released tasks"),this.releasingPending=!1)}createTask(s,e,t){return{type:s,payload:e,id:this.taskId++,transfer:t}}createInvokeTask(s,e,t,i,n){return this.createTask("invoke",{type:s,payload:e,withAck:t,void:i},n)}pushTask(s,e){let t=this.pending.get(e);t||this.pending.set(e,t=[]),t.push(s),this.releasePending()}invokeVoid(s,e,t,i){const n=this.createInvokeTask(s,e,void 0,!0,i);this.pushTask(n,t)}invoke(s,e,t,i,n){let r;this.debug&&this.log.debug("start",s,e);const c=new Promise(((o,a)=>{r=this.createInvokeTask(s,e,t,void 0,n),this.awaiting[r.id]={resolve:o,reject:a,taskType:s,port:i},this.pushTask(r,i)}));if(a.kC){c.finally((()=>{clearInterval(s)}));const s=o.Z.setInterval((()=>{this.log.error("task still has no result",r,i)}),6e4)}return c}invokeExceptSource(s,e,t){const i=this.sendPorts.slice();(0,r.Z)(i,t),i.forEach((t=>{this.invokeVoid(s,e,t)}))}}}}]); +//# sourceMappingURL=437.a80d805671a4b222696d.bundle.js.map \ No newline at end of file diff --git a/public/437.a80d805671a4b222696d.bundle.js.map b/public/437.a80d805671a4b222696d.bundle.js.map new file mode 100644 index 00000000..4ea7706a --- /dev/null +++ b/public/437.a80d805671a4b222696d.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"437.a80d805671a4b222696d.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/modes.ts","webpack://tweb/./src/config/tabId.ts","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/helpers/array/findAndSplice.ts","webpack://tweb/./src/helpers/array/indexOfAndSplice.ts","webpack://tweb/./src/helpers/dT.ts","webpack://tweb/./src/helpers/eventListenerBase.ts","webpack://tweb/./src/helpers/makeError.ts","webpack://tweb/./src/lib/mtproto/superMessagePort.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const DEBUG = (process.env.NODE_ENV !== 'production' || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {TransportType} from '../lib/mtproto/dcConfigurator';\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n multipleConnections: true,\n asServiceWorker: false,\n transport: 'websocket' as TransportType,\n noSharedWorker: location.search.indexOf('noSharedWorker=1') > 0\n};\n\n \nModes.http = location.search.indexOf('http=1') > 0;\n \n\n \n \n \n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\n \n \n \n\nexport default Modes;\n","const tabId = Date.now() % Math.random() * 100000000 | 0;\nexport default tabId;\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","export default function findAndSplice(array: Array, verify: (value: T, index?: number, array?: Array) => boolean) {\n const index = array.findIndex(verify);\n return index !== -1 ? array.splice(index, 1)[0] : undefined;\n};\n","export default function indexOfAndSplice(array: Array, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx === -1 ? undefined : array.splice(idx, 1);\n return spliced?.[0];\n}\n","const _logTimer = Date.now();\nexport default function dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { MOUNT_CLASS_TO } from \"../config/debug\";\nimport type {ArgumentTypes, SuperReturnType} from '../types';\nimport findAndSplice from './array/findAndSplice';\n\n// class EventSystem {\n// wm: WeakMap>> = new WeakMap();\n\n// add(target: any, event: any, listener: any) {\n// let listeners = this.wm.get(target);\n// if (listeners === undefined) {\n// listeners = {};\n// }\n// let listenersForEvent = listeners[event];\n// if (listenersForEvent === undefined) {\n// listenersForEvent = new Set();\n// }\n// listenersForEvent.add(listener);\n// listeners[event] = listenersForEvent;\n// //target.addEventListener(event, listener);\n// this.wm.set(target, listeners);\n// };\n\n// remove(target: any, event: any, listener: any) {\n// let listeners = this.wm.get(target);\n// if (!listeners) return;\n// let listenersForEvent = listeners[event];\n// if (!listenersForEvent) return;\n// listenersForEvent.delete(listener);\n// };\n\n// /* fire(target, event) {\n// let listeners = this.wm.get(target);\n// if (!listeners) return;\n// let listenersForEvent = listeners[event];\n// if (!listenersForEvent) return;\n// for (let handler of handlers) {\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous.\n// }\n// }; */\n// }\n\n// console.log = () => {};\n\n// const e = new EventSystem();\n// MOUNT_CLASS_TO.e = e;\n\nexport type EventListenerListeners = Record;\n// export type EventListenerListeners = Record any>;\n// export type EventListenerListeners = {[name in string]: Function};\n\n/**\n * Better not to remove listeners during setting\n * Should add listener callback only once\n */\n\ntype ListenerObject = {callback: T, options: boolean | AddEventListenerOptions};\n\n// type EventLitenerCallback = (data: T) =>\n// export default class EventListenerBase {\nexport default class EventListenerBase {\n protected listeners: Partial<{\n [k in keyof Listeners]: Array>\n }>;\n protected listenerResults: Partial<{\n [k in keyof Listeners]: ArgumentTypes\n }>;\n\n private reuseResults: boolean;\n\n constructor(reuseResults?: boolean) {\n this._constructor(reuseResults);\n }\n\n public _constructor(reuseResults?: boolean): any {\n this.reuseResults = reuseResults;\n this.listeners = {};\n this.listenerResults = {};\n }\n\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\n (this.listeners[name] ??= []).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\n\n if(this.listenerResults.hasOwnProperty(name)) {\n callback(...this.listenerResults[name]);\n\n if((options as AddEventListenerOptions)?.once) {\n this.listeners[name].pop();\n return;\n }\n }\n\n // e.add(this, name, {callback, once});\n }\n\n public addMultipleEventsListeners(obj: {\n [name in keyof Listeners]?: Listeners[name]\n }) {\n for(const i in obj) {\n this.addEventListener(i, obj[i]);\n }\n }\n\n public removeEventListener(\n name: T,\n callback: Listeners[T],\n options?: boolean | AddEventListenerOptions\n ) {\n if(this.listeners[name]) {\n findAndSplice(this.listeners[name], (l) => l.callback === callback);\n }\n // e.remove(this, name, callback);\n }\n\n protected invokeListenerCallback>(\n name: T,\n listener: L,\n ...args: ArgumentTypes\n ) {\n let result: any, error: any;\n try {\n result = listener.callback(...args);\n } catch(err) {\n error = err;\n // console.error('listener callback error', err);\n }\n\n if((listener.options as AddEventListenerOptions)?.once) {\n this.removeEventListener(name, listener.callback);\n }\n\n if(error) {\n throw error;\n }\n\n return result;\n }\n\n private _dispatchEvent(\n name: T,\n collectResults: boolean,\n ...args: ArgumentTypes\n ) {\n if(this.reuseResults) {\n this.listenerResults[name] = args;\n }\n\n const arr: Array> = collectResults && [];\n\n const listeners = this.listeners[name];\n if(listeners) {\n // ! this one will guarantee execution even if delete another listener during setting\n const left = listeners.slice();\n left.forEach((listener) => {\n const index = listeners.findIndex((l) => l.callback === listener.callback);\n if(index === -1) {\n return;\n }\n\n const result = this.invokeListenerCallback(name, listener, ...args);\n if(arr) {\n arr.push(result);\n }\n });\n }\n\n return arr;\n }\n\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\n return this._dispatchEvent(name, true, ...args);\n }\n\n // * must be protected, but who cares\n public dispatchEvent(\n name: T,\n ...args: ArgumentTypes\n ) {\n // @ts-ignore\n this._dispatchEvent(name, false, ...args);\n }\n\n public cleanup() {\n this.listeners = {};\n this.listenerResults = {};\n }\n}\n","const CACHED_ERRORS: {[key in Error['type']]?: ApiError} = {};\nexport default function makeError(type: Error['type']) {\n return CACHED_ERRORS[type] ??= {\n 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 DEBUG from '../../config/debug';\nimport tabId from '../../config/tabId';\nimport ctx from '../../environment/ctx';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {IS_WORKER} from '../../helpers/context';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport makeError from '../../helpers/makeError';\nimport {Awaited, WorkerTaskTemplate, WorkerTaskVoidTemplate} from '../../types';\nimport {logger} from '../logger';\n\ntype SuperMessagePortTask = WorkerTaskTemplate & {\n transfer?: Transferable[]\n};\n\ninterface InvokeTask extends SuperMessagePortTask {\n type: 'invoke',\n payload: WorkerTaskVoidTemplate & {withAck?: boolean, void?: boolean}\n}\n\ninterface ResultTask extends SuperMessagePortTask {\n type: 'result',\n payload: {\n taskId: number,\n result?: any,\n error?: any\n }\n}\n\ninterface AckTask extends SuperMessagePortTask {\n type: 'ack',\n payload: {\n cached: boolean,\n taskId: number\n result?: any,\n error?: any,\n }\n}\n\ninterface PingTask extends SuperMessagePortTask {\n type: 'ping'\n}\n\ninterface PongTask extends SuperMessagePortTask {\n type: 'pong'\n}\n\ninterface BatchTask extends SuperMessagePortTask {\n type: 'batch',\n payload: Task[]\n}\n\ninterface CloseTask extends SuperMessagePortTask {\n type: 'close'\n}\n\n// interface OpenTask extends SuperMessagePortTask {\n// type: 'open'\n// }\n\ninterface LockTask extends SuperMessagePortTask {\n type: 'lock',\n payload: string\n}\n\ntype Task = InvokeTask | ResultTask | AckTask | PingTask | PongTask | BatchTask | CloseTask/* | OpenTask */ | LockTask;\ntype TaskMap = {\n [type in Task as type['type']]?: (task: Extract, source: MessageEventSource, event: MessageEvent) => void | Promise\n};\n\nexport type AckedResult = {\n cached: boolean,\n result: Promise\n};\n// export type AckedResult = {\n// cached: true,\n// result: T\n// } | {\n// cached: false,\n// result: Promise\n// };\n\ntype ListenPort = WindowProxy | MessagePort | ServiceWorker | Worker | ServiceWorkerContainer;\ntype SendPort = Pick/* WindowProxy | MessagePort | ServiceWorker | Worker */;\n\nexport type MessageListenPort = ListenPort;\nexport type MessageSendPort = SendPort;\n\ntype ListenerCallback = (payload: any, source: MessageEventSource, event: MessageEvent) => any;\ntype Listeners = Record;\n\n// const PING_INTERVAL = DEBUG && false ? 0x7FFFFFFF : 5000;\n// const PING_TIMEOUT = DEBUG && false ? 0x7FFFFFFF : 10000;\n\nexport default class SuperMessagePort<\n Workers extends Listeners,\n Masters extends Listeners,\n IsMaster extends boolean,\n Receive extends Listeners = IsMaster extends true ? Masters : Workers,\n Send extends Listeners = IsMaster extends true ? Workers : Masters\n> extends EventListenerBase {\n protected listenPorts: Array;\n protected sendPorts: Array;\n protected pingResolves: Map void>;\n\n protected taskId: number;\n protected awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskType: string,\n port?: SendPort\n }\n };\n protected pending: Map;\n\n protected log: ReturnType;\n protected debug: boolean;\n protected releasingPending: boolean;\n\n protected processTaskMap: TaskMap;\n\n protected onPortDisconnect: (source: MessageEventSource) => void;\n // protected onPortConnect: (source: MessageEventSource) => void;\n\n protected heldLocks: Map void, id: string}>;\n protected requestedLocks: Map;\n\n constructor(protected logSuffix?: string) {\n super(false);\n\n this.listenPorts = [];\n this.sendPorts = [];\n this.pingResolves = new Map();\n this.taskId = 0;\n this.awaiting = {};\n this.pending = new Map();\n this.log = logger('MP' + (logSuffix ? '-' + logSuffix : ''));\n this.debug = DEBUG;\n this.heldLocks = new Map();\n this.requestedLocks = new Map();\n\n this.processTaskMap = {\n result: this.processResultTask,\n ack: this.processAckTask,\n invoke: this.processInvokeTask,\n ping: this.processPingTask,\n pong: this.processPongTask,\n close: this.processCloseTask,\n // open: this.processOpenTask,\n lock: this.processLockTask\n };\n }\n\n public setOnPortDisconnect(callback: (source: MessageEventSource) => void) {\n this.onPortDisconnect = callback;\n }\n\n // public setOnPortConnect(callback: (source: MessageEventSource) => void) {\n // this.onPortConnect = callback;\n // }\n\n public attachPort(port: MessageEventSource) {\n this.attachListenPort(port);\n this.attachSendPort(port);\n }\n\n public attachListenPort(port: ListenPort) {\n this.listenPorts.push(port);\n port.addEventListener('message', this.onMessage as any);\n }\n\n public attachSendPort(port: SendPort) {\n this.log.warn('attaching send port');\n\n (port as MessagePort).start?.();\n\n this.sendPorts.push(port);\n // this.sendPing(port);\n\n // const task = this.createTask('open', undefined);\n // this.postMessage(port, task);\n\n if(typeof(window) !== 'undefined') {\n if('locks' in navigator) {\n const id = ['lock', tabId, this.logSuffix || '', Math.random() * 0x7FFFFFFF | 0].join('-');\n this.log.warn('created lock', id);\n const promise = new Promise((resolve) => this.heldLocks.set(port, {resolve, id}))\n .then(() => this.heldLocks.delete(port));\n navigator.locks.request(id, () => {\n this.resendLockTask(port);\n return promise;\n });\n } else {\n window.addEventListener('beforeunload', () => {\n const task = this.createTask('close', undefined);\n this.postMessage(undefined, task);\n });\n }\n }\n\n this.releasePending();\n }\n\n public resendLockTask(port: SendPort) {\n const lock = this.heldLocks.get(port);\n if(!lock) {\n return;\n }\n\n this.pushTask(this.createTask('lock', lock.id), port);\n }\n\n // ! Can't rely on ping because timers can be suspended\n // protected sendPing(port: SendPort, loop = IS_WORKER) {\n // let timeout: number;\n // const promise = new Promise((resolve, reject) => {\n // this.pingResolves.set(port, resolve);\n // this.pushTask(this.createTask('ping', undefined), port);\n\n // timeout = ctx.setTimeout(() => {\n // reject();\n // }, PING_TIMEOUT);\n // });\n\n // promise.then(() => {\n // // this.log('got pong');\n\n // clearTimeout(timeout);\n // this.pingResolves.delete(port);\n\n // if(loop) {\n // this.sendPingWithTimeout(port);\n // }\n // }, () => {\n // this.pingResolves.delete(port);\n // this.detachPort(port);\n // });\n // }\n\n // protected sendPingWithTimeout(port: SendPort, timeout = PING_INTERVAL) {\n // ctx.setTimeout(() => {\n // if(!this.sendPorts.includes(port)) {\n // return;\n // }\n\n // this.sendPing(port);\n // }, timeout);\n // }\n\n public detachPort(port: ListenPort) {\n this.log.warn('disconnecting port');\n\n indexOfAndSplice(this.listenPorts, port);\n indexOfAndSplice(this.sendPorts, port as any);\n\n port.removeEventListener?.('message', this.onMessage as any);\n (port as MessagePort).close?.();\n\n this.onPortDisconnect?.(port as any);\n\n const heldLock = this.heldLocks.get(port as SendPort);\n heldLock?.resolve();\n\n const error = makeError('PORT_DISCONNECTED');\n for(const id in this.awaiting) {\n const task = this.awaiting[id];\n if(task.port === port) {\n task.reject(error);\n delete this.awaiting[id];\n }\n }\n }\n\n protected postMessage(port: SendPort | SendPort[], task: Task) {\n const ports = Array.isArray(port) ? port : (port ? [port] : this.sendPorts);\n ports.forEach((port) => {\n port.postMessage(task, task.transfer as any);\n });\n }\n\n protected onMessage = (event: MessageEvent) => {\n const task: Task = event.data;\n // this.log('got message', task);\n\n const source: MessageEventSource = event.source || event.currentTarget as any; // can have no source\n /* if(task.type === 'batch') {\n const newEvent: MessageEvent = {data: event.data, source: event.source, currentTarget: event.currentTarget} as any;\n task.payload.forEach((task) => {\n // @ts-ignore\n newEvent.data = task;\n this.onMessage(newEvent);\n });\n } */\n\n // @ts-ignore\n this.processTaskMap[task.type](task, source, event);\n };\n\n protected /* async */ releasePending() {\n // return;\n\n if(/* !this.listenPorts.length || !this.sendPorts.length || */this.releasingPending) {\n return;\n }\n\n this.releasingPending = true;\n // const perf = performance.now();\n // await pause(0);\n\n this.debug && this.log.debug('releasing tasks, length:', this.pending.size/* , performance.now() - perf */);\n\n this.pending.forEach((portTasks, port) => {\n // let batchTask: BatchTask;\n // const tasks: Task[] = [];\n // portTasks.forEach((task) => {\n // if(task.transfer) {\n // batchTask = undefined;\n // tasks.push(task);\n // } else {\n // if(!batchTask) {\n // batchTask = this.createTask('batch', []);\n // tasks.push(batchTask);\n // }\n\n // batchTask.payload.push(task);\n // }\n // });\n\n const tasks = portTasks;\n const ports = port ? [port] : this.sendPorts;\n if(!ports.length) {\n return;\n }\n\n tasks.forEach((task) => {\n // if(task.type === 'batch') {\n // this.log(`batching ${task.payload.length} tasks`);\n // }\n\n try {\n // if(IS_SERVICE_WORKER && !port) {\n // notifyAll(task);\n // } else {\n this.postMessage(ports, task);\n // }\n } catch(err) {\n this.log.error('postMessage error:', err, task, ports);\n }\n });\n\n this.pending.delete(port);\n });\n\n this.debug && this.log.debug('released tasks');\n\n this.releasingPending = false;\n }\n\n protected processResultTask = (task: ResultTask) => {\n const {taskId, result, error} = task.payload;\n const deferred = this.awaiting[taskId];\n if(!deferred) {\n return;\n }\n\n this.debug && this.log.debug('done', deferred.taskType, result, error);\n 'error' in task.payload ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n };\n\n protected processAckTask = (task: AckTask) => {\n const payload = task.payload;\n const deferred = this.awaiting[payload.taskId];\n if(!deferred) {\n return;\n }\n\n // * will finish the init promise with incoming result\n const previousResolve: (acked: AckedResult) => void = deferred.resolve;\n // const previousReject = deferred.reject;\n\n // if(payload.cached) {\n // if('result' in payload) {\n // previousResolve({\n // cached: true,\n // result: payload.result\n // });\n // } else {\n // previousReject(payload.error);\n // }\n // } else {\n // const ret: AckedResult = {\n // cached: false,\n // result: new Promise((resolve, reject) => {\n // deferred.resolve = resolve;\n // deferred.reject = reject;\n // })\n // };\n\n // previousResolve(ret);\n // }\n\n const ret: AckedResult = {\n cached: payload.cached,\n result: payload.cached ? ('result' in payload ? Promise.resolve(payload.result) : Promise.reject(payload.error)) : new Promise((resolve, reject) => {\n deferred.resolve = resolve;\n deferred.reject = reject;\n })\n };\n\n previousResolve(ret);\n\n if(payload.cached) {\n delete this.awaiting[payload.taskId];\n }\n };\n\n protected processPingTask = (task: PingTask, source: MessageEventSource, event: MessageEvent) => {\n this.pushTask(this.createTask('pong', undefined), event.source);\n };\n\n protected processPongTask = (task: PongTask, source: MessageEventSource, event: MessageEvent) => {\n const pingResolve = this.pingResolves.get(source);\n if(pingResolve) {\n this.pingResolves.delete(source);\n pingResolve();\n }\n };\n\n protected processCloseTask = (task: CloseTask, source: MessageEventSource, event: MessageEvent) => {\n this.detachPort(source);\n };\n\n // * it's just an 'open' callback, DO NOT attach port from here\n // protected processOpenTask = (task: OpenTask, source: MessageEventSource, event: MessageEvent) => {\n // this.onPortConnect?.(source);\n // };\n\n protected processLockTask = (task: LockTask, source: MessageEventSource, event: MessageEvent) => {\n const id = task.payload;\n if(this.requestedLocks.has(id)) {\n return;\n }\n\n this.requestedLocks.set(id, source);\n navigator.locks.request(id, () => {\n this.processCloseTask(undefined, source, undefined);\n this.requestedLocks.delete(id);\n });\n };\n\n protected processInvokeTask = async(task: InvokeTask, source: MessageEventSource, event: MessageEvent) => {\n const id = task.id;\n const innerTask = task.payload;\n\n let resultTaskPayload: ResultTask['payload'];\n let resultTask: ResultTask, ackTask: AckTask;\n if(!innerTask.void) {\n resultTaskPayload = {taskId: id};\n resultTask = this.createTask('result', resultTaskPayload);\n }\n\n if(innerTask.withAck) {\n ackTask = this.createTask('ack', {\n taskId: id,\n cached: true\n });\n }\n\n let isPromise: boolean;\n try {\n const listeners = this.listeners[innerTask.type];\n if(!listeners?.length) {\n throw new Error('no listener');\n }\n\n const listener = listeners[0];\n\n // @ts-ignore\n let result = this.invokeListenerCallback(innerTask.type, listener, innerTask.payload, source, event);\n if(innerTask.void) {\n return;\n }\n\n isPromise = result instanceof Promise;\n\n if(ackTask) {\n const cached = !isPromise;\n ackTask.payload.cached = cached;\n if(cached) ackTask.payload.result = result;\n this.pushTask(ackTask, source);\n\n if(cached) {\n return;\n }\n }\n\n if(isPromise) {\n result = await result;\n }\n\n resultTaskPayload.result = result;\n } catch(error) {\n this.log.error('worker task error:', error, task);\n if(innerTask.void) {\n return;\n }\n\n if(ackTask && ackTask.payload.cached) {\n ackTask.payload.error = error;\n this.pushTask(ackTask, source);\n return;\n }\n\n resultTaskPayload.error = error;\n }\n\n this.pushTask(resultTask, source);\n };\n\n protected createTask[0]>(type: T, payload: K['payload'], transfer?: Transferable[]): K {\n return {\n type,\n payload,\n id: this.taskId++,\n transfer\n } as K;\n }\n\n protected createInvokeTask(type: string, payload: any, withAck?: boolean, _void?: boolean, transfer?: Transferable[]): InvokeTask {\n return this.createTask('invoke', {\n type,\n payload,\n withAck,\n void: _void\n }, transfer);\n }\n\n protected pushTask(task: Task, port?: SendPort) {\n let tasks = this.pending.get(port);\n if(!tasks) {\n this.pending.set(port, tasks = []);\n }\n\n tasks.push(task);\n this.releasePending();\n }\n\n public invokeVoid(type: T, payload: Parameters[0], port?: SendPort, transfer?: Transferable[]) {\n const task = this.createInvokeTask(type as string, payload, undefined, true, transfer);\n this.pushTask(task, port);\n }\n\n public invoke(type: T, payload: Parameters[0], withAck?: false, port?: SendPort, transfer?: Transferable[]): Promise>>;\n public invoke(type: T, payload: Parameters[0], withAck?: true, port?: SendPort, transfer?: Transferable[]): Promise>>>;\n public invoke(type: T, payload: Parameters[0], withAck?: boolean, port?: SendPort, transfer?: Transferable[]) {\n this.debug && this.log.debug('start', type, payload);\n\n let task: InvokeTask;\n const promise = new Promise>>((resolve, reject) => {\n task = this.createInvokeTask(type as string, payload, withAck, undefined, transfer);\n this.awaiting[task.id] = {resolve, reject, taskType: type as string, port};\n this.pushTask(task, port);\n });\n\n if(IS_WORKER) {\n promise.finally(() => {\n clearInterval(interval);\n });\n\n const interval = ctx.setInterval(() => {\n this.log.error('task still has no result', task, port);\n }, 60e3);\n } else if(false) {\n // let timedOut = false;\n const startTime = Date.now();\n promise.finally(() => {\n const elapsedTime = Date.now() - startTime;\n if(elapsedTime >= TIMEOUT) {\n this.log.error(`task was processing ${Date.now() - startTime}ms`, task.payload.payload, port);\n }/* else {\n clearTimeout(timeout);\n } */\n });\n\n const TIMEOUT = 10;\n // const timeout = ctx.setTimeout(() => {\n // timedOut = true;\n // // this.log.error(`task is processing more than ${TIMEOUT} milliseconds`, task, port);\n // }, TIMEOUT);\n }\n\n return promise;\n }\n\n public invokeExceptSource(type: T, payload: Parameters[0], source?: SendPort) {\n const ports = this.sendPorts.slice();\n indexOfAndSplice(ports, source);\n\n ports.forEach((target) => {\n this.invokeVoid(type, payload, target);\n });\n }\n}\n"],"names":["DEBUG","MOUNT_CLASS_TO","window","self","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","noSharedWorker","Date","now","Math","random","findAndSplice","array","verify","index","findIndex","splice","undefined","indexOfAndSplice","item","idx","spliced","_logTimer","dT","toFixed","EventListenerBase","constructor","reuseResults","this","_constructor","listeners","listenerResults","addEventListener","name","callback","options","push","hasOwnProperty","once","pop","addMultipleEventsListeners","obj","i","removeEventListener","l","invokeListenerCallback","listener","args","result","error","err","_dispatchEvent","collectResults","arr","slice","forEach","dispatchResultableEvent","dispatchEvent","cleanup","CACHED_ERRORS","makeError","type","SuperMessagePort","logSuffix","super","onMessage","event","task","data","source","currentTarget","processTaskMap","processResultTask","taskId","payload","deferred","awaiting","log","taskType","reject","resolve","processAckTask","previousResolve","cached","Promise","processPingTask","pushTask","createTask","processPongTask","pingResolve","pingResolves","get","delete","processCloseTask","detachPort","processLockTask","id","requestedLocks","has","set","navigator","locks","request","processInvokeTask","innerTask","resultTaskPayload","resultTask","ackTask","isPromise","void","withAck","length","Error","listenPorts","sendPorts","Map","pending","heldLocks","ack","invoke","ping","pong","close","lock","setOnPortDisconnect","onPortDisconnect","attachPort","port","attachListenPort","attachSendPort","warn","start","join","promise","then","resendLockTask","postMessage","releasePending","heldLock","Array","isArray","transfer","releasingPending","size","portTasks","tasks","ports","createInvokeTask","_void","invokeVoid","finally","clearInterval","interval","invokeExceptSource","target"],"sourceRoot":""} \ No newline at end of file diff --git a/public/442.aee5aa5c25ff95c14b4d.chunk.js b/public/442.7c9b38d200f56e7d3245.chunk.js similarity index 97% rename from public/442.aee5aa5c25ff95c14b4d.chunk.js rename to public/442.7c9b38d200f56e7d3245.chunk.js index 468aeea9..3d1342eb 100644 --- a/public/442.aee5aa5c25ff95c14b4d.chunk.js +++ b/public/442.7c9b38d200f56e7d3245.chunk.js @@ -1,2 +1,2 @@ "use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[442,774],{2582:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(2325);class s{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,n.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,n.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,a)=>{a.r(t),a.d(t,{default:()=>v});var n=a(279),s=a(4755),i=a(4874),r=a(4494),l=a(6830),o=a(4425),p=a(2325),c=a(2582),u=a(3910),d=a(2738),h=a(2614),m=a(5565),g=a(1656),b=a(8115),w=a(3512);let y;const v=new i.Z("page-password",!0,(()=>{const e=new c.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,r.Z)("btn-primary btn-color-primary"),i=new p.ZP.IntlElement({key:"Login.Next"});t.append(i.element);const v=new l.Z({label:"LoginPassword",name:"password"});let L;y=v.input,e.inputWrapper.append(v.container,t);const Z=()=>(L||(L=window.setInterval(Z,1e4)),w.Z.managers.passwordManager.getState().then((e=>{k=e,k.hint?(0,m.Z)(v.label,(0,h.Z)((0,b.Z)(k.hint))):v.setLabel()})));let k;const S=e=>{if(e&&(0,u.Z)(e),!y.value.length)return void y.classList.add("error");const s=(0,g.Z)([y,t],!0),r=y.value;i.update({key:"PleaseWait"});const l=(0,n.y)(t);v.setValueSilently(""+Math.random()),v.setValueSilently(r),w.Z.managers.passwordManager.check(r,k).then((e=>{"auth.authorization"===e._?(clearInterval(L),a.e(781).then(a.bind(a,5436)).then((e=>{e.default.mount()})),E&&E.remove()):(t.removeAttribute("disabled"),i.update({key:e._}),l.remove())})).catch((e=>{s(),v.input.classList.add("error"),e.type,i.update({key:"PASSWORD_HASH_INVALID"}),y.select(),l.remove(),Z()}))};(0,d.fc)(t,S),y.addEventListener("keypress",(function(e){if(this.classList.remove("error"),i.update({key:"Login.Next"}),"Enter"===e.key)return S()}));const N=s.Z.isMobile?100:166,E=new o.Z(v,N);return e.imageDiv.append(E.container),Promise.all([E.load(),Z()])}),null,(()=>{y.focus(),w.Z.managers.appStateManager.pushToState("authState",{_:"authStatePassword"})}))}}]); -//# sourceMappingURL=442.aee5aa5c25ff95c14b4d.chunk.js.map \ No newline at end of file +//# sourceMappingURL=442.7c9b38d200f56e7d3245.chunk.js.map \ No newline at end of file diff --git a/public/442.7c9b38d200f56e7d3245.chunk.js.map b/public/442.7c9b38d200f56e7d3245.chunk.js.map new file mode 100644 index 00000000..293f8392 --- /dev/null +++ b/public/442.7c9b38d200f56e7d3245.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"442.7c9b38d200f56e7d3245.chunk.js","mappings":"8HAQe,MAAMA,EAQnBC,YAAYC,GAMVC,KAAKC,QAAUC,SAASC,KAAKC,cAAc,IAAML,EAAQM,WAIzDL,KAAKM,UAAYJ,SAASK,cAAc,OACxCP,KAAKM,UAAUD,UAAY,yBAE3BL,KAAKQ,SAAWN,SAASK,cAAc,OACvCP,KAAKQ,SAASH,UAAY,aAE1BL,KAAKS,MAAQP,SAASK,cAAc,MACjCR,EAAQW,cACTV,KAAKS,MAAME,QAAO,QAAKZ,EAAQW,eAGjCV,KAAKY,SAAWV,SAASK,cAAc,KACvCP,KAAKY,SAASP,UAAY,WACvBN,EAAQc,iBACTb,KAAKY,SAASD,QAAO,QAAKZ,EAAQc,kBAGpCb,KAAKM,UAAUK,OAAOX,KAAKQ,SAAUR,KAAKS,MAAOT,KAAKY,UAEnDb,EAAQe,mBACTd,KAAKe,aAAeb,SAASK,cAAc,OAC3CP,KAAKe,aAAaV,UAAY,gBAC9BL,KAAKM,UAAUK,OAAOX,KAAKe,eAG7Bf,KAAKC,QAAQU,OAAOX,KAAKM,c,sMC3B7B,IAAIU,EAEJ,MA6HA,EARa,IAAI,IAAK,iBAAiB,GArHlB,KACnB,MAAMC,EAAO,IAAI,IAAU,CACzBZ,UAAW,gBACXS,kBAAkB,EAClBJ,aAAc,uBACdG,gBAAiB,4BAGbK,GAAU,OAAO,iCACjBC,EAAc,IAAI,iBAAiB,CAACC,IAAK,eAE/CF,EAAQP,OAAOQ,EAAYlB,SAE3B,MAAMoB,EAAqB,IAAI,IAAmB,CAChDC,MAAO,gBACPC,KAAM,aAOR,IAAIC,EAJJR,EAAgBK,EAAmBI,MAEnCR,EAAKF,aAAaJ,OAAOU,EAAmBf,UAAWY,GAIvD,MAAMQ,EAAW,KAEXF,IACFA,EAAmBG,OAAOC,YAAYF,EAAU,MAGlC,wCAA8CG,MAAMC,IAClEC,EAAQD,EAELC,EAAMC,MACP,OAAeX,EAAmBC,OAAO,QAAW,OAAcS,EAAMC,QAExEX,EAAmBY,eAKzB,IAAIF,EAEJ,MAAMG,EAAYC,IAKhB,GAJGA,IACD,OAAYA,IAGVnB,EAAcoB,MAAMC,OAEtB,YADArB,EAAcsB,UAAUC,IAAI,SAI9B,MAAMC,GAAS,OAAiB,CAACxB,EAAeE,IAAU,GACpDkB,EAAQpB,EAAcoB,MAE5BjB,EAAYsB,OAAO,CAACrB,IAAK,eACzB,MAAMsB,GAAY,OAAaxB,GAE/BG,EAAmBsB,iBAAiB,GAAKC,KAAKC,UAC9CxB,EAAmBsB,iBAAiBP,GAEpC,mCAAyCA,EAAOL,GAAOF,MAAMiB,IAIpD,uBADAA,EAASC,GAEZC,cAAcxB,GACd,8BAAmBK,MAAMoB,IACvBA,EAAEC,QAAQC,WAETC,GAAQA,EAAOC,WAGlBnC,EAAQoC,gBAAgB,YACxBnC,EAAYsB,OAAO,CAACrB,IAAK0B,EAASC,IAClCL,EAAUW,aAGbE,OAAOC,IACRhB,IACAnB,EAAmBI,MAAMa,UAAUC,IAAI,SAEhCiB,EAAIC,KAGPtC,EAAYsB,OAAO,CAACrB,IAAK,0BACzBJ,EAAc0C,SAIlBhB,EAAUW,SAEV3B,SAIJ,QAAiBR,EAASgB,GAE1BlB,EAAc2C,iBAAiB,YAAY,SAAexB,GAIxD,GAHAnC,KAAKsC,UAAUe,OAAO,SACtBlC,EAAYsB,OAAO,CAACrB,IAAK,eAEZ,UAAVe,EAAEf,IACH,OAAOc,OAIX,MAAM0B,EAAO,aAAsB,IAAM,IACnCR,EAAS,IAAI,IAAe/B,EAAoBuC,GAEtD,OADA3C,EAAKT,SAASG,OAAOyC,EAAO9C,WACrBuD,QAAQC,IAAI,CACjBV,EAAOW,OACPrC,QAIuD,MAAM,KAE/DV,EAAcgD,QAGd,yCAA+C,YAAa,CAACjB,EAAG","sources":["webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {LangPackKey, i18n} from '../lib/langPack';\n\nexport default class LoginPage {\n public element: HTMLElement;\n public container: HTMLElement;\n public imageDiv: HTMLElement;\n public inputWrapper: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLParagraphElement;\n\n constructor(options: {\n className: string,\n withInputWrapper?: boolean,\n titleLangKey?: LangPackKey,\n subtitleLangKey?: LangPackKey,\n }) {\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\n // this.element = document.createElement('div');\n // this.element.className = 'page-' + options.className;\n\n this.container = document.createElement('div');\n this.container.className = 'container center-align';\n\n this.imageDiv = document.createElement('div');\n this.imageDiv.className = 'auth-image';\n\n this.title = document.createElement('h4');\n if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n this.subtitle = document.createElement('p');\n this.subtitle.className = 'subtitle';\n if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey));\n }\n\n this.container.append(this.imageDiv, this.title, this.subtitle);\n\n if(options.withInputWrapper) {\n this.inputWrapper = document.createElement('div');\n this.inputWrapper.className = 'input-wrapper';\n this.container.append(this.inputWrapper);\n }\n\n this.element.append(this.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 {putPreloader} from '../components/putPreloader';\nimport mediaSizes from '../helpers/mediaSizes';\nimport {AccountPassword} from '../layer';\nimport Page from './page';\nimport Button from '../components/button';\nimport PasswordInputField from '../components/passwordInputField';\nimport PasswordMonkey from '../components/monkeys/password';\nimport I18n from '../lib/langPack';\nimport LoginPage from './loginPage';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport toggleDisability from '../helpers/dom/toggleDisability';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../lib/rootScope';\n\nconst TEST = false;\nlet passwordInput: HTMLInputElement;\n\nconst onFirstMount = (): Promise => {\n const page = new LoginPage({\n className: 'page-password',\n withInputWrapper: true,\n titleLangKey: 'Login.Password.Title',\n subtitleLangKey: 'Login.Password.Subtitle'\n });\n\n const btnNext = Button('btn-primary btn-color-primary');\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\n\n btnNext.append(btnNextI18n.element);\n\n const passwordInputField = new PasswordInputField({\n label: 'LoginPassword',\n name: 'password'\n });\n\n passwordInput = passwordInputField.input as HTMLInputElement;\n\n page.inputWrapper.append(passwordInputField.container, btnNext);\n\n let getStateInterval: number;\n\n const getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\n state = _state;\n\n if(state.hint) {\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\n } else {\n passwordInputField.setLabel();\n }\n });\n };\n\n let state: AccountPassword;\n\n const onSubmit = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!passwordInput.value.length) {\n passwordInput.classList.add('error');\n return;\n }\n\n const toggle = toggleDisability([passwordInput, btnNext], true);\n const value = passwordInput.value;\n\n btnNextI18n.update({key: 'PleaseWait'});\n const preloader = putPreloader(btnNext);\n\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\n passwordInputField.setValueSilently(value); // prevent saving suggestion\n\n rootScope.managers.passwordManager.check(value, state).then((response) => {\n // console.log('passwordManager response:', response);\n\n switch(response._) {\n case 'auth.authorization':\n clearInterval(getStateInterval);\n import('./pageIm').then((m) => {\n m.default.mount();\n });\n if(monkey) monkey.remove();\n break;\n default:\n btnNext.removeAttribute('disabled');\n btnNextI18n.update({key: response._ as any});\n preloader.remove();\n break;\n }\n }).catch((err: any) => {\n toggle();\n passwordInputField.input.classList.add('error');\n\n switch(err.type) {\n default:\n // btnNext.innerText = err.type;\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\n passwordInput.select();\n break;\n }\n\n preloader.remove();\n\n getState();\n });\n };\n\n attachClickEvent(btnNext, onSubmit);\n\n passwordInput.addEventListener('keypress', function(this, e) {\n this.classList.remove('error');\n btnNextI18n.update({key: 'Login.Next'});\n\n if(e.key === 'Enter') {\n return onSubmit();\n }\n });\n\n const size = mediaSizes.isMobile ? 100 : 166;\n const monkey = new PasswordMonkey(passwordInputField, size);\n page.imageDiv.append(monkey.container);\n return Promise.all([\n monkey.load(),\n getState()\n ]);\n};\n\nconst page = new Page('page-password', true, onFirstMount, null, () => {\n // if(!isAppleMobile) {\n passwordInput.focus();\n // }\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\n});\n\nexport default page;\n"],"names":["LoginPage","constructor","options","this","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","passwordInputField","label","name","getStateInterval","input","getState","window","setInterval","then","_state","state","hint","setLabel","onSubmit","e","value","length","classList","add","toggle","update","preloader","setValueSilently","Math","random","response","_","clearInterval","m","default","mount","monkey","remove","removeAttribute","catch","err","type","select","addEventListener","size","Promise","all","load","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/442.aee5aa5c25ff95c14b4d.chunk.js.map b/public/442.aee5aa5c25ff95c14b4d.chunk.js.map deleted file mode 100644 index e881e652..00000000 --- a/public/442.aee5aa5c25ff95c14b4d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"442.aee5aa5c25ff95c14b4d.chunk.js","mappings":"8HAQe,MAAMA,EAQnBC,YAAYC,GAMVC,KAAKC,QAAUC,SAASC,KAAKC,cAAc,IAAML,EAAQM,WAIzDL,KAAKM,UAAYJ,SAASK,cAAc,OACxCP,KAAKM,UAAUD,UAAY,yBAE3BL,KAAKQ,SAAWN,SAASK,cAAc,OACvCP,KAAKQ,SAASH,UAAY,aAE1BL,KAAKS,MAAQP,SAASK,cAAc,MACjCR,EAAQW,cACTV,KAAKS,MAAME,QAAO,QAAKZ,EAAQW,eAGjCV,KAAKY,SAAWV,SAASK,cAAc,KACvCP,KAAKY,SAASP,UAAY,WACvBN,EAAQc,iBACTb,KAAKY,SAASD,QAAO,QAAKZ,EAAQc,kBAGpCb,KAAKM,UAAUK,OAAOX,KAAKQ,SAAUR,KAAKS,MAAOT,KAAKY,UAEnDb,EAAQe,mBACTd,KAAKe,aAAeb,SAASK,cAAc,OAC3CP,KAAKe,aAAaV,UAAY,gBAC9BL,KAAKM,UAAUK,OAAOX,KAAKe,eAG7Bf,KAAKC,QAAQU,OAAOX,KAAKM,c,sMC3B7B,IAAIU,EAEJ,MA6HA,EARa,IAAI,IAAK,iBAAiB,GArHlB,KACnB,MAAMC,EAAO,IAAI,IAAU,CACzBZ,UAAW,gBACXS,kBAAkB,EAClBJ,aAAc,uBACdG,gBAAiB,4BAGbK,GAAU,OAAO,iCACjBC,EAAc,IAAI,iBAAiB,CAACC,IAAK,eAE/CF,EAAQP,OAAOQ,EAAYlB,SAE3B,MAAMoB,EAAqB,IAAI,IAAmB,CAChDC,MAAO,gBACPC,KAAM,aAOR,IAAIC,EAJJR,EAAgBK,EAAmBI,MAEnCR,EAAKF,aAAaJ,OAAOU,EAAmBf,UAAWY,GAIvD,MAAMQ,EAAW,KAEXF,IACFA,EAAmBG,OAAOC,YAAYF,EAAU,MAGlC,wCAA8CG,MAAMC,IAClEC,EAAQD,EAELC,EAAMC,MACP,OAAeX,EAAmBC,OAAO,QAAW,OAAcS,EAAMC,QAExEX,EAAmBY,eAKzB,IAAIF,EAEJ,MAAMG,EAAYC,IAKhB,GAJGA,IACD,OAAYA,IAGVnB,EAAcoB,MAAMC,OAEtB,YADArB,EAAcsB,UAAUC,IAAI,SAI9B,MAAMC,GAAS,OAAiB,CAACxB,EAAeE,IAAU,GACpDkB,EAAQpB,EAAcoB,MAE5BjB,EAAYsB,OAAO,CAACrB,IAAK,eACzB,MAAMsB,GAAY,OAAaxB,GAE/BG,EAAmBsB,iBAAiB,GAAKC,KAAKC,UAC9CxB,EAAmBsB,iBAAiBP,GAEpC,mCAAyCA,EAAOL,GAAOF,MAAMiB,IAIpD,uBADAA,EAASC,GAEZC,cAAcxB,GACd,8BAAmBK,MAAMoB,IACvBA,EAAEC,QAAQC,WAETC,GAAQA,EAAOC,WAGlBnC,EAAQoC,gBAAgB,YACxBnC,EAAYsB,OAAO,CAACrB,IAAK0B,EAASC,IAClCL,EAAUW,aAGbE,OAAOC,IACRhB,IACAnB,EAAmBI,MAAMa,UAAUC,IAAI,SAEhCiB,EAAIC,KAGPtC,EAAYsB,OAAO,CAACrB,IAAK,0BACzBJ,EAAc0C,SAIlBhB,EAAUW,SAEV3B,SAIJ,QAAiBR,EAASgB,GAE1BlB,EAAc2C,iBAAiB,YAAY,SAAexB,GAIxD,GAHAnC,KAAKsC,UAAUe,OAAO,SACtBlC,EAAYsB,OAAO,CAACrB,IAAK,eAEZ,UAAVe,EAAEf,IACH,OAAOc,OAIX,MAAM0B,EAAO,aAAsB,IAAM,IACnCR,EAAS,IAAI,IAAe/B,EAAoBuC,GAEtD,OADA3C,EAAKT,SAASG,OAAOyC,EAAO9C,WACrBuD,QAAQC,IAAI,CACjBV,EAAOW,OACPrC,QAIuD,MAAM,KAE/DV,EAAcgD,QAGd,yCAA+C,YAAa,CAACjB,EAAG","sources":["webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {LangPackKey, i18n} from '../lib/langPack';\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n // this.element = document.createElement('div');\r\n // this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n\r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport {AccountPassword} from '../layer';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nconst 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 const getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n const value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n rootScope.managers.passwordManager.check(value, state).then((response) => {\r\n // console.log('passwordManager response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n\r\n switch(err.type) {\r\n default:\r\n // btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n\r\n getState();\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n // if(!isAppleMobile) {\r\n passwordInput.focus();\r\n // }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["LoginPage","constructor","options","this","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","passwordInputField","label","name","getStateInterval","input","getState","window","setInterval","then","_state","state","hint","setLabel","onSubmit","e","value","length","classList","add","toggle","update","preloader","setValueSilently","Math","random","response","_","clearInterval","m","default","mount","monkey","remove","removeAttribute","catch","err","type","select","addEventListener","size","Promise","all","load","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/508.648a1c3659fa38d09b83.chunk.js.map b/public/508.648a1c3659fa38d09b83.chunk.js.map deleted file mode 100644 index a8a423f6..00000000 --- a/public/508.648a1c3659fa38d09b83.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"508.648a1c3659fa38d09b83.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/lib/rlottie/applyReplacements.ts","webpack://tweb/./src/lib/rlottie/rlottie.worker.ts","webpack://tweb/./src/helpers/blob/readBlobAsText.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts"],"sourcesContent":["(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_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\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5]\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0]\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667]\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337]\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f]\n ]\n];\n\nconst convert = (value: number) => {\n return Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find((p) => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n // console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\r\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\r\nimport readBlobAsText from '../../helpers/blob/readBlobAsText';\r\nimport applyReplacements from './applyReplacements';\r\n\r\nimportScripts('rlottie-wasm.js');\r\n// import Module, { allocate, intArrayFromString } from './rlottie-wasm';\r\n\r\nconst _Module = (self as any).Module as any;\r\n\r\nconst DEFAULT_FPS = 60;\r\n\r\ntype LottieHandlePointer = number;\r\n\r\n// throw new Error('test');\r\n\r\nexport class RLottieItem {\r\n private stringOnWasmHeap: number;\r\n private handle: LottieHandlePointer;\r\n private frameCount: number;\r\n private fps: number;\r\n\r\n private dead: boolean;\r\n // private context: OffscreenCanvasRenderingContext2D;\r\n\r\n private imageData: ImageData;\r\n\r\n constructor(\r\n private reqId: number,\r\n private width: number,\r\n private height: number,\r\n private raw?: boolean/* ,\r\n private canvas: OffscreenCanvas */\r\n ) {\r\n }\r\n\r\n public init(json: string, fps: number) {\r\n if(this.dead) {\r\n return;\r\n }\r\n\r\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\r\n\r\n // this.context = canvas.getContext('2d');\r\n /* let frame = 0;\r\n setInterval(() => {\r\n if(frame >= this.frameCount) frame = 0;\r\n let _frame = frame++;\r\n this.render(_frame, null);\r\n }, 1000 / this.fps); */\r\n\r\n try {\r\n this.handle = worker.Api.init();\r\n\r\n // @ts-ignore\r\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\r\n\r\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\r\n\r\n worker.Api.resize(this.handle, this.width, this.height);\r\n\r\n reply(['loaded', this.reqId, this.frameCount, this.fps]);\r\n\r\n if(!this.raw && IS_IMAGE_BITMAP_SUPPORTED) {\r\n this.imageData = new ImageData(this.width, this.height);\r\n }\r\n } catch(e) {\r\n console.error('init RLottieItem error:', e);\r\n reply(['error', this.reqId, e]);\r\n }\r\n }\r\n\r\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\r\n if(this.dead || this.handle === undefined) return;\r\n // return;\r\n\r\n if(this.frameCount < frameNo || frameNo < 0) {\r\n return;\r\n }\r\n\r\n try {\r\n worker.Api.render(this.handle, frameNo);\r\n\r\n const bufferPointer = worker.Api.buffer(this.handle);\r\n\r\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\r\n\r\n if(this.imageData) {\r\n this.imageData.data.set(data);\r\n createImageBitmap(this.imageData).then((imageBitmap) => {\r\n reply(['frame', this.reqId, frameNo, imageBitmap], [imageBitmap]);\r\n });\r\n } else {\r\n if(!clamped) {\r\n clamped = new Uint8ClampedArray(data);\r\n } else {\r\n clamped.set(data);\r\n }\r\n\r\n // this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\r\n\r\n reply(['frame', this.reqId, frameNo, clamped], [clamped.buffer]);\r\n }\r\n } catch(e) {\r\n console.error('Render error:', e);\r\n this.dead = true;\r\n reply(['error', this.reqId, e]);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.dead = true;\r\n\r\n if(this.handle !== undefined) {\r\n worker.Api.destroy(this.handle);\r\n }\r\n }\r\n}\r\n\r\nclass RLottieWorker {\r\n public Api: {\r\n init: () => LottieHandlePointer,\r\n destroy: (handle: LottieHandlePointer) => void,\r\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\r\n buffer: (handle: LottieHandlePointer) => number,\r\n render: (handle: LottieHandlePointer, frameNo: number) => void,\r\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\r\n } = {} as any;\r\n\r\n public initApi() {\r\n this.Api = {\r\n init: _Module.cwrap('lottie_init', '', []),\r\n destroy: _Module.cwrap('lottie_destroy', '', ['number']),\r\n resize: _Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\r\n buffer: _Module.cwrap('lottie_buffer', 'number', ['number']),\r\n render: _Module.cwrap('lottie_render', '', ['number', 'number']),\r\n loadFromData: _Module.cwrap('lottie_load_from_data', 'number', ['number', 'number'])\r\n };\r\n }\r\n\r\n public init() {\r\n this.initApi();\r\n reply(['ready']);\r\n }\r\n}\r\n\r\nconst worker = new RLottieWorker();\r\n\r\n_Module.onRuntimeInitialized = function() {\r\n worker.init();\r\n};\r\n\r\nconst items: {[reqId: string]: RLottieItem} = {};\r\nconst queryableFunctions = {\r\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number, raw: boolean/* , canvas: OffscreenCanvas */) {\r\n const item = items[reqId] = new RLottieItem(reqId, width, height, raw/* , canvas */);\r\n readBlobAsText(blob).then((json) => {\r\n try {\r\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\r\n /* params.animationData = copy(params.animationData);\r\n this.applyReplacements(params.animationData, toneIndex); */\r\n\r\n const newAnimationData = JSON.parse(json);\r\n applyReplacements(newAnimationData, toneIndex);\r\n json = JSON.stringify(newAnimationData);\r\n }\r\n\r\n // ! WARNING, с этой проверкой не все стикеры работают, например - ДУРКА\r\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\r\n throw new Error('Invalid file');\r\n } */\r\n\r\n /* let perf = performance.now();\r\n let json = JSON.parse(jsString);\r\n console.log('sticker decode:', performance.now() - perf); */\r\n\r\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\r\n const frameRate = +match?.[1] || DEFAULT_FPS;\r\n\r\n // console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\r\n\r\n item.init(json, frameRate);\r\n } catch(err) {\r\n console.error('Invalid file for sticker:', json);\r\n reply(['error', reqId, err]);\r\n }\r\n });\r\n },\r\n destroy: function(reqId: number) {\r\n const item = items[reqId];\r\n if(!item) {\r\n return;\r\n }\r\n\r\n item.destroy();\r\n delete items[reqId];\r\n },\r\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\r\n // console.log('worker renderFrame', reqId, frameNo, clamped);\r\n items[reqId].render(frameNo, clamped);\r\n }\r\n};\r\n\r\nfunction reply(args: any[], transfer?: Transferable[]) {\r\n postMessage({queryMethodListener: args.shift(), queryMethodArguments: args}, CAN_USE_TRANSFERABLES ? transfer : undefined);\r\n}\r\n\r\nonmessage = function(e) {\r\n // @ts-ignore\r\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsText(blob: Blob) {\n return readBlobAs(blob, 'readAsText');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"names":["__webpack_require__","oldGetScript","u","oldLoadScript","e","queryMap","Map","countMap","chunkId","has","get","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","set","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","CAN_USE_TRANSFERABLES","err","COLORREPLACEMENTS","convert","value","Math","round","min","max","importScripts","_Module","Module","RLottieItem","constructor","reqId","width","height","raw","init","json","fps","this","dead","handle","worker","Api","stringOnWasmHeap","allocate","intArrayFromString","frameCount","loadFromData","resize","reply","imageData","ImageData","console","render","frameNo","clamped","undefined","bufferPointer","buffer","data","HEAPU8","subarray","createImageBitmap","then","imageBitmap","Uint8ClampedArray","destroy","initApi","cwrap","onRuntimeInitialized","items","queryableFunctions","blob","toneIndex","item","method","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsText","newAnimationData","JSON","parse","object","replacements","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","hasOwnProperty","iterateIt","it","layer","layers","shapes","shape","warn","applyReplacements","stringify","frameRate","renderFrame","args","transfer","postMessage","queryMethodListener","shift","queryMethodArguments","onmessage","queryMethod","apply"],"sourceRoot":""} \ No newline at end of file diff --git a/public/508.648a1c3659fa38d09b83.chunk.js b/public/508.c1aa5baee5227e17c016.chunk.js similarity index 98% rename from public/508.648a1c3659fa38d09b83.chunk.js rename to public/508.c1aa5baee5227e17c016.chunk.js index e22c96a6..5efff84b 100644 --- a/public/508.648a1c3659fa38d09b83.chunk.js +++ b/public/508.c1aa5baee5227e17c016.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";(()=>{if("undefined"!=typeof __webpack_require__){var e=__webpack_require__.u,t=__webpack_require__.e,i=new Map,r=new Map;__webpack_require__.u=function(t){return e(t)+(i.has(t)?"?"+i.get(t):"")},__webpack_require__.e=function(a){return t(a).catch((function(t){var n=r.has(a)?r.get(a):999999;if(n<1){var o=e(a);throw t.message="Loading chunk "+a+" failed after 999999 retries.\n("+o+")",t.request=o,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();i.set(a,t),r.set(a,n-1),e(__webpack_require__.e(a))}),3e3)}))}))}}})();const e="undefined"!=typeof window?window:self,t=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&e.MSStream,!!("safari"in e)||!(!t||!(/\b(iPad|iPhone|iPod)\b/.test(t)||t.match("Safari")&&!t.match("Chrome"))));let r;if(navigator.userAgent.toLowerCase().indexOf("firefox"),navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i),i)try{r=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){r=!1}else r=!0;const a=r,n="undefined"!=typeof ImageBitmap;const o=[[[16219713,13335381],[16757049,16168585],[16765248,16764327],[16768889,16768965]],[[16219713,10771e3],[16757049,14653547],[16765248,15577475],[16768889,16040864]],[[16219713,7354903],[16757049,11233085],[16765248,12812110],[16768889,14194279]],[[16219713,4858889],[16757049,8207886],[16765248,9852201],[16768889,11100983]],[[16219713,2101002],[16757049,4270372],[16765248,5848375],[16768889,6505791]]],s=e=>Math.round(255*Math.min(Math.max(e,0),1));importScripts("rlottie-wasm.js");const h=self.Module;class d{constructor(e,t,i,r){this.reqId=e,this.width=t,this.height=i,this.raw=r}init(e,t){if(!this.dead){this.fps=Math.max(1,Math.min(60,t||60));try{this.handle=c.Api.init(),this.stringOnWasmHeap=allocate(intArrayFromString(e),"i8",0),this.frameCount=c.Api.loadFromData(this.handle,this.stringOnWasmHeap),c.Api.resize(this.handle,this.width,this.height),m(["loaded",this.reqId,this.frameCount,this.fps]),!this.raw&&n&&(this.imageData=new ImageData(this.width,this.height))}catch(e){console.error("init RLottieItem error:",e),m(["error",this.reqId,e])}}}render(e,t){if(!this.dead&&void 0!==this.handle&&!(this.frameCount{m(["frame",this.reqId,e,t],[t])}))):(t?t.set(r):t=new Uint8ClampedArray(r),m(["frame",this.reqId,e,t],[t.buffer]))}catch(e){console.error("Render error:",e),this.dead=!0,m(["error",this.reqId,e])}}destroy(){this.dead=!0,void 0!==this.handle&&c.Api.destroy(this.handle)}}const c=new class{constructor(){this.Api={}}initApi(){this.Api={init:h.cwrap("lottie_init","",[]),destroy:h.cwrap("lottie_destroy","",["number"]),resize:h.cwrap("lottie_resize","",["number","number","number"]),buffer:h.cwrap("lottie_buffer","number",["number"]),render:h.cwrap("lottie_render","",["number","number"]),loadFromData:h.cwrap("lottie_load_from_data","number",["number","number"])}}init(){this.initApi(),m(["ready"])}};h.onRuntimeInitialized=function(){c.init()};const u={},f={loadFromData:function(e,t,i,r,a,n){const h=u[e]=new d(e,i,r,n);(function(e){return function(e,t){return new Promise((t=>{const i=new FileReader;i.addEventListener("loadend",(e=>{t(e.target.result)})),i.readAsText(e)}))}(e)})(t).then((t=>{try{if("number"==typeof a&&a>=1&&a<=5){const e=JSON.parse(t);(function(e,t){const i=o[Math.max(t-1,0)],r=e=>{switch(e.ty){case"st":case"fl":(e=>{const t=e.c.k,r=s(t[2])|s(t[1])<<8|s(t[0])<<16,a=i.find((e=>e[0]===r));a&&(t[0]=(a[1]>>16&255)/255,t[1]=(a[1]>>8&255)/255,t[2]=(255&a[1])/255)})(e)}e.hasOwnProperty("it")&&a(e.it)},a=e=>{for(const t of e)r(t)};try{for(const t of e.layers)if(t.shapes)for(const e of t.shapes)e.it?a(e.it):r(e)}catch(i){console.warn("cant apply replacements",i,e,t)}})(e,a),t=JSON.stringify(e)}const e=t.match(/"fr":\s*?(\d+?),/),i=+(null==e?void 0:e[1])||60;h.init(t,i)}catch(i){console.error("Invalid file for sticker:",t),m(["error",e,i])}}))},destroy:function(e){const t=u[e];t&&(t.destroy(),delete u[e])},renderFrame:function(e,t,i){u[e].render(t,i)}};function m(e,t){postMessage({queryMethodListener:e.shift(),queryMethodArguments:e},a?t:void 0)}onmessage=function(e){f[e.data.queryMethod].apply(f,e.data.queryMethodArguments)}})(); -//# sourceMappingURL=508.648a1c3659fa38d09b83.chunk.js.map \ No newline at end of file +//# sourceMappingURL=508.c1aa5baee5227e17c016.chunk.js.map \ No newline at end of file diff --git a/public/508.c1aa5baee5227e17c016.chunk.js.map b/public/508.c1aa5baee5227e17c016.chunk.js.map new file mode 100644 index 00000000..0686f285 --- /dev/null +++ b/public/508.c1aa5baee5227e17c016.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"508.c1aa5baee5227e17c016.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/lib/rlottie/applyReplacements.ts","webpack://tweb/./src/lib/rlottie/rlottie.worker.ts","webpack://tweb/./src/helpers/blob/readBlobAsText.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts"],"sourcesContent":["(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\n * 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 './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\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;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_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\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5]\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0]\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667]\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337]\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f]\n ]\n];\n\nconst convert = (value: number) => {\n return Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find((p) => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n // console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport readBlobAsText from '../../helpers/blob/readBlobAsText';\nimport applyReplacements from './applyReplacements';\n\nimportScripts('rlottie-wasm.js');\n// import Module, { allocate, intArrayFromString } from './rlottie-wasm';\n\nconst _Module = (self as any).Module as any;\n\nconst DEFAULT_FPS = 60;\n\ntype LottieHandlePointer = number;\n\n// throw new Error('test');\n\nexport class RLottieItem {\n private stringOnWasmHeap: number;\n private handle: LottieHandlePointer;\n private frameCount: number;\n private fps: number;\n\n private dead: boolean;\n // private context: OffscreenCanvasRenderingContext2D;\n\n private imageData: ImageData;\n\n constructor(\n private reqId: number,\n private width: number,\n private height: number,\n private raw?: boolean/* ,\n private canvas: OffscreenCanvas */\n ) {\n }\n\n public init(json: string, fps: number) {\n if(this.dead) {\n return;\n }\n\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\n\n // this.context = canvas.getContext('2d');\n /* let frame = 0;\n setInterval(() => {\n if(frame >= this.frameCount) frame = 0;\n let _frame = frame++;\n this.render(_frame, null);\n }, 1000 / this.fps); */\n\n try {\n this.handle = worker.Api.init();\n\n // @ts-ignore\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\n\n worker.Api.resize(this.handle, this.width, this.height);\n\n reply(['loaded', this.reqId, this.frameCount, this.fps]);\n\n if(!this.raw && IS_IMAGE_BITMAP_SUPPORTED) {\n this.imageData = new ImageData(this.width, this.height);\n }\n } catch(e) {\n console.error('init RLottieItem error:', e);\n reply(['error', this.reqId, e]);\n }\n }\n\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\n if(this.dead || this.handle === undefined) return;\n // return;\n\n if(this.frameCount < frameNo || frameNo < 0) {\n return;\n }\n\n try {\n worker.Api.render(this.handle, frameNo);\n\n const bufferPointer = worker.Api.buffer(this.handle);\n\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\n\n if(this.imageData) {\n this.imageData.data.set(data);\n createImageBitmap(this.imageData).then((imageBitmap) => {\n reply(['frame', this.reqId, frameNo, imageBitmap], [imageBitmap]);\n });\n } else {\n if(!clamped) {\n clamped = new Uint8ClampedArray(data);\n } else {\n clamped.set(data);\n }\n\n // this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\n\n reply(['frame', this.reqId, frameNo, clamped], [clamped.buffer]);\n }\n } catch(e) {\n console.error('Render error:', e);\n this.dead = true;\n reply(['error', this.reqId, e]);\n }\n }\n\n public destroy() {\n this.dead = true;\n\n if(this.handle !== undefined) {\n worker.Api.destroy(this.handle);\n }\n }\n}\n\nclass RLottieWorker {\n public Api: {\n init: () => LottieHandlePointer,\n destroy: (handle: LottieHandlePointer) => void,\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\n buffer: (handle: LottieHandlePointer) => number,\n render: (handle: LottieHandlePointer, frameNo: number) => void,\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\n } = {} as any;\n\n public initApi() {\n this.Api = {\n init: _Module.cwrap('lottie_init', '', []),\n destroy: _Module.cwrap('lottie_destroy', '', ['number']),\n resize: _Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\n buffer: _Module.cwrap('lottie_buffer', 'number', ['number']),\n render: _Module.cwrap('lottie_render', '', ['number', 'number']),\n loadFromData: _Module.cwrap('lottie_load_from_data', 'number', ['number', 'number'])\n };\n }\n\n public init() {\n this.initApi();\n reply(['ready']);\n }\n}\n\nconst worker = new RLottieWorker();\n\n_Module.onRuntimeInitialized = function() {\n worker.init();\n};\n\nconst items: {[reqId: string]: RLottieItem} = {};\nconst queryableFunctions = {\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number, raw: boolean/* , canvas: OffscreenCanvas */) {\n const item = items[reqId] = new RLottieItem(reqId, width, height, raw/* , canvas */);\n readBlobAsText(blob).then((json) => {\n try {\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\n /* params.animationData = copy(params.animationData);\n this.applyReplacements(params.animationData, toneIndex); */\n\n const newAnimationData = JSON.parse(json);\n applyReplacements(newAnimationData, toneIndex);\n json = JSON.stringify(newAnimationData);\n }\n\n // ! WARNING, с этой проверкой не все стикеры работают, например - ДУРКА\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\n throw new Error('Invalid file');\n } */\n\n /* let perf = performance.now();\n let json = JSON.parse(jsString);\n console.log('sticker decode:', performance.now() - perf); */\n\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\n const frameRate = +match?.[1] || DEFAULT_FPS;\n\n // console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\n\n item.init(json, frameRate);\n } catch(err) {\n console.error('Invalid file for sticker:', json);\n reply(['error', reqId, err]);\n }\n });\n },\n destroy: function(reqId: number) {\n const item = items[reqId];\n if(!item) {\n return;\n }\n\n item.destroy();\n delete items[reqId];\n },\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\n // console.log('worker renderFrame', reqId, frameNo, clamped);\n items[reqId].render(frameNo, clamped);\n }\n};\n\nfunction reply(args: any[], transfer?: Transferable[]) {\n postMessage({queryMethodListener: args.shift(), queryMethodArguments: args}, CAN_USE_TRANSFERABLES ? transfer : undefined);\n}\n\nonmessage = function(e) {\n // @ts-ignore\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsText(blob: Blob) {\n return readBlobAs(blob, 'readAsText');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"names":["__webpack_require__","oldGetScript","u","oldLoadScript","e","queryMap","Map","countMap","chunkId","has","get","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","set","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","CAN_USE_TRANSFERABLES","err","COLORREPLACEMENTS","convert","value","Math","round","min","max","importScripts","_Module","Module","RLottieItem","constructor","reqId","width","height","raw","init","json","fps","this","dead","handle","worker","Api","stringOnWasmHeap","allocate","intArrayFromString","frameCount","loadFromData","resize","reply","imageData","ImageData","console","render","frameNo","clamped","undefined","bufferPointer","buffer","data","HEAPU8","subarray","createImageBitmap","then","imageBitmap","Uint8ClampedArray","destroy","initApi","cwrap","onRuntimeInitialized","items","queryableFunctions","blob","toneIndex","item","method","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsText","newAnimationData","JSON","parse","object","replacements","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","hasOwnProperty","iterateIt","it","layer","layers","shapes","shape","warn","applyReplacements","stringify","frameRate","renderFrame","args","transfer","postMessage","queryMethodListener","shift","queryMethodArguments","onmessage","queryMethod","apply"],"sourceRoot":""} \ No newline at end of file diff --git a/public/51.015549e15aab2a59d3a0.chunk.js b/public/51.015549e15aab2a59d3a0.chunk.js deleted file mode 100644 index 887cb6ff..00000000 --- a/public/51.015549e15aab2a59d3a0.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[51],{4421:(e,t,s)=>{s.d(t,{Z:()=>a});var n=s(1655),i=s(6724),o=s(5003);const r=new Set(["NO_ENTRY_FOUND","STORAGE_OFFLINE","MIDDLEWARE","NO_AUTO_DOWNLOAD"]);class a{constructor(e=8){this.parallelLimit=e,this.queueId=0,this.queue=[],this.inProcess=new Set,this.lockPromise=null,this.unlockResolve=null,this.log=(0,o.kg)("LL",o.v9.Error),this.processQueue=(0,i.Z)((()=>this._processQueue()),8,!1)}clear(){this.inProcess.clear(),this.queue.length=0}lock(){this.lockPromise||(this.lockPromise=new Promise(((e,t)=>{this.unlockResolve=e})))}unlock(){this.unlockResolve&&(this.unlockResolve(),this.unlockResolve=this.lockPromise=null,this.processQueue())}processItem(e){return t=this,s=void 0,i=function*(){if(!this.lockPromise){this.inProcess.add(e);try{yield this.loadItem(e)}catch(e){r.has(null==e?void 0:e.type)||this.log.error("loadMediaQueue error:",e)}this.inProcess.delete(e),this.processQueue()}},new((n=void 0)||(n=Promise))((function(e,o){function r(e){try{l(i.next(e))}catch(e){o(e)}}function a(e){try{l(i.throw(e))}catch(e){o(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof n?s:new n((function(e){e(s)}))).then(r,a)}l((i=i.apply(t,s||[])).next())}));var t,s,n,i}loadItem(e){return e.load()}getItem(){return this.queue.shift()}addElement(e,t){this.queue[e](t),this.processQueue()}_processQueue(e){if(!(!this.queue.length||this.lockPromise||this.parallelLimit>0&&this.inProcess.size>=this.parallelLimit))do{if(e?(0,n.Z)(this.queue,e):e=this.getItem(),!e)break;this.processItem(e),e=null}while(this.inProcess.size{s.d(t,{Z:()=>n});const n={Á:"A",Ă:"A",Ắ:"A",Ặ:"A",Ằ:"A",Ẳ:"A",Ẵ:"A",Ǎ:"A",Â:"A",Ấ:"A",Ậ:"A",Ầ:"A",Ẩ:"A",Ẫ:"A",Ä:"A",Ǟ:"A",Ȧ:"A",Ǡ:"A",Ạ:"A",Ȁ:"A",À:"A",Ả:"A",Ȃ:"A",Ā:"A",Ą:"A",Å:"A",Ǻ:"A",Ḁ:"A",Ⱥ:"A",Ã:"A",Ꜳ:"AA",Æ:"AE",Ǽ:"AE",Ǣ:"AE",Ꜵ:"AO",Ꜷ:"AU",Ꜹ:"AV",Ꜻ:"AV",Ꜽ:"AY",Ḃ:"B",Ḅ:"B",Ɓ:"B",Ḇ:"B",Ƀ:"B",Ƃ:"B",Ć:"C",Č:"C",Ç:"C",Ḉ:"C",Ĉ:"C",Ċ:"C",Ƈ:"C",Ȼ:"C",Ď:"D",Ḑ:"D",Ḓ:"D",Ḋ:"D",Ḍ:"D",Ɗ:"D",Ḏ:"D",Dz:"D",Dž:"D",Đ:"D",Ƌ:"D",DZ:"DZ",DŽ:"DZ",É:"E",Ĕ:"E",Ě:"E",Ȩ:"E",Ḝ:"E",Ê:"E",Ế:"E",Ệ:"E",Ề:"E",Ể:"E",Ễ:"E",Ḙ:"E",Ë:"E",Ė:"E",Ẹ:"E",Ȅ:"E",È:"E",Ẻ:"E",Ȇ:"E",Ē:"E",Ḗ:"E",Ḕ:"E",Ę:"E",Ɇ:"E",Ẽ:"E",Ḛ:"E",Ꝫ:"ET",Ḟ:"F",Ƒ:"F",Ǵ:"G",Ğ:"G",Ǧ:"G",Ģ:"G",Ĝ:"G",Ġ:"G",Ɠ:"G",Ḡ:"G",Ǥ:"G",Ḫ:"H",Ȟ:"H",Ḩ:"H",Ĥ:"H",Ⱨ:"H",Ḧ:"H",Ḣ:"H",Ḥ:"H",Ħ:"H",Í:"I",Ĭ:"I",Ǐ:"I",Î:"I",Ï:"I",Ḯ:"I",İ:"I",Ị:"I",Ȉ:"I",Ì:"I",Ỉ:"I",Ȋ:"I",Ī:"I",Į:"I",Ɨ:"I",Ĩ:"I",Ḭ:"I",Ꝺ:"D",Ꝼ:"F",Ᵹ:"G",Ꞃ:"R",Ꞅ:"S",Ꞇ:"T",Ꝭ:"IS",Ĵ:"J",Ɉ:"J",Ḱ:"K",Ǩ:"K",Ķ:"K",Ⱪ:"K",Ꝃ:"K",Ḳ:"K",Ƙ:"K",Ḵ:"K",Ꝁ:"K",Ꝅ:"K",Ĺ:"L",Ƚ:"L",Ľ:"L",Ļ:"L",Ḽ:"L",Ḷ:"L",Ḹ:"L",Ⱡ:"L",Ꝉ:"L",Ḻ:"L",Ŀ:"L",Ɫ:"L",Lj:"L",Ł:"L",LJ:"LJ",Ḿ:"M",Ṁ:"M",Ṃ:"M",Ɱ:"M",Ń:"N",Ň:"N",Ņ:"N",Ṋ:"N",Ṅ:"N",Ṇ:"N",Ǹ:"N",Ɲ:"N",Ṉ:"N",Ƞ:"N",Nj:"N",Ñ:"N",NJ:"NJ",Ó:"O",Ŏ:"O",Ǒ:"O",Ô:"O",Ố:"O",Ộ:"O",Ồ:"O",Ổ:"O",Ỗ:"O",Ö:"O",Ȫ:"O",Ȯ:"O",Ȱ:"O",Ọ:"O",Ő:"O",Ȍ:"O",Ò:"O",Ỏ:"O",Ơ:"O",Ớ:"O",Ợ:"O",Ờ:"O",Ở:"O",Ỡ:"O",Ȏ:"O",Ꝋ:"O",Ꝍ:"O",Ō:"O",Ṓ:"O",Ṑ:"O",Ɵ:"O",Ǫ:"O",Ǭ:"O",Ø:"O",Ǿ:"O",Õ:"O",Ṍ:"O",Ṏ:"O",Ȭ:"O",Ƣ:"OI",Ꝏ:"OO",Ɛ:"E",Ɔ:"O",Ȣ:"OU",Ṕ:"P",Ṗ:"P",Ꝓ:"P",Ƥ:"P",Ꝕ:"P",Ᵽ:"P",Ꝑ:"P",Ꝙ:"Q",Ꝗ:"Q",Ŕ:"R",Ř:"R",Ŗ:"R",Ṙ:"R",Ṛ:"R",Ṝ:"R",Ȑ:"R",Ȓ:"R",Ṟ:"R",Ɍ:"R",Ɽ:"R",Ꜿ:"C",Ǝ:"E",Ś:"S",Ṥ:"S",Š:"S",Ṧ:"S",Ş:"S",Ŝ:"S",Ș:"S",Ṡ:"S",Ṣ:"S",Ṩ:"S",ẞ:"SS",Ť:"T",Ţ:"T",Ṱ:"T",Ț:"T",Ⱦ:"T",Ṫ:"T",Ṭ:"T",Ƭ:"T",Ṯ:"T",Ʈ:"T",Ŧ:"T",Ɐ:"A",Ꞁ:"L",Ɯ:"M",Ʌ:"V",Ꜩ:"TZ",Ú:"U",Ŭ:"U",Ǔ:"U",Û:"U",Ṷ:"U",Ü:"U",Ǘ:"U",Ǚ:"U",Ǜ:"U",Ǖ:"U",Ṳ:"U",Ụ:"U",Ű:"U",Ȕ:"U",Ù:"U",Ủ:"U",Ư:"U",Ứ:"U",Ự:"U",Ừ:"U",Ử:"U",Ữ:"U",Ȗ:"U",Ū:"U",Ṻ:"U",Ų:"U",Ů:"U",Ũ:"U",Ṹ:"U",Ṵ:"U",Ꝟ:"V",Ṿ:"V",Ʋ:"V",Ṽ:"V",Ꝡ:"VY",Ẃ:"W",Ŵ:"W",Ẅ:"W",Ẇ:"W",Ẉ:"W",Ẁ:"W",Ⱳ:"W",Ẍ:"X",Ẋ:"X",Ý:"Y",Ŷ:"Y",Ÿ:"Y",Ẏ:"Y",Ỵ:"Y",Ỳ:"Y",Ƴ:"Y",Ỷ:"Y",Ỿ:"Y",Ȳ:"Y",Ɏ:"Y",Ỹ:"Y",Ź:"Z",Ž:"Z",Ẑ:"Z",Ⱬ:"Z",Ż:"Z",Ẓ:"Z",Ȥ:"Z",Ẕ:"Z",Ƶ:"Z",IJ:"IJ",Œ:"OE",ᴀ:"A",ᴁ:"AE",ʙ:"B",ᴃ:"B",ᴄ:"C",ᴅ:"D",ᴇ:"E",ꜰ:"F",ɢ:"G",ʛ:"G",ʜ:"H",ɪ:"I",ʁ:"R",ᴊ:"J",ᴋ:"K",ʟ:"L",ᴌ:"L",ᴍ:"M",ɴ:"N",ᴏ:"O",ɶ:"OE",ᴐ:"O",ᴕ:"OU",ᴘ:"P",ʀ:"R",ᴎ:"N",ᴙ:"R",ꜱ:"S",ᴛ:"T",ⱻ:"E",ᴚ:"R",ᴜ:"U",ᴠ:"V",ᴡ:"W",ʏ:"Y",ᴢ:"Z",á:"a",ă:"a",ắ:"a",ặ:"a",ằ:"a",ẳ:"a",ẵ:"a",ǎ:"a",â:"a",ấ:"a",ậ:"a",ầ:"a",ẩ:"a",ẫ:"a",ä:"a",ǟ:"a",ȧ:"a",ǡ:"a",ạ:"a",ȁ:"a",à:"a",ả:"a",ȃ:"a",ā:"a",ą:"a",ᶏ:"a",ẚ:"a",å:"a",ǻ:"a",ḁ:"a",ⱥ:"a",ã:"a",ꜳ:"aa",æ:"ae",ǽ:"ae",ǣ:"ae",ꜵ:"ao",ꜷ:"au",ꜹ:"av",ꜻ:"av",ꜽ:"ay",ḃ:"b",ḅ:"b",ɓ:"b",ḇ:"b",ᵬ:"b",ᶀ:"b",ƀ:"b",ƃ:"b",ɵ:"o",ć:"c",č:"c",ç:"c",ḉ:"c",ĉ:"c",ɕ:"c",ċ:"c",ƈ:"c",ȼ:"c",ď:"d",ḑ:"d",ḓ:"d",ȡ:"d",ḋ:"d",ḍ:"d",ɗ:"d",ᶑ:"d",ḏ:"d",ᵭ:"d",ᶁ:"d",đ:"d",ɖ:"d",ƌ:"d",ı:"i",ȷ:"j",ɟ:"j",ʄ:"j",dz:"dz",dž:"dz",é:"e",ĕ:"e",ě:"e",ȩ:"e",ḝ:"e",ê:"e",ế:"e",ệ:"e",ề:"e",ể:"e",ễ:"e",ḙ:"e",ë:"e",ė:"e",ẹ:"e",ȅ:"e",è:"e",ẻ:"e",ȇ:"e",ē:"e",ḗ:"e",ḕ:"e",ⱸ:"e",ę:"e",ᶒ:"e",ɇ:"e",ẽ:"e",ḛ:"e",ꝫ:"et",ḟ:"f",ƒ:"f",ᵮ:"f",ᶂ:"f",ǵ:"g",ğ:"g",ǧ:"g",ģ:"g",ĝ:"g",ġ:"g",ɠ:"g",ḡ:"g",ᶃ:"g",ǥ:"g",ḫ:"h",ȟ:"h",ḩ:"h",ĥ:"h",ⱨ:"h",ḧ:"h",ḣ:"h",ḥ:"h",ɦ:"h",ẖ:"h",ħ:"h",ƕ:"hv",í:"i",ĭ:"i",ǐ:"i",î:"i",ï:"i",ḯ:"i",ị:"i",ȉ:"i",ì:"i",ỉ:"i",ȋ:"i",ī:"i",į:"i",ᶖ:"i",ɨ:"i",ĩ:"i",ḭ:"i",ꝺ:"d",ꝼ:"f",ᵹ:"g",ꞃ:"r",ꞅ:"s",ꞇ:"t",ꝭ:"is",ǰ:"j",ĵ:"j",ʝ:"j",ɉ:"j",ḱ:"k",ǩ:"k",ķ:"k",ⱪ:"k",ꝃ:"k",ḳ:"k",ƙ:"k",ḵ:"k",ᶄ:"k",ꝁ:"k",ꝅ:"k",ĺ:"l",ƚ:"l",ɬ:"l",ľ:"l",ļ:"l",ḽ:"l",ȴ:"l",ḷ:"l",ḹ:"l",ⱡ:"l",ꝉ:"l",ḻ:"l",ŀ:"l",ɫ:"l",ᶅ:"l",ɭ:"l",ł:"l",lj:"lj",ſ:"s",ẜ:"s",ẛ:"s",ẝ:"s",ḿ:"m",ṁ:"m",ṃ:"m",ɱ:"m",ᵯ:"m",ᶆ:"m",ń:"n",ň:"n",ņ:"n",ṋ:"n",ȵ:"n",ṅ:"n",ṇ:"n",ǹ:"n",ɲ:"n",ṉ:"n",ƞ:"n",ᵰ:"n",ᶇ:"n",ɳ:"n",ñ:"n",nj:"nj",ó:"o",ŏ:"o",ǒ:"o",ô:"o",ố:"o",ộ:"o",ồ:"o",ổ:"o",ỗ:"o",ö:"o",ȫ:"o",ȯ:"o",ȱ:"o",ọ:"o",ő:"o",ȍ:"o",ò:"o",ỏ:"o",ơ:"o",ớ:"o",ợ:"o",ờ:"o",ở:"o",ỡ:"o",ȏ:"o",ꝋ:"o",ꝍ:"o",ⱺ:"o",ō:"o",ṓ:"o",ṑ:"o",ǫ:"o",ǭ:"o",ø:"o",ǿ:"o",õ:"o",ṍ:"o",ṏ:"o",ȭ:"o",ƣ:"oi",ꝏ:"oo",ɛ:"e",ᶓ:"e",ɔ:"o",ᶗ:"o",ȣ:"ou",ṕ:"p",ṗ:"p",ꝓ:"p",ƥ:"p",ᵱ:"p",ᶈ:"p",ꝕ:"p",ᵽ:"p",ꝑ:"p",ꝙ:"q",ʠ:"q",ɋ:"q",ꝗ:"q",ŕ:"r",ř:"r",ŗ:"r",ṙ:"r",ṛ:"r",ṝ:"r",ȑ:"r",ɾ:"r",ᵳ:"r",ȓ:"r",ṟ:"r",ɼ:"r",ᵲ:"r",ᶉ:"r",ɍ:"r",ɽ:"r",ↄ:"c",ꜿ:"c",ɘ:"e",ɿ:"r",ś:"s",ṥ:"s",š:"s",ṧ:"s",ş:"s",ŝ:"s",ș:"s",ṡ:"s",ṣ:"s",ṩ:"s",ʂ:"s",ᵴ:"s",ᶊ:"s",ȿ:"s",ɡ:"g",ß:"ss",ᴑ:"o",ᴓ:"o",ᴝ:"u",ť:"t",ţ:"t",ṱ:"t",ț:"t",ȶ:"t",ẗ:"t",ⱦ:"t",ṫ:"t",ṭ:"t",ƭ:"t",ṯ:"t",ᵵ:"t",ƫ:"t",ʈ:"t",ŧ:"t",ᵺ:"th",ɐ:"a",ᴂ:"ae",ǝ:"e",ᵷ:"g",ɥ:"h",ʮ:"h",ʯ:"h",ᴉ:"i",ʞ:"k",ꞁ:"l",ɯ:"m",ɰ:"m",ᴔ:"oe",ɹ:"r",ɻ:"r",ɺ:"r",ⱹ:"r",ʇ:"t",ʌ:"v",ʍ:"w",ʎ:"y",ꜩ:"tz",ú:"u",ŭ:"u",ǔ:"u",û:"u",ṷ:"u",ü:"u",ǘ:"u",ǚ:"u",ǜ:"u",ǖ:"u",ṳ:"u",ụ:"u",ű:"u",ȕ:"u",ù:"u",ủ:"u",ư:"u",ứ:"u",ự:"u",ừ:"u",ử:"u",ữ:"u",ȗ:"u",ū:"u",ṻ:"u",ų:"u",ᶙ:"u",ů:"u",ũ:"u",ṹ:"u",ṵ:"u",ᵫ:"ue",ꝸ:"um",ⱴ:"v",ꝟ:"v",ṿ:"v",ʋ:"v",ᶌ:"v",ⱱ:"v",ṽ:"v",ꝡ:"vy",ẃ:"w",ŵ:"w",ẅ:"w",ẇ:"w",ẉ:"w",ẁ:"w",ⱳ:"w",ẘ:"w",ẍ:"x",ẋ:"x",ᶍ:"x",ý:"y",ŷ:"y",ÿ:"y",ẏ:"y",ỵ:"y",ỳ:"y",ƴ:"y",ỷ:"y",ỿ:"y",ȳ:"y",ẙ:"y",ɏ:"y",ỹ:"y",ź:"z",ž:"z",ẑ:"z",ʑ:"z",ⱬ:"z",ż:"z",ẓ:"z",ȥ:"z",ẕ:"z",ᵶ:"z",ᶎ:"z",ʐ:"z",ƶ:"z",ɀ:"z",ff:"ff",ffi:"ffi",ffl:"ffl",fi:"fi",fl:"fl",ij:"ij",œ:"oe",st:"st",ₐ:"a",ₑ:"e",ᵢ:"i",ⱼ:"j",ₒ:"o",ᵣ:"r",ᵤ:"u",ᵥ:"v",ₓ:"x",Ё:"YO",Й:"I",Ц:"TS",У:"U",К:"K",Е:"E",Н:"N",Г:"G",Ш:"SH",Щ:"SCH",З:"Z",Х:"H",Ъ:"",ё:"yo",й:"i",ц:"ts",у:"u",к:"k",е:"e",н:"n",г:"g",ш:"sh",щ:"sch",з:"z",х:"h",ъ:"",Ф:"F",Ы:"I",В:"V",А:"A",П:"P",Р:"R",О:"O",Л:"L",Д:"D",Ж:"ZH",Э:"E",ф:"f",ы:"i",в:"v",а:"a",п:"p",р:"r",о:"o",л:"l",д:"d",ж:"zh",э:"e",Я:"Ya",Ч:"CH",С:"S",М:"M",И:"I",Т:"T",Ь:"",Б:"B",Ю:"YU",я:"ya",ч:"ch",с:"s",м:"m",и:"i",т:"t",ь:"",б:"b",ю:"yu"}},6690:(e,t,s)=>{function n(e){return[...new Set(e)]}s.d(t,{Z:()=>n})},7625:(e,t,s)=>{function n(e,t){for(let s=e.length-1;s>=0;--s)t(e[s],s,e)}s.d(t,{Z:()=>n})},6519:(e,t,s)=>{function n(e,t,s,n){if("function"!=typeof s){const e=s;s=t=>t[e]}const i=s(t);if(void 0===n&&-1!==(n=e.indexOf(t))){const t=e[n-1],o=e[n+1];if((!t||s(t)>=i)&&(!o||s(o)<=i))return n;e.splice(n,1)}const o=e.length;if(!o||i<=s(e[o-1]))return e.push(t)-1;if(i>=s(e[0]))return e.unshift(t),0;for(let n=0;ns(e[n]))return e.splice(n,0,t),n;return console.error("wtf",e,t),e.indexOf(t)}s.d(t,{Z:()=>n})},8938:(e,t,s)=>{function n(e){}s.d(t,{Z:()=>n})},3019:(e,t,s)=>{function n(e,t){return new Promise((s=>{const n=new FileReader;n.addEventListener("loadend",(e=>{s(e.target.result)})),n[t](e)}))}s.d(t,{Z:()=>n})},9895:(e,t,s)=>{function n(e,t){const s=e.length;if(s!==t.length)return!1;for(let n=0;nn})},3306:(e,t,s)=>{function n(e){const t=e.length,s=new Uint8Array(Math.ceil(t/2));let n=0;t%2&&(s[n++]=parseInt(e.charAt(0),16));for(let i=n;in})},3692:(e,t,s)=>{function n(e){return e instanceof Uint8Array?e:"string"==typeof e?(new TextEncoder).encode(e):new Uint8Array(e)}s.d(t,{Z:()=>n})},6654:(e,t,s)=>{function n(e,t){return e instanceof Promise?e.then(t):t(e)}s.d(t,{Z:()=>n})},2202:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(2219);let i=0;function o(e){let t;const s=null==e?void 0:e.type;if(s){const e=`${n.Z}_${i++}.${s.split("/")[1]}`;t=["image/jpeg","image/png","image/bmp"].indexOf(s)>=0?"photo"+e:0===s.indexOf("audio/")||["video/ogg"].indexOf(s)>=0?"audio"+e:0===s.indexOf("video/")?"video"+e:"document"+e}else t=`upload-${n.Z}_${i++}`;return t}},9750:(e,t,s)=>{function n(e,t){const s=t.split(".");let n=e;return s.forEach((e=>{e&&(n=n[e])})),n}s.d(t,{Z:()=>n})},7401:(e,t,s)=>{function n(e,t="asc"){if(!e)return[];const s=e instanceof Map?[...e.keys()]:Object.keys(e).map((e=>+e));return"asc"===t?s.sort(((e,t)=>e-t)):s.sort(((e,t)=>t-e))}s.d(t,{Z:()=>n})},5701:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(6761),i=s(319);function o(e,t,s=!0,o=!0){let r,a,l,c,u=!1;const h=t=>{const s=l,n=c;try{s(e.apply(null,t))}catch(e){console.error("debounce error",e),n(e)}},d=(...e)=>{a||(a=new Promise(((e,t)=>(l=e,c=t)))),r?(clearTimeout(r),u=!0,c(),a=new Promise(((e,t)=>(l=e,c=t)))):s&&(h(e),u=!1);const d=n.Z.setTimeout((()=>{!o||s&&!u||h(e),r===d&&(r=a=l=c=void 0,u=!1)}),t);return r=d,a.catch(i.Z),a};return d.clearTimeout=()=>{r&&(n.Z.clearTimeout(r),c(),r=a=l=c=void 0,u=!1)},d.isDebounced=()=>!!r,d}},252:(e,t,s)=>{s.d(t,{D:()=>n,Z:()=>a});var n,i=s(410),o=s(1655);function r(e,t){if(e.toExponential){const s=e-t;return s<0?-1:s>0?1:0}return function(e,t){const s=e.length;if(s!==t.length){const e=s-t.length;return e<0?-1:e>0?1:0}for(let n=0;n=2)for(let t=0,s=this.slices.length;t=0)return{slice:t,offset:e===t[n]?n:n-1}}if(t&&t.isEnd(n.Top))return{slice:t,offset:t.length}}sliceMe(e,t,s){let i=this.slice,o=0,r=0;if(e){const t=this.findSliceOffset(e);if(!t)return;i=t.slice,o=r=t.offset,i.includes(e)&&(r+=1)}const a=Math.max(r+t,0),l=r+t+s,c=i.slice(a,l),u=t<0?s+t:s,h=Math.abs(t),d=i.length-r>=u||!!i.isEnd(n.Top)&&(c.setEnd(n.Top),!0),f=r-h>=0||!!i.isEnd(n.Bottom)&&(c.setEnd(n.Bottom),!0);return{slice:c,offsetIdOffset:o,fulfilled:n.None|(d&&f?n.Both:(d?n.Top:n.None)|(f?n.Bottom:n.None))}}unshift(...e){let t=this.first;t.length?t.isEnd(n.Bottom)||(t=this.constructSlice(),t.setEnd(n.Bottom),this.slices.unshift(t)):t.setEnd(n.Bottom),t.unshift(...e)}push(...e){let t=this.last;t.length?t.isEnd(n.Top)||(t=this.constructSlice(),t.setEnd(n.Top),this.slices.push(t)):t.setEnd(n.Top),t.push(...e)}delete(e){const t=this.findSlice(e);return!!t&&(t.slice.splice(t.index,1),!0)}deleteSlice(e){(0,o.Z)(this.slices,e)}toJSON(){const e={slices:this.slices.map((e=>({values:e.slice(),isEnd:e.getEnds()})))};return JSON.stringify(e)}static fromJSON(e){const t=JSON.parse(e),s=new a;return t.slices.forEach((e=>{const t=s.insertSlice(e.values)||s.first;e.isEnd.top&&t.setEnd(n.Top),e.isEnd.bottom&&t.setEnd(n.Bottom)})),s}}i.GO&&(i.GO.SlicedArray=a)},2566:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2946);function i(e){return e.peer?(0,n.Z)(e.peer):e.user_id.toPeerId()}},7120:(e,t,s)=>{function n(e,t,s,n){if("chatEmpty"===e._)return!1;if(e.pFlags.deactivated&&"view_messages"!==t)return!1;const i=void 0===s;if(e.pFlags.creator&&i)return!0;if("chatForbidden"===e._||"channelForbidden"===e._||e.pFlags.left&&!e.pFlags.megagroup)return!1;if(!s&&!(s=e.admin_rights||e.banned_rights||e.default_banned_rights))return!1;let o={};switch(s&&(o=s.pFlags),t){case"embed_links":case"send_games":case"send_gifs":case"send_inline":case"send_media":case"send_messages":case"send_polls":case"send_stickers":if(!n&&e.pFlags.left)return!1;if("chatBannedRights"===s._&&o[t])return!1;if("channel"===e._&&!e.pFlags.megagroup&&!o.post_messages)return!1;break;case"delete_messages":case"manage_call":return!!o[t];case"pin_messages":return"chatAdminRights"===s._?o[t]||!!o.post_messages:!o[t];case"change_info":case"invite_users":return"chatAdminRights"===s._?o[t]:!o[t];case"change_type":case"delete_chat":return!1;case"ban_users":case"change_permissions":return"chatAdminRights"===s._&&!!o.ban_users;case"view_participants":return!("chat"!==e._&&e.pFlags.broadcast&&!e.pFlags.creator&&!e.admin_rights)}return!0}s.d(t,{Z:()=>n})},8050:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(3385);function i(e,t=(0,n.Z)(e.folder_id)){return null==e?void 0:e[t]}},3385:(e,t,s)=>{function n(e){return`index_${e}`}s.d(t,{Z:()=>n})},6658:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(7072);function i(e,t,s,i){const o=(0,n.Z)(e,null==t?void 0:t.type);let r;return r="photoSize"===(null==t?void 0:t._)?e.sticker?"image/webp":"image/jpeg":e.mime_type||"application/octet-stream",{dcId:e.dc_id,location:o,size:t?t.size:e.size,mimeType:r,fileName:e.file_name,queueId:s,onlyCache:i}}},7072:(e,t,s)=>{function n(e,t){return{_:"inputDocumentFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t}}s.d(t,{Z:()=>n})},7086:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(8801);function i(e){return(0,n.P)(e.location,e)}},1243:(e,t,s)=>{s.d(t,{Z:()=>a});var n=s(6658),i=s(7667),o=s(3114),r=s(7086);function a(e){const{media:t,thumb:s,queueId:a,onlyCache:l}=e;let c;var u;return"document"===t._?c=(0,n.Z)(t,s,a,l):"photo"===t._?c=(0,i.Z)(t,s,a,l):(0,o.Z)(t)&&(c={dcId:0,location:{_:"inputWebFileLocation",access_hash:(u=t).access_hash,url:u.url},size:u.size,mimeType:u.mime_type}),c.downloadId=e.downloadId,{fileName:(0,r.Z)(c),downloadOptions:c}}},6034:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(6848),i=s(5880);function o(e,t){if(typeof e!=typeof t)return!1;if(!(0,i.Z)(e))return!0;if(e._!==t._)return!1;if("draftMessage"===e._&&t._===e._){if(e.reply_to_msg_id!==t.reply_to_msg_id)return!1;if(!(0,n.Z)(e.entities,t.entities))return!1;if(e.message!==t.message)return!1;if(e.pFlags.no_webpage!==t.pFlags.no_webpage)return!1}return!0}},515:(e,t,s)=>{function n(e,t){return e+"_"+t}s.d(t,{Z:()=>n})},3781:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(7082);function i(e){const t=n.t;return e>=t?e:t+e*n.o}},2790:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(7082);function i(e){return function(e,t){const s=n.t;if(e{s.d(t,{o:()=>n,t:()=>i});const n=65536,i=4294967295},6566:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2342);function i(e,t,s){if("inputMessagesFilterEmpty"===e)return t;const i=[];if(!t.length)return i;let o=!0;const r={},a=[],l=[];switch(e){case"inputMessagesFilterPhotos":r.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":r.messageMediaPhoto=!0,r.messageMediaDocument=!0,a.push("video");break;case"inputMessagesFilterVideo":r.messageMediaDocument=!0,a.push("video");break;case"inputMessagesFilterDocument":r.messageMediaDocument=!0,a.push(void 0,"photo","pdf");break;case"inputMessagesFilterVoice":r.messageMediaDocument=!0,a.push("voice");break;case"inputMessagesFilterRoundVoice":r.messageMediaDocument=!0,a.push("round","voice");break;case"inputMessagesFilterRoundVideo":r.messageMediaDocument=!0,a.push("round");break;case"inputMessagesFilterMusic":r.messageMediaDocument=!0,a.push("audio");break;case"inputMessagesFilterUrl":r.url=!0;break;case"inputMessagesFilterChatPhotos":r.avatar=!0;break;default:o=!1}if(!o)return i;for(let e=0,o=t.length;ee.includes(t._)))||(0,n.Z)(o.message))&&(c=!0)}}else r.avatar&&o.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(o.action._)&&(c=!0);if(c&&(i.push(o),i.length>=s))break}return i}},2381:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(8938);function i(e){let t,s,i,o=0;for(const r of e)if((0,n.Z)(r),r.message){if(++o>1)break;t=r.message,s=r.totalEntities,i=r.entities}return o>1&&(t=void 0,s=void 0,i=void 0),{message:t,entities:i,totalEntities:s}}},2946:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(5880),i=s(1507);function o(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,n.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const s=e.channel_id||e.chat_id;return void 0!==s?s.toPeerId(!0):i.NM}if(!e)return i.NM;const t="u"===e.charAt(0),s=e.substr(1).split("_");return t?s[0].toPeerId():(s[0]||"").toPeerId(!0)}},7667:(e,t,s)=>{function n(e,t,s,n){const i="document"===e._;if(!t||"photoSizeEmpty"===t._)throw new Error("photoSizeEmpty!");const o=!("photoSize"!==t._&&"photoSizeProgressive"!==t._||!e.access_hash||!e.file_reference),r={_:i?"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:o?t.size:void 0,mimeType:"image/jpeg",queueId:s,onlyCache:n}}s.d(t,{Z:()=>n})},5285:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(6848);function i(e,t){return(0,n.Z)(e,t)}},13:(e,t,s)=>{function n(e){var t;return null===(t=e.video_thumbs)||void 0===t?void 0:t[0]}s.d(t,{Z:()=>n})},8493:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(1507);function i(e){return!e.pFlags.deleted&&e.id.toPeerId()!==n.hj}},3114:(e,t,s)=>{function n(e){return!(!e||"webDocument"!==e._&&"webDocumentNoProxy"!==e._)}s.d(t,{Z:()=>n})},9174:(e,t,s)=>{var n;s.d(t,{Q:()=>n}),function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(n||(n={}))},6875:(e,t,s)=>{s.d(t,{Z:()=>i});const n=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function i(e){for(let t=0;tn.has(e._)&&i!==t&&e._===s._&&e.offset-s.length===s.offset)),-1!==i){const t=e[i];s.length+=t.length,e.splice(i,1)}}while(-1!==i)}}},1379:(e,t,s)=>{function n(e,t){const s=e.slice(0,t.offset),n=function(e){const t="⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿",s=t.length,n=[];for(let i=0;in})},8859:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(2423);const i=new Set(["messageEntityPre","messageEntityCode"]);function o(e,t){let s=-1;return e.find((e=>(i.has(e._)&&(s=e.offset+e.length),t.offset=e.offset&&t.length+t.offset<=e.length+e.offset))))}},7746:(e,t,s)=>{function n(e,t){return e.replace(/[\u2640\u2642\u2764](?!\ufe0f)/g,((e,s,n)=>{if(t){const n=e.length;s+=n,t.forEach((e=>{const t=e.offset+e.length;t===s?e.length+=n:t>s&&(e.offset+=n)}))}return e+"️"}))}s.d(t,{Z:()=>n})},2342:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2423);function i(e){return e?e.match(n.it):null}},6241:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(8859),i=s(1346);function o(e,t){const s=t.filter((t=>!(0,n.Z)(e,t)));e.push(...s),(0,i.Z)(e);for(let t=0;t{s.d(t,{Z:()=>c});var n=s(2423);const i=["abogado","ac","academy","accountants","active","actor","ad","adult","ae","aero","af","ag","agency","ai","airforce","al","allfinanz","alsace","am","amsterdam","an","android","ao","apartments","aq","aquarelle","ar","archi","army","arpa","as","asia","associates","at","attorney","au","auction","audio","autos","aw","ax","axa","az","ba","band","bank","bar","barclaycard","barclays","bargains","bayern","bb","bd","be","beer","berlin","best","bf","bg","bh","bi","bid","bike","bingo","bio","biz","bj","black","blackfriday","bloomberg","blue","bm","bmw","bn","bnpparibas","bo","boo","boutique","br","brussels","bs","bt","budapest","build","builders","business","buzz","bv","bw","by","bz","bzh","ca","cab","cal","camera","camp","cancerresearch","canon","capetown","capital","caravan","cards","care","career","careers","cartier","casa","cash","cat","catering","cc","cd","center","ceo","cern","cf","cg","ch","channel","chat","cheap","christmas","chrome","church","ci","citic","city","ck","cl","claims","cleaning","click","clinic","clothing","club","cm","cn","co","coach","codes","coffee","college","cologne","com","community","company","computer","condos","construction","consulting","contractors","cooking","cool","coop","country","cr","credit","creditcard","cricket","crs","cruises","cu","cuisinella","cv","cw","cx","cy","cymru","cz","dabur","dad","dance","dating","day","dclk","de","deals","degree","delivery","democrat","dental","dentist","desi","design","dev","diamonds","diet","digital","direct","directory","discount","dj","dk","dm","dnp","do","docs","domains","doosan","durban","dvag","dz","eat","ec","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","equipment","er","es","esq","estate","et","eu","eurovision","eus","events","everbank","exchange","expert","exposed","fail","farm","fashion","feedback","fi","finance","financial","firmdale","fish","fishing","fit","fitness","fj","fk","flights","florist","flowers","flsmidth","fly","fm","fo","foo","forsale","foundation","fr","frl","frogans","fund","furniture","futbol","ga","gal","gallery","garden","gb","gbiz","gd","ge","gent","gf","gg","ggee","gh","gi","gift","gifts","gives","gl","glass","gle","global","globo","gm","gmail","gmo","gmx","gn","goog","google","gop","gov","gp","gq","gr","graphics","gratis","green","gripe","gs","gt","gu","guide","guitars","guru","gw","gy","hamburg","hangout","haus","healthcare","help","here","hermes","hiphop","hiv","hk","hm","hn","holdings","holiday","homes","horse","host","hosting","house","how","hr","ht","hu","ibm","id","ie","ifm","il","im","immo","immobilien","in","industries","info","ing","ink","institute","insure","int","international","investments","io","iq","ir","irish","is","it","iwc","jcb","je","jetzt","jm","jo","jobs","joburg","jp","juegos","kaufen","kddi","ke","kg","kh","ki","kim","kitchen","kiwi","km","kn","koeln","kp","kr","krd","kred","kw","ky","kyoto","kz","la","lacaixa","land","lat","latrobe","lawyer","lb","lc","lds","lease","legal","lgbt","li","lidl","life","lighting","limited","limo","link","lk","loans","london","lotte","lotto","lr","ls","lt","ltda","lu","luxe","luxury","lv","ly","ma","madrid","maison","management","mango","market","marketing","marriott","mc","md","me","media","meet","melbourne","meme","memorial","menu","mg","mh","miami","mil","mini","mk","ml","mm","mn","mo","mobi","moda","moe","monash","money","mormon","mortgage","moscow","motorcycles","mov","mp","mq","mr","ms","mt","mu","museum","mv","mw","mx","my","mz","na","nagoya","name","navy","nc","ne","net","network","neustar","new","nexus","nf","ng","ngo","nhk","ni","nico","ninja","nl","no","np","nr","nra","nrw","ntt","nu","nyc","nz","okinawa","om","one","ong","onl","ooo","org","organic","osaka","otsuka","ovh","pa","paris","partners","parts","party","pe","pf","pg","ph","pharmacy","photo","photography","photos","physio","pics","pictures","pink","pizza","pk","pl","place","plumbing","pm","pn","pohl","poker","porn","post","pr","praxi","press","pro","prod","productions","prof","properties","property","ps","pt","pub","pw","py","qa","qpon","quebec","re","realtor","recipes","red","rehab","reise","reisen","reit","ren","rentals","repair","report","republican","rest","restaurant","reviews","rich","rio","rip","ro","rocks","rodeo","rs","rsvp","ru","ruhr","rw","ryukyu","sa","saarland","sale","samsung","sarl","saxo","sb","sc","sca","scb","schmidt","schule","schwarz","science","scot","sd","se","services","sew","sexy","sg","sh","shiksha","shoes","shriram","si","singles","sj","sk","sky","sl","sm","sn","so","social","software","sohu","solar","solutions","soy","space","spiegel","sr","st","style","su","supplies","supply","support","surf","surgery","suzuki","sv","sx","sy","sydney","systems","sz","taipei","tatar","tattoo","tax","tc","td","technology","tel","temasek","tennis","tf","tg","th","tienda","tips","tires","tirol","tj","tk","tl","tm","tn","to","today","tokyo","tools","top","toshiba","town","toys","tp","tr","trade","training","travel","trust","tt","tui","tv","tw","tz","ua","ug","uk","university","uno","uol","us","uy","uz","va","vacations","vc","ve","vegas","ventures","versicherung","vet","vg","vi","viajes","video","villas","vision","vlaanderen","vn","vodka","vote","voting","voto","voyage","vu","wales","wang","watch","webcam","website","wed","wedding","wf","whoswho","wien","wiki","williamhill","wme","work","works","world","ws","wtc","wtf","佛山","集团","在线","한국","ভারত","八卦","موقع","公益","公司","移动","我爱你","москва","қаз","онлайн","сайт","срб","淡马锡","орг","삼성","சிங்கப்பூர்","商标","商店","商城","дети","мкд","中文网","中信","中国","中國","谷歌","భారత్","ලංකා","ભારત","भारत","网店","संगठन","网络","укр","香港","台湾","台灣","手机","мон","الجزائر","عمان","ایران","امارات","بازار","الاردن","بھارت","المغرب","السعودية","مليسيا","شبكة","გე","机构","组织机构","ไทย","سورية","рус","рф","تونس","みんな","グーグル","世界","ਭਾਰਤ","网址","游戏","vermögensberater","vermögensberatung","企业","مصر","قطر","广东","இலங்கை","இந்தியா","新加坡","فلسطين","政务","xxx","xyz","yachts","yandex","ye","yoga","yokohama","youtube","yt","za","zip","zm","zone","zuerich","zw"];function o(e){for(var t=e.length,s=e.split("(").length-1,n=e.split(")").length-1;n>s&&")"===e.charAt(t-1);)e=e.substr(0,t-1),n--,t--;return s>n&&(e=e.replace(/\)+$/,"")),e}var r=s(3447),a=s(671);function l(e){const t=(0,a.N0)(e).replace(/-?fe0f/g,"");if(r.Z.hasOwnProperty(t))return t}function c(e){let t,s=e;const r=[];let a,c=0;for(n.$2.lastIndex=0;t=s.match(n.$2);){if(a=c+t.index,t[3])r.push({_:"messageEntityMention",offset:a+t[1].length,length:t[2].length+t[3].length});else if(t[4])if(n.E.test(t[4]))r.push({_:"messageEntityEmail",offset:a,length:t[4].length});else{let e,s=t[5];const n=t[6];if(n){if(s||"xn--"!==n.substr(0,4)&&-1===i.indexOf(n.toLowerCase())||(s="http://"),s){const n=o(t[4]);n.length!==t[4].length&&(t[4]=n),e=(t[5]?"":s)+t[4]}}else e=(t[5]?"":"http://")+t[4];e&&r.push({_:"messageEntityUrl",offset:a,length:t[4].length})}else if(t[7])r.push({_:"messageEntityLinebreak",offset:a,length:1});else if(t[8]){const e=l(t[8]);e&&r.push({_:"messageEntityEmoji",offset:a,length:t[8].length,unicode:e})}else t[11]?r.push({_:"messageEntityHashtag",offset:a+(t[10]?t[10].length:0),length:t[11].length}):t[13]&&r.push({_:"messageEntityBotCommand",offset:a+(t[11]?t[11].length:0)+(t[12]?t[12].length:0),length:1+t[13].length+(t[14]?1+t[14].length:0),unsafe:!0});s=s.substr(t.index+t[0].length),c+=t.index+t[0].length}return r}},2821:(e,t,s)=>{s.d(t,{Z:()=>a});var n=s(2423),i=s(6875),o=s(8859),r=s(6241);function a(e,t,s){const a=[];let l=!1;const c=e=>(0,o.Z)(t,e)?l=!1:(a.push(e),l=!0),u=[];let h,d=0;for(;h=e.match(n.QB);){const t=d+h.index;u.push(e.substr(0,h.index));const s=h[3]||h[8]||h[11]||h[13];let i;if(d-=s.length,d+=s.length,l=!1,s.match(/^`*$/))u.push(h[0]);else if(h[3])i={_:"messageEntityPre",language:"",offset:t+h[1].length,length:s.length},c(i)&&("\n"===h[5]&&(h[5]="",d-=1),u.push(h[1]+s+h[5]),d-=h[2].length+h[4].length);else if(h[7]){const e=""===h[6];i={_:n.SC[h[7]],offset:t+(e?0:h[6].length),length:s.length},c(i)&&(e?u.push(s):u.push(h[6]+s+h[9]),d-=2*h[7].length+(e?2:0))}else h[11]?(i={_:"messageEntityMentionName",user_id:h[10].toUserId(),offset:t,length:s.length},c(i)&&(u.push(s),d-=h[0].length-s.length)):h[12]&&(i={_:"messageEntityTextUrl",url:h[14],offset:t,length:s.length},c(i)&&(u.push(s),d-=h[12].length-s.length));l||u.push(h[0]),e=e.substr(h.index+h[0].length),d+=h.index+h[0].length}u.push(e);let f=u.join("");f.replace(/\s+/g,"").length||(f=e,a.splice(0,a.length)),(0,r.Z)(t,a),(0,i.Z)(t);let g=f.length;if(!s){f=f.replace(/^\s*/,"");let e=g-f.length;e&&t.forEach((t=>{t.offset=Math.max(0,t.offset-e)})),f=f.replace(/\s*$/,""),e=g-f.length,g=f.length,e&&t.forEach((e=>{e.offset+e.length>g&&(e.length=g-e.offset)}))}return f}},1346:(e,t,s)=>{function n(e){e.sort(((e,t)=>e.offset-t.offset||t.length-e.length))}s.d(t,{Z:()=>n})},2491:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(1379);function i(e,t=[]){return t.forEach((t=>{"messageEntitySpoiler"===t._&&(e=(0,n.Z)(e,t).text)})),e}},5082:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(467);class i{constructor(e,t=0){this.options=e,this.minChars=t,this.fullTexts=new Map}indexObject(e,t){if(this.options&&t.trim()&&(t=(0,n.gV)(t,this.options)),!t)return this.fullTexts.delete(e),!1;this.fullTexts.set(e,t)}_search(e){const t=[],s=this.fullTexts,n=e.split(" "),i=n.length;return s.forEach(((e,s)=>{let o=!0,r=0;for(let t=0;tthis._search(e))).reduce(((e,t)=>(e.push(...t),e)),[]);return t.sort(((e,t)=>e.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars)),new Set(t.map((e=>e.what)))}}}}]); -//# sourceMappingURL=51.015549e15aab2a59d3a0.chunk.js.map \ No newline at end of file diff --git a/public/51.015549e15aab2a59d3a0.chunk.js.map b/public/51.015549e15aab2a59d3a0.chunk.js.map deleted file mode 100644 index a7d62a87..00000000 --- a/public/51.015549e15aab2a59d3a0.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"51.015549e15aab2a59d3a0.chunk.js","mappings":"6IAWA,MACMA,EAAgC,IAAIC,IAAI,CAAC,iBAAkB,kBAAmB,aAAc,qBAOnF,MAAMC,EAWnBC,YAAsBC,EAnBD,GAmBC,KAAAA,cAAAA,EAVf,KAAAC,QAAU,EACP,KAAAC,MAAoC,GACpC,KAAAC,UAAsC,IAAIN,IAE1C,KAAAO,YAA6B,KAC7B,KAAAC,cAA4B,KAE5B,KAAAC,KAAM,QAAO,KAAM,YAI3BC,KAAKC,cAAe,QAAS,IAAMD,KAAKE,iBAAiB,GAAG,GAGvDC,QACLH,KAAKJ,UAAUO,QAEfH,KAAKL,MAAMS,OAAS,EAOfC,OACFL,KAAKH,cAGRG,KAAKH,YAAc,IAAIS,SAAQ,CAACC,EAASC,KACvCR,KAAKF,cAAgBS,MAUlBE,SACDT,KAAKF,gBAETE,KAAKF,gBACLE,KAAKF,cAAgBE,KAAKH,YAAc,KAExCG,KAAKC,gBAGSS,YAAYC,G,qCAC1B,IAAGX,KAAKH,YAAR,CAIAG,KAAKJ,UAAUgB,IAAID,GAMnB,UAIQX,KAAKa,SAASF,GACpB,MAAMG,GACFzB,EAAc0B,IAAKD,MAAAA,OAAG,EAAHA,EAAkBE,OACvChB,KAAKD,IAAIkB,MAAM,wBAAyBH,GAI5Cd,KAAKJ,UAAUsB,OAAOP,GAMtBX,KAAKC,iB,+RAGGY,SAASF,GACjB,OAAOA,EAAKQ,OAGJC,UACR,OAAOpB,KAAKL,MAAM0B,QAGVC,WAAWC,EAA4BC,GAC/CxB,KAAKL,MAAM4B,GAAQC,GACnBxB,KAAKC,eAGGC,cAAcS,GACtB,MAAIX,KAAKL,MAAMS,QAAUJ,KAAKH,aAAgBG,KAAKP,cAAgB,GAAKO,KAAKJ,UAAU6B,MAAQzB,KAAKP,eAIpG,EAAG,CAOD,GANGkB,GACD,OAAiBX,KAAKL,MAAOgB,GAE7BA,EAAOX,KAAKoB,WAGXT,EAGD,MAFAX,KAAKU,YAAYC,GAKnBA,EAAO,WAEDX,KAAKJ,UAAU6B,KAAOzB,KAAKP,eAAiBO,KAAKL,MAAMS,QAI1DsB,KAAKF,GACVxB,KAAKsB,WAAW,OAAQE,GAGnBG,QAAQH,GACbxB,KAAKsB,WAAW,UAAWE,M,gCCjI/B,MAEA,EAF2C,CAAC,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,EAAK,MAAO,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,EAAK,IAAK,EAAK,IAAK,EAAK,GAAI,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,EAAK,IAAK,EAAK,IAAK,EAAK,GAAI,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,GAAI,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,GAAI,EAAK,IAAK,EAAK,O,eCZ5zR,SAASI,EAAmCC,GACzD,MAAO,IAAI,IAAIvC,IAAIuC,I,iCCDN,SAASC,EAAkBC,EAAiBC,GACzD,IAAI,IAA2BC,EAAdF,EAAM3B,OAAqB,EAAG6B,GAAK,IAAKA,EACvDD,EAASD,EAAME,GAAIA,EAAGF,G,iCCAX,SAASG,EAAgFH,EAAiBI,EAAYC,EAAyCC,GAC5K,GAA2B,mBAAlB,EAA8B,CACrC,MAAMC,EAAWF,EACjBA,EAAeD,GAAYA,EAAQG,GAGrC,MAAMC,EAAuBH,EAAYD,GAEzC,QAAWK,IAARH,IAEW,KADZA,EAAMN,EAAMU,QAAQN,IACL,CACb,MAAMO,EAAOX,EAAMM,EAAM,GACnBM,EAAOZ,EAAMM,EAAM,GACzB,KAAKK,GAAQN,EAAYM,IAASH,MAAmBI,GAAQP,EAAYO,IAASJ,GAEhF,OAAOF,EAGTN,EAAMa,OAAOP,EAAK,GAItB,MAAMQ,EAAMd,EAAM3B,OAClB,IAAIyC,GAAON,GAAgBH,EAAYL,EAAMc,EAAM,IACjD,OAAOd,EAAML,KAAKS,GAAW,EACxB,GAAGI,GAAgBH,EAAYL,EAAM,IAE1C,OADAA,EAAMJ,QAAQQ,GACP,EAEP,IAAI,IAAIF,EAAI,EAAGA,EAAIY,EAAKZ,IACtB,GAAGM,EAAeH,EAAYL,EAAME,IAElC,OADAF,EAAMa,OAAOX,EAAG,EAAGE,GACZF,EAMb,OADAa,QAAQ7B,MAAM,MAAOc,EAAOI,GACrBJ,EAAMU,QAAQN,G,iCCxCR,SAASY,EAAcC,I,iCCYvB,SAASC,EAAWC,EAAY3B,GAE7C,OAAO,IAAIjB,SAAcC,IACvB,MAAM4C,EAAS,IAAIC,WACnBD,EAAOE,iBAAiB,WAAYC,IAElC/C,EAAQ+C,EAAEC,OAAOC,WAEnBL,EAAO5B,GAAQ2B,M,iCCpBJ,SAASO,EAASC,EAA+BC,GAC9D,MAAMd,EAAMa,EAAOtD,OACnB,GAAGyC,IAAQc,EAAOvD,OAChB,OAAO,EAGT,IAAI,IAAI6B,EAAI,EAAGA,EAAIY,IAAOZ,EACxB,GAAGyB,EAAOzB,KAAO0B,EAAO1B,GACtB,OAAO,EAIX,OAAO,E,iCCZM,SAAS2B,EAAaC,GACnC,MAAMhB,EAAMgB,EAAUzD,OAChB0D,EAAQ,IAAIC,WAAWC,KAAKC,KAAKpB,EAAM,IAC7C,IAAIqB,EAAQ,EAETrB,EAAM,IACPiB,EAAMI,KAAWC,SAASN,EAAUO,OAAO,GAAI,KAGjD,IAAI,IAAInC,EAAIiC,EAAOjC,EAAIY,EAAKZ,GAAK,EAC/B6B,EAAMI,KAAWC,SAASN,EAAUQ,OAAOpC,EAAG,GAAI,IAGpD,OAAO6B,E,iCCbM,SAASQ,EAAoBR,GAC1C,OAAGA,aAAiBC,WACXD,EACmB,iBAAZ,GACP,IAAIS,aAAcC,OAAOV,GAG3B,IAAIC,WAAWD,G,iCCCT,SAASW,EACtBC,EACA1C,GAEA,OAAG0C,aAAgBpE,QAEVoE,EAAKC,KAAK3C,GAEVA,EAAS0C,G,gECRpB,IAAIE,EAAW,EACA,SAASC,EAAqBC,GAC3C,IAAIC,EACJ,MAAMC,EAAWF,MAAAA,OAAI,EAAJA,EAAM9D,KACvB,GAAGgE,EAAU,CACX,MAAMC,EAAM,GAAG,OAASL,OAAcI,EAASE,MAAM,KAAK,KAGxDH,EADC,CAAC,aAAc,YAAa,aAAatC,QAAQuC,IAAa,EACpD,QAAUC,EACkB,IAA/BD,EAASvC,QAAQ,WAAmB,CAAC,aAAaA,QAAQuC,IAAa,EACpE,QAAUC,EACkB,IAA/BD,EAASvC,QAAQ,UACd,QAAUwC,EAEV,WAAaA,OAG1BF,EAAW,UAAU,OAASH,MAGhC,OAAOG,I,eC5BM,SAASI,EAAgBC,EAAaC,GACnD,MAAMC,EAAWD,EAAIH,MAAM,KAC3B,IAAIK,EAASH,EAUb,OATAE,EAASE,SAASH,IACZA,IAKJE,EAAIA,EAAEF,OAGDE,E,iCCZM,SAASE,EAAqBL,EAAiDM,EAAuB,OACnH,IAAIN,EAAQ,MAAO,GACnB,MAAMO,EAAMP,aAAkBQ,IAAM,IAAIR,EAAOS,QAAUC,OAAOD,KAAKT,GAAQW,KAAK9D,IAAOA,IACzF,MAAY,QAATyD,EAAuBC,EAAID,MAAK,CAACM,EAAGC,IAAMD,EAAIC,IACrCN,EAAID,MAAK,CAACM,EAAGC,IAAMA,EAAID,I,yECQtB,SAASE,EACtBC,EACAC,EACAC,GAAiB,EACjBC,GAAgB,GAEhB,IAAIC,EACAC,EAAiDjG,EAAgCC,EACjFiG,GAAa,EAEjB,MAAMC,EAAUC,IACd,MAAMC,EAAWrG,EAASsG,EAAUrG,EACpC,IAEEoG,EADeT,EAAGW,MAAM,KAAMH,IAE9B,MAAM7F,GACNgC,QAAQ7B,MAAM,iBAAkBH,GAEhC+F,EAAQ/F,KAINoF,EAAW,IAAIS,KACfH,IAAgBA,EAAiB,IAAIlG,SAAQ,CAACsG,EAAUC,KAAatG,EAAUqG,EAAUpG,EAASqG,MAEnGN,GACDQ,aAAaR,GACbE,GAAa,EACbjG,IACAgG,EAAiB,IAAIlG,SAAQ,CAACsG,EAAUC,KAAatG,EAAUqG,EAAUpG,EAASqG,MAC1ER,IACRK,EAAOC,GACPF,GAAa,GAGf,MAAMO,EAAkB,gBAAe,MAElCV,GAAmBD,IAAkBI,GACtCC,EAAOC,GAINJ,IAAmBS,IACpBT,EAAiBC,EAAiBjG,EAAUC,OAASgC,EACrDiE,GAAa,KAEdL,GAIH,OAFAG,EAAiBS,EACjBR,EAAeS,MAAM,KACdT,GAcT,OAXAN,EAASa,aAAe,KACnBR,IACD,iBAAiBA,GACjB/F,IACA+F,EAAiBC,EAAiBjG,EAAUC,OAASgC,EACrDiE,GAAa,IAIjBP,EAASgB,YAAc,MAAQX,EAExBL,I,2CC5DGiB,E,mBCdG,SAASC,EAAaC,EAAuBC,GAC1D,GAAID,EAAgBE,cAAe,CACjC,MAAMC,EAAQH,EAAmBC,EACjC,OAAOE,EAAO,GAAK,EAAKA,EAAO,EAAI,EAAI,EAGzC,OCFa,SAAqBC,EAAcC,GAChD,MAAMC,EAAaF,EAAKrH,OACxB,GAAGuH,IAAeD,EAAKtH,OAAQ,CAC7B,MAAMoH,EAAOG,EAAaD,EAAKtH,OAC/B,OAAOoH,EAAO,GAAK,EAAKA,EAAO,EAAI,EAAI,EAIzC,IAAI,IAAIvF,EAAI,EAAGA,EAAI0F,EAAY1F,GADT,GAC6B,CACjD,MAEMuF,GAFMC,EAAKG,MAAM3F,EAAGA,EAFN,KAGRyF,EAAKE,MAAM3F,EAAGA,EAHN,IAKpB,GAAGuF,EACD,OAAOA,EAIX,OAAO,EDfAK,CAAYR,EAAgBC,IDQrC,SAAYH,GACV,mBACA,iBACA,uBACA,mBAJF,CAAYA,IAAAA,EAAQ,KAsCL,MAAMW,EAInBtI,cAEEQ,KAAK+H,iBAAmBD,EAAYE,oBAAoBhI,MAExD,MAAMiI,EAAQjI,KAAKkI,iBAEnBlI,KAAKmI,OAAS,CAACF,GAGTG,2BAA2BC,GACjC,OAAO,cAAuBC,MAAvB,c,oBAEL,KAAAC,IAAgBpB,EAASqB,KAOzBC,MAAMC,GACJ,IAAI1I,KAAKuI,IAAMG,KAAUA,EACvB,OAAO,EAKT,IAAID,GAAQ,EACZ,GAAGC,IAASvB,EAASwB,IAAK,CACxB,MAAMf,EAAQS,EAAYO,KAC1BH,KAAQb,EAAMW,IAAMG,IAAO1I,KAAK6I,SAASjB,EAAMA,EAAMxH,OAAS,SACzD,GAAGsI,IAASvB,EAAS2B,OAAQ,CAClC,MAAMlB,EAAQS,EAAYJ,MAC1BQ,KAAQb,EAAMW,IAAMG,IAAO1I,KAAK6I,SAASjB,EAAM,SAC1C,GAAGc,IAASvB,EAAS4B,KAC1B,OAAO/I,KAAKyI,MAAMtB,EAASwB,MAAQ3I,KAAKyI,MAAMtB,EAAS2B,QAOzD,OAJGL,GACDzI,KAAKgJ,OAAON,GAGPD,EAGTQ,UACE,MAAO,CACLC,IAAKlJ,KAAKyI,MAAMtB,EAASwB,KACzBQ,OAAQnJ,KAAKyI,MAAMtB,EAAS2B,QAC5BM,KAAMpJ,KAAKyI,MAAMtB,EAAS4B,OAI9BC,OAAON,GACL1I,KAAKuI,KAAOG,EAGdW,SAASX,GACP1I,KAAKuI,MAAQG,EAGf9F,OAAOsB,EAAeoF,KAAwBC,GAC5C,MAAMC,EAAMC,MAAM7G,OAAOsB,EAAOoF,KAAgBC,GAEhD,IAAIvJ,KAAKI,OAAQ,CACf,MAAM+H,EAASE,EAAYF,OACrBuB,EAAMvB,EAAO1F,QAAQzC,OACf,IAAT0J,IACoB,IAAlBvB,EAAO/H,OACRJ,KAAKqJ,SAASlC,EAAS4B,MAEvBZ,EAAOvF,OAAO8G,EAAK,IAKzB,OAAOF,IAKNtB,kBAAkBqB,GAGvB,MAAM3B,EAAQ,IAAI5H,KAAK+H,iBAAiBwB,EAAMnJ,QAC9C,IAAI,IAAI6B,EAAI,EAAG7B,EAASmJ,EAAMnJ,OAAQ6B,EAAI7B,IAAU6B,EAClD2F,EAAM3F,GAAKsH,EAAMtH,GAEnB,OAAO2F,EAgDF+B,YAAY/B,EAAYgC,GAAU,GACvC,IAAIhC,EAAMxH,OACR,OAGF,MAAM6H,EAAQjI,KAAKmI,OAAO,GAC1B,IAAIF,EAAM7H,OAER,OADA6H,EAAMvG,QAAQkG,GACPK,EAGT,MAAM4B,EAAajC,EAAMA,EAAMxH,OAAS,GAClC0J,EAAalC,EAAM,GAEzB,IAAImC,EAAsBC,GAAc,EAAGC,GAAc,EAAGC,EAAkB,EAC9E,KAAMA,EAAkBlK,KAAKmI,OAAO/H,SAClC2J,EAAa/J,KAAKmI,OAAO+B,GACzBF,EAAaD,EAAWtH,QAAQoH,GAChCI,EAAaF,EAAWtH,QAAQqH,IAEb,IAAhBG,IAAsB,IAAMD,KAEL,IAAhBC,IAAsB,IAAMD,IAPME,GAY9C,IAAmB,IAAhBD,IAAsB,IAAMD,QAExB,IAAmB,IAAhBC,EAAmB,CAC3B,MAAME,EAASvC,EAAMA,MAAMmC,EAAW3J,OAAS6J,GAC/CF,EAAWrI,QAAQyI,QACd,IAAmB,IAAhBH,EAAmB,CAC3B,MAAMG,EAASvC,EAAMA,MAAM,EAAGA,EAAMxH,OAAS4J,EAAa,GAC1DD,EAAWpI,WAAWwI,OACjB,CACL,IAAIC,EAAc,EAClB,IAAI,MAAMhK,EAASJ,KAAKmI,OAAO/H,OAAQgK,EAAchK,IAAUgK,EAAa,CAC1E,MAAMC,EAAIrK,KAAKmI,OAAOiC,GACtB,GAAoC,IAAjChD,EAAaQ,EAAM,GAAIyC,EAAE,IAC1B,MAIJrK,KAAKmI,OAAOvF,OAAOwH,EAAa,EAAGpK,KAAKkI,kBAAkBN,IAC1DsC,EAAkBE,EAGpB,OAAGR,EACM5J,KAAK4J,QAAQM,QADtB,EAKMN,QAAQM,GACd,GAAGlK,KAAKmI,OAAO/H,QAAU,EACvB,IAAI,IAAI6B,EAAI,EAAG7B,EAASJ,KAAKmI,OAAO/H,OAAQ6B,EAAK7B,EAAS,IAAM6B,EAAG,CACjE,MAAMqI,EAAYtK,KAAKmI,OAAOlG,GACxBsI,EAAYvK,KAAKmI,OAAOlG,EAAI,IAGf,IADAqI,EAAU7H,QAAQ8H,EAAU,MAE7CD,EAAUtB,OAAOuB,EAAUhC,KAC3BvI,KAAKmI,OAAOvF,OAAOX,EAAI,EAAG,GAEvBA,EAAIiI,KACHA,IAGF9J,IACA6B,EAEFjC,KAAK2J,YAAYY,GAAW,IAKlC,OAAOvK,KAAKmI,OAAO+B,GAKjBjC,YACF,OAAOjI,KAAKmI,OAAO,GAGjBS,WACF,OAAO5I,KAAKmI,OAAOnI,KAAKmI,OAAO/H,OAAS,GAGtCwH,YACF,OAAO5H,KAAKiI,MAGV7H,aACF,OAAOJ,KAAK4H,MAAMxH,OAGboK,UAAU7J,GACf,IAAI,IAAIsB,EAAI,EAAG7B,EAASJ,KAAKmI,OAAO/H,OAAQ6B,EAAI7B,IAAU6B,EAAG,CAC3D,MAAM2F,EAAQ5H,KAAKmI,OAAOlG,GACpBwI,EAAQ7C,EAAMnF,QAAQ9B,GAC5B,IAAc,IAAX8J,EACD,MAAO,CAAC7C,MAAAA,EAAO6C,MAAAA,IAOdC,gBAAgBC,GACrB,IAAI/C,EACJ,IAAI,IAAI3F,EAAI,EAAGA,EAAIjC,KAAKmI,OAAO/H,SAAU6B,EAAG,CAC1C,IAAI2I,EAAS,EAEb,GADAhD,EAAQ5H,KAAKmI,OAAOlG,KACjB2F,EAAMxH,OAAS,GAIlB,KAAMwK,EAAShD,EAAMxH,SAAUwK,EAC7B,GAAGxD,EAAauD,EAAO/C,EAAMgD,KAAY,EAKvC,MAAO,CACLhD,MAAAA,EACAgD,OAAQD,IAAU/C,EAAMgD,GAAUA,EAASA,EAAS,GAM5D,GAAGhD,GAASA,EAAMa,MAAMtB,EAASwB,KAC/B,MAAO,CACLf,MAAAA,EACAgD,OAAQhD,EAAMxH,QAQbyK,QAAQC,EAAaC,EAAoBC,GAC9C,IAAIpD,EAAQ5H,KAAK4H,MACbgD,EAAS,EACTK,EAAc,EAElB,GAAGH,EAAU,CACX,MAAMzI,EAAMrC,KAAK0K,gBAAgBI,GACjC,IAAIzI,EACF,OAGFuF,EAAQvF,EAAIuF,MACZgD,EAASK,EAAc5I,EAAIuI,OAExBhD,EAAMiB,SAASiC,KAChBG,GAAe,GAQnB,MAAMC,EAAalH,KAAKmH,IAAIF,EAAcF,EAAY,GAChDK,EAAWH,EAAcF,EAAaC,EAItCb,EAASvC,EAAMA,MAAMsD,EAAYE,GAEjCC,EAAoBN,EAAa,EAAIC,EAAQD,EAAaC,EAC1DM,EAAuBtH,KAAKuH,IAAIR,GAIhCS,EAAgB5D,EAAMxH,OAAS6K,GAAgBI,KAAsBzD,EAAMa,MAAMtB,EAASwB,OAAQwB,EAAOnB,OAAO7B,EAASwB,MAAM,GAC/H8C,EAAmBR,EAAcK,GAAyB,KAAM1D,EAAMa,MAAMtB,EAAS2B,UAAWqB,EAAOnB,OAAO7B,EAAS2B,SAAS,GAKtI,MAAO,CACLlB,MAAOuC,EACPuB,eAAgBd,EAChBe,UAAWxE,EAASqB,MAAQgD,GAAgBC,EAAkBtE,EAAS4B,MAASyC,EAAerE,EAASwB,IAAMxB,EAASqB,OAASiD,EAAkBtE,EAAS2B,OAAS3B,EAASqB,QAI1K7G,WAAW4H,GAChB,IAAI3B,EAAQ5H,KAAKiI,MACbL,EAAMxH,OAECwH,EAAMa,MAAMtB,EAAS2B,UAC9BlB,EAAQ5H,KAAKkI,iBACbN,EAAMoB,OAAO7B,EAAS2B,QACtB9I,KAAKmI,OAAOxG,QAAQiG,IAJpBA,EAAMoB,OAAO7B,EAAS2B,QAOxBlB,EAAMjG,WAAW4H,GAGZ7H,QAAQ6H,GACb,IAAI3B,EAAQ5H,KAAK4I,KACbhB,EAAMxH,OAECwH,EAAMa,MAAMtB,EAASwB,OAC9Bf,EAAQ5H,KAAKkI,iBACbN,EAAMoB,OAAO7B,EAASwB,KACtB3I,KAAKmI,OAAOzG,KAAKkG,IAJjBA,EAAMoB,OAAO7B,EAASwB,KAOxBf,EAAMlG,QAAQ6H,GAGTrI,OAAOP,GACZ,MAAMiL,EAAQ5L,KAAKwK,UAAU7J,GAC7B,QAAGiL,IACDA,EAAMhE,MAAMhF,OAAOgJ,EAAMnB,MAAO,IACzB,GAMJoB,YAAYjE,IACjB,EAAAkE,EAAA,GAAiB9L,KAAKmI,OAAQP,GAGzBmE,SACL,MAOMC,EAAuC,CAC3C7D,OARiDnI,KAAKmI,OAAOpC,KAAK6B,IAC3D,CACLqE,OAAQrE,EAAMA,QACda,MAAOb,EAAMqB,eAQjB,OAAOiD,KAAKC,UAAUH,GAGjB5D,gBAAoCgE,GACzC,MAAMC,EAAmCH,KAAKI,MAAMF,GAC9CjC,EAAS,IAAIrC,EAOnB,OANAuE,EAAOlE,OAAO3C,SAASoC,IACrB,MAAM2E,EAAWpC,EAAOR,YAAY/B,EAAMqE,SAAW9B,EAAOlC,MACzDL,EAAMa,MAAMS,KAAKqD,EAASvD,OAAO7B,EAASwB,KAC1Cf,EAAMa,MAAMU,QAAQoD,EAASvD,OAAO7B,EAAS2B,WAG3CqB,GAIX,OAAmB,iBAA6BrC,I,8CG3bjC,SAAS0E,EAAqBC,GAI3C,OAHgBA,EAA4DC,MAC1E,OAAWD,EAA4DC,MACtED,EAAgDE,QAAQC,a,eCK9C,SAASC,EAAUC,EAAYC,EAAoBC,EAA6CC,GAC7G,GAAc,cAAXH,EAAKI,EAAmB,OAAO,EAElC,GAAIJ,EAAmBK,OAAOC,aAA0B,kBAAXL,EAC3C,OAAO,EAGT,MAAMM,OAAqC7K,IAAXwK,EAChC,GAAIF,EAAmBK,OAAOG,SAAWD,EACvC,OAAO,EAGT,GAAc,kBAAXP,EAAKI,GACO,qBAAXJ,EAAKI,GAEJJ,EAAKK,OAAOI,OAAUT,EAAsBK,OAAOK,UACtD,OAAO,EAMT,IAAIR,KACFA,EAASF,EAAKW,cAAiBX,EAAsBY,eAAiBZ,EAAKa,uBAGzE,OAAO,EAIX,IAAIC,EAAyG,GAQ7G,OAPGZ,IACDY,EAAUZ,EAAOG,QAMZJ,GACL,IAAK,cACL,IAAK,aACL,IAAK,YACL,IAAK,cACL,IAAK,aACL,IAAK,gBACL,IAAK,aACL,IAAK,gBACH,IAAIE,GAAYH,EAAKK,OAAOI,KAC1B,OAAO,EAGT,GAAgB,qBAAbP,EAAOE,GAA4BU,EAAQb,GAC5C,OAAO,EAGT,GAAc,YAAXD,EAAKI,IACFJ,EAAKK,OAAOK,YAAcI,EAAQC,cACpC,OAAO,EAIX,MAIF,IAAK,kBACL,IAAK,cACH,QAASD,EAAQb,GAGnB,IAAK,eACH,MAAoB,oBAAbC,EAAOE,EAA0BU,EAAQb,MAAaa,EAAQC,eAAiBD,EAAQb,GAOhG,IAAK,cACL,IAAK,eACH,MAAoB,oBAAbC,EAAOE,EAA0BU,EAAQb,IAAWa,EAAQb,GAIrE,IAAK,cACL,IAAK,cACH,OAAO,EAGT,IAAK,YACL,IAAK,qBACH,MAAoB,oBAAbC,EAAOE,KAA6BU,EAAmB,UAGhE,IAAK,oBACH,QAAqB,SAAXd,EAAKI,GAAiBJ,EAAKK,OAAOW,YAAahB,EAAKK,OAAOG,UAAWR,EAAKW,cAIzF,OAAO,E,gEC3GM,SAASM,EACtBC,EACAC,GAAiD,OAAkBD,EAAOE,YAE1E,OAAOF,MAAAA,OAAM,EAANA,EAASC,K,eCLH,SAASE,EAAkBC,GACxC,MAAO,SAASA,I,gECCH,SAASC,EAA2BC,EAAwBC,EAAyC7O,EAAkB8O,GACpI,MAAMC,GAAoB,OAA6BH,EAAKC,MAAAA,OAAK,EAALA,EAAOvN,MAEnE,IAAIgE,EAOJ,OALEA,EADc,eAAbuJ,MAAAA,OAAK,EAALA,EAAOrB,GACGoB,EAAII,QAAU,aAAe,aAE7BJ,EAAIK,WAAa,2BAGvB,CACLC,KAAMN,EAAIO,MACVC,SAAUL,EACVhN,KAAM8M,EAAQA,EAAM9M,KAAO6M,EAAI7M,KAC/BuD,SAAAA,EACAD,SAAUuJ,EAAIS,UACdrP,QAAAA,EACA8O,UAAAA,K,eCnBW,SAASQ,EAA6BV,EAAwBW,GAC3E,MAAO,CACL/B,EAAG,4BACHgC,GAAIZ,EAAIY,GACRC,YAAab,EAAIa,YACjBC,eAAgBd,EAAIc,eACpBC,WAAYJ,G,gECLD,SAASK,EAA+BC,GACrD,OAAO,OAAsBA,EAAQT,SAAUS,K,4ECGlC,SAASC,EAAwBD,GAC9C,MAAM,MAACE,EAAK,MAAElB,EAAK,QAAE7O,EAAO,UAAE8O,GAAae,EAE3C,IAAIG,ECbS,IAAuCC,EDqBpD,MAPe,aAAZF,EAAMvC,EAAkBwC,GAAkB,EAAArB,EAAA,GAA2BoB,EAAOlB,EAAc7O,EAAS8O,GAClF,UAAZiB,EAAMvC,EAAewC,GAAkB,EAAAE,EAAA,GAAwBH,EAAOlB,EAAc7O,EAAS8O,IAC7F,EAAAqB,EAAA,GAAcJ,KAAQC,ECfvB,CACLd,KAAM,EACNE,SAAU,CACR5B,EAAG,uBACHiC,aALgDQ,EDgB0BF,GCXpBN,YACtDW,IAAKH,EAAYG,KAEnBrO,KAAMkO,EAAYlO,KAClBuD,SAAU2K,EAAYhB,YDSxBe,EAAgBK,WAAaR,EAAQQ,WAG9B,CAAChL,UADS,EAAAuK,EAAA,GAA+BI,GAC9BA,gBAAAA,K,wDEpBL,SAASM,EAAeC,EAAsBC,GAC3D,UAAS,UAAmB,EAC1B,OAAO,EAGT,KAAI,OAASD,GACX,OAAO,EAGT,GAAGA,EAAO/C,IAAMgD,EAAOhD,EACrB,OAAO,EAGT,GAAgB,iBAAb+C,EAAO/C,GAAwBgD,EAAOhD,IAAM+C,EAAO/C,EAAG,CACvD,GAAG+C,EAAOE,kBAAoBD,EAAOC,gBACnC,OAAO,EAGT,KAAI,OAAUF,EAAOG,SAAUF,EAAOE,UACpC,OAAO,EAGT,GAAGH,EAAOI,UAAYH,EAAOG,QAC3B,OAAO,EAGT,GAAGJ,EAAO9C,OAAOmD,aAAeJ,EAAO/C,OAAOmD,WAC5C,OAAO,EAIX,OAAO,I,cCjCM,SAASC,EAAYC,EAA4DC,GAC9F,OAAOD,EAAU,IAAMC,E,gECKV,SAASC,EAAkBC,GACxC,MAAMC,EAAI,IACV,OAAGD,GAAaC,EACPD,EAGFC,EAAKD,EAAY,M,8CCHX,SAASE,EAAmBF,GACzC,OCJa,SAAwBA,EAAmBG,GACxD,MAAMF,EAAI,IACV,GAAGD,EAAYC,EACb,OAAOD,EAGT,MAAMI,EAAI,IAAuB,EAC3BC,EAAOL,EAAYI,EAKzB,OAJGC,IAASD,IACVJ,GAAaK,EAAO,IAGHL,EAAYC,GAAK,IDR7BK,CAAeN,K,wCEZjB,MAAMO,EAAuB,MACvBC,EAAoB,Y,8CCUlB,SAASC,EAA4BC,EAAoCC,EAA0DtG,GAChJ,GAAmB,6BAAhBqG,EACD,OAAOC,EAGT,MAAMC,EAAyB,GAC/B,IAAID,EAAQlR,OACV,OAAOmR,EAGT,IAAIC,GAAY,EAChB,MAAMC,EAKD,GACHC,EAAuC,GACvCC,EAAwC,GAG1C,OAAON,GACL,IAAK,4BACHI,EAAkC,mBAAI,EACtC,MAEF,IAAK,gCACHA,EAAkC,mBAAI,EACtCA,EAAqC,sBAAI,EACzCC,EAAehQ,KAAK,SACpB,MAEF,IAAK,2BACH+P,EAAqC,sBAAI,EACzCC,EAAehQ,KAAK,SACpB,MAEF,IAAK,8BACH+P,EAAqC,sBAAI,EAEzCC,EAAehQ,UAAKc,EAAW,QAAS,OACxC,MAEF,IAAK,2BACHiP,EAAqC,sBAAI,EACzCC,EAAehQ,KAAK,SACpB,MAEF,IAAK,gCACH+P,EAAqC,sBAAI,EACzCC,EAAehQ,KAAK,QAAS,SAC7B,MAEF,IAAK,gCACH+P,EAAqC,sBAAI,EACzCC,EAAehQ,KAAK,SACpB,MAEF,IAAK,2BACH+P,EAAqC,sBAAI,EACzCC,EAAehQ,KAAK,SACpB,MAEF,IAAK,yBACH+P,EAAoB,KAAI,EACxB,MAEF,IAAK,gCACHA,EAAuB,QAAI,EAC3B,MAUF,QACED,GAAY,EAShB,IAAIA,EACF,OAAOD,EAGT,IAAI,IAAItP,EAAI,EAAG7B,EAASkR,EAAQlR,OAAQ6B,EAAI7B,IAAU6B,EAAG,CACvD,MAAMoO,EAAoDiB,EAAQrP,GAClE,IAAIoO,EAAS,SAIb,IAAIzE,GAAQ,EACZ,GAAiB,YAAdyE,EAAQnD,GACT,GAAGmD,EAAQZ,OAASgC,EAAepB,EAAQZ,MAAMvC,GAA+B,CAC9E,MAAMoB,EAAO+B,EAAQZ,MAA4CmC,SACjE,GAAGtD,IAEEoD,EAAetR,SAAWsR,EAAe7I,SAASyF,EAAItN,OACvD2Q,EAAgB9I,SAASyF,EAAItN,OAG/B,SAGF4K,GAAQ,OACH,GAAG6F,EAAoB,KAAKpB,EAAQA,QAAS,CAClD,MAAMwB,EAAe,CAAC,uBAAwB,qBAC1CxB,EAAQyB,cAAkCC,MAAMzO,GAAMuO,EAAahJ,SAASvF,EAAE4J,OAAO,OAASmD,EAAQA,YACxGzE,GAAQ,SAGJ6F,EAAuB,QAC/BpB,EAAQtD,QACP,CACC,gCACA,6BACA,gCACA,8BACyBlE,SAASwH,EAAQtD,OAAOG,KACnDtB,GAAQ,GAKV,GAAGA,IACD2F,EAAU7P,KAAK2O,GACZkB,EAAUnR,QAAU4K,GACrB,MAKN,OAAOuG,I,8CCpJM,SAASS,EAAaC,GACnC,IAAuB5B,EAAiByB,EAAgC1B,EAApE8B,EAAgB,EACpB,IAAI,MAAMC,KAAKF,EAEb,IADA,OAA4BE,GACzBA,EAAE9B,QAAS,CACZ,KAAK6B,EAAgB,EAAG,MACxB7B,EAAU8B,EAAE9B,QACZyB,EAAgBK,EAAEL,cAClB1B,EAAW+B,EAAE/B,SAUjB,OANG8B,EAAgB,IACjB7B,OAAU7N,EACVsP,OAAgBtP,EAChB4N,OAAW5N,GAGN,CAAC6N,QAAAA,EAASD,SAAAA,EAAU0B,cAAAA,K,wDCjBd,SAASM,EAAUC,GAChC,QAAc7P,IAAX6P,GAA0BA,EAAkBC,UAAYD,EAAkBC,WAAqB,OAAOD,EAGpG,IAAG,OAASA,GAAS,CACxB,MAAME,EAAUF,EAAyB1F,QACzC,QAAcnK,IAAX+P,EACD,OAAOA,EAAO3F,UAAS,GAGzB,MAAM4F,EAAUH,EAA4BI,YAAeJ,EAAyBK,QACpF,YAAclQ,IAAXgQ,EACMA,EAAO5F,UAAS,GAGlB,KAEF,IAAIyF,EAAQ,OAAO,KAE1B,MAAMM,EAA0C,MAAhCN,EAAkBjO,OAAO,GACnCwO,EAAcP,EAAkBhO,OAAO,GAAGa,MAAM,KAEtD,OAAOyN,EAASC,EAAW,GAAGhG,YAAcgG,EAAW,IAAM,IAAIhG,UAAS,K,eCf7D,SAASgD,EAAwBiD,EAA6BC,EAAsBpT,EAAkB8O,GACnH,MAAMuE,EAAyB,aAAZF,EAAM3F,EAEzB,IAAI4F,GAA6B,mBAAhBA,EAAU5F,EAEzB,MAAM,IAAI8F,MAAM,mBAIlB,MAAMC,IAA8B,cAAhBH,EAAU5F,GAAqC,yBAAhB4F,EAAU5F,IAAiC2F,EAAM1D,cAAe0D,EAAMzD,gBACnHN,EAAmG,CACvG5B,EAAG6F,EAAa,4BAA8B,yBAC9C7D,GAAI2D,EAAM3D,GACVC,YAAa0D,EAAM1D,YACnBC,eAAgByD,EAAMzD,eACtBC,WAAYyD,EAAU9R,MAGxB,MAAO,CACL4N,KAAMiE,EAAMhE,MACZC,SAAAA,EACArN,KAAMwR,EAAWH,EAAkCrR,UAAOe,EAC1DwC,SAAU,aACVtF,QAAAA,EACA8O,UAAAA,G,gEChCW,SAAS0E,EAAeC,EAAcC,GACnD,OAAO,OAAUD,EAAIC,K,aCFR,SAASC,EAAsB/E,G,MAC5C,OAAuB,QAAhB,EAAAA,EAAIgF,oBAAY,eAAG,G,gECMb,SAASC,EAAcC,GACpC,OAAQA,EAAKrG,OAAOsG,SAAWD,EAAKtE,GAAGtC,aAAe,O,eCRzC,SAASiD,EAAcF,GACpC,SAAUA,GAAkC,gBAAlBA,EAAYzC,GAAyC,uBAAlByC,EAAYzC,G,iCCG3E,IAAYwG,E,iBAAZ,SAAYA,GACV,6BACA,+BACA,uBACA,2BAJF,CAAYA,IAAAA,EAAgB,M,gCCE5B,MAAMC,EAAgD,IAAIrU,IAAI,CAC5D,oBACA,sBACA,oBACA,mBACA,yBACA,sBACA,0BACA,yBAEa,SAASsU,EAAoBxD,GAE1C,IAAI,IAAInO,EAAI,EAAGA,EAAImO,EAAShQ,SAAU6B,EAAG,CACvC,MAAM4R,EAASzD,EAASnO,GAExB,IAAI6R,GAAiB,EACrB,GAKE,GAJAA,EAAgB1D,EAAS2D,WAAU,CAACzQ,EAAG0Q,IAC9BL,EAAqB5S,IAAIuC,EAAE4J,IAAM8G,IAAO/R,GAAKqB,EAAE4J,IAAM2G,EAAO3G,GAAM5J,EAAEsH,OAASiJ,EAAOzT,SAAYyT,EAAOjJ,UAG1F,IAAnBkJ,EAAsB,CACvB,MAAMG,EAAa7D,EAAS0D,GAC5BD,EAAOzT,QAAU6T,EAAW7T,OAC5BgQ,EAASxN,OAAOkR,EAAe,WAER,IAAnBA,M,eCzBG,SAASI,EAAcC,EAAcN,GAClD,MAAMO,EAASD,EAAKvM,MAAM,EAAGiM,EAAOjJ,QAE9ByJ,ECZO,SAAiBF,GAC9B,MAAMG,EAAQ,kQACRC,EAAcD,EAAMlU,OAEpBoU,EAAgB,GACtB,IAAI,IAAIvS,EAAI,EAAGA,EAAIkS,EAAK/T,SAAU6B,EAAG,CACnC,MAAMwS,EAAON,EAAKO,WAAWzS,GAC7BuS,EAAI9S,KAAK4S,EAAMG,EAAOF,IAGxB,OAAOC,EAAIG,KAAK,IDEKC,CADCT,EAAKvM,MAAMiM,EAAOjJ,OAAQiJ,EAAOjJ,OAASiJ,EAAOzT,SAEjEyU,EAAQV,EAAKvM,MAAMiM,EAAOjJ,OAASiJ,EAAOzT,QAEhD,MAAO,CAAC+T,KADRA,EAAOC,EAASC,EAAeQ,EACjBC,WAAYT,G,gEEN5B,MAAMU,EAA2C,IAAIzV,IAAI,CAAC,mBAAoB,sBAE/D,SAAS0V,EAAsBC,EAAkCC,GAC9E,IAAIC,GAAa,EACjB,OAAOF,EAAgBlD,MAAMqD,IACxBL,EAAgBhU,IAAIqU,EAAclI,KACnCiI,EAAYC,EAAcxK,OAASwK,EAAchV,QAGhD8U,EAAUtK,OAASuK,IAAc,SAA8BD,EAAUhI,KAIjDgI,EAAUhI,IAAMkI,EAAclI,IACvD,SAA8BgI,EAAUhI,KAAO,SAA8BkI,EAAclI,MAMjEgI,EAAUtK,QAAUwK,EAAcxK,QAC3DsK,EAAU9U,OAAS8U,EAAUtK,QAAYwK,EAAchV,OAASgV,EAAcxK,a,eCtBtE,SAASyK,EAASlB,EAAc/D,GAyB7C,OAnBO+D,EAAKmB,QAAQ,mCAAmC,CAACC,EAAO3K,EAAQ4K,KACrE,GAAGpF,EAAU,CACX,MAAMhQ,EAASmV,EAAMnV,OAErBwK,GAAUxK,EACVgQ,EAAS5K,SAASqO,IAChB,MAAMtL,EAAMsL,EAAOjJ,OAASiJ,EAAOzT,OAChCmI,IAAQqC,EACTiJ,EAAOzT,QAAUA,EACTmI,EAAMqC,IACdiJ,EAAOjJ,QAAUxK,MAMvB,OAAOmV,EAAQ,O,gEC5BJ,SAASE,EAAStB,GAC/B,OAAQA,EAAcA,EAAKoB,MAAM,MAAlB,O,wDCOF,SAASG,EAAcT,EAAkCU,GACtE,MAAMC,EAAWD,EAAYE,QAAQvS,KAC3B,OAAsB2R,EAAiB3R,KAGjD2R,EAAgBvT,QAAQkU,IACxB,OAAaX,GAOb,IAAI,IAAIhT,EAAI,EAAGA,EAAIgT,EAAgB7U,SAAU6B,EAAG,CAC9C,MAAM4R,EAASoB,EAAgBhT,GAC/B,GAAgB,uBAAb4R,EAAO3G,EAA4B,CACpC,MAAM+G,EAAagB,EAAgBhT,EAAI,GACpCgS,GAA6DA,EAAWrJ,OAAUiJ,EAAOjJ,OAASiJ,EAAOzT,SAC1GyT,EAAOzT,OAAS6T,EAAWrJ,OAASiJ,EAAOjJ,SAMjD,OAAOqK,I,8CCtBT,MAEA,EAFY,CAAC,UAAW,KAAM,UAAW,cAAe,SAAU,QAAS,KAAM,QAAS,KAAM,OAAQ,KAAM,KAAM,SAAU,KAAM,WAAY,KAAM,YAAa,SAAU,KAAM,YAAa,KAAM,UAAW,KAAM,aAAc,KAAM,YAAa,KAAM,QAAS,OAAQ,OAAQ,KAAM,OAAQ,aAAc,KAAM,WAAY,KAAM,UAAW,QAAS,QAAS,KAAM,KAAM,MAAO,KAAM,KAAM,OAAQ,OAAQ,MAAO,cAAe,WAAY,WAAY,SAAU,KAAM,KAAM,KAAM,OAAQ,SAAU,OAAQ,KAAM,KAAM,KAAM,KAAM,MAAO,OAAQ,QAAS,MAAO,MAAO,KAAM,QAAS,cAAe,YAAa,OAAQ,KAAM,MAAO,KAAM,aAAc,KAAM,MAAO,WAAY,KAAM,WAAY,KAAM,KAAM,WAAY,QAAS,WAAY,WAAY,OAAQ,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,MAAO,MAAO,SAAU,OAAQ,iBAAkB,QAAS,WAAY,UAAW,UAAW,QAAS,OAAQ,SAAU,UAAW,UAAW,OAAQ,OAAQ,MAAO,WAAY,KAAM,KAAM,SAAU,MAAO,OAAQ,KAAM,KAAM,KAAM,UAAW,OAAQ,QAAS,YAAa,SAAU,SAAU,KAAM,QAAS,OAAQ,KAAM,KAAM,SAAU,WAAY,QAAS,SAAU,WAAY,OAAQ,KAAM,KAAM,KAAM,QAAS,QAAS,SAAU,UAAW,UAAW,MAAO,YAAa,UAAW,WAAY,SAAU,eAAgB,aAAc,cAAe,UAAW,OAAQ,OAAQ,UAAW,KAAM,SAAU,aAAc,UAAW,MAAO,UAAW,KAAM,aAAc,KAAM,KAAM,KAAM,KAAM,QAAS,KAAM,QAAS,MAAO,QAAS,SAAU,MAAO,OAAQ,KAAM,QAAS,SAAU,WAAY,WAAY,SAAU,UAAW,OAAQ,SAAU,MAAO,WAAY,OAAQ,UAAW,SAAU,YAAa,WAAY,KAAM,KAAM,KAAM,MAAO,KAAM,OAAQ,UAAW,SAAU,SAAU,OAAQ,KAAM,MAAO,KAAM,MAAO,YAAa,KAAM,KAAM,QAAS,SAAU,SAAU,WAAY,cAAe,cAAe,YAAa,KAAM,KAAM,MAAO,SAAU,KAAM,KAAM,aAAc,MAAO,SAAU,WAAY,WAAY,SAAU,UAAW,OAAQ,OAAQ,UAAW,WAAY,KAAM,UAAW,YAAa,WAAY,OAAQ,UAAW,MAAO,UAAW,KAAM,KAAM,UAAW,UAAW,UAAW,WAAY,MAAO,KAAM,KAAM,MAAO,UAAW,aAAc,KAAM,MAAO,UAAW,OAAQ,YAAa,SAAU,KAAM,MAAO,UAAW,SAAU,KAAM,OAAQ,KAAM,KAAM,OAAQ,KAAM,KAAM,OAAQ,KAAM,KAAM,OAAQ,QAAS,QAAS,KAAM,QAAS,MAAO,SAAU,QAAS,KAAM,QAAS,MAAO,MAAO,KAAM,OAAQ,SAAU,MAAO,MAAO,KAAM,KAAM,KAAM,WAAY,SAAU,QAAS,QAAS,KAAM,KAAM,KAAM,QAAS,UAAW,OAAQ,KAAM,KAAM,UAAW,UAAW,OAAQ,aAAc,OAAQ,OAAQ,SAAU,SAAU,MAAO,KAAM,KAAM,KAAM,WAAY,UAAW,QAAS,QAAS,OAAQ,UAAW,QAAS,MAAO,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,MAAO,KAAM,KAAM,OAAQ,aAAc,KAAM,aAAc,OAAQ,MAAO,MAAO,YAAa,SAAU,MAAO,gBAAiB,cAAe,KAAM,KAAM,KAAM,QAAS,KAAM,KAAM,MAAO,MAAO,KAAM,QAAS,KAAM,KAAM,OAAQ,SAAU,KAAM,SAAU,SAAU,OAAQ,KAAM,KAAM,KAAM,KAAM,MAAO,UAAW,OAAQ,KAAM,KAAM,QAAS,KAAM,KAAM,MAAO,OAAQ,KAAM,KAAM,QAAS,KAAM,KAAM,UAAW,OAAQ,MAAO,UAAW,SAAU,KAAM,KAAM,MAAO,QAAS,QAAS,OAAQ,KAAM,OAAQ,OAAQ,WAAY,UAAW,OAAQ,OAAQ,KAAM,QAAS,SAAU,QAAS,QAAS,KAAM,KAAM,KAAM,OAAQ,KAAM,OAAQ,SAAU,KAAM,KAAM,KAAM,SAAU,SAAU,aAAc,QAAS,SAAU,YAAa,WAAY,KAAM,KAAM,KAAM,QAAS,OAAQ,YAAa,OAAQ,WAAY,OAAQ,KAAM,KAAM,QAAS,MAAO,OAAQ,KAAM,KAAM,KAAM,KAAM,KAAM,OAAQ,OAAQ,MAAO,SAAU,QAAS,SAAU,WAAY,SAAU,cAAe,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,SAAU,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,SAAU,OAAQ,OAAQ,KAAM,KAAM,MAAO,UAAW,UAAW,MAAO,QAAS,KAAM,KAAM,MAAO,MAAO,KAAM,OAAQ,QAAS,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,MAAO,KAAM,MAAO,KAAM,UAAW,KAAM,MAAO,MAAO,MAAO,MAAO,MAAO,UAAW,QAAS,SAAU,MAAO,KAAM,QAAS,WAAY,QAAS,QAAS,KAAM,KAAM,KAAM,KAAM,WAAY,QAAS,cAAe,SAAU,SAAU,OAAQ,WAAY,OAAQ,QAAS,KAAM,KAAM,QAAS,WAAY,KAAM,KAAM,OAAQ,QAAS,OAAQ,OAAQ,KAAM,QAAS,QAAS,MAAO,OAAQ,cAAe,OAAQ,aAAc,WAAY,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,OAAQ,SAAU,KAAM,UAAW,UAAW,MAAO,QAAS,QAAS,SAAU,OAAQ,MAAO,UAAW,SAAU,SAAU,aAAc,OAAQ,aAAc,UAAW,OAAQ,MAAO,MAAO,KAAM,QAAS,QAAS,KAAM,OAAQ,KAAM,OAAQ,KAAM,SAAU,KAAM,WAAY,OAAQ,UAAW,OAAQ,OAAQ,KAAM,KAAM,MAAO,MAAO,UAAW,SAAU,UAAW,UAAW,OAAQ,KAAM,KAAM,WAAY,MAAO,OAAQ,KAAM,KAAM,UAAW,QAAS,UAAW,KAAM,UAAW,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,SAAU,WAAY,OAAQ,QAAS,YAAa,MAAO,QAAS,UAAW,KAAM,KAAM,QAAS,KAAM,WAAY,SAAU,UAAW,OAAQ,UAAW,SAAU,KAAM,KAAM,KAAM,SAAU,UAAW,KAAM,SAAU,QAAS,SAAU,MAAO,KAAM,KAAM,aAAc,MAAO,UAAW,SAAU,KAAM,KAAM,KAAM,SAAU,OAAQ,QAAS,QAAS,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,QAAS,QAAS,QAAS,MAAO,UAAW,OAAQ,OAAQ,KAAM,KAAM,QAAS,WAAY,SAAU,QAAS,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,aAAc,MAAO,MAAO,KAAM,KAAM,KAAM,KAAM,YAAa,KAAM,KAAM,QAAS,WAAY,eAAgB,MAAO,KAAM,KAAM,SAAU,QAAS,SAAU,SAAU,aAAc,KAAM,QAAS,OAAQ,SAAU,OAAQ,SAAU,KAAM,QAAS,OAAQ,QAAS,SAAU,UAAW,MAAO,UAAW,KAAM,UAAW,OAAQ,OAAQ,cAAe,MAAO,OAAQ,QAAS,QAAS,KAAM,MAAO,MAAO,KAAM,KAAM,KAAM,KAAM,OAAQ,KAAM,OAAQ,KAAM,KAAM,KAAM,MAAO,SAAU,MAAO,SAAU,OAAQ,MAAO,MAAO,MAAO,KAAM,cAAe,KAAM,KAAM,KAAM,OAAQ,MAAO,MAAO,KAAM,KAAM,KAAM,KAAM,QAAS,OAAQ,OAAQ,OAAQ,KAAM,QAAS,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,MAAO,UAAW,OAAQ,QAAS,SAAU,QAAS,SAAU,QAAS,SAAU,WAAY,SAAU,OAAQ,KAAM,KAAM,OAAQ,MAAO,QAAS,MAAO,KAAM,OAAQ,MAAO,OAAQ,KAAM,OAAQ,KAAM,KAAM,mBAAoB,oBAAqB,KAAM,MAAO,MAAO,KAAM,SAAU,UAAW,MAAO,SAAU,KAAM,MAAO,MAAO,SAAU,SAAU,KAAM,OAAQ,WAAY,UAAW,KAAM,KAAM,MAAO,KAAM,OAAQ,UAAW,MCDtrN,SAASa,EAAchG,GAIpC,IAHA,IAAIiG,EAAYjG,EAAI1P,OAChB4V,EAAkBlG,EAAI5K,MAAM,KAAK9E,OAAS,EAC1C6V,EAAmBnG,EAAI5K,MAAM,KAAK9E,OAAS,EACzC6V,EAAmBD,GACO,MAA9BlG,EAAI1L,OAAO2R,EAAY,IACvBjG,EAAMA,EAAIzL,OAAO,EAAG0R,EAAY,GAChCE,IACAF,IAKF,OAHGC,EAAkBC,IACnBnG,EAAMA,EAAIwF,QAAQ,OAAQ,KAErBxF,E,uBCrBM,SAASoG,EAAgBC,GACtC,MAAMC,GAAU,QAAYD,GAAWb,QAAQ,UAAW,IAO1D,GAAI,mBAAqBc,GAOzB,OAAOA,ECDM,SAASC,EAAclC,GACpC,IAAIoB,EACAe,EAAMnC,EACV,MAAM/D,EAA4B,GAClC,IAAImG,EACAC,EAAY,EAGhB,IADA,eAAyB,EAClBjB,EAAQe,EAAIf,MAAM,OAAgB,CAKvC,GAJAgB,EAAaC,EAAYjB,EAAM9K,MAI5B8K,EAAM,GACPnF,EAAS1O,KAAK,CACZwL,EAAG,uBACHtC,OAAQ2L,EAAahB,EAAM,GAAGnV,OAC9BA,OAAQmV,EAAM,GAAGnV,OAASmV,EAAM,GAAGnV,cAEhC,GAAGmV,EAAM,GACd,GAAG,EAAAkB,EAAA,KAAmBlB,EAAM,IAC1BnF,EAAS1O,KAAK,CACZwL,EAAG,qBACHtC,OAAQ2L,EACRnW,OAAQmV,EAAM,GAAGnV,aAEd,CACL,IAAI0P,EACA4G,EAAWnB,EAAM,GACrB,MAAMoB,EAAMpB,EAAM,GAElB,GAAGoB,GAKD,GAJID,GAAkC,SAArBC,EAAItS,OAAO,EAAG,KAAqD,IAApC,UAAYsS,EAAIC,iBAC9DF,EAAW,WAGVA,EAAU,CACX,MAAMG,EAAWf,EAAcP,EAAM,IAClCsB,EAASzW,SAAWmV,EAAM,GAAGnV,SAE9BmV,EAAM,GAAKsB,GAGb/G,GAAOyF,EAAM,GAAK,GAAKmB,GAAYnB,EAAM,SAG3CzF,GAAOyF,EAAM,GAAK,GAAK,WAAaA,EAAM,GAGzCzF,GACDM,EAAS1O,KAAK,CACZwL,EAAG,mBACHtC,OAAQ2L,EACRnW,OAAQmV,EAAM,GAAGnV,cAIlB,GAAGmV,EAAM,GACdnF,EAAS1O,KAAK,CACZwL,EAAG,yBACHtC,OAAQ2L,EACRnW,OAAQ,SAEL,GAAGmV,EAAM,GAAI,CAClB,MAAMa,EAAUF,EAAgBX,EAAM,IACnCa,GACDhG,EAAS1O,KAAK,CACZwL,EAAG,qBACHtC,OAAQ2L,EACRnW,OAAQmV,EAAM,GAAGnV,OACjB0W,QAASV,SAGLb,EAAM,IACdnF,EAAS1O,KAAK,CACZwL,EAAG,uBACHtC,OAAQ2L,GAAchB,EAAM,IAAMA,EAAM,IAAInV,OAAS,GACrDA,OAAQmV,EAAM,IAAInV,SAEZmV,EAAM,KACdnF,EAAS1O,KAAK,CACZwL,EAAG,0BACHtC,OAAQ2L,GAAchB,EAAM,IAAMA,EAAM,IAAInV,OAAS,IAAMmV,EAAM,IAAMA,EAAM,IAAInV,OAAS,GAC1FA,OAAQ,EAAImV,EAAM,IAAInV,QAAUmV,EAAM,IAAM,EAAIA,EAAM,IAAInV,OAAS,GACnE2W,QAAQ,IAIZT,EAAMA,EAAIjS,OAAOkR,EAAM9K,MAAQ8K,EAAM,GAAGnV,QACxCoW,GAAajB,EAAM9K,MAAQ8K,EAAM,GAAGnV,OAMtC,OAAOgQ,I,4EC/FM,SAAS4G,EAAcV,EAAarB,EAAkCgC,GAKnF,MAAM7G,EAA4B,GAClC,IAAI8G,GAAe,EACnB,MAAMC,EAActD,IAA2B,OAAsBoB,EAAiBpB,GAAyDqD,GAAe,GAA7D9G,EAAS1O,KAAKmS,GAASqD,GAAe,GAEjIE,EAAyB,GAC/B,IAAmB7B,EAAfiB,EAAY,EAChB,KAAMjB,EAAQe,EAAIf,MAAM,OAAmB,CACzC,MAAMgB,EAAaC,EAAYjB,EAAM9K,MACrC2M,EAAa1V,KAAK4U,EAAIjS,OAAO,EAAGkR,EAAM9K,QACtC,MAAM0J,EAAQoB,EAAM,IAAMA,EAAM,IAAMA,EAAM,KAAOA,EAAM,IAKzD,IAAI1B,EAEJ,GANA2C,GAAarC,EAAK/T,OAElBoW,GAAarC,EAAK/T,OAGlB8W,GAAe,EACZ/C,EAAKoB,MAAM,QACZ6B,EAAa1V,KAAK6T,EAAM,SACnB,GAAGA,EAAM,GACd1B,EAAS,CACP3G,EAAG,mBACHmK,SAAU,GACVzM,OAAQ2L,EAAahB,EAAM,GAAGnV,OAC9BA,OAAQ+T,EAAK/T,QAGZ+W,EAAWtD,KACI,OAAb0B,EAAM,KACPA,EAAM,GAAK,GACXiB,GAAa,GAGfY,EAAa1V,KAAK6T,EAAM,GAAKpB,EAAOoB,EAAM,IAE1CiB,GAAajB,EAAM,GAAGnV,OAASmV,EAAM,GAAGnV,aAErC,GAAGmV,EAAM,GAAI,CAClB,MAAM+B,EAAqB,MAAb/B,EAAM,GAEpB1B,EAAS,CACP3G,EAAG,KAAkBqI,EAAM,IAE3B3K,OAAQ2L,GAAce,EAAQ,EAAI/B,EAAM,GAAGnV,QAC3CA,OAAQ+T,EAAK/T,QAGZ+W,EAAWtD,KACRyD,EAGFF,EAAa1V,KAAKyS,GAFlBiD,EAAa1V,KAAK6T,EAAM,GAAKpB,EAAOoB,EAAM,IAK5CiB,GAA+B,EAAlBjB,EAAM,GAAGnV,QAAckX,EAAQ,EAAI,SAE1C/B,EAAM,KACd1B,EAAS,CACP3G,EAAG,2BACHP,QAAS4I,EAAM,IAAIgC,WACnB3M,OAAQ2L,EACRnW,OAAQ+T,EAAK/T,QAGZ+W,EAAWtD,KACZuD,EAAa1V,KAAKyS,GAElBqC,GAAajB,EAAM,GAAGnV,OAAS+T,EAAK/T,SAE9BmV,EAAM,MACd1B,EAAS,CACP3G,EAAG,uBACH4C,IAAKyF,EAAM,IACX3K,OAAQ2L,EACRnW,OAAQ+T,EAAK/T,QAGZ+W,EAAWtD,KACZuD,EAAa1V,KAAKyS,GAElBqC,GAAajB,EAAM,IAAInV,OAAS+T,EAAK/T,SAIrC8W,GACFE,EAAa1V,KAAK6T,EAAM,IAG1Be,EAAMA,EAAIjS,OAAOkR,EAAM9K,MAAQ8K,EAAM,GAAGnV,QACxCoW,GAAajB,EAAM9K,MAAQ8K,EAAM,GAAGnV,OAGtCgX,EAAa1V,KAAK4U,GAClB,IAAIkB,EAAUJ,EAAazC,KAAK,IAC5B6C,EAAQlC,QAAQ,OAAQ,IAAIlV,SAC9BoX,EAAUlB,EACVlG,EAASxN,OAAO,EAAGwN,EAAShQ,UAQ9B,OAAc6U,EAAiB7E,IAC/B,OAAoB6E,GAEpB,IAAI7U,EAASoX,EAAQpX,OACrB,IAAI6W,EAAQ,CAEVO,EAAUA,EAAQlC,QAAQ,OAAQ,IAElC,IAAI9N,EAAOpH,EAASoX,EAAQpX,OACzBoH,GACDyN,EAAgBzP,SAASqO,IACvBA,EAAOjJ,OAAS5G,KAAKmH,IAAI,EAAG0I,EAAOjJ,OAASpD,MAKhDgQ,EAAUA,EAAQlC,QAAQ,OAAQ,IAClC9N,EAAOpH,EAASoX,EAAQpX,OACxBA,EAASoX,EAAQpX,OACdoH,GACDyN,EAAgBzP,SAASqO,IACnBA,EAAOjJ,OAASiJ,EAAOzT,OAAUA,IACnCyT,EAAOzT,OAASA,EAASyT,EAAOjJ,WAMxC,OAAO4M,I,eCvJM,SAASC,EAAarH,GACnCA,EAAS1K,MAAK,CAACM,EAAGC,IACRD,EAAE4E,OAAS3E,EAAE2E,QAAY3E,EAAE7F,OAAS4F,EAAE5F,S,gECQnC,SAASsX,EAAcvD,EAAc/D,EAA4B,IAO9E,OANAA,EAAS5K,SAASqO,IACA,yBAAbA,EAAO3G,IACRiH,GAAO,OAAcA,EAAMN,GAAQM,SAIhCA,I,6CCLM,MAAMwD,EAInBnY,YAAoB+P,EAA4CqI,EAAW,GAAvD,KAAArI,QAAAA,EAA4C,KAAAqI,SAAAA,EAHxD,KAAAC,UAAqC,IAAIjS,IAM1CkS,YAAY5I,EAAgB6I,GASjC,GAJG/X,KAAKuP,SAAWwI,EAAWC,SAC5BD,GAAa,QAAkBA,EAAY/X,KAAKuP,WAG9CwI,EAEF,OADA/X,KAAK6X,UAAU3W,OAAOgO,IACf,EAGTlP,KAAK6X,UAAUI,IAAI/I,EAAI6I,GAiBjBG,QAAQC,GACd,MAAMC,EAAwG,GACxGP,EAAY7X,KAAK6X,UACjBQ,EAAaF,EAAMjT,MAAM,KACzBoT,EAAmBD,EAAWjY,OAwBpC,OAvBAyX,EAAUrS,SAAQ,CAAC+S,EAAUC,KAC3B,IAAI5M,GAAQ,EACR6M,EAAa,EACjB,IAAI,IAAIxW,EAAI,EAAGA,EAAIqW,IAAoBrW,EAAG,CACxC,MAAMyW,EAAOL,EAAWpW,GAClByH,EAAM6O,EAAS9V,QAAQiW,GAC7B,IAAY,IAAThP,GAAuB,IAARA,GAAmC,MAAtB6O,EAAS7O,EAAM,GAA0D,CACtGkC,GAAQ,EACR,MAGF6M,GAAcC,EAAKtY,OAGrB,GAAGwL,EAAO,CACR6M,GAAcH,EAAmB,EACjC,MAAMK,EAAiBJ,EAASnY,QAC7BJ,KAAK4X,UAAYa,GAAcE,GAAkBF,IAClDL,EAAa1W,KAAK,CAAC6W,SAAAA,EAAUI,eAAAA,EAAgBH,KAAAA,EAAMC,WAAAA,QAKlDL,EAGFQ,OAAOT,GACTnY,KAAKuP,UACN4I,GAAQ,QAAkBA,EAAOnY,KAAKuP,UAGxC,MACM6I,EADUD,EAAMjT,MAAM,KACSa,KAAKoS,GAAUnY,KAAKkY,QAAQC,KCxFxDU,QAAO,CAACC,EAAKC,KAASD,EAAIpX,QAAQqX,GAAMD,IAAM,ID+FvD,OALAV,EAAa1S,MAAK,CAACM,EAAGC,IAAMD,EAAE2S,eAAiB1S,EAAE0S,gBAAkB1S,EAAEwS,WAAazS,EAAEyS,aAG7C,IAAInZ,IAAI8Y,EAAarS,KAAKR,GAAMA,EAAEiT","sources":["webpack://tweb/./src/components/lazyLoadQueueBase.ts","webpack://tweb/./src/config/latinizeMap.ts","webpack://tweb/./src/helpers/array/filterUnique.ts","webpack://tweb/./src/helpers/array/forEachReverse.ts","webpack://tweb/./src/helpers/array/insertInDescendSortedArray.ts","webpack://tweb/./src/helpers/assumeType.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./src/helpers/callbackify.ts","webpack://tweb/./src/helpers/getFileNameForUpload.ts","webpack://tweb/./src/helpers/object/getDeepProperty.ts","webpack://tweb/./src/helpers/object/getObjectKeysAndSort.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/slicedArray.ts","webpack://tweb/./src/helpers/compareValue.ts","webpack://tweb/./src/helpers/long/compareLong.ts","webpack://tweb/./src/lib/appManagers/utils/chats/getParticipantPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/chats/hasRights.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndex.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndexKey.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileLocation.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadFileNameFromOptions.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadMediaDetails.ts","webpack://tweb/./src/lib/appManagers/utils/webDocs/getWebDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/drafts/draftsAreEqual.ts","webpack://tweb/./src/lib/appManagers/utils/inlineBots/generateQId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/generateMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/getServerMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/clearMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/index.ts","webpack://tweb/./src/lib/appManagers/utils/messages/filterMessagesByInputFilter.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getAlbumText.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/reactions/reactionsEqual.ts","webpack://tweb/./src/lib/appManagers/utils/stickers/getStickerEffectThumb.ts","webpack://tweb/./src/lib/appManagers/utils/users/canSendToUser.ts","webpack://tweb/./src/lib/appManagers/utils/webDocs/isWebDocument.ts","webpack://tweb/./src/lib/mtproto/connectionStatus.ts","webpack://tweb/./src/lib/richTextProcessor/combineSameEntities.ts","webpack://tweb/./src/lib/richTextProcessor/encodeSpoiler.ts","webpack://tweb/./src/lib/richTextProcessor/spoiler.ts","webpack://tweb/./src/lib/richTextProcessor/findConflictingEntity.ts","webpack://tweb/./src/lib/richTextProcessor/fixEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrl.ts","webpack://tweb/./src/lib/richTextProcessor/mergeEntities.ts","webpack://tweb/./src/config/tld.ts","webpack://tweb/./src/lib/richTextProcessor/checkBrackets.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiUnified.ts","webpack://tweb/./src/lib/richTextProcessor/parseEntities.ts","webpack://tweb/./src/lib/richTextProcessor/parseMarkdown.ts","webpack://tweb/./src/lib/richTextProcessor/sortEntities.ts","webpack://tweb/./src/lib/richTextProcessor/wrapPlainText.ts","webpack://tweb/./src/lib/searchIndex.ts","webpack://tweb/./src/helpers/array/flatten.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport {Middleware} from '../helpers/middleware';\nimport throttle from '../helpers/schedulers/throttle';\nimport {logger, LogTypes} from '../lib/logger';\n\nconst PARALLEL_LIMIT = 8;\nconst IGNORE_ERRORS: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE', 'MIDDLEWARE', 'NO_AUTO_DOWNLOAD']);\n\nexport type LazyLoadElementBase = {\n load: () => Promise,\n middleware?: Middleware\n};\n\nexport default class LazyLoadQueueBase {\n public queueId = 0;\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n protected lockPromise: Promise = null;\n protected unlockResolve: () => void = null;\n\n protected log = logger('LL', LogTypes.Error);\n protected processQueue: () => void;\n\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\n this.processQueue = throttle(() => this._processQueue(), 8, false);\n }\n\n public clear() {\n this.inProcess.clear(); // ацтеки забьются, будет плохо\n\n this.queue.length = 0;\n // unreachable code\n /* for(let item of this.inProcess) {\n this.lazyLoadMedia.push(item);\n } */\n }\n\n public lock() {\n if(this.lockPromise) return;\n\n // const perf = performance.now();\n this.lockPromise = new Promise((resolve, reject) => {\n this.unlockResolve = resolve;\n });\n\n /* if(DEBUG) {\n this.lockPromise.then(() => {\n this.log('was locked for:', performance.now() - perf);\n });\n } */\n }\n\n public unlock() {\n if(!this.unlockResolve) return;\n\n this.unlockResolve();\n this.unlockResolve = this.lockPromise = null;\n\n this.processQueue();\n }\n\n protected async processItem(item: LazyLoadElementBase) {\n if(this.lockPromise) {\n return;\n }\n\n this.inProcess.add(item);\n\n /* if(DEBUG) {\n this.log('will load media', this.lockPromise, item);\n } */\n\n try {\n // await new Promise((resolve) => setTimeout(resolve, 2e3));\n // await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\n // await item.load(item.div);\n await this.loadItem(item);\n } catch(err) {\n if(!IGNORE_ERRORS.has((err as ApiError)?.type)) {\n this.log.error('loadMediaQueue error:', err/* , item */);\n }\n }\n\n this.inProcess.delete(item);\n\n /* if(DEBUG) {\n this.log('loaded media', item);\n } */\n\n this.processQueue();\n }\n\n protected loadItem(item: LazyLoadElementBase) {\n return item.load();\n }\n\n protected getItem() {\n return this.queue.shift();\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\n this.queue[method](el);\n this.processQueue();\n }\n\n protected _processQueue(item?: LazyLoadElementBase) {\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\n\n // console.log('_processQueue start');\n // let added = 0;\n do {\n if(item) {\n indexOfAndSplice(this.queue, item);\n } else {\n item = this.getItem();\n }\n\n if(item) {\n this.processItem(item);\n } else {\n break;\n }\n\n item = null;\n // ++added;\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\n // console.log('_processQueue end, added', added, this.queue.length);\n }\n\n public push(el: LazyLoadElementBase) {\n this.addElement('push', el);\n }\n\n public unshift(el: LazyLoadElementBase) {\n this.addElement('unshift', el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\nconst LatinizeMap: {[k: string]: string} = {'Á': 'A', 'Ă': 'A', 'Ắ': 'A', 'Ặ': 'A', 'Ằ': 'A', 'Ẳ': 'A', 'Ẵ': 'A', 'Ǎ': 'A', 'Â': 'A', 'Ấ': 'A', 'Ậ': 'A', 'Ầ': 'A', 'Ẩ': 'A', 'Ẫ': 'A', 'Ä': 'A', 'Ǟ': 'A', 'Ȧ': 'A', 'Ǡ': 'A', 'Ạ': 'A', 'Ȁ': 'A', 'À': 'A', 'Ả': 'A', 'Ȃ': 'A', 'Ā': 'A', 'Ą': 'A', 'Å': 'A', 'Ǻ': 'A', 'Ḁ': 'A', 'Ⱥ': 'A', 'Ã': 'A', 'Ꜳ': 'AA', 'Æ': 'AE', 'Ǽ': 'AE', 'Ǣ': 'AE', 'Ꜵ': 'AO', 'Ꜷ': 'AU', 'Ꜹ': 'AV', 'Ꜻ': 'AV', 'Ꜽ': 'AY', 'Ḃ': 'B', 'Ḅ': 'B', 'Ɓ': 'B', 'Ḇ': 'B', 'Ƀ': 'B', 'Ƃ': 'B', 'Ć': 'C', 'Č': 'C', 'Ç': 'C', 'Ḉ': 'C', 'Ĉ': 'C', 'Ċ': 'C', 'Ƈ': 'C', 'Ȼ': 'C', 'Ď': 'D', 'Ḑ': 'D', 'Ḓ': 'D', 'Ḋ': 'D', 'Ḍ': 'D', 'Ɗ': 'D', 'Ḏ': 'D', 'Dz': 'D', 'Dž': 'D', 'Đ': 'D', 'Ƌ': 'D', 'DZ': 'DZ', 'DŽ': 'DZ', 'É': 'E', 'Ĕ': 'E', 'Ě': 'E', 'Ȩ': 'E', 'Ḝ': 'E', 'Ê': 'E', 'Ế': 'E', 'Ệ': 'E', 'Ề': 'E', 'Ể': 'E', 'Ễ': 'E', 'Ḙ': 'E', 'Ë': 'E', 'Ė': 'E', 'Ẹ': 'E', 'Ȅ': 'E', 'È': 'E', 'Ẻ': 'E', 'Ȇ': 'E', 'Ē': 'E', 'Ḗ': 'E', 'Ḕ': 'E', 'Ę': 'E', 'Ɇ': 'E', 'Ẽ': 'E', 'Ḛ': 'E', 'Ꝫ': 'ET', 'Ḟ': 'F', 'Ƒ': 'F', 'Ǵ': 'G', 'Ğ': 'G', 'Ǧ': 'G', 'Ģ': 'G', 'Ĝ': 'G', 'Ġ': 'G', 'Ɠ': 'G', 'Ḡ': 'G', 'Ǥ': 'G', 'Ḫ': 'H', 'Ȟ': 'H', 'Ḩ': 'H', 'Ĥ': 'H', 'Ⱨ': 'H', 'Ḧ': 'H', 'Ḣ': 'H', 'Ḥ': 'H', 'Ħ': 'H', 'Í': 'I', 'Ĭ': 'I', 'Ǐ': 'I', 'Î': 'I', 'Ï': 'I', 'Ḯ': 'I', 'İ': 'I', 'Ị': 'I', 'Ȉ': 'I', 'Ì': 'I', 'Ỉ': 'I', 'Ȋ': 'I', 'Ī': 'I', 'Į': 'I', 'Ɨ': 'I', 'Ĩ': 'I', 'Ḭ': 'I', 'Ꝺ': 'D', 'Ꝼ': 'F', 'Ᵹ': 'G', 'Ꞃ': 'R', 'Ꞅ': 'S', 'Ꞇ': 'T', 'Ꝭ': 'IS', 'Ĵ': 'J', 'Ɉ': 'J', 'Ḱ': 'K', 'Ǩ': 'K', 'Ķ': 'K', 'Ⱪ': 'K', 'Ꝃ': 'K', 'Ḳ': 'K', 'Ƙ': 'K', 'Ḵ': 'K', 'Ꝁ': 'K', 'Ꝅ': 'K', 'Ĺ': 'L', 'Ƚ': 'L', 'Ľ': 'L', 'Ļ': 'L', 'Ḽ': 'L', 'Ḷ': 'L', 'Ḹ': 'L', 'Ⱡ': 'L', 'Ꝉ': 'L', 'Ḻ': 'L', 'Ŀ': 'L', 'Ɫ': 'L', 'Lj': 'L', 'Ł': 'L', 'LJ': 'LJ', 'Ḿ': 'M', 'Ṁ': 'M', 'Ṃ': 'M', 'Ɱ': 'M', 'Ń': 'N', 'Ň': 'N', 'Ņ': 'N', 'Ṋ': 'N', 'Ṅ': 'N', 'Ṇ': 'N', 'Ǹ': 'N', 'Ɲ': 'N', 'Ṉ': 'N', 'Ƞ': 'N', 'Nj': 'N', 'Ñ': 'N', 'NJ': 'NJ', 'Ó': 'O', 'Ŏ': 'O', 'Ǒ': 'O', 'Ô': 'O', 'Ố': 'O', 'Ộ': 'O', 'Ồ': 'O', 'Ổ': 'O', 'Ỗ': 'O', 'Ö': 'O', 'Ȫ': 'O', 'Ȯ': 'O', 'Ȱ': 'O', 'Ọ': 'O', 'Ő': 'O', 'Ȍ': 'O', 'Ò': 'O', 'Ỏ': 'O', 'Ơ': 'O', 'Ớ': 'O', 'Ợ': 'O', 'Ờ': 'O', 'Ở': 'O', 'Ỡ': 'O', 'Ȏ': 'O', 'Ꝋ': 'O', 'Ꝍ': 'O', 'Ō': 'O', 'Ṓ': 'O', 'Ṑ': 'O', 'Ɵ': 'O', 'Ǫ': 'O', 'Ǭ': 'O', 'Ø': 'O', 'Ǿ': 'O', 'Õ': 'O', 'Ṍ': 'O', 'Ṏ': 'O', 'Ȭ': 'O', 'Ƣ': 'OI', 'Ꝏ': 'OO', 'Ɛ': 'E', 'Ɔ': 'O', 'Ȣ': 'OU', 'Ṕ': 'P', 'Ṗ': 'P', 'Ꝓ': 'P', 'Ƥ': 'P', 'Ꝕ': 'P', 'Ᵽ': 'P', 'Ꝑ': 'P', 'Ꝙ': 'Q', 'Ꝗ': 'Q', 'Ŕ': 'R', 'Ř': 'R', 'Ŗ': 'R', 'Ṙ': 'R', 'Ṛ': 'R', 'Ṝ': 'R', 'Ȑ': 'R', 'Ȓ': 'R', 'Ṟ': 'R', 'Ɍ': 'R', 'Ɽ': 'R', 'Ꜿ': 'C', 'Ǝ': 'E', 'Ś': 'S', 'Ṥ': 'S', 'Š': 'S', 'Ṧ': 'S', 'Ş': 'S', 'Ŝ': 'S', 'Ș': 'S', 'Ṡ': 'S', 'Ṣ': 'S', 'Ṩ': 'S', 'ẞ': 'SS', 'Ť': 'T', 'Ţ': 'T', 'Ṱ': 'T', 'Ț': 'T', 'Ⱦ': 'T', 'Ṫ': 'T', 'Ṭ': 'T', 'Ƭ': 'T', 'Ṯ': 'T', 'Ʈ': 'T', 'Ŧ': 'T', 'Ɐ': 'A', 'Ꞁ': 'L', 'Ɯ': 'M', 'Ʌ': 'V', 'Ꜩ': 'TZ', 'Ú': 'U', 'Ŭ': 'U', 'Ǔ': 'U', 'Û': 'U', 'Ṷ': 'U', 'Ü': 'U', 'Ǘ': 'U', 'Ǚ': 'U', 'Ǜ': 'U', 'Ǖ': 'U', 'Ṳ': 'U', 'Ụ': 'U', 'Ű': 'U', 'Ȕ': 'U', 'Ù': 'U', 'Ủ': 'U', 'Ư': 'U', 'Ứ': 'U', 'Ự': 'U', 'Ừ': 'U', 'Ử': 'U', 'Ữ': 'U', 'Ȗ': 'U', 'Ū': 'U', 'Ṻ': 'U', 'Ų': 'U', 'Ů': 'U', 'Ũ': 'U', 'Ṹ': 'U', 'Ṵ': 'U', 'Ꝟ': 'V', 'Ṿ': 'V', 'Ʋ': 'V', 'Ṽ': 'V', 'Ꝡ': 'VY', 'Ẃ': 'W', 'Ŵ': 'W', 'Ẅ': 'W', 'Ẇ': 'W', 'Ẉ': 'W', 'Ẁ': 'W', 'Ⱳ': 'W', 'Ẍ': 'X', 'Ẋ': 'X', 'Ý': 'Y', 'Ŷ': 'Y', 'Ÿ': 'Y', 'Ẏ': 'Y', 'Ỵ': 'Y', 'Ỳ': 'Y', 'Ƴ': 'Y', 'Ỷ': 'Y', 'Ỿ': 'Y', 'Ȳ': 'Y', 'Ɏ': 'Y', 'Ỹ': 'Y', 'Ź': 'Z', 'Ž': 'Z', 'Ẑ': 'Z', 'Ⱬ': 'Z', 'Ż': 'Z', 'Ẓ': 'Z', 'Ȥ': 'Z', 'Ẕ': 'Z', 'Ƶ': 'Z', 'IJ': 'IJ', 'Œ': 'OE', 'ᴀ': 'A', 'ᴁ': 'AE', 'ʙ': 'B', 'ᴃ': 'B', 'ᴄ': 'C', 'ᴅ': 'D', 'ᴇ': 'E', 'ꜰ': 'F', 'ɢ': 'G', 'ʛ': 'G', 'ʜ': 'H', 'ɪ': 'I', 'ʁ': 'R', 'ᴊ': 'J', 'ᴋ': 'K', 'ʟ': 'L', 'ᴌ': 'L', 'ᴍ': 'M', 'ɴ': 'N', 'ᴏ': 'O', 'ɶ': 'OE', 'ᴐ': 'O', 'ᴕ': 'OU', 'ᴘ': 'P', 'ʀ': 'R', 'ᴎ': 'N', 'ᴙ': 'R', 'ꜱ': 'S', 'ᴛ': 'T', 'ⱻ': 'E', 'ᴚ': 'R', 'ᴜ': 'U', 'ᴠ': 'V', 'ᴡ': 'W', 'ʏ': 'Y', 'ᴢ': 'Z', 'á': 'a', 'ă': 'a', 'ắ': 'a', 'ặ': 'a', 'ằ': 'a', 'ẳ': 'a', 'ẵ': 'a', 'ǎ': 'a', 'â': 'a', 'ấ': 'a', 'ậ': 'a', 'ầ': 'a', 'ẩ': 'a', 'ẫ': 'a', 'ä': 'a', 'ǟ': 'a', 'ȧ': 'a', 'ǡ': 'a', 'ạ': 'a', 'ȁ': 'a', 'à': 'a', 'ả': 'a', 'ȃ': 'a', 'ā': 'a', 'ą': 'a', 'ᶏ': 'a', 'ẚ': 'a', 'å': 'a', 'ǻ': 'a', 'ḁ': 'a', 'ⱥ': 'a', 'ã': 'a', 'ꜳ': 'aa', 'æ': 'ae', 'ǽ': 'ae', 'ǣ': 'ae', 'ꜵ': 'ao', 'ꜷ': 'au', 'ꜹ': 'av', 'ꜻ': 'av', 'ꜽ': 'ay', 'ḃ': 'b', 'ḅ': 'b', 'ɓ': 'b', 'ḇ': 'b', 'ᵬ': 'b', 'ᶀ': 'b', 'ƀ': 'b', 'ƃ': 'b', 'ɵ': 'o', 'ć': 'c', 'č': 'c', 'ç': 'c', 'ḉ': 'c', 'ĉ': 'c', 'ɕ': 'c', 'ċ': 'c', 'ƈ': 'c', 'ȼ': 'c', 'ď': 'd', 'ḑ': 'd', 'ḓ': 'd', 'ȡ': 'd', 'ḋ': 'd', 'ḍ': 'd', 'ɗ': 'd', 'ᶑ': 'd', 'ḏ': 'd', 'ᵭ': 'd', 'ᶁ': 'd', 'đ': 'd', 'ɖ': 'd', 'ƌ': 'd', 'ı': 'i', 'ȷ': 'j', 'ɟ': 'j', 'ʄ': 'j', 'dz': 'dz', 'dž': 'dz', 'é': 'e', 'ĕ': 'e', 'ě': 'e', 'ȩ': 'e', 'ḝ': 'e', 'ê': 'e', 'ế': 'e', 'ệ': 'e', 'ề': 'e', 'ể': 'e', 'ễ': 'e', 'ḙ': 'e', 'ë': 'e', 'ė': 'e', 'ẹ': 'e', 'ȅ': 'e', 'è': 'e', 'ẻ': 'e', 'ȇ': 'e', 'ē': 'e', 'ḗ': 'e', 'ḕ': 'e', 'ⱸ': 'e', 'ę': 'e', 'ᶒ': 'e', 'ɇ': 'e', 'ẽ': 'e', 'ḛ': 'e', 'ꝫ': 'et', 'ḟ': 'f', 'ƒ': 'f', 'ᵮ': 'f', 'ᶂ': 'f', 'ǵ': 'g', 'ğ': 'g', 'ǧ': 'g', 'ģ': 'g', 'ĝ': 'g', 'ġ': 'g', 'ɠ': 'g', 'ḡ': 'g', 'ᶃ': 'g', 'ǥ': 'g', 'ḫ': 'h', 'ȟ': 'h', 'ḩ': 'h', 'ĥ': 'h', 'ⱨ': 'h', 'ḧ': 'h', 'ḣ': 'h', 'ḥ': 'h', 'ɦ': 'h', 'ẖ': 'h', 'ħ': 'h', 'ƕ': 'hv', 'í': 'i', 'ĭ': 'i', 'ǐ': 'i', 'î': 'i', 'ï': 'i', 'ḯ': 'i', 'ị': 'i', 'ȉ': 'i', 'ì': 'i', 'ỉ': 'i', 'ȋ': 'i', 'ī': 'i', 'į': 'i', 'ᶖ': 'i', 'ɨ': 'i', 'ĩ': 'i', 'ḭ': 'i', 'ꝺ': 'd', 'ꝼ': 'f', 'ᵹ': 'g', 'ꞃ': 'r', 'ꞅ': 's', 'ꞇ': 't', 'ꝭ': 'is', 'ǰ': 'j', 'ĵ': 'j', 'ʝ': 'j', 'ɉ': 'j', 'ḱ': 'k', 'ǩ': 'k', 'ķ': 'k', 'ⱪ': 'k', 'ꝃ': 'k', 'ḳ': 'k', 'ƙ': 'k', 'ḵ': 'k', 'ᶄ': 'k', 'ꝁ': 'k', 'ꝅ': 'k', 'ĺ': 'l', 'ƚ': 'l', 'ɬ': 'l', 'ľ': 'l', 'ļ': 'l', 'ḽ': 'l', 'ȴ': 'l', 'ḷ': 'l', 'ḹ': 'l', 'ⱡ': 'l', 'ꝉ': 'l', 'ḻ': 'l', 'ŀ': 'l', 'ɫ': 'l', 'ᶅ': 'l', 'ɭ': 'l', 'ł': 'l', 'lj': 'lj', 'ſ': 's', 'ẜ': 's', 'ẛ': 's', 'ẝ': 's', 'ḿ': 'm', 'ṁ': 'm', 'ṃ': 'm', 'ɱ': 'm', 'ᵯ': 'm', 'ᶆ': 'm', 'ń': 'n', 'ň': 'n', 'ņ': 'n', 'ṋ': 'n', 'ȵ': 'n', 'ṅ': 'n', 'ṇ': 'n', 'ǹ': 'n', 'ɲ': 'n', 'ṉ': 'n', 'ƞ': 'n', 'ᵰ': 'n', 'ᶇ': 'n', 'ɳ': 'n', 'ñ': 'n', 'nj': 'nj', 'ó': 'o', 'ŏ': 'o', 'ǒ': 'o', 'ô': 'o', 'ố': 'o', 'ộ': 'o', 'ồ': 'o', 'ổ': 'o', 'ỗ': 'o', 'ö': 'o', 'ȫ': 'o', 'ȯ': 'o', 'ȱ': 'o', 'ọ': 'o', 'ő': 'o', 'ȍ': 'o', 'ò': 'o', 'ỏ': 'o', 'ơ': 'o', 'ớ': 'o', 'ợ': 'o', 'ờ': 'o', 'ở': 'o', 'ỡ': 'o', 'ȏ': 'o', 'ꝋ': 'o', 'ꝍ': 'o', 'ⱺ': 'o', 'ō': 'o', 'ṓ': 'o', 'ṑ': 'o', 'ǫ': 'o', 'ǭ': 'o', 'ø': 'o', 'ǿ': 'o', 'õ': 'o', 'ṍ': 'o', 'ṏ': 'o', 'ȭ': 'o', 'ƣ': 'oi', 'ꝏ': 'oo', 'ɛ': 'e', 'ᶓ': 'e', 'ɔ': 'o', 'ᶗ': 'o', 'ȣ': 'ou', 'ṕ': 'p', 'ṗ': 'p', 'ꝓ': 'p', 'ƥ': 'p', 'ᵱ': 'p', 'ᶈ': 'p', 'ꝕ': 'p', 'ᵽ': 'p', 'ꝑ': 'p', 'ꝙ': 'q', 'ʠ': 'q', 'ɋ': 'q', 'ꝗ': 'q', 'ŕ': 'r', 'ř': 'r', 'ŗ': 'r', 'ṙ': 'r', 'ṛ': 'r', 'ṝ': 'r', 'ȑ': 'r', 'ɾ': 'r', 'ᵳ': 'r', 'ȓ': 'r', 'ṟ': 'r', 'ɼ': 'r', 'ᵲ': 'r', 'ᶉ': 'r', 'ɍ': 'r', 'ɽ': 'r', 'ↄ': 'c', 'ꜿ': 'c', 'ɘ': 'e', 'ɿ': 'r', 'ś': 's', 'ṥ': 's', 'š': 's', 'ṧ': 's', 'ş': 's', 'ŝ': 's', 'ș': 's', 'ṡ': 's', 'ṣ': 's', 'ṩ': 's', 'ʂ': 's', 'ᵴ': 's', 'ᶊ': 's', 'ȿ': 's', 'ɡ': 'g', 'ß': 'ss', 'ᴑ': 'o', 'ᴓ': 'o', 'ᴝ': 'u', 'ť': 't', 'ţ': 't', 'ṱ': 't', 'ț': 't', 'ȶ': 't', 'ẗ': 't', 'ⱦ': 't', 'ṫ': 't', 'ṭ': 't', 'ƭ': 't', 'ṯ': 't', 'ᵵ': 't', 'ƫ': 't', 'ʈ': 't', 'ŧ': 't', 'ᵺ': 'th', 'ɐ': 'a', 'ᴂ': 'ae', 'ǝ': 'e', 'ᵷ': 'g', 'ɥ': 'h', 'ʮ': 'h', 'ʯ': 'h', 'ᴉ': 'i', 'ʞ': 'k', 'ꞁ': 'l', 'ɯ': 'm', 'ɰ': 'm', 'ᴔ': 'oe', 'ɹ': 'r', 'ɻ': 'r', 'ɺ': 'r', 'ⱹ': 'r', 'ʇ': 't', 'ʌ': 'v', 'ʍ': 'w', 'ʎ': 'y', 'ꜩ': 'tz', 'ú': 'u', 'ŭ': 'u', 'ǔ': 'u', 'û': 'u', 'ṷ': 'u', 'ü': 'u', 'ǘ': 'u', 'ǚ': 'u', 'ǜ': 'u', 'ǖ': 'u', 'ṳ': 'u', 'ụ': 'u', 'ű': 'u', 'ȕ': 'u', 'ù': 'u', 'ủ': 'u', 'ư': 'u', 'ứ': 'u', 'ự': 'u', 'ừ': 'u', 'ử': 'u', 'ữ': 'u', 'ȗ': 'u', 'ū': 'u', 'ṻ': 'u', 'ų': 'u', 'ᶙ': 'u', 'ů': 'u', 'ũ': 'u', 'ṹ': 'u', 'ṵ': 'u', 'ᵫ': 'ue', 'ꝸ': 'um', 'ⱴ': 'v', 'ꝟ': 'v', 'ṿ': 'v', 'ʋ': 'v', 'ᶌ': 'v', 'ⱱ': 'v', 'ṽ': 'v', 'ꝡ': 'vy', 'ẃ': 'w', 'ŵ': 'w', 'ẅ': 'w', 'ẇ': 'w', 'ẉ': 'w', 'ẁ': 'w', 'ⱳ': 'w', 'ẘ': 'w', 'ẍ': 'x', 'ẋ': 'x', 'ᶍ': 'x', 'ý': 'y', 'ŷ': 'y', 'ÿ': 'y', 'ẏ': 'y', 'ỵ': 'y', 'ỳ': 'y', 'ƴ': 'y', 'ỷ': 'y', 'ỿ': 'y', 'ȳ': 'y', 'ẙ': 'y', 'ɏ': 'y', 'ỹ': 'y', 'ź': 'z', 'ž': 'z', 'ẑ': 'z', 'ʑ': 'z', 'ⱬ': 'z', 'ż': 'z', 'ẓ': 'z', 'ȥ': 'z', 'ẕ': 'z', 'ᵶ': 'z', 'ᶎ': 'z', 'ʐ': 'z', 'ƶ': 'z', 'ɀ': 'z', 'ff': 'ff', 'ffi': 'ffi', 'ffl': 'ffl', 'fi': 'fi', 'fl': 'fl', 'ij': 'ij', 'œ': 'oe', 'st': 'st', 'ₐ': 'a', 'ₑ': 'e', 'ᵢ': 'i', 'ⱼ': 'j', 'ₒ': 'o', 'ᵣ': 'r', 'ᵤ': 'u', 'ᵥ': 'v', 'ₓ': 'x', 'Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'};\n\nexport default LatinizeMap;\n","export default function filterUnique>(arr: T): T {\n return [...new Set(arr)] as T;\n}\n","export default function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","export default function insertInDescendSortedArray(array: Array, element: T, getProperty: K, pos?: number): number;\nexport default function insertInDescendSortedArray(array: Array, element: T, getProperty: (element: T) => number, pos?: number): number;\nexport default function insertInDescendSortedArray(array: Array, element: T, getProperty: K | ((element: T) => T[K]), pos?: number): number {\n if(typeof(getProperty) !== 'function') {\n const property = getProperty;\n getProperty = (element) => element[property];\n }\n\n const sortProperty: number = getProperty(element);\n\n if(pos === undefined) {\n pos = array.indexOf(element);\n if(pos !== -1) {\n const prev = array[pos - 1];\n const next = array[pos + 1];\n if((!prev || getProperty(prev) >= sortProperty) && (!next || getProperty(next) <= sortProperty)) {\n // console.warn('same pos', pos, sortProperty, prev, next);\n return pos;\n }\n\n array.splice(pos, 1);\n }\n }\n\n const len = array.length;\n if(!len || sortProperty <= getProperty(array[len - 1])) {\n return array.push(element) - 1;\n } else if(sortProperty >= getProperty(array[0])) {\n array.unshift(element);\n return 0;\n } else {\n for(let i = 0; i < len; i++) {\n if(sortProperty > getProperty(array[i])) {\n array.splice(i, 0, element);\n return i;\n }\n }\n }\n\n console.error('wtf', array, element);\n return array.indexOf(element);\n}\n","export default function assumeType(x: unknown): asserts x is T {\r\n return; // ¯\\_(ツ)_/¯\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Awaited} from '../types';\n\nexport default function callbackify, R>(\n smth: T,\n callback: (result: Awaited) => R\n): Promise> | R {\n if(smth instanceof Promise) {\n // @ts-ignore\n return smth.then(callback);\n } else {\n return callback(smth as any);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport tabId from '../config/tabId';\r\n\r\nlet uploadId = 0;\r\nexport default function getFileNameForUpload(file: File | Blob) {\r\n let fileName: string;\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = `${tabId}_${uploadId++}.${mimeType.split('/')[1]}`;\r\n\r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n } else {\r\n fileName = `upload-${tabId}_${uploadId++}`;\r\n }\r\n\r\n return fileName;\r\n}\r\n","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","export default function getObjectKeysAndSort(object: {[key: string]: any} | Map, sort: 'asc' | 'desc' = 'asc') {\n if(!object) return [];\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map((i) => +i);\n if(sort === 'asc') return ids.sort((a, b) => a - b);\n else return ids.sort((a, b) => b - a);\n}\n","// * Jolly Cobra's schedulers\r\n\r\nimport ctx from '../../environment/ctx';\r\nimport {AnyFunction, Awaited} from '../../types';\r\nimport noop from '../noop';\r\n\r\nexport type DebounceReturnType = {\r\n (...args: Parameters): Promise>>;\r\n clearTimeout(): void;\r\n isDebounced(): boolean;\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 debounce.isDebounced = () => !!waitingTimeout;\r\n\r\n return debounce;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport indexOfAndSplice from './array/indexOfAndSplice';\r\nimport compareValue from './compareValue';\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number | string;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array {\r\n // slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n getEnds: () => {top: boolean, bottom: boolean, both: boolean};\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n // new(...items: T[]): Slice;\r\n new(length: number): Slice;\r\n}\r\n\r\nexport type SliceSerialized = {\r\n values: Slice,\r\n isEnd: {\r\n top: boolean,\r\n bottom: boolean,\r\n both: boolean\r\n }\r\n};\r\n\r\nexport type SlicedArraySerialized = {\r\n slices: SliceSerialized[]\r\n};\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n\r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n // first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array implements Slice {\r\n // slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n\r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n\r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n\r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n\r\n return isEnd;\r\n }\r\n\r\n getEnds() {\r\n return {\r\n top: this.isEnd(SliceEnd.Top),\r\n bottom: this.isEnd(SliceEnd.Bottom),\r\n both: this.isEnd(SliceEnd.Both)\r\n };\r\n }\r\n\r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end &= ~side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as ItemType[][];\r\n const idx = slices.indexOf(this);\r\n if(idx !== -1) {\r\n if(slices.length === 1) { // left empty slice without ends\r\n this.unsetEnd(SliceEnd.Both);\r\n } else { // delete this slice\r\n slices.splice(idx, 1);\r\n }\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n }\r\n }\r\n\r\n public constructSlice(...items: T[]) {\r\n // const slice = new Slice(this, ...items);\r\n // can't pass items directly to constructor because first argument is length\r\n const slice = new this.sliceConstructor(items.length);\r\n for(let i = 0, length = items.length; i < length; ++i) {\r\n slice[i] = items[i];\r\n }\r\n return slice;\r\n\r\n // ! code below will slow execution in 15 times\r\n /* const self = this;\r\n const p: Slice = new Proxy(slice, {\r\n get: function(target, name: any) {\r\n if(name === 'constructor') {\r\n const p = new Proxy(Slice, {\r\n construct: (target, args) => {\r\n return self.constructSlice(...args);\r\n }\r\n });\r\n\r\n return p;\r\n }\r\n\r\n return target[name];\r\n }\r\n });\r\n\r\n return p; */\r\n\r\n /*\r\n var p = slicedArray.constructSlice();\r\n p.length = 100000;\r\n p.fill(255);\r\n\r\n var a = new Array(100000);\r\n a.fill(255);\r\n\r\n var b = 0;\r\n var perf = performance.now();\r\n for(var i = 0; i < p.length; ++i) {\r\n b += p[i];\r\n }\r\n\r\n console.log('perf 1', performance.now() - perf);\r\n\r\n b = 0;\r\n perf = performance.now();\r\n for(var i = 0; i < a.length; ++i) {\r\n b += a[i];\r\n }\r\n\r\n console.log('perf 2', performance.now() - perf);\r\n */\r\n }\r\n\r\n public insertSlice(slice: T[], flatten = true) {\r\n if(!slice.length) {\r\n return;\r\n }\r\n\r\n const first = this.slices[0];\r\n if(!first.length) {\r\n first.push(...slice);\r\n return first;\r\n }\r\n\r\n const lowerBound = slice[slice.length - 1];\r\n const upperBound = slice[0];\r\n\r\n let foundSlice: Slice, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\r\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\r\n foundSlice = this.slices[foundSliceIndex];\r\n lowerIndex = foundSlice.indexOf(lowerBound);\r\n upperIndex = foundSlice.indexOf(upperBound);\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n break;\r\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\r\n break;\r\n }\r\n }\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n\r\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\r\n const sliced = slice.slice(foundSlice.length - upperIndex);\r\n foundSlice.push(...sliced);\r\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\r\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\r\n foundSlice.unshift(...sliced);\r\n } else {\r\n let insertIndex = 0;\r\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\r\n const s = this.slices[insertIndex];\r\n if(compareValue(slice[0], s[0]) === 1) {\r\n break;\r\n }\r\n }\r\n\r\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\r\n foundSliceIndex = insertIndex;\r\n }\r\n\r\n if(flatten) {\r\n return this.flatten(foundSliceIndex);\r\n }\r\n }\r\n\r\n private flatten(foundSliceIndex: number) {\r\n if(this.slices.length >= 2) {\r\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\r\n const prevSlice = this.slices[i];\r\n const nextSlice = this.slices[i + 1];\r\n\r\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\r\n if(upperIndex !== -1) {\r\n prevSlice.setEnd(nextSlice.end);\r\n this.slices.splice(i + 1, 1);\r\n\r\n if(i < foundSliceIndex) {\r\n --foundSliceIndex;\r\n }\r\n\r\n --length; // respect array bounds\r\n --i; // repeat from the same place\r\n\r\n this.insertSlice(nextSlice, false);\r\n }\r\n }\r\n }\r\n\r\n return this.slices[foundSliceIndex];\r\n }\r\n\r\n // *\r\n\r\n get first() {\r\n return this.slices[0];\r\n }\r\n\r\n get last() {\r\n return this.slices[this.slices.length - 1];\r\n }\r\n\r\n get slice() {\r\n return this.first;\r\n }\r\n\r\n get length() {\r\n return this.slice.length;\r\n }\r\n\r\n public findSlice(item: T) {\r\n for(let i = 0, length = this.slices.length; i < length; ++i) {\r\n const slice = this.slices[i];\r\n const index = slice.indexOf(item);\r\n if(index !== -1) {\r\n return {slice, index};\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n public findSliceOffset(maxId: T) {\r\n let slice: Slice;\r\n for(let i = 0; i < this.slices.length; ++i) {\r\n let offset = 0;\r\n slice = this.slices[i];\r\n if(slice.length < 2) {\r\n continue;\r\n }\r\n\r\n for(; offset < slice.length; ++offset) {\r\n if(compareValue(maxId, slice[offset]) >= 0) {\r\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\r\n return undefined;\r\n } */\r\n\r\n return {\r\n slice,\r\n offset: maxId === slice[offset] ? offset : offset - 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n if(slice && slice.isEnd(SliceEnd.Top)) {\r\n return {\r\n slice,\r\n offset: slice.length\r\n };\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n // * https://core.telegram.org/api/offsets\r\n public sliceMe(offsetId: T, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n const sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n const sliceEnd = sliceOffset + add_offset + limit;\r\n // const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n // sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n // if(topFulfilled) sliced.isEnd(SliceEnd.Top);\r\n // if(bottomFulfilled) sliced.isEnd(SliceEnd.Bottom);\r\n\r\n return {\r\n slice: sliced,\r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: T[]) {\r\n let slice = this.first;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Bottom);\r\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Bottom);\r\n this.slices.unshift(slice);\r\n }\r\n\r\n slice.unshift(...items);\r\n }\r\n\r\n public push(...items: T[]) {\r\n let slice = this.last;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Top);\r\n } else if(!slice.isEnd(SliceEnd.Top)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Top);\r\n this.slices.push(slice);\r\n }\r\n\r\n slice.push(...items);\r\n }\r\n\r\n public delete(item: T) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public deleteSlice(slice: Slice) {\r\n indexOfAndSplice(this.slices, slice);\r\n }\r\n\r\n public toJSON() {\r\n const slices: SlicedArraySerialized['slices'] = this.slices.map((slice) => {\r\n return {\r\n values: slice.slice(),\r\n isEnd: slice.getEnds()\r\n };\r\n });\r\n\r\n const serialized: SlicedArraySerialized = {\r\n slices\r\n };\r\n\r\n return JSON.stringify(serialized);\r\n }\r\n\r\n public static fromJSON(json: string) {\r\n const parsed: SlicedArraySerialized = JSON.parse(json);\r\n const sliced = new SlicedArray();\r\n parsed.slices.forEach((slice) => {\r\n const inserted = sliced.insertSlice(slice.values) || sliced.first;\r\n if(slice.isEnd.top) inserted.setEnd(SliceEnd.Top);\r\n if(slice.isEnd.bottom) inserted.setEnd(SliceEnd.Bottom);\r\n });\r\n\r\n return sliced;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","import compareLong from './long/compareLong';\n\nexport default function compareValue(val1: string | number, val2: typeof val1) {\n if((val1 as number).toExponential) {\n const diff = (val1 as number) - (val2 as number);\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n return compareLong(val1 as string, val2 as string);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function compareLong(str1: string, str2: string) {\n const str1Length = str1.length;\n if(str1Length !== str2.length) {\n const diff = str1Length - str2.length;\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n const maxPartLength = 15;\n for(let i = 0; i < str1Length; i += maxPartLength) {\n const v1 = +str1.slice(i, i + maxPartLength);\n const v2 = +str2.slice(i, i + maxPartLength);\n const diff = v1 - v2;\n if(diff) {\n return diff;\n }\n }\n\n return 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ChannelParticipant, ChatParticipant} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ?\n getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) :\n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Chat, ChatAdminRights, ChatBannedRights} from '../../../../layer';\nimport {ChatRights} from '../../appChatsManager';\n\n/**\n * Check the user's ability to do an action in chat\n * @param id\n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread\n * @returns\n */\nexport default function hasRights(chat: Chat, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n // (chat as any).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Dialog} from '../../../../layer';\nimport getDialogIndexKey from './getDialogIndexKey';\n\nexport default function getDialogIndex(\n dialog: Dialog.dialog,\n indexKey: ReturnType = getDialogIndexKey(dialog.folder_id)\n) {\n return dialog?.[indexKey];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {DialogFilter} from '../../../../layer';\n\nexport default function getDialogIndexKey(localId?: DialogFilter.dialogFilter['localId']) {\n return `index_${localId}` as const;\n // return filterId !== undefined && filterId > 1 ? `filter_${filterId}` as const : 'main' as const;\n // const indexStr = filterId > 1 ?\n // `index_${filterId}` as const :\n // 'index' as const;\n\n // return indexStr;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Document, PhotoSize, VideoSize} from '../../../../layer';\r\nimport type {DownloadOptions} from '../../../mtproto/apiFileManager';\r\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\r\n\r\nexport default function getDocumentDownloadOptions(doc: Document.document, thumb?: PhotoSize.photoSize | VideoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\r\n const inputFileLocation = getDocumentInputFileLocation(doc, thumb?.type);\r\n\r\n let mimeType: MTMimeType;\r\n if(thumb?._ === 'photoSize') {\r\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\r\n } else {\r\n mimeType = doc.mime_type || 'application/octet-stream';\r\n }\r\n\r\n return {\r\n dcId: doc.dc_id,\r\n location: inputFileLocation,\r\n size: thumb ? thumb.size : doc.size,\r\n mimeType,\r\n fileName: doc.file_name,\r\n queueId,\r\n onlyCache\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {Document, InputFileLocation} from '../../../../layer';\r\n\r\nexport default function getDocumentInputFileLocation(doc: Document.document, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\r\n return {\r\n _: 'inputDocumentFileLocation',\r\n id: doc.id,\r\n access_hash: doc.access_hash,\r\n file_reference: doc.file_reference,\r\n thumb_size: thumbSize\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\r\nimport {DownloadOptions} from '../../../mtproto/apiFileManager';\r\n\r\nexport default function getDownloadFileNameFromOptions(options: DownloadOptions) {\r\n return getFileNameByLocation(options.location, options);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {DownloadMediaOptions, DownloadOptions} from '../../../mtproto/apiFileManager';\r\nimport getDocumentDownloadOptions from '../docs/getDocumentDownloadOptions';\r\nimport getPhotoDownloadOptions from '../photos/getPhotoDownloadOptions';\r\nimport getWebDocumentDownloadOptions from '../webDocs/getWebDocumentDownloadOptions';\r\nimport isWebDocument from '../webDocs/isWebDocument';\r\nimport getDownloadFileNameFromOptions from './getDownloadFileNameFromOptions';\r\n\r\nexport default function getDownloadMediaDetails(options: DownloadMediaOptions) {\r\n const {media, thumb, queueId, onlyCache} = options;\r\n\r\n let downloadOptions: DownloadOptions;\r\n if(media._ === 'document') downloadOptions = getDocumentDownloadOptions(media, thumb as any, queueId, onlyCache);\r\n else if(media._ === 'photo') downloadOptions = getPhotoDownloadOptions(media, thumb as any, queueId, onlyCache);\r\n else if(isWebDocument(media)) downloadOptions = getWebDocumentDownloadOptions(media);\r\n\r\n downloadOptions.downloadId = options.downloadId;\r\n\r\n const fileName = getDownloadFileNameFromOptions(downloadOptions);\r\n return {fileName, downloadOptions};\r\n}\r\n","import {WebDocument} from '../../../../layer';\nimport {DownloadOptions} from '../../../mtproto/apiFileManager';\n\nexport default function getWebDocumentDownloadOptions(webDocument: WebDocument): DownloadOptions {\n return {\n dcId: 0,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (webDocument as WebDocument.webDocument).access_hash,\n url: webDocument.url\n },\n size: webDocument.size,\n mimeType: webDocument.mime_type\n };\n}\n","import deepEqual from '../../../../helpers/object/deepEqual';\nimport isObject from '../../../../helpers/object/isObject';\nimport {DraftMessage} from '../../../../layer';\n\nexport default function draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\n if(typeof(draft1) !== typeof(draft2)) {\n return false;\n }\n\n if(!isObject(draft1)) {\n return true;\n }\n\n if(draft1._ !== draft2._) {\n return false;\n }\n\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\n return false;\n }\n\n if(!deepEqual(draft1.entities, draft2.entities)) {\n return false;\n }\n\n if(draft1.message !== draft2.message) {\n return false;\n }\n\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\n return false;\n }\n }\n\n return true;\n}\n","import {MessagesBotResults} from '../../../../layer';\n\nexport default function generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\n return queryId + '_' + resultId;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MESSAGE_ID_OFFSET, MESSAGE_ID_INCREMENT} from '.';\n\nexport default function generateMessageId(messageId: number) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId >= q) {\n return messageId;\n }\n\n return q + (messageId * MESSAGE_ID_INCREMENT);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport clearMessageId from './clearMessageId';\n\n/**\n * * will ignore outgoing offset\n */\nexport default function getServerMessageId(messageId: number) {\n return clearMessageId(messageId, true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MESSAGE_ID_OFFSET, MESSAGE_ID_INCREMENT} from '.';\n\nexport default function clearMessageId(messageId: number, toServer?: boolean) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\n return messageId;\n }\n\n const l = MESSAGE_ID_INCREMENT - 1;\n const used = messageId & l;\n if(used !== l) {\n messageId -= used + 1;\n }\n\n return toServer ? (messageId - q) / MESSAGE_ID_INCREMENT : messageId;\n}\n","export const MESSAGE_ID_INCREMENT = 0x10000;\nexport const MESSAGE_ID_OFFSET = 0xFFFFFFFF;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageMedia, MessageEntity, MessageAction} from '../../../../layer';\nimport matchUrl from '../../../richTextProcessor/matchUrl';\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyInputMessagesFilter, MyMessage} from '../../appMessagesManager';\n\nexport default function filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: Array, limit: number) {\n if(inputFilter === 'inputMessagesFilterEmpty') {\n return history;\n }\n\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [],\n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n // excludeDocTypes.push('video');\n neededDocTypes.push(undefined, 'photo', 'pdf');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = history[i];\n if(!message) continue;\n\n // || (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n\n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc &&\n (\n (neededDocTypes.length && !neededDocTypes.includes(doc.type)) ||\n excludeDocTypes.includes(doc.type)\n )\n ) {\n continue;\n }\n\n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find((e) => goodEntities.includes(e._)) || matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] &&\n message.action &&\n ([\n 'messageActionChannelEditPhoto' as const,\n 'messageActionChatEditPhoto' as const,\n 'messageActionChannelEditVideo' as const,\n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find((flag) => message.pFlags[flag])) {\n found = true;\n } */\n\n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n}\n","import assumeType from '../../../../helpers/assumeType';\nimport {Message, MessageEntity} from '../../../../layer';\n\nexport default function getAlbumText(messages: Message.message[]) {\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const m of messages) {\n assumeType(m);\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n }\n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {PhotoSize, InputFileLocation} from '../../../../layer';\nimport type {DownloadOptions} from '../../../mtproto/apiFileManager';\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n // console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n\n // maybe it's a thumb\n const isPhoto = !!((photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference);\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id,\n location,\n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined,\n mimeType: 'image/jpeg',\n queueId,\n onlyCache\n };\n}\n","import deepEqual from '../../../../helpers/object/deepEqual';\nimport {Reaction} from '../../../../layer';\n\nexport default function reactionsEqual(r1: Reaction, r2: Reaction) {\n return deepEqual(r1, r2);\n}\n","import {MyDocument} from '../../appDocsManager';\n\nexport default function getStickerEffectThumb(doc: MyDocument) {\n return doc.video_thumbs?.[0];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {User} from '../../../../layer';\nimport {REPLIES_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function canSendToUser(user: User.user) {\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n}\n","import {WebDocument} from '../../../../layer';\n\nexport default function isWebDocument(webDocument: any): webDocument is WebDocument {\n return !!(webDocument && (webDocument._ === 'webDocument' || webDocument._ === 'webDocumentNoProxy'));\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus',\r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\n\nconst CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n]);\nexport default function combineSameEntities(entities: MessageEntity[]) {\n // entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n // return entities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport spoiler from './spoiler';\n\nexport default function encodeSpoiler(text: string, entity: MessageEntity.messageEntitySpoiler) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const spoilerAfter = spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */;\n const after = text.slice(entity.offset + entity.length);\n text = before + spoilerAfter + after;\n return {text, entityText: spoilerAfter};\n};\n","export default function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n\n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n const char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PASS_CONFLICTING_ENTITIES} from '.';\nimport {MessageEntity} from '../../layer';\n\nconst SINGLE_ENTITIES: Set = new Set(['messageEntityPre', 'messageEntityCode']);\n\nexport default function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n let singleEnd = -1;\n return currentEntities.find((currentEntity) => {\n if(SINGLE_ENTITIES.has(currentEntity._)) {\n singleEnd = currentEntity.offset + currentEntity.length;\n }\n\n if(newEntity.offset < singleEnd && !PASS_CONFLICTING_ENTITIES.has(newEntity._)) {\n return true;\n }\n\n const isConflictingTypes = newEntity._ === currentEntity._ ||\n (!PASS_CONFLICTING_ENTITIES.has(newEntity._) && !PASS_CONFLICTING_ENTITIES.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset &&\n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\n\nexport default function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach((entity) => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n\n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n}\n","import {URL_REG_EXP} from '.';\n\nexport default function matchUrl(text: string) {\n return !text ? null : text.match(URL_REG_EXP);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport findConflictingEntity from './findConflictingEntity';\nimport sortEntities from './sortEntities';\n\nexport default function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter((e) => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\nconst TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\n\nexport default TLD;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n}\n","import Emoji from '../../config/emoji';\nimport {encodeEmoji} from '../../vendor/emoji';\n\nexport default function getEmojiUnified(emojiCode: string) {\n const unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n\n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n\n if(!Emoji.hasOwnProperty(unified)\n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n // console.error('lol', unified);\n return;\n }\n\n return unified;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {EMAIL_REG_EXP, FULL_REG_EXP} from '.';\nimport TLD from '../../config/tld';\nimport {MessageEntity} from '../../layer';\nimport checkBrackets from './checkBrackets';\nimport getEmojiUnified from './getEmojiUnified';\n\nexport default function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n FULL_REG_EXP.lastIndex = 0;\n while((match = raw.match(FULL_REG_EXP))) {\n matchIndex = rawOffset + match.index;\n\n // console.log('parseEntities match:', match);\n\n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(EMAIL_REG_EXP.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n\n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n\n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n\n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n 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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MARKDOWN_ENTITIES, MARKDOWN_REG_EXP} from '.';\nimport {MessageEntity} from '../../layer';\nimport combineSameEntities from './combineSameEntities';\nimport findConflictingEntity from './findConflictingEntity';\nimport mergeEntities from './mergeEntities';\n\nexport default function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(MARKDOWN_REG_EXP)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n // text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n\n newTextParts.push(match[1] + text + match[5]);\n\n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: MARKDOWN_ENTITIES[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n // offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n\n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n}\n","import {MessageEntity} from '../../layer';\n\nexport default function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport encodeSpoiler from './encodeSpoiler';\n\n/**\n * ! This function is still unsafe to use with .innerHTML\n */\nexport default function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n entities.forEach((entity) => {\n if(entity._ === 'messageEntitySpoiler') {\n text = encodeSpoiler(text, entity).text;\n }\n });\n\n return text;\n // if(entities?.length) {\n // entities = entities.filter((entity) => entity._ === 'messageEntitySpoiler');\n // }\n\n // return wrapRichText(text, {\n // entities,\n // noEncoding: true,\n // noTextFormat: true,\n // noLinebreaks: true,\n // noLinks: true\n // }).textContent;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {processSearchText, ProcessSearchTextOptions} from '../helpers/cleanSearchText';\nimport flatten from '../helpers/array/flatten';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n\n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n private _search(query: string) {\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const fullTexts = this.fullTexts;\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' '/* && !badCharsRe.test(fullText[idx - 1]) */)) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n return newFoundObjs;\n }\n\n public search(query: string) {\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const queries = query.split('\\x01');\n const newFoundObjs = flatten(queries.map((query) => this._search(query)));\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n // newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map((o) => o.what));\n\n return newFoundObjs2;\n }\n}\n","export default function flatten(arr: T[][]): T[] {\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\n}\n"],"names":["IGNORE_ERRORS","Set","LazyLoadQueueBase","constructor","parallelLimit","queueId","queue","inProcess","lockPromise","unlockResolve","log","this","processQueue","_processQueue","clear","length","lock","Promise","resolve","reject","unlock","processItem","item","add","loadItem","err","has","type","error","delete","load","getItem","shift","addElement","method","el","size","push","unshift","filterUnique","arr","forEachReverse","array","callback","i","insertInDescendSortedArray","element","getProperty","pos","property","sortProperty","undefined","indexOf","prev","next","splice","len","console","assumeType","x","readBlobAs","blob","reader","FileReader","addEventListener","e","target","result","bytesCmp","bytes1","bytes2","bytesFromHex","hexString","bytes","Uint8Array","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","callbackify","smth","then","uploadId","getFileNameForUpload","file","fileName","mimeType","ext","split","getDeepProperty","object","key","splitted","o","forEach","getObjectKeysAndSort","sort","ids","Map","keys","Object","map","a","b","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","args","_resolve","_reject","apply","clearTimeout","_waitingTimeout","catch","isDebounced","SliceEnd","compareValue","val1","val2","toExponential","diff","str1","str2","str1Length","slice","compareLong","SlicedArray","sliceConstructor","getSliceConstructor","first","constructSlice","slices","static","slicedArray","Array","end","None","isEnd","side","Top","last","includes","Bottom","Both","setEnd","getEnds","top","bottom","both","unsetEnd","deleteCount","items","ret","super","idx","insertSlice","flatten","lowerBound","upperBound","foundSlice","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","s","prevSlice","nextSlice","findSlice","index","findSliceOffset","maxId","offset","sliceMe","offsetId","add_offset","limit","sliceOffset","sliceStart","max","sliceEnd","topWasMeantToLoad","bottomWasMeantToLoad","abs","topFulfilled","bottomFulfilled","offsetIdOffset","fulfilled","found","deleteSlice","indexOfAndSplice","toJSON","serialized","values","JSON","stringify","json","parsed","parse","inserted","getParticipantPeerId","participant","peer","user_id","toPeerId","hasRights","chat","action","rights","isThread","_","pFlags","deactivated","isCheckingRightsForSelf","creator","left","megagroup","admin_rights","banned_rights","default_banned_rights","myFlags","post_messages","broadcast","getDialogIndex","dialog","indexKey","folder_id","getDialogIndexKey","localId","getDocumentDownloadOptions","doc","thumb","onlyCache","inputFileLocation","sticker","mime_type","dcId","dc_id","location","file_name","getDocumentInputFileLocation","thumbSize","id","access_hash","file_reference","thumb_size","getDownloadFileNameFromOptions","options","getDownloadMediaDetails","media","downloadOptions","webDocument","getPhotoDownloadOptions","isWebDocument","url","downloadId","draftsAreEqual","draft1","draft2","reply_to_msg_id","entities","message","no_webpage","generateQId","queryId","resultId","generateMessageId","messageId","q","getServerMessageId","toServer","l","used","clearMessageId","MESSAGE_ID_INCREMENT","MESSAGE_ID_OFFSET","filterMessagesByInputFilter","inputFilter","history","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","document","goodEntities","totalEntities","find","getAlbumText","messages","foundMessages","m","getPeerId","peerId","isPeerId","userId","chatId","channel_id","chat_id","isUser","peerParams","photo","photoSize","isDocument","Error","isPhoto","reactionsEqual","r1","r2","getStickerEffectThumb","video_thumbs","canSendToUser","user","deleted","ConnectionStatus","CAN_COMBINE_ENTITIES","combineSameEntities","entity","nextEntityIdx","findIndex","_i","nextEntity","encodeSpoiler","text","before","spoilerAfter","chars","charsLength","out","char","charCodeAt","join","spoiler","after","entityText","SINGLE_ENTITIES","findConflictingEntity","currentEntities","newEntity","singleEnd","currentEntity","fixEmoji","replace","match","string","matchUrl","mergeEntities","newEntities","filtered","filter","checkBrackets","urlLength","urlOpenBrackets","urlCloseBrackets","getEmojiUnified","emojiCode","unified","parseEntities","raw","matchIndex","rawOffset","E","protocol","tld","toLowerCase","balanced","unicode","unsafe","parseMarkdown","noTrim","pushedEntity","pushEntity","newTextParts","language","isSOH","toUserId","newText","sortEntities","wrapPlainText","SearchIndex","minChars","fullTexts","indexObject","searchText","trim","set","_search","query","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","search","reduce","acc","val"],"sourceRoot":""} \ No newline at end of file diff --git a/public/53.1619c547150ac620cdca.chunk.js b/public/53.1619c547150ac620cdca.chunk.js new file mode 100644 index 00000000..0d16f06c --- /dev/null +++ b/public/53.1619c547150ac620cdca.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[53,63,709,392,810,641,776],{9638:(e,t,n)=>{n.d(t,{Z:()=>p});var a=n(3910),o=n(2738),r=n(4541),i=n(2325),s=n(3512),d=n(4494),l=n(279);let c,u=!1;function p(e){u||(c||(c=s.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==i.ZP.lastRequestedLangCode?Promise.all([e,i.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),i.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const c=[];n.forEach((e=>{const t=i.ZP.strings.get(e.key);t&&(c.push(t),i.ZP.strings.set(e.key,e))}));const p="Login.ContinueOnLanguage",g=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:p});g.lastElementChild.classList.remove("i18n"),(0,r.Z)({text:[i.ZP.format(p,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(g)}))})),s.Z.addEventListener("language_change",(()=>{g.remove()}),{once:!0}),c.forEach((e=>{i.ZP.strings.set(e.key,e)})),(0,o.fc)(g,(e=>{(0,a.Z)(e),u=!0,g.disabled=!0,(0,l.y)(g),i.ZP.getLangPack(t.suggested_lang_code)}))}))}},6392:(e,t,n)=>{n.r(t),n.d(t,{default:()=>L});var a=n(4755),o=n(4874),r=n(810),i=n(3083),s=n(4489),d=n(2325),l=n(144),c=n(5565),u=n(3512),p=n(1447),g=n(2521),h=n(2738);let m,y,v,f,_=null,Z=null,E=null;const b=()=>{setTimeout((()=>{null==v||v.remove(),null==f||f.remove()}),300)},S=new o.Z("page-authCode",!0,(()=>{S.pageEl.querySelector(".input-wrapper").append(y.container);const e=S.pageEl.querySelector(".phone-edit");(0,h.fc)(e,(()=>r.default.mount()))}),(e=>{if(_=e,Z){m.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),m.dispatchEvent(e)}else Z=S.pageEl.getElementsByClassName("phone")[0],E=S.pageEl.getElementsByClassName("sent-type")[0];const t=_.type.length;let o,r;y||(y=new s.Z({label:"Code",name:(0,l.a)(),length:t,onFill:e=>{(e=>{m.setAttribute("disabled","true");const t={phone_number:_.phone_number,phone_code_hash:_.phone_code_hash,phone_code:e};u.Z.managers.apiManager.invokeApi("auth.signIn",t,{ignoreErrors:!0}).then((e=>{switch(e._){case"auth.authorization":u.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()})),b();break;case"auth.authorizationSignUpRequired":n.e(813).then(n.bind(n,8339)).then((e=>{e.default.mount({phone_number:_.phone_number,phone_code_hash:_.phone_code_hash})})),b()}})).catch((e=>{return t=void 0,a=void 0,r=function*(){let t=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":t=!0,e.handled=!0,yield(yield n.e(774).then(n.bind(n,9437))).default.mount(),setTimeout((()=>{m.value=""}),300);break;case"PHONE_CODE_EXPIRED":m.classList.add("error"),(0,c.Z)(y.label,(0,d.ag)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":m.classList.add("error"),(0,c.Z)(y.label,(0,d.ag)("PHONE_CODE_INVALID"));break;default:y.label.innerText=e.type}t||y.select(),m.removeAttribute("disabled")},new((o=void 0)||(o=Promise))((function(e,n){function i(e){try{d(r.next(e))}catch(e){n(e)}}function s(e){try{d(r.throw(e))}catch(e){n(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(t,a||[])).next())}));var t,a,o,r}))})(e)}}),m=y.input),y.options.length=t,Z.innerText=_.phone_number;const h=_.type;switch(h._){case"auth.sentCodeTypeSms":o="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":o="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":o="Login.Code.SentCall";break;case"auth.sentCodeTypeFragmentSms":o="PhoneNumber.Code.Fragment.Info";const e=document.createElement("a");(0,g.Z)(e),e.href=h.url,r=[e];break;default:o="Login.Code.SentUnknown",r=[h._]}return(0,c.Z)(E,(0,d.ag)(o,r)),u.Z.managers.appStateManager.pushToState("authState",{_:"authStateAuthCode",sentCode:e}),(()=>{const e=S.pageEl.querySelector(".auth-image"),t=a.Z.isMobile?100:166;if("auth.sentCodeTypeFragmentSms"===_.type._){e.firstElementChild&&(null==v||v.remove(),v=void 0,e.replaceChildren());const n=document.createElement("div");return n.classList.add("media-sticker-wrapper"),e.append(n),p.Z.loadAnimationAsAsset({container:n,loop:!0,autoplay:!0,width:t,height:t},"jolly_roger").then((e=>(f=e,p.Z.waitForFirstFrame(e)))).then((()=>{}))}return e.firstElementChild&&(null==f||f.remove(),f=void 0,e.replaceChildren()),v=new i.Z(y,t),e.append(v.container),v.load()})()}),(()=>{m.focus()})),L=S},810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>P});var a=n(279),o=n(4874),r=n(9807),i=n(4494),s=n(5432),d=n(4159),l=n(2325),c=n(1447),u=n(1405),p=n(9709),g=n(9638),h=n(3910),m=n(2738),y=n(5565),v=n(1656),f=n(7487),_=n(2398),Z=n(7922),E=n(3512),b=n(709),S=n(3855),L=n(5431);let w,k=null;const C=new o.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,o;e.classList.add("input-wrapper");const u=new L.Z({onCountryChange:(e,n)=>{t=e,o=n,n&&(P.value=P.lastValue="+"+n.country_code,setTimeout((()=>{x.focus(),(0,_.Z)(x,!0)}),0))}}),P=new b.Z({onInput:e=>{c.Z.loadLottieWorkers();const{country:n,code:a}=e||{},r=n?n.name||n.default_name:"";r===u.value||t&&n&&a&&(t===n||o.country_code===a.country_code)||u.override(n,a,r),n||P.value.length-1>1?k.style.visibility="":k.style.visibility="hidden"}}),x=P.input;x.addEventListener("keypress",(e=>{if(!k.style.visibility&&"Enter"===e.key)return A()}));const T=new r.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});T.input.addEventListener("change",(()=>{const e=T.checked;E.Z.managers.appStateManager.pushToState("keepSigned",e),S.Z.toggleStorages(e,!0)})),S.Z.getState().then((e=>{Z.Z.isAvailable()?T.checked=e.keepSigned:(T.checked=!1,T.label.classList.add("checkbox-disabled"))})),k=(0,i.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),k.style.visibility="hidden";const A=e=>{e&&(0,h.Z)(e);const t=(0,v.Z)([k,w],!0);(0,y.Z)(k,(0,l.ag)("PleaseWait")),(0,a.y)(k);const o=P.value;E.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:o,api_id:d.Z.id,api_hash:d.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:o}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(P.setError(),(0,y.Z)(P.label,(0,l.ag)("Login.PhoneLabelInvalid")),x.classList.add("error"),(0,y.Z)(k,(0,l.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),k.innerText=e.type)}))};(0,m.fc)(k,A),w=(0,i.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),w.addEventListener("click",(()=>{p.default.mount()})),e.append(u.container,P.container,T.label,k,w);const O=document.createElement("h4");O.classList.add("text-center"),(0,l.$d)(O,"Login.Title");const N=document.createElement("div");N.classList.add("subtitle","text-center"),(0,l.$d)(N,"Login.StartText"),C.pageEl.querySelector(".container").append(O,N,e),s.Z||setTimeout((()=>{x.focus()}),0),(0,g.Z)(e),E.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=Z.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&l.ZP.getLangPack(n.lang_code).then((()=>{P.simulateInputEvent()}));const a=new Set([1,2,3,4,5]),o=[e.this_dc];let r;return e.nearest_dc!==e.this_dc&&(r=E.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{o.push(e.nearest_dc)}))),(r||Promise.resolve()).then((()=>{o.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,r=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield f.Z.get(a))return t();setTimeout((()=>{E.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r};t()})),e})).then((e=>{u.value.length||P.value.length||u.selectCountryByIso2(e.country)}))}),(()=>{k&&((0,y.Z)(k,(0,l.ag)("Login.Next")),(0,u.Z)(k,void 0,void 0,!0),k.removeAttribute("disabled")),w&&w.removeAttribute("disabled"),E.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),P=C},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>v});var a=n(4874),o=n(4159),r=n(4494),i=n(2325),s=n(3512),d=n(279),l=n(9638),c=n(5418),u=n(9895);function p(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var g=n(8812),h=function(e,t,n,a){return new(n||(n=Promise))((function(o,r){function i(e){try{d(a.next(e))}catch(e){r(e)}}function s(e){try{d(a.throw(e))}catch(e){r(e)}}function d(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,s)}d((a=a.apply(e,t||[])).next())}))};let m;const y=new a.Z("page-signQR",!0,(()=>m),(()=>{m||(m=h(void 0,void 0,void 0,(function*(){const e=y.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const v=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(v),(0,l.Z)(a);const f=e.parentElement,_=document.createElement("h4");(0,i.$d)(_,"Login.QR.Title");const Z=document.createElement("ol");Z.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach((e=>{const t=document.createElement("li");t.append((0,i.ag)(e)),Z.append(t)})),f.append(_,Z,a),v.addEventListener("click",(()=>{n.e(810).then(n.bind(n,810)).then((e=>e.default.mount())),b=!0}));const E=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let b=!1;s.Z.addEventListener("user_auth",(()=>{b=!0,m=null}),{once:!0});const S={ignoreErrors:!0};let L;const w=a=>h(void 0,void 0,void 0,(function*(){try{let r=yield s.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:o.Z.id,api_hash:o.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===r._&&(S.dcId||(S.dcId=r.dc_id,s.Z.managers.apiManager.setBaseDcId(r.dc_id)),r=yield s.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:r.token},S)),"auth.loginTokenSuccess"===r._){const e=r.authorization;return s.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!L||!(0,u.Z)(L,r.token)){L=r.token;const n="tg://login?token="+function(e){let t,n="";for(let a=e.length,o=0,r=0;r>>t&24),2!==t&&a-r!=1||(n+=String.fromCharCode(p(o>>>18&63),p(o>>>12&63),p(o>>>6&63),p(63&o)),o=0);return n.replace(/A(?=A$|$)/g,"=")}(r.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""),a=window.getComputedStyle(document.documentElement),o=a.getPropertyValue("--surface-color").trim(),i=a.getPropertyValue("--primary-text-color").trim(),s=a.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>(e=e.replace(/(fill:).+?(;)/,`$1${s}$2`),(0,g.Z)(e)))),l=new E({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:i,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:o},qrOptions:{errorCorrectionLevel:"L"}});let u;l.append(e),e.lastChild.classList.add("qr-canvas"),u=l._drawingPromise?l._drawingPromise:Promise.race([(0,c.Z)(1e3),new Promise((e=>{l._canvas._image.addEventListener("load",(()=>{window.requestAnimationFrame((()=>e()))}),{once:!0})}))]),yield u.then((()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout((()=>{n.style.display=""}),150),setTimeout((()=>{n.style.animation=""}),500),t=void 0}else Array.from(e.children).slice(0,-1).forEach((e=>{e.remove()}))}))}if(a){const e=Date.now()/1e3,t=r.expires-e-(yield s.Z.managers.timeManager.getServerTimeOffset());yield(0,c.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(e.handled=!0,n.e(774).then(n.bind(n,9437)).then((e=>e.default.mount())),b=!0,m=null):(console.error("pageSignQR: default error:",e),b=!0),!0}return!1}));return()=>h(void 0,void 0,void 0,(function*(){for(b=!1;!b&&!(yield w(!0)););}))}))),m.then((e=>{e()})),s.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),v=y}}]); +//# sourceMappingURL=53.1619c547150ac620cdca.chunk.js.map \ No newline at end of file diff --git a/public/53.1619c547150ac620cdca.chunk.js.map b/public/53.1619c547150ac620cdca.chunk.js.map new file mode 100644 index 00000000..70b601b5 --- /dev/null +++ b/public/53.1619c547150ac620cdca.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"53.1619c547150ac620cdca.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/pages/pageAuthCode.ts","webpack://tweb/./src/pages/pageSignIn.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from '../helpers/mediaSizes';\nimport {AuthSentCode, AuthSentCodeType, AuthSignIn} from '../layer';\nimport Page from './page';\nimport pageSignIn from './pageSignIn';\nimport TrackingMonkey from '../components/monkeys/tracking';\nimport CodeInputField from '../components/codeInputField';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport {randomLong} from '../helpers/random';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport rootScope from '../lib/rootScope';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport setBlankToAnchor from '../lib/richTextProcessor/setBlankToAnchor';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nlet authSentCode: AuthSentCode.authSentCode = null;\n\nlet headerElement: HTMLHeadElement = null;\nlet sentTypeElement: HTMLParagraphElement = null;\nlet codeInput: HTMLInputElement, codeInputField: CodeInputField;\nlet monkey: TrackingMonkey, player: RLottiePlayer;\n\nconst cleanup = () => {\n setTimeout(() => {\n monkey?.remove();\n player?.remove();\n }, 300);\n};\n\nconst submitCode = (code: string) => {\n codeInput.setAttribute('disabled', 'true');\n\n const params: AuthSignIn = {\n phone_number: authSentCode.phone_number,\n phone_code_hash: authSentCode.phone_code_hash,\n phone_code: code\n };\n\n // console.log('invoking auth.signIn with params:', params);\n\n rootScope.managers.apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\n .then((response) => {\n // console.log('auth.signIn response:', response);\n\n switch(response._) {\n case 'auth.authorization':\n rootScope.managers.apiManager.setUser(response.user);\n\n import('./pageIm').then((m) => {\n m.default.mount();\n });\n cleanup();\n break;\n case 'auth.authorizationSignUpRequired':\n // console.log('Registration needed!');\n\n import('./pageSignUp').then((m) => {\n m.default.mount({\n 'phone_number': authSentCode.phone_number,\n 'phone_code_hash': authSentCode.phone_code_hash\n });\n });\n\n cleanup();\n break;\n /* default:\n codeInput.innerText = response._;\n break; */\n }\n }).catch(async(err) => {\n let good = false;\n switch(err.type) {\n case 'SESSION_PASSWORD_NEEDED':\n // console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\n good = true;\n err.handled = true;\n await (await import('./pagePassword')).default.mount(); // lol\n setTimeout(() => {\n codeInput.value = '';\n }, 300);\n break;\n case 'PHONE_CODE_EXPIRED':\n codeInput.classList.add('error');\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\n break;\n case 'PHONE_CODE_EMPTY':\n case 'PHONE_CODE_INVALID':\n codeInput.classList.add('error');\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\n break;\n default:\n codeInputField.label.innerText = err.type;\n break;\n }\n\n if(!good) {\n codeInputField.select();\n }\n\n codeInput.removeAttribute('disabled');\n });\n};\n\nconst onFirstMount = () => {\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\n\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\n attachClickEvent(editButton, () => {\n return pageSignIn.mount();\n });\n};\n\nconst getAnimation = () => {\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\n const size = mediaSizes.isMobile ? 100 : 166;\n if(authSentCode.type._ === 'auth.sentCodeTypeFragmentSms') {\n if(imageDiv.firstElementChild) {\n monkey?.remove();\n monkey = undefined;\n imageDiv.replaceChildren();\n }\n\n const container = document.createElement('div');\n container.classList.add('media-sticker-wrapper');\n imageDiv.append(container);\n return lottieLoader.loadAnimationAsAsset({\n container: container,\n loop: true,\n autoplay: true,\n width: size,\n height: size\n }, 'jolly_roger').then((animation) => {\n player = animation;\n return lottieLoader.waitForFirstFrame(animation);\n }).then(() => {});\n } else {\n if(imageDiv.firstElementChild) {\n player?.remove();\n player = undefined;\n imageDiv.replaceChildren();\n }\n\n monkey = new TrackingMonkey(codeInputField, size);\n imageDiv.append(monkey.container);\n return monkey.load();\n }\n};\n\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authSentCode) => {\n authSentCode = _authCode;\n\n if(!headerElement) {\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\n } else {\n codeInput.value = '';\n\n const evt = document.createEvent('HTMLEvents');\n evt.initEvent('input', false, true);\n codeInput.dispatchEvent(evt);\n }\n\n const CODE_LENGTH = (authSentCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\n if(!codeInputField) {\n codeInputField = new CodeInputField({\n label: 'Code',\n name: randomLong(),\n length: CODE_LENGTH,\n onFill: (code) => {\n submitCode(code);\n }\n });\n\n codeInput = codeInputField.input as HTMLInputElement;\n }\n\n codeInputField.options.length = CODE_LENGTH;\n\n headerElement.innerText = authSentCode.phone_number;\n let key: LangPackKey, args: any[];\n const authSentCodeType = authSentCode.type;\n switch(authSentCodeType._) {\n case 'auth.sentCodeTypeSms':\n key = 'Login.Code.SentSms';\n break;\n case 'auth.sentCodeTypeApp':\n key = 'Login.Code.SentInApp';\n break;\n case 'auth.sentCodeTypeCall':\n key = 'Login.Code.SentCall';\n break;\n case 'auth.sentCodeTypeFragmentSms':\n key = 'PhoneNumber.Code.Fragment.Info';\n const a = document.createElement('a');\n setBlankToAnchor(a);\n a.href = authSentCodeType.url;\n args = [a];\n break;\n default:\n key = 'Login.Code.SentUnknown';\n args = [authSentCodeType._];\n break;\n }\n\n replaceContent(sentTypeElement, i18n(key, args));\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\n\n return getAnimation();\n}, () => {\n codeInput.focus();\n});\n\nexport default page;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {putPreloader} from '../components/putPreloader';\nimport Page from './page';\nimport CheckboxField from '../components/checkboxField';\nimport Button from '../components/button';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport App from '../config/app';\nimport I18n, {_i18n, i18n} from '../lib/langPack';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport ripple from '../components/ripple';\nimport pageSignQR from './pageSignQR';\nimport getLanguageChangeButton from '../components/languageChangeButton';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport toggleDisability from '../helpers/dom/toggleDisability';\nimport sessionStorage from '../lib/sessionStorage';\nimport {DcAuthKey} from '../types';\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport stateStorage from '../lib/stateStorage';\nimport rootScope from '../lib/rootScope';\nimport TelInputField from '../components/telInputField';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport CountryInputField from '../components/countryInputField';\n\n// import _countries from '../countries_pretty.json';\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\n\nconst onFirstMount = () => {\n /* if(Modes.test) {\n Countries.push({\n _: 'help.country',\n default_name: 'Test Country',\n country_codes: [{\n _: 'help.countryCode',\n country_code: '999 66',\n patterns: ['999 66 XXX XX']\n }],\n iso2: 'KK'\n });\n\n console.log('Added test country to list!');\n } */\n\n // const countries: Country[] = _countries.default.filter((c) => c.emoji);\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\n const countryInputField = new CountryInputField({\n onCountryChange: (country, code) => {\n lastCountrySelected = country, lastCountryCodeSelected = code;\n\n if(!code) {\n return;\n }\n\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\n setTimeout(() => {\n telEl.focus();\n placeCaretAtEnd(telEl, true);\n }, 0);\n }\n });\n\n const telInputField = new TelInputField({\n onInput: (formatted) => {\n lottieLoader.loadLottieWorkers();\n\n const {country, code} = formatted || {};\n const countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\n if(countryName !== countryInputField.value && (\n !lastCountrySelected ||\n !country ||\n !code || (\n lastCountrySelected !== country &&\n lastCountryCodeSelected.country_code !== code.country_code\n )\n )\n ) {\n countryInputField.override(country, code, countryName);\n }\n\n // if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\n if(country || (telInputField.value.length - 1) > 1) {\n btnNext.style.visibility = '';\n } else {\n btnNext.style.visibility = 'hidden';\n }\n }\n });\n\n const telEl = telInputField.input;\n\n telEl.addEventListener('keypress', (e) => {\n // console.log('keypress', this.value);\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\n return onSubmit();\n }\n });\n\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n\n const signedCheckboxField = new CheckboxField({\n text: 'Login.KeepSigned',\n name: 'keepSession',\n withRipple: true,\n checked: true\n });\n\n signedCheckboxField.input.addEventListener('change', () => {\n const keepSigned = signedCheckboxField.checked;\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\n\n apiManagerProxy.toggleStorages(keepSigned, true);\n });\n\n apiManagerProxy.getState().then((state) => {\n if(!stateStorage.isAvailable()) {\n signedCheckboxField.checked = false;\n signedCheckboxField.label.classList.add('checkbox-disabled');\n } else {\n signedCheckboxField.checked = state.keepSigned;\n }\n });\n\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\n btnNext.style.visibility = 'hidden';\n\n const onSubmit = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\n\n replaceContent(btnNext, i18n('PleaseWait'));\n putPreloader(btnNext);\n\n // return;\n\n const phone_number = telInputField.value;\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\n phone_number: phone_number,\n api_id: App.id,\n api_hash: App.hash,\n settings: {\n _: 'codeSettings' // that's how we sending Type\n }\n // lang_code: navigator.language || 'en'\n }).then((code) => {\n // console.log('got code', code);\n\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\n }).catch((err) => {\n toggle();\n\n switch(err.type) {\n case 'PHONE_NUMBER_INVALID':\n telInputField.setError();\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\n telEl.classList.add('error');\n replaceContent(btnNext, i18n('Login.Next'));\n break;\n default:\n console.error('auth.sendCode error:', err);\n btnNext.innerText = err.type;\n break;\n }\n });\n };\n\n attachClickEvent(btnNext, onSubmit);\n\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\n\n const qrMounted = false;\n btnQr.addEventListener('click', () => {\n pageSignQR.mount();\n /* const promise = import('./pageSignQR');\n btnQr.disabled = true;\n\n let preloaderDiv: HTMLElement;\n if(!qrMounted) {\n preloaderDiv = putPreloader(btnQr);\n qrMounted = true;\n }\n\n promise.then((module) => {\n module.default.mount();\n\n setTimeout(() => {\n btnQr.removeAttribute('disabled');\n if(preloaderDiv) {\n preloaderDiv.remove();\n }\n }, 200);\n }); */\n });\n\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\n\n const h4 = document.createElement('h4');\n h4.classList.add('text-center');\n _i18n(h4, 'Login.Title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle', 'text-center');\n _i18n(subtitle, 'Login.StartText');\n\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\n\n const tryAgain = () => {\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\n const langPack = stateStorage.getFromCache('langPack');\n if(langPack && !langPack.countries?.hash) {\n I18n.getLangPack(langPack.lang_code).then(() => {\n telInputField.simulateInputEvent();\n });\n }\n\n const dcs = new Set([1, 2, 3, 4, 5]);\n const done: number[] = [nearestDcResult.this_dc];\n\n let promise: Promise;\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\n done.push(nearestDcResult.nearest_dc);\n });\n }\n\n (promise || Promise.resolve()).then(() => {\n done.forEach((dcId) => {\n dcs.delete(dcId);\n });\n\n const _dcs = [...dcs];\n const g = async(): Promise => {\n const dcId = _dcs.shift();\n if(!dcId) return;\n\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\n const key = await sessionStorage.get(dbKey);\n if(key) {\n return g();\n }\n\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\n }, /* done.includes(dcId) ? 0 : */3000);\n };\n\n g();\n });\n\n return nearestDcResult;\n }).then((nearestDcResult) => {\n if(!countryInputField.value.length && !telInputField.value.length) {\n countryInputField.selectCountryByIso2(nearestDcResult.country);\n }\n\n // console.log('woohoo', nearestDcResult, country);\n })// .catch(tryAgain);\n };\n\n if(!IS_TOUCH_SUPPORTED) {\n setTimeout(() => {\n telEl.focus();\n }, 0);\n }\n\n getLanguageChangeButton(inputWrapper);\n\n tryAgain();\n};\n\nconst page = new Page('page-sign', true, onFirstMount, () => {\n if(btnNext) {\n replaceContent(btnNext, i18n('Login.Next'));\n ripple(btnNext, undefined, undefined, true);\n btnNext.removeAttribute('disabled');\n }\n\n if(btnQr) {\n btnQr.removeAttribute('disabled');\n }\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\n});\n\nexport default page;\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","/*\n * 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 {DcId} from '../types';\nimport Page from './page';\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\nimport App from '../config/app';\nimport Button from '../components/button';\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport {putPreloader} from '../components/putPreloader';\nimport getLanguageChangeButton from '../components/languageChangeButton';\nimport pause from '../helpers/schedulers/pause';\nimport fixBase64String from '../helpers/fixBase64String';\nimport bytesCmp from '../helpers/bytes/bytesCmp';\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\nimport textToSvgURL from '../helpers/textToSvgURL';\n\nconst FETCH_INTERVAL = 3;\n\nconst onFirstMount = async() => {\n const pageElement = page.pageEl;\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\n\n let preloader = putPreloader(imageDiv, true);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\n inputWrapper.append(btnBack);\n\n getLanguageChangeButton(inputWrapper);\n\n const container = imageDiv.parentElement;\n\n const h4 = document.createElement('h4');\n _i18n(h4, 'Login.QR.Title');\n\n const helpList = document.createElement('ol');\n helpList.classList.add('qr-description');\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\n const li = document.createElement('li');\n li.append(i18n(key));\n helpList.append(li);\n });\n\n container.append(h4, helpList, inputWrapper);\n\n btnBack.addEventListener('click', () => {\n import('./pageSignIn').then((m) => m.default.mount());\n stop = true;\n });\n\n const results = await Promise.all([\n import('qr-code-styling' as any)\n ]);\n const QRCodeStyling = results[0].default;\n\n let stop = false;\n rootScope.addEventListener('user_auth', () => {\n stop = true;\n cachedPromise = null;\n }, {once: true});\n\n const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\n let prevToken: Uint8Array | number[];\n\n const iterate = async(isLoop: boolean) => {\n try {\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\n api_id: App.id,\n api_hash: App.hash,\n except_ids: []\n }, {ignoreErrors: true});\n\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\n if(!options.dcId) {\n options.dcId = loginToken.dc_id as DcId;\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\n // continue;\n }\n\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\n token: loginToken.token\n }, options) as AuthLoginToken.authLoginToken;\n }\n\n if(loginToken._ === 'auth.loginTokenSuccess') {\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\n rootScope.managers.apiManager.setUser(authorization.user);\n import('./pageIm').then((m) => m.default.mount());\n return true;\n }\n\n /* // to base64\n var decoder = new TextDecoder('utf8');\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\n\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\n prevToken = loginToken.token;\n\n const encoded = bytesToBase64(loginToken.token);\n const url = 'tg://login?token=' + fixBase64String(encoded, true);\n\n const style = window.getComputedStyle(document.documentElement);\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\n const textColor = style.getPropertyValue('--primary-text-color').trim();\n const primaryColor = style.getPropertyValue('--primary-color').trim();\n\n const logoUrl = await fetch('assets/img/logo_padded.svg')\n .then((res) => res.text())\n .then((text) => {\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\n return textToSvgURL(text);\n });\n\n const qrCode = new QRCodeStyling({\n width: 240 * window.devicePixelRatio,\n height: 240 * window.devicePixelRatio,\n data: url,\n image: logoUrl,\n dotsOptions: {\n color: textColor,\n type: 'rounded'\n },\n cornersSquareOptions: {\n type: 'extra-rounded'\n },\n imageOptions: {\n imageSize: 1,\n margin: 0\n },\n backgroundOptions: {\n color: surfaceColor\n },\n qrOptions: {\n errorCorrectionLevel: 'L'\n }\n });\n\n qrCode.append(imageDiv);\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\n\n let promise: Promise;\n if(qrCode._drawingPromise) {\n promise = qrCode._drawingPromise;\n } else {\n promise = Promise.race([\n pause(1000),\n new Promise((resolve) => {\n qrCode._canvas._image.addEventListener('load', () => {\n window.requestAnimationFrame(() => resolve());\n }, {once: true});\n })\n ]);\n }\n\n // * это костыль, но библиотека не предоставляет никаких событий\n await promise.then(() => {\n if(preloader) {\n preloader.style.animation = 'hide-icon .4s forwards';\n\n const c = imageDiv.children[1] as HTMLElement;\n c.style.display = 'none';\n c.style.animation = 'grow-icon .4s forwards';\n setTimeout(() => {\n c.style.display = '';\n }, 150);\n\n setTimeout(() => {\n c.style.animation = '';\n }, 500);\n preloader = undefined;\n } else {\n Array.from(imageDiv.children).slice(0, -1).forEach((el) => {\n el.remove();\n });\n }\n });\n }\n\n if(isLoop) {\n const timestamp = Date.now() / 1000;\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\n\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\n }\n } catch(err) {\n switch((err as ApiError).type) {\n case 'SESSION_PASSWORD_NEEDED':\n (err as ApiError).handled = true;\n import('./pagePassword').then((m) => m.default.mount());\n stop = true;\n cachedPromise = null;\n break;\n default:\n console.error('pageSignQR: default error:', err);\n stop = true;\n break;\n }\n\n return true;\n }\n\n return false;\n };\n\n // await iterate(false);\n\n return async() => {\n stop = false;\n\n do {\n if(stop) {\n break;\n }\n\n const needBreak = await iterate(true);\n if(needBreak) {\n break;\n }\n } while(true);\n };\n};\n\nlet cachedPromise: Promise<() => Promise>;\nconst page = new Page('page-signQR', true, () => {\n return cachedPromise;\n}, () => {\n // console.log('onMount');\n if(!cachedPromise) cachedPromise = onFirstMount();\n cachedPromise.then((func) => {\n func();\n });\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\n});\n\nexport default page;\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","once","e","disabled","codeInput","codeInputField","monkey","player","authSentCode","headerElement","sentTypeElement","cleanup","setTimeout","page","pageEl","querySelector","container","editButton","_authCode","value","evt","document","createEvent","initEvent","dispatchEvent","getElementsByClassName","CODE_LENGTH","type","length","args","label","name","onFill","code","setAttribute","params","phone_number","phone_code_hash","phone_code","ignoreErrors","response","_","user","m","default","mount","catch","err","good","handled","add","innerText","select","removeAttribute","submitCode","input","options","authSentCodeType","a","createElement","href","url","sentCode","imageDiv","size","firstElementChild","undefined","replaceChildren","loop","autoplay","width","height","animation","load","getAnimation","focus","btnQr","btnNext","inputWrapper","lastCountrySelected","lastCountryCodeSelected","countryInputField","onCountryChange","country","telInputField","lastValue","country_code","telEl","onInput","formatted","countryName","default_name","override","style","visibility","addEventListener","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","state","toggle","api_id","api_hash","settings","Object","assign","setError","console","error","h4","subtitle","nearestDcResult","langPack","countries","hash","lang_code","simulateInputEvent","dcs","Set","done","this_dc","promise","nearest_dc","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","uint6ToBase64","nUint6","preloader","putPreloader","btnBack","parentElement","helpList","li","stop","QRCodeStyling","rootScope","prevToken","iterate","isLoop","loginToken","except_ids","dc_id","token","authorization","bytesCmp","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","replace","bytesToBase64","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","textToSvgURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","c","children","display","Array","from","slice","el","timestamp","Date","now","diff","expires","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/53.3829958682207da0768c.chunk.js b/public/53.3829958682207da0768c.chunk.js deleted file mode 100644 index 7cd807b1..00000000 --- a/public/53.3829958682207da0768c.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[53,63,709,392,810,641,776],{9638:(e,t,n)=>{n.d(t,{Z:()=>p});var a=n(3910),o=n(2738),i=n(4541),r=n(2325),s=n(3512),d=n(4494),c=n(279);let l,u=!1;function p(e){u||(l||(l=s.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==r.ZP.lastRequestedLangCode?Promise.all([e,r.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),r.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const l=[];n.forEach((e=>{const t=r.ZP.strings.get(e.key);t&&(l.push(t),r.ZP.strings.set(e.key,e))}));const p="Login.ContinueOnLanguage",g=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:p});g.lastElementChild.classList.remove("i18n"),(0,i.Z)({text:[r.ZP.format(p,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(g)}))})),s.Z.addEventListener("language_change",(()=>{g.remove()}),{once:!0}),l.forEach((e=>{r.ZP.strings.set(e.key,e)})),(0,o.fc)(g,(e=>{(0,a.Z)(e),u=!0,g.disabled=!0,(0,c.y)(g),r.ZP.getLangPack(t.suggested_lang_code)}))}))}},6392:(e,t,n)=>{n.r(t),n.d(t,{default:()=>v});var a=n(4755),o=n(4874),i=n(810),r=n(3083),s=n(4489),d=n(2325),c=n(144),l=n(5565),u=n(3512);let p,g=null,h=null,m=null;const y=new o.Z("page-authCode",!0,(()=>{const e=g.type.length,t=new s.Z({label:"Code",name:(0,c.a)(),length:e,onFill:e=>{h(e)}});p=t.input,y.pageEl.querySelector(".input-wrapper").append(t.container),y.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return i.default.mount()}));const o=()=>{setTimeout((()=>{f.remove()}),300)},h=e=>{p.setAttribute("disabled","true");const a={phone_number:g.phone_number,phone_code_hash:g.phone_code_hash,phone_code:e};u.Z.managers.apiManager.invokeApi("auth.signIn",a,{ignoreErrors:!0}).then((e=>{switch(e._){case"auth.authorization":u.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()})),o();break;case"auth.authorizationSignUpRequired":n.e(813).then(n.bind(n,8339)).then((e=>{e.default.mount({phone_number:g.phone_number,phone_code_hash:g.phone_code_hash})})),o()}})).catch((e=>{return a=void 0,o=void 0,r=function*(){let a=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":a=!0,e.handled=!0,yield(yield n.e(774).then(n.bind(n,9437))).default.mount(),setTimeout((()=>{p.value=""}),300);break;case"PHONE_CODE_EXPIRED":p.classList.add("error"),(0,l.Z)(t.label,(0,d.ag)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":p.classList.add("error"),(0,l.Z)(t.label,(0,d.ag)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}a||t.select(),p.removeAttribute("disabled")},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var a;t.done?e(t.value):(a=t.value,a instanceof i?a:new i((function(e){e(a)}))).then(n,s)}d((r=r.apply(a,o||[])).next())}));var a,o,i,r}))},m=y.pageEl.querySelector(".auth-image"),v=a.Z.isMobile?100:166,f=new r.Z(t,v);return m.append(f.container),f.load()}),(e=>{if(g=e,h){p.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),p.dispatchEvent(e)}else h=y.pageEl.getElementsByClassName("phone")[0],m=y.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(h.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._]}(0,l.Z)(m,(0,d.ag)(t,n)),u.Z.managers.appStateManager.pushToState("authState",{_:"authStateAuthCode",sentCode:e})}),(()=>{p.focus()})),v=y},810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>C});var a=n(279),o=n(4874),i=n(9807),r=n(4494),s=n(5432),d=n(4159),c=n(2325),l=n(1447),u=n(1405),p=n(9709),g=n(9638),h=n(3910),m=n(2738),y=n(5565),v=n(1656),f=n(7487),_=n(2398),Z=n(7922),E=n(3512),b=n(709),L=n(3855),S=n(5431);let w,k=null;const P=new o.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,o;e.classList.add("input-wrapper");const u=new S.Z({onCountryChange:(e,n)=>{t=e,o=n,n&&(C.value=C.lastValue="+"+n.country_code,setTimeout((()=>{x.focus(),(0,_.Z)(x,!0)}),0))}}),C=new b.Z({onInput:e=>{l.Z.loadLottieWorkers();const{country:n,code:a}=e||{},i=n?n.name||n.default_name:"";i===u.value||t&&n&&a&&(t===n||o.country_code===a.country_code)||u.override(n,a,i),n||C.value.length-1>1?k.style.visibility="":k.style.visibility="hidden"}}),x=C.input;x.addEventListener("keypress",(e=>{if(!k.style.visibility&&"Enter"===e.key)return A()}));const T=new i.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});T.input.addEventListener("change",(()=>{const e=T.checked;E.Z.managers.appStateManager.pushToState("keepSigned",e),L.Z.toggleStorages(e,!0)})),L.Z.getState().then((e=>{Z.Z.isAvailable()?T.checked=e.keepSigned:(T.checked=!1,T.label.classList.add("checkbox-disabled"))})),k=(0,r.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),k.style.visibility="hidden";const A=e=>{e&&(0,h.Z)(e);const t=(0,v.Z)([k,w],!0);(0,y.Z)(k,(0,c.ag)("PleaseWait")),(0,a.y)(k);const o=C.value;E.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:o,api_id:d.Z.id,api_hash:d.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:o}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(C.setError(),(0,y.Z)(C.label,(0,c.ag)("Login.PhoneLabelInvalid")),x.classList.add("error"),(0,y.Z)(k,(0,c.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),k.innerText=e.type)}))};(0,m.fc)(k,A),w=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),w.addEventListener("click",(()=>{p.default.mount()})),e.append(u.container,C.container,T.label,k,w);const O=document.createElement("h4");O.classList.add("text-center"),(0,c.$d)(O,"Login.Title");const N=document.createElement("div");N.classList.add("subtitle","text-center"),(0,c.$d)(N,"Login.StartText"),P.pageEl.querySelector(".container").append(O,N,e),s.Z||setTimeout((()=>{x.focus()}),0),(0,g.Z)(e),E.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=Z.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&c.ZP.getLangPack(n.lang_code).then((()=>{C.simulateInputEvent()}));const a=new Set([1,2,3,4,5]),o=[e.this_dc];let i;return e.nearest_dc!==e.this_dc&&(i=E.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{o.push(e.nearest_dc)}))),(i||Promise.resolve()).then((()=>{o.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,i=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield f.Z.get(a))return t();setTimeout((()=>{E.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((o=void 0)||(o=Promise))((function(e,t){function r(e){try{d(i.next(e))}catch(e){t(e)}}function s(e){try{d(i.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(r,s)}d((i=i.apply(n,a||[])).next())}));var n,a,o,i};t()})),e})).then((e=>{u.value.length||C.value.length||u.selectCountryByIso2(e.country)}))}),(()=>{k&&((0,y.Z)(k,(0,c.ag)("Login.Next")),(0,u.Z)(k,void 0,void 0,!0),k.removeAttribute("disabled")),w&&w.removeAttribute("disabled"),E.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),C=P},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>y});var a=n(4874),o=n(4159),i=n(4494),r=n(2325),s=n(3512),d=n(279),c=n(9638),l=n(5418),u=n(9895);function p(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var g=function(e,t,n,a){return new(n||(n=Promise))((function(o,i){function r(e){try{d(a.next(e))}catch(e){i(e)}}function s(e){try{d(a.throw(e))}catch(e){i(e)}}function d(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,s)}d((a=a.apply(e,t||[])).next())}))};let h;const m=new a.Z("page-signQR",!0,(()=>h),(()=>{h||(h=g(void 0,void 0,void 0,(function*(){const e=m.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const y=(0,i.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(y),(0,c.Z)(a);const v=e.parentElement,f=document.createElement("h4");(0,r.$d)(f,"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((0,r.ag)(e)),_.append(t)})),v.append(f,_,a),y.addEventListener("click",(()=>{n.e(810).then(n.bind(n,810)).then((e=>e.default.mount())),E=!0}));const Z=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let E=!1;s.Z.addEventListener("user_auth",(()=>{E=!0,h=null}),{once:!0});const b={ignoreErrors:!0};let L;const S=a=>g(void 0,void 0,void 0,(function*(){try{let i=yield s.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:o.Z.id,api_hash:o.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===i._&&(b.dcId||(b.dcId=i.dc_id,s.Z.managers.apiManager.setBaseDcId(i.dc_id)),i=yield s.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:i.token},b)),"auth.loginTokenSuccess"===i._){const e=i.authorization;return s.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!L||!(0,u.Z)(L,i.token)){L=i.token;const n="tg://login?token="+function(e){let t,n="";for(let a=e.length,o=0,i=0;i>>t&24),2!==t&&a-i!=1||(n+=String.fromCharCode(p(o>>>18&63),p(o>>>12&63),p(o>>>6&63),p(63&o)),o=0);return n.replace(/A(?=A$|$)/g,"=")}(i.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""),a=window.getComputedStyle(document.documentElement),o=a.getPropertyValue("--surface-color").trim(),r=a.getPropertyValue("--primary-text-color").trim(),s=a.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>{e=e.replace(/(fill:).+?(;)/,`$1${s}$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)}))})),c=new Z({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:r,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:o},qrOptions:{errorCorrectionLevel:"L"}});let u;c.append(e),e.lastChild.classList.add("qr-canvas"),u=c._drawingPromise?c._drawingPromise:Promise.race([(0,l.Z)(1e3),new Promise((e=>{c._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){const e=Date.now()/1e3,t=i.expires-e-(yield s.Z.managers.timeManager.getServerTimeOffset());yield(0,l.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(e.handled=!0,n.e(774).then(n.bind(n,9437)).then((e=>e.default.mount())),E=!0,h=null):(console.error("pageSignQR: default error:",e),E=!0),!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(E=!1;!E&&!(yield S(!0)););}))}))),h.then((e=>{e()})),s.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),y=m}}]); -//# sourceMappingURL=53.3829958682207da0768c.chunk.js.map \ No newline at end of file diff --git a/public/53.3829958682207da0768c.chunk.js.map b/public/53.3829958682207da0768c.chunk.js.map deleted file mode 100644 index 963b1cae..00000000 --- a/public/53.3829958682207da0768c.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"53.3829958682207da0768c.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/pages/pageAuthCode.ts","webpack://tweb/./src/pages/pageSignIn.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport {AuthSentCode, AuthSentCodeType, AuthSignIn} from '../layer';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport {randomLong} from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nconst onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n // console.log('invoking auth.signIn with params:', params);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n // console.log('auth.signIn response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization':\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n // console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then((m) => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n // console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp':\r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall':\r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport Page from './page';\r\nimport CheckboxField from '../components/checkboxField';\r\nimport Button from '../components/button';\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 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 stateStorage from '../lib/stateStorage';\r\nimport rootScope from '../lib/rootScope';\r\nimport TelInputField from '../components/telInputField';\r\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\r\nimport CountryInputField from '../components/countryInputField';\r\n\r\n// import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nconst 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\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n const countryInputField = new CountryInputField({\r\n onCountryChange: (country, code) => {\r\n lastCountrySelected = country, lastCountryCodeSelected = code;\r\n\r\n if(!code) {\r\n return;\r\n }\r\n\r\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n }\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 const 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 countryInputField.override(country, code, countryName);\r\n }\r\n\r\n // if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n // console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned',\r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n\r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n // return;\r\n\r\n const phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n // lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n // console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n const 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 const tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n telInputField.simulateInputEvent();\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n\r\n g();\r\n });\r\n\r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n countryInputField.selectCountryByIso2(nearestDcResult.country);\r\n }\r\n\r\n // console.log('woohoo', nearestDcResult, country);\r\n })// .catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","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 Page from './page';\r\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nconst 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 const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n\r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\r\n // continue;\r\n }\r\n\r\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n rootScope.managers.apiManager.setUser(authorization.user);\r\n import('./pageIm').then((m) => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n const encoded = bytesToBase64(loginToken.token);\r\n const 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 const timestamp = Date.now() / 1000;\r\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\r\n\r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then((m) => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n\r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n // console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then((func) => {\r\n func();\r\n });\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","once","e","disabled","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","type","length","codeInputField","label","name","onFill","code","submitCode","input","pageEl","querySelector","container","addEventListener","cleanup","setTimeout","monkey","setAttribute","params","phone_number","phone_code_hash","phone_code","ignoreErrors","response","_","user","m","default","mount","catch","err","good","handled","value","add","innerText","select","removeAttribute","imageDiv","size","load","_authCode","evt","document","createEvent","initEvent","dispatchEvent","getElementsByClassName","args","sentCode","focus","btnQr","btnNext","inputWrapper","createElement","lastCountrySelected","lastCountryCodeSelected","countryInputField","onCountryChange","country","telInputField","lastValue","country_code","telEl","onInput","formatted","countryName","default_name","override","style","visibility","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","state","toggle","api_id","api_hash","settings","Object","assign","setError","console","error","h4","subtitle","nearestDcResult","langPack","countries","hash","lang_code","simulateInputEvent","dcs","Set","done","this_dc","promise","nearest_dc","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined","uint6ToBase64","nUint6","preloader","putPreloader","btnBack","parentElement","helpList","li","stop","QRCodeStyling","rootScope","options","prevToken","iterate","isLoop","loginToken","except_ids","dc_id","token","authorization","bytesCmp","url","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","replace","bytesToBase64","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","target","readAsDataURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","Array","from","slice","el","timestamp","Date","now","diff","expires","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/567.2a93821ac1dd3216f099.chunk.js b/public/567.2a93821ac1dd3216f099.chunk.js new file mode 100644 index 00000000..4c16f9a0 --- /dev/null +++ b/public/567.2a93821ac1dd3216f099.chunk.js @@ -0,0 +1,2 @@ +(this.webpackChunktweb=this.webpackChunktweb||[]).push([[567],{5814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(5400),n=i(3512),a=i(4762),o=i(410),r=i(8487),d=i(3772),l=i(1655),c=i(7625),h=i(2586),u=i(3013),f=i(3035);const p=new class{constructor(){this.observer=new IntersectionObserver((e=>{for(const t of e){const e=t.target;for(const i in this.byGroups){if(this.intersectionLockedGroups[i])continue;const s=this.byGroups[i].find((t=>t.el===e));if(s){if(t.isIntersecting)this.visible.add(s),this.checkAnimation(s,!1);else{this.visible.delete(s),this.checkAnimation(s,!0);const e=s.animation;e instanceof d.Z&&e.clearCache()}break}}}})),this.visible=new Set,this.overrideIdleGroups=new Set,this.byGroups={},this.byPlayer=new Map,this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,u.Z.addEventListener("play",(({doc:e})=>{"round"===e.type&&(this.videosLocked=!0,this.checkAnimations2())})),u.Z.addEventListener("pause",(()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations2())})),h.Z.addEventListener("change",(e=>{this.checkAnimations2(e)}))}setOverrideIdleGroup(e,t){t?this.overrideIdleGroups.add(e):this.overrideIdleGroups.delete(e)}getAnimations(e){const t=[];for(const i in this.byGroups)for(const s of this.byGroups[i])s.el===e&&t.push(s);return t}removeAnimation(e){const{el:t,animation:i}=e;i.remove(),i instanceof HTMLVideoElement&&a.IS_SAFARI&&setTimeout((()=>{i.src="",i.load()}),1e3);const s=this.byGroups[e.group];s&&((0,l.Z)(s,e),s.length||delete this.byGroups[e.group]),this.observer.unobserve(t),this.visible.delete(e),this.byPlayer.delete(i)}removeAnimationByPlayer(e){const t=this.byPlayer.get(e);t&&this.removeAnimation(t)}addAnimation(e,t="",i,a){var o,r,l,c;if("none"===t||this.byPlayer.has(e))return;i||(e instanceof d.Z?i=e.el[0]:e instanceof s.KZ?i=e.canvas:e instanceof s.LD?i=null!==(o=e.placeholder)&&void 0!==o?o:e:e instanceof HTMLElement&&(i=e));const h={el:i,animation:e,group:t,controlled:a};e instanceof d.Z&&!n.Z.settings.stickers.loop&&e.loop&&(e.loop=n.Z.settings.stickers.loop),(null!==(r=(l=this.byGroups)[c=t])&&void 0!==r?r:l[c]=[]).push(h),this.observer.observe(h.el),this.byPlayer.set(e,h)}checkAnimations(e,t,i,s){if(void 0!==t&&!this.byGroups[t])return;const n=void 0!==t?[t]:Object.keys(this.byGroups);for(const t of n){if(s&&this.intersectionLockedGroups[t])continue;const n=this.byGroups[t];(0,c.Z)(n,(t=>{this.checkAnimation(t,e,i)}))}}checkAnimations2(e){this.checkAnimations(e,void 0,void 0,!0)}checkAnimation(e,t,i){const{el:s,animation:n,group:a}=e;i||!this.lockedGroups[a]&&!(0,r.Z)(s)?e.controlled&&!i||this.removeAnimation(e):t||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():!(n.paused&&this.visible.has(e)&&n.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||h.Z.isIdle&&!this.overrideIdleGroups.has(e.group)||n.play()}getOnlyOnePlayableGroup(){return this.onlyOnePlayableGroup}setOnlyOnePlayableGroup(e=""){this.onlyOnePlayableGroup=e}lockGroup(e){this.lockedGroups[e]=!0}unlockGroup(e){delete this.lockedGroups[e],this.checkAnimations(void 0,e)}refreshGroup(e){const t=this.byGroups[e];(null==t?void 0:t.length)&&(t.forEach((e=>{this.observer.unobserve(e.el)})),(0,f.T2)((()=>{t.forEach((e=>{this.observer.observe(e.el)}))})))}lockIntersectionGroup(e){this.intersectionLockedGroups[e]=!0}unlockIntersectionGroup(e){delete this.intersectionLockedGroups[e],this.refreshGroup(e)}toggleIntersectionGroup(e,t){t?this.lockIntersectionGroup(e):this.unlockIntersectionGroup(e)}};o.GO&&(o.GO.animationIntersector=p);const m=p},3013:(e,t,i)=>{"use strict";i.d(t,{Z:()=>E});var s=i(3512),n=i(3725),a=i(4762),o=i(410),r=i(6669),d=i(5432),l=i(2325),c=i(3719),h=i(8479),u=i(6848),f=i(3699),p=i(7530),m=i(493),g=i(2312),v=i(925),b=i(3241),y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const w=(()=>{try{return a.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();class S extends b.Z{constructor(){super(...arguments),this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=(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=>y(this,void 0,void 0,(function*(){const t=this.mediaDetails.get(e),i=yield this.managers.appDocsManager.getDoc(t.docId);"audio"===i.type&&i.supportsStreaming&&w&&this.handleSafariStreamable(e);const s=yield this.managers.thumbsStorage.getCacheContext(i);e.src=s.url,this.playingMedia===e&&(e.playbackRate=this.playbackRate,"audio"===i.type&&(e.loop=this.loop));const n=this.waitingDocumentsForLoad[i.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[i.id])})),this.onPlay=e=>{const t=e.target,i=this.mediaDetails.get(t),{peerId:s,mid:n}=i,a=this.pip;a&&a.pause();const o=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop(),this.setMedia(t,o);const e=e=>e.mid===n&&e.peerId===s,i=this.listLoader,a=i.getCurrent();if(!a||!e(a)){let t;for(const s of[!1,!0]){const n=i.getPrevious(s);let a=n.findIndex(e);if(-1!==a?t=-(n.length-a):(a=i.getNext(s).findIndex(e),-1!==a&&(t=a+1)),void 0!==t)break}t?this.go(t,!1):this.setTargets({peerId:s,mid:n})}}setTimeout((()=>{this.playingMedia===t&&(this.dispatchEvent("play",this.getPlayingDetails()),this.pauseMediaInOtherTabs())}),0)},this.onPause=e=>{this.dispatchEvent("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(!0).length&&this.next()||(this.stop(),this.dispatchEvent("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,(0,r.Z)(e,"ended"),e===this.playingMedia){const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const i=t.peerId,s=t.isScheduled?this.scheduled:this.media,n=s.get(i);n&&(n.delete(t.mid),n.size||s.delete(i)),e.remove(),this.mediaDetails.delete(e)}this.playingMedia=void 0,this.playingMediaType=void 0}return!0},this.playItem=e=>{const{peerId:t,mid:i}=e,s=this.searchContext.isScheduled;this.getMedia(t,i,s).play(),setTimeout((()=>{this.resolveWaitingForLoadMedia(t,i,s)}),0)},this.go=(e,t)=>{const i=this.listLoader;if(!this.lockedSwitchers&&i)return"audio"===this.playingMediaType?i.goRound(e,t):i.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)}}construct(e){if(this.managers=e,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)}}s.Z.addEventListener("document_downloaded",(e=>{const t=this.waitingDocumentsForLoad[e];if(t)for(const e of t)this.onMediaDocumentLoad(e)})),s.Z.addEventListener("media_play",(()=>{this.skipMediaPlayEvent?this.skipMediaPlayEvent=!1:!this.pause()&&this.pip&&this.pip.pause()}));const t={};["volume","muted","playbackRate","loop","round"].forEach((e=>{const i="_"+e;t[e]={get:()=>this[i],set:t=>{this[i]!==t&&(this[i]=t,!this.playingMedia||"loop"===e&&"audio"!==this.playingMediaType||"round"===e||(this.playingMedia[e]=t),"playbackRate"===e&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=t),this.dispatchPlaybackParams())}}})),Object.defineProperties(this,t)}dispatchPlaybackParams(){this.dispatchEvent("playbackParams",this.getPlaybackParams())}getPlaybackParams(){const{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}=this;return{volume:e,muted:t,playbackRate:i,playbackRates:s,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,i){const{peerId:a,mid:o}=e,r=e.pFlags.is_scheduled?this.scheduled:this.media;let d=r.get(e.peerId);d||r.set(e.peerId,d=new Map);let l=d.get(o);if(l)return l;const c=(0,p.Z)(e);d.set(o,l=document.createElement("round"===c.type||"video"===c.type?"video":"audio")),"round"===c.type&&l.setAttribute("playsinline","true");const h={peerId:a,mid:o,docId:c.id,doc:c,message:e,clean:i,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(l,h),l.volume=1,this.container.append(l),l.addEventListener("play",this.onPlay),l.addEventListener("pause",this.onPause),l.addEventListener("ended",this.onEnded),"audio"!==c.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==s.Z.myId&&l.addEventListener("timeupdate",(()=>{this.managers.appMessagesManager.readMessages(a,[o])}),{once:!0});const u=(0,n.Z)();if(t)u.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let i=t.get(a);i||t.set(a,i=new Map),i.set(o,u)}return u.then((()=>y(this,void 0,void 0,(function*(){if(c.supportsStreaming||(yield this.managers.thumbsStorage.getCacheContext(c)).url)this.onMediaDocumentLoad(l);else{let e=this.waitingDocumentsForLoad[c.id];e||(e=this.waitingDocumentsForLoad[c.id]=new Set),e.add(l),g.Z.downloadMediaURL({media:c})}})))),l}getMedia(e,t,i){const s=(i?this.scheduled:this.media).get(e);return null==s?void 0:s.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,i){const s=i?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=s.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||s.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var i,s;return y(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield(0,v.Z)(t,void 0,!1);const n=(0,p.Z)(e),o=[],r="voice"===n.type||"round"===n.type;let c="",h="";if(null===(i=n.thumbs)||void 0===i?void 0:i.length){const i=n.thumbs[n.thumbs.length-1];if(!i.bytes){const s=yield this.managers.thumbsStorage.getCacheContext(n,i.type);s.url?o.push({src:s.url,sizes:`${i.w}x${i.h}`,type:"image/jpeg"}):g.Z.downloadMediaURL({media:n,thumb:i}).then((()=>{this.playingMedia===t&&s.url&&this.setNewMediadata(e)}))}}else if(r){const t=e.fromId||e.peerId;yield this.managers.appPeersManager.getPeerPhoto(t),c=yield(0,m.Z)({peerId:t,plainText:!0,onlyFirstName:!1}),h=l.ZP.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!r){const e=n.attributes.find((e=>"documentAttributeAudio"===e._));c=null!==(s=null==e?void 0:e.title)&&void 0!==s?s:n.file_name,h=null==e?void 0:e.performer}o.length||(a.IS_APPLE?d.Z?o.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):o.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}`;o.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})})));const u=new MediaMetadata({title:c,artist:h,artwork:o});navigator.mediaSession.metadata=u}))}setCurrentMediadata(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);this.setNewMediadata(t,e)}getMessageByMedia(e){return this.mediaDetails.get(e).message}getPlayingDetails(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);return{doc:(0,p.Z)(t),message:t,media:e,playbackParams:this.getPlaybackParams()}}pauseMediaInOtherTabs(){this.skipMediaPlayEvent=!0,s.Z.dispatchEvent("media_play")}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!(0,u.Z)(this.searchContext,e)&&(this.searchContext=(0,h.Z)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,i){let s=this.listLoader;s?s.reset():s=this.listLoader=new c.Z({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{this.dispatchEvent("stop"),this.stop()}});const n=void 0===this.searchContext.folderId;t?s.setTargets(t,i,n):s.reverse=n,s.setSearchContext(this.searchContext),s.current=e,s.load(!0),s.load(!1)}getPlaybackMediaTypeFromMessage(e){const t=(0,p.Z)(e);let i="audio";return(null==t?void 0:t.type)&&("voice"===t.type||"round"===t.type?i="voice":"video"===t.type&&(i="video")),i}setMedia(e,t){const i=this.getPlaybackMediaTypeFromMessage(t);this._playbackRate=this.playbackRates[i],this.playingMedia=e,this.playingMediaType=i,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"audio"===i&&(this.playingMedia.loop=this.loop),"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const i=this.playingMedia,s=this.pause();let n;return e?(n=()=>{const e=this.pip;e&&e.pause(),this.pauseMediaInOtherTabs()},e.paused||n(),e.addEventListener("play",n)):this.pauseMediaInOtherTabs(),this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),(t=s)=>{this.toggleSwitchers(!0),i&&(this.mediaDetails.get(i)?this.setMedia(i,this.getMessageByMedia(i)):this.next()||this.previous()),this.playingMedia===e&&(this.playingMedia=void 0,this.playingMediaType=void 0),e&&e.removeEventListener("play",n),t&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}setPictureInPicture(e){this.pip=e;const t=new f.Z;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(),this.pauseMediaInOtherTabs()}))}}const C=new S;o.GO.appMediaPlaybackController=C;const E=C},1784:(e,t,i)=>{"use strict";i.d(t,{Z:()=>E});var s=i(2341),n=i(3910),a=i(2738),o=i(8497),r=i(4668),d=i(130),l=i(4755),c=i(3719),h=i(2312),u=i(9355),f=i(3709),p=i(7530),m=i(5400),g=i(5824),v=i(5128),b=i(4524),y=i(8805),w=i(4332),S=i(1669),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class E extends g.Z{constructor(){let e;super(new c.Z({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:i,peerId:s}=e,n=(0,p.Z)(e);if(n&&(!t||E.isMediaCompatibleForDocumentViewer(n)))return{element:null,mid:i,peerId:s}}}),["delete","forward"]),this.onPrevClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,-1)})),this.onNextClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,1)})),this.onDeleteClick=()=>{const e=this.target;new v.Z(e.peerId,[e.mid],"chat",(()=>{this.target={element:this.content.media},this.close()}))},this.onForwardClick=()=>{const e=this.target;e.mid&&new b.Z({[e.peerId]:[e.mid]},(()=>this.close()))},this.onAuthorClick=e=>C(this,void 0,void 0,(function*(){const{mid:t,peerId:i}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const s=this.searchContext.threadId,n=yield this.getMessageByPeer(i,t);this.close(e).then((()=>C(this,void 0,void 0,(function*(){if(l.Z.isMobile){const e=w.ZP.getTab(S.Z);e&&e.close()}u.Z.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:s?"discussion":void 0,threadId:s})}))))}})),this.onDownloadClick=()=>C(this,void 0,void 0,(function*(){const{peerId:e,mid:t}=this.target,i=yield this.getMessageByPeer(e,t),s=(0,p.Z)(i);s&&h.Z.downloadToDisc({media:s,queueId:u.Z.chat.bubbles.lazyLoadQueue.queueId})})),this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add(g.x+"-caption","spoilers-container");const t=()=>{e&&clearTimeout(e),e=window.setTimeout((()=>{e=void 0,this.content.caption.classList.remove("is-focused")}),800)};this.content.caption.addEventListener("touchstart",(()=>{l.Z.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))})),new y.ZP(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),(0,a.fc)(this.buttons.delete,this.onDeleteClick);const i=[this.btnMenuForward={icon:"forward",text:"Forward",onClick:this.onForwardClick},this.btnMenuDownload={icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},this.btnMenuDelete={icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(i),this.setListeners()}get searchContext(){return this.listLoader.searchContext}setListeners(){super.setListeners(),(0,a.fc)(this.buttons.forward,this.onForwardClick),(0,a.fc)(this.author.container,this.onAuthorClick);const e=t=>{const i=(0,r.Z)(t.target,"A"),s=(0,o.Z)(t.target,"spoiler");if(i instanceof HTMLAnchorElement&&(!s||this.content.caption.classList.contains("is-spoiler-visible"))){const s=i.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return(0,n.Z)(t),this.close().then((()=>{this.content.caption.removeEventListener("click",e,{capture:!0}),i.click()})),!1}};this.content.caption.addEventListener("click",e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?this.managers.appMessagesManager.getScheduledMessageByPeer(e,t):this.managers.appMessagesManager.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let i="";t&&(i=(0,m.ZP)(t,{entities:e.totalEntities})),(0,d.Z)(this.content.caption.firstElementChild,i),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,i=0,s=!1,n=[],a=[]){const o=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return C(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const r=e.mid,d=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,l=(0,p.Z)(e),c=yield this.managers.appPeersManager.noForwards(e.peerId),h="messageService"===e._,u=h||!(yield this.managers.appMessagesManager.canForward(e)),m=(h?c:u)||!(0,f.Z)(e);[[[this.buttons.forward,this.btnMenuForward],u],[[this.buttons.download,this.btnMenuDownload],m],[[this.buttons.delete,this.btnMenuDelete],!(yield this.managers.appMessagesManager.canDeleteMessage(e))]].forEach((([e,t])=>{e.forEach((e=>{e instanceof HTMLElement?e.classList.toggle("hide",t):e.verify=()=>!t}))})),this.wholeDiv.classList.toggle("no-forwards",m),this.setCaption(e);const g=o._openMedia.call(this,l,e.date,d,i,t,s,n,a,e);return this.target.mid=r,this.target.peerId=e.peerId,g}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||s.Z.has(e.mime_type)}}},5824:(e,t,i)=>{"use strict";i.d(t,{x:()=>q,Z:()=>Q});var s=i(3725),n=i(4755),a=i(5432),o=i(4762),r=i(5003),d=i(3013),l=i(3910),c=i(3699),h=i(3003),u=i(5322),f=i(7529),p=i(6733),m=i(5157),g=i(7207),v=i(8427),b=i(5701),y=i(3815),w=i(925),S=i(2738);class C extends f.Z{constructor({video:e,play:t=!1,streamable:i=!1,duration:s,onPlaybackRackMenuToggle:n,onPip:a,onPipClose:o}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.onPip=a,this.onPipClose=o,this.listenerSetter=new c.Z,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!(this.video.paused||this.playbackRateButton&&this.playbackRateButton.classList.contains("menu-open")),showOnLeaveToClassName:"media-viewer-caption",ignoreClickClassName:"ckin__controls"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(s),this.setBtnMenuToggle(),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new g.Z(e,i),t.prepend(this.progress.container)}t&&e.play().catch((t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())})).finally((()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)}))}stylePlayer(e){const{wrapper:t,video:i,skin:s,listenerSetter:n}=this;t.classList.add(s);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===s){this.playbackRateButton=this.wrapper.querySelector(".playback-rate"),this.pipButton=this.wrapper.querySelector(".pip");const e=t.querySelectorAll(".toggle"),s=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.textContent=(0,m.Z)(0|i.duration);const c=new v.Z(n),h=t.querySelector(".left-controls");if(c.btn.classList.remove("btn-icon"),h.insertBefore(c.btn,o.parentElement),Array.from(e).forEach((e=>{(0,S.fc)(e,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter})})),this.pipButton){(0,S.fc)(this.pipButton,(()=>{this.video.requestPictureInPicture()}),{listenerSetter:this.listenerSetter});const e=e=>{this.wrapper.style.visibility=e?"hidden":"",this.onPip&&this.onPip(e)},t=20,s=(0,b.Z)(e,t,!1,!0);n.add(i)("enterpictureinpicture",(()=>{s(!0),n.add(i)("leavepictureinpicture",(()=>{const e=n.add(i)("pause",(()=>{clearTimeout(s),this.onPipClose&&this.onPipClose()}),{once:!0}),s=setTimeout((()=>{n.remove(e)}),t)}),{once:!0})})),n.add(i)("leavepictureinpicture",(()=>{s(!1)}))}a.Z||((0,S.fc)(i,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter}),n.add(document)("keydown",(e=>{if(y.Z.overlaysActive>1||document.pictureInPictureElement===i)return;const{key:s,code:n}=e;let a=!0;if("KeyF"===n)this.toggleFullScreen();else if("KeyM"===n)d.Z.muted=!d.Z.muted;else if("Space"===n)this.togglePlay();else if(!e.altKey||"Equal"!==n&&"Minus"!==n)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?a=!1:"ArrowLeft"===s?d.Z.seekBackward({action:"seekbackward"}):d.Z.seekForward({action:"seekforward"});else{const e="Equal"===n?1:-1,t=d.Z.playbackRate,i=C.PLAYBACK_RATES.indexOf(t)+e;i>=0&&i{a.Z||this.toggleFullScreen()})),(0,S.fc)(s,(()=>{this.toggleFullScreen()}),{listenerSetter:this.listenerSetter}),(0,p.Ms)(t,this.onFullScreen.bind(this,s),n),n.add(i)("timeupdate",(()=>{o.textContent=(0,m.Z)(0|i.currentTime)})),n.add(i)("play",(()=>{t.classList.add("played"),a.Z||n.add(i)("play",(()=>{this.hideControls(!0)}))}),{once:!0}),n.add(i)("pause",(()=>{this.showControls(!1)})),n.add(d.Z)("playbackParams",(()=>{this.setPlaybackRateIcon()}))}n.add(i)("play",(()=>{t.classList.add("is-playing")})),n.add(i)("pause",(()=>{t.classList.remove("is-playing")})),i.duration||e?r.textContent=(0,m.Z)(Math.round(i.duration||e)):(0,w.Z)(i).then((()=>{r.textContent=(0,m.Z)(Math.round(i.duration))}))}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!o.IS_MOBILE&&document.pictureInPictureEnabled?``:""}\n \n
\n
\n
`}setBtnMenuToggle(){const e=C.PLAYBACK_RATES.map(((e,t)=>({regularText:e+"x",onClick:()=>{d.Z.playbackRate=e}}))),t=(0,h.b)({buttons:e});t.classList.add("top-left"),(0,u.v)({el:this.playbackRateButton,onOpen:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,onClose:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0}),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;C.PLAYBACK_RATES_ICONS.forEach((t=>{t="tgico-"+t,e.classList.remove(t)}));let t=C.PLAYBACK_RATES.indexOf(d.Z.playbackRate);-1===t&&(t=C.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+C.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(o.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}(0,p.rB)()?(0,p.C8)():(0,p.Dj)(e)}onFullScreen(e){const t=(0,p.rB)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}cleanup(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=this.onPip=void 0}}C.PLAYBACK_RATES=[.5,1,1.5,2],C.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var E=i(3512),L=i(5814),I=i(9331),M=i(2230),P=i(3442),Z=i(3757),k=i(632),T=i(9818),x=i(8497),A=i(6740),_=i(8204),F=i(9171),D=i(5565),R=i(3035),B=i(65),N=i(241),O=i(3241),U=i(1507),H=i(7660),z=i(8580),j=i(1713),G=i(8115),V=i(4421),K=i(2312),W=i(7362),$=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const q="media-viewer";class Q extends O.Z{constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if((0,l.Z)(e),a.Z)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout((()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0}),3e3));const i=this.isZooming();let s=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];i&&n.push("media-viewer-movers"),n.find((e=>{try{if(s=(0,x.Z)(t,e),s)return!0}catch(e){return!1}})),s&&(i||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(y.Z.overlaysActive>1)return;const t=e.key;let i=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):i=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),i&&(0,l.Z)(e)},this.onKeyUp=e=>{y.Z.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(y.Z.overlaysActive>1||(0,x.Z)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&((0,l.Z)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.managers=E.Z.managers,this.log=(0,r.kg)("AMV"),this.preloader=new P.Z,this.preloaderStreamable=new P.Z({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new V.Z,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add(q+"-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const i=document.createElement("div");i.classList.add(q);const s=this.topbar=document.createElement("div");s.classList.add(q+"-topbar",q+"-appear");const n=document.createElement("div");n.classList.add(q+"-topbar-left"),this.buttons["mobile-close"]=(0,M.Z)("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add(q+"-author","no-select");const o=document.createElement("div");this.author.avatarEl=new I.Z,this.author.avatarEl.classList.add(q+"-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add(q+"-name"),this.author.date=document.createElement("div"),this.author.date.classList.add(q+"-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const d=document.createElement("div");d.classList.add(q+"-buttons"),t.concat(["download","zoom","close"]).forEach((e=>{const t=(0,M.Z)(e,{noRipple:!0});this.buttons[e]=t,d.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=(0,M.Z)("zoomout",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnOut,(()=>this.changeZoom(!1))),this.zoomElements.btnIn=(0,M.Z)("zoomin",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnIn,(()=>this.changeZoom(!0))),this.zoomElements.rangeSelector=new B.Z({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(q+"-content"),this.content.container=document.createElement("div"),this.content.container.classList.add(q+"-container"),this.content.media=document.createElement("div"),this.content.media.classList.add(q+"-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),i.append(this.content.main),this.overlaysDiv.append(i),n.append(this.buttons["mobile-close"],this.author.container),s.append(n,d),this.buttons.prev=document.createElement("div"),this.buttons.prev.className=`${q}-switcher ${q}-switcher-left`,this.buttons.prev.innerHTML=``,this.buttons.next=document.createElement("div"),this.buttons.next.className=`${q}-switcher ${q}-switcher-right`,this.buttons.next.innerHTML=``,this.moversContainer=document.createElement("div"),this.moversContainer.classList.add(q+"-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.listLoader.onLoadedMore=()=>{this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length)},this.setNewMover()}get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}setListeners(){(0,S.fc)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach((e=>{(0,S.fc)(e,this.close.bind(this))})),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach((([e,t])=>{t.addEventListener("click",(t=>{(0,l.Z)(t),this.setMoverPromise||this.listLoader.go(e)}))})),(0,S.fc)(this.buttons.zoom,(()=>{this.isZooming()?this.toggleZoom(!1):this.changeZoom(!0)})),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)},a.Z&&new Z.Z({element:this.wholeDiv,onSwipe:(e,t)=>{if(!(0,p.rB)())return Math.abs(e)/N.Z.width>.2||e>125?(e<0?this.buttons.prev.click():this.buttons.next.click(),!0):(Math.abs(t)/N.Z.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!(0,x.Z)(e.target,"media-viewer-caption")})}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const i=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(i),this.zoomElements.rangeSelector.setProgress(i),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const i=-1;this.zoomSwipeHandler=new Z.Z({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(s,n)=>{[s,n]=[s*i,n*i],this.zoomSwipeX+=s-e,this.zoomSwipeY+=n-t,[e,t]=[s,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(i)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=(0,u.Z)({buttonOptions:{onlyMobile:!0},direction:"bottom-left",buttons:e});this.topbar.append(t)}close(e){var t;if(e&&(0,l.Z)(e),this.setMoverAnimationPromise)return Promise.reject();this.navigationItem&&T.Z.removeItem(this.navigationItem),this.lazyLoadQueue.clear();const i=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then((({onAnimationEnd:e})=>e));return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer===this&&(window.appMediaViewer=void 0),this.removeGlobalListeners(),this.zoomSwipeHandler=void 0,i.finally((()=>{this.wholeDiv.remove(),this.toggleOverlay(!1)})),i}toggleOverlay(e){y.Z.isOverlayActive=e,L.Z.checkAnimations2(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),a.Z||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0})}setMoverToTarget(e,t=!1,i=0){return $(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const n=this.content.mover;t||(n.innerHTML="");const a=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(n);const o=0!==i,r=E.Z.settings.animationsEnabled?o?350:200:0;let d,l;e&&(e instanceof I.Z||e.classList.contains("grid-item")?(d=e,l=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(d=(0,x.Z)(e,"attachment"),l=d.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(d=(0,x.Z)(e,"profile-avatars-container"),l=d.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==l.left&&(e=d=l=void 0))),e||(e=this.content.media),l||(d=e.parentElement,l=e.getBoundingClientRect());let c=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const i=(0,x.Z)(d,"scrollable"),s=(0,_.Z)(d,i,!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(c=!0):(d=(e=this.content.media).parentElement,l=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let u,f,p,m="";if(o?(u=1===i?N.Z.width:-h.width,f=h.top):(u=l.left,f=l.top),m+=`translate3d(${u}px,${f}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(n.firstElementChild&&n.firstElementChild.classList.contains("media-viewer-aspecter")){p=n.firstElementChild;const e=p.querySelector(".ckin__player");if(e){const t=e.firstElementChild;p.append(t),e.remove()}p.style.cssText||(n.classList.remove("active"),this.setFullAspect(p,h,l),n.offsetLeft,n.classList.add("active"))}else p=document.createElement("div"),p.classList.add("media-viewer-aspecter"),n.prepend(p);p.style.cssText=`width: ${l.width}px; height: ${l.height}px; transform: scale3d(${h.width/l.width}, ${h.height/l.height}, 1);`}n.style.width=h.width+"px",n.style.height=h.height+"px";const g=l.width/h.width,v=l.height/h.height;o||(m+=`scale3d(${g},${v},1) `);let b=window.getComputedStyle(d).getPropertyValue("border-radius");const y=function(e){const 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}(b);if(b=y.map((e=>parseInt(e)/g+"px")).join(" "),o||(n.style.borderRadius=b),t&&1!==a){const e=N.Z.width/2-l.width/2,t=N.Z.height/2-l.height/2,i=l.left-e,s=l.top-t;this.moversContainer.style.transform=`matrix(${g}, 0, 0, ${v}, ${i}, ${s})`}else n.style.transform=m;let w;c&&(n.style.opacity="0");const S=e.classList.contains("is-out"),C=this.setMoverAnimationPromise=(0,s.Z)(),L={onAnimationEnd:C},M=setTimeout((()=>{C.isFulfilled||C.isRejected||C.resolve()}),1e3);if(C.finally((()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===C&&(this.setMoverAnimationPromise=null),clearTimeout(M)})),t)return e instanceof SVGSVGElement&&(w=n.querySelector("path"),w&&this.sizeTailPath(w,h,g,r,!1,S,b)),e.classList.contains("media-viewer-media")&&n.classList.add("hiding"),this.toggleWholeActive(!1),setTimeout((()=>{n.style.borderRadius=b,n.firstElementChild&&(n.firstElementChild.style.borderRadius=b)}),r/2),setTimeout((()=>{n.innerHTML="",n.classList.remove("moving","active","hiding"),n.style.cssText="display: none;",C.resolve()}),r),n.classList.remove("opening"),L;{let t,i;const s="video, img, .canvas-thumbnail",a=e.matches(s)?e.parentElement:e,r=Array.from(a.querySelectorAll(s));if(r.length){e=r.pop();const t=document.createElement("canvas"),i=t.getContext("2d");e instanceof HTMLImageElement?(t.width=e.naturalWidth,t.height=e.naturalHeight):e instanceof HTMLVideoElement?(t.width=e.videoWidth,t.height=e.videoHeight):e instanceof HTMLCanvasElement&&(t.width=e.width,t.height=e.height),t.className="canvas-thumbnail thumbnail media-photo",i.drawImage(e,0,0),e=t}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const s=Array.from(e.querySelectorAll("img")).pop();s&&(t=new Image,i=s.src,n.append(t))}else if(e instanceof HTMLImageElement)t=new Image,i=e.src;else if(e instanceof HTMLVideoElement)t=(0,H.Z)(),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,i=t+"-mv",{width:s,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+s),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${s} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,i)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,i));const r=o.firstElementChild,d=r.firstElementChild.firstElementChild;if(d instanceof SVGUseElement){let e,t=d.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,((e,t,i,n,o)=>`translate(${t=2!=(t=+t)?s-2/g:2/g}, ${a}) scale(${+n/g}, ${+o/v})`)),d.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const i=b.split(" ").map((e=>parseInt(e)));e=S?(0,F.Z)(0,0,s-9/g,a,...i):(0,F.Z)(9/g,0,s-9/g,a,...i),w.setAttributeNS(null,"d",e)}const l=o.lastElementChild;l.setAttributeNS(null,"width",""+h.width),l.setAttributeNS(null,"height",""+h.height),n.prepend(o)}else e instanceof HTMLCanvasElement&&(t=e);p&&(p.style.borderRadius=b,t&&p.append(t)),t=n.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),p||(t.style.width=h.width+"px",t.style.height=h.height+"px"),i&&(yield(0,A.cj)(t,i))),n.style.display="",(0,R.T2)((()=>{n.classList.add(o?"moving":"active")}))}return n.classList.add("opening"),yield(0,R.d1)(),n.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,c&&(n.style.opacity=""),p&&this.setFullAspect(p,h,l),setTimeout((()=>{n.style.borderRadius="",n.firstElementChild&&(n.firstElementChild.style.borderRadius="")}),0),n.dataset.timeout=""+setTimeout((()=>{n.classList.remove("moving","opening"),p&&(n.querySelector("video"),n.classList.remove("active"),p.style.cssText="",n.offsetLeft),n.classList.add("center","no-transition"),n.classList.add("active"),delete n.dataset.timeout,C.resolve()}),r),w&&this.sizeTailPath(w,h,g,r,!0,S,b),L}))}toggleWholeActive(e){e?this.wholeDiv.classList.add("active"):(this.wholeDiv.classList.add("backwards"),setTimeout((()=>{this.wholeDiv.classList.remove("active")}),0))}setFullAspect(e,t,i){const s=t.width/t.height;let{width:n,height:a}=i;s>0?n=a*s:a=n*s,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,i,s,n,a,o){const r=Date.now(),{width:d,height:l}=t;s/=2;const c=o.split(" ").map((e=>parseInt(e))),h=()=>{const t=Date.now()-r;let o=s?t/s:1;o>1&&(o=1),n&&(o=1-o);const u=c.map((e=>e*o));let f;f=a?(0,F.Z)(0,0,d-9/i*o,l,...u):(0,F.Z)(9/i*o,0,d,l,...u),e.setAttributeNS(null,"d",f),t{const a=t?-s.width:i;return e.replace(n,a+"px")}));e.style.transform=n,setTimeout((()=>{e.remove()}),350)}setNewMover(){const e=document.createElement("div");return e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover?this.content.mover.parentElement.append(e):this.moversContainer.append(e),this.content.mover=e}updateMediaSource(e,t,i){const s=e.tagName.toLowerCase()===i?e:e.querySelector(i);if(s&&!(0,x.Z)(e,"document")){if((0,x.Z)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===i)return void(t.classList.contains("manual")&&t.click());t.remove()}}s.src!==t&&(0,A.ZP)(s,t),s.classList.contains("thumbnail")&&s.parentElement.classList.contains("media-container-aspecter")&&s.classList.remove("thumbnail")}}setAuthorInfo(e,t){const i=e.isPeerId();let s;if(i)s=(0,W.Z)({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1});else{const t=s=document.createElement("span");t.append((0,G.Z)(e)),t.classList.add("peer-title")}const n=this.author.avatarEl,a=this.author.avatarEl=n.cloneNode();return Promise.all([this.author.avatarEl.updateWithOptions({peerId:e||U.NM,peerTitle:i?void 0:""+e}),s]).then((([e,i])=>{this.author.avatarEl===a&&((0,D.Z)(this.author.date,(0,k.OD)(t)),(0,D.Z)(this.author.nameEl,i),n.replaceWith(this.author.avatarEl))}))}_openMedia(e,t,i,s,a,r=!1,c=[],h=[],u){return $(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const f=this.setAuthorInfo(i,t),p="document"===e._,m=p&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(c,h,r),window.appMediaViewer=this),this.listLoader.next.length<10&&setTimeout((()=>{this.listLoader.load(!0)}),0),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const g=this.content.media,v=!a||a===g;v&&(a=g),this.target={element:a};const b=++this.tempId;g.firstElementChild&&(g.innerHTML=""),0!==s?(this.moveTheMover(this.content.mover,1===s),this.setNewMover()):(this.toggleOverlay(!0),this.setGlobalListeners(),yield f,this.wholeDiv.parentElement||(this.pageEl.insertBefore(this.wholeDiv,document.getElementById("main-columns")),this.wholeDiv.offsetLeft),this.toggleWholeActive(!0),o.IS_MOBILE_SAFARI||(this.navigationItem={type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}},T.Z.pushItem(this.navigationItem)));const y=this.content.mover,w=N.Z.width;let S=0;const E=N.Z.height;E<1e6&&!n.Z.isMobile&&(S=120);const L=E-120-S;let I=Promise.resolve();const M=(0,j.Z)(e,g,w,L,!n.Z.isMobile,void 0,!!(p&&e.w&&e.h)).photoSize;if(v){const t=yield this.managers.thumbsStorage.getCacheContext(e,M.type);let i;if(t.downloaded)i=new Image,i.src=t.url;else{const s=(0,z.Z)(e,t,!0);s&&(I=s.loadPromise,i=s.image)}i&&(i.classList.add("thumbnail"),g.append(i))}const P=!(!p||!e.supportsStreaming),Z=P?this.preloaderStreamable:this.preloader,k=()=>this.managers.thumbsStorage.getCacheContext(e,null==M?void 0:M.type);let x;if(m){const t=u&&"gif"!==e.type,i=(0,H.Z)({pip:t});this.wholeDiv.classList.contains("no-forwards")&&i.addEventListener("contextmenu",l.Z);const n=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:s})=>{const n=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,r=y.querySelector("video");r&&r.remove(),i.setAttribute("playsinline","true"),i.addEventListener("timeupdate",(()=>{this.tempId!==b&&i.pause()})),this.addEventListener("setMoverAfter",(()=>{i.src="",i.load()}),{once:!0}),o.IS_SAFARI&&(i.autoplay=!0),"gif"===e.type?(i.muted=!0,i.autoplay=!0,i.loop=!0):e.duration<60&&(i.loop=!0),n.append(i);const c=new Promise((e=>{i.addEventListener("canplay",e,{once:!0})})),h=()=>{"gif"!==e.type&&(i.dataset.ckin="default",i.dataset.overlay="1",Promise.all([c,s]).then((()=>{this.tempId===b&&((this.videoPlayer=new C({video:i,play:!0,streamable:P,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)},onPip:e=>{const s=window.appMediaViewer;if(!e&&s&&s!==this)return this.releaseSingleMedia=void 0,void this.close();this.moversContainer.lastElementChild.classList.toggle("hiding",e),this.toggleWholeActive(!e),this.toggleOverlay(!e),this.toggleGlobalListeners(!e),this.navigationItem&&(e?T.Z.removeItem(this.navigationItem):T.Z.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,d.Z.setPictureInPicture(i)):this.releaseSingleMedia=d.Z.setSingleMedia(i,u))},onPipClose:()=>{this.close()}})).addEventListener("toggleControls",(e=>{this.wholeDiv.classList.toggle("has-video-controls",e)})),this.addEventListener("setMoverBefore",(()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.cleanup(),this.videoPlayer=void 0}),{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1))})))};if(P){s.then((()=>{i.readyState{i.addEventListener("canplay",(()=>{Z.detach(),i.parentElement.classList.remove("is-buffering")}),{once:!0})};i.addEventListener("waiting",(()=>{const t=i.networkState===i.NETWORK_LOADING,s=i.readyState{(0,l.Z)(e)})),e()}this.lazyLoadQueue.unshift({load:()=>$(this,void 0,void 0,(function*(){const o=P?Promise.resolve():K.Z.downloadMediaURL({media:e});return P||s.then((()=>$(this,void 0,void 0,(function*(){(yield k()).url||Z.attach(y,!0,o)})))),Promise.all([o,s]).then((()=>$(this,void 0,void 0,(function*(){if(this.tempId!==b)return void this.log.warn("media viewer changed video");const e=(yield k()).url;i.addEventListener("error",(()=>{4!==i.error.code&&this.log.error("Error "+i.error.code+"; details: "+i.error.message),Z&&Z.detach()}),{once:!0}),a instanceof SVGSVGElement?n.firstElementChild.lastElementChild.append(i):(0,A.ZP)(i,e),t&&(this.releaseSingleMedia=d.Z.setSingleMedia(i,u),this.addEventListener("setMoverBefore",(()=>{this.releaseSingleMedia&&(this.releaseSingleMedia(),this.releaseSingleMedia=void 0)}),{once:!0})),this.updateMediaSource(a,e,"video"),h()})))),o}))})}));x=I.then(n)}else{const t=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>$(this,void 0,void 0,(function*(){const i=p?K.Z.downloadMediaURL({media:e}):K.Z.downloadMediaURL({media:e,thumb:M});return t.then((()=>$(this,void 0,void 0,(function*(){(yield k()).url||this.preloader.attachPromise(i)})))),Promise.all([t,i]).then((()=>$(this,void 0,void 0,(function*(){var e;if(this.tempId!==b)return void this.log.warn("media viewer changed photo");const t=(yield k()).url;if(a instanceof SVGSVGElement){if(this.updateMediaSource(a,t,"img"),this.updateMediaSource(y,t,"img"),n.Z.isMobile){const e=y.querySelectorAll("img");e&&e.length&&e.forEach((e=>{e.classList.remove("thumbnail")}))}}else{const i=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,s="IMG"===(null===(e=i.firstElementChild)||void 0===e?void 0:e.tagName)?i.firstElementChild:null;if(!s||s.src!==t){const e=new Image;e.classList.add("thumbnail"),(0,A.ZP)(e,t,(()=>{this.updateMediaSource(a,t,"img"),s&&(0,R.T2)((()=>{s.remove()})),i.append(e)}))}}})))).catch((e=>{this.log.error(e),this.preloader.attach(y),this.preloader.setManual()})),i}))})}));x=I.then(t)}return this.setMoverPromise=x.catch((()=>{this.setMoverAnimationPromise=null})).finally((()=>{this.setMoverPromise=null}))}))}}},9818:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(410),n=i(4762),a=i(5003),o=i(8799),r=i(3910),d=i(3444),l=i(1655);const c=new class{constructor(){if(this.onPopState=e=>{const t=window.location.hash,i=e.state;if(this.debug&&this.log("popstate",e,this.isPossibleSwipe,t),t!==this.currentHash)if(this.debug&&this.log.warn(`hash changed, new=${t}, current=${this.currentHash}, overridden=${this.overriddenHash}`),i===this.id&&this.overriddenHash&&this.overriddenHash!==t)this.overrideHash(this.overriddenHash);else{if(!i||this.overriddenHash||!t)return this.currentHash=t,void(this.onHashChange&&this.onHashChange());this.overrideHash()}if(i!==this.id&&(this.pushState(),!this.navigations.length))return;const s=this.navigations.pop();s?(this.manual=!this.isPossibleSwipe,this.handleItem(s)):this.pushState()},this.onKeyDown=e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||((0,r.Z)(e),this.back(t.type)))},this.onTouchStart=e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),(0,d.Z)(e)&&(this.isPossibleSwipe=!0,window.addEventListener("touchend",(()=>{setTimeout((()=>{this.isPossibleSwipe=!1}),100)}),{passive:!0,once:!0})))},this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=(0,a.kg)("NC"),this.debug=!0,this.currentHash=window.location.hash,this.overriddenHash="",this.isPossibleSwipe=!1,window.addEventListener("popstate",this.onPopState),window.addEventListener("keydown",this.onKeyDown,{capture:!0,passive:!1}),n.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",this.onTouchStart,e)}history.scrollRestoration="manual",this.pushState()}overrideHash(e=""){e&&"#"!==e[0]?e="#"+e:"#"===e&&(e=""),this.currentHash!==e&&(this.overriddenHash=this.currentHash=e,this.replaceState(),this.pushState())}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||(0,o.Z)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const i=this.navigations[t];if(i.type===e)return{item:i,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}onItemAdded(e){this.debug&&this.log("onItemAdded",e,this.navigations),e.noHistory||this.pushState()}pushItem(e){this.navigations.push(e),this.onItemAdded(e)}unshiftItem(e){this.navigations.unshift(e),this.onItemAdded(e)}spliceItems(e,t,...i){this.navigations.splice(e,t,...i),i.forEach((e=>{this.onItemAdded(e)}))}pushState(){this.debug&&this.log("push"),this.manual=!1,history.pushState(this.id,"")}replaceState(){this.debug&&this.log.warn("replace");const e=location.origin+location.pathname+location.search+this.overriddenHash;history.replaceState(this.id,"",e)}removeItem(e){e&&(0,l.Z)(this.navigations,e)}removeByType(e,t=!1){for(let i=this.navigations.length-1;i>=0&&(this.navigations[i].type!==e||(this.navigations.splice(i,1),!t));--i);}};s.GO.appNavigationController=c;const h=c},5884:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,z:()=>d});var s=i(8130),n=i(8805),a=i(5565),o=i(2325),r=i(3512);class d{constructor(e,t,i=!0,n,a=!0,r=!0,d,l){this.name=e,this.type=t,this.clearable=i,this.autonomous=r,this.onFound=d,this.noIcons=l,this.list=s.default.createChatList(),this.container=document.createElement("div"),n&&(this.container.className=n),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append((0,o.ag)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",a&&s.default.setListClickListener(this.list,d,void 0,r)}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 l{constructor(e,t,i,s,a){this.container=e,this.searchInput=t,this.searchGroups=i,this.onSearch=s,this.noIcons=a,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 n.ZP(this.container),this.listsContainer=this.scrollable.container;for(const 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(const e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,i=""){this.peerId=e,this.threadId=t,this.query!==i&&(this.searchInput.inputField.value=i),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=r.Z.managers.appMessagesManager.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then((t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:i,history:n}=t;n.length&&n[0].mid===this.minMsgId&&n.shift();const r=this.searchGroups.messages;n.forEach((t=>{try{const i=this.peerId?t.fromId:t.peerId;s.default.addDialogAndSetLastMessage({peerId:i,container:this.scrollable,avatarSize:"bigger",meAsSaved:!1,message:t,query:e,noIcons:this.noIcons})}catch(e){console.error("[appSearch] render search result",e)}})),r.toggle(),this.minMsgId=n.length&&n[n.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=n.length,-1===this.foundCount&&(this.foundCount=i,r.nameEl&&(0,a.Z)(r.nameEl,(0,o.ag)(i?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[i])),this.onSearch&&this.onSearch(this.foundCount))})).catch((e=>{console.error("search error",e),this.searchPromise=null}))}}},6360:(e,t,i)=>{"use strict";i.d(t,{Z:()=>fe});var s=i(8130),n=i(5003),a=i(3512),o=i(5884),r=i(6008),d=i(2153),l=i(279),c=i(1405),h=i(8805),u=i(8594),f=i(2325),p=i(8497),m=i(3624),g=i(2894),v=i(4668),b=i(4332),y=i(4755),w=i(9355),S=i(4484),C=i(467),E=i(5432),L=i(1154),I=i(241),M=i(6272),P=i(3003),Z=i(4524),k=i(5128),T=i(7479),x=i(5705),A=i(6054),_=i(3910),F=i(2738),D=i(1784),R=i(8479),B=i(7401),N=i(5953),O=i(3738),U=i(4064),H=i(130),z=i(7030),j=i(2498),G=i(1336),V=i(5798),K=i(2342),W=i(2491),$=i(5400),q=i(5671),Q=i(1604),Y=i(7530),J=i(6566),X=i(177),ee=i(3061),te=i(2566),ie=i(6976),se=i(3416),ne=i(1483),ae=i(3855),oe=i(3699),re=i(296),de=i(9492),le=i(2887),ce=i(319),he=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ue{constructor(e,t,i){this.attachTo=e,this.searchSuper=t,this.listenerSetter=i,this.onGotoClick=()=>{w.Z.setInnerPeer({peerId:this.peerId,lastMsgId:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionForwardBtn):new Z.Z({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionDeleteBtn):new k.Z(this.peerId,[this.mid],"chat")},this.managers=t.managers;E.Z||(0,ie.E)(e,(e=>{let i;this.init&&(this.init(),this.init=null);try{i=(0,p.Z)(e.target,"search-super-item")}catch(e){}if(i){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{he(this,void 0,void 0,(function*(){this.target=i,this.peerId=i.dataset.peerId.toPeerId(),this.mid=+i.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),yield Promise.all(this.buttons.map((e=>he(this,void 0,void 0,(function*(){let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||(yield e.verify())),e.element.classList.toggle("hide",!t)}))))),i.classList.add("menu-open"),(0,ne.Z)(e,this.element),se.Z.openBtnMenu(this.element,(()=>{i.classList.remove("menu-open")}))}))})()}}),i)}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>he(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canForward(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>he(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=(0,P.b)({buttons:this.buttons,listenerSetter:this.listenerSetter}),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class fe{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new d.Z,this.middleware=(0,m.k)(),this.historyStorage={},this.usedFromHistory={},this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=(0,n.kg)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},(0,N.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.listenerSetter=new oe.Z,this.searchContextMenu=new ue(this.container,this,this.listenerSetter),this.selection=new A.e(this,this.managers,this.listenerSetter);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const i=this.navScrollable=new h.v7(t);i.container.classList.add("search-super-nav-scrollable");const s=this.nav=document.createElement("nav");s.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=s,i.container.append(s);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const i=document.createElement("span"),s=document.createElement("i");i.append((0,f.ag)(e.name)),i.append(s),t.append(i),(0,c.Z)(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"),E.Z&&(this.swipeHandler=(0,L.Z)({element:this.tabsContainer,onSwipe:(e,t,i)=>{const s=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=s+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{(0,_.Z)(e)};let i=2;const s=()=>{--i||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",s,{once:!0}),s}(this.tabsContainer),this.selectTab(o))}}));for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const i=document.createElement("div");i.classList.add("search-super-content-"+e.type),t.append(i),this.tabsContainer.append(t),this.tabs[e.inputFilter]=i,e.contentTab=i}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new o.z(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.canLoadMediaTab(this.mediaTab)&&this.load(!0)},this.selectTab=(0,r.X)(this.tabsMenu,this.tabsContainer,((e,t,i)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start",startCallback:this.scrollStartCallback});const s=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(s);const n=this.mediaTab;if(this.mediaTab=s,-1!==this.prevTabId&&i&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(s.scroll={scrollTop:n,scrollHeight:0})}if(s.scroll){const e=n.scroll.scrollTop-s.scroll.scrollTop;e&&(s.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||s.contentTab.childElementCount||this.load(!0),this.prevTabId=e}),(()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()}),void 0,i,this.listenerSetter),(0,F.fc)(this.tabsContainer,(e=>{this.selection.isSelecting&&((0,_.Z)(e),this.selection.toggleByElement((0,p.Z)(e.target,"search-super-item")))}),{capture:!0,passive:!1,listenerSetter:this.listenerSetter});const l=(e,t,i,s)=>he(this,void 0,void 0,(function*(){const n=(0,p.Z)(s.target,e);if(!n)return;const a=+n.dataset.mid;if(!a)return void this.log.warn("no messageId by click on target:",n);const o=n.dataset.peerId.toPeerId(),r=Array.from(this.tabs[i].querySelectorAll("."+t)).map((t=>{const i=(0,p.Z)(t,e);return{element:t,mid:+i.dataset.mid,peerId:i.dataset.peerId.toPeerId()}})),d=r.findIndex((e=>e.mid===a&&e.peerId===o)),l=yield this.managers.appMessagesManager.getMessageByPeer(o,a);(new D.Z).setSearchContext(this.copySearchContext(i)).openMedia(l,r[d].element,0,!1,r.slice(0,d),r.slice(d+1))}));(0,F.fc)(this.tabs.inputMessagesFilterPhotoVideo,l.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo"),{listenerSetter:this.listenerSetter}),(0,F.fc)(this.tabs.inputMessagesFilterDocument,l.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument"),{listenerSetter:this.listenerSetter}),this.mediaTab=this.mediaTabs[0],(0,u.ZP)((()=>{this.lazyLoadQueue.lock()}),(()=>{this.lazyLoadQueue.unlockAndRefresh()}),this.listenerSetter)}filterMessagesByType(e,t){return(0,J.Z)(t,e,e.length)}processEmptyFilter({message:e,searchGroup:t}){const i=[],n=s.default.addDialogNew({peerId:e.peerId,container:t.list,avatarSize:"bigger",loadPromises:i}),a=s.default.setLastMessageN({dialog:{_:"dialog",peerId:e.peerId},lastMessage:e,dialogElement:n,highlightWord:this.searchContext.query});return i.push(a),Promise.all(i).then(ce.Z)}processPhotoVideoFilter({message:e,promises:t,middleware:i}){return he(this,void 0,void 0,(function*(){const s=(0,Y.Z)(e),n=document.createElement("div");let a;n.classList.add("grid-item");const o=(0,z.Z)(s,200,200);return a="photo"!==s._?yield(yield(0,le.Z)({doc:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,photoSize:o})).thumb:yield(0,de.Z)({photo:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,withoutPreloader:!0,noBlur:!0,size:o}),[a.images.thumb,a.images.full].filter(Boolean).forEach((e=>{e.classList.add("grid-item-media")})),t.push(a.loadPromises.thumb),{element:n,message:e}}))}processDocumentFilter({message:e,inputFilter:t}){return he(this,void 0,void 0,(function*(){const i=(0,Y.Z)(e),s=this.showSender||["voice","round"].includes(i.type),n=yield(0,re.Z)({message:e,withTime:!s,fontWeight:400,voiceAsMusic:!0,showSender:s,searchContext:this.copySearchContext(t),lazyLoadQueue:this.lazyLoadQueue,autoDownloadSize:0});return["audio","voice","round"].includes(i.type)&&n.classList.add("audio-48"),{message:e,element:n}}))}processUrlFilter({message:e,promises:t,middleware:i}){var s;return he(this,void 0,void 0,(function*(){let n=null===(s=e.media)||void 0===s?void 0:s.webpage;if(!n){const t=e.totalEntities?e.totalEntities.find((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._)):null;let i,s,a;if(t)a=e.message.slice(t.offset,t.offset+t.length);else{const t=(0,K.Z)(e.message);if(!t)return;i=t[0]}i="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:i||a,s=i;const o=e.message===i;i.match(/^(ftp|http|https):\/\//)||(s="https://"+i,i=i.includes("@")?i:"https://"+i),s=new URL(s).hostname,n={_:"webPage",url:i,display_url:s,id:"",hash:0},o||(n.description=e.message)}if("webPageEmpty"===n._)return;const a=document.createElement("div");a.classList.add("preview"),n.photo?(0,de.Z)({container:a,message:null,photo:n.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,size:(0,z.Z)(n.photo,60,60,!1),loadPromises:t,noBlur:!0}):(a.classList.add("empty"),(0,H.Z)(a,(0,V.Z)(n.title||n.display_url||n.description||n.url,!0)));const o=(0,G.Z)(n),r=(0,j.Z)(n),d=(0,x.Z)((0,$.ZP)(n.url||"")).firstElementChild;if(d instanceof HTMLAnchorElement)try{d.innerText=decodeURIComponent(d.href)}catch(e){}r.firstChild&&r.append("\n"),r.append(d),this.showSender&&r.append("\n",yield(0,q.Z)(e)),o.textContent||o.append((0,W.Z)(n.display_url.split("/",1)[0]));const l=new T.ZP({title:o,titleRight:(0,Q.Z)(e),subtitle:r,havePadding:!0,clickable:!0,noRipple:!0});return l.applyMediaElement(a,"big"),l.container.innerText.trim().length?{message:e,element:l.container}:void 0}))}performSearchResult(e,t,i=!0){return he(this,void 0,void 0,(function*(){const s=[],n=t.contentTab,a=[],o=this.middleware.get();let r,d=t.inputFilter;yield(0,u.e9)(),"inputMessagesFilterPhotoVideo"===d&&this.searchContext.query.trim()?(d="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===d&&(r=this.searchGroups.messages);const l={elemsToAppend:s,inputFilter:d,message:void 0,middleware:o,promises:a,searchGroup:r};let c;switch(d){case"inputMessagesFilterEmpty":c=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":c=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":c=this.processDocumentFilter;break;case"inputMessagesFilterUrl":c=this.processUrlFilter}if(c){c=c.bind(this);const t=e.map((e=>he(this,void 0,void 0,(function*(){try{return l.message=e,yield c(l)}catch(t){this.log.error("error rendering filter",d,l,e,t)}})))),i=(yield Promise.all(t)).filter(Boolean);s.push(...i)}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(s.length){const e=i?"append":"prepend";s.forEach((t=>{var i;const{element:s,message:n}=t,a=this.getMonthContainerByTimestamp(this.groupByMonth?n.date:0,d);s.classList.add("search-super-item"),s.dataset.mid=""+n.mid,s.dataset.peerId=""+n.peerId,a.items[e](s),(null===(i=this.selection)||void 0===i?void 0:i.isSelecting)&&this.selection.toggleElementCheckbox(s,!0)}))}this.afterPerforming("inputMessagesFilterEmpty"===d?1:s.length,n)}}))}afterPerforming(e,t){if(t){const i=t.parentElement;if(Array.from(i.children).slice(1).forEach((e=>{e.remove()})),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),i.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(const e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const i=this.searchContext.query;if(i){const n=(t,n,o=!1)=>{t.map((t=>{if(e.has(t))return;e.add(t);const{dom:i}=s.default.addDialogNew({peerId:t,container:n.list,avatarSize:"abitbigger",autonomous:n.autonomous});return{dom:i,peerId:t}})).filter(Boolean).forEach((({dom:e,peerId:t})=>he(this,void 0,void 0,(function*(){const s=yield this.managers.appPeersManager.getPeer(t);if(o&&(s.participants_count||s.participants)){const s=new RegExp(`(${(0,O.Z)(i)}|${(0,O.Z)((0,C.ZP)(i))})`,"gi");e.titleSpan.innerHTML=e.titleSpan.innerHTML.replace(s,"$1"),e.lastMessageSpan.append(yield(0,X.Z)(t.toChatId()))}else if(t===a.Z.myId)e.lastMessageSpan.append((0,f.ag)("Presence.YourChat"));else{let i=yield this.managers.appPeersManager.getPeerUsername(t);if(i)i="@"+i;else{const e=yield this.managers.appUsersManager.getUser(t);e&&e.phone&&(i="+"+(0,M.u)(e.phone).formatted)}e.lastMessageSpan.textContent=i}})))),n.toggle()},o=e=>{if(t())return e};return Promise.all([this.managers.appUsersManager.getContactsPeerIds(i,!0,void 0,10).then(o).then((e=>{e&&n(e,this.searchGroups.contacts,!0)})),this.managers.appUsersManager.searchContacts(i,20).then(o).then((e=>{if(e&&(n(e.my_results,this.searchGroups.contacts,!0),n(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 f.ZP.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),(0,F.fc)(e,(()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()}))}})),this.managers.dialogsStorage.getDialogs({query:i,offsetIndex:0,limit:20,filterId:0}).then(o).then((e=>{e&&n(e.dialogs.map((e=>e.peerId)),this.searchGroups.contacts,!0)}))])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>ae.Z.getState().then((i=>{t()&&(this.searchGroups.recent.list.replaceChildren(),i.recentSearch.slice(0,20).forEach((e=>he(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.searchGroups.recent.list,meAsSaved:!0,avatarSize:"abitbigger",autonomous:!0});t.lastMessageSpan.append(yield e.isUser()?(0,ee.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())):(0,X.Z)(e.toChatId()))})))),i.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())}));return Promise.all([this.managers.appUsersManager.getTopPeers("correspondents").then((e=>{if(!t())return;const i=e.findIndex((e=>e.id===a.Z.myId));-1!==i&&(e=e.slice()).splice(i,1),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:this.searchGroups.people.list,onlyFirstName:!0,avatarSize:"bigger",autonomous:!1,noIcons:this.searchGroups.people.noIcons});t.subtitleEl.remove()})),this.searchGroups.people.toggle()})),e()])}}loadMembers(e){return he(this,void 0,void 0,(function*(){const t=this.searchContext.peerId.toChatId(),i=this.middleware.get();let n;const a=t=>he(this,void 0,void 0,(function*(){if(!this.loadMutex||(yield this.loadMutex,i())){this.membersList||(this.membersList=new g.Z({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1,managers:this.managers}),(0,F.fc)(this.membersList.list,(e=>{const t=(0,v.Z)(e.target,s.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();let n=Promise.resolve();y.Z.isMobile&&(n=b.ZP.toggleSidebar(!1)),n.then((()=>{w.Z.setInnerPeer({peerId:i})}))})),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab));for(const e of t){const t=(0,te.Z)(e);t.isAnyChat()||((yield this.managers.appUsersManager.getUser(t)).pFlags.deleted||this.membersList.add(t))}}}));if(yield this.managers.appChatsManager.isChannel(t)){const s=this.membersList?200:50;n=this.managers.appProfileManager.getChannelParticipants(t,void 0,s,this.nextRates[e.inputFilter]).then((t=>{if(!i())return;const n=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(n?n.childElementCount:0)+t.participants.length,t.participants.length{if(!i())return;this.loaded[e.inputFilter]=!0;const s=t.participants;return"chatParticipantsForbidden"!==s._?a(s.participants):void 0}));return this.loadPromises[e.inputFilter]=n.finally((()=>{i()&&(this.loadPromises[e.inputFilter]=null)}))}))}loadType(e,t,i,s){var n,a;const o=e.inputFilter;if(this.loadPromises[o])return this.loadPromises[o];if("members"===e.type)return this.loadMembers(e);const r=null!==(n=(a=this.historyStorage)[o])&&void 0!==n?n:a[o]=[];if(!("inputMessagesFilterEmpty"!==o||r.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[o]=!0,Promise.resolve();const d=this.loadPromises[o]=Promise.resolve().then((()=>he(this,void 0,void 0,(function*(){var n,a;if(r.length&&this.usedFromHistory[o]this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))));t.push(...this.filterMessagesByType(a,o))}while(n{setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}const l=r.length?r[r.length-1].mid:0,c=yield this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:o},maxId:l,limit:i,nextRate:null!==(n=(a=this.nextRates)[o])&&void 0!==n?n:a[o]=0}));if(r.push(...c.history.map((e=>({mid:e.mid,peerId:e.peerId})))),s()&&((c.history.length{setTimeout((()=>{if(s()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then((()=>{s()&&setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}}),0)})),this.performSearchResult(this.filterMessagesByType(c.history,o),e)})))).catch((e=>{this.log.error("load error:",e)})).finally((()=>{this.loadPromises[o]=null}));return d}canLoadMediaTab(e){const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"inputMessagesFilterEmpty"!==e.inputFilter)),n=s.map((e=>({_:e.inputFilter}))),[a,o]=yield Promise.all([this.managers.appMessagesManager.getSearchCounters(t,n,void 0,i),this.canViewMembers()]);if(!e())return;if(this.loadMutex&&(yield this.loadMutex,!e()))return;let r,d=0;s.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===r&&(r=e),++d)}));const l=this.mediaTabsMap.get("members");l.menuTab.classList.toggle("hide",!o),o&&(r=l,++d),this.container.classList.toggle("hide",!r),this.container.parentElement.classList.toggle("search-empty",!r),r&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(r),!1),this.navScrollableContainer.classList.toggle("hide",d<=1))}))}load(e=!1,t=!1){var i;return he(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(yield null!==(i=this.loadFirstTimePromise)&&void 0!==i?i:this.loadFirstTimePromise=this.loadFirstTime(),!n())return;this.loadFirstTimePromise=void 0,this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter((e=>e!==this.mediaTab));if(a=a.filter((e=>this.canLoadMediaTab(e))),s.isUser()&&(0,U.Z)(a,(e=>"members"===e.type)),!a.length)return;const o=t?50:Math.round(3*(I.Z.height/130|0)*1.25),r=a.map((e=>this.loadType(e,t,o,n)));return Promise.all(r).catch((e=>{this.log.error("Load error all promises:",e)}))}))}getMonthContainerByTimestamp(e,t){var i;const s=new Date(1e3*e);s.setHours(0,0,0),s.setDate(1);const n=s.getTime(),a=null!==(i=this.monthContainers[t])&&void 0!==i?i:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const i=document.createElement("div");i.classList.add("search-super-month-name");const o={month:"long"};s.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new f.ZP.IntlDateElement({date:s,options:o}).element;i.append(r),e.append(i);const d=document.createElement("div");d.classList.add("search-super-month-items"),e.append(i,d);const l=(0,B.Z)(a,"desc");let c=0;for(;cl[c]);++c);a[n]={container:e,items:d},(0,S.Z)(e,this.tabs[t],c)}return a[n]}canViewMembers(){const{peerId:e}=this.searchContext;if(!e.isAnyChat())return Promise.resolve(!1);const t=e.toChatId();return Promise.all([this.managers.appChatsManager.isBroadcast(t),this.managers.appChatsManager.hasRights(t,"view_participants"),this.managers.appChatsManager.isForum(t)]).then((([e,t,i])=>!e&&t&&(!this.searchContext.threadId||!i)))}cleanup(){var e;this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.prevTabId=-1,this.lazyLoadQueue.clear(),this.mediaTabs.forEach((e=>{this.usedFromHistory[e.inputFilter]=-1})),(null===(e=this.selection)||void 0===e?void 0:e.isSelecting)&&this.selection.cancelSelection(),this.middleware.clean(),this.loadFirstTimePromise=void 0,this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach((e=>{e.scroll=void 0}))}cleanupHTML(e=!1){this.mediaTabs.forEach((e=>{if(e.contentTab.replaceChildren(),this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||(0,l.y)(t,!0);const i=t.querySelector(".content-empty");i&&i.remove()}})),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=(0,R.Z)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:i,historyStorage:s,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:i,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=s?s:{},this.cleanup()}destroy(){var e,t;this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(e=this.swipeHandler)||void 0===e||e.removeListeners(),null===(t=this.selection)||void 0===t||t.cleanup(),this.scrollStartCallback=void 0,this.onChangeTab=void 0,this.selectTab=void 0,this.searchContextMenu=void 0,this.swipeHandler=void 0,this.selection=void 0}}},5644:(e,t,i)=>{"use strict";i.d(t,{Z:()=>A});var s=i(8130),n=i(3512),a=i(8805),o=i(4789),r=i(9807),d=i(2325),l=i(8763),c=i(8497),h=i(8842),u=i(3910),f=i(5565),p=i(5701),m=i(241),g=i(2738),v=i(6690),b=i(1655),y=i(5953),w=i(4064),S=i(9331),C=i(2353),E=i(2566),L=i(177),I=i(3061),M=i(8493),P=i(7120),Z=i(8050),k=i(36),T=i(5029),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class A{constructor(e){this.container=document.createElement("div"),this.list=s.default.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="abitbigger",this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.design="round",this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=void 0),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(const e in this.tempIds)++this.tempIds[e];this.list=s.default.createChatList(),this.promise=void 0,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},(0,y.Z)(this,e),this.container.classList.add("selector","selector-"+this.design);const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>x(this,void 0,void 0,(function*(){return this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter((e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t})),this.filterPeerTypeBy&&(e=yield(0,C.Z)(e,(e=>x(this,void 0,void 0,(function*(){if(e.isPeerId()&&(yield this.managers.appPeersManager.getPeer(e)))for(const t of this.filterPeerTypeBy)if(yield this.managers.appPeersManager[t](e))return!0;return!0}))))),t(e)})),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?(0,d.$d)(this.input,this.placeholder,void 0,"placeholder"):(0,d.$d)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new T.Z({});e.innerContainer.classList.add("selector-search-section");const 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 a.ZP(t),(0,g.fc)(this.selectedContainer,(e=>{if(this.freezed)return;let t=e.target;if(t=(0,c.Z)(t,"selector-user"),!t)return;const i=t.dataset.key,s=this.chatsContainer.querySelector('[data-peer-id="'+i+'"]');s?(0,g.tH)(s):this.remove(i.toPeerId())})),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const i=new T.Z({name:this.sectionNameLangPackKey,noShadow:!0});i.content.append(this.list),this.chatsContainer.append(i.container),this.scrollable=new a.ZP(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),(0,g.fc)(this.chatsContainer,(e=>{const t=(0,l.Z)(e.target,"data-peer-id");if((0,u.Z)(e),!t)return;if(this.freezed)return;let i=t.dataset.peerId;if(i=i.isPeerId()?i.toPeerId():i,!this.multiSelect)return void this.add(i);this.selected.has(i)?this.remove(i):this.add(i);const s=t.querySelector("input");s.checked=!s.checked}));const n=(0,p.Z)(this.onInput,200,!1,!0);this.input.addEventListener("input",n),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend((0,k.G)()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout((()=>{const t=this.getMoreResults();e.onFirstRender&&t.then((()=>{e.onFirstRender()}))}),0)}renderSaved(){return x(this,void 0,void 0,(function*(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!(yield this.managers.appUsersManager.testSelfSearch(this.query))||(yield this.renderResultsFunc([n.Z.myId]))}))}getTempId(e){var t,i;null!==(t=(i=this.tempIds)[e])&&void 0!==t||(i[e]=0);const s=++this.tempIds[e];return{tempId:s,middleware:()=>this.tempIds[e]===s}}getMoreDialogs(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=m.Z.height/56*1.25|0,{middleware:t}=this.getTempId("dialogs"),i=this.managers.dialogsStorage.getDialogs({query:this.query,offsetIndex:this.offsetIndex,limit:e,filterId:this.folderId,skipMigrated:!0});i.catch((()=>{t()&&(this.loadedWhat[this.loadedWhat.dialogs?"archived":"dialogs"]=!0)}));const s=yield i;if(!t())return;let a=s.dialogs;if(a.length){const e=(0,Z.Z)(a[a.length-1])||0;if(a=a.slice(),(0,w.Z)(a,(e=>e.peerId===n.Z.myId)),this.chatRightsAction&&(a=yield(0,C.Z)(a,(e=>this.filterByRights(e.peerId))),!t()))return;if(yield this.renderSaved(),!t())return;this.offsetIndex=e}if(this.renderResultsFunc(a.map((e=>e.peerId))),s.isEnd){if(!this.loadedWhat.dialogs){if(yield this.renderSaved(),!t())return;return 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 x(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.getPeer(e);return e.isUser()?"send_messages"!==this.chatRightsAction||(0,M.Z)(t):!!(0,P.Z)(t,this.chatRightsAction)||void 0}))}getMoreContacts(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const{middleware:t}=this.getTempId("contacts"),i=Promise.all([e?this.managers.appUsersManager.getContactsPeerIds(this.query):[],this.query?this.managers.appUsersManager.searchContacts(this.query):void 0]);i.catch((()=>{t()&&(this.loadedWhat.contacts=!0)}));const[s,a]=yield i;if(!t())return;if(a){let i=e?a.my_results.concat(a.results):a.my_results;if(this.chatRightsAction&&(i=yield(0,C.Z)(i,(e=>this.filterByRights(e))),!t()))return;this.peerType.includes("dialogs")||(i=i.filter((e=>e.isUser()))),this.cachedContacts=(0,v.Z)(s.concat(i))}else this.cachedContacts=s.slice();(0,b.Z)(this.cachedContacts,n.Z.myId)}const t=m.Z.height/56*1.25|0,i=this.cachedContacts.splice(0,t);this.renderResultsFunc(i),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.channelParticipants)return;const{middleware:e}=this.getTempId("channelParticipants"),t=this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount);t.catch((()=>{e()&&(this.loadedWhat.channelParticipants=!0)}));const i=yield t;if(!e())return;const s=i.participants.map((e=>(0,E.Z)(e)));(0,b.Z)(s,n.Z.myId),this.renderResultsFunc(s),(this.list.childElementCount>=i.count||i.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){if(this.promise)return this.promise;const e=(()=>this.peerType.includes("dialogs")&&!this.loadedWhat.archived?this.getMoreSomething("dialogs"):!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts?this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants?this.getMoreSomething("channelParticipants"):void 0:this.getMoreSomething("contacts"))();if(!e)return Promise.resolve();const t=this.promise=e.catch((e=>{console.error("get more result error",e)})).finally((()=>{this.promise===t&&(this.promise=void 0),this.checkForTriggers()}));return t}getMoreSomething(e){return{dialogs:this.getMoreDialogs,contacts:this.getMoreContacts,channelParticipants:this.getMoreChannelParticipants}[e].call(this)}renderResults(e){return x(this,void 0,void 0,(function*(){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=yield(0,C.Z)(e,(e=>this.managers.appUsersManager.isNonContactUser(e)))),e.forEach((e=>x(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.scrollable,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const i=this.selected.has(e),s=new r.Z;i&&(s.input.checked=!0),t.containerEl.prepend(s.label)}let i;i=e.isAnyChat()?yield(0,L.Z)(e.toChatId()):e===n.Z.myId?(0,d.ag)(this.selfPresence):(0,I.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())),t.lastMessageSpan.append(i)}))))}))}add(e,t,i=!0){var s;if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const n=document.createElement("div");n.classList.add("selector-user","scale-in");const a=new S.Z;if(a.classList.add("selector-user-avatar","tgico","avatar-32"),a.isDialog=!0,n.dataset.key=""+e,e.isPeerId()){if(void 0===t){const i=new h.Z;i.update({peerId:e.toPeerId(),dialog:!0}),t=i.element}a.updateWithOptions({peerId:e})}return t&&("string"==typeof t?n.innerHTML=t:((0,f.Z)(n,t),n.append(t))),n.insertAdjacentElement("afterbegin",a),this.selectedContainer.insertBefore(n,this.input),null===(s=this.onChange)||void 0===s||s.call(this,this.selected.size),i&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),n}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const i=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};n.Z.settings.animationsEnabled?t.addEventListener("animationend",i,{once:!0}):i()}getSelected(){return[...this.selected]}addInitial(e){e.forEach((e=>{this.add(e,void 0,!1)})),window.requestAnimationFrame((()=>{this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center",forceDirection:o.f.Static})}))}}},8448:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>F,ns:()=>_});var s=i(3442),n=i(3013),a=i(4755),o=i(4762),r=i(3512),d=i(3910),l=i(2738),c=i(3725),h=i(3699),u=i(319),f=i(8497),p=i(2325),m=i(3251),g=i(632),v=i(9966),b=i(1507),y=i(4081),w=i(5296),S=i(3228),C=i(5157),E=i(7207),L=i(130),I=i(8115),M=i(5671),P=i(1604),Z=i(7530),k=i(2312),T=i(9492),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function A(e=!0){const t=new s.Z({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}r.Z.addEventListener("messages_media_read",(({mids:e,peerId:t})=>{e.forEach((e=>{const i=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${i}, .media-round.is-unread${i}`)).forEach((e=>{e.classList.remove("is-unread")}))}))}));const _=(e,t)=>{let i,s;const n=!e.classList.contains("search-super-item"),a=(0,f.Z)(e,n?"bubbles-inner":"tabs-tab");if(a){const t=':not([data-is-outgoing="1"])',o=`.audio:not(.is-voice)${t}`;let r;if(r=e.matches(o)?[o]:[`.audio.is-voice${t}`,`.media-round${t}`],n){const e=".bubble:not(.webpage) ";r=r.map((t=>e+t))}const d=r.join(", "),l=Array.from(a.querySelectorAll(d)),c=l.indexOf(e),h=l.map((e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid})));i=h.slice(0,c),s=h.slice(c+1)}return(s.length&&s[0].midt)&&([i,s]=[s.reverse(),i.reverse()]),[i,s]};class F extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new h.Z}render(){var e,t,i;return x(this,void 0,void 0,(function*(){this.classList.add("audio"),this.managers=r.Z.managers,this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=(0,Z.Z)(this.message),h="voice"===s.type,f=!this.voiceAsMusic&&h,F=this.message.pFlags.is_outgoing,D=null===(e=this.message)||void 0===e?void 0:e.uploadingFileName,R=(0,C.Z)(0|s.duration);this.innerHTML='\n
\n
\n
\n
\n
\n
';const B=this.firstElementChild,N=document.createElement("div");N.classList.add("audio-download"),"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),D&&(this.classList.add("is-outgoing"),this.append(N));const O=yield f?function(e){return x(this,void 0,void 0,(function*(){e.classList.add("is-voice");const t=e.message,i=(0,Z.Z)(t);t.pFlags.out&&e.classList.add("is-out");let s=i.attributes.find((e=>"documentAttributeAudio"===e._)).waveform||new Uint8Array([]);s=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let i;try{const s=new DataView(e.buffer);i=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){i=new Uint8Array([])}return i}(s.slice(0,63));const{svg:n,container:o,availW:r}=function(e,t){const i=a.Z.isMobile?16:23,s=a.Z.isMobile?152:190,n=a.Z.isMobile?190:256,o=(0,S.Z)(t/60*n,s,n),r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.classList.add("audio-waveform-bars"),r.setAttributeNS(null,"width",""+o),r.setAttributeNS(null,"height",""+i),r.setAttributeNS(null,"viewBox",`0 0 ${o} ${i}`);const d=Math.max(...e),l=e.length?e.length:100,c=Math.min(o/4|0,l);let h=0;const u=i-4;let f="";for(let t=0,s=0,n=0;t=l){n=n+c-l,n<(c+1)/2&&h\n `,s+=4,h=n<(c+1)/2?0:a}else h{let t=e.audio;const i=()=>{c.style.width=t.currentTime/t.duration*100+"%"};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&i();const s=(0,v.Z)(i);return e.addAudioListener("timeupdate",s),e.addAudioListener("ended",s),e.addAudioListener("play",(()=>{(0,w.cK)((()=>!!t&&(i(),!t.paused)),e)})),e.readyPromise.then((()=>{let e=!1,i=!1;function s(e){let i;if(e instanceof MouseEvent)i=e.offsetX;else{const t=e.target.getBoundingClientRect();i=e.targetTouches[0].pageX-t.left}const s=i/r*t.duration;t.currentTime=s}p.addEventListener("mouseleave",(s=>{e&&(t.play(),e=!1),i=!1})),p.addEventListener("mousemove",(t=>{i=!0,e&&s(t)})),p.addEventListener("mousedown",(i=>{i.preventDefault(),0===i.button&&(t.paused||t.pause(),s(i),e=!0)})),p.addEventListener("mouseup",(s=>{i&&e&&(t.play(),e=!1)})),(0,l.fc)(p,(e=>{(0,d.Z)(e),t.paused||s(e)}))}),u.Z),()=>{p.remove(),p=null,t=null}}}))}(this):function(e){var t;return x(this,void 0,void 0,(function*(){const i=e.withTime,s=e.message,n=(0,Z.Z)(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");o.classList.add("audio-description");const r=n.attributes.find((e=>"documentAttributeAudio"===e._));if(!a){const t=[];(null==r?void 0:r.performer)&&t.push((0,I.Z)(r.performer)),i?t.push((0,g.OD)(s.date)):t.length||t.push((0,y.Z)(n.size)),e.showSender&&t.push(yield(0,M.Z)(s)),o.append(...(0,p.A1)(t," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const d=e.querySelector(".audio-title"),l=new m.I;l.dataset.fontWeight=e.dataset.fontWeight,l.dataset.fontSize=e.dataset.fontSize,l.dataset.sizeType=e.dataset.sizeType,a?l.append(yield(0,M.Z)(s)):(0,L.Z)(l,(0,I.Z)(null!==(t=null==r?void 0:r.title)&&void 0!==t?t:n.file_name)),d.append(l),e.showSender&&d.append((0,P.Z)(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,i=new E.Z(e.audio,n.supportsStreaming);e.addAudioListener("ended",(()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1}));const s=()=>{t||(e.classList.add("audio-show-progress"),t=!0,i&&c.lastChild.replaceWith(i.container))};return e.addAudioListener("play",s),(!e.audio.paused||e.audio.currentTime>0)&&s(),()=>{i.removeListeners(),i.container.remove(),i=null}}}))}(this),U=this.querySelector(".audio-time");U.innerHTML=R;const H=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=n.Z.addMedia(this.message,e),i=this.readyPromise=(0,c.Z)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?i.resolve():this.addAudioListener("canplay",(()=>i.resolve()),{once:!0}),this.onTypeDisconnect=O();const s=()=>(0,C.Z)(0|t.currentTime)+(f?" / "+R:""),a=()=>{U.innerText=s(),B.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&a();const o=(e,i=t.paused)=>{if(e&&(0,d.Z)(e),i){const e=!!this.searchContext;if(n.Z.setSearchContext(this.searchContext||{peerId:b.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,i]=e?_(this,this.message.mid):[];n.Z.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,i)}t.play().catch((()=>{}))}else t.pause()};return(0,l.fc)(B,(e=>o(e)),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",(()=>{B.classList.remove("playing"),U.innerText=R})),this.addAudioListener("timeupdate",(()=>{!t.currentTime&&t.paused||n.Z.isSafariBuffering(t)||(U.innerText=s())})),this.addAudioListener("pause",(()=>{B.classList.remove("playing")})),this.addAudioListener("play",a),o};if(null===(t=s.thumbs)||void 0===t?void 0:t.length){const e=[],t=yield(0,T.Z)({photo:s,message:null,container:B,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});B.style.width=B.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(F)D&&(this.preloader=A(!1),this.preloader.attachPromise(k.Z.getUpload(D)),this.dataset.isOutgoing="1",this.preloader.attach(N,!1));else{let e=this.preloader;const t="audio"!==s.type;H(t);const a=t=>{if(this.audio.src)return;n.Z.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(n.Z.willBePlayed(this.audio),o.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(s.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=A(!1),s=(0,c.Z)();s.notifyAll({done:75,total:100}),s.catch((()=>{this.audio.pause(),n.Z.willBePlayed(void 0)})),s.cancel=()=>{s.cancel=u.Z;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(N,!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=A(),t||(this.readyPromise=(0,c.Z)());const n=()=>{i();const n=k.Z.downloadMediaURL({media:s});return t||n.then((()=>{this.readyPromise.resolve()})),e.attach(N,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.classList.contains("corner-download")?B.append(N):this.append(N),this.classList.add("downloading"),this.readyPromise.then((()=>{this.classList.remove("downloading"),N.classList.add("downloaded"),setTimeout((()=>{N.remove()}),200),n.Z.willBePlayedMedia===this.audio&&(this.audio.play(),n.Z.willBePlayed(void 0))}))};(null===(i=this.audio)||void 0===i?void 0:i.src)||(t?a(!1):(0,l.fc)(B,(()=>{a(!0)}),{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}))}}))}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){setTimeout((()=>{this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter&&(this.listenerSetter.removeAll(),this.listenerSetter=null),this.preloader&&(this.preloader=null))}),100)}}customElements.define("audio-element",F)},9331:(e,t,i)=>{"use strict";i.d(t,{Z:()=>E,C:()=>y});var s=i(3512),n=i(2738),a=i(3910),o=i(1784),r=i(6074);class d extends r.Z{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const s=null==e?void 0:e.photoId;return this.managers.appPhotosManager.getUserPhotos(this.peerId,s,i).then((e=>{const t=e.photos.map((e=>({element:null,photoId:e})));return{count:e.count,items:t}}))}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var l=i(2312),c=i(9355),h=i(5824),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class f extends h.Z{constructor(e){super(new d({peerId:e,managers:s.Z.managers}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>u(this,void 0,void 0,(function*(){l.Z.downloadToDisc({media:yield this.managers.appPhotosManager.getPhoto(this.target.photoId),queueId:c.Z.chat.bubbles.lazyLoadQueue.queueId})})),this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,i=0,s,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return u(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=yield this.managers.appPhotosManager.getPhoto(e),r=a._openMedia.call(this,o,o.date,this.peerId,i,t,!1,s,n);return this.target.photoId=o.id,r}))}}var p=i(5880),m=i(9931),g=i(3624),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const b=({peerId:e,threadId:t})=>{let i='avatar-element[data-peer-id="'+e+'"]';t&&(i+='[data-thread-id="'+t+'"]'),Array.from(document.querySelectorAll(i)).forEach((e=>{e.update()}))};function y(e,t,i,n,a,r){return v(this,void 0,void 0,(function*(){let d=yield s.Z.managers.appProfileManager.getFullPhoto(t);if(!i()||!d)return;const l=()=>Array.from(e.querySelectorAll("img")).find((e=>!e.classList.contains("emoji")))?e:null;if(t.isAnyChat()){const e=!!n,c="inputMessagesFilterChatPhotos";if(!n&&(n=yield s.Z.managers.appMessagesManager.getSearch({peerId:t,inputFilter:{_:c},maxId:0,limit:1}).then((e=>e.history[0])),!i()))return;if(n){n.action.photo.id!==d.id&&(e||(n=s.Z.managers.appMessagesManager.generateFakeAvatarMessage(t,d)));const i=e=>e.map((e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId})));return void(new o.Z).setSearchContext({peerId:t,inputFilter:{_:c}}).openMedia(n,l(),void 0,void 0,a?i(a):void 0,r?i(r):void 0)}}if(d){!(0,p.Z)(n)&&n&&(d=yield s.Z.managers.appPhotosManager.getPhoto(n));const e=e=>e.map((e=>({element:e.element,photoId:e.item})));new f(t).openMedia(d.id,l(),void 0,a?e(a):void 0,r?e(r):void 0)}}))}s.Z.addEventListener("avatar_update",b),s.Z.addEventListener("peer_title_edit",(e=>v(void 0,void 0,void 0,(function*(){(yield s.Z.managers.appAvatarsManager.isAvatarCached(e.peerId))||b(e)}))));const w=new Map,S=new Set;function C(e,t){return e+(t?"_"+t:"")}class E extends HTMLElement{constructor(){super(),this.addedToQueue=!1,this.classList.add("avatar-like"),this.middlewareHelper=(0,g.k)()}disconnectedCallback(){var e;const t=C(this.peerId,this.threadId),i=w.get(t);(null==i?void 0:i.has(this))&&(i.delete(this),i.size||w.delete(t)),null===(e=this.lazyLoadQueue)||void 0===e||e.delete({div:this})}attachClickEvent(){let e=!1;(0,n.fc)(this,(t=>v(this,void 0,void 0,(function*(){if((0,a.Z)(t),e)return;const i=this.peerId;e=!0,yield y(this,this.peerId,(()=>this.peerId===i)),e=!1}))))}updateOptions(e){for(const t in e)this[t]=e[t]}updateWithOptions(e){var t;const i=this.peerId,s=this.threadId;this.updateOptions(e);const n=this.peerId,a=this.threadId;if(i===n&&s===a)return;if(this.dataset.peerId=""+n,a?this.dataset.threadId=""+a:s&&delete this.dataset.threadId,i){const e=C(i,s),t=w.get(e);t&&(t.delete(this),t.size||w.delete(e))}const o=null===(t=e.wrapOptions)||void 0===t?void 0:t.middleware;return this.middlewareHelper.destroy(),o?this.middlewareHelper=o.create():this.middlewareHelper.destroy(),this.update()}remove(){this.middlewareHelper.destroy(),super.remove()}r(e=!1){const t=(0,m.Z)({div:this,peerId:this.peerId,isDialog:this.isDialog,title:this.peerTitle,onlyThumb:e,isBig:this.isBig,threadId:this.threadId,wrapOptions:Object.assign({middleware:this.middlewareHelper.get()},this.wrapOptions||{})});return this.loadPromises&&(this.loadPromises.push(t),t.finally((()=>{this.loadPromises=void 0}))),t}update(){if(this.lazyLoadQueue){if(!S.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;const e=C(this.peerId,this.threadId);let t=w.get(e);return t||w.set(e,t=new Set),t.add(this),this.lazyLoadQueue.push({div:this,load:()=>(S.add(this.peerId),this.update())}),this.r(!0)}this.addedToQueue&&this.lazyLoadQueue.delete({div:this})}S.add(this.peerId);const e=this.r();this.addedToQueue&&e.finally((()=>{this.addedToQueue=!1}));const t=C(this.peerId,this.threadId),i=w.get(t);if(i){i.delete(this);const e=Array.from(i);w.delete(t);for(let t=0,i=e.length;t{"use strict";i.d(t,{Z:()=>o});var s=i(2738),n=i(1168),a=i(6765);class o{constructor(e,t){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),(0,s.fc)(this.container,(()=>{n.Z.createPopup(a.Z,t).open(this.canvas,e)}))}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}},4494:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);function a(e,t={}){const i=document.createElement(t.asLink?"a":t.asDiv?"div":"button");return i.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&i.classList.add("rp-square"),(0,n.Z)(i)),t.onlyMobile&&i.classList.add("only-handhelds"),t.disabled&&i.setAttribute("disabled","true"),t.text&&i.append((0,s.ag)(t.text)),i}},8119:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e={})=>(0,s.Z)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e)},2230:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e,t={})=>(0,s.Z)("btn-icon",Object.assign({icon:e||void 0},t))},3003:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m,b:()=>p});var s=i(7238),n=i(3416),a=i(3910),o=i(2738),r=i(8497),d=i(130),l=i(2325),c=i(9492),h=i(8812),u=i(8222);function f(e){if(e.element)return[e.separator,e.element].filter(Boolean);const{icon:t,iconDoc:i,text:s,onClick:f,checkboxField:p,noCheckboxClickListener:m}=e,g=document.createElement("div");g.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:"");let v=e.textElement;if(v||(v=e.textElement=s?(0,l.ag)(s,e.textArgs):document.createElement("span"),e.regularText&&(0,d.Z)(v,e.regularText)),i){const t=document.createElement("span");t.classList.add("btn-menu-item-icon"),g.append(t),e.loadPromise=(0,c.Z)({container:t,photo:i,boxWidth:24,boxHeight:24,withoutPreloader:!0,noFadeIn:!0,noBlur:!0,processUrl:e=>fetch(e).then((e=>e.text())).then((e=>{const t=u.Z.getProperty("primary-text-color"),i=(new DOMParser).parseFromString(e,"image/svg+xml").firstElementChild;return i.querySelectorAll("path").forEach((e=>{e.setAttributeNS(null,"fill",t),e.style.stroke=t,e.style.strokeWidth=".25px"})),(0,h.Z)(i.outerHTML)}))}).then((e=>e.loadPromises.thumb))}v.classList.add("btn-menu-item-text"),g.append(v);const b=!!p||!!e.keepOpen;return f&&(0,o.fc)(g,(e=>{(0,a.Z)(e);const t=(0,r.Z)(e.target,"btn-menu");t&&!t.classList.contains("active")||!1!==f(e)&&(b||n.Z.close(),p&&!m&&(p.checked="radio"===p.input.type||!p.checked))}),e.options),p&&g.append(p.label),!0===e.separator&&(e.separator=document.createElement("hr")),e.multiline&&g.classList.add("is-multiline"),[e.separator,e.element=g].filter(Boolean)}function p({listenerSetter:e,buttons:t}){const i=document.createElement("div");i.classList.add("btn-menu"),e&&t.forEach((t=>{t.options?t.options.listenerSetter=e:t.options={listenerSetter:e}}));const n=t.map(f);return i.append(...(0,s.Z)(n)),i}function m(e){return t=this,i=void 0,n=function*(){const t=p(e);return yield Promise.all(e.buttons.map((({loadPromise:e})=>e))),t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5322:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,v:()=>h});var s=i(3416),n=i(3910),a=i(2738),o=i(3699),r=i(2230),d=i(3003),l=i(2353),c=i(3035);function h({el:e,onOpen:t,options:i,onClose:o}){((null==i?void 0:i.listenerSetter)?i.listenerSetter.add(e):e.addEventListener.bind(e))(a.pf,(i=>{if(!e.classList.contains("btn-menu-toggle"))return!1;if((0,n.Z)(i),e.classList.contains("menu-open"))s.Z.close();else{const n=null==t?void 0:t(i),a=()=>{const t=e.querySelector(".btn-menu");s.Z.openBtnMenu(t,o)};n instanceof Promise?n.then(a):a()}}))}function u({buttonOptions:e,listenerSetter:t,container:i,direction:s,buttons:n,onOpenBefore:a,onOpen:u,onClose:f,onCloseAfter:p}){e&&(e.asDiv=!0);const m=null!=i?i:(0,r.Z)("more",e);m.classList.add("btn-menu-toggle");const g=new o.Z;let v,b;return h({el:m,onOpen:e=>{return t=this,i=void 0,r=function*(){if(yield null==a?void 0:a(e),b)return clearTimeout(b),void(b=void 0);const t=yield(i=n,(0,l.Z)(i,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i})));var i;if(!t.length)return;const o=v=yield(0,d.Z)({buttons:t,listenerSetter:g});o.classList.add(s),yield null==u?void 0:u(e,o),m.append(o),yield(0,c.d1)()},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r},options:{listenerSetter:t},onClose:()=>{null==f||f(),b=window.setTimeout((()=>{null==p||p(),b=void 0,g.removeAll(),n.forEach((e=>e.element=void 0)),v.remove()}),300)}}),m}},1571:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5296),n=i(2064);class a{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=()=>{const e=this._scrollDelta/this._scrollTails;this._scrollDelta%=this._scrollTails;const t=e>0?Math.floor(e):Math.ceil(e);t&&this.changeTailAndDraw(t),this._onWheelRAF=void 0},this.drawNextPositionAnimated=e=>{var t;let i,s;if(e){const s=e();i=s>=1;const a=-1*(n=s)*(n-2),o=null!==(t=this._nextPositionTail)&&void 0!==t?t:0,r=(this._nextPositionTail=this._nextPositionTails*a)-o;r&&(this._nextPositionLeft-=r,this.changeTailAndDraw(r))}else{const e=this._frames;s=e.shift(),i=!e.length}var n;return s&&this.drawImageData(s),i&&(this._nextPositionLeft=void 0,this._nextPositionTails=void 0,this._nextPositionTail=void 0,this._animatingToNextPosition=void 0),!i};const e=this._tails/this._curve[this._curve.length-1];for(let t=0,i=this._curve.length;t{var s;return e-(null!==(s=i[t-1])&&void 0!==s?s:0)}))}hexToRgb(e){const t=(0,n.oo)(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();t.push(...t.splice(0,e));const i=[];for(let e=0;e({x:(e.x-s[i].x)/t,y:(e.y-s[i].y)/t})));return i.map((e=>n.map(((t,i)=>({x:s[i].x+t.x*e,y:s[i].y+t.y*e})))))}curPosition(e,t){return this.getNextPositions(e,this._tails,[t])[0]}changeTail(e){for(this._tail+=e;this._tail>=this._tails;)this._tail-=this._tails,++this._phase>=this._phases&&(this._phase-=this._phases);for(;this._tail<0;)this._tail+=this._tails,--this._phase<0&&(this._phase+=this._phases)}changeTailAndDraw(e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}getGradientImageData(e){const t=this._hctx.createImageData(this._width,this._height),i=t.data;let s=0;for(let t=0;tthis.hexToRgb(e))),this._hc||(this._hc=document.createElement("canvas"),this._hc.width=this._width,this._hc.height=this._height,this._hctx=this._hc.getContext("2d",{alpha:!1})),this._canvas=e,this._ctx=this._canvas.getContext("2d",{alpha:!1}),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(e){var t,i;if(this._colors.length<2)return;if(e)return this._nextPositionLeft=this._tails+(null!==(t=this._nextPositionLeft)&&void 0!==t?t:0),this._nextPositionTails=this._nextPositionLeft,this._nextPositionTail=void 0,this._animatingToNextPosition=!0,void(0,s.cK)(this.drawNextPositionAnimated.bind(this,e),this);const n=this._tail,a=this._tails;let o;const r=[];for(let e=0,t=this._incrementalCurve.length;ea&&void 0===o&&(o=e,s%=a),r.push(s)}[r.slice(0,o),void 0!==o?r.slice(o):[]].forEach(((e,t,i)=>{const s=e[e.length-1];if(void 0!==s&&s>a&&(e[e.length-1]=+s.toFixed(2)),this._tail=null!=s?s:0,!e.length)return;const n=this.getNextPositions(this._phase,a,e);t!==i.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=n.map((e=>this.getGradientImageData(e)));this._frames.push(...o)})),this._animatingToNextPosition=!0,(0,s.cK)(this.drawNextPositionAnimated,this)}scrollAnimate(e){}cleanup(){this.scrollAnimate(!1)}static createCanvas(e){const t=document.createElement("canvas");return t.width=50,t.height=50,void 0!==e&&(t.dataset.colors=e),t}static create(e){const t=this.createCanvas(e),i=new a;return i.init(t),{gradientRenderer:i,canvas:t}}}},6054:(e,t,i)=>{"use strict";i.d(t,{e:()=>T,Z:()=>x});var s=i(5432),n=i(4494),a=i(2230),o=i(9807),r=i(5128),d=i(4524),l=i(9099),c=i(1962),h=i(9818),u=i(4762),f=i(2325),p=i(8497),m=i(8799),g=i(3910),v=i(6760),b=i(5565),y=i(8487),w=i(144),S=i(2738),C=i(5975),E=i(3241),L=i(5953),I=i(6976),M=(i(6690),i(9355)),P=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Z=e=>[...e.values()].reduce(((e,t)=>e+t.size),0);class k extends E.Z{constructor(e){super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.onMouseDown=e=>{const t=(0,p.Z)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,t))return;const i=new Map;let s,n=t;const a=(e,t=!0)=>{const o=+e.dataset.mid;if(!o||!e.dataset.peerId)return;const r=e.dataset.peerId.toPeerId();(0,y.Z)(n)||(n=e);let d=i.get(r);if(d||i.set(r,d=new Set),d.has(o))return;const l=this.isMidSelected(r,o);if(void 0===s&&(s=!l),d.add(o),s&&!l||!s&&l){const s=Z(i);if(this.toggleByElement&&t){s<2&&(0,C.Z)(e,n)&&(n=e);const t=this.getElementsBetween(n,e);t.length&&t.forEach((e=>{a(e,!1)}))}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===s&&this.toggleByMid)for(const[e,t]of i)for(const i of t)this.toggleByMid(e,i)}};let o=!1;const r=e=>{o||((0,v.Z)(),o=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,s)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",r),void this.listenerSetter.removeManual(document,"mouseup",d,l)):void a(t)},d=e=>{i.size&&(0,S.fc)(window,g.Z,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",r),(0,v.Z)()},l={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",r),this.listenerSetter.add(document)("mouseup",d,l)},this.getElementsBetween=(e,t)=>{if(e===t)return[];const i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),n=(i.top-s.top||i.left-s.left)<0,a=(0,p.Z)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),d=o.indexOf(t);return n||([d,r]=[r,d]),o.slice(r+1,d)},this.cancelSelection=e=>P(this,void 0,void 0,(function*(){e&&(this.doNotAnimate=!0),this.onCancelSelection&&(yield this.onCancelSelection()),this.selectedMids.clear(),this.toggleSelection(),(0,v.Z)(),e&&(this.doNotAnimate=void 0)})),(0,L.Z)(this,e),this.navigationType="multiselect-"+(0,w.a)()}attachListeners(e,t){if(this.listenElement&&this.listenerSetter.removeAll(),this.listenElement=e,this.listenerSetter=t,e)return s.Z?(t.add(e)("touchend",(()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")})),void(0,I.E)(e,(t=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),e.addEventListener("touchend",(e=>{(0,g.Z)(e),document.body.classList.remove("no-select")}),{once:!0,capture:!0}),(0,v.Z)();const i=this.getElementFromTarget(t.target);i&&this.toggleByElement(i)}),t)):void t.add(e)("mousedown",this.onMouseDown)}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const i=!!this.getCheckboxInputFromElement(e);if(t){if(i)return!1;const t=new o.Z({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else i&&(this.getCheckboxInputFromElement(e).parentElement.remove(),(0,l.Z)({element:e,className:"is-selected",forwards:!1,duration:200}));return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){var t;return P(this,void 0,void 0,(function*(){const i=this.selectedMids.size;if(!i&&!e)return;let s=!i,n=!i;const a=!i;for(const[e,t]of this.selectedMids){const i=`${e}_${this.isScheduled?"scheduled":"history"}`,a=yield this.managers.appMessagesManager.cantForwardDeleteMids(i,Array.from(t));if(s=a.cantForward,n=a.cantDelete,s&&n)break}null===(t=this.onUpdateContainer)||void 0===t||t.call(this,s,n,a)}))}toggleSelection(e=!0,t=!1){var i;const n=this.isSelecting,a=this.selectedMids.size;if(this.isSelecting=!!a||t,n===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),s.Z||(this.listenElement.classList.toggle("no-select",this.isSelecting),n&&(0,v.Z)()),(0,m.Z)();const o=!!a||t,r=null===(i=this.onToggleSelection)||void 0===i?void 0:i.call(this,o,!this.doNotAnimate);return u.IS_MOBILE_SAFARI||(o?h.Z.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):h.Z.removeByType(this.navigationType)),t&&(r||Promise.resolve()).then((()=>this.updateContainer(t))),!0}cleanup(){this.doNotAnimate=!0,this.selectedMids.clear(),this.toggleSelection(!1),this.doNotAnimate=void 0}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0),this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),(0,l.Z)({element:e,className:"is-selected",forwards:t,duration:200})}isMidSelected(e,t){const i=this.selectedMids.get(e);return null==i?void 0:i.has(t)}length(){return Z(this.selectedMids)}toggleMid(e,t,i){let s=this.selectedMids.get(e);return i||void 0===i&&(null==s?void 0:s.has(t))?s&&(s.delete(t),s.size||this.selectedMids.delete(e)):(s||(s=new Set,this.selectedMids.set(e,s)),s.add(t)),!0}deleteSelectedMids(e,t){const i=this.selectedMids.get(e);i&&(t.forEach((e=>{i.delete(e)})),i.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class T extends k{constructor(e,t,i){super({managers:t,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>(0,p.Z)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,i=e.dataset.peerId.toPeerId();this.toggleMid(i,t)&&this.updateElementSelection(e,this.isMidSelected(i,t))},this.toggleByMid=(e,t)=>{const i=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(i)},this.onUpdateContainer=(e,t,i)=>{const s=this.length();(0,b.Z)(this.selectionCountEl,(0,f.ag)("messages",[s])),this.selectionGotoBtn.classList.toggle("hide",1!==s),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if((0,l.Z)({element:this.searchSuper.navScrollableContainer,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}}),(0,l.Z)({element:this.searchSuper.container,className:"is-selecting",forwards:e,duration:200}),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=(0,a.Z)(`close ${e}-cancel`,{noRipple:!0});(0,S.fc)(t,(()=>this.cancelSelection()),{listenerSetter:this.listenerSetter,once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=(0,a.Z)(`message ${e}-goto`);const i={listenerSetter:this.listenerSetter};(0,S.fc)(this.selectionGotoBtn,(()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),M.Z.setInnerPeer({peerId:e,lastMsgId:t})}),i),this.selectionForwardBtn=(0,a.Z)(`forward ${e}-forward`),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),i),this.isPrivate&&(this.selectionDeleteBtn=(0,a.Z)(`delete danger ${e}-delete`),(0,S.fc)(this.selectionDeleteBtn,(()=>{const e=[...this.selectedMids.keys()][0];new r.Z(e,[...this.selectedMids.get(e)],"chat",(()=>{this.cancelSelection()}))}),i)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const s=this.selectionContainer;s.style.opacity="0",this.searchSuper.navScrollableContainer.append(s),s.offsetLeft,s.style.opacity=""}},this.isPrivate=!e.showSender,this.attachListeners(e.container,i)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);return i&&e&&Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach((e=>{this.toggleElementCheckbox(e,this.isSelecting)})),i}}class x extends k{constructor(e,t,i,s){super({managers:s,getElementFromTarget:e=>(0,p.Z)(e,"grouped-item")||(0,p.Z)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,i)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===i&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=i,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const t=this.selectedMids.get(this.chat.peerId);t&&this.getMidsFromGroupContainer(e).forEach((e=>t.delete(e)))}this.bubbles.getBubbleGroupedItems(e).map(this.toggleByElement)}else if(this.toggleMid(this.chat.peerId,t)){if(e.classList.contains("grouped-item")){const t=(0,p.Z)(e,"bubble"),i=this.isGroupedBubbleSelected(t),s=this.isGroupedMidsSelected(t);(s||i)&&this.updateElementSelection(t,s)}this.updateElementSelection(e,this.isMidSelected(this.chat.peerId,t))}},this.toggleByMid=(e,t)=>P(this,void 0,void 0,(function*(){const e=yield this.bubbles.getMountedBubble(t);e&&this.toggleByElement(e.bubble)})),this.onToggleSelection=(e,t)=>P(this,void 0,void 0,(function*(){const{needTranslateX:i,widthFrom:s,widthTo:o}=yield this.chat.input.center(t);(0,l.Z)({element:this.listenElement,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{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 h=sthis.cancelSelection()),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=(0,n.Z)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append((0,f.ag)("MessageScheduleSend")),(0,S.fc)(this.selectionSendNowBtn,(()=>{new c.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],(()=>{this.cancelSelection()}))}),e)):(this.selectionForwardBtn=(0,n.Z)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append((0,f.ag)("Forward")),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),e)),this.selectionDeleteBtn=(0,n.Z)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append((0,f.ag)("Delete")),(0,S.fc)(this.selectionDeleteBtn,(()=>{new r.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],this.chat.type,(()=>{this.cancelSelection()}))}),e);const i=this.selectionLeft=document.createElement("div");i.classList.add("selection-container-left"),i.append(t,this.selectionCountEl);const s=this.selectionRight=document.createElement("div");s.classList.add("selection-container-right"),s.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==h&&(i.style.transform=`translateX(${-h}px)`,s.style.transform=`translateX(${h}px)`),this.selectionContainer.append(i,s),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",i.style.transform="",s.style.transform=""}}else this.selectionLeft&&void 0!==h&&(this.selectionLeft.style.transform=`translateX(-${h}px)`,this.selectionRight.style.transform=`translateX(${h}px)`)})),this.onUpdateContainer=(e,t,i)=>{(0,b.Z)(this.selectionCountEl,(0,f.ag)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",i),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>P(this,void 0,void 0,(function*(){}))}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);if(i&&e)for(const e in this.bubbles.bubbles){if(this.bubbles.skippedMids.has(+e))continue;const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return i}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const i=super.toggleElementCheckbox(e,t);return i&&e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach((e=>this.toggleElementCheckbox(e,t))),i}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(e))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}getMidsFromGroupContainer(e){const t=this.chat.bubbles.getBubbleGroupedItems(e);return t.length||t.push(e),t.map((e=>+e.dataset.mid))}isGroupedMidsSelected(e){const t=this.getMidsFromGroupContainer(e),i=t.filter((e=>this.isMidSelected(this.chat.peerId,e)));return t.length===i.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!(e.classList.contains("service")||e.classList.contains("is-outgoing")||e.classList.contains("is-error")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}},9807:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1405),n=i(2325),a=i(9750),o=i(3512),r=i(3855);class d{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),this.listenerSetter=e.listenerSetter;const i=this.input=document.createElement("input");if(i.classList.add("checkbox-field-input"),i.type="checkbox",e.name&&(i.id="input-"+e.name),e.checked&&(i.checked=!0),e.stateKey){let t=!1;const s=()=>{if(!t)return;let s;s=e.stateValues?e.stateValues[i.checked?1:0]:i.checked,o.Z.managers.appStateManager.setByKey(e.stateKey,s)};r.Z.getState().then((i=>{t=!0;const s=(0,a.Z)(i,e.stateKey);let n;n=e.stateValues?1===e.stateValues.indexOf(s):s,this.setValueSilently(n)})),e.listenerSetter?e.listenerSetter.add(i)("change",s):i.addEventListener("change",s)}let d;if(e.text?(d=this.span=document.createElement("span"),d.classList.add("checkbox-caption"),(0,n.$d)(d,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(i),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 i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("checkbox-box-check"),i.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"),i.append(s);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,i),t.append(e)}d&&t.append(d),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),(0,s.Z)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},4489:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n extends s.ZP{constructor(e){super(Object.assign(e,{plainText:!0})),this.options=e;const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let i=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const s=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(s);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===i)return;i=n}))}}},5592:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1168),n=i(8127);function a(e){return new Promise(((t,i)=>{var a;const{button:o,checkbox:r}=e;o.callback=e=>{t(e?!!e.size:void 0)};const d=(0,s.x)(e.buttons||[o]),l=d.find((e=>e.isCancel));l.callback=()=>{i()},e.buttons=d,null!==(a=e.checkboxes)&&void 0!==a||(e.checkboxes=r&&[r]),new n.Z("popup-confirmation",e).show()}))}},5431:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(9976),n=i(3910),a=i(8497),o=i(4668),r=i(5565),d=i(130),l=i(4789),c=i(144),h=i(2325),u=i(8115),f=i(3512),p=i(671),m=i(503),g=i(8805);let v;const b=()=>{v=h.ZP.countriesList.filter((e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)})).sort(((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name)))};let y=()=>{b(),f.Z.addEventListener("language_change",(()=>{b()}))};const w=new Set(["FT"]);class S extends m.ZP{constructor(e={}){super(Object.assign({label:"Country",name:(0,c.a)()},e)),this.options=e,this.hidePicker=()=>{void 0===this.hideTimeout&&(this.selectWrapper.classList.remove("active"),this.hideTimeout=window.setTimeout((()=>{this.selectWrapper.classList.add("hide"),this.hideTimeout=void 0}),200))},this.selectCountryByTarget=e=>{var t,i;const s=e.querySelector("[data-default-name]").dataset.defaultName,n=e.querySelector(".phone-code"),a=null==n?void 0:n.innerText,o=a&&a.replace(/\D/g,"");(0,r.Z)(this.input,(0,h.ag)(s)),this.simulateInputEvent(),this.lastCountrySelected=v.find((e=>e.default_name===s)),this.lastCountryCodeSelected=o&&this.lastCountrySelected.country_codes.find((e=>e.country_code===o)),null===(i=(t=this.options).onCountryChange)||void 0===i||i.call(t,this.lastCountrySelected,this.lastCountryCodeSelected),this.hidePicker()},y&&(y(),y=void 0),this.liMap=new Map,this.container.classList.add("input-select");const t=this.selectWrapper=document.createElement("div");t.classList.add("select-wrapper","z-depth-3","hide");const i=document.createElement("span");i.classList.add("arrow","arrow-down"),this.container.append(i);const f=document.createElement("ul");t.appendChild(f),new g.ZP(t);let m=()=>{m=null,v.forEach((t=>{if(e.noPhoneCodes&&w.has(t.iso2))return;const i=(0,p.Ml)(t.iso2),n=[];for(let a=0,o=Math.min(t.country_codes.length,e.noPhoneCodes?1:1/0);a{if(0!==e.button)return;const t=(0,o.Z)(e.target,"LI");this.selectCountryByTarget(t)})),this.container.appendChild(t)};m(),this.input.addEventListener("focus",(e=>{m?m():v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})),clearTimeout(this.hideTimeout),this.hideTimeout=void 0,t.classList.remove("hide"),t.offsetWidth,t.classList.add("active"),this.select(),(0,l.Z)({container:(0,a.Z)(this.container,"scrollable-y"),element:this.input,position:"start",margin:4}),setTimeout((()=>{b||(document.addEventListener("mousedown",S,{capture:!0}),b=!0)}),0)}));let b=!1;const S=e=>{(0,a.Z)(e.target,"input-select")||e.target!==this.input&&(this.hidePicker(),document.removeEventListener("mousedown",S,{capture:!0}),b=!1)},C=e=>{const t=e.key;if(e.ctrlKey||"Control"===t)return!1;const i=this.value.toLowerCase(),s=[];v.forEach((e=>{const t=this.liMap.get(e.iso2);if(!t)return;const n=[e.name,e.default_name,e.iso2];n.filter(Boolean).forEach((e=>{const t=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");t.length>1&&n.push(t)}));const a=!!n.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(i)));t.forEach((e=>e.style.display=a?"":"none")),a&&s.push(e)})),0===s.length?v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})):1===s.length&&"Enter"===t&&((0,n.Z)(e),this.selectCountryByTarget(this.liMap.get(s[0].iso2)[0]))};this.input.addEventListener("keyup",C),this.input.addEventListener("keydown",(e=>{"Enter"===e.key&&C(e)})),i.addEventListener("mousedown",(e=>{this.input.matches(":focus")?(this.hidePicker(),this.input.blur()):(e.cancelBubble=!0,e.preventDefault(),this.input.focus())}))}getSelected(){return{country:this.lastCountrySelected,code:this.lastCountryCodeSelected}}selectCountryByIso2(e){this.selectCountryByTarget(this.liMap.get(e)[0])}override(e,t,i){var s,n;(0,r.Z)(this.input,e?(0,h.ag)(e.default_name):i),this.lastCountrySelected=e,this.lastCountryCodeSelected=t,null===(n=(s=this.options).onCountryChange)||void 0===n||n.call(s,this.lastCountrySelected,this.lastCountryCodeSelected)}}},2621:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(187),n=i(9331),a=i(8119),o=i(5953),r=i(1507);class d{constructor(e){this._disabled=!1,this.avatarSize=120,this.isChanged=()=>{if(this.uploadAvatar)return!0;let e=0,t=0,i=0;return this.inputFields.forEach((s=>{s.isValid()&&(s.isChanged()&&++e,s.required&&++i),s.required&&++t})),t===i&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},(0,o.Z)(this,e),this.peerId||(this.peerId=r.NM),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=(0,a.Z)({icon:"check"}),e.withoutAvatar||(this.avatarElem=new n.Z,this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.updateWithOptions({peerId:this.peerId}),e.doNotEditAvatar||(this.avatarEdit=new s.Z((e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),e.popupOptions),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}))}}},3173:(e,t,i)=>{"use strict";i.d(t,{Yd:()=>Y,Jo:()=>X,ZP:()=>te});var s=i(5432),n=i(9355),a=i(3512),o=i(5814),r=i(6008),d=i(2153),l=i(4332),c=i(5117),h=i(6039),u=i(1080),f=i(8805),p=i(279),m=i(2738);class g{constructor(e){this.managers=e}init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;(0,m.fc)(e,X.onMediaClick);const t=this.scrollable=new f.ZP(this.content,"GIFS"),i=new u.Z(e,Y,t),s=(0,p.y)(this.content,!0);this.managers.appDocsManager.getGifs().then((e=>{e.forEach((e=>{i.add(e)})),s.remove()})),te.addLazyLoadQueueRepeat(i.lazyLoadQueue,i.processInvisibleDiv),this.init=null}onClose(){}}var v=i(6057),b=i(410),y=i(3552),w=i(3607),S=i(4755),C=i(8497),E=i(1507),L=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const I="GIFS-SEARCH";class M extends y._{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>L(this,void 0,void 0,(function*(){const t=(0,C.Z)(e.target,"gif");if(!t)return;const i=t.dataset.docId;(yield n.Z.chat.input.sendMessageWithDocument(i))?S.Z.isMobile&&l.ZP.onCloseBtnClick():console.warn("got no doc by id:",i)}))}init(){this.container.id="search-gifs-container",this.inputSearch=new w.Z("SearchGifsTitle",(e=>{this.reset(),this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),(0,m.fc)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new u.Z(this.gifsDiv,I,this.scrollable),l.ZP.toggleSidebar(!0).then((()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}))}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",o.Z.checkAnimations(void 0,I),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}search(e,t=!0){return L(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield this.managers.appUsersManager.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=this.managers.appInlineBotsManager.getInlineResults(E.NM,this.gifBotPeerId,e,this.nextOffset);const{results:i,next_offset:s}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=s,t&&(this.gifsDiv.innerHTML=""),i.length?i.forEach((e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)})):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}}))}}var P=i(6787),Z=i(2325),k=i(7625),T=i(130),x=i(8115),A=i(9259),_=i(3541);class F extends y._{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new d.Z,this.inputSearch=new w.Z("StickersTab.SearchPlaceholder",(e=>{this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),(0,A.Z)({listenTo:this.setsDiv,listenerSetter:this.listenerSetter}),(0,m.fc)(this.setsDiv,(e=>{const t=(0,C.Z)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void n.Z.chat.input.sendMessageWithDocument(e)}const i=(0,C.Z)(e.target,"sticker-set");if(!i)return;const s=i.dataset.stickerSet,a=i.dataset.access_hash,o=(0,C.Z)(e.target,"sticker-set-button");o?(e.preventDefault(),e.cancelBubble=!0,o.setAttribute("disabled","true"),this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{this.managers.appStickersManager.toggleStickerSet(e.set).then((t=>{t&&(o.textContent="",o.append((0,Z.ag)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),o.classList.toggle("gray",!!e.set.installed_date))})).finally((()=>{o.removeAttribute("disabled")}))}))):this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{new P.Z(e.set).show()}))}),{listenerSetter:this.listenerSetter}),l.ZP.toggleSidebar(!0).then((()=>{this.renderFeatured()}))}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const i=document.createElement("div");i.classList.add("sticker-set-header");const s=document.createElement("div");s.classList.add("sticker-set-details"),s.innerHTML='
',(0,T.Z)(s.firstElementChild,(0,x.Z)(e.title));const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append((0,Z.ag)("Stickers",[e.count])),s.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append((0,Z.ag)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),i.append(s,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.inputSearch.value||(e=this.filterRendered("",e)).forEach((e=>{this.renderSet(e.set)}))}))}filterRendered(e,t){t=t.slice();const i=Array.from(this.setsDiv.children);return(0,k.Z)(i,(i=>{const s=i.dataset.stickerSet,n=t.findIndex((e=>e.set.id===s));-1!==n?t.splice(n,1):e&&i.dataset.title.toLowerCase().includes(e.toLowerCase())||i.remove()})),o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?this.managers.appStickersManager.searchStickerSets(e,!1).then((t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach((e=>{this.renderSet(e.set)}))})):this.renderFeatured()}}var D,R=i(4668),B=i(8799),N=i(2648),O=i(3910),U=i(6339),H=i(5418),z=i(4762),j=i(3815),G=i(319),V=i(4789),K=i(6802),W=i.n(K),$=i(669),q=i(3299),Q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Y="emoticons-dropdown",J={forceDuration:200,transitionFunction:W()(.42,0,.58,1)};class X extends U.Z{constructor(){super({element:document.getElementById("emoji-dropdown"),ignoreOutClickClassName:"input-message-input"}),this.tabId=-1,this.onSelectTabClick=e=>{if(this.tabId!==e)o.Z.checkAnimations(!0,Y),this.tabId=e,this.searchButton.classList.toggle("hide",this.tabId===this.emojiTab.tabId),this.deleteBtn.classList.toggle("hide",this.tabId!==this.emojiTab.tabId);else{const{tab:e}=this;this.scrollTo(e,e.scrollable.container.firstElementChild)}},this.checkRights=()=>Q(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=n.Z.chat,i=this.tabsEl.children,s=Array.from(i),[a,o]=yield Promise.all([this.managers.appMessagesManager.canSendToPeer(e,t,"send_stickers"),this.managers.appMessagesManager.canSendToPeer(e,t,"send_gifs")]);s[this.stickersTab.tabId+1].toggleAttribute("disabled",!a),s[this.gifsTab.tabId+1].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||(0,N.Z)(r)===this.emojiTab.tabId+1||a&&o||this.selectTab(this.emojiTab.tabId,!1)})),this.addEventListener("open",(()=>Q(this,void 0,void 0,(function*(){var e;s.Z&&(0,B.Z)()&&(yield(0,H.Z)(100)),this.element.parentElement!==n.Z.chat.input.chatInput&&n.Z.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),X.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y);const t=this.tab;null===(e=t.onOpen)||void 0===e||e.call(t)})))),this.addEventListener("opened",(()=>{var e;o.Z.unlockIntersectionGroup(Y),X.lazyLoadQueue.unlockAndRefresh();const t=this.tab;null===(e=t.onOpened)||void 0===e||e.call(t)})),this.addEventListener("close",(()=>{var e;X.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y),o.Z.checkAnimations(!0,Y);const t=this.tab;null===(e=t.onClose)||void 0===e||e.call(t)})),this.addEventListener("closed",(()=>{var e;o.Z.unlockIntersectionGroup(Y),X.lazyLoadQueue.unlock(),X.lazyLoadQueue.refresh(),this.savedRange=void 0;const t=this.tab;null===(e=t.onClosed)||void 0===e||e.call(t)}))}get tab(){return this.tabs[this.tabId]}init(){this.managers=a.Z.managers,this.emojiTab=new h.ZP({managers:this.managers}),this.stickersTab=new v.ZP(this.managers),this.gifsTab=new g(this.managers),this.tabs={},[this.emojiTab,this.stickersTab,this.gifsTab].forEach(((e,t)=>{e.tabId=t,this.tabs[t]=e})),this.container=this.element.querySelector(".emoji-container .tabs-container"),this.container.prepend(this.emojiTab.container,this.stickersTab.container),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=(0,r.X)(this.tabsEl,this.container,this.onSelectTabClick,(()=>{var e;const{tab:t}=this;null===(e=t.init)||void 0===e||e.call(t),o.Z.checkAnimations(!1,Y)})),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",(()=>{this.tabId===this.stickersTab.tabId?l.ZP.isTabExists(F)||l.ZP.createTab(F).open():l.ZP.isTabExists(M)||l.ZP.createTab(M).open()})),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),(0,m.fc)(this.deleteBtn,(e=>{(0,O.Z)(e);const t=n.Z.chat.input.messageInput;let i=$.Z.getInstance().getSavedRange(t);i||(i=document.createRange(),i.setStartAfter(t.lastChild));const s=i.cloneRange();if(i.collapsed){const{node:e,offset:n}=(0,q.q)(t,i.endContainer,i.endOffset);let a;if(n)a=e;else{if(a=e.previousSibling,!a)return;for(;a.nodeType===a.TEXT_NODE&&!a.nodeValue&&(a=a.previousSibling););if(a.nodeType===a.ELEMENT_NODE&&!a.isContentEditable)return}if(a.nodeType===a.ELEMENT_NODE&&"IMG"===a.tagName)s.selectNode(a);else{const e=[...a.textContent];let t;if(n){let i=0;t=e.find((e=>(i+=e.length,i>=n)))}else t=e.pop()||"";const i=n?n-t.length:a.textContent.length-t.length;s.setStart(a,i)}}s.deleteContents(),n.Z.chat.input.messageInputField.simulateInputEvent()}));const e=z.IS_APPLE_MOBILE&&!1,t=e?this.stickersTab.tabId:this.emojiTab.tabId;if(e&&this.tabsEl.children[1].classList.add("hide"),(0,m.tH)(this.tabsEl.children[t+1]),this.tabs[t].init&&this.tabs[t].init(),!s.Z){let e,t=!1;const i=t=>{e=t};j.Z.addEventListener("change",(s=>{s?t||(document.body.addEventListener("mousemove",i),t=!0):t&&(document.body.removeEventListener("mousemove",i),e&&this.onMouseOut(e))}))}return n.Z.addEventListener("peer_changing",(()=>{this.toggle(!1)})),n.Z.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}getElement(){return this.element}scrollTo(e,t){e.scrollable.scrollIntoViewNew(Object.assign({element:t,axis:"y",position:"start"},J))}static sendDocId(e,t,i){return Q(this,void 0,void 0,(function*(){return(yield n.Z.chat.input.sendMessageWithDocument(e,void 0,t,i))?(ee.container&&(ee.forceClose=!0,ee.toggle(!1)),!0):(console.warn("got no doc by id:",e),!1)}))}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",(()=>{e.lock()})),this.addEventListener("closed",(()=>{const i=e.intersector.getVisible();for(const e of i)t(e);e.intersector.clearVisible()})),this.addEventListener("opened",(()=>{e.unlockAndRefresh()}))}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===n.Z.chat.input.messageInput)return e.getRangeAt(0)}}D=X,X.lazyLoadQueue=new d.Z(1),X.menuOnClick=(e,t,i,s,n,a)=>{let o=-1;const r=(e,t=!0)=>{if(e===n)return!1;let i=!1;return n&&(n.elements.menuTab.classList.remove("active"),n.menuScroll&&n.menuScroll!==e.menuScroll&&(i=!0,n.menuScroll.container.parentElement.classList.remove("active"),n.menuScroll.scrollIntoViewNew(Object.assign({element:n.menuScroll.container.firstElementChild,forceDirection:t?void 0:V.f.Static,position:"center",axis:"x"},J)))),e.elements.menuTab.classList.add("active"),e.menuScroll&&(e.menuScroll.container.parentElement.classList.add("active"),t&&s.scrollIntoViewNew(Object.assign({element:e.menuScroll.container.parentElement,position:"center",axis:"x"},J))),n&&((e,t)=>{const i=e.menuScroll||s;i&&i.scrollIntoViewNew(Object.assign({element:e.elements.menuTab,position:"center",axis:"x",getElementPosition:t?({elementPosition:e})=>e-106:void 0},J))})(e,i),n=e,!0};let d=!1;const l=new c.Z(i.container,((t,s)=>{if(d)return;if(Math.abs(o-i.container.scrollTop)<=1)return;o=-1;const n=e.getCategoryByContainer(s),a=(0,N.Z)(s);(t||!a&&!n.menuScroll)&&r(n)}));(0,m.fc)(t,(t=>{let s=(0,C.Z)(t.target,"menu-horizontal-div-item");if(!s){if(s=(0,C.Z)(t.target,"menu-horizontal-inner"),!s||s.classList.contains("active"))return;s=s.firstElementChild.firstElementChild}const n=(0,N.Z)(s),a=e.getCategoryByMenuTab(s);r(a);let l=0,c=0;if(n>0||a.menuScroll){const e=a.elements.container;c=1,l=e.offsetTop+c}o=l,d=!0,i.scrollIntoViewNew(Object.assign({element:l?a.elements.container:i.container.firstElementChild,position:"start",axis:"y",getElementPosition:l?({elementPosition:e})=>e+c:void 0},J)).finally((()=>{r(a),d=!1}))}),{listenerSetter:a});const h=i.onAdditionalScroll?i.onAdditionalScroll.bind(i):G.Z;return i.onAdditionalScroll=()=>{e.content.parentElement.classList.toggle("scrolled-top",!i.scrollTop),h()},{stickyIntersector:l,setActive:r,setActiveStatic:t=>{if(null==n?void 0:n.local)return;e.scrollable.scrollTop=t.elements.container.offsetTop+1;const i=e.menuScroll.container,s=t.elements.menuTab;i.scrollLeft=s.offsetLeft-i.clientWidth/2+s.offsetWidth/2,r(t,!1)}}},X.onMediaClick=(e,t=!1,i)=>Q(void 0,void 0,void 0,(function*(){const s=(0,R.Z)(e.target,"DIV");if(!s)return!1;const n=s.dataset.docId;return!!n&&D.sendDocId(n,t,i)}));const ee=new X;b.GO.emoticonsDropdown=ee;const te=ee},6039:(e,t,i)=>{"use strict";i.d(t,{IA:()=>F,ZP:()=>j,xG:()=>D});var s=i(3173),n=i(3910),a=i(8497),o=i(3035),r=i(5418),d=i(9355),l=i(3512),c=i(671),h=i(279),u=i(8805),f=i(9976),p=i(5432),m=i(8799),g=i(3447),v=i(7746),b=i(8115),y=i(7197),w=i(5400),S=i(2738),C=i(6057),E=i(9405),L=i(2940),I=i(4755),M=i(1273),P=i(9259),Z=i(4064),k=i(4484),T=i(6787),x=i(2796),A=i(5953);const _=new Set;function F(e,t,i=!1,s=!1){var n;const a=document.createElement("span");let r;if(a.classList.add("super-emoji"),s&&!f.Z?r=function(e){return(0,w.ZP)(e,{entities:[(0,y.Z)(e)]})}(e):(e=(0,v.Z)(e),r=(0,b.Z)(e)),a.append(r),a.children.length>1){const e=a.firstElementChild;a.innerHTML="",a.append(e)}if("IMG"===(null===(n=a.firstElementChild)||void 0===n?void 0:n.tagName)){const e=a.firstElementChild,t=e.src;if(!_.has(t)){e.setAttribute("loading","lazy");const i=document.createElement("span");i.classList.add("emoji-placeholder"),l.Z.settings.animationsEnabled&&(e.style.opacity="0",i.style.opacity="1"),e.addEventListener("load",(()=>{(0,o.T2)((()=>{l.Z.settings.animationsEnabled&&(e.style.opacity="",i.style.opacity=""),a.classList.remove("empty"),_.add(t)}))}),{once:!0}),a.append(i)}}return t&&(i?t.prepend(a):t.appendChild(a)),a}function D(e){const t=(0,a.Z)(e,"super-emoji");if(!t)return;const i=t.firstElementChild;return i&&i.classList.contains("custom-emoji")?{emoji:i.dataset.stickerEmoji,docId:i.dataset.docId}:e.nodeType===e.TEXT_NODE?{emoji:e.nodeValue}:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),{emoji:e.getAttribute("alt")||e.innerText})}const R="Emoji.Recent",B=[R,"recent"],N=["",""],O=[["Emoji.SmilesAndPeople","smile"],["Emoji.AnimalsAndNature","animals"],["Emoji.FoodAndDrink","eats"],["Emoji.TravelAndPlaces","car"],["Emoji.ActivityAndSport","sport"],["Emoji.Objects","lamp"],["Emoji.Flags","flag"],["Skin Tones",""]];let U;function H(){if(U)return U;U=new Map([[N,[]],[B,[]]]);for(const e in g.Z){const t=""+g.Z[e],i=O[+t[0]-1];if(!i)continue;let s=U.get(i);s||(s=[],U.set(i,s)),s[+t.slice(1)||0]=e}U.delete(O.pop()),O.unshift(N,B);const e=O.map((([e])=>e)),t=[...U.entries()].sort(((t,i)=>e.indexOf(t[0][0])-e.indexOf(i[0][0])));return U=new Map(t),U}const z=(0,E.C)(42,42);class j extends C.pw{constructor(e){super(e.managers,"super-emojis",(()=>z),16,4,0),this.onCategoryVisibility=({target:e,visible:t})=>{const i=this.categoriesMap.get(e),s=i.elements.renderer,n=[];if(s){n.push(s);const e=new Map;t?(n.push(...i.items.map((({docId:t,element:i})=>{if(!t)return i;const s=i.firstElementChild;return s.clear(!1),e.set(s.docId,new Set([s])),i}))),s.add(e,void 0,void 0,!1)):(s.clearCanvas(),s.middlewareHelper.clean())}else t&&n.push(...i.items.map((({element:e})=>e)));if(i.elements.items.replaceChildren(...n),s&&!t){const e=new Map;i.items.forEach((({docId:t,element:i})=>{if(!t)return;const s=i.firstElementChild;s.clear(),e.set(s.docId,new Set([s]))})),s.add(e,void 0,!0)}},this.onContentClick=e=>{(0,n.Z)(e);const{target:t}=e,i=(0,a.Z)(t,"emoji-category"),s=this.categoriesMap.get(i);if((0,a.Z)(t,"category-title")){if(s.local)return;return void new T.Z({id:s.set.id,access_hash:s.set.access_hash},!0).show()}const o=D(t);if(o){if(o.docId&&!l.Z.premium&&(this.isStandalone?""!==s.id:this.peerId!==l.Z.myId)){const e=document.createElement("a");return e.onclick=()=>{d.Z.openUsername({userName:"premiumbot"}),(0,x.PE)()},void(0,x.bC)({langPackKey:"CustomEmoji.PremiumAlert",langPackArguments:[e]})}this.onClick?this.onClick(Object.assign(Object.assign({},o),{element:(0,a.Z)(t,"super-emoji").firstElementChild})):d.Z.chat.input.onEmojiSelected(o,!1),p.Z&&(0,m.Z)()}},(0,A.Z)(this,e),this.container.classList.add("emoji-padding"),this.content.id="content-emoji",this.activeElements=[]}destroy(){var e;super.destroy(),null===(e=this.menuInnerScroll)||void 0===e||e.destroy()}init(){super.init(),this.init=void 0;const e={root:this.isStandalone?this.content:s.ZP.getElement()};this.categoriesIntersector=new L.Z(this.onCategoryVisibility,e),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll,void 0,this.listenerSetter);const t=(0,h.y)(this.content,!0);let i,n;if(!this.isStandalone){const e=this.menuInnerScroll=new u.v7(void 0);e.container.classList.add("menu-horizontal-inner-scroll"),i=document.createElement("div"),i.classList.add("menu-horizontal-inner"),i.append(e.container)}H(),n=this.noRegularEmoji?new Map([[[N[0],"recent"],[]]]):H(),n.forEach(((e,[t,i])=>{const s=this.createLocalCategory(t,t,i,!i);s.elements.container.classList.remove("hide"),s.elements.items.classList.add(i&&!this.isStandalone?"is-local":"not-local"),e.forEach((e=>{const t=(0,c.zu)(e);this.addEmojiToCategory({category:s,emoji:{emoji:t},batch:!0})}))}));const a=Promise.all([this.isStandalone?void 0:(0,r.Z)(200),!this.noRegularEmoji&&this.managers.appEmojiManager.getRecentEmojis("native"),!this.isStandalone&&this.managers.appEmojiManager.getRecentEmojis("custom"),this.stickerSetId&&this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),this.managers.appEmojiManager.getCustomEmojis()]).then((([e,n,a,o,r])=>{t.remove(),o&&(a=o.documents.map((e=>e.id)));const c=this.categories["Emoji.Recent"],h=this.categories[""];if(this.isStandalone||[c&&[c,n],h&&[h,a]].filter(Boolean).forEach((([e,t])=>{e.limit=32,t.splice(32,t.length-32)})),c&&n)for(const e of n)this.addEmojiToCategory({category:c,emoji:{emoji:e},batch:!0});if(h){if(this.createRendererForCategory(h),a)for(const e of a)this.addEmojiToCategory({category:h,emoji:{emoji:"",docId:e},batch:!0});h.elements.container.style.paddingTop=".5rem"}O.forEach((([e])=>{const t=this.categories[e];t&&(this.toggleLocalCategory(t,!0),e!==R&&""!==e&&(t.menuScroll=this.menuInnerScroll,this.menuInnerScroll.container.append(t.elements.menuTab)))})),this.resizeCategories(),c&&i&&c.elements.menuTab.after(i),r.sets.forEach((e=>{this.renderStickerSet(e)})),this.listenerSetter.add(l.Z)("premium_toggle",(()=>{this.toggleCustomCategory()})),this.listenerSetter.add(l.Z)("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),this.listenerSetter.add(s.ZP)("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))})));const u=e=>{for(const t in this.categories){const i=this.categories[t].elements.renderer;i&&(i.ignoreSettingDimensions=e,e||i.setDimensionsFromRect(void 0,!0))}};!this.isStandalone&&this.listenerSetter.add(s.ZP)("opened",(()=>{u(!1)})),!this.isStandalone&&this.listenerSetter.add(s.ZP)("close",(()=>{u(!0)})),this.listenerSetter.add(l.Z)("stickers_installed",(e=>{!this.categories[e.id]&&e.pFlags.emojis&&this.renderStickerSet(e,!0)})),this.listenerSetter.add(l.Z)("stickers_deleted",(e=>{const t=this.categories[e.id];if(this.deleteCategory(t)){const{renderer:e}=t.elements;e&&e.middlewareHelper.clean()}})),!this.isStandalone&&this.listenerSetter.add(l.Z)("emoji_recent",this.postponedEvent((e=>{const t=this.categories[e.docId?"":R];if(!t)return;const i=e.docId?t=>t.docId===e.docId:t=>t.emoji===e.emoji,s=(0,Z.Z)(t.items,i);if(s){if(t.items.unshift(s),this.isCategoryVisible(t)){const{renderer:e}=t.elements;(0,k.Z)(s.element,t.elements.items,e?1:0,-1),null==e||e.forceRender()}}else this.addEmojiToCategory({category:t,emoji:e,batch:!1,prepend:!0});0===this.closeScrollTop&&this.menuOnClickResult.setActive(e.docId?this.categories["Emoji.Recent"]:t)}))),!this.isStandalone&&this.listenerSetter.add(d.Z)("peer_changed",(()=>{this.toggleCustomCategory()})),this.toggleCustomCategory(),this.menuOnClickResult.setActive(null!=c?c:h)}));return(0,S.fc)(this.content,this.onContentClick,{listenerSetter:this.listenerSetter}),(0,P.Z)({listenTo:this.content,listenerSetter:this.listenerSetter}),a}renderStickerSet(e,t){const i=this.createCategory(e,(0,b.Z)(e.title));this.positionCategory(i,t);const{container:n,menuTabPadding:a}=i.elements;i.elements.items.classList.add("not-local"),i.elements.container.classList.add("is-premium-set"),i.elements.title.classList.add("tgico"),this.createRendererForCategory(i),this.managers.appStickersManager.getStickerSet(e).then((({documents:e})=>{e.forEach((e=>{this.addEmojiToCategory({category:i,emoji:{docId:e.id,emoji:e.stickerEmojiRaw},batch:!0})})),this.onCategoryVisibility({target:i.elements.container,visible:this.isCategoryVisible(i)}),i.setCategoryItemsHeight(),n.classList.remove("hide")})),(0,M.Z)({set:e,container:a,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}get peerId(){return d.Z.chat.peerId}getCustomCategory(){return this.categories[""]}toggleCustomCategory(){const e=this.categories[""],t=l.Z.premium||this.peerId===l.Z.myId,i=t||this.isStandalone;super.toggleLocalCategory(e,!!e.items.length&&i),this.content.classList.toggle("has-premium",t)}toggleLocalCategory(e,t){""!==e.id?super.toggleLocalCategory(e,t):this.toggleCustomCategory()}createRendererForCategory(e){const t=w.KZ.create({animationGroup:s.Yd,customEmojiSize:I.Z.active.esgCustomEmoji});e.elements.renderer=t,e.elements.items.append(t)}addEmojiToCategory(e){const{category:t,emoji:i,batch:s,prepend:n}=e;let a=e.element;if(a){const e=document.createElement("span");e.classList.add("super-emoji"),e.append(a),a=e}else if(i.docId){const e=w.LD.create(i.docId),t=document.createElement("span");t.classList.add("super-emoji"),t.append(e),a=t}else a=F(i.emoji,void 0,!1);const o=Object.assign(Object.assign({},i||{emoji:void 0}),{element:a});(e.active||this.activeEmoji&&(o.docId?this.activeEmoji.docId===o.docId:this.activeEmoji.emoji===o.emoji))&&(this.activeEmoji,this.activeElements.push(o),a.classList.add("active")),t.items[n?"unshift":"push"](o),s||this.spliceExceed(t)||this.onLocalCategoryUpdate(t)}setActive(e){var t,i;(e===this.activeEmoji||(null==e?void 0:e.docId)?e.docId!==(null===(t=this.activeEmoji)||void 0===t?void 0:t.docId):(null==e?void 0:e.emoji)!==(null===(i=this.activeEmoji)||void 0===i?void 0:i.emoji))&&(this.activeEmoji=e,this.activeElements.forEach((e=>{e.element.classList.remove("active")})),this.activeElements.length=0,this.categoriesMap.forEach((t=>{t.items.forEach((t=>{(e.docId?t.docId===e.docId:t.emoji===e.emoji)&&(t.element.classList.add("active"),this.activeElements.push(t))}))})))}onClose(){this.closeScrollTop=this.scrollable.scrollTop}}},6057:(e,t,i)=>{"use strict";i.d(t,{pw:()=>_,vT:()=>x,ZP:()=>F});var s=i(3173),n=i(8497),a=i(4755),o=i(2325),r=i(8115),d=i(3512),l=i(5814),c=i(1655),h=i(7009),u=i(2940);class f extends h.Z{constructor(e,t,i){super(e),this.onVisibilityChange=t,this.elementsMap=new Map,this.intersector=new u.Z((e=>{var t;const{target:i,visible:s}=e,n=this.elementsMap.get(i);n.visible=s,s?(n.wasSeen=!0,this.queue.includes(n)||this.queue.push(n)):(0,c.Z)(this.queue,n),null===(t=this.onVisibilityChange)||void 0===t||t.call(this,e),this.setProcessQueueTimeout()}),i)}clear(){super.clear(),this.elementsMap.clear()}observe(e){this.elementsMap.set(e.div,e),super.observe(e)}unobserve(e){this.elementsMap.delete(e.div),super.unobserve(e)}}var p=i(279),m=i(6787),g=i(8805),v=i(4064),b=i(2738),y=i(4484),w=i(319),S=i(2230),C=i(5592),E=i(3163),L=i(5975),I=i(7625),M=i(9259),P=i(3699),Z=i(3541),k=i(1273),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x{constructor(e,t,i,s){this.regularLazyLoadQueue=e,this.group=t,this.managers=i,this.options=s,this.animated=new Set,this.checkAnimationContainer=(e,t)=>{l.Z.getAnimations(e).forEach((e=>{t?l.Z.checkAnimation(e,!1):l.Z.removeAnimation(e)}))},this.processVisible=e=>T(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t),s=a.Z.active.esgSticker.width,n=(0,Z.ZP)({doc:i,div:e,width:s,height:s,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0,withLock:!0}).then((({render:e})=>e));return n.then((()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))})),n})),this.processInvisible=e=>T(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t);this.checkAnimationContainer(e,!1),e.textContent="",this.renderSticker(i,e)})),this.lazyLoadQueue=new f(void 0,(({target:e,visible:t})=>{t||this.processInvisible(e)}),s)}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,i){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),t.dataset.docId=""+e.id,e.animated&&this.observeAnimated(t)),(0,Z.ZP)({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:e.animated,loadPromises:i}),t}observeAnimated(e){this.animated.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisible})}unobserveAnimated(e){this.animated.delete(e),this.lazyLoadQueue.delete({div:e})}}class A{constructor(e){var t,i;const s=document.createElement("div");s.classList.add("emoji-category");const n=document.createElement("div");let a,o,r;n.classList.add("category-items"),e.title&&(a=document.createElement("div"),a.classList.add("category-title"),a.append(e.title)),e.noMenuTab||(o=(0,S.Z)(void 0,{noRipple:!0}),o.classList.add("menu-horizontal-div-item"),r=document.createElement("div"),r.classList.add("menu-horizontal-div-item-padding"),o.append(r)),a&&s.append(a),s.append(n),this.elements={container:s,title:a,items:n,menuTab:o,menuTabPadding:r},this.id=e.id,this.items=[],this.getContainerSize=e.getContainerSize,this.getElementMediaSize=e.getElementMediaSize,this.gapX=null!==(t=e.gapX)&&void 0!==t?t:0,this.gapY=null!==(i=e.gapY)&&void 0!==i?i:0}setCategoryItemsHeight(){const{width:e}=this.getContainerSize(),t=this.getElementMediaSize().width;let i=e/t;this.gapX&&(i-=(i-1)*this.gapX/t),i=Math.floor(i);const s=Math.ceil(this.items.length/i);let n=s*t;this.gapY&&(n+=(s-1)*this.gapY),this.elements.items.style.minHeight=n+"px"}}class _{constructor(e,t,i,n,a,o){this.managers=e,this.categoryItemsClassName=t,this.getElementMediaSize=i,this.padding=n,this.gapX=a,this.gapY=o,this.mounted=!1,this.resizeCategories=()=>{for(const[e,t]of this.categoriesMap)t.setCategoryItemsHeight()},this.postponedEvent=e=>(...t)=>{s.ZP.isActive()?this.postponedEvents.push({cb:e,args:t}):e(...t)},this.categories={},this.categoriesMap=new Map,this.categoriesByMenuTabMap=new Map,this.localCategories=[],this.postponedEvents=[],this.listenerSetter=new P.Z,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","emoticons-container"),this.menuWrapper=document.createElement("div"),this.menuWrapper.classList.add("menu-wrapper","emoticons-menu-wrapper"),this.menu=document.createElement("nav"),this.menu.className="menu-horizontal-div no-stripe justify-start emoticons-menu",this.menuWrapper.append(this.menu),this.menuScroll=new g.v7(this.menuWrapper),this.content=document.createElement("div"),this.content.classList.add("emoticons-content"),this.container.append(this.menuWrapper,this.content),this.scrollable=new g.ZP(this.content,"STICKERS")}getCategoryByContainer(e){return this.categoriesMap.get(e)}getCategoryByMenuTab(e){return this.categoriesByMenuTabMap.get(e)}createCategory(e,t,i,s){const n=new A({id:""+e.id,title:t,overflowElement:this.content,getContainerSize:()=>{var e,t;const{width:i,height:s}=null!==(t=null===(e=this.getContainerSize)||void 0===e?void 0:e.call(this))&&void 0!==t?t:this.content.getBoundingClientRect();return{width:i-this.padding,height:s}},getElementMediaSize:this.getElementMediaSize,gapX:this.gapX,gapY:this.gapY,noMenuTab:s});this.categoryItemsClassName&&n.elements.items.classList.add(this.categoryItemsClassName);const a=n.elements.container;return a.classList.add("hide"),n.set=e,this.categories[e.id]=n,this.categoriesMap.set(a,n),!s&&this.categoriesByMenuTabMap.set(n.elements.menuTab,n),this.categoriesIntersector.observe(a),!s&&this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(a),i||!s&&n.elements.menuTab.classList.add("not-local"),n}positionCategory(e,t){const{menuTab:i,container:s}=e.elements,n=t?this.localCategories.filter((e=>e.mounted)).length:65535;let a=!1;const o=t?this.localCategories.filter((e=>e.menuScroll&&!a?(a=!0,!0):e.mounted&&!e.menuScroll&&e.elements.menuTab)).length:65535;(0,y.Z)(s,this.scrollable.container,n),(0,y.Z)(i,this.menu,o)}isCategoryVisible(e){return this.categoriesIntersector.getVisible().includes(e.elements.container)}toggleLocalCategory(e,t){var i;if(t){const t=this.localCategories.indexOf(e),i=this.localCategories.slice(0,t);let s=0,n=0;i.forEach((e=>{e.mounted?e.elements.menuTab&&!e.menuScroll||++n:(++s,++n)}));const a=t-s,o=t-n;e.elements.menuTab&&(0,y.Z)(e.elements.menuTab,this.menu,o),(0,y.Z)(e.elements.container,this.scrollable.container,a)}else null===(i=e.elements.menuTab)||void 0===i||i.remove(),e.elements.container.remove();e.mounted=t}createLocalCategory(e,t,i,s){const n=this.createCategory({id:e},t&&(0,o.ag)(t),!0,s);return n.local=!0,this.localCategories.push(n),n.elements.title&&n.elements.title.classList.add("disable-hover"),s||(i&&n.elements.menuTab.classList.add("tgico","tgico-"+i),n.elements.menuTabPadding.remove()),this.toggleLocalCategory(n,!1),n}onLocalCategoryUpdate(e){e.setCategoryItemsHeight(),this.toggleLocalCategory(e,!!e.items.length)}deleteCategory(e){return!!e&&(e.elements.container.remove(),e.elements.menuTab.remove(),this.categoriesIntersector.unobserve(e.elements.container),delete this.categories[e.id],this.categoriesMap.delete(e.elements.container),this.categoriesByMenuTabMap.delete(e.elements.menuTab),!0)}spliceExceed(e){if(void 0===e.limit)return!1;const{items:t,limit:i}=e;return t.splice(i,t.length-i).forEach((({element:e})=>{e.remove()})),this.onLocalCategoryUpdate(e),!0}init(){this.listenerSetter.add(s.ZP)("closed",(()=>{this.postponedEvents.forEach((({cb:e,args:t})=>{e(...t)})),this.postponedEvents.length=0}))}destroy(){var e,t,i,s;this.getContainerSize=void 0,this.postponedEvents.length=0,null===(e=this.categoriesIntersector)||void 0===e||e.disconnect(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(t=this.menuScroll)||void 0===t||t.destroy(),null===(s=null===(i=this.menuOnClickResult)||void 0===i?void 0:i.stickyIntersector)||void 0===s||s.disconnect()}}class F extends _{constructor(e){super(e,"super-stickers",(()=>a.Z.active.esgSticker),6,4,4),this.onCategoryVisibility=({target:e,visible:t,entry:i})=>{const s=this.categoriesMap.get(e);s.elements.items.replaceChildren(...t?s.items.map((({element:e})=>e)):[])},this.setTyping=(e=!1)=>{(e||s.ZP.isActive()&&s.ZP.tab===this)&&d.Z.dispatchEvent("choosing_sticker",!e)},this.container.classList.add("stickers-padding"),this.content.id="content-stickers"}setFavedLimit(e){this.categories.faved.limit=e}categoryAppendStickers(e,t){const{container:i}=e.elements;t.then((t=>{const s=this.isCategoryVisible(e);t.forEach((t=>{const i=this.superStickerRenderer.renderSticker(t);e.items.push({document:t,element:i}),s&&e.elements.items.append(i)})),e.setCategoryItemsHeight(),i.classList.remove("hide")}))}renderStickerSet(e,t=!1){return T(this,void 0,void 0,(function*(){const i=this.createCategory(e,(0,r.Z)(e.title)),{menuTabPadding:n}=i.elements,a=this.managers.appStickersManager.getStickerSet(e);this.categoryAppendStickers(i,a.then((e=>e.documents))),this.positionCategory(i,t),(0,k.Z)({set:e,container:n,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){super.init(),this.scrollable.onAdditionalScroll=()=>{this.setTyping()};const e={root:s.ZP.getElement()};this.categoriesIntersector=new u.Z(this.onCategoryVisibility,e);const t=e=>{e.elements.items.replaceChildren(),e.items.forEach((({element:e})=>this.superStickerRenderer.unobserveAnimated(e))),e.items.length=0};this.scrollable.container.addEventListener("click",(e=>{const t=e.target;if((0,n.Z)(t,"category-title")){const e=(0,n.Z)(t,"emoji-category"),i=this.categoriesMap.get(e);if(i.local)return;new m.Z({id:i.set.id,access_hash:i.set.access_hash}).show()}else s.Jo.onMediaClick(e)})),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll);const i=(0,p.y)(this.content,!0),o=(e,t)=>{e.limit&&(t=t.slice(0,e.limit));const i=new Set(t.map((e=>e.id)));(0,I.Z)(e.items,(t=>{i.has(t.document.id)||this.deleteSticker(e,t.document,!0)})),this.toggleLocalCategory(e,!!t.length),(0,I.Z)(t,((t,i)=>{this.unshiftSticker(e,t,!0,i)})),this.spliceExceed(e),e.elements.container.classList.remove("hide")},r=this.createLocalCategory("faved","FavoriteStickers","savedmessages"),l=this.createLocalCategory("recent","Stickers.Recent","recent");l.limit=20;const c=(0,S.Z)("close",{noRipple:!0});l.elements.title.append(c),(0,b.fc)(c,(()=>{(0,C.Z)({titleLangKey:"ClearRecentStickersAlertTitle",descriptionLangKey:"ClearRecentStickersAlertMessage",button:{langKey:"Clear"}}).then((()=>{this.managers.appStickersManager.clearRecentStickers()}),w.Z)}));const h=this.createLocalCategory("premium","PremiumStickersShort"),f=document.createElement("span");f.classList.add("tgico-star","color-premium"),h.elements.menuTab.append(f);const g=[Promise.all([this.managers.apiManager.getLimit("favedStickers"),this.managers.appStickersManager.getFavedStickersStickers()]).then((([e,t])=>{this.setFavedLimit(e),o(r,t)})),this.managers.appStickersManager.getRecentStickersStickers().then((e=>{o(l,e)})),this.managers.appStickersManager.getAllStickers().then((e=>{for(const t of e.sets)this.renderStickerSet(t)})),this.managers.appStickersManager.getPremiumStickers().then((e=>{const t=e.length;this.toggleLocalCategory(h,d.Z.premium&&!!t),this.categoryAppendStickers(h,Promise.resolve(e)),d.Z.addEventListener("premium_toggle",(e=>{this.toggleLocalCategory(this.categories.premium,e&&!!t)}))}))];Promise.race(g).finally((()=>{i.remove()})),Promise.all(g).finally((()=>{this.mounted=!0,this.setTyping();const e=this.categories.faved,t=this.categories.recent;this.menuOnClickResult.setActive(e.items.length?e:t),d.Z.addEventListener("stickers_installed",(e=>{this.categories[e.id]||this.renderStickerSet(e,!0)}))})),this.superStickerRenderer=new x(s.Jo.lazyLoadQueue,s.Yd,this.managers,e);const v=this.superStickerRenderer.lazyLoadQueue;s.ZP.addLazyLoadQueueRepeat(v,this.superStickerRenderer.processInvisible),d.Z.addEventListener("sticker_updated",(({type:e,document:t,faved:i})=>{const s=this.categories["faved"===e?"faved":"recent"];s&&(i?this.unshiftSticker(s,t):this.deleteSticker(s,t))})),d.Z.addEventListener("stickers_deleted",(({id:e})=>{const i=this.categories[e];this.deleteCategory(i)&&t(i)})),d.Z.addEventListener("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),s.ZP.addEventListener("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))}))),d.Z.addEventListener("stickers_updated",(({type:e,stickers:t})=>{const i=this.categories["faved"===e?"faved":"recent"];i&&o(i,t)})),d.Z.addEventListener("app_config",(()=>{this.managers.apiManager.getLimit("favedStickers").then((e=>{this.setFavedLimit(e)}))})),a.Z.addEventListener("resize",this.resizeCategories),(0,M.Z)({listenTo:this.content,listenerSetter:new P.Z});const y="menu";(0,E.Z)({listenTo:this.content,verifyRecent:e=>!!(0,L.Z)(e,this.categories.recent.elements.items),onOpen:()=>{s.ZP.setIgnoreMouseOut(y,!0)},onClose:()=>{s.ZP.setIgnoreMouseOut(y,!1)}}),this.init=null}deleteSticker(e,t,i){const s=(0,v.Z)(e.items,(e=>e.document.id===t.id));s&&(s.element.remove(),i||this.onLocalCategoryUpdate(e))}unshiftSticker(e,t,i,s){if(void 0!==s){const i=e.items[s];if(i&&i.document.id===t.id)return}let n=(0,v.Z)(e.items,(e=>e.document.id===t.id));n||(n={element:this.superStickerRenderer.renderSticker(t),document:t}),e.items.unshift(n),e.elements.items.prepend(n.element),i||this.spliceExceed(e)}unshiftRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id)}deleteRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id,!0)}onClosed(){this.setTyping(!0)}onOpened(){this.setTyping(),this.resizeCategories()}}},36:(e,t,i)=>{"use strict";i.d(t,{G:()=>s});const s=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e}},5948:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e){const t=document.createElement("span");return t.classList.add("badge-fake"),(0,s.$d)(t,e?"ScamMessage":"FakeMessage"),t}},1080:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(5814),n=i(3725),a=i(3035),o=i(3512),r=i(8847),d=i(7009),l=i(2940);class c extends d.Z{constructor(e,t){super(e),this.onVisibilityChange=t,this.intersector=new l.Z((e=>{const{target:t,visible:i}=e,s=(0,r.Z)(this.queue,(e=>e.div===t));i&&s.length&&s.forEach((e=>{this.queue.unshift(e)})),this.onVisibilityChange&&this.onVisibilityChange(e),this.setProcessQueueTimeout()}))}observe(e){super.observe(e)}}var h=i(2887),u=i(319),f=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class p{constructor(e,t,i,r=!0){this.element=e,this.group=t,this.scrollable=i,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=(0,n.Z)(),this.timeout=window.setTimeout((()=>{this.timeout=0,this.scrollPromise.resolve()}),150)},this.processInvisibleDiv=e=>this.scrollPromise.then((()=>f(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&(i.classList.remove("hide"),yield(0,a.d1)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t&&(t.remove(),t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)})))})))),this.managers=o.Z.managers,this.lazyLoadQueue=new c(void 0,(({target:e,visible:t})=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)})),r&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){e.querySelector("video")||this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId;return Promise.all([this.managers.appDocsManager.getDoc(t),this.scrollPromise]).then((([t])=>f(this,void 0,void 0,(function*(){const i=(yield(0,h.Z)({doc:t,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0,noPreview:!0})).loadPromise;return i.finally((()=>{const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&i.classList.add("hide"),t&&!t.parentElement&&setTimeout((()=>{t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)}))}),0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)})),i}))))}})}add(e,t=this.element){const i=document.createElement("div");i.classList.add("gif","grid-item"),i.dataset.docId=""+e.id,t.append(i),this.lazyLoadQueue.observe({div:i,load:u.Z}),(0,h.Z)({doc:e,container:i,lazyLoadQueue:null,noInfo:!0,onlyPreview:!0})}}},6008:(e,t,i)=>{"use strict";i.d(t,{X:()=>c});var s=i(426),n=i(3512),a=i(3035),o=i(4789),r=i(5975),d=i(2648),l=i(2738);function c(e,t,i,c,h=200,u,f){const p=(0,s.Z)({content:t,type:e||"tabs"===t.dataset.animation?"tabs":"navigation",transitionTime:h,onTransitionEnd:c,listenerSetter:f});if(!e)return p;const m=new Proxy(p,{apply:(t,i,s)=>{const n=+s[0],a=void 0===s[1]||s[1],o=e.querySelector(`[data-tab="${n}"]`)||e.children[n];g(o,n,a)}}),g=(s,r,d=!0)=>{return l=this,c=void 0,m=function*(){const l=t.children[r];if(i){const e=i(r,l,d),t=e instanceof Promise?yield e:e;if(void 0!==t&&!t)return}u&&u.scrollIntoViewNew({element:s.parentElement.children[r],position:"center",forceDirection:d?void 0:o.f.Static,forceDuration:h,axis:"x"}),n.Z.settings.animationsEnabled||(d=!1);const c=p.prevId();if(s.classList.contains("active")||r===c)return!1;const f=d?a.T2:e=>e(),m=e.querySelector(b.toLowerCase()+".active");m&&f((()=>{m.classList.remove("active")})),v&&-1!==c&&d&&f((()=>{const e=s.querySelector("i"),t=s.parentElement.children[c].querySelector("i");t.classList.remove("animate"),e.classList.remove("animate");const i=t.parentElement.parentElement.offsetLeft-e.parentElement.parentElement.offsetLeft,n=t.clientWidth/e.clientWidth;e.style.transform=`translate3d(${i}px, 0, 0) scale3d(${n}, 1, 1)`,(0,a.T2)((()=>{e.classList.add("animate"),e.style.transform="none"}))})),f((()=>{s.classList.add("active")})),p(r,d)},new((f=void 0)||(f=Promise))((function(e,t){function i(e){try{n(m.next(e))}catch(e){t(e)}}function s(e){try{n(m.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof f?n:new f((function(e){e(n)}))).then(i,s)}n((m=m.apply(l,c||[])).next())}));var l,c,f,m},v=!e.classList.contains("no-stripe"),b=e.firstElementChild.tagName;return(0,l.fc)(e,(t=>{let i,s=t.target;if(s=(0,r.Z)(s,e),!s)return!1;if(s.dataset.tab){if(i=+s.dataset.tab,-1===i)return!1}else i=(0,d.Z)(s);g(s,i)}),{listenerSetter:f}),m}},503:(e,t,i)=>{"use strict";i.d(t,{I1:()=>C,ZP:()=>I,rf:()=>w});var s=i(3910),n=i(6669),a=i(1544),o=i(8763),r=i(4668),d=i(3299),l=i(9336),c=i(1293),h=i(5565),u=i(669),f=i(130),p=i(2325),m=i(1507),g=i(6241),v=i(6535),b=i(3066),y=i(5400);function w(e,t,i,o){return r=this,l=void 0,h=function*(){const r=[],l=(null==i?void 0:i.some((e=>"messageEntityCustomEmoji"===e._)))?E():void 0,c=(0,b.Z)(t,{entities:i,wrappingForPeerId:o,loadPromises:r,customEmojiRenderer:l});c.querySelectorAll('[contenteditable="false"]').forEach((e=>{e.contentEditable="inherit",e.classList.add("pc")})),r.length&&(yield Promise.all(r)),c.querySelectorAll(".input-selectable").forEach((e=>{e.prepend((0,y.SZ)(!0))}));const h=u.Y?u.Z.getInstance():void 0,f=Array.from(c.querySelectorAll(".custom-emoji-placeholder")).map((e=>(e.dataset.ces="1",e.customEmojiElement))),p=(0,a.Z)(c);null==l||l.destroy();const m=(0,d.Z)(e);if(m.node);else{const t=document.createRange();let i=e.lastChild;i||e.append(i=document.createTextNode("")),t.setStartAfter(i),t.collapse(!0),m.selection.removeAllRanges(),m.selection.addRange(t)}e.addEventListener("input",s.Z,{capture:!0,once:!0}),null==h||h.onBeforeInput({inputType:"insertContent"}),window.document.execCommand("insertHTML",!1,p),Array.from(e.querySelectorAll("[data-ces]")).forEach(((e,t)=>{delete e.dataset.ces;const i=f[t];e.customEmojiElement=i,i.placeholder=e})),e.querySelectorAll(".pc").forEach((e=>{e.contentEditable="false"})),null==h||h.removeExtraBOMs(e),(0,n.Z)(e,"input")},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(r,l||[])).next())}));var r,l,c,h}let S=()=>{document.addEventListener("paste",(e=>{const t=(0,o.Z)(e.target,'contenteditable="true"');if(!t)return;const i=!!t.dataset.noLinebreaks;let s,n;e.preventDefault();let a=(e.originalEvent||e).clipboardData.getData("text/plain"),r=!0,d=(e.originalEvent||e).clipboardData.getData("text/html");const c=e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._&&!i;if(i){const e=/[\r\n]/g;a=a.replace(e,""),d=d.replace(e,"")}const h=(t.dataset.peerId||m.NM).toPeerId();if(d.trim()){d=d.replace(//,""),d=d.replace(//,""),d=d.replace('
',"");const e=d.match(/([\s\S]*)<\/body>/);e&&(d=e[1].trim());const t=(new DOMParser).parseFromString(d,"text/html").body||document.createElement("body");let i=t.firstChild;for(;i;){const e=i.nextSibling;i.nodeType===i.TEXT_NODE&&(i.nodeValue.trim()||i.remove()),i=e}const o=(0,l.Z)(t,!0,!1);h||(o.entities=o.entities.filter((e=>"messageEntityCustomEmoji"!==e._)));{const e=o.value.split("\n");let t=0;for(let i=0;i"messageEntityCustomEmoji"===e._))){s=o.value,n=o.entities,r=!1;let e=(0,v.Z)(s);e=e.filter(c),(0,g.Z)(n,e)}}r&&(s=a,n=(0,v.Z)(s),n=n.filter(c)),w(t,s,n,h)})),S=null};var C;function E(){return y.KZ.create({wrappingDraft:!0,isSelectable:!0})}function L(e){const t=Array.from(e.querySelectorAll(".custom-emoji, .custom-emoji-placeholder"));let i=e.querySelector(".custom-emoji-renderer");if(!i&&t.length)i=E(),e.prepend(i);else if(i&&!t.length)return void i.remove();if(!i)return;const s=new Map;t.forEach((e=>{const t=e instanceof y.LD?e:e.customEmojiElement,{docId:i}=t;let n=s.get(i);n||s.set(i,n=new Set),n.add(t)}));for(const[e,t]of s){let s=i.customEmojis.get(e);if(s)for(const e of s)t.has(e)||e.destroy();else s=new Set;for(const e of t)s.has(e)||e.connectedCallback()}i.add(s,!1),i.forceRender()}!function(e){e[e.Neutral=0]="Neutral",e[e.Valid=1]="Valid",e[e.Error=2]="Error"}(C||(C={}));class I{constructor(e={}){this.options=e,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=e.required,this.validate=e.validate,void 0!==e.maxLength&&void 0===e.showLengthOn&&(e.showLengthOn=Math.min(40,Math.round(e.maxLength/3)));const{placeholder:t,maxLength:i,showLengthOn:s,name:n,plainText:a,canBeEdited:o=!0,autocomplete:d}=e,h=e.label||e.labelText,f=[];let m;if(a?(this.container.innerHTML=`\n \n `,m=this.container.firstElementChild):(S&&S(),this.container.innerHTML='
',m=this.container.firstElementChild,m.contentEditable=""+!!o,u.Z.getInstance(),m.addEventListener("mousedown",(e=>{var t;const i=document.getSelection();if(!i.isCollapsed)return;const s=(0,r.Z)(e.target,"IMG");if(!s)return;const n=s.getBoundingClientRect(),a=n.left+n.width/2,o=e.clientX>=a,d=document.createRange();d.setStartAfter(o?s:null!==(t=s.previousSibling)&&void 0!==t?t:s),i.removeAllRanges(),i.addRange(d)})),f.push((()=>{(0,c.Z)(m)&&m.replaceChildren(),u.Y&&Array.from(m.querySelectorAll("br:not(.br-not-br)")).forEach((e=>{e.remove()})),(0,y.Cx)(Array.from(m.querySelectorAll(".input-something"))),L(m)}))),m.setAttribute("dir","auto"),e.inputMode&&(m.inputMode=e.inputMode),t&&(0,p.$d)(m,t,void 0,"placeholder"),h||t){const e=document.createElement("div");e.classList.add("input-field-border"),this.container.append(e)}if(h&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const e=this.container.lastElementChild;let t=!1;const n=()=>{const n=m.classList.contains("error"),o=a?m.value.length:[...(0,l.Z)(m,!1,!1).value].length,r=i-o,d=r<0;m.classList.toggle("error",d),d||r<=s?(this.setLabel(),e.append(` (${i-o})`),t||(t=!0)):(n&&!d||t)&&(this.setLabel(),t=!1)};f.push(n)}!e.withLinebreaks&&!a&&(m.dataset.noLinebreaks="1",m.addEventListener("keypress",(e=>{if("Enter"===e.key)return e.preventDefault(),!1}))),f.length&&m.addEventListener("input",(()=>{f.forEach((e=>e()))})),this.input=m}select(){this.value&&(this.options.plainText?this.input.select():function(e){const t=document.createRange();t.selectNodeContents(e);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?(0,f.Z)(this.label,this.options.labelText):this.label.append((0,p.ag)(this.options.label,this.options.labelOptions))}get value(){return this.options.plainText?this.input.value:(0,l.Z)(this.input,!1,!1).value}set value(e){this.setValueSilently(e,!0),this.simulateInputEvent()}simulateInputEvent(){(0,n.Z)(this.input,"input")}setValueSilently(e,t){this.options.plainText?this.input.value=e:((0,h.Z)(this.input,e),L(this.input))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!(0,c.Z)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(e="",t){this.options.plainText||(e=(0,a.Z)((0,b.Z)(e))),t?this.setValueSilently(e,!1):this.value=e}setOriginalValue(e="",t){this.originalValue=e,this.setDraftValue(e,t)}setState(e,t){t?(this.label.textContent="",this.label.append((0,p.ag)(t,this.options.labelOptions))):this.setLabel(),this.input.classList.toggle("error",!!(e&C.Error)),this.input.classList.toggle("valid",!!(e&C.Valid))}setError(e){this.setState(C.Error,e)}}},3607:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;const 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 s.ZP({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const i=document.createElement("i");i.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(i,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}},2153:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(2940),n=i(8847),a=i(4064),o=i(7009),r=i(8594);class d extends o.Z{constructor(e,t){super(e),this.onVisibilityChange=({target:e,visible:t})=>{(0,n.Z)(this.queue,(t=>t.div===e)).forEach((e=>{t&&(e.wasSeen=!0),e.visible=t;const i=this.queue.findIndex((e=>!e.visible));this.queue.splice(Math.max(0,i),0,e)})),this.setProcessQueueTimeout()},this.intersector=new s.Z(this.onVisibilityChange),!t&&(0,r.ZP)((()=>{this.lock()}),(()=>{this.unlockAndRefresh()}))}getItem(){return(0,a.Z)(this.queue,(e=>e.wasSeen))}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return i=this,s=void 0,a=function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}addElement(e,t){var i;return!!super.addElement(e,t)&&(this.observe(t),null!==(i=t.wasSeen)&&void 0!==i||(t.wasSeen=!1),!0)}}},7009:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8847),n=i(4421);class a extends n.Z{constructor(e){super(e),this.queue=[],this.inProcess=new Set}lock(){super.lock(),this.intersector.lock()}unlock(){super.unlock(),this.intersector.unlock()}unlockAndRefresh(){super.unlock(),this.intersector.unlockAndRefresh()}clear(){super.clear(),this.intersector.disconnect()}refresh(){this.intersector.refresh()}loadItem(e){return e.load(e.div)}addElement(e,t){if(this.queue.find((e=>e.div===t.div&&e.load===t.load)))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){var e;null!==(e=this.intersectorTimeout)&&void 0!==e||(this.intersectorTimeout=window.setTimeout((()=>{this.intersectorTimeout=void 0,this.processQueue()}),0))}push(e){super.push(e)}unshift(e){super.unshift(e)}delete(e){(0,s.Z)(this.queue,(t=>t.div===e.div)),this.unobserve(e)}observe(e){this.intersector.observe(e.div)}unobserve(e){this.intersector.unobserve(e.div)}}},7207:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3013),n=i(65);class a extends n.Z{constructor(e,t,i,s){super({step:1e3/60/1e3,min:0,max:1,withTransition:i,useTransform:s},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{const e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let i=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{i=!this.media.paused,i&&this.media.pause()},onMouseUp:e=>{i&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,i=this.media.currentTime;let n=0,a=0;for(let s=0;s=t&&t>=n&&(n=t,a=e.end(s))}const o=this.media.duration?a/this.media.duration:0;this.filledLoad.style.width=100*o+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media&&(this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress)),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}},3251:(e,t,i)=>{"use strict";i.d(t,{I:()=>p});var s=i(3189),n=i(8097),a=i(4755),o=i(3228),r=i(3035);const d=new Map,l=new Set;let c=!1;function h(){c||(c=!0,(0,r.T2)((()=>{c=!1,l.forEach(f),l.clear()})))}function u(e){const t=e.dataset.sizeType;return t?a.Z.active[t].width:e.getBoundingClientRect().width}function f(e){let t=d.get(e);const i=!t;let{text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:f,elementWidth:p}=t||{};if(i){a=e.textContent,r=a.length,l=50,c=l>0&&l/100;let i=e.dataset.fontSize;i&&+i&&(i+="px"),h=`${e.dataset.fontWeight||s.U9} ${i||s.Bf} ${s.bt}`,f=(0,n.Z)(a,h),p=u(e),t={text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:f,elementWidth:p},d.set(e,t)}const m=u(e),g=i||p!==m;if(!i&&g&&(t.elementWidth=p=m),g)if(f>p){e.setAttribute("title",a);let i=a,s=p;for(;i.length>3;){const t=i.length,a=c&&(0,o.Z)(c*t<<0,1,t-2)||Math.max(t+l-1,1),r=i.substr(0,a).replace(/\s*$/,""),d=i.substr(a+1).replace(/^\s*/,"");if(i=r+d,s=(0,n.Z)(i+"…",h),s{for(const[e]of d)l.add(e);h()}),{capture:!0,passive:!0});class p extends HTMLElement{connectedCallback(){d.set(this,null),this.dataset.sizeType?f(this):(l.add(this),h())}disconnectedCallback(){d.delete(this),l.delete(this)}}customElements.define("middle-ellipsis-element",p)},4425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.helpers.onVisibilityClickAdditional=()=>{this.passwordInputField.helpers.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},3083:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const i=e.input;i.addEventListener("blur",(()=>{this.playAnimation(0)})),i.addEventListener("input",(t=>{this.playAnimation(e.value.length)}))}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas[0].style.display="none"),this.animation.canvas[0].style.display=""):t=0;const i=this.needFrame>t?-1:1;this.animation.setDirection(i),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([s.Z.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then((e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),s.Z.waitForFirstFrame(e)))),s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then((e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas[0].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[0].style.display="",this.idleAnimation.play(),this.animation.canvas[0].style.display="none")})),s.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6830:(e,t,i)=>{"use strict";i.d(t,{T:()=>a,Z:()=>o});var s=i(3910),n=i(503);class a{constructor(e,t){this.container=e,this.input=t,this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.Z)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()},t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),e.classList.add("input-field-password"),e.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}class o extends n.ZP{constructor(e={}){super(Object.assign({plainText:!0},e)),this.helpers=new a(this.container,this.input)}}},8261:(e,t,i)=>{"use strict";i.d(t,{Z:()=>G});var s=i(2365),n=i(3725),a=i(2166),o=i(3532),r=i(2738),d=i(5565),l=i(130),c=i(3699),h=i(5471),u=i(9405),f=i(3624),p=i(8631),m=i(9355),g=i(2790),v=i(5102),b=i(2325),y=i(5400),w=i(3512),S=i(9331),C=i(9807),E=i(36),L=i(5432),I=i(4064),M=i(3910),P=i(1708),Z=i(6074),k=i(3035),T=i(7030),x=i(9931),A=i(3757),_=i(9492),F=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class D{constructor(e,t){this.scrollable=e,this.managers=t,this.processItem=e=>F(this,void 0,void 0,(function*(){const t=document.createElement("div");let i;t.classList.add(D.BASE_CLASS+"-avatar","media-container","hide"),this.avatars.append(t),e&&(i="object"!=typeof e?yield this.managers.appPhotosManager.getPhoto(e):e.action.photo);const s=new Image;s.classList.add("avatar-photo"),s.draggable=!1;const n=()=>F(this,void 0,void 0,(function*(){if(i){const e=yield(0,_.Z)({container:t,photo:i,size:(0,T.Z)(i,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach((e=>{e.classList.add("avatar-photo")}))}else{const e=yield this.managers.appPeersManager.getPeerPhoto(this.peerId);yield(0,x.Y)(t,this.peerId,e,"photo_big",s)}t.classList.remove("hide")}));return this.avatars.childElementCount<=3?yield n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.addTab(),e})),this.container=document.createElement("div"),this.container.classList.add(D.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(D.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(D.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(D.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(D.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(D.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(D.BASE_CLASS+"-arrow",D.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext),this.loadCallbacks=new Map,this.listenerSetter=new c.Z;const i=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1),s=1/3;let n=!1,a=!1;(0,r.fc)(this.container,(e=>F(this,void 0,void 0,(function*(){if(a)return void(0,M.Z)(e);if(n)return void(n=!1);if(!i())return;const t=this.container.getBoundingClientRect(),o=e.pageX,r=o-t.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||r>t.width*s&&r{t.push({element:this.avatars.children[i],item:e})}));const i=t.slice(0,this.listLoader.previous.length),s=t.slice(this.listLoader.previous.length+1),n=this.avatars.children[this.listLoader.previous.length];a=!0,(0,S.C)(n,e,(()=>e===this.peerId),this.listLoader.current,i,s),a=!1}else{const e=o>t.right-t.width/2;let i;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,i=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(i),(0,k.T2)((()=>{this.avatars.classList.remove("no-transition")}))}}))),{listenerSetter:this.listenerSetter});const o=()=>{n=!0,document.body.addEventListener(L.Z?"touchend":"click",(e=>{n=!1}),{once:!0})};let d=0,l=0,h=0,u=0;this.swipeHandler=new A.Z({element:this.avatars,onSwipe:(e,t)=>{h=e;let i=l+e*-D.SCALE;return i>0?i=0:ii()?!this.container.classList.contains("is-single")&&!a:(o(),(0,M.Z)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();d=e.width,u=-d*(this.tabs.childElementCount-1),l=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",l+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(h)/(d/D.SCALE))*(h>=0?1:-1);o(),this.avatars.classList.remove("no-transition"),(0,k.T2)((()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")}))}}),this.intersectionObserver=new IntersectionObserver((e=>{e.forEach((e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)}))}))}setPeer(e){return F(this,void 0,void 0,(function*(){this.peerId=e;const t=yield this.managers.appPeersManager.getPeerPhoto(e);if(!t)return;const i=this.listLoader=new Z.Z({loadCount:50,loadMore:(t,s,n)=>{if(!s)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t;return this.managers.appPhotosManager.getUserPhotos(e,i,n).then((e=>({count:e.count,items:e.photos})))}{const t=[];return i.current||t.push(this.managers.appProfileManager.getChatFull(e.toChatId())),t.push(this.managers.appMessagesManager.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:n,backLimit:0})),Promise.all(t).then((e=>F(this,void 0,void 0,(function*(){const t=e.pop();if((0,P.Z)(t),!i.current){const s=e[0],n=(0,I.Z)(t.history,(e=>e.action.photo.id===s.chat_photo.id));i.current=n||(yield this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId,s.chat_photo))}return{count:t.count,items:t.history}}))))}},processItem:this.processItem,onJump:(e,t)=>{const i=this.listLoader.index,s=100*D.SCALE*i;this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",`-${s}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active"),this.tabs.children[i].classList.add("active"),this.loadNearestToTarget(this.avatars.children[i])}});"userProfilePhoto"===t._&&(i.current=t.photo_id),yield this.processItem(i.current),i.load(!0)}))}addTab(){const e=document.createElement("div");e.classList.add(D.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),i=t.indexOf(e);t.slice(Math.max(0,i-3),Math.min(t.length,i+3)).forEach((e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))}))}cleanup(){var e;this.listenerSetter.removeAll(),this.swipeHandler.removeListeners(),null===(e=this.intersectionObserver)||void 0===e||e.disconnect()}}D.BASE_CLASS="profile-avatars",D.SCALE=s.Z?2:1,D.TRANSLATE_TEMPLATE=s.Z?`translate3d({x}, 0, -1px) scale(${D.SCALE})`:"translate({x}, 0)";var R=i(7479),B=i(5029),N=i(2796),O=i(8210),U=i(7362),H=i(9102),z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const j=(e,t)=>{(0,l.Z)(t.title,e||""),t.container.style.display=e?"":"none"};class G{constructor(e,t,i,n=!0){this.managers=e,this.scrollable=t,this.listenerSetter=i,this.isDialog=n,s.Z||this.scrollable.container.classList.add("no-parallax"),i||(this.listenerSetter=new c.Z),this.middlewareHelper=(0,f.k)()}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new B.Z({noDelimiter:!0}),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 R.ZP({title:" ",subtitle:!0,icon:"info",clickable:e=>{"A"!==e.target.tagName&&((0,a.T)(this.bio.title.textContent),(0,N.Am)(b.ZP.format("BioCopied",!0)))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_About",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>!this.peerId.isUser()},{icon:"copy",text:"Text.CopyLabel_Bio",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>this.peerId.isUser()}]}}),this.bio.title.classList.add("pre-wrap"),this.username=new R.ZP({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{(0,a.T)("@"+this.username.title.textContent),(0,N.Am)(b.ZP.format("UsernameCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_Username",onClick:()=>{(0,r.tH)(this.username.container)}}]}}),this.phone=new R.ZP({title:" ",subtitle:!0,icon:"phone",clickable:()=>{(0,a.T)(this.phone.title.textContent.replace(/\s/g,"")),(0,N.Am)(b.ZP.format("PhoneCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_PhoneNumber",onClick:()=>{(0,r.tH)(this.phone.container)}},{icon:"info",text:"PeerInfo.Phone.AnonymousInfo",textArgs:[document.createElement("a")],onClick:()=>{window.open("https://fragment.com/numbers","_blank")},separator:!0,multiline:!0,verify:()=>z(this,void 0,void 0,(function*(){const{isAnonymous:e}=(yield this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()))||{};return e}))}]}}),this.link=new R.ZP({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{const e=this.link.title.textContent;(0,a.T)(e);const t=e.includes("/c/");(0,N.Am)(b.ZP.format(t?"LinkCopiedPrivateInfo":"LinkCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_ShareLink",onClick:()=>{(0,r.tH)(this.link.container)}}]}}),this.location=new R.ZP({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 R.ZP({checkboxField:new C.Z({toggle:!0}),titleLangKey:"Notifications",icon:"unmute",listenerSetter:this.listenerSetter}),e.add(this.notifications.checkboxField.input)("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.threadId})})),e.add(w.Z)("dialog_notify_settings",(e=>z(this,void 0,void 0,(function*(){if(this.peerId===e.peerId){const e=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});this.notifications.checkboxField.checked=!e}})))),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),s.Z&&this.element.append((0,E.G)()),e.add(w.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),e.add(w.Z)("peer_bio_edit",(e=>{e===this.peerId&&this.setMoreDetails(!0)}));const t=({peerId:e,threadId:t})=>z(this,void 0,void 0,(function*(){return this.peerId===e&&(!(yield this.managers.appPeersManager.isForum(this.peerId))||!this.threadId||this.threadId===t)}));e.add(w.Z)("peer_title_edit",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&(this.fillUsername(),this.setMoreDetails(!0))})))),e.add(w.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),e.add(w.Z)("contacts_update",(e=>z(this,void 0,void 0,(function*(){this.peerId===e.toPeerId()&&((yield this.managers.appUsersManager.getUser(e)).pFlags.self&&this.isDialog||this.fillUserPhone())})))),e.add(w.Z)("avatar_update",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&this.setAvatar()})))),this.setPeerStatusInterval=window.setInterval((()=>this.setPeerStatus()),6e4)}setPeerStatus(e=!1,t){return z(this,void 0,void 0,(function*(){const i=this.peerId,s=[];s.push((()=>{this.element.classList.toggle("is-me",i===w.Z.myId)}));let n=Promise.resolve();if(i&&(w.Z.myId!==i||!this.isDialog)){const t=yield this.managers.appPeersManager.isForum(this.peerId),a=this.middlewareHelper.get();n=t&&this.threadId?(0,H.Z)({peerId:i,wrapOptions:{middleware:a}}).then((({element:e})=>{this.subtitle.replaceChildren(e)})):m.Z.setPeerStatus({peerId:i,element:this.subtitle,needClear:e,useWhitespace:!0,middleware:a,ignoreSelf:!this.isDialog}),n.then((e=>e&&s.push(e)))}const a=()=>s.forEach((e=>e()));return n.then((()=>{if(t)return a;a()}))}))}cleanupHTML(){[this.bio,this.phone,this.username,this.location,this.link].forEach((e=>{e.container.style.display="none"})),this.notifications&&(this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0),this.clearSetMoreDetailsTimeout()}canBeDetailed(){return this.peerId!==w.Z.myId||!this.isDialog}createAvatar(){const e=new S.Z;return e.classList.add("profile-avatar","avatar-120"),e.isDialog=this.isDialog,e.attachClickEvent(),e}_setAvatar(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,t=!(!this.threadId||!(yield this.managers.appPeersManager.isForum(e)));if(this.canBeDetailed()&&!t&&(yield this.managers.appPeersManager.getPeerPhoto(e))){const t=this.avatars;return this.avatars=new D(this.scrollable,this.managers),yield this.avatars.setPeer(e),()=>{var e;this.avatars.info.append(this.name,this.subtitle),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=void 0,t?t.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),s.Z&&this.scrollable.container.classList.add("parallax")}}const i=this.createAvatar();return yield i.updateWithOptions({peerId:e,threadId:t?this.threadId:void 0,wrapOptions:{customEmojiSize:(0,u.C)(120,120),middleware:this.middlewareHelper.get()}}),()=>{var e;s.Z&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=i,this.section.content.prepend(this.avatar,this.name,this.subtitle)}}))}setAvatar(e){const t=this._setAvatar();return e?t:t.then((e=>e()))}getUsernamesAlso(e){const t=e.slice(1);if(t.length){const e=t.map((e=>(0,o.Z)({username:e})));return(0,b.ag)("UsernameAlso",[(0,b.v_)(e,!1)])}}fillUsername(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appPeersManager.getPeerActiveUsernames(e),i=this.getUsernamesAlso(t);return()=>{this.username.subtitle.replaceChildren(i||(0,b.ag)("Username")),j(t[0],this.username)}}}))}fillUserPhone(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const{phone:t,isAnonymous:i}=(yield this.managers.appUsersManager.getUserPhone(e.toUserId()))||{};return()=>{this.phone.subtitle.replaceChildren((0,b.ag)(i?"AnonymousNumber":"Phone")),j(t?(0,O.Z)(t):void 0,this.phone)}}}))}fillNotifications(){return z(this,void 0,void 0,(function*(){const e=this.notifications;if(e){if(this.canBeDetailed()){const t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});return()=>{e.checkboxField.checked=!t}}return()=>{e.container.style.display="none"}}}))}fillName(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,[t]=yield Promise.all([(0,U.Z)({peerId:e,dialog:this.isDialog,withIcons:!this.threadId,threadId:this.threadId})]);return()=>{(0,d.Z)(this.name,t)}}))}fillRows(e){return z(this,void 0,void 0,(function*(){return Promise.all([this.fillName(),this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(void 0,e),this.setPeerStatus(!0,!0)]).then((e=>()=>{e.forEach((e=>null==e?void 0:e()))}))}))}fillProfileElements(){return z(this,void 0,void 0,(function*(){if(!this.cleaned)return;this.cleaned=!1,this.cleanupHTML();const e=(0,n.Z)();this.middlewareHelper.get().onClean((()=>{e.reject()}));const t=yield Promise.all([this.setAvatar(!0),this.fillRows(e)]);return()=>{e.resolve(),t.forEach((e=>null==e?void 0:e()))}}))}_setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){const i=this.getMiddlewarePromise();if(this.threadId&&(yield i(this.managers.appPeersManager.isForum(e)))){let t="https://t.me/";const s=(0,g.Z)(this.threadId),n=yield i(this.managers.appPeersManager.getPeerUsername(e));return t+=n?`${n}/${s}`:`c/${e.toChatId()}/${s}`,()=>{j(t,this.link)}}const s=[];if(s.push((()=>{this.bio.subtitle.replaceChildren((0,b.ag)(e.isUser()?"UserBio":"Info")),j(t.about?(0,y.ZP)(t.about):void 0,this.bio)})),!e.isUser()){const n=yield i(this.managers.appChatsManager.getChat(e.toChatId())),a=(0,v.Z)(n);let o;if(a.length)o=this.getUsernamesAlso(a),s.push((()=>j("https://t.me/"+a[0],this.link)));else{const e=t.exported_invite;"chatInviteExported"===(null==e?void 0:e._)&&s.push((()=>j(e.link,this.link)))}s.push((()=>this.link.subtitle.replaceChildren(o||(0,b.ag)("SetUrlPlaceholder"))))}const n=t.location;return"channelLocation"==(null==n?void 0:n._)&&s.push((()=>j(n.address,this.location))),this.setMoreDetailsTimeout=window.setTimeout((()=>this.setMoreDetails(!0)),6e4),()=>{s.forEach((e=>e()))}}))}setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){this.clearSetMoreDetailsTimeout();const{peerId:i}=this,s=this.getMiddlewarePromise();if(!i||!this.canBeDetailed()||(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return;const n=yield s(this.managers.acknowledged.appProfileManager.getProfileByPeerId(i,e)),a=s(n.result).then((e=>z(this,void 0,void 0,(function*(){if(!(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return yield s(this._setMoreDetails(i,e))}))));if(n.cached&&t)return a;(t||Promise.resolve()).then((()=>a)).then((e=>{null==e||e()}))}))}getMiddlewarePromise(){return(0,p.Z)(this.middlewareHelper.get(),(0,h.Z)("MIDDLEWARE"))}setPeer(e,t){var i;this.peerId===e&&this.threadId===t||(null===(i=this.init)||void 0===i||i.call(this),this.peerId=e,this.threadId=t,this.middlewareHelper.clean(),this.cleaned=!0)}clearSetMoreDetailsTimeout(){void 0!==this.setMoreDetailsTimeout&&(clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=void 0)}destroy(){var e;this.peerId=this.threadId=void 0,this.clearSetMoreDetailsTimeout(),clearInterval(this.setPeerStatusInterval),null===(e=this.avatars)||void 0===e||e.cleanup(),this.middlewareHelper.destroy()}}},8842:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(3512),n=i(2325),a=i(5565),o=i(1507),r=i(8456),d=i(130),l=i(5953),c=i(8115),h=i(493),u=(i(4755),i(5948));i(3541);function f(e,t,i,n,a){return o=this,r=void 0,l=function*(){const t=[],o=yield s.Z.managers.appPeersManager.getPeer(e);if(o.pFlags.verified&&!i&&t.push(function(){const e=document.createElement("span");e.classList.add("verified-icon","tgico");const t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttributeNS(null,"viewBox","0 0 26 26"),t.setAttributeNS(null,"width","26"),t.setAttributeNS(null,"height","26"),t.classList.add("verified-icon-svg");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#verified-icon-background"),i.classList.add("verified-icon-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-icon-check"),s.classList.add("verified-icon-check"),t.append(s,i),e.append(t),e}()),!o.pFlags.fake&&!o.pFlags.scam||n||t.push((0,u.Z)(o.pFlags.scam)),o.pFlags.premium&&!a){const e=o.emoji_status;e&&e._,t.push(function(){const e=document.createElement("span");return e.classList.add("premium-icon","tgico-star"),e}())}return t},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}var p=i(9345);const m=new WeakMap;s.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{let i=`.peer-title[data-peer-id="${e}"]`;t&&(i+=`[data-thread-id="${t}"]`),Array.from(document.querySelectorAll(i)).forEach((e=>{const t=m.get(e);null==t||t.update()}))}));class g{constructor(e){this.element=document.createElement("span"),this.element.classList.add("peer-title"),this.element.setAttribute("dir","auto"),this.options={},e&&this.update(e),m.set(this.element,this)}setOptions(e){if(e){(0,l.Z)(this.options,e);for(const t in e){const i=e[t];"object"!=typeof i&&"function"!=typeof i&&(this.element.dataset[t]=i?""+("boolean"==typeof i?+i:i):"0")}}}setHasInner(e){this.hasInner!==e&&(this.hasInner=e,this.element.classList.toggle("with-icons",e))}update(e){var t,i,l,u,m,g,v,b;return m=this,g=void 0,b=function*(){this.setOptions(e);let m,g=this.options.fromName;if(void 0!==g)return void 0!==this.options.limitSymbols&&(g=(0,r.Z)(g,this.options.limitSymbols,this.options.limitSymbols)),void(0,d.Z)(this.element,(0,c.Z)(g));null!==(t=(u=this.options).peerId)&&void 0!==t||(u.peerId=o.NM);const{peerId:v,threadId:b}=this.options;if(v===s.Z.myId&&this.options.dialog)(0,a.Z)(this.element,(0,n.ag)(this.options.onlyFirstName?"Saved":"SavedMessages"));else{if(b){const[e,t]=yield Promise.all([s.Z.managers.dialogsStorage.getForumTopic(v,b),s.Z.managers.appPeersManager.isForum(v)]);if(!e&&t)return s.Z.managers.dialogsStorage.getForumTopicById(v,b).then((e=>{if(!e&&this.options.threadId===b)return this.options.threadId=void 0,void this.update({threadId:void 0});this.update()}),(()=>{this.options.threadId===b&&(this.options.threadId=void 0,this.update({threadId:void 0}))})),(0,d.Z)(this.element,(0,n.ag)("Loading")),void this.setHasInner(!1)}const e=b&&this.options.withIcons?s.Z.managers.dialogsStorage.getForumTopic(v,b).then((e=>{var t;return(0,p.e)(Object.assign(Object.assign({},null!==(t=this.options.wrapOptions)&&void 0!==t?t:{}),{topic:e}))})):void 0,[t,a,o]=yield Promise.all([(0,h.Z)(this.options),this.options.withIcons&&f(v,null===(i=this.options.wrapOptions)||void 0===i||i.middleware)||this.options.withPremiumIcon&&f(v,null===(l=this.options.wrapOptions)||void 0===l||l.middleware,!0,!0),e]);if((null==a?void 0:a.length)||o){const e=document.createElement("span");e.classList.add("peer-title-inner"),m=!0,(0,d.Z)(e,t);const i=document.createDocumentFragment();i.append(...[o,e,...null!=a?a:[]].filter(Boolean)),(0,d.Z)(this.element,i)}else(0,d.Z)(this.element,t)}this.setHasInner(m)},new((v=void 0)||(v=Promise))((function(e,t){function i(e){try{n(b.next(e))}catch(e){t(e)}}function s(e){try{n(b.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof v?n:new v((function(e){e(n)}))).then(i,s)}n((b=b.apply(m,g||[])).next())}))}}},6765:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1168),n=i(2325),a=i(2738),o=i(8678),r=i(2312);class d extends s.Z{constructor(e={}){super("popup-avatar",{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),(0,n.$d)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),e.isForum&&this.cropContainer.classList.add("is-forum"),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",(e=>{const t=e.target.files[0];t&&(0,o.Z)(t).then((e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=function(e,t){let i,s,n,a={},o=0,r=0,d=0,l=0,c=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,n=new Image,n.src=e.src,n.draggable=!1,n.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),i=document.createElement("div"),i.classList.add("crop-component"),s=document.createElement("div"),s.classList.add("crop-overlay");const a=document.createElement("div");a.classList.add("crop-overlay-color"),i.appendChild(s),e.parentNode.appendChild(i),i.appendChild(n),i.appendChild(e),i.appendChild(a),s.appendChild(n),n.style.maxWidth=e.width+"px",c=e.naturalWidth/e.offsetWidth;const o=e.offsetWidth/2-100,r=e.offsetHeight/2-100;u(200,200),f(o,r),p(o,r),s.addEventListener("mousedown",b,!1),s.addEventListener("touchstart",b,!1),s.addEventListener("wheel",v,!1),document.addEventListener("keypress",g,!1)}function u(e,t){d=e*c,l=t*c,s.style.width=e+"px",s.style.height=t+"px"}function f(e,t){r=t*c,o=e*c,n.style.top=-t+"px",n.style.left=-e+"px"}function p(e,t){s.style.top=t+"px",s.style.left=e+"px"}function m(e){e=e*Math.PI*2;let t,i,a,o,r=Math.floor(s.clientWidth+e),d=Math.floor(s.clientHeight+e),l=n.clientWidth,c=n.clientHeight;r<50||r>l||(t=s.offsetLeft-e/2,i=s.offsetTop-e/2,a=t+r,o=i+d,t<0&&(t=0),i<0&&(i=0),a>l||o>c||(u(r,r),f(t,i),p(t,i)))}function g(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":m(4);break;case"-":m(-4)}}function v(e){e.preventDefault(),m(e.deltaY>0?1:-1)}function b(e){e.preventDefault(),e.stopPropagation(),function(e){a.container_width=s.offsetWidth,a.container_height=s.offsetHeight,a.container_left=s.offsetLeft,a.container_top=s.offsetTop,a.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,a.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",w),document.addEventListener("touchmove",w),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}function y(e){e.preventDefault(),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w)}function w(e){let t,i,o,r,d={x:0,y:0};e.preventDefault(),e.stopPropagation(),d.x=e.pageX||e.touches&&e.touches[0].pageX,d.y=e.pageY||e.touches&&e.touches[0].pageY,t=d.x-(a.mouse_x-a.container_left),i=d.y-(a.mouse_y-a.container_top),o=s.offsetWidth,r=s.offsetHeight,t<0?t=0:t>n.offsetWidth-o&&(t=n.offsetWidth-o),i<0?i=0:i>n.offsetHeight-r&&(i=n.offsetHeight-r),f(t,i),p(t,i)}return e.complete?h():e.onload=h,{crop:function(){t.width=d,t.height=l,t.getContext("2d").drawImage(e,o,r,d,l,0,0,d,l)},removeHandlers:function(){s.removeEventListener("mousedown",b),s.removeEventListener("touchstart",b),s.removeEventListener("wheel",v),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w),document.removeEventListener("keypress",g),i.remove(),s.remove(),n.remove()}}}(this.image,this.canvas),this.input.value=""}}))}),!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",(0,a.fc)(this.btnConfirm,(()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob((e=>{this.blob=e,this.darkenCanvas(),this.resolve()}),"image/jpeg",1)}),{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",(()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()}))}resolve(){this.onCrop((()=>r.Z.upload(this.blob)))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){const e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},6194:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(1168),n=i(7362),a=i(8127);class o{constructor(e,t,i,s){this.peerId=e,this.peerType=t,this.onSelect=i,this.threadId=s,this.construct()}construct(){return e=this,t=void 0,o=function*(){let{peerId:e,peerType:t,onSelect:i,threadId:o}=this;const r=yield(0,n.Z)({peerId:e,threadId:o}),d=s.Z.MANAGERS;void 0===t&&(t=yield d.appPeersManager.getDialogType(e));const l=(t,s=g&&!!t.size)=>{let n=d.appChatsManager.leave(e.toChatId());s&&(n=n.then((()=>d.appMessagesManager.flushHistory(e)))),null==i||i(n)},c=t=>{let s;if(o)s=d.appMessagesManager.flushHistory(e,!1,!0,o);else if(e.isUser())s=d.appMessagesManager.flushHistory(e,!1,g?!!t.size:void 0);else{if(!t.size)return l(t);s=d.appChatsManager.delete(e.toChatId())}null==i||i(s)};let h,u,f,p,m,g;switch(t){case"channel":(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="ChannelDeleteMenu",f="AreYouSureDeleteAndExitChannel",m=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChannelForAll"}]):(h="LeaveChannelMenu",f="ChannelLeaveAlertWithName",p=[r],m=[{langKey:"LeaveChannel",isDanger:!0,callback:l}]);break;case"chat":h="DeleteChatUser",f="AreYouSureDeleteThisChatWithUser",p=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}],g=[{text:"DeleteMessagesOptionAlso",textArgs:[yield(0,n.Z)({peerId:e})]}];break;case"saved":h="DeleteChatUser",f="AreYouSureDeleteThisChatSavedMessages",m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}];break;case"megagroup":case"group":o?(h="DeleteTopics",u=[1],f="DeleteSelectedTopic",p=[r],m=[{langKey:"Delete",isDanger:!0,callback:c}]):(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="DeleteMegaMenu",f="AreYouSureDeleteAndExit",m=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChat.DeleteGroupForAll"}]):(h="LeaveMegaMenu",f="AreYouSureDeleteAndExitName",p=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>l(e,!0)}])}new a.Z("popup-delete-chat",{peerId:e,threadId:o,titleLangKey:h,titleLangArgs:u,descriptionLangKey:f,descriptionLangArgs:p,buttons:m,checkboxes:g}).show()},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{d(o.next(e))}catch(e){n(e)}}function r(e){try{d(o.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,r)}d((o=o.apply(e,t||[])).next())}));var e,t,i,o}}},5128:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3512),n=i(1168),a=i(8127),o=i(2325),r=i(7120),d=i(2353),l=i(7362),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class h{constructor(e,t,i,s,n){this.peerId=e,this.mids=t,this.type=i,this.onConfirm=s,this.threadId=n,this.construct()}construct(){return c(this,void 0,void 0,(function*(){let{peerId:e,mids:t,type:i,onConfirm:h,threadId:u}=this;const f=yield(0,l.Z)({peerId:e,threadId:u}),p=n.Z.MANAGERS;t=t.slice();const m=(s,n)=>{h&&h(),"scheduled"===i?p.appMessagesManager.deleteScheduledMessages(e,t):p.appMessagesManager.deleteMessages(e,t,!!s.size||n)},g=[{langKey:"Delete",isDanger:!0,callback:m}],v=[];let b,y,w,S;if(1===t.length?b="DeleteSingleMessagesTitle":(b="DeleteMessagesTitle",y=[(0,o.ag)("messages",[t.length])]),w=(yield p.appPeersManager.isMegagroup(e))?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",e===s.Z.myId||"scheduled"===i);else if(e.isUser())v.push({text:"DeleteMessagesOptionAlso",textArgs:[f]});else{const i=yield p.appChatsManager.getChat(e.toChatId()),n=(0,r.Z)(i,"delete_messages");if("chat"===i._){const i=n?t.slice():yield(0,d.Z)(t,(t=>c(this,void 0,void 0,(function*(){return(yield p.appMessagesManager.getMessageByPeer(e,t)).fromId===s.Z.myId}))));i.length&&(i.length===t.length?v.push({text:"DeleteForAll"}):(v.push({text:"DeleteMessagesOption"}),w="DeleteMessagesTextGroup",S=[(0,o.ag)("messages",[i.length])]))}else g[0].callback=e=>m(e,!0)}(0,n.x)(g),new a.Z("popup-delete-chat",{peerId:e,threadId:u,titleLangKey:b,titleLangArgs:y,descriptionLangKey:w,descriptionLangArgs:S,buttons:g,checkboxes:v}).show()}))}}},4524:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9355),n=i(2995);class a extends n.Z{constructor(e,t,i=!1){super({peerTypes:["dialogs","contacts"],onSelect:i?t:i=>{return n=this,a=void 0,r=function*(){if(t){const e=t(i);e instanceof Promise&&(yield e)}s.Z.setInnerPeer({peerId:i}),s.Z.chat.input.initMessagesForward(e)},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r},placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}},1168:(e,t,i)=>{"use strict";i.d(t,{Z:()=>E,x:()=>L});var s=i(1405),n=i(5814),a=i(9818),o=i(2325),r=i(8497),d=i(8799),l=i(3699),c=i(2738),h=i(6299),u=i(3910),f=i(3241),p=i(6733),m=i(1655),g=i(3815),v=i(8805),b=i(3624),y=i(8115);const w=document.body;let S=w;const C=()=>{S=(0,p.W7)()||w,E.reAppend()};(0,p.Ms)(w,C);class E extends f.Z{constructor(e,t={}){if(super(!1),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=()=>{a.Z.backByItem(this.navigationItem)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),(t.title||t.titleRaw)&&(this.title.classList.add("popup-title"),"string"==typeof t.title?(0,o.$d)(this.title,t.title):t.titleRaw&&this.title.append((0,y.Z)(t.titleRaw)),this.header.append(this.title)),this.middlewareHelper=(0,b.k)(),this.listenerSetter=new l.Z,this.managers=E.MANAGERS,this.confirmShortcutIsSendShortcut=t.confirmShortcutIsSendShortcut,t.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),(0,c.fc)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=t.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),t.overlayClosable&&(0,c.fc)(this.element,(e=>{(0,r.Z)(e.target,"popup-container")||this.hide()}),{listenerSetter:this.listenerSetter}),t.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==t.withConfirm&&this.btnConfirm.append((0,o.ag)(t.withConfirm)),this.header.append(this.btnConfirm),(0,s.Z)(this.btnConfirm)),this.container.append(this.header),t.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body)),t.scrollable){const e=this.scrollable=new v.ZP(this.body);this.attachScrollableListeners(),this.body||this.container.insertBefore(e.container,this.header.nextSibling)}let i=this.btnConfirm;const n=this.buttons=t.buttons;if(null==n?void 0:n.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons");const t=n.map((e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),(0,s.Z)(t),e.text?t.innerHTML=e.text:t.append((0,o.ag)(e.langKey,e.langArgs)),(0,c.fc)(t,(()=>{e.callback&&e.callback(),this.destroy()}),{listenerSetter:this.listenerSetter,once:!0}),e.element=t}));if(!i&&2===n.length){const e=n.find((e=>!e.isCancel));e&&(i=e.element)}e.append(...t),this.container.append(e)}this.btnConfirmOnEnter=i,this.element.append(this.container),E.POPUPS.push(this)}attachScrollableListeners(e){return this.scrollable.attachBorderListeners(e)}onContentUpdate(){this.scrollable&&this.scrollable.onAdditionalScroll()}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},a.Z.pushItem(this.navigationItem),(0,d.Z)(),S.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.onContentUpdate(),this.withoutOverlay||(g.Z.isOverlayActive=!0,n.Z.checkAnimations2(!0)),setTimeout((()=>{this.element.classList.contains("active")&&this.listenerSetter.add(document.body)("keydown",(e=>{E.POPUPS[E.POPUPS.length-1]===this&&(this.confirmShortcutIsSendShortcut?(0,h.Z)(e):"Enter"===e.key)&&((0,c.tH)(this.btnConfirmOnEnter),(0,u.Z)(e))}))}),0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.middlewareHelper.destroy(),this.withoutOverlay||(g.Z.isOverlayActive=!1),a.Z.removeItem(this.navigationItem),this.navigationItem=void 0,(0,m.Z)(E.POPUPS,this),C(),setTimeout((()=>{var e;this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),null===(e=this.scrollable)||void 0===e||e.destroy(),this.withoutOverlay||n.Z.checkAnimations2(!1)}),150)}static reAppend(){this.POPUPS.forEach((e=>{const{element:t,container:i}=e,s=t.parentElement;s&&s!==S&&S!==i&&S.append(t)}))}static getPopups(e){return this.POPUPS.filter((t=>t instanceof e))}static createPopup(e,...t){return new e(...t)}}E.POPUPS=[];const L=e=>(e.find((e=>e.isCancel))||e.push({langKey:"Cancel",isCancel:!0}),e)},3897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(7298),n=i(1507),a=i(7479),o=i(8127);const r=[{value:3600,langPackKey:"ChatList.Mute.1Hour"},{value:14400,langPackKey:"ChatList.Mute.4Hours"},{value:28800,langPackKey:"ChatList.Mute.8Hours"},{value:86400,langPackKey:"ChatList.Mute.1Day"},{value:259200,langPackKey:"ChatList.Mute.3Days"},{value:-1,langPackKey:"ChatList.Mute.Forever",checked:!0}];class d extends o.Z{constructor(e,t){let i;super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{this.managers.appMessagesManager.mutePeer({peerId:e,muteUntil:-1===i?n.rU:(0,s.Z)(!0)+i,threadId:t})}}],body:!0});const o=(0,a.ZC)(r,(e=>{i=+e}));this.body.append(o),this.show()}}},8127:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(9331),n=i(1168),a=i(2325),o=i(9807),r=i(130);class d extends n.Z{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),Object.assign(Object.assign({overlayClosable:!0},t),{title:!0,buttons:t.buttons&&(0,n.x)(t.buttons)})),this.className=e,t.peerId){const e=new s.Z;e.classList.add("avatar-32"),e.updateWithOptions({isDialog:!0,peerId:t.peerId,threadId:t.threadId,wrapOptions:{middleware:this.middlewareHelper.get()}}),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append((0,a.ag)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const i=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append((0,a.ag)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(0,r.Z)(e,t.description),i.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach((e=>{e.withRipple=!0;const t=new o.Z(e);e.checkboxField=t,i.append(t.label)})),t.buttons.forEach((e=>{if(e.callback){const i=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach((t=>{t.checkboxField.checked&&e.add(t.text)})),i(e)}}}))),this.container.insertBefore(i,this.header.nextElementSibling)}}},2995:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5432),n=i(5644),a=i(1168);class o extends a.Z{constructor(e){super("popup-forward",{closable:!0,overlayClosable:!0,body:!0,title:!0}),this.selector=new n.Z({appendTo:this.body,onChange:()=>{return t=this,i=void 0,n=function*(){const t=this.selector.getSelected(),i=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(i);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),s.Z||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:"abitbigger",peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence,managers:this.managers}),this.scrollable=this.selector.scrollable,this.attachScrollableListeners(),this.title.append(this.selector.input)}}},1962:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8127);class n extends s.Z{constructor(e,t,i){super("popup-delete-chat",{title:`Send Message${t.length>1?"s":""} Now`,description:t.length>1?"Send "+t.length+" messages now?":"Send message now?",buttons:[{langKey:"Send",callback:()=>{i&&i(),this.managers.appMessagesManager.sendScheduledMessages(e,t)}}]}),this.show()}}},6787:(e,t,i)=>{"use strict";i.d(t,{Z:()=>P});var s=i(1168),n=i(3541),a=i(2153),o=i(279),r=i(5814),d=i(9355),l=i(4755),c=i(2325),h=i(4494),u=i(8497),f=i(1656),p=i(2738),m=i(2796),g=i(130),v=i(8115),b=i(3163),y=i(9259),w=i(7479),S=i(5565),C=i(3512),E=i(9083),L=i(3173),I=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const M="STICKERS-POPUP";class P extends s.Z{constructor(e,t){super("popup-stickers",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.stickerSetInput=e,this.isEmojis=t,this.onStickersClick=e=>I(this,void 0,void 0,(function*(){const t=(0,u.Z)(e.target,"sticker-set-sticker");if(!t)return;const i=t.dataset.docId;(yield d.Z.chat.input.sendMessageWithDocument(i))&&this.hide()})),this.title.append((0,c.ag)("Loading")),this.updateAdded={},L.ZP.setIgnoreMouseOut("popup",!0),this.addEventListener("close",(()=>{L.ZP.setIgnoreMouseOut("popup",!1),r.Z.setOnlyOnePlayableGroup()})),this.appendTo=this.scrollable.container,this.appendTo.classList.add("is-loading"),(0,o.y)(this.appendTo,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer");const i=(0,h.Z)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(i),this.body.append(this.stickersFooter),(0,y.Z)({listenTo:this.appendTo,listenerSetter:this.listenerSetter});const s=e=>{const t=this.sets.findIndex((t=>t.id===e.id));if(-1===t)return;this.sets[t]=e;const i=this.updateAdded[e.id];null==i||i(!!e.installed_date),this.updateButton()};this.listenerSetter.add(C.Z)("stickers_installed",s),this.listenerSetter.add(C.Z)("stickers_deleted",s),this.loadStickerSet()}createStickerSetElements(e){const t=document.createElement("div");let i,s;t.classList.add("sticker-set"),e&&(i=new w.ZP({title:(0,v.Z)(e.title),subtitle:(0,c.ag)(e.pFlags.emojis?"EmojiCount":"Stickers",[e.count]),buttonRight:!0}),s=e=>{(0,S.Z)(i.buttonRight,(0,c.ag)(e?"Stickers.SearchAdded":"Stickers.SearchAdd")),i.buttonRight.classList.toggle("active",e)},s(!!e.installed_date),t.append(i.container));const n=document.createElement("div");return n.classList.add("sticker-set-stickers"),t.append(n),{container:t,headerRow:i,updateAdded:s,itemsContainer:n}}loadStickerSet(){var e;return I(this,void 0,void 0,(function*(){const t=this.middlewareHelper.get(),i=(Array.isArray(this.stickerSetInput)?this.stickerSetInput:[this.stickerSetInput]).map((e=>this.managers.appStickersManager.getStickerSet(e)));let s=yield Promise.all(i);if(!t())return;let o=s[0];if(1===s.length&&!o)return(0,m.bC)({langPackKey:this.isEmojis?"AddEmojiNotFound":"StickerSet.DontExist"}),void this.hide();s=s.filter(Boolean),o=s[0],this.sets=s.map((e=>e.set));const d=null!==(e=this.isEmojis)&&void 0!==e?e:this.isEmojis=!!o.set.pFlags.emojis;if(!d){(0,p.fc)(this.appendTo,this.onStickersClick,{listenerSetter:this.listenerSetter});const{destroy:e}=(0,b.Z)({listenTo:this.appendTo,isStickerPack:!0,onSend:()=>this.hide()});this.addEventListener("close",e)}r.Z.setOnlyOnePlayableGroup(M);const u=new a.Z,y=[],w=s.map((e=>I(this,void 0,void 0,(function*(){const{container:i,itemsContainer:a,headerRow:o,updateAdded:r}=this.createStickerSetElements(s.length>1?e.set:void 0);let c;o&&(0,p.fc)(o.buttonRight,(()=>{this.managers.appStickersManager.toggleStickerSet(e.set)}),{listenerSetter:this.listenerSetter}),this.updateAdded[e.set.id]=r;const h=e.documents.filter((e=>"document"===(null==e?void 0:e._)));if(d){const e=(0,E.Z)({docIds:h.map((e=>e.id)),loadPromises:y,animationGroup:M,customEmojiSize:l.Z.active.esgCustomEmoji,middleware:t});Array.from(e.children).slice(1).forEach((e=>{const t=document.createElement("span");t.classList.add("super-emoji"),e.replaceWith(t),t.append(e)})),c=[e],a.classList.replace("sticker-set-stickers","super-emojis"),a.classList.add("is-emojis","not-local")}else c=yield Promise.all(h.map((e=>I(this,void 0,void 0,(function*(){const i=document.createElement("div");i.classList.add("sticker-set-sticker");const s=l.Z.active.popupSticker.width;return yield(0,n.ZP)({doc:e,div:i,lazyLoadQueue:u,group:M,play:!0,loop:!0,width:s,height:s,withLock:!0,loadPromises:y,middleware:t}),i})))));return a.append(...c.filter(Boolean)),i})))),S=yield Promise.all(w);yield Promise.all(y);const C=this.button=(0,h.Z)("",{noRipple:!0});this.updateButton(),(0,p.fc)(C,(()=>{const e=(0,f.Z)([C],!0);this.managers.appStickersManager.toggleStickerSets(s.map((e=>e.set))).then((()=>{this.hide()})).catch((()=>{e()}))}),{listenerSetter:this.listenerSetter}),1===s.length?(0,g.Z)(this.title,(0,v.Z)(o.set.title)):(0,g.Z)(this.title,(0,c.ag)("Emoji")),this.stickersFooter.textContent="",this.stickersFooter.append(C),this.appendTo.classList.remove("is-loading"),this.appendTo.textContent="",this.appendTo.append(...S),this.scrollable.onAdditionalScroll()}))}updateButton(){const{sets:e,isEmojis:t}=this;let i,s;if(1===e.length){const n=e[0];s=(0,c.ag)(t?"EmojiCount":"Stickers",[n.count]),i=!n.installed_date}else{const t=e.filter((e=>e.installed_date));let n;e.length===t.length?(i=!1,n=e.length):(i=!0,n=e.length-t.length),s=(0,c.ag)("EmojiPackCount",[n])}this.button.className=i?"btn-primary btn-color-primary":"btn-primary btn-primary-transparent danger",(0,S.Z)(this.button,(0,c.ag)(i?"AddStickersCount":"RemoveStickersCount",[s]))}}},3442:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(9099),n=i(3035),a=i(3910),o=i(2738),r=i(8487),d=i(5953);class l{constructor(e){this.tempId=0,this.detached=!0,this.promise=null,this.isUpload=!1,this.cancelable=!0,this.streamable=!1,this.tryAgainOnFail=!0,this.attachMethod="append",this.onClick=e=>{e&&(0,a.Z)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&(0,d.Z)(this,e),this.isUpload&&(this.tryAgainOnFail=!1)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&(0,o.fc)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,i=Date.now(),s=s=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const a=Date.now()-i;if(!s&&this.cancelable){this.setProgress(100);const e=150;a{t===this.tempId&&this.detach()}),e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),(0,n.T2)((()=>{this.setManual()}))):this.detach();this.promise=e=null};e.then((()=>s(null))).catch((e=>s(e))),e.addNotifyListener&&e.addNotifyListener((e=>{if(t!==this.tempId)return;const i=e.done/e.total*100;this.setProgress(i)}))}attach(e,t=!1,i){this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,i&&this.attachPromise(i);let n=0;(this.detached||this.preloader.parentElement!==e)&&(n=(0,r.Z)(this.preloader)?1:2,this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader)),(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!0,duration:200,useRafs:n}),this.cancelable&&t&&this.setProgress(0)}detach(){var e;this.detached||(this.detached=!0,(null===(e=this.preloader)||void 0===e?void 0:e.parentElement)&&(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{this.preloader.remove()},useRafs:1}))}setProgress(e){if(this.totalLength||(0,r.Z)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},9931:(e,t,i)=>{"use strict";i.d(t,{Z:()=>b,Y:()=>g});var s=i(4059),n=i(6740),a=i(5565),o=i(130),r=i(9674),d=i(5990),l=i(7256),c=i(1507),h=i(5798),u=i(3512),f=i(9345),p=i(319),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function g(e,t,i,o,d=new Image,l=!1){return m(this,void 0,void 0,(function*(){const l=yield u.Z.managers.acknowledged.appAvatarsManager.loadAvatar(t,i,o),c=l.result,h=l.cached;let f,m,v;if(d.classList.add("avatar-photo"),h)m=()=>{(0,a.Z)(e,d),e.dataset.color=""};else{const l=u.Z.settings.animationsEnabled;l&&d.classList.add("fade-in");let c=!1;if("photo_big"===o){const s=yield g(e,t,i,"photo_small");f=s.loadThumbPromise||s.loadPromise,v=s.thumbImage}else if(i.stripped_thumb){v=new Image,e.classList.add("avatar-relative"),v.classList.add("avatar-photo","avatar-photo-thumbnail");const t=(0,s.Z)(i.stripped_thumb);f=(0,n.cj)(v,t).then((()=>{c||(0,a.Z)(e,v)}))}m=()=>{c=!0,v?e.append(d):(0,a.Z)(e,d),setTimeout((()=>{e.childElementCount&&r.Z.mutateElement(d,(()=>{e.dataset.color="",l&&d.classList.remove("fade-in"),null==v||v.remove()}))}),l?200:0)}}const b=c.then((e=>(0,n.cj)(d,e))).then(m);return f&&(yield f.catch(p.Z)),{cached:h,loadPromise:b,loadThumbPromise:h?b:f||Promise.resolve(),thumbImage:v}}))}function v(e,t,i,s,n,a){(0,o.Z)(e,t),e.dataset.color=i,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled","is-forum","is-topic"),s&&e.classList.add(s),n&&e.classList.add("is-forum"),a&&e.classList.add("is-topic")}function b({div:e,peerId:t,isDialog:i=!1,title:s="",onlyThumb:n=!1,isBig:a,threadId:o,wrapOptions:r={}}){var p,b;return m(this,void 0,void 0,(function*(){const m=u.Z.myId;if(t===m&&i)return void v(e,"","","tgico-saved");const y=u.Z.managers;if(o){const i=yield y.dialogsStorage.getForumTopic(t,o);return v(e,"","",void 0,void 0,!0),r.customEmojiSize&&e.style.setProperty("--size",r.customEmojiSize.width+"px"),(0,f.e)(Object.assign(Object.assign({},r),{topic:i,lazyLoadQueue:!1})).then((t=>{e.replaceChildren(t)}))}const w=yield y.appPeersManager.getPeer(t);if(t!==c.NM&&t.isUser()&&(null===(p=null==w?void 0:w.pFlags)||void 0===p?void 0:p.deleted))return void v(e,"",(0,d.Z)(t),"tgico-deletedaccount");const S=!!(null===(b=null==w?void 0:w.pFlags)||void 0===b?void 0:b.forum),C=a?"photo_big":"photo_small",E=(0,l.Z)(w),L=!!E,I=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!L||!I||!(yield y.appAvatarsManager.isAvatarCached(t,C))){let n="";if(!t||t===m&&i||(n=(0,d.Z)(t)),t===c.hj)return void v(e,"",n,"tgico-reply_filled");const a=s?(0,h.Z)(s):function(e){var t;let i="";return e&&(i=null!==(t=e.title)&&void 0!==t?t:[e.first_name,e.last_name].filter(Boolean).join(" ")),(0,h.Z)(i)}(w);v(e,a,n,"",S)}return L?g(e,t,E,C,void 0,n):void 0}))}},279:(e,t,i)=>{"use strict";function s(e,t=!1){const i='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=i,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",i),e.lastElementChild}function n(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,s(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.d(t,{p:()=>n,y:()=>s}),i(410).GO.putPreloader=s},1218:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(9750),n=i(2325),a=i(3855),o=i(3512);class r{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field"),e.alignRight&&t.classList.add("radio-field-right");const i=this.input=document.createElement("input");i.type="radio",i.name="input-radio-"+e.name,e.value&&(i.value=e.value,e.stateKey&&(a.Z.getState().then((t=>{i.checked=(0,s.Z)(t,e.stateKey)===e.value})),i.addEventListener("change",(()=>{o.Z.managers.appStateManager.setByKey(e.stateKey,e.value)}))));const r=this.main=document.createElement("div");r.classList.add("radio-field-main"),e.text?r.innerHTML=e.text:e.langKey&&(0,n.$d)(r,e.langKey),t.append(i,r)}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}}},5133:(e,t,i)=>{"use strict";function s(e,t){const i=document.createElement("form");return e.forEach((e=>{const{container:s,input:n}=e;i.append(s),n.addEventListener("change",(e=>{n.checked&&t(n.value,e)}))})),i}i.d(t,{Z:()=>s})},65:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5077),n=i(3228),a=i(5953);class o{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},(0,a.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const i=this.seek=document.createElement("input");i.classList.add("progress-line__seek"),i.type="range",i.step=""+this.step,i.min=""+this.min,i.max=""+this.max,i.value=""+t,t&&this.setProgress(t);const s=""+this.step,n=s.indexOf(".");this.decimals=-1===n?0:s.length-n-1,this.container.append(this.filled,i)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=(0,s.Z)(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=(0,n.Z)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const i=this.vertical?this.rect.height:this.rect.width,s=(0,n.Z)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,i);let a=this.min+s/i*(this.max-this.min);return a-this.min<(this.max-this.min)/2&&(a-=this.step/10),a=+a.toFixed(this.decimals),a=(0,n.Z)(a,this.min,this.max),this.setProgress(a),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(a),a}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}},1405:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(8497),n=i(9674),a=i(5432),o=i(3512),r=i(5975),d=i(3035);let l=0;function c(e,t=(()=>Promise.resolve()),i=null,c=!1,h=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");const u=document.createElement("div");let f;u.classList.add("c-ripple"),e.classList.contains("rp-square")&&u.classList.add("is-square"),e[c?"prepend":"append"](u);const p=(e,s)=>{const o=Date.now(),r=document.createElement("div"),c=l++,h=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s",""),p=f=()=>{const e=Date.now()-o,t=()=>{n.Z.mutate((()=>{r.remove()})),null==i||i(c)};if(er.classList.add("hiding")),Math.max(i-h/2,0)),setTimeout(t,i)}else r.classList.add("hiding"),setTimeout(t,h/2);a.Z||(window.removeEventListener("contextmenu",f),window.removeEventListener("mousemove",f)),f=null,g=!1};null==t||t(c),(0,d.T2)((()=>{if(p!==f)return;const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const i=e-t.left,n=s-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(i-t.width/2)+t.width/2,2)),o=i-a/2,d=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=d+"px",u.append(r)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==u)&&(h===e||!(0,r.Z)(t.target,h));let g=!1;if(a.Z){const e=()=>{null==f||f()};h.addEventListener("touchstart",(t=>{if(!o.Z.settings.animationsEnabled)return;if(t.touches.length>1||g||m(t))return;g=!0;const{clientX:i,clientY:s}=t.touches[0];p(i,s),h.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),h.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else h.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===h.dataset.ripple||m(e))return;if(g)return void(g=!1);const{clientX:t,clientY:i}=e;p(t,i),window.addEventListener("mouseup",f,{once:!0,passive:!0}),window.addEventListener("contextmenu",f,{once:!0,passive:!0})}),{passive:!0})}},7479:(e,t,i)=>{"use strict";i.d(t,{De:()=>g,ZC:()=>v,ZP:()=>p,tG:()=>m});var s=i(9807),n=i(1218),a=i(1405),o=i(5133),r=i(2325),d=i(5565),l=i(130),c=i(2738),h=i(4494),u=i(4531);const f=(e,t)=>{!0===t||("string"==typeof t?(0,l.Z)(e,t):e.append(t))};class p{constructor(e={}){this.freezed=!1,e.checkboxFieldOptions&&(e.checkboxField=new s.Z(Object.assign({listenerSetter:e.listenerSetter},e.checkboxFieldOptions)));const t=e.asLink?"a":e.radioField||e.checkboxField?"label":"div";if(this.container=document.createElement(t),this.container.classList.add("row","no-subtitle"),e.noWrap&&this.container.classList.add("no-wrap"),e.subtitle){const t=this.subtitle;if(f(t,e.subtitle),e.noWrap&&t.classList.add("no-wrap"),e.subtitleRight){this.container.append(this.subtitleRow=this.createRow()),this.subtitleRow.classList.add("row-subtitle-row");const i=this.subtitleRight=document.createElement("div");i.classList.add("row-subtitle","row-subtitle-right"),f(i,e.subtitleRight),this.subtitleRow.append(t,i)}}else e.subtitleLangKey&&this.subtitle.append((0,r.ag)(e.subtitleLangKey,e.subtitleLangArgs));let i=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),i=!0),e.checkboxField){this.checkboxField=e.checkboxField;const t=e.checkboxField.label.classList.contains("checkbox-field-toggle");if(t?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(i=!0,this.container.append(this.checkboxField.label)),e.withCheckboxSubtitle&&!t){const t=()=>{(0,d.Z)(this.subtitle,(0,r.ag)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))};e.listenerSetter?e.listenerSetter.add(this.checkboxField.input)("change",t):this.checkboxField.input.addEventListener("change",t)}}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;const i=e.titleRight||e.titleRightSecondary;if(i?(this.container.append(t=this.titleRow=this.createRow()),this.titleRow.classList.add("row-title-row")):t=this.container,this.title=this.createTitle(),e.noWrap&&this.title.classList.add("no-wrap"),e.title?f(this.title,e.title):e.titleLangKey&&this.title.append((0,r.ag)(e.titleLangKey)),t.append(this.title),i){const s=this.titleRight=document.createElement("div");s.classList.add("row-title","row-title-right"),e.titleRightSecondary&&s.classList.add("row-title-right-secondary"),f(s,i),t.append(s)}}e.icon&&(i=!0,this.container.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),i&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&(0,c.fc)(this.container,(t=>{this.freezed||e.clickable(t)}),{listenerSetter:e.listenerSetter}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||(0,a.Z)(this.container,void 0,void 0,!0)),(e.buttonRight||e.buttonRightLangKey)&&(this.buttonRight=e.buttonRight instanceof HTMLElement?e.buttonRight:(0,h.Z)("btn-primary btn-color-primary",{text:e.buttonRightLangKey}),this.container.append(this.buttonRight)),e.contextMenu&&(0,u.Z)(Object.assign(Object.assign({},e.contextMenu),{listenTo:this.container,listenerSetter:e.listenerSetter}))}get subtitle(){var e;return null!==(e=this._subtitle)&&void 0!==e?e:this._subtitle=this.createSubtitle()}get midtitle(){var e;return null!==(e=this._midtitle)&&void 0!==e?e:this._midtitle=this.createMidtitle()}createRow(){const e=document.createElement("div");return e.classList.add("row-row"),e}createTitle(){const e=document.createElement("div");return e.classList.add("row-title"),e.setAttribute("dir","auto"),e}createSubtitle(){const e=document.createElement("div");return e.classList.add("row-subtitle"),e.setAttribute("dir","auto"),this.title?this.title.after(e):this.container.prepend(e),this.container.classList.remove("no-subtitle"),e}createMidtitle(){const e=document.createElement("div");return e.classList.add("row-midtitle"),this.subtitle.parentElement.insertBefore(e,this.subtitle),e}createMedia(e){const t=document.createElement("div");return this.applyMediaElement(t,e)}applyMediaElement(e,t){return this.container.classList.add("row-with-padding"),this.media=e,e.classList.add("row-media"),t&&e.classList.add("row-media-"+t),this.container.append(e),e}disableWithPromise(e){this.container.classList.add("is-disabled"),e.finally((()=>{this.container.classList.remove("is-disabled")}))}}const m=e=>new p({checkboxField:e,listenerSetter:e.listenerSetter}),g=(e,t)=>(0,o.Z)(e.map((e=>({container:e.container,input:e.radioField.input}))),t),v=(e,t)=>{const i="name-"+(8388607*Math.random()|0);let s;const a=e.map((({langPackKey:e,value:t,checked:a})=>{const o=new p({radioField:new n.Z({langKey:e,name:i,value:""+t})});return a&&(s=o.radioField),o})),o=g(a,t);return s&&(s.checked=!0),o}},8805:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>c,v7:()=>h});var s=i(5432),n=i(5003),a=i(4789),o=i(8594),r=i(3910);const d=i(4762).IS_ANDROID?200:24;class l{constructor(e,t="",i=document.createElement("div")){this.el=e,this.container=i,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.setTimeout((()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e))),e.append(this.container))}addScrollListener(){this.addedScrollListener||(this.addedScrollListener=!0,this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}))}removeScrollListener(){this.addedScrollListener&&(this.addedScrollListener=!1,this.container.removeEventListener("scroll",this.onScroll,{capture:!0}))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.addScrollListener(),this.removeHeavyAnimationListener=(0,o.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.cancelMeasure(),this.needCheckAfterAnimation=!0)}),(()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.removeScrollListener(),this.removeHeavyAnimationListener(),this.removeHeavyAnimationListener=void 0)}destroy(){this.removeListeners(),this.onAdditionalScroll=void 0,this.onScrolledTop=void 0,this.onScrolledBottom=void 0}append(e){this.container.append(e)}scrollIntoViewNew(e){return(0,a.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(clearTimeout(this.onScrollMeasure),this.onScrollMeasure=0)}}class c extends l{constructor(e,t="",i=300,s){super(e,t),this.onScrollOffset=i,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,i=this.lastScrollPosition;this.onScrolledTop&&i<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-i<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}attachBorderListeners(e=this.container){const t=this.onAdditionalScroll;this.onAdditionalScroll=()=>{null==t||t(),e.classList.toggle("scrolled-top",!this.scrollTop),e.classList.toggle("scrolled-bottom",this.isScrolledDown)},e.classList.add("scrolled-top","scrolled-bottom","scrollable-y-bordered")}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}setScrollTopSilently(e){this.lastScrollPosition=e,this.ignoreNextScrollEvent(),this.scrollTop=e}ignoreNextScrollEvent(){this.removeHeavyAnimationListener&&(this.removeScrollListener(),this.container.addEventListener("scroll",(e=>{(0,r.Z)(e),this.addScrollListener()}),{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class h extends l{constructor(e,t="",i=300,n=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=i,this.splitCount=n,this.container=a,this.container.classList.add("scrollable-x"),!s.Z){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,(0,r.Z)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},5029:(e,t,i)=>{"use strict";i.d(t,{R:()=>r,Z:()=>o});var s=i(2325),n=i(36);const a="sidebar-left-section";class o{constructor(e={}){var t;const i=this.container=document.createElement("div");i.classList.add(a+"-container");const o=this.innerContainer=document.createElement("div");if(o.classList.add(a),e.noShadow&&o.classList.add("no-shadow"),e.fakeGradientDelimiter)o.append((0,n.G)()),o.classList.add("with-fake-delimiter");else if(e.noDelimiter)o.classList.add("no-delimiter");else{const e=document.createElement("hr");o.append(e)}const r=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2",a+"-name"),(0,s.XZ)({element:t,key:e.name,args:e.nameArgs}),r.append(t)}i.append(o);const d=null!==(t=e.caption)&&void 0!==t?t:e.captionOld;if(d){const t=this.caption=this.generateContentElement();t.classList.add(a+"-caption"),e.captionOld||i.append(t),!0!==d&&(0,s.XZ)({element:t,key:d,args:e.captionArgs})}}generateContentElement(){const e=document.createElement("div");return e.classList.add(a+"-content"),this.innerContainer.append(e),e}}const r=(e,t,i)=>{const s=new o({name:t,caption:i});return e.append(s.container),s.content}},4039:(e,t,i)=>{"use strict";i.d(t,{ir:()=>Xt,ZP:()=>ii});var s=i(9355),n=i(3512),a=i(5884),o=i(9331),r=i(8805),d=i(3607),l=i(3552),c=i(426),h=i(8130),u=i(503),f=i(187),p=i(2325),m=i(8119),g=i(3061),v=i(2738),b=i(5029);class y extends l._{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(e,t=!1){this.isGeoChat=t,this.peerIds=e,this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new f.Z((e=>{this.uploadAvatar=e}));const i=new b.Z({}),n=document.createElement("div");n.classList.add("input-wrapper"),this.groupNameInputField=new u.ZP({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new u.ZP({label:"ChatLocation",name:"location",canBeEdited:!1}),n.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.listenerSetter.add(this.groupNameInputField.input)("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=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.groupNameInputField.value;let t;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;t=this.managers.appChatsManager.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),this.peerIds.length&&this.managers.appChatsManager.inviteToChannel(e,this.peerIds),e)))}else this.nextBtn.disabled=!0,t=this.managers.appChatsManager.createChat(e,this.peerIds.map((e=>e.toUserId()))).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),e)));t&&t.then((e=>{this.close(),s.Z.setInnerPeer({peerId:e.toPeerId(!0)})}))}),{listenerSetter:this.listenerSetter});const a=new b.Z({name:"Members",nameArgs:[this.peerIds.length]}),o=this.list=h.default.createChatList({new:!0});return a.content.append(o),i.content.append(this.avatarEdit.container,n),this.content.append(this.nextBtn),this.scrollable.append(i.container,a.container),t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(p.ZP.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),Promise.all(this.peerIds.map((e=>{return t=this,i=void 0,n=function*(){const{dom:t}=h.default.addDialogNew({peerId:e,container:this.list,rippleEnabled:!1,avatarSize:"abitbigger"});t.lastMessageSpan.append((0,g.Z)(yield this.managers.appUsersManager.getUser(e)))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})))}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}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 w,S=i(6360),C=i(632),E=i(410),L=i(5322),I=i(4494),M=i(6024),P=i(7479),Z=i(5565),k=i(144);function T(e){const t=[],i={users:[],chats:[]},s={users:[],chats:[]};return e.forEach((e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueAllowUsers":i.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueDisallowUsers":s.users.push(...e.users)}})),{type:t[0],disallowPeers:s,allowPeers:i}}!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(w||(w={}));const x=w;var A=i(1218),_=i(5670);class F{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],i=this.radioSection.caption;t?t instanceof HTMLElement?(0,Z.Z)(i,t):(0,p.$d)(i,t):i.innerHTML="",i.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===x.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===x.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse();const t=e.managers;this.radioSection=new b.Z({name:e.title,caption:!0}),this.radioRows=new Map;let i=[{type:x.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:x.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:x.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(i=i.filter((t=>!e.skipTypes.includes(t.type))));const s=(0,k.a)();i.forEach((({type:e,langKey:t})=>{const i=new P.ZP({radioField:new A.Z({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)}));const n=(0,P.De)([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(n),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=(0,b.R)(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach((i=>{i.row=new P.ZP(i),i.row.container.addEventListener("click",(()=>{a.then((()=>{const t=this.peerIds[i.key];e.tab.slider.createTab(_.Z).open({type:"privacy",skippable:!0,title:i.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),i.row.subtitle.innerHTML="",i.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})}))})),t.append(i.row.container)}))}const a=t.appPrivacyManager.getPrivacy(e.inputKey).then((i=>{const s=T(i);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach((e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map((e=>e.toPeerId()))),t.push(...i.chats.map((e=>e.toPeerId(!0)))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))}))),e.tab.eventListener.addEventListener("destroy",(()=>{return i=this,s=void 0,a=function*(){const i=[];switch(this.type){case x.Everybody:i.push({_:"inputPrivacyValueAllowAll"});break;case x.Contacts:i.push({_:"inputPrivacyValueAllowContacts"});break;case x.Nobody:i.push({_:"inputPrivacyValueDisallowAll"})}if(this.exceptions){const e=[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]];for(const[s,n,a]of e){if(this.exceptions.get(s).row.container.classList.contains("hide"))continue;const e=this.peerIds[s];if(e){const s=this.splitPeersByType(e);s.chats.length&&i.push({_:n,chats:s.chats}),s.users.length&&i.push({_:a,users:yield Promise.all(s.users.map((e=>t.appUsersManager.getUserInput(e))))})}}}t.appPrivacyManager.setPrivacy(e.inputKey,i)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}),{once:!0})}))}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach((e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)})),t}generateStr(e){return e.users.length||e.chats.length?(0,p.v_)([e.users.length?(0,p.ag)("Users",[e.users.length]):null,e.chats.length?(0,p.ag)("Chats",[e.chats.length]):null].filter(Boolean),!1):[(0,p.ag)("PrivacySettingsController.AddUsers")]}}var D=i(3532);class R extends M.h{init(){return e=this,t=void 0,s=function*(){this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e="+"+(yield this.managers.appUsersManager.getSelf()).phone,t=document.createElement("div");t.append((0,p.ag)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),(0,p.ag)("PrivacyPhoneInfo4"),document.createElement("br"),(0,D.Z)({mePath:e}));const i=new F({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[t,t,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{n.setRadio(x.Everybody),n.radioSection.container.classList.toggle("hide",e!==x.Nobody)},managers:this.managers}),s="PrivacyPhoneInfo3",n=new F({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:[s,s,""],noExceptions:!0,skipTypes:[x.Nobody],managers:this.managers});this.scrollable.container.insertBefore(n.radioSection.container,i.radioSection.container.nextSibling)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var B=i(8127),N=i(5772),O=i(279);class U extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new b.Z({captionOld:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({emoji:"🥳",div:t,width:160,height:160}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});(0,v.fc)(n,(e=>{this.close()})),this.slider.sliceTabsUntilTab(xt,this),s.append(n),i.append(s),this.scrollable.container.append(e.container)}}var H=i(4489),z=i(4762);function j(e){return!z.IS_MOBILE_SAFARI||!e}var G=i(1656);class V extends l._{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 b.Z({captionOld:!0,noDelimiter:!0});(0,p.$d)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"📬"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.codeInputField=new H.Z({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),this.managers.passwordManager.confirmPasswordEmail(""+e).then((e=>{r()})).catch((e=>{switch(e.type){case"CODE_INVALID":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,p.ag)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,p.ag)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)}))}}),a=(0,I.Z)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),r=()=>{this.slider.createTab(U).open()},d=e=>{(0,G.Z)([n.input,a,o],e)};(0,v.fc)(a,(e=>{d(!0),this.managers.passwordManager.cancelPasswordEmail().then((e=>{this.slider.sliceTabsUntilTab($,this),this.close()}),(()=>{d(!1)}))})),(0,v.fc)(o,(e=>{d(!0);const t=(0,O.y)(o);this.managers.passwordManager.resendPasswordEmail().then((e=>{t.remove(),d(!1)}))})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.codeInputField.input.focus()}}var K=i(3910),W=i(1171);class $ extends l._{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"💌"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.inputField=new u.ZP({name:"recovery-email",label:"RecoveryEmail",plainText:!0});n.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),d()})),n.input.addEventListener("input",(e=>{n.input.classList.remove("error")}));const a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=()=>{this.slider.createTab(U).open()},d=()=>{const e=n.value.trim(),t=(0,W.Z)(e);if(!t||t[0].length!==e.length)return void n.input.classList.add("error");l(!0);const i=(0,O.y)(a);this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then((e=>{r()}),(t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const i=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],s=this.slider.createTab(V);s.state=this.state,s.email=e,s.length=i,s.open()}else console.log("password set error",t);l(!1),i.remove()}))};(0,v.fc)(a,d);const l=e=>{e?(a.setAttribute("disabled","true"),o.setAttribute("disabled","true")):(a.removeAttribute("disabled"),o.removeAttribute("disabled"))};(0,v.fc)(o,(e=>{new B.Z("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{l(!0),(0,O.y)(o),this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then((()=>{r()}),(e=>{l(!1)}))},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.inputField.input.focus()}}var q=i(130),Q=i(8115),Y=i(4425),J=i(6830),X=i(3083),ee=i(2796);class te extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new b.Z({noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"💡"}),e.content.append(t);const i=document.createElement("div");i.classList.add("input-wrapper");const s=this.inputField=new u.ZP({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});s.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),s.value?r():d()}));const n=(e,t)=>{e&&(0,K.Z)(e);const i=t?s.value:void 0;if(i&&this.newPassword===i)return void(0,ee.Am)(p.ZP.format("PasswordAsHintError",!0));const n=this.slider.createTab($);n.state=this.state,n.plainPassword=this.plainPassword,n.newPassword=this.newPassword,n.hint=i,n.open()},a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=e=>n(e,!0),d=e=>n(e,!1);(0,v.fc)(a,r),(0,v.fc)(o,d),i.append(s.container,a,o),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class ie extends l._{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 b.Z({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const i=this.passwordInputField=new J.Z({name:"re-enter-password",label:"PleaseReEnterPassword"}),s=new X.Z(i,157),n=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"});t.append(i.container,n),e.content.append(s.container,t),this.scrollable.container.append(e.container),i.input.addEventListener("keypress",(e=>{if(i.input.classList.contains("error")&&i.setState(u.I1.Neutral),"Enter"===e.key)return o()}));const a=()=>this.newPassword===i.value||(i.setError(),!1),o=e=>{if(e&&(0,K.Z)(e),!a())return;const t=this.slider.createTab(te);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return(0,v.fc)(n,o),s.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class se extends l._{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 b.Z({noDelimiter:!0}),i=document.createElement("div");i.classList.add("input-wrapper");const s=this.passwordInputField=new J.Z({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?(0,Q.Z)(this.state.hint):void 0}),n=new Y.Z(s,157),a=(0,I.Z)("btn-primary btn-color-primary"),o=new p.ZP.IntlElement({key:"Continue"});a.append(o.element),i.append(s.container,a),t.content.append(n.container,i),this.scrollable.container.append(t.container),s.input.addEventListener("keypress",(e=>{if(s.input.classList.contains("error")&&(s.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()}));const r=()=>!!s.value.length||(s.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&(0,K.Z)(e),!r())return;const t=this.slider.createTab(ie);t.state=this.state,t.newPassword=s.value,t.plainPassword=this.plainPassword,t.open()};else{let e;const t=()=>(e||(e=window.setInterval(t,1e4)),this.managers.passwordManager.getState().then((e=>{this.state=e,this.state.hint?(0,q.Z)(s.label,(0,Q.Z)(this.state.hint)):(0,Z.Z)(s.label,(0,p.ag)("LoginPassword"))})));d=i=>{if(!r())return void(0,K.Z)(i);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const d=(0,O.y)(a),l=s.value;this.managers.passwordManager.check(s.value,this.state).then((t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=this.slider.createTab(ne);t.state=this.state,t.plainPassword=l,t.open(),this.slider.removeTabFromHistory(this)}}),(e=>{a.removeAttribute("disabled"),s.input.classList.add("error"),e.type,o.key="PASSWORD_HASH_INVALID",o.update(),d.remove(),s.select(),t()}))},t()}return(0,v.fc)(a,d),n.load()}onOpenAfterTimeout(){j(this.isFirst)&&this.passwordInputField.input.focus()}}class ne extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:168,height:168,emoji:"🔐"}),e.content.append(t);const i=e.generateContentElement();if(this.state.pFlags.has_password){(0,p.$d)(e.caption,"TwoStepAuth.GenericHelp");const t=(0,I.Z)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=(0,I.Z)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=(0,I.Z)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});(0,v.fc)(t,(()=>{const e=this.slider.createTab(se);e.state=this.state,e.plainPassword=this.plainPassword,e.open()})),(0,v.fc)(s,(()=>{new B.Z("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{this.managers.passwordManager.updateSettings({currentPassword:this.plainPassword}).then((()=>{this.slider.sliceTabsUntilTab(xt,this),this.close()}))},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()})),(0,v.fc)(n,(()=>{const e=this.slider.createTab($);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{(0,p.$d)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),(0,v.fc)(s,(e=>{const t=this.slider.createTab(se);t.state=this.state,t.open()}))}this.scrollable.container.append(e.container)}}class ae extends M.h{init(){this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new F({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,managers:this.managers})}}class oe extends M.h{init(){this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new F({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class re extends M.h{init(){this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new F({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class de extends M.h{init(){this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new F({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class le extends M.h{init(){this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new F({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers});{const e="PrivacySettingsController.P2p.Desc";new F({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}}var ce=i(3003),he=i(8497),ue=i(4064),fe=i(6976),pe=i(1483),me=i(3416);class ge extends M.h{init(){this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new P.ZP({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))});return t.container.dataset.hash=""+e.hash,t.midtitle.textContent=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t},t=this.authorizations.slice();{const n=new b.Z({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=(0,ue.Z)(t,(e=>e.pFlags.current)),o=e(a);if(n.content.append(o.container),t.length){const e=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});(0,v.fc)(e,(t=>{new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=(0,G.Z)([e],!0);this.managers.apiManager.invokeApi("auth.resetAuthorizations").then((t=>{e.remove(),i.container.remove()}),s).finally((()=>{t()}))}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()})),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const i=new b.Z({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach((t=>{i.content.append(e(t).container)})),this.scrollable.append(i.container);const s=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&&(0,ee.Am)(p.ZP.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{this.managers.apiManager.invokeApi("account.resetAuthorization",{hash:e}).then((e=>{e&&n.remove()}),s)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=(0,ce.b)({buttons:[{icon:"stop",text:"Terminate",onClick:a}]});o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,fe.E)(this.scrollable.container,(e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,pe.Z)(e,o),me.Z.openBtnMenu(o))})),(0,v.fc)(this.scrollable.container,(e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()}))}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var ve=i(2995),be=i(4668),ye=i(8210),we=i(5102);class Se extends l._{init(){this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new b.Z({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(t),(0,v.fc)(t,(e=>{new ve.Z({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{this.managers.appUsersManager.toggleBlock(e,!0)}})}),{listenerSetter:this.listenerSetter});const i=h.default.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(i);const s=(e,t)=>{return s=this,n=void 0,o=function*(){const{dom:s}=h.default.addDialogNew({peerId:e,container:i,rippleEnabled:!0,avatarSize:"abitbigger",append:t}),n=yield this.managers.appUsersManager.getUser(e.toUserId());if(!n)return;const a=(0,we.Z)(n)[0];n.pFlags.bot?s.lastMessageSpan.append("@"+a):n.phone?s.lastMessageSpan.innerHTML=(0,ye.Z)(n.phone):s.lastMessageSpan.append(a?"@"+a:(0,g.Z)(n))},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o};for(const e of this.peerIds)s(e,!0);let a;const o=this.menuElement=(0,ce.b)({buttons:[{icon:"lockoff",text:"Unblock",onClick:()=>{const e=a.dataset.peerId.toPeerId();this.managers.appUsersManager.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]});o.id="blocked-users-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,fe.E)(this.scrollable.container,(e=>{a=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG),a&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,pe.Z)(e,o),me.Z.openBtnMenu(o))}),this.listenerSetter),this.listenerSetter.add(n.Z)("peer_block",(e=>{const{peerId:t,blocked:n}=e,a=i.querySelector(`[data-peer-id="${t}"]`);n?a||s(t,!1):a&&a.remove()}));let r=!1;this.scrollable.onScrolledBottom=()=>{r||(r=!0,this.managers.appUsersManager.getBlocked(i.childElementCount,50).then((e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||i.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 Ce=i(9807);function Ee(e){return"input"+(e[0].toUpperCase()+e.slice(1))}var Le=i(5592),Ie=i(319);class Me extends M.h{init(){this.container.classList.add("privacy-tab","privacy-voices"),this.setTitle("PrivacyVoiceMessages");const e="PrivacyVoiceMessagesInfo";new F({tab:this,title:"PrivacyVoiceMessagesTitle",inputKey:"inputPrivacyKeyVoiceMessages",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class Pe extends M.h{static getInitArgs(e){return{appConfig:e.managers.apiManager.getAppConfig(),globalPrivacy:e.managers.appPrivacyManager.getGlobalPrivacySettings(),contentSettings:e.managers.apiManager.invokeApi("account.getContentSettings")}}init(e){this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");const t="Loading";{const e=new b.Z({noDelimiter:!0,caption:"SessionsInfo"});let i;const s=new P.ZP({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(Se);e.peerIds=i,e.open()},listenerSetter:this.listenerSetter});let a;s.freezed=!0;const o={icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:t,clickable:e=>{let t;a.pFlags.has_password?t=this.slider.createTab(se):a.email_unconfirmed_pattern?(t=this.slider.createTab(V),t.email=a.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,this.managers.passwordManager.resendPasswordEmail()):t=this.slider.createTab(ne),t.state=a,t.open()},listenerSetter:this.listenerSetter},r=new P.ZP(o);r.freezed=!0;const d=this.activeSessionsRow=new P.ZP({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.updateActiveSessions()}),{once:!0}),e.open()},listenerSetter:this.listenerSetter});d.freezed=!0,e.content.append(s.container,r.container,d.container),this.scrollable.append(e.container);const l=e=>{e?(0,Z.Z)(s.subtitle,(0,p.ag)("PrivacySettingsController.UserCount",[e])):(0,Z.Z)(s.subtitle,(0,p.ag)("BlockedEmpty",[e]))};this.listenerSetter.add(n.Z)("peer_block",(()=>{c()}));const c=()=>{this.managers.appUsersManager.getBlocked().then((e=>{s.freezed=!1,l(e.count),i=e.peerIds}))};c(),this.managers.passwordManager.getState().then((e=>{a=e,(0,Z.Z)(r.subtitle,(0,p.ag)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),r.freezed=!1})),this.updateActiveSessions()}{const e=new b.Z({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});e.content.classList.add("privacy-navigation-container");const i={},s=i.inputPrivacyKeyPhoneNumber=new P.ZP({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(R).open()},listenerSetter:this.listenerSetter}),a=i.inputPrivacyKeyStatusTimestamp=new P.ZP({titleLangKey:"LastSeenTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(ae).open()},listenerSetter:this.listenerSetter}),o=i.inputPrivacyKeyProfilePhoto=new P.ZP({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(oe).open()},listenerSetter:this.listenerSetter}),r=i.inputPrivacyKeyPhoneCall=new P.ZP({titleLangKey:"WhoCanCallMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(le).open()},listenerSetter:this.listenerSetter}),d=i.inputPrivacyKeyForwards=new P.ZP({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(re).open()},listenerSetter:this.listenerSetter}),l=i.inputPrivacyKeyChatInvite=new P.ZP({titleLangKey:"WhoCanAddMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(de).open()},listenerSetter:this.listenerSetter}),c=i.inputPrivacyKeyVoiceMessages=new P.ZP({titleLangKey:"PrivacyVoiceMessagesTitle",subtitleLangKey:t,clickable:()=>{n.Z.premium?this.slider.createTab(Me).open():(0,ee.bC)({langPackKey:"PrivacyVoiceMessagesPremiumOnly"})},listenerSetter:this.listenerSetter}),h=e=>{const t=i[e];t&&this.managers.appPrivacyManager.getPrivacy(e).then((e=>{const i=T(e),s=i.type===x.Everybody?"PrivacySettingsController.Everbody":i.type===x.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=i.disallowPeers.users.length+i.disallowPeers.chats.length,a=i.allowPeers.users.length+i.allowPeers.chats.length;t.subtitle.innerHTML="";const o=(0,p.ag)(s);t.subtitle.append(o),(n||a)&&t.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)}))};e.content.append(s.container,a.container,o.container,r.container,d.container,l.container,c.container),this.scrollable.append(e.container);for(const e in i)h(e);n.Z.addEventListener("privacy_update",(e=>{h(Ee(e.key._))}))}const i=[];{const t=new b.Z({name:"NewChatsFromNonContacts",caption:"ArchiveAndMuteInfo"}),s=new Ce.Z({text:"ArchiveAndMute"}),a=new P.ZP({checkboxField:s});let o,r;t.content.append(a.container),this.eventListener.addEventListener("destroy",(()=>{if(r=!0,void 0!==o&&o!==s.checked)return this.managers.appPrivacyManager.setGlobalPrivacySettings({_:"globalPrivacySettings",archive_and_mute_new_noncontact_peers:s.checked})}),{once:!0});const d=Promise.all([e.appConfig,e.globalPrivacy]).then((([e,i])=>{if(r)return;const a=i=>{t.container.classList.toggle("hide",!i&&!e.autoarchive_setting_available)};this.listenerSetter.add(n.Z)("premium_toggle",a),a(n.Z.premium),o=!!i.archive_and_mute_new_noncontact_peers,s.setValueSilently(o)}));i.push(d),this.scrollable.append(t.container)}{const t=new b.Z({name:"Privacy.SensitiveContent",caption:"PrivacyAndSecurity.SensitiveDesc"});t.container.classList.add("hide");const s=new Ce.Z({text:"PrivacyAndSecurity.SensitiveText"}),n=new P.ZP({checkboxField:s});let a;t.content.append(n.container),this.eventListener.addEventListener("destroy",(()=>{if(void 0===a)return;const e=n.checkboxField.checked;return e!==a?this.managers.apiManager.invokeApi("account.setContentSettings",{sensitive_enabled:e}):void 0}),{once:!0});const o=e.contentSettings.then((e=>{e.pFlags.sensitive_can_change&&(a=!!e.pFlags.sensitive_enabled,s.setValueSilently(a),t.container.classList.remove("hide"))}));i.push(o),this.scrollable.append(t.container)}{const e=new b.Z({name:"PrivacyPayments",caption:"PrivacyPaymentsClearInfo"}),t=()=>{const e={titleLangKey:"PrivacyPaymentsClearAlertTitle",descriptionLangKey:"PrivacyPaymentsClearAlertText",button:{langKey:"Clear"},checkboxes:[{text:"PrivacyClearShipping",checked:!0},{text:"PrivacyClearPayment",checked:!0}]};(0,Le.Z)(e).then((()=>{const[t,s]=e.checkboxes.map((e=>e.checkboxField.checked)),n=(0,G.Z)([i],!0);this.managers.appPaymentsManager.clearSavedInfo(t,s).then((()=>{(t||s)&&(n(),(0,ee.bC)({langPackKey:t&&s?"PrivacyPaymentsPaymentShippingCleared":t?"PrivacyPaymentsShippingInfoCleared":"PrivacyPaymentsPaymentInfoCleared"}))}))}),Ie.Z)},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyPaymentsClear"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}{const e=new b.Z({name:"FilterChats"}),t=()=>{new B.Z("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=(0,G.Z)([i],!0);this.managers.appDraftsManager.clearAllDrafts().then((()=>{e()}))},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}return Promise.all(i)}updateActiveSessions(){this.managers.apiManager.invokeApi("account.getAuthorizations").then((e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,(0,p.$d)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])}))}}var Ze=i(65),ke=i(6740);function Te(e){const t=e.getContext("2d"),i=new Array(4).fill(0),s=t.getImageData(0,0,e.width,e.height).data,n=s.length/4;for(let e=0;e0&&(i=Math.min(100,i+5+.1*(100-i))),s=Math.max(0,.65*s),`hsla(${t}, ${i}%, ${s}%, .4)`}var De=i(8479),Re=i(9674),Be=i(1571),Ne=i(2312),Oe=i(3442),Ue=i(6724),He=i(6714),ze=i(5077),je=i(3228);class Ge{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(Ge.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 u.ZP({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new u.ZP({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=Ge.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",(()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),i=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(i?u.I1.Neutral:u.I1.Error),e="#"+e,this.hexInputField.setValueSilently(e),i&&this.setColor(e,!1,!0)}));const i=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",(()=>{const e=this.rgbInputField.value.match(i);this.rgbInputField.setState(e?u.I1.Neutral:u.I1.Error),e&&this.setColor((0,_e.dI)(+e[1],+e[2],+e[3]),!0,!1)})),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){(0,ze.Z)(this.elements.box,(()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()}),(e=>{this.saturationHandler(e.x,e.y)}),(()=>{this.onGrabEnd()}))}attachHueListeners(){(0,ze.Z)(this.elements.hue,(()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()}),(e=>{this.hueHandler(e.x)}),(()=>{this.onGrabEnd()}))}setColor(e,t=!0,i=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=(0,_e.cw)(e);else{const t=e.match(/[.?\d]+/g);e=(0,_e.dI)(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const s=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+s,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,i)}getCurrentColor(){const e=(0,_e.Y6)(this.hue,this.saturation,this.lightness,this.alpha),t=(0,_e.t1)(e),i=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:i,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const i=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",i.hex),e&&(this.hexInputField.setValueSilently(i.hex),this.hexInputField.setState(u.I1.Neutral)),t&&(this.rgbInputField.setValueSilently(i.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(u.I1.Neutral)),this.onChange&&this.onChange(i)}hueHandler(e,t=!0){const i=(0,je.Z)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*i);const s=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*i+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",s),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",s),t&&this.updatePicker()}saturationHandler(e,t,i=!0){const s=this.boxRect.width,n=this.boxRect.height,a=(0,je.Z)(e-this.boxRect.left,0,s)/s*100,o=(0,je.Z)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const d=(0,je.Z)(a,0,100),l=100-d/2,c=100-(0,je.Z)(o,0,100),h=(0,je.Z)(c/100*l,0,100);this.saturation=d,this.lightness=h,i&&this.updatePicker()}}Ge.BASE_CLASS="color-picker";class Ve extends l._{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=(0,_e.Pi)(e),i=this.theme.background,a=Fe(t);i.id="2",i.intensity=0,i.slug="",i.color=e.toLowerCase(),i.highlightningColor=a,this.managers.appStateManager.pushToState("settings",n.Z.settings),s.Z.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=He.Z.getTheme();const e=new b.Z({});this.colorPicker=new Ge,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new b.Z({}),i=this.grid=document.createElement("div");i.classList.add("grid"),["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach((e=>{const t=document.createElement("div");t.classList.add("grid-item"),t.dataset.color=e.toLowerCase();const s=document.createElement("div");s.classList.add("grid-item-media"),s.style.backgroundColor=e,t.append(s),i.append(t)})),(0,v.fc)(i,(e=>{const t=(0,he.Z)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const i=t.dataset.color;i&&this.applyColor(i)}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container),this.applyColor=(0,Ue.Z)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,i=t.color?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==i&&(e&&e.classList.remove("active"),i&&i.classList.add("active"))}onOpen(){setTimeout((()=>{const e=this.theme.background,t=(e.color||"").split(",")[0],i=!!t&&!e.slug;i&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(t||"#cccccc"),i||(this.colorPicker.onChange=this.onColorChange)}),0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}var Ke=i(7030),We=i(236),$e=i(7814),qe=i(9405),Qe=i(9492),Ye=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Je extends l._{constructor(){super(...arguments),this.tempId=0,this.clicked=new Set,this.wallPapersByElement=new Map,this.elementsByKey=new Map,this.onUploadClick=()=>{(function(e){const t=document.createElement("input");t.type="file",t.style.display="none",t.accept=e,document.body.append(t);const i=new Promise(((e,i)=>{t.addEventListener("change",(t=>{const s=t.target.files[0];s?e(s):i("NO_FILE_SELECTED")}),{once:!0})})).finally((()=>{t.remove()}));return t.click(),i})("image/x-png,image/png,image/jpeg").then((e=>Ye(this,void 0,void 0,(function*(){if(e.name.endsWith(".png")){const t=document.createElement("img"),i=URL.createObjectURL(e);yield(0,ke.cj)(t,i,!1);const s="image/jpeg",{blob:n}=yield(0,$e.Z)({media:t,size:new qe.c(t.naturalWidth,t.naturalHeight),mimeType:s});e=new File([n],e.name.replace(/\.png$/,".jpg"),{type:s})}const t=yield this.managers.appDocsManager.prepareWallPaperUpload(e),i=this.managers.appDocsManager.uploadWallPaper(t.id),s=Ne.Z.getNewDeferredForUpload(e.name,i),n=(0,Ae.Z)();n.addNotifyListener=s.addNotifyListener,n.cancel=s.cancel,s.then((e=>{this.clicked.delete(a),this.elementsByKey.delete(a),this.wallPapersByElement.set(r,e);const t=this.getWallPaperKey(e);this.elementsByKey.set(t,r),this.setBackgroundDocument(e).then(n.resolve,n.reject)}),n.reject);const a=this.getWallPaperKey(t);n.catch((()=>{r.remove()}));const o=new Oe.Z({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),r=this.addWallPaper(t,!1);this.clicked.add(a),o.attach(r,!1,n)}))))},this.onResetClick=()=>{const e=We.h.settings.themes.find((e=>e.name===this.theme.name));e&&(++this.tempId,this.theme.background=(0,De.Z)(e.background),this.managers.appStateManager.pushToState("settings",n.Z.settings),s.Z.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=(0,he.Z)(e.target,"grid-item");if(!t)return;const i=this.wallPapersByElement.get(t);if("wallPaperNoFile"===i._)return void this.setBackgroundDocument(i);const s=this.getWallPaperKey(i);if(this.clicked.has(s))return;this.clicked.add(s);const n=i.document,a=new Oe.Z({cancelable:!0,tryAgainOnFail:!1}),o=()=>Ye(this,void 0,void 0,(function*(){const e=this.setBackgroundDocument(i);(yield this.managers.thumbsStorage.getCacheContext(n)).url&&!this.theme.background.blur||a.attach(t,!0,e)}));a.construct(),(0,v.fc)(t,(e=>{a.preloader.parentElement?(a.onClick(e),a.detach()):o()}),{listenerSetter:this.listenerSetter}),o()},this.saveToCache=(e,t)=>{fetch(t).then((t=>{s.Z.cacheStorage.save("backgrounds/"+e,t)}))},this.setBackgroundDocument=e=>{const t=++this.tempId,i=()=>t===this.tempId,a=e.document,o=(0,Ae.Z)();let r;return a?(r=Ne.Z.downloadMediaURL({media:a,queueId:s.Z.chat.bubbles?s.Z.chat.bubbles.lazyLoadQueue.queueId:0}),o.addNotifyListener=r.addNotifyListener,o.cancel=r.cancel):r=Promise.resolve(),r.then((()=>Ye(this,void 0,void 0,(function*(){if(!i())return void o.resolve();const t=this.theme.background,r=a=>{let r;const d=this.getColorsFromWallPaper(e);if(a&&!d)r=function(e){const t=document.createElement("img");return(0,ke.cj)(t,e,!1).then((()=>function(e,t,i){const s=document.createElement("canvas"),n=t/i;return 1===n?(s.width=50,s.height=s.width/n):n>1?(s.height=50,s.width=s.height/n):s.width=s.height=50,s.getContext("2d").drawImage(e,0,0,t,i,0,0,s.width,s.height),Te(s)}(t,t.naturalWidth,t.naturalHeight)))}(a);else{const{canvas:e}=Be.Z.create(d);r=Promise.resolve(Te(e))}r.then((r=>{var l,c,h;if(!i())return void o.resolve();const u=Fe(Array.from(r)),f=null!==(l=e.slug)&&void 0!==l?l:"";t.id=e.id,t.intensity=null!==(h=null===(c=e.settings)||void 0===c?void 0:c.intensity)&&void 0!==h?h:0,t.color=d,t.slug=f,t.highlightningColor=u,this.managers.appStateManager.pushToState("settings",n.Z.settings),f&&this.saveToCache(f,a),s.Z.applyCurrentTheme(f,a,!0).then(o.resolve)}))};if(!a)return void r();const d=yield this.managers.thumbsStorage.getCacheContext(a);t.blur?setTimeout((()=>{const{canvas:e,promise:t}=(0,xe.Z)(d.url,12,4);t.then((()=>{i()?r(e.toDataURL()):o.resolve()}))}),200):r(d.url)})))),o},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));e!==t&&(e&&e.classList.remove("active"),t&&t.classList.add("active"))}}get theme(){return He.Z.getTheme()}init(){this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground");{const e=(0,b.R)(this.scrollable),i=(0,I.Z)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),s=(0,I.Z)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),a=(0,I.Z)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});(0,v.fc)(i,this.onUploadClick,{listenerSetter:this.listenerSetter}),(0,v.fc)(s,(()=>{this.slider.createTab(Ve).open()}),{listenerSetter:this.listenerSetter}),(0,v.fc)(a,this.onResetClick,{listenerSetter:this.listenerSetter});const o=this.blurCheckboxField=new Ce.Z({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur});this.listenerSetter.add(o.input)("change",(()=>Ye(this,void 0,void 0,(function*(){this.theme.background.blur=o.input.checked,yield this.managers.appStateManager.pushToState("settings",n.Z.settings),setTimeout((()=>{const e=t.querySelector(".active");if(!e)return;const i=this.wallPapersByElement.get(e);i.pFlags.pattern||"wallPaperNoFile"===i._||this.setBackgroundDocument(i)}),100)})))),e.append(i,s,a,(0,P.tG)(o).container)}n.Z.addEventListener("background_change",this.setActive),this.managers.appDocsManager.getWallPapers().then((e=>{e.forEach((e=>{this.addWallPaper(e)}))}));const e=(0,b.R)(this.scrollable),t=this.grid=document.createElement("div");t.classList.add("grid"),(0,v.fc)(t,this.onGridClick,{listenerSetter:this.listenerSetter}),e.append(t)}getColorsFromWallPaper(e){return e.settings?[e.settings.background_color,e.settings.second_background_color,e.settings.third_background_color,e.settings.fourth_background_color].filter(Boolean).map((e=>"#"+e.toString(16))).join(","):""}getWallPaperKey(e){return""+e.id}getWallPaperKeyFromTheme(e){return""+e.background.id}addWallPaper(e,t=!0){const i=this.getColorsFromWallPaper(e),s="wallPaper"===e._;if(s&&e.pFlags.pattern&&!i)return;const n=!!e.pFlags.dark,a=s?e.document:void 0,o=document.createElement("div");o.classList.add("grid-item"),o.dataset.id=""+e.id;const r=this.getWallPaperKey(e);this.wallPapersByElement.set(o,e),this.elementsByKey.set(r,o);const d=document.createElement("div");let l,c;if(d.classList.add("grid-item-media"),s?(c=(0,Ke.Z)(a,200,200),l=(0,Qe.Z)({photo:a,message:null,container:d,withoutPreloader:!0,size:c,noFadeIn:e.pFlags.pattern}),e.pFlags.pattern&&d.classList.add("is-pattern"),l.then((({loadPromises:e,images:t})=>Ye(this,void 0,void 0,(function*(){return(yield e.thumb)||e.full,t})))).then((t=>{var i;e.pFlags.pattern&&(n?(t.full.style.display="none",t.thumb&&(t.thumb.style.display="none")):(null===(i=e.settings)||void 0===i?void 0:i.intensity)&&(t.full.style.opacity=""+Math.abs(e.settings.intensity)/100)),Re.Z.mutate((()=>{o.append(d)}))}))):o.append(d),e.settings&&void 0!==e.settings.background_color){const{canvas:t}=Be.Z.create(i);t.classList.add("background-colors-canvas"),n&&s?l.then((({loadPromises:i})=>{i.full.then((()=>Ye(this,void 0,void 0,(function*(){const i=yield this.managers.thumbsStorage.getCacheContext(a,c.type);t.style.webkitMaskImage=`url(${i.url})`,t.style.opacity=""+(e.pFlags.dark?100+e.settings.intensity:e.settings.intensity)/100,d.append(t)}))))})):d.append(t)}return this.getWallPaperKeyFromTheme(this.theme)===r&&o.classList.add("active"),this.grid[t?"append":"prepend"](o),o}}var Xe=i(8938),et=i(2153),tt=i(6787),it=i(6761);var st=i(3731),nt=i(62);class at extends M.Z{init(){return this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([this.managers.appReactionsManager.getQuickReaction(),this.managers.appReactionsManager.getAvailableReactions()]).then((([e,t])=>{t=t.filter((e=>!e.pFlags.inactive));const i=new b.Z,s=t.map((t=>{const i=new A.Z({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),s=new P.ZP({radioField:i,havePadding:!0});return i.main.classList.add("quick-reaction-title"),(0,nt.Z)({row:s,doc:t.static_icon,size:"small"}),t.reaction===e.reaction&&i.setValueSilently(!0),s})),n=(0,P.De)(s,(e=>{this.managers.appReactionsManager.setDefaultReaction({_:"reactionEmoji",emoticon:e})}));i.content.append(n),this.scrollable.append(i.container)}))}}var ot=i(1273);class rt{constructor(e,t,i,s,n,a=!0){const o="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(o);const r=document.createElement("div");r.classList.add(o+"-details");const d=document.createElement("div");d.classList.add(o+"-name"),(0,p.$d)(d,e);const l=this.valueContainer=document.createElement("div");l.classList.add(o+"-value"),a&&(l.innerHTML=""+i),r.append(d,l),this.range=new Ze.Z({step:t,min:s,max:n},i),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(l.innerText=""+e)}}),this.container.append(r,this.range.container)}}class dt extends M.h{init(){this.container.classList.add("general-settings-container"),this.setTitle("General");const e=b.R.bind(null,this.scrollable);{const t=e("Settings"),i=new rt("TextSize",1,n.Z.settings.messagesTextSize,12,20);i.onChange=e=>{n.Z.managers.appStateManager.setByKey("settings.messagesTextSize",e)};const s=(0,I.Z)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});(0,v.fc)(s,(()=>{this.slider.createTab(Je).open()}));const a=new Ce.Z({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",listenerSetter:this.listenerSetter});t.append(i.container,s,(0,P.tG)(a).container)}{const t=e("General.Keyboard"),i=document.createElement("form"),s="send-shortcut",n="settings.sendShortcut",a=new P.ZP({radioField:new A.Z({langKey:"General.SendShortcut.Enter",name:s,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new P.ZP({radioField:new A.Z({name:s,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});(0,p.$d)(o.radioField.main,"General.SendShortcut.CtrlEnter",[z.IS_APPLE?"⌘":"Ctrl"]),i.append(a.container,o.container),t.append(i)}if(st.Z){const t=e("DistanceUnitsTitle"),i=document.createElement("form"),s="distance-unit",n="settings.distanceUnit",a=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsKilometers",name:s,value:"kilometers",stateKey:n})}),o=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsMiles",name:s,value:"miles",stateKey:n})});i.append(a.container,o.container),t.append(i)}{const t=e("General.TimeFormat"),i=document.createElement("form"),s="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map((([e,t])=>new P.ZP({radioField:new A.Z({langKey:t,name:s,value:e,stateKey:n})}))),r=function(e,t=!0){return function(e,t,i=!0){const s=e;let n;return i||(e=Ie.Z),function i(){e(),n=it.Z.setTimeout(i,t())}(),e=s,()=>{clearTimeout(n)}}(e,(()=>1e3*(60-(new Date).getSeconds())),t)}((()=>{const e=new Date;a.forEach((([t],i)=>{const s=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[i].subtitle.textContent=s}))}));this.eventListener.addEventListener("destroy",r),i.append(...o.map((e=>e.container))),t.append(i)}{const t=e("Emoji"),i=new Ce.Z({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",listenerSetter:this.listenerSetter}),s=new Ce.Z({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",listenerSetter:this.listenerSetter});t.append((0,P.tG)(i).container,(0,P.tG)(s).container)}{const e=new b.Z({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),t=new P.ZP({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{this.slider.createTab(at).open()},listenerSetter:this.listenerSetter}),i=()=>{this.managers.appReactionsManager.getQuickReaction().then((e=>"availableReaction"===e._?e.static_icon:this.managers.appEmojiManager.getCustomEmojiDocument(e.document_id))).then((e=>{(0,nt.Z)({row:t,doc:e,size:"small"})}))};i(),this.listenerSetter.add(n.Z)("quick_reaction",i);const s=new Ce.Z({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",listenerSetter:this.listenerSetter}),a=new Ce.Z({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",listenerSetter:this.listenerSetter}),o={},r=e.generateContentElement(),d=new et.Z,l=(e,t="append")=>{const i=new P.ZP({title:(0,Q.Z)(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new tt.Z({id:e.id,access_hash:e.access_hash}).show()},listenerSetter:this.listenerSetter});o[e.id]=i;const s=document.createElement("div");s.classList.add("row-media"),(0,ot.Z)({set:e,container:s,group:"GENERAL-SETTINGS",lazyLoadQueue:d,width:36,height:36,autoplay:!0}),i.container.append(s),r[t](i.container)};this.managers.appStickersManager.getAllStickers().then((e=>{(0,Xe.Z)(e);for(const t of e.sets)l(t)})),this.listenerSetter.add(n.Z)("stickers_installed",(e=>{o[e.id]||l(e,"prepend")})),this.listenerSetter.add(n.Z)("stickers_deleted",(e=>{o[e.id]&&(o[e.id].container.remove(),delete o[e.id])})),e.content.append(t.container,(0,P.tG)(s).container,(0,P.tG)(a).container),this.scrollable.append(e.container)}}onOpen(){this.init&&(this.init(),this.init=null)}}var lt=i(2010),ct=i(7425),ht=i(1507),ut=i(3855),ft=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class pt extends M.h{init(){this.container.classList.add("notifications-container"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new b.Z({name:e.name}),i=new P.ZP({checkboxField:new Ce.Z({text:e.typeText,checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),s=new P.ZP({checkboxField:new Ce.Z({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});t.content.append(i.container,s.container),this.scrollable.append(t.container);const a={_:e.inputKey},o=this.managers.appNotificationsManager.getNotifySettings(a);(o instanceof Promise?o:Promise.resolve(o)).then((t=>{const o=()=>ft(this,void 0,void 0,(function*(){const e=yield this.managers.appNotificationsManager.isMuted(t);return i.checkboxField.checked=!e,s.checkboxField.checked=t.show_previews,e}));o(),this.eventListener.addEventListener("destroy",(()=>ft(this,void 0,void 0,(function*(){const e=!i.checkboxField.checked,n=s.checkboxField.checked;if(e===(yield this.managers.appNotificationsManager.isMuted(t))&&n===t.show_previews)return;const o=(0,De.Z)(t);o._="inputPeerNotifySettings",o.mute_until=e?ht.rU:0,o.show_previews=n,this.managers.appNotificationsManager.updateNotifySettings(a,o)}))),{once:!0}),this.listenerSetter.add(n.Z)("notify_settings",(i=>{const s=Ee(i.peer._);e.inputKey===s&&(t=i.notify_settings,o())}))}))};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new b.Z({name:"NotificationsOther"}),t=new P.ZP({checkboxField:new Ce.Z({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),i=new P.ZP({checkboxField:new Ce.Z({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound",listenerSetter:this.listenerSetter}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});ut.Z.getState().then((e=>{i.checkboxField.checked=e.settings.notifications.sound})),e.content.append(t.container,i.container),this.scrollable.append(e.container),this.managers.appNotificationsManager.getContactSignUpNotification().then((e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",(()=>{const i=t.checkboxField.checked;e!==i&&this.managers.appNotificationsManager.setContactSignUpNotification(!i)}),{once:!0})}))}}}class mt extends l._{static getInitArgs(){return{languages1:n.Z.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"web"}),languages2:Promise.resolve([])}}init(e){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const t=new b.Z({}),i=new Map,s=Promise.all([e.languages1,e.languages2]).then((([e,s])=>{const n=new Set,a=e.map((e=>e.lang_code)),o=(0,k.a)();e.concat(s).forEach((e=>{if(n.has(e.lang_code))return;n.add(e.lang_code);const t=new P.ZP({radioField:new A.Z({text:e.name,name:o,value:e.lang_code}),subtitle:e.native_name});i.set(e.lang_code,t)}));const r=(0,P.De)([...i.values()],(e=>{p.ZP.getLangPack(e,a.includes(e))}));p.ZP.getCacheLangPack().then((e=>{const t=i.get(e.lang_code);t?t.radioField.setValueSilently(!0):console.error("no row",t,e)})),t.content.append(r)}));return this.scrollable.append(t.container),s}}var gt=i(1447),vt=i(4081),bt=i(6848),yt=i(5701);function wt(e,t,i){const s=new b.Z({name:t}),n="settings.autoDownload."+e+".",a=new Ce.Z({text:"AutodownloadContacts",name:"contacts",stateKey:n+"contacts",listenerSetter:i}),o=new Ce.Z({text:"AutodownloadPrivateChats",name:"private",stateKey:n+"private",listenerSetter:i}),r=new Ce.Z({text:"AutodownloadGroupChats",name:"groups",stateKey:n+"groups",listenerSetter:i}),d=new Ce.Z({text:"AutodownloadChannels",name:"channels",stateKey:n+"channels",listenerSetter:i});return s.content.append((0,P.tG)(a).container,(0,P.tG)(o).container,(0,P.tG)(r).container,(0,P.tG)(d).container),s}class St extends M.h{init(){this.setTitle("AutoDownloadPhotos");const e=wt("photo","AutoDownloadPhotosTitle",this.listenerSetter);this.scrollable.append(e.container)}}class Ct extends M.h{init(){this.setTitle("AutoDownloadFiles");const e=(0,yt.Z)((e=>{this.managers.appStateManager.setByKey("settings.autoDownloadNew.file_size_max",e)}),200,!1,!0),t=wt("file","AutoDownloadFilesTitle",this.listenerSetter),i=524288,s=20447232,a=n.Z.settings.autoDownloadNew.file_size_max,o=Math.sqrt(Math.sqrt((a-i)/s)),r=new p.ZP.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[(0,vt.Z)(a)]}),d=new rt("AutoDownloadMaxFileSize",.01,o,0,1,!1);d.onChange=t=>{const n=Math.pow(t,4)*s+i|0;r.compareAndUpdate({args:[(0,vt.Z)(n)]}),e(n)},d.valueContainer.append(r.element),t.content.append(d.container),this.scrollable.append(t.container)}}class Et extends M.h{init(){this.setTitle("AutoDownloadVideos");const e=wt("video","AutoDownloadVideosTitle",this.listenerSetter);this.scrollable.append(e.container)}}const Lt={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class It extends M.h{init(){return e=this,t=void 0,s=function*(){this.setTitle("DataSettings");{const e=new b.Z({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield ut.Z.getState(),i=new Ce.Z({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,listenerSetter:this.listenerSetter}),s=new P.ZP({checkboxField:i,listenerSetter:this.listenerSetter}),a=()=>{(0,G.Z)([h],(0,bt.Z)(t.settings.autoDownload,We.h.settings.autoDownload)&&(0,bt.Z)(t.settings.autoDownloadNew,We.h.settings.autoDownloadNew))},o=()=>{this.setAutoDownloadSubtitle(d,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(l,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},r=e=>{const t=this.slider.createTab(e);t.open(),this.listenerSetter.add(t.eventListener)("destroy",(()=>{o(),a()}),{once:!0})},d=new P.ZP({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{r(St)},listenerSetter:this.listenerSetter}),l=new P.ZP({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{r(Et)},listenerSetter:this.listenerSetter}),c=new P.ZP({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{r(Ct)},listenerSetter:this.listenerSetter}),h=(0,I.Z)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});(0,v.fc)(h,(()=>{(0,Le.Z)({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then((()=>{const e=n.Z.settings;e.autoDownloadNew=(0,De.Z)(We.h.settings.autoDownloadNew),e.autoDownload=(0,De.Z)(We.h.settings.autoDownload),t.settings=e,this.managers.appStateManager.setByKey("settings",e),o(),i.checked=!t.settings.autoDownloadNew.pFlags.disabled}))}));const u=()=>{const e=!i.checked,t=n.Z.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[d,l,c].forEach((t=>{t.container.classList.toggle("is-disabled",e)})),this.managers.appStateManager.setByKey("settings",t),a()};i.input.addEventListener("change",u),u(),o(),e.content.append(s.container,d.container,l.container,c.container,h),this.scrollable.append(e.container)}{const e=new b.Z({name:"AutoplayMedia"});e.content.append(new P.ZP({checkboxField:new Ce.Z({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container,new P.ZP({checkboxField:new Ce.Z({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container),this.scrollable.append(e.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}setAutoDownloadSubtitle(e,t,i){let s;const n=[],a=Object.keys(t),o=a.map((e=>t[e]?Lt[e]:void 0)).filter(Boolean);if(o.length&&0!==i){const e=o.length===a.length;if(void 0!==i?(s=e?"AutoDownloadUpToOnAllChats":"AutoDownloadOnUpToFor",n.push((0,vt.Z)(i))):s=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...(0,p.v_)(o.map((e=>(0,p.ag)(e))),!0,!1)),n.push(e)}}else s="AutoDownloadOff";(0,Z.Z)(e.subtitle,(0,p.ag)(s,n))}}var Mt=i(2230),Pt=i(8261),Zt=i(6765),kt=i(1168),Tt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class xt extends l._{constructor(){super(...arguments),this.buttons={}}init(){return Tt(this,void 0,void 0,(function*(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=(0,L.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new B.Z("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{this.managers.apiManager.logOut()},isDanger:!0}]}).show()}}]});this.buttons.edit=(0,Mt.Z)("edit"),this.header.append(this.buttons.edit,e),this.profile=new Pt.Z(this.managers,this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(n.Z.myId);const t=this.profile.fillProfileElements(),i=(0,I.Z)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});(0,v.fc)(i,(()=>{const e=document.createElement("canvas");kt.Z.createPopup(Zt.Z).open(e,(e=>{e().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))}))}),{listenerSetter:this.listenerSetter}),this.profile.element.lastElementChild.firstElementChild.append(i);const s=()=>Tt(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appUsersManager.getSelf();i.classList.toggle("hide","userProfilePhoto"!==(null===(e=t.photo)||void 0===e?void 0:e._))}));s(),this.listenerSetter.add(n.Z)("avatar_update",(({peerId:e})=>{n.Z.myId===e&&s()}));const a=document.createElement("div");a.classList.add("profile-buttons");const o=(e,t,i,s)=>{if(!s){const e=i.getInitArgs;e&&(s=()=>[e(this)])}return{icon:e,text:t,tabConstructor:i,getInitArgs:s,args:null==s?void 0:s()}},r=[o("unmute","AccountSettings.Notifications",pt),o("data","DataSettings",It),o("lock","AccountSettings.PrivacyAndSecurity",Pe),o("settings","Telegram.GeneralSettingsViewController",dt),o("folder","AccountSettings.Filters",ct.Z)].map((e=>{const{icon:t,text:i,tabConstructor:s,getInitArgs:n}=e;return new P.ZP({titleLangKey:i,icon:t,clickable:()=>Tt(this,void 0,void 0,(function*(){const t=e.args?yield e.args:[],i=this.slider.createTab(s);i.open(...t),i instanceof M.h&&n&&i.eventListener.addEventListener("destroyAfter",(t=>{e.args=t.then((()=>n()))}))})),listenerSetter:this.listenerSetter})})),d=mt.getInitArgs();r.push(this.devicesRow=new P.ZP({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>Tt(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.authorizations=void 0,this.updateActiveSessions(!0)}),{once:!0}),e.open()})),listenerSetter:this.listenerSetter}),this.languageRow=new P.ZP({titleLangKey:"AccountSettings.Language",titleRightSecondary:(0,p.ag)("LanguageName"),icon:"language",clickable:()=>{this.slider.createTab(mt).open(d)},listenerSetter:this.listenerSetter})),a.append(...r.map((e=>e.container)));const l=new b.Z;l.content.append(a),this.scrollable.append(this.profile.element,l.container);const c=()=>{h=lt.Z.getInitArgs()};let h;(0,v.fc)(this.buttons.edit,(()=>{this.slider.createTab(lt.Z).open(h)}),{listenerSetter:this.listenerSetter}),c(),this.listenerSetter.add(n.Z)("user_update",(e=>{n.Z.myId.toUserId()===e&&c()})),gt.Z.loadLottieWorkers(),this.updateActiveSessions(),(yield t)()}))}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=this.managers.apiManager.invokeApi("account.getAuthorizations").finally((()=>{this.getAuthorizationsPromise===t&&(this.getAuthorizationsPromise=void 0)}));return t}updateActiveSessions(e){return this.getAuthorizations(e).then((e=>{this.authorizations=e.authorizations,this.devicesRow.titleRight.textContent=""+this.authorizations.length}))}onCloseAfterTimeout(){return this.profile.destroy(),super.onCloseAfterTimeout()}}class At extends l._{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new f.Z((e=>{this.uploadAvatar=e}));const e=new b.Z({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new u.ZP({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new u.ZP({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const i=()=>{this.nextBtn.classList.toggle("is-visible",!!this.channelNameInputField.value.length&&!this.channelNameInputField.input.classList.contains("error")&&!this.channelDescriptionInputField.input.classList.contains("error"))};this.channelNameInputField.input.addEventListener("input",i),this.channelDescriptionInputField.input.addEventListener("input",i),this.nextBtn=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,this.managers.appChatsManager.createChannel({title:e,about:t,broadcast:!0}).then((e=>{this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),s.Z.setInnerPeer({peerId:e.toPeerId(!0)}),ii.removeTabFromHistory(this),this.slider.createTab(_.Z).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>this.managers.appChatsManager.inviteToChannel(e,t)})}))}),{listenerSetter:this.listenerSetter}),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 _t=i(241),Ft=i(2621),Dt=i(709),Rt=i(6272);class Bt extends kt.Z{constructor(){super("popup-create-contact popup-send-photo popup-new-media",{closable:!0,withConfirm:"Add",title:"AddContactTitle"}),this.construct()}construct(){return e=this,t=void 0,s=function*(){(0,v.fc)(this.btnConfirm,(()=>{const e=this.managers.appUsersManager.importContact(i.value,s.value,n.value);e.then((()=>{this.hide()}),(e=>{"NO_USER"===e.type&&((0,ee.bC)({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),d.disabled=!1)})),d.lockWithPromise(e)}),{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const i=new u.ZP({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),s=new u.ZP({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new Dt.Z({required:!0});e.push(i,s,n);const a=()=>{const e=i.value+" "+s.value;d.avatarElem.peerTitle=e,d.avatarElem.update()};this.listenerSetter.add(i.input)("input",a),this.listenerSetter.add(s.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=yield this.managers.appUsersManager.getSelf(),r=(0,Rt.u)(o.phone);r.code&&(n.value="+"+r.code.country_code);const d=new Ft.Z({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(i.container,s.container,d.avatarElem),this.container.append(t,n.container),this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var Nt=i(2894),Ot=i(3624);class Ut extends l._{init(){this.container.id="contacts-container";const e=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(e),(0,v.fc)(e,(()=>{kt.Z.createPopup(Bt)}),{listenerSetter:this.listenerSetter}),this.inputSearch=new d.Z("Search",(e=>{this.openContacts(e)})),this.listenerSetter.add(n.Z)("contacts_update",(e=>{return t=this,i=void 0,n=function*(){const t=yield this.managers.appUsersManager.isContact(e),i=e.toPeerId();t?this.sortedUserList.add(i):this.sortedUserList.delete(i)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})),this.title.replaceWith(this.inputSearch.container),this.middleware=(0,Ot.k)(),this.openContacts()}createList(){const e=new Nt.Z({managers:this.managers}),t=e.list;return t.id="contacts",t.classList.add("contacts-container"),h.default.setListClickListener(t,(()=>{this.close()}),void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!z.IS_MOBILE&&j(!0)&&this.inputSearch.input.focus()}openContacts(e){this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",this.managers.appUsersManager.getContactsPeerIds(e,void 0,"online").then((e=>{if(!t())return;const i=this.sortedUserList=this.createList();let s=()=>{const t=_t.Z.height/56*1.25|0;e.splice(0,t).forEach((e=>{i.add(e)})),e.length||(s=void 0,this.scrollable.onScrolledBottom=null)};s(),this.scrollable.onScrolledBottom=()=>{s?s():this.scrollable.onScrolledBottom=null},(0,Z.Z)(this.scrollable.container,i.list)}))}}class Ht extends l._{init(){if(this.wasFilterId=h.default.filterId,this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),this.header.classList.add("can-have-forum"),this.content.classList.add("can-have-forum"),!h.default.xds[Ht.filterId]){const{ul:e,scrollable:t}=h.default.l({title:void 0,id:Ht.filterId,localId:ht.Zi});t.container.append(e)}const e=h.default.xds[Ht.filterId].scrollable;return this.scrollable.container.replaceWith(e.container),e.attachBorderListeners(this.container),h.default.setFilterIdAndChangeTab(Ht.filterId).then((({cached:e,renderPromise:t})=>{if(e)return t}))}onOpenAfterTimeout(){h.default.xds[this.wasFilterId].clear()}onClose(){this.scrollable.onAdditionalScroll=void 0,h.default.setFilterIdAndChangeTab(this.wasFilterId)}onCloseAfterTimeout(){return h.default.xds[Ht.filterId].clear(),super.onCloseAfterTimeout()}}Ht.filterId=ht.Zi;class zt extends l._{constructor(){super(...arguments),this.isLocationWatched=!1}parseDistance(e){return"miles"===n.Z.settings.distanceUnit?e>1609.34?(0,p.ag)("MilesAway",[Math.round(e/1609)]):(0,p.ag)("FootsAway",[Math.round(3.281*e)]):e>=1e3?(0,p.ag)("KMetersAway2",[e/1e3]):(0,p.ag)("MetersAway2",[e])}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,(0,ee.Am)("Your position is now being shared. Do not close the page or it will be suspended."),this.managers.appUsersManager.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition((e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,i=e.coords.latitude!==this.latestLocationSaved.latitude,s=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(i||t)&&s&&(this.managers.appUsersManager.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy,!0,2147483647),this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})})))}stopWatching(){this.isLocationWatched&&(this.isLocationWatched=!1,(0,ee.Am)("The sharing of your position has been stopped. You will no longer be visible to other users."),this.managers.appUsersManager.getLocated(0,0,0,!1,0))}calculateDistance(e,t,i,s){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((i-e)*n)+Math.cos(e*n)*Math.cos(i*n)*(1-Math.cos((s-t)*n)/2)))}}var jt=i(9818),Gt=i(8842),Vt=i(4159),Kt=i(7487),Wt=i(1405),$t=i(1655),qt=i(2559),Qt=i(4755),Yt=i(3035),Jt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Xt="is-left-column-shown";class ei extends l.Z{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={}}construct(e){this.managers=e,this.inputSearch=new d.Z("Search");const t=this.sidebarEl.querySelector(".item-main .sidebar-header");t.append(this.inputSearch.container);const i=()=>{this.createTab(Ut).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const a={icon:"archive",text:"ArchivedChats",onClick:()=>{this.createTab(Ht).open()},verify:()=>Jt(this,void 0,void 0,(function*(){return!!(yield this.managers.dialogsStorage.getFolderDialogs(ht.Zi,!1)).length||!(yield this.managers.dialogsStorage.isDialogsLoaded(ht.Zi))}))},o=new Ce.Z({toggle:!0,checked:"night"===He.Z.getTheme().name});o.input.addEventListener("change",(()=>Jt(this,void 0,void 0,(function*(){yield this.managers.appStateManager.setByKey("settings.theme",o.input.checked?"night":"day"),n.Z.dispatchEvent("theme_change")})))),n.Z.addEventListener("theme_change",(()=>{o.setValueSilently("night"===He.Z.getTheme().name)}));const r=[{icon:"savedmessages",text:"SavedMessages",onClick:()=>{setTimeout((()=>{s.Z.setPeer({peerId:s.Z.myId})}),0)}},a,{icon:"user",text:"Contacts",onClick:i},st.Z?{icon:"group",text:"PeopleNearby",onClick:()=>{this.createTab(zt).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{this.createTab(xt).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:o},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new Ce.Z({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=p.ZP.format("TelegramFeaturesUrl",!0);s.Z.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([Kt.Z.set({kz_version:"Z"}),Kt.Z.delete("tgme_sync")]).then((()=>{location.href="https://web.telegram.org/z/"}))},verify:()=>Vt.Z.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Kt.Z.delete("tgme_sync").then((()=>{location.href="https://web.telegram.org/?legacy=1"}))},verify:()=>Vt.Z.isMainDomain}].filter(Boolean);this.toolsBtn=(0,L.Z)({direction:"bottom-right",buttons:r,onOpen:(e,t)=>{var i;const s=document.createElement("a");s.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",s.target="_blank",s.rel="noopener noreferrer",s.classList.add("btn-menu-footer"),s.addEventListener(v.pf,(e=>{e.stopPropagation(),me.Z.close()}));const n=document.createElement("span");n.classList.add("btn-menu-footer-text"),n.innerHTML="Telegram Web"+Vt.Z.suffix+" "+Vt.Z.versionFull,s.append(n),t.classList.add("has-footer"),t.append(s),null===(i=a.element)||void 0===i||i.append(this.archivedCount)}}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn),this.newBtnMenu=(0,L.Z)({direction:"top-left",buttons:[{icon:"newchannel",text:"NewChannel",onClick:()=>{this.createTab(At).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{this.createTab(_.Z).open({type:"chat",skippable:!1,takeOut:e=>this.createTab(y).open(e),title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:i}]}),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",t.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",(0,Wt.Z)(this.updateBtn),this.updateBtn.append((0,p.ag)("Update")),(0,v.fc)(this.updateBtn,(()=>{this.updateBtn.classList.contains("is-hidden")||location.reload()})),t.nextElementSibling.append(this.updateBtn),this.inputSearch.input.addEventListener("focus",(()=>this.initSearch()),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",n.Z.addEventListener("folder_unread",(e=>{if(e.id===ht.Zi){const t=e.unreadPeerIds.size;this.archivedCount.textContent=""+(0,qt.Z)(t,1),this.archivedCount.classList.toggle("hide",!t)}})),this.managers.appUsersManager.getTopPeers("correspondents");const l={type:"global-search-focus",onPop:()=>(setTimeout((()=>{this.inputSearch.input.focus()}),0),!1),noHistory:!0};jt.Z.pushItem(l),ut.Z.getState().then((()=>{const e=setInterval((()=>{fetch("version",{cache:"no-cache"}).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((t=>{t!==Vt.Z.versionFull&&(this.hasUpdate=!0,clearInterval(e),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))})).catch(Ie.Z)}),18e5)}));const c=()=>{const e=this.rect=this.tabsContainer.getBoundingClientRect();document.documentElement.style.setProperty("--left-column-width",e.width+"px")};(0,Yt.T2)(c),Qt.Z.addEventListener("resize",c)}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new r.ZP(e),i=()=>{(0,v.tH)(this.backBtn)};this.searchGroups={contacts:new a.z("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,i),globalContacts:new a.z("GlobalSearch","contacts",void 0,void 0,void 0,void 0,i),messages:new a.z("SearchMessages","messages"),people:new a.z(!1,"contacts",!0,"search-group-people",!0,!1,i,!0),recent:new a.z("Recent","contacts",!0,"search-group-recent",!0,!0,i)};const s=this.searchSuper=new S.Z({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0,managers:this.managers});e.prepend(s.nav.parentElement.parentElement),t.container.append(s.container),s.setQuery({peerId:"".toPeerId(),folderId:0}),s.selectTab(0),s.load(!0);const n=[];let d="".toPeerId(),l=0,u=0;const f=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===n.length),this.inputSearch.container.classList.toggle("is-picked",!!n.length),n.length?this.inputSearch.input.style.setProperty("--paddingLeft",n[n.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},p=document.createElement("div");p.classList.add("search-helper"),p.addEventListener("click",(e=>{const t=(0,he.Z)(e.target,"selector-user");if(!t)return;const i=t.dataset.key;if(0===i.indexOf("date_")){const[e,t,s]=i.split("_");l=+t,u=+s}else d=i.toPeerId();t.addEventListener("click",(()=>{g(t)})),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),n.push(t),f()})),s.nav.parentElement.append(p);const m=(e,t)=>{const i=document.createElement("div");i.classList.add("selector-user");const s=new o.Z;return s.classList.add("selector-user-avatar","tgico","avatar-32"),s.isDialog=!0,i.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Gt.Z({peerId:e.toPeerId()}).element),s.updateWithOptions({peerId:e})):s.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?i.innerHTML=t:((0,Z.Z)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",s),i},g=e=>{0===e.dataset.key.indexOf("date_")?l=u=0:d="".toPeerId(),e.remove(),(0,$t.Z)(n,e),setTimeout((()=>{f(),this.inputSearch.onChange(this.inputSearch.value)}),0)};this.inputSearch.onClear=()=>{n.forEach((e=>{g(e)}))},this.inputSearch.onChange=e=>{if(s.cleanupHTML(),s.setQuery({peerId:d,folderId:d?void 0:0,query:e,minDate:l,maxDate:u}),s.load(!0),p.innerHTML="",s.nav.classList.remove("hide"),!d&&e.trim()){const t=s.middleware.get();Promise.all([this.managers.dialogsStorage.getDialogs({query:e}).then((({dialogs:e})=>e.map((e=>e.peerId)))),this.managers.appUsersManager.getContactsPeerIds(e,!0)]).then((e=>{t()&&(new Set(e[0].concat(e[1])).forEach((e=>{p.append(m(e))})),s.nav.classList.toggle("hide",!!p.innerHTML))}))}if(!l&&e.trim()){const t=[];(0,C.fl)(e,t),t.forEach((e=>{p.append(m("date_"+e.minDate+"_"+e.maxDate,e.title))})),s.nav.classList.toggle("hide",!!p.innerHTML)}},s.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",(e=>{const t=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=(0,he.Z)(t,"search-group");if(!i||i.classList.contains("search-group-recent")||i.classList.contains("search-group-people"))return;const s=t.getAttribute("data-peer-id").toPeerId();this.managers.appUsersManager.pushRecentSearch(s)}),{capture:!0});const b=document.createElement("div");b.classList.add("search-group-scrollable"),b.append(this.searchGroups.people.list),this.searchGroups.people.container.append(b),new r.v7(b);let y,w=!0;const E=(0,c.Z)({content:e.parentElement,type:"zoom-fade",transitionTime:150,onTransitionEnd:e=>{y&&clearTimeout(y),0!==e||w||(s.selectTab(0,!1),this.inputSearch.onClearClick(),y=window.setTimeout((()=>{y=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")}),150)),w=!1}});E(0);const L="is-visible",I=()=>{this.toolsBtn.classList.remove(L),this.backBtn.classList.add(L),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0);const e="global-search";z.IS_MOBILE_SAFARI||jt.Z.findItemByType(e)||jt.Z.pushItem({onPop:()=>{i()},type:e}),E(1)};this.inputSearch.input.addEventListener("focus",I),I(),(0,v.fc)(this.backBtn,(e=>{this.toolsBtn.classList.add(L),this.backBtn.classList.remove(L),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),jt.Z.removeByType("global-search"),E(0)}));const M=(0,Mt.Z)("close");this.searchGroups.recent.nameEl.append(M),M.addEventListener("click",(()=>{(0,Le.Z)({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then((()=>this.managers.appUsersManager.clearRecentSearch().then((()=>{this.searchGroups.recent.clear()}))))}))}}const ti=new ei;E.GO.appSidebarLeft=ti;const ii=ti},5670:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3552),n=i(5644),a=i(279),o=i(8119);class r extends s._{init(e){this.container.classList.add("add-members-container"),this.nextBtn=(0,o.Z)({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())),t=this.takeOut(e);this.skippable?this.close():t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()})),this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const t="privacy"===this.peerType;this.selector=new n.Z({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[t?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:t,filterPeerTypeBy:t?["isAnyGroup","isUser"]:void 0,managers:this.managers,design:"square"}),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)}attachToPromise(e){const t=(0,a.p)(this.nextBtn,"arrow_next");e.then((()=>{this.close()}),(()=>{t()}))}}},7425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>y});var s=i(3552),n=i(1447),a=i(2796),o=i(4494),r=i(3512),d=i(534),l=i(7479),c=i(2325),h=i(3910),u=i(2738),f=i(4484),p=i(8115),m=i(1507),g=i(5565),v=i(5029),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class y extends s._{constructor(){super(...arguments),this.filtersRendered={}}static getInitArgs(){return n.Z.loadAnimationFromURLManually("Folders_1")}renderFolder(e,t,i,s){return b(this,void 0,void 0,(function*(){let n,a="";const o=[];if("dialogFilterSuggested"===e._)n=e.filter,a=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&&o.push((0,c.ag)(t))}if(!o.length){const e=yield this.managers.dialogsStorage.getFolderDialogs(n.id);let t=0,i=0,s=0;yield Promise.all(e.map((e=>b(this,void 0,void 0,(function*(){(yield this.managers.appPeersManager.isAnyGroup(e.peerId))?s++:(yield this.managers.appPeersManager.isBroadcast(e.peerId))?i++:t++}))))),t&&o.push((0,c.ag)("Chats",[t])),i&&o.push((0,c.ag)("Channels",[i])),s&&o.push((0,c.ag)("Groups",[s]))}}if(i)n.id!==m.J$&&(0,g.Z)(i.title,(0,p.Z)(n.title)),i.subtitle.textContent="",i.subtitle.append(...(0,c.v_)(o));else if(i=new l.ZP({title:n.id===m.J$?(0,c.ag)("FilterAllChats"):(0,p.Z)(n.title),subtitle:a,clickable:n.id!==m.J$,buttonRightLangKey:"dialogFilterSuggested"===e._?"Add":void 0}),o.length&&i.subtitle.append(...(0,c.v_)(o)),"dialogFilter"===e._){const e=n.id;this.filtersRendered[n.id]||n.id===m.J$||(0,u.fc)(i.container,(()=>b(this,void 0,void 0,(function*(){this.slider.createTab(d.Z).open(yield this.managers.filtersStorage.getFilter(e))}))),{listenerSetter:this.listenerSetter}),this.filtersRendered[n.id]=i}const r=i.container;if(s){const e=n.localId;void 0!==e?(0,f.Z)(r,r.parentElement||t,e):t&&t.append(r)}return i}))}init(e=y.getInitArgs()){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 t=document.createElement("div");t.classList.add("caption"),(0,c.XZ)({element:t,key:"ChatList.Filter.Header"}),this.createFolderBtn=(0,o.Z)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new v.Z({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new v.Z({name:"FilterRecommended"}),this.suggestedSection.container.style.display="none",this.scrollable.append(this.stickerContainer,t,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),(0,u.fc)(this.createFolderBtn,(()=>b(this,void 0,void 0,(function*(){(yield this.canCreateFolder())?this.slider.createTab(d.Z).open():(0,a.Am)("Sorry, you can't create more folders.")}))),{listenerSetter:this.listenerSetter});const i=()=>{this.foldersSection.container.style.display=Object.keys(this.filtersRendered).length?"":"none"};return this.managers.filtersStorage.getDialogFilters().then((e=>b(this,void 0,void 0,(function*(){for(const t of e)t.id!==m.Zi&&(yield this.renderFolder(t,this.foldersSection.content,void 0,!0));this.toggleAllChats(),i()})))),this.listenerSetter.add(r.Z)("filter_update",(e=>b(this,void 0,void 0,(function*(){const t=this.filtersRendered[e.id];t?yield this.renderFolder(e,null,t):e.id!==m.Zi&&(yield this.renderFolder(e,this.foldersSection.content,void 0,!0)),i(),this.getSuggestedFilters()})))),this.listenerSetter.add(r.Z)("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(this.getSuggestedFilters(),t.container.remove(),delete this.filtersRendered[e.id]),i()})),this.listenerSetter.add(r.Z)("filter_order",(e=>{e.filter((e=>!!this.filtersRendered[e])).forEach(((e,t)=>{const i=this.filtersRendered[e].container;(0,f.Z)(i,i.parentElement,t+1)}))})),this.listenerSetter.add(r.Z)("premium_toggle",(()=>{this.toggleAllChats()})),this.loadAnimationPromise=e.then((e=>b(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,n.Z.waitForFirstFrame(t)})))),this.getSuggestedFilters(),this.loadAnimationPromise}onOpenAfterTimeout(){return this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()})),super.onOpenAfterTimeout()}toggleAllChats(){this.filtersRendered[m.J$].container.classList.toggle("hide",!r.Z.premium)}canCreateFolder(){return b(this,void 0,void 0,(function*(){const[e,t]=yield Promise.all([this.managers.apiManager.getLimit("folders"),this.managers.filtersStorage.getDialogFilters()]);return t.filter((e=>!m.DZ.has(e.id))).lengthb(this,void 0,void 0,(function*(){this.suggestedSection.container.style.display=e.length?"":"none",Array.from(this.suggestedSection.content.children).slice(1).forEach((e=>e.remove()));for(const t of e){const e=yield this.renderFolder(t);this.suggestedSection.content.append(e.container);const i=e.buttonRight;(0,u.fc)(i,(s=>b(this,void 0,void 0,(function*(){if((0,h.Z)(s),!(yield this.canCreateFolder()))return void(0,a.Am)("Sorry, you can't create more folders.");i.setAttribute("disabled","true");const n=t.filter;n.includePeerIds=[],n.excludePeerIds=[],n.pinnedPeerIds=[],this.managers.filtersStorage.createDialogFilter(n,!0).then((t=>{t&&e.container.remove()})).finally((()=>{i.removeAttribute("disabled")}))}))),{listenerSetter:this.listenerSetter})}}))))}}},534:(e,t,i)=>{"use strict";i.d(t,{Z:()=>k});var s=i(8130),n=i(1447),a=i(3552),o=i(2796),r=i(503),d=i(2230),l=i(5322),c=i(4494),h=i(5644),u=i(9807),f=i(2325),p=i(8479),m=i(7625),g=i(130),v=i(8115),b=i(1507),y=i(3512),w=i(2738),S=i(5029),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class E extends a._{constructor(){super(...arguments),this.renderResults=e=>C(this,void 0,void 0,(function*(){yield this.managers.appUsersManager.getContacts(),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e,container:this.selector.scrollable,rippleEnabled:!0,avatarSize:"abitbigger"}),i=this.selector.selected.has(e);t.containerEl.append(this.checkbox(i));const n=[];this.dialogsByFilters.forEach(((t,i)=>{if(t.has(e)){const e=document.createElement("span");(0,g.Z)(e,(0,v.Z)(i.title)),n.push(e)}})),(0,f.v_)(n,!1).forEach((e=>{t.lastMessageSpan.append(e)}))}))})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(e,t,i){this.originalFilter=e,this.filter=(0,p.Z)(this.originalFilter),this.type=t,this.editFolderTab=i,this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=(0,d.Z)("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),(0,w.fc)(this.confirmBtn,(()=>C(this,void 0,void 0,(function*(){const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const i of e)i.isPeerId()?t.push(i.toPeerId()):this.filter.pFlags[i]=!0;let i;i="included"===this.type?e=>t.includes(e):e=>!t.includes(e),(0,m.Z)(this.filter.pinnedPeerIds,((e,t)=>{i(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))}));const s="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";(0,m.Z)(this.filter[s],((e,i)=>{t.includes(e)&&(this.filter[s].splice(i,1),this.filter[n].splice(i,1))})),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=yield Promise.all(t.map((e=>this.managers.appPeersManager.getInputPeerById(e)))),this.editFolderTab.setFilter(this.filter,!1),this.close()}))),{listenerSetter:this.listenerSetter});const s=e=>{this.limit=y.Z.premium?e.dialog_filters_chats_limit_premium:e.dialog_filters_chats_limit_default};return this.listenerSetter.add(y.Z)("app_config",s),this.dialogsByFilters=new Map,Promise.all([this.managers.filtersStorage.getDialogFilters().then((e=>C(this,void 0,void 0,(function*(){yield Promise.all(e.filter((e=>!b.DZ.has(e.id))).map((e=>C(this,void 0,void 0,(function*(){const t=(yield this.managers.dialogsStorage.getFolderDialogs(e.id)).map((e=>e.peerId));this.dialogsByFilters.set(e,new Set(t))})))))})))),this.managers.apiManager.getAppConfig().then((e=>{s(e)}))])}checkbox(e){const t=new u.Z({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new S.Z({noDelimiter:!0,name:"FilterChatTypes"});let i;t.container.classList.add("folder-categories"),i="excluded"===this.type?{exclude_muted:{ico:"mute",text:"ChatList.Filter.MutedChats"},exclude_archived:{ico:"archive",text:"ChatList.Filter.Archive"},exclude_read:{ico:"readchats",text:"ChatList.Filter.ReadChats"}}:{contacts:{ico:"newprivate",text:"ChatList.Filter.Contacts"},non_contacts:{ico:"noncontacts",text:"ChatList.Filter.NonContacts"},groups:{ico:"group",text:"ChatList.Filter.Groups"},broadcasts:{ico:"newchannel",text:"ChatList.Filter.Channels"},bots:{ico:"bots",text:"ChatList.Filter.Bots"}};const s=document.createDocumentFragment();for(const e in i){const t=(0,c.Z)("btn-primary btn-transparent folder-category-button",{icon:i[e].ico,text:i[e].text});t.dataset.peerId=e,t.append(this.checkbox()),s.append(t)}t.content.append(s);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new h.Z({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats",managers:this.managers}),this.selector.selected=new Set(n);let a=!1;const r=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=this.limit&&a&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout((()=>{t.checked=!1}),0);const i=f.ZP.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0);return void(0,o.Am)(i)}const n=r(e,i[e]?(0,f.ag)(i[e].text):void 0,s);return i[e]&&n.querySelector("avatar-element").classList.add("tgico-"+i[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const s in e.pFlags)i.hasOwnProperty(s)&&e.pFlags[s]&&(0,w.tH)(t.content.querySelector(`[data-peer-id="${s}"]`))}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}}var L=i(8127),I=i(6848),M=i(3066),P=i(2353),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class k extends a._{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append((0,f.ag)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=(0,d.Z)("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new L.Z("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),this.managers.filtersStorage.updateDialogFilter(this.filter,!0).then((e=>{e&&this.close()})).finally((()=>{e.element.removeAttribute("disabled")}))},isDanger:!0}]}).show()}};this.menuBtn=(0,l.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[e]}),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=new S.Z({}),i=document.createElement("div");i.classList.add("input-wrapper"),this.nameInputField=new r.ZP({label:"FilterNameHint",maxLength:12}),i.append(this.nameInputField.container),t.content.append(i);const s=(e,t,i,s)=>{const n=new S.Z({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),i.forEach((e=>{const t=(0,c.Z)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(s[e.name]=t),a.append(t)})),n};this.includePeerIds=s("folder-list-included","FilterInclude",[{icon:"add primary",text:"ChatList.Filter.Include.AddChat",withRipple:!0},{text:"ChatList.Filter.Contacts",icon:"newprivate",name:"contacts"},{text:"ChatList.Filter.NonContacts",icon:"noncontacts",name:"non_contacts"},{text:"ChatList.Filter.Groups",icon:"group",name:"groups"},{text:"ChatList.Filter.Channels",icon:"channel",name:"broadcasts"},{text:"ChatList.Filter.Bots",icon:"bots",name:"bots"}],this.flags),this.excludePeerIds=s("folder-list-excluded","FilterExclude",[{icon:"minus primary",text:"ChatList.Filter.Exclude.AddChat",withRipple:!0},{text:"ChatList.Filter.MutedChats",icon:"mute",name:"exclude_muted"},{text:"ChatList.Filter.Archive",icon:"archive",name:"exclude_archived"},{text:"ChatList.Filter.ReadChats",icon:"readchats",name:"exclude_read"}],this.flags),this.scrollable.append(this.stickerContainer,this.caption,t.container,this.includePeerIds.container,this.excludePeerIds.container);const a=this.includePeerIds.container.querySelector(".folder-categories"),h=this.excludePeerIds.container.querySelector(".folder-categories");(0,w.fc)(a.querySelector(".btn"),(()=>{this.slider.createTab(E).open(this.filter,"included",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(h.querySelector(".btn"),(()=>{this.slider.createTab(E).open(this.filter,"excluded",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(this.confirmBtn,(()=>{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?this.managers.filtersStorage.updateDialogFilter(this.filter):this.managers.filtersStorage.createDialogFilter(this.filter),e.then((e=>{e&&this.close()})).catch((e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?(0,o.Am)("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)})).finally((()=>{this.confirmBtn.removeAttribute("disabled")}))):(0,o.Am)("Please choose at least one chat for this folder.")}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.nameInputField.input)("input",(()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()}));const u="edit"===this.type?[this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=n.Z.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_2").then((e=>(this.animation=e,n.Z.waitForFirstFrame(e)))),...u])}onOpenAfterTimeout(){this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()}))}onCreateOpen(){this.setTitle("FilterNew"),this.menuBtn.classList.add("hide"),this.confirmBtn.classList.remove("hide"),this.nameInputField.value="";for(const e in this.flags)this.flags[e].style.display="none"}onEditOpen(){this.setTitle("create"===this.type?"FilterNew":"FilterHeaderEdit"),"edit"===this.type&&(this.menuBtn.classList.remove("hide"),this.confirmBtn.classList.add("hide"));const e=this.filter;this.nameInputField.value=(0,M.Z)(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach((t=>Z(this,void 0,void 0,(function*(){const i=this[t],n=s.default.createChatList({ignoreClick:!0});let a=e[t];const o=e=>Z(this,void 0,void 0,(function*(){return!!(yield this.managers.appMessagesManager.getDialogOnly(e))||!!e.isUser()&&"user"===(yield this.managers.appUsersManager.getUser(e.toUserId()))._})),r=yield(0,P.Z)(a,(e=>o(e)));a.length=0,a.push(...r),a=a.slice();const d=e=>Z(this,void 0,void 0,(function*(){for(let t=0,i=Math.min(a.length,e);td(20)),{listenerSetter:this.listenerSetter}),l.append((0,f.ag)("FilterShowMoreChats",[a.length])),e.append(l)}d(4)}))))}editCheckForChange(){if("edit"===this.type){const e=!(0,I.Z)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){this.container&&Array.from(this.container.querySelectorAll("ul, .load-more")).forEach((e=>e.remove())),t?(this.originalFilter=e,this.filter=(0,p.Z)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){return void 0===e?(this.setFilter({_:"dialogFilter",id:0,title:"",pFlags:{},pinned_peers:[],include_peers:[],exclude_peers:[],pinnedPeerIds:[],includePeerIds:[],excludePeerIds:[]},!0),this.type="create"):(this.setFilter(e,!0),this.type="edit"),super.open().then((()=>{"edit"===this.type?(this.setFilter(this.originalFilter,!0),this.onEditOpen()):this.onCreateOpen()}))}}},2010:(e,t,i)=>{"use strict";i.d(t,{J:()=>p,Z:()=>m});var s=i(503),n=i(3552),a=i(2621),o=i(6726),r=i(2325),d=i(2738),l=i(3512),c=i(2521),h=i(6082),u=i(5029),f=i(9522);function p(){const e=document.createElement("div"),t=(0,c.Z)(document.createElement("a")),i=(0,r.ag)("Username.Purchase",[t]);return i.classList.add("username-purchase-help"),e.append(i,document.createElement("br"),document.createElement("br")),e.classList.add("hide"),{element:e,setUsername:i=>{i&&(t.href="https://fragment.com/username/"+i),e.classList.toggle("hide",!i)}}}class m extends n._{static getInitArgs(){return{bioMaxLength:l.Z.managers.apiManager.getLimit("bio"),user:l.Z.managers.appUsersManager.getSelf(),userFull:l.Z.managers.appProfileManager.getProfile(l.Z.myId.toUserId())}}init(e){return t=this,i=void 0,c=function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const t=[],[i,n,c]=yield Promise.all([e.bioMaxLength,e.user,e.userFull]);{const e=(0,u.R)(this.scrollable,void 0,"Bio.Description"),n=document.createElement("div");n.classList.add("input-wrapper"),this.firstNameInputField=new s.ZP({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new s.ZP({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new s.ZP({label:"EditProfile.BioLabel",name:"bio",maxLength:i}),n.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const o=document.createElement("div");o.classList.add("caption"),(0,r.XZ)({element:o,key:"Bio.Description"}),t.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new a.Z({peerId:l.Z.myId,inputFields:t,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.append(this.editPeer.avatarEdit.container,n)}{const e=new u.Z({name:"EditAccount.Username",caption:!0}),i=document.createElement("div");i.classList.add("input-wrapper"),this.usernameInputField=new o.l({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange();const{error:e}=this.usernameInputField,t="USERNAME_PURCHASE_AVAILABLE"===(null==e?void 0:e.type);n(t?this.usernameInputField.value:void 0)},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"},this.managers),i.append(this.usernameInputField.container);const s=e.caption,{setUsername:n,element:a}=p();s.append(a,(0,r.ag)("UsernameHelp")),t.push(this.usernameInputField),e.content.append(i),this.scrollable.append(e.container)}{const e=new f.Z({peerId:l.Z.myId,peer:n,listenerSetter:this.listenerSetter,usernameInputField:this.usernameInputField,middleware:this.middlewareHelper.get()});this.scrollable.append(e.container)}(0,d.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.managers.appProfileManager.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value);e.push(t.then((()=>{this.close()}),(e=>{console.error("updateProfile error:",e)}))),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))),this.usernameInputField.isValidToChange()&&e.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value)),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter}),this.firstNameInputField.setOriginalValue(n.first_name,!0),this.lastNameInputField.setOriginalValue(n.last_name,!0),this.bioInputField.setOriginalValue(c.about,!0),this.usernameInputField.setOriginalValue((0,h.Z)(n),!0),this.editPeer.handleChange()},new((n=void 0)||(n=Promise))((function(e,s){function a(e){try{r(c.next(e))}catch(e){s(e)}}function o(e){try{r(c.throw(e))}catch(e){s(e)}}function r(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(a,o)}r((c=c.apply(t,i||[])).next())}));var t,i,n,c}}},4332:(e,t,i)=>{"use strict";i.d(t,{HQ:()=>d,ZP:()=>h});var s=i(9355),n=i(3552),a=i(4755),o=i(1669),r=i(410);const d="is-right-column-shown";class l extends n.Z{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1}construct(e){this.managers=e,a.Z.addEventListener("changeScreen",((e,t)=>{t===a._.medium&&e!==a._.mobile&&this.toggleSidebar(!1)})),a.Z.addEventListener("resize",(()=>{this.setColumnProportion()}))}createSharedMediaTab(){const e=this.createTab(o.Z,!1,!0);return e.slider=this,e}replaceSharedMediaTab(e){const t=this.sharedMediaTab;if(t){const i=this.historyTabIds.indexOf(t);this._selectTab.getFrom()===t.container&&this._selectTab.setFrom(null==e?void 0:e.container),e?(-1!==i&&(this.historyTabIds[i]=e),t.container.classList.contains("active")&&e.container.classList.add("active"),t.container.replaceWith(e.container)):(-1!==i&&this.historyTabIds.splice(i,1),t.container.remove())}else this.tabsContainer.prepend(e.container);this.sharedMediaTab=e}onCloseTab(e,t,i){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,i)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const i=document.body.classList.contains(d);let n;if(void 0!==e?e?i||(n=!0):i&&(n=!0):n=!0,!n)return Promise.resolve();i||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const a=s.Z.selectTab(i?1:2,t);return document.body.classList.toggle(d,e),a}}const c=new l;r.GO.appSidebarRight=c;const h=c},4240:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(3552),n=i(503),a=i(2621),o=i(7479),r=i(9807),d=i(4494),l=i(8842),c=i(3512),h=i(8127),u=i(1168),f=i(2325),p=i(2738),m=i(1656),g=i(2946),v=i(8210),b=i(5029),y=i(7362),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class S extends s._{init(){return w(this,void 0,void 0,(function*(){const{peerId:e}=this,t=e.toUserId();this.container.classList.add("edit-peer-container","edit-contact-container");const[i,s]=yield Promise.all([this.managers.appUsersManager.isContact(t),this.managers.appPrivacyManager.getPrivacy("inputPrivacyKeyPhoneNumber")]),S=!i;this.setTitle(S?"AddContactTitle":"Edit");{const i=new b.Z({noDelimiter:!0}),s=[],d=document.createElement("div");if(d.classList.add("input-wrapper"),this.nameInputField=new n.ZP({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new n.ZP({label:"LastName",name:"contact-lastname",maxLength:70}),t){const e=yield this.managers.appUsersManager.getUser(t);S?(this.nameInputField.setDraftValue(e.first_name),this.lastNameInputField.setDraftValue(e.last_name)):(this.nameInputField.setOriginalValue(e.first_name),this.lastNameInputField.setOriginalValue(e.last_name))}if(d.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new a.Z({peerId:e,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),e){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const n=new r.Z({text:"Notifications"});n.input.addEventListener("change",(t=>{t.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:e})})),this.listenerSetter.add(c.Z)("notify_settings",(e=>w(this,void 0,void 0,(function*(){if("notifyPeer"!==e.peer._)return;const t=(0,g.Z)(e.peer.peer);if(t==t){const t=!(yield this.managers.appNotificationsManager.isMuted(e.notify_settings));t!==n.checked&&(n.checked=t)}}))));const a=document.createElement("div");a.classList.add("profile-name"),a.append(new l.Z({peerId:e}).element);const h=document.createElement("div");if(h.classList.add("profile-subtitle"),h.append((0,f.ag)("EditContact.OriginalName")),i.content.append(s,a,h,d),S){const s=yield this.managers.appUsersManager.getUser(t),n=new o.ZP({icon:"phone",titleLangKey:s.phone?void 0:"MobileHidden",title:s.phone?(0,v.Z)(s.phone):void 0,subtitleLangKey:s.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:s.phone?void 0:[new l.Z({peerId:e}).element]});i.content.append(n.container)}else{const t=new o.ZP({checkboxField:n,withCheckboxSubtitle:!0,listenerSetter:this.listenerSetter}),s=!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1}));n.checked=s,i.content.append(t.container)}}else i.content.append(d);this.scrollable.append(i.container)}if(S){if(s.some((e=>"privacyValueDisallowAll"===e._))&&!s.some((e=>"privacyValueAllowUsers"===e._&&e.users.includes(t)))){const e=new b.Z({caption:"NewContact.Exception.ShareMyPhoneNumber.Desc",captionArgs:[yield(0,y.Z)({peerId:this.peerId})]}),t=this.sharePhoneCheckboxField=new r.Z({text:"NewContact.Exception.ShareMyPhoneNumber",checked:!0}),i=(0,o.tG)(t);e.content.append(i.container),this.scrollable.append(e.container)}}else{const i=new b.Z,s=(0,d.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});(0,p.fc)(s,(()=>{new h.Z("popup-delete-contact",{peerId:e,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:(0,u.x)([{langKey:"Delete",callback:()=>{const e=(0,m.Z)([s],!0);this.managers.appUsersManager.deleteContacts([t]).then((()=>{this.close()}),(()=>{e()}))},isDanger:!0}])}).show()}),{listenerSetter:this.listenerSetter}),i.content.append(s),this.scrollable.append(i.container)}(0,p.fc)(this.editPeer.nextBtn,(()=>w(this,void 0,void 0,(function*(){var e;this.editPeer.nextBtn.disabled=!0,this.managers.appUsersManager.addContact(t,this.nameInputField.value,this.lastNameInputField.value,(yield this.managers.appUsersManager.getUser(t)).phone,null===(e=this.sharePhoneCheckboxField)||void 0===e?void 0:e.checked).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}))),{listenerSetter:this.listenerSetter})}))}}},730:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(2738),n=i(1656),a=i(9405),o=i(8479),r=i(6848),d=i(9355),l=i(1507),c=i(3785),h=i(2230),u=i(9807),f=i(6039),p=i(503),m=i(7479),g=i(5029),v=i(4039),b=i(6024),y=i(9345),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const S=(0,a.C)(64,64);class C extends b.Z{init(e,t){return w(this,void 0,void 0,(function*(){this.colorIndex=0;const i=!t,a=t===l.Ox;this.container.classList.add("edit-topic-container"),this.setTitle(i?"NewTopic":"ForumTopic.Title.Edit");const r=e.toChatId();t&&(this.topic=this.originalTopic=(0,o.Z)(yield this.managers.dialogsStorage.getForumTopic(e,t)));{const i=new g.Z({name:a?"CreateGeneralTopicTitle":"CreateTopicTitle"}),o=this.iconDiv=document.createElement("div");o.classList.add("edit-topic-icon-container"),!t&&(0,s.fc)(o,(()=>{this.topic.icon_emoji_id||(this.colorIndex=(this.colorIndex+1)%l.OS.length,this.setIcon())}),{listenerSetter:this.listenerSetter}),t&&o.classList.add("disable-hover");const c=document.createElement("div");c.classList.add("input-wrapper");const u=this.nameInputField=new p.ZP({label:"ForumTopic.Name.Placeholder",withLinebreaks:!1,name:"topic-name",maxLength:70,required:!0});this.topic&&u.setOriginalValue(this.topic.title,!0);const f=this.confirmBtn=(0,h.Z)("check btn-confirm blue hide",{noRipple:!0});this.header.append(f),(0,s.fc)(f,(()=>{const i=(0,n.Z)([f],!0);t?this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,title:u.value,iconEmojiId:this.topic.icon_emoji_id||0}).then((()=>{this.close()})).catch((e=>{console.error("edit topic error",e),i()})):this.managers.appChatsManager.createForumTopic({chatId:r,iconColor:l.OS[this.colorIndex],iconEmojiId:this.topic.icon_emoji_id,title:u.value}).then((t=>{this.close(),d.Z.setInnerPeer({peerId:e,threadId:t})})).catch((e=>{console.error("create topic error",e),i()}))}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(u.input)("input",(()=>{var e;this.validate(),this.setIcon(null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id)})),c.append(u.container),i.content.append(o,c),this.scrollable.append(i.container)}const c=[];if(a){const e=new g.Z({caption:"EditTopicHideInfo"}),i=new u.Z({checked:!this.topic.pFlags.hidden,text:"EditTopicHide"});this.listenerSetter.add(i.input)("change",(()=>{const e=this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,hidden:!i.checked});s.disableWithPromise(e)}));const s=new m.ZP({checkboxField:i});e.content.append(s.container),this.scrollable.append(e.container)}else{const e=new g.Z({});e.container.classList.add("edit-topic-emoticons-container");const t=new f.ZP({managers:this.managers,isStandalone:!0,noRegularEmoji:!0,stickerSetId:"inputStickerSetEmojiDefaultTopicIcons",onClick:e=>{t.setActive(e.docId?e:{emoji:void 0,docId:void 0}),this.setIcon(e.docId)}});t.getContainerSize=()=>({width:v.ZP.rect.width,height:400}),this.middlewareHelper.onDestroy((()=>{t.destroy()})),t.container.classList.remove("tabs-tab"),this.emojiElement=document.createElement("span"),this.emojiElement.classList.add("super-emoji-topic-icon");const i=t.init().then((()=>w(this,void 0,void 0,(function*(){var e;const i=t.getCustomCategory(),s=null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id;t.addEmojiToCategory({category:i,element:this.emojiElement,batch:!1,prepend:!0,active:!s}),s&&t.setActive({docId:s,emoji:""})}))));c.push(i),e.content.replaceWith(t.container),this.scrollable.append(e.container)}return Promise.all(c).then((()=>this.s()))}))}validate(){let e=this.nameInputField.isValidToChange();!e&&this.originalTopic&&(e=this.topic.icon_emoji_id!==this.originalTopic.icon_emoji_id),this.confirmBtn.classList.toggle("hide",!e)}s(){var e,t;return(null===(e=this.topic)||void 0===e?void 0:e.icon_color)&&(this.colorIndex=l.OS.indexOf(this.topic.icon_color)),this.setIcon(null===(t=this.topic)||void 0===t?void 0:t.icon_emoji_id,void 0,!0)}setIcon(e,t=this.iconDiv,i){var s;return w(this,void 0,void 0,(function*(){const n=this.nameInputField.value,a=t===this.iconDiv;if(a){const t={id:null===(s=this.topic)||void 0===s?void 0:s.id,icon_color:l.OS[this.colorIndex],title:(0,c.Z)(n,!0).text||"A",icon_emoji_id:e},a=this.topic;if(this.topic=t,!i&&a&&a.icon_color===t.icon_color&&a.title===t.title||this.setIcon(void 0,this.emojiElement),(0,r.Z)(a,t)&&!i)return;this.validate()}const o=yield(0,y.e)({topic:a?this.topic:Object.assign(Object.assign({},this.topic),{icon_emoji_id:void 0}),customEmojiSize:S,middleware:this.middlewareHelper.get()}),d=document.createElement("div");d.classList.add("edit-topic-icon"),d.append(o);const h=t.lastElementChild;t.append(d);const u=(e,t)=>{const i=e.animate([{opacity:"0",transform:"scale(0.8)"},{opacity:"1",transform:"scale(1)"}],{duration:200,iterations:1,easing:"ease-in-out",fill:"forwards",direction:t?"normal":"reverse"});return new Promise((e=>{i.addEventListener("finish",(()=>{e()}),{once:!0})}))};h&&u(h,!1).then((()=>h.remove())),u(d,!0)}))}}},1669:(e,t,i)=>{"use strict";i.d(t,{Z:()=>de});var s=i(3512),n=i(6360),a=i(3552),o=i(426),r=i(503),d=i(2621),l=i(7479),c=i(4494),h=i(2166),u=i(144),f=i(279),p=i(1218),m=i(2796),g=i(6726),v=i(6024),b=i(2325),y=i(8127),w=i(8119),S=i(2738),C=i(1656),E=i(9807),L=i(5029),I=i(9522),M=i(6082),P=i(5102),Z=i(2010),k=i(5592),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x extends v.h{init(){return T(this,void 0,void 0,(function*(){this.container.classList.add("edit-peer-container","group-type-container");const e=yield this.managers.appChatsManager.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new L.Z({name:e?"ChannelType":"GroupType"}),i=(0,u.a)(),n=new l.ZP({radioField:new p.Z({langKey:e?"ChannelPrivate":"MegaPrivate",name:i,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),a=new l.ZP({radioField:new p.Z({langKey:e?"ChannelPublic":"MegaPublic",name:i,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),o=(0,l.De)([n,a],(e=>{const t=[[d.container],[U]];"public"===e&&t.reverse(),t[0].forEach((e=>e.classList.remove("hide"))),t[1].forEach((e=>e.classList.add("hide"))),D()})),r=yield this.managers.appChatsManager.getChat(this.chatId);t.content.append(o);const d=new L.Z({}),v=new l.ZP({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{(0,h.T)(this.chatFull.exported_invite.link),(0,m.Am)(b.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),x=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});(0,S.fc)(x,(()=>{new y.Z("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=(0,C.Z)([x],!0);this.managers.appProfileManager.getChatInviteLink(this.chatId,!0).then((t=>{e(),v.title.innerHTML=t}))}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()}),{listenerSetter:this.listenerSetter}),d.content.append(v.container,x);const A=new L.Z({caption:!0,noDelimiter:!0}),_=document.createElement("div");_.classList.add("input-wrapper");const F="t.me/",D=()=>{const e=n.radioField.checked&&H!==F||R.isValidToChange()&&R.input.classList.contains("valid");z.classList.toggle("is-visible",e);const{error:t}=R,i="USERNAME_PURCHASE_AVAILABLE"===(null==t?void 0:t.type);B(i?R.getValue():void 0)},R=new g.l({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:D,peerId:this.chatId.toPeerId(!0),head:F},this.managers),{setUsername:B,element:N}=(0,Z.J)();A.caption.append(N,(0,b.ag)(e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup"));const O=new I.Z({peerId:this.chatId.toPeerId(!0),peer:r,listenerSetter:this.listenerSetter,usernameInputField:R,middleware:this.middlewareHelper.get()}),U=document.createElement("div");U.append(A.container,O.container);const H=F+((0,M.Z)(r)||"");_.append(R.container),A.content.append(_);const z=(0,w.Z)({icon:"check",className:"is-visible"});this.content.append(z),(0,S.fc)(z,(()=>T(this,void 0,void 0,(function*(){const t=a.radioField.checked?R.getValue():"";if(!t){const t=yield this.managers.appChatsManager.getChat(this.chatId),i=(0,M.Z)(t);i&&(yield(0,k.Z)({descriptionLangKey:e?"ChannelVisibility.Confirm.MakePrivate.Channel":"ChannelVisibility.Confirm.MakePrivate.Group",descriptionLangArgs:[i],button:{langKey:"OK"}}))}(0,f.p)(z),this.managers.appChatsManager.migrateChat(this.chatId).then((e=>t?this.managers.appChatsManager.updateUsername(e,t):this.managers.appChatsManager.makeChannelPrivate(e))).then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),(H!==F||(0,P.Z)(r).length?a:n).radioField.checked=!0,R.setOriginalValue(H,!0),this.scrollable.append(t.container,d.container,U);{const t=new L.Z({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),i=new E.Z({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.toggleNoForwards(this.chatId,i.checked).then((()=>{e()}))}));const n=()=>{i.setValueSilently(!!r.pFlags.noforwards)};this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&n()})),n(),t.content.append(i.label),this.scrollable.append(t.container)}}))}}var A=i(4668),_=i(5565),F=i(8936),D=i(8130),R=i(8479),B=i(7120),N=i(2946),O=i(2995),U=i(6848),H=i(3061);class z extends v.h{init(){return e=this,t=void 0,s=function*(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new L.Z({name:"UserRestrictionsCanDo"}),i=document.createElement("div");i.classList.add("chatlist-container"),t.content.insertBefore(i,t.title);const s=D.default.createChatList({new:!0});i.append(s);const{dom:n}=D.default.addDialogNew({peerId:this.userId.toPeerId(!1),container:s,rippleEnabled:!0,avatarSize:"abitbigger"});n.lastMessageSpan.append((0,H.Z)(yield this.managers.appUsersManager.getUser(this.userId)));const a=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0},this.managers);e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&(0,U.Z)(this.participant.banned_rights.pFlags,e.pFlags)||this.managers.appChatsManager.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new L.Z({});if("channelParticipantBanned"===this.participant._){const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});(0,S.fc)(i,(()=>{const t=(0,C.Z)([i],!0);this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}),(()=>{t()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i)}const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});(0,S.fc)(i,(()=>{(0,C.Z)([i],!0),this.managers.appChatsManager.kickFromChannel(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var j=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class G{constructor(e,t){this.options=e,this.managers=t,this.construct()}construct(){return j(this,void 0,void 0,(function*(){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const e=this.options,t=yield this.managers.appChatsManager.getChat(e.chatId),i=t.default_banned_rights,s=e.participant?function(e,t){if(e.default_banned_rights){t=(0,R.Z)(t);const i=e.default_banned_rights.pFlags;for(const e in i)t.pFlags[e]=i[e]}return t}(t,e.participant.banned_rights):i,n=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const a of this.v){const o=a.flags[0],r=(0,l.tG)(a.checkboxField=new E.Z({text:a.text,checked:(0,B.Z)(t,o,s),restriction:!0,listenerSetter:e.listenerSetter}));(e.participant&&i.pFlags[o]||(0,P.Z)(t)[0]&&(a.flags.includes("pin_messages")||a.flags.includes("change_info")))&&(a.checkboxField.input.disabled=!0,(0,S.fc)(a.checkboxField.label,(e=>{(0,m.Am)(b.ZP.format(n,!0))}),{listenerSetter:e.listenerSetter})),this.toggleWith[o]&&e.listenerSetter.add(a.checkboxField.input)("change",(()=>{a.checkboxField.checked||this.v.filter((e=>this.toggleWith[o].includes(e.flags[0]))).forEach((e=>{e.checkboxField.checked=!1}))})),e.appendTo.append(r.container)}}))}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 V extends v.h{init(){return j(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new L.Z({name:"ChannelPermissionsHeader"});e=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content},this.managers),this.eventListener.addEventListener("destroy",(()=>{this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId,e.takeOut())}),{once:!0}),this.scrollable.append(t.container)}{const t=new L.Z({name:"PrivacyExceptions"}),i=new l.ZP({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new O.Z({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout((()=>{n(e)}),0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})},listenerSetter:this.listenerSetter}),n=e=>j(this,void 0,void 0,(function*(){let t;try{t=yield this.managers.appProfileManager.getChannelParticipant(this.chatId,e)}catch(e){return void(0,m.Am)("User is no longer participant")}const i=this.slider.createTab(z);i.participant=t,i.chatId=this.chatId,i.userId=e,i.open()}));t.content.append(i.container);const a=t.generateContentElement();a.classList.add("chatlist-container");const o=D.default.createChatList({new:!0});a.append(o),(0,S.fc)(o,(e=>{const t=(0,A.Z)(e.target,D.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();n(i)}),{listenerSetter:this.listenerSetter});const r=(t,i)=>j(this,void 0,void 0,(function*(){const s=i.banned_rights,n=(yield this.managers.appChatsManager.getChat(this.chatId)).default_banned_rights,a=[];e.v.forEach((e=>{const t=e.flags[0];s.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)}));const o=t.lastMessageSpan;a.length&&o.replaceChildren(...(0,b.v_)(a.map((e=>(0,b.ag)(e))),!1)),o.classList.toggle("hide",!a.length)})),d=(e,t)=>{const{dom:i}=D.default.addDialogNew({peerId:(0,N.Z)(e.peer),container:o,rippleEnabled:!0,avatarSize:"abitbigger",append:t});r(i,e)},c=()=>{(0,_.Z)(i.subtitle,(0,b.ag)(u?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[u]))};let h,u=0;const f=()=>(h=new F.Z({scrollable:this.scrollable,getPromise:()=>this.managers.appProfileManager.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,o.childElementCount).then((e=>{for(const t of e.participants)d(t,!0);return u=e.count,c(),e.participants.length<50||e.count===o.childElementCount}))}),h.load());this.scrollable.append(t.container),(yield this.managers.appChatsManager.isChannel(this.chatId))?yield f():(c(),this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,f())})))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}var K=i(6194),W=i(5701),$=i(62),q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Q extends v.h{init(){var e;return q(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield this.managers.appReactionsManager.getActiveAvailableReactions(),i=yield this.managers.appProfileManager.getChatFull(this.chatId),s=yield this.managers.appChatsManager.isBroadcast(this.chatId);let n=null!==(e=i.available_reactions)&&void 0!==e?e:{_:"chatReactionsNone"},a=n,o=new Set("chatReactionsSome"===n._?n.reactions.map((e=>e.emoticon)):[]);const r=e=>e.map((e=>({_:"reactionEmoji",emoticon:e}))),d=()=>s?"EnableReactionsChannelInfo":"chatReactionsAll"===a._?"EnableAllReactionsInfo":"chatReactionsNone"===a._?"DisableReactionsInfo":"EnableSomeReactionsInfo",c=new L.Z({name:s?void 0:"AvailableReactions",caption:d()}),h=new L.Z({name:"OnlyAllowThisReactions"}),u=()=>{var e;const t=null!==(e=a.reactions)&&void 0!==e?e:[];o=new Set(t.map((({emoticon:e})=>e))),p.forEach(((e,t)=>{e.setValueSilently(o.has(t))}))};let f;if(s){f=new E.Z({toggle:!0,checked:"chatReactionsSome"===n._});const e=new l.ZP({checkboxField:f,titleLangKey:"EnableReactions",listenerSetter:this.listenerSetter});c.content.append(e.container),this.listenerSetter.add(f.input)("change",(()=>{let e=!0;f.checked?m.every((e=>!e.checked))?a={_:"chatReactionsSome",reactions:r(t.map((({reaction:e})=>e)))}:"chatReactionsSome"!==a._?a={_:"chatReactionsSome",reactions:r(Array.from(o))}:e=!1:a={_:"chatReactionsNone"},e&&(u(),v())}))}else{const e=[["chatReactionsAll","AllReactions"],["chatReactionsSome","SomeReactions"],["chatReactionsNone","NoReactions"]],t=()=>{h.container.classList.toggle("hide","chatReactionsSome"!==a._)};let i=n._;const s=(0,l.ZC)(e.map((([e,t])=>({langPackKey:t,value:e,checked:n._===e}))),(e=>{i=e,a="chatReactionsAll"===i?{_:i,pFlags:{allow_custom:!0}}:"chatReactionsNone"===i?{_:i}:{_:i,reactions:r(["👍","👎"])},(0,_.Z)(c.caption,(0,b.ag)(d())),u(),v(),t()}));c.content.append(s),t()}const p=new Map,m=t.map((e=>{const t=e.reaction,i=new E.Z({toggle:!0,checked:o.has(t)});p.set(t,i),this.listenerSetter.add(i.input)("change",(()=>{i.checked?(o.add(t),f&&!f.checked&&(f.checked=!0)):(o.delete(t),(null==f?void 0:f.checked)&&!o.size&&(f.checked=!1)),v()}));const s=new l.ZP({checkboxField:i,title:e.title,havePadding:!0,listenerSetter:this.listenerSetter});return(0,$.Z)({row:s,doc:e.static_icon,size:"small"}),h.content.append(s.container),i})),g=()=>q(this,void 0,void 0,(function*(){v.clearTimeout(),"chatReactionsSome"===a._&&(a.reactions=r(Array.from(o))),this.managers.appChatsManager.setChatAvailableReactions(this.chatId,a),n=a})),v=(0,W.Z)(g,3e3,!1,!0);this.eventListener.addEventListener("destroy",(()=>{v.isDebounced()&&g()}),{once:!0}),this.scrollable.append(c.container,h.container)}))}}var Y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class J extends a._{_init(){return Y(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.replaceChildren(),this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let[e,t,i,n,a,o,h,u]=yield Promise.all([this.managers.appProfileManager.getChatFull(this.chatId,!0),this.managers.appChatsManager.getChat(this.chatId),this.managers.appChatsManager.isBroadcast(this.chatId),this.managers.appChatsManager.isChannel(this.chatId),this.managers.appChatsManager.hasRights(this.chatId,"change_type"),this.managers.appChatsManager.hasRights(this.chatId,"change_permissions"),this.managers.appChatsManager.hasRights(this.chatId,"manage_topics"),this.managers.apiManager.getAppConfig()]);const f={full:[],basic:[]},p=(e,t="basic")=>{f[t].push(e)};this.listenerSetter.add(s.Z)("chat_update",(e=>Y(this,void 0,void 0,(function*(){this.chatId===e&&(t=yield this.managers.appChatsManager.getChat(this.chatId),f.basic.forEach((e=>e())))})))),this.listenerSetter.add(s.Z)("chat_full_update",(t=>Y(this,void 0,void 0,(function*(){this.chatId===t&&(e=(yield this.managers.appProfileManager.getCachedFullChat(t))||e,f.full.forEach((e=>e())))}))));const m=this.chatId.toPeerId(!0);{const s=new L.Z({noDelimiter:!0,caption:!0}),n=[],c=document.createElement("div");if(c.classList.add("input-wrapper"),this.chatNameInputField=new r.ZP({label:i?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new r.ZP({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(t.title),this.descriptionInputField.setOriginalValue(e.about),c.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new d.Z({peerId:m,inputFields:n,listenerSetter:this.listenerSetter,popupOptions:{isForum:t.pFlags.forum}}),this.content.append(this.editPeer.nextBtn),s.content.append(this.editPeer.avatarEdit.container,c),a){const n=new l.ZP({titleLangKey:i?"ChannelType":"GroupType",clickable:()=>{const t=this.slider.createTab(x);t.chatId=this.chatId,t.chatFull=e,t.open()},icon:"lock",listenerSetter:this.listenerSetter}),a=()=>{let e;const s=(0,P.Z)(t)[0];e=i?s?"TypePublic":"TypePrivate":s?"TypePublicGroup":"TypePrivateGroup",n.subtitle.replaceChildren((0,b.ag)(e))};a(),p(a),s.content.append(n.container)}if(a||o){const t=new l.ZP({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=this.slider.createTab(Q);e.chatId=this.chatId,e.open()},listenerSetter:this.listenerSetter}),i=(yield this.managers.appReactionsManager.getAvailableReactions()).filter((e=>!e.pFlags.inactive)).length,n=()=>{var s;const n=null!==(s=e.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};if("chatReactionsSome"===n._){const e=n.reactions.length;e===i?(0,_.Z)(t.subtitle,(0,b.ag)("ReactionsAll")):t.subtitle.textContent=e+"/"+i}else(0,_.Z)(t.subtitle,(0,b.ag)("chatReactionsAll"===n._?"ReactionsAll":"Checkbox.Disabled"))};n(),p(n,"full"),s.content.append(t.container)}if(o&&!i){const e=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],i=new l.ZP({titleLangKey:"ChannelPermissions",clickable:()=>{const e=this.slider.createTab(V);e.chatId=this.chatId,e.open()},icon:"permissions",listenerSetter:this.listenerSetter}),n=()=>{i.subtitle.textContent=e.reduce(((e,i)=>e+ +(0,B.Z)(t,i,t.default_banned_rights)),0)+"/"+e.length};n(),p(n),s.content.append(i.container)}if(h&&(t.participants_count>=u.forum_upgrade_participants_min||t.pFlags.forum)){const e=new l.ZP({checkboxField:new E.Z({toggle:!0}),titleLangKey:"Topics",clickable:()=>{},icon:"topics",listenerSetter:this.listenerSetter}),i=()=>{const i=!!t.pFlags.forum;this.editPeer.avatarElem.parentElement.classList.toggle("is-forum",i),e.checkboxField.setValueSilently(i)};this.listenerSetter.add(e.checkboxField.input)("change",(t=>{if(!t.isTrusted)return;const i=this.managers.appChatsManager.toggleForum(this.chatId,e.checkboxField.checked);e.disableWithPromise(i)})),i(),p(i),s.caption.replaceChildren((0,b.ag)("ForumToggleDescription")),s.content.append(e.container)}if(s.caption.classList.toggle("hide",!s.caption.childElementCount),this.scrollable.append(s.container),(0,S.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appChatsManager.editPhoto(t,e)))),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}),{listenerSetter:this.listenerSetter}),i&&(yield this.managers.appChatsManager.hasRights(this.chatId,"change_info"))){const e=new E.Z({text:"ChannelSignMessages",checked:!!t.pFlags.signatures});this.listenerSetter.add(e.input)("change",(()=>{const t=e.toggleDisability(!0);this.managers.appChatsManager.toggleSignatures(this.chatId,e.checked).then((()=>{t()}))})),p((()=>{e.setValueSilently(!!t.pFlags.signatures)})),s.content.append((0,l.tG)(e).container)}}if(!i){const t=new L.Z({});if(!i&&a){const i=new E.Z({text:"ChatHistory"});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.togglePreHistoryHidden(this.chatId,!i.checked).then((()=>{e()}))}));const s=()=>{i.setValueSilently(n&&!e.pFlags.hidden_prehistory)};s(),p(s),t.content.append((0,l.tG)(i).container)}t.content.childElementCount&&this.scrollable.append(t.container)}if(yield this.managers.appChatsManager.hasRights(this.chatId,"delete_chat")){const e=new L.Z({}),t=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:i?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});(0,S.fc)(t,(()=>{new K.Z(m,void 0,(e=>{const i=(0,C.Z)([t],!0);e.then((()=>{this.close()}),(()=>{i()}))}))}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}n||this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{m===e&&(this.chatId=t.toChatId(),this._init())}))}))}init(){return this._init()}}var X=i(8842),ee=i(4240),te=i(2230),ie=i(5670),se=i(8261),ne=i(4993),ae=i(730),oe=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const re={};class de extends a._{init(){this.container.classList.add("shared-media-container","profile-container");const e=(0,c.Z)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t),this.isFirst&&t.classList.add("state-back");const i=document.createElement("div");i.className="transition slide-fade";const a=document.createElement("div");a.classList.add("transition-item"),this.titleI18n=new b.ZP.IntlElement,this.title.append(this.titleI18n.element),this.editBtn=(0,te.Z)("edit"),a.append(this.title,this.editBtn);const r=document.createElement("div");r.classList.add("transition-item");const d=this.title.cloneNode();d.append((0,b.ag)("PeerInfo.SharedMedia")),r.append(d),i.append(a,r),this.header.append(i),this.profile=new se.Z(this.managers,this.scrollable,this.listenerSetter),this.profile.init(),this.scrollable.append(this.profile.element),this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const t=e.top-1;l(t<=56)};const l=e=>{t.classList.toggle("state-back",this.isFirst||e),this.searchSuper.container.classList.toggle("is-full-viewport",e),h(+e),e||this.searchSuper.cleanScrollPositions()},h=(0,o.Z)({content:i,type:"slide-fade",transitionTime:400,isHeavy:!1});h(0),(0,S.fc)(this.closeBtn,(e=>{h.prevId()?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),h(0),this.isFirst||t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),{listenerSetter:this.listenerSetter}),(0,S.fc)(this.editBtn,(()=>oe(this,void 0,void 0,(function*(){let e;const{peerId:t,threadId:i}=this;e=i&&(yield this.managers.appPeersManager.isForum(t))?this.slider.createTab(ae.Z):t.isAnyChat()?this.slider.createTab(J):this.slider.createTab(ee.Z),e&&(e instanceof ae.Z?e.open(t,this.threadId):(e instanceof J?e.chatId=t.toChatId():e.peerId=t,e.open()))}))),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.Z)("contacts_update",(e=>{this.peerId===e&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("history_multiappend",(e=>{this.renderNewMessage(e)})),this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))})),this.listenerSetter.add(s.Z)("message_sent",(({message:e})=>{this.renderNewMessage(e)})),this.searchSuper=new n.Z({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=>{const t="members"===e.type&&s.Z.settings.animationsEnabled?250:0;setTimeout((()=>{u.classList.toggle("is-hidden","members"!==e.type)}),t)},managers:this.managers}),this.searchSuper.scrollStartCallback=()=>{l(!0)},this.profile.element.append(this.searchSuper.container);const u=(0,w.Z)({icon:"addmember_filled"});this.content.append(u),(0,S.fc)(u,(()=>oe(this,void 0,void 0,(function*(){const e=this.peerId,t=this.peerId.toChatId(),i=yield this.managers.appChatsManager.isChannel(t),s=(t,s)=>{let n,a,o,r,d;if(t.length>1)n="AddMembersAlertTitle",a=[(0,b.ag)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map((e=>{const t=document.createElement("b");return t.append(new X.Z({peerId:e}).element),t})),i||(d=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new X.Z({peerId:t[0]}).element),r=[e],i||(d=[{text:"AddOneMemberForwardMessages",textArgs:[new X.Z({peerId:t[0]}).element],checked:!0}])}r.push(new X.Z({peerId:e}).element),new y.Z("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:s}],checkboxes:d}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&(0,m.bC)({langPackKey:"InviteToGroupError"})};if(i){const e=this.slider.createTab(ie.Z);e.open({type:"channel",skippable:!1,takeOut:i=>(s(i,(()=>{const s=this.managers.appChatsManager.inviteToChannel(t,i);s.catch(n),e.attachToPromise(s)})),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new O.Z({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout((()=>{s([e],(i=>{this.managers.appChatsManager.addChatUser(t,e,i.size?void 0:0).catch(n)}))}),0)}})}))),{listenerSetter:this.listenerSetter})}_renderNewMessage(e,t){var i;const s=null===(i=re[e.peerId])||void 0===i?void 0:i[t];if(s)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=s[i];if(!n)continue;const a=this.searchSuper.filterMessagesByType([e],i).filter((e=>!n.find((t=>t.mid===e.mid&&t.peerId===e.peerId))));a.length&&(n.unshift(...a.map((e=>({mid:e.mid,peerId:e.peerId})))),this.peerId===e.peerId&&-1!==this.searchSuper.usedFromHistory[i]&&(this.searchSuper.usedFromHistory[i]+=a.length,this.searchSuper.performSearchResult(a,t,!1)))}}renderNewMessage(e){return oe(this,void 0,void 0,(function*(){if(this.init)return;const{peerId:t}=e,i=yield this.managers.appPeersManager.isForum(t),s=(0,ne.Z)(e,i);this._renderNewMessage(e),s&&this._renderNewMessage(e,s)}))}_deleteDeletedMessages(e,t,i){for(const s of i)for(const i of this.searchSuper.mediaTabs){const n=i.inputFilter,a=e[n];if(!a)continue;const o=a.findIndex((e=>e.mid===s));if(-1!==o&&(a.splice(o,1),this.peerId===t)){const e=this.searchSuper.tabs[n].querySelector(`[data-mid="${s}"][data-peer-id="${t}"]`);e&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(e),e.remove()),this.searchSuper.usedFromHistory[n]>=o+1&&--this.searchSuper.usedFromHistory[n]}}}deleteDeletedMessages(e,t){if(this.init)return;const i=re[e];if(i){for(const s in i)this._deleteDeletedMessages(i[s],e,t);this.scrollable.onScroll()}}cleanupHTML(){return oe(this,void 0,void 0,(function*(){const e=this.peerId.isAnyChat(),[t,i]=yield Promise.all([!!e&&this.searchSuper.canViewMembers(),!!e&&this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"invite_users")]);return()=>{this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",t&&i)}}))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t){var i,s,n;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,threadId:t,historyStorage:null!==(s=(n=null!==(i=re[e])&&void 0!==i?i:re[e]={})[t])&&void 0!==s?s:n[t]={}}),this.profile.setPeer(e,t),!0)}changeTitleKey(){return oe(this,void 0,void 0,(function*(){const e=this.managers.appPeersManager.isForum(this.peerId);return()=>{this.titleI18n.compareAndUpdate({key:this.threadId&&e?"AccDescrTopic":"Profile"})}}))}fillProfileElements(){return oe(this,void 0,void 0,(function*(){if(!this.peerChanged)return;this.peerChanged=!1;const e=yield Promise.all([this.cleanupHTML(),this.toggleEditBtn(!0),this.profile.fillProfileElements(),this.changeTitleKey()]);return()=>{e.forEach((e=>{null==e||e()}))}}))}toggleEditBtn(e){return oe(this,void 0,void 0,(function*(){let t;t=this.peerId.isUser()?this.peerId!==s.Z.myId&&(yield this.managers.appUsersManager.isContact(this.peerId.toUserId())):yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"change_info");const i=()=>{this.editBtn.classList.toggle("hide",!t)};return e?i:i()}))}loadSidebarMedia(e,t){this.searchSuper.load(e,t)}onOpenAfterTimeout(){super.onOpenAfterTimeout(),this.scrollable.onScroll()}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.destroyable&&(this.profile.destroy(),this.searchSuper.destroy())}destroy(){this.destroyable=!0,this.onCloseAfterTimeout()}}},9099:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512);const n=e=>{const{element:t,className:i,forwards:a,duration:o,onTransitionEnd:r,onTransitionStart:d,useRafs:l}=e,{timeout:c,raf:h}=t.dataset;if(void 0!==c&&clearTimeout(+c),void 0!==h&&(window.cancelAnimationFrame(+h),l||delete t.dataset.raf),l&&s.Z.settings.animationsEnabled&&o)return void(t.dataset.raf=""+window.requestAnimationFrame((()=>{delete t.dataset.raf,n(Object.assign(Object.assign({},e),{useRafs:l-1}))})));a&&i&&t.classList.add(i);const u=()=>{delete t.dataset.timeout,!a&&i&&t.classList.remove("backwards",i),t.classList.remove("animating"),null==r||r()};if(null==d||d(),!s.Z.settings.animationsEnabled||!o)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!a),t.dataset.timeout=""+setTimeout(u,o)},a=n},3552:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,_:()=>a.Z});var s=i(426),n=i(9818),a=i(6024),o=i(1655),r=i(5953),d=i(3624);class l{constructor(e){var t;this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{n.Z.findItemByType(this.navigationType)?n.Z.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,i)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return this.removeTabFromHistory(e),!1;const s=this.historyTabIds.pop();this.onCloseTab(s,t,i);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof a.Z?n.container:n:this.canHideFirst?-1:0,t),!0},(0,r.Z)(this,e),null!==(t=this.tabs)&&void 0!==t||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=(0,s.Z)({content:this.tabsContainer,type:"navigation",transitionTime:250}),this.canHideFirst||this._selectTab(0),this.middlewareHelper=(0,d.k)()}getMiddleware(){return this.middlewareHelper.get()}selectTab(e){var t,i,s,o,r;return i=this,s=void 0,r=function*(){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const i=e instanceof a.Z?e:this.tabs.get(e);return this.onOpenTab&&(yield this.onOpenTab()),i&&(null===(t=i.onOpen)||void 0===t||t.call(i),i.onOpenAfterTimeout&&setTimeout((()=>{i.onOpenAfterTimeout()}),250)),n.Z.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof a.Z?e.container:e),!0},new((o=void 0)||(o=Promise))((function(e,t){function n(e){try{d(r.next(e))}catch(e){t(e)}}function a(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(i,s||[])).next())}))}removeTabFromHistory(e){(0,o.Z)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let i=this.historyTabIds.length-1;i>=0;--i){const s=this.historyTabIds[i];if(s!==t){if(s instanceof e)break;this.removeTabFromHistory(s)}}}getTab(e){return this.historyTabIds.find((t=>t instanceof e))}getHistory(){return this.historyTabIds}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,i){var s;i||n.Z.removeByType(this.navigationType,!0);const o=e instanceof a.Z?e:this.tabs.get(e);if(o){try{null===(s=o.onClose)||void 0===s||s.call(o)}catch(e){console.error("tab onClose error",o)}o.onCloseAfterTimeout&&setTimeout((()=>{o.onCloseAfterTimeout()}),280)}}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}deleteTab(e){this.tabs.delete(e)}createTab(e,t=!0,i){const s=new e(i?void 0:this,t);return s.managers=this.managers,s}}},6024:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c,h:()=>h});var s=i(3241),n=i(3699),a=i(3624),o=i(319),r=i(2325),d=i(2230),l=i(8805);class c{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){var i;this.slider=e,this.middlewareHelper=e?e.getMiddleware().create():(0,a.k)(),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=(0,d.Z)("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 l.ZP(this.content,void 0,void 0,!0),this.scrollable.attachBorderListeners(this.container),this.container.append(this.header,this.content),null===(i=this.slider)||void 0===i||i.addTab(this),this.listenerSetter=new n.Z}close(){return this.slider.closeTab(this)}open(...e){return t=this,i=void 0,n=function*(){if(this.init)try{const t=this.init(...e);this.init=null,t instanceof Promise&&(yield t)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}init(...e){}onOpen(){}onOpenAfterTimeout(){}onClose(){}onCloseAfterTimeout(){var e,t,i;this.destroyable&&(null===(e=this.slider)||void 0===e||e.deleteTab(this),this.container.remove(),this.scrollable.destroy(),null===(t=this.listenerSetter)||void 0===t||t.removeAll(),null===(i=this.middlewareHelper)||void 0===i||i.destroy())}setTitle(e){this.title.replaceChildren((0,r.ag)(e))}}class h extends c{constructor(e){super(e),this.eventListener=new s.Z}onClose(){this.eventListener.dispatchEvent("close")}onCloseAfterTimeout(){const e=this.eventListener.dispatchResultableEvent("destroy");return this.eventListener.dispatchEvent("destroyAfter",Promise.all(e).then(o.Z,o.Z)),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}},2894:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(8130),n=i(8594),a=i(8487),o=i(4484),r=i(5565),d=i(3035),l=i(5345),c=i(5953),h=i(3061),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class f extends l.Z{constructor(e){let t;super({getIndex:e.getIndex||(e=>this.managers.appUsersManager.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>u(this,void 0,void 0,(function*(){const t=(0,h.Z)(yield this.managers.appUsersManager.getUser(e.id));(0,r.Z)(e.dom.lastMessageSpan,t)}))),onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;(0,o.Z)(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});return e.dom=t,e},updateElementWith:d.T2,updateListWith:e=>u(this,void 0,void 0,(function*(){return(0,a.Z)(this.list)?(yield(0,n.e9)(),(0,a.Z)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,(0,c.Z)(this,e),this.list=s.default.createChatList(this.createChatListOptions);const i=()=>{t=window.setTimeout((()=>{this.updateList((e=>{e&&i()}))}),f.SORT_INTERVAL)};i()}}f.SORT_INTERVAL=3e4},9259:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(5432),n=i(3910),a=i(2738),o=i(5975),r=i(8497),d=i(8204),l=i(9405),c=i(3624),h=i(3035),u=i(5418),f=i(241),p=i(13),m=i(8115),g=i(5400),v=i(1447),b=i(3772),y=i(3512),w=i(5814),S=i(9099),C=i(3541),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let L=!1;function I({listenTo:e,listenerSetter:t,selector:i,findTarget:I}){if(s.Z)return;const M=(t,s)=>{let n;if(I)n=I(t);else{const e=i||".media-sticker-wrapper";n=t.target.closest(e)}return!n||s&&!(0,o.Z)(n,e)?void 0:n},P=y.Z.managers;t.add(e)("mousedown",(e=>{if(L||e.buttons>1||0!==e.button)return;let t=M(e);if(!t)return;const i=t.dataset.docId;if(!i)return;const s="sticker-viewer",y="STICKER-VIEWER",I=w.Z.getOnlyOnePlayableGroup(),Z=(0,c.k)();let k,T;const x=({mediaContainer:e,doc:t,middleware:i,lockGroups:n,isSwitching:o})=>E(this,void 0,void 0,(function*(){const c=(0,p.Z)(t),S=e.getBoundingClientRect(),E=(0,l.C)(t.w,t.h),L=c?280:360,I=(0,l.C)(L,L),M=S.width===S.height?I:E.aspectFitted(I),Z=(0,r.Z)(e,"bubble"),T=!Z||Z.classList.contains("is-out"),x=document.createElement("div");x.classList.add(s+"-transformer");const A=document.createElement("div");A.classList.add(s+"-sticker"),A.style.width=M.width+"px",A.style.height=M.height+"px";const _=document.createElement("div");if(_.classList.add(s+"-emoji"),_.append((0,m.Z)(t.stickerEmojiRaw)),c){const e=(L*C.Vp-L)/3*(T?1:-1);x.classList.add("has-effect"),x.style.setProperty("--translateX",`${e}px`),_.style.setProperty("--translateX",-e+"px")}const F=(0,r.Z)(e,"scrollable"),D=(0,d.Z)(e,F,!0,S);(D.overflow.vertical||D.overflow.horizontal)&&A.classList.add("is-overflow");const R=e.getBoundingClientRect(),B=R.width/M.width,N=R.height/M.height,O=R.left-(f.Z.width-R.width)/2,U=R.top-(f.Z.height-R.height)/2;x.style.transform=`translate(${O}px, ${U}px) scale(${B}, ${N})`,o&&x.classList.add("is-switching"),x.append(A,_),k.append(x);const H=yield(0,C.ZP)({doc:t,div:A,group:y,width:M.width,height:M.height,play:!1,loop:!0,middleware:i,managers:P,needFadeIn:!1,isOut:T,withThumb:!1,relativeEffect:!0,loopEffect:!0}).then((({render:e})=>e));if(!i())return;k.parentElement||document.body.append(k);const z=Array.isArray(H)?H[0]:H,j=z instanceof b.Z?new Promise((e=>z.addEventListener("firstFrame",e,{once:!0}))):Promise.resolve();if(yield Promise.all([j,(0,h.d1)()]),yield(0,u.Z)(0),i()){if(n&&(w.Z.setOnlyOnePlayableGroup(y),w.Z.checkAnimations2(!0)),z instanceof b.Z){const t=e instanceof g.LD?e.player:v.Z.getAnimation(e);if(t){if(z.curFrame=t.curFrame,z.play(),yield new Promise((e=>{let t=0;const i=()=>{2==++t&&(e(),z.removeEventListener("enterFrame",i))};z.addEventListener("enterFrame",i)})),!i())return;z.pause()}}else if(z instanceof HTMLVideoElement){const t=e.querySelector("video");t&&(z.currentTime=t.currentTime)}return{ready:()=>{(z instanceof b.Z||z instanceof HTMLVideoElement)&&z.play(),c&&(0,a.tH)(A)},transformer:x}}})),A=window.setTimeout((()=>E(this,void 0,void 0,(function*(){document.removeEventListener("mousemove",F),k=document.createElement("div"),k.classList.add(s),L=!0;const e=Z.get(),n=yield P.appDocsManager.getDoc(i);if(!e())return;let a;try{if(a=yield x({doc:n,mediaContainer:t,middleware:e,lockGroups:!0}),!a)return}catch(e){return}const{ready:o,transformer:r}=a;T=r,(0,S.Z)({element:k,className:"is-visible",forwards:!0,duration:200,onTransitionEnd:()=>{e()&&o()}}),document.addEventListener("mousemove",_)}))),125),_=e=>E(this,void 0,void 0,(function*(){const i=M(e,!0);if(!i||t===i)return;const s=i.dataset.docId;if(!s)return;t=i,Z.clean();const n=Z.get(),a=yield P.appDocsManager.getDoc(s);if(!n())return;let o;try{if(o=yield x({doc:a,mediaContainer:t,middleware:n,isSwitching:!0}),!o)return}catch(e){return void console.error("sticker viewer error",e)}const{ready:r,transformer:d}=o,l=T;(0,S.Z)({element:l,className:"is-switching",forwards:!0,duration:200,onTransitionEnd:()=>{l.remove()}}),T=d,(0,S.Z)({element:d,className:"is-switching",forwards:!1,duration:200,onTransitionEnd:()=>{n()&&r()}})})),F=e=>{(0,o.Z)(e.target,t)||D()},D=()=>{clearTimeout(A),Z.clean(),k&&((0,S.Z)({element:k,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{k.remove(),w.Z.setOnlyOnePlayableGroup(I),w.Z.checkAnimations2(!1),L=!1}}),(0,a.fc)(document.body,n.Z,{capture:!0,once:!0})),document.removeEventListener("mousemove",F),document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",D,{capture:!0})};document.addEventListener("mousemove",F),document.addEventListener("mouseup",D,{once:!0,capture:!0})}))}},5117:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.container=e,this.handler=t,this.observeHeaders(),this.observeElements()}observeHeaders(){this.headersObserver=new IntersectionObserver((e=>{for(const t of e){const e=t.boundingClientRect,i=t.target.parentElement,s=t.rootBounds;e.bottom=s.top&&e.bottom{const t=e.filter((e=>e.boundingClientRect.tope.boundingClientRect.top-t.boundingClientRect.top))[0];if(!t)return;const i=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,i)}),{root:this.container})}addSentinel(e,t){const i=document.createElement("div");return i.classList.add("sticky_sentinel",t),e.appendChild(i)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}},3757:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(3910),n=i(5432),a=i(5953),o=i(3416),r=i(3699),d=i(6976);const l=e=>e.touches?e.touches[0]:e,c=window;let h=!1;o.Z.addEventListener("toggle",(e=>{h=e}));const u={passive:!1,capture:!0};class f{constructor(e){var t,i;this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.hadMove=!1,this.xDown=null,this.yDown=null,this.reset=e=>{var t;n.Z?this.listenerSetter.removeManual(c,"touchmove",this.handleMove,u):(this.listenerSetter.removeManual(c,"mousemove",this.handleMove,!1),this.setCursorTo.style.cursor=""),this.hadMove&&(null===(t=this.onReset)||void 0===t||t.call(this)),this.xDown=this.yDown=null,this.hadMove=!1},this.handleStart=e=>{return t=this,i=void 0,a=function*(){const t=l(e);if(this.verifyTouchTarget&&!(yield this.verifyTouchTarget(e)))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,n.Z?this.listenerSetter.add(c)("touchmove",this.handleMove,u):this.listenerSetter.add(c)("mousemove",this.handleMove,!1)},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a},this.handleMove=e=>{var t;if(null===this.xDown||null===this.yDown||h)return void this.reset();this.cancelEvent&&(0,s.Z)(e);const i=l(e),a=i.clientX,o=i.clientY,r=this.xDown-a,d=this.yDown-o;if(!this.hadMove){if(!r&&!d)return;this.hadMove=!0,n.Z||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),null===(t=this.onFirstSwipe)||void 0===t||t.call(this,e)}const c=this.onSwipe(r,d,e);void 0!==c&&c&&this.reset()},(0,a.Z)(this,e),null!==(t=this.setCursorTo)&&void 0!==t||(this.setCursorTo=this.element),this.listenerSetter=new r.Z,this.setListeners(),null===(i=e.middleware)||void 0===i||i.onDestroy((()=>{this.reset(),this.removeListeners()}))}setListeners(){n.Z?(this.withDelay?(0,d.E)(this.element,this.handleStart,this.listenerSetter):this.listenerSetter.add(this.element)("touchstart",this.handleStart,this.listenerOptions),this.listenerSetter.add(c)("touchend",this.reset)):(this.listenerSetter.add(this.element)("mousedown",this.handleStart,this.listenerOptions),this.listenerSetter.add(c)("mouseup",this.reset))}removeListeners(){this.listenerSetter.removeAll()}setCursor(e=""){this.cursor=e,!n.Z&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}},709:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2398),n=i(6272),a=i(4762),o=i(503);class r extends o.ZP{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");const 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 i;a.IS_APPLE?i=-.16*e:a.IS_ANDROID&&(i=0),t.style.setProperty("--letter-spacing",i+"px")}const i=this.setValueSilently.bind(this);this.setValueSilently=e=>{i(e),(0,s.Z)(this.input,!0)}}t.addEventListener("input",(()=>{t.classList.remove("error");const i=this.value;let s;Math.abs(i.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+i),this.pasted=!1,this.setLabel();let o,r,d,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(s=(0,n.u)(this.value),o=s.formatted,r=s.country,l=s.leftPattern,d=s.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),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}))}}},2796:(e,t,i)=>{"use strict";i.d(t,{Am:()=>c,PE:()=>l,bC:()=>h});var s=i(5565),n=i(2296),a=i(2325);const o=document.createElement("div");let r;o.classList.add("toast");const d=new n.Z("toast");function l(){d.close(),o.classList.remove("is-visible"),r&&clearTimeout(+r),r=window.setTimeout((()=>{o.remove(),r=void 0}),200)}function c(e,t){d.close(),(0,s.Z)(o,e),o.parentElement||(document.body.append(o),o.offsetLeft),o.classList.add("is-visible"),r&&clearTimeout(+r),d.open(o),r=window.setTimeout(l,3e3),t&&d.addEventListener("toggle",t,{once:!0})}function h(e){c((0,a.ag)(e.langPackKey,e.langPackArguments),e.onClose)}d.addEventListener("toggle",(e=>{e||l()}))},426:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(3512),n=i(3725),a=i(8594),o=i(2648),r=i(3910);const d={navigation:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",e.style.filter="",()=>{t.style.transform=t.style.filter=""}},animateFirst:!1},tabs:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.transform=`translate3d(${-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",()=>{t.style.transform=""}},animateFirst:!1}},l=e=>{let{content:t,type:i,transitionTime:l,onTransitionEnd:c,isHeavy:h=!0,once:u=!1,withAnimationListener:f=!0,listenerSetter:p,animateFirst:m=!1}=e;const{callback:g,animateFirst:v}=d[i]||{};t.dataset.animation=i,void 0!==v&&(m=v);const b=new Map;let y,w=null;if(f){const e=g?"transitionend":"animationend",i=s=>{if((0,r.Z)(s),s.target.parentElement!==t)return;const n=b.get(s.target);null==n||n(),s.target===w&&(!y&&h||(y&&(y.resolve(),y=void 0),null==c||c(S.prevId()),t.classList.remove("animating","backwards","disable-hover"),u&&(p?p.removeManual(t,e,i):t.removeEventListener(e,i),w=y=void 0,b.clear())))};p?p.add(t)(e,i):t.addEventListener(e,i)}function S(e,i=!0,r){r&&(w=r),e instanceof HTMLElement&&(e=(0,o.Z)(e));const d=S.prevId();if(e===d)return!1;const u=t.children[e];if(s.Z.settings.animationsEnabled&&(-1!==d||m)||(i=!1),!f){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!i){if(w)w.classList.remove("active","to","from");else if(u){const e=b.get(u);null==e||e()}return u&&(u.classList.remove("to","from"),u.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),w=u,void(null==c||c(e))}f||(t.dataset.timeout=""+window.setTimeout((()=>{u.classList.remove("to"),w&&w.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout}),l)),w&&(w.classList.remove("to"),w.classList.add("from")),t.classList.add("animating");const p=d{u.classList.remove("to"),b.delete(u)}))}if(w){let e;const t=w,i=()=>{clearTimeout(e),t.classList.remove("active","from"),null==v||v(),b.delete(t)};u?(e=window.setTimeout(i,l+100),b.set(t,i)):(e=window.setTimeout(i,l),b.set(t,(()=>{clearTimeout(e),b.delete(t)}))),t.dataset.transitionTimeout=""+e,h&&(y||(y=(0,n.Z)()),(0,a.YW)(y,2*l))}w=u}return S.prevId=()=>w?(0,o.Z)(w):-1,S.getFrom=()=>w,S.setFrom=e=>w=e,S}},6726:(e,t,i)=>{"use strict";i.d(t,{l:()=>o});var s=i(5701),n=i(503);function a(e){return(e.length>=3&&e.length<=32||!e.length)&&/^[a-zA-Z0-9_]*$/.test(e)}class o extends n.ZP{constructor(e,t){super(e),this.managers=t,this.checkUsernameDebounced=(0,s.Z)(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",(()=>{var e,t,i,s;const o=this.getValue();if(this.error=void 0,o===this.originalValue||!o.length)return this.setState(n.I1.Neutral),void(null===(t=(e=this.options).onChange)||void 0===t||t.call(e));a(o)?this.setState(n.I1.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?null===(s=(i=this.options).onChange)||void 0===s||s.call(i):this.checkUsernameDebounced(o)}))}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){if(this.checkUsernamePromise)return;let t;this.error=void 0,t=this.options.peerId?this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(),e):this.managers.appUsersManager.checkUsername(e);const i=this.checkUsernamePromise=t.then((t=>{this.getValue()===e&&(t?this.setState(n.I1.Valid,this.options.availableText):this.setError(this.options.takenText))}),(t=>{this.getValue()===e&&(this.error=t,"USERNAME_PURCHASE_AVAILABLE"===t.type?this.setError(this.options.takenText):this.setError(this.options.invalidText))})).then((()=>{var t,s;this.checkUsernamePromise===i&&(this.checkUsernamePromise=void 0),null===(s=(t=this.options).onChange)||void 0===s||s.call(t);const n=this.getValue();n!==e&&this.isValidToChange()&&a(n)&&this.checkUsername(n)}))}}},9522:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(5432),n=i(3910),a=i(2738),o=i(5975),r=i(2398),d=i(4484),l=i(2648),c=i(319),h=i(3228),u=i(5418),f=i(5345),p=i(2325),m=i(3512),g=i(5592),v=i(7479),b=i(5029),y=i(3757),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class S extends b.Z{constructor(e){super({name:"UsernamesProfileHeader",caption:e.peerId.isUser()?"UsernamesProfileHelp":"UsernamesChannelHelp"});const{peerId:t,peer:i,usernameInputField:b,listenerSetter:S,middleware:C}=e,E=m.Z.managers,L=t.isUser()?void 0:t.toChatId(),I=this,M=document.createElement("div");let P;M.classList.add("usernames");const Z=new f.Z({getIndex:e=>P.length-P.findIndex((t=>t.username===e.id)),onDelete:e=>{e.row.container.remove()},onSort:(e,t)=>{(0,d.Z)(e.row.container,M,t)},onElementCreate:e=>{const t=P.find((t=>t.username===e.id)),i=new v.ZP({title:"@"+t.username,subtitle:!0,clickable:!0}),s=!!t.pFlags.editable,n=!!t.pFlags.active;s&&(i.container.dataset.editable="1"),i.container.dataset.username=t.username,i.container.classList.add("usernames-username"),i.subtitle.classList.add("usernames-username-status"),i.createMedia("medium").classList.add("usernames-username-icon","tgico");const a=document.createElement("span");return i.container.classList.add("row-sortable","tgico"),a.classList.add("row-sortable-icon","tgico-menu"),i.container.append(a),k(i,n),e.row=i,e}}),k=(e,t)=>{e.subtitle.replaceChildren((0,p.ag)(e.container.dataset.editable?"UsernameLinkEditable":t?"UsernameLinkActive":"UsernameLinkInactive")),e.container.classList.toggle("active",t),e.container.classList.toggle("cant-sort",!t)},T=(e=[])=>{P=e,Z.getAll().forEach((t=>{e.some((e=>e.username===t.id))||Z.delete(t.id)})),e.forEach((e=>{if(Z.has(e.username)){const t=Z.get(e.username);Z.update(e.username,t),k(t.row,!!e.pFlags.active)}else Z.add(e.username)})),I.container.classList.toggle("hide",!Z.getAll().size)};T(i.usernames),S.add(m.Z)("peer_title_edit",(({peerId:e})=>w(this,void 0,void 0,(function*(){if(e!==t)return;const i=yield E.appPeersManager.getPeer(t);T(i.usernames)}))));let x=!1;(0,a.fc)(M,(e=>w(this,void 0,void 0,(function*(){if(x)return void(x=!1);const t=(0,o.Z)(e.target,M);if(!t)return;if(t.dataset.editable)return void(0,r.Z)(b.input,!0,!0);const i=t.dataset.username,s=t.classList.contains("active");let n,a;s?(n="UsernameDeactivateLink",a=L?"UsernameDeactivateLinkChannelMessage":"UsernameDeactivateLinkProfileMessage"):(n="UsernameActivateLink",a=L?"UsernameActivateLinkChannelMessage":"UsernameActivateLinkProfileMessage");try{yield(0,g.Z)({titleLangKey:n,descriptionLangKey:a,button:{langKey:s?"Hide":"Show"}})}catch(e){return}const d=!s;let l;l=L?E.appChatsManager.toggleUsername(L,i,d):E.appUsersManager.toggleUsername(i,d),l.catch((e=>{"USERNAMES_ACTIVE_TOO_MUCH"===e.type?(0,g.Z)({titleLangKey:"UsernameActivateErrorTitle",descriptionLangKey:"UsernameActivateErrorMessage",button:{langKey:"OK",isCancel:!0}}).catch(c.Z):console.error("turn username error",e)}))}))));const A=e=>{if(!e)return;let t=(0,o.Z)(e,M);return t&&t.classList.contains("cant-sort")&&(t=void 0),t};let _,F,D,R,B,N;const O=new y.Z({element:M,onSwipe:(e,t)=>{t=(0,h.Z)(-t,R,B),_.style.transform=`translateY(${t}px)`;const i=Math.round(Math.abs(t)/F.height),s=N;N=[];const n=t<0?"previousElementSibling":"nextElementSibling";let a=_[n];for(let e=0;e{N.includes(e)||(e.style.transform="")})),N.forEach((e=>{const i=F.height*(t<0?1:-1);e.style.transform=`translateY(${i}px)`}))},verifyTouchTarget:e=>!M.classList.contains("is-reordering")&&(_=A(e.target),!!_),onFirstSwipe:()=>{M.classList.add("is-reordering"),_.classList.add("is-dragging","no-transition"),O.setCursor("grabbing"),F=_.getBoundingClientRect(),D=M.getBoundingClientRect(),R=D.top-F.top,B=D.bottom-F.bottom},onReset:()=>w(this,void 0,void 0,(function*(){const e=N.length,t=e&&e*(N[0].previousElementSibling===_?1:-1),i=(0,l.Z)(_),o=i+t;if(_.classList.remove("no-transition"),_.style.transform=t?`translateY(${t*F.height}px)`:"",O.setCursor(""),s.Z||(0,a.fc)(document.body,n.Z,{capture:!0,once:!0}),m.Z.settings.animationsEnabled&&(yield(0,u.Z)(250)),M.classList.remove("is-reordering"),_.classList.remove("is-dragging"),(0,d.Z)(_,M,o,i),[_,...N].forEach((e=>{e.style.transform=""})),_=N=F=D=R=B=void 0,!t)return;const r=P.splice(i,1)[0];P.splice(o,0,r),Z.updateList();const c=P.filter((e=>e.pFlags.active)).map((e=>e.username));L?E.appChatsManager.reorderUsernames(L,c):E.appUsersManager.reorderUsernames(c)})),setCursorTo:document.body,middleware:C,withDelay:!0});I.content.append(M)}}},2940:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver((t=>{if(this.locked)return;const i=[];t.forEach(((e,t)=>{const s=e.target;if(this.items.get(s)===e.isIntersecting)return;this.items.set(s,e.isIntersecting);const n={target:s,visible:e.isIntersecting,entry:e,index:t};i.push(n)})),i.forEach((t=>{e(t)}))}),t)}getVisible(){const e=[];return this.items.forEach(((t,i)=>{t&&e.push(i)})),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}},8427:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3910),n=i(2738),a=i(3013),o=i(65);class r extends o.Z{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&(0,s.Z)(e),a.Z.muted=!a.Z.muted},this.setVolume=()=>{const{volume:e,muted:t}=a.Z;let i;i=!e||t?0:e>.5?3:e>0&&e<.25?1:2,r.ICONS.forEach((e=>this.icon.classList.remove("tgico-"+e))),this.icon.classList.add("tgico-"+r.ICONS[i]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);a.Z.muted=!1,a.Z.volume=t}});const i="player-volume",o=this.btn=document.createElement("div");o.classList.add("btn-icon",i);const d=this.icon=document.createElement("span");d.classList.add(i+"__icon"),o.append(d,this.container),(0,n.fc)(d,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.Z)("playbackParams",this.setVolume),this.setVolume()}}r.ICONS=["volume_off","volume_mute","volume_down","volume_up"]},9083:(e,t,i)=>{"use strict";i.d(t,{N:()=>a,Z:()=>n});var s=i(5400);function n({docIds:e,loadPromises:t,middleware:i,lazyLoadQueue:n,customEmojiSize:a,animationGroup:o}){const r=" ".repeat(e.length),d=[];return e.forEach(((e,t)=>{d.push({_:"messageEntityCustomEmoji",offset:t,length:1,document_id:e})})),(0,s.ZP)(r,{entities:d,loadPromises:t,animationGroup:o,customEmojiSize:a,middleware:i,lazyLoadQueue:n})}function a(e){var t;const i=null!==(t=e.loadPromises)&&void 0!==t?t:e.loadPromises=[],s=n(e);return Promise.all(i).then((()=>s))}},296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(2341),n=i(467),a=i(632),o=i(2738),r=i(8497),d=i(4081),l=i(319),c=i(2312),h=i(9355),u=i(1243),f=i(7030),p=i(2325),m=i(1507),g=i(2491),v=i(3512),b=i(8448),y=i(3251),w=i(3442),S=i(9492),C=i(5671),E=i(1604),L=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function I({message:e,withTime:t,fontWeight:i,voiceAsMusic:I,showSender:M,searchContext:P,loadPromises:Z,autoDownloadSize:k,lazyLoadQueue:T,sizeType:x,managers:A=v.Z.managers,cacheContext:_,fontSize:F}){var D;return L(this,void 0,void 0,(function*(){null!=i||(i=500),null!=x||(x=""),null!=F||(F=0);const R=0===k,B=e.media.document||e.media.webpage.document,N=null==e?void 0:e.uploadingFileName;if("audio"===B.type||"voice"===B.type||"round"===B.type){const s=new b.ZP;return s.withTime=t,s.message=e,s.noAutoDownload=R,s.lazyLoadQueue=T,s.loadPromises=Z,I&&(s.voiceAsMusic=I),P&&(s.searchContext=P),M&&(s.showSender=M),s.dataset.fontWeight=""+i,s.dataset.fontSize=""+F,s.dataset.sizeType=x,yield s.render(),s}const O=B.file_name?B.file_name.split("."):"";let U="";U=O.length>1&&Array.isArray(O)?(0,n.ST)(O.pop().split(" ",1)[0].toLowerCase()):"file";const H=document.createElement("div");H.classList.add("document",`ext-${U}`),H.dataset.docId=""+B.id,H.doc=B;const z=document.createElement("div");let j;z.classList.add("document-ico");const G=!!_,V=()=>G?_:A.thumbsStorage.getCacheContext(B);_=yield V();let K=!1;if((null===(D=B.thumbs)||void 0===D?void 0:D.length)||e.pFlags.is_outgoing&&_.url&&"photo"===B.type){H.classList.add("document-with-thumb"),K=!0;const t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(B.type)&&_.url)z.innerHTML=``,t.push(z.firstElementChild);else{performance.now();const e=yield(0,S.Z)({photo:B,message:null,container:z,boxWidth:54,boxHeight:54,loadPromises:Z,withoutPreloader:!0,lazyLoadQueue:T,size:(0,f.Z)(B,54,54,!0),managers:A});z.style.width=z.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 j=document.createElement("span"),j.classList.add("document-ico-text"),j.innerText=U,z.append(j);const W=B.file_name?(0,g.Z)(B.file_name):"Unknown.file";document.createElement("div").classList.add("document-description");const $=document.createElement("span"),q=[(0,d.Z)(B.size)];if(t&&q.push((0,a.OD)(e.date)),M&&q.push(yield(0,C.Z)(e)),!t&&!M){const e=document.createElement("span"),t=(0,d.Z)(B.size);e.append(" / ",t),e.style.visibility="hidden",q.push(e)}H.innerHTML=`\n ${_.downloaded&&!N||!e.mid||!K?"":'
'}\n
\n
\n `;const Q=H.querySelector(".document-name"),Y=new y.I;Y.dataset.fontWeight=""+i,Y.dataset.fontSize=""+F,Y.dataset.sizeType=x,Y.textContent=W,e.mid||H.classList.add("downloaded"),Q.append(Y),M&&Q.append((0,E.Z)(e));const J=H.querySelector(".document-size");if($.append(...(0,p.A1)(q," · ")),J.append($),H.prepend(z),!N&&e.pFlags.is_outgoing&&!e.mid)return H;let X,ee=null;const te=()=>{if(H.classList.remove("downloading"),B.size>m.Iw&&!N)return ee.setManual(),ee.attach(X),ee.preloader.classList.add("manual"),void ee.setDownloadFunction(se);if(B.size<=m.Iw&&H.classList.add("downloaded"),X){if(X!==z){const e=X;setTimeout((()=>{e.remove()}),200)}X=null}ee&&(ee=null)},ie=e=>{H.classList.add("downloading");const t=document.createElement("span"),i=(0,d.Z)(B.size);t.style.position="absolute",t.style.left="0",e.then(te,l.Z).finally((()=>{$.style.visibility="",t.remove()}));const s=e=>(0,d.Z)(e);let n=s(0);$.style.visibility="hidden",t.append(n," / ",i),$.parentElement.append(t),e.addNotifyListener((e=>{const t=s(e.done);n.replaceWith(t),n=t}))},se=e=>{var t;const i=!e||e.isTrusted,n=H.doc;let a;const o=h.Z.chat.bubbles?h.Z.chat.bubbles.lazyLoadQueue.queueId:void 0;if(i)if("pdf"===n.type){const e=!ee||ee.detached;a=c.Z.downloadMediaURL({media:n,queueId:o}),e&&a.then((()=>{setTimeout((()=>L(this,void 0,void 0,(function*(){const e=(yield V()).url;window.open(e)}))),v.Z.settings.animationsEnabled?250:0)}))}else a=s.Z.has(n.mime_type)&&(null===(t=n.thumbs)||void 0===t?void 0:t.length)?c.Z.downloadMediaURL({media:n,queueId:o}):c.Z.downloadToDisc({media:n,queueId:o});else a=c.Z.downloadToDisc({media:n,queueId:o},!0);a.catch((()=>{H.classList.remove("downloading")})),X&&(ee.attach(X,!0,a),ie(a))},{fileName:ne}=(0,u.Z)({media:B,downloadId:"1"});if(yield A.apiFileManager.isDownloading(ne)){X=H.querySelector(".document-download")||z;const e=c.Z.downloadToDisc({media:B},!0);ee=new w.Z,ee.attach(X,!1,e),ee.setDownloadFunction(se),ie(e)}else if(!_.downloaded||N)if(X=H.querySelector(".document-download")||z,ee=new w.Z({isUpload:!!N}),N){const e=c.Z.getUpload(N);ee.attachPromise(e),ee.attach(X),ie(e)}else ee.construct(),ee.setManual(),ee.attach(X),ee.setDownloadFunction(se),void 0!==k&&k>=B.size&&(0,o.tH)(ee.preloader);return(0,o.fc)(H,(e=>{(0,r.Z)(e.target,"time")||(ee?ee.onClick(e):se(e))})),H}))}v.Z.addEventListener("document_downloading",(e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach((e=>{e.querySelector(".preloader-container.manual")&&(0,o.tH)(e)}))}))},8210:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6272);function n(e){return"+"+(0,s.u)(e).formatted}},177:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2575),n=i(2325),a=i(3512);function o(e,t=a.Z.managers){var i,o,r,d,l,c;return r=this,d=void 0,c=function*(){const a=yield t.appChatsManager.getChat(e);if("chatForbidden"===a._)return(0,n.ag)("YouWereKicked");const r=yield t.appProfileManager.getCachedFullChat(e);let d;d=r?"channelFull"===r._?r.participants_count:null===(i=r.participants.participants)||void 0===i?void 0:i.length:a.participants_count||(null===(o=a.participants)||void 0===o?void 0:o.participants.length),d=d||1;const l=a.pFlags.broadcast?"Peer.Status.Subscribers":"Peer.Status.Member";return(0,n.ag)(l,[(0,s.Z)(d)])},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(r,d||[])).next())}))}},493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(8456),n=i(5102),a=i(2325),o=i(8115),r=i(3512);function d(e){return t=this,i=void 0,l=function*(){const{peerId:t=r.Z.myId,plainText:i,onlyFirstName:d,limitSymbols:l,managers:c=r.Z.managers,threadId:h}=e;let u="";if(t.isUser()){const e=yield c.appUsersManager.getUser(t.toUserId());e&&(e.first_name&&(u+=e.first_name),!e.last_name||d&&u||(u+=" "+e.last_name)),u=u?u.trim():!e||e.pFlags.deleted?a.ZP.format(d?"Deleted":"HiddenName",!0):(0,n.Z)(e)[0]||""}else{if(h){const e=yield c.dialogsStorage.getForumTopic(t,h);u=(null==e?void 0:e.title)||""}if(!u){const e=yield c.appChatsManager.getChat(t.toChatId());u=(null==e?void 0:e.title)||""}d&&(u=u.split(" ")[0])}return void 0!==l&&(u=(0,s.Z)(u,l,l)),i?u:(0,o.Z)(u)},new((d=void 0)||(d=Promise))((function(e,s){function n(e){try{o(l.next(e))}catch(e){s(e)}}function a(e){try{o(l.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof d?i:new d((function(e){e(i)}))).then(n,a)}o((l=l.apply(t,i||[])).next())}));var t,i,d,l}},3061:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(632),n=i(2325),a=i(1507);function o(e){var t;if(!e)return document.createElement("span");let i,o;switch(e.id){case a.hj.toUserId():i="Peer.RepliesNotifications";break;case a.yF.toUserId():i="Peer.ServiceNotifications";break;default:if(e.pFlags.bot){i="Bot";break}if(e.pFlags.support){i="SupportStatus";break}switch(null===(t=e.status)||void 0===t?void 0:t._){case"userStatusRecently":i="Lately";break;case"userStatusLastWeek":i="WithinAWeek";break;case"userStatusLastMonth":i="WithinAMonth";break;case"userStatusOffline":{const t=e.status.was_online,n=new Date,a=(n.getTime()/1e3|0)-t;if(a<60)i="Peer.Status.justNow";else if(a<3600)i="Peer.Status.minAgo",o=[a/60|0];else if(a<86400&&n.getDate()===new Date(1e3*t).getDate())i="LastSeen.HoursAgo",o=[a/3600|0];else{i="Peer.Status.LastSeenAt";const{dateEl:e,timeEl:n}=(0,s.rz)(t);o=[e,n]}break}case"userStatusOnline":i="Online";break;default:i="ALongTimeAgo"}}return(0,n.ag)(i,o)}},6239:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(9345);function n(e){return t=this,i=void 0,a=function*(){try{return yield(0,s.Z)(e)}catch(t){return console.error("wrapMessageActionTextNewUnsafe error:",t),e.plain?"":document.createElement("span")}},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>F,e:()=>x});var s=i(1655),n=i(632),a=i(2614),o=i(130),r=i(8939),d=i(5180),l=i(2946),c=i(2325),h=i(1507),u=i(8115),f=i(2491),p=i(5400),m=i(3512),g=i(2064),v=i(5798);let b,y,w;const S=new Map;var C=i(9083),E=i(493),L=i(3591);function I(e){const t=e.action,{onclick:i,url:s}=(0,L.Z)(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!i)return document.createElement("span");const n=document.createElement("a");return n.href=s,n.setAttribute("onclick",i+"(this)"),n}var M=i(496),P=i(7362),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function k(e){return Z(this,void 0,void 0,(function*(){const t=yield(0,M.Z)(e);if(e.plain)return t;const i=document.createElement("i");return i.dataset.savedFrom=e.message.peerId+"_"+e.message.mid,i.dir="auto",i.append(t),i}))}function T(e,t){return t?e:(0,a.Z)((0,u.Z)(e))}function x(e){return Z(this,void 0,void 0,(function*(){const t=e.topic;let i=null==t?void 0:t.icon_emoji_id;return(null==t?void 0:t.id)===h.Ox&&(i="5390854796011906616"),i?e.plain?m.Z.managers.appEmojiManager.getCustomEmojiDocument(i).then((e=>e.stickerEmojiRaw)):(0,C.N)(Object.assign(Object.assign({},e),{docIds:[i]})).then((e=>(e.lastElementChild.classList.add("topic-icon"),e))):e.plain?"":function(e,t){if(!b){w=document.getElementById("svg-defs");const e="http://www.w3.org/2000/svg";b=document.createElementNS(e,"svg"),b.setAttributeNS(null,"width","26"),b.setAttributeNS(null,"height","26"),b.setAttributeNS(null,"viewBox","0 0 26 26"),b.classList.add("topic-icon-svg");const t=document.createElementNS(e,"use");t.setAttributeNS(null,"href","#topic-icon"),b.append(t),y=document.createElement("span"),y.classList.add("topic-icon","avatar-like");const i=document.createElement("span");i.classList.add("topic-icon-content"),y.append(b,i)}e||(console.error("NO TOPIC ICON COLOR!"),e=h.OS[0]),t||(console.error("NO TOPIC NAME!"),t="");const i=e.toString(16),s=`topic-icon-gradient-${e}`;let n=S.get(e);if(!n){const{h:t,s:a,l:o,a:r}=(0,g.cw)("#"+i);w.insertAdjacentHTML("beforeend",`\n \n \n \n \n `),S.set(e,n=`hsla(${t}, ${a}%, ${Math.max(0,o-40)}%, ${r})`)}const a=y.cloneNode(!0);return a.firstElementChild.style.fill=`url(#${s})`,a.firstElementChild.style.stroke=n,a.lastElementChild.append((0,v.Z)(t,!0)),a}(null==t?void 0:t.icon_color,null==t?void 0:t.title)}))}function A(e){const t=e.message.action;return x(Object.assign(Object.assign({},e),{topic:t}))}function _(e){return Z(this,void 0,void 0,(function*(){const t=e.message.action,i=document.createElement("span");return i.classList.add("topic-name"),i.append(yield A(e),T(t.title,e.plain)),i}))}function F(e){var t;return Z(this,void 0,void 0,(function*(){const{plain:i,message:h,middleware:u,lazyLoadQueue:g,customEmojiSize:v,animationGroup:b}=e,y=i?void 0:document.createElement("span"),w="action"in h&&h.action;if(w.message){const e=w.message;return i?(0,f.Z)(e):((0,o.Z)(y,(0,p.ZP)(e,{noLinebreaks:!0})),y)}{let o,u,f=w._;const g=m.Z.managers,v=(e,t)=>t?(0,E.Z)({peerId:e,plainText:t}):(0,P.Z)({peerId:e});switch(w._){case"messageActionPhoneCall":f+="."+w.type,u=[(0,r.Z)(w.duration,i)];break;case"messageActionGroupCall":f+="."+w.type,u=[],f.endsWith("You")||h.pFlags.post||u.push(v(h.fromId,i)),void 0!==w.duration?u.push((0,r.Z)(w.duration,i)):u.push(I(h));break;case"messageActionInviteToGroupCall":{const e=[h.fromId,w.users[0].toPeerId()];let t="Chat.Service.VoiceChatInvitation";const n=m.Z.myId;e[0]===n?t+="ByYou":e[1]===n&&(t+="ForYou"),(0,s.Z)(e,n),o=t,u=e.map((e=>v(e,i))),u.push(I(h));break}case"messageActionGroupCallScheduled":{const e=new Date,t=new Date(1e3*w.schedule_date),s=(t.getTime()-e.getTime())/864e5,a=new Date(e);a.setDate(a.getDate()+1);const r=yield g.appPeersManager.isBroadcast(h.peerId);o=r?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",u=[];const d=m.Z.myId;let l;h.fromId===d?o+="You":r||u.push(v(h.fromId,i));const f=[];s<1&&t.getDate()===e.getDate()?l="TodayAtFormattedWithToday":s<2&&t.getDate()===a.getDate()?l="Time.TomorrowAt":(l="formatDateAtTime",f.push(new c.ZP.IntlDateElement({date:t,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),f.push((0,n.mr)(t));const p=(0,c.ag)(l,f);u.push(p);break}case"messageActionChatCreate":{const e=m.Z.myId;h.fromId===e?f+="You":u=[v(h.fromId,i)];break}case"messageActionPinMessage":{const t=h.peerId,s=yield g.appMessagesManager.getMessageByPeer(t,h.reply_to_mid);u=[v(h.fromId,i)],s?u.push(k(Object.assign(Object.assign({},e),{message:s}))):(o="ActionPinnedNoText",h.reply_to_mid&&g.appMessagesManager.fetchMessageReplyTo(h));break}case"messageActionChatJoinedByRequest":{const e=yield g.appPeersManager.isBroadcast(h.peerId);h.pFlags.out?o=e?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(o=e?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",u=[v(h.fromId,i)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":u=[v(h.fromId,i)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":u=[],"messageActionChatEditTitle"===w._&&u.push(v(h.fromId,i)),u.push(T(w.title));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const e=w.users||[w.user_id];if(u=[v(h.fromId,i)],e.length>1){const t=(0,c.v_)(yield Promise.all(e.map((e=>v(e.toPeerId(),i)))),!1,i);if(i)u.push(...t);else{const e=document.createElement("span");e.append(...t),u.push(e)}}else u.push(v(e[0].toPeerId(),i));break}case"messageActionBotAllowed":{const e=(0,p.ZP)(w.domain,{entities:[{_:"messageEntityUrl",length:w.domain.length,offset:0}]});u=[(0,a.Z)(e)];break}case"messageActionPaymentSent":{const s=w.pFlags.recurring_init,n=w.pFlags.recurring_used;if(o=n?"Chat.Service.PaymentSentRecurringUsedNoTitle":s?"Chat.Service.PaymentSentRecurringInitNoTitle":"Chat.Service.PaymentSent1NoTitle",u=[(0,d.Z)(w.total_amount,w.currency),v(h.peerId,i)],h.reply_to_mid){const i=yield g.appMessagesManager.getMessageByPeer((null===(t=h.reply_to)||void 0===t?void 0:t.reply_to_peer_id)?(0,l.Z)(h.reply_to.reply_to_peer_id):h.peerId,h.reply_to_mid);i?(o=n?"Chat.Service.PaymentSentRecurringUsed":s?"Chat.Service.PaymentSentRecurringInit":"Chat.Service.PaymentSent1",u.push(k(Object.assign(Object.assign({},e),{message:i})).then((e=>(e instanceof HTMLElement&&e.classList.add("is-receipt-link"),e))))):g.appMessagesManager.fetchMessageReplyTo(h)}break}case"messageActionSetMessagesTTL":{u=[];const e=yield g.appPeersManager.isBroadcast(h.peerId);if(w.period){let t;if(e?o="ActionTTLChannelChanged":h.fromId===m.Z.myId?o="ActionTTLYouChanged":(o="ActionTTLChanged",u.push(v(h.fromId,i))),w.period>1814400){let e;const s=[],a=31536e3;w.period>=a?(e="Years",s.push(w.period/a|0)):(e="Months",s.push(w.period/(30*n.s2)|0)),t=i?c.ZP.format(e,!0,s):(0,c.ag)(e,s)}else t=(0,r.Z)(w.period,i);u.push(t)}else e?o="ActionTTLChannelDisabled":h.fromId===m.Z.myId?o="ActionTTLYouDisabled":(o="ActionTTLDisabled",u.push(v(h.fromId,i)));break}case"messageActionTopicEdit":{let t,s,n;const a=!!h.pFlags.out,r=void 0!==w.icon_emoji_id,d=r&&!+w.icon_emoji_id,l=void 0!==w.title,c=void 0!==w.hidden;a||(n=v(h.fromId,i)),l&&(s=T(w.title)),r&&!d&&(t=A(e)),u=n?[n]:[],w.closed?o=a?"Chat.Service.Group.TopicEdited.You.Paused":"Chat.Service.Group.TopicEdited.Paused":!1===w.closed?o=a?"Chat.Service.Group.TopicEdited.You.Resumed":"Chat.Service.Group.TopicEdited.Resumed":d&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed.IconRemoved":"Chat.Service.TopicEdited.Mixed.IconRemoved",u.push(s)):r&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed":"Chat.Service.TopicEdited.Mixed",u.push(_(e))):d?o=a?"Chat.Service.Group.TopicEdited.You.Icon.Removed":"Chat.Service.Group.TopicEdited.Icon.Removed":l?(o=a?"Chat.Service.Group.TopicEdited.You.Title":"Chat.Service.Group.TopicEdited.Title",u.push(s)):r?(o=a?"Chat.Service.Group.TopicEdited.You.Icon":"Chat.Service.Group.TopicEdited.Icon",u.push(t)):c&&(o=a?w.hidden?"Chat.Service.Group.TopicEdited.You.Hided":"Chat.Service.Group.TopicEdited.You.Unhided":w.hidden?"Chat.Service.Group.TopicEdited.Hided":"Chat.Service.Group.TopicEdited.Unhided");break}case"messageActionTopicCreate":u=[_(e)],o="TopicWasCreatedAction";break;default:o=c.Hz[f]||`[${w._}]`}o||(o=c.Hz[f],void 0===o&&(o="["+f+"]"));const b=u&&(yield Promise.all(u));return i?c.ZP.format(o,!0,b):(0,c.$d)(y,o,b)}}))}},496:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(8938),n=i(5705),a=i(677),o=i(3738),r=i(8456),d=i(5381),l=i(2325),c=i(1346),h=i(8115),u=i(2491),f=i(5400),p=i(3512),m=i(6239);function g(e){var t,i,g,v,b,y;return g=this,v=void 0,y=function*(){let{message:g,text:v,usingMids:b,plain:y,highlightWord:w,withoutMediaType:S}=e;null!=v||(v=g.message);const C=[];let E=!1;const L=(e,t)=>{if(e){if(void 0===t&&E)return;t=y?l.ZP.format(e,!0):(0,l.ag)(e)}if(y)C.push(t);else{const e=document.createElement("span");"string"==typeof t?e.innerHTML=t:e.append(t),C.push(e)}},I=p.Z.managers.appMessagesManager,M=(0,d.Z)(g);let P=null!==(t=g.totalEntities)&&void 0!==t?t:g.entities;if(g.media&&!M){(0,s.Z)(g);let e=!0;if(g.grouped_id){if(b){const t=yield I.getMidsByMessage(g);if(b.length===t.length){for(const i of t)if(!b.includes(i)){e=!1;break}}else e=!1}if(e){const e=yield I.getAlbumText(g.grouped_id);v=(null==e?void 0:e.message)||"",P=(null==e?void 0:e.totalEntities)||[],S||(L("AttachAlbum"),E=!0)}}else e=!1;if(!e&&!S||!v){const e=g.media;switch(e._){case"messageMediaPhoto":L("AttachPhoto");break;case"messageMediaDice":L(void 0,y?e.emoticon:(0,h.Z)(e.emoticon));break;case"messageMediaVenue":v=e.title,L("AttachLocation");break;case"messageMediaGeo":L("AttachLocation");break;case"messageMediaGeoLive":L("AttachLiveLocation");break;case"messageMediaPoll":const t="📊 "+(e.poll.question||"poll");L(void 0,y?t:(0,h.Z)(t));break;case"messageMediaContact":L("AttachContact");break;case"messageMediaGame":{const t="🎮 "+e.game.title;L(void 0,y?t:(0,h.Z)(t));break}case"messageMediaDocument":{const t=e.document;if("video"===t.type)L("AttachVideo");else if("voice"===t.type)L("AttachAudio");else if("gif"===t.type)L("AttachGif");else if("round"===t.type)L("AttachRound");else if("sticker"===t.type){const e=C.length;if(t.stickerEmojiRaw){const e=t.stickerEmojiRaw+" ";L(void 0,y?e:(0,h.Z)(e))}L("AttachSticker");const i=C.splice(e,2);if(y)C.push(i[0]+(i[1]?i[1]:""));else{const e=window.document.createElement("span");e.append(...i),C.push(e)}v=""}else if("audio"===t.type){const e=t.attributes.find((e=>"documentAttributeAudio"===e._&&(e.title||e.performer))),i="🎵 "+(e?[e.title,e.performer].filter(Boolean).join(" - "):t.file_name);L(void 0,y?i:(0,h.Z)(i))}else L(void 0,y?t.file_name:(0,h.Z)(t.file_name));break}case"messageMediaInvoice":"messageExtendedMediaPreview"===(null===(i=e.extended_media)||void 0===i?void 0:i._)?L(void 0,y?e.description:(0,h.Z)(e.description)):L(void 0,y?e.title:(0,h.Z)(e.title));break;case"messageMediaUnsupported":L(l.nK)}}const t=C.length;for(let e=1;e{"use strict";i.d(t,{Z:()=>n});var s=i(8842);function n(e){return t=this,i=void 0,a=function*(){const t=new s.Z;return yield t.update(e),t.element},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9492:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(2830),n=i(4755),a=i(3512),o=i(3442),r=i(6705),d=i(8580),l=i(1713),c=i(7030),h=i(2312),u=i(3114),f=i(7660),p=i(319),m=i(1507),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function v({photo:e,message:t,container:i,boxWidth:b,boxHeight:y,withTail:w,isOut:S,lazyLoadQueue:C,middleware:E,size:L,withoutPreloader:I,loadPromises:M,autoDownloadSize:P,noBlur:Z,noThumb:k,noFadeIn:T,blurAfter:x,managers:A=a.Z.managers,processUrl:_}){return g(this,void 0,void 0,(function*(){const F={loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null},D="document"===e._,R=D&&e.mime_type.startsWith("image/")&&!L,B=(0,u.Z)(e);if(!(e.sizes||e.thumbs||B||R))return b&&y&&!L&&D&&(0,l.Z)(e,i,b,y,void 0,t),F;let N=0===P;L||(void 0===b&&(b=n.Z.active.regular.width),void 0===y&&(y=n.Z.active.regular.height)),i.classList.add("media-container");let O,U,H,z=i,j=!0,G=Promise.resolve();if(b&&y&&!L){const s=(0,l.Z)(e,i,b,y,void 0,t,void 0,R?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:m.Pt}:void 0);if(L=s.photoSize,j=s.isFit,U=yield A.thumbsStorage.getCacheContext(e,L.type),!j&&!B){z=document.createElement("div"),z.classList.add("media-container-aspecter"),z.style.width=s.size.width+"px",z.style.height=s.size.height+"px";const n=(0,d.Z)(e,U,!Z,!0);if(n){G=n.loadPromise;const e=n.image;e.classList.add("media-photo"),i.append(e)}else(yield v({container:i,message:t,photo:e,boxWidth:0,boxHeight:0,size:L,lazyLoadQueue:C,isOut:S,loadPromises:M,middleware:E,withoutPreloader:I,withTail:w,autoDownloadSize:P,noBlur:Z,noThumb:!0,blurAfter:!0,managers:A})).images.full.classList.add("media-photo","thumbnail");i.classList.add("media-container-fitted"),i.append(z)}}else L||(L=(0,c.Z)(e,b,y,!0)),U=yield A.thumbsStorage.getCacheContext(e,null==L?void 0:L.type);if(!k&&!B){const t=(0,d.Z)(e,U,!Z);t&&(G=Promise.all([G,t.loadPromise]),F.loadPromises.thumb=F.loadPromises.full=G,O=F.images.thumb=t.image,O.classList.add("media-photo"),z.append(O))}if(F.aspecter=z,"photoSizeEmpty"===(null==L?void 0:L._)&&D||(null==L?void 0:L.bytes))return F;"videoSize"===(null==L?void 0:L._)?(H=F.images.full=(0,f.Z)(),H.autoplay=!0,H.loop=!0,H.muted=!0,H.classList.add("media-photo")):(H=F.images.full=new Image,H.classList.add("media-photo"));const V=(O||!U.downloaded)&&a.Z.settings.animationsEnabled&&!T;let K;const W=null==t?void 0:t.uploadingFileName;I||(U.downloaded&&!W||(K=new o.Z({attachMethod:"prepend",isUpload:!!W})),W&&(K.attachPromise(h.Z.getUpload(W)),K.attach(i),N=void 0));const $=e=>(0,s.Z)(i,H,e,V,z,O),q=e=>g(this,void 0,void 0,(function*(){if(!E||E()){if(_&&(e=yield _(e)),x){const t=(0,r.Z)(e,12);return t.promise.then((()=>$(t.canvas.toDataURL())))}return $(e)}}));let Q;const Y=L.w>=150&&L.h>=150||N,J=()=>g(this,void 0,void 0,(function*(){N&&!I&&K&&(K.construct(),K.setManual());const t=(()=>{const t=R&&!L;return h.Z.downloadMediaURL({media:e,thumb:L,queueId:null==C?void 0:C.queueId,onlyCache:t?void 0:N})})(),s=yield A.thumbsStorage.getCacheContext(e,null==L?void 0:L.type);K&&!s.downloaded&&!I&&Y&&K.attach(i,!1,t),N=void 0;const n=t.then(q);return n.catch(p.Z),{download:t,render:n}}));return K&&K.setDownloadFunction(J),U.downloaded?G=Q=(yield J()).render:C?C.push({div:i,load:()=>J().then((({download:e})=>e))}):Q=(yield J()).render,M&&G&&M.push(G),yield G,F.loadPromises.thumb=G,F.loadPromises.full=Q||Promise.resolve(),F.preloader=K,F}))}},5671:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2291),n=i(2325),a=i(3512),o=i(7362);function r(e){return t=this,i=void 0,d=function*(){const t=document.createElement("span");t.classList.add("sender-title");const i=e.fromId===a.Z.myId&&e.peerId!==a.Z.myId;if(t.append(i?(0,n.ag)("FromYou"):yield(0,o.Z)(Object.assign(Object.assign({},(0,s.Z)(e)),{dialog:e.peerId===a.Z.myId}))),(yield a.Z.managers.appPeersManager.isAnyGroup(e.peerId))||i){const i=yield(0,o.Z)({peerId:e.peerId});t.append(" ➝ ",i)}return t},new((r=void 0)||(r=Promise))((function(e,s){function n(e){try{o(d.next(e))}catch(e){s(e)}}function a(e){try{o(d.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r((function(e){e(i)}))).then(n,a)}o((d=d.apply(t,i||[])).next())}));var t,i,r,d}},1604:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(632);function n(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append((0,s.zM)(new Date(1e3*e.date))),t}},3541:(e,t,i)=>{"use strict";i.d(t,{Vp:()=>F,ZP:()=>B,_2:()=>N,_i:()=>R});var s=i(5269),n=i(3725),a=i(3910),o=i(2738),r=i(7660),d=i(8497),l=i(6740),c=i(1046),h=i(1185),u=i(5471),f=i(9405),p=i(4755),m=i(925),g=i(3174),v=i(6724),b=i(9674),y=i(2312),w=i(9355),S=i(2790),C=i(7030),E=i(13),L=i(1447),I=i(3512),M=i(7730),P=i(671),Z=i(5814),k=i(6787),T=i(2796),x=i(6775),A=i(645),_=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const F=1.49,D={},R={};function B({doc:e,div:t,middleware:i,loadStickerMiddleware:d,lazyLoadQueue:m,exportLoad:v,group:w,play:S,onlyThumb:B,emoji:N,width:O,height:U,withThumb:H,loop:z,loadPromises:j,needFadeIn:G,needUpscale:V,skipRatio:K,static:W,managers:$=I.Z.managers,fullThumb:q,isOut:Q,noPremium:Y,withLock:J,relativeEffect:X,loopEffect:ee,isCustomEmoji:te,syncedVideo:ie}){var se;return _(this,void 0,void 0,(function*(){t=Array.isArray(t)?t:[t],te&&(N=e.stickerEmojiRaw);const ne=e.sticker;if(1===ne&&(W=!0),!O&&!U){const t=p.Z.active,i=N?t.emojiSticker:e.animated?t.animatedSticker:t.staticSticker,s=(0,f.C)(e.w,e.h).aspectFitted(i);O=s.width,U=s.height}let ae;2===ne&&L.Z.loadLottieWorkers(),t.forEach((t=>{t.dataset.docId=""+e.id,N&&(t.dataset.stickerEmoji=N),t.classList.add("media-sticker-wrapper")}));const oe=(t=(null==ae?void 0:ae.type))=>_(this,void 0,void 0,(function*(){return ae=yield $.thumbsStorage.getCacheContext(e,t)})),re=!W&&(2===ne||3===ne),de=(0,E.Z)(e);void 0!==Q&&de&&!Q&&t.forEach((e=>e.classList.add("reflect-x")));const le=de&&J;if(le){const i=D[e.id];t.forEach((e=>{e.classList.add("is-premium-sticker","tgico-premium_lock"),i&&e.style.setProperty("--lock-url",`url(${i})`)}))}if(W&&1!==ne){const t=(0,C.Z)(e,O,U,!1);yield oe(t.type)}else yield oe(null==q?void 0:q.type);const ce=N&&!te?(0,P.tB)(N):-1,he=ae.downloaded&&!G,ue=re,fe=2===ne||3===ne?yield $.appDocsManager.getLottieCachedThumb(e.id,ce):void 0,pe={render:void 0,load:void 0};let me=(0,n.Z)(),ge=!1;if(((null===(se=e.thumbs)||void 0===se?void 0:se.length)||fe)&&!t[0].firstElementChild&&(!he||ue||B)&&!1!==H){let n=fe||e.thumbs[0];const a=(e,t)=>{e.childElementCount?me.resolve():(t.classList.add("media-sticker","thumbnail"),b.Z.mutateElement(e,(()=>{e.append(t),me.resolve()})))};if("url"in n)ge=!0,t.forEach((e=>{const t=new Image;(0,l.ZP)(t,n.url,(()=>a(e,t)))}));else if("bytes"in n){if("photoPathSize"===n._){n.bytes.length||(n=e.thumbs.find((e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length}))||n);const i=function(e){let t="M";for(let i=0,s=e.length;i=192?t+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[s-128-64]:(s>=128?t+=",":s>=64&&(t+="-"),t+=""+(63&s))}return t+="z",t}(n.bytes),s="http://www.w3.org/2000/svg",a=document.createElementNS(s,"svg");a.classList.add("rlottie-vector","media-sticker","thumbnail"),a.setAttributeNS(null,"viewBox",`0 0 ${e.w||512} ${e.h||512}`);const o=document.createElementNS(s,"path");o.setAttributeNS(null,"d",i),I.Z.settings.animationsEnabled&&!te&&o.setAttributeNS(null,"fill","url(#g)"),a.append(o),t.forEach(((e,t)=>e.append(t>0?a.cloneNode(!0):a))),ge=!0,me.resolve()}else if(ce<=0){const o=()=>{t.forEach((t=>{const i=new Image,s=(0,h.Z)(e,n,!0);(0,l.ZP)(i,s,(()=>a(t,i)))}))};s.Z||e.pFlags.stickerThumbConverted||ae.url?(ge=!0,o()):(ge=!0,M.Z.convert("main-"+e.id,n.bytes).then((s=>{$.appDocsManager.saveWebPConvertedStrippedThumb(e.id,s),n.bytes=s,e.pFlags.stickerThumbConverted=!0,i&&!i()||t[0].childElementCount?me.resolve():o()})).catch((()=>me.resolve())))}}else if((2===ne&&ce<=0||3===ne)&&(H||B)){const s=()=>_(this,void 0,void 0,(function*(){if(t[0].childElementCount||i&&!i())return void me.resolve();const s=(e,t,s)=>{e.childElementCount||i&&!i()?me.resolve():s?(0,l.ZP)(t,s,(()=>a(e,t))):a(e,t)};yield oe(),t.forEach((t=>{if(ae.url)s(t,new Image,ae.url);else if("bytes"in n){const i=(0,c.Z)(e,n,!0);i.loadPromise.then((()=>s(t,i.image,"")))}else y.Z.downloadMediaURL({media:e,thumb:n}).then((e=>_(this,void 0,void 0,(function*(){return s(t,new Image,e)}))))}))}));if(m&&B)return m.push({div:t[0],load:s}),me.resolve(),pe;s(),n.url&&(ge=!0)}}if(j&&ge&&j.push(me),B)return pe;const ve=(0,u.Z)("MIDDLEWARE"),be=()=>_(this,void 0,void 0,(function*(){if(i&&!i())throw ve;if(2===ne&&!W)return y.Z.downloadMedia({media:e,queueId:null==m?void 0:m.queueId,thumb:q}).then((s=>_(this,void 0,void 0,(function*(){if(i&&!i())throw ve;const n=yield L.Z.loadAnimationWorker({container:t[0],loop:!(N&&!te)&&z,autoplay:S,animationData:s,width:O,height:U,name:"doc"+e.id,needUpscale:V,skipRatio:K,toneIndex:ce,sync:te},w,null!=d?d:i),a=le?()=>{var i,s;const a=null!==(i=D[s=e.id])&&void 0!==i?i:D[s]=function(e){var t;const i=e.getContext("2d"),s=20*(null!==(t=e.dpr)&&void 0!==t?t:1),n=s,a=s,o=(e.width-n)/2,r=e.height-a-0,d=i.getImageData(o,r,n,a).data;let l=0,c=0,h=0,u=0;for(let e=0;ee.style.setProperty("--lock-url",`url(${a})`)))}:void 0;return n.addEventListener("firstFrame",(()=>{const i=n.canvas[0];(!1!==H||te)&&(0,g.O)(e,i,ce),le&&a(),te||t.forEach(((e,t)=>{((e,t)=>{const i=e.firstElementChild;!1!==G&&(G=(G||!i||"svg"===i.tagName)&&I.Z.settings.animationsEnabled);const s=()=>{i&&i!==t&&"DIV"!==i.tagName&&i.remove()};G?b.Z.mutate((()=>{t&&t.classList.add("fade-in"),i&&i.classList.add("fade-out"),(t||i).addEventListener("animationend",(()=>{b.Z.mutate((()=>{t&&t.classList.remove("fade-in"),s()}))}),{once:!0})})):i&&b.Z.mutate(s)})(e,n.canvas[t])}))}),{once:!0}),N&&$.appStickersManager.preloadAnimatedEmojiStickerAnimation(N),n}))));if(W||3===ne){const s=re&&ie,n=s?A.Z.generateName(""+e.id,0,0,void 0,void 0):void 0,a=R[n];if(a)return a;const o=(s?t.slice(0,1):t).map((()=>{let e;if(W)e=new Image;else{const t=e=(0,r.Z)();if(t.muted=!0,S&&(t.autoplay=!0),z&&(t.loop=!0),z&&"number"==typeof z){let i=0,s=0;function n(){i>this.currentTime&&++s===z&&(this.autoplay=!1,this.loop=!1,this.pause(),t.removeEventListener("timeupdate",n)),i=this.currentTime}t.addEventListener("timeupdate",n)}}return e.classList.add("media-sticker"),e})),c=t.map(((e,t)=>e.firstElementChild!==o[t]&&e.firstElementChild));!1!==G&&(G=(G||!he||(W?c[0]:!c[0]||"svg"===c[0].tagName))&&I.Z.settings.animationsEnabled),G&&o.forEach((e=>e.classList.add("fade-in")));const h=new Promise(((n,a)=>_(this,void 0,void 0,(function*(){const r=()=>_(this,void 0,void 0,(function*(){if(i&&!i())return void a(ve);const r=o.length,d=[];let h;yield oe(),t.forEach(((t,u)=>{const f=o[u];f&&(h=(0,l.cj)(f,ae.url)),h.then((()=>((t,o,l)=>{b.Z.mutateElement(t,(()=>{if(!i||i())if(o){if(o){const t=O*window.devicePixelRatio,i=U*window.devicePixelRatio;if(!(0,g.k)(e,ce,t,i)){const s=document.createElement("canvas");s.width=t,s.height=i,s.getContext("2d").drawImage(o,0,0,s.width,s.height),(0,g.O)(e,s,ce)}}s?n(o):(t.append(o),G?(l&&l.classList.add("fade-out"),o.addEventListener("animationend",(()=>{o.classList.remove("fade-in"),null==l||l.remove()}),{once:!0})):null==l||l.remove(),re&&Z.Z.addAnimation(o,w),d.push(o)===r&&n(d))}else s&&re||null==l||l.remove();else a(ve)}))})(t,f,c[u])))}))}));if(yield oe(),ae.url)r();else{let t;if(1!==ne&&W){const i=(0,C.Z)(e,O,U,!1);t=y.Z.downloadMediaURL({media:e,thumb:i,queueId:null==m?void 0:m.queueId})}else t=y.Z.downloadMediaURL({media:e,queueId:null==m?void 0:m.queueId});t.then(r,a)}}))));return n&&(R[n]=h,d&&h.finally((()=>{d()||delete R[n]}))),h}}));if(v&&(1===v&&(!he||re)||2===v))return pe.load=be,pe;const ye=!m||he&&!re?be():(m.push({div:t[0],load:be}),Promise.resolve());return he&&W&&(me=ye,j&&j.push(me)),2===ne&&de&&void 0!==Q&&!Y&&function({container:e,doc:t,managers:i,middleware:s,isOut:n,width:r,loadPromise:d,relativeEffect:l,loopEffect:c}){i.appStickersManager.preloadSticker(t.id,!0);let h=!1;(0,o.fc)(e,(i=>_(this,void 0,void 0,(function*(){if((0,a.Z)(i),h){const e=document.createElement("a");return e.onclick=()=>{(0,T.PE)(),new k.Z(t.stickerSetInput).show()},void(0,T.bC)({langPackKey:"Sticker.Premium.Click.Info",langPackArguments:[e]})}h=!0,yield d;const{animationDiv:o,stickerPromise:u}=(0,x.Z)({doc:t,middleware:s,side:n?"right":"left",size:r*F,target:e,play:!0,fullThumb:(0,E.Z)(t),relativeEffect:l,loopEffect:c});void 0===n||n||o.classList.add("reflect-x"),u.then((e=>{e.addEventListener("destroy",(()=>{h=!1}))}))}))))}({container:t[0],doc:e,managers:$,middleware:i,isOut:Q,width:O,loadPromise:ye,relativeEffect:X,loopEffect:ee}),pe.render=ye,pe}))}function N({event:e,container:t,managers:i,peerId:s,middleware:n}){var o,r;return _(this,void 0,void 0,(function*(){(0,a.Z)(e);const l=(0,d.Z)(t,"bubble"),c=t.dataset.stickerEmoji,h=t.classList.contains("custom-emoji")?void 0:L.Z.getAnimation(t);if(null==h?void 0:h.paused){const e=yield i.appStickersManager.getAnimatedEmojiSoundDocument(c);if(e){const i=document.createElement("audio");i.style.display="none",t.parentElement.append(i);try{const t=yield y.Z.downloadMediaURL({media:e});i.src=t,i.play(),yield(0,m.Z)(i,void 0,!0),i.addEventListener("ended",(()=>{i.src="",i.remove()}),{once:!0})}catch(e){}}h.autoplay=!0,h.restart()}if(!s.isUser())return;const u=yield i.appStickersManager.getAnimatedEmojiSticker(c,!0);if(!u)return;const f=null!==(o=(r=t).emojiData)&&void 0!==o?o:r.emojiData={a:[],v:1},p=t.sendInteractionThrottled=(0,v.Z)((()=>{if(!f.a.length)return;const e=f.a[0].t;f.a.forEach((t=>{t.t=(t.t-e)/1e3}));const s=(0,d.Z)(t,"bubble");i.appMessagesManager.setTyping(w.Z.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:(0,S.Z)(+s.dataset.mid),emoticon:c,interaction:{_:"dataJSON",data:JSON.stringify(f)}},!0,w.Z.chat.threadId),f.a.length=0}),1e3,!1),g=l?l.classList.contains("is-out"):void 0,{animationDiv:b}=(0,x.Z)({doc:u,middleware:n,side:g?"right":"left",size:360,target:t,play:!0,withRandomOffset:!0});void 0===g||g||b.classList.add("reflect-x"),e.isTrusted&&(f.a.push({i:1,t:Date.now()}),p())}))}},6775:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u});var s=i(2131),n=i(8938),a=i(8487),o=i(5471),r=i(3624),d=i(9966),l=i(241),c=i(9355),h=i(3541);function u({size:e,doc:t,middleware:i,target:u,side:f,skipRatio:p,play:m,managers:g,fullThumb:v,withRandomOffset:b,relativeEffect:y,loopEffect:w}){var S;const C=document.createElement("div");let E;C.classList.add("emoji-animation"),C.style.width=e+"px",C.style.height=e+"px";const L=()=>{I.clean(),null==E||E.remove(),C.remove(),c.Z.chat.bubbles.scrollable.container.removeEventListener("scroll",x)},I=null!==(S=null==i?void 0:i.create())&&void 0!==S?S:(0,r.k)();i=I.get();const M=(0,h.ZP)({div:C,doc:t,middleware:i,withThumb:!1,needFadeIn:!1,loop:!!w,width:e,height:e,play:m,group:"none",skipRatio:p,managers:g,fullThumb:v}).then((({render:e})=>e)).then((e=>{if((0,n.Z)(e),!i())throw e.remove(),(0,o.Z)("MIDDLEWARE");return E=e,E.addEventListener("enterFrame",(e=>{(w||e!==E.maxFrame)&&(0,a.Z)(u)||L()})),s.Z&&E.addEventListener("firstFrame",(()=>{navigator.vibrate(100)}),{once:!0}),E})),P=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},Z=b?P(16):0,k=b?P(4):0,T=()=>{if(!(0,a.Z)(u))return void L();const t=u.getBoundingClientRect(),i=t.width/200,s="center"===f?0:16*("right"===f?1:-1)*i,n="center"===f?0:0*i,o="right"===f?t.right:t.left,r=t.top,d=("center"===f?(t.width-e)/2:"right"===f?-e:0)+s+Z,c=(t.height-e)/2+n+k,h=o+d,p=r+c;p<=-e||p>=l.Z.height?L():y?("center"!==f?C.style[f]=-1*Math.abs(s)+"px":C.style.left=d+"px",C.style.top=c+"px"):(C.style.top=p+"px",C.style.left=h+"px")},x=(0,d.Z)(T);return c.Z.chat.bubbles.scrollable.container.addEventListener("scroll",x),T(),y?(C.classList.add("is-relative"),u.parentElement.append(C)):c.Z.emojiAnimationContainer.append(C),{animationDiv:C,stickerPromise:M}}},5772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(3541);function a({emoji:e,div:t,width:i,height:a,managers:o=s.Z.managers}){return r=this,d=void 0,c=function*(){const s=yield o.appStickersManager.getAnimatedEmojiSticker(e);if(!s)throw t.classList.add("media-sticker-wrapper"),new Error("no sticker");return(0,n.ZP)({doc:s,div:t,emoji:e,width:i,height:a,loop:!1,play:!0})},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(r,d||[])).next())}));var r,d,l,c}},1273:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(7660),n=i(6740),a=i(2312),o=i(1447),r=i(3512),d=i(5814),l=i(3541),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({set:e,lazyLoadQueue:t,container:i,group:h,autoplay:u,width:f,height:p,managers:m=r.Z.managers}){var g;return c(this,void 0,void 0,(function*(){if(null===(g=e.thumbs)||void 0===g?void 0:g.length)return i.classList.add("media-sticker-wrapper"),void t.push({div:i,load:()=>c(this,void 0,void 0,(function*(){const t=yield m.appStickersManager.getStickerSetThumbDownloadOptions(e),r=a.Z.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return r.then((t=>{o.Z.loadAnimationWorker({container:i,loop:!0,autoplay:u,animationData:t,width:f,height:p,needUpscale:!0,name:"setThumb"+e.id},h)}));{let t;return e.pFlags.videos?(t=(0,s.Z)(),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),r.then((s=>{(0,n.ZP)(t,URL.createObjectURL(s),(()=>{i.append(t),e.pFlags.videos&&d.Z.addAnimation(t,h)}))}))}}))});let r;r=e.thumb_document_id?m.appEmojiManager.getCustomEmojiDocument(e.thumb_document_id):m.appStickersManager.getStickerSet(e).then((e=>e.documents[0]));const v=yield r;"documentEmpty"!==v._&&(0,l.ZP)({doc:v,div:i,group:h,lazyLoadQueue:t,managers:m,width:f,height:p})}))}},62:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3541);function n({doc:e,row:t,size:i,managers:n}){const a=t.media,o=t.createMedia("small");a&&o.classList.add("hide");const r=a?[]:void 0,d="small"===i?32:48,l=(0,s.ZP)({div:o,doc:e,width:d,height:d,loadPromises:r,managers:n}).then((({render:e})=>e));return r&&Promise.all(r).then((()=>{o.classList.remove("hide"),a.remove()})),l}},9102:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2790),n=i(4497),a=i(7362);function o(e){return t=this,i=void 0,r=function*(){const{peerId:t,threadId:i,lastMsgId:o}=e,r=Promise.resolve(),d=(0,n.Z)("t.me/c/"+t.toChatId()+(i?"/"+(0,s.Z)(i):"")+(o?"/"+(0,s.Z)(o):""));return d.classList.add("topic-name","topic-name-button"),d.append(yield(0,a.Z)(e)),{cached:!0,element:d,loadPromise:r}},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r}},2887:(e,t,i)=>{"use strict";i.d(t,{Z:()=>x});var s=i(4762),n=i(5296),a=i(3725),o=i(3910),r=i(2738),d=i(7660),l=i(8487),c=i(6740),h=i(8580),u=i(5471),f=i(4755),p=i(319),m=i(925),g=i(3035),v=i(6724),b=i(9674),y=i(5157),w=i(2312),S=i(9355),C=i(1507),E=i(3512),L=i(5814),I=i(3013),M=i(8448),P=i(3442),Z=i(9492),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let T=0;function x({doc:e,container:t,message:i,boxWidth:x,boxHeight:A,withTail:_,isOut:F,middleware:D,lazyLoadQueue:R,noInfo:B,group:N,onlyPreview:O,noPreview:U,withoutPreloader:H,loadPromises:z,noPlayButton:j,photoSize:G,videoSize:V,searchContext:K,autoDownload:W,managers:$=E.Z.managers,noAutoplayAttribute:q}){var Q;return k(this,void 0,void 0,(function*(){const Y=null==W?void 0:W.video;let J=0===Y;const X=!(x&&A),ee=("video"!==e.type||e.size<=52428800&&!X)&&("gif"===e.type?E.Z.settings.autoPlay.gifs:E.Z.settings.autoPlay.videos);let te,ie;if(!B){te=document.createElement("span"),te.classList.add("video-time"),t.append(te);let i=!1;"gif"!==e.type?(te.innerText=(0,y.Z)(e.duration,!1),j||"round"===e.type||(ee&&!J?te.classList.add("tgico","can-autoplay"):i=!0)):(te.innerText="GIF",ee||j||(i=!0,J=void 0)),i&&(ie=document.createElement("span"),ie.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(ie))}const se={};if("image/gif"===e.mime_type){const s=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:H,loadPromises:z,autoDownloadSize:Y,size:G,managers:$});return se.thumb=s,se.loadPromise=s.loadPromises.full,se}let ne;const ae=(0,d.Z)();if(ae.classList.add("media-video"),ae.muted=!0,"round"===e.type){const s=document.createElement("div");s.classList.add("media-round","z-depth-1"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,s.message=i;const a=f.Z.active.round,d=a.width/2,c=3.5,h=d-2*c;s.innerHTML=`\n \n `;const u=s.firstElementChild.firstElementChild;T||(T=2*Math.PI*h),u.style.strokeDasharray=T+" "+T,u.style.strokeDashoffset=""+T,te.classList.add("tgico"),i.pFlags.media_unread&&s.classList.add("is-unread");const p=document.createElement("canvas");p.width=p.height=e.w,s.prepend(p,te),s.append(ae),t.append(s);const m=p.getContext("2d"),b=()=>{const e=s.message,t=I.Z.addMedia(e,!J),i=()=>{(S.Z.chat.setPeerPromise||Promise.resolve()).finally((()=>{(0,l.Z)(t)||(t.removeEventListener("play",h),t.removeEventListener("timeupdate",c),t.removeEventListener("pause",f),t.removeEventListener("ended",b))}))},a=()=>{m.drawImage(t,0,0);const e=T-t.currentTime/t.duration*T;return u.style.strokeDashoffset=""+e,!t.paused},d=()=>{t.duration&&((0,l.Z)(t)?(t.paused&&a(),te.innerText=(0,y.Z)(t.duration-t.currentTime,!1)):i())},c=(0,v.Z)((()=>{(0,g.T2)(d)}),1e3,!1),h=()=>{ae.classList.add("hide"),s.classList.remove("is-paused"),(0,n.cK)(a,p),ne&&ne.preloader&&ne.preloader.classList.contains("manual")&&ne.onClick()},f=()=>{(0,l.Z)(t)?s.classList.add("is-paused"):i()},b=()=>{ae.classList.remove("hide"),s.classList.add("is-paused"),ae.currentTime=0,te.innerText=(0,y.Z)(t.duration,!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",h),t.addEventListener("timeupdate",c),t.addEventListener("pause",f),t.addEventListener("ended",b),(0,r.fc)(p,(i=>{if((0,o.Z)(i),ne&&!ne.detached&&ne.onClick(),t.paused){const i=!!K;if(I.Z.setSearchContext(K||{peerId:C.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=i?(0,M.ns)(s,e.mid):[];I.Z.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()})),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(a(),d(),ae.classList.add("hide")):f():h()};i.pFlags.is_outgoing?(s.onLoad=b,s.dataset.isOutgoing="1"):b()}else q||(ae.autoplay=!0);let oe,re;if(i){if(oe=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:!0,loadPromises:z,autoDownloadSize:null==W?void 0:W.photo,size:G,managers:$}),se.thumb=oe,!ee&&"gif"!==e.type||O)return se.loadPromise=oe.loadPromises.full,se;if(_){const e=(oe.images.thumb||oe.images.full).parentElement;ae.width=+e.getAttributeNS(null,"width"),ae.height=+e.getAttributeNS(null,"height"),e.append(ae)}}else if(!U){const i=(0,h.Z)(e,{},!0);if(i){const e=i.image;e.classList.add("media-poster"),t.append(e),se.thumb={loadPromises:{thumb:i.loadPromise,full:Promise.resolve()},images:{thumb:e,full:null},preloader:null,aspecter:null},null==z||z.push(i.loadPromise),se.loadPromise=i.loadPromise}}if(O)return se;!ae.parentElement&&t&&((null==oe?void 0:oe.aspecter)||t).append(ae);const de=()=>k(this,void 0,void 0,(function*(){return re=yield $.thumbsStorage.getCacheContext(e,null==V?void 0:V.type)}));yield de();const le=null==i?void 0:i.uploadingFileName;le?(ne=new P.Z({attachMethod:"prepend",isUpload:!0}),ne.attachPromise(w.Z.getUpload(le)),ne.attach(t,!1),J=void 0):re.downloaded||e.supportsStreaming||H?e.supportsStreaming&&(ne=new P.Z({cancelable:!1,attachMethod:"prepend"})):ne=new P.Z({attachMethod:"prepend"});const ce=(0,a.Z)();if(ae.addEventListener("error",(e=>{4!==ae.error.code&&console.error("Error "+ae.error.code+"; details: "+ae.error.message),ne&&!le&&ne.detach(),ce.isFulfilled||ce.resolve()}),{once:!0}),"video"===e.type){const e=()=>{ae.duration&&(te.innerText=(0,y.Z)(ae.duration-ae.currentTime,!1))},t=(0,v.Z)((()=>{(0,g.T2)(e)}),1e3,!1);ae.addEventListener("timeupdate",t),ie&&ae.addEventListener("timeupdate",(()=>{b.Z.mutateElement(ie,(()=>{ie.remove()}))}),{once:!0})}ae.muted=!0,ae.loop=!0,q||(ae.autoplay=!0);let he=J&&(null===(Q=null==oe?void 0:oe.preloader)||void 0===Q?void 0:Q.loadFunc);const ue=()=>k(this,void 0,void 0,(function*(){ne&&J&&!H&&(ne.construct(),ne.setManual()),yield de();let n=Promise.resolve();if(ne&&!le||H)if(re.downloaded||e.supportsStreaming)e.supportsStreaming&&(J?n=Promise.reject((0,u.Z)("NO_AUTO_DOWNLOAD")):!re.downloaded&&ne&&(ne.attach(t,!1,null),ae.addEventListener(s.IS_SAFARI?"timeupdate":"canplay",(()=>{ne.detach()}),{once:!0})));else{const i=n=w.Z.downloadMediaURL({media:e,queueId:null==R?void 0:R.queueId,onlyCache:J,thumb:V});ne&&ne.attach(t,!1,i)}return!J&&he&&(he(),he=null),J=void 0,n.then((()=>k(this,void 0,void 0,(function*(){!D||D()?("round"===e.type&&I.Z.resolveWaitingForLoadMedia(i.peerId,i.mid,i.pFlags.is_scheduled),yield de(),(0,m.Z)(ae).then((()=>{N&&L.Z.addAnimation(ae,N),ne&&!le&&ne.detach(),ce.resolve()}),(e=>{console.error("video load error",e),ce.reject(e)})),(0,c.ZP)(ae,re.url)):ce.resolve()}))),p.Z),{download:n,render:Promise.all([n,ce])}}));return ne&&!le&&ne.setDownloadFunction(ue),"gif"!==e.type||ee?se.loadPromise=R?(R.push({div:t,load:()=>ue().then((({render:e})=>e))}),Promise.resolve()):(yield ue()).render:(0,r.fc)(t,(e=>{(0,o.Z)(e),ie.remove(),ue()}),{capture:!0,once:!0}),se.thumb&&(yield se.thumb.loadPromises.thumb),se}))}f.Z.addEventListener("changeScreen",((e,t)=>{if(t===f._.mobile||e===f._.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=f.Z.active.round.width,i=t/2,s=i-7;T=2*Math.PI*s,e.forEach((e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+i),n.setAttributeNS(null,"cy",""+i),n.setAttributeNS(null,"r",""+s),n.style.strokeDasharray=T+" "+T,n.style.strokeDashoffset=""+T}))}}))},2498:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){const t=(0,s.Z)(e.description||"",150,180);return(0,n.ZP)(t)}},1336:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){let t=e.title||e.author||e.site_name||"";return t=(0,s.Z)(t,80,100),(0,n.ZP)(t,{noLinks:!0,noLinebreaks:!0})}},7445:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s={AED:{code:"AED",title:"United Arab Emirates Dirham",symbol:"AED",native:"د.إ.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"367",max_amount:"3673030"},AFN:{code:"AFN",title:"Afghan Afghani",symbol:"AFN",native:"؋",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8729",max_amount:"87299487"},ALL:{code:"ALL",title:"Albanian Lek",symbol:"ALL",native:"Lek",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"11842",max_amount:"118421187"},AMD:{code:"AMD",title:"Armenian Dram",symbol:"AMD",native:"դր.",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"40943",max_amount:"409436718"},ARS:{code:"ARS",title:"Argentine Peso",symbol:"ARS",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"14705",max_amount:"147059002"},AUD:{code:"AUD",title:"Australian Dollar",symbol:"AU$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"153",max_amount:"1536825"},AZN:{code:"AZN",title:"Azerbaijani Manat",symbol:"AZN",native:"ман.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"169",max_amount:"1699858"},BAM:{code:"BAM",title:"Bosnia & Herzegovina Convertible Mark",symbol:"BAM",native:"KM",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1990677"},BDT:{code:"BDT",title:"Bangladeshi Taka",symbol:"BDT",native:"৳",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"10009",max_amount:"100094046"},BGN:{code:"BGN",title:"Bulgarian Lev",symbol:"BGN",native:"лв.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1993315"},BND:{code:"BND",title:"Brunei Dollar",symbol:"BND",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"142",max_amount:"1421883"},BOB:{code:"BOB",title:"Bolivian Boliviano",symbol:"BOB",native:"Bs",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"683",max_amount:"6832607"},BRL:{code:"BRL",title:"Brazilian Real",symbol:"R$",native:"R$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"539",max_amount:"5397799"},BYN:{code:"BYN",title:"Belarusian ruble",symbol:"BYN",native:"BYN",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"249",max_amount:"2495801"},CAD:{code:"CAD",title:"Canadian Dollar",symbol:"CA$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"136",max_amount:"1366860"},CHF:{code:"CHF",title:"Swiss Franc",symbol:"CHF",native:"CHF",thousands_sep:"'",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"97",max_amount:"976705"},CLP:{code:"CLP",title:"Chilean Peso",symbol:"CLP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"963",max_amount:"9637495"},CNY:{code:"CNY",title:"Chinese Renminbi Yuan",symbol:"CN¥",native:"CN¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"709",max_amount:"7094102"},COP:{code:"COP",title:"Colombian Peso",symbol:"COP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"452870",max_amount:"4528700000"},CRC:{code:"CRC",title:"Costa Rican Colón",symbol:"CRC",native:"₡",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"62506",max_amount:"625061070"},CZK:{code:"CZK",title:"Czech Koruna",symbol:"CZK",native:"Kč",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"2497",max_amount:"24975029"},DKK:{code:"DKK",title:"Danish Krone",symbol:"DKK",native:"kr",thousands_sep:"",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"755",max_amount:"7555990"},DOP:{code:"DOP",title:"Dominican Peso",symbol:"DOP",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5275",max_amount:"52757308"},DZD:{code:"DZD",title:"Algerian Dinar",symbol:"DZD",native:"د.ج.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"14035",max_amount:"140353307"},EGP:{code:"EGP",title:"Egyptian Pound",symbol:"EGP",native:"ج.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1953",max_amount:"19537405"},ETB:{code:"ETB",title:"Ethiopian Birr",symbol:"ETB",native:"ብር",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5224",max_amount:"52247069"},EUR:{code:"EUR",title:"Euro",symbol:"€",native:"€",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"101",max_amount:"1016045"},GBP:{code:"GBP",title:"British Pound",symbol:"£",native:"£",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"89",max_amount:"894445"},GEL:{code:"GEL",title:"Georgian Lari",symbol:"GEL",native:"GEL",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"283",max_amount:"2830234"},GTQ:{code:"GTQ",title:"Guatemalan Quetzal",symbol:"GTQ",native:"Q",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"778",max_amount:"7781323"},HKD:{code:"HKD",title:"Hong Kong Dollar",symbol:"HK$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"784",max_amount:"7849750"},HNL:{code:"HNL",title:"Honduran Lempira",symbol:"HNL",native:"L",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"2441",max_amount:"24413729"},HRK:{code:"HRK",title:"Croatian Kuna",symbol:"HRK",native:"kn",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"764",max_amount:"7648805"},HUF:{code:"HUF",title:"Hungarian Forint",symbol:"HUF",native:"Ft",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"42685",max_amount:"426850229"},IDR:{code:"IDR",title:"Indonesian Rupiah",symbol:"IDR",native:"Rp",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"1523370",max_amount:"15233700000"},ILS:{code:"ILS",title:"Israeli New Sheqel",symbol:"₪",native:"₪",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"354",max_amount:"3543350"},INR:{code:"INR",title:"Indian Rupee",symbol:"₹",native:"₹",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8155",max_amount:"81555550"},ISK:{code:"ISK",title:"Icelandic Króna",symbol:"ISK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"142",max_amount:"1425603"},JMD:{code:"JMD",title:"Jamaican Dollar",symbol:"JMD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"15013",max_amount:"150131044"},JPY:{code:"JPY",title:"Japanese Yen",symbol:"¥",native:"¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"144",max_amount:"1443065"},KES:{code:"KES",title:"Kenyan Shilling",symbol:"KES",native:"Ksh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12075",max_amount:"120750271"},KGS:{code:"KGS",title:"Kyrgyzstani Som",symbol:"KGS",native:"KGS",thousands_sep:" ",decimal_sep:"-",symbol_left:!1,space_between:!0,exp:2,min_amount:"8018",max_amount:"80182898"},KRW:{code:"KRW",title:"South Korean Won",symbol:"₩",native:"₩",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"1431",max_amount:"14315201"},KZT:{code:"KZT",title:"Kazakhstani Tenge",symbol:"KZT",native:"₸",thousands_sep:" ",decimal_sep:"-",symbol_left:!0,space_between:!1,exp:2,min_amount:"47186",max_amount:"471867112"},LBP:{code:"LBP",title:"Lebanese Pound",symbol:"LBP",native:"ل.ل.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"150999",max_amount:"1509998778"},LKR:{code:"LKR",title:"Sri Lankan Rupee",symbol:"LKR",native:"රු.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"35546",max_amount:"355469651"},MAD:{code:"MAD",title:"Moroccan Dirham",symbol:"MAD",native:"د.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1093",max_amount:"10938136"},MDL:{code:"MDL",title:"Moldovan Leu",symbol:"MDL",native:"MDL",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1926",max_amount:"19264439"},MNT:{code:"MNT",title:"Mongolian Tögrög",symbol:"MNT",native:"MNT",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"322444",max_amount:"3224442056"},MUR:{code:"MUR",title:"Mauritian Rupee",symbol:"MUR",native:"MUR",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"4453",max_amount:"44535174"},MVR:{code:"MVR",title:"Maldivian Rufiyaa",symbol:"MVR",native:"MVR",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1546",max_amount:"15460397"},MXN:{code:"MXN",title:"Mexican Peso",symbol:"MX$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"2012",max_amount:"20122860"},MYR:{code:"MYR",title:"Malaysian Ringgit",symbol:"MYR",native:"RM",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"463",max_amount:"4632502"},MZN:{code:"MZN",title:"Mozambican Metical",symbol:"MZN",native:"MTn",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"6382",max_amount:"63829729"},NGN:{code:"NGN",title:"Nigerian Naira",symbol:"NGN",native:"₦",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"43203",max_amount:"432039828"},NIO:{code:"NIO",title:"Nicaraguan Córdoba",symbol:"NIO",native:"C$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"3556",max_amount:"35566412"},NOK:{code:"NOK",title:"Norwegian Krone",symbol:"NOK",native:"kr",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"1069",max_amount:"10690975"},NPR:{code:"NPR",title:"Nepalese Rupee",symbol:"NPR",native:"नेरू",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12954",max_amount:"129546657"},NZD:{code:"NZD",title:"New Zealand Dollar",symbol:"NZ$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"174",max_amount:"1746220"},PAB:{code:"PAB",title:"Panamanian Balboa",symbol:"PAB",native:"B/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"98",max_amount:"988722"},PEN:{code:"PEN",title:"Peruvian Nuevo Sol",symbol:"PEN",native:"S/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"390",max_amount:"3902208"},PHP:{code:"PHP",title:"Philippine Peso",symbol:"PHP",native:"₱",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5862",max_amount:"58627496"},PKR:{code:"PKR",title:"Pakistani Rupee",symbol:"PKR",native:"₨",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"22642",max_amount:"226426805"},PLN:{code:"PLN",title:"Polish Złoty",symbol:"PLN",native:"zł",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"493",max_amount:"4932350"},PYG:{code:"PYG",title:"Paraguayan Guaraní",symbol:"PYG",native:"₲",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"6977",max_amount:"69772317"},QAR:{code:"QAR",title:"Qatari Riyal",symbol:"QAR",native:"ر.ق.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"364",max_amount:"3640989"},RON:{code:"RON",title:"Romanian Leu",symbol:"RON",native:"RON",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"502",max_amount:"5028645"},RSD:{code:"RSD",title:"Serbian Dinar",symbol:"RSD",native:"дин.",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"11918",max_amount:"119184990"},RUB:{code:"RUB",title:"Russian Ruble",symbol:"RUB",native:"₽",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"7128",max_amount:"71281218"},SAR:{code:"SAR",title:"Saudi Riyal",symbol:"SAR",native:"ر.س.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"375",max_amount:"3756546"},SEK:{code:"SEK",title:"Swedish Krona",symbol:"SEK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1109",max_amount:"11094972"},SGD:{code:"SGD",title:"Singapore Dollar",symbol:"SGD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"143",max_amount:"1430495"},THB:{code:"THB",title:"Thai Baht",symbol:"฿",native:"฿",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3780",max_amount:"37800497"},TJS:{code:"TJS",title:"Tajikistani Somoni",symbol:"TJS",native:"TJS",thousands_sep:" ",decimal_sep:";",symbol_left:!1,space_between:!0,exp:2,min_amount:"975",max_amount:"9753854"},TRY:{code:"TRY",title:"Turkish Lira",symbol:"TRY",native:"TL",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1854",max_amount:"18543598"},TTD:{code:"TTD",title:"Trinidad and Tobago Dollar",symbol:"TTD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"672",max_amount:"6722681"},TWD:{code:"TWD",title:"New Taiwan Dollar",symbol:"NT$",native:"NT$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3173",max_amount:"31738502"},TZS:{code:"TZS",title:"Tanzanian Shilling",symbol:"TZS",native:"TSh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"233199",max_amount:"2331999890"},UAH:{code:"UAH",title:"Ukrainian Hryvnia",symbol:"UAH",native:"₴",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"3633",max_amount:"36338830"},UGX:{code:"UGX",title:"Ugandan Shilling",symbol:"UGX",native:"USh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"3816",max_amount:"38166726"},USD:{code:"USD",title:"United States Dollar",symbol:"$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"100",max_amount:1e6},UYU:{code:"UYU",title:"Uruguayan Peso",symbol:"UYU",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"4080",max_amount:"40801205"},UZS:{code:"UZS",title:"Uzbekistani Som",symbol:"UZS",native:"UZS",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1089058",max_amount:"10890583014"},VND:{code:"VND",title:"Vietnamese Đồng",symbol:"₫",native:"₫",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"23862",max_amount:"238625000"},YER:{code:"YER",title:"Yemeni Rial",symbol:"YER",native:"ر.ي.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"25030",max_amount:"250300677"},ZAR:{code:"ZAR",title:"South African Rand",symbol:"ZAR",native:"R",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1789",max_amount:"17894299"}}},3447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a,i:()=>s});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const a=n},3189:(e,t,i)=>{"use strict";i.d(t,{Bf:()=>n,U9:()=>a,bt:()=>s});const s='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif',n="16px",a="400"},356:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="undefined"!=typeof ImageBitmap},5296:(e,t,i)=>{"use strict";i.d(t,{Kx:()=>r,cK:()=>d,jt:()=>l});var s=i(3035),n=i(3725);const a=new Map;function o(e){return a.get(e)}function r(e){const t=o(e);t&&(t.isCancelled=!0,t.deferred.resolve())}function d(e,t,i){return i||(i=function(e){r(e);const t={isCancelled:!1,deferred:(0,n.Z)()};return a.set(e,t),t.deferred.then((()=>{o(e)===t&&a.delete(e)})),t}(t)),(0,s.T2)((()=>{i.isCancelled||(e()?d(e,t,i):i.deferred.resolve())})),i.deferred}function l(e){(0,s.T2)((()=>{e()&&l(e)}))}},2353:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function n(e,t){return s(this,void 0,void 0,(function*(){const i=e.map(((e,i,n)=>s(this,void 0,void 0,(function*(){if(yield t(e,i,n))return e}))));return(yield Promise.all(i)).filter(Boolean)}))}},8847:(e,t,i)=>{"use strict";function s(e,t){const i=[];let s=-1;for(;-1!==(s=e.findIndex(t));)i.push(e.splice(s,1)[0]);return i}i.d(t,{Z:()=>s})},5916:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId,this.assetName=e;try{const i=this.createAudio();i.autoplay=!0,i.src="assets/audio/"+e,i.loop=t,i.play()}catch(t){console.error("playSound",e,t)}}playSoundIfDifferent(e,t){this.assetName!==e&&this.playSound(e,t)}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){this.audio&&this.audio.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,i){const s=++this.tempId;setTimeout((()=>{this.tempId===s&&this.playSound(e,t)}),i)}}},8678:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3019);function n(e){return(0,s.Z)(e,"readAsDataURL")}},6705:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(3725),n=i(8594),a=i(3035);const o=[];let r=!1;function d(e,t="push"){if(!e.items.length)return Promise.resolve([]);const i=e.promise=(0,s.Z)();return o[t](e),l(),i}function l(){r||function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),i=[];return new Promise(((s,o)=>{const r=()=>{return d=this,l=void 0,h=function*(){const d=performance.now();do{yield(0,n.e9)();const s=e.process.apply(e.context,t.shift());let a;if(s instanceof Promise)try{a=yield s}catch(e){return void o(e)}else a=s;i.push(a)}while(t.length>0&&performance.now()-d<6);t.length>0?(0,a.T2)(r):s(i)},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(d,l||[])).next())}));var d,l,c,h};(0,a.T2)(r)})).then(e.promise.resolve,e.promise.reject)}(o.shift()).finally((()=>{r=!1,o.length&&l()}))}var c=i(6663);let h,u;function f(e,t,i,s=document.createElement("canvas")){s.width=e.width,s.height=e.height;const n=s.getContext("2d",{alpha:!1});return c.Z?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,s.width+4*t,s.height+4*t)):(n.drawImage(e,0,0),u(n,0,0,s.width,s.height,t,i)),s}h=c.Z?Promise.resolve():i.e(77).then(i.bind(i,7077)).then((e=>{u=e.default}));const p=new Map;function m(e,t=2,i=2){if(!e)throw"no dataUri for blur: "+e;p.size>150&&p.clear();const s=document.createElement("canvas");s.className="canvas-thumbnail";let n=p.get(e);if(n)s.width=n.canvas.width,s.height=n.canvas.height,n.promise.then((()=>{s.getContext("2d").drawImage(n.canvas,0,0,s.width,s.height)}));else{const a=new Promise((n=>{h.then((()=>{const a=new Image;a.onload=()=>{d({items:[[a,t,i,s]],context:null,process:f},"unshift").then((()=>{n()}))},a.src=e}))}));p.set(e,n={canvas:s,promise:a})}return Object.assign(Object.assign({},n),{canvas:s})}},4059:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(4762),n=i(3306);const a=(0,n.Z)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),o=(0,n.Z)("ffd9");function r(e,t=!1){let i,n;return t?i=e instanceof Uint8Array?e:new Uint8Array(e):(i=new Uint8Array(a.concat(Array.from(e.slice(3)),o)),i[164]=e[1],i[166]=e[2]),n=t?s.IS_SAFARI?"image/png":"image/webp":"image/jpeg",function(e,t="image/jpeg"){return`data:${t};base64,${btoa(String.fromCharCode(...e))}`}(i,n)}},9897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(410),n=i(9405);function a(e,t,i,s,a=!0){if(ei/s?r=t*i/e|0:(o=e*s/t|0,o>i&&(r=r*i/o|0,o=i)),a&&o>=e&&r>=t&&(o=e,r=t),(0,n.C)(o,r)}s.GO.calcImageInBox=a},8097:(e,t,i)=>{"use strict";let s;function n(e,t){if(!s){const e=document.createElement("canvas");s=e.getContext("2d",{alpha:!1})}return s.font!==t&&(s.font=t),s.measureText(e).width}i.d(t,{Z:()=>n})},7814:(e,t,i)=>{"use strict";function s(e){return new Promise((t=>{var i,s,n;const a=document.createElement("canvas"),o=null!==(i=e.size)&&void 0!==i?i:e.mediaSize.aspectFitted(e.boxSize);a.width=o.width*window.devicePixelRatio,a.height=o.height*window.devicePixelRatio,a.getContext("2d").drawImage(e.media,0,0,a.width,a.height),a.toBlob((e=>{t({blob:e,size:o})}),null!==(s=e.mimeType)&&void 0!==s?s:"image/jpeg",null!==(n=e.quality)&&void 0!==n?n:1)}))}i.d(t,{Z:()=>s})},467:(e,t,i)=>{"use strict";i.d(t,{ST:()=>r,ZP:()=>d,gV:()=>l});var s=i(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,a=/^\s+|\s$/g,o={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function r(e){return e.replace(n,"").replace(a,"")}function d(e,t=!0){return l(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function l(e,t={}){const i=t.includeTag&&"%"===e.charAt(0),n=e;return t.clearBadChars&&(e=r(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),i&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=o[e];return null!=t?t:e}))}(n)),e}},2166:(e,t,i)=>{"use strict";function s(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)}function n(e){navigator.clipboard?navigator.clipboard.writeText(e).catch((t=>{console.error("clipboard error",t),s(e)})):s(e)}i.d(t,{T:()=>n})},3416:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(4755),a=i(2296);class o extends a.Z{constructor(){super("menu",!0),this.onMouseMove=e=>{const t=this.element.getBoundingClientRect(),{clientX:i,clientY:s}=e,n=i>=t.right?i-t.right:t.left-i,a=s>=t.bottom?s-t.bottom:t.top-s;(n>=100||a>=100)&&this.close()},n.Z.addEventListener("resize",(()=>{this.element&&this.close()}))}isOpened(){return!!this.element}close(){this.element&&(this.element.classList.remove("active"),this.element.parentElement.classList.remove("menu-open")),super.close(),s.Z||window.removeEventListener("mousemove",this.onMouseMove)}openBtnMenu(e,t){super.open(e),this.element.classList.add("active"),this.element.parentElement.classList.add("menu-open"),t&&this.addEventListener("toggle",t,{once:!0}),s.Z||window.addEventListener("mousemove",this.onMouseMove)}}const r=new o},632:(e,t,i)=>{"use strict";i.d(t,{OD:()=>h,fl:()=>S,mr:()=>u,rz:()=>c,s2:()=>r,xE:()=>f,zM:()=>l});var s=i(410),n=i(2325);const a=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],r=86400,d=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),i=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-i);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/r+1)/7)};function l(e){const t=new Date,i=t.getTime()/1e3|0,s=e.getTime()/1e3|0,a={};return i-s{const i=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+i+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):a[e.getMonth()])+i+e.getFullYear()+(t.noTime?"":", "+s)},p=2013,m=new RegExp("20[0-9]{1,2}"),g=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),v=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),b=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"),w=[31,29,31,30,31,30,31,31,30,31,30,31];function S(e,t){const i=e.trim().toLowerCase();if(i.length<3)return;if(0==="today".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-1;return void t.push({title:"Today",minDate:a,maxDate:o})}if(0==="yesterday".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime()-864e5;e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:a,maxDate:o})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let i=0;i<7;i++)if(t.setDate(t.getDate()+1),0===P(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(i);if(s>=0){const e=new Date,i=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>i&&e.setTime(e.getTime()-6048e5);const a=e.getFullYear(),o=e.getMonth(),r=e.getDate();e.setFullYear(a,o,r),e.setHours(0,0,0);const d=e.getTime();e.setFullYear(a,o,r+1),e.setHours(0,0,0);const l=e.getTime()-1;return void t.push({title:P(d),minDate:d,maxDate:l})}let n;if(null===(n=b.exec(i)))if(null===(n=y.exec(i)))if(null===(n=m.exec(i))){if(null!==(n=g.exec(i))){const e=n[1],i=n[2],s=k(e);if(s>=0){const e=+i;if(e>0&&e<=31)return void E(t,e-1,s);if(e>=p)return void C(t,s,e)}}if(null!==(n=v.exec(i))){const e=n[1],i=k(n[2]);if(i>=0){const s=+e;if(s>0&&s<=31)return void E(t,s-1,i);s>=p&&C(t,i,s)}}}else{let e=+i;const s=(new Date).getFullYear();if(e=e;i--){const e=new Date;e.setFullYear(i,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(i+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+i,minDate:s,maxDate:n})}}else if(e<=s){const i=new Date;i.setFullYear(e,0,1),i.setHours(0,0,0);const s=i.getTime();i.setFullYear(e+1,0,1),i.setHours(0,0,0);const n=i.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],i=n[3],s=n[5];if(!n[2]===n[4])return;const a=parseInt(e),o=parseInt(i)-1;let r=parseInt(s);r>=10&&r<=99&&(r+=2e3);const d=(new Date).getFullYear();if(Z(a-1,o)&&r>=p&&r<=d){const e=new Date;e.setFullYear(r,o,a),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(r,o,a+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:M(i),minDate:i,maxDate:s})}}else{const e=n[1],i=n[3],s=parseInt(e),a=parseInt(i);if(s>0&&s<=31){if(a>=p&&s<=12)return void C(t,s-1,a);a<=12&&E(t,s-1,a-1)}else s>=p&&a<=12&&C(t,a-1,s)}}function C(e,t,i){const s=(new Date).getFullYear(),n=Date.now();if(i>=p&&i<=s){const s=new Date;s.setFullYear(i,t,1),s.setHours(0,0,0);const a=s.getTime();if(a>n)return;s.setMonth(s.getMonth()+1);const o=s.getTime()-1;e.push({title:L(a),minDate:a,maxDate:o})}}function E(e,t,i){if(Z(t,i)){const n=(new Date).getFullYear(),a=Date.now();for(let o=n;o>=p;o--){if(1===i&&28===t&&((s=o)%4!=0||s%100==0)&&s%400!=0)continue;const r=new Date;r.setFullYear(o,i,t+1),r.setHours(0,0,0);const d=r.getTime();if(d>a)continue;r.setFullYear(o,i,t+2),r.setHours(0,0,0);const l=r.getTime()-1;o===n?e.push({title:I(d),minDate:d,maxDate:l}):e.push({title:M(d),minDate:d,maxDate:l})}}var s}function L(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function I(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getDate()}function M(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function P(e){const t=new Date(e);return o[t.getDay()]}function Z(e,t){return t>=0&&t<12&&e>=0&&e{"use strict";i.d(t,{Z:()=>d});var s=i(2796),n=i(2166),a=i(3910),o=i(2738);const r="https://t.me/";function d(e={}){const t=document.createElement("a");t.classList.add("anchor-copy");let i,d="LinkCopied";if(e.mePath){const s=r+e.mePath;i=t.href=t.innerText=s}if(e.username){const s=r+e.username;t.href=s,i=t.innerText="@"+e.username,d="UsernameCopied"}return(0,o.fc)(t,(e=>{(0,a.Z)(e),(0,n.T)(null!=i?i:t.href),(0,s.bC)({langPackKey:d})})),t}},6976:(e,t,i)=>{"use strict";i.d(t,{E:()=>c,s:()=>l});var s=i(5432),n=i(4762),a=i(3416),o=i(3910);let r=!1,d=0;function l(){d&&clearTimeout(d),d=window.setTimeout((()=>{d=0,r=!1}),400),r=!0}function c(e,t,i){const d=i?i.add(e):e.addEventListener.bind(e),l=i?i.removeManual.bind(i,e):e.removeEventListener.bind(e);if(n.IS_APPLE&&s.Z){let e;const i={capture:!0},s=()=>{clearTimeout(e),l("touchmove",s,i),l("touchend",s,i),l("touchcancel",s,i)};d("touchstart",(n=>{n.touches.length>1?s():(d("touchmove",s,i),d("touchend",s,i),d("touchcancel",s,i),e=window.setTimeout((()=>{r?s():(t(n),s(),a.Z.isOpened()&&d("touchend",o.Z,{once:!0}))}),400))}))}else d("contextmenu",s.Z?e=>{t(e),a.Z.isOpened()&&d("touchend",o.Z,{once:!0})}:t)}},5077:(e,t,i)=>{"use strict";function s(e,t,i,s){const n=e=>{i({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),s&&s({x:t.pageX,y:t.pageY,event:t})},o=i=>{0===i.button?(t({x:i.pageX,y:i.pageY,event:i}),n(i),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),i({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},d=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",l,{passive:!1,once:!0}),s&&s({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},l=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",d,{passive:!1,once:!0})};return e.addEventListener("touchstart",l,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",l),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",d)}}i.d(t,{Z:()=>s})},6760:(e,t,i)=>{"use strict";function s(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}i.d(t,{Z:()=>s})},2738:(e,t,i)=>{"use strict";i.d(t,{EN:()=>r,fc:()=>o,pf:()=>a,tH:()=>d});var s=i(5432),n=i(6669);const a=s.Z?"mousedown":"click";function o(e,t,i={}){const s=i.listenerSetter?i.listenerSetter.add(e):e.addEventListener.bind(e),n=i.listenerSetter?i.listenerSetter.removeManual.bind(i.listenerSetter,e):e.removeEventListener.bind(e);return i.touchMouseDown=!0,s(a,t,i),()=>n(a,t,i)}function r(e,t,i){e.removeEventListener(a,t,i)}function d(e){(0,n.Z)(e,a)}},7529:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(3241),a=i(5953),o=i(8497);class r extends n.Z{constructor(){super(!1),this.hideControls=(e=!1)=>{if(e)return void(this.hideControlsTimeout||(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3)));clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0;const t=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!t||this.controlsLocked)return}else if(!t)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.hideControlsTimeout?(clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.element.classList.contains("show-controls");if(void 0===e)t?this.hideControls():this.showControls();else{if(e===t)return;!1===e?this.hideControls():this.showControls()}},this.hideControlsTimeout=0}setup(e){(0,a.Z)(this,e);const{listenerSetter:t,element:i}=this;s.Z?t.add(i)("click",(e=>{this.ignoreClickClassName&&(0,o.Z)(e.target,this.ignoreClickClassName)||this.toggleControls()})):(t.add(i)("mousemove",(()=>{this.showControls()})),t.add(i)("mouseenter",(()=>{this.showControls(!1)})),t.add(i)("mouseleave",(e=>{e.relatedTarget&&this.showOnLeaveToClassName&&(0,o.Z)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()})))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}},4531:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3003),n=i(2353),a=i(3416),o=i(3699),r=i(3624),d=i(1483),l=i(6976),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({buttons:e,findElement:t,listenTo:i,appendTo:h,filterButtons:u,onOpen:f,onClose:p,onBeforeOpen:m,listenerSetter:g}){null!=h||(h=document.body),null!=g||(g=new o.Z);const v=new o.Z,b=(0,r.k)();let y;(0,l.E)(i,(e=>{const s=t?t(e):i;if(!s)return;let n=y;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),n&&n.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0),(()=>{c(this,void 0,void 0,(function*(){yield null==f?void 0:f(s);const t=yield S();if(!t)return;n=t.element;const{cleanup:i,destroy:o}=t;(0,d.Z)(e,n),a.Z.openBtnMenu(n,(()=>{null==p||p(),i(),setTimeout((()=>{o()}),300)}))}))})()}),g);const w=()=>{v.removeAll(),b.clean()},S=()=>c(this,void 0,void 0,(function*(){w(),e.forEach((e=>e.element=void 0));const t=u||(e=>(0,n.Z)(e,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i}))),i=yield t(e);if(!i.length)return;const a=y=yield(0,s.Z)({buttons:i,listenerSetter:v});return a.classList.add("contextmenu"),yield null==m?void 0:m(),h.append(a),{element:a,cleanup:w,destroy:()=>{a.remove()}}}));return{element:y,destroy:()=>{w(),g.removeAll()}}}},3163:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(6787),n=i(9355),a=i(3512),o=i(4531),r=i(8497),d=i(3173),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function c(e){const{listenTo:t,isStickerPack:i,verifyRecent:c,appendTo:h,onOpen:u,onClose:f,onSend:p}=e;let m,g;const v=e=>l(this,void 0,void 0,(function*(){const t=yield a.Z.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!t.cached)return!1;const i=(yield t.result).some((e=>e.id===g.id));return e?!i:i}));return(0,o.Z)({listenTo:t,appendTo:h,findElement:e=>m=(0,r.Z)(e.target,"media-sticker-wrapper"),onOpen:()=>l(this,void 0,void 0,(function*(){return g=yield a.Z.managers.appDocsManager.getDoc(m.dataset.docId),null==u?void 0:u()})),onClose:f,buttons:[{icon:"stickers",text:"Context.ViewStickerSet",onClick:()=>new s.Z(g.stickerSetInput).show(),verify:()=>!i},{icon:"favourites",text:"AddToFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!1),verify:()=>v(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!0),verify:()=>v(!1)},{icon:"delete",text:"DeleteFromRecent",onClick:()=>a.Z.managers.appStickersManager.saveRecentSticker(g.id,!0),verify:()=>{var e;return null!==(e=null==c?void 0:c(m))&&void 0!==e&&e}},{icon:"mute",text:"Chat.Send.WithoutSound",onClick:()=>(null==p||p(),d.Jo.sendDocId(g.id,!1,!0)),verify:()=>!(!n.Z.chat.peerId||n.Z.chat.peerId===a.Z.myId)},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:()=>n.Z.chat.input.scheduleSending((()=>n.Z.chat.input.sendMessageWithDocument(g))),verify:()=>!!n.Z.chat.peerId}]})}},7660:(e,t,i)=>{"use strict";function s(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}i.d(t,{Z:()=>s})},8222:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3512);const n=new class{constructor(){this.cache={},s.Z.addEventListener("theme_change",(()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(const 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)}}},6669:(e,t,i)=>{"use strict";function s(e,t){const i=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(i)}i.d(t,{Z:()=>s})},1544:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4056);function n(e){return Array.from(e.childNodes).map((e=>e.nodeType===e.TEXT_NODE?(0,s.Z)(e.textContent):e.outerHTML)).join("")}},5975:(e,t,i)=>{"use strict";function s(e,t){if(!e)return null;if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}i.d(t,{Z:()=>s})},8763:(e,t,i)=>{"use strict";function s(e,t){return e.closest(`[${t}]`)}i.d(t,{Z:()=>s})},4668:(e,t,i)=>{"use strict";function s(e,t){return e.closest(t)}i.d(t,{Z:()=>s})},6733:(e,t,i)=>{"use strict";function s(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function n(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function a(e,t,i){const s=i?i.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach((e=>{s(e,t,!1)}))}function o(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!o()}i.d(t,{C8:()=>n,Dj:()=>s,Ms:()=>a,W7:()=>o,rB:()=>r})},3299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n,q:()=>a});var s=i(5975);function n(e,t){const i=document.getSelection(),n=i[t?"anchorNode":"focusNode"],o=i[t?"anchorOffset":"focusOffset"];return(0,s.Z)(n,e)||n===e?Object.assign(Object.assign({},a(e,n,o)),{selection:i}):{selection:i}}function a(e,t,i){if(t===e){const s=e.childNodes,n=s.length;n&&i>=n?i=((t=s[n-1]).textContent||t.alt||"").length:(t=s[i],i=0)}return{node:t,offset:i}}},9041:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d,o:()=>n});var s=i(6854);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"], [style*="strikethrough"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},a=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR","OL","UL"]),o=(new Set(["OL","UL"]),new RegExp(s.Z,"g"));function r(e,t,i,s){const a=e.parentElement;for(const e in n){const o=n[e],r=a.closest(o.match+', [contenteditable="true"]');null===(null==r?void 0:r.getAttribute("contenteditable"))&&("messageEntityTextUrl"===o.entityName?i.push({_:o.entityName,url:r.href,offset:s.offset,length:t.length}):"messageEntityMentionName"===o.entityName?i.push({_:o.entityName,offset:s.offset,length:t.length,user_id:r.dataset.follow.toUserId()}):i.push({_:o.entityName,offset:s.offset,length:t.length}))}}function d(e,t,i,s,n,l,c={offset:0}){if(e.nodeType===e.TEXT_NODE){let t=e.nodeValue;return t=t.replace(o,""),t?s===e?i.push(t.substr(0,n)+""+t.substr(n)):i.push(t):s===e&&i.push(""),l&&t.length&&e.parentNode&&r(e,t,l,c),void(c.offset+=t.length)}if(e.nodeType!==e.ELEMENT_NODE)return;const h=s===e,u=a.has(e.tagName);if(u&&(i.length||"BR"===e.tagName))t.push(i.join("")),i.length=0,++c.offset;else{const t=e.dataset.stickerEmoji||e.alt,s=e.dataset.stickerEmoji;t&&l&&r(e,t,l,c),s&&l&&l.push({_:"messageEntityCustomEmoji",document_id:e.dataset.docId,offset:c.offset,length:t.length}),t&&(i.push(t),c.offset+=t.length)}h&&!n&&i.push("");const f=e.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let m=e.firstChild;for(;m;)d(m,t,i,s,n,l,c),m=m.nextSibling;if(h&&n&&i.push(""),f&&e.nextSibling&&i.length&&(i.push(" "),++c.offset,void 0!==p))for(let e=p,t=l.length;e{"use strict";i.d(t,{Z:()=>r});var s=i(410),n=i(6875),a=i(1346),o=i(9041);function r(e,t=!0,i=!0){const s=[],r=[],{node:d,offset:l}=!(e instanceof DocumentFragment)&&i&&function(e){const t=window.getSelection();let i,s;if(null==t?void 0:t.rangeCount){const n=t.getRangeAt(0),a=n.startOffset;if(n.startContainer&&n.startContainer==n.endContainer&&a==n.endOffset){const t=a-1,o=e.childNodes;if(n.startContainer===e&&o[t]){i=o[t],s=0;for(let e=0;e{"use strict";i.d(t,{Z:()=>n});var s=i(8204);function n({overflowElement:e,overflowRect:t,selector:i,extraSize:n,elements:a}){null!=t||(t=e.getBoundingClientRect()),null!=a||(a=Array.from(e.querySelectorAll(i))),n&&(t={top:t.top-n,right:t.right+n,bottom:t.bottom+n,left:t.left-n});const o=[],r=[],d=[];let l=!1;for(const i of a){const n=i.getBoundingClientRect(),a=(0,s.Z)(i,e,!1,n,t);let c;a?(l=!0,c=r):c=l?d:o,c.push({element:i,rect:n,visibleRect:a})}return{invisibleTop:o,visible:r,invisibleBottom:d}}},8204:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(241);function n(e,t,i,n=e.getBoundingClientRect(),a=t.getBoundingClientRect()){let{top:o,right:r,bottom:d,left:l}=a;if(i){const e=t.querySelector(".sticky");e&&(o=e.getBoundingClientRect().bottom)}if(n.top>=d||n.bottom<=o||n.right<=l||n.left>=r)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},h=s.Z.width,u=s.Z.height;return{rect:{top:n.topr&&r!==h?(c.right=!0,++c.horizontal,r):n.right,bottom:n.bottom>d&&d!==u?(c.bottom=!0,++c.vertical,d):n.bottom,left:n.left{"use strict";i.d(t,{Z:()=>r});var s=i(3757),n=i(3910),a=i(8497),o=i(3444);function r(e){let t=!1;return new s.Z(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!(0,a.Z)(t.target,"progress-line")&&!(0,o.Z)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(i,s,a)=>{if(!t&&Math.abs(s)>20)return!0;if(Math.abs(i)>Math.abs(s))(0,n.Z)(a),t=!0;else if(!t&&Math.abs(s)>Math.abs(i))return!0;return e.onSwipe(i,s,a)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}},1154:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6976),n=i(2416);function a(e){return(0,n.Z)(Object.assign(Object.assign({},e),{onSwipe:(t,i,n)=>{if(Math.abs(t)>50)return e.onSwipe(t,i,n),(0,s.s)(),!0}}))}},5705:(e,t,i)=>{"use strict";function s(e){if(e instanceof DocumentFragment)return e;const t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}i.d(t,{Z:()=>s})},2614:(e,t,i)=>{"use strict";function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},8487:(e,t,i)=>{"use strict";function s(e){return null==e?void 0:e.isConnected}i.d(t,{Z:()=>s})},1293:(e,t,i)=>{"use strict";function s(e){return e.isContentEditable||"INPUT"!==e.tagName?!e.textContent.trim()&&!e.querySelector(".emoji, .custom-emoji, .custom-emoji-placeholder"):!e.value.trim()}i.d(t,{Z:()=>s})},6299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(4762);function a(e){if("Enter"===e.key&&!n.IS_MOBILE&&!e.isComposing){if("enter"===s.Z.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=n.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(n.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},3444:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e){return s.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},2398:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5432);function n(e,t=!1,i=!0){if(!s.Z||t&&("INPUT"===document.activeElement.tagName||document.activeElement.isContentEditable))if(i&&e.focus(),e instanceof HTMLInputElement){const t=e.value.length;e.selectionStart=t,e.selectionEnd=t}else{const t=document.createRange();t.selectNodeContents(e),t.collapse(!1);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}}window.placeCaretAtEnd=n},4484:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2648);function n(e,t,i,n){return void 0===n&&(n=e.parentElement===t?(0,s.Z)(e):-1),n!==i&&(-1!==n&&ni?t.insertBefore(e,t.children[i]):t.append(e):t.prepend(e),!0)}},6740:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>o,cj:()=>r});var s=i(925);const n={},a=(e,t)=>{e instanceof HTMLImageElement||e instanceof HTMLVideoElement?e.src=t:e instanceof SVGImageElement?e.setAttributeNS(null,"href",t):e.style.backgroundImage="url("+t+")"};function o(e,t,i,o=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(null==i||i());const r=e instanceof HTMLVideoElement;if(n[t]&&o||r)e&&a(e,t),i&&(r?(0,s.Z)(e).then(i):null==i||i());else{const s=e instanceof HTMLImageElement,o=s?e:new Image;o.src=t;const r=()=>{!s&&e&&a(e,t),n[t]=!0,null==i||i(),o.removeEventListener("error",d)},d=e=>{console.error("Render image from url failed:",e,t,o),o.removeEventListener("load",r),null==i||i()};o.addEventListener("load",r,{once:!0}),o.addEventListener("error",d,{once:!0})}}function r(e,t,i){return new Promise((s=>{o(e,t,s,i)}))}},2830:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9674),n=i(6740);function a(e,t,i,a,o=e,r){return a&&t.classList.add("fade-in"),(0,n.cj)(t,i).then((()=>s.Z.mutateElement(e,(()=>{o.append(t),a?t.addEventListener("animationend",(()=>{s.Z.mutate((()=>{t.classList.remove("fade-in"),null==r||r.remove()}))}),{once:!0}):null==r||r.remove()}))))}},5565:(e,t,i)=>{"use strict";function s(e,t){if("string"==typeof t)return void(e.innerHTML=t);const i=e.firstChild;i?e.lastChild===i?i.replaceWith(t):(e.textContent="",e.append(t)):e.append(t)}i.d(t,{Z:()=>s})},669:(e,t,i)=>{"use strict";i.d(t,{Y:()=>m,Z:()=>g});var s=i(4762),n=i(5003),a=i(5400),o=i(3699),r=i(6854),d=i(3228),l=i(5975),c=i(2648);function h(e,t,i,s){let n;if(e===i)n=t-s;else if(e.parentElement===i.parentElement)n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0);else{const t=[];let s=e.parentElement;do{t.push(s)}while(s=s.parentElement);s=i.parentElement;do{if(t.includes(s))break}while(s=s.parentElement);const a=s;e=(0,l.Z)(e,a),i=(0,l.Z)(i,a),n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0)}return(0,d.Z)(n,-1,1)}window.compareNodes=h;var u=i(3299),f=i(2398);const p=new RegExp(`[^${r.Z}]`),m=!1;class g{constructor(){this.saveSelectionOnChange=e=>{const t=document.activeElement;this.saveRangeForElement(t)},this.onFocusOut=e=>{this.lastNode=this.lastOffset=void 0},this.onSelectionChange=e=>{var t;const{input:i}=this;if(!i)return void this.setSelectionClassName(document.getSelection());let s=this.getCaretPosN();for(;;){const{node:e,offset:n,selection:a,move:o}=s;if((null==e?void 0:e.nodeValue)!==r.Z||!this.lastNode)break;const d=h(e,n,this.lastNode,this.lastOffset)<0;void 0!==d&&(a.isCollapsed?this.superMove(i,s,d,!0):a.modify(a.isCollapsed?"move":"extend",d?"backward":"forward","character")),this.log("selectionchange",e,n,this.lastNode,this.lastOffset,e===this.lastNode,(0,c.Z)(this.getFiller(e)),(0,c.Z)(this.getFiller(this.lastNode)),d,a,document.getSelection(),document.getSelection().getRangeAt(0),null==e?void 0:e.parentNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode),s=this.getCaretPosN(),this.lastNode=e,this.lastOffset=n;break}this.lastNode=this.lastOffset=void 0,this.setSelectionClassName(s.selection,i)},this.onBeforeInput=e=>{var t;const{input:i,log:s}=this;if(!i)return;const n=this.addInputCallback.bind(this,i),a=this.getCaretPosN();let{node:o,offset:d,selection:l,move:c}=a;if(s("beforeinput",e,o,d,l,a),this.lastNode=this.lastOffset=void 0,e.inputType.startsWith("delete")){if(n((()=>{this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.fixInsertedLineBreaks(i)})),(null==o?void 0:o.nodeValue)===r.Z&&l.isCollapsed&&e.inputType.includes("deleteContent")){const t=e.inputType.includes("Backward"),s=d===r.Z.length&&t||!d&&!t;this.superMove(i,a,t,s)}}else{if(e.inputType.startsWith("insert")){if(null===(t=null==o?void 0:o.classList)||void 0===t?void 0:t.contains("input-something")){o=o.previousSibling.firstChild;const e=l.getRangeAt(0);e.setStart(o,0),e.setEnd(o,0),e.collapse(!0);const t=this.getCaretPosN();o=t.node,l=t.selection,d=t.offset}if(o&&o.textContent===r.Z&&d===r.Z.length){l.modify("move","backward","character");const e=this.getCaretPosN();o=e.node,l=e.selection,d=e.offset}e.inputType;{o&&o.nodeType===o.ELEMENT_NODE&&(o=o.firstChild,s.warn("fixing focus on span"));const t=(null==o?void 0:o.nodeValue)===r.Z;if(s("inserting line break",t,o,`"${null==o?void 0:o.nodeValue}"`,(null==o?void 0:o.parentElement)?Array.from(o.parentElement.childNodes).slice():[]),t){const e=o.parentElement;e.classList.replace("input-filler","input-filler-text"),e.childNodes.length,n((()=>{e.childNodes.length>1?(s("inserting line break, remove"),o=Array.from(e.childNodes).find((e=>e.nodeValue===r.Z)),e.t=o):o.nodeValue!==r.Z&&(s("inserting line break, deleteData"),o.deleteData(o.nodeValue.indexOf(r.Z),r.Z.length)),this.fixInsertedLineBreaks(i)}))}else"insertLineBreak"===e.inputType&&n((()=>{this.fixInsertedLineBreaks(i)}))}return}"historyUndo"===e.inputType?n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.removeEmptyTextNodes(i),this.fixBuggedCaret()})):"historyRedo"===e.inputType&&n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),i.querySelectorAll(".input-something:not([contenteditable])").forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(i),this.fixBuggedCaret()}))}},this.onKeyDown=e=>{var t;const i=e.key;if("ArrowDown"===i||"ArrowUp"===i)this.lastNode=this.lastOffset=void 0;else{const{node:e,offset:t}=this.getCaretPosN();this.lastNode=e,this.lastOffset=t,this.lastNode===this.input&&(this.lastNode=this.lastOffset=void 0)}this.log("keydown",this.lastNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode,this.lastOffset,this.getCaretPosN(),e)},this.log=(0,n.kg)("RICH-INPUT"),this.listenerSetter=new o.Z,this.savedRanges=new WeakMap,this.listenerSetter.add(document)("selectionchange",this.saveSelectionOnChange),m&&(this.listenerSetter.add(document)("focusout",this.onFocusOut),this.listenerSetter.add(document)("selectionchange",this.onSelectionChange),this.listenerSetter.add(document)("beforeinput",this.onBeforeInput),this.listenerSetter.add(document)("keydown",this.onKeyDown,{capture:!0}),s.IS_FIREFOX&&(this.inputCaptureCallbacks=[],this.listenerSetter.add(document)("input",(()=>{this.inputCaptureCallbacks.forEach((e=>e())),this.inputCaptureCallbacks.length=0}),{capture:!0})))}get input(){const e=document.getSelection(),{anchorNode:t}=e;if(t)return(t.closest?t:t.parentElement).closest('[contenteditable="true"]')}saveRangeForElement(e){e&&(e.isContentEditable||"INPUT"===e.tagName)&&document.getSelection().rangeCount&&this.savedRanges.set(e,document.getSelection().getRangeAt(0))}findPreviousSmthIndex(e,t,i){const s=Array.from(null!=i?i:e.querySelectorAll(".input-something")),n=s.findIndex((e=>h(e,0,t,0)>=0));return-1===n?s.length-1:Math.max(0,n-1)}superMove(e,t,i,s){var n,a;const{node:o,offset:d,move:l}=t,c=e.querySelectorAll(".input-something"),h=this.findPreviousSmthIndex(e,o,c),u=document.createRange();u[i?"setEnd":"setStart"](o,d),s&&l(i);const f=this.getCaretPosN();if((null===(n=f.node)||void 0===n?void 0:n.nodeValue)===r.Z&&(!s||o===this.lastNode)){const t=this.findPreviousSmthIndex(e,f.node,c);let n=!s;for(;;){const s=this.getCaretPosN(),d=this.findPreviousSmthIndex(e,s.node,c);u[i?"setStart":"setEnd"](s.node,s.offset);const f=u.toString(),m=!p.test(f);if(this.log("test cursor",f,m,t,d),!m||(null===(a=s.node)||void 0===a?void 0:a.nodeValue)!==r.Z||d!==t||!d&&!s.offset||!(d{e.classList.add("br-not-br")}))}fixBuggedCaret(){const e=document.getSelection(),t=e.getRangeAt(0);e.removeAllRanges(),e.addRange(t)}addInputCallback(e,t,i=!0){const n=()=>{this.log("input modify callback"),t()};i&&s.IS_FIREFOX?this.inputCaptureCallbacks.push(n):this.listenerSetter.add(e)("input",n,{once:!0,capture:i})}removeExtraBOMs(e){const t=e=>{var t;return null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-something")};e.querySelectorAll(".input-filler").forEach((e=>{var i;const{previousSibling:s,nextSibling:n}=e;let o=!1;!(null===(i=null==n?void 0:n.classList)||void 0===i?void 0:i.contains("input-filler"))&&(0,a.Hc)(n)&&(o=t(s)||t(n)),o||(this.log.warn("removing empty bom node",e),e.remove())}))}getFiller(e){return e&&e.nodeType===e.TEXT_NODE&&e.parentElement!==this.input?e.parentElement:e}getCaretPosN(){const e=(0,u.Z)(this.input);return Object.assign(Object.assign({},e),{move:this.move.bind(this,e.selection)})}removeEmptyTextNodes(e){const{log:t}=this,i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:t=>t.parentElement!==e||t.nodeValue?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT});let s;for(;s=i.nextNode();)t.warn("removing empty text node",s),s.remove()}removePossibleBOMSiblings(e,t){[e,t].forEach((e=>{var t;(null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-filler"))&&e.remove()}))}removePossibleBOMSiblingsByNode(e){const{previousSibling:t,nextSibling:i}=e;this.removePossibleBOMSiblings(t,i)}processEmptiedFillers(e){e.querySelectorAll(".input-filler-text").forEach((e=>{var t;this.removeExtraBOMs(e);let i=!0;if(e.textContent)p.test(e.textContent)||e.querySelector(".input-something")?i=!1:e.classList.replace("input-filler-text","input-filler");else{e.classList.replace("input-filler-text","input-filler");const i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE));i?i.insertData(0,r.Z):(null===(t=e.t)||void 0===t?void 0:t.nodeValue)?e.append(e.t):e.append(document.createTextNode(r.Z))}i&&this.removePossibleBOMSiblingsByNode(e)}))}processFilledFillers(e){e.querySelectorAll(".input-filler").forEach((e=>{if(e.textContent!==r.Z){e.classList.replace("input-filler","input-filler-text");const t=e.t,i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE&&e.nodeValue.includes(r.Z)));if(i&&!(null==t?void 0:t.nodeValue)){const e=i.nodeValue.indexOf(r.Z);-1!==e&&i.deleteData(e,r.Z.length)}}}))}setSelectionClassName(e,t){if(e.rangeCount){const i=e.getRangeAt(0);t?Array.from(t.querySelectorAll(".input-selectable")).forEach((e=>{e.classList.toggle("selection",!i.collapsed&&i.intersectsNode(e))})):Array.from(document.querySelectorAll(".input-selectable.selection")).forEach((e=>e.classList.remove("selection")))}}move(e,t){const{focusNode:i,focusOffset:s}=e;e.modify("extend",t?"backward":"forward","character"),t?e.collapseToStart():e.collapseToEnd();const{focusNode:n,focusOffset:a}=e;this.log("moving cursor",t,i,i.nodeType===i.ELEMENT_NODE?i:i.parentElement,s,n,n.nodeType===n.ELEMENT_NODE?n:n.parentElement,a)}prepareApplyingMarkdown(){const{input:e}=this,t=e.querySelectorAll(".input-filler"),i=e.querySelectorAll(".input-something");return i.forEach((e=>{e.contentEditable="inherit"})),()=>{t.forEach((e=>{e.contentEditable="inherit"})),i.forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(e)}}static getInstance(){var e;return null!==(e=this.INSTANCE)&&void 0!==e?e:this.INSTANCE=new g}}},130:(e,t,i)=>{"use strict";function s(e,t){e.setAttribute("dir","auto"),"string"==typeof t?t?e.innerHTML=t:e.replaceChildren():e.replaceChildren(t)}i.d(t,{Z:()=>s})},1656:(e,t,i)=>{"use strict";function s(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>s(e,!t)}i.d(t,{Z:()=>s})},2648:(e,t,i)=>{"use strict";function s(e,t){if(!e.parentNode)return-1;if(t)return Array.from(e.parentNode.childNodes).indexOf(e);let i=0;for(;null!==(e=e.previousElementSibling);)++i;return i}i.d(t,{Z:()=>s})},6339:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(2738),n=i(5975),a=i(3241),o=i(5432),r=i(5953),d=i(9818),l=i(8497),c=i(3512);class h extends a.Z{constructor(e){super(!1),this.onClickOut=e=>{const t=e.target;(0,n.Z)(t,this.element)||Array.from(this.ignoreButtons).some((e=>(0,n.Z)(t,e)||t===e))||!(this.ignoreMouseOut.size<=1)||this.ignoreOutClickClassName&&(0,l.Z)(t,this.ignoreOutClickClassName)||this.toggle(!1)},this.onMouseOut=e=>{if(!this.isActive())return;if(this.clearTimeout("toggle"),this.ignoreMouseOut.size)return;const t=e.toElement;t&&(0,n.Z)(t,this.element)||this.setTimeout("toggle",(()=>{this.toggle(!1)}),200)},this.toggle=e=>{return t=this,i=void 0,a=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())return;const i=o.Z||!c.Z.settings.animationsEnabled?0:200;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"),this.dispatchEvent("openAfterLayout"),d.Z.pushItem(this.navigationItem={type:"dropdown",onPop:()=>{this.toggle(!1)}}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.forceClose=!1,this.dispatchEvent("opened")}),i)}else this.dispatchEvent("close"),this.ignoreMouseOut.clear(),this.ignoreButtons.clear(),this.element.classList.remove("active"),d.Z.removeItem(this.navigationItem),(0,s.EN)(window,this.onClickOut,{capture:!0}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")}),i)},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a},(0,r.Z)(this,e),this.forceClose=!1,this.inited=!1,this.ignoreMouseOut=new Set,this.ignoreButtons=new Set,this.timeouts={}}attachButtonListener(e,t){let i=!0;o.Z?(0,s.fc)(e,(()=>{i?(i=!1,this.toggle(!0)):this.toggle()}),{listenerSetter:t}):(t.add(e)("mouseover",(s=>{i&&(t.add(e)("mouseout",(e=>{this.clearTimeout("toggle"),this.onMouseOut(e)})),i=!1),this.setTimeout("toggle",(()=>{this.toggle(!0)}),200)})),(0,s.fc)(e,(()=>{const t="click",i=!this.ignoreMouseOut.has(t);i&&!this.ignoreMouseOut.size&&(this.ignoreButtons.add(e),setTimeout((()=>{(0,s.fc)(window,this.onClickOut,{capture:!0})}),0)),this.setIgnoreMouseOut(t,i),this.toggle(i)}),{listenerSetter:t}))}clearTimeout(e){void 0!==this.timeouts[e]&&(clearTimeout(this.timeouts[e]),delete this.timeouts[e])}setTimeout(e,t,i){this.clearTimeout(e),this.timeouts[e]=window.setTimeout((()=>{this.clearTimeout(e),t()}),i)}init(){o.Z||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||this.clearTimeout("toggle")})}isActive(){return this.element.classList.contains("active")}setIgnoreMouseOut(e,t){t?this.ignoreMouseOut.add(e):this.ignoreMouseOut.delete(e)}}},4789:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,f:()=>s});var s,n=i(8594),a=i(3035),o=i(5296),r=i(3512),d=i(8487);function l(e){var t,i,o;if(null!==(t=e.margin)&&void 0!==t||(e.margin=0),null!==(i=e.maxDistance)&&void 0!==i||(e.maxDistance=1500),null!==(o=e.axis)&&void 0!==o||(e.axis="y"),r.Z.settings.animationsEnabled&&0!==e.forceDuration||(e.forceDirection=s.Static),e.forceDirection===s.Static)return e.forceDuration=0,c(e);const d=(0,a.AD)().then((()=>c(e)));return"y"===e.axis?(0,n.YW)(d):d}function c(e){const{element:t,container:i,getNormalSize:s,getElementPosition:n,transitionFunction:a,axis:r,margin:l,position:f,forceDirection:p,maxDistance:m,forceDuration:g}=e;if(!(0,d.Z)(t))return(0,o.Kx)(i),Promise.resolve();const v="y"===r?"top":"left",b="y"===r?"bottom":"right",y="y"===r?"height":"width",w="y"===r?"scrollHeight":"scrollWidth",S="y"===r?"scrollHeight":"offsetWidth",C="y"===r?"scrollTop":"scrollLeft",E=t.getBoundingClientRect(),L=i.getBoundingClientRect?i.getBoundingClientRect():document.body.getBoundingClientRect(),I=E[v]-L[v],M=n?n({elementRect:E,containerRect:L,elementPosition:I}):I,P=t[S],Z=s?s({rect:L}):L[y];let k=i[C];const T=i[w];let x;switch(f){case"start":x=M-l;break;case"end":x=E[b]-L[b]+l;break;case"nearest":case"center":if(Pm?(k=i.scrollTop+=x-m,x=m):x<-m&&(k=i.scrollTop+=x+m,x=-m)),x<0){const e=-k;x=Math.max(x,e)}else if(x>0){const e=T-(k+Z);x=Math.min(x,e)}const A=i[C]+x,_=Math.abs(x),F=null!=g?g:250+_/1500*350,D=Date.now(),R=null!=a?a:_<500?u:h,B=()=>F?Math.min((Date.now()-D)/F,1):1,N=()=>{const e=B(),t=R(e),s=x*(1-t);return i[C]=Math.round(A-s),e<1};if(!F||!x)return(0,o.Kx)(i),N(),Promise.resolve();if(e.startCallback){const t=T-Math.round(A+i["y"===r?"offsetHeight":"offsetWidth"]);e.startCallback({scrollSize:T,scrollPosition:k,distanceToEnd:t,path:x,duration:F,containerRect:L,elementRect:E,getProgress:B})}return(0,o.cK)(N,i)}function h(e){return 1-Math.pow(1-e,5)}function u(e){return 1-Math.pow(1-e,3.5)}!function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(s||(s={}))},8801:(e,t,i)=>{"use strict";i.d(t,{P:()=>n});const s="_";function n(e,t){const i=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(i?"."+i:i)}},1708:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7625);function n(e){(0,s.Z)(e.history,((t,i,s)=>{t.action.photo||(s.splice(i,1),void 0!==e.count&&--e.count)}))}},4081:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e,t="auto"){if(0===e)return(0,s.ag)("FileSize.B",[0]);const i="auto"===t,n=Math.floor(Math.log(e)/Math.log(1024)),a="auto"===t?Math.max(0,n-1):t,o=Math.max(0,a),r=(e/Math.pow(1024,n)).toFixed(o);return(0,s.ag)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][n],[i?r:parseFloat(r)])}},8939:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325);const n={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks",mm:"Months",y:"Years"};function a(e,t){const i=function(e,t=2){e||(e=1);const i=[],s=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let n=1;s.forEach(((t,a)=>{if(n=Math.round(n*t.m),e=0;--e)0===a[e].duration&&a.splice(e,1);return a}(e,2);if(t){const e=i.map((e=>s.ZP.format(n[e.type],!0,[e.duration])));return(0,s.v_)(e,!1,t)}const a=i.map((e=>(0,s.ag)(n[e.type],[e.duration]))),o=document.createElement("span");return o.append(...(0,s.v_)(a,!1)),o}},6272:(e,t,i)=>{"use strict";i.d(t,{u:()=>r});var s=i(2325);const n=new Map;let a=0;const o=(e,t,i="")=>{i=t.country_code+i,a=Math.max(a,i.length),n.set(i,{country:e,code:t})};function r(e){e=e||"",n.size||s.ZP.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((i=>{o(e,t,i)})):o(e,t)}))}));let t=e.replace(/\D/g,"");const i=t.slice(0,a);let r;for(let e=i.length-1;e>=0&&(r=n.get(i.slice(0,e+1)),!r);--e);if(!r)return{formatted:t,country:void 0,code:void 0,leftPattern:""};const d=r.country,l=r.code.patterns||[],c=t.slice(r.code.country_code.length);let h="",u=0,f="";for(let e=l.length-1;e>=0;--e){h=l[e];const t=h.replace(/ /g,"");let i=0;for(let e=0,s=Math.min(c.length,t.length);eu&&(u=i,f=h)}h=f||h,h=h.replace(/\d/g,"X"),h=r.code.country_code+" "+h,h.split("").forEach(((e,i)=>{" "===e&&" "!==t[i]&&t.length>i&&(t=t.slice(0,i)+" "+t.slice(i))}));let p=h&&h.length>t.length?h.slice(t.length):"";return p&&(p=p.replace(/X/g,"‒")),{formatted:t,country:d,code:r.code,leftPattern:p}}},645:(e,t,i)=>{"use strict";i.d(t,{M:()=>s,Z:()=>n});class s{constructor(){this.cache=new Map}static createCache(){const e={frames:new Map,framesNew:new Map,framesURLs:new Map,clearCache:()=>{e.framesNew.forEach((e=>{var t,i;null===(i=(t=e).close)||void 0===i||i.call(t)})),e.frames.clear(),e.framesNew.clear(),e.framesURLs.clear()},counter:0};return e}getCache(e){let t=this.cache.get(e);return t||this.cache.set(e,t=s.createCache()),++t.counter,t}releaseCache(e){const t=this.cache.get(e);t&&!--t.counter&&this.cache.delete(e)}getCacheCounter(e){const t=this.cache.get(e);return null==t?void 0:t.counter}generateName(e,t,i,s,n){return[e,t,i,s?"colored":"",n||""].filter(Boolean).join("-")}}const n=new s},9171:(e,t,i)=>{"use strict";function s(e,t,i,s,n,a,o){return[e,",",t," ",i," ",s,",",n," ",a,",",o].join("")}function n(e,t,i,n,a,o,r,d){const l=[];return l.push("M"+(e+i/2)+","+t),l.push("H"+(e+i-o)),o>0&&l.push("A"+s(o,o,0,0,1,e+i,t+o)),l.push("V"+(t+n-r)),r>0&&l.push("A"+s(r,r,0,0,1,e+i-r,t+n)),l.push("H"+(e+d)),d>0&&l.push("A"+s(d,d,0,0,1,e+0,t+n-d)),l.push("V"+(t+a)),a>0&&l.push("A"+s(a,a,0,0,1,e+a,t+0)),l.push("Z"),l.join(" ")}i.d(t,{Z:()=>n}),i(410).GO.generatePathData=n},1046:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(6740),n=i(1185),a=i(6705);function o(e,t,i){const o=(0,n.Z)(e,t,!1);let r,d;if(i){const e=(0,a.Z)(o);r=e.canvas,d=e.promise}else r=new Image,d=(0,s.cj)(r,o);return r.classList.add("thumbnail"),{image:r,loadPromise:d}}},1185:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4059);function n(e,t,i=!1){return(0,s.Z)(t.bytes,i)}},8580:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1507),n=i(1046);function a(e,t,i,a=!1){const o=["video","gif"].includes(e.type);if(!t.downloaded||o||a){if("document"===e._&&t.downloaded&&!a&&(!o||t.type!==s.Pt))return null;const r=e.sizes||e.thumbs,d=(null==r?void 0:r.length)?r.find((e=>"photoStrippedSize"===e._)):null;if(d&&"bytes"in d)return(0,n.Z)(e,d,i)}return null}},6074:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(7625),n=i(5953);class a{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,(0,n.Z)(this,e)}setTargets(e,t,i){this.previous=e,this.next=t,this.reverse=i}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 i,s;if(e>0){if(i=this.next.splice(0,e),s=i.pop(),!s)return;void 0!==this.current&&i.unshift(this.current),this.previous.push(...i)}else{if(i=this.previous.splice(Math.max(0,this.previous.length+e),-e),s=i.shift(),!s)return;void 0!==this.current&&i.push(this.current),this.next.unshift(...i)}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 i=e>0?Math.max(0,e-this.next.length):Math.min(0,e+this.previous.length),s=this.go(e,!i&&t);return{item:i?void 0:s,leftLength:i}}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,i=e?this.loadPromiseDown:this.loadPromiseUp;return i||(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),i=this.loadMore(t,e,this.loadCount).then((t=>{return n=this,a=void 0,r=function*(){if((e?this.loadPromiseDown:this.loadPromiseUp)!==i)return;t.items.length{const t=this.processItem?this.processItem(e):e;t&&n.push(t)}));const a=yield Promise.all(n);e?this.reverse?this.previous.unshift(...a):this.next.push(...a):this.reverse?this.next.push(...a):this.previous.unshift(...a),this.onLoadedMore&&this.onLoadedMore()},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}),(()=>{})).then((()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null})),e?this.loadPromiseDown=i:this.loadPromiseUp=i,i)}}},3699:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(){this.listeners=new Set}add(e){return(t,i,s)=>{const n={element:e,event:t,callback:i,options:s};return this.addManual(n),n}}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,i,s){let n;for(const a of this.listeners)if(a.element===e&&a.event===t&&a.callback===i&&a.options===s){n=a;break}n&&this.remove(n)}removeAll(){this.listeners.forEach((e=>{this.remove(e)}))}}},9405:(e,t,i)=>{"use strict";i.d(t,{C:()=>a,c:()=>n});var s=i(9897);class n{constructor(e=0,t=e){this.width=e,this.height=t}aspect(e,t){return(0,s.Z)(this.width,this.height,e.width,e.height,t)}aspectFitted(e){return this.aspect(e,!0)}aspectCovered(e){return this.aspect(e,!1)}}function a(e,t){return new n(e,t)}},4755:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,_:()=>s});var s,n=i(410),a=i(3241),o=i(9405);!function(e){e[e.mobile=0]="mobile",e[e.medium=1]="medium",e[e.large=2]="large"}(s||(s={}));const r=(0,o.C)(20,20),d=(0,o.C)(36,36),l=(0,o.C)(18,18);class c extends a.Z{constructor(){super(),this.screenSizes=[{key:s.mobile,value:600},{key:s.medium,value:1275},{key:s.large,value:1680}],this.sizes={handhelds:{regular:(0,o.C)(270,270),webpage:(0,o.C)(270,200),album:(0,o.C)(270,0),esgSticker:(0,o.C)(68,68),animatedSticker:(0,o.C)(180,180),staticSticker:(0,o.C)(180,180),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(240,0),round:(0,o.C)(200,200),documentName:(0,o.C)(200,0),invoice:(0,o.C)(270,270),extendedInvoice:(0,o.C)(270,270),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(68,68)},desktop:{regular:(0,o.C)(420,340),webpage:(0,o.C)(420,340),album:(0,o.C)(420,0),esgSticker:(0,o.C)(72,72),animatedSticker:(0,o.C)(200,200),staticSticker:(0,o.C)(200,200),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(330,0),round:(0,o.C)(280,280),documentName:(0,o.C)(240,0),invoice:(0,o.C)(320,320),extendedInvoice:(0,o.C)(420,340),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(80,80)}},this.isMobile=!1,this.handleResize=()=>{const e=window.innerWidth;let t=this.screenSizes[0].key;for(let i=this.screenSizes.length-1;i>=0;--i)if(this.screenSizes[i].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame((()=>{this.handleResize(),this.rAF=0}))})),this.handleResize()}}const h=new c;n.GO.mediaSizes=h;const u=h},8631:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});const s=(0,i(5471).Z)("MIDDLEWARE");function n(e,t=s){return i=>{if(!(i instanceof Promise)){if(i instanceof Error)throw i;return i}return i.then((i=>{if(!e())throw t;return i}))}}},3228:(e,t,i)=>{"use strict";function s(e,t,i){return ei?i:e}i.d(t,{Z:()=>s})},2559:(e,t,i)=>{"use strict";function s(e,t=2){if(0===e)return"0";const i=t<0?0:t,s=Math.floor(Math.log(e)/Math.log(1e3));return parseFloat((e/Math.pow(1e3,s)).toFixed(i))+["","K","M","B","T"][s]}i.d(t,{Z:()=>s})},2575:(e,t,i)=>{"use strict";function s(e,t=" "){const i=e.toString().split(".");return i[0]=i[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),i.join(".")}i.d(t,{Z:()=>s})},925:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e,t=e.HAVE_METADATA,i){return new Promise(((n,a)=>{if(e.readyState>=t)return void n();const o=s.IS_APPLE_MOBILE&&!i?"loadeddata":"canplay",r="error",d=()=>{e.removeEventListener(r,l),n()},l=t=>{e.removeEventListener(o,d),a(t)};e.addEventListener(o,d,{once:!0}),e.addEventListener(r,l,{once:!0})}))}},2296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(9818),n=i(5432),a=i(4762),o=i(3910),r=i(2738),d=i(5975),l=i(3241);class c extends l.Z{constructor(e,t){super(!1),this.navigationType=e,this.withOverlay=t,this.onClick=e=>{var t;this.element&&(0,d.Z)(e.target,this.element)||((null===(t=this.listenerOptions)||void 0===t?void 0:t.capture)&&(0,o.Z)(e),this.close())},this.listenerOptions=t?{}:{capture:!0}}close(){var e;this.element&&(null===(e=this.overlay)||void 0===e||e.remove(),this.element=void 0,this.dispatchEvent("toggle",!1)),n.Z||window.removeEventListener("contextmenu",this.onClick,this.listenerOptions),document.removeEventListener(r.pf,this.onClick,this.listenerOptions),a.IS_MOBILE_SAFARI||s.Z.removeByType(this.navigationType)}open(e){this.close(),a.IS_MOBILE_SAFARI||s.Z.pushItem({type:this.navigationType,onPop:e=>{this.close()}}),this.element=e,!this.overlay&&this.withOverlay&&(this.overlay=document.createElement("div"),this.overlay.classList.add("btn-menu-overlay"),this.overlay.addEventListener(r.pf,(e=>{(0,o.Z)(e),this.onClick(e)}))),this.overlay&&this.element.parentElement.insertBefore(this.overlay,this.element),n.Z||window.addEventListener("contextmenu",this.onClick,Object.assign(Object.assign({},this.listenerOptions),{once:!0})),document.addEventListener(r.pf,this.onClick,this.listenerOptions),this.dispatchEvent("toggle",!0)}}},5180:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7445);function n(e,t,i){const n=(e=+e)<0,a=s.Z[t];if(!a)throw new Error("CURRENCY_WRAP_INVALID");const o=e/Math.pow(10,a.exp);let r=a.exp;"IRR"==t&&Math.floor(o)==o&&(r=0);let d=function(e,t,i,s){e=(e+"").replace(/[^0-9+\-Ee.]/g,"");var n=isFinite(+e)?+e:0,a=isFinite(+t)?Math.abs(t):0,o=void 0===s?",":s,r=void 0===i?".":i,d="";return d=(a?function(e,t){var i=Math.pow(10,t);return""+Math.round(e*i)/i}(n,a):""+Math.round(n)).split("."),d[0].length>3&&(d[0]=d[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,o)),(d[1]||"").length{"use strict";i.d(t,{Z:()=>n});var s=i(4755);function n(e,t,i,n){e.touches&&(e=e.touches[0]);const{pageX:a,pageY:o}=e,r=Array.from(t.children).find((e=>e.classList.contains("btn-menu-item")&&!e.classList.contains("hide")))||t;let{scrollWidth:d}=r;const{scrollHeight:l}=t,c=document.body.getBoundingClientRect(),h=c.width,u=c.height;d+=2*r.offsetLeft;let f=8,p=8,m=8,g=8;n&&(n.top&&n.top,n.right&&(p+=n.right),n.bottom&&(m+=n.bottom),n.left&&(g+=n.left)),i=s.Z.isMobile?"right":"left";let v="top";const b=u-l-m,y=h-d-p,w=g,S={x:{left:a,right:Math.min(y,a-d)},intermediateX:"right"===i?w:y,y:{top:o,bottom:o-l},intermediateY:b},C={left:S.x.left+d+p<=h,right:S.x.right>=g},E={top:S.y.top+l+m<=u,bottom:S.y.bottom-m>=m};{const e=C[i]?S.x[i]:(i="center",S.intermediateX);t.style.left=e+"px"}{const e=E[v]?S.y[v]:(v="center",S.intermediateY);t.style.top=e+"px"}return t.className=t.className.replace(/(top|center|bottom)-(left|center|right)/g,""),t.classList.add(("center"===v?v:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left")),{width:d,height:l}}},677:(e,t,i)=>{"use strict";i.d(t,{RP:()=>a,X:()=>o});const s=new Set(["all","web","webk"]),n=new Set;function a(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function o(e){return!!a(e)}},3174:(e,t,i)=>{"use strict";i.d(t,{O:()=>o,k:()=>a});var s=i(3512);const n={};function a(e,t,i,s){const a=e.id+"-"+t,o=n[a];return o&&o.width>=i&&o.height>=s}function o(e,t,i){return o=this,r=void 0,l=function*(){const o=e.id+"-"+i,{width:r,height:d}=t;if(a(e,i,r,d))return;const l=n[o]={width:r,height:d},c=yield s.Z.managers.appDocsManager.getLottieCachedThumb(e.id,i);if(n[o]!==l)return;if(c&&c.w>=r&&c.h>=d)return;const h=new Promise((e=>{t.toBlob((t=>e(t)))})),u=yield h;n[o]===l&&s.Z.managers.appDocsManager.saveLottiePreview(e.id,u,r,d,i)},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}},9966:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3035);function n(e){return function(e,t){let i,s=!1;return(...n)=>{i=n,s||(s=!0,e((()=>{s=!1,t(...i)})))}}(s.T2,e)}},8936:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5953);class n{constructor(e){this.loading=!1,this.loaded=!1,(0,s.Z)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then((e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()}),(()=>{this.promise=void 0,this.loading=!1}))))}}},3719:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3781),n=i(2790),a=i(3512),o=i(7625),r=i(1708),d=i(6074),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class c extends d.Z{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{const a=t?0:i;let o=null==e?void 0:e.mid;var d;return void 0===o&&(o=this.searchContext.maxId),t||(d=o,1,o=(0,s.Z)((0,n.Z)(d)+1)),this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:i,backLimit:a})).then((e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(0,r.Z)(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history})))},processItem:t=>l(this,void 0,void 0,(function*(){if((yield this.filterMids([t.mid])).length)return e.processItem(t)}))})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const i=i=>i.peerId===e&&t.has(i.mid),s=(e,t,s)=>{i(e)&&s.splice(t,1)};(0,o.Z)(this.previous,s),(0,o.Z)(this.next,s),this.current&&i(this.current)&&(this.current=void 0,this.onEmptied&&this.onEmptied())},this.onHistoryMultiappend=e=>l(this,void 0,void 0,(function*(){if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;if(e.peerId!==this.searchContext.peerId)return;const t=yield this.filterMids([e.mid]),i=(yield Promise.all(t.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)},null!==(t=this.managers)&&void 0!==t||(this.managers=a.Z.managers),a.Z.addEventListener("history_delete",this.onHistoryDelete),a.Z.addEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.addEventListener("message_sent",this.onMessageSent),e.isInner||(this.otherSideLoader=new c(Object.assign(Object.assign({},e),{isInner:!0})))}filterMids(e){return l(this,void 0,void 0,(function*(){const t=`${this.searchContext.peerId}_${this.searchContext.isScheduled?"scheduled":"history"}`;return yield this.managers.appMessagesManager.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(e){let t=this.previous;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.previous)),t}getNext(e){let t=this.next;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.next)),t}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 i;let s;if(null===(i=this.otherSideLoader)||void 0===i?void 0:i.current){if(s=this.otherSideLoader.goUnsafe(e,t),s.item)return s.item;if(!((e=s.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(s=this.goUnsafe(e,t),!s.item){if(this.loadedAllUp&&this.loadedAllDown)return this.goToOtherEnd(e);this.otherSideLoader&&(e=s.leftLength,s=this.otherSideLoader.goUnsafe(e,t),s.item&&this.unsetCurrent(e>0))}return null==s?void 0:s.item}setLoaded(e,t){var i;const s=super.setLoaded(e,t);if(s&&this.otherSideLoader&&t&&!1!==(null===(i=this.searchContext)||void 0===i?void 0:i.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 s}cleanup(){this.reset(),a.Z.removeEventListener("history_delete",this.onHistoryDelete),a.Z.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0,this.otherSideLoader&&(this.otherSideLoader.cleanup(),this.otherSideLoader=void 0)}}},9674:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(3035),n=i(3725),a=i(410),o=i(8487);const r=new class{constructor(){this.promises={},this.raf=s.T2.bind(null),this.scheduled=!1}do(e,t){let i=this.promises[e];return i||(this.scheduleFlush(),i=this.promises[e]=(0,n.Z)()),void 0!==t&&i.then((()=>t())),i}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const i=(0,o.Z)(e),s=i?this.mutate():Promise.resolve();return void 0!==t&&(i?s.then((()=>t())):t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf((()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}})))}};a.GO&&(a.GO.sequentialDom=r);const d=r},1713:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(1507),n=i(7030),a=i(9405),o=i(3114);function r(e,t,i,r,d=!0,l,c,h){const u=(0,o.Z)(e);let f;h||(h=(0,n.Z)(e,i,r,void 0,c));const p="document"===e._;f=p||u?(0,a.C)(e.w||h.w||512,e.h||h.h||512):(0,a.C)(h.w||100,h.h||100);let m=(0,a.C)(i,r);m=f=f.aspect(m,d);let g=!0;return(!p||["video","gif"].includes(e.type)||u)&&(m.width<200&&m.height<200&&(m=f=f.aspectCovered((0,a.C)(200,200))),l&&(l.message||l.reply_to_mid||l.media.webpage||l.replies&&l.replies.pFlags.comments&&l.replies.channel_id.toChatId()!==s.IA)&&m.width<320&&(m=(0,a.C)(320,m.height),g=!1),g&&m.width<120&&l&&(m=(0,a.C)(120,m.height),g=!1)),t.style.width=m.width+"px",t.style.height=m.height+"px",{photoSize:h,size:f,isFit:g}}},5345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,s:()=>h});var s=i(5003),n=i(6519),a=i(3624),o=i(8631),r=i(5953),d=i(5418),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let c=0;class h{constructor(e){var t;(0,r.Z)(this,e),this.queue=[],null!==(t=this.middlewareHelper)&&void 0!==t||(this.middlewareHelper=(0,a.k)());const i="BATCH-PROCESSOR-"+ ++c;this.log?this.log=this.log.bindPrefix(i):this.log=(0,s.kg)(i)}get queuePromise(){return this.promise}clear(){this.log("clear"),this.queue.length=0,this.promise=void 0,this.middlewareHelper.clean()}addToQueue(e){return this.queue.push(e),this.setQueue()}setQueue(){if(!this.queue.length)return Promise.resolve();if(this.promise)return this.promise;const e=this.middlewareHelper.get(),t=this.log.bindPrefix("queue"),i=(0,o.Z)(e,this.possibleError),s=()=>l(this,void 0,void 0,(function*(){t("start",this.queue.length);const e=this.queue.splice(0,this.queue.length),n=performance.now(),a=e.map((e=>(e.then((e=>{t("render item time",performance.now()-n,e)})),e))),o=yield i(Promise.all(a));if(yield i(this.process(o,i,t)),t("queue rendered"),this.queue.length)return t("have new items to render"),s();t("end")}));t("setting pause");const n=this.promise=i((0,d.Z)(0)).then((()=>s().catch((e=>{throw e!==this.possibleError&&t.error("process queue error",e),e}))),(e=>{throw t("pause has been cleared"),e})).finally((()=>{this.promise===n&&(this.promise=void 0)}));return n}}class u{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),(0,r.Z)(this,e),this.elements=new Map,this.sorted=[],this.middleware=(0,a.k)(),this.batchProcessor=new h({log:this.log,process:(e,t,i)=>l(this,void 0,void 0,(function*(){const i=e.map((e=>this.update(e.id,e)));yield t(Promise.all(i))}))})}clear(){this.batchProcessor.clear(),this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach((e=>{this.update(e.id)})),this.onSort&&this.sorted.forEach(((e,t)=>{this.onSort(e,t)}))}updateList(e){const t=this.middleware.get();this.updateListWith((i=>{t()&&(void 0===i||i)?(this._updateList(),null==e||e(!0)):null==e||e(!1)}))}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e){return l(this,void 0,void 0,(function*(){if(this.get(e))return;const t={id:e,index:0};this.elements.set(e,t);const i=Promise.resolve(this.onElementCreate(t));return this.batchProcessor.addToQueue(i)}))}delete(e,t){const i=this.elements.get(e);if(!i)return!1;this.elements.delete(e);const s=this.sorted.indexOf(i);if(-1!==s&&this.sorted.splice(s,1),this.onDelete)if(t)this.onDelete(i);else{const e=this.middleware.get();this.updateElementWith((()=>{e()&&this.onDelete(i)}))}return!0}update(e,t=this.get(e)){var i;return l(this,void 0,void 0,(function*(){if(!t)return;if(t.index=yield this.getIndex(t),this.get(e)!==t)return;null===(i=this.onUpdate)||void 0===i||i.call(this,t);const s=(0,n.Z)(this.sorted,t,"index");this.onSort(t,s)}))}}},6854:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="\ufeff"},4056:(e,t,i)=>{"use strict";function s(e){return e.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,(e=>"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";")).replace(/([^\#-~| |!])/g,(e=>"&#"+e.charCodeAt(0)+";")).replace(//g,">")}i.d(t,{Z:()=>s})},3738:(e,t,i)=>{"use strict";function s(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}i.d(t,{Z:()=>s})},8456:(e,t,i)=>{"use strict";function s(e,t,i=t+10){return(e=e.trim()).length>i&&(e=e.slice(0,t)+"..."),e}i.d(t,{Z:()=>s})},5157:(e,t,i)=>{"use strict";function s(e,t=!1){const i=parseInt(e+"",10),s=Math.floor(i/3600);let n=Math.floor((i-3600*s)/60),a=i-3600*s-60*n;return s&&(t=!0),n<10&&(n=t?"0"+n:n),a<10&&(a="0"+a),(s?s+":":"")+n+":"+a}i.d(t,{Z:()=>s})},8812:(e,t,i)=>{"use strict";function s(e){const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const i=new FileReader;i.onload=t=>{e(t.target.result)},i.readAsDataURL(t)}))}i.d(t,{Z:()=>s})},241:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1352);const n=new class{constructor(){if(s.kC)return;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}}},8594:(e,t,i)=>{"use strict";i.d(t,{YW:()=>f,ZP:()=>v,e9:()=>g,gp:()=>m});var s=i(3725),n=i(410),a=i(5418);const o=new(i(3241).Z),r="start",d="end";let l=!1,c=(0,s.Z)(),h=0;c.resolve();const u=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function f(e,t){l||(c=(0,s.Z)(),o.dispatchEvent(r),l=!0,n.ZP&&u("start")),++h,n.ZP&&u("attach promise, length:",h,t);const i=[void 0!==t?(0,a.Z)(t):void 0,e.finally((()=>{}))].filter(Boolean),d=performance.now(),f=c;return Promise.race(i).then((()=>{c!==f||c.isFulfilled||(--h,n.ZP&&u("promise end, length:",h,performance.now()-d),h<=0&&p())})),c}function p(){c.isFulfilled||(l=!1,h=0,o.dispatchEvent(d),c.resolve(),n.ZP&&u("end"))}function m(){p()}function g(){return c}function v(e,t,i){l&&e();const s=i?i.add(o):o.addEventListener.bind(o),n=i?i.removeManual.bind(i,o):o.removeEventListener.bind(o);return s(r,e),s(d,t),()=>{n(d,t),n(r,e)}}window.dispatchHeavyAnimationEvent=f},8130:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AppDialogsManager:()=>ut,DIALOG_LIST_ELEMENT_TAG:()=>st,default:()=>pt});var s=i(9331),n=i(3512),a=i(3003),o=i(6194),r=i(2325),d=i(4668),l=i(8127),c=i(7425),h=i(4039),u=i(2796),f=i(3897),p=i(1483),m=i(3416),g=i(1507),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class b{constructor(e){this.managers=e,this.onArchiveClick=()=>v(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getDialogOnly(this.peerId);e&&this.managers.appMessagesManager.editPeerFolders([e.peerId],+!e.folder_id)})),this.hideTopic=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,hidden:!0})},this.toggleTopic=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,closed:!this.dialog.pFlags.closed})},this.onPinClick=()=>{const{peerId:e,filterId:t,threadId:i}=this;this.managers.appMessagesManager.toggleDialogPin({peerId:e,filterId:t,topicId:i}).catch((e=>v(this,void 0,void 0,(function*(){if("PINNED_DIALOGS_TOO_MUCH"===e.type||"PINNED_TOO_MUCH"===e.type)if(i)this.managers.apiManager.getLimit("topicPin").then((e=>{(0,u.bC)({langPackKey:"LimitReachedPinnedTopics",langPackArguments:[e]})}));else if(t>=1)(0,u.bC)({langPackKey:"PinFolderLimitReached"});else{const e=yield this.managers.apiManager.getConfig();new l.Z("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{h.ZP.createTab(c.Z).open()}}],descriptionLangKey:"PinToTopLimitReached2",descriptionLangArgs:[(0,r.ag)("Chats",[e.pinned_dialogs_count_max])]}).show()}}))))},this.onUnmuteClick=()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,mute:!1,threadId:this.threadId})},this.onMuteClick=()=>{new f.Z(this.peerId,this.threadId)},this.onUnreadClick=()=>v(this,void 0,void 0,(function*(){const{peerId:e,dialog:t}=this;t.unread_count?(this.managers.appMessagesManager.readHistory(e,t.top_message,this.threadId),this.threadId||this.managers.appMessagesManager.markDialogUnread(e,!0)):this.threadId||this.managers.appMessagesManager.markDialogUnread(e)})),this.onDeleteClick=()=>{new o.Z(this.peerId,void 0,void 0,this.threadId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=(0,d.Z)(e.target,st)}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{v(this,void 0,void 0,(function*(){this.peerId=t.dataset.peerId.toPeerId(),this.threadId=+t.dataset.threadId||void 0,this.dialog=yield this.managers.dialogsStorage.getDialogOrTopic(this.peerId,this.threadId),this.filterId=this.threadId?void 0:pt.filterId,this.canManageTopics=this.threadId?yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics"):void 0,yield Promise.all(this.buttons.map((e=>v(this,void 0,void 0,(function*(){const t=yield e.verify();e.element.classList.toggle("hide",!t)})))));const i=this.threadId?"Delete":yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);this.buttons[this.buttons.length-1].element.lastChild.replaceWith((0,r.ag)(i)),t.classList.add("menu-open"),(0,p.Z)(e,this.element),m.Z.openBtnMenu(this.element,(()=>{t.classList.remove("menu-open"),this.peerId=this.dialog=this.filterId=this.threadId=this.canManageTopics=void 0}))}))})()}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>v(this,void 0,void 0,(function*(){return!this.threadId&&!(yield this.managers.appMessagesManager.isDialogUnread(this.dialog))}))},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>this.managers.appMessagesManager.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>v(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&!(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}))},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>v(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned))}))},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>v(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>v(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.peerId!==n.Z.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.peerId!==n.Z.myId},{icon:"eye2",text:"Hide",onClick:this.hideTopic,verify:()=>v(this,void 0,void 0,(function*(){return this.canManageTopics&&this.dialog.id===g.Ox}))},{icon:"lock",text:"CloseTopic",onClick:this.toggleTopic,verify:()=>this.canManageTopics&&!this.dialog.pFlags.closed},{icon:"lockoff",text:"RestartTopic",onClick:this.toggleTopic,verify:()=>this.canManageTopics&&!!this.dialog.pFlags.closed},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>v(this,void 0,void 0,(function*(){return!this.threadId||!!this.canManageTopics&&this.dialog.id!==g.Ox}))}],this.element=(0,a.b)({buttons:this.buttons}),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var y=i(6008),w=i(1405),S=i(8805),C=i(632),E=i(4762),L=i(5003),I=i(9355),M=i(4494),P=i(9099),Z=i(410),k=i(8842),T=i(1447),x=i(9492),A=i(534),_=i(2738),F=i(4484),D=i(5565),R=i(4159),B=i(3442),N=i(7487),O=i(9174),U=i(3910),H=i(490);class z{constructor(e,t){this.managers=e,this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=e=>{Promise.all([N.Z.get("dc"),n.Z.managers.rootScope.getConnectionStatus()]).then((([t,i])=>{t||(t=R.Z.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const s=i["NET-"+t],n=s&&(e||s.status)===O.Q.Connected;this.connecting&&n&&this.managers.apiUpdatesManager.forceGetDifference(),n&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=s&&(e||s.status)===O.Q.TimedOut,this.connecting=!n,this.retryAt=s&&s.retryAt,Z.ZP&&this.log("connecting",this.connecting),this.setState()}))},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,(0,D.Z)(this.statusEl,(0,r.ag)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{if(H.Z.deactivatedReason)return;const e=z.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",(()=>this.managers.networkerFactory.forceReconnect()));this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,i=()=>{const i=Date.now();e.innerText=""+Math.round((t-i)/1e3),i>t&&clearInterval(s)},s=setInterval(i,1e3);i();const n=this.getA("ConnectionStatus.Reconnect",(()=>this.managers.networkerFactory.forceReconnectTimeout()));this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");Z.ZP&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame((()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout),this.setStateTimeout=window.setTimeout((()=>{(0,P.Z)({element:this.statusContainer,className:"is-shown",forwards:this.connecting||this.updating,duration:200}),this.setStateTimeout=0,Z.ZP&&this.log("setState: isShown:",this.connecting||this.updating)}),e)}))},this.log=(0,L.kg)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=(0,M.Z)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new B.Z({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),t.prepend(this.statusContainer),n.Z.addEventListener("connection_status_change",(e=>{this.setConnectionStatus()})),n.Z.addEventListener("state_synchronizing",(e=>{e||(this.updating=!0,Z.ZP&&this.log("updating",this.updating),this.setState())})),n.Z.addEventListener("state_synchronized",(e=>{Z.ZP&&this.log("state_synchronized",e),e||(this.updating=!1,Z.ZP&&this.log("updating",this.updating),this.setState())})),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,z.CHANGE_STATE_DELAY+1e3)}getA(e,t){const i=document.createElement("a");return i.classList.add("force-reconnect"),i.append((0,r.ag)(e)),(0,_.fc)(i,(e=>{(0,U.Z)(e),t()})),i}}z.CHANGE_STATE_DELAY=1e3;var j,G=i(6740),V=i(3035),K=i(2894),W=i(5432),$=i(1154),q=i(241),Q=i(8487);!function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(j||(j={}));var Y=i(5345),J=i(5701),X=i(5296),ee=i(8222);function te(e,t,i,s){return e>=s?t+i:function(e,t){return-t/2*(Math.cos(Math.PI*e)-1)}(e/s,i)+t}var ie=i(4755);function se(e,t,i,s,n,a,o,r){const d=e.canvas.dpr;if(d&&(t*=d,i*=d,s*=d,n*=d),"number"==typeof a)d&&(a*=d),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]?d?a[t]*d:a[t]:e[t]}e.beginPath(),e.moveTo(t+a.tl,i),e.lineTo(t+s-a.tr,i),e.quadraticCurveTo(t+s,i,t+s,i+a.tr),e.lineTo(t+s,i+n-a.br),e.quadraticCurveTo(t+s,i+n,t+s-a.br,i+n),e.lineTo(t+a.bl,i+n),e.quadraticCurveTo(t,i+n,t,i+n-a.bl),e.lineTo(t,i+a.tl),e.quadraticCurveTo(t,i,t+a.tl,i),e.closePath(),o&&e.fill(),r&&e.stroke()}const ne=window.devicePixelRatio,ae=20*ne,oe=2.5*ne,re=2*ne,de=1*ne;var le=i(6818),ce=i(9818),he=i(3013),ue=i(130),fe=i(4332),pe=i(1168),me=i(7030),ge=i(8115),ve=i(496),be=i(5381),ye=i(7530),we=i(2291),Se=i(5772),Ce=i(3385),Ee=i(2554),Le=i(8050),Ie=i(6976),Me=i(3725),Pe=i(7362),Ze=i(8631),ke=i(2312),Te=i(2059),xe=i(2493),Ae=i(319);var _e=i(3228);class Fe{constructor(){this.font="30pt Helvetica",this.currTime=Date.now(),this.diffTime=0,this.spread=0,this.paused=!1,this.pausedTime=0,this.pauseInterval=850,this.lightSource=0,this.inc=.032,this.lightSpread=.55,this.animations=["slide","slide","slide","slide"],this.currentAnimationIndex=0}keepTime(){this.diffTime=Date.now()-this.currTime,this.currTime=Date.now()}cycleAnimation(){++this.currentAnimationIndex,this.currentAnimationIndex>=this.animations.length&&(this.currentAnimationIndex=0)}animate(){const e=this.animations[this.currentAnimationIndex];return"glow"===e?this.animateGlow():"slide"===e?this.animateSlide():void console.log("unknown animation type: "+String(e))}animateGlow(){var e=68;return()=>{var t=this.diffTime/(1e3/60)*10;return this.paused?Date.now()-this.pausedTime>800&&(e=68,this.cycleAnimation(),this.paused=!1):(e=parseInt(""+(e+t)))>=255&&(this.paused=!0,this.pausedTime=Date.now()),"rgb("+e+","+e+","+e+")"}}animateSlide(){var e,t,i,s=this.ctx.createLinearGradient(0,0,this.canvas.width,0),n=this.inc*(this.diffTime/(1e3/60));if(this.paused){if(Date.now()-this.pausedTime>this.pauseInterval)return this.lightSource=-.6,this.cycleAnimation(),this.paused=!1,this.animateSlide()}else this.lightSource+=n,this.lightSource>1+this.lightSpread&&(this.paused=!0,this.pausedTime=Date.now());i=(0,_e.Z)(this.lightSource,0,1),e=(0,_e.Z)(this.lightSource-this.lightSpread,0,1),t=(0,_e.Z)(this.lightSource+this.lightSpread,0,1);const a=ee.Z.getProperty("background-color-true"),o=ee.Z.getProperty("surface-color");return s.addColorStop(e,a),s.addColorStop(i,o),s.addColorStop(t,a),s}settings(e={}){var t,i,s,n,a,o;this.canvas=null!==(t=e.canvas)&&void 0!==t?t:document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.font=null!==(i=e.font)&&void 0!==i?i:this.font,this.lightSpread=null!==(s=e.lightSpread)&&void 0!==s?s:this.lightSpread,this.inc=null!==(n=e.inc)&&void 0!==n?n:this.inc,this.animations=null!==(a=e.animations)&&void 0!==a?a:this.animations,this.text=null!==(o=e.text)&&void 0!==o?o:this.text,this.fillStyle=e.fillStyle,this.canvas.classList.add("shimmer-canvas")}on(){const{width:e,height:t}=this.canvas;this.keepTime(),this.ctx.clearRect(0,0,e,t),this.font&&(this.ctx.font=this.font),this.ctx.fillStyle=this.animate(),this.ctx.fillRect(0,0,e,t),this.fillStyle&&(this.ctx.fillStyle=this.fillStyle,this.ctx.fillRect(0,0,e,t)),this.text&&this.ctx.fillText(this.text,50,50)}}class De{constructor(e={}){var t,i,s;this.onThemeChange=()=>{this.stopAnimation(),this.startAnimation()},this.onResize=()=>{const{canvas:e}=this,{width:t,height:i,dpr:s}=e;this.updateCanvasSize(),e.width===t&&e.height===i&&e.dpr===s||(this.stopAnimation(),this.startAnimation())},this.shimmer=new Fe,this.tempId=0,this.canvas=document.createElement("canvas"),this.canvas.classList.add("dialogs-placeholder-canvas"),this.ctx=this.canvas.getContext("2d"),this.generatedValues=[],this.avatarSize=null!==(t=e.avatarSize)&&void 0!==t?t:54,this.marginVertical=null!==(i=e.marginVertical)&&void 0!==i?i:9,this.totalHeight=null!==(s=e.totalHeight)&&void 0!==s?s:this.avatarSize+2*this.marginVertical,this.lineHeight=10,this.lineBorderRadius=6,this.lineMarginVertical=8,this.statusWidth=24}attach({container:e,rect:t,getRectFrom:i,onRemove:s,blockScrollable:n}){const{canvas:a}=this;this.onRemove=s,this.getRectFrom="function"==typeof i?i:(i||e).getBoundingClientRect.bind(i||e),(this.blockScrollable=n)&&(n.container.style.overflowY="hidden"),this.updateCanvasSize(t),this.startAnimation(),e.append(a)}detach(e){this.detachTime||(this.availableLength=e,this.detachTime=Date.now(),n.Z.settings.animationsEnabled||this.remove())}remove(){this.stopAnimation(),this.canvas.parentElement&&(this.canvas.remove(),this.onRemove&&(this.onRemove(),this.onRemove=void 0),this.blockScrollable&&(this.blockScrollable.container.style.overflowY="",this.blockScrollable=void 0))}updateCanvasSize(e=this.getRectFrom()){const{canvas:t}=this,i=t.dpr=window.devicePixelRatio;t.width=e.width*i,t.height=e.height*i,t.style.width=e.width+"px",t.style.height=e.height+"px"}renderDetachAnimationFrame(){const{canvas:e,ctx:t,detachTime:i,length:s,availableLength:a}=this;if(!i)return;if(!n.Z.settings.animationsEnabled)return void this.remove();const{width:o}=e;t.globalCompositeOperation="destination-out";const r=Date.now()-i;let d=!0;for(let e=0;e=a?15*(a-1):15*e);if(i<=0){d=!1;continue}const n=te(i,0,1,150);t.beginPath(),t.rect(0,this.dialogHeight*e,o,this.dialogHeight),t.fillStyle=`rgba(0, 0, 0, ${n})`,t.fill(),n<1&&(d=!1)}t.globalCompositeOperation="source-over",d&&this.remove()}renderFrame(){this.shimmer.on(),this.renderDetachAnimationFrame()}startAnimation(){const{canvas:e,shimmer:t}=this,i=++this.tempId,s=this.createPattern();t.settings({canvas:e,fillStyle:s});const a=()=>this.tempId===i;this.renderFrame(),(0,X.jt)((()=>!!a()&&(n.Z.settings.animationsEnabled&&this.renderFrame(),a()))),n.Z.addEventListener("theme_change",this.onThemeChange),ie.Z.addEventListener("resize",this.onResize)}stopAnimation(){++this.tempId,n.Z.removeEventListener("theme_change",this.onThemeChange),ie.Z.removeEventListener("resize",this.onResize)}createPattern(){const{canvas:e,ctx:t}=this,i=document.createElement("canvas"),s=i.getContext("2d"),n=e.dpr;i.dpr=n,i.width=e.width,i.height=e.height,s.fillStyle=ee.Z.getProperty("surface-color"),s.fillRect(0,0,i.width,i.height),s.fillStyle="#000",s.globalCompositeOperation="destination-out";const a=this.dialogHeight=this.totalHeight*n,o=this.length=Math.ceil(e.height/a);for(let e=0;e{})).finally((()=>{e[t]===s&&delete e[t]}));const n=(0,Ze.Z)((()=>e[t]===s));return{deferred:s,middleware:n}}class at extends Y.Z{constructor(e){super({getIndex:e=>{var t;return this.managers.dialogsStorage.getDialogIndex(null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,this.indexKey,this.forumPeerId?e.id:void 0)},onDelete:e=>{var t;e.dom.listEl.remove(),null===(t=this.onListLengthChange)||void 0===t||t.call(this)},onSort:(e,t)=>{var i;const s=e.dom.listEl.parentElement!==this.list;(0,F.Z)(e.dom.listEl,this.list,t),s&&(null===(i=this.onListLengthChange)||void 0===i||i.call(this))},onElementCreate:e=>it(this,void 0,void 0,(function*(){var t;const i=[],s=ft.addListDialog({peerId:null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,loadPromises:i,isBatch:!0,threadId:this.forumPeerId?e.id:void 0,isMainList:"index_0"===this.indexKey});return e.dom=s.dom,e.dialogElement=s,yield Promise.all(i),e})),updateElementWith:V.TR,log:e.log}),(0,Ke.Z)(this,e)}clear(){this.list.replaceChildren(),super.clear()}}class ot extends je.ZP{constructor({peerId:e,rippleEnabled:t=!0,onlyFirstName:i=!1,meAsSaved:n=!0,avatarSize:a="bigger",autonomous:o,loadPromises:r,fromName:d,noIcons:l,threadId:c,wrapOptions:h={},isMainList:u}){var f;super({clickable:!0,noRipple:!t,havePadding:!c,title:!0,titleRightSecondary:!0,subtitle:!0,subtitleRight:!0,noWrap:!0,asLink:!0}),this.subtitleRight.remove();const p=c?void 0:new s.Z;if(p){const t={bigger:54,abitbigger:42,small:32}[a];p.classList.add("dialog-avatar","avatar-"+t),p.updateWithOptions({loadPromises:r,lazyLoadQueue:h.lazyLoadQueue,isDialog:!!n,peerId:e,peerTitle:d}),this.applyMediaElement(p,a)}const m=this.container,g=this.title;g.classList.add("user-title"),this.titleRow.classList.add("dialog-title");const v=new k.Z,b=v.update({peerId:e,fromName:d,dialog:n,onlyFirstName:i,withIcons:!l,threadId:c});null==r||r.push(b),g.append(v.element),g.classList.add("tgico");const y=this.subtitle,w=this.container;w.classList.add("chatlist-chat","chatlist-chat-"+a),o||(w.href="#"+e),"bigger"===a?this.container.classList.add("row-big"):"small"===a&&this.container.classList.add("row-small"),w.dataset.peerId=""+e,c&&(w.dataset.threadId=""+c);const S=document.createElement("span");S.classList.add("message-status","sending-status");const C=document.createElement("span");C.classList.add("message-time");const E=this.titleRight;E.classList.add("dialog-title-details"),E.append(S,C),this.subtitleRow.classList.add("dialog-subtitle");const L=this.dom={avatarEl:p,captionDiv:m,titleSpan:v.element,titleSpanContainer:g,statusSpan:S,lastTimeSpan:C,lastMessageSpan:y,containerEl:w,listEl:w,subtitleEl:this.subtitleRow};if(!o){w.dialogDom=L;const t=I.Z.chat;t&&I.Z.isSamePeer(t,{peerId:e,threadId:c,type:"chat"})&&ft.setDialogActive(w,!0),u&&(null===(f=ft.forumTab)||void 0===f?void 0:f.peerId)===e&&!c&&w.classList.add("is-forum-open")}}createUnreadBadge(){if(this.dom.unreadBadge)return;const e=this.dom.unreadBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22",this.dom.subtitleEl.append(e)}createUnreadAvatarBadge(){if(this.dom.unreadAvatarBadge)return;const e=this.dom.unreadAvatarBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 avatar-badge",this.dom.listEl.append(e)}createMentionsBadge(){if(this.dom.mentionsBadge)return;const e=this.dom.mentionsBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 mention mention-badge",e.innerText="@",this.dom.lastMessageSpan.after(e)}toggleBadgeByKey(e,t,i,s){(0,P.Z)({element:this.dom[e],className:"is-visible",forwards:t,duration:s?0:250,onTransitionEnd:t?void 0:()=>{this.dom[e].remove(),delete this.dom[e]},useRafs:i&&(0,Q.Z)(this.dom[e])?0:2})}}class rt extends Ve.h{toggle(e){return it(this,void 0,void 0,(function*(){this.init2&&(yield this.init2()),(0,P.Z)({element:this.container,className:"is-visible",forwards:e,duration:300,onTransitionEnd:e?void 0:()=>{this.onCloseAfterTimeout()},useRafs:this.firstTime?(this.firstTime=void 0,2):void 0})}))}init(e){(0,Ke.Z)(this,e),this.log=(0,L.kg)("FORUM"),this.firstTime=!0,this.container.classList.add("topics-container");const t=!this.slider;t&&(this.closeBtn.classList.replace("tgico-left","tgico-close"),this.container.classList.add("active","is-floating"),(0,_.fc)(this.closeBtn,(()=>{ft.toggleForumTab(void 0,this)}),{listenerSetter:this.listenerSetter})),this.rows=document.createElement("div"),this.rows.classList.add("sidebar-header__rows"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("sidebar-header__subtitle"),this.title.replaceWith(this.rows),this.rows.append(this.title,this.subtitle);const i=ft.createChatList();ft.setListClickListener(i,null,!0),this.scrollable.append(i),this.xd=new ct(this.peerId,t?80:0),this.xd.scrollable=this.scrollable,this.xd.sortedList=new at({managers:this.managers,log:this.log,list:i,indexKey:"index_0",forumPeerId:this.peerId}),this.xd.bindScrollable();const s=()=>({peerId:this.peerId,type:"chat"}),a=(0,$e.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"info",text:"ForumTopic.Context.Info",onClick:()=>it(this,void 0,void 0,(function*(){const e=h.ZP.createTab(Ye.Z,!0);e.isFirst=!0,e.setPeer(this.peerId),(yield e.fillProfileElements())(),e.loadSidebarMedia(!0),e.open()}))},{icon:"message",text:"ForumTopic.Context.ShowAsMessages",onClick:()=>{const e=I.Z.chat;I.Z[(null==e?void 0:e.peerId)===this.peerId?"setPeer":"setInnerPeer"](s())},verify:()=>{const e=I.Z.chat;return!e||!I.Z.isSamePeer(e,s())}},{icon:"adduser",text:"ForumTopic.Context.AddMember",onClick:()=>{},verify:()=>this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"invite_users")},{icon:"add",text:"ForumTopic.Context.New",onClick:()=>{h.ZP.createTab(et.Z).open(this.peerId)},separator:!0,verify:()=>this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics")}]});if(this.listenerSetter.add(n.Z)("history_reload",(e=>{this.peerId===e&&this.xd.fullReset()})),this.listenerSetter.add(n.Z)("chat_update",(e=>it(this,void 0,void 0,(function*(){this.peerId===e.toPeerId(!0)&&((yield this.managers.appChatsManager.getChat(e)).pFlags.forum||ft.toggleForumTab(void 0,this))})))),this.header.append(a),!t)return this.init2()}init2(){return it(this,void 0,void 0,(function*(){this.init2=void 0;const e=this.middlewareHelper.get(),t=this.peerId;this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId()),e.onDestroy((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId())}));const i=(0,Pe.Z)({peerId:t,dialog:!0,wrapOptions:{middleware:e}}),s=I.Z.setPeerStatus({peerId:t,element:this.subtitle,needClear:!0,useWhitespace:!1,middleware:e,noTyping:!0});return Promise.all([i,s,this.xd.onChatsScroll().then((e=>e.cached?e.renderPromise:void 0))]).then((([t,i,s])=>{e()&&(this.title.append(t),null==i||i())}))}))}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.xd.destroy()}}const dt=new Error("not implemented");class lt{constructor(){this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout((()=>{this.sliceTimeout=void 0,this.sortedList.list.childElementCount&&!ft.processContact&&(0,V.TR)((()=>{const e=performance.now(),t=this.scrollable.scrollTop,i=this.sortedList.list.firstElementChild,s=this.scrollable.container.getBoundingClientRect(),n=i.getBoundingClientRect(),a=Array.from(this.scrollable.splitUp.children);let o=this.scrollable.splitUp.offsetTop;o&&t{this.deleteDialogByKey(this.getDialogKeyFromElement(e))})),this.setOffsets(),this.scrollable.scrollTop=c.offsetTop-u,this.log("slice time",performance.now()-e)}))}),200)},this.log=(0,L.kg)("CL"),this.offsets={top:0,bottom:0},this.managers=n.Z.managers,this.listenerSetter=new We.Z}getOffsetIndex(e){return{index:this.scrollable.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){const t=this.getOffsetIndex("top"),i=this.getOffsetIndex("bottom");if(!t.index&&!i.index)return!0;const s=(0,Le.Z)(e,this.indexKey);return(!t.index||s<=t.index)&&(!i.index||s>=i.index)}setIndexKey(e){this.indexKey=e,this.sortedList.indexKey=e}deleteDialogByKey(e){this.sortedList.delete(e)}deleteDialog(e){return this.deleteDialogByKey(this.getDialogKey(e))}updateDialog(e){const t=this.getDialogKey(e);if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e);if(!this.sortedList.has(t)&&this.loadedDialogsAtLeastOnce)return void this.sortedList.add(t);const i=this.getDialogElement(t);i&&(ft.setLastMessageN({dialog:e,dialogElement:i,setUnread:!0}),this.sortedList.update(t))}onChatsScrollTop(){return this.onChatsScroll("top")}onChatsScroll(e="bottom"){return this.loadDialogs(e)}createPlaceholder(){const e=this.placeholder=new De(this.placeholderOptions),t=this.getRectFromForPlaceholder();return e.attach({container:this.sortedList.list.parentElement,getRectFrom:t,onRemove:()=>{this.placeholder=void 0},blockScrollable:this.scrollable}),e}loadDialogs(e){const t=this.log.bindPrefix("load-"+(i=1e3,s=9999,i=Math.ceil(i),s=Math.floor(s),Math.floor(Math.random()*(s-i+1))+i));var i,s;if(t("try",e),this.loadDialogsPromise||this.loadDialogsRenderPromise)return this.loadDialogsPromise;if(this.scrollable.loadedAll[e])return Promise.resolve({cached:!0,renderPromise:Promise.resolve()});t.warn("start",e);const n=(0,ze.Z)("MIDDLEWARE"),a=(0,Me.Z)(),o=new Promise(((i,s)=>it(this,void 0,void 0,(function*(){const r=this.sortedList.list;let d=this.placeholder;try{const i=this.loadDialogsInner(e);r.childElementCount||d||(this.loadedDialogsAtLeastOnce||!this.needPlaceholderAtFirstTime)&&(yield i).cached||(d=this.createPlaceholder(),a.resolve(!1));const s=yield i,l=yield s.result;if(this.loadDialogsRenderPromise!==o)throw n;a.resolve(s.cached),"bottom"===e?l.isEnd&&(this.scrollable.loadedAll[e]=!0):l.isTopEnd&&(this.scrollable.loadedAll[e]=!0);const c=l.dialogs.length;if(t(`will render ${c} dialogs`),c){const t=("top"===e?l.dialogs.slice().reverse():l.dialogs).map((e=>this.sortedList.add(this.getDialogKey(e))));if(yield Promise.all(t).catch(),this.loadDialogsRenderPromise!==o)throw n}const h=l.dialogs["top"===e?0:c-1];h&&(this.offsets[e]=(0,Le.Z)(h,this.indexKey)),this.loadedDialogsAtLeastOnce=!0,ft.onListLengthChange(),t("getDialogs",l,r.childElementCount),setTimeout((()=>{this.scrollable.onScroll()}),0),d&&d.detach(r.childElementCount)}catch(e){return"MIDDLEWARE"!==(null==e?void 0:e.type)&&t.error(e),s(e),void a.reject(e)}i()})))).finally((()=>{this.loadDialogsRenderPromise===o?(t("end"),this.loadDialogsRenderPromise=void 0):t("has been cleared")}));this.loadDialogsRenderPromise=o;const r=this.loadDialogsPromise=a.then((e=>({cached:e,renderPromise:o}))).finally((()=>{this.loadDialogsPromise===r&&(this.loadDialogsPromise=void 0)}));return r}setOffsets(){return it(this,void 0,void 0,(function*(){const e=this.sortedList.list,[t,i]=yield Promise.all([this.getDialogFromElement(e.firstElementChild),this.getDialogFromElement(e.lastElementChild)]),{indexKey:s}=this;this.offsets.top=(0,Le.Z)(t,s),this.offsets.bottom=(0,Le.Z)(i,s)}))}getDialogKey(e){throw dt}getDialogKeyFromElement(e){throw dt}getRectFromForPlaceholder(){throw dt}getDialogFromElement(e){throw dt}loadDialogsInner(e){throw dt}setTyping(e){return it(this,void 0,void 0,(function*(){const t=this.getDialogKey(e),i=this.getDialogDom(t);if(!i)return;const s=i.lastMessageSpan.querySelector(".peer-typing-container"),n=yield I.Z.getPeerTyping(e.peerId,s,"forumTopic"===e._?e.id:void 0);!s&&n&&((0,D.Z)(i.lastMessageSpan,n),i.lastMessageSpan.classList.add("user-typing"))}))}unsetTyping(e){const t=this.getDialogKey(e),i=this.getDialogElement(t);i&&(i.dom.lastMessageSpan.classList.remove("user-typing"),ft.setLastMessageN({dialog:e,lastMessage:null,dialogElement:i,setUnread:null}))}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialogElement(e){const t=this.sortedList.get(e);return null==t?void 0:t.dialogElement}bindScrollable(){this.scrollable.container.addEventListener("scroll",this.onChatsRegularScroll),this.scrollable.onScrolledTop=this.onChatsScrollTop.bind(this),this.scrollable.onScrolledBottom=this.onChatsScroll.bind(this),this.scrollable.setVirtualContainer(this.sortedList.list)}clear(){var e;this.sortedList.clear(),null===(e=this.placeholder)||void 0===e||e.remove()}reset(){this.scrollable.loadedAll.top=!0,this.scrollable.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0}fullReset(){return this.reset(),this.clear(),this.onChatsScroll()}destroy(){this.scrollable.destroy(),this.listenerSetter.removeAll()}}class ct extends lt{constructor(e,t){super(),this.peerId=e,this.paddingX=t,this.placeholderOptions={avatarSize:0,marginVertical:5,totalHeight:64},this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,threadId:t,typings:i})=>it(this,void 0,void 0,(function*(){if(!t||this.peerId!==e)return;const s=yield this.managers.dialogsStorage.getForumTopic(e,t);s&&(i.length?this.setTyping(s):this.unsetTyping(s))})))),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{for(const[t,{dialog:i,topics:s}]of e)t===this.peerId&&(null==s?void 0:s.size)&&s.forEach((e=>{this.updateDialog(e)}))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{"forumTopic"===(null==e?void 0:e._)&&e.peerId===this.peerId&&ft.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))})})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>{"forumTopic"===e._&&e.peerId===this.peerId&&ft.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))})})),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{"forumTopic"===e._&&e.peerId===this.peerId&&this.deleteDialogByKey(this.getDialogKey(e))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{"forumTopic"===e._&&e.peerId===this.peerId&&(t?this.deleteDialog(e):this.updateDialog(e))}))}isDialogMustBeInViewport(e){return!e.pFlags.hidden&&super.isDialogMustBeInViewport(e)}getDialogKey(e){return e.id}getDialogKeyFromElement(e){return+e.dataset.threadId}getRectFromForPlaceholder(){return()=>{const e=h.ZP.rect;return{top:56,right:e.right,bottom:0,left:this.paddingX,width:e.width-this.paddingX,height:e.height-56}}}getDialogFromElement(e){return this.managers.dialogsStorage.getForumTopic(+e.dataset.peerId,+e.dataset.threadId)}loadDialogsInner(e){return it(this,void 0,void 0,(function*(){const{indexKey:t}=this;let i=q.Z.height/64*1.25|0,s=0;const n=this.peerId,{index:a}=this.getOffsetIndex(e);if(s=a,a)if("top"===e){const e=yield this.managers.dialogsStorage.getFolderDialogs(n,!0),o=e.findIndex((e=>(0,Le.Z)(e,t)<=a)),r=Math.max(0,o-i);i=o-r,s=(0,Le.Z)(e[r],t)+1}else s=a;return this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:s,limit:i,filterId:n,skipMigrated:!0})}))}}class ht extends lt{constructor(e){super(),this.filterId=e,this.needPlaceholderAtFirstTime=!0,this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,typings:t})=>it(this,void 0,void 0,(function*(){const[i,s]=yield Promise.all([this.managers.appMessagesManager.getDialogOnly(e),this.managers.appPeersManager.isForum(e)]);i&&!s&&(t.length?this.setTyping(i):this.unsetTyping(i))})))),this.listenerSetter.add(n.Z)("user_update",(e=>it(this,void 0,void 0,(function*(){if(!this.isActive)return;const t=e.toPeerId(),i=this.getDialogDom(t);if(!i)return;const s=yield this.managers.appUsersManager.getUserStatus(e),n="userStatusOnline"===(null==s?void 0:s._);this.setOnlineStatus(i.avatarEl,n)})))),this.listenerSetter.add(n.Z)("chat_update",(e=>it(this,void 0,void 0,(function*(){const t=e.toPeerId(!0);this.processDialogForCallStatus(t)})))),this.listenerSetter.add(n.Z)("dialog_flush",(({dialog:e})=>{this.isActive&&e&&(ft.setLastMessageN({dialog:e,setUnread:!0}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{var t;if(this.isActive)for(const[i,{dialog:s,topics:n}]of e)"dialog"===(null==s?void 0:s._)&&(this.updateDialog(s),null===(t=ft.processContact)||void 0===t||t.call(ft,i.toPeerId()),this.validateDialogForFilter(s))})),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{var t;this.isActive&&"dialog"===e._&&(this.deleteDialogByKey(e.peerId),null===(t=ft.processContact)||void 0===t||t.call(ft,e.peerId))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{this.isActive&&"dialog"===(null==e?void 0:e._)&&(ft.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>{this.isActive&&"forumTopic"!==e._&&(this.validateDialogForFilter(e),ft.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{var s;this.isActive&&"forumTopic"!==e._&&(t?this.deleteDialog(e):this.updateDialog(e),null===(s=ft.processContact)||void 0===s||s.call(ft,i))})),this.listenerSetter.add(n.Z)("filter_update",(e=>it(this,void 0,void 0,(function*(){if(this.isActive&&e.id===this.filterId&&!g.DZ.has(e.id)){const e=yield this.managers.dialogsStorage.getCachedDialogs(!0);yield this.validateListForFilter();for(let t=0,i=e.length;t(0,Le.Z)(e,i)<=o)),r=Math.max(0,a-s);s=a-r,n=(0,Le.Z)(e[r],i)+1}else n=o;const r=this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:n,limit:s,filterId:t,skipMigrated:!0}),d=yield r;return a&&(d.result=Promise.reject((0,ze.Z)("MIDDLEWARE"))),d}))}setOnlineStatus(e,t){const i="is-online",s=e.classList.contains(i);!s&&t&&e.classList.add(i),(0,P.Z)({element:e,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.classList.remove(i)},useRafs:t&&!s?2:0})}generateScrollable(e,t){const i=t.id,s=new S.ZP(null,"CL",500);s.container.dataset.filterId=""+i;const a=(0,Ce.Z)(t.localId),o=new at({managers:n.Z.managers,log:this.log,list:e,indexKey:a,onListLengthChange:ft.onListLengthChange});return this.scrollable=s,this.sortedList=o,this.setIndexKey(a),this.bindScrollable(),s}testDialogForFilter(e){return g.DZ.has(this.filterId)?this.filterId===e.folder_id:void 0!==(0,Le.Z)(e,this.indexKey)}isDialogMustBeInViewport(e){return!(void 0!==e.migratedTo||!this.testDialogForFilter(e))&&super.isDialogMustBeInViewport(e)}validateListForFilter(){return it(this,void 0,void 0,(function*(){this.sortedList.getAll().forEach((e=>it(this,void 0,void 0,(function*(){const t=yield n.Z.managers.appMessagesManager.getDialogOnly(e.id);this.testDialogForFilter(t)||this.deleteDialog(t)}))))}))}validateDialogForFilter(e){this.getDialogElement(e.peerId)&&(this.testDialogForFilter(e)||this.deleteDialog(e))}setCallStatus(e,t){let{callIcon:i,listEl:s}=e;if(!i&&t){const{canvas:t,startAnimation:n}=e.callIcon=i=function(e=!1){const t=document.createElement("canvas");t.width=t.height=ae;const i=t.getContext("2d"),s=(ae-(3*re+2*oe))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=te((Date.now()-n)%1e3,0,1,1e3);i.clearRect(0,0,ae,ae),i.fillStyle=e&&!ie.Z.isMobile?ee.Z.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=o>=.5?e%2?2-2*o:2*(o-.5):e%2?2*o:1-2*o;let n=4+8*t;n*=ne,se(i,s+e*re+e*oe,(ae-n)/2,re,n,de,!0)}return!0};return{canvas:t,startAnimation:()=>{(0,X.jt)(o),o()},setActive:t=>{e=t,o()}}}(s.classList.contains("active"));t.classList.add("dialog-group-call-icon"),s.append(t),n()}i&&(0,P.Z)({element:e.callIcon.canvas,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},useRafs:t?2:0})}processDialogForCallStatus(e,t){return it(this,void 0,void 0,(function*(){if(!le.Z)return;if(t||(t=this.getDialogDom(e)),!t)return;const i=yield n.Z.managers.appChatsManager.getChat(e.toChatId());this.setCallStatus(t,!(!i.pFlags.call_active||!i.pFlags.call_not_empty))}))}onChatsScroll(e="bottom"){var t;return this.scrollable.loadedAll[e]&&(null===(t=ft.loadContacts)||void 0===t||t.call(ft)),this.log("onChatsScroll",e),super.onChatsScroll(e)}toggleAvatarUnreadBadges(e,t){if(!e)return void this.sortedList.getAll().forEach((e=>{const{dom:t,dialogElement:i}=e;t.unreadAvatarBadge&&i.toggleBadgeByKey("unreadAvatarBadge",!1,!1,!1)}));const i=["unread","mention"];this.sortedList.getAll().forEach((e=>{var t;const{dom:s,dialogElement:n}=e,a=null===(t=s.unreadBadge)||void 0===t?void 0:t.textContent;if(!a||s.unreadBadge.classList.contains("backwards"))return;const o=!!s.unreadAvatarBadge;n.createUnreadAvatarBadge(),n.toggleBadgeByKey("unreadAvatarBadge",!0,o),s.unreadAvatarBadge.textContent=a;const r=s.unreadAvatarBadge.classList,d=s.unreadBadge.classList;i.forEach((e=>{r.toggle(e,d.contains(e))}))}))}getDialogKey(e){return e.peerId}getDialogKeyFromElement(e){return+e.dataset.peerId}getDialogFromElement(e){return n.Z.managers.appMessagesManager.getDialogOnly(e.dataset.peerId.toPeerId())}}class ut{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.log=(0,L.kg)("DIALOGS",L.v9.Log|L.v9.Error|L.v9.Warn|L.v9.Debug),this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.initedListeners=!1,this.xds={},this.onTabChange=()=>(this.xd=this.xds[this.filterId],this.xd.reset(),this.xd.onChatsScroll()),this._onListLengthChange=()=>{if(!this.xd.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId!==g.J$)return;const e=this.chatList,t=e.childElementCount,i=e.parentElement.parentElement,s=e.parentElement.nextElementSibling,n=!!s.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;i.classList.add("with-contacts");const a=new Ge.Z({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),this.managers.appUsersManager.getContactsPeerIds(void 0,void 0,"online").then((e=>{let t=!1;const i=()=>{t&&a.container.classList.toggle("hide",!s.list.childElementCount),this.updateContactsLength(!0)},s=new K.Z({avatarSize:"abitbigger",createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:i,managers:this.managers});this.loadContacts=()=>{const t=q.Z.height/60|0;(0,Ne.Z)(e.splice(0,t),this.verifyPeerIdForContacts).then((e=>{e.forEach((e=>{s.add(e)}))})),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>it(this,void 0,void 0,(function*(){if(e.isAnyChat())return;const t=yield this.verifyPeerIdForContacts(e),i=s.has(e);!i&&t?s.add(e):i&&!t&&s.delete(e)}));const n=s.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,i()})),s.append(a.container)},this.verifyPeerIdForContacts=e=>it(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.appPeersManager.isContact(e),this.managers.appMessagesManager.getDialogOnly(e)]);return t&&!i}))}start(){const e=this.managers=(0,Ee.Z)();this.contextMenu=new b(e),this.stateMiddlewareHelper=(0,He.k)(),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=(0,J.Z)(this._onListLengthChange,100,!1,!0);const t=document.createElement("div");t.classList.add("connection-status-bottom"),t.append(this.folders.container),this.forumsTabs=new Map,this.forumsSlider=document.createElement("div"),this.forumsSlider.classList.add("topics-slider"),this.chatsContainer.parentElement.parentElement.append(this.forumsSlider),W.Z&&(0,$.Z)({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e>0?t+1:t-1)}}),this.allChatsIntlElement=new r.ZP.IntlElement({key:"FilterAllChatsShort"}),n.Z.addEventListener("premium_toggle",(e=>it(this,void 0,void 0,(function*(){e||(yield this.managers.filtersStorage.isFilterIdAvailable(this.filterId))||s((0,Ue.Z)(this.filtersRendered[g.J$].menu),!1)})))),n.Z.addEventListener("state_cleared",(()=>{const e=g.DZ.has(this.filterId);Be.Z.getState().then((t=>it(this,void 0,void 0,(function*(){this.xd.loadedDialogsAtLeastOnce=!1,this.showFiltersPromise=void 0,e&&(this.xd.clear(),this.onTabChange()),this.onStateLoaded(t)}))))})),this.setFilterId(g.J$,g.J$),this.addFilter({id:g.J$,title:"",localId:g.J$});const i=new S.v7(this.folders.menuScrollContainer);t.prepend(this.folders.menuScrollContainer);const s=this.selectTab=(0,y.X)(this.folders.menu,this.folders.container,((e,t)=>it(this,void 0,void 0,(function*(){const i=e;if(e=+t.dataset.filterId||g.J$,-1!==this.filterId&&!g.DZ.has(e)&&!(yield this.managers.filtersStorage.isFilterIdAvailable(e)))return!1;const n=this.filterId;if(E.IS_MOBILE_SAFARI||(i?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{s(0),this.filtersNavigationItem=void 0}},ce.Z.spliceItems(1,0,this.filtersNavigationItem)):this.filtersNavigationItem&&(ce.Z.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),n===e)return;this.xds[e].clear();const a=this.setFilterIdAndChangeTab(e).then((({cached:e,renderPromise:t})=>{if(e)return t}));return-1!==n?a:void 0}))),(()=>{for(const e in this.xds)+e!==this.filterId&&this.xds[e].clear()}),void 0,i);Be.Z.getState().then((e=>(he.Z.setPlaybackParams(e.playbackParams),he.Z.addEventListener("playbackParams",(e=>{this.managers.appStateManager.pushToState("playbackParams",e)})),this.onStateLoaded(e)))),ie.Z.addEventListener("resize",(()=>{this.changeFiltersAllChatsKey()})),new z(this.managers,this.chatsContainer),this.chatsContainer.append(t),setTimeout((()=>{T.Z.loadLottieWorkers()}),200),pe.Z.MANAGERS=n.Z.managers=e,ke.Z.construct(e),h.ZP.construct(e),fe.ZP.construct(e),Te.ZP.construct(e),xe.Z.construct(e),I.Z.construct(e),this.xd=this.xds[this.filterId]}get chatList(){return this.xd.sortedList.list}setFilterId(e,t){this.filterId=e}setFilterIdAndChangeTab(e){return it(this,void 0,void 0,(function*(){return this.filterId=e,this.onTabChange()}))}initListeners(){n.Z.addEventListener("dialog_flush",(({dialog:e})=>{e&&this.setFiltersUnreadCount()})),n.Z.addEventListener("folder_unread",(e=>it(this,void 0,void 0,(function*(){if(e.id<0){const t=this.xd.getDialogElement(e.id);if(!t)return;this.setUnreadMessagesN({dialog:yield this.managers.dialogsStorage.getDialogOnly(e.id),dialogElement:t})}else this.setFilterUnreadCount(e.id)})))),n.Z.addEventListener("contacts_update",(e=>{var t;null===(t=this.processContact)||void 0===t||t.call(this,e.toPeerId())})),I.Z.addEventListener("peer_changed",(({peerId:e,threadId:t,isForum:i})=>{const s={peerId:e,threadId:i?t:void 0};for(const e of this.lastActiveElements){const t=+e.dataset.threadId||void 0,i=e.dataset.peerId.toPeerId();I.Z.isSamePeer({peerId:i,threadId:t},s)||this.setDialogActive(e,!1)}Array.from(document.querySelectorAll(`[data-autonomous="0"] .chatlist-chat[data-peer-id="${e}"]`)).forEach((t=>{const i=+t.dataset.threadId||void 0;I.Z.isSamePeer({peerId:e,threadId:i},s)&&this.setDialogActive(t,!0)}))})),n.Z.addEventListener("filter_update",(e=>it(this,void 0,void 0,(function*(){if(g.DZ.has(e.id))return;if(!this.filtersRendered[e.id])return void this.addFilter(e);const t=this.filtersRendered[e.id];(0,ue.Z)(t.title,(0,ge.Z)(e.title))})))),n.Z.addEventListener("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(t.container.remove(),t.menu.remove(),this.xds[e.id].destroy(),delete this.filtersRendered[e.id],this.onFiltersLengthChange(),this.filterId===e.id&&this.selectTab(0,!1))})),n.Z.addEventListener("filter_order",(e=>it(this,void 0,void 0,(function*(){e=e.slice(),(0,Oe.Z)(e,g.Zi);const t=this.folders.menu,i=yield Promise.all(e.map((e=>it(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),this.managers.filtersStorage.getFilter(e)]);return{indexKey:t,filter:i}})))));e.forEach(((e,s)=>{const{indexKey:n,filter:a}=i[s],o=this.filtersRendered[e];this.xds[e].setIndexKey(n),(0,F.Z)(o.menu,t,a.localId),(0,F.Z)(o.container,this.folders.container,a.localId)}))}))))}setDialogActive(e,t){var i;const s=e.dialogDom;e.classList.toggle("active",t),e.classList.toggle("is-forum-open",(null===(i=this.forumTab)||void 0===i?void 0:i.peerId)===e.dataset.peerId.toPeerId()&&!e.dataset.threadId),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return it(this,void 0,void 0,(function*(){this.stateMiddlewareHelper.clean();const t=this.stateMiddlewareHelper.get(),i=e.filtersArr,s=i.length>g.DZ.size,n=e=>{for(const t of e)this.addFilter(t)};let a;s?n(i):a=this.managers.filtersStorage.getDialogFilters().then(n),this.doNotRenderChatList=!0;const o=this.xd.onChatsScroll(),r=(0,Ze.Z)(t);try{yield r(o)}catch(e){}s||this.selectTab(0,!1),a&&(yield r(a)),this.doNotRenderChatList=void 0,this.filterId=-1,this.selectTab(0,!1),this.initedListeners||(this.initListeners(),this.initedListeners=!0),s&&this.showFiltersPromise&&(yield r(this.showFiltersPromise)),this.managers.appNotificationsManager.getNotifyPeerTypeSettings(),yield(yield r(o)).renderPromise.catch(Ae.Z),this.managers.appMessagesManager.fillConversations()}))}setFilterUnreadCount(e){var t;return it(this,void 0,void 0,(function*(){const i=null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!i)return;const{unreadUnmutedCount:s,unreadCount:n}=yield this.managers.dialogsStorage.getFolderUnreadCount(e);i.classList.toggle("badge-gray",!s);const a=e===g.J$?s:n;i.innerText=a?""+a:""}))}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}l(e){const t=this.createChatList(),i=this.xds[e.id]=new ht(e.id),s=i.generateScrollable(t,e);return this.setListClickListener(t,null,!0),{ul:t,xd:i,scrollable:s}}addFilter(e){if(e.id===g.Zi)return;const t=this.folders.menu,i=this.filtersRendered[e.id];if(i)return(0,F.Z)(i.menu,t,e.localId),void(0,F.Z)(i.container,this.folders.container,e.localId);const s=document.createElement("div");s.classList.add("menu-horizontal-div-item");const n=document.createElement("span"),a=document.createElement("span");a.classList.add("text-super"),e.id===g.J$?a.append(this.allChatsIntlElement.element):(0,ue.Z)(a,(0,ge.Z)(e.title));const o=document.createElement("div");o.classList.add("badge","badge-20","badge-primary");const r=document.createElement("i");n.append(a,o,r),(0,w.Z)(s),s.append(n),s.dataset.filterId=""+e.id,(0,F.Z)(s,t,e.localId);const{ul:d,scrollable:l}=this.l(e);l.container.classList.add("tabs-tab","chatlist-parts");const c=document.createElement("div");c.classList.add("chatlist-top");const h=document.createElement("div");h.classList.add("chatlist-bottom"),c.append(d),l.container.append(c,h);const u=l.container;(0,F.Z)(l.container,this.folders.container,e.localId),this.filtersRendered[e.id]={menu:s,container:u,unread:o,title:a},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){let e=this.showFiltersPromise;return null!=e?e:e=this.showFiltersPromise=(0,Re.Z)(0).then((()=>{if(this.showFiltersPromise!==e)return;const t=Object.keys(this.filtersRendered).length>1,i=!this.folders.menuScrollContainer.classList.contains("hide");t!==i&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!i&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0}))}generateEmptyPlaceholder(e){const t="empty-placeholder",i=document.createElement("div");i.classList.add(t,t+"-"+e.classNameType);const s=document.createElement("div");s.classList.add(t+"-header"),(0,r.$d)(s,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&(0,r.$d)(n,e.subtitle,e.subtitleArgs),i.append(s,n),{container:i,header:s,subtitle:n}}checkIfPlaceholderNeeded(){if(this.filterId===g.Zi)return;const e=this.chatList,t=e.parentElement;let i=Array.from(t.children).find((e=>e.matches(".empty-placeholder")));const s=this.xd.scrollable.loadedAll.bottom&&!e.childElementCount;if(s&&i)return;if(!s)return void(i&&(t.classList.remove("with-placeholder"),i.remove()));let n,a;if(this.filterId){n=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:a="folder"}),i=n.container;const e=document.createElement("div"),t="📂",s=128;(0,Se.Z)({div:e,emoji:t,width:s,height:s}),i.prepend(e);const o=(0,M.Z)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});(0,_.fc)(o,(()=>it(this,void 0,void 0,(function*(){h.ZP.createTab(A.Z).open(yield this.managers.filtersStorage.getFilter(this.filterId))})))),i.append(o)}else{n=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:a="dialogs"}),i=n.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new r.ZP.IntlElement({element:n.subtitle}),Promise.all([this.updateContactsLength(!1),(0,G.cj)(e,"assets/img/EmptyChats.svg"),(0,V.AD)()]).then((([e])=>{i.classList.add("visible"),t.classList.toggle("has-contacts",!!e)})),i.prepend(e)}t.append(i),t.classList.add("with-placeholder"),t.dataset.placeholderType=a}updateContactsLength(e){var t;return null!==(t=this.updateContactsLengthPromise)&&void 0!==t?t:this.updateContactsLengthPromise=this.managers.appUsersManager.getContacts().then((t=>{const i=this.emptyDialogsPlaceholderSubtitle;if(i){let e,s;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",s=[(0,r.ag)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",s=[]),i.compareAndUpdate({key:e,args:s})}return e&&this.chatList.parentElement.classList.toggle("has-contacts",!!t.length),this.updateContactsLengthPromise=void 0,t.length}))}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,i=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),i.replaceChildren(),this.loadContacts=void 0,this.processContact=void 0}toggleForumTab(e,t=this.forumTab){return it(this,void 0,void 0,(function*(){if(!t&&!e)return;if(t){const e=this.xd.getDialogElement(t.peerId);e&&e.dom.listEl.classList.remove("is-forum-open")}t===e&&(e=void 0),null==t||t.toggle(!1);const i=null==e?void 0:e.toggle(!0);if(t===this.forumTab&&(this.forumTab=e),e){const t=this.xd.getDialogElement(e.peerId);t&&t.dom.listEl.classList.add("is-forum-open")}i&&(yield i),e&&!this.forumNavigationItem?(this.forumNavigationItem={type:"forum",onPop:()=>{this.forumNavigationItem=void 0,this.toggleForumTab()}},ce.Z.pushItem(this.forumNavigationItem)):!e&&this.forumNavigationItem&&(ce.Z.removeItem(this.forumNavigationItem),this.forumNavigationItem=void 0);const s=!!e,n=i?2:void 0;this.xd.toggleAvatarUnreadBadges(s,n);const a=(0,Me.Z)();(0,P.Z)({element:this.forumsSlider.parentElement,className:"is-forum-visible",duration:300,forwards:s,useRafs:n,onTransitionEnd:()=>{a.resolve()}}),(0,Je.YW)(a,300).then((()=>a.resolve()))}))}toggleForumTabByPeerId(e,t){const{managers:i}=this,s=h.ZP.getHistory(),n=s[s.length-1];let a;if(n)return n instanceof rt&&n.peerId===e&&t?void Xe(n.container):(a=h.ZP.createTab(rt),void a.open({peerId:e,managers:i}));a=this.forumsTabs.get(e);const o=this.forumTab&&this.forumTab===a;if(null!=t||(t=!o),t!==o)return t&&!a&&(a=new rt(void 0),a.init({peerId:e,managers:i}),this.forumsTabs.set(e,a),this.forumsSlider.append(a.container),a.managers=this.managers,a.eventListener.addEventListener("destroy",(()=>{this.forumsTabs.delete(e)}))),this.toggleForumTab(a);t&&Xe(a.container)}setListClickListener(e,t,i=!1,s=!1,n=!1){let a;const o=(n?I.Z.setInnerPeer:I.Z.setPeer).bind(I.Z);e.dataset.autonomous=""+ +s,e.addEventListener("mousedown",(i=>{if(0!==i.button)return;this.log("dialogs click list");const n=i.target,r=(0,d.Z)(n,st);if(!r)return;const l=r.dataset.peerId.toPeerId(),c=+r.dataset.mid||void 0,h=+r.dataset.threadId||void 0;if(null==t||t(),!r.querySelector(".is-forum")||i.shiftKey||c){if(i.ctrlKey||i.metaKey)return window.open(r.href||"#"+l,"_blank"),void(0,U.Z)(i);if(s){const e=a===r;a&&!e&&a.classList.remove("active"),r&&(r.classList.add("active"),a=r,this.lastActiveElements.add(r))}h&&!c||this.xd.sortedList.list!==e||this.xd===this.xds[g.Zi]||this.toggleForumTab(),o({peerId:l,lastMsgId:c,threadId:h})}else this.toggleForumTabByPeerId(l)}),{capture:!0}),e.addEventListener("click",(e=>{0===e.button&&(0,U.Z)(e)}),{capture:!0}),i&&(0,Ie.E)(e,this.contextMenu.onContextMenu)}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessageN(e){return this.setLastMessage(e).catch((e=>{"MIDDLEWARE"!==(null==e?void 0:e.type)&&this.log.error("set last message error",e)}))}setLastMessage({dialog:e,lastMessage:t,dialogElement:i,highlightWord:s,isBatch:a=!1,setUnread:o=!1}){var d,l;return it(this,void 0,void 0,(function*(){if(!i&&!(i=this.xd.getDialogElement(e.peerId)))return;const{dom:c}=i,{peerId:h}=e,{deferred:u,middleware:f}=nt(c,"setLastMessagePromise");let p;if(!t&&("draftMessage"!==(null===(d=e.draft)||void 0===d?void 0:d._)||h.isAnyChat()&&"forumTopic"!==e._&&(yield this.managers.appPeersManager.isForum(h))||(p=e.draft),(null==(t=e.topMessage)?void 0:t.mid)!==e.top_message)){const i=this.managers.appMessagesManager.getMessageByPeer(h,e.top_message);t=yield f(i)}if(this.setUnreadMessagesN({dialog:e,dialogElement:i,isBatch:a,setLastMessagePromise:u}),!t)return c.lastMessageSpan.replaceChildren(),c.lastTimeSpan.replaceChildren(),delete c.listEl.dataset.mid,void u.resolve();const m=t&&(0,be.Z)(t);{let e;const i=[];if(t&&!p&&!m){const s=(0,ye.Z)(t),n=new Set(["video","gif","round"]);if(s&&("photo"===s._||n.has(s.type))){const a=(0,me.Z)(s,20,20);if("photoSizeEmpty"!==a._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),"round"===s.type&&e.classList.add("is-round"),i.push((0,x.Z)({photo:s,message:t,container:e,withoutPreloader:!0,size:a}).then((()=>e))),n.has(s.type))){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}if(p){const e=document.createElement("span");e.classList.add("danger"),e.append((0,r.ag)("Draft"),": "),i.unshift(e)}else if(h.isAnyChat()&&h!==t.fromId&&!t.action){const e=document.createElement("span");if(e.classList.add("primary-text"),t.fromId===n.Z.myId)e.append((0,r.ag)("FromYou")),i.unshift(e);else{const s=f((0,Pe.Z)({peerId:t.fromId,onlyFirstName:!0})).then((t=>(e.prepend(t),e)),Ae.Z);i.unshift(s)}e.append(": ")}const a=!!e&&!!(null==t?void 0:t.message);let o;if(o=s&&t.message?yield f((0,ve.Z)({message:t,highlightWord:s,withoutMediaType:a})):p?yield f((0,ve.Z)({message:p})):t?yield f((0,ve.Z)({message:t,withoutMediaType:a})):document.createDocumentFragment(),i.length){const e=yield f(Promise.all(i));o.prepend(...e)}(0,D.Z)(c.lastMessageSpan,o)}if(t||p){const e=p?Math.max(p.date,t.date||0):t.date;(0,D.Z)(c.lastTimeSpan,(0,C.zM)(new Date(1e3*e)))}else c.lastTimeSpan.textContent="";if(null!==o&&!o){c.listEl.dataset.mid=""+t.mid;const e=t.reply_to;(null===(l=null==e?void 0:e.pFlags)||void 0===l?void 0:l.forum_topic)&&(c.listEl.dataset.threadId=""+(0,qe.Z)(t))}u.resolve()}))}setUnreadMessagesN(e){return this.setUnreadMessages(e).catch((()=>{}))}setUnreadMessages({dialog:e,dialogElement:t,isBatch:i=!1,setLastMessagePromise:s}){var a;return it(this,void 0,void 0,(function*(){const{dom:o}=t;if(!o)return;const r="forumTopic"===e._,{deferred:d,middleware:l}=nt(o,"setUnreadMessagePromise"),{peerId:c}=e,h=Promise.all([this.managers.appNotificationsManager.isPeerLocalMuted({peerId:c,respectType:!0,threadId:r?e.id:void 0}),"draftMessage"!==(null===(a=e.draft)||void 0===a?void 0:a._)?this.managers.appMessagesManager.getMessageByPeer(c,e.top_message):void 0,r?!!e.pFlags.pinned:this.managers.dialogsStorage.isDialogPinned(c,this.filterId),this.managers.appMessagesManager.isDialogUnread(e),c.isAnyChat()&&!r?this.managers.acknowledged.dialogsStorage.getForumUnreadCount(c).then((i=>i.cached?i.result:(i.result.then((()=>{this.setUnreadMessagesN({dialog:e,dialogElement:t})})),0))).catch((()=>{})):void 0]);let[u,f,p,m,v]=yield l(h);const b=o.listEl.classList.contains("is-muted");let y;f&&f.pFlags.out&&f.peerId!==n.Z.myId&&(y=f);const w=null!=v?v:e.unread_count;void 0!==v&&(m=!!w),r&&!m&&(m=!(0,tt.Z)(e.read_inbox_max_id));const S=p||m,C=this.xd!==this.xds[g.Zi]&&!r&&!!this.forumTab&&this.xd.getDialogElement(c)===t&&m;if(s)try{yield l(s)}catch(e){}const E=i?0:250;u!==b&&(0,P.Z)({element:o.listEl,className:"is-muted",forwards:u,duration:E}),function(e,t,i){let s;if("string"==typeof t?s=t:(null==t?void 0:t.pFlags.out)&&(s=t.error?"sendingerror":t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!s)return void(e.textContent="");const n="tgico-"+s,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(o.statusSpan,r&&e.pFlags.closed?"premium_lock":y);const L=!!o.unreadBadge;S&&t.createUnreadBadge();const I=!!o.unreadAvatarBadge;C&&t.createUnreadAvatarBadge();const M=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),Z=!!o.mentionsBadge;if(M&&t.createMentionsBadge(),[["unreadBadge",S,L],["unreadAvatarBadge",C,I],["mentionsBadge",M,Z]].forEach((([e,s,n])=>{o[e]&&t.toggleBadgeByKey(e,s,n,i)})),!S)return void d.resolve();p?o.unreadBadge.classList.add("tgico-chatspinned","tgico"):o.unreadBadge&&o.unreadBadge.classList.remove("tgico-chatspinned","tgico");let k,T=!0,x=!1;if(e.unread_mentions_count&&1===w?(k="@",x=!0):m?k=""+(w?(0,Qe.Z)(w,1):" "):(k="",T=!1),r){const e=m&&" "===k;o.unreadBadge.classList.toggle("not-visited",e)}[[o.unreadBadge,k],[o.unreadAvatarBadge,k||void 0]].filter(Boolean).forEach((([e,t])=>{void 0!==t&&(e.innerText=k),e.classList.toggle("unread",T),e.classList.toggle("mention",x)})),d.resolve()}))}getDialog(e,t){return it(this,void 0,void 0,(function*(){if("object"!=typeof e){let i;if(t){if(i=yield this.managers.dialogsStorage.getForumTopic(e,t),!i)return{peerId:e||g.NM,pFlags:{}}}else if(i=yield this.managers.appMessagesManager.getDialogOnly(e),!i){const t=e||g.NM;return{peerId:t,peer:yield this.managers.appPeersManager.getOutputPeer(t),pFlags:{}}}return i}return e}))}addListDialog(e){var t;e.autonomous=!1;const i=this.addDialogNew(e);if(i){const{peerId:s}=e,a=this.getDialog(s,e.threadId).then((t=>{const a=[],o=s.isUser();return o||"dialog"!==t._||a.push(this.xd.processDialogForCallStatus(s,i.dom)),s!==n.Z.myId&&o&&a.push(this.managers.appUsersManager.getUserStatus(s.toUserId()).then((e=>{"userStatusOnline"===(null==e?void 0:e._)&&this.xd.setOnlineStatus(i.dom.avatarEl,!0)}))),a.push(this.setLastMessageN({dialog:t,dialogElement:i,isBatch:e.isBatch,setUnread:!0})),Promise.all(a)}));null===(t=e.loadPromises)||void 0===t||t.push(a)}return i}addDialogAndSetLastMessage(e){const{peerId:t,message:i,query:s}=e,n=this.addDialogNew(Object.assign(Object.assign(Object.assign({},e),(0,we.Z)(i)),{peerId:t}));return this.setLastMessageN({dialog:{_:"dialog",peerId:t},lastMessage:i,dialogElement:n,highlightWord:s}),i.peerId!==t&&(n.dom.listEl.dataset.peerId=""+i.peerId),n}addDialogNew(e){const t=new ot(Object.assign({autonomous:!!e.container,avatarSize:"bigger"},e));if(e.container){const i=e.append?"prepend":"append";e.container[i](t.container)}return t}}const ft=new ut;Z.GO.appDialogsManager=ft;const pt=ft},2312:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(3725),n=i(2202),a=i(3512),o=i(410),r=i(319),d=i(1243),l=i(7086),c=i(1655),h=i(5471),u=i(8801),f=i(6658),p=i(7667),m=i(3855);const g=new class{constructor(){this.downloads={},this.progress={}}construct(e){this.managers=e,a.Z.addEventListener("download_progress",(e=>{var t;const i=this.downloads[e.fileName];(null===(t=null==i?void 0:i.main)||void 0===t?void 0:t.notifyAll)&&(this.progress[e.fileName]=e,i.main.notifyAll(e))}))}getNewDeferred(e,t){const i=(0,s.Z)();let n=this.downloads[e];if(n){const e=n.main;["cancel","addNotifyListener","notify","notifyAll"].forEach((t=>{e[t]&&(i[t]=e[t].bind(e))}))}else n=this.downloads[e]={main:i},i.cancel=()=>{const t=(0,h.Z)("DOWNLOAD_CANCELED");this.managers.apiFileManager.cancelDownload(e),i.reject(t),i.cancel=r.Z},i.catch((()=>{this.clearDownload(e,t)})).finally((()=>{delete this.progress[e]}));return"disc"===t&&i.catch(r.Z).finally((()=>{this.clearDownload(e,t)})),n[t]=i}getNewDeferredForUpload(e,t){const i=this.getNewDeferred(e);return t.then(i.resolve,i.reject),i.finally((()=>{this.clearDownload(e)})),i}clearDownload(e,t){const i=this.downloads[e];if(!i)return;delete i[t];const s=Object.keys(i).length;(!s||i.main&&1===s)&&delete this.downloads[e]}getUpload(e){let t=this.getDownload(e);return t||(t=this.getNewDeferred(e),this.managers.appMessagesManager.getUploadPromise(e).then(t.resolve,t.reject),t)}d(e,t,i){let s=this.getDownload(e,i);return s||(s=this.getNewDeferred(e,i),t().then(s.resolve,s.reject),s)}download(e){const t=(0,l.Z)(e);return this.d(t,(()=>this.managers.apiFileManager.download(e)),"blob")}downloadMedia(e,t="blob",i){const{downloadOptions:s,fileName:n}=(0,d.Z)(e);return this.d(n,(()=>{let s;return s="url"===t?this.managers.apiFileManager.downloadMediaURL:"void"===t?this.managers.apiFileManager.downloadMediaVoid:this.managers.apiFileManager.downloadMedia,i?i.then((()=>s(e))):s(e)}),t)}downloadMediaURL(e){return this.downloadMedia(e,"url")}downloadMediaVoid(e){return this.downloadMedia(e,"void")}upload(e,t,i){return t||(t=(0,n.Z)(e)),i||(i=this.managers.apiFileManager.upload({file:e,fileName:t})),this.getNewDeferredForUpload(t,i)}getDownload(e,t){const i=this.downloads[e];return i&&i[t]}downloadToDisc(e,t){const i=e.media,s="document"===i._;s||e.thumb||(e.thumb=i.sizes.slice().pop());const n=""+(2147483647*Math.random()|0),a=`download/${n}`;e.downloadId=n;const o=m.Z.pingServiceWorkerWithIframe(),d=this.downloadMedia(e,"disc",o);if(t)return d;const l=document.createElement("iframe");l.hidden=!0,o.then((()=>{l.src=a,document.body.append(l)}));let h,g=!1;const v=()=>{g||(g=!0,h=l,(0,c.Z)(d.listeners,v))};return d.addNotifyListener(v),d.then((t=>{if(!t)return;const n=URL.createObjectURL(t),a=s?(0,f.Z)(i):(0,p.Z)(i,e.thumb),o=e.media.file_name||(0,u.P)(a.location);!function(e,t,i){const s=document.createElement("a");s.href=e,s.download=t,s.target="_blank",s.style.position="absolute",s.style.top="1px",s.style.left="1px",document.body.append(s);try{const e=document.createEvent("MouseEvents");e.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),s.dispatchEvent(e)}catch(t){console.error("Download click error",t);try{s.click()}catch(t){window.open(e,"_blank")}}setTimeout((()=>{s.remove(),i&&i()}),100)}(n,a.fileName||o,(()=>{URL.revokeObjectURL(n)}))})).catch(r.Z).finally((()=>{g||v(),setTimeout((()=>{null==h||h.remove()}),1e3)})),d}};o.GO&&(o.GO.appDownloadManager=g);const v=g},9355:(e,t,i)=>{"use strict";i.d(t,{Z:()=>Ur});var s=i(5814),n=i(4039),a=i(4332),o=i(4755),r=i(5003),d=i(3512),l=i(3241),c=i(5432),h=i(1655),u=i(6519),f=i(4484),p=i(9331),m=i(1507),g=i(7625),v=i(4993);class b{constructor(e,t,i){this.container=document.createElement("div"),this.container.classList.add("bubbles-group"),this.chat=e,this.groups=t,this.items=[],this.dateTimestamp=i,this.offset=0}createAvatar(e){if(this.avatarLoadPromise)return this.avatarLoadPromise;if("messageService"===e._)return;this.avatarContainer=document.createElement("div"),this.avatarContainer.classList.add("bubbles-group-avatar-container"),++this.offset;const t=e.fwd_from,i=e.fwdFromId,s=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===i,n=this.chat.peerId;this.avatar=new p.Z,this.avatar.classList.add("bubbles-group-avatar","user-avatar","avatar-40");const a=(t&&(n===d.Z.myId||n===m.hj)||s?i:e.fromId)||m.NM,o=this.avatar.updateWithOptions({lazyLoadQueue:this.chat.bubbles.lazyLoadQueue,peerId:a,peerTitle:!i&&t&&t.from_name?t.from_name:void 0});return this.avatarLoadPromise=o,this.avatarContainer.append(this.avatar),this.container.append(this.avatarContainer),this.avatarLoadPromise}get firstTimestamp(){return this.firstItem.timestamp}get firstMid(){return this.firstItem.mid}get firstItem(){return this.items[this.items.length-1]}get lastTimestamp(){return this.lastItem.timestamp}get lastMid(){return this.lastItem.mid}get lastItem(){return this.items[0]}updateClassNames(){const e=this.items,t=e.length;if(!t)return;const i=e[t-1].bubble;if(1===e.length)return void i.classList.add("is-group-first","is-group-last");i.classList.remove("is-group-last"),i.classList.add("is-group-first");for(let i=1,s=t-1;i{this.mountItem(e,s-1-i,t)})),e&&this.updateClassNames(),this.onItemMount()}mountItem(e,t=this.items.indexOf(e),i=this.offset){e.mounted||((0,f.Z)(e.bubble,this.container,i+t),e.mounted=!0)}unmountItem(e){e.mounted&&(e.bubble.remove(),e.mounted=!1,this.onItemUnmount())}onItemMount(){if(this.mounted)return;const e=this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp/1e3),t=this.groups.groups.filter((e=>e.dateTimestamp===this.dateTimestamp)),i=t.length,s=t.indexOf(this),n=t.slice(s+1).reduce(((e,t)=>e+(t.mounted?0:1)),0);(0,f.Z)(this.container,e.container,ms+i-1-s-n),this.mounted=!0}onItemUnmount(){this.mounted&&(this.items.length?this.updateClassNames():(this.container.remove(),this.chat.bubbles.deleteEmptyDateGroups(),this.mounted=!1))}}class y{constructor(e){this.chat=e,this.itemsArr=[],this.itemsMap=new Map,this.groups=[],this.newGroupDiff=121,this.sortItemsKey="scheduled"===e.type?"timestamp":"mid",this.sortGroupsKey="scheduled"===e.type?"lastTimestamp":"lastMid",this.sortGroupItemsKey="groupMid"}removeItem(e){var t;null===(t=e.group)||void 0===t||t.removeItem(e),this.removeItemFromCache(e)}removeAndUnmountBubble(e){const t=this.getItemByBubble(e);if(!t)return e.parentElement&&e.remove(),!1;const i=this.itemsArr,s=i.indexOf(t),n=this.getSiblingsAtIndex(s,i),a=t.group;this.removeItem(t);const o=new Set;a&&(a.unmountItem(t),o.add(a));const[r,d]=n;if(r&&d&&this.canItemsBeGrouped(r,d)&&r.group!==d.group){const e=d.group;this.f(d.group.items),e.onItemUnmount(),o.add(r.group),this.groupUngrouped()}return this.mountUnmountGroups(Array.from(o)),!0}mountUnmountGroups(e){const[t,i]=function(e,t){const i=[],s=[];for(let t=0,a=e.length;t{e.onItemUnmount()})),t.forEach((e=>{e.mount(!0)}))}f(e,t=0,i=e.length){for(;ts.add(e)))}}return s}cleanup(){this.itemsArr=[],this.groups=[],this.itemsMap.clear()}}var w=i(1168),S=i(2738),C=i(2325),E=i(503);class L extends w.Z{constructor(e,t,i={}){if(super("popup-date-picker",Object.assign({body:!0,overlayClosable:!0,buttons:i.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],title:!0},i)),this.onPick=t,this.options=i,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const i=+t.dataset.timestamp;this.selectedDate=new Date(i),this.setTitle(),this.setTimeTitle()},this.minDate=i.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",(a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&s&&s(+o[1]),o="0"+o[0]),t.setValueSilently(o),i(o.length)}))};this.hoursInputField=new E.ZP({plainText:!0}),this.minutesInputField=new E.ZP({plainText:!0}),i(23,this.hoursInputField,(e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()}),(e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)})),i(59,this.minutesInputField,(e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()})),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),(0,S.fc)(this.btnConfirm,(()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()}),{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const s=document.createElement("div");s.classList.add("popup-centerer"),s.append(this.container),this.element.append(s),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=i.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),i.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e;const t=[],i=new Date;i.setHours(0,0,0,0);const s={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===i.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const s={month:"short",day:"numeric"};n.getFullYear()!==i.getFullYear()&&(s.year="numeric"),t.push(new C.ZP.IntlDateElement({date:n,options:s}).element)}t.push(new C.ZP.IntlDateElement({date:n,options:s}).element),this.btnConfirm.firstChild.replaceWith((0,C.ag)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new C.ZP.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const i=document.createElement("button");return i.classList.add("btn-icon","date-picker-month-date"),e&&i.setAttribute("disabled","true"),t&&i.append(t),i}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&o.Z.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new C.ZP.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const i=new Date,s=i.getDay();1!==s&&i.setHours(-24*(s-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new C.ZP.IntlDateElement({date:i,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),i.setDate(i.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{p&&!p()||(f.forEach((e=>e.remove())),o&&o.classList.toggle("is-round",u))})),h}))}class Y extends j{constructor(e,t){super(e,((e,i="",s)=>$(this,void 0,void 0,(function*(){this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const n=yield Q({title:e,titleEl:this.title,subtitle:i,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s,animationGroup:t});this.container.classList.toggle("is-media",n),n?this.content.prepend(this.mediaEl):this.mediaEl.remove()})))),this.className=e,this.animationGroup=t}}function J(e,t,i,s,n){const a=new Y("reply",i),o=a.fill(e,t,s);if(n){const e=(0,O.Z)(n,!1),[t,i,s]=(0,N.oo)(e);a.container.style.setProperty("--override-color",`${t}, ${i}, ${s}`),a.container.classList.add("is-overriding-color")}return{container:a.container,fillPromise:o}}const X="stacked-avatars";class ee{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add(X),this.container.style.setProperty("--avatar-size",e.avatarSize+"px")}render(e,t){const i=this.container.children;(e=e.slice().reverse()).length>3&&(e=e.slice(-3)),e.forEach(((e,s)=>{let n=i[s];n||(n=document.createElement("div"),n.classList.add("stacked-avatars-avatar-container"));let a=n.firstElementChild;a||(a=new p.Z,a.classList.add("avatar-"+this.avatarSize,"stacked-avatars-avatar"),a.updateOptions({isDialog:!1,loadPromises:t})),a.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e}),a.parentNode||n.append(a),n.parentNode||this.container.append(n)})),Array.from(i).slice(e.length).forEach((e=>e.remove()))}}d.Z.addEventListener("replies_updated",(e=>{Array.from(document.querySelectorAll(`replies-element[data-post-key="${e.peerId}_${e.mid}"]`)).forEach((t=>{t.message=e,t.render()}))}));class te extends HTMLElement{constructor(){super(),this.updated=!1,this.managers=d.Z.managers}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t;this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),this.stackedAvatars||(this.stackedAvatars=new ee({lazyLoadQueue:this.lazyLoadQueue,avatarSize:30}),this.stackedAvatars.container.classList.add("replies-footer-avatars")),t=this.stackedAvatars.container,this.stackedAvatars.render(e.recent_repliers.map((e=>(0,D.Z)(e))),this.loadPromises)):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.prepend(t),this.text||(this.text=new C.ZP.IntlElement);const i=this.text;if(e?e.replies?i.compareAndUpdate({key:"Comments",args:[e.replies]}):i.compareAndUpdate({key:"LeaveAComment"}):i.compareAndUpdate({key:"ViewInChat"}),e){let t=!1;e.replies&&void 0!==e.read_max_id&&void 0!==e.max_id&&(t=e.read_max_id${(null==e?void 0:e.replies)?(0,F.Z)(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId,this.message.mid),this.managers.appMessagesManager.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define("replies-element",te);const ie=()=>{const e=document.createElement("i");return e.classList.add("edited"),(0,C.$d)(e,"EditedMessage"),e},se=()=>(0,C.ag)("SponsoredMessage");var ne;!function(e){e.setTime=e=>{var t;const{chatType:i,message:s}=e,n=new Date(1e3*s.date),a=[];let o,r;const d=!!s.pFlags.sponsored,l=!("action"in s)&&!d,c=d?void 0:(0,A.mr)(n);if(l){if(s.views){const e=s.post_author||(null===(t=s.fwd_from)||void 0===t?void 0:t.post_author),i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=(0,F.Z)(s.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),a.push(i,n),e){const t=document.createElement("span");(0,_.Z)(t,(0,R.Z)(e)),t.insertAdjacentHTML("beforeend",", "),a.push(t)}}if(s.edit_date&&"scheduled"!==i&&!s.pFlags.edit_hide&&a.unshift(o=ie()),"pinned"!==i&&s.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),a.unshift(e)}}else d&&a.push(r=se());c&&a.push(c);let h=d?void 0:(0,A.xE)(n);l&&(h+=(s.edit_date&&!s.pFlags.edit_hide?`\nEdited: ${(0,A.xE)(new Date(1e3*s.edit_date))}`:"")+(s.fwd_from?`\nOriginal: ${(0,A.xE)(new Date(1e3*s.fwd_from.date))}`:""));const u=document.createElement("span");u.classList.add("time","tgico"),u.append(...a);const f=document.createElement("div");f.classList.add("inner","tgico"),h&&(f.title=h);let p=a;return o&&(p[p.indexOf(o)]=ie()),r&&(p[p.indexOf(r)]=se()),p=p.map((e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e)),c&&(p[p.length-1]=(0,A.mr)(n)),f.append(...p),u.append(f),u},e.renderReplies=({bubble:e,bubbleContainer:t,message:i,messageDiv:s,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new te;return r.message=i,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},e.setReply=({chat:e,bubble:t,bubbleContainer:i,message:s})=>{return n=this,a=void 0,r=function*(){const n=!i;n&&(i=t.querySelector(".bubble-content"));const a=n?i.querySelector(".reply"):null;if(!s.reply_to_mid)return null==a||a.remove(),void t.classList.remove("is-reply");const o=s.reply_to.reply_to_peer_id?(0,D.Z)(s.reply_to.reply_to_peer_id):e.peerId,r=yield d.Z.managers.appMessagesManager.getMessageByPeer(o,s.reply_to_mid);let l,c;if(r){const e=r.fwdFromId;c=s.fwdFromId&&s.fwdFromId===e?s.fwdFromId:r.fromId||e,l=new B.Z({peerId:c,dialog:!1,onlyFirstName:!1,plainText:!1}).element}else d.Z.managers.appMessagesManager.fetchMessageReplyTo(s),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:s.reply_to_mid,mid:s.mid}),l=(0,C.ag)("Loading");const{container:h,fillPromise:u}=J(l,void 0,e.animationGroup,r,e.isAnyGroup?c:void 0);return yield u,a?(a.classList.contains("floating-part")&&h.classList.add("floating-part"),a.replaceWith(h)):i.append(h),t.classList.add("is-reply"),h},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}}(ne||(ne={}));var ae=i(2153),oe=i(3699),re=i(8448),de=i(4789),le=i(8594),ce=i(3035),he=i(3725),ue=i(410),fe=i(252),pe=i(8497),me=i(4668),ge=i(2796);function ve(e,t,i){const s=e.getBoundingClientRect(),n="center"===i?Math.ceil(s.left+(s.right-s.left)/2+1):Math.ceil(s.left+1),a="bottom"===t?Math.floor(s.top+s.height-1):Math.ceil(s.top+1);return document.elementFromPoint(n,a)}ue.GO.getElementByPoint=ve;var be=i(3624),ye=i(3910),we=i(5705);function Se(e){e.style.display="none",e.offsetLeft,e.style.display=""}var Ce=i(2648),Ee=i(5296),Le=i(8938),Ie=i(5701);const Me=2147483646;var Pe,Ze=i(241),ke=i(6272),Te=i(1784),xe=i(9099),Ae=i(2416),_e=i(8763),Fe=i(5975),De=i(8939),Re=i(993),Be=i(4494),Ne=i(8204),Oe=i(2575),Ue=i(9931);class He extends w.Z{constructor(e,t){super("popup-join-chat-invite",{closable:!0,overlayClosable:!0,body:!0,buttons:(0,w.x)([{langKey:t.pFlags.request_needed?"RequestJoin.Button":t.pFlags.broadcast?"JoinByPeekChannelTitle":"JoinByPeekGroupTitle",callback:()=>{this.managers.appChatsManager.importChatInvite(e).then((e=>{const t=e.toPeerId(!0);Ur.setInnerPeer({peerId:t})}),(e=>{"INVITE_REQUEST_SENT"===e.type&&(0,ge.bC)({langPackKey:"RequestToJoinSent"})}))}}])}),this.hash=e,this.chatInvite=t,this.construct()}construct(){return e=this,t=void 0,s=function*(){this.header.remove();const{chatInvite:e,managers:t,hash:i}=this,s=new p.Z;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===e.photo._?(e.photo=yield t.appPhotosManager.savePhoto(e.photo),(0,V.Z)({container:s,message:null,photo:e.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):(0,Ue.Z)({div:s,peerId:m.NM,isDialog:!1,title:e.title});const n=document.createElement("div");n.classList.add("chat-title"),(0,_.Z)(n,(0,R.Z)(e.title));const a=e.pFlags.broadcast,o=(0,C.ag)(a?"Subscribers":"Members",[(0,Oe.Z)(e.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,n,o),e.pFlags.request_needed){const e=document.createElement("div");(0,C.$d)(e,a?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}!function(e){e[e.MESSAGE=0]="MESSAGE",e[e.PRIVATE_POST=1]="PRIVATE_POST",e[e.STICKER_SET=2]="STICKER_SET",e[e.JOIN_CHAT=3]="JOIN_CHAT",e[e.VOICE_CHAT=4]="VOICE_CHAT",e[e.USER_PHONE_NUMBER=5]="USER_PHONE_NUMBER",e[e.INVOICE=6]="INVOICE",e[e.EMOJI_SET=7]="EMOJI_SET"}(Pe||(Pe={}));var ze=i(5285),je=i(6654),Ge=i(9083),Ve=i(6775),Ke=i(9405),We=i(319);class $e extends HTMLElement{constructor(){super(),this.classList.add("reaction"),this.managers=d.Z.managers}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e,t){this.type=e,this.classList.add("reaction-"+e),this.middleware=t}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("reaction-sticker"),this.append(this.stickerContainer));const i=this.reactionCount;if(!e&&!t){const e=i.reaction;if("reactionEmoji"===e._){const t=this.managers.appReactionsManager.getReaction(e.emoticon);(0,je.Z)(t,(e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive"),this.renderDoc(null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon)}))}else if("reactionCustomEmoji"===e._){this.stickerContainer.classList.add("is-custom");const t=(0,Ge.Z)({docIds:[e.document_id],customEmojiSize:(0,Ke.C)(22,22)});this.stickerContainer.append(t)}}}renderDoc(e){const t="inline"===this.type?14:22,i=this.wrapStickerPromise=(0,K.ZP)({div:this.stickerContainer,doc:e,width:t,height:t,static:!0,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)).finally((()=>{this.wrapStickerPromise===i&&(this.wrapStickerPromise=void 0)}))}renderCounter(){var e;const t=this.reactionCount,i="inline"===this.type?2:4;if(t.count>=i||"block"===this.type&&!this.canRenderAvatars){this.counter||(this.counter=document.createElement("inline"===this.type?"i":"span"),this.counter.classList.add("reaction-counter"));const e=(0,F.Z)(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 ee({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map((e=>(0,D.Z)(e.peer_id))))))}setIsChosen(e=void 0!==this.reactionCount.chosen_order){"inline"!==this.type&&(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&(0,xe.Z)({element:this,className:"is-chosen",forwards:e,duration:this.isConnected?300:0})}fireAroundAnimation(){const e=this.reactionCount.reaction;"reactionEmoji"===e._&&(0,je.Z)(this.managers.appReactionsManager.getReaction(e.emoticon),(e=>{const t="inline"===this.type?28:40,i=document.createElement("div");i.classList.add("reaction-sticker-activate"),Promise.all([(0,K.ZP)({div:i,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)),(0,Ve.Z)({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1,managers:this.managers,middleware:this.middleware}).stickerPromise.catch(We.Z)]).then((([e,t])=>{const s=()=>{e.remove(),i.remove(),this.stickerContainer.classList.remove("has-animation")};if(!t)return void s();const n=()=>{(0,ce.T2)(s)};e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then((()=>{setTimeout(n,1e3)})):n())})),e.addEventListener("firstFrame",(()=>{this.stickerContainer.append(i),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()}),{once:!0})}))}))}}customElements.define("reaction-element",$e);const qe=new Map;class Qe extends HTMLElement{constructor(){super(),this.classList.add("reactions"),this.sorted=[],this.middlewareHelpers=new Map,this.managers=d.Z.managers}connectedCallback(){let e=qe.get(this.key);e||qe.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=qe.get(this.key);e.delete(this),e.size||qe.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,i,s=this.isPlaceholder){void 0!==this.key&&this.disconnectedCallback(),this.middleware!==i&&i.onDestroy((()=>{this.middlewareHelpers.clear()})),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.middleware=i,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.middleware)}update(e,t){this.message=e,this.render(t)}render(e){const t=this.message.reactions,i=!(!t||!t.results.length);if(this.classList.toggle("has-no-reactions",!i),!i&&!this.sorted.length)return;this.managers.appReactionsManager.getAvailableReactions();const s=i?t.results:[];s.sort(((e,t)=>{var i,s;return t.count-e.count||(null!==(i=e.chosen_order)&&void 0!==i?i:0)-(null!==(s=t.chosen_order)&&void 0!==s?s:0)})),(0,g.Z)(this.sorted,((e,t,i)=>{const n=e.reactionCount.reaction;s.some((e=>(0,ze.Z)(e.reaction,n)))||(this.middlewareHelpers.get(e).destroy(),this.middlewareHelpers.delete(e),i.splice(t,1),e.remove())}));const n=s.reduce(((e,t)=>e+t.count),0),a=t&&(!!t.pFlags.can_see_list||this.message.peerId.isUser())&&n<4;if(this.sorted=s.map(((e,i)=>{let s=this.sorted.find((t=>(0,ze.Z)(t.reactionCount.reaction,e.reaction)));if(!s){const e=this.middleware.create();s=new $e,s.init(this.type,e.get()),this.middlewareHelpers.set(s,e)}(0,f.Z)(s,this,i);const n=t.recent_reactions?t.recent_reactions.filter((t=>(0,ze.Z)(t.reaction,e.reaction))):[];return s.reactionCount=Object.assign({},e),s.setCanRenderAvatars(a),s.render(this.isPlaceholder),s.renderCounter(),s.renderAvatars(n),s.setIsChosen(),s})),!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===Ur.chat.peerId&&e.forEach((e=>{const t=this.sorted.find((t=>(0,ze.Z)(t.reactionCount.reaction,e.reaction)));null==t||t.fireAroundAnimation()}))}}customElements.define("reactions-element",Qe);var Ye=i(5418);class Je{constructor(e,t,i){this.scrollable=e,this.query=t,this.reverse=i}get container(){return this.scrollable.container}getSaved(){return{scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,clientHeight:this.clientHeight}}findElements(){if(!this.query)return[];const{container:e}=this,t=e.getBoundingClientRect(),i=Array.from(e.querySelectorAll(this.query)),s=[];for(const n of i){const i=n.getBoundingClientRect();if((0,Ne.Z)(n,e,void 0,i,t))s.push({element:n,rect:i});else if(s.length)break}if(!s.length){const e=i[0];e&&s.push({element:e,rect:e.getBoundingClientRect()})}return s}replaceSaved(e,t){if(!this.elements)return;const i=this.elements.findIndex((({element:t})=>e===t));-1!==i&&(this.elements[i].element=t)}findAndSetElements(){this.elements=this.findElements()}save(){this.findAndSetElements(),this._save()}_save(){const{scrollTop:e,scrollHeight:t,clientHeight:i}=this.container;this.scrollHeight=t,this.scrollTop=e,this.clientHeight=i,this.scrollHeightMinusTop=this.reverse?t-e:e}onRestore(e){T.IS_SAFARI&&e&&Se(this.container)}setScrollTop(e,t){this.scrollable.setScrollTopSilently(this.scrollTop=e),this.onRestore(t)}restore(e){var t;const{scrollTop:i,scrollHeight:s}=this.scrollable;if(this.scrollHeight=s,!this.elements.length)return void this._restore(e);let n;if(n=this.elements[this.elements.length-1],!(null===(t=null==n?void 0:n.element)||void 0===t?void 0:t.parentElement)&&(this.findAndSetElements(),n=this.elements[this.elements.length-1],!n))return void this._restore(e);const{element:a,rect:o}=n,r=a.getBoundingClientRect().bottom-o.bottom;this.setScrollTop(i+r,e)}_restore(e){const{scrollHeightMinusTop:t,scrollable:i}=this,s=this.scrollHeight,n=this.reverse?s-t:t;this.setScrollTop(n,e)}}ue.GO&&(ue.GO.ScrollSaver=Je);var Xe=i(7401),et=i(4881);class tt{constructor(e){this.observing=new Map,this.observingQueue=new Map,this.freezedObservingNew=!1,this.observer=new IntersectionObserver((e=>{const t=this.observing;for(let i=0,s=e.length;ie+t),t)}var Lt=i(8097);const It=function(e){const t={},i={};return s=>{var n,a;const o="_"+s;return null!==(n=(a="string"==typeof s?t:i)[o])&&void 0!==n?n:a[o]=e(s)}};function Mt(e){return e.replace(/\D/g,"")}const Pt={visa:/^4/,mastercard:/^(51|52|53|54|55|222|23|24|25|26|27)/,amex:/^(34|37)/,discover:/^(60|64|65)/,diners:/^(30|38|39)/,diners14:/^(36)/,jcb:/^(35)/,unionpay:/^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,elo:/^(5067|509|636368|627780)/,mir:/^(220[0-4])/},Zt={visa:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mastercard:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},amex:{minLength:15,maxLength:15,cvcMaxLength:4,cvcMinLength:3},unionpay:{minLength:13,maxLength:19,cvcMaxLength:3,cvcMinLength:null},diners:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},diners14:{minLength:14,maxLength:14,cvcMaxLength:3,cvcMinLength:null},discover:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},jcb:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},elo:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mir:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},unknown:{minLength:16,maxLength:16,cvcMaxLength:4,cvcMinLength:3}},kt=It(((e="")=>{const t=Object.keys(Pt),i=Mt(e);let s,n=0;return t.forEach((e=>{const t=Pt[e],a=i.match(t);if(a){const t=a[0];t&&t.length>n&&(s=e,n=t.length)}})),s||"unknown"}));function Tt(e=""){return"diners14"===(t=kt(e))?"diners":t;var t}var xt=i(2398),At=i(6740),_t=i(1656),Ft=i(7298),Dt=i(9807),Rt=i(279),Bt=i(7479),Nt=i(7362);function Ot(e,t,i){const s=new Array(e);return s.fill(t),i?s.map(i):s}const Ut="0".charCodeAt(0)-"0".charCodeAt(0),Ht=/[0-9]/g;function zt(e){return String.fromCharCode(e.charCodeAt(0)-Ut)}function jt(e){return e.replace(Ht,zt)}function Gt(e,t){return{type:"optional",result:e,consumed:t}}function Vt(e,t,i){return{type:"required",result:e,consumed:t,partial:i}}function Kt(e,t){return i=>{const s=new RegExp("^".concat(e.source.replace(/^\^/,""))),n=i.match(s),a=t?Gt:Vt;if(n){const e=n[0];return a(e,n.index+e.length)}return a("",i.length)}}const Wt=Kt(/1[0-2]|0?[1-9]|0/),$t={digit:function(e){return Kt(/[0-9]/)(jt(e))},capitalCharacter:function(e){const t=Kt(/\w/)(e);return t.result?Vt(t.result.toUpperCase(),t.consumed):t},month:e=>{const t=Wt(jt(e)),i=Mt(t.result);return["0","1"].includes(t.result)&&1===e.length||"0"===t.result&&e.length>=2?Vt(t.result,e.length,!0):Vt(1===i.length?"0"+i:i,t.consumed)},formattingCharacter:e=>t=>{const i=e===t[0]?1:0;return function(e,t){return{type:"formatting",result:e,consumed:t}}(e,i)},optionalPattern:e=>t=>{const i=Kt(e,!0)(t);return i.result?i:Gt("",0)}},qt=$t.digit,Qt=$t.capitalCharacter,Yt=$t.formattingCharacter(" "),Jt=$t.optionalPattern(/\d\d/),Xt=[qt,qt,qt,qt,Yt,qt,qt,qt,qt,qt,qt,Yt,qt,qt,qt,qt,qt],ei=[qt,qt,qt,qt,Yt,qt,qt,qt,qt,qt,qt,Yt,qt,qt,qt,qt],ti=new Set(["DZ","AR","AM","AU","AT","AZ","PT","BD","BY","BE","BA","BR","BN","BG","CA","IC","CN","CO","HR","CY","CZ","DK","EC","GB","EE","FO","FI","FR","GE","DE","GR","GL","GU","GG","NL","HU","IN","ID","IL","IT","JP","JE","KZ","KR","FM","KG","LV","LI","LT","LU","MK","MG","PT","MY","MH","MQ","YT","MX","MN","ME","NL","NZ","GB","NO","PK","PH","PL","FM","PT","PR","RE","RU","SA","SF","RS","SG","SK","SI","ZA","ES","LK","SX","VI","VI","SE","CH","TW","TJ","TH","TU","TN","TR","TM","VI","UA","GB","US","UY","UZ","VA","VN","GB","FM"]),ii=It((e=>{const t=[];for(let i=0,s=0;i[$t.month,$t.formattingCharacter("/"),qt,qt,Jt],cardCvc:e=>si.cardCvcFromBrand(kt(e)),cardCvcFromBrand:It((e=>{const t=Zt[e],{cvcMinLength:i,cvcMaxLength:s}=t,n=Ot(i||s,qt);if(i&&i{switch(e){case"US":return Ot(5,qt);case"CA":return T.IS_ANDROID?null:[Qt,Qt,Qt,Yt,Qt,Qt,Qt];default:const t=Ot(10,$t.optionalPattern(/\d/));return ti.has(e)&&(t[0]=qt),t}}))},ni=si;function ai(e){return Et(e.map((e=>e.length)),0)}const oi=new RegExp("‎","g");function ri(e){return e?{type:"invalid",code:e}:null}function di(e,t={}){const{sanitized:i,minLength:s}=function(e){const t=Mt(e),i=kt(e);return{sanitized:t,brand:i,minLength:Zt[i].minLength}}(e);return function(e,t,i){return e.length>=t?function(e){const t="0".charCodeAt(0),i=e.length%2;let s=0;for(let n=e.length-1;n>=0;--n){const a=i===n%2;let o=e.charCodeAt(n)-t;a&&(o*=2),o>9&&(o-=9),s+=o}return!(s%10)}(e)||"mir"===kt(e)?null:ri("invalid"):i?null:ri("incomplete")}(i,s,t.ignoreIncomplete)}function li(e,t={}){const i=e.replace(oi,"").split(/ ?\/ ?/),[s,n=""]=i,[a,o]=[s,n].map((e=>+e)),r=2===n.length?o%100:o;return n.length<2||3===n.length?t.ignoreIncomplete?null:ri("incomplete"):ri(function(e,t,i){const s=new Date(Date.now()),n=e<100?s.getFullYear()%100:s.getFullYear(),a=s.getMonth()+1;return isNaN(e)||isNaN(t)?(null==i?void 0:i.ignoreIncomplete)?null:"incomplete":e-n<0?"invalid_expiry_year_past":e-n>50?"invalid_expiry_year":!(e-n)&&t{const t=ui.get(e.source);t&&t(JSON.parse(e.data))}));class fi extends l.Z{constructor({url:e,sandbox:t}){super(!1),this.onTelegramWebViewEvent=({eventType:e,eventData:t})=>{""===t&&(t=void 0),console.log("onTelegramWebViewEvent",e,t),this.dispatchEvent(e,t)};const i=this.iframe=document.createElement("iframe");i.src=e,t&&i.setAttribute("sandbox",t)}onMount(){ui.set(this.iframe.contentWindow,this.onTelegramWebViewEvent)}destroy(){this.cleanup(),ui.delete(this.iframe.contentWindow)}}function pi(e){const t=new fi(Object.assign(Object.assign({},e),{sandbox:"allow-forms allow-scripts allow-same-origin allow-modals"})),{iframe:i}=t;return i.allow="payment",i.classList.add("payment-verification"),t}class mi extends w.Z{constructor(e,t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,title:"Checkout.WebConfirmation.Title"}),this.url=e,this.openPathAfter=t,this.d()}d(){const e=this.telegramWebView=pi({url:this.url});e.addEventListener("web_app_open_tg_link",(e=>{this.dispatchEvent("finish"),this.hide(),this.openPathAfter&&Ur.openUrl("https://t.me"+e.path_full)})),this.body.append(e.iframe),this.show(),e.onMount()}destroy(){return this.telegramWebView.destroy(),super.destroy()}}var gi=i(6830),vi=i(5029);class bi extends E.ZP{constructor(e){super(e),this.options=e,this.onKeyDown=e=>{var t,i;this.lastKeyDown=e.key,null===(i=(t=this.options).onKeyDown)||void 0===i||i.call(t,e)},this.onInput=()=>{var e,t;const i=this.value,s="Backspace"===this.lastKeyDown&&(this.lastTransformed&&this.lastTransformed.value.length||0)-i.length==1,n=this.lastTransformed=function(e){const{value:t,getPattern:i,deleting:s,input:n}=e,a=!s&&!!t.length,o=function(e,t,i={},s){const n=e(t);if(!n)return{value:t,selection:null,autocorrectComplete:!!t};const a=n.length,o=[],r=[];let d=0,l=0,c=0===i.selectionStart?0:null,h=0===i.selectionEnd?0:null;const u=e=>{e>0&&(null===c&&l+1>=i.selectionStart&&(c=ai(o)+(s?r.length:0)),null===h&&l+1>=i.selectionEnd&&(h=ai(o)+(s?r.length:0)),l+=e)};for(;d=t.length)break;r.push(a),++d,u(c)}}return s&&o.push(...r),{value:o.join(""),selection:{selectionStart:null===c||t.length&&i.selectionStart===t.length?ai(o):c,selectionEnd:null===h||t.length&&i.selectionEnd===t.length?ai(o):h},autocorrectComplete:d===a}}(i,t,{selectionStart:n?n.selectionStart:0,selectionEnd:n?n.selectionEnd:0},a),{value:r,selection:d}=o;return{value:r,meta:{autocorrectComplete:o.autocorrectComplete,empty:!r},selection:d}}({value:i,getPattern:this.options.formatMethod,deleting:s,input:this.input}),a=n.value;a!==i&&(this.setValueSilently(a),n.selection&&(this.input.selectionStart=n.selection.selectionStart,this.input.selectionEnd=n.selection.selectionEnd)),this.validateNew(a,{ignoreIncomplete:!0}),null===(t=(e=this.options).onChange)||void 0===t||t.call(e,n)},this.onBlur=()=>{var e;const t=null===(e=this.lastTransformed)||void 0===e?void 0:e.value;t&&this.validateNew(t)},this.validate=()=>this.validateNew(),this.input.addEventListener("keydown",this.onKeyDown),this.input.addEventListener("input",this.onInput),this.input.addEventListener("blur",this.onBlur)}update(){this.onInput()}validateNew(e,t,i){var s,n,a,o,r;let d;if(void 0===e&&(e=null!==(n=null===(s=this.lastTransformed)||void 0===s?void 0:s.value)&&void 0!==n?n:""),void 0===t&&(t={}),d=this.options.validateMethod?null===(o=(a=this.options).validateMethod)||void 0===o?void 0:o.call(a,e,t):function(e,t,i={}){return e.meta.autocorrectComplete||i.ignoreIncomplete?null:ri("incomplete")}(this.lastTransformed,0,t),null==d?void 0:d.code){const e=null===(r=this.options.errorKeys)||void 0===r?void 0:r[d.code];return!i&&this.setState(E.I1.Error,e),!1}return!i&&this.setState(E.I1.Neutral),!0}}function yi(e,t){const i=()=>{const i=e.every((e=>"validateNew"in e?e.validateNew(void 0,void 0,!0):e.isValid()));t(i)};return e.forEach((e=>{if(e instanceof bi){const t=e.options.onChange;e.options.onChange=(...e)=>{null==t||t(...e),i()},"update"in e&&e.update()}else e.input.addEventListener("input",i)})),{validate:i}}function wi(e,t){let i,s;return(e||t)&&(e&&(i=new hi.Z({noPhoneCodes:!0,onCountryChange:()=>{null==s||s.update()},required:!0,autocomplete:"country"})),t&&(s=new bi({label:"PaymentShippingZipPlaceholder",plainText:!0,inputMode:"numeric",autocomplete:"postal-code",formatMethod:()=>{const{country:e}=i.getSelected(),t=null==e?void 0:e.iso2;return ni.postalCodeFromCountry(t&&t.toUpperCase())}}))),{countryInputField:i,postcodeInputField:s}}const Si=new Set(["stripe","smartglocal"]);class Ci extends w.Z{constructor(e,t){if(super("popup-payment popup-payment-card",{closable:!0,overlayClosable:!0,body:!0,scrollable:Si.has(e.native_provider),title:"PaymentCardInfo"}),this.paymentForm=e,this.savedCard=t,Si.has(e.native_provider))this.d();else{const t=this.telegramWebView=pi({url:e.url});t.addEventListener("payment_form_submit",(t=>{const i={title:t.title,save:!1};this.dispatchEvent("finish",{token:t.credentials,card:i}),this.hide(),e.pFlags.can_save_credentials&&(0,ci.Z)({titleLangKey:"PaymentCardSavePaymentInformation",descriptionLangKey:"PaymentCardSavePaymentInformationInfoLine1",button:{langKey:"Save"}}).then((()=>{i.save=!0}),We.Z)})),this.body.append(t.iframe),this.show(),t.onMount()}}destroy(){return this.telegramWebView.destroy(),super.destroy()}d(){const e=this.savedCard,t=new vi.Z({name:"PaymentInfo.Card.Title",noDelimiter:!0,noShadow:!0}),i=JSON.parse(this.paymentForm.native_params.data);let s,n,a=0;const o=new bi({label:"PaymentCardNumber",plainText:!0,inputMode:"numeric",autocomplete:"cc-number",formatMethod:ni.cardNumber,validateMethod:di,errorKeys:{invalid:"PaymentCard.Error.Invalid",incomplete:"PaymentCard.Error.Incomplete"},onChange:e=>{(e=>{if(s===e)return;const t=++a;s=e;const i=xi(e);if(!i)return void(n&&(n.remove(),n=void 0));const r=new Image;r.classList.add("input-field-icon"),(0,At.cj)(r,i,!1).then((()=>{a===t&&(n?n.replaceWith(r):o.container.append(r),n=r)}))})(Tt(e.value)),l.update()}});let r;i.need_cardholder_name&&(r=new E.ZP({label:"Checkout.NewCard.CardholderNamePlaceholder",maxLength:255,required:!0,autocomplete:"cc-name"}));const d=new bi({label:"SecureId.Identity.Placeholder.ExpiryDate",plainText:!0,inputMode:"numeric",autocomplete:"cc-exp",formatMethod:ni.cardExpiry,validateMethod:li});d.input.addEventListener("input",(()=>{let e=d.value;if(e.length<5)return;const t=e.split("/");4===t[1].length&&(e=[t[0],t[1].slice(2)].join("/"),d.setValueSilently(e))}),{capture:!0});const l=new bi({labelText:"CVC",plainText:!0,inputMode:"numeric",autocomplete:"cc-csc",name:"cvc",formatMethod:()=>ni.cardCvc(o.value)}),c=(new gi.T(l.container,l.input),[o,d,l,r].filter(Boolean));c.forEach((e=>{const t=t=>{if(!e.value&&"Backspace"===t.key){const t=c[c.indexOf(e)-1];t&&(0,xt.Z)(t.input,!0)}};if(e instanceof bi){e.options.onKeyDown=t;const i=e.options.onChange;e.options.onChange=t=>{if(null==i||i(t),document.activeElement===e.input&&t.meta.autocorrectComplete)for(let t=c.indexOf(e),i=c.length;te.container))));const g=!!this.paymentForm.pFlags.can_save_credentials,v=new Dt.Z({text:"PaymentCardSavePaymentInformation",checked:!!g}),b=new Bt.ZP({checkboxField:v,subtitleLangKey:g?"PaymentCardSavePaymentInformationInfoLine1":"Checkout.2FA.Text"});g||b.container.classList.add("is-disabled"),(f||t).content.append(b.container),this.scrollable.append(...[t,f].filter(Boolean).map((e=>e.container)));const y=Ai({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,n=function*(){const e={cardNumber:o.value,expiryFull:d.value,expiryMonth:d.value.split("/")[0],expiryYear:d.value.split("/")[1],cvc:l.value,cardholderName:null==r?void 0:r.value,country:null==p?void 0:p.value,zip:null==m?void 0:m.value,save:null==v?void 0:v.checked},t=this.paymentForm.native_provider;let s;if("stripe"===t){const t=new URL("https://api.stripe.com/v1/tokens");t.search=new URLSearchParams({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvc,"card[address_zip]":e.zip,"card[address_country]":e.country,"card[name]":e.cardholderName}).toString();const n=yield fetch(t.toString(),{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Bearer ${i.publishable_key}`}});s=yield n.json()}else if("smartglocal"===t){const t={card:{number:e.cardNumber.replace(/[^\d]+/g,""),expiration_month:e.expiryMonth,expiration_year:e.expiryYear,security_code:e.cvc.replace(/[^\d]+/g,"")}},n="https://tgb.smart-glocal.com/cds/v1/tokenize/card",a=yield fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","X-PUBLIC-TOKEN":i.public_token},body:JSON.stringify(t)});s={type:"card",token:(yield a.json()).data.token}}this.dispatchEvent("finish",{token:s,card:e}),this.hide()},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}});yi([o,r,d,l,p,m].filter(Boolean),(e=>{y.disabled=!e})),e&&(o.value=e.cardNumber,d.value=e.expiryFull,l.value=e.cvc,r&&(r.value=e.cardholderName),p&&(p.value=e.country),m&&(m.value=e.zip)),this.body.append(this.btnConfirmOnEnter=y),this.show(),o.validateNew(void 0,void 0,!0)||(0,xt.Z)(o.input)}}class Ei extends w.Z{constructor(e,t){super("popup-payment popup-payment-card-confirmation",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"Checkout.PasswordEntry.Title"});const i=new vi.Z({noDelimiter:!0,noShadow:!0,caption:"Checkout.PasswordEntry.Text",captionArgs:[e]}),s=new gi.Z({labelText:t.hint});i.content.append(s.container),this.scrollable.append(i.container);const n=()=>{a.disabled=!s.value,s.setState(E.I1.Neutral)};s.input.addEventListener("input",n);const a=Ai({key:"Checkout.PasswordEntry.Pay",onClick:()=>{return e=this,i=void 0,a=function*(){try{const e=yield this.managers.passwordManager.getInputCheckPassword(s.value,t),i=yield this.managers.apiManager.invokeApi("account.getTmpPassword",{password:e,period:60});this.dispatchEvent("finish",i),this.hide()}catch(e){throw"PASSWORD_HASH_INVALID"===e.type&&(e.handled=!0,s.setError("PASSWORD_HASH_INVALID")),e}},new((n=void 0)||(n=Promise))((function(t,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(e){var i;e.done?t(e.value):(i=e.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(e,i||[])).next())}));var e,i,n,a}});this.body.append(this.btnConfirmOnEnter=a),n(),this.show(),(0,xt.Z)(s.input)}}var Li=i(1171),Ii=i(709);class Mi extends w.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingInfo"}),this.paymentForm=e,this.inputInvoice=t,this.focus=i,this.d()}d(){const e=this.paymentForm.invoice,t=this.paymentForm.saved_info;let i,s,n,a,o,r,d,l,c,h,u;if(e.pFlags.shipping_address_requested){i=new vi.Z({name:"PaymentShippingAddress",noDelimiter:!0,noShadow:!0}),s=new E.ZP({label:"PaymentShippingAddress1Placeholder",maxLength:64,required:!0}),n=new E.ZP({label:"PaymentShippingAddress2Placeholder",maxLength:64}),a=new E.ZP({label:"PaymentShippingCityPlaceholder",maxLength:64,required:!0}),o=new E.ZP({label:"PaymentShippingStatePlaceholder",maxLength:64});const e=wi(!0,!0);r=e.countryInputField,d=e.postcodeInputField,i.content.append(...[s,n,a,o,r,d].filter(Boolean).map((e=>e.container)))}if([e.pFlags.name_requested,e.pFlags.email_requested,e.pFlags.phone_requested].includes(!0)){l=new vi.Z({name:"PaymentShippingReceiver",noDelimiter:!0,noShadow:!0});const t=()=>{const e=h.value,t=(0,Li.Z)(e);return!(!t||t[0].length!==e.length)},i=()=>!!u.value.match(/\d/);e.pFlags.name_requested&&(c=new E.ZP({label:"PaymentShippingName",maxLength:256,required:!0})),e.pFlags.email_requested&&(h=new E.ZP({label:"PaymentShippingEmailPlaceholder",maxLength:64,required:!0,validate:t})),e.pFlags.phone_requested&&(u=new Ii.Z({required:!0,validate:i})),l.content.append(...[c,h,u].filter(Boolean).map((e=>e.container)))}const f=new Dt.Z({text:"PaymentShippingSave",checked:!0}),p=new Bt.ZP({checkboxField:f,subtitleLangKey:"PaymentShippingSaveInfo"});(l||i).content.append(p.container),this.scrollable.append(...[i,l].filter(Boolean).map((e=>e.container)));const m=Ai({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,l=function*(){const e=r&&r.getSelected().country,t={_:"paymentRequestedInfo",shipping_address:e&&{_:"postAddress",street_line1:s.value,street_line2:n.value,city:a.value,state:o.value,country_iso2:null==e?void 0:e.iso2,post_code:d.value},name:null==c?void 0:c.value,email:null==h?void 0:h.value,phone:null==u?void 0:u.value};try{const e=yield this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice,t,null==f?void 0:f.checked);this.dispatchEvent("finish",{shippingAddress:t,requestedInfo:e}),this.hide()}catch(e){const t={ADDRESS_STREET_LINE1_INVALID:s,ADDRESS_STREET_LINE2_INVALID:n,ADDRESS_COUNTRY_INVALID:r,ADDRESS_CITY_INVALID:a,ADDRESS_STATE_INVALID:o,ADDRESS_POSTCODE_INVALID:d,REQ_INFO_NAME_INVALID:c,REQ_INFO_EMAIL_INVALID:h,REQ_INFO_PHONE_INVALID:u}[e.type];throw t&&(t.setError(),e.handled=!0),e}},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,o)}r((l=l.apply(e,t||[])).next())}));var e,t,i,l}});if(this.body.append(this.btnConfirmOnEnter=m),t){const e=t.shipping_address;e&&(s.value=e.street_line1,n.value=e.street_line2,a.value=e.city,o.value=e.state,r.selectCountryByIso2(e.country_iso2),d.value=e.post_code),t.name&&c&&(c.value=t.name),t.email&&h&&(h.value=t.email),t.phone&&u&&(u.value=t.phone)}const{validate:g}=yi([s,n,a,o,r,d,c,h,u].filter(Boolean),(e=>{m.disabled=!e}));let v;g(),this.show(),v=this.focus?{name:c,email:h,phone:u}[this.focus]:s,v&&(0,xt.Z)(v.input)}}var Pi=i(1218);class Zi extends w.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping-methods",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingMethod"}),this.paymentForm=e,this.requestedInfo=t,this.shippingOption=i,this.d()}d(){const e=new vi.Z({name:"PaymentCheckoutShippingMethod",noDelimiter:!0,noShadow:!0}),t=this.requestedInfo.shipping_options.map((e=>new Bt.ZP({radioField:new Pi.Z({text:e.title,name:"shipping-method",value:e.id}),subtitle:(0,wt.Z)(Et(e.prices.map((({amount:e})=>+e)),0),this.paymentForm.invoice.currency)})));let i;const s=(0,Bt.De)(t,(e=>{i=e}));this.shippingOption?t.find((e=>e.radioField.input.value===this.shippingOption.id)).radioField.checked=!0:t[0].radioField.checked=!0,e.content.append(s),this.scrollable.append(e.container);const n=Ai({key:"PaymentInfo.Done",onClick:()=>{this.dispatchEvent("finish",this.requestedInfo.shipping_options.find((e=>e.id===i))),this.hide()}});this.body.append(this.btnConfirmOnEnter=n),this.show()}}var ki=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Ti=["amex","card","diners","discover","jcb","mastercard","visa","unionpay","mir","logo"];function xi(e){if(Ti.includes(e))return`assets/img/${e}.svg`}function Ai(e){var t,i;const s=null!==(t=e.textEl)&&void 0!==t?t:new C.ZP.IntlElement({key:null!==(i=e.key)&&void 0!==i?i:"PaymentInfo.Done"}),n=s.key,a=(0,Be.Z)("btn-primary btn-color-primary payment-item-pay");return a.append(s.element),(0,S.fc)(a,(()=>ki(this,void 0,void 0,(function*(){const t=e.onClick();if(!(t instanceof Promise))return;const i=(0,Rt.y)(a),o=(0,_t.Z)([a],!0);s.compareAndUpdate({key:"PleaseWait"});try{yield t}catch(e){e.handled||console.error("payment button error",e),o(),s.compareAndUpdate({key:n}),i.remove()}})))),a}class _i extends w.Z{constructor(e,t,i,s){super("popup-payment",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.message=e,this.inputInvoice=t,this.paymentForm=i,this.isReceipt=s,this.tipButtonsMap=new Map,this.d().catch((e=>{console.error("payment popup error",e),this.hide()}))}d(){var e,t,i;return ki(this,void 0,void 0,(function*(){this.element.classList.add("is-loading"),this.show();let s=!1;const n=()=>{s||(s=!0,Te&&Te.hide(),this.hide())};let{paymentForm:a,message:o}=this;o&&this.listenerSetter.add(d.Z)("payment_sent",(({peerId:e,mid:t})=>{o.peerId===e&&o.mid===t&&n()}));const r=null==o?void 0:o.media,l=null!==(e=this.isReceipt)&&void 0!==e?e:r?!!r.receipt_msg_id||"messageExtendedMedia"===(null===(t=r.extended_media)||void 0===t?void 0:t._):"payments.paymentReceipt"===a._,c=r?r.pFlags.test:a.invoice.pFlags.test,h=r?r.photo:a.photo,u=r?r.title:a.title,f=r?r.description:a.description;(0,C.$d)(this.title,l?"PaymentReceipt":"PaymentCheckout"),c&&this.title.append(" (Test)");const m="payment-item",g=document.createElement("div");g.classList.add(m);const v=m+"-details",b=document.createElement("div");let y;b.classList.add(v),h&&(y=document.createElement("div"),y.classList.add(v+"-photo","media-container-contain"),(0,V.Z)({photo:h,container:y,boxWidth:100,boxHeight:100,size:{_:"photoSizeEmpty",type:""}}),b.append(y));const w=v+"-lines",E=document.createElement("div");E.classList.add(w);const L=document.createElement("div");L.classList.add(w+"-title");const I=document.createElement("div");I.classList.add(w+"-description");const M=document.createElement("div");M.classList.add(w+"-bot-name"),E.append(L,I,M),(0,_.Z)(L,(0,R.Z)(u)),(0,_.Z)(I,(0,R.Z)(f));const P=new B.Z;M.append(P.element),b.append(E),g.append(b),this.scrollable.append(g);const Z=document.createElement("div");Z.classList.add(m+"-preloader-container"),(0,Rt.y)(Z,!0),this.scrollable.container.append(Z);const k=this.inputInvoice;a||(a=l?yield this.managers.appPaymentsManager.getPaymentReceipt(o.peerId,r.receipt_msg_id||k.msg_id):yield this.managers.appPaymentsManager.getPaymentForm(k),this.paymentForm=a);let T=a.saved_info||a.info;const x=null===(i=a.saved_credentials)||void 0===i?void 0:i[0];let[A,F,D]=yield Promise.all([!l&&T&&this.managers.appPaymentsManager.validateRequestedInfo(k,T),x&&this.managers.passwordManager.getState(),(0,Nt.Z)({peerId:a.provider_id.toPeerId()})]);yield P.update({peerId:a.bot_id.toPeerId()}),Z.remove(),this.element.classList.remove("is-loading");const N=(e,t)=>(0,wt.Z)(e,H,t),{invoice:O}=a,H=O.currency,z=O.pFlags.recurring&&!l;yield P.update({peerId:a.bot_id.toPeerId()});const j=z?yield(0,Nt.Z)({peerId:a.bot_id.toPeerId()}):void 0;Z.remove(),this.element.classList.remove("is-loading");const G=()=>{const e=document.createElement("div");e.classList.add(K+"-price");const t=document.createElement("span"),i=document.createElement("span");return e.append(t,i),{label:e,left:t,right:i}},K=m+"-prices",W=document.createElement("div");W.classList.add(K);const $=e=>e.map((e=>{const{amount:t,label:i}=e,s=G();s.left.textContent=i;const n=N(t);return s.right.textContent=n,s.label})),q=$(O.prices);let Q=()=>0,Y=0;const J=()=>{const e=N(te+Q()+Y);ee.right.textContent=e,X.compareAndUpdate({key:"PaymentCheckoutPay",args:[e]})},X=new C.ZP.IntlElement,ee=G();ee.label.classList.add("is-total"),(0,C.$d)(ee.left,"PaymentTransactionTotal");const te=Et(O.prices.map((({amount:e})=>+e)),0),ie=void 0!==O.max_tip_amount&&!l||!!a.tip_amount;if(ie){const e=m+"-tips",t=St.Z[H];Q=()=>+i().replace(/\D/g,"");const i=()=>r.value,s=()=>{const e=(0,Lt.Z)(i(),`500 ${Ct.Bf} ${Ct.bt}`);r.style.width=e+"px"},n=e=>{e=Math.min(+e,+O.max_tip_amount);const t=N(e,!0);r.value=t,document.activeElement===r&&(0,xt.Z)(r),g&&g();const i=this.tipButtonsMap.get(e);i&&i.classList.add("active"),s(),J()},o=G();(0,C.$d)(o.left,l?"PaymentTip":"PaymentTipOptional");const r=document.createElement("input");r.type="tel",r.classList.add("input-clear",e+"-input"),o.right.append(r),l?o.label.classList.add("disable-hover"):o.label.style.cursor="text",o.label.addEventListener("mousedown",(e=>{(0,Fe.Z)(e.target,r)||(0,xt.Z)(r)}));const d=r instanceof HTMLInputElement?1:2,c=()=>{f?--f:(f=d,(0,xt.Z)(r))},h=()=>{setTimeout((()=>{f=d,(0,xt.Z)(r),document.addEventListener("selectionchange",c)}),0)},u=()=>{r.addEventListener("focus",h,{once:!0}),document.removeEventListener("selectionchange",c)};let f;r.addEventListener("focusout",u),u(),r.addEventListener("input",(()=>{n(Q())}));const p=[t.symbol,t.space_between?" ":""];let g;if(t.symbol_left||p.reverse(),o.right[t.symbol_left?"prepend":"append"](p.join("")),q.push(o.label),l)n(a.tip_amount);else{const t=document.createElement("div");t.classList.add(e);const i=e+"-tip",s=O.suggested_tip_amounts.map((e=>{const t=(0,Be.Z)(i,{noRipple:!0});return t.textContent=N(e),this.tipButtonsMap.set(+e,t),t}));g=()=>{const e=t.querySelector(".active");e&&e.classList.remove("active")},(0,S.fc)(t,(e=>{const t=(0,pe.Z)(e.target,i);if(!t)return;let s=0;if(t.classList.contains("active"))t.classList.remove("active");else{g(),t.classList.add("active");for(const[e,i]of this.tipButtonsMap)if(i===t){s=e;break}}n(s)})),n(0),t.append(...s),q.push(t)}}else J();q.push(ee.label),W.append(...q),g.append(W);const se=(e,t)=>ki(this,void 0,void 0,(function*(){const i=document.createElement("img");i.classList.add("media-photo"),yield(0,At.cj)(i,xi(t));let s=e.media;s?(0,U.Z)(s,i):(s=e.createMedia("small"),s.classList.add("media-container-cover"),s.append(i)),e.container.classList.remove("row-with-icon")})),ne=e=>{e.titleLangKey&&(e.subtitleLangKey=e.titleLangKey),e.noWrap=!0;const t=new Bt.ZP(e);return t.container.classList.add(m+"-row"),e.titleLangKey&&t.subtitle.classList.add("hide"),t},ae=(e,t)=>{if(e.title.textContent=t,!t){const t=C.ZP.weakMap.get(e.subtitle.firstElementChild);e.title.append((0,C.ag)(t.key))}e.subtitle.classList.toggle("hide",!t)},oe=e=>{let t,i,s;"title"in e?(t=e.title.split(" ").shift(),i=e.title,s=e.icon):(t=Tt(e.cardNumber),i=t+" *"+e.cardNumber.split(" ").pop()),ce.title.classList.remove("tgico","tgico-card_outline"),se(ce,s||t.toLowerCase()),ae(ce,i)},re=()=>{new Ci(a,de).addEventListener("finish",(({token:e,card:t})=>{le=e,de=t,oe(t)}))};let de,le;const ce=ne({titleLangKey:"PaymentCheckoutMethod",clickable:l?void 0:re,icon:"card_outline"});ce.container.classList.add(m+"-method-row"),x?oe(x):a.credentials_title&&oe({title:a.credentials_title});const he=ne({title:D,subtitleLangKey:"PaymentCheckoutProvider"}),ue=new p.Z;let fe,me,ve,be,ye,we,Se,Ce;ue.classList.add("avatar-32"),he.createMedia("small").append(ue),ue.updateWithOptions({peerId:a.provider_id.toPeerId()});const Ee=O.pFlags.shipping_address_requested?e=>{if(!e)return ye.subtitle.classList.add("hide"),void(0,U.Z)(ye.title,(0,C.ag)("PaymentShippingAddress"));const t=e.shipping_address;ae(fe,[t.city,t.street_line1,t.street_line2].filter(Boolean).join(", ")),ye.container.classList.toggle("hide",!A&&!l)}:void 0,Le=e=>{Ee&&Ee(e),me&&ae(me,e.name),ve&&ae(ve,e.email),be&&ae(be,e.phone&&"+"+(0,ke.u)(e.phone).formatted)};if(l||(Se=e=>{new Mi(a,k,e).addEventListener("finish",(({shippingAddress:e,requestedInfo:t})=>{A=t,T=a.saved_info=e,Le(e)}))}),O.pFlags.shipping_address_requested){const e=e=>{const i=new Je(this.scrollable,void 0,!0);if(i.save(),t&&t.forEach((e=>e.remove())),!e)return Y=0,J(),i.restore(),void this.onContentUpdate();we=e,ae(ye,e.title),Y=Et(e.prices.map((({amount:e})=>+e)),0),t=$(e.prices);let s=ee.label;ie&&(s=s.previousElementSibling,l||(s=s.previousElementSibling)),t.forEach((e=>s.parentElement.insertBefore(e,s))),J(),i.restore(),this.onContentUpdate()};let t;fe=ne({icon:"location",titleLangKey:"PaymentShippingAddress",clickable:!l&&Se.bind(null,void 0)}),ye=ne({icon:"shipping",titleLangKey:"PaymentCheckoutShippingMethod",clickable:!l&&(Ce=()=>{new Zi(a,A,we).addEventListener("finish",(t=>{e(t)}))})}),ye.container.classList.add("hide");const i=a.shipping;i&&e(i)}O.pFlags.name_requested&&(me=ne({icon:"newprivate",titleLangKey:"PaymentCheckoutName",clickable:!l&&Se.bind(null,"name")})),O.pFlags.email_requested&&(ve=ne({icon:"mention",titleLangKey:"PaymentShippingEmailPlaceholder",clickable:!l&&Se.bind(null,"email")})),O.pFlags.phone_requested&&(be=ne({icon:"phone",titleLangKey:"PaymentCheckoutPhoneNumber",clickable:!l&&Se.bind(null,"phone")})),T&&Le(T);const Ie=[ce,he,fe,ye,me,ve,be].filter(Boolean),Me=z&&new Dt.Z({text:"Payments.Recurrent.Accept",textArgs:[(0,rt.ZP)(O.recurring_terms_url),j]}),Pe=z&&ne({checkboxField:Me}),Ze=z?[document.createElement("hr"),Pe.container]:[];let Te,xe;this.scrollable.append(...[document.createElement("hr"),...Ie.map((e=>e.container)),...Ze].filter(Boolean));const Ae=()=>{_e.disabled=!(!Me||Me.checked)};let _e;_e=Ai(l?{onClick:()=>this.hide(),key:"Done"}:{onClick:()=>{const e=O.pFlags.name_requested&&!(null==T?void 0:T.name)?"name":O.pFlags.email_requested&&!(null==T?void 0:T.email)?"email":O.pFlags.phone_requested&&!(null==T?void 0:T.phone)?"phone":void 0;if(O.pFlags.shipping_address_requested){if(!A)return void Se();if(!we)return void Ce()}else if(e)return void Se(e);return de||xe?Promise.resolve().then((()=>ki(this,void 0,void 0,(function*(){const e=xe?{_:"inputPaymentCredentialsSaved",id:x.id,tmp_password:xe.tmp_password}:{_:"inputPaymentCredentials",data:{_:"dataJSON",data:JSON.stringify(le.token?le:{type:le.type,id:le.id})},pFlags:{save:de.save||void 0}};try{const t=yield this.managers.appPaymentsManager.sendPaymentForm(k,a.form_id,null==A?void 0:A.id,null==we?void 0:we.id,e,Q());"payments.paymentResult"===t._?n():(Te=new mi(t.url,!r.extended_media),Te.addEventListener("finish",(()=>{Te=void 0,n()})),yield new Promise(((e,t)=>{Te.addEventListener("close",(()=>{if(Te=void 0,s)e();else{const e=new Error("payment not finished");e.handled=!0,t(e)}}))})))}catch(e){throw"BOT_PRECHECKOUT_TIMEOUT"===e.type?((0,ge.bC)({langPackKey:"Error.AnError"}),e.handled=!0):"TMP_PASSWORD_INVALID"===e.type&&(F=xe=void 0,(0,S.tH)(_e),e.handled=!0),e}})))):x?void Promise.resolve(null!=F?F:this.managers.passwordManager.getState()).then((e=>{new Ei(x.title,e).addEventListener("finish",(e=>{F=void 0,xe=e,(0,S.tH)(_e);const t=e.valid_until-(0,Ft.Z)(!0)-5;setTimeout((()=>{xe===e&&(xe=void 0)}),1e3*t)}))})):void re()},textEl:X}),Ae(),Me&&Me.input.addEventListener("change",Ae),this.body.append(this.btnConfirmOnEnter=_e),this.onContentUpdate()}))}}var Fi=i(8487),Di=i(13),Ri=i(9259),Bi=i(3228);class Ni{constructor(e,t,i,s,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=i,this.spacing=s,this.maxHeight=n,this.count=e.length,this.ratios=Ni.countRatios(e),this.proportions=Ni.countProportions(this.ratios),this.averageRatio=Et(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find((e=>e>2))?new Oi(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:14}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:13},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:7}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),i=this.maxWidth-t-this.spacing,s=Math.min(this.maxHeight,Math.round(Math.min(i/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:i,height:s},sides:13},{geometry:{x:i+this.spacing,y:0,width:t,height:s},sides:7}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),i=e-t-this.spacing,s=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],i*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-s);return[{geometry:{x:0,y:0,width:n,height:e},sides:13},{geometry:{x:n+this.spacing,y:0,width:s,height:i},sides:3},{geometry:{x:n+this.spacing,y:i+this.spacing,width:s,height:t},sides:6}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=(this.maxWidth-this.spacing)/2,s=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(i/this.ratios[1],i/this.ratios[2]))),n=e-i-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:i,height:s},sides:12},{geometry:{x:i+this.spacing,y:t+this.spacing,width:n,height:s},sides:6}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),s=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),i*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),i*this.ratios[3])),a=e-s-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,i);return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:s,height:o},sides:12},{geometry:{x:s+this.spacing,y:t+this.spacing,width:a,height:o},sides:4},{geometry:{x:s+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:6}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),i=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),s=Math.round(i/this.ratios[1]),n=Math.round(i/this.ratios[2]),a=e-s-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,i));return[{geometry:{x:0,y:0,width:t,height:e},sides:13},{geometry:{x:t+this.spacing,y:0,width:o,height:s},sides:3},{geometry:{x:t+this.spacing,y:s+this.spacing,width:o,height:n},sides:2},{geometry:{x:t+this.spacing,y:s+n+2*this.spacing,width:o,height:a},sides:6}]}static countRatios(e){return e.map((e=>e.w/e.h))}static countProportions(e){return e.map((e=>e>1.2?"w":e<.8?"n":"q")).join("")}}class Oi{constructor(e,t,i,s,n,a=4*i/3){this.averageRatio=t,this.maxWidth=i,this.minWidth=s,this.spacing=n,this.maxHeight=a,this.ratios=Oi.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map((e=>t>1.1?(0,Bi.Z)(e,1,2.75):(0,Bi.Z)(e,.6667,1)))}layout(){const e=new Array(this.count),t=[],i=(e,t)=>{const i=Et(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/i},s=e=>{const s=[];let n=0;for(const t of e)s.push(i(n,t)),n+=t;t.push({lineCounts:e,heights:s})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||s([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const i=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||i>3||s([e,t,i])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let i=1;i!==this.count-e-t;++i){const n=this.count-e-t-i;e>3||t>3||i>3||n>3||s([e,t,i,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:i}=e,s=i.length,o=Et(t,0)+this.spacing*(s-1),r=Math.min(...t),d=(Math.max(...t),r{for(let e=1;e!==s;++e)if(i[e-1]>i[e])return 1.5;return 1})(),c=Math.abs(o-this.maxHeight)*d*l;(!n||c2&e.sides)),s=i.geometry.width+i.geometry.x,n=t.find((e=>4&e.sides)),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=s+"px",o.style.height=a+"px";const r=o.children;t.forEach((({geometry:t,sides:i},n)=>{let d;if(d=r[n],d||(d=document.createElement("div"),o.append(d)),d.classList.add("album-item","grouped-item"),d.style.width=t.width/s*100+"%",d.style.height=t.height/a*100+"%",d.style.top=t.y/a*100+"%",d.style.left=t.x/s*100+"%",8&i&&1&i&&(d.style.borderTopLeftRadius="inherit"),8&i&&4&i&&(d.style.borderBottomLeftRadius="inherit"),2&i&&1&i&&(d.style.borderTopRightRadius="inherit"),2&i&&4&i&&(d.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),d.append(e)}}))}var Hi=i(1046);class zi{constructor(e,t){this.width=e,this.height=t;const i=this.canvas=document.createElement("canvas"),s=this.dpr=window.devicePixelRatio;i.width=e*s,i.height=t*s,i.classList.add("canvas-thumbnail","canvas-dots"),this.paused=!0,this.autoplay=!0,this.tempId=0,this.context=i.getContext("2d")}prepare(){let e=Math.round(this.width*this.height/(35*(T.IS_MOBILE?2:1)));e=Math.min(T.IS_MOBILE?1e3:2200,e);const t=this.dots=new Array(e);for(let i=0;i=.8?1:.5)*this.dpr,a=new Path2D;return a.arc(t,i,n,0,2*Math.PI,!1),{x:t,y:i,opacity:s,radius:n,mOpacity:s,adding:null!=e?e:Math.random()>=.5,counter:0,path:a}}draw(){const{context:e,canvas:t,dots:i}=this;e.clearRect(0,0,t.width,t.height),e.fillStyle="#fff";for(let t=0,s=i.length;t=1&&(i[t]=this.generateDot(s.adding))):s.mOpacity>=1&&(s.adding=!1)}}remove(){this.pause()}pause(){this.paused||(this.paused=!0,++this.tempId)}renderFirstFrame(){this.dots||this.prepare(),this.draw()}play(){if(!this.paused)return;this.paused=!1;const e=++this.tempId;this.dots||this.prepare(),(0,Ee.jt)((()=>this.tempId===e&&!this.paused&&(this.draw(),!0)))}static create({width:e,height:t,middleware:i,animationGroup:n}){i.onClean((()=>{s.Z.removeAnimationByPlayer(a)}));const a=new zi(e,t);return a.renderFirstFrame(),s.Z.addAnimation(a,n,a.canvas,!0),a}}function ji({media:e,middleware:t,width:i,height:s,animationGroup:n}){return a=this,o=void 0,d=function*(){const a=(e.sizes||e.thumbs).find((e=>"photoStrippedSize"===e._));if(!a)return;const{image:o,loadPromise:r}=(0,Hi.Z)(e,a,!0);if(yield r,!t())return;o.classList.add("media-spoiler-thumbnail");const d=document.createElement("div");d.classList.add("media-spoiler-container"),d.middlewareHelper=t.create();const l=zi.create({width:i,height:s,middleware:d.middlewareHelper.get(),animationGroup:n});return d.append(o,l.canvas),d},new((r=void 0)||(r=Promise))((function(e,t){function i(e){try{n(d.next(e))}catch(e){t(e)}}function s(e){try{n(d.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(i,s)}n((d=d.apply(a,o||[])).next())}));var a,o,r,d}function Gi({messages:e,attachmentDiv:t,middleware:i,uploading:s,lazyLoadQueue:n,isOut:a,chat:r,loadPromises:l,autoDownload:c,managers:h=d.Z.managers,animationGroup:u}){const f=[];for(const t of e){const e=(0,ct.Z)(t),i="photo"===e._?(0,z.Z)(e,480,480):{w:e.w,h:e.h};f.push({size:i,media:e,message:t})}Ui({container:t,items:f.map((e=>({w:e.size.w,h:e.size.h}))),maxWidth:o.Z.active.album.width,minWidth:100,spacing:2,forMedia:!0});const{width:p,height:m}=t.style,g=parseInt(p),v=parseInt(m);f.forEach(((e,s)=>{var o;const{size:r,media:d,message:f}=e,p=!!(null===(o=f.media.pFlags)||void 0===o?void 0:o.spoiler),m=t.children[s];m.dataset.mid=""+f.mid,m.dataset.peerId=""+f.peerId;const b=m.firstElementChild;let y;if(y="photo"===d._?(0,V.Z)({photo:d,message:f,container:b,boxWidth:0,boxHeight:0,isOut:a,lazyLoadQueue:n,middleware:i,size:r,loadPromises:l,autoDownloadSize:c.photo,managers:h}):(0,W.Z)({doc:d,container:b,message:f,boxWidth:0,boxHeight:0,withTail:!1,isOut:a,lazyLoadQueue:n,middleware:i,loadPromises:l,autoDownload:c,managers:h,noAutoplayAttribute:p}),y&&(null==l||l.push(y)),p){const e=(y||Promise.resolve()).then((()=>{return e=this,t=void 0,n=function*(){if(!i())return;const{width:e,height:t}=m.style,s=+e.slice(0,-1)/100*g,n=+t.slice(0,-1)/100*v,a=yield ji({media:d,animationGroup:u,middleware:i,width:s,height:n});i()&&b.append(a)},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}));null==l||l.push(e)}}))}var Vi=i(296),Ki=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))},Wi=i(3552),$i=i(8130);class qi extends Wi._{init(e){return t=this,i=void 0,n=function*(){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);const t=yield this.managers.appPollsManager.getPoll(e.media.poll.id);this.setTitle(t.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");(0,_.Z)(i,(0,R.Z)(t.poll.question));const s=t.results.results.map((e=>e.voters/t.results.total_voters*100));Ji(s);const n=document.createDocumentFragment();t.results.results.forEach(((i,o)=>{if(!i.voters)return;const r=document.createElement("hr"),d=t.poll.answers[o],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");(0,_.Z)(c,(0,R.Z)(d.text));const h=document.createElement("div");h.innerText=Math.round(s[o])+"%",l.append(c,h);const u=$i.default.createChatList();u.classList.add("poll-results-voters"),$i.default.setListClickListener(u,(()=>{a.ZP.onCloseBtnClick()}),void 0,!0),u.style.minHeight=48*Math.min(i.voters,4)+"px",n.append(r,l,u);let f,p=4,m=!1,g=Math.max(0,i.voters-4);const v=()=>{m||(m=!0,this.managers.appPollsManager.getVotes(e,d.option,f,p).then((e=>{e.votes.forEach((e=>{const{dom:t}=$i.default.addDialogNew({peerId:e.user_id.toPeerId(!1),container:u,rippleEnabled:!1,meAsSaved:!1,avatarSize:"small"});t.lastMessageSpan.parentElement.remove()})),f&&(g=Math.max(0,g-e.votes.length),g&&b.lastElementChild.replaceWith((0,C.ag)("PollResults.LoadMore",[Math.min(20,g)]))),f=e.next_offset,p=20,g&&e.votes.length||b.remove()})).finally((()=>{m=!1})))},b=(0,Be.Z)("poll-results-more btn btn-primary btn-transparent",{icon:"down"});b.addEventListener("click",v),b.append((0,C.ag)("PollResults.LoadMore",[Math.min(20,g)])),n.append(b),v()})),this.resultsDiv.append(i,n),a.ZP.toggleSidebar(!0).then((()=>{}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}var Qi=i(5157);let Yi=0;const Ji=e=>{const t=e.reduce(((e,t)=>e+Math.round(t)),0);if(t>100){const i=t-100,s=e.length;for(let t=0;t=.5&&si&&(i=s,t=n)}if(-1===t)return;e[t]+=1-i}}};d.Z.addEventListener("poll_update",(({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach((i=>{i.isClosed=!!e.pFlags.closed,i.performResults(t,e.chosenIndexes)}))})),o.Z.addEventListener("resize",(()=>{ns.setMaxLength(),ns.resizePolls()})),o.Z.addEventListener("changeScreen",(()=>{ns.setMaxLength()}));const Xi=(e,t,i)=>{e.classList.remove("active"),clearTimeout(i),setTimeout((()=>{t(),e.remove(),es===e&&ts===t&&is===i&&(es=ts=null,is=0)}),200)};let es,ts,is,ss=!1;class ns extends HTMLElement{constructor(){super(...arguments),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=Ze.Z.width<=360?Ze.Z.width-120:o.Z.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){this.MAX_LENGTH&&Array.from(document.querySelectorAll("poll-element.is-voted")).forEach((e=>{e.svgLines.forEach(((t,i)=>{e.setLineProgress(i,1)}))}))}render(){return e=this,t=void 0,s=function*(){Yi||(Yi=document.getElementById("poll-line").getTotalLength(),ns.setMaxLength());const{poll:e,results:t}=this.message.media;let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),e.pFlags&&(this.isPublic=!!e.pFlags.public_voters,this.isQuiz=!!e.pFlags.quiz,this.isClosed=!!e.pFlags.closed,this.isMultiple=!!e.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const s=this.isMultiple?'':"",n=e.answers.map(((e,t)=>`\n
\n
\n
\n \n \n \n ${s}\n
\n
\n
\n \n \n
\n `)).join("");if(this.innerHTML=`\n
\n
\n
\n
\n
\n ${n}`,(0,_.Z)(this.firstElementChild,(0,R.Z)(e.question)),Array.from(this.querySelectorAll(".poll-answer-text")).forEach(((t,i)=>{(0,_.Z)(t,(0,R.Z)(e.answers[i].text))})),this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append((0,C.ag)(i)),this.isQuiz&&(this.classList.add("is-quiz"),e.close_period&&e.close_date)){const t=document.createElement("div");t.classList.add("poll-time"),this.descDiv.append(t);const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("poll-quiz-timer"),this.quizTimer=i;const s=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",""+s),i.append(o),this.descDiv.append(i);const r=1e3*e.close_period,l=1e3*(e.close_date-(yield d.Z.managers.timeManager.getServerTimeOffset()));this.quizInterval=window.setInterval((()=>{const e=Date.now(),i=(l-e)/r,s=(l-e)/1e3+1|0;t.innerHTML=(0,Qi.Z)(s),s<=5&&(t.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+i*a,o.style.strokeDasharray=`${a} ${a}`,e>=l&&(clearInterval(this.quizInterval),t.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout((()=>{this.managers.appPollsManager.getResults(this.message)}),3e3))}),1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const 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((0,C.ag)("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=>{(0,ye.Z)(e),a.ZP.isTabExists(qi)||a.ZP.createTab(qi).open(this.message)})),(0,x.Z)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append((0,C.ag)("Chat.Poll.SubmitVote")),(0,x.Z)(this.sendVoteBtn),e.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),(0,S.fc)(this.sendVoteBtn,(e=>{(0,ye.Z)(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=!(e.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(t,e.chosenIndexes,!1),r&&(this.setVotersCount(t),(0,S.fc)(this,this.clickHandler))},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),(0,S.fc)(t,(i=>{(0,ye.Z)(i),t.classList.add("active"),((e,t,i)=>{es&&Xi(es,ts,is);const s=document.createElement("div");s.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),s.append(n),(0,_.Z)(a,(0,rt.ZP)(e,{entities:t})),Ur.chat.bubbles.container.append(s),s.offsetLeft,s.classList.add("active"),es=s,ts=i,is=window.setTimeout((()=>{Xi(s,i,is)}),c.Z?5e3:7e3),ss||(ss=!0,Ur.addEventListener("peer_changed",(()=>{es&&Xi(es,ts,is)})))})(e.solution,e.solution_entities,(()=>{t.classList.remove("active")}))})),this.sentVote){const i=e.results.find((e=>e.pFlags.correct));i&&!i.pFlags.chosen&&(0,S.tH)(t)}}}clickHandler(e){const t=(0,pe.Z)(e.target,"poll-answer");if(!t)return;(0,ye.Z)(e);const i=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(i);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(i)}else this.sendVotes([i])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter(((t,i)=>e.includes(i)));return t.forEach((e=>{e.classList.add("is-voting")})),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=this.managers.appPollsManager.sendVote(this.message,e).then((()=>{t.forEach((e=>{e.classList.remove("is-voting")})),this.classList.remove("disable-hover")})).catch((()=>{this.sentVote=!1})).finally((()=>{this.sendVotePromise=null}))}performResults(e,t,i=!0){var s,n;if(d.Z.settings.animationsEnabled||(i=!1),this.isQuiz&&((null===(s=e.results)||void 0===s?void 0:s.length)||this.isClosed)){this.answerDivs.forEach(((t,i)=>{t.classList.toggle("is-correct",!!e.results[i].pFlags.correct)})),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(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"),(0,U.Z)(this.typeDiv,(0,C.ag)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?(0,S.fc)(this,this.clickHandler):(0,S.EN)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map((t=>e.total_voters?t.voters/e.total_voters*100:0));this.classList.toggle("no-transition",!i),i&&(0,xe.Z)({element:this,className:"",forwards:!this.isRetracted,duration:340}),(0,ce.T2)((()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,i),this.percents=t,this.isRetracted=!1}))}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));const t=(e.recent_voters||[]).map((e=>e.toPeerId())),i=new ee({avatarSize:16});i.render(t),(0,U.Z)(this.avatarsDiv,i.container)}if(this.isMultiple){const t=!!this.chosenIndexes.length,i=this.isClosed||t,s=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",i),this.viewResults.classList.toggle("hide",s),this.votersCountDiv.classList.toggle("hide",!i||!s)}}setResults(e,t,i){this.svgLines.forEach((e=>e.style.display="")),this.answerDivs.forEach(((e,i)=>{e.classList.toggle("is-chosen",t.includes(i))}));const s=Math.max(...e);if(this.maxPercents=e.map((e=>e/s)),this.isRetracted)this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,-1)}));else{const e=()=>{this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,1)}))};i?(0,ce.T2)(e):e()}let n;e=e.slice(),Ji(e);const a=t=>{e.forEach(((e,i)=>{const s=n(e,t);this.numberDivs[i].innerText=s+"%"}))};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),i)for(let e=9,t=0;e>=0;--e,++t)setTimeout((()=>{a(e)}),34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),i)for(let e=0;e<10;++e)setTimeout((()=>{a(e)}),34*e);else a(9);if(this.isRetracted){i&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach((e=>e.style.display="none"))};i?setTimeout((()=>{this.classList.remove("is-retracting"),e()}),340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let i;const s=[t];i=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",(0,U.Z)(this.votersCountDiv,(0,C.ag)(i,s))}setLineProgress(e,t){const i=this.svgLines[e];-1===t?(i.style.strokeDasharray="",i.style.strokeDashoffset=""):(i.style.strokeDasharray=t*this.maxPercents[e]*ns.MAX_LENGTH+", 485.9",i.style.strokeDashoffset=""+t*ns.MAX_OFFSET)}}ns.MAX_OFFSET=-46.5,ns.MAX_LENGTH=0,customElements.define("poll-element",ns);new RegExp("^[^A-Za-zÀ-ÖØ-öø-ʸ̀-֐ࠀ-῿Ⰰ-﬜﷾-﹯﻽-￿]*[֑-߿יִ-﷽ﹰ-ﻼ]");const as=new RegExp("[֑-߿יִ-﷽ﹰ-ﻼ]");var os=i(5345),rs=i(3591),ds=i(9102),ls=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const cs=new Map([["messageActionHistoryClear",!0],["messageActionChatCreate",e=>e.pFlags.out]]),hs=new Set;Re.Z&&hs.add("messageActionPhoneCall");const us=void 0;let fs=us,ps=0;const ms=3,gs=new Error("peer changed"),vs={1:96,2:90,3:84,4:72,5:60,6:48,7:36},bs=Object.keys(vs).length;function ys(e){return Math.max(...e)}class ws{constructor(e,t){let i;this.chat=e,this.managers=t,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.bubblesNewByGroupedId={},this.bubblesNew={},this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middlewareHelper=(0,be.k)(),this.followStack=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.renderingMessages=new Set,this.bubblesToEject=new Set,this.bubblesToReplace=new Map,this.setPeerTempId=0,this.renderNewPromises=new Set,this.extendedMediaMessages=new Set,this.unreadedObserverCallback=e=>{if(e.isIntersecting){const t=e.target,i=this.unreaded.get(t);this.onUnreadedInViewport(t,i)}},this.viewsObserverCallback=e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.observer.unobserve(e.target,this.viewsObserverCallback),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this,t=null==e?void 0:e.random_id;t&&(this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(),t),delete e.random_id)}}},this.stickerEffectObserverCallback=e=>{if(e.isIntersecting){this.observer.unobserve(e.target,this.stickerEffectObserverCallback);const t=e.target.querySelector(".attachment");(0,le.e9)().then((()=>{(0,Fi.Z)(t)&&(0,S.tH)(t)}))}},this.onBubblesMouseMove=e=>ls(this,void 0,void 0,(function*(){const t=(0,pe.Z)(e.target,"bubble-content");if("scheduled"===this.chat.type||!t||this.chat.selection.isSelecting||(0,pe.Z)(e.target,"service")||(0,pe.Z)(e.target,"bubble-beside-button"))this.unhoverPrevious();else{const e=(0,pe.Z)(t,"bubble");if(!this.chat.selection.canSelectBubble(e))return void this.unhoverPrevious();let{hoverBubble:i,hoverReaction:s}=this;if(e===i)return;if(this.unhoverPrevious(),i=this.hoverBubble=e,s=this.hoverReaction,s)s.dataset.loaded&&this.setHoverVisible(s,!0);else{s=this.hoverReaction=document.createElement("div"),s.classList.add("bubble-hover-reaction");const i=document.createElement("div");i.classList.add("bubble-hover-reaction-sticker"),s.append(i),t.append(s);let n=yield this.chat.getMessage(+e.dataset.mid);if("message"!==(null==n?void 0:n._))return void this.unhoverPrevious();n=yield this.managers.appMessagesManager.getGroupsFirstMessage(n);const a=this.getMiddleware((()=>this.hoverReaction===s));Promise.all([this.managers.appReactionsManager.getAvailableReactionsByMessage(n),(0,Ye.Z)(400)]).then((([e])=>{const t=e[0];t?(0,K.ZP)({div:i,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:this.chat.animationGroup,withThumb:!1,needFadeIn:!1}).then((({render:e})=>e)).then((e=>{(0,Le.Z)(e),e.addEventListener("firstFrame",(()=>{a()&&(s.dataset.loaded="1",this.setHoverVisible(s,!0))}),{once:!0}),(0,S.fc)(s,(e=>{(0,ye.Z)(e),this.managers.appReactionsManager.sendReaction(n,t),this.unhoverPrevious()}),{listenerSetter:this.listenerSetter})}),We.Z):s.remove()}))}}})),this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>ls(this,void 0,void 0,(function*(){var t;let i=e.target,s=null;try{s=(0,pe.Z)(i,"bubble")}catch(e){}if(!s&&!this.chat.selection.isSelecting){const e=(0,pe.Z)(i,"user-avatar");if(!e)return;const t=e.dataset.peerId.toPeerId();return void(t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,ge.Am)(C.ZP.format("HidAccount",!0)))}if(s.classList.contains("is-date")&&(0,pe.Z)(i,"bubble-content")){if(s.classList.contains("is-fake")&&(s=s.previousElementSibling),s.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages)if(this.dateMessages[e].div===s){w.Z.createPopup(L,new Date(+e),this.onDatePick).show();break}return}if(!c.Z&&(0,pe.Z)(i,"time"))return void this.chat.selection.toggleByElement(s);if(this.chat.selection.isSelecting&&e.isTrusted){if(s.classList.contains("service")&&void 0===s.dataset.mid)return;return(0,ye.Z)(e),c.Z&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement((0,pe.Z)(i,"grouped-item")||s)}const n=(0,pe.Z)(i,"media-spoiler-container");if(n){if((0,ye.Z)(e),n.classList.contains("is-revealing"))return;const t=n.parentElement.querySelector("video");return t&&!n.parentElement.querySelector(".video-play")&&(t.autoplay=!0,t.play().catch(We.Z)),void(0,xe.Z)({element:n,forwards:!0,className:"is-revealing",duration:250,onTransitionEnd:()=>{n.remove(),n.middlewareHelper.destroy()}})}const a=(0,pe.Z)(i,"contact");if(a)return void this.chat.appImManager.setInnerPeer({peerId:a.dataset.peerId.toPeerId()});const o=(0,pe.Z)(i,"bubble-call");if(o)return void this.chat.appImManager.callUser(this.peerId.toUserId(),o.dataset.type);if((0,pe.Z)(i,"is-buy")){(0,ye.Z)(e);const t=yield this.chat.getMessage(+s.dataset.mid);if(!t)return;return void new _i(t,yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(t.peerId,t.mid))}const r=(0,me.Z)(i,"REACTION-ELEMENT");if(r){if((0,ye.Z)(e),r.classList.contains("is-inactive"))return;const t=r.parentElement,i=t.getReactionCount(r),s=t.getMessage();return void this.managers.appReactionsManager.sendReaction(s,i.reaction)}const d=(0,_e.Z)(i,"data-sticker-emoji");if(d&&1===d.parentElement.querySelectorAll("[data-sticker-emoji]").length&&s.classList.contains("emoji-big"))return void(0,K._2)({event:e,container:d,managers:this.managers,middleware:this.getMiddleware(),peerId:this.peerId});if((0,pe.Z)(i,"replies")){const e=+s.dataset.mid;if(this.peerId===m.hj){const t=yield this.chat.getMessage(e),i=(0,D.Z)(t.reply_to.reply_to_peer_id),s=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread({peerId:i,lastMsgId:n,threadId:s})}else{const t=yield this.chat.getMessage(e),i=yield this.managers.appMessagesManager.getMessageWithReplies(t),s=i.replies;s&&this.managers.appMessagesManager.getDiscussionMessage(this.peerId,i.mid).then((e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})}))}return}const l=(0,pe.Z)(i,"is-via");if(l){const t=l.querySelector(".peer-title");if(i===t||(0,Fe.Z)(i,t)){const i=t.innerText+" ";return this.managers.appDraftsManager.setDraft(this.peerId,this.chat.threadId,i),void(0,ye.Z)(e)}}const h=(0,pe.Z)(i,"peer-title")||(0,me.Z)(i,"AVATAR-ELEMENT")||(0,_e.Z)(i,"data-saved-from");if(h&&h!==s){i=h||i;const e=i.dataset.peerId||i.getAttribute("peer")||i.peerId,t=i.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,n]=t.split("_");if(i.classList.contains("is-receipt-link")){const t=yield this.managers.appMessagesManager.getMessageByPeer(e.toPeerId(),+n);if(t){const e=yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId,+s.dataset.mid);new _i(t,e,void 0,!0)}}else this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+n})}else{const t=e.toPeerId();t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,ge.Am)(C.ZP.format("HidAccount",!0))}return}if(s.classList.contains("sticker")&&i.parentElement.classList.contains("attachment")){const e=+s.dataset.mid,i=null===(t=(yield this.chat.getMessage(e)).media)||void 0===t?void 0:t.document;return void((null==i?void 0:i.stickerSetInput)&&new M.Z(i.stickerSetInput).show())}const u=(0,pe.Z)(i,"document-with-thumb");if("IMG"===i.tagName&&!i.classList.contains("emoji")&&!i.classList.contains("document-thumb")||i.classList.contains("album-item")||"VIDEO"===i.tagName&&!s.classList.contains("round")||u&&!u.querySelector(".preloader-container")||i.classList.contains("canvas-thumbnail")){const t=(0,pe.Z)(i,"album-item")||(0,pe.Z)(i,"document-container"),n=(t||s).querySelector(".preloader-container");if(n)return(0,S.tH)(n),void(0,ye.Z)(e);(0,ye.Z)(e);const a=+(t||s).dataset.mid,o=yield this.chat.getMessage(a);if(!o)return void this.log.warn("no message by messageId:",a);const r="webpage",d=s.classList.contains(r),l=u?e=>Te.Z.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),c=[],h=d?[a]:(yield Promise.all(Object.keys(this.bubbles).map((e=>+e)).map((e=>ls(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e),i=(0,ct.Z)(t);return i&&l(i)&&e})))))).filter(Boolean).sort(((e,t)=>e-t));h.forEach((e=>{let t;u?t=".document-container":(t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img");const i=Array.from(this.bubbles[e].querySelectorAll(t)),s=new Set;if(u)i.forEach((e=>{c.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})}));else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");i.forEach((i=>{if(t&&!(0,pe.Z)(i,"media-container-aspecter"))return;const n=(0,pe.Z)(i,"album-item"),a=n||i.parentElement;s.has(a)||(s.add(a),c.push({element:i,mid:n?+n.dataset.mid:e,peerId:this.peerId}))}))}})),c.sort(((e,t)=>e.mid-t.mid));const f=c.findIndex((e=>e.mid===a));return ue.ZP&&this.log("open mediaViewer single with ids:",h,f,c),c[f]?void(new Te.Z).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:u?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!d,isScheduled:"scheduled"===this.chat.type}).openMedia(o,c[f].element,0,!0,c.slice(0,f),c.slice(f+1)):void this.log("no target for media viewer!",i)}if(-1===["IMG","DIV","SPAN"].indexOf(i.tagName)&&(i=(0,me.Z)(i,"DIV")),-1!==["DIV","SPAN"].indexOf(i.tagName)){if(i.classList.contains("goto-original")){const e=s.dataset.savedFrom,[t,i]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+i})}if(i.classList.contains("forward")){const e=+s.dataset.mid,t=yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,e);return void new I.Z({[this.peerId]:yield this.managers.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!(0,pe.Z)(e.target,"reply")}catch(e){}if(t&&s.classList.contains("is-reply")){const e=+s.dataset.mid;this.followStack.push(e);const t=yield this.chat.getMessage(e),i=t.reply_to.reply_to_peer_id?(0,D.Z)(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:i,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}})),this.onScroll=(e,t,i)=>{var s,n,a,o,r;if(this.isHeavyAnimationInProgress){if(null===(s=this.sliceViewportDebounced)||void 0===s||s.clearTimeout(),this.scrolledDown&&!e)return}else null===(n=this.chat.topbar.pinnedMessage)||void 0===n||n.setCorrectIndexThrottled(this.scrollable.lastScrollDirection),null===(a=this.sliceViewportDebounced)||void 0===a||a.call(this),this.setStickyDateManually();if(t&&t.distanceToEnd<300&&this.scrolledDown)return;const d=i?0:null!==(o=null==t?void 0:t.distanceToEnd)&&void 0!==o?o:this.scrollable.getDistanceToEnd();(0!==this.scrollable.lastScrollDirection&&d>0||t||i)&&(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!==(r=null==t?void 0:t.duration)&&void 0!==r?r:0))),d<300&&(i||this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.container.classList.add("scrolled-down"),this.scrolledDown=!0):this.container.classList.contains("scrolled-down")&&(this.container.classList.remove("scrolled-down"),this.scrolledDown=!1)},this.processBatch=(...e)=>ls(this,void 0,void 0,(function*(){var t,i,s;let[n,a,o]=e;const r=e=>e.filter((e=>e&&this.bubbles[e.bubble.dataset.mid]===e.bubble));n=r(n),o("messages rendered");const d=null===(t=n[0])||void 0===t?void 0:t.reverse,{groups:l,avatarPromises:c}=this.groupBubbles(n.filter((e=>e.updatePosition))),h=n.reduce(((e,t)=>{const i=performance.now(),s=t.promises.slice(),n=s.map((e=>ls(this,void 0,void 0,(function*(){return yield e,performance.now()-i}))));return Promise.all(n).then((e=>{o.groupCollapsed("media message time",performance.now()-i,t,e),e.forEach(((e,t)=>{o("media message time",e,t,s[t])})),o.groupEnd()})),e.push(...t.promises),e}),[]);h.push(...c),o("media promises to call",h,n,this.isHeavyAnimationInProgress),yield a(Promise.all([...h,this.setUnreadDelimiter()]).catch(We.Z)),yield a((0,ce.AD)()),o("media promises end"),n=r(n);const{restoreScroll:u,scrollSaver:f}=this.prepareToSaveScroll(d);null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this),this.ejectBubbles();for(const[e,t]of this.bubblesToReplace){if(f&&f.replaceSaved(t,e),!n.find((t=>t.bubble===e)))continue;const i=this.bubbleGroups.getItemByBubble(e);i?(i.mounted=!1,l.includes(i.group)||l.push(i.group)):this.log.error("NO ITEM BY BUBBLE",e),this.bubblesToReplace.delete(e)}this.chat.selection.isSelecting&&n.forEach((({bubble:e})=>{this.chat.selection.toggleElementCheckbox(e,!0)})),n.forEach((({message:e,bubble:t,updatePosition:i})=>{e.pFlags.local&&i&&this.chatInner[e.pFlags.sponsored?"append":"prepend"](t)})),this.bubbleGroups.mountUnmountGroups(l),null===(s=this.updatePlaceholderPosition)||void 0===s||s.call(this),null==u||u()})),this.onDatePick=e=>{const t=this.peerId;this.managers.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then((e=>{var i;(null===(i=null==e?void 0:e.messages)||void 0===i?void 0:i.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")}))},this.log=this.chat.log,this.listenerSetter=new oe.Z,this.constructBubbles(),this.batchProcessor=new os.s({log:this.log,process:this.processBatch,possibleError:gs}),this.bubbleGroups=new y(this.chat),this.preloader=new P.Z({cancelable:!1}),this.lazyLoadQueue=new ae.Z(void 0,!0),this.lazyLoadQueue.queueId=++ps,this.listenerSetter.add(d.Z)("history_update",(({storageKey:e,sequential:t,message:i})=>ls(this,void 0,void 0,(function*(){if(this.chat.messagesStorageKey!==e||"scheduled"===this.chat.type)return;const{mid:s}=i,n=this.bubbles[s];if(!n)return;if(this.renderNewPromises.size&&(yield Promise.all(Array.from(this.renderNewPromises))),this.messagesQueuePromise&&(yield this.messagesQueuePromise),this.bubbles[s]!==n)return;const a=this.bubbleGroups.getItemByBubble(n);if(!a)return;if(a.mid===s)return;if(t){const e=a.group,o=this.bubbleGroups.createItem(n,i),r=this.bubbleGroups.itemsArr.slice();(0,h.Z)(r,a);const l=this.bubbleGroups.findGroupSiblingByItem(o,r);if(e===(null==l?void 0:l.group)||e===this.bubbleGroups.getLastGroup()&&1===e.items.length&&o.dateTimestamp===a.dateTimestamp||this.peerId===d.Z.myId&&t&&o.dateTimestamp===a.dateTimestamp)return void this.bubbleGroups.changeBubbleMid(n,s)}this.bubbleGroups.removeAndUnmountBubble(n);const{groups:o}=this.groupBubbles([{bubble:n,message:i}]);this.bubbleGroups.mountUnmountGroups(o),this.scrollingToBubble&&this.scrollToEnd()})))),this.listenerSetter.add(d.Z)("dialog_flush",(({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map((e=>+e)))})),this.listenerSetter.add(d.Z)("message_sent",(e=>ls(this,void 0,void 0,(function*(){const{storageKey:t,tempId:i,tempMessage:s,mid:n,message:a}=e;if(this.chat.messagesStorageKey!==t)return;const o=this.bubbles,r=o[i];if(r){const e=o[i];o[n]=e,e.dataset.mid=""+n,delete o[i],(0,ce.T2)((()=>{const t=+e.dataset.mid;o[t]===e&&e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===d.Z.myId&&"scheduled"!==this.chat.type||!this.unreadOut.has(t)?"is-read":"is-sent"))}))}if(this.unreadOut.has(i)&&(this.unreadOut.delete(i),this.unreadOut.add(n)),"scheduled"===this.chat.type&&(Date.now()/1e3|0)>=s.date-10&&this.deleteMessagesByIds([n]),!r)return;let l,c;const h=a.grouped_id;if(h){l=yield this.managers.appMessagesManager.getMessagesByAlbum(h);const e=l.map((({mid:e})=>e));if(!e.length||ys(e)!==n||o[n]!==r)return;if(o[n]!==r)return;c=Array.from(r.querySelectorAll(".grouped-item")).map((e=>+e.dataset.mid))}else l=[a],c=[i];const u=Array.from(r.querySelectorAll("reactions-element"));u.length&&u.forEach((e=>{e.changeMessage(a)})),l.forEach(((e,t)=>{var i,n,a,o,l;if(!e)return;const u=c[t],f=e.mid,p=r.querySelector(`.document-container[data-mid="${f}"]`)||r;if("message"!==e._)return;if(e.replies){const t=r.querySelector("replies-element");t&&(t.message=e,t.init())}const m=null!==(i=e.media)&&void 0!==i?i:{},g=m.document,v=m.poll,b=m.webpage;if(g){const t=p.querySelector(`.document-container[data-mid="${u}"] .document`);if(t){const i=(0,pe.Z)(t,"document-container");!(null===(o=null===(a=null===(n=s.media)||void 0===n?void 0:n.document)||void 0===a?void 0:a.thumbs)||void 0===o?void 0:o.length)&&(null===(l=g.thumbs)||void 0===l?void 0:l.length)&&(0,le.e9)().then((()=>ls(this,void 0,void 0,(function*(){const i=t.querySelector(".time"),s=yield(0,Vi.Z)({message:e,fontSize:d.Z.settings.messagesTextSize});t.replaceWith(s),i&&(s.querySelector(".document")||s).append(i)})))),i&&(i.dataset.mid=""+f)}const i=p.querySelector(`audio-element[data-mid="${u}"], .document[data-doc-id="${u}"], .media-round[data-mid="${u}"]`);i&&(i instanceof re.ZP||i.classList.contains("media-round")?(i.dataset.mid=""+e.mid,delete i.dataset.isOutgoing,i.message=e,i.onLoad(!0)):(i.dataset.docId=""+g.id,i.doc=g))}else if(v){const t=p.querySelector("poll-element");t&&(t.message=e,t.setAttribute("poll-id",""+v.id),t.setAttribute("message-id",""+f))}else b&&!p.querySelector(".web")&&(0,le.e9)().then((()=>{this.safeRenderMessage(e,!0,p),this.scrollToBubbleIfLast(p)}));if(h){const e=p.querySelector(`.grouped-item[data-mid="${u}"]`)||p;e&&(e.dataset.mid=""+f)}}))})))),this.listenerSetter.add(d.Z)("message_edit",(({storageKey:e,message:t})=>ls(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t.mid];i&&(yield(0,le.e9)(),this.bubbles[t.mid]===i&&this.safeRenderMessage(t,!0,i))})))),this.listenerSetter.add(d.Z)("message_error",(({storageKey:e,tempId:t})=>ls(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t];i&&(yield(0,le.e9)(),this.bubbles[t]===i&&(i.classList.remove("is-outgoing"),i.classList.add("is-error")))})))),this.listenerSetter.add(d.Z)("album_edit",(({peerId:e,messages:t,deletedMids:i})=>{if(e!==this.peerId)return;const s=t.map((({mid:e})=>e)),n=ys(s.concat(Array.from(i))),a=this.bubbles[n];if(!a)return;const o=ys(s),r=t.find((e=>e.mid===o));this.safeRenderMessage(r,!0,a)})),this.listenerSetter.add(d.Z)("messages_reactions",(e=>ls(this,void 0,void 0,(function*(){if("scheduled"===this.chat.type)return;let t;const i=e.map((({message:e,changedResults:t})=>ls(this,void 0,void 0,(function*(){if(this.peerId!==e.peerId)return;const i=yield this.getMountedBubble(e.mid,e);return i?{bubble:i.bubble,message:e,changedResults:t}:void 0}))));(yield Promise.all(i)).filter(Boolean).forEach((({bubble:e,message:i,changedResults:s})=>{t||(t=this.createScrollSaver(!1),t.save());const n=i.peerId+"_"+i.mid,a=qe.get(n);if(a)for(const e of a)e.update(i,s);else{if(!i.reactions||!i.reactions.results.length)return;this.appendReactionsElementToBubble(e,i,i,s)}})),t&&t.restore()})))),this.listenerSetter.add(d.Z)("messages_downloaded",(({peerId:e,mids:t})=>ls(this,void 0,void 0,(function*(){const i=this.getMiddleware();yield(0,le.e9)(),i()&&t.forEach((t=>{this.needUpdate;const i=[];(0,g.Z)(this.needUpdate,((s,n)=>{s.replyMid===t&&s.replyToPeerId===e&&(this.needUpdate.splice(n,1)[0],i.push(s))})),i.forEach((({mid:e,replyMid:t,replyToPeerId:i})=>ls(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(!t)return;const i=yield this.chat.getMessage(e);ne.setReply({chat:this.chat,bubble:t,message:i})}))))}))})))),(0,Ri.Z)({listenTo:this.scrollable.container,listenerSetter:this.listenerSetter,findTarget:e=>{const t=e.target;return t.closest(".attachment.media-sticker-wrapper")||(0,pe.Z)(t,"attachment")&&t.closest(".custom-emoji")}}),(0,S.fc)(this.scrollable.container,this.onBubblesClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.scrollable.container)("mousedown",(e=>{if(0!==e.button)return;const t=(0,me.Z)(e.target,"CODE");if(t){(0,ye.Z)(e),i=t,(0,st.T)(i.textContent);const s=e=>{(0,ye.Z)(e),(0,ge.bC)({langPackKey:"TextCopied",onClose:()=>{n()}})},n=(0,S.fc)(window,s,{listenerSetter:this.listenerSetter,once:!0,capture:!0})}else var i})),this.stickyIntersector=new k.Z(this.scrollable.container,((e,t)=>{for(const i in this.dateMessages){const s=this.dateMessages[i];if(s.container===t){const t=s.div;t.classList.toggle("is-sticky",e),e&&(this.previousStickyDate=t);break}}this.previousStickyDate})),T.IS_SAFARI||(this.sliceViewportDebounced=(0,Ie.Z)(this.sliceViewport.bind(this),3e3,!1,!0)),(0,le.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),i=this.getMiddleware()}),(()=>{this.isHeavyAnimationInProgress=!1,(null==i?void 0:i())&&this.lazyLoadQueue.unlockAndRefresh(),i=null}),this.listenerSetter)}constructBubbles(){const e=this.container=document.createElement("div");e.classList.add("bubbles","scrolled-down"),(this.chatInner=document.createElement("div")).classList.add("bubbles-inner"),this.setScroll(),e.append(this.scrollable.container)}attachContainerListeners(){const e=this.container;if(this.chat.contextMenu.attachTo(e),this.chat.selection.attachListeners(e,new oe.Z),ue.ZP&&this.listenerSetter.add(e)("dblclick",(e=>ls(this,void 0,void 0,(function*(){const t=(0,pe.Z)(e.target,"grouped-item")||(0,pe.Z)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",yield this.chat.getMessage(e)),this.highlightBubble(t)}})))),T.IS_MOBILE){if(c.Z){const t="is-gesturing-reply",i=64,s=.75*i;let n,a,o=!1;(0,Ae.Z)({element:e,verifyTouchTarget:e=>ls(this,void 0,void 0,(function*(){return!("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend())||(n=(0,pe.Z)(e.target,"bubble"),n&&((0,xe.Z)({element:n,className:t,forwards:!0,duration:250}),n.offsetLeft,a?(a.classList.remove("is-visible"),a.style.opacity=""):(a=document.createElement("span"),a.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),n.append(a)),!n))})),onSwipe:(e,t)=>{o=e>=s,o&&!a.classList.contains("is-visible")&&a.classList.add("is-visible"),a.style.opacity=""+Math.min(1,e/s);const r=-Math.max(0,Math.min(i,e));n.style.transform=`translateX(${r}px)`,(0,mt.s)()},onReset:()=>{const e=n;(0,xe.Z)({element:e,className:t,forwards:!1,duration:250,onTransitionEnd:()=>{a.parentElement===e&&(a.classList.remove("is-visible"),a.remove())}}),(0,ce.T2)((()=>{if(e.style.transform="",o){const{mid:t}=e.dataset;this.chat.input.initMessageReply(+t),o=!1}}))},listenerOptions:{capture:!0}})}}else this.listenerSetter.add(e)("dblclick",(e=>ls(this,void 0,void 0,(function*(){if("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend()))return;const t=e.target,i=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(i&&!i.classList.contains("bubble-first")){const e=+i.dataset.mid;if((yield this.chat.getMessage(e)).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}))))}constructPeerHelpers(){this.listenerSetter.add(d.Z)("history_append",(({storageKey:e,message:t})=>ls(this,void 0,void 0,(function*(){e===this.chat.messagesStorageKey&&"scheduled"!==this.chat.type&&(d.Z.settings.animationsEnabled&&(this.updateGradient=!0),this.scrollable.loadedAll.bottom?this.renderNewMessage(t,!0):this.chat.setMessageId())})))),this.listenerSetter.add(d.Z)("history_multiappend",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.renderNewMessage(e)})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{e===this.peerId&&"scheduled"!==this.chat.type&&this.deleteMessagesByIds(Array.from(t))})),this.listenerSetter.add(d.Z)("dialog_unread",(({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),(0,le.e9)().then((()=>{this.updateUnreadByDialog()})))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{e.has(this.peerId)&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("chat_update",(e=>ls(this,void 0,void 0,(function*(){const{peerId:t}=this;if(t!==e.toPeerId(!0))return;const i=yield this.managers.appChatsManager.getChat(e);this.chatInner.classList.contains("has-rights")!==(yield this.chat.canSend())&&(yield Promise.all([this.finishPeerChange(),this.chat.input.finishPeerChange()])).forEach((e=>e())),!!i.pFlags.forum!==this.chat.isForum&&"chat"===this.chat.type&&(this.chat.peerId=0,this.chat.appImManager.setPeer({peerId:t}))})))),this.listenerSetter.add(d.Z)("history_reload",(e=>{if(e!==this.peerId)return;const t=(0,Xe.Z)(this.bubbles,"desc").filter((e=>e>0)),i=this.getMiddleware();this.managers.appMessagesManager.reloadMessages(this.peerId,t).then((e=>{if(!i())return;const s=[];e.forEach(((e,i)=>{const n=t[i];if(e){const t=this.bubbles[e.mid];if(!t)return;this.safeRenderMessage(e,!0,t)}else s.push(n)})),this.deleteMessagesByIds(s),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.checkForTriggers()}))})),this.listenerSetter.add(d.Z)("settings_updated",(({key:e})=>ls(this,void 0,void 0,(function*(){if("settings.emoji.big"===e){const e=this.getMiddleware(),t=(0,Xe.Z)(this.bubbles,"desc").map((e=>ls(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji"))return{bubble:t,message:yield this.chat.getMessage(e)}})))),i=yield Promise.all(t);if(!e())return;i.filter(Boolean).forEach((({bubble:e,message:t})=>{this.bubbles[t.mid]===e&&this.safeRenderMessage(t,!0,e)}))}})))),this.listenerSetter.add(d.Z)("messages_views",(e=>{"scheduled"!==this.chat.type&&(0,ce.T2)((()=>{let t;for(const{peerId:i,views:s,mid:n}of e){if(this.peerId!==i)continue;const e=this.bubbles[n];if(!e)continue;const a=Array.from(e.querySelectorAll(".post-views"));if(!a.length)continue;const o=(0,F.Z)(s,1);let r=!1;a.forEach((e=>{(r||e.textContent!==o)&&(t||(t=this.createScrollSaver(!0),t.save()),r=!0,e.textContent=o)}))}null==t||t.restore()}))})),this.observer=new tt({root:this.scrollable.container}),this.sendViewCountersDebounced=(0,Ie.Z)((()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.managers.appMessagesManager.incrementMessageViews(this.peerId,e)}),1e3,!1,!0),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t,pinned:i})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&(i||this.deleteMessagesByIds(t))}));const e=()=>ls(this,void 0,void 0,(function*(){this.chat.topbar.setTitle((yield this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size)}));this.listenerSetter.add(d.Z)("scheduled_new",(t=>{"scheduled"===this.chat.type&&t.peerId===this.peerId&&(this.renderNewMessage(t),e())})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:t,mids:i})=>{"scheduled"===this.chat.type&&t===this.peerId&&(this.deleteMessagesByIds(i),e())}))}get peerId(){return this.chat.peerId}get messagesQueuePromise(){return this.batchProcessor.queuePromise}createScrollSaver(e=!0){return new Je(this.scrollable,".bubble:not(.is-date)",e)}createResizeObserver(){if(!("ResizeObserver"in window)||this.resizeObserver)return;const e=this.scrollable.container;let t=0,i=!1,s=!1,n=0,a=0,o=0;const r=()=>{const r=e.offsetHeight,d=this.scrollable.isScrolledDown;r===t||s&&d||(a+=t-r),a&&this.scrollable.setScrollTopSilently(this.scrollable.scrollTop+Math.round(a)),t=r,n=0,o=0,a=0,i=!1,s=!1},d=e=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(e?r:()=>{o=window.requestAnimationFrame(r)})};(this.resizeObserver=new ResizeObserver((e=>{if(s)return void d(!1);const o=e[0].contentRect.height;if(!t)return void(t=o);const r=t-o;let l=r+a;const c=l%1;if(l-=c,!i&&(i=!0,r<0&&this.scrollable.isScrolledDown))return a=-r,s=!0,void d(!1);if(n+=l,l){const e=this.scrollable.scrollTop+l;this.scrollable.setScrollTopSilently(e)}d(!1),a=c,t=o}))).observe(e)}destroyResizeObserver(){const e=this.resizeObserver;e&&(e.disconnect(),this.resizeObserver=void 0)}setReactionsHoverListeners(){this.listenerSetter.add(gt.Z)("toggle",this.unhoverPrevious),this.listenerSetter.add(pt.Z)("change",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.container)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){e.parentElement&&e.parentElement.classList.toggle("hover-reaction-visible",t),(0,xe.Z)({element:e,className:"is-visible",forwards:t,duration:200,onTransitionEnd:t?void 0:()=>{e.remove()},useRafs: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=ft.Z.getFocusPromise().then((()=>ls(this,void 0,void 0,(function*(){if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map((e=>+e)));t>=e&&(t=Math.max((yield this.chat.getHistoryMaxId())||0,t))}this.unreaded.forEach(((e,i)=>{e<=t&&this.onUnreadedInViewport(i,e)}));const i=[];for(const e of this.unreadedSeen)lt(yield this.chat.getMessage(e))&&i.push(e);return this.managers.appMessagesManager.readMessages(this.peerId,i),this.unreadedSeen.clear(),ue.ZP&&this.log("will readHistory by maxId:",t),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch((e=>{this.log.error("readHistory err:",e),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)})).finally((()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())}))}))))}onGoDownClick(){return ls(this,void 0,void 0,(function*(){if(!this.followStack.length)return void this.chat.setMessageId();const e=this.getMiddleware(),t=this.followStack.slice(),i=yield Promise.all(t.map((e=>this.chat.getMessage(e))));if(!e())return;t.forEach(((e,t)=>{const s=i[t],n=this.bubbles[e];let a=!0;if(n){const e=n.getBoundingClientRect();a=Ze.Z.height/2>e.top}else s&&(a=!1);a&&this.followStack.splice(this.followStack.indexOf(e),1)})),this.followStack.sort(((e,t)=>t-e));const s=this.followStack.pop();this.chat.setMessageId(s)}))}getBubbleByPoint(e){let t=ve(this.scrollable.container,e,"center");return t&&(t=(0,pe.Z)(t,"bubble")),t}getGroupedBubble(e){return ls(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getMidsByAlbum(e);for(const e of t)if(this.bubbles[e]&&!this.skippedMids.has(e))return{bubble:this.bubbles[e],mid:e}}))}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t){return ls(this,void 0,void 0,(function*(){if(void 0===t&&(t=yield this.chat.getMessage(e)),!t)return;const i=t.grouped_id;if(i){const t=yield this.getGroupedBubble(i);if(t)return t.bubble=t.bubble.querySelector(`.document-container[data-mid="${e}"]`)||t.bubble,t}const s=this.bubbles[e];return s?{bubble:s,mid:e}:void 0}))}findNextMountedBubbleByMsgId(e,t){const i=(0,Xe.Z)(this.bubbles,t?"desc":"asc");let s;s=t?t=>te{var t;return!!s(e)&&!!(null===(t=this.bubbles[e])||void 0===t?void 0:t.parentElement)}));return this.bubbles[n]}loadMoreHistory(e,t=!1){if(!this.peerId||this.chat.setPeerPromise||this.isHeavyAnimationInProgress||e&&(this.getHistoryTopPromise||this.scrollable.loadedAll.top)||!e&&(this.getHistoryBottomPromise||this.scrollable.loadedAll.bottom))return;const i=Object.keys(this.bubbles).map((e=>+e)).filter((e=>e>0&&!this.skippedMids.has(e))).sort(((e,t)=>e-t));i.length||i.push(0),e?(ue.ZP&&this.log("Will load more (up) history by id:",i[0],"maxId:",i[i.length-1],t),this.getHistory1(i[0],!0,void 0,void 0,t)):(ue.ZP&&this.log("Will load more (down) history by id:",i[i.length-1],t),this.getHistory1(i[i.length-1],!1,!0,void 0,t))}setScroll(){this.scrollable&&this.destroyScrollable(),this.scrollable=new Z.ZP(null,"IM",300),this.setLoaded("top",!1,!1),this.setLoaded("bottom",!1,!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),c.Z}updateUnreadByDialog(){return ls(this,void 0,void 0,(function*(){const e=yield this.chat.getHistoryStorage(),t=this.peerId===d.Z.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(this.unreadOut.delete(e),t.classList.contains("is-outgoing")||t.classList.contains("is-error"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}}}))}destroyBubble(e,t=+e.dataset.mid){e.middlewareHelper.destroy(),this.bubbles[t]===e&&delete this.bubbles[t],this.skippedMids.delete(t),this.firstUnreadBubble===e&&(this.firstUnreadBubble=null),this.bubbleGroups.removeAndUnmountBubble(e),this.observer&&(this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.observer.unobserve(e,this.viewsObserverCallback),this.viewsMids.delete(t),this.observer.unobserve(e,this.stickerEffectObserverCallback))}deleteMessagesByIds(e,t=!0,i){let n=!1;e.forEach((e=>{const t=this.bubbles[e];t&&(this.destroyBubble(t,e),n=!0)})),n&&(this.scrollable.ignoreNextScrollEvent(),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),s.Z.checkAnimations(!1,this.chat.animationGroup),this.deleteEmptyDateGroups(),i||this.scrollable.onScroll())}pollExtendedMediaMessages(){const e=Array.from(this.extendedMediaMessages);return this.managers.appMessagesManager.getExtendedMedia(this.peerId,e)}setExtendedMediaMessagesPollInterval(){!this.pollExtendedMediaMessagesPromise&&this.extendedMediaMessages.size&&(this.pollExtendedMediaMessagesPromise=(0,Ye.Z)(3e4).then((()=>this.pollExtendedMediaMessages())).then((()=>this.setExtendedMediaMessagesPollInterval())))}setTopPadding(e=this.getMiddleware()){let t,i=!1;if(!this.isTopPaddingSet&&"scheduled"!==this.chat.type){const{clientHeight:e,scrollHeight:s}=this.scrollable.container;i=e===s,i&&(t=this.chatInner,t.style.paddingTop=e+"px",this.scrollable.setScrollTopSilently(s),this.isTopPaddingSet=!0)}return{isPaddingNeeded:i,unsetPadding:i?()=>{e()&&i&&(t.style.paddingTop="",this.isTopPaddingSet=!1)}:void 0}}renderNewMessage(e,t){const i=this._renderNewMessage(e,t);return this.renderNewPromises.add(i),i.catch(We.Z).finally((()=>{this.renderNewPromises.delete(i)})),i}_renderNewMessage(e,t){return ls(this,void 0,void 0,(function*(){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const i=this.getMiddleware();t.then((()=>ls(this,void 0,void 0,(function*(){if(!i())return;const t=yield this.chat.getMessage(e.mid);i()&&this.renderNewMessage(t)}))))}return}if(this.chat.threadId&&(0,v.Z)(e,this.chat.isForum)!==this.chat.threadId)return;if(this.bubbles[e.mid])return;t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const i=this.getMiddleware(),{isPaddingNeeded:s,unsetPadding:n}=this.setTopPadding(i),a=this.performHistoryResult({history:[e]},!1);return t&&a.then((()=>{if(!i())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[e.mid]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();s&&a.then(n)})),a}))}getLastBubble(){var e;const t=this.bubbleGroups.getLastGroup();return null===(e=null==t?void 0:t.lastItem)||void 0===e?void 0:e.bubble}scrollToBubble(e,t,i,s){const n=(0,pe.Z)(e,"bubble");let a;if(e.parentElement||this.log.error("element is not connected",n),n&&"end"!==t){const e=this.bubbleGroups.getItemByBubble(n);e&&e.group.firstItem===e&&(0,Ce.Z)(e.group.container)===(this.stickyIntersector?ms:1)&&(a=e.group.container.parentElement)}const r=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper"),d=this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:i,forceDuration:s,axis:"y",getNormalSize:r?({rect:e})=>{let t=Ze.Z.height;return t-=this.container.offsetTop,t-=o.Z.isMobile||Ze.Z.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{if(this.onScroll(!0,e),this.updateGradient){const{gradientRenderer:t}=this.chat;null==t||t.toNextPosition(e.getProgress),this.updateGradient=void 0}}});return i===de.f.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),d}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return ls(this,void 0,void 0,(function*(){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();if(yield this.scrollToBubble(e,"end",void 0,void 0),!t())return;this.scrollingToBubble=void 0}}))}scrollToBubbleIfLast(e){return ls(this,void 0,void 0,(function*(){if(this.getLastBubble()===e)return this.scrollToEnd()}))}highlightBubble(e){const t="highlightTimeout";e.dataset[t]&&(clearTimeout(+e.dataset[t]),e.classList.remove("is-highlighted"),e.offsetWidth),e.classList.add("is-highlighted"),e.dataset[t]=""+setTimeout((()=>{e.classList.remove("is-highlighted"),delete e.dataset[t]}),2e3)}createDateBubble(e,t=new Date(1e3*e)){let i;const s=new Date;s.setHours(0,0,0,0);const n="scheduled"===this.chat.type;if(s.getTime()===t.getTime())i=(0,C.ag)(n?"Chat.Date.ScheduledForToday":"Date.Today");else if(n&&e===Me)i=(0,C.ag)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};t.getFullYear()!==s.getFullYear()&&(e.year="numeric"),i=new C.ZP.IntlDateElement({date:t,options:e}).element,n&&(i=(0,C.ag)("Chat.Date.ScheduledFor",[i]))}const a=document.createElement("div");a.className="bubble service is-date";const o=document.createElement("div");o.classList.add("bubble-content");const r=document.createElement("div");return r.classList.add("service-msg"),r.append(i),o.append(r),a.append(o),a}getDateForDateContainer(e){const t=new Date(1e3*e);return t.setHours(0,0,0),{date:t,dateTimestamp:t.getTime()}}getDateContainerByTimestamp(e){var t;const{date:i,dateTimestamp:s}=this.getDateForDateContainer(e);let n=this.dateMessages[s];if(n)return n;const a=this.createDateBubble(e,i),o=this.createDateBubble(e,i);o.classList.add("is-fake");const r=document.createElement("section");r.className="bubbles-date-group",r.append(a,o),n=this.dateMessages[s]={div:a,container:r,firstTimestamp:i.getTime()};const d=(0,Xe.Z)(this.dateMessages,"asc"),l=d.length;let c,h=0;for(;hthis.setPeerTempId===d,u=(0,vt.Z)(h,gs);i||(yield u(this.chat.onChangePeer(e,u)));const f=this.chat.type;("scheduled"===f||this.chat.isRestricted)&&(o=0);const p=yield u(this.chat.getHistoryStorage()),g="pinned"===f?yield u(this.managers.appMessagesManager.getPinnedMessagesMaxId(n,this.chat.threadId)):null!==(t=p.maxId)&&void 0!==t?t:0,v=void 0!==o;let b,y,w,S=0;if(!v)if(i||(y=this.chat.appImManager.getChatSavedPosition(this.chat)),y);else if(g){S=yield u(this.managers.appMessagesManager.getReadMaxIdIfUnread(n,this.chat.threadId));const e=yield u(this.chat.getDialogOrTopic());if(!S||i||e&&1===e.unread_count)o=g;else{const e=p.history.findSliceOffset(S);e&&e.slice.isEnd(fe.D.Bottom)&&(w=e.slice[e.offset-25]||e.slice[0]||S),b=!v,o=S}}const C=o!==g;if(void 0===r&&(yield u(this.chat.isStartButtonNeeded()))&&(r=m.gZ),i){a&&o&&this.followStack.push(a);const e=yield u(this.getMountedBubble(o));if(e)return v?(this.scrollToBubble(e.bubble,"center"),this.highlightBubble(e.bubble),this.chat.dispatchEvent("setPeer",o,!1)):g&&!C&&(this.scrollToEnd(),this.chat.dispatchEvent("setPeer",o,!0)),void 0!==r&&this.chat.input.setStartParam(r),null}else this.peerId&&(this.lazyLoadQueue.queueId=++ps,this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)),this.followStack.length=0,this.passEntities={messageEntityBotCommand:(yield u(this.managers.appPeersManager.isAnyGroup(n)))||this.chat.isBot};ue.ZP&&c("setPeer peerId:",n,p,o,g);const E=null!=w?w:C||"scheduled"===f||this.chat.isRestricted?0:g;let L=0;if(i){const e=this.getBubbleByPoint("bottom");e&&(L=+e.dataset.mid),L<=0&&(L=Math.max(...Object.keys(this.bubbles).map((e=>+e))))}else this.isFirstLoad=!0,this.destroyResizeObserver();const I=this.chatInner,M=this.emptyPlaceholderBubble;this.cleanup();const P=this.chatInner=document.createElement("div");i?(P.className=I.className,P.classList.remove("disable-hover","is-scrolling")):P.classList.add("bubbles-inner"),this.lazyLoadQueue.lock();const Z=i||g&&C||v,k=L>0&&(!o||Lthis.performHistoryResult({history:y.mids},!0))),cached:!0,waitPromise:Promise.resolve()}:yield u(this.getHistory1(o,!0,C,E)),this.setPeerCached=A.cached,c.warn("got history");const{promise:_,cached:F}=A;F||i||(yield u(this.chat.finishPeerChange(v,C,o,r)),this.scrollable.container.textContent="",this.preloader.attach(this.container)),s.Z.lockGroup(this.chat.animationGroup);const D=u(_).then((()=>ls(this,void 0,void 0,(function*(){var e;c.warn("promise fulfilled");const t=Z?yield u(o?this.getMountedBubble(o):{bubble:this.getLastBubble()}):void 0;F&&!i&&(c.warn("finishing peer change"),yield u(this.chat.finishPeerChange(v,C,o,r)),c.warn("finished peer change")),this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),this.setPeerCached=void 0;const a=this.scrollable;if(a.lastScrollDirection=0,a.lastScrollPosition=0,(0,U.Z)(a.container,P),M&&this.cleanupPlaceholders(M),this.attachPlaceholderOnRender&&this.attachPlaceholderOnRender(),!v&&this.chat.isPinnedMessagesNeeded()&&(null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0)),this.container.classList.toggle("has-groups",!!Object.keys(this.dateMessages).length),c.warn("mounted chat",this.chatInner===P,this.chatInner.parentElement,performance.now()-l),s.Z.unlockGroup(this.chat.animationGroup),s.Z.checkAnimations(!1,this.chat.animationGroup),this.lazyLoadQueue.unlock(),y)a.setScrollTopSilently(y.top);else if(Z){let e;if(T)a.setScrollTopSilently(99999);else if(x){const t=this.setTopPadding();t.isPaddingNeeded&&(e=t.unsetPadding),a.setScrollTopSilently(0)}let s,n=b&&this.firstUnreadBubble||(null==t?void 0:t.bubble);if((null==n?void 0:n.parentElement)||(n=this.findNextMountedBubbleByMsgId(o,!1)||this.findNextMountedBubbleByMsgId(o,!0)),n){const e=this.getLastBubble(),t=b?"start":C||v||e!==n?"center":"end";s="end"===t&&e===n&&i?this.scrollToEnd():this.scrollToBubble(n,t,i?void 0:de.f.Static),!b&&v&&this.highlightBubble(n)}e&&(s||Promise.resolve()).then((()=>{e()}))}else a.setScrollTopSilently(99999);this.onRenderScrollSet(),this.onScroll();const d=Promise.all([D,(0,le.e9)()]);if(d.then((()=>{a.checkForTriggers()})),this.chat.dispatchEvent("setPeer",o,!C),Promise.all([this.setFetchReactionsInterval(d),this.setFetchHistoryInterval({afterSetPromise:d,lastMsgId:o,samePeer:i,savedPosition:y,topMessage:g})]).then((()=>{c("scrolledAllDown:",a.loadedAll.bottom),a.loadedAll.bottom&&g&&!this.unreaded.size&&this.onScrolledAllDown()})),"chat"===f&&!this.chat.isForumTopic){const e=yield u(this.managers.appMessagesManager.getDialogOnly(n));(null==e?void 0:e.pFlags.unread_mark)&&this.managers.appMessagesManager.markDialogUnread(n,!0)}})))).catch((e=>{throw c.error("setPeer promise error:",e),h()||this.preloader.detach(),e}));return{cached:F,promise:D}}))}setFetchReactionsInterval(e){return ls(this,void 0,void 0,(function*(){const t=this.getMiddleware();if(this.chat.isChannel){const i=()=>ls(this,void 0,void 0,(function*(){if(!t())return;const e=[];for(const t in this.bubbles){let i=yield this.chat.getMessage(+t);"message"===(null==i?void 0:i._)&&(i=yield this.managers.appMessagesManager.getGroupsFirstMessage(i),e.push(i.mid))}(e.length?this.managers.appReactionsManager.getMessagesReactions(this.peerId,e):Promise.resolve()).then((()=>{setTimeout(i,1e4)}))}));Promise.all([e,(0,le.e9)(),(0,Ye.Z)(500)]).then((()=>{i()}))}}))}setFetchHistoryInterval({lastMsgId:e,topMessage:t,afterSetPromise:i,savedPosition:s,samePeer:n}){return ls(this,void 0,void 0,(function*(){const e=this.getMiddleware(),t=this.peerId,n=yield this.managers.appMessagesManager.isFetchIntervalNeeded(t);if(!s&&!n)return;if(yield i,!e())return;const a=t.toChatId();e.onClean((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(a)})),this.managers.apiUpdatesManager.subscribeToChannelUpdates(a)}))}onScrolledAllDown(){return ls(this,void 0,void 0,(function*(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=yield this.chat.getHistoryMaxId();this.managers.appMessagesManager.readHistory(this.peerId,e,this.chat.threadId,!0)}}))}finishPeerChange(){return ls(this,void 0,void 0,(function*(){const[e,t,i]=yield Promise.all([this.chat.isChannel,this.chat.canSend(),this.chat.isAnyGroup]);return()=>{this.chatInner.classList.toggle("has-rights",t),this.container.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",i),this.chatInner.classList.toggle("is-channel",e),this.createResizeObserver()}}))}renderMessagesQueue(e){return this.batchProcessor.addToQueue(e)}ejectBubbles(){for(const e of this.bubblesToEject)e.remove();this.bubblesToEject.clear()}groupBubbles(e){let t;"scheduled"===this.chat.type&&(t=new Set,e.forEach((({bubble:e,message:i})=>{const s=this.bubbleGroups.getItemByBubble(e),n=null==s?void 0:s.group;n&&s.message.date!==i.date&&(this.bubbleGroups.removeItem(s),t.add(n))}))),e.forEach((({bubble:e,message:t})=>{this.bubbleGroups.prepareForGrouping(e,t)}));const i=this.bubbleGroups.groupUngrouped(),s=Array.from(i).map((e=>{if(e.avatar)return;const t=e.firstItem;return t&&this.chat.isAvatarNeeded(t.message)?e.createAvatar(t.message):void 0})).filter(Boolean);if(t)for(const e of t)i.add(e);return{groups:[...i],avatarPromises:s}}getMiddleware(e){return this.middlewareHelper.get(e)}wrapMediaSpoiler({media:e,promise:t,middleware:i,attachmentDiv:s}){return ls(this,void 0,void 0,(function*(){if(yield t,!i())return;const{width:n,height:a}=s.style,o=yield ji({media:e,width:parseInt(n),height:parseInt(a),middleware:i,animationGroup:this.chat.animationGroup});i()&&s.append(o)}))}safeRenderMessage(e,t,i,s=!0,n){return ls(this,void 0,void 0,(function*(){if(!e||this.renderingMessages.has(e.mid)||this.bubbles[e.mid]&&!i)return;const a=this.getMiddleware().create(),o=a.get();let r;try{this.renderingMessages.add(e.mid);const d=document.createElement("div");d.middlewareHelper=a,d.dataset.mid=""+e.mid,d.dataset.peerId=""+e.peerId,d.dataset.timestamp=""+e.date,i&&(i.middlewareHelper.destroy(),this.skippedMids.delete(e.mid),this.bubblesToEject.add(i),this.bubblesToReplace.delete(i),this.bubblesToReplace.set(d,i),this.bubbleGroups.changeBubbleByBubble(i,d)),i=this.bubbles[e.mid]=d;let l=this.renderMessage(e,t,i,o);n&&(l=n(l,i));const c=l.then((e=>e&&o()?Object.assign(Object.assign({},e),{updatePosition:s}):void 0));if(this.renderMessagesQueue(c.catch((()=>{}))),r=yield c,!o())return;r||this.skippedMids.add(+e.mid)}catch(e){this.log.error("renderMessage error:",e)}return o()?(this.renderingMessages.delete(e.mid),r):void 0}))}renderMessage(e,t=!1,i,s){var n,a,r;return ls(this,void 0,void 0,(function*(){const l="message"===e._,c=l&&e.grouped_id;let h,u;const f=c?yield this.managers.appMessagesManager.getMessagesByAlbum(c):void 0,g="pinned"!==this.chat.type;if(c&&g){h=f.map((e=>e.mid));const t=ys(h);if(e.mid!==t)return}l&&(u=c?f[0]:e);const b=this.chat.isOurMessage(e),y=document.createElement("div");y.classList.add("message","spoilers-container");const w=document.createElement("div");w.classList.add("bubble-content-wrapper");const E=document.createElement("div");E.classList.add("bubble-content"),i.classList.add("bubble"),w.append(E),i.append(w);let L=!b&&!e.pFlags.out&&(e.pFlags.unread||lt(e));if(!L&&this.chat.peerId.isAnyChat()){const t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId,this.chat.threadId);void 0!==t&&t"messageEntityEmoji"===e._)),t=k.replace(/\s/g,"").length;if(e.reduce(((e,t)=>e+t.length),0)===t){U=Math.min(bs,e.length),N=o.Z.active.customEmoji;const t=vs[U];t&&(N=(0,Ke.C)(t,t),i.style.setProperty("--emoji-size",t+"px"))}}null!=N||(N=this.chat.appImManager.customEmojiSize);const H=(0,rt.ZP)(k,{entities:A,passEntities:this.passEntities,loadPromises:M,lazyLoadQueue:this.lazyLoadQueue,customEmojiSize:N,middleware:s,animationGroup:this.chat.animationGroup});let z,j=!0,G=!1;if(U){if(d.Z.settings.emoji.big){const e=1===U&&!A.find((e=>"messageEntityCustomEmoji"===e._))&&(yield this.managers.appStickersManager.getAnimatedEmojiSticker(k));1===U&&!F&&e?F={_:"messageMediaDocument",document:e}:(z=document.createElement("div"),z.classList.add("attachment","spoilers-container"),(0,_.Z)(z,H),E.append(z)),i.classList.add("is-message-empty","emoji-big"),G=!0,j=!1,D=!1}i.classList.add("can-have-big-emoji")}D&&(0,_.Z)(y,H);const $=(q=k,as.test(q));var q;const Q=ne.setTime({chatType:this.chat.type,message:e,reactionsMessage:u});let Y;if(y.append(Q),E.prepend(y),$&&Q.classList.add("is-block"),l&&this.chat.isAllMessagesForum){const t=yield(0,ds.Z)({peerId:this.peerId,threadId:(0,v.Z)(e,this.chat.isForum),lastMsgId:e.mid,wrapOptions:{middleware:s},withIcons:!0}),{element:i}=t;Y=document.createElement("div"),Y.classList.add("topic-name-button-container"),Y.append(i)}if(l&&e.views){if(i.classList.add("channel-post"),!(null===(n=e.fwd_from)||void 0===n?void 0:n.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),E.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.observer&&this.observer.observe(i,this.viewsObserverCallback)}const J=l&&e.reply_markup;let X="replyInlineMarkup"===(null==J?void 0:J._)&&J.rows;if(X&&(X=X.filter((e=>e.buttons.length))),X){const t=document.createElement("div");t.classList.add("reply-markup"),X.forEach((i=>{const s=i.buttons,n=document.createElement("div");n.classList.add("reply-markup-row"),s.forEach((t=>{let i,s=(0,rt.ZP)(t.text,{noLinks:!0,noLinebreaks:!0});switch(t._){case"keyboardButtonUrl":{const e=(0,rt.ZP)(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=(0,we.Z)(e).firstElementChild,i.classList.add("is-link");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline"),(0,S.fc)(i,(i=>{(0,ye.Z)(i);const s=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.managers.appInlineBotsManager.checkSwitchReturn(s).then((e=>e||new Promise(((e,t)=>{const i=new I.Z({[this.peerId]:[]},(t=>{e(t)}),!0);i.addEventListener("close",(()=>{t()}))})))),n.then((e=>{const i=this.peerId===e?this.chat.threadId:void 0;this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchInlineQuery(e,i,s,t.query)}))}));break;case"keyboardButtonBuy":{const e="messageMediaInvoice"===F._?F:void 0;if(null==e?void 0:e.extended_media)break;i=document.createElement("button"),i.classList.add("is-buy"),(null==e?void 0:e.receipt_msg_id)&&(s=(0,C.ag)("Message.ReplyActionButtonShowReceipt"));break}default:i=document.createElement("button")}if(!i)return;i.classList.add("reply-markup-button","rp","tgico");const a=document.createElement("span");a.classList.add("reply-markup-button-text"),"string"==typeof s?a.insertAdjacentHTML("beforeend",s):a.append(s),(0,x.Z)(i),i.append(a),n.append(i)})),n.childElementCount&&t.append(n)}));const s=!!t.childElementCount;s&&(0,S.fc)(t,(t=>{let i=t.target;if(i.classList.contains("reply-markup-button")||(i=(0,pe.Z)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline")||i.classList.contains("is-buy"))return;(0,ye.Z)(t);const s=(0,Ce.Z)(i),n=X[(0,Ce.Z)(i.parentElement)];if(!n.buttons||!n.buttons[s])return void this.log.warn("no such button",n,s,e);const a=n.buttons[s];this.managers.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,a).then((e=>{"string"==typeof e.message&&e.message.length&&(0,ge.Am)((0,rt.ZP)(e.message,{noLinks:!0,noLinebreaks:!0}))}))})),s&&(i.classList.add("with-reply-markup"),w.append(t))}const ee=e.pFlags.is_outgoing;if(b){(e.pFlags.unread||ee)&&this.unreadOut.add(e.mid);let t="";t=e.error?"is-error":ee?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}ee&&!e.error&&i.classList.add("is-outgoing");const te=l&&(yield this.managers.appMessagesManager.getMessageWithCommentReplies(e)),ie=!!te&&e.mid>0;ie&&i.classList.add("with-replies");const se=l&&e.fwd_from,ae=l&&e.fwdFromId,oe=this.chat.isOutMessage(e);let re=E;const de=!(e.viaBotId||e.fromId!==d.Z.myId&&e.pFlags.out),le=!k;let ce;if(F){z=document.createElement("div"),z.classList.add("attachment"),le&&i.classList.add("is-message-empty");let t=!1;switch(F._){case"messageMediaPhoto":{const t=F.photo;if(le&&(j=!1),de&&i.classList.add("hide-name"),i.classList.add("photo"),g&&c&&1!==h.length){i.classList.add("is-album","is-grouped"),Gi({messages:f,attachmentDiv:z,middleware:this.getMiddleware(),isOut:b,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:M,autoDownload:this.chat.autoDownload});break}const n=!T.IS_ANDROID&&j&&!ie&&!1;n&&i.classList.add("with-media-tail");const a=(0,V.Z)({photo:t,message:e,container:z,withTail:n,isOut:oe,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:M,autoDownloadSize:this.chat.autoDownload.photo});F.pFlags.spoiler&&M.push(this.wrapMediaSpoiler({media:t,promise:a,middleware:s,attachmentDiv:z}));break}case"messageMediaWebPage":{t=!0;const s=F.webpage;if("webPage"!==s._)break;const n=(0,rs.Z)(s.url);if("im"===(null==n?void 0:n.onclick)){const e={telegram_channel:"Chat.Message.ViewChannel",telegram_megagroup:"OpenGroup"}[s.type]||"OpenMessage";ce=this.makeViewButton({text:e,asLink:!0}),ce.href=n.url,ce.setAttribute("onclick",`${n.onclick}(this)`)}i.classList.add("webpage");const a=document.createElement("div");a.classList.add("web");const r=document.createElement("div");let l,c;r.classList.add("quote");const h=s.photo;(h||s.document)&&(l=document.createElement("div"),l.classList.add("preview-resizer"),c=document.createElement("div"),c.classList.add("preview"),l.append(c));const u=document.createElement("div");u.classList.add("quote-text");const f=s.document;if(f)if("gif"===f.type||"video"===f.type||"round"===f.type){const t="round"===f.type?o.Z.active.round:o.Z.active.webpage;"round"===f.type?(i.classList.add("round"),c.classList.add("is-round")):i.classList.add("video"),(0,W.Z)({doc:f,container:c,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:oe,group:this.chat.animationGroup,loadPromises:M,autoDownload:this.chat.autoDownload,noInfo:e.mid<0})}else{const t=yield(0,Vi.Z)({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:M,sizeType:"documentName",searchContext:{useSearch:!1,peerId:this.peerId,inputFilter:{_:"inputMessagesFilterEmpty"}},fontSize:d.Z.settings.messagesTextSize});c.append(t),c.classList.add("preview-with-document"),u.classList.add("has-document")}let p;if(l&&u.append(l),s.site_name){const e=(0,rt.ZP)(s.url),t=(0,we.Z)(e).firstElementChild;t.classList.add("webpage-name");const i=document.createElement("strong");(0,_.Z)(i,(0,R.Z)(s.site_name)),t.textContent="",t.append(i),u.append(t),p=t}const m=(0,ot.Z)(s);if(m.textContent){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("strong");(0,_.Z)(t,m),e.append(t),u.append(e),p=e}const g=(0,at.Z)(s);if(g.textContent){const e=document.createElement("div");e.classList.add("text"),(0,_.Z)(e,g),u.append(e),p=e}if(r.append(u),h&&!f){i.classList.add("photo");const t=h.sizes[h.sizes.length-1];let s=!1;t.w===t.h&&p?(i.classList.add("is-square-photo"),s=!0,(0,nt.Z)(h,c,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),(0,V.Z)({photo:h,message:e,container:c,boxWidth:s?0:o.Z.active.webpage.width,boxHeight:s?0:o.Z.active.webpage.height,isOut:oe,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:M,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}a.append(r),y.insertBefore(a,Q);break}case"messageMediaDocument":{const n=F.document;if(n.sticker){i.classList.add("sticker"),j=!1,G=!0,n.animated&&i.classList.add("sticker-animated");const e=o.Z.active,t=i.classList.contains("emoji-big"),r=t?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;(0,nt.Z)(n,z,r.width,r.height),E.style.minWidth=z.style.width,E.style.minHeight=z.style.height,(0,K.ZP)({doc:n,div:z,middleware:s,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,emoji:t?k:void 0,withThumb:!0,loadPromises:M,isOut:oe,noPremium:null===(a=null==F?void 0:F.pFlags)||void 0===a?void 0:a.nopremium}),((0,Di.Z)(n)||t)&&(L||ee)&&this.observer.observe(i,this.stickerEffectObserverCallback)}else if("video"===n.type||"gif"===n.type||"round"===n.type){const t="round"===n.type;if(t&&(G=!0),(t||le)&&(j=!1),de&&i.classList.add("hide-name"),i.classList.add(t?"round":"video"),g&&c&&1!==h.length)i.classList.add("is-album","is-grouped"),Gi({messages:f,attachmentDiv:z,middleware:s,isOut:b,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:M,autoDownload:this.chat.autoDownload});else{const a=!T.IS_ANDROID&&!T.IS_APPLE&&!t&&j&&!ie&&!1;a&&i.classList.add("with-media-tail");const r=(0,W.Z)({doc:n,container:z,message:e,boxWidth:o.Z.active.regular.width,boxHeight:o.Z.active.regular.height,withTail:a,isOut:oe,lazyLoadQueue:this.lazyLoadQueue,middleware:s,group:this.chat.animationGroup,loadPromises:M,autoDownload:this.chat.autoDownload,searchContext:t?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,noInfo:e.mid<0,noAutoplayAttribute:!!F.pFlags.spoiler});F.pFlags.spoiler&&M.push(this.wrapMediaSpoiler({media:n,promise:r,middleware:s,attachmentDiv:z}))}}else{const s=yield function({albumMustBeRenderedFull:e,message:t,bubble:i,messageDiv:s,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,useSearch:l,sizeType:c,managers:h,fontWeight:u,fontSize:f,richTextFragment:p}){return Ki(this,void 0,void 0,(function*(){let l;const m=e?yield n.getMidsByMid(t.mid):[t.mid],g=m.map(((e,t)=>Ki(this,void 0,void 0,(function*(){const i=yield n.getMessage(e),s=yield(0,Vi.Z)({message:i,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,sizeType:c,managers:h,fontWeight:u,fontSize:f}),g=document.createElement("div");g.classList.add("document-container"),g.dataset.mid=""+e,g.dataset.peerId=""+i.peerId;const v=document.createElement("div");if(v.classList.add("document-wrapper"),i.message){const e=document.createElement("div");e.classList.add("document-message"),(0,_.Z)(e,p),v.append(e)}if(m.length>1){const e=document.createElement("div");e.classList.add("document-selection"),g.append(e),g.classList.add("grouped-item"),0===t&&(l=v)}return v.append(s),g.append(v),g})))),v=yield Promise.all(g);return s.append(...v),m.length>1&&i.classList.add("is-multiple-documents","is-grouped"),l}))}({albumMustBeRenderedFull:g,message:e,bubble:i,messageDiv:y,chat:this.chat,loadPromises:M,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",fontSize:d.Z.settings.messagesTextSize,richTextFragment:H});s&&(re=s);const a=y.lastElementChild.querySelector(".document-message, .document, .audio");a&&a.append(Q),i.classList.remove("is-message-empty"),y.classList.add((["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message"),t=!0}break}case"messageMediaCall":{const e=F.action,s=document.createElement("div");s.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const n=e.pFlags.video?"video":"voice";s.dataset.type=n;const a=document.createElement("div");a.classList.add("bubble-call-title"),(0,C.$d)(a,oe?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((0,De.Z)(e.duration));else{let t;switch(e.reason._){case"phoneCallDiscardReasonBusy":t="Call.StatusBusy";break;case"phoneCallDiscardReasonMissed":t="Chat.Service.Call.Missed";break;default:t="Chat.Service.Call.Cancelled"}o.classList.add("is-reason"),(0,C.$d)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),s.append(a,o),t=!0,i.classList.remove("is-message-empty"),y.classList.add("call-message"),y.append(s);break}case"messageMediaContact":{const e=F,s=document.createElement("div");s.classList.add("contact"),s.dataset.peerId=""+e.user_id,t=!0;const n=document.createElement("div");n.className="contact-details";const a=document.createElement("div");a.className="contact-name",a.append((0,R.Z)([e.first_name,e.last_name].filter(Boolean).join(" ")));const o=document.createElement("div");o.className="contact-number",o.textContent=e.phone_number?"+"+(0,ke.u)(e.phone_number).formatted:"Unknown phone number",s.append(n),n.append(a,o);const r=new p.Z;r.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId()}),r.classList.add("contact-avatar","avatar-54"),s.prepend(r),i.classList.remove("is-message-empty"),y.classList.add("contact-message"),y.append(s);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e,t=d.Z.managers){const i=new ns;return i.message=e,i.managers=t,i.setAttribute("peer-id",""+e.peerId),i.setAttribute("poll-id",e.media.poll.id),i.setAttribute("message-id",""+e.mid),i.render(),i}(e);y.prepend(t),y.classList.add("poll-message");break}case"messageMediaInvoice":{const t=F.pFlags.test,n=F.extended_media,a="messageExtendedMedia"===(null==n?void 0:n._),r="messageExtendedMediaPreview"===(null==n?void 0:n._);let d=a?n.media.photo||n.media.document:F.photo;const l=(0,wt.Z)(F.total_amount,F.currency);let c,h;if(n){if(r&&(c=document.createElement("span"),c.classList.add("extended-media-buy","tgico-premium_lock"),z.classList.add("is-buy"),(0,C.$d)(c,"Checkout.PayPrice",[l]),void 0!==n.video_duration)){const e=document.createElement("span");e.classList.add("video-time"),e.textContent=(0,Qi.Z)(n.video_duration,!1),z.append(e)}}else{c=document.createElement(d?"span":"div");const e=document.createDocumentFragment(),i=(0,C.ag)(F.receipt_msg_id?"PaymentReceipt":t?"PaymentTestInvoice":"PaymentInvoice");i.classList.add("text-uppercase");const s=" ‎",n=document.createElement("span");if(n.classList.add("text-bold"),n.textContent=l+s,e.append(n,i),t&&F.receipt_msg_id){const t=document.createElement("span");t.classList.add("text-uppercase","pre-wrap"),t.append(s+"(Test)"),e.append(t)}(0,_.Z)(c,e)}if(r&&(n.thumb.w=n.w,n.thumb.h=n.h,d={_:"photo",access_hash:"",pFlags:{},date:0,dc_id:0,file_reference:[],id:0,sizes:[n.thumb]}),d){const t=n?o.Z.active.extendedInvoice:o.Z.active.invoice;"document"===d._?((0,W.Z)({doc:d,container:z,withTail:!1,isOut:oe,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:M,boxWidth:t.width,boxHeight:t.height,group:this.chat.animationGroup,message:e}),i.classList.add("video")):((0,V.Z)({photo:d,container:z,withTail:!1,isOut:oe,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:M,boxWidth:t.width,boxHeight:t.height,message:a?e:void 0}),i.classList.add("photo")),c&&(n||c.classList.add("video-time"),z.append(c))}else z=void 0;if(r){const{mid:t}=e;this.extendedMediaMessages.add(t),s.onClean((()=>{this.extendedMediaMessages.delete(t)})),this.setExtendedMediaMessagesPollInterval();const{width:i,height:n}=z.style,a=zi.create({width:parseInt(i),height:parseInt(n),middleware:s,animationGroup:this.chat.animationGroup});z.append(a.canvas)}n||(h=document.createElement("div"),h.classList.add("bubble-primary-color"),(0,_.Z)(h,(0,R.Z)(F.title)));const u=a?void 0:(0,R.Z)(F.description);y.prepend(...[h,!d&&c,u].filter(Boolean)),u?i.classList.remove("is-message-empty"):j=!1,i.classList.add("is-invoice");break}default:z=void 0,i.classList.remove("is-message-empty"),y.append((0,C.ag)(C.nK),Q),this.log.warn("unrecognized media type:",F._,e)}!t&&z&&E.append(z)}G&&i.classList.add("just-media"),ce&&Q.before(ce);let he="";const ue=e.fromId!==d.Z.myId&&this.chat.isAnyGroup||e.viaBotId||e.pFlags.sponsored;if(ue||se||e.reply_to_mid||Y){let t,s;const n="peerChannel"===(null===(r=e.from_id)||void 0===r?void 0:r._)&&e.fromId===ae,a=!!e.viaBotId,o=se&&!se.from_id;e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+(yield this.managers.appPeersManager.getPeerUsername(e.viaBotId)),s.classList.add("peer-title")),a&&i.classList.add("must-have-name");const c=ae||se;let h,u;if(o?(t=document.createElement("span"),(0,_.Z)(t,(0,R.Z)(se.from_name)),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new B.Z({peerId:ae||e.fromId,withPremiumIcon:!c,wrapOptions:Z}).element,l&&e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&(!this.chat.isAllMessagesForum||e.reply_to.reply_to_top_id)&&(h=yield ne.setReply({chat:this.chat,bubble:i,bubbleContainer:E,message:e})),c)if(this.peerId===d.Z.myId||n||i.classList.add("forwarded"),e.savedFrom&&(he=e.savedFrom,t.dataset.savedFrom=he),u=document.createElement("div"),t.dataset.peerId=""+ae,this.peerId!==d.Z.myId&&this.peerId!==m.hj&&!n||G){const e=[t];if(G){const t=document.createElement("br");t.classList.add("hide-ol"),e.unshift(t)}u.append((0,C.ag)("ForwardedFrom",[e]))}else u.style.color=(0,O.Z)(ae,!1),u.classList.add("colored-name"),u.append(t);else if(!e.viaBotId)if(!G&&ue){u=document.createElement("div"),u.append(t);const i=yield this.managers.appPeersManager.getPeer(e.fromId),s=null==i?void 0:i.pFlags;s&&(s.scam||s.fake)&&u.append((0,it.Z)(s.scam)),b||(u.style.color=(0,O.Z)(e.fromId,!1),u.classList.add("colored-name")),u.dataset.peerId=""+e.fromId}else i.classList.add("hide-name");if(e.viaBotId){u?u.append(" "):u=document.createElement("div");const e=document.createElement("span");e.append((0,C.ag)("ViaBot")," ",s),e.classList.add("is-via"),u.append(e)}Y&&(G?Y.classList.add("floating-part"):(u||(u=document.createElement("div")),u.append(Y),i.classList.remove("hide-name"))),u?(u.classList.add("name"),G?(re.append(re=document.createElement("div")),re.classList.add("name-with-reply","floating-part")):u.classList.add("floating-part"),re.append(u),G&&h&&re.append(h)):G&&h&&h.classList.add("floating-part"),Y&&G&&(z?z.after(Y):this.log.error("no attachment div?",i,e))}else i.classList.add("hide-name");if("pinned"===this.chat.type&&(he=`${this.chat.peerId}_${e.mid}`),te&&te.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),he&&("pinned"===this.chat.type||se.saved_from_msg_id)&&this.peerId!==m.hj){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),E.append(e),i.dataset.savedFrom=he,i.classList.add("with-beside-button")}return i.classList.add(oe?"is-out":"is-in"),ie&&(ne.renderReplies({bubble:i,bubbleContainer:E,message:te,messageDiv:y,loadPromises:M,lazyLoadQueue:this.lazyLoadQueue})?j=!0:i.classList.add("with-beside-replies")),l&&this.appendReactionsElementToBubble(i,e,u),j&&(i.classList.add("can-have-tail"),E.append(Ss())),P}))}appendReactionsElementToBubble(e,t,i,s){if(this.peerId.isUser(),!(null==i?void 0:i.reactions)||!i.reactions.results.length)return;const n=new Qe;if(n.init(i,"block",e.middlewareHelper.get()),n.render(s),e.classList.contains("is-message-empty"))e.querySelector(".bubble-content-wrapper").append(n);else{const s=e.querySelector(".message");if(e.classList.contains("is-multiple-documents")){const e=s.lastElementChild;let a=e.querySelector(".document-message"),o=a&&a.querySelector(".time");o||(o=ne.setTime({chatType:this.chat.type,message:t,reactionsMessage:i})),n.append(o),a||(a=document.createElement("div"),a.classList.add("document-message"),e.querySelector(".document-wrapper").prepend(a)),a.append(n)}else{const t=Array.from(e.querySelectorAll(".time")).pop();n.append(t),s.append(n)}}}prepareToSaveScroll(e){if(!this.chatInner.parentElement)return{};const t=this.log.bindPrefix("prepareToSaveScroll");t("save");const i=this.createScrollSaver(e);if(i.save(),this.getRenderedLength()&&!this.chat.setPeerPromise){const e=this.getViewportSlice();this.deleteViewportSlice(e,!0)}return{restoreScroll:()=>{t("restore"),i.restore(e),this.onRenderScrollSet(i.getSaved())},scrollSaver:i}}performHistoryResult(e,t){var i;return ls(this,void 0,void 0,(function*(){let s=e.history;s=s.slice(),this.needReflowScroll&&(Se(this.scrollable.container),this.needReflowScroll=!1);const n=yield Promise.all(s.map((e=>"number"==typeof e?this.chat.getMessage(e):e))),a=[];if(!this.scrollable.loadedAll.bottom||!this.scrollable.loadedAll.top){let t=e.isEnd;if(!t){const e=yield this.chat.getHistoryStorage(),i=e.history.first,n=e.history.last;t={top:!1,bottom:!1,both:!1},!i.isEnd(fe.D.Bottom)||i.length&&!s.includes(i[0])||(t.bottom=!0),!n.isEnd(fe.D.Top)||n.length&&!s.includes(n[n.length-1])||(t.top=!0)}if(!t.bottom&&this.setPeerOptions){const{lastMsgId:e,topMessage:i}=this.setPeerOptions;this.setPeerOptions=void 0,e&&!this.bubbles[i]&&e!==i||(t.bottom=!0)}t.top&&a.push(this.setLoaded("top",!0)),t.bottom&&a.push(this.setLoaded("bottom",!0))}yield Promise.all(a);const o=n.map((e=>e?e.pFlags.local?this.processLocalMessageRender(e):this.safeRenderMessage(e,t):void 0));yield Promise.all(o),yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this))}))}onRenderScrollSet(e){const t="has-sticky-dates";if(this.container.classList.contains(t)||this.preloader.detached&&(null!=e||(e={scrollHeight:this.scrollable.scrollHeight,clientHeight:this.scrollable.container.clientHeight}),e.scrollHeight===e.clientHeight))this.willScrollOnLoad=void 0;else{const e=this.getMiddleware(),i=()=>{e()&&this.container.classList.add(t)};this.willScrollOnLoad?i():setTimeout(i,600)}}requestHistory(e,t,i){return"chat"===this.chat.type||"discussion"===this.chat.type?this.managers.acknowledged.appMessagesManager.getHistory(this.peerId,e,t,i,this.chat.threadId):"pinned"===this.chat.type?this.managers.acknowledged.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:i}).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.history.map((e=>e.mid))})))}))):"scheduled"===this.chat.type?this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.slice().reverse()})))}))):void 0}animateAsLadder(e,t,i,s,n){return ls(this,void 0,void 0,(function*(){const a=this.log.bindPrefix("ladder");if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return a.warn("will be delayed"),void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,i,s,n));if(!Object.keys(this.bubbles).length)return void a.warn("no bubbles");let o,r=(0,Xe.Z)(this.bubbles,"desc");i&&t.length&&(r=r.filter((e=>!t.includes(e)))),o=s?n||Math.max(...r):e||Math.max(...r);const d=r.slice(r.findIndex((e=>o>e))),l=i?[]:[o],c=i?[]:r.slice(0,r.findIndex((e=>o>=e))).reverse();ue.ZP&&a("targeting mid:",o,n,e,d.map((e=>(0,ht.Z)(e))),c.map((e=>(0,ht.Z)(e))));const h=[];this.chatInner.classList.add("zoom-fading");const u=i?10:40,f=i?0:1,p=(e,t=0)=>{const i=(0,he.Z)();let s=0;return e.forEach(((n,o)=>{const r=this.bubbles[n];if(!r||this.skippedMids.has(n))return void a.warn("no bubble by mid:",n);s=(o+t||.1)*u;const d=r.lastElementChild,l=[d],c=this.bubbleGroups.getItemByBubble(r);if(c&&c.group.avatar&&c.group.lastItem===c&&l.push(c.group.avatar),l.forEach((e=>{e.classList.add("zoom-fade","can-zoom-fade"),e.style.transitionDelay=s+"ms"})),o===e.length-1){const e=t=>{t.target===d&&(i.resolve(),d.removeEventListener("transitionend",e))};d.addEventListener("transitionend",e)}h.push(...l)})),e.length||i.resolve(),{lastMsDelay:s,animationPromise:i}},m=p(d,f),g=p(l),v=p(c,f),b=[m.animationPromise,g.animationPromise,v.animationPromise],y=[m.lastMsDelay,g.lastMsDelay,v.lastMsDelay];let w;return this.onAnimateLadder&&(yield this.onAnimateLadder()),(0,ce.T2)((()=>{this.setStickyDateManually(),h.forEach((e=>{e.classList.remove("zoom-fade")}))})),(d.length||l.length||c.length)&&(w=Promise.all(b),(0,le.YW)(w,Math.max(...y)+200).then((()=>{(0,ce.T2)((()=>{h.forEach((e=>{e.style.transitionDelay="",e.classList.remove("can-zoom-fade")})),this.chatInner.classList.remove("zoom-fading")}))}))),w}))}renderEmptyPlaceholder(e,t,i,s){return ls(this,void 0,void 0,(function*(){const i="empty-bubble-placeholder";let n,a;if(t.classList.add(i,i+"-"+e),"group"===e?n=(0,C.ag)("GroupEmptyTitle1"):"saved"===e?n=(0,C.ag)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?n=(0,C.ag)("NoMessages"):"noScheduledMessages"===e?n=(0,C.ag)("NoScheduledMessages"):"restricted"===e&&(n=document.createElement("span"),n.innerText=yield this.managers.appPeersManager.getRestrictionReasonText(this.peerId)),n.classList.add("center",i+"-title"),s.push(n),"group"===e)s.push((0,C.ag)("GroupEmptyTitle2")),a=[(0,C.ag)("GroupDescription1"),(0,C.ag)("GroupDescription2"),(0,C.ag)("GroupDescription3"),(0,C.ag)("GroupDescription4")];else if("saved"===e)a=[(0,C.ag)("ChatYourSelfDescription1"),(0,C.ag)("ChatYourSelfDescription2"),(0,C.ag)("ChatYourSelfDescription3"),(0,C.ag)("ChatYourSelfDescription4")];else if("greeting"===e){const e=(0,C.ag)("NoMessagesGreetingsDescription");e.classList.add("center",i+"-subtitle");const t=document.createElement("div");t.classList.add(i+"-sticker");const n=this.getMiddleware();yield this.managers.appStickersManager.getGreetingSticker().then((e=>ls(this,void 0,void 0,(function*(){if(!n())return;const i=[];return yield(0,K.ZP)({doc:e,div:t,middleware:n,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,withThumb:!0,loadPromises:i}),(0,S.fc)(t,(e=>{(0,ye.Z)(e),bt.Jo.onMediaClick({target:e.target})})),Promise.all(i)})))),s.push(e,t)}a&&(s.push(...a.map((e=>{const t=document.createElement("span");return t.classList.add(i+"-list-item"),t.append(e),t}))),"group"===e?a.forEach((e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)})):"saved"===e&&a.forEach((e=>{const t=document.createElement("span");t.classList.add(i+"-list-bullet"),t.innerText="•",e.prepend(t)}))),s.length>1&&t.classList.add("has-description"),s.forEach((e=>e.classList.add(i+"-line")))}))}processLocalMessageRender(e,t,i=this.getMiddleware()){return ls(this,void 0,void 0,(function*(){const s=!!e.pFlags.sponsored,n=(0,vt.Z)(i);return this.safeRenderMessage(e,!s,void 0,!1,(i=>ls(this,void 0,void 0,(function*(){const{bubble:a}=yield n(i);if(!a)return i;a.message=e,a.classList.add("is-group-last","is-group-first");const o=()=>{this.updatePlaceholderPosition===o&&(this.updatePlaceholderPosition=void 0),u[f](a)};s||(a.classList.add("bubble-first"),a.classList.remove("can-have-tail","is-in"));const r=[],l=this.chat.isBot;let c,u=this.container,f="append";if(this.chat.isRestricted)c=this.renderEmptyPlaceholder("restricted",a,e,r);else if(s){let i,s,n,o;a.classList.add("avoid-selection"),a.style.order="999999";const r=this.sponsoredMessage=e.sponsoredMessage,d=(0,D.Z)(r.from_id);r.channel_post?(i="OpenChannelPost",s=(0,ut.Z)(r.channel_post)):r.start_param||l?(i="Chat.Message.ViewBot",n=r.start_param):i=(yield this.managers.appPeersManager.isAnyGroup(d))?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new He(r.chat_invite_hash,r.chat_invite)}:r.chat_invite_hash?()=>{const e={_:Pe.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{this.chat.appImManager.setInnerPeer({peerId:d,lastMsgId:s,startParam:n})};const c=this.makeViewButton({text:i});this.observer.observe(c,this.viewsObserverCallback),o&&(0,S.fc)(c,o),a.querySelector(".bubble-content").prepend(c),u=this.chatInner,f="append",t=!1}else if(l&&"message"===e._){const e=document.createElement("b");e.append((0,C.ag)("BotInfoTitle")),r.push(e,"\n\n"),u=this.chatInner,f="prepend"}else c=this.chat.isAnyGroup&&(yield n(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator?this.renderEmptyPlaceholder("group",a,e,r):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",a,e,r):d.Z.myId===this.peerId?this.renderEmptyPlaceholder("saved",a,e,r):this.peerId.isUser()&&!l&&(yield n(this.chat.canSend()))&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",a,e,r):this.renderEmptyPlaceholder("noMessages",a,e,r);c&&(yield c),r.length&&a.querySelector(".message, .service-msg").prepend(...r);const p=!!this.messagesQueueOnRenderAdditional,m=this.setPeerCached&&!p;if(m){const e=a.firstElementChild;e.classList.add("no-transition"),this.chat.setPeerPromise&&this.chat.setPeerPromise.catch(We.Z).finally((()=>{e.classList.remove("no-transition")}))}if(void 0!==t||m||(t=!0),p||t?(this.updatePlaceholderPosition=o,this.onAnimateLadder=()=>{if(this.onAnimateLadder=void 0,!this.messagesQueuePromise)return(0,ce.AD)()}):this.chat.setPeerPromise?this.attachPlaceholderOnRender=()=>{this.attachPlaceholderOnRender=void 0,o()}:this.updatePlaceholderPosition=o,!p&&t){yield n((0,le.e9)());const t=(0,Xe.Z)(this.bubbles);(0,h.Z)(t,e.mid),this.animateAsLadder(e.mid,t,!1,0,0)}return a.middlewareHelper.onDestroy((()=>{this.emptyPlaceholderBubble===a&&(this.emptyPlaceholderBubble=void 0)})),this.emptyPlaceholderBubble=a,i}))))}))}makeViewButton(e){return(0,Be.Z)("btn-primary btn-primary-transparent bubble-view-button",e)}generateLocalMessageId(e=0){const t=("scheduled"===this.chat.type?-1:0)+e,i=-Math.abs(t);return{id:i,mid:-Math.abs((0,ut.Z)(i))}}generateLocalFirstMessage(e,t,i=0){return ls(this,void 0,void 0,(function*(){const{id:s,mid:n}=this.generateLocalMessageId(i);let a={_:e?"messageService":"message",date:0,id:s,mid:n,peer_id:yield this.managers.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),(0,Le.Z)(a),t&&t(a),a=(yield this.managers.appMessagesManager.saveMessages([a],{storage:new Map}))[0],a.mid=n,a}))}getViewportSlice(){return(0,et.Z)({overflowElement:this.scrollable.container,selector:".bubbles-date-group .bubble:not(.is-date)",extraSize:2*Math.max(700,Ze.Z.height)})}deleteViewportSlice(e,t){const{invisibleTop:i,invisibleBottom:s}=e,n=i.concat(s);if(!n.length)return;i.length&&(this.setLoaded("top",!1),this.getHistoryTopPromise=void 0),s.length&&(this.setLoaded("bottom",!1),this.getHistoryBottomPromise=void 0);const a=n.map((({element:e})=>+e.dataset.mid));let o;t||(o=this.createScrollSaver(!!i.length),o.save()),this.deleteMessagesByIds(a,!1,!0),o?o.restore():i.length&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop)}sliceViewport(e){if(T.IS_SAFARI||this.isHeavyAnimationInProgress&&!e)return;const t=this.getViewportSlice();this.deleteViewportSlice(t)}setLoaded(e,t,i=!0){return ls(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll[e]!==t)return this.log.bindPrefix("setLoaded")("change",e,t),this.scrollable.loadedAll[e]=t,this.scrollable.onScroll(),i?!this.chat.isRestricted&&("bottom"===e&&this.chat.isBroadcast&&this.toggleSponsoredMessage(t),"top"===e&&t&&this.chat.isBot)?this.renderBotPlaceholder():this.checkIfEmptyPlaceholderNeeded():void 0}))}toggleSponsoredMessage(e){return ls(this,void 0,void 0,(function*(){const t=this.log.bindPrefix("sponsored");t("checking");const{mid:i}=this.generateLocalMessageId(1);if(e){const e=this.getMiddleware((()=>this.scrollable.loadedAll.bottom&&this.getSponsoredMessagePromise===i)),i=this.getSponsoredMessagePromise=this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId()).then((i=>ls(this,void 0,void 0,(function*(){if(!e()||"messages.sponsoredMessagesEmpty"===i._)return;const s=i.messages[0];if(!s)return void t("no message");const n=this.generateLocalFirstMessage(!1,(e=>{e.message=s.message,e.from_id=s.from_id,e.entities=s.entities,e.pFlags.sponsored=!0,e.sponsoredMessage=s}),1);return Promise.all([n,this.getHistoryTopPromise,this.messagesQueuePromise]).then((([i])=>{if(e())return t("rendering",i),this.performHistoryResult({history:[i]},!1)}))})))).finally((()=>{this.getSponsoredMessagePromise===i&&(this.getSponsoredMessagePromise=void 0)}))}else t("clearing rendered",i),this.getSponsoredMessagePromise=void 0,this.deleteMessagesByIds([i])}))}renderBotPlaceholder(){return ls(this,void 0,void 0,(function*(){const e=this.log.bindPrefix("bot placeholder"),t=this.getMiddleware(),i=yield this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());e("getting profile, cached:",i.cached);const s=i.result.then((s=>ls(this,void 0,void 0,(function*(){var n;if(!t())return;if(!(null===(n=s.bot_info)||void 0===n?void 0:n.description))return e.warn("no description"),this.checkIfEmptyPlaceholderNeeded();const a=yield this.generateLocalFirstMessage(!1,(e=>{const t=s.bot_info;e.message=t.description,t.description_document&&(e.media={_:"messageMediaDocument",document:t.description_document}),t.description_photo&&(e.media={_:"messageMediaPhoto",photo:t.description_photo})}));return t()?(e("rendering"),{renderPromise:this.processLocalMessageRender(a,!i.cached).then((()=>{e("done")}))}):void 0}))));if(i.cached)return s}))}checkIfEmptyPlaceholderNeeded(){return ls(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderBubble&&(this.chat.isRestricted||!(yield this.chat.getHistoryStorage()).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=yield this.generateLocalFirstMessage(!0);return{renderPromise:this.processLocalMessageRender(e)}}}))}getHistory1(e,t,i,s,n){const a=this.getMiddleware(n?void 0:()=>(t?this.getHistoryTopPromise:this.getHistoryBottomPromise)===r),o=this.getHistory(e,t,i,s,n,a),r=o.then((e=>e&&(e.waitPromise||e.promise)));return t?this.getHistoryTopPromise=r:this.getHistoryBottomPromise=r,r.then((()=>{a()&&(t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0,n||"chat"===this.chat.type&&setTimeout((()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)}),0))})),o}getHistory(e=0,t=!1,i=!1,s=0,n=!1,a){return ls(this,void 0,void 0,(function*(){const o=this.peerId,r=this.chat.isBroadcast,l=Math.min(30,Ze.Z.height/40|0);let c=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;if(void 0!==fs){if(!fs)return{cached:!1,promise:Promise.resolve(),waitPromise:Promise.resolve()};Object.keys(this.bubbles).length>0&&--fs}let h,u=0;if(i&&(u=c,t||(c=0)),s&&!i)if("pinned"===this.chat.type)h=[s];else{const t=(yield this.chat.getHistoryStorage()).history.slice;if(t.length=0;--e){const t=yield this.chat.getMessage(h[e]);if(!(null==t?void 0:t.grouped_id))break;h.splice(e,1)}e=h[h.length-1]||e}}let f,p=yield this.requestHistory(e,c,u);this.log("i vin brehnya",p,e,c,u);const m=(null==h?void 0:h.length)&&!p.cached,g=this.isFirstLoad&&u&&!p.cached||m;m&&(f=p.result,p={cached:!0,result:Promise.resolve({history:h})}),this.isFirstLoad=!1;const v=e=>ls(this,void 0,void 0,(function*(){var t;if(null===(t=e.isEnd)||void 0===t?void 0:t.top){if("discussion"===this.chat.type){const t=yield this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId,this.chat.threadId);t&&e.history.push(t);const i=yield this.chat.getMidsByMid(this.chat.threadId);e.history.push(...i.reverse())}yield this.managers.appProfileManager.getProfileByPeerId(o)}})),b=e=>(0,le.e9)().then((()=>v(e))).then((()=>(!m&&s&&e.history.unshift(s),this.performHistoryResult(e,t)))),y=e=>{const t=Promise.resolve(e).then((e=>{if(a&&!a())throw gs;if(!n)return b(e);this.scrollable.onScroll()}),(e=>{throw this.log.error("getHistory error:",e),e}));return t};let w,S;if(p.cached){if(n)return this.scrollable.onScroll(),null;S=!0,w=b(yield p.result)}else S=!1,w=y(p.result);const C=m?y(f):w;if(g&&d.Z.settings.animationsEnabled){let i=m?2:1;this.messagesQueueOnRenderAdditional=()=>{this.log("messagesQueueOnRenderAdditional"),--i||(this.messagesQueueOnRenderAdditional=void 0,this.animateAsLadder(s,h,m,u,e).then((()=>{setTimeout((()=>{this.loadMoreHistory(t,!0)}),0)})))}}else this.messagesQueueOnRenderAdditional=void 0;return n?null:{cached:S,promise:w,waitPromise:C}}))}setUnreadDelimiter(){return ls(this,void 0,void 0,(function*(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=yield this.chat.getHistoryMaxId();let t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter((e=>!this.bubbles[e].classList.contains("is-out"))).map((e=>+e)).sort(((e,t)=>e-t)).find((e=>e>t)),t&&this.bubbles[t])){const i=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==i&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e&&i.classList.add("is-first-unread"),this.firstUnreadBubble=i,this.attachedUnreadBubble=!0}}))}deleteEmptyDateGroups(){const e=this.stickyIntersector?ms:1;let t=!1;for(const i in this.dateMessages){const s=this.dateMessages[i];s.container.childElementCount===e&&(s.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(s.container,s.div),delete this.dateMessages[i],t=!0)}t&&(Object.keys(this.dateMessages).length||this.container.classList.remove("has-groups"),this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function Ss(){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}var Cs=i(3003),Es=i(5128),Ls=i(8127);class Is{constructor(e,t,i,s){this.peerId=e,this.mid=t,this.unpin=i,this.onConfirm=s,this.construct()}construct(){return e=this,t=void 0,s=function*(){const{peerId:e,mid:t,unpin:i,onConfirm:s}=this;let n,a,o;const r=[],l=[],c=w.Z.MANAGERS,h=yield c.appPeersManager.canPinMessage(e),u=(n,a,o)=>{setTimeout((()=>{let n;n=i&&!t?h?c.appMessagesManager.unpinAllMessages(e):c.appMessagesManager.hidePinnedMessages(e):c.appMessagesManager.updatePinnedMessage(e,t,i,o,a),s&&n.then(s)}),300)};if(i){let i="UnpinMessage";t?(n="UnpinMessageAlertTitle",a="Chat.Confirm.Unpin"):h?(n="Popup.Unpin.AllTitle",a="Chat.UnpinAllMessagesConfirmation",o=[""+((yield c.appMessagesManager.getPinnedMessagesCount(e))||1)]):(n="Popup.Unpin.HideTitle",a="Popup.Unpin.HideDescription",i="Popup.Unpin.Hide"),r.push({langKey:i,isDanger:!0,callback:u})}else{n="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(r.push({langKey:t,callback:e=>u(0,!1,!e.size)}),(yield c.appChatsManager.isBroadcast(e.toChatId()))?a="PinMessageAlertChannel":(a="PinMessageAlert",l.push({text:"PinNotify",checked:!0}))):(a="PinMessageAlertChat",e===d.Z.myId?r.push({langKey:t,callback:u}):(r.push({langKey:t,callback:e=>u(0,!e.size)}),l.push({text:"PinAlsoFor",textArgs:[yield(0,Nt.Z)({peerId:e})],checked:!0})))}(0,w.x)(r),new Ls.Z("popup-delete-chat",{peerId:e,titleLangKey:n,descriptionLangKey:a,descriptionLangArgs:o,buttons:r,checkboxes:l}).show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var Ms=i(1962);function Ps(e=window.getSelection()){if(!(null==e?void 0:e.rangeCount))return!0;const t=e.getRangeAt(0);return!(!t.collapsed&&t.START_TO_END)}var Zs=i(2312),ks=i(1447),Ts=i(671),xs=i(3174);function As(e,t,i){return d.Z.managers.appStickersManager.preloadAnimatedEmojiSticker(e).then((({doc:s})=>{if(s)return Zs.Z.downloadMedia({media:s}).then((n=>{return a=this,r=void 0,l=function*(){const a=o.Z.active.emojiSticker,r=(0,Ts.tB)(e),d=yield ks.Z.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:a.width,height:null!=i?i:a.height,name:"doc"+s.id,autoplay:!1,loop:!1,toneIndex:r},"none");d.addEventListener("firstFrame",(()=>{(0,xs.O)(s,d.canvas[0],r),d.remove()}),{once:!0})},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,r||[])).next())}));var a,r,d,l}))}))}var _s=i(5772);class Fs extends Ls.Z{constructor(e,t,i,s){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{a.isValid()&&(s&&s(),this.managers.appMessagesManager.reportMessages(e,t,i,a.value).then((e=>{e&&(0,ge.bC)({langPackKey:"ReportSentInfo"})})))}}],body:!0});const n=document.createElement("div");(0,_s.Z)({div:n,emoji:Fs.STICKER_EMOJI,width:100,height:100}).then((({render:e})=>e)).finally((()=>{this.show()})),this.header.append(n);const a=new E.ZP({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});a.input.addEventListener("input",(()=>{this.buttons[0].element.toggleAttribute("disabled",!a.isValid())})),this.body.append(a.container)}}Fs.STICKER_EMOJI="👮‍♀️";class Ds extends Ls.Z{constructor(e,t,i){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const s=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"],["ReportChatPersonalDetails","inputReportReasonPersonalDetails"],["ReportChatIllegalDrugs","inputReportReasonIllegalDrugs"]];s.forEach((e=>{const t=(0,Be.Z)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)}));const n=As(Fs.STICKER_EMOJI);(0,S.fc)(this.body,(a=>{const o=(0,pe.Z)(a.target,"btn-primary"),r=s[(0,Ce.Z)(o)][1];n.then((()=>{this.hide(),new Fs(e,t,r,i)}))}),{listenerSetter:this.listenerSetter}),this.buttonsEl.style.marginTop=".5rem",this.show()}}class Rs extends Ls.Z{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[(0,C.ag)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(C.ZP.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}],scrollable:!0}),this.scrollable.append(this.description),this.show()}}var Bs=i(6008),Ns=i(8936),Os=i(3061),Us=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Hs extends w.Z{constructor(e){super("popup-reacted-list",{closable:!0,overlayClosable:!0,body:!0}),this.message=e,this.init()}init(){return Us(this,void 0,void 0,(function*(){const e=this.middlewareHelper.get(),t=yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message);if(!e())return;const i=yield this.managers.appMessagesManager.canViewMessageReadParticipants(t);if(!e())return;const s=new Qe,n=Object.assign(Object.assign({},t),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},t.reactions),{pFlags:{},recent_reactions:[]})});n.reactions.results=n.reactions.results.map((e=>Object.assign(Object.assign({},e),{chosen_order:void 0,pFlags:{}}))),s.init(n,"block",this.middlewareHelper.get()),s.render(),s.classList.add("no-stripe"),s.classList.remove("has-no-reactions"),s.append(this.btnClose),this.header.append(s);const a=document.createElement("div");a.classList.add("tabs-container"),a.dataset.animation="tabs";const o=new Map;let r=!1;if(n.reactions.results.length){const e=this.createFakeReaction("reactions",n.reactions.results.reduce(((e,t)=>e+t.count),0));s.prepend(e),n.reactions.results.unshift(e.reactionCount),r=!0}let d=!1;if(i)try{const i=yield this.managers.appMessagesManager.getMessageReadParticipants(t.peerId,t.mid);if(!e())return;if(!i.length)throw"";const a=this.createFakeReaction("checks",i.length);s.prepend(a),n.reactions.results.unshift(a.reactionCount),d=!0}catch(e){}n.reactions.results.forEach((i=>{const s=new Z.ZP(void 0);s.container.classList.add("tabs-tab");const n=new vi.Z({noShadow:!0,noDelimiter:!0}),r=$i.default.createChatList({dialogSize:72});$i.default.setListClickListener(r,(()=>{this.hide()}),void 0,!1,!0),n.content.append(r),s.container.append(n.container);const d="checks"!==i.reaction,l="checks"===i.reaction;["checks","reactions"].includes(i.reaction)&&(i.reaction=void 0);const c=(0,Ke.C)(24,24);let h;const u=new Ns.Z({scrollable:s,getPromise:()=>Us(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(t,void 0,i.reaction,h,d,l);return h=s.nextOffset,yield Promise.all(s.combined.map((({peerId:t,reaction:i})=>Us(this,void 0,void 0,(function*(){const{dom:s}=$i.default.addDialogNew({peerId:t,autonomous:!0,container:r,avatarSize:"abitbigger",rippleEnabled:!1,meAsSaved:!1});if(i){const t=document.createElement("div");if(t.classList.add("reacted-list-reaction-icon"),"reactionEmoji"===i._){const s=yield this.managers.appReactionsManager.getReactionCached(i.emoticon);(0,K.ZP)({doc:s.static_icon,div:t,width:24,height:24,middleware:e})}else"reactionCustomEmoji"===i._&&t.append((0,Ge.Z)({docIds:[i.document_id],customEmojiSize:c,middleware:e}));s.listEl.append(t)}(0,U.Z)(s.lastMessageSpan,(0,Os.Z)(yield this.managers.appUsersManager.getUser(t.toUserId())))}))))),!h}))});o.set(s.container,u),a.append(s.container)})),this.body.append(a);const l=(0,Bs.X)(s,a,((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),o.get(t).load()}),void 0,void 0,void 0,this.listenerSetter);l(0,!1),this.show()}))}createFakeReaction(e,t){const i=new $e;i.init("block",this.middlewareHelper.get()),i.reactionCount={_:"reactionCount",count:t,reaction:e},i.setCanRenderAvatars(!1),i.renderCounter();const s=document.createElement("div");return s.classList.add("reaction-counter","reaction-sticker-icon","tgico-"+e),i.prepend(s),i}}const zs="btn-menu-reactions-reaction",js=!T.IS_SAFARI;class Gs{constructor(e,t,i){this.managers=e,this.type=t,this.onScroll=()=>{this.reactionsMap.forEach(((e,t)=>{this.onScrollProcessItem(t,e)}))},this.onMouseMove=e=>{var t;const i=(0,pe.Z)(e.target,zs);if(!i)return;const s=this.reactionsMap.get(i);if(!s)return;if(!(null===(t=s.appear)||void 0===t?void 0:t.paused))return;const n=s.select;n&&n.paused&&(n.autoplay=!0,n.restart())};const n=this.widthContainer=document.createElement("div");n.classList.add("btn-menu-reactions-container"),n.classList.add("btn-menu-reactions-container-"+t);const a=this.container=document.createElement("div");a.classList.add("btn-menu-reactions");const o=this.scrollable="vertical"===t?new Z.ZP(void 0):new Z.v7(void 0);a.append(o.container),o.onAdditionalScroll=this.onScroll,o.setListeners(),o.container.classList.add("no-scrollbar"),this.reactionsMap=new Map,this.animationGroup=`CHAT-MENU-REACTIONS-${Date.now()}`,s.Z.setOverrideIdleGroup(this.animationGroup,!0),c.Z||a.addEventListener("mousemove",this.onMouseMove),(0,S.fc)(a,(e=>{const t=(0,pe.Z)(e.target,zs);if(!t)return;const i=this.reactionsMap.get(t);i&&this.managers.appReactionsManager.sendReaction(this.message,i.reaction)})),n.append(a),this.middleware=null!=i?i:(0,be.k)()}init(e){this.message=e;const t=this.middleware.get(),i=this.managers.appReactionsManager.getAvailableReactionsByMessage(e);(0,je.Z)(i,(e=>{if(!t()||!e.length)return;e.forEach((e=>{e.pFlags.premium&&!d.Z.premium||this.renderReaction(e)}));const s=()=>{this.container.classList.add("is-visible")};i instanceof Promise?(0,ce.T2)(s):s()}))}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),s.Z.setOverrideIdleGroup(this.animationGroup,!1),s.Z.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return d.Z.settings.animationsEnabled&&!T.IS_MOBILE}renderReaction(e){const t=document.createElement("div");t.classList.add(zs);const i=document.createElement("div");i.classList.add(zs+"-scale");const s=document.createElement("div");let n;s.classList.add(zs+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(zs+"-select","hide"));const a={selectWrapper:n,appearWrapper:s,reaction:{_:"reactionEmoji",emoticon:e.reaction}};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=26*(c.Z?1:1.25),d={width:r,height:r,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:o};if(this.canUseAnimations()){let t=!0;(0,K.ZP)(Object.assign({doc:e.appear_animation,div:s,play:!0},d)).then((({render:e})=>e)).then((e=>{(0,Le.Z)(e),a.appear=e,e.addEventListener("enterFrame",(o=>{e.maxFrame===o&&i.then((e=>{(0,Le.Z)(e),s.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)}),We.Z)}))}),We.Z);const i=(0,K.ZP)(Object.assign({doc:e.select_animation,div:n},d)).then((({render:e})=>e)).then((e=>((0,Le.Z)(e),ks.Z.waitForFirstFrame(e)))).catch(We.Z)}else delete d.needFadeIn,delete d.withThumb,(0,K.ZP)(Object.assign({doc:e.static_icon,div:s},d));i.append(s),n&&i.append(n),t.append(i),this.scrollable.append(t)}onScrollProcessItem(e,t){const i=e.firstElementChild,s=(0,Ne.Z)(e,this.scrollable.container);let n;if(s)if(s.overflow.left||s.overflow.right){const e=Math.abs(s.rect.left-s.rect.right);n="scale("+Math.min(Math.pow(e,2)/Math.pow(34,2),1)+")"}else n="";else{if(!t.appearWrapper.classList.contains("hide")||!t.appear)return;t.select&&t.select.stop(),t.appear.stop(),t.appear.autoplay=!0,t.appearWrapper.classList.remove("hide"),t.selectWrapper.classList.add("hide"),n=""}js&&(i.style.transform=n)}}var Vs=i(1483),Ks=i(2353),Ws=i(6690),$s=i(3709),qs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Qs{constructor(e,t){this.chat=e,this.managers=t,this.onContextMenu=e=>{let t,i;try{i=(0,pe.Z)(e.target,"bubble-content-wrapper"),t=i?i.parentElement:(0,pe.Z)(e.target,"bubble")}catch(e){}if(!t||t.classList.contains("bubble-first"))return;let s=this.element;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),s&&s.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+t.dataset.mid;n&&(()=>{qs(this,void 0,void 0,(function*(){const a=this.isSponsored=n<0;this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!Ps(),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");const o=yield this.chat.getMidsByMid(n);if(this.chat.selection.isSelecting&&!i){if(a)return;if(o.length>1){const e=this.chat.selection.isMidSelected(this.peerId,n)?n:o.find((e=>this.chat.selection.isMidSelected(this.peerId,e)));e&&(n=e)}}this.isOverBubble=!!i;const r=(0,pe.Z)(this.target,"grouped-item");this.isTargetAGroupedItem=!!r,this.mid=r?+r.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=t.message||(yield this.chat.getMessage(this.mid)),this.albumMessages=this.message.grouped_id?yield this.managers.appMessagesManager.getMessagesByAlbum(this.message.grouped_id):void 0,this.noForwards=!a&&!(yield this.managers.appMessagesManager.canForward(this.message)),this.viewerPeerId=void 0,this.canOpenReactedList=void 0,this.linkToMessage=yield this.getUrlToMessage(),this.selectedMessagesText=yield this.getSelectedMessagesText();const d=yield this.init();if(!d)return;s=d.element;const{cleanup:l,destroy:c,menuPadding:h,reactionsMenu:u,reactionsMenuPosition:f}=d;let p=!1;if(u){const e="is-visible";if(p=u.container.classList.contains(e),p&&u.container.classList.remove(e),"horizontal"===f){const e=s.offsetWidth,t=(e-8)/34%1,i=.65;if(t{u&&u.container.classList.remove("is-visible"),this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout((()=>{c()}),300)})),p&&u.container.classList.add("is-visible")}))})()},this.onSendScheduledClick=()=>qs(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,S.tH)(this.chat.selection.selectionSendNowBtn):new Ms.Z(this.peerId,yield this.chat.getMidsByMid(this.mid))})),this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onFaveStickerClick=e=>{const t=this.message.media.document.id;this.managers.appStickersManager.faveSticker(t,e)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>qs(this,void 0,void 0,(function*(){Ps()?(0,st.T)(this.selectedMessagesText):document.execCommand("copy")})),this.onCopyAnchorLinkClick=()=>{(0,st.T)(this.target.href)},this.onCopyLinkClick=()=>{const{url:e,isPrivate:t}=this.linkToMessage,i=t?"LinkCopiedPrivateInfo":"LinkCopied";(0,ge.Am)(C.ZP.format(i,!0)),(0,st.T)(e)},this.onPinClick=()=>{new Is(this.peerId,this.mid)},this.onUnpinClick=()=>{new Is(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.managers.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.managers.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>qs(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting)(0,S.tH)(this.chat.selection.selectionForwardBtn);else{const e=this.peerId,t=this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid);new I.Z({[e]:t})}})),this.onSelectClick=()=>{this.chat.selection.toggleByElement((0,pe.Z)(this.target,"grouped-item")||(0,pe.Z)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>qs(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,S.tH)(this.chat.selection.selectionDeleteBtn):new Es.Z(this.peerId,this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid),this.chat.type)})),this.listenerSetter=new oe.Z,this.attachListenerSetter=new oe.Z,this.middleware=(0,be.k)()}attachTo(e){this.attachListenerSetter.removeAll(),c.Z?(0,S.fc)(e,(e=>{this.chat.selection.isSelecting||(this.chat.log("touchend",e),!e.target.closest([".name",".peer-title",".reply",".document","audio-element","avatar-element","a",".bubble-beside-button","replies-element","[data-saved-from]:not(.bubble)","poll-element",".attachment",".reply-markup-button"].join(", "))&&((0,ye.Z)(e),this.onContextMenu(e)))}),{listenerSetter:this.attachListenerSetter}):(0,mt.E)(e,this.onContextMenu,this.attachListenerSetter)}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup(),this.attachListenerSetter.removeAll()}filterButtons(e){return qs(this,void 0,void 0,(function*(){return this.isSponsored?e.filter((e=>e.isSponsored)):(0,Ks.Z)(e,(e=>qs(this,void 0,void 0,(function*(){let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||c.Z,t=yield e.verify()),!!t}))))}))}setButtons(){const e=e=>qs(this,void 0,void 0,(function*(){var t;const i=null===(t=this.message.media)||void 0===t?void 0:t.document;if(!(null==i?void 0:i.sticker))return!1;const s=yield this.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!s.cached)return!1;const n=(yield s.result).some((e=>e.id===i.id));return e?!n:n}));this.buttons=[{icon:"send2",text:"MessageScheduleSend",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&!this.message.pFlags.is_outgoing},{icon:"send2",text:"Message.Context.Selection.SendNow",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&this.isSelected&&!this.chat.selection.selectionSendNowBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"schedule",text:"MessageScheduleEditTime",onClick:()=>{this.chat.input.scheduleSending((()=>{(0,Le.Z)(this.message),this.managers.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)}),new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>qs(this,void 0,void 0,(function*(){return(yield this.chat.canSend())&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type}))},{icon:"favourites",text:"AddToFavorites",onClick:this.onFaveStickerClick.bind(this,!1),verify:()=>e(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:this.onFaveStickerClick.bind(this,!0),verify:()=>e(!1)},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>qs(this,void 0,void 0,(function*(){return(yield this.managers.appMessagesManager.canEditMessage(this.message,"text"))&&!!this.chat.input.messageInput}))},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(this.noForwards||!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!this.noForwards&&!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>qs(this,void 0,void 0,(function*(){if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids){const i=`${e}_${"scheduled"===this.chat.type?"scheduled":"history"}`;for(const e of t)if((yield this.managers.appMessagesManager.getMessageFromStorage(i,e)).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:()=>{(0,st.T)(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{(0,st.T)(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>qs(this,void 0,void 0,(function*(){return(yield this.managers.appPeersManager.isChannel(this.peerId))&&!this.message.pFlags.is_outgoing}))},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>qs(this,void 0,void 0,(function*(){return!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))&&"scheduled"!==this.chat.type}))},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>qs(this,void 0,void 0,(function*(){return this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))}))},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{Zs.Z.downloadToDisc({media:(0,ct.Z)(this.message)})},verify:()=>{var e,t;if(!(0,$s.Z)(this.message)||this.noForwards)return!1;let i=!1;if(null===(e=this.message.media)||void 0===e?void 0:e.photo)i=!0;else{if(!(null===(t=this.message.media)||void 0===t?void 0:t.document))return!1;i=!0}let s=!!c.Z;return i&&(s||(s=!!((0,pe.Z)(this.target,"document")||(0,pe.Z)(this.target,"audio")||(0,pe.Z)(this.target,"media-sticker-wrapper")||(0,pe.Z)(this.target,"media-photo")||(0,pe.Z)(this.target,"media-video")))),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:()=>qs(this,void 0,void 0,(function*(){var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return(yield this.managers.appMessagesManager.canEditMessage(this.message,"poll"))&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}))},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>!(this.noForwards||"scheduled"===this.chat.type||this.message.pFlags.is_outgoing&&this.message.fromId!==m.yF||"messageService"===this.message._)},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.chat.selection.selectionForwardBtn&&this.isSelected&&!this.chat.selection.selectionForwardBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"flag",text:"ReportChat",onClick:()=>{new Ds(this.peerId,[this.mid])},verify:()=>qs(this,void 0,void 0,(function*(){return!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&(yield this.managers.appPeersManager.isChannel(this.peerId))})),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{onClick:()=>{if(this.viewerPeerId)this.chat.appImManager.setInnerPeer({peerId:this.viewerPeerId});else{if(!this.canOpenReactedList)return!1;new Hs(this.message)}},verify:()=>qs(this,void 0,void 0,(function*(){var e,t;return!this.peerId.isUser()&&(!!(null===(t=null===(e=this.message.reactions)||void 0===e?void 0:e.recent_reactions)||void 0===t?void 0:t.length)||(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)))})),notDirect:()=>!0,localName:"views"},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>qs(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(this.message)}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"info",text:"Chat.Message.Sponsored.What",onClick:()=>{new Rs},verify:()=>!1,isSponsored:!0},{text:"Loading",onClick:()=>{this.emojiInputsPromise.then((e=>{new M.Z(e,!0).show()}))},verify:()=>!!this.getUniqueCustomEmojisFromMessage().length,notDirect:()=>!0,localName:"emojis"}]}getUniqueCustomEmojisFromMessage(){const e=[],t=this.albumMessages&&(0,yt.Z)(this.albumMessages)||this.message,i=t.entities;if(i){const t=i.filter((e=>"messageEntityCustomEmoji"===e._));e.push(...t.map((e=>e.document_id)))}const s=t.reactions;if(s){const t=s.results.filter((e=>"reactionCustomEmoji"===e.reaction._));e.push(...t.map((e=>e.reaction.document_id)))}return(0,Ws.Z)(e)}init(){return qs(this,void 0,void 0,(function*(){this.cleanup(),this.setButtons();const e=yield this.filterButtons(this.buttons);if(!e.length)return;const t=this.element=yield(0,Cs.Z)({buttons:e,listenerSetter:this.listenerSetter});t.id="bubble-contextmenu",t.classList.add("contextmenu");const i=e.find((e=>"views"===e.localName));if(i){const e=this.message.reactions,t=null==e?void 0:e.recent_reactions,s=!!(null==t?void 0:t.length),n=(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message))?(yield this.managers.appPeersManager.getPeer(this.peerId)).participants_count:void 0,a=e?e.results.reduce(((e,t)=>e+t.count),0):void 0;i.element.classList.add("tgico-"+(s?"reactions":"checks"));const o=new C.ZP.IntlElement({key:s?void 0===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted":"NobodyViewed",args:s?void 0===n?[a]:[n,n]:void 0,element:i.textElement});let r;r=s?void 0===n?(0,C.ag)("Chat.Context.ReactedFast",[a]):(0,C.ag)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):(0,C.ag)("Loading"),r.classList.add("btn-menu-item-text-fake"),i.element.append(r);const d=22,l=3,c=1.125;o.element.style.visibility="hidden",o.element.style.paddingRight=s?c*Math.min(l,t.length)+"rem":"1rem";const h=this.middleware.get();this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message).then((e=>{if(!h())return;r&&r.remove();const a=e.combined,u=void 0===n?e.reactionsCount:s?a.filter((e=>e.reaction)).length:a.length;let f;if(1===a.length)f=new B.Z({peerId:a[0].peerId,onlyFirstName:!0,dialog:!1}).element,(!s||e.readParticipants.length<=1)&&(this.viewerPeerId=a[0].peerId);else if(s){const e=u===a.length||void 0===n;f=(0,C.ag)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[u]:[u,a.length])}else a.length?f=(0,C.ag)("MessageSeen",[a.length]):o.element.style.visibility="";if(f&&(f.style.paddingRight=c*Math.min(l,u)+"rem",f.classList.add("btn-menu-item-text-fake"),i.element.append(f)),a.length){const e=new ee({avatarSize:d});e.render(t?t.map((e=>(0,D.Z)(e.peer_id))):a.map((e=>e.peerId))),i.element.append(e.container),this.canOpenReactedList=!0}}))}let s,n,a;if(!("message"!==this.message._||this.chat.selection.isSelecting||this.message.pFlags.is_outgoing||this.message.pFlags.is_scheduled||this.message.pFlags.local)){a=T.IS_APPLE||c.Z?"horizontal":"vertical",n=this.reactionsMenu=new Gs(this.managers,a,this.middleware),n.init(yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message));const e=44,t=0,i=0;s="vertical"===a?{top:t,left:e}:{top:e,right:i,left:t}}const o=e.find((e=>"emojis"===e.localName));if(o){o.element.classList.add("is-multiline"),o.element.parentElement.insertBefore(document.createElement("hr"),o.element);const e=()=>{null!=s||(s={}),s.bottom=24},t=this.getUniqueCustomEmojisFromMessage(),i=this.emojiInputsPromise=(0,he.Z)();yield this.managers.appEmojiManager.getCachedCustomEmojiDocuments(t).then((s=>qs(this,void 0,void 0,(function*(){const n=t=>qs(this,void 0,void 0,(function*(){const s=new Map;t.forEach((e=>{e&&!s.has(e.stickerSetInput.id)&&s.set(e.stickerSetInput.id,e.stickerSetInput)}));const n=[...s.values()];if(i.resolve(n),1===s.size){const t=yield this.managers.acknowledged.appStickersManager.getStickerSet(n[0]),i=t.result.then((e=>{const t=(0,C.ag)("MessageContainsEmojiPack",[(0,R.Z)(e.set.title)]);(0,U.Z)(o.textElement,t)}));return t.cached?i:void e()}(0,U.Z)(o.textElement,(0,C.ag)("MessageContainsEmojiPacks",[s.size]))}));if(!s.some((e=>!e)))return n(s);e(),this.managers.appEmojiManager.getCustomEmojiDocuments(t).then(n)}))))}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove(),n&&n.widthContainer.remove()},menuPadding:s,reactionsMenu:n,reactionsMenuPosition:a}}))}getUrlToMessage(){return qs(this,void 0,void 0,(function*(){if(this.peerId.isUser())return;let e;const{peerId:t,mid:i}=this,s=this.chat.threadId;"discussion"===this.chat.type&&(e=yield this.managers.appMessagesManager.getMessageByPeer(t,s));const n=yield this.managers.appPeersManager.getPeerUsername(e?e.fromId:t),a=(0,ht.Z)(i);let o="https://t.me/";return n?(o+=n,o+=e?`/${(0,ht.Z)(e.fwd_from.channel_post)}?comment=${a}`:s?`/${(0,ht.Z)(s)}/${a}`:"/"+a):(o+="c/"+t.toChatId(),o+=e?`/${a}?thread=${(0,ht.Z)(e.mid)}`:s?`/${(0,ht.Z)(s)}/${a}`:"/"+a),{url:o,isPrivate:!n}}))}getSelectedMessagesText(){return qs(this,void 0,void 0,(function*(){if(!Ps())return"";const e=this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort(((e,t)=>e-t)):[this.mid];return(yield Promise.all(e.map((e=>qs(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);return(null==t?void 0:t.message)?t.message+"\n":""})))))).join("")}))}}var Ys=i(4329),Js=i.n(Ys),Xs=i(9043);class en{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=(0,Cs.b)({buttons:this.sendMenuButtons,listenerSetter:e.listenerSetter}),this.sendMenu.classList.add("menu-send",e.openSide),(0,mt.E)(e.onContextElement,(t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!e.verify())})),(0,ye.Z)(t),gt.Z.openBtnMenu(this.sendMenu))}),e.listenerSetter)}setPeerId(e){this.type=e===d.Z.myId?"reminder":"schedule"}}var tn=i(1293),sn=i(9336),nn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class an extends w.Z{constructor(e){super("popup-create-poll popup-new-media",{closable:!0,withConfirm:"Create",body:!0,title:"NewPoll"}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,i=(0,me.Z)(t,"LABEL"),s=(0,tn.Z)(t);s||(t.parentElement.classList.add("is-filled"),i.classList.remove("hidden-widget"),i.firstElementChild.removeAttribute("disabled")),!i.nextElementSibling&&!s&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,i=(0,me.Z)(t,"LABEL"),s=(0,Ce.Z)(i);this.correctAnswers&&this.correctAnswers[0][0]===s&&(this.correctAnswers=void 0),i.remove(),this.optionInputFields.splice(s,1),this.optionInputFields.forEach(((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1),C.ZP.weakMap.get(e.label.firstElementChild).update()})),this.handleChange()},this.construct()}construct(){return nn(this,void 0,void 0,(function*(){if(this.questionInputField=new E.ZP({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 en({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const e=document.createElement("hr"),t=document.createElement("div");t.classList.add("caption"),(0,C.$d)(t,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const s=document.createElement("div");s.classList.add("caption"),(0,C.$d)(s,"Settings"),(yield this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))||(this.anonymousCheckboxField=new Dt.Z({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new Dt.Z({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new Dt.Z({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",(()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)})),this.listenerSetter.add(this.quizCheckboxField.input)("change",(()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map((t=>{t.classList.toggle("radio-field",e)})),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),n.forEach((t=>t.classList.toggle("hide",!e))),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()})),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const n=[],a=document.createElement("div");a.classList.add("caption"),(0,C.$d)(a,"AccDescrQuizExplanation");const o=document.createElement("hr"),r=document.createElement("div");r.classList.add("poll-create-questions"),this.quizSolutionField=new E.ZP({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"),(0,C.$d)(d,"AddAnExplanationInfo"),r.append(this.quizSolutionField.container,d),n.push(o,a,r),n.forEach((e=>e.classList.add("hide"))),this.body.parentElement.insertBefore(e,this.body),this.body.append(t,this.questions,document.createElement("hr"),s,i,...n),(0,S.fc)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new Z.ZP(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}))}getFilledAnswers(){return Array.from(this.questions.children).map(((e,t)=>{const i=e.querySelector(".input-field-input");return i instanceof HTMLInputElement?i.value:(0,sn.Z)(i,!1,!1).value})).filter((e=>!!e.trim()))}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const i=this.getFilledAnswers();if(i.length<2)return!1;if(i.find((e=>e.length>100)))return!1;const{value:s}=(0,sn.Z)(this.quizSolutionField.input,!1,!1);return!(s.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){return nn(this,void 0,void 0,(function*(){const t=this.questionInputField.value,i=this.getFilledAnswers(),{value:s,entities:n}=(0,sn.Z)(this.quizSolutionField.input,!0,!1);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:i.map(((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])}))),id:void 0},r=yield this.chat.managers.appPollsManager.getInputMediaPoll(o,this.correctAnswers,s,n);this.chat.managers.appMessagesManager.sendOther(this.chat.peerId,r,Object.assign({},this.chat.getMessageSendingParams())),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}))}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,i=new E.ZP({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(i.input)("input",this.onInput);const s=new Pi.Z({text:"",name:"question"});s.main.append(i.container),(0,S.fc)(i.input,ye.Z,{listenerSetter:this.listenerSetter}),s.label.classList.add("hidden-widget"),s.input.disabled=!0,this.quizCheckboxField.input.checked||s.label.classList.remove("radio-field"),this.listenerSetter.add(s.input)("change",(()=>{if(s.input.checked){const e=(0,Ce.Z)(s.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}}));const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),i.container.append(n),(0,S.fc)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(s.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(i)}}var on=i(7814);function rn(e){let t,i;return e instanceof HTMLVideoElement?(t=e.videoWidth,i=e.videoHeight):(t=e.naturalWidth,i=e.naturalHeight),(0,on.Z)({media:e,mediaSize:(0,Ke.C)(t,i),boxSize:(0,Ke.C)(320,240),quality:.9})}var dn=i(9897),ln=i(2341);function cn(e){const t=e.src;return fetch(t).then((e=>e.arrayBuffer())).then((e=>{const t=new Uint8Array(e);let i=0;for(let e=0,s=t.length;e{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.isContentEditable)return;this.input.focus(),(0,xt.Z)(this.input)}},this.attachFile=e=>{const t=this.willAttach,i=this.shouldCompress(e.type),s={};s.file=e;const n=document.createElement("div");n.classList.add("popup-item"),s.itemDiv=n;const a=i?this.attachMedia(s,n):this.attachDocument(s,n);return t.sendFileDetails.push(s),a},this.construct(i)}construct(e){return pn(this,void 0,void 0,(function*(){this.willAttach={type:e,sendFileDetails:[],group:!1};const t=yield this.managers.apiManager.getConfig();if(this.captionLengthMax=t.caption_length_max,(0,S.fc)(this.btnConfirm,(()=>this.send()),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new en({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 Z.ZP(null);i.container.append(this.mediaContainer),this.inputField=new E.ZP({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:this.captionLengthMax,withLinebreaks:!0}),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=[],mn=void 0})),mn=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 Dt.Z({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",(()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()}))):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find((e=>ln.Z.has(e.type)));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new Dt.Z({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",(()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()}))):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!t)}addFiles(e){const t=e.filter((e=>!this.files.find((t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size))));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));let t=this.inputField.value;if(t.length>this.captionLengthMax)return void(0,ge.Am)(C.ZP.format("Error.PreviewSender.CaptionTooLong",!0));this.hide();const i=this.willAttach;i.isMedia="media"===i.type||void 0;const{sendFileDetails:s,isMedia:n}=i,{peerId:a,input:o}=this.chat;s.forEach((e=>{e.itemDiv=void 0}));const{length:r}=s,d=this.chat.getMessageSendingParams();this.iterate((e=>{t&&e.length!==r&&(this.managers.appMessagesManager.sendText(a,t,Object.assign(Object.assign({},d),{clearDraft:!0})),t=void 0);const s=Object.assign(Object.assign({},i),{sendFileDetails:e});this.managers.appMessagesManager.sendAlbum(a,s.sendFileDetails.map((e=>e.file)),Object.assign(Object.assign(Object.assign({},d),{caption:t,isMedia:n,clearDraft:!0}),s)),t=void 0})),o.replyToMsgId=this.chat.threadId,o.onMessageSent()}attachMedia(e,t){return pn(this,void 0,void 0,(function*(){t.classList.add("popup-item-media");const i=e.file;let s;if(i.type.startsWith("video/")){const n=(0,hn.Z)(),a=document.createElement("source");a.src=e.objectURL=yield fn.Z.invoke("createObjectURL",i),n.autoplay=!0,n.controls=!1,n.muted=!0,n.addEventListener("timeupdate",(()=>{n.pause()}),{once:!0}),s=(0,un.Z)(n).then((()=>pn(this,void 0,void 0,(function*(){e.width=n.videoWidth,e.height=n.videoHeight,e.duration=Math.floor(n.duration);const i=n.webkitAudioDecodedByteCount;void 0!==i&&(e.noSound=!i),t.append(n);const s=yield function(e){return new Promise(((t,i)=>{e.onseeked=()=>{e.onseeked=()=>{rn(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=i,e.currentTime=Math.min(e.duration,1)}))}(n);e.thumb=Object.assign({url:yield fn.Z.invoke("createObjectURL",s.blob)},s)})))),n.append(a)}else{const n=new Image;s=new Promise((s=>{n.onload=()=>{e.width=n.naturalWidth,e.height=n.naturalHeight,t.append(n),"image/gif"===i.type?(e.noSound=!0,Promise.all([cn(n).then((t=>{e.duration=Math.ceil(t)})),rn(n).then((t=>pn(this,void 0,void 0,(function*(){e.thumb=Object.assign({url:yield fn.Z.invoke("createObjectURL",t.blob)},t)}))))]).then((()=>{s()}))):s()}})),n.src=e.objectURL=yield fn.Z.invoke("createObjectURL",i)}return s}))}attachDocument(e,t){return pn(this,void 0,void 0,(function*(){t.classList.add("popup-item-document");const i=e.file,s=i.type.startsWith("image/"),n=i.type.startsWith("audio/");(s||n||i.size<2e7)&&(e.objectURL=yield fn.Z.invoke("createObjectURL",i));const a={_:"document",file:i,file_name:i.name||"",size:i.size,type:s?"photo":"doc"};let o;e.objectURL&&(o={url:e.objectURL,downloaded:i.size,type:m.Pt});const r=yield(0,Vi.Z)({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:a}},cacheContext:o});return new Promise((i=>{const n=()=>{t.append(r),i()};if(s){const t=new Image;t.src=e.objectURL,t.onload=()=>{e.width=t.naturalWidth,e.height=t.naturalHeight,n()},t.onerror=n}else n()}))}))}shouldCompress(e){return"media"===this.willAttach.type&&ln.Z.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),this.addEventListener("close",(()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)})),this.show())}setTitle(){const{willAttach:e,title:t,files:i}=this;let s;const n=[];if("document"===e.type)s="PreviewSender.SendFile",n.push(i.length);else{let e=0,t=0,a=0;i.forEach((i=>{i.type.startsWith("image/")?++e:i.type.startsWith("video/")?++t:++a})),[e,t,a].filter((e=>e>0)).length>1?(s="PreviewSender.SendFile",n.push(i.length)):e?(s="PreviewSender.SendPhoto",n.push(e)):t&&(s="PreviewSender.SendVideo",n.push(t))}(0,U.Z)(t,(0,C.ag)(s,n))}appendMediaToContainer(e,t){if(this.shouldCompress(t.file.type)){const i=(0,dn.Z)(t.width,t.height,380,320);e.style.width=i.width+"px",e.style.height=i.height+"px"}this.mediaContainer.append(e)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach((t=>e([t])));const i=t.length;for(let s=0;s{i.innerHTML="",e.length&&(this.setTitle(),this.iterate((e=>{if(this.shouldCompress(e[0].file.type)&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map((e=>e.itemDiv))),Ui({container:t,items:e.map((e=>({w:e.width,h:e.height}))),maxWidth:380,minWidth:100,spacing:4}),i.append(t)}else e.forEach((e=>{this.appendMediaToContainer(e.itemDiv,e)}))})))})).then((()=>{this.onRender()}))}}var bn=i(6057);const yn="keydown",wn="active",Sn=["ArrowUp","ArrowDown"],Cn=["ArrowLeft","ArrowRight"];function En({list:e,type:t,onSelect:i,once:s,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?Sn.concat(Cn):"x"===t?Cn:Sn);let r;const d=()=>r||e.querySelector(".active")||e.firstElementChild,l=(e,i)=>{if(r===e)return;let s=!1;r&&(s=!0,r.classList.remove(wn)),r=e,r&&(r.classList.add(wn),s&&f&&i&&(0,de.Z)({container:f,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},c=(t,i)=>{let s;return s=i?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,s};let h;h="xy"===t?(t,i)=>"ArrowUp"===i||"ArrowDown"===i?((t,i)=>{const s=i?"nextElementSibling":"previousElementSibling",n=i?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[s]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[s]||e[n]}return o})(t,"ArrowDown"===i):c(t,"ArrowRight"===i):(e,t)=>c(e,"ArrowRight"===t||"ArrowDown"===t);let u=i=>{const s=i.key;if(o.has(s)){if((0,ye.Z)(i),e.childElementCount>1){let e=d();e=h(e,s),l(e,!0)}}else("Enter"===s||"xy"!==t&&"Tab"===s)&&((0,ye.Z)(i),g(d()))};const f=(0,pe.Z)(e,"scrollable");e.classList.add("navigable-list");const p=t=>{const i=(0,Fe.Z)(t.target,e);i&&l(i,!1)},m=t=>{(0,ye.Z)(t);const i=(0,Fe.Z)(t.target,e);i&&(l(i,!1),g(d()))},g=e=>{return t=this,n=void 0,o=function*(){const t=yield i(e);(void 0!==t?!t:s)&&y()},new((a=void 0)||(a=Promise))((function(e,i){function s(e){try{d(o.next(e))}catch(e){i(e)}}function r(e){try{d(o.throw(e))}catch(e){i(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(t,n||[])).next())}));var t,n,a,o};let v=!1;const b=()=>{v||(v=!0,document.addEventListener(yn,u,{capture:!0,passive:!1}),e.addEventListener("mousemove",p,{passive:!0}),(0,S.fc)(e,m))},y=()=>{v&&(v=!1,document.removeEventListener(yn,u,{capture:!0}),e.removeEventListener("mousemove",p),(0,S.EN)(e,m))},w=()=>{a||l(e.firstElementChild,!1)};if(a){const e=u;u=t=>{a.has(t.key)&&((0,ye.Z)(t),document.removeEventListener(yn,u,{capture:!0}),u=e,document.addEventListener(yn,u,{capture:!0,passive:!1}),a=void 0,w())}}else w();return b(),{attach:b,detach:y,resetTarget:w}}var Ln=i(9818),In=i(5953);class Mn extends l.Z{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:i,resetTarget:s}=En({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=i,this.resetTarget=s,T.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},Ln.Z.pushItem(this.navigationItem)),this.addEventListener("hidden",(()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",i(),this.navigationItem&&(Ln.Z.removeItem(this.navigationItem),this.navigationItem=void 0)}),{once:!0})},(0,In.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("autocomplete-helper","z-depth-1"),e.appendTo.append(this.container),this.attachNavigation(),this.controller&&this.controller.addHelper(this)}toggleListNavigation(e){e?this.attach&&this.attach():this.detach&&this.detach()}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1,i){if(this.init)return;if(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden===e)return void(e||this.dispatchEvent("visible"));this.hidden=e,e?(this.navigationItem&&(Ln.Z.removeItem(this.navigationItem),this.navigationItem=void 0),!t&&this.controller&&this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller&&this.controller.hideOtherHelpers(this),this.dispatchEvent("visible"));const s=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),(0,xe.Z)({element:this.container,className:"is-visible",forwards:!e,duration:d.Z.settings.animationsEnabled&&!i?300:0,onTransitionEnd:()=>{this.hidden&&this.dispatchEvent("hidden")},useRafs:s})}}class Pn extends Mn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>{return t=this,i=void 0,n=function*(){return!(yield bt.Jo.onMediaClick({target:e},!0))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},waitForKey:["ArrowUp","ArrowDown"]}),this.chat=i,this.managers=s,this.container.classList.add("stickers-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0),d.Z.dispatchEvent("choosing_sticker",!0)})),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0,this.listenerSetter.removeAll(),this.listenerSetter=void 0),d.Z.dispatchEvent("choosing_sticker",!1)}))}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),As(e),this.managers.appStickersManager.getStickersByEmoticon(e).then((e=>{if(!t())return;this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();let s;this.lazyLoadQueue.clear(),s=e.length?new Promise((t=>{const s=[];e.forEach((e=>{i.append(this.superStickerRenderer.renderSticker(e,void 0,s))})),Promise.all(s).finally(t)})):Promise.resolve(),s.then((()=>{this.list.replaceWith(i),this.list=i,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},o.Z.addEventListener("changeScreen",this.onChangeScreen),this.listenerSetter=new oe.Z,(0,Ri.Z)({listenTo:this.container,listenerSetter:this.listenerSetter})),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 Z.ZP(this.container),this.lazyLoadQueue=new ae.Z,this.superStickerRenderer=new bn.vT(this.lazyLoadQueue,this.chat.animationGroup,this.managers)}}var Zn=i(2230),kn=i(5322);const Tn=()=>{const e=new Date;return e.setHours(0,0,0,0),e},xn=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class An extends L{constructor(e,t,i){var s;if(super((s=e).getTime()>xn().getTime()?new Date:s,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Tn(),maxDate:xn(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0,title:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),i){const e=(0,Be.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),(0,S.fc)(e,(()=>{t(Me),this.hide()}))}}}var _n=i(8119),Fn=i(8799),Dn=i(6760),Rn=i(6299),Bn=i(6039);class Nn extends Mn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"x",onSelect:e=>{i.onEmojiSelected((0,Bn.xG)(e),!0)}}),this.managers=s,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new Z.v7(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollLeft=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach((e=>{(0,Bn.IA)(e,this.list,!1,!0)}))),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const i=this.controller.getMiddleware();this.managers.appEmojiManager.getBothEmojiKeywords().then((()=>{return s=this,n=void 0,o=function*(){if(!i())return;const s=e.replace(/^:/,""),n=yield this.managers.appEmojiManager.searchEmojis(s);i()&&this.render(n,":"!==t)},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o}))}}class On extends Mn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"y",onSelect:s}),this.className=i,this.container.classList.add(On.BASE_CLASS,i)}init(){this.list=document.createElement("div"),this.list.classList.add(On.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new Z.ZP(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach((e=>{const t=On.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=On.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const i=document.createElement("div");i.classList.add(t,e.className),i.dataset.peerId=""+e.peerId;const s=new p.Z;s.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),s.updateWithOptions({isDialog:!1,peerId:e.peerId});const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?(0,_.Z)(n,(0,R.Z)(e.name)):n.append(new B.Z({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),i.append(s,n),e.description){const s=document.createElement("div");s.classList.add(t+"-description",e.className+"-description"),(0,_.Z)(s,(0,R.Z)(e.description)),i.append(s)}return i}}On.BASE_CLASS="autocomplete-peer-helper",On.BASE_CLASS_LIST_ELEMENT=On.BASE_CLASS+"-list-element";var Un=i(7381);function Hn(e,t,i){const s=[].concat(t.bot_info);let n;void 0!==i&&(n=new Un.Z({ignoreCase:!0}));const a=new Map;let o;if(s.forEach((t=>{t.commands&&t.commands.forEach((({command:i,description:s},o)=>{const r="/"+i;a.set(i,{peerId:t.user_id?t.user_id.toPeerId(!1):e,command:i,name:r,description:s,index:o}),n&&n.indexObject(i,r)}))})),n){const e=n.search(i);o=Array.from(e).map((e=>a.get(e)))}else o=[...a.values()];return o=o.sort(((e,t)=>a.get(e.command).index-a.get(t.command).index)),o}class zn extends On{constructor(e,t,i,s){super(e,t,"commands-helper",(e=>{const t=e.querySelector(`.${On.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return i.getReadyToSend((()=>{i.messageInput.innerHTML=t,i.sendMessage(!0)}))})),this.managers=s}checkQuery(e,t){return i=this,s=void 0,a=function*(){if(!(yield this.managers.appUsersManager.isBot(t)))return!1;const i=this.controller.getMiddleware();return this.managers.appProfileManager.getProfileByPeerId(t).then((s=>{if(!i())return;const n=Hn(t,s,e);this.render(n)})),!0},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class jn{constructor(){this.helpers=new Set,this.middleware=(0,be.k)()}toggleListNavigation(e){for(const t of this.helpers)t.toggleListNavigation(e)}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach((t=>{t!==e&&t.toggle(!0,!0)})),e||this.middleware.clean()}}var Gn=i(5102),Vn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Kn extends On{constructor(e,t,i,s){super(e,t,"mentions-helper",(e=>{const t=e.dataset.peerId.toUserId();Promise.resolve(s.appUsersManager.getUser(t)).then((e=>{let t,s="";const n=(0,Gn.Z)(e);n[0]?s="@"+n[0]:(s=e.first_name||e.last_name,t={_:"messageEntityMentionName",length:s.length,offset:0,user_id:e.id}),s+=" ",i.insertAtCaret(s,t)}))})),this.managers=s}checkQuery(e,t,i){const s=e.trim();if(e.length!==s.length)return!1;const n=this.controller.getMiddleware();return this.managers.appProfileManager.getMentions(t&&t.toChatId(),s,i).then((e=>Vn(this,void 0,void 0,(function*(){if(!n())return;e=e.filter((e=>e!==d.Z.myId));const t=e.map((e=>Vn(this,void 0,void 0,(function*(){const t=yield this.managers.appUsersManager.getUser(e),i=(0,Gn.Z)(t);return{peerId:e,description:i[0]?"@"+i[0]:void 0}}))));this.render((yield Promise.all(t)).filter(Boolean))})))),!0}}var Wn=i(5494),$n=i(6339),qn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Qn extends $n.Z{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;(0,Fe.Z)(t,this.element)||t===this.btnHover||((0,ye.Z)(e),this.toggle(!1))},(0,In.Z)(this,e),this.element.classList.add(Qn.BASE_CLASS),this.element.style.display="none",this.scrollable=new Z.ZP,this.element.append(this.scrollable.container),this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(d.Z)("history_reply_markup",(({peerId:e})=>qn(this,void 0,void 0,(function*(){this.peerId===e&&(this.checkAvailability()&&this.isActive()&&(yield this.render()),(0,le.e9)().then((()=>{this.checkForceReply()})))}))))}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",(()=>qn(this,void 0,void 0,(function*(){yield this.render(),c.Z&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",(()=>{this.listenerSetter.remove(this.touchListener)}),{once:!0}))})))),(0,S.fc)(this.element,(e=>{const t=(0,pe.Z)(e.target,"btn");if(!t)return;const i=t.dataset.type,{peerId:s}=this;"keyboardButtonRequestPhone"===i?(0,ci.Z)({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then((()=>{this.managers.appMessagesManager.sendContact(s,d.Z.myId)})):this.managers.appMessagesManager.sendText(s,t.dataset.text),this.toggle(!1)}),{listenerSetter:this.listenerSetter}),super.init()}checkForceReply(){return qn(this,void 0,void 0,(function*(){const e=yield this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}))}getReplyMarkup(){var e;return qn(this,void 0,void 0,(function*(){return null!==(e=(yield this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}))}render(e){return qn(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup()),this.scrollable.container.replaceChildren();for(const t of e.rows){const e=document.createElement("div");e.classList.add(Qn.BASE_CLASS+"-row");for(const i of t.buttons){const t=document.createElement("button");t.classList.add(Qn.BASE_CLASS+"-button","btn"),(0,_.Z)(t,(0,R.Z)(i.text)),t.dataset.text=i.text,t.dataset.type=i._,e.append(t)}this.scrollable.container.append(e)}}))}checkAvailability(e){var t;return qn(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup());const i="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",i),i&&this.toggle(!1),!i}))}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}Qn.BASE_CLASS="reply-keyboard";var Yn=i(1080),Jn=i(8678),Xn=i(2830),ea=i(515);const ta="INLINE-HELPER";class ia extends Mn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:i,queryId:s}=this.list.dataset;return this.chat.input.getReadyToSend((()=>{const n=(0,ea.Z)(s,e.dataset.resultId);this.managers.appInlineBotsManager.sendInlineResult(t.toPeerId(),i,n,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{clearDraft:!0})),this.chat.input.onMessageSent(!0,!0)}))}}),this.chat=i,this.managers=s,this._checkQuery=(e,t,i)=>{return s=this,n=void 0,r=function*(){const s=this.controller.getMiddleware(),n=yield this.managers.appUsersManager.resolveUsername(t);if(!s())throw"PEER_CHANGED";if("user"!==n._||!n.pFlags.bot)throw"NOT_A_BOT";const a=this.managers.appInlineBotsManager.getInlineResults(e,n.id,i).then((t=>{if(!s())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();i.dataset.peerId=""+e,i.dataset.botId=""+n.id,i.dataset.queryId=""+t.query_id;const a=new Yn.Z(null,ta,this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],d=!!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=d?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),i.append(t),d)t.classList.add("grid-item");else{n.classList.add("empty"),(0,_.Z)(n,(0,R.Z)([...e.title.trim()][0]));const s=document.createElement("div");s.classList.add("inline-helper-result-title"),(0,_.Z)(s,(0,R.Z)(e.title));const a=document.createElement("div");a.classList.add("inline-helper-result-description"),(0,_.Z)(a,(0,rt.ZP)(e.description,{noCommands:!0,noLinks:!0})),t.append(s,a);const o=document.createElement("div");o.classList.add("inline-helper-separator"),i.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let i;n?(i=document.createElement("div"),n.append(i)):i=t,i.classList.add("media-container"),d&&i.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>Zs.Z.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then((e=>{const t=new Image;t.classList.add("media-photo"),(0,Jn.Z)(e).then((e=>{(0,Xn.Z)(i,t,e,!0)}))}))})}}else{const i=e.document||e.photo;if(["sticker","gif"].includes(null==i?void 0:i.type)&&d)(0,Le.Z)(i),"gif"===i.type?a.add(i,t):"sticker"===i.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(i,t,r),i.animated&&this.superStickerRenderer.observeAnimated(t));else if(i){const e=d?48:void 0;d&&t.classList.add("no-border-radius"),(0,V.Z)({photo:i,container:d?t:n,boxWidth:e,boxHeight:e,middleware:s,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then((()=>{if(!s())return void a.clear();i.classList.toggle("is-gallery",d),i.classList.toggle("super-stickers",d),this.container.classList.toggle("is-gallery",d);const r=this.list.parentElement;if(r.textContent="",t.switch_pm){const i=(0,Be.Z)("btn-primary btn-secondary btn-primary-transparent primary");(0,_.Z)(i,(0,R.Z)(t.switch_pm.text)),(0,S.fc)(i,(i=>{this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)})),r.append(i)}r.append(this.list=i),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=a,a.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},o.Z.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0}))}));return{user:n,renderPromise:a}},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function o(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,o)}d((r=r.apply(s,n||[])).next())}));var s,n,a,r},this.container.classList.add("inline-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)})),this.checkQuery=(0,Ie.Z)(this._checkQuery,200,!0,!0),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)}))}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new Z.ZP(this.container),this.lazyLoadQueue=new ae.Z,this.superStickerRenderer=new bn.vT(this.lazyLoadQueue,ta,this.managers)}}var sa=i(8090),na=i(3013),aa=i(5133);class oa extends On{constructor(e,t,i){super(e,void 0,"bot-commands",(e=>{const i=e.querySelector(`.${On.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return t.getReadyToSend((()=>{t.messageInput.innerHTML=i,t.sendMessage(!0),this.toggle(!0)}))})),this.managers=i}setUserId(e,t){var i;if(this.userId!==e||!(null===(i=this.list)||void 0===i?void 0:i.childElementCount))return this.userId=e,(0,je.Z)(this.managers.appProfileManager.getProfile(e),(i=>{if(!t())return;const s=Hn(e.toPeerId(!1),i),n=50*s.length+8+24;this.container.style.setProperty("--height",n+"px"),this.render(s)}));this.toggle(!1)}}var ra=i(8479),da=(i(1544),i(7197)),la=i(6241),ca=i(6535),ha=i(2821),ua=i(3066);function fa(e){return t=this,i=void 0,n=function*(){return{cached:e.cached,result:e.cached?yield e.result:e.result}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}function pa(e){return e.then(fa)}var ma=i(177),ga=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class va{constructor(e,t,i){this.managers=e,this.onReady=t,this.onChange=i,this.middleware=(0,be.k)(),this.listenerSetter=new oe.Z,this.construct()}construct(){this.container=document.createElement("div"),this.container.classList.add("new-message-send-as-container"),this.closeBtn=document.createElement("div"),this.closeBtn.classList.add("new-message-send-as-close","new-message-send-as-avatar","tgico-close");const e=[{text:"SendMessageAsTitle",onClick:void 0}];let t;this.buttons=[];const i=e=>{e&&(t=this.avatar);const i=this.avatar!==t,s=!e&&i?2:0;(0,xe.Z)({element:this.closeBtn,className:"is-visible",forwards:e,duration:300,useRafs:s}),i||(0,xe.Z)({element:t,className:"is-visible",forwards:!e,duration:300,useRafs:s})};(0,kn.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,container:this.container,direction:"top-right",buttons:e,onOpenBefore:()=>{i(!0)},onOpen:(t,i)=>{e[0].element.classList.add("btn-menu-item-header"),this.btnMenu=i,this.btnMenu.classList.add("scrollable","scrollable-y"),this.btnMenu.append(...this.buttons.map((e=>e.element)))},onClose:()=>{i(!1)},onCloseAfter:()=>{this.btnMenu=void 0}}),this.container.append(this.closeBtn)}updateButtons(e){var t;return ga(this,void 0,void 0,(function*(){const i=e.map(((e,t)=>ga(this,void 0,void 0,(function*(){const i=document.createElement("div"),s=document.createElement("div");return s.classList.add("btn-menu-item-subtitle"),e.isUser()?s.append((0,C.ag)("Chat.SendAs.PersonalAccount")):e===this.peerId?s.append((0,C.ag)("VoiceChat.DiscussionGroup")):s.append(yield(0,ma.Z)(e.toChatId())),i.append(new B.Z({peerId:e}).element,s),{onClick:t?()=>ga(this,void 0,void 0,(function*(){const t=this.peerId;this.changeSendAsPeerId(e);const i=this.middleware.get(),s=()=>{if(this.sendAsPeerId!==e||!i())return;const t=this.sendAsPeerIds.slice();(0,h.Z)(t,e),t.unshift(e),this.updateButtons(t)};d.Z.settings.animationsEnabled?setTimeout(s,250):s(),this.managers.appMessagesManager.saveDefaultSendAs(t,e)})):void 0,textElement:i}})))),s=yield Promise.all(i);(0,Cs.b)({buttons:s}),s.forEach(((t,i)=>{const s=e[i],n=new p.Z;n.classList.add("avatar-26","btn-menu-item-icon"),n.updateWithOptions({peerId:s}),i||n.classList.add("active"),t.element.prepend(n)})),this.buttons=s,null===(t=this.btnMenu)||void 0===t||t.append(...this.buttons.map((e=>e.element)))}))}updateAvatar(e,t){return ga(this,void 0,void 0,(function*(){const i=this.avatar;if(i&&i.peerId===e)return;i||(t=!0);const s=t?0:2,n=t?0:300,a=this.avatar=new p.Z;a.classList.add("new-message-send-as-avatar","avatar-30"),yield a.updateWithOptions({isDialog:!1,peerId:e}),(0,xe.Z)({element:a,className:"is-visible",forwards:!0,duration:n,useRafs:s}),i&&(0,xe.Z)({element:i,className:"is-visible",forwards:!1,duration:n,onTransitionEnd:()=>{i.remove()},useRafs:s}),this.container.append(a)}))}changeSendAsPeerId(e,t){return this.sendAsPeerId=e,this.onChange(e),this.updateAvatar(e,t)}getDefaultSendAs(){return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((e=>({cached:e.cached,result:e.result.then((e=>e.default_send_as?(0,D.Z)(e.default_send_as):void 0))})))}updateManual(e){return ga(this,void 0,void 0,(function*(){const t=this.peerId;if(this.updatingPromise||!(yield this.managers.appPeersManager.isChannel(t)))return;const i=this.middleware.get((()=>!this.updatingPromise||this.updatingPromise===l)),{container:s}=this,n=t.toChatId(),a=(yield pa(this.getDefaultSendAs())).result,o=e;a instanceof Promise&&(e=void 0);const r=o&&!e,l=this.updatingPromise=(0,je.Z)(a,(t=>ga(this,void 0,void 0,(function*(){if(!i()||void 0===t)return;if(yield this.changeSendAsPeerId(t,e),!i())return;this.managers.appChatsManager.getSendAs(n).then((e=>{if(!i())return;const s=e.filter((e=>!e.pFlags.premium_required)).map((e=>e.peer)).map((e=>(0,D.Z)(e)));this.sendAsPeerIds=s.slice(),(0,h.Z)(s,t),s.unshift(t),this.updateButtons(s)}));const a=()=>{this.onReady(s,e),this.addedListener||(this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.update()})),this.addedListener=!0)};if(!r)return a;a()}))));return l.finally((()=>{this.updatingPromise===l&&(this.updatingPromise=void 0)})),r?void 0:l}))}update(e){return this.updateManual(e).then((e=>null==e?void 0:e()))}setPeerId(e){this.middleware.clean(),this.updatingPromise=void 0,this.peerId=e}destroy(){this.container.remove(),this.setPeerId(),this.listenerSetter.removeAll()}}var ba=i(669),ya=i(6854);const wa=new RegExp(`(${ya.Z})|(
)`,"g");class Sa extends E.ZP{constructor(e){super(e),this.input.addEventListener("input",(()=>{this.updateInnerHTML(),this.onFakeInput()})),e.placeholder&&(0,C.$d)(this.inputFake,e.placeholder,void 0,"placeholder"),this.input.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.contentEditable="true",this.inputFake.tabIndex=-1,this.inputFake.className=this.input.className+" input-field-input-fake"}onFakeInput(e=!0){const{scrollHeight:t}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===t)return;const s=Math.round(50*Math.log(Math.abs(t-i)));this.input.style.transitionDuration=`${s}ms`,e&&(this.input.style.height=t?t+"px":"");const n="is-changing-height";(0,xe.Z)({element:this.input,className:n,forwards:!0,duration:s,onTransitionEnd:()=>{this.input.classList.remove(n)}})}updateInnerHTML(e=this.input.innerHTML){e=e.replace(//,"").replace(/().+?\/custom-emoji-element>/g,"$1"),ba.Y&&(e=e.replace(wa,"")),this.inputFake.innerHTML=e}setValueSilently(e,t){super.setValueSilently(e,t),this.updateInnerHTML(),t||this.onFakeInput()}}var Ca=i(9041);function Ea(e){const t={};e.forEach((e=>t[e]=!1));const i=window.getSelection();if(!i.isCollapsed){const s=i.getRangeAt(0),n=s.commonAncestorContainer,a=document.createTreeWalker((n.nodeType===n.ELEMENT_NODE?n:n.parentElement).closest('[contenteditable="true"]'),NodeFilter.SHOW_ELEMENT,{acceptNode:e=>s.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let o;for(;o=a.nextNode();)for(const i of e){if(t[i])continue;const e=Ca.o[i];o.matches(e.match)&&(t[i]=!0)}}return t}var La=i(6034),Ia=i(8794),Ma=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Pa="Posting media content isn't allowed in this group.";class Za{constructor(e,t,i){this.chat=e,this.appImManager=t,this.managers=i,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&(0,ye.Z)(e),this.recordCanceled=!0,this.recorder.stop(),Xs.Z.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>Ma(this,void 0,void 0,(function*(){const{peerId:i}=this.chat,s=this.chat.bubbles.getMiddleware(),n=d.Z.myId!==i&&i.isUser()&&(yield this.managers.appUsersManager.isUserOnlineVisible(i));new An(t,(t=>{s()&&(t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout((()=>{s()&&(w.Z.getPopups(M.Z).forEach((e=>e.hide())),this.appImManager.openScheduled(i))}),0))}),n).show()})),this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,i)=>{(0,ye.Z)(e);let s=this.messageInput.innerHTML;if(s&&s!==i){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const i=this.messageInput.innerHTML;if(s===i){if(++e>2)break}else e=0;s=i}while(s!==i);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace",KeyP:"spoiler"};this.appImManager.markupTooltip&&(t.KeyK="link");const i=e.code,s=t[i];if(!Ps(document.getSelection())&&s&&("KeyK"===i?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(s),(0,ye.Z)(e)),"KeyZ"===i){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:i,entities:s,caretPos:n}=(0,sn.Z)(this.messageInputField.input),a=(0,ha.Z)(i,s,!0),o=(0,la.Z)(s,(0,ca.Z)(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=(!(null===(t=this.editMessage)||void 0===t?void 0:t.media)||"messageMediaWebPage"===this.editMessage.media._)&&o.filter((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._));if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=i.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=this.managers.appWebPagesManager.getWebPage(t).then((i=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===i._?(this.setTopInfo("webpage",(()=>{}),i.site_name||i.title||"Webpage",i.description||i.url||""),delete this.noWebPage,this.willSendWebPage=i):this.willSendWebPage&&this.onHelperCancel())}))}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(i.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"},void 0,this.chat.threadId)),this.botCommands&&this.botCommands.toggle(!0)}else this.lastTimeType&&this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"},void 0,this.chat.threadId),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide(),document.activeElement===this.messageInput&&setTimeout((()=>{document.activeElement===this.messageInput&&this.resetCurrentFontFormatting()}),0);this.botCommands&&this.updateBotCommandsToggle(),this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(i,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{const i=e.docId?{_:"messageEntityCustomEmoji",document_id:e.docId,length:e.emoji.length,offset:0}:(0,da.Z)(e.emoji);this.insertAtCaret(e.emoji,i,t)},this.onBtnSendClick=e=>Ma(this,void 0,void 0,(function*(){if((0,ye.Z)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{const e=this.chat.peerId.isAnyChat();if(e&&!(yield this.chat.canSend("send_media")))return void(0,ge.Am)(Pa);this.chatInput.classList.add("is-locked"),(0,Fn.Z)();let t=!1;if(!e){const e=yield this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());(null==e?void 0:e.pFlags.voice_messages_forbidden)&&((0,ge.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Nt.Z)({peerId:this.chat.peerId})]}),t=!0)}if(t)return void this.chatInput.classList.remove("is-locked");this.recorder.start().then((()=>{this.releaseMediaPlayback=na.Z.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),Xs.Z.setKeepAlive(!0);const e=()=>{new Ls.Z("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{(0,S.tH)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",(t=>{(0,pe.Z)(t.target,"chat-input")||(0,pe.Z)(t.target,"popup-cancel-record")||((0,ye.Z)(t),e())}),{capture:!0,passive:!1}),Ln.Z.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout((()=>{e()}),0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,i=t.context.createAnalyser();t.connect(i),i.fftSize=32;const s=new Uint8Array(i.frequencyBinCount),n=255*s.length,a=()=>{if(!this.recording)return;i.getByteFrequencyData(s);let e=0;s.forEach((t=>{e+=t}));const t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;const o=Date.now()-this.recordStartTime,r=o%1e3,d=(0,Qi.Z)(o/1e3)+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=d,(0,ce.T2)(a)};a()})).catch((e=>{switch(e.name){case"NotAllowedError":(0,ge.Am)("Please allow access to your microphone");break;case"NotReadableError":(0,ge.Am)(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),(0,ge.Am)(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")}))}})),this.onHelperCancel=(e,t)=>Ma(this,void 0,void 0,(function*(){if(e&&(0,ye.Z)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(yield 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=this.getCurrentInputAsDraft();if(t&&delete t.pFlags.no_webpage,!(0,La.Z)(t,Object.assign(Object.assign({},e),{_:"draftMessage"})))return void new Ls.Z("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()})),this.onHelperClick=e=>{if((0,ye.Z)(e),(0,pe.Z)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&c.Z&&!e.container.classList.contains("active")&>.Z.openBtnMenu(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new oe.Z}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input","hide"),this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapperWrapper=document.createElement("div"),this.rowsWrapperWrapper.classList.add("rows-wrapper-wrapper"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper"),this.rowsWrapperWrapper.append(this.rowsWrapper);const e=Ss();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const i=this.fakeSelectionWrapper=document.createElement("div");i.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,i),this.chatInput.append(this.inputContainer),this.goDownBtn=(0,_n.Z)({icon:"arrow_down",className:"bubbles-corner-button chat-secondary-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),(0,S.fc)(this.goDownBtn,(e=>{(0,ye.Z)(e),this.chat.bubbles.onGoDownClick()}),{listenerSetter:this.listenerSetter});const s=this.controlContainer=document.createElement("div");s.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(s)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=(0,Zn.Z)(""),this.replyElements.cancelBtn=(0,Zn.Z)("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(s=!0,this.canToggleHideAuthor()),t=()=>{s=!1},i=this.forwardElements={};let s=!1;const n=[i.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new Dt.Z({checked:!0})},i.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new Dt.Z({checked:!1})},i.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new Dt.Z({checked:!0})},i.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new Dt.Z({checked:!1})},i.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],a=i.container=(0,Cs.b)({buttons:n,listenerSetter:this.listenerSetter}),o=Array.from(a.children);[{elements:o.slice(0,2),onChange:(e,t)=>{const n=!!+e;s&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=C.ZP.weakMap.get(e),s=i.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=s,t.update()}}},{elements:o.slice(2,4),onChange:e=>{const t=!!+e;let s;s=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?i.hideSender:i.showSender:t?i.showSender:i.hideSender,s.checkboxField.checked=!0}}].forEach((e=>{const t=(0,aa.Z)(e.elements.map((e=>({container:e,input:e.querySelector("input")}))),e.onChange),i=document.createElement("hr");t.append(i),a.append(t)})),a.append(i.changePeer.element),c.Z||(this.forwardHover=new $n.Z({element:a})),i.modifyArgs=n.slice(0,-1),this.replyElements.container.append(a),i.modifyArgs.forEach(((e,t)=>{const{input:i}=e.checkboxField;i.type="radio",i.name=t<2?"author":"caption",i.value=""+ +!(t%2)})),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.btnToggleEmoticons=(0,Zn.Z)("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=(0,_n.Z)({icon:"mention",className:"bubbles-corner-button chat-secondary-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),(0,S.fc)(this.goMentionBtn,(e=>{(0,ye.Z)(e);const t=this.chat.bubbles.getMiddleware();this.managers.appMessagesManager.goToNextMention(this.chat.peerId,this.chat.threadId).then((e=>{t()&&e&&this.chat.setMessageId(e)}))}),{listenerSetter:this.listenerSetter}),this.btnScheduled=(0,Zn.Z)("scheduled btn-scheduled float hide",{noRipple:!0}),(0,S.fc)(this.btnScheduled,(e=>{this.appImManager.openScheduled(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("scheduled_new",(({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e})=>{this.chat.peerId===e&&this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((e=>{this.btnScheduled.classList.toggle("hide",!e.length)}))})),this.btnToggleReplyMarkup=(0,Zn.Z)("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new Qn({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,managers:this.managers,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",(()=>this.btnToggleReplyMarkup.classList.add("active"))),this.listenerSetter.add(this.replyKeyboard)("close",(()=>this.btnToggleReplyMarkup.classList.remove("active"))),this.botCommands=new oa(this.rowsWrapper,this,this.managers),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const r=document.createElement("div");r.classList.add("new-message-bot-commands-icon-scale");const l=this.botCommandsIcon=document.createElement("div");l.classList.add("animated-menu-icon","animated-menu-close-icon"),r.append(l),this.botCommandsToggle.append(r),(0,S.fc)(this.botCommandsToggle,(e=>{(0,ye.Z)(e),l.classList.contains("state-back")?(this.botCommands.toggle(!0),l.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),l.classList.add("state-back"))}),{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",(()=>{l.classList.add("state-back")})),this.botCommands.addEventListener("hiding",(()=>{l.classList.remove("state-back")})),this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...ln.Z].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"poll",text:"Poll",onClick:()=>{w.Z.createPopup(an,this.chat).show()},verify:()=>(this.chat.peerId.isAnyChat()||this.chat.isBot)&&this.chat.canSend("send_polls")}];const h=this.attachMenuButtons.slice();this.attachMenu=(0,kn.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,direction:"top-left",buttons:this.attachMenuButtons,onOpenBefore:()=>Ma(this,void 0,void 0,(function*(){const e=yield this.managers.appAttachMenuBotsManager.getAttachMenuBots(),t=h.slice(),i=e.filter((e=>!e.pFlags.inactive)).map((e=>{const t=(0,Ia.Z)(e);return{regularText:(0,R.Z)(e.short_name),onClick:()=>{this.managers.appAttachMenuBotsManager.requestWebView(Object.assign({botId:e.bot_id,peerId:this.chat.peerId},this.chat.getMessageSendingParams())).then((t=>{const i=["allow-scripts","allow-same-origin","allow-popups","allow-forms","allow-modals","allow-storage-access-by-user-activation"].join(" ");class s extends w.Z{constructor(t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,titleRaw:e.short_name}),this.url=t,this.d()}destroy(){return this.telegramWebView.destroy(),super.destroy()}d(){const e=this.telegramWebView=new fi({url:this.url,sandbox:i});e.iframe.classList.add("payment-verification"),this.body.append(e.iframe),this.show(),e.onMount()}}new s(t.url)}))},iconDoc:null==t?void 0:t.icon,verify:()=>Ma(this,void 0,void 0,(function*(){let t=!1;const i={attachMenuPeerTypeSameBotPM:()=>this.chat.peerId.toUserId()===e.bot_id,attachMenuPeerTypeBotPM:()=>this.chat.isBot,attachMenuPeerTypePM:()=>this.chat.peerId.isUser(),attachMenuPeerTypeChat:()=>this.chat.isAnyGroup,attachMenuPeerTypeBroadcast:()=>this.chat.isBroadcast};for(const s of e.peer_types){const e=i[s._];if(t=yield e(),t)break}return t}))}}));t.splice(t.length,0,...i),this.attachMenuButtons.splice(0,this.attachMenuButtons.length,...t)}))}),this.attachMenu.classList.add("attach-file","tgico-attach"),this.attachMenu.classList.remove("tgico-more"),this.recordTimeEl=document.createElement("div"),this.recordTimeEl.classList.add("record-time"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.multiple=!0,this.fileInput.style.display="none",this.newMessageWrapper.append(...[this.botCommandsToggle,this.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new jn,this.stickersHelper=new Pn(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.emojiHelper=new Nn(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.commandsHelper=new zn(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.mentionsHelper=new Kn(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.inlineHelper=new ia(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=(0,Zn.Z)("binfilled btn-circle btn-record-cancel chat-secondary-button"),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=(0,Zn.Z)("none btn-circle btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),this.sendMenu=new en({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!("scheduled"===this.chat.type||this.isInputEmpty()&&!Object.keys(this.forwarding).length)}),this.btnSendContainer.append(this.sendMenu.sendMenu),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),bt.ZP.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(bt.ZP)("open",this.onEmoticonsOpen),this.listenerSetter.add(bt.ZP)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(d.Z)("settings_updated",(()=>{var e;(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),null===(e=this.messageInputField)||void 0===e||e.onFakeInput()})),this.listenerSetter.add(d.Z)("draft_updated",(({peerId:e,threadId:t,draft:i,force:s})=>{this.chat.threadId===t&&this.chat.peerId===e&&"scheduled"!==this.chat.type&&this.setDraft(i,!0,s)})),this.listenerSetter.add(this.appImManager)("peer_changing",(e=>{this.chat!==e||"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.saveDraft()})),this.listenerSetter.add(this.appImManager)("chat_changing",(({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e,mids:t})=>{"scheduled"===this.chat.type&&this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{this.chat.peerId===e&&"scheduled"!==this.chat.type&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{!e.has(this.chat.peerId)||"chat"!==this.chat.type&&"discussion"!==this.chat.type||(this.startParam===m.gZ?this.setStartParam():this.center(!0))}));try{this.recorder=new(Js())({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=>{const t=e.target.files;t.length&&(w.Z.createPopup(vn,this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")}),!1),(0,S.fc)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&((0,S.fc)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.setRecording(!1),this.chatInput.classList.remove("is-locked"),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(Ln.Z.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:i}=this.chat,s=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});Xs.Z.decode(e,!0).then((e=>{Xs.Z.setKeepAlive(!1),this.managers.appMessagesManager.sendFile(t,a,{isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:s,threadId:i,clearDraft:!0}),this.onMessageSent(!1,!0)}))}),(0,S.fc)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),(0,S.fc)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=(0,Ie.Z)((()=>this.saveDraft()),2500,!1,!0),this.botStartBtn=(0,Be.Z)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append((0,C.ag)("BotStart")),(0,S.fc)(this.botStartBtn,(()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=(0,_t.Z)([this.botStartBtn],!0),i=this.chat.peerId,s=this.chat.bubbles.getMiddleware((()=>this.chat.peerId===i&&this.startParam===e&&this.toggleBotStartBtnDisability===t));this.managers.appMessagesManager.startBot(i.toUserId(),void 0,e).then((()=>{s()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())}))}),{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn),this.pinnedControlBtn=(0,Be.Z)("btn-primary btn-transparent text-bold chat-input-control-button",{icon:"unpin"}),this.controlContainer.append(this.pinnedControlBtn),this.listenerSetter.add(this.pinnedControlBtn)("click",(()=>{const e=this.chat.peerId;new Is(e,0,!0,(()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}))}))}_center(e,t){if(!e&&!this.inputContainer.classList.contains("is-centering"))return;if(e===this.fakeWrapperTo)return;const i=e||this.fakeWrapperTo,s=!!e,n=this.fakeWrapperTo;let a,o="",r="";const d=i.getBoundingClientRect(),l=this.fakeRowsWrapper.getBoundingClientRect(),c=l.width,h=d.width;if(c!==h){const e=h/c,t=(c-h)/2;if(a=d.left-l.left-t,s&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=16;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=e;const u=t?200:0;return(0,xe.Z)({element:this.inputContainer,className:"is-centering",forwards:s,duration:u}),(0,xe.Z)({element:this.rowsWrapperWrapper,className:"is-centering-to-control",forwards:!!(s&&e&&e.classList.contains("chat-input-control")),duration:u}),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(e&&e.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:c,widthTo:h}}center(e=!1){return Ma(this,void 0,void 0,(function*(){return this._center(yield this.getNeededFakeContainer(),e)}))}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}getNeededFakeContainer(e=this.startParam){return Ma(this,void 0,void 0,(function*(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==e||!(yield this.chat.canSend())||"pinned"===this.chat.type||(yield this.chat.isStartButtonNeeded())?this.controlContainer:void 0}))}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){return Ma(this,void 0,void 0,(function*(){if(!this.goDownUnreadBadge)return;const e=yield this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId,"discussion"===this.chat.type?void 0:this.chat.threadId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.chat.peerId,respectType:!0,threadId:this.chat.threadId})),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)}}))}getCurrentInputAsDraft(){const{value:e,entities:t}=(0,sn.Z)(this.messageInputField.input,!0,!1);let i;return(e.length||this.replyToMsgId)&&(i={_:"draftMessage",date:(0,Ft.Z)(!0),message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),i}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const e=this.getCurrentInputAsDraft();this.managers.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,e)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.classList.add("hide"),this.goDownBtn.classList.add("hide")),(0,Dn.Z)(),this.lastTimeType=0,this.startParam=void 0,this.toggleBotStartBtnDisability&&(this.toggleBotStartBtnDisability(),this.toggleBotStartBtnDisability=void 0),this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,i=!1){return Ma(this,void 0,void 0,(function*(){if(!i&&!(0,tn.Z)(this.messageInput)||"scheduled"===this.chat.type)return!1;if(!e&&!(e=yield this.managers.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId)))return i&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then((()=>{(0,ce.T2)((()=>{this.onMessageSent()}))}))),!1;const s=function(e,t,i){const s=(0,ca.Z)(e.message),n=e.entities||[],a=(0,la.Z)(n.slice(),s);return(0,ua.Z)(e.message,{entities:a,wrappingForPeerId:t,loadPromises:void 0})}(e,this.chat.peerId),n=this.getCurrentInputAsDraft();return!((0,La.Z)(e,n)&&this.replyToMsgId===e.reply_to_msg_id||(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(s,t,t),0))}))}createSendAs(){if(this.sendAsPeerId=void 0,"chat"===this.chat.type||"discussion"===this.chat.type){let e=!0;this.sendAs=new va(this.managers,((e,t)=>{let i=0;e.parentElement||(this.newMessageWrapper.prepend(e),i=2),this.updateOffset("as",!0,t,i)}),(t=>{this.sendAsPeerId=t,e?e=!1:this.getPlaceholderKey().then((e=>{this.updateMessageInputPlaceholder(e)}))}))}else this.sendAs=void 0;return this.sendAs}finishPeerChange(e){return Ma(this,void 0,void 0,(function*(){const t=this.chat.peerId,{forwardElements:i,btnScheduled:s,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,botCommandsToggle:d}=this,l=this.sendAs,c=this.createSendAs(),[h,u,f,p,m,g,v,b,y]=yield Promise.all([this.managers.appPeersManager.isBroadcast(t),this.managers.appPeersManager.canPinMessage(t),this.managers.appPeersManager.isBot(t),this.chat.canSend(),this.getNeededFakeContainer(e),pa(this.managers.acknowledged.appProfileManager.getProfileByPeerId(t)),s?pa(this.managers.acknowledged.appMessagesManager.getScheduledMessages(t)):void 0,c?(c.setPeerId(this.chat.peerId),c.updateManual(!0)):void 0,this.filterAttachMenuButtons()]),w=this.messageInput?yield this.getPlaceholderKey():void 0;return()=>{var c;if(r.classList.remove("hide"),o.classList.toggle("is-broadcast",h),o.classList.remove("hide"),null===(c=this.messageInputField)||void 0===c||c.onFakeInput(),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",u),i&&(this.forwardWasDroppingAuthor=!1,i.showCaption.checkboxField.setValueSilently(!0),i.showSender.checkboxField.setValueSilently(!0)),s&&v){s.classList.add("hide");const e=this.chat.bubbles.getMiddleware();(0,je.Z)(v.result,(t=>{e()&&t&&s.classList.toggle("hide",!t.length)}))}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),d&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),d.remove(),f)){const e=this.chat.bubbles.getMiddleware(),t=g.result;(0,je.Z)(t,(i=>{e()&&this.updateBotCommands(i,!(t instanceof Promise))}))}l&&l.destroy(),b&&b(),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput&&(this.updateMessageInput(p,w,y),this.messageInput.dataset.peerId=""+t),this.pinnedControlBtn&&(this.pinnedControlBtn.classList.toggle("hide","pinned"!==this.chat.type),this.pinnedControlBtn.replaceChildren((0,C.ag)(u?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow"))),this.botStartBtn.classList.toggle("hide","pinned"===this.chat.type),this.startParam=e,this._center(m,!1)}}))}updateOffset(e,t,i,s){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,(0,xe.Z)({element:this.newMessageWrapper,className:"has-offset",forwards:t,duration:i?0:300,useRafs:s})}updateBotCommands(e,t){var i,s;this.hasBotCommands=!!(null===(s=null===(i=e.bot_info)||void 0===i?void 0:i.commands)||void 0===s?void 0:s.length),this.updateBotCommandsToggle(t)}updateBotCommandsToggle(e){const{botCommandsToggle:t,hasBotCommands:i}=this,s=!!i&&this.isInputEmpty();if(!i){if(!t.parentElement)return;t.remove()}const n=s,a=t.parentElement?0:2;t.parentElement||this.newMessageWrapper.prepend(t),this.updateOffset("commands",n,e,a)}getPlaceholderKey(){return Ma(this,void 0,void 0,(function*(){const{peerId:e,threadId:t,isForum:i}=this.chat;let s;return s=t&&!i?"Comment":(yield this.managers.appPeersManager.isBroadcast(e))?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==d.Z.myId||(yield this.managers.appMessagesManager.isAnonymousSending(e))?"SendAnonymously":"Message",s}))}updateMessageInputPlaceholder(e){const t=C.ZP.weakMap.get(this.messageInput);t&&t.compareAndUpdate({key:e})}filterAttachMenuButtons(){if(this.attachMenuButtons)return(0,Ks.Z)(this.attachMenuButtons,(e=>e.verify()))}updateMessageInput(e,t,i){const{chatInput:s,attachMenu:n,messageInput:a}=this,{peerId:o,threadId:r}=this.chat;s.classList.contains("is-hidden")!==!e&&(s.classList.add("no-transition"),s.classList.toggle("is-hidden",!e),s.offsetLeft,s.classList.remove("no-transition")),this.updateMessageInputPlaceholder(t),e?(a.contentEditable="true",this.setDraft(void 0,!1),a.innerHTML||this.messageInputField.onFakeInput()):a.contentEditable="inherit",n&&(n.toggleAttribute("disabled",!i.length),n.classList.toggle("btn-disabled",!i.length)),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new Sa({placeholder:"Message",name:"message",withLinebreaks:!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(),sa.T&&(0,sa.Z)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",(e=>{const t=e.key;if((0,Rn.Z)(e))(0,ye.Z)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else(0,xt.Z)(this.messageInput)})),c.Z&&(0,S.fc)(this.messageInput,(e=>{if(bt.ZP.isActive())return bt.ZP.toggle(!1),(0,Fn.Z)(),void(0,ye.Z)(e);this.appImManager.selectTab(1)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",(()=>{this.checkAutocomplete()})),"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.listenerSetter.add(this.messageInput)("focusin",(()=>{this.chat.bubbles.scrollable.loadedAll.bottom&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)}))}applyMarkdown(e,t){const i={link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null)},s=e=>{i[e]=()=>{const t=(n.includes(e)?n:[e]).filter((e=>l[e]));return(0,h.Z)(t,e)||t.push(e),t.length?document.execCommand("fontName",!1,"markup-"+t.join("-")):this.resetCurrentFontFormatting()}},n=["bold","italic","underline","strikethrough","spoiler"];if(n.forEach((e=>{s(e)})),s("monospace"),!i[e])return!1;const a=i[e],o=[],r=ba.Z.getInstance().prepareApplyingMarkdown(),d=this.listenerSetter.add(this.messageInput)("input",ye.Z,{capture:!0,passive:!1});o.push(document.execCommand("styleWithCSS",!1,"true"));const l=Ea(Object.keys(i));return l.monospace&&"link"===e&&o.push(this.resetCurrentFormatting()),o.push("function"==typeof a?a():document.execCommand(a,!1,null)),o.push(document.execCommand("styleWithCSS",!1,"false")),r(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),this.listenerSetter.remove(d),this.messageInputField.simulateInputEvent(),!0}resetCurrentFormatting(){return document.execCommand("removeFormat",!1,null)}resetCurrentFontFormatting(){return document.execCommand("fontName",!1,"Roboto")}insertAtCaret(e,t,i=!0){ba.Z.getInstance().makeFocused(this.messageInput);const{value:s,caretPos:n,entities:a}=(0,sn.Z)(this.messageInput),o=n>=0?n:s.length,r=s.substr(0,o),d=(s.substr(o),i?r.match(Za.AUTO_COMPLETE_REG_EXP):null),l=d?d.index+(d[0].length-d[2].length):r.length;if(r.slice(0,l),i&&-1!==n){const e=d[2],t=document.getSelection();let i=0;for(;t.toString()!==e;){if(++i>=1e4)throw new Error("lolwhat");t.modify("extend","backward","character")}}(0,E.rf)(this.messageInput,e,t?[t]:void 0,this.chat.peerId)}checkAutocomplete(e,t,i){return Ma(this,void 0,void 0,(function*(){if(void 0===e){const s=(0,sn.Z)(this.messageInputField.input,!0,!0);e=s.value,t=s.caretPos,i=s.entities}if(-1===t&&(t=e.length),void 0===i){const t=(0,ha.Z)(e,i,!0);i=(0,la.Z)(i,(0,ca.Z)(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const s=e.match(Za.AUTO_COMPLETE_REG_EXP);let n;if(s){const t=i[0];let a=s[2];const o=a[0];if(this.stickersHelper&&d.Z.settings.stickers.suggest&&(yield 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("@"===o){const e=this.chat.threadId?(0,ht.Z)(this.chat.threadId):void 0;(yield this.mentionsHelper.checkQuery(a,this.chat.peerId.isUser()?m.NM:this.chat.peerId,e))&&(n=this.mentionsHelper)}else s[1]||"/"!==o?d.Z.settings.emoji.suggest&&(a=a.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!a||(n=this.emojiHelper,this.emojiHelper.checkQuery(a,o))):(yield this.commandsHelper.checkQuery(a,this.chat.peerId))&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}))}checkInlineAutocomplete(e,t){let i=!1;const s=e=>{this.btnPreloader&&(0,xe.Z)({element:this.btnPreloader,className:"show",forwards:e,duration:400})};if(!t){const n=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(n){const a=n[1],o=e.slice(n[0].length);i=n[0].length===e.length,t=this.inlineHelper,this.btnPreloader?s(!0):(this.btnPreloader=(0,Zn.Z)("none btn-preloader float show disable-hover",{noRipple:!0}),(0,Rt.y)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,a,o).then((({user:e,renderPromise:t})=>{i&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then((()=>{s(!1)}))})).catch((e=>{s(!1)}))}}return i||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&s(!1),t}setRecording(e){this.recording!==e&&((0,xe.Z)({element:this.chatInput,className:"is-recording",forwards:e,duration:200}),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=(0,ra.Z)(this.forwarding),t=this.helperFunc;this.clearHelper(),this.updateSendBtn();let i=!1;new I.Z(e,(()=>{i=!0})).addEventListener("close",(()=>{this.helperWaitingForward=!1,i||t()}))}clearInput(e=!0,t=!0,i=""){return Ma(this,void 0,void 0,(function*(){if(document.activeElement===this.messageInput&&T.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),(0,Wn.Z)(e),this.messageInputField.setValueSilently(i),(0,Wn.Z)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(i);c.Z||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let s=!1;e&&(s=yield this.setDraft(void 0,!1)),!s&&t&&this.onMessageInput()}))}isInputEmpty(){return(0,tn.Z)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach((t=>{this.btnSend.classList.toggle(t,e===t)})),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t&&"scheduled"!==this.chat.type),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t&&"scheduled"!==this.chat.type)}getValueAndEntities(e){const{entities:t,value:i}=(0,sn.Z)(this.messageInput,!0,!1),s=(0,ca.Z)(i);return{value:i,totalEntities:(0,la.Z)(t,s)}}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const{totalEntities:i}=this.getValueAndEntities(this.messageInput);let s=0;i.filter((e=>{if("messageEntityEmoji"===e._||"messageEntityCustomEmoji"===e._){const t=e.offset+e.length;return!(t<=s||(s=t,0))}return!1})).forEach((e=>{const t="messageEntityEmoji"===e._?{emoji:(0,Ts.zu)(e.unicode)}:{docId:e.document_id,emoji:""};this.managers.appEmojiManager.pushRecentEmoji(t)})),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:i}=this;if("scheduled"===i.type&&!e&&!t)return void this.scheduleSending();const{peerId:s}=i,{noWebPage:n}=this,a=this.chat.getMessageSendingParams(),{value:o,entities:r}=(0,sn.Z)(this.messageInputField.input,!0,!1);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new Es.Z(s,[t],i.type);this.managers.appMessagesManager.editMessage(e,o,{entities:r,noWebPage:n}),this.onMessageSent()}else o.trim()&&(this.managers.appMessagesManager.sendText(s,o,Object.assign(Object.assign({entities:r},a),{noWebPage:n,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,clearDraft:!0})),"scheduled"===this.chat.type?this.onMessageSent(!0):this.onMessageSent(!1,!1));if(this.forwarding){const e=(0,ra.Z)(this.forwarding);for(const t in e)this.managers.appMessagesManager.forwardMessages(s,t.toPeerId(),e[t],Object.assign(Object.assign({},a),{dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()})).catch((e=>Ma(this,void 0,void 0,(function*(){"VOICE_MESSAGES_FORBIDDEN"===e.type&&(0,ge.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Nt.Z)({peerId:s})]})}))));o||this.onMessageSent()}}sendMessageWithDocument(e,t=!1,i=!1,s=!1){return Ma(this,void 0,void 0,(function*(){const n="sticker"===(e=yield this.managers.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!(yield this.chat.canSend(n))?((0,ge.Am)(Pa),!1):"scheduled"!==this.chat.type||t?!(!e||e.sticker&&(0,Di.Z)(e)&&!d.Z.premium||(this.managers.appMessagesManager.sendFile(this.chat.peerId,e,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{isMedia:!0,clearDraft:i||void 0,silent:s})),this.onMessageSent(i,!0),"sticker"===e.type&&this.managers.appStickersManager.saveRecentSticker(e.id),0)):(this.scheduleSending((()=>this.sendMessageWithDocument(e,!0,i,s))),!1)}))}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||(0,me.Z)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){return Ma(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);let i=(0,ua.Z)(t.message,{entities:t.totalEntities,wrappingForPeerId:this.chat.peerId});const s=()=>Ma(this,void 0,void 0,(function*(){const n=yield(0,G.Z)({message:t,usingMids:[t.mid]});this.setTopInfo("edit",s,(0,C.ag)("AccDescrEditing"),n,i,t),this.editMsgId=e,this.editMessage=t,i=void 0}));s()}))}initMessagesForward(e){const t=()=>Ma(this,void 0,void 0,(function*(){const i=Object.keys(e).map((e=>e.toPeerId())),s=new Set;let n=0,a=0;const o=i.map((t=>Ma(this,void 0,void 0,(function*(){const i=e[t],o=i.map((e=>Ma(this,void 0,void 0,(function*(){var i;const n=yield this.managers.appMessagesManager.getMessageByPeer(t,e);!(null===(i=n.fwd_from)||void 0===i?void 0:i.from_name)||n.fromId||n.fwdFromId?s.add("P"+n.fromId):s.add("N"+n.fwd_from.from_name),n.media&&n.message&&++a}))));yield Promise.all(o),n+=i.length}))));yield Promise.all(o);const r=s.size>2,l=[...s].map((e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===d.Z.myId?(0,C.ag)("Chat.Accessory.Forward.You"):new B.Z({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e})),{forwardElements:c}=this;(0,me.Z)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!a);const h=c.hideCaption.checkboxField.checked;a&&h?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const u=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",f=(0,C.ag)(u,[n]),p=document.createDocumentFragment();let m,g;if(l.length<3?p.append(...(0,C.v_)(l,!1)):p.append(l[0],(0,C.ag)("AndOther",[l.length-1])),1===i.length){const t=i[0],s=e[t];if(m=yield this.managers.appMessagesManager.getMessageByPeer(t,s[0]),g=!!m.grouped_id,g){const e=yield this.managers.appMessagesManager.getMidsByMessage(m);(e.length!==n||e.find((e=>!s.includes(e))))&&(g=!1)}}const v=document.createDocumentFragment();if(g||1===n){const t=e[i[0]],s=yield(0,G.Z)({message:m,usingMids:t});v.append(p,": ",s)}else v.append((0,C.ag)("Chat.Accessory.Forward.From"),": ",p);const b=this.setTopInfo("forward",t,f,v);c.modifyArgs.forEach(((e,t)=>{const s=e.textElement,n=C.ZP.weakMap.get(s);n.args=[t<2?i.length:a],n.update()})),this.forwardHover&&this.forwardHover.attachButtonListener(b,this.listenerSetter),this.forwarding=e}));t()}initMessageReply(e){return Ma(this,void 0,void 0,(function*(){if(this.replyToMsgId===e)return;let t=yield this.chat.getMessage(e);const i=()=>{let s;t?s=new B.Z({peerId:t.fromId,dialog:!1}).element:(s=(0,C.ag)("Loading"),this.managers.appMessagesManager.reloadMessages(this.chat.peerId,e).then((s=>{this.replyToMsgId===e&&(t=s,t?i():this.clearHelper("reply"))}))),this.setTopInfo("reply",i,s,t&&t.message,void 0,t),this.replyToMsgId=e};i()}))}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.replyToMsgId=void 0,this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(Ln.Z.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){const e="is-toggling-helper";(0,xe.Z)({element:this.chat.container,className:e,forwards:!0,duration:150,onTransitionEnd:()=>{this.chat.container.classList.remove(e)}})}setInputValue(e,t=!0,i=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),(0,ce.T2)((()=>{i&&(0,xt.Z)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight}))}setTopInfo(e,t,i="",s="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,d=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=(0,Zn.Z)(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const{container:l}=J(i,s,this.chat.animationGroup,a);return d?r.replaceWith(l):o.insertBefore(l,o.lastElementChild),"webpage"===e&&(l.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),T.IS_MOBILE||Ln.Z.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout((()=>{this.updateSendBtn()}),0),l}}Za.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;var ka=i(6054);const Ta="pinned-container";class xa{constructor(e){this.floating=!1,(0,In.Z)(this,e);const{divAndCaption:t,className:i}=this;t.container.classList.add(Ta,"hide"),t.title.classList.add(Ta+"-title"),t.subtitle.classList.add(Ta+"-subtitle"),t.content.classList.add(Ta+"-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add(Ta+"-close",`pinned-${i}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add(Ta+"-wrapper"),(0,x.Z)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add(Ta+"-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){(0,S.fc)(e,(e=>{(0,ye.Z)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then((e=>{e&&this.toggle(!0)}))}),{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const i=(this.floating||o.Z.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",i),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",i),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}isVisible(){return!this.divAndCaption.container.classList.contains("hide")}isFloating(){return this.divAndCaption.container.classList.contains("is-floating")}fill(e,t,i){this.divAndCaption.container.dataset.peerId=""+i.peerId,this.divAndCaption.container.dataset.mid=""+i.mid,this.divAndCaption.fill(e,t,i),this.topbar.setUtilsWidth()}}var Aa,_a=i(7207),Fa=i(8427);class Da extends xa{constructor(e,t,i){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new j("pinned-audio",((e,t)=>{(0,U.Z)(this.divAndCaption.title,e),(0,U.Z)(this.divAndCaption.subtitle,t)})),onClose:()=>{na.Z.stop()},floating:!0}),this.topbar=e,this.chat=t,this.managers=i,this.onPlaybackParams=e=>{this.fasterEl.classList.toggle("active",e.playbackRate>1),this.repeatEl.classList.remove("tgico-audio_repeat","tgico-audio_repeat_single"),this.repeatEl.classList.add(e.loop?"tgico-audio_repeat_single":"tgico-audio_repeat"),this.repeatEl.classList.toggle("active",e.loop||e.round)},this.onPause=()=>{this.toggleEl.classList.remove("flip-icon")},this.onStop=()=>{this.toggle(!0)},this.onMediaPlay=({doc:e,message:t,media:i,playbackParams:s})=>{var n,a;let o,r;const d="voice"!==e.type&&"round"!==e.type;if(d){const t=e.attributes.find((e=>"documentAttributeAudio"===e._));o=(0,R.Z)(null!==(a=null==t?void 0:t.title)&&void 0!==a?a:e.file_name),r=(null==t?void 0:t.performer)?(0,R.Z)(t.performer):(0,C.ag)("AudioUnknownArtist")}else o=new B.Z({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,r=(0,A.OD)(t.date);this.fasterEl.classList.toggle("hide",d),this.repeatEl.classList.toggle("hide",!d),this.onPlaybackParams(s),this.volumeSelector.setVolume(),this.progressLine.setMedia(i),this.fill(o,r,t),this.toggleEl.classList.toggle("flip-icon",!i.paused),this.toggle(!1)},this.divAndCaption.border.remove();const s=(0,Zn.Z)("fast_rewind active",{noRipple:!0}),n=(0,Zn.Z)("fast_forward active",{noRipple:!0}),a=(e,t)=>{(0,S.fc)(e,(e=>{(0,ye.Z)(e),t()}),{listenerSetter:this.topbar.listenerSetter})};a(s,(()=>{na.Z.previous()})),a(n,(()=>{na.Z.next()})),this.toggleEl=(0,Zn.Z)("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),a(this.toggleEl,(()=>{na.Z.toggle()})),this.wrapper.prepend(this.wrapper.firstElementChild,s,this.toggleEl,n),this.volumeSelector=new Fa.Z(this.listenerSetter,!0);const o=document.createElement("div");o.classList.add("progress-line-container"),o.append(this.volumeSelector.container);const r=document.createElement("div");r.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(r),this.volumeSelector.btn.append(o),this.repeatEl=(0,Zn.Z)("audio_repeat",{noRipple:!0}),a(this.repeatEl,(()=>{const e=na.Z.getPlaybackParams();e.round?e.loop?(na.Z.round=!1,na.Z.loop=!1):na.Z.loop=!na.Z.loop:na.Z.round=!0}));const d=this.fasterEl=(0,Zn.Z)("playback_2x",{noRipple:!0});a(d,(()=>{na.Z.playbackRate=d.classList.contains("active")?1:1.75})),this.wrapperUtils.prepend(this.volumeSelector.btn,d,this.repeatEl);const l=document.createElement("div");l.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new _a.Z(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),l.append(this.progressLine.container),this.wrapper.insertBefore(l,this.wrapperUtils),this.topbar.listenerSetter.add(na.Z)("play",this.onMediaPlay),this.topbar.listenerSetter.add(na.Z)("pause",this.onPause),this.topbar.listenerSetter.add(na.Z)("stop",this.onStop),this.topbar.listenerSetter.add(na.Z)("playbackParams",this.onPlaybackParams);const c=na.Z.getPlayingDetails();c&&(this.onMediaPlay(c),this.onPlaybackParams(c.playbackParams))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}!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"}(Aa||(Aa={}));const Ra="pinned-message-border";class Ba{constructor(){this.drawRect=(e,t,i,s,n)=>`M${e},${t+n}a${n},${n},0,0,1,${i},0v${s-2*n}a${n},${n},0,0,1,${-i},0Z`,this.getClipPath=(e,t,i)=>{let s="";if(2===i)s=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let i;return e<=1?i=Aa.ONE:2===e?i=Aa.TWO:3===e?i=Aa.THREE:4===e?i=Aa.FOUR:e>3&&(i=Aa.MORE),i},this.getMarkHeight=(e,t)=>{let i;return e<=1?i=Aa.ONE:2===e?i=Aa.TWO:3===e?i=Aa.THREE:4===e?i=Aa.FOUR:e>3&&(i=Aa.MORE),i},this.getMarkTranslateY=(e,t,i)=>1===i?0:2===i?e?t+1:0:3===i?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,i,s)=>t<=4||e<=1?0:e>=t-2?s-Aa.ONE-i:(e-2)*i+1*e,this.getTrackHeight=(e,t)=>e<=3?Aa.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add(Ra),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className=Ra+"-wrapper-1",this.border.classList.remove(Ra+"-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const i=this.getBarHeight(e,t),s=this.getMarkHeight(e,t),n=this.getTrackHeight(e,i),a=`clipPath_${e}`,o=this.getClipPath(a,i,e),r=this.getMarkTranslateY(t,i,e),d=this.getTrackTranslateY(t,e,i,n);return this.border.classList.toggle(Ra+"-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=Ra+"-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${d}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(Ra+"-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${s}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var Na=i(6724),Oa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ua{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=Ua.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const i=document.createElement("div"),s=!Object.keys(this.rows).length&&!t;return i.className=Ua.BASE_CLASS+"-row"+(s?"":" is-hiding hide"),this.rows[e]={element:i,new:!0},this.container.append(i),i}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout((()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)}),Ua.DURATION)}setNewRow(e,t=!1){const i=this.rows[e];i.new&&(t?(i.element.classList.remove("hide"),i.element.offsetLeft):i.element.classList.remove("is-hiding","hide"),delete i.new),this.clearRows(e)}animate(e,t,i=e>t,s=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!s)return this.setNewRow(e);const o=["from-top","from-bottom"];i||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}Ua.DURATION=200,Ua.BASE_CLASS="animated-super";class Ha{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=Ha.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=Ha.BASE_CLASS+"-decimal";const i=document.createElement("div");i.className=Ha.BASE_CLASS+"-decimal-placeholder";const s=new Ua;return s.container.className=Ha.BASE_CLASS+"-decimal-wrapper",t.append(i,s.container),this.container.append(t),this.decimals[e]={container:t,placeholder:i,animatedSuper:s}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout((()=>{this.decimals.splice(t,this.decimals.length-t).forEach((e=>{e.container.remove()}))}),Ua.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach((t=>{const i=+t.placeholder.innerText||0;t.animatedSuper.getRow(Ha.EMPTY_INDEX,!0),t.animatedSuper.animate(Ha.EMPTY_INDEX,i,this.reverse?ethis.previousNumber,!0)})),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map((e=>+e));Array.from(""+e).map((e=>+e)).forEach(((i,s)=>{var n;const a=this.getDecimal(s),o=a.animatedSuper.getRow(i,!0),r=null!==(n=t[s])&&void 0!==n?n:Ha.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+i,a.animatedSuper.animate(i,r,this.reverse?ethis.previousNumber,!0)})),this.hideLeft(e),this.previousNumber=e}}Ha.EMPTY_INDEX=-1,Ha.BASE_CLASS="animated-counter";class za{constructor(e,t,i){this.topbar=e,this.chat=t,this.managers=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.listenerSetter=new oe.Z,this.log=(0,r.kg)("PM"),this.debug=!0,this.isStatic=!1;const s=new Y("pinned-message",t.animationGroup);this.pinnedMessageContainer=new xa({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:s,onClose:()=>Oa(this,void 0,void 0,(function*(){return(yield i.appPeersManager.canPinMessage(this.chat.peerId))?new Is(this.chat.peerId,this.pinnedMid,!0):new Is(this.chat.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new Ba,s.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new Ua,s.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new Ua,this.animatedMedia.container.classList.add("pinned-message-media-container"),s.content.prepend(this.animatedMedia.container),this.animatedCounter=new Ha(!0),s.title.append((0,C.ag)("PinnedMessage")," ",this.animatedCounter.container);const n=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(n),s.container.prepend(n),this.btnOpen=(0,Zn.Z)("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),(0,S.fc)(this.btnOpen,(e=>{(0,ye.Z)(e),this.topbar.openPinned(!0)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e})=>{e===this.chat.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))})),this.listenerSetter.add(d.Z)("peer_pinned_hidden",(({peerId:e})=>{e===this.chat.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)})),this.setPinnedMessage=(0,Ie.Z)((()=>this._setPinnedMessage()),100,!0,!0),this.setCorrectIndexThrottled=(0,Na.Z)(this.setCorrectIndex.bind(this),100,!1),this.isStatic=!this.chat.isPinnedMessagesNeeded()}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;const t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const i=t.dataset.mid;t&&void 0!==i&&this.testMid(+i,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let i=this.mids.findIndex((t=>t<=e));if(-1===i||this.isNeededMore(i)){if(!(this.loadedTop&&ei))return;this.pinnedIndex=i,this.pinnedMid=this.mids.find((t=>t<=e))||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>za.LOAD_COUNT&&(!this.loadedBottom&&e<=za.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=za.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return Oa(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{const i=this.debug?this.log.bindPrefix("getCurrentIndex"):void 0;i&&i("start",e,t);let s=!1;const n=[this.managers.appMessagesManager.getSearch({peerId:this.chat.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:za.LOAD_COUNT,backLimit:za.LOAD_COUNT,threadId:this.chat.threadId}).then((e=>(s=!0,e)))];if(!this.pinnedMaxMid){const e=this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId,this.chat.threadId).then((e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))}));n.push(e)}const a=(yield Promise.all(n))[0];let o=a.history.findIndex((t=>t.mid<=e));-1===o&&(o=a.history.length),this.offsetIndex=a.offset_id_offset?a.offset_id_offset-o:0,this.mids=a.history.map((e=>e.mid)).slice(),this.count=a.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,i&&i("result",e,a,o,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.log.error("getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new oe.Z,function(e,t,i,s){if(c.Z){let t;const n={passive:!0};s.add(e)("touchstart",(i=>{i.touches.length>1?o():(t=i.touches[0].clientY,s.add(e)("touchmove",a,n),s.add(e)("touchend",o,n))}),n);const a=e=>{const s=e.touches[0].clientY,n=s{s.removeManual(e,"touchmove",a,n),s.removeManual(e,"touchend",o,n)}}else s.add(e)("wheel",(e=>{const t=e.deltaY>0;!t||i()}),{passive:!0})}(this.chat.bubbles.scrollable.container,0,(()=>{this.unsetScrollDownListener()}),this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return Oa(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.log("handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield(0,le.e9)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.log("handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.log.error("handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return Oa(this,void 0,void 0,(function*(){(yield this.chat.getMessage(e))&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then((()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)})))}))}_setPinnedMessage(){return Oa(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,i=yield this.chat.getMessage(this.pinnedMid),s=0===t;this.animatedCounter.container.classList.toggle("is-last",s),s||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.log("setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],d=yield Q({title:void 0,titleEl:null,subtitle:i.message,subtitleEl:a,message:i,mediaEl:o,loadPromises:r,animationGroup:this.chat.animationGroup});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",d),this.animatedSubtitle.animate(t,this.wasPinnedIndex),d?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+i.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}za.LOAD_COUNT=50,za.LOAD_OFFSET=5;var ja=i(6194),Ga=i(2995),Va=i(4240),Ka=i(6818),Wa=i(3897),$a=i(7120),qa=i(2059),Qa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ya{constructor(e,t,i){this.chat=e,this.appSidebarRight=t,this.managers=i,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&(0,ye.Z)(e),(()=>{Qa(this,void 0,void 0,(function*(){const e=this.buttonsToVerify.concat(t?this.menuButtons:[]);(yield Promise.all(e.map((e=>Qa(this,void 0,void 0,(function*(){return{result:yield e.verify(),button:e}})))))).forEach((({button:e,result:t})=>{e.element.classList.toggle("hide",!t)}))}))})()},this.verifyVideoChatButton=e=>Qa(this,void 0,void 0,(function*(){var t;if(!Ka.Z||this.peerId.isUser()||"chat"!==this.chat.type||this.chat.threadId)return!1;const i=qa.ZP.groupCall,s=this.peerId.toChatId();if((null==i?void 0:i.chatId)===s)return!1;if(e&&((yield this.managers.appPeersManager.isBroadcast(this.peerId))&&"group"===e||(yield this.managers.appPeersManager.isAnyGroup(this.peerId))&&"broadcast"===e))return!1;const n=yield this.managers.appChatsManager.getChat(s);return(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)||(0,$a.Z)(n,"manage_call")})),this.verifyCallButton=e=>Qa(this,void 0,void 0,(function*(){if(!Re.Z||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),i=yield this.managers.appProfileManager.getCachedFullUser(t);return!!i&&!!("voice"===e?i.pFlags.phone_calls_available:i.pFlags.video_calls_available)})),this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onMuteClick=()=>{new Wa.Z(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",o.Z.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===o._.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),T.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame((()=>{T.IS_SAFARI&&e&&this.chatUtils.classList.remove("hide");const t=this.chatUtils.getBoundingClientRect().width;this.chat.log("utils width:",t),this.container.style.setProperty("--utils-width",t+"px"),this.setUtilsRAF=0}))},this.setFloating=()=>{var e;const t=[this.chatAudio,null===(e=this.pinnedMessage)||void 0===e?void 0:e.pinnedMessageContainer].filter(Boolean).reduce(((e,t)=>{const i=t.isFloating();return this.container.classList.toggle(`is-pinned-${t.className}-floating`,i),t.isVisible()?e+ +i:e}),0);this.container.dataset.floating=""+t},this.setPeerStatusManual=(e=!1)=>Qa(this,void 0,void 0,(function*(){if(!this.subtitle||"chat"!==this.chat.type)return;if(this.chat.threadId){const e=yield(0,Nt.Z)({peerId:this.peerId,dialog:!0}),t=(0,C.ag)("TopicProfileStatus",[e]);return()=>(0,U.Z)(this.subtitle,t)}const t=this.peerId;return this.chat.appImManager.setPeerStatus({peerId:t,element:this.subtitle,needClear:e,useWhitespace:!1,middleware:()=>t===this.peerId})})),this.setPeerStatus=e=>this.setPeerStatusManual(e).then((e=>{null==e||e()})),this.listenerSetter=new oe.Z,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar","hide"),this.container.dataset.floating="0",this.btnBack=(0,Zn.Z)("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=this.person=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const i=document.createElement("div");i.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),i.append(this.title);const s=document.createElement("div");s.classList.add("bottom"),this.subtitle&&s.append(this.subtitle),t.append(i,s),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new Da(this,this.chat,this.managers),this.menuButtons.length&&(this.btnMore=(0,kn.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:this.menuButtons,onOpen:(e,t)=>Qa(this,void 0,void 0,(function*(){const e=this.menuButtons[this.menuButtons.length-1];if(null==e?void 0:e.element){const t=yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);e.element.lastChild.replaceWith((0,C.ag)(t))}}))})),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(o.Z)("changeScreen",this.onChangeScreen),(0,S.fc)(this.container,(e=>{const t=(0,pe.Z)(e.target,"pinned-container");if((0,Fn.Z)(),t){if((0,ye.Z)(e),(0,pe.Z)(e.target,"progress-line"))return;const i=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(i);else{const e=t.dataset.peerId.toPeerId(),s=na.Z.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:i,type:s.isScheduled?"scheduled":s.threadId?"discussion":void 0,threadId:s.threadId})}}else o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir)?r():(0,me.Z)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains(a.HQ)):this.appSidebarRight.toggleSidebar(!0)}),{listenerSetter:this.listenerSetter});const r=e=>{if(e&&(0,ye.Z)(e),o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);Ln.Z.back(e?"im":"chat")}};(0,S.fc)(this.btnBack,r,{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:()=>o.Z.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>Qa(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.chat.threadId})},verify:()=>Qa(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})}))},verify:()=>Qa(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null==e?void 0:e.linked_chat_id)}))},{icon:"phone",text:"Call",onClick:this.onCallClick.bind(this,"voice"),verify:this.verifyCallButton.bind(this,"voice")},{icon:"videocamera",text:"VideoCall",onClick:this.onCallClick.bind(this,"video"),verify:this.verifyCallButton.bind(this,"video")},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),fn.Z.getState().then((t=>{if(t.chatContextMenuHintWasShown)return;const i=e.toggleByElement.bind(e);e.toggleByElement=t=>Qa(this,void 0,void 0,(function*(){this.managers.appStateManager.pushToState("chatContextMenuHintWasShown",!0),(0,ge.Am)((0,C.ag)("Chat.Menu.Hint")),e.toggleByElement=i,e.toggleByElement(t)}))}))},verify:()=>!this.chat.selection.isSelecting&&!!this.chat.bubbles.getRenderedLength()},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(Va.Z)){const e=this.appSidebarRight.createTab(Va.Z);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>Qa(this,void 0,void 0,(function*(){return this.peerId.isUser()&&!(yield this.managers.appPeersManager.isContact(this.peerId))}))},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new Ga.Z({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise(((i,s)=>{new Ls.Z("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new B.Z({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{i(),this.managers.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{s()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()})),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>Qa(this,void 0,void 0,(function*(){return d.Z.myId!==this.peerId&&this.peerId.isUser()&&(yield this.managers.appPeersManager.isContact(this.peerId))&&!!(yield this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone}))},{icon:"bots",text:"Settings",onClick:()=>{this.managers.appMessagesManager.sendText(this.peerId,"/settings")},verify:()=>Qa(this,void 0,void 0,(function*(){var e;try{const t=yield this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.has_settings)}catch(e){return!1}}))},{icon:"lock",text:"BlockUser",onClick:()=>{new Ls.Z("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new B.Z({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!0).then((e=>{e&&(0,ge.bC)({langPackKey:"UserBlocked"})}))}}]}).show()},verify:()=>Qa(this,void 0,void 0,(function*(){var e;if(!this.peerId.isUser())return!1;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==d.Z.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"lockoff",text:"Unblock",onClick:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!1).then((e=>{e&&(0,ge.bC)({langPackKey:"UserUnblocked"})}))},verify:()=>Qa(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"delete danger",text:"Delete",onClick:()=>{new ja.Z(this.peerId)},verify:()=>Qa(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&!!(yield this.managers.appMessagesManager.getDialogOnly(this.peerId))}))}],this.btnSearch=(0,Zn.Z)("search"),this.attachClickEvent(this.btnSearch,(e=>{this.chat.initSearch()}),!0)}attachClickEvent(e,t,i){(0,S.fc)(e,(e=>{(0,ye.Z)(e),!i&&(0,Fn.Z)(),t(e)}),{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructAvatar(){const e=new p.Z;return e.isDialog=!0,e.classList.add("avatar-42","person-avatar"),e}get peerId(){return this.chat.peerId}constructPeerHelpers(){return this.avatarElement=this.constructAvatar(),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new za(this,this.chat,this.managers),this.btnJoin=(0,Be.Z)("btn-primary btn-color-primary chat-join hide"),this.btnCall=(0,Zn.Z)("phone"),this.btnGroupCall=(0,Zn.Z)("videochat"),this.btnPinned=(0,Zn.Z)("pinlist"),this.btnMute=(0,Zn.Z)("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,(()=>Qa(this,void 0,void 0,(function*(){const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let i;i=(yield this.managers.appChatsManager.isChannel(t))?this.managers.appChatsManager.joinChannel(t):this.managers.appChatsManager.addChatUser(t,d.Z.myId),i.finally((()=>{e()&&this.btnJoin.removeAttribute("disabled")}))})))),this.listenerSetter.add(d.Z)("chat_update",(e=>Qa(this,void 0,void 0,(function*(){var t;if(this.peerId===e.toPeerId(!0)){const i=yield this.managers.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(t=null==i?void 0:i.pFlags)||void 0===t?void 0:t.left)),this.setUtilsWidth(),this.verifyButtons()}})))),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{e.peerId===this.peerId&&this.setMutedState()})),this.listenerSetter.add(d.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.verifyButtons()})),this.chat.addEventListener("setPeer",((e,t)=>{const i=this.chat.bubbles.getMiddleware();fn.Z.getState().then((s=>{i()&&this.pinnedMessage&&(this.pinnedMessage.hidden=!!s.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))}))})),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&this.setTitle()})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){var e,t;this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),null===(e=this.pinnedMessage)||void 0===e||e.destroy(),null===(t=this.chatAudio)||void 0===t||t.destroy(),delete this.chatAudio,delete this.pinnedMessage}cleanup(){this.chat.peerId||this.container.classList.add("hide")}finishPeerChange(e){var t;return Qa(this,void 0,void 0,(function*(){const{peerId:e,threadId:i}=this.chat;let s;"chat"===this.chat.type&&(s=(null===(t=this.avatarElement)||void 0===t?void 0:t.peerId)!==this.peerId||this.avatarElement.threadId!==this.chat.threadId?this.constructAvatar():this.avatarElement);const[n,a,o,r,d,l,c]=yield Promise.all([this.managers.appPeersManager.isBroadcast(e),this.managers.appPeersManager.isAnyChat(e),e.isAnyChat()?this.managers.appChatsManager.getChat(e.toChatId()):void 0,s?s.updateWithOptions({peerId:e,threadId:i,wrapOptions:{customEmojiSize:(0,Ke.C)(32,32)}}):void 0,this.setTitleManual(),this.setPeerStatusManual(!0),fn.Z.getState()]);return()=>{var t,i;const r=!("pinned"===this.chat.type||"scheduled"===this.chat.type);this.btnMute&&this.btnMute.classList.toggle("hide",!n||!r),this.btnJoin&&(a&&!this.chat.isRestricted&&r?((0,U.Z)(this.btnJoin,(0,C.ag)(n?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(t=null==o?void 0:o.pFlags)||void 0===t?void 0:t.left))):this.btnJoin.classList.add("hide")),this.btnSearch&&this.btnSearch.classList.toggle("hide",!r),this.btnPinned&&this.btnPinned.classList.toggle("hide",!r),this.avatarElement!==s&&(s&&(this.avatarElement?this.avatarElement.replaceWith(s):this.person.prepend(s)),null===(i=this.avatarElement)||void 0===i||i.remove(),this.avatarElement=s),this.setUtilsWidth(),this.verifyButtons(),this.btnMore&&this.btnMore.classList.toggle("hide",!r);const h=this.chat.isPinnedMessagesNeeded();if(h||"discussion"===this.chat.type){if(this.chat.wasAlreadyUsed||!this.pinnedMessage){const e=new za(this,this.chat,this.managers);this.pinnedMessage?(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy()):this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage=e}h?this.pinnedMessage.hidden=!!c.hiddenPinnedMessages[e]:"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage())}else this.pinnedMessage&&(this.pinnedMessage.destroy(),this.pinnedMessage=void 0);d(),null==l||l(),this.subtitle.classList.toggle("hide",!l),this.setMutedState(),this.container.classList.remove("hide")}}))}setTitleManual(e){return Qa(this,void 0,void 0,(function*(){const{peerId:t,threadId:i}=this.chat,s=()=>this.chat.bubbles.getMiddleware();let n;if("pinned"===this.chat.type)n=void 0===e?(0,C.ag)("Loading"):(0,C.ag)("PinnedMessagesCount",[e]),void 0===e&&this.managers.appMessagesManager.getSearchCounters(t,[{_:"inputMessagesFilterPinned"}],!1).then((e=>{if(!s())return;const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}}));else if("scheduled"===this.chat.type)n=(0,C.ag)(t===d.Z.myId?"Reminders":"ScheduledMessages");else if("discussion"===this.chat.type){if(void 0===e){const n=yield this.managers.acknowledged.appMessagesManager.getHistory(t,0,1,0,i);if(!s())return;if(n.cached){const t=yield n.result;if(!s())return;e=t.count}else n.result.then((e=>{s()&&this.setTitle(e.count)}))}n=void 0===e?(0,C.ag)("Loading"):(0,C.ag)("Chat.Title.Comments",[e])}else if("chat"===this.chat.type&&([n]=yield Promise.all([(0,Nt.Z)({peerId:t,dialog:!0,withIcons:!i,threadId:i})]),!s()))return;return()=>{(0,U.Z)(this.title,n)}}))}setTitle(e){this.setTitleManual(e).then((e=>e()))}setMutedState(){return Qa(this,void 0,void 0,(function*(){if(!this.btnMute)return;const e=this.peerId,t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:this.chat.threadId});(yield this.managers.appPeersManager.isBroadcast(e))?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}))}}var Ja=i(5884),Xa=i(3607);class eo extends Wi._{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(e,t,i,s){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new Xa.Z("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=(0,Zn.Z)("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const n=document.createElement("div");n.classList.add("chatlist-container"),this.scrollable.container.replaceWith(n),this.appSearch=new Ja.Z(n,this.inputSearch,{messages:new Ja.z("Chat.Search.PrivateSearch","messages")}),this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,s):(this.query=s,this.peerId=e,this.threadId=t,this.onDatePick=i,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&(0,S.fc)(this.btnPickDate,(()=>{w.Z.createPopup(L,new Date,this.onDatePick).show()})),s&&this.appSearch.searchInput.inputField.setValueSilently(s),a.ZP.toggleSidebar(!0))}}class to{constructor(e,t,i){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{(0,ye.Z)(e),w.Z.createPopup(L,new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=(0,me.Z)(e.target,$i.DIALOG_LIST_ELEMENT_TAG);t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.container.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{(0,ye.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{(0,ye.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),(0,x.Z)(this.backBtn);const s=this.listenerSetter=new oe.Z,n=(e,t)=>{(0,S.fc)(e,t,{listenerSetter:s})};n(this.backBtn,(()=>{this.destroy()})),this.inputSearch=new Xa.Z("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new Ja.z(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new Ja.Z(this.results,this.inputSearch,{messages:this.searchGroup},(e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):((0,U.Z)(this.foundCountEl,this.inputSearch.value?(0,C.ag)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))})),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.container.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),(0,x.Z)(this.footer),this.foundCountEl=document.createElement("span"),this.foundCountEl.classList.add("chat-search-count"),this.dateBtn=document.createElement("button"),this.dateBtn.classList.add("btn-icon","tgico-calendar"),this.controls=document.createElement("div"),this.controls.classList.add("chat-search-controls"),this.upBtn=document.createElement("button"),this.upBtn.classList.add("btn-icon","tgico-up"),this.downBtn=document.createElement("button"),this.downBtn.classList.add("btn-icon","tgico-down"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"),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(),i&&this.setQuery(i),T.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},Ln.Z.pushItem(this.navigationItem))}destroy(){this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.listenerSetter.removeAll(),this.chat.bubbles.container.classList.remove("search-results-active"),this.chat.search=void 0,Ln.Z.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),i=+e.dataset.mid||void 0,s=(0,Ce.Z)(e);s===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),s?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active");const n=this.chat.setPeer({peerId:t,lastMsgId:i});this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then((()=>{this.selectedIndex=s,(0,U.Z)(this.foundCountEl,(0,C.ag)("Of",[s+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()})).finally((()=>{this.setPeerPromise=null}))}}var io=i(1571),so=i(6848),no=i(356);class ao{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find((t=>(0,so.Z)(t.options,e)));return t||(t=new ao,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.image=document.createElement("img");return t.crossOrigin="anonymous",this.renderImageFromUrlPromise=(0,At.cj)(t,e,!1).then((()=>no.Z?createImageBitmap(t,{resizeWidth:1440,resizeHeight:2960}).then((e=>(this.imageBitmap=e,t))):t))}cleanup(e){var t;this.canvases.delete(e),this.canvases.size||((0,h.Z)(ao.INSTANCES,this),this.objectUrl&&(null===(t=this.imageBitmap)||void 0===t||t.close(),URL.revokeObjectURL(this.objectUrl)))}fillCanvas(e){const t=e.getContext("2d"),{width:i,height:s}=e,n=this.imageBitmap||this.image;let a=n.width,o=n.height;const r=(500+Ze.Z.height/2.5)*e.dpr;a*=r/o,o=r,this.options.mask?(t.fillStyle="#000",t.fillRect(0,0,i,s),t.globalCompositeOperation="destination-out"):t.globalCompositeOperation="source-over";const d=e=>{for(let s=0;s0){let e=l;do{d(e-=o)}while(e>=0)}const c=s-1;for(let e=l+o;ei.resize(e,t))))}}ao.INSTANCES=[];var oo=i(6714),ro=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class lo extends l.Z{constructor(e,t){super(),this.appImManager=e,this.managers=t,this.type="chat",this.animationGroup=`chat-${Math.round(65535*Math.random())}`,this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=(0,r.kg)("CHAT",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.log.warn("constructor"),this.peerId=m.NM,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0,this.sharedMediaTabs=[]}setBackground(e,t){const i=oo.Z.getTheme();let s;if(i.background.color&&!i.background.slug&&!i.background.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=i.background.color,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const n=++this.backgroundTempId,a=this.gradientRenderer,o=this.patternRenderer,r=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const l=i.background.intensity&&i.background.intensity/100,c=!!l&&l<0;let h,u,f,p=null==s?void 0:s.firstElementChild;if(!s)if(s=document.createElement("div"),s.classList.add("chat-background-item"),e)if(l){s.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();h=this.patternRenderer=ao.getInstance({url:e,width:t.width,height:t.height,mask:c}),p=this.patternCanvas=h.createCanvas(),p.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas"),c&&s.classList.add("is-dark")}else i.background.slug&&s.classList.add("is-image");else i.background.color&&s.classList.add("is-color");const m=i.background.color;if(m){const{canvas:e,gradientRenderer:t}=io.Z.create(m);f=this.gradientRenderer=t,u=this.gradientCanvas=e,u.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),d.Z.settings.animationsEnabled&&f.scrollAnimate(!0)}h&&(c?u:p).style.setProperty("--opacity-max",""+Math.abs(l)*(c?.5:1));const g=new Promise((i=>{const d=()=>{if(this.backgroundTempId!==n)return h&&h.cleanup(p),void(f&&f.cleanup());const e=this.backgroundEl.lastElementChild;if(e===s)return void i();const d=[u,p].filter(Boolean);d.length&&s.append(...d),this.backgroundEl.append(s),(0,xe.Z)({element:s,className:"is-visible",forwards:!0,duration:t?0:200,onTransitionEnd:e?()=>{null==o||o.cleanup(r),null==a||a.cleanup(),e.remove()}:null,useRafs:2}),i()};h?h.renderToCanvas(p).then((()=>{this.backgroundTempId===n&&d()})):e?(0,At.ZP)(s,e,d):d()}));return this.setBackgroundPromise=Promise.race([(0,Ye.Z)(500),g])}setType(e){this.type=e}init(){this.topbar=new Ya(this,a.ZP,this.managers),this.bubbles=new ws(this,this.managers),this.input=new Za(this,this.appImManager,this.managers),this.contextMenu=new Qs(this,this.managers),this.selection=new ka.Z(this,this.bubbles,this.input,this.managers),this.topbar.constructUtils(),this.topbar.constructPeerHelpers(),this.topbar.construct(),this.input.construct(),this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers(),c.Z||this.bubbles.setReactionsHoverListeners(),this.bubbles.attachContainerListeners(),this.container.append(this.topbar.container,this.bubbles.container,this.input.chatInput),this.bubbles.listenerSetter.add(d.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer({peerId:t})})),this.bubbles.listenerSetter.add(d.Z)("dialog_drop",(e=>{e.peerId!==this.peerId||"dialog"!==e._&&this.threadId!==e.id||this.appImManager.setPeer()})),this.bubbles.listenerSetter.add(this.appImManager)("chat_changing",(({to:e})=>{const t=e!==this,i=()=>{var e;null===(e=this.bubbles.observer)||void 0===e||e.toggleObservingNew(t),s.Z.toggleIntersectionGroup(this.animationGroup,t),t&&s.Z.checkAnimations(t,this.animationGroup)};t?i():setTimeout((()=>{i()}),400)}))}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.destroySharedMediaTab(),this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),this.contextMenu&&this.contextMenu.destroy(),this.selection&&this.selection.attachListeners(void 0,void 0),this.cleanupBackground(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.topbar.cleanup(),this.selection.cleanup()}get isForumTopic(){return!(!this.isForum||!this.threadId)}onChangePeer(e,t){var i;return ro(this,void 0,void 0,(function*(){const{peerId:s,threadId:n}=this,o=a.ZP.getTab(eo);null==o||o.close();const[r,d,l,c,h,u,f,p,m]=yield t(Promise.all([this.managers.appPeersManager.noForwards(s),this.managers.appPeersManager.isPeerRestricted(s),this._isAnyGroup(s),this.setAutoDownloadMedia(),this.managers.appPeersManager.isMegagroup(s),this.managers.appPeersManager.isBroadcast(s),this.managers.appPeersManager.isChannel(s),this.managers.appPeersManager.isBot(s),this.managers.appPeersManager.isForum(s)]));m&&n&&(yield t(this.managers.dialogsStorage.getForumTopicOrReload(s,n))),this.noForwards=r,this.isRestricted=d,this.isAnyGroup=l,this.isMegagroup=h,this.isBroadcast=u,this.isChannel=f,this.isBot=p,this.isForum=m,this.isAllMessagesForum=m&&!n,n&&!this.isForum&&(e.type="discussion");const g=null!==(i=e.type)&&void 0!==i?i:"chat";this.setType(g),this.messagesStorageKey=`${this.peerId}_${"scheduled"===this.type?"scheduled":"history"}`,this.container.classList.toggle("no-forwards",this.noForwards),this.sharedMediaTab=a.ZP.createSharedMediaTab(),this.sharedMediaTabs.push(this.sharedMediaTab),this.sharedMediaTab.setPeer(s,n),this.input.clearHelper(),this.selection.cleanup()}))}setPeer(e){const{peerId:t,threadId:i}=e;t?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const s=this.appImManager.isSamePeer(this,e);if(s){if(this.setPeerPromise)return}else this.appImManager.dispatchEvent("peer_changing",this),this.peerId=t||m.NM,this.threadId=i;if(!t)return a.ZP.toggleSidebar(!1),this.cleanup(!0),this.bubbles.setPeer({samePeer:!1,peerId:t}),this.peerId=0,this.appImManager.dispatchEvent("peer_changed",this),a.ZP.replaceSharedMediaTab(),this.destroySharedMediaTab(),void(this.sharedMediaTab=void 0);this.peerChanged=s;const n=this.bubbles.setPeer(Object.assign(Object.assign({},e),{samePeer:s})),o=this.setPeerPromise=n.then((e=>e.promise)).catch(We.Z).finally((()=>{this.setPeerPromise===o&&(this.setPeerPromise=null)}));return n}destroySharedMediaTab(e=this.sharedMediaTab){e&&((0,h.Z)(this.sharedMediaTabs,e),e.destroy())}setAutoDownloadMedia(){return ro(this,void 0,void 0,(function*(){this.autoDownload=yield function(e){return t=this,i=void 0,n=function*(){let t,i=0,s=0,n=0;const a=d.Z.settings,o=d.Z.managers.appPeersManager;return!a.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?(yield o.isContact(e))?"contacts":"private":(yield o.isBroadcast(e))?"channels":"groups",a.autoDownload.photo[t]&&(i=a.autoDownloadNew.photo_size_max),a.autoDownload.video[t]&&(s=a.autoDownloadNew.video_size_max),a.autoDownload.file[t]&&(n=a.autoDownloadNew.file_size_max)),{photo:i,video:s,file:n}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}(this.peerId)}))}setMessageId(e){return this.setPeer({peerId:this.peerId,threadId:this.threadId,lastMsgId:e})}finishPeerChange(e,t,i,s){return ro(this,void 0,void 0,(function*(){if(this.peerChanged)return;const t=this.peerId;this.peerChanged=!0,this.wasAlreadyUsed=!0;const i=this.bubbles.getMiddleware();this.cleanup(!1);const n=this.sharedMediaTab,o=Promise.all([this.topbar.finishPeerChange(e),this.bubbles.finishPeerChange(),this.input.finishPeerChange(s),n.fillProfileElements()]),r=yield o;n.loadSidebarMedia(!0),i()&&(r.forEach((e=>{null==e||e()})),a.ZP.replaceSharedMediaTab(n),this.sharedMediaTabs.filter((e=>e!==n)).forEach((e=>this.destroySharedMediaTab(e))),this.container.dataset.type=this.type,this.log.setPrefix("CHAT-"+t+"-"+this.type),this.appImManager.dispatchEvent("peer_changed",this))}))}getMessage(e){return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey,e)}getMidsByMid(e){return ro(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.getMidsByMessage(yield this.getMessage(e))}))}getHistoryStorage(e){return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId,e?void 0:this.threadId).then((e=>Object.assign(Object.assign({},e),{history:fe.Z.fromJSON(e.historySerialized)})))}getDialogOrTopic(){return this.isForum&&this.threadId?this.managers.dialogsStorage.getForumTopic(this.peerId,this.threadId):this.managers.dialogsStorage.getDialogOnly(this.peerId)}getHistoryMaxId(){return this.getHistoryStorage().then((e=>e.maxId))}_isAnyGroup(e){return ro(this,void 0,void 0,(function*(){return e===d.Z.myId||e===m.hj||(yield this.managers.appPeersManager.isAnyGroup(e))}))}initSearch(e){if(this.peerId)if(o.Z.isMobile)this.search?this.search.setQuery(e):this.search=new to(this.topbar,this,e);else{let t=a.ZP.getTab(eo);t||(t=a.ZP.createTab(eo)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.managers.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return Promise.all([this.managers.appPeersManager.isBot(this.peerId),this.managers.appMessagesManager.getDialogOnly(this.peerId),this.getHistoryStorage(!0)]).then((([e,t,i])=>e&&!t&&!i.history.length))}getMessageSendingParams(){return{threadId:this.threadId,replyToMsgId:this.input.replyToMsgId,scheduleDate:this.input.scheduleDate,silent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}isOurMessage(e){return e.fromId===d.Z.myId||!!e.pFlags.out&&this.isMegagroup}isOutMessage(e){const t=e.fwd_from;return!(!this.isOurMessage(e)||t&&this.peerId===d.Z.myId)}isAvatarNeeded(e){return this.isAnyGroup&&!this.isOutMessage(e)}isPinnedMessagesNeeded(){return"chat"===this.type||this.isForum}}var co=i(2342),ho=i(6637);class uo{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,c.Z){if(e&&(0,ye.Z)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools"),["bold","italic","underline","strikethrough","monospace","spoiler","link"].forEach((t=>{const i=(0,Zn.Z)(t,{noRipple:!0});e.append(this.buttons[t]=i),"link"!==t?i.addEventListener("mousedown",(e=>{(0,ye.Z)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()})):(0,S.fc)(i,(e=>{(0,ye.Z)(e),this.showLinkEditor(),this.cancelClosening()}))})),this.linkBackButton=(0,Zn.Z)("left",{noRipple:!0}),this.linkInput=document.createElement("input"),(0,C.$d)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",(e=>{const t=!this.linkInput.value.length||!!(0,co.Z)(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))})),this.linkInput.addEventListener("input",(e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")})),this.linkBackButton.addEventListener("mousedown",(e=>{(0,ye.Z)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()})),this.linkApplyButton=(0,Zn.Z)("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",(e=>{this.applyLink(e)}));const i=document.createElement("div");i.classList.add("markup-tooltip-link-apply-container");const s=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");s.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(s,this.buttons.link),i.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,i),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",(()=>{this.hide()}))}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout((()=>{this.linkInput.focus()}),200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){(0,ye.Z)(e),this.resetSelection();let t=this.linkInput.value;t&&!(0,ho.Z)(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout((()=>{this.hide()}),0)}isLinkValid(){return!this.linkInput.value.length||!!(0,co.Z)(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,Ln.Z.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout((()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")}),200))}getActiveMarkupButton(){const e=new Set,t=Object.keys(this.buttons),i=Ea(t);return t.forEach((t=>{i[t]&&e.add(this.buttons[t])})),[...e]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const i=this.buttons[t];i.classList.toggle("active",e.includes(i))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),i=document.body.getBoundingClientRect(),s=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=(0,Ne.Z)(void 0,this.appImManager.chat.input.messageInput,!1,s).rect.top+-1*i.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,d=n.left,l=n.left+n.width-Math.min(n.width,o.width);let c;if(e){const e=this.container.getBoundingClientRect();c=(0,Bi.Z)(e.left,d,l)}else{const e=s.left+(s.width-o.width)/2;c=(0,Bi.Z)(e,d,l)}this.container.style.transform=`translate3d(${c}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),Ps())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"),T.IS_MOBILE||Ln.Z.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){c.Z&&!T.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",(e=>{(0,ye.Z)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()}),{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",(e=>{if(document.activeElement===this.linkInput)return;const t=this.appImManager.chat.input.messageInput;if(document.activeElement!==t)return void this.hide();const i=document.getSelection();if(Ps(i))this.hide();else if(c.Z)if(T.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=i.getRangeAt(0),this.setMouseUpEvent()}else this.container&&this.container.classList.contains("is-visible")?this.setTooltipPosition():t.matches(":active")?this.setMouseUpEvent():this.show()})),document.addEventListener("beforeinput",(e=>{"historyRedo"!==e.inputType&&"historyUndo"!==e.inputType||e.target.addEventListener("input",(()=>this.setActiveMarkupButton()),{once:!0})})))}}var fo=i(9171);class po{constructor(e,t){let i;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(i=document.createElement("div"),i.classList.add("drop-icon","tgico-"+t.icon));const s=document.createElement("div");let n;s.classList.add("drop-header"),s.append((0,C.ag)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append((0,C.ag)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,i,s,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",`${e.width}`),this.svg.setAttributeNS(null,"height",`${e.height}`);const t=10,i=e.width-t,s=e.height-t,n=(0,fo.Z)(5,5,i,s,t,t,t,t);this.path.setAttributeNS(null,"d",n)}}var mo=i(7922);function go(e){e.forEach((e=>e.classList.add("no-transition"))),(0,ce.d1)().then((()=>{e.forEach((e=>e.classList.remove("no-transition")))}))}var vo=i(490),bo=i(2831),yo=i(2207);class wo{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:i,minRadius:s,speed:n}=this,a=i-s;e[t]=s+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:i,N:s}=this;for(let n=0;n=1&&(s[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,i,s,n,a,o,r){if(n.getContext){const d=n.getContext("2d");d.beginPath(),d.moveTo(i,s),d.lineTo(e,s);const{radius:l,radiusNext:c,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const i=this.progress[n],s=(t-(l[n]*(1-i)+c[n]*i))*r+o*(1-r);d.lineTo(e,s)}else{const a=this.progress[n-1],u=l[n-1]*(1-a)+c[n-1]*a,f=this.progress[n],p=(i-e)/h*(n-1),m=(i-e)/h*n,g=p+(m-p)/2,v=(t-u)*r+o*(1-r),b=(t-(l[n]*(1-f)+c[n]*f))*r+o*(1-r);d.bezierCurveTo(g,v,g,b,m,b),n===h&&d.lineTo(i,s)}a(d),d.fill(),d.closePath()}}}class So{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,i,s,n,a)=>{t.fillStyle=So.getGradientFromType(t,e,i,s,n,a)}}static getGradientFromType(e,t,i,s,n,a){const o=e.createLinearGradient(i,s,n,a);return t===yo.Z.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===yo.Z.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===yo.Z.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===yo.Z.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,i,s){}}class Co{constructor(){this.handleDevicePixelRatioChanged=e=>{this.setSize(),this.forceUpdate()},this.handleResize=()=>{this.resizeHandler&&(clearTimeout(this.resizeHandler),this.resizeHandler=null),this.resizing=!0,this.resizeCanvas(),this.resizeHandler=window.setTimeout((()=>{this.resizing=!1,this.invokeDraw()}),250)},this.handleFocus=()=>{this.focused=!0,this.invokeDraw()},this.handleBlur=()=>{this.focused=!1},this.invokeDraw=()=>{this.raf||this.draw()},this.draw=(e=!1)=>{if(this.raf=null,!this.mounted)return;const{lbd:t,lbd1:i,lbd2:s,scale:n,left:a,top:o,right:r,bottom:d,currentState:l,previousState:c,focused:h,resizing:u,canvas:f}=this;if(!h&&!u&&this.progressToState>=1)return;let p=Date.now()-this.lastUpdateTime;p>20&&(p=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*p,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:g,progressToState:v}=this,b=6*g*n,y=6*g*n;f.getContext("2d").clearRect(0,0,f.width,f.height),t.minRadius=0,t.maxRadius=(2+2*m)*n,i.minRadius=0,i.maxRadius=(3+9*m)*n,s.minRadius=0,s.maxRadius=(3+9*m)*n,t.update(m,.3),i.update(m,.7),s.update(m,.7);for(let e=0;e<2;e++){if(0===e&&!c)continue;let n=1,h=null;0===e?(n=1-v,h=c):(n=c?v:1,l.update(d-o,r-a,p,m),h=l);const u=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,d)},g=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,d)};i.draw(a,o-b,r,d,f,u,o,1),s.draw(a,o-y,r,d,f,u,o,1),t.draw(a,o,r,d,f,g,o,1)}e||(this.raf=requestAnimationFrame((()=>this.draw())))},this.setCurrentState=(e,t)=>{const{currentState:i,states:s}=this;(null==i?void 0:i.stateId)!==e&&(this.previousState=t?i:null,this.currentState=s.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[yo.Z.UNMUTED,new So(yo.Z.UNMUTED)],[yo.Z.MUTED,new So(yo.Z.MUTED)],[yo.Z.MUTED_BY_ADMIN,new So(yo.Z.MUTED_BY_ADMIN)],[yo.Z.CONNECTING,new So(yo.Z.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(yo.Z.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 wo(3),this.lbd1=new wo(7),this.lbd2=new wo(8),this.setAmplitude(this.amplitude),this.draw())}componentWillUnmount(){this.mounted=!1,window.removeEventListener("resize",this.handleResize),this.media.addEventListener("change",this.handleDevicePixelRatioChanged);const{canvas:e}=this;e.getContext("2d").clearRect(0,0,e.width,e.height)}setSize(){this.scale=window.devicePixelRatio,this.top=20*this.scale,this.right=(this.mounted?this.container.offsetWidth:1261)*this.scale,this.bottom=(this.mounted?this.container.offsetHeight:68)*this.scale,this.left=0*this.scale,this.setCanvasSize()}setCanvasSize(){this.canvas.width=this.right,this.canvas.height=this.bottom}resizeCanvas(){this.scale=window.devicePixelRatio,this.right=this.container.offsetWidth*this.scale,this.forceUpdate(),this.invokeDraw()}setAmplitude(e){const{amplitude:t}=this;this.animateToAmplitude=e,this.animateAmplitudeDiff=(e-t)/250,this.animateAmplitudeDiff2=(e-t)/120}forceUpdate(){this.setCanvasSize()}render(e){const t=this.container=document.createElement("div");t.classList.add(e);const i=this.canvas=document.createElement("canvas");return i.classList.add(e+"-canvas"),t.append(i),t}}var Eo=i(8222);class Lo{constructor(e,t){this.item=e,(0,In.Z)(this,t)}play(e){return this.item.playPart(this,e)}}class Io{constructor(e,t){this.icon=e,this.autoplay=!1,(0,In.Z)(this,t),this.parts=this.parts.map((e=>this.createPart(e)))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:i,canvas:s,width:n,height:a}=this.icon;return t=ks.Z.loadAnimationAsAsset({container:i,canvas:s,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then((e=>ks.Z.waitForFirstFrame(e))).then((e=>{this.player=e,this.onLoadForColor&&(this.onLoadForColor(),this.onLoadForColor=void 0),this.onLoadForPart&&(this.onLoadForPart(),this.onLoadForPart=void 0)})),this.loadPromise=t,this.icon.loadPromises.set(this.name,t),t}createPart(e){return new Lo(this,e)}getPart(e){return e instanceof Lo?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 Mo{constructor(e){(0,In.Z)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:i}=this;this.container.style.width=t+"px",this.container.style.height=i+"px";const s=this.canvas=document.createElement("canvas");s.classList.add("rlottie"),s.width=t,s.height=i,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(We.Z)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new Io(this,e);return this.items.set(e.name,t),t}playPart(e,t,i){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,i)});const s=e.getPart(t);e.player.playPart({from:d.Z.settings.animationsEnabled&&!this.skipAnimation?s.startFrame:s.endFrame,to:s.endFrame,callback:i})}static generateEqualParts(e,t){return new Array(e).fill(0).map(((e,i)=>{const s=i*t;return{startFrame:s,endFrame:s+t-1}}))}}class Po extends Mo{constructor(e){super({width:e.width,height:e.height}),(0,In.Z)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const i=this.getPart(e),s=void 0!==t&&this.getColor&&this.getColor(t),n=i.item;n.initFrame=i.endFrame,n.color=s;const a=[...this.items.values()].map((e=>e.load()));return Promise.all(a).then(We.Z)}setState(e,t,i){this.loaded||this.load(e,t);let s=!1,n=!1;return void 0!==e?s=this.setPartState(e,t,i):void 0!==t&&(n=this.setColorState(t)),s||n}setPartState(e,t,i){const{partState:s}=this;return s===e?void 0!==t&&this.setColorState(t):(void 0!==t&&this.setColorState(t,!1),this.partState=e,this.getPart(e,s).play(i),!0)}setColorState(e,t=!0){const{colorState:i}=this;if(i===e||!this.getColor)return!1;this.colorState=e;const s=this.getItem(),n=this.getColor(e,i),a=()=>{s.player.setColor(n,t)};return s.player?a():s.onLoadForColor=a,!0}destroy(){this.items.forEach((e=>{e.loadPromise.then((()=>{e.player.remove()}))}))}}class Zo extends Po{constructor(){super({width:36,height:36,getPart:(e,t)=>{const i=ir;let s;switch(e){case i.HAND:s=t===i.MUTED?"muted-to-hand":"unmuted-to-hand";break;case i.MUTED:s=t===i.HAND?"hand-to-muted":"mute";break;case i.UNMUTED:s="unmute"}return this.getItem().getPart(s)}}),this.container.classList.add("group-call-microphone-icon-container"),this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}var ko=i(6733);class To extends Po{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const i=tr;let s;switch(e){case i.HAND:s=3;break;case i.MUTED:s=t===i.HAND?0:2;break;case i.UNMUTED:s=1}return this.getItem().getPart(s)},getColor:e?(e,t)=>function(e){const t=tr;let 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 s=Eo.Z.getProperty("gc-"+i+"-text-color");return(0,N.oo)(s)}(e):void 0}),this.colored=e,this.container.classList.add("group-call-participant-muted-icon-container");const t=Mo.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=tr;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}const xo="group-call-participant-status";class Ao{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add(xo+"-container")}setState(e,t){const i=tr,s=this.withIcons.filter((e=>!!t[e])).map((e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),i=document.createElement("i");return i.classList.add(xo+"-icon",xo+"-icon-"+e,t),i}));let n,a;if(e===i.MUTED_FOR_ME)n=(0,C.ag)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===i.UNMUTED)n=(0,C.ag)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===i.HAND)n=(0,C.ag)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!s.length)return void(0,_.Z)(this.container,(0,R.Z)(t.about));n=(0,C.ag)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add(xo,a),o.append(...s,n),(0,U.Z)(this.container,o)}}var _o=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Fo extends os.Z{constructor(e){super({getIndex:e=>_o(this,void 0,void 0,(function*(){return(yield this.instance.getParticipantByPeerId(e.id)).date})),onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>_o(this,void 0,void 0,(function*(){const t=yield this.instance.getParticipantByPeerId(e.id),i=sr(t);e.mutedIcon.setState(i),e.status.setState(i,t)})),onSort:(e,t)=>{(0,f.Z)(e.dom.listEl,this.list,t)},onElementCreate:e=>{const{dom:t}=$i.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});t.listEl.classList.add("group-call-participant");const i=new To(!0),s=new Ao(["presentation","video"]);return(0,U.Z)(t.lastMessageSpan,s.container),t.listEl.append(i.container),e.mutedIcon=i,e.status=s,e.dom=t,e},updateElementWith:ce.T2}),this.instance=e,this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=$i.default.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach((e=>{this.onElementDestroy(e)}))}onElementDestroy(e){e.mutedIcon.destroy()}}var Do=i(7529);function Ro(e){const t=document.createElement("canvas");t.classList.add("call-video-blur"),t.width=16,t.height=16;const i=t.getContext("2d",{alpha:!1});i.filter="blur(2px)";const s=()=>{i.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return(0,Ee.jt)((()=>(s(),t.isConnected))),s(),t}const Bo="group-call-participant-video";class No{constructor(e,t,i){this.managers=e,this.instance=t,this.source=i,this.container=document.createElement("div"),this.container.classList.add(Bo+"-container"),this.info=document.createElement("div"),this.info.classList.add(Bo+"-info"),this.left=document.createElement("div"),this.left.classList.add(Bo+"-info-left"),this.right=document.createElement("div"),this.right.classList.add(Bo+"-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(Bo+"-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,i){let s;e.pFlags.self?(s=(0,C.ag)("VoiceChat.Status.You"),s.classList.add("peer-title")):(this.peerTitle=new B.Z({peerId:(0,D.Z)(e.peer)}),s=this.peerTitle.element),this.groupCallParticipantMutedIcon=new To(!1),this.groupCallParticipantStatus=new Ao([t]),this.left.append(s,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),i.classList.add(Bo,"call-video"),i.paused&&i.play();const n=Ro(i);n.classList.add(Bo+"-blur"),this.container.prepend(n,i),this.updateParticipant(e)}updateParticipant(e){const t=sr(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Oo extends Do.Z{constructor(e){super(),(0,In.Z)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:i}=this;i.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),i.add(this.instance)("pinned",(e=>{this.participantsElements.forEach((t=>{t.forEach((t=>{this.setElementDisplay(t,e)}))}))})),(0,S.fc)(this.container,(e=>{const t=(0,pe.Z)(e.target,"group-call-participant-video-container");if(!t)return;const i=this.containers.get(t);this.instance.pinnedSource!==i.source?this.instance.pinSource(i.source):this.instance.unpinAll()}),{listenerSetter:i}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:i,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const i=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!i);const s=e.source===t;e.setPinned(s)}updateParticipant(e){const t=(0,D.Z)(e.peer),i=["video","presentation"],s=i.some((t=>!!e[t]));let n=this.participantsElements.get(t);(s||n)&&(n||this.participantsElements.set(t,n=new Map),i.forEach((i=>{let s=n.get(i);const a=e[i];if(!!a!=!!s){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,i);if(!t)return;const{video:a,source:o}=t;s=new No(this.managers,this.instance,o),this.containers.set(s.container,s),this.setElementDisplay(s,this.instance.pinnedSource),n.set(i,s),s.setParticipant(e,i,a),this.container.prepend(s.container)}else n.delete(i),s.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(s.container),s.destroy());this._onLengthChange()}else s&&s.updateParticipant(e)})))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){return t=this,i=void 0,n=function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}destroy(){this.containers.forEach((e=>{e.destroy()}))}}var Uo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ho{constructor(e){this.onOpenProfileClick=()=>{const e=w.Z.getPopups(or)[0];e&&e.hide(),Ur.setInnerPeer({peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.instance.editParticipant(this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.managers.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>Uo(this,void 0,void 0,(function*(){(0,ci.Z)({peerId:this.targetPeerId,title:new B.Z({peerId:this.targetPeerId}).element,descriptionLangKey:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new B.Z({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then((()=>{this.managers.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)}),We.Z)}))}];const{listenerSetter:t}=e;this.managers=e.managers,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=(0,Cs.b)({buttons:this.buttons,listenerSetter:t}),this.element.classList.add("group-call-participant-menu","night"),(0,mt.E)(e.onContextElement,(e=>Uo(this,void 0,void 0,(function*(){const t=(0,pe.Z)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==i&&i.append(this.element),(0,ye.Z)(e);const s=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=yield this.instance.getParticipantByPeerId(s),this.participant.pFlags.self||(this.canManageCall=yield this.managers.appChatsManager.hasRights(this.chatId,"manage_call"),yield(0,Ks.Z)(this.buttons,(e=>Uo(this,void 0,void 0,(function*(){const t=yield e.verify(s);return e.element.classList.toggle("hide",!t),t})))),(0,Vs.Z)(e.touches?e.touches[0]:e,this.element,"right"),gt.Z.openBtnMenu(this.element))}))),t),t.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=(0,D.Z)(t.peer);this.targetPeerId===e&>.Z.close()}}));let i=document.body;(0,ko.Ms)(document.body,(()=>{const e=(0,ko.rB)();i=e?w.Z.getPopups(or)[0].getContainer():document.body,e||gt.Z.close()}),t)}}class zo{constructor(e){(0,In.Z)(this,e);const t="group-call-participants",i=new Z.ZP(void 0);i.container.classList.add(t+"-scrollable");const s=this.container=document.createElement("div");s.classList.add(t);const n=this.sortedList=new Fo(this.instance),{instance:a,listenerSetter:o}=this;this.contextMenu=new Ho(Object.assign(Object.assign({},e),{onContextElement:n.list,listenerSetter:o,instance:a})),this.groupCallParticipantsVideo=new Oo(Object.assign(Object.assign({},e),{appendTo:i.container,displayPinned:!1})),i.append(n.list),s.append(i.container),e.appendTo.append(s),o.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),new Ns.Z({scrollable:i,getPromise:()=>this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then((({participants:e,isEnd:t})=>(e.forEach((e=>{this.updateParticipant(e)})),t)))}),this.setInstance(a)}updateParticipant(e){const t=(0,D.Z)(e.peer),i=this.sortedList.has(t);e.pFlags.left?i&&this.sortedList.delete(t):i?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){return Uo(this,void 0,void 0,(function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))}))}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class jo{constructor(e){this.appendTo=e,this.descriptionIntl=new C.ZP.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description")}detach(){this.descriptionIntl.element.remove()}update(e){const{state:t}=e;let i,s;t===yo.Z.CONNECTING?i="VoiceChat.Status.Connecting":(i="VoiceChat.Status.Members",s=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:i,args:s}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class Go{constructor(e){this.appendTo=e,this.peerTitle=new B.Z({peerId:0})}update(e){const{peerTitle:t,appendTo:i}=this,s=e.groupCall,n=e.chatId.toPeerId(!0);s.title?(0,_.Z)(i,(0,R.Z)(s.title)):(t.options.peerId!==n&&(t.options.peerId=n,t.update()),t.element.parentElement!==i&&i.append(t.element))}}var Vo=i(2820);function Ko(e,t,i){const s=e+"-button",n=document.createElement("div");n.classList.add(s,"call-button","rp-overflow"),i.icon&&n.classList.add("tgico-"+i.icon),i.noRipple||(0,x.Z)(n),i.isDanger&&n.classList.add(s+"-red"),i.isConfirm&&n.classList.add(s+"-green"),i.callback&&(0,S.fc)(n,i.callback,{listenerSetter:t});let a=n;if(i.text){const e=document.createElement("div");e.classList.add(s+"-container","call-button-container");const t="string"==typeof i.text?(0,C.ag)(i.text):i.text;t.classList.add(s+"-text","call-button-text"),e.append(n,t),a=e}return a}var Wo=i(3757);const $o="movable-element",qo="movable-element-resize-handler";class Qo extends l.Z{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},(0,In.Z)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add($o),this.addResizeHandlers(),this.setSwipeHandler(),o.Z.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove($o),this.handlers&&this.handlers.forEach((e=>{e.remove()}))}destroy(){o.Z.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map((e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add(qo,qo+"-side-"+e),this.element.append(t),t}))}setSwipeHandler(){let e,t,i,s,n;const a=this.swipeHandler=new Wo.Z({element:this.element,onSwipe:(a,o,r)=>{if(a*=-1,o*=-1,n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,s=Math.abs(a)*(e?1:-1),o=n.includes("e")?Ze.Z.width-t:i+t;this.width=Math.min(o,i+s)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,i=Math.abs(o)*(t?1:-1),a=n.includes("s")?Ze.Z.height-e:s+e;this.height=Math.min(a,s+i)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+i-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+s-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return!1;const i=(0,pe.Z)(t,qo);return i?(n=i.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,i=this.width,s=this.height}})}setPositionToCenter(){this.top=Ze.Z.height/2-this.height/2,this.left=Ze.Z.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=(0,Bi.Z)(this.width,this.minWidth,Ze.Z.width),this.height=(0,Bi.Z)(this.height,this.minHeight,Ze.Z.height)}fixPosition(){this.top=(0,Bi.Z)(this.top,0,Ze.Z.height-this.height),this.left=(0,Bi.Z)(this.left,0,Ze.Z.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:i,height:s}=this;return{top:e,left:t,width:i,height:s}}set state(e){const{top:t,left:i,width:s,height:n}=e;this.top=t,this.left=i,this.width=s,this.height=n,this.onResize()}}var Yo,Jo=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i};class Xo{constructor(e){Yo.set(this,void 0),(0,In.Z)(this,e),this.toggleMovable(!c.Z),this.listenerSetter.add(o.Z)("changeScreen",((e,t)=>{t!==o._.mobile&&e!==o._.mobile||this.toggleMovable(!c.Z)}))}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)}(this,Yo,"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=Jo(this,Yo,new Qo(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(),Jo(this,Yo,void 0,"f")}}}function er(e,t,i){return t.forEach((t=>{t.classList.toggle(e,i)})),()=>er(e,t,!i)}Yo=new WeakMap;var tr,ir;function sr(e){const t=tr;return e.pFlags.muted_by_you?t.MUTED_FOR_ME:void 0!==e.raise_hand_rating?t.HAND:e.pFlags.muted?e.pFlags.can_self_unmute?t.MUTED:t.MUTED_BY_ADMIN:t.UNMUTED}!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_FOR_ME=2]="MUTED_FOR_ME",e[e.MUTED_BY_ADMIN=3]="MUTED_BY_ADMIN",e[e.HAND=4]="HAND"}(tr||(tr={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(ir||(ir={}));let nr={width:420,height:640};const ar="group-call";class or extends w.Z{constructor(){super("popup-group-call",{body:!0,withoutOverlay:!0,closable:!0,title:!0}),this.onFullScreenClick=()=>{(0,ko.Dj)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=er.bind(null,"btn-disabled"),this.onVideoClick=()=>{const e=this.toggleDisability([this.btnVideo],!0);this.instance.toggleVideoSharing().finally((()=>{e()}))},this.onScreenClick=()=>{const e=this.toggleDisability([this.btnScreen],!0);this.instance.toggleScreenSharing().finally((()=>{e()}))},this.onMuteClick=()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},this.onLeaveClick=()=>{return e=this,t=void 0,s=function*(){const e=e=>{this.instance.hangUp(e)};(yield this.managers.appChatsManager.hasRights(this.instance.chatId,"manage_call"))?new Ls.Z("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=(0,ko.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations2(e),oo.Z.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=(0,ko.rB)(),i=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,s=(t||!!(i&&i.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;s&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach((e=>{e.style.opacity="0"})),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",s),this.btnInvite.classList.toggle("hide",s),this.btnShowColumn.classList.toggle("hide",!s),a&&a.forEach((e=>{e.style.opacity=""}))},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},this.videosCount=0,this.container.classList.add(ar,"night");const e=this.instance=qa.ZP.groupCall,{listenerSetter:t}=this;if(!T.IS_APPLE_MOBILE){const e=this.btnFullScreen=(0,Zn.Z)("fullscreen"),i=this.btnFullScreen2=(0,Zn.Z)("fullscreen group-call-cfs"),s=this.btnExitFullScreen=(0,Zn.Z)("smallscreen");(0,S.fc)(e,this.onFullScreenClick,{listenerSetter:t}),(0,S.fc)(i,this.onFullScreenClick,{listenerSetter:t}),(0,S.fc)(s,(()=>{(0,ko.C8)()}),{listenerSetter:t}),(0,ko.Ms)(this.container,this.onFullScreenChange,t)}this.btnInvite=(0,Zn.Z)("adduser");const i=this.btnShowColumn=(0,Zn.Z)("rightpanel group-call-only-big");(0,S.fc)(i,this.toggleRightColumn,{listenerSetter:t});const n=document.createElement("div");n.classList.add("group-call-header-info"),this.title.classList.add("group-call-header-title");const a=document.createElement("div");a.classList.add("group-call-header-subtitle"),n.append(this.title,a),this.header.classList.add("group-call-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const o=this.header.cloneNode(!1),r=n.cloneNode(!1),l=this.title.cloneNode(!1);r.append(l);const c=(0,Zn.Z)("rightpanel");o.append(...[c,r,this.btnFullScreen2].filter(Boolean)),(0,S.fc)(c,this.toggleRightColumn,{listenerSetter:t}),this.body.prepend(o);const h=new Z.ZP(void 0);h.container.classList.add("group-call-big-video-container"),this.container.append(h.container),this.groupCallTitle=new Go(this.title),this.groupCallDescription=new jo(a),this.groupCallBodyHeaderDescription=new jo(l),this.constructButtons(),this.groupCallParticipantsVideo=new Oo({appendTo:h.container,instance:e,listenerSetter:t,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()},managers:this.managers}),this.groupCallParticipants=new zo({appendTo:this.body,instance:e,listenerSetter:t,managers:this.managers}),this.movablePanel=new Xo({listenerSetter:t,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,pe.Z)(t,"chatlist")||(0,pe.Z)(t,"group-call-button")||(0,pe.Z)(t,"btn-icon")||(0,pe.Z)(t,"group-call-participants-video-container")||(0,ko.rB)())}},onResize:()=>this.toggleBigLayout(),previousState:nr}),t.add(e)("state",(()=>{this.updateInstance()})),t.add(d.Z)("group_call_update",(e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()})),t.add(e)("pinned",(()=>{this.setHasPinned()})),t.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",(()=>{const{movablePanel:e}=this;nr=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=Ko.bind(null,ar,this.listenerSetter),i=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),s=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});s.classList.toggle("hide",!Vo.Z);const n=t({noRipple:!0,callback:(0,Na.Z)(this.onMuteClick,600,!0)});n.classList.add("group-call-microphone-button");const a=this.groupCallMicrophoneIcon=new Zo;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!Vo.Z);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(i,s,n,o,r),this.container.append(e)}getContainer(){return this.container}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===yo.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,ko.C8)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const i=function(e,t){const i=ir;return t.pFlags.can_self_unmute?t.pFlags.muted?i.MUTED:i.UNMUTED:i.HAND}(0,e);this.container.dataset.micState=i===ir.HAND?"hand":i===ir.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(i)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var rr=i(9078),dr=i(3335);class lr{constructor(e){this.appendTo=e,this.container=document.createElement("div"),this.container.classList.add("call-description")}detach(){void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0),this.container.remove(),this.state=void 0}update(e){const{connectionState:t}=e;if(this.state===t)return;let i;if(this.state=t,t===dr.Z.CONNECTED){i=document.createElement("span"),i.classList.add("call-description-duration");const t=()=>{i.innerText=(0,Qi.Z)(e.duration,!0)};this.interval=window.setInterval(t,1e3),t()}else{let s;switch(t){case dr.Z.PENDING:s=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case dr.Z.REQUESTING:s="Call.StatusRequesting";break;case dr.Z.EXCHANGING_KEYS:s="VoipExchangingKeys";break;case dr.Z.CLOSED:s=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:s="Call.StatusConnecting"}i=(0,C.ag)(s),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===dr.Z.CONNECTED),(0,U.Z)(this.container,i),this.container.parentElement||this.appendTo.append(this.container)}}class cr extends Po{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 hr="call",ur={width:400,height:580};let fr=Object.assign({},ur);class pr extends w.Z{constructor(e){super("popup-call",{withoutOverlay:!0,closable:!0}),this.instance=e,this.onFullScreenClick=()=>{(0,ko.Dj)(this.container)},this.onFullScreenChange=()=>{const e=(0,ko.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations(e),oo.Z.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},this.videoContainers={};const{container:t,listenerSetter:i}=this;t.classList.add(hr,"night");const n=document.createElement("div");n.classList.add("call-avatar");const a=this.peerId=this.instance.interlocutorUserId.toPeerId(),o=new p.Z;o.classList.add("avatar-full"),o.updateWithOptions({isBig:!0,peerId:a}),n.append(o);const r=new B.Z({peerId:a}).element;r.classList.add("call-title");const d=document.createElement("div");d.classList.add("call-subtitle"),this.description=new lr(d);const l=this.emojisSubtitle=document.createElement("div");l.classList.add("call-emojis"),t.append(n,r,d),T.IS_MOBILE?this.header.append(l):(this.btnFullScreen=(0,Zn.Z)("fullscreen"),this.btnExitFullScreen=(0,Zn.Z)("smallscreen hide"),(0,S.fc)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:i}),(0,S.fc)(this.btnExitFullScreen,(()=>(0,ko.C8)()),{listenerSetter:i}),(0,ko.Ms)(this.container,this.onFullScreenChange,i),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(l)),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 c=(0,C.ag)("VoipUserMicrophoneIsOff",[new B.Z({peerId:a,onlyFirstName:!0,limitSymbols:18}).element]);c.classList.add("call-party-state-text");const h=new cr(!1,!0);h.setState(!1,!1),this.partyMutedState.append(h.container,c),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=Ko.bind(null,hr,this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),i.add(e)("state",(()=>{this.updateInstance()})),i.add(e)("mediaState",(()=>{this.updateInstance()})),this.movablePanel=new Xo({listenerSetter:i,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,pe.Z)(t,"call-button")||(0,pe.Z)(t,"btn-icon")||(0,ko.rB)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?fr:Object.assign({},ur)});const u=this.movablePanel.movable;u&&this.listenerSetter.add(u)("resize",(()=>{this.resizeVideoContainers()}));const f=this.controlsHover=new Do.Z;f.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),f.showControls(!1),this.addEventListener("close",(()=>{const{movablePanel:e}=this;fr=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=er.bind(null,"btn-disabled"),i=this.btnVideo=this.makeButton({text:"Call.Camera",icon:"videocamera_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleVideoSharing().finally(e)}}),s=this.btnScreen=this.makeButton({text:"Call.Screen",icon:"sharescreen_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleScreenSharing().finally(e)}});Vo.Z||(s.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new C.ZP.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new cr(!0,!0);n.firstElementChild.append(a.container),e.append(i,s,n),this.container.append(e)}constructSecondButtons(){const e=this.secondButtonsRow=document.createElement("div");e.classList.add("call-buttons","is-second"),this.declineI18nElement=new C.ZP.IntlElement({key:"Call.Decline"});const t=this.btnDecline=this.makeButton({text:this.declineI18nElement.element,icon:"endcall_filled",callback:()=>{this.instance.hangUp("phoneCallDiscardReasonHangup")},isDanger:!0}),i=this.btnAccept=this.makeButton({text:"Call.Accept",icon:"phone_filled",callback:()=>{this.instance.acceptCall()},isConfirm:!0});e.append(t,i),this.container.append(e)}createVideoContainer(e){const t=document.createElement("div");t.classList.add("call-video-container"),e.classList.add("call-video"),e.paused&&e.play(),(0,S.fc)(t,(()=>{if(!t.classList.contains("small"))return;const e=Object.values(this.videoContainers).find((e=>!e.classList.contains("small")));e.classList.add("small"),e.style.cssText=t.style.cssText,t.classList.remove("small"),t.style.cssText="",this.resizeVideoContainers()}));const i=Ro(e);return i.classList.add("call-video-blur"),t.append(i,e),t}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===dr.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,ko.C8)(),this.btnVideo.classList.add("disabled"),void this.hide();const i=!e.isOutgoing&&t===dr.Z.PENDING;this.declineI18nElement.compareAndUpdate({key:t===dr.Z.PENDING?"Call.Decline":"Call.End"}),this.btnAccept.classList.toggle("disable",!i),this.btnAccept.classList.toggle("hide-me",!i),this.container.classList.toggle("two-button-rows",i);const s=e.isMuted,n=()=>{this.btnMute.firstElementChild.classList.toggle("active",s)},a=this.microphoneIcon.getItem().player;this.microphoneIcon.setState(!s,!s,n),a||n(),this.muteI18nElement.compareAndUpdate({key:s?"VoipUnmute":"Call.Mute"});const o=e.isSharingVideo;this.btnVideo.firstElementChild.classList.toggle("active",o);const r=e.isSharingScreen;this.btnScreen.firstElementChild.classList.toggle("active",r);const d=e.getMediaState("output");(0,xe.Z)({element:this.partyMutedState,className:"is-visible",forwards:!!(null==d?void 0:d.muted),duration:300});const l=this.videoContainers,c=Object.assign({},l);["input","output"].forEach((t=>{const i=e.getMediaState(t),s=e.getVideoElement(t),n=!!(s&&s.videoWidth&&s.videoHeight);!s||n||s.dataset.hasPromise||(s.dataset.hasPromise="1",(0,un.Z)(s).then((()=>{delete s.dataset.hasPromise,this.updateInstance()})));const a=!!s&&n&&!(!i||"active"!==i.videoState&&"active"!==i.screencastState);let o=l[t];a&&s&&!o&&(o=l[t]=this.createVideoContainer(s),this.container.append(o)),!a&&o&&(o.remove(),delete l[t])}));{const e=l.input,t=l.output;Object.keys(c).length!==Object.keys(l).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(l).length),!this.emojisSubtitle.textContent&&t{(0,U.Z)(this.emojisSubtitle,(0,R.Z)(e.join("")))})),this.setDescription()}resizeVideoContainers(){Object.values(this.videoContainers).forEach((e=>{if(e.classList.contains("small")){const t=e.querySelector("video"),i=this.movablePanel.state,s=240,n=240,a=t.videoHeight>t.videoWidth,o=a?n:s,r=1/3*((0,ko.rB)()?65535:a?i.height:i.width),d=a?t.videoWidth/t.videoHeight:1,l=a?1:t.videoHeight/t.videoWidth;e.style.width=r*d+"px",e.style.height=r*l+"px",e.style.maxWidth=o*d+"px",e.style.maxHeight=o*l+"px"}else e.style.cssText=""}))}setDescription(){this.description.update(this.instance)}}var mr=i(2069),gr=i(9585),vr=i(2493);class br{constructor(e){this.managers=e,this.onState=()=>{this.updateInstance(this.instance)};const t=this.listenerSetter=new oe.Z;t.add(vr.Z)("instance",(({instance:e})=>{this.instance||this.updateInstance(e)})),t.add(vr.Z)("accepting",(e=>{this.instance!==e&&this.updateInstance(e)})),t.add(qa.ZP)("instance",(e=>{this.updateInstance(e)})),t.add(d.Z)("group_call_update",(e=>{const t=qa.ZP.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)})),t.add(gr.Z.ANALYSER_LISTENER)("amplitude",(({amplitudes:e,type:t})=>{const{weave:i}=this;if(!e.length||!i)return;let s=0;for(let t=0;ts?n:s}i.setAmplitude(s)}))}clearCurrentInstance(){this.instance&&(this.center.textContent="",this.currentDescription&&(this.currentDescription.detach(),this.currentDescription=void 0),this.instance=void 0,this.instanceListenerSetter.removeAll())}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0);const t=this.instance!==e;t&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new oe.Z,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof rr.Z?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof rr.Z)));const i=this.instance.isMuted,s=e instanceof rr.Z?e.state:function(e,t){switch(e){case dr.Z.CLOSING:case dr.Z.CLOSED:return yo.Z.CLOSED;case dr.Z.CONNECTED:return t?yo.Z.MUTED:yo.Z.UNMUTED;default:return yo.Z.CONNECTING}}(e.connectionState,i),{weave:n}=this;n.componentDidMount();const a=s===yo.Z.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),(0,xe.Z)({element:document.body,className:"is-calling",forwards:!a,duration:250,onTransitionEnd:a?()=>{n.componentWillUnmount(),this.clearCurrentInstance()}:void 0})),a||(n.setCurrentState(s,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!i))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof rr.Z)return this.groupCallTitle.update(e);(0,U.Z)(this.center,new B.Z({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header","topbar-call-container");const i=document.createElement("div");i.classList.add("topbar-call-left");const s=this.groupCallMicrophoneIconMini=new cr,n=(0,Zn.Z)();n.append(s.container),i.append(n);const a=(0,Na.Z)((()=>{this.instance.toggleMuted()}),600,!0);(0,S.fc)(n,(e=>{(0,ye.Z)(e),a()}),{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add("topbar-call-center"),this.groupCallTitle=new Go(o),this.groupCallDescription=new jo(i),this.callDescription=new lr(i);const r=document.createElement("div");r.classList.add("topbar-call-right");const d=(0,Zn.Z)("endcall_filled");r.append(d),(0,S.fc)(d,(e=>{(0,ye.Z)(e);const{instance:t}=this;t&&(t instanceof rr.Z?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))}),{listenerSetter:e}),(0,S.fc)(t,(()=>{if(this.instance instanceof rr.Z){if(w.Z.getPopups(or).length)return;(new or).show()}else if(this.instance instanceof mr.Z){if(w.Z.getPopups(pr).find((e=>e.getCallInstance()===this.instance)))return;new pr(this.instance).show()}}),{listenerSetter:e}),t.append(i,o,r);const l=this.weave=new Co,c=l.render("topbar-call-weave");t.prepend(c),document.getElementById("column-center").prepend(t),l.componentDidMount()}}var yr=i(2614),wr=i(6009),Sr=i(493),Cr=i(2131),Er=i(6702),Lr=i(7746),Ir=i(2491),Mr=i(1722),Pr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Zr=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=Cr.Z,this.faviconElements=Array.from(document.head.querySelectorAll('link[rel="icon"], link[rel="alternate icon"]')),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{const e=["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map((()=>{}));Promise.all(e).then((e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&Er.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?Er.default.subscribe():Er.default.unsubscribe())}Er.default.setSettings(this.settings)})),fn.Z.getState().then((e=>{this.settings.nosound=!e.settings.notifications.sound}))},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)}}construct(e){this.managers=e,navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.setAppBadge=navigator.setAppBadge&&navigator.setAppBadge.bind(navigator),this.setAppBadge&&this.setAppBadge(0),this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),this.topMessagesDeferred=(0,he.Z)(),vo.Z.addEventListener("deactivated",(()=>{this.stop()})),vo.Z.addEventListener("activated",(()=>{this.stopped&&this.start()})),ft.Z.addEventListener("change",(e=>{this.stopped||(e||this.clear(),this.toggleToggler())})),d.Z.addEventListener("notification_reset",(e=>{this.soundReset(e)})),d.Z.addEventListener("notification_cancel",(e=>{this.cancel(e)})),this.setAppBadge&&d.Z.addEventListener("folder_unread",(e=>{0===e.id&&this.setAppBadge(e.unreadUnmutedPeerIds.size)})),Er.default.addEventListener("push_init",(e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):Er.default.subscribe()})),Er.default.addEventListener("push_subscribe",(e=>{this.registerDevice(e)})),Er.default.addEventListener("push_unsubscribe",(e=>{this.unregisterDevice(e)})),d.Z.addEventListener("dialogs_multiupdate",(()=>{this.topMessagesDeferred.resolve()}),{once:!0}),Er.default.addEventListener("push_notification_click",(e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void this.managers.apiManager.invokeApi("account.updateDeviceLocked",{period:86400}).then((()=>{}));const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then((()=>Pr(this,void 0,void 0,(function*(){e.custom.channel_id&&!(yield this.managers.appChatsManager.hasChat(e.custom.channel_id))||t.isUser()&&!(yield this.managers.appUsersManager.hasUser(t))||Ur.setInnerPeer({peerId:t,lastMsgId:(0,ut.Z)(+e.custom.msg_id)})}))))}))}buildNotification({message:e,fwdCount:t,peerReaction:i,peerTypeNotifySettings:s}){return Pr(this,void 0,void 0,(function*(){const n=e.peerId,a=n.isAnyChat(),o={},[r,d=!1]=yield Promise.all([this.managers.appPeersManager.getPeerString(n),a&&this.managers.appPeersManager.isForum(n)]);let l,c=!1;if(s.show_previews)if("message"===e._&&e.fwd_from&&t>1)l=C.ZP.format("Notifications.Forwarded",!0,[t]);else{l=yield(0,G.Z)({message:e,plain:!0});const t=null==i?void 0:i.reaction;if("reactionEmoji"===(null==t?void 0:t._)){const e="Notification.Contact.Reacted",i=[(0,Lr.Z)(t.emoticon),l];l=C.ZP.format(e,!0,i)}else c=!0}else l=C.ZP.format("Notifications.New",!0);i&&(o.noIncrement=!0,o.silent=!0);const h=d?(0,v.Z)(e,d):void 0,u=i?(0,D.Z)(i.peer_id):e.fromId;if(o.title=yield(0,Sr.Z)({peerId:n,plainText:!0,managers:this.managers,threadId:h}),d){const t=yield(0,Sr.Z)({peerId:n,plainText:!0,managers:this.managers});o.title+=` (${t})`,c&&u!==e.peerId&&(l=(yield(0,Sr.Z)({peerId:u,plainText:!0,managers:this.managers}))+": "+l)}else a&&u!==e.peerId&&(o.title=(yield(0,Sr.Z)({peerId:u,plainText:!0,managers:this.managers}))+" @ "+o.title);o.title=(0,Ir.Z)(o.title),o.onclick=()=>{Ur.setInnerPeer({peerId:n,lastMsgId:e.mid,threadId:h})},o.message=l,o.key="msg"+e.mid,o.tag=r,o.silent=!0;const f=yield this.managers.appPeersManager.getPeerPhoto(n);f?this.managers.appAvatarsManager.loadAvatar(n,f,"photo_small").then((t=>{(e.pFlags.unread||i)&&(o.image=t,this.notify(o))})):this.notify(o)}))}toggleToggler(e=ft.Z.isIdle){if(T.IS_MOBILE)return;const t=e=>{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=C.ZP.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const i=t.getContext("2d");i.beginPath(),i.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),i.fillStyle="#3390ec",i.fill();let s=24,n=""+e;e<10?s=22:e<100?s=20:(n="99+",s=16),s*=window.devicePixelRatio,i.font=`700 ${s}px ${Ct.bt}`,i.textBaseline="middle",i.textAlign="center",i.fillStyle="white",i.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)}),1e3):t()}setFavicon(e){this.prevFavicon!==e&&(this.prevFavicon=e,this.faviconElements.forEach(((t,i,s)=>{const n=t.cloneNode();n.dataset.href||(n.dataset.href=n.href),null!=e||(e=n.dataset.href),n.href=e,t.replaceWith(s[i]=n)})))}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),e.noIncrement||++this.notificationsCount,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,i=e.key||"k"+t;this.notificationsShown[i]=!0;const s=(0,Ft.Z)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=s),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let n;if("Notification"in window){try{if(e.tag)for(const t in this.notificationsShown){const i=this.notificationsShown[t];"boolean"!=typeof i&&i.tag===e.tag&&(i.hidden=!0)}n=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void Er.default.setLocalNotificationsDisabled()}n.onclick=()=>{n.close(),Mr.Z.focus(),this.clear(),e.onclick&&e.onclick()},n.onclose=()=>{n.hidden||(delete this.notificationsShown[i],this.clear())},n.show&&n.show(),this.notificationsShown[i]=n,T.IS_MOBILE||setTimeout((()=>{this.hide(i)}),8e3)}}getLocalSettings(){return this.settings}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}testSound(e){const t=(0,Ft.Z)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(s),s.addEventListener("ended",(()=>{s.remove()}),{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,Er.default.hidePushNotifications()}start(){if(this.updateLocalSettings(),d.Z.addEventListener("settings_updated",this.updateLocalSettings),Er.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}registerDevice(e){if(this.registeredDevice&&(0,so.Z)(this.registeredDevice,e))return!1;this.managers.apiManager.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then((()=>{this.registeredDevice=e}),(e=>{e.handled=!0}))}unregisterDevice(e){if(!this.registeredDevice)return!1;this.managers.apiManager.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then((()=>{this.registeredDevice=!1}),(e=>{e.handled=!0}))}};ue.GO&&(ue.GO.uiNotificationsManager=Zr);const kr=Zr;var Tr=i(2423),xr=i(236),Ar=i(5936),_r=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function Fr(e,t=!1){return _r(this,void 0,void 0,(function*(){const i=[],s=(e,n)=>_r(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise(((e,i)=>{t.readEntries((t=>_r(this,void 0,void 0,(function*(){for(const e of t)yield s(e,n);e()}))))}))}else if(e)if(t)i.push(e.type);else{const t=n.getAsFile(),s=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise(((i,s)=>e.file(i,(e=>i(t)))));if(!s)return;i.push(s)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let s=0;s{(0,ye.Z)(null);let i,s,n=t.href;const a=new URL(n),o=a.host.match(/(.+?)\.t(?:elegram)?\.me/);o&&(a.pathname=o[1]+("/"===a.pathname?"":a.pathname),n=a.toString()),e.noPathnameParams||(i=new URL(n).pathname.split("/").slice(1)),e.noUriParams||(s=(0,Dr.Z)(n));const r=e.callback({pathnameParams:i,uriParams:s},t);return void 0===r&&r}}var Br=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Nr extends l.Z{constructor(){super(...arguments),this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.tabId=-1,this.chats=[],this.cacheStorage=new Ar.Z("cachedFiles"),this.onHashChange=e=>{try{this.onHashChangeUnsafe(e)}catch(e){this.log.error("hash change error",e)}},this.onHashChangeUnsafe=e=>{const t=location.hash;e||Ln.Z.replaceState();const i=t.split("?"),s=(0,Dr.Z)(t,i);if(this.log("hashchange",t,i[0],s),t)if(s.tgaddr)this.openUrl(s.tgaddr);else switch(i[0]){default:s.p=i[0].slice(1);case"#/im":{if(!Object.keys(s).length)break;const e=s.p,t=void 0!==s.post?(0,ut.Z)(+s.post):void 0;"@"===e[0]?this.openUsername({userName:e,lastMsgId:t}):this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}},this.setSettings=()=>{const{messagesTextSize:e}=d.Z.settings;this.customEmojiSize=(0,Ke.C)(e+4,e+4),document.documentElement.style.setProperty("--messages-text-size",e+"px"),this.customEmojiSize&&(document.querySelectorAll("middle-ellipsis-element").forEach((t=>{t.disconnectedCallback(),t.dataset.fontSize=""+e,t.title&&(t.textContent=t.title),t.connectedCallback()})),document.querySelectorAll(".chat custom-emoji-renderer-element").forEach((e=>{e.forceRenderAfterSize=!0}))),document.body.classList.toggle("animation-level-0",!d.Z.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",d.Z.settings.animationsEnabled),this.chatsSelectTabDebounced=(0,Ie.Z)((()=>{var e;null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0),this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)}),d.Z.settings.animationsEnabled?250:0,!1,!0),ks.Z.setLoop(d.Z.settings.stickers.loop),s.Z.checkAnimations2(!1);for(const e of this.chats)e.setAutoDownloadMedia();C.ZP.setTimeFormat(d.Z.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>Br(this,void 0,void 0,(function*(){const i=gn();if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&(0,ye.Z)(e)}const s=yield Fr(e);if(((yield this.canDrag())||i)&&s.length){if(i)return void i.addFiles(s);const e=this.chat.input;e.willAttachType=t||(ln.Z.has(s[0].type)?"media":"document"),w.Z.createPopup(vn,this.chat,s,e.willAttachType)}}))}get myId(){return d.Z.myId}get chat(){return this.chats[this.chats.length-1]}construct(e){this.managers=e;const{apiUpdatesManager:t}=e;t.attach(C.ZP.lastRequestedLangCode),na.Z.construct(e),kr.construct(e),kr.start(),this.log=(0,r.kg)("IM",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.backgroundPromises={},xr.h.settings.themes.forEach((e=>{if(e.background.slug){const t="assets/img/"+e.background.slug+".svg"+(T.IS_FIREFOX?"?1":"");this.backgroundPromises[e.background.slug]=Promise.resolve(t)}})),this.selectTab(0),ft.Z.addEventListener("change",(e=>{this.offline=e,this.updateStatus(),e?clearInterval(this.updateStatusInterval):this.updateStatusInterval=window.setInterval((()=>this.updateStatus()),5e4)})),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.emojiAnimationContainer=document.createElement("div"),this.emojiAnimationContainer.classList.add("emoji-animation-container"),this.appendEmojiAnimationContainer(o.Z.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),Ln.Z.onHashChange=this.onHashChange,this.setSettings(),d.Z.addEventListener("settings_updated",this.setSettings);const i=e=>{document.body.classList.toggle("is-premium",e)};d.Z.addEventListener("premium_toggle",i),i(d.Z.premium),this.managers.rootScope.getPremium().then(i),(0,le.ZP)((()=>{s.Z.setOnlyOnePlayableGroup("lock"),s.Z.checkAnimations2(!0)}),(()=>{s.Z.setOnlyOnePlayableGroup(),s.Z.checkAnimations2(!1)})),T.IS_FIREFOX&&fn.Z.oldVersion&&-1===(0,wr.Z)(fn.Z.oldVersion,"1.4.3")?this.deleteFilesIterative((e=>"image/svg+xml"===e.headers.get("Content-Type"))).then((()=>{this.applyCurrentTheme()})):this.applyCurrentTheme(),o.Z.addEventListener("changeScreen",((e,t)=>{document.body.classList.contains(n.ir)&&document.body.classList.contains(a.HQ)&&a.ZP.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)})),o.Z.addEventListener("resize",(()=>{const e=this.chatsContainer.getBoundingClientRect();ao.resizeInstances(e.width,e.height).then((()=>{}))})),this.addEventListener("peer_changing",(e=>{this.saveChatPosition(e)})),d.Z.addEventListener("theme_change",(()=>{this.applyCurrentTheme()})),d.Z.addEventListener("choosing_sticker",(e=>{this.setChoosingStickerTyping(!e)})),d.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{var i;(null===(i=this.chat)||void 0===i?void 0:i.peerId)!==e||t||-1===this.tabId||this.overrideHash(e)})),d.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>{var i;const s=this.chat;if(!s||s.peerId!==e||pt.Z.isOverlayActive||o.Z.activeScreen===o._.mobile&&1!==this.tabId)return;const n=t.find((e=>"sendMessageEmojiInteraction"===e.action._));if("sendMessageEmojiInteraction"===(null===(i=null==n?void 0:n.action)||void 0===i?void 0:i._)){const t=n.action,i=s.bubbles.bubbles[(0,ut.Z)(n.action.msg_id)];if(i&&i.classList.contains("emoji-big")&&(0,Ne.Z)(i,s.bubbles.scrollable.container)){const s=i.querySelector(".media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)");JSON.parse(t.interaction.data).a.forEach((e=>{setTimeout((()=>{(0,S.tH)(s)}),1e3*e.t)})),this.managers.appMessagesManager.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}));const l=e=>{const t="version"===e,i=new w.Z("popup-instance-deactivated",{overlayClosable:!0}),s=document.createElement("div");s.classList.add("instance-deactivated-container"),i.container.replaceWith(s);const n=document.createElement("div");n.classList.add("header"),n.append((0,C.ag)(t?"Deactivated.Version.Title":"Deactivated.Title"));const a=document.createElement("div");a.classList.add("subtitle"),a.append((0,C.ag)(t?"Deactivated.Version.Subtitle":"Deactivated.Subtitle")),s.append(n,a),document.body.classList.add("deactivated");const o=t?()=>{Mr.Z.reload()}:()=>{document.body.classList.add("deactivated-backwards"),vo.Z.activateInstance(),setTimeout((()=>{document.body.classList.remove("deactivated","deactivated-backwards")}),333)};i.addEventListener("close",o),i.show()};vo.Z.addEventListener("deactivated",l),vo.Z.deactivatedReason&&l(vo.Z.deactivatedReason),this.addEventListener("chat_changing",(({to:e})=>{this.toggleChatGradientAnimation(e)})),d.Z.addEventListener("service_notification",(e=>{(0,ci.Z)({button:{langKey:"OK",isCancel:!0},description:(0,rt.ZP)(e.message)})})),d.Z.addEventListener("payment_sent",(({peerId:e,mid:t,receiptMessage:i})=>Br(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageByPeer(e,t);if(!s)return;const n=i.action;(0,ge.bC)({langPackKey:"PaymentInfoHint",langPackArguments:[(0,wt.Z)(n.total_amount,n.currency),(0,R.Z)(s.media.title)]})})))),window.onSpoilerClick=e=>{const t=(0,pe.Z)(e.target,"spoiler"),i=(0,pe.Z)(t,"spoilers-container")||t.parentElement,s="is-spoiler-visible",n=i.classList.contains(s);n||((0,ye.Z)(e),"click"!==S.pf&&window.addEventListener("click",ye.Z,{capture:!0,once:!0}));const a=n?0:2;a&&i.classList.add("will-change");const o=i.dataset.spoilerTimeout;null!==o&&(clearTimeout(+o),delete i.dataset.spoilerTimeout),(0,xe.Z)({element:i,className:s,forwards:!0,duration:200,onTransitionEnd:()=>{i.dataset.spoilerTimeout=""+window.setTimeout((()=>{(0,xe.Z)({element:i,className:s,forwards:!1,duration:200,onTransitionEnd:()=>{i.classList.remove("will-change"),delete i.dataset.spoilerTimeout}})}),5e3)},useRafs:a})},d.Z.addEventListener("sticker_updated",(({type:e,faved:t})=>{"faved"===e?(0,ge.bC)({langPackKey:t?"AddedToFavorites":"RemovedFromFavorites"}):t||(0,ge.bC)({langPackKey:"RemovedFromRecent"})})),fn.Z.addEventListener("notificationBuild",(e=>Br(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.isForum(e.message.peerId),i=(0,v.Z)(e.message,t);(this.chat.peerId!==e.message.peerId||this.chat.threadId!==i||ft.Z.isIdle)&&kr.buildNotification(e)})))),this.addEventListener("peer_changed",(({peerId:e})=>Br(this,void 0,void 0,(function*(){document.body.classList.toggle("has-chat",!!e),this.emojiAnimationContainer.textContent="",this.overrideHash(e),fn.Z.updateTabState("chatPeerIds",this.chats.map((e=>e.peerId)).filter(Boolean))})))),mo.Z.setToCache("chatPositions",{}),(Re.Z||Ka.Z)&&(this.topbarCall=new br(e)),Re.Z&&(vr.Z.addEventListener("instance",(({instance:e})=>{const t=new pr(e);e.addEventListener("acceptCallOverride",(()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then((()=>(vr.Z.dispatchEvent("accepting",e),!0))).catch((()=>!1)))),t.addEventListener("close",(()=>{const t=vr.Z.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")}),{once:!0}),t.show()})),vr.Z.addEventListener("incompatible",(e=>Br(this,void 0,void 0,(function*(){(0,ge.bC)({langPackKey:"VoipPeerIncompatible",langPackArguments:[yield(0,Nt.Z)({peerId:e.toPeerId()})]})}))))),vo.Z.activateInstance();const c=()=>{bo.default.setAuthorized(!0)};setInterval(c,A.s2),c(),Rr({name:"showMaskedAlert",callback:(e,t)=>{const i=t.href,s=t.cloneNode(!0);s.className="anchor-url",s.innerText=i,s.removeAttribute("onclick"),new Ls.Z("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[s],buttons:[{langKey:"Open",callback:()=>{s.click()}}]}).show()}}),Rr({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:i}=e;this.managers.appMessagesManager.sendText(this.chat.peerId,"/"+t+(i?"@"+i:""))}}),Rr({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),[["addstickers",Pe.STICKER_SET],["addemoji",Pe.EMOJI_SET]].forEach((([e,t])=>{Rr({name:e,callback:({pathnameParams:e})=>{if(!e[1])return;const i={_:t,set:e[1]};this.processInternalLink(i)}}),Rr({name:e,protocol:"tg",callback:({uriParams:e})=>{const i=this.makeLink(t,e);this.processInternalLink(i)}})})),Rr({name:"invoice",callback:({pathnameParams:e})=>{const t={_:Pe.INVOICE,slug:e.length>1?e[1]:e[0].slice(1)};this.processInternalLink(t)}}),Rr({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:Pe.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),Ka.Z&&Rr({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Pe.VOICE_CHAT,e);this.processInternalLink(t)}}),Rr({name:"im",callback:({pathnameParams:e,uriParams:t},i)=>Br(this,void 0,void 0,(function*(){let s;if(Tr.kO.test(e[0]))s={_:Pe.USER_PHONE_NUMBER,phone:e[0].slice(1)};else if("c"===e[0]){e.shift();const n="thread"in t?t.thread:e[2]&&e[1];s={_:Pe.PRIVATE_POST,channel:e[0],post:e[2]||e[1],thread:n,comment:t.comment,stack:this.getStackFromElement(i)}}else{const n="thread"in t?t.thread:e[2]&&e[1];s={_:Pe.MESSAGE,domain:e[0],post:e[2]||e[1],thread:n,comment:t.comment,start:"start"in t?t.start:void 0,stack:this.getStackFromElement(i)}}this.processInternalLink(s)}))}),Rr({name:"resolve",protocol:"tg",callback:({uriParams:e},t)=>{let i;e.phone?i=this.makeLink(Pe.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(i=this.makeLink(Pe.MESSAGE,Object.assign(Object.assign({},e),{stack:this.getStackFromElement(t)}))),this.processInternalLink(i)}}),Rr({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Pe.PRIVATE_POST,e);this.processInternalLink(t)}}),Rr({name:"invoice",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Pe.INVOICE,e);this.processInternalLink(t)}}),["joinchat","join"].forEach((e=>{Rr({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Pe.JOIN_CHAT,e);this.processInternalLink(t)}})})),this.onHashChange(!0),this.attachKeydownListener()}getStackFromElement(e){const t=(0,pe.Z)(e,"bubble");return t?+t.dataset.mid:void 0}deleteFilesIterative(e){return this.cacheStorage.timeoutOperation((t=>{const i=performance.now();return t.keys().then((i=>{const s=i.map((i=>t.match(i).then((t=>e(t)))));return Promise.all(s).then((e=>(e.map(((e,s)=>{if(!e)return;const n=i[s];return t.delete(n)})),Promise.all(e.filter(Boolean)))))})).then((()=>{this.log("deleted files",performance.now()-i)}))}))}toggleChatGradientAnimation(e){this.chats.forEach((t=>{t.gradientRenderer&&t.gradientRenderer.scrollAnimate(d.Z.settings.animationsEnabled&&t===e)}))}appendEmojiAnimationContainer(e){const t=e===o._.mobile?this.columnEl:document.body;this.emojiAnimationContainer.parentElement!==t&&t.append(this.emojiAnimationContainer)}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",(t=>{var i;const s=t.key,n=document.getSelection().isCollapsed;if(pt.Z.isOverlayActive||e.has(s))return;const a=t.target,r=this.chat;if((!(s.startsWith("Arrow")||t.shiftKey&&"Shift"===s)||n)&&("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===a.tagName)){if(!t.altKey||"ArrowUp"!==s&&"ArrowDown"!==s){if("ArrowUp"===s&&"scheduled"!==this.chat.type){if(r.input.editMsgId||!r.input.isInputEmpty())return;this.managers.appMessagesManager.getFirstMessageToEdit(r.peerId,r.threadId).then((e=>{e&&(r.input.initMessageEditing(e.mid),(0,ye.Z)(t))}))}else if("ArrowDown"===s)return}else(0,ye.Z)(t),this.managers.dialogsStorage.getNextDialog(this.chat.peerId,"ArrowDown"===s,$i.default.filterId).then((e=>{e&&this.setPeer({peerId:e.peerId})}));if((null===(i=null==r?void 0:r.input)||void 0===i?void 0:i.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==a.tagName&&!a.isContentEditable&&!c.Z&&(!o.Z.isMobile||1===this.tabId)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),(0,xt.Z)(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 Br(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case Pe.MESSAGE:{const t=e.post?(0,ut.Z)(+e.post):void 0,i=e.comment?(0,ut.Z)(+e.comment):void 0,s=e.thread?(0,ut.Z)(+e.thread):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:i,startParam:e.start,stack:e.stack,threadId:s});break}case Pe.PRIVATE_POST:{const t=e.channel.toChatId(),i=(t.toPeerId(!0),yield this.managers.appChatsManager.getChat(t));if(!i)try{yield this.managers.appChatsManager.resolveChannel(t)}catch(e){throw(0,ge.bC)({langPackKey:"LinkNotFound"}),e}const s=(0,ut.Z)(+e.post),n=e.thread?(0,ut.Z)(+e.thread):void 0;this.op({peer:i,lastMsgId:s,threadId:n,stack:e.stack});break}case Pe.EMOJI_SET:case Pe.STICKER_SET:new M.Z({id:e.set},e._===Pe.EMOJI_SET).show();break;case Pe.JOIN_CHAT:this.managers.appChatsManager.checkChatInvite(e.invite).then((t=>{t.chat&&this.managers.appChatsManager.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new He(e.invite,t):this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})}),(e=>{"INVITE_HASH_EXPIRED"===e.type&&(0,ge.Am)((0,C.ag)("InviteExpired"))}));break;case Pe.VOICE_CHAT:Ka.Z&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case Pe.USER_PHONE_NUMBER:this.managers.appUsersManager.resolvePhone(e.phone).then((e=>{this.setInnerPeer({peerId:e.id.toPeerId(!1)})})).catch((e=>{"PHONE_NOT_OCCUPIED"===e.type&&(0,ge.bC)({langPackKey:"Alert.UserDoesntExists"})}));break;case Pe.INVOICE:this.managers.appPaymentsManager.getInputInvoiceBySlug(e.slug).then((e=>{this.managers.appPaymentsManager.getPaymentForm(e).then((t=>{new _i(void 0,e,t)}))}));break;default:this.log.warn("Not supported internal link:",e)}}))}openUrl(e){const{url:t,onclick:i}=(0,rs.Z)(e);if(!i)return;const s=document.createElement("a");s.href=t,window[i](s)}op(e){return Br(this,void 0,void 0,(function*(){let{peer:t,commentId:i,threadId:s,lastMsgId:n}=e;const a="user"===t._,o=t.id.toPeerId(!a),r="channel"===t._&&t.pFlags.forum;if(i||s||n||!r){if(r&&n&&!s){const t=yield this.managers.appMessagesManager.reloadMessages(o,n);t?s=e.threadId=(0,v.Z)(t,r):(s=e.threadId=n,n=e.lastMsgId=void 0)}return s?this.openThread(Object.assign(Object.assign({},e),{peerId:o})):i?this.openComment({peerId:o,msgId:n,commentId:i}):this.setInnerPeer(Object.assign(Object.assign({},e),{peerId:o}))}$i.default.toggleForumTabByPeerId(o,!0)}))}openUsername(e){const{userName:t}=e;return this.managers.appUsersManager.resolveUsername(t).then((t=>this.op(Object.assign({peer:t},e))),(e=>{"USERNAME_NOT_OCCUPIED"===e.type?(0,ge.bC)({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&(0,ge.bC)({langPackKey:"Alert.UserDoesntExists"})}))}openThread(e){return Br(this,void 0,void 0,(function*(){return(yield this.managers.appChatsManager.isForum(e.peerId.toChatId()))?(yield this.managers.dialogsStorage.getForumTopicOrReload(e.peerId,e.threadId),this.setInnerPeer(e)):this.managers.appMessagesManager.reloadMessages(e.peerId,e.threadId).then((t=>(t?this.managers.appMessagesManager.generateThreadServiceStartMessage(t):e.lastMsgId=void 0,this.setInnerPeer(Object.assign(Object.assign({},e),{type:"discussion"})))))}))}openComment(e){return this.managers.appMessagesManager.getDiscussionMessage(e.peerId,e.msgId).then((t=>this.openThread({peerId:t.peerId,lastMsgId:e.commentId,threadId:t.mid})))}callUser(e,t){return Br(this,void 0,void 0,(function*(){vr.Z.getCallByUserId(e)||((yield this.managers.appProfileManager.getProfile(e)).pFlags.phone_calls_private?(0,Nt.Z)({peerId:e.toPeerId()}).then((e=>(0,ci.Z)({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[e],button:{langKey:"OK",isCancel:!0}}))):(yield this.discardCurrentCall(e.toPeerId()),vr.Z.startCallInternal(e,"video"===t)))}))}discardCurrentCall(e,t,i){return qa.ZP.groupCall&&qa.ZP.groupCall!==t?this.discardGroupCallConfirmation(e):vr.Z.currentCall&&vr.Z.currentCall!==i?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return Br(this,void 0,void 0,(function*(){const t=vr.Z.currentCall;t&&(yield Promise.all([(0,Nt.Z)({peerId:t.interlocutorUserId.toPeerId(!1)}),(0,Nt.Z)({peerId:e})]).then((([t,i])=>(0,ci.Z)({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return Br(this,void 0,void 0,(function*(){const t=qa.ZP.groupCall;t&&(yield Promise.all([(0,Nt.Z)({peerId:t.chatId.toPeerId(!0)}),(0,Nt.Z)({peerId:e})]).then((([t,i])=>(0,ci.Z)({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),qa.ZP.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return Br(this,void 0,void 0,(function*(){const i=e.toChatId(),s=this.managers.appChatsManager.hasRights(i,"manage_call");if(t&&"groupCallDiscarded"===(yield this.managers.appGroupCallsManager.getGroupCallFull(t))._){if(!s)return void(0,ge.bC)({langPackKey:"VoiceChat.Chat.Ended"});yield(0,ci.Z)({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}(()=>{Br(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getChatFull(i);let t;if(e.call)t=e.call;else{if(!s)return;t=yield this.managers.appGroupCallsManager.createGroupCall(i)}qa.ZP.joinGroupCall(i,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=oo.Z.getTheme();if(t.background.slug){const i=xr.h.settings.themes.find((e=>e.name===t.name));return this.getBackground(t.background.slug).then((t=>this.setBackground(t,e)),(()=>(t.background=(0,ra.Z)(i.background),this.setCurrentBackground(!0))))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=this.cacheStorage.getFile("backgrounds/"+e).then((e=>URL.createObjectURL(e)))}setBackground(e,t=!0){this.lastBackgroundUrl=e;const i=this.chats.map((t=>t.setBackground(e)));return i[i.length-1].then((()=>{t&&d.Z.dispatchEvent("background_change")}))}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,i=e.peerId+(e.threadId?"_"+e.threadId:""),s=mo.Z.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!t.getRenderedLength())delete s[i],this.log("deleted chat position");else{t.sliceViewport(!0);const e=t.scrollable.scrollTop,n={mids:(0,Xe.Z)(t.bubbles,"desc").filter((e=>e>0&&!t.skippedMids.has(e))),top:e};s[i]=n,this.log("saved chat position:",n)}mo.Z.set({chatPositions:s},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),i=mo.Z.getFromCache("chatPositions");return i&&i[t]}applyCurrentTheme(e,t,i){return t&&(this.backgroundPromises[e]=Promise.resolve(t)),oo.Z.setTheme(),this.setCurrentBackground(void 0===i?!!e:i)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&go([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),d.Z.settings.animationsEnabled&&!1!==t&&(0,le.YW)((0,Ye.Z)(400),400);const i=(0,Ce.Z)(this.prevTab);(0,Ce.Z)(e)>i&&Ln.Z.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),(0,Fn.Z)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),c.Z||this.attachDragAndDropListeners(),this.markupTooltip=new uo(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let i=!1;const s=(r,d)=>Br(this,void 0,void 0,(function*(){if(d===i)return;const l=r.dataTransfer.types,c=l.contains?l.contains("Files"):l.indexOf("Files")>=0,h=gn(),u=yield Fr(r,!0);if(!c||!(yield this.canDrag())&&!h)return void(n=0);const f=h?o:a,p=h?t:e;if(d&&!p.length){const e=c&&!u.length,t=u.filter((e=>ln.Z.has(e))).length;this.log("drag files",u),h?(h.appendDrops(f),(u.length||e)&&p.push(new po(f,{header:"Preview.Dragging.AddItems",headerArgs:[u.length],onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}}))):((u.length||e)&&p.push(new po(f,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}})),(t||e)&&p.push(new po(f,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"media")}})),this.chat.container.append(f))}(0,xe.Z)({element:f,className:"is-visible",forwards:d,duration:200,onTransitionEnd:()=>{d||(p.forEach((e=>{e.destroy()})),p.length=0)}}),d?p.forEach((e=>{e.setPath()})):n=0,document.body.classList.toggle("is-dragging",d),i=d}));let n=0;document.body.addEventListener("dragenter",(e=>{n++})),document.body.addEventListener("dragover",(e=>{s(e,!0),(0,ye.Z)(e)})),document.body.addEventListener("dragleave",(e=>{n--,0===n&&s(e,!1)}));const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){return Br(this,void 0,void 0,(function*(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||pt.Z.isOverlayActive||!(yield e.canSend("send_media")))}))}overrideHash(e){return Br(this,void 0,void 0,(function*(){let t;if(e){const i=yield this.managers.appPeersManager.getPeerUsername(e);t=i?"@"+i:""+e}Ln.Z.overrideHash(t)}))}selectTab(e,t){var i;!1===t&&go([n.ZP.sidebarEl,this.columnEl,a.ZP.sidebarEl]),document.body.classList.toggle(n.ir,0===e);const s=this.tabId;-1!==s&&this.overrideHash(e>0?null===(i=this.chat)||void 0===i?void 0:i.peerId:void 0),this.log("selectTab",e,s);let r=d.Z.settings.animationsEnabled?(0,ce.d1)():Promise.resolve();if(-1!==s&&s!==e&&d.Z.settings.animationsEnabled&&!1!==t){const e=100+(o.Z.isMobile?250:200);r=(0,Ye.Z)(e),(0,le.YW)(r,e)}this.tabId=e,(0,Fn.Z)(),o.Z.isMobile&&2===s&&e<2&&document.body.classList.remove(a.HQ),-1!==s&&e>s&&(e<2||!Ln.Z.findItemByType("im"))&&Ln.Z.pushItem({type:"im",onPop:e=>{this.setPeer({},e)}});const l=window.onImTabChange;return l&&l(e),r}updateStatus(){return this.managers.appUsersManager.updateMyOnlineStatus(this.offline)}createNewChat(){const e=new lo(this,this.managers);return this.chats.length&&e.setBackground(this.lastBackgroundUrl,!0),this.chats.push(e),e}spliceChats(e,t=!0,i,s){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&this.dispatchEvent("peer_changing",this.chat),s||(s=this.chats.splice(e,this.chats.length-e));const o=this.chat;this.dispatchEvent("chat_changing",{from:n,to:o});for(let e=0;e1&&s.slice(0,-1).forEach((e=>{e.container.remove()})),this.chatsSelectTab(o.container,i),t){this.dispatchEvent("peer_changed",o);const e=a.ZP.getTab(eo);null==e||e.close(),a.ZP.replaceSharedMediaTab(o.sharedMediaTab)}s.forEach((e=>{e.beforeDestroy()})),setTimeout((()=>{s.forEach((e=>{e.destroy()}))}),350)}setPeer(e={},t){var i;return Br(this,void 0,void 0,(function*(){this.init&&(this.init(),this.init=null),null!==(i=e.peerId)&&void 0!==i||(e.peerId=m.NM);const{peerId:s,lastMsgId:a,threadId:r}=e,d=this.chat,l=this.chats.indexOf(d);if(s){if(l>0&&d.peerId&&!this.isSamePeer(d,e)){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===s)return void this.spliceChats(0,!0,!0,t);{const i=this.setPeer(e);return this.spliceChats(0,!1,!1,t),i}}}else{if(l>0)return void this.spliceChats(l,void 0,t);if(o.Z.activeScreen===o._.medium)return void this.selectTab(+!this.tabId,t)}if(s===d.peerId&&o.Z.activeScreen<=o._.medium&&document.body.classList.contains(n.ir))return this.selectTab(1,t),!1;if(s||o.Z.activeScreen!==o._.mobile){const i=yield d.setPeer(e),n=(null==i?void 0:i.cached)?i.promise:Promise.resolve();s&&Promise.all([n,d.setBackgroundPromise]).then((()=>{setTimeout((()=>{setTimeout((()=>{this.chatsSelectTab(this.chat.container)}),0),this.selectTab(1,t)}),0)}))}return s?void 0:(this.selectTab(0,t),!1)}))}setInnerPeer(e){var t;return Br(this,void 0,void 0,(function*(){const{peerId:i}=e;if(i===m.NM||!i)return;e.type||(e.threadId&&!(yield this.managers.appPeersManager.isForum(e.peerId))&&(e.type="discussion"),null!==(t=e.type)&&void 0!==t||(e.type="chat"));const s=this.chats.findIndex((t=>this.isSamePeer(t,e)));if(-1!==s)return this.spliceChats(s+1),this.setPeer(e);const n=this.chat;let a=n;return n.inited&&(a=this.createNewChat()),this.dispatchEvent("chat_changing",{from:n,to:a}),this.setPeer(e)}))}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let i="peer-typing";switch(t.classList.add(i),t.dataset.action=e._,e._){case"sendMessageTypingAction":i+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=i+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":i+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":i+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":i+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=i+"-eye",t.append(e)}}return t.classList.add(i),t}getPeerTyping(e,t,i){return Br(this,void 0,void 0,(function*(){const s=e.isUser();if(s&&(yield this.managers.appUsersManager.isBot(e)))return;const n=yield this.managers.appProfileManager.getPeerTypings(e,i);if(!(null==n?void 0:n.length))return;const a=n[0],o={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"}},r=s?o.private:n.length>1?o.multi:o.chat;let d=a.action;if(n.length>1){const e={};n.forEach((t=>{const i=t.action._;void 0===e[i]&&(e[i]=0),++e[i]})),Object.keys(e).length>1&&(d={_:"sendMessageTypingAction"})}const l=r[d._];if(!l)return;let c,h;if(e.isAnyChat()){const e=new B.Z;c=e.update({peerId:a.userId.toPeerId(!1),onlyFirstName:!0}),h=[e.element,n.length-1],yield c}t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===d._||"sendMessageEmojiInteractionSeen"===d._);let u=t.firstElementChild;if(u?u.dataset.action!==d._&&u.replaceWith(this.getTypingElement(d)):(u=this.getTypingElement(d),t.prepend(u)),"sendMessageEmojiInteractionSeen"===d._){h?h.pop():h=[];const e=(0,yr.Z)((0,R.Z)(d.emoticon));h.push(e)}const f=(0,C.ag)(l,h);return f.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(f):t.append(f),t}))}getChatStatus(e,t){return Br(this,void 0,void 0,(function*(){const i=t?void 0:yield this.getPeerTyping(e.toPeerId(!0));if(i)return{cached:!0,result:Promise.resolve(i)};const s=yield this.managers.acknowledged.appProfileManager.getChatFull(e),n=Promise.resolve(s.result).then((t=>Br(this,void 0,void 0,(function*(){var i,s;const n=t.participants_count||(null===(s=null===(i=t.participants)||void 0===i?void 0:i.participants)||void 0===s?void 0:s.length)||1;let a=yield(0,ma.Z)(e);if(n<2)return a;const o=yield this.managers.appProfileManager.getOnlines(e);if(o>1){const e=document.createElement("span");e.append(...(0,C.v_)([a,(0,C.ag)("OnlineCount",[(0,Oe.Z)(o)])],!1)),a=e}return a}))));return{cached:s.cached,result:n}}))}getUserStatus(e,t){var i;return Br(this,void 0,void 0,(function*(){const s={cached:!0,result:Promise.resolve(void 0)},n=yield this.managers.appUsersManager.getUser(e);if(!n||n.pFlags.self&&!t)return s;const a=(0,Os.Z)(n);if(!n.pFlags.bot&&!n.pFlags.support){let t=yield this.getPeerTyping(e.toPeerId());if(t||"userStatusOnline"!==(null===(i=n.status)||void 0===i?void 0:i._)||(t=document.createElement("span"),t.classList.add("online"),t.append(a)),t)return s.result=Promise.resolve(t),s}return s.result=Promise.resolve(a),s}))}getPeerStatus(e,t,i){return Br(this,void 0,void 0,(function*(){if(!e)return;let s;return s=e.isAnyChat()?this.getChatStatus(e.toChatId(),i):this.getUserStatus(e.toUserId(),t),s}))}setPeerStatus(e){return Br(this,void 0,void 0,(function*(){const{peerId:t,element:i,needClear:s,useWhitespace:n,middleware:a,ignoreSelf:o,noTyping:r}=e;if(!s){const e=i.querySelector(".peer-typing-container");if(e&&(yield this.getPeerTyping(t,e)))return}const d=yield this.getPeerStatus(t,o,r);if(!a())return;const l=()=>Br(this,void 0,void 0,(function*(){const e=d&&(yield d.result);if(a())return()=>(0,U.Z)(i,e||c)})),c=n?"‎":"";return!d||d.cached||void 0===s?yield l():s?()=>(i.textContent=c,l().then((e=>null==e?void 0:e()))):void 0}))}setChoosingStickerTyping(e){this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"},void 0,this.chat.threadId)}isSamePeer(e,t){return e.peerId===t.peerId&&e.threadId===t.threadId&&(typeof e.type!=typeof t.type||e.type===t.type)}}const Or=new Nr;ue.GO&&(ue.GO.appImManager=Or);const Ur=Or},3709:(e,t,i)=>{"use strict";function s(e){var t;return e&&!e.pFlags.is_outgoing&&!e.pFlags.noforwards&&!(null===(t=e.media)||void 0===t?void 0:t.extended_media)}i.d(t,{Z:()=>s})},7530:(e,t,i)=>{"use strict";function s(e){var t;if(!e)return;let i;if(e.action)i=e.action.photo;else if(e.media){let s=e.media;s.webpage?s=s.webpage:"messageExtendedMedia"===(null===(t=s.extended_media)||void 0===t?void 0:t._)&&(s=s.extended_media.media),i=s.document||s.photo}return i}i.d(t,{Z:()=>s})},2291:(e,t,i)=>{"use strict";function s(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}i.d(t,{Z:()=>s})},5381:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(677);function n(e){return!(!e.restriction_reason||!(0,s.X)(e.restriction_reason))}},5990:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});const s=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],n=["red","green","yellow","blue","violet","pink","cyan","orange"],a=[0,7,4,1,6,3,5];function o(e,t=!0){if(!e)return"";const i=a[Math.abs(+e)%7];return(t?n:s)[i]}},6082:(e,t,i)=>{"use strict";function s(e){if(e.username)return e.username;const t=e.usernames,i=null==t?void 0:t.find((e=>e.pFlags.editable));return null==i?void 0:i.username}i.d(t,{Z:()=>s})},2946:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5880),n=i(1507);function a(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const i=e.channel_id||e.chat_id;return void 0!==i?i.toPeerId(!0):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),i=e.substr(1).split("_");return t?i[0].toPeerId():(i[0]||"").toPeerId(!0)}},7030:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9897),n=i(1507);function a(e,t=0,i=0,a=!1,o=!1){window.devicePixelRatio>1&&(t*=2,i*=2);let r=e.sizes||e.thumbs,d={_:"photoSizeEmpty",type:n.Pt};if(o&&r&&"photo"!==e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:n.Pt})),null==r?void 0:r.length){for(let e=0,n=r.length;e=t||a.height>=i)break}a&&"photoSizeEmpty"===d._&&"photoStrippedSize"===r[0]._&&(d=r[0])}return d}},3075:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5953),n=i(5003),a=i(6752);class o{constructor(e){var t;(0,s.Z)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||(0,n.kg)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=(0,n.kg)("RTCPeerConnection")),t("constructor");const i=new RTCPeerConnection(e);return i.addEventListener("track",(e=>{t("ontrack",e)})),i.addEventListener("signalingstatechange",(()=>{t("onsignalingstatechange",i.signalingState)})),i.addEventListener("connectionstatechange",(()=>{t("onconnectionstatechange",i.connectionState)})),i.addEventListener("negotiationneeded",(()=>{t("onnegotiationneeded",i.signalingState)})),i.addEventListener("icecandidate",(e=>{t("onicecandidate",e)})),i.addEventListener("iceconnectionstatechange",(()=>{t("oniceconnectionstatechange",i.iceConnectionState)})),i.addEventListener("datachannel",(()=>{t("ondatachannel")})),i.log=t,{connection:i}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,i){i||(i=(0,n.kg)("RTCDataChannel"));const s=e.createDataChannel("data",t);return s.addEventListener("message",(e=>{i("onmessage",e)})),s.addEventListener("open",(()=>{i("onopen")})),s.addEventListener("close",(()=>{i("onclose")})),s.log=i,s}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new a.ZP(this.connection))}appendStreamToConference(){return this.streamManager.appendToConference(this.description)}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.streamManager.stop()}negotiate(){return this.negotiating||(this.negotiating=this.negotiateInternal().finally((()=>{this.negotiating=void 0})))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}},2069:(e,t,i)=>{"use strict";i.d(t,{Z:()=>N});var s=i(6761),n=i(4762),a=i(5953),o=i(5701),r=i(671),d=i(5003),l=i(3855),c=i(3075),h=i(3773);function u(e){const t=(0,h.Z)(e,e.media[0]),i={"@type":"InitialSetup",fingerprints:[t.fingerprint],ufrag:t.ufrag,pwd:t.pwd,audio:void 0,video:void 0,screencast:void 0},s=e=>""+e;for(const t of e.media){const n=t.mediaType;if("application"===n||!t.isSending)continue;const a=i["video"===n&&i.video?"screencast":n]={},o=(0,h.Z)(e,t);a.ssrc=s(o.source),o.sourceGroups&&(a.ssrcGroups=o.sourceGroups.map((e=>({semantics:e.semantics,ssrcs:e.sources.map(s)}))));const r=a.rtpExtensions=[];t.attributes.get("extmap").forEach((e=>{r.push({id:+e.key,uri:e.value})}));const d=new Map,l=e=>{let t=d.get(e);return t||d.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach((e=>{const t=+e.key,i=l(t),s=e.value.split("/"),[n,a,o]=s;i.name=n,i.clockrate=+a,i.channels=o?+o:0})),t.attributes.get("rtcp-fb").forEach((e=>{const t=+e.key;l(t).feedbackTypes=e.lines.map((e=>{const t=e.split(" "),[i,s]=t;return{type:i,subtype:s||""}}))})),t.attributes.get("fmtp").forEach((e=>{const t=+e.key,i=l(t).parameters={},s=e.value.split(";");for(const e of s){const[t,s]=e.split("=");i[t]=s}})),a.payloadTypes=Array.from(d.values())}return i}var f=i(9124);class p extends c.Z{constructor(e){super(e)}negotiateInternal(){return e=this,t=void 0,s=function*(){const{connection:e,call:t}=this;if(!e.localDescription&&!e.remoteDescription&&!t.isOutgoing)return;let i;if(t.offerReceived){t.offerReceived=!1;const s=i=yield e.createAnswer();this.log("[sdp] local",s.type,s.sdp),yield e.setLocalDescription(s),this.log("[InitialSetup] send 2")}else{const s=i=yield e.createOffer();this.log("[sdp] local",s.sdp),yield e.setLocalDescription(s),t.offerSent=!0,this.log("[InitialSetup] send 0")}const s=u((0,f.DV)(i.sdp));t.sendCallSignalingData(s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var m=i(8500),g=i(2493),v=i(3335),b=i(1677),y=i(49),w=i(6752),S=i(4903);const C="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var E=i(3692),L=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class I{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return t=(0,S.Z)(...e),C.digest("SHA-256",(0,E.Z)(t)).then((e=>new Uint8Array(e)));var t}encryptPrepared(e){return L(this,void 0,void 0,(function*(){const t={counter:0,bytes:new Uint8Array(16+e.length)},i=(this.isOutgoing?0:8)+("Signaling"===this.type?128:0),s=this.p2pKey,n=yield this.concatSHA256([s.subarray(i+88,i+88+32),e]),a=t.bytes;for(let e=0;e<16;++e)a[e]=n[e+8];const o=yield this.prepareAesKeyIv(s,a,i),r=yield this.aesProcessCtr(e,e.length,o,!0);return t.bytes=new Uint8Array([...t.bytes.subarray(0,16),...r]),t}))}encryptRawPacket(e){const t=++this.counter,i=new ArrayBuffer(4);new DataView(i).setUint32(0,t>>>0,!1);const s=new Uint8Array([...new Uint8Array(i),...e]);return this.encryptPrepared(s)}prepareAesKeyIv(e,t,i){return L(this,void 0,void 0,(function*(){const[s,n]=yield Promise.all([this.concatSHA256([t.subarray(0,16),e.subarray(i,i+36)]),this.concatSHA256([e.subarray(40+i,40+i+36),t.subarray(0,16)])]);return{key:new Uint8Array([...s.subarray(0,8),...n.subarray(8,24),...s.subarray(24,32)]),iv:new Uint8Array([...n.subarray(0,4),...s.subarray(8,16),...n.subarray(24,28)])}}))}aesProcessCtr(e,t,i,s=!0){return L(this,void 0,void 0,(function*(){const t=yield C.importKey("raw",i.key,{name:"AES-CTR"},!1,[s?"encrypt":"decrypt"]),n=yield C[s?"encrypt":"decrypt"]({name:"AES-CTR",counter:i.iv,length:8*i.iv.length},t,e);return new Uint8Array(n)}))}constTimeIsDifferent(e,t,i){let s=!0;for(let n=0;n134217728)return;const{isOutgoing:t,type:i}=this,s=(t?8:0)+("Signaling"===i?128:0),n=this.p2pKey,a=e.subarray(0,16),o=e.subarray(16),r=e.length-16,d=yield this.prepareAesKeyIv(n,a,s),l=yield this.aesProcessCtr(o,r,d,!1),c=yield this.concatSHA256([n.subarray(88+s,88+s+32),l]);if(this.constTimeIsDifferent(c.subarray(8),a,16))return;const h=new DataView(l.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),l.slice(4))}))}}var M=i(630);class P{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="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",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));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",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="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",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));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",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}}class Z{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="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+=A(l),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);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+=A(l),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="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+=A(h),r+="\na=rtcp-mux",r+=_(l),r+=F(i,n,a,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${l.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(l),r+=F(i,n,a,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}class k{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="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+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);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+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="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+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);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+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}function T(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function x(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function A(e){let t=[];for(let i=0;i{const{type:i,subtype:s}=e;t.push(`a=rtcp-fb:${n} ${[i,s].join(" ")}`)})),l){const e=[];Object.getOwnPropertyNames(l).forEach((t=>{e.push(`${t}=${l[t]}`)})),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function F(e,t,i,s){let n=[];return i&&i.length>0?i.forEach((t=>{t&&t.ssrcs.length>0&&(n.push(`a=ssrc-group:${t.semantics} ${t.ssrcs.join(" ")}`),t.ssrcs.forEach((t=>{n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`)})))})):t&&n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`),n.join("\n")}class D{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:i,sdpMid:s,foundation:n,component:a,protocol:o,priority:r,address:d,type:l,relAddress:c,generation:h,tcpType:u,networkId:f,networkCost:p,username:m}=e;if(t)return{candidate:t,sdpMLineIndex:i,sdpMid:s};throw"no sdpString"}static generateOffer(e){return T()?Z.generateOffer(e):x()?k.generateOffer(e):P.generateOffer(e)}static generateAnswer(e){return T()?Z.generateAnswer(e):x()?k.generateAnswer(e):P.generateAnswer(e)}}var R=i(9585),B=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class N extends m.Z{constructor(e){super(),this.log=(0,d.kg)("CALL"),this.protocol||(this.protocol={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}),(0,a.Z)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",(e=>{this.log("state",v.Z[e]),e===v.Z.CLOSED&&this.cleanup()}));const t=this.streamManager=new R.Z(b.iK);t.direction="sendrecv",t.types.push("screencast"),this.isOutgoing||(t.locked=!0,t.canCreateConferenceEntry=!1);let i={"@type":"MediaState",type:"input",lowBattery:!1,muted:!0,screencastState:"inactive",videoRotation:0,videoState:"inactive"};const s=this;i=new Proxy(i,{set:function(e,t,n){return e[t]=n,s.setMediaState(i),s.sendMediaState(),!0}}),this.mediaStates={input:i},this.sendMediaState=(0,o.Z)(this._sendMediaState.bind(this),0,!1,!0)}get connectionState(){const{_connectionState:e,connectionInstance:t}=this;if(void 0!==e)return e;if(t){const{iceConnectionState:e}=t.connection;return"closed"===e?v.Z.CLOSED:"connected"===e||n.IS_SAFARI&&"completed"===e?v.Z.CONNECTED:v.Z.CONNECTING}return v.Z.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(v.Z.CLOSED-e+1);return t+=2147483647e3-(e===v.Z.PENDING&&this.isOutgoing?0:this.createdAt),t}getVideoElement(e){if("input"===e)return this.elements.get("main");{const e=this.getMediaState("output");if(!e)return;const t="active"===e.videoState?"video":"active"===e.screencastState?"screencast":void 0;if(!t)return;const i=this.description.findEntry((e=>e.type===t));if(!i)return;return this.elements.get(""+i.recvEntry.source)}}startScreenSharingInternal(){return B(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 B(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return B(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 B(this,void 0,void 0,(function*(){const e=this.getMediaState("input");e.videoState=e.screencastState="inactive";const{streamManager:t,description:i}=this,s=t.inputStream.getVideoTracks()[0];s&&((0,y.Z)(s),t.appendToConference(i))}))}toggleVideoSharing(){return B(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===v.Z.CLOSING||e===v.Z.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=s.Z.setTimeout((()=>{this.hangUpTimeout=void 0,this.hangUp(t)}),e)}clearHangUpTimeout(){void 0!==this.hangUpTimeout&&(clearTimeout(this.hangUpTimeout),this.hangUpTimeout=void 0)}setPhoneCall(e){this.call=e;const{id:t}=e;if(this.id!==t){const e=this.id;this.id=t,this.dispatchEvent("id",t,e)}}acceptCall(){var e;return B(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(v.Z.EXCHANGING_KEYS);const i=this.call;this.requestInputSource(!0,!!i.pFlags.video,!1);const s=i.g_a_hash;this.managers.appCallsManager.generateDh().then((e=>B(this,void 0,void 0,(function*(){return this.dh={g_a_hash:s,b:e.a,g_b:e.g_a,g_b_hash:e.g_a_hash,p:e.p},this.managers.apiManager.invokeApi("phone.acceptCall",{peer:yield this.managers.appCallsManager.getCallInput(this.id),protocol:this.protocol,g_b:this.dh.g_b})})))).then((e=>B(this,void 0,void 0,(function*(){yield this.managers.appCallsManager.savePhonePhoneCall(e)})))).catch((e=>{this.log.error("accept call error",e),this.hangUp("phoneCallDiscardReasonHangup")}))}))}joinCall(){this.log("joinCall"),this.getEmojisFingerprint(),this.overrideConnectionState();const{isOutgoing:e,encryptionKey:t,streamManager:i}=this,s=function(e){const t=[];return e.connections.forEach((e=>{switch(e._){case"phoneConnectionWebrtc":{const{ip:i,ipv6:s,port:n,username:a,password:o}=e,r=[];e.pFlags.turn?(i&&r.push(`turn:${i}:${n}`),s&&r.push(`turn:[${s}]:${n}`)):e.pFlags.stun&&(i&&r.push(`stun:${i}:${n}`),s&&r.push(`stun:[${s}]:${n}`)),r.length>0&&t.push({urls:r,username:a,credential:o});break}}})),{iceServers:t,iceTransportPolicy:e.pFlags.p2p_allowed?"all":"relay"}}(this.call);if(this.log("joinCall configuration",s),!s)return;const n=this.connectionInstance=new p({call:this,streamManager:i,log:this.log.bindPrefix("connection")}),a=n.createPeerConnection(s);a.addEventListener("iceconnectionstatechange",(()=>{const e=this.connectionState;void 0===this.connectedAt&&e===v.Z.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 I(e,t),this.decryptor=new I(!e,t),this.log("currentCall",this),e&&n.appendStreamToConference(),this.createDataChannel(),this.processDecryptQueue()}createDataChannelEntry(){const e=this.description.createEntry("application");e.setDirection("sendrecv"),e.sendEntry=e.recvEntry=e}createDataChannel(){if(this.connectionInstance.dataChannel)return;const e=this.connectionInstance.createDataChannel({id:0,negotiated:!0});e.addEventListener("message",(e=>{this.applyDataChannelData(JSON.parse(e.data))})),e.addEventListener("open",(()=>{this.sendMediaState()}))}applyDataChannelData(e){"MediaState"===e["@type"]?(e.type="output",this.log("got output media state",e),this.setMediaState(e)):this.log.error("unknown data channel data:",e)}_sendMediaState(){const{connectionInstance:e}=this;if(!e)return;const t=Object.assign({},this.getMediaState("input"));delete t.type,this.log("sendMediaState",t),e.sendDataChannelData(t)}sendCallSignalingData(e){return B(this,void 0,void 0,(function*(){const t=JSON.stringify(e),i=(new TextEncoder).encode(t),{bytes:s}=yield this.encryptor.encryptRawPacket(i);this.log("sendCallSignalingData",this.id,t),yield this.managers.apiManager.invokeApi("phone.sendSignalingData",{peer:yield this.managers.appCallsManager.getCallInput(this.id),data:s})}))}sendIceCandidate(e){this.log("sendIceCandidate",e);const{candidate:t,sdpMLineIndex:i}=e;if(0!==i)return;const s=function(e){if(!e||!e.startsWith("candidate:"))return;const t=e;e=e.substr("candidate:".length);const[i,s,n,a,o,r,...d]=e.split(" "),l={sdpString:t,foundation:i,component:s,protocol:n,priority:a,address:{ip:o,port:r}};for(let e=0;e(this.getEmojisFingerprintPromise=void 0,this.emojisFingerprint=e.map((e=>(0,r.zu)(e))))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return B(this,void 0,void 0,(function*(){this.connectionInstance.appendStreamToConference();const e=this.connectionInstance.connection;let t=yield e.createAnswer();this.log("[sdp] local",t.type,t.sdp),yield e.setLocalDescription(t),e.getTransceivers().filter((e=>"recvonly"===e.direction)).forEach((e=>{const t=this.connectionInstance.description.getEntryByMid(e.mid);t.transceiver=t.recvEntry.transceiver=e,e.direction="sendrecv"}));const i=this.description,s=i.entries.map((e=>e.mid)),n={type:"offer",sdp:i.generateSdp({bundle:s,entries:i.entries.filter((e=>s.includes(e.mid))),isAnswer:!0})};yield e.setRemoteDescription(n),t=yield e.createAnswer(),yield e.setLocalDescription(t);const a=u((0,f.DV)(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 B(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(v.Z.CLOSED),this.connectionInstance&&this.connectionInstance.closeConnectionAndStream(!0),e&&!t)){let t=!1;for(const e in this.mediaStates){const i=this.mediaStates[e];t="active"===i.videoState||"active"===i.screencastState||t}yield this.managers.appCallsManager.discardCall(this.id,this.duration,e,t)}}))}performCodec(e){const t=e.payloadTypes.map((e=>Object.assign(Object.assign({},e),{"rtcp-fbs":e.feedbackTypes})));return{"rtp-hdrexts":e.rtpExtensions,"payload-types":t}}setDataToDescription(e){this.description.setData({transport:{pwd:e.pwd,ufrag:e.ufrag,fingerprints:e.fingerprints,"rtcp-mux":!0},audio:this.performCodec(e.audio),video:e.video?this.performCodec(e.video):void 0,screencast:e.screencast?this.performCodec(e.screencast):void 0})}filterNotVP8(e){this.isOutgoing||[e.video,e.screencast].filter(Boolean).forEach((e=>{const t=e.payloadTypes,i=t.findIndex((e=>"VP8"===e.name)),s=t[i],n=t.findIndex((e=>{var t;return+(null===(t=e.parameters)||void 0===t?void 0:t.apt)===s.id}));e.payloadTypes=[t[i],t[n]]}))}applyCallSignalingData(e){return B(this,void 0,void 0,(function*(){this.log("applyCallSignalingData",this,e);const{connection:t,description:i}=this.connectionInstance;switch(e["@type"]){case"InitialSetup":{this.log("[sdp] InitialSetup",e),this.filterNotVP8(e),this.setDataToDescription(e);const s=e=>e.map((e=>({_:"groupCallParticipantVideoSourceGroup",semantics:e.semantics,sources:e.ssrcs.map((e=>+e))})));[(0,w.z_)("audio",+e.audio.ssrc),e.video?(0,w.z_)("video",s(e.video.ssrcGroups)):void 0,e.screencast?(0,w.z_)("screencast",s(e.screencast.ssrcGroups)):void 0].filter(Boolean).forEach((e=>{let t=i.getEntryBySource(e.source);if(t)return;const s=i.findFreeSendRecvEntry(e.type,!1);t=new w.Lp(s.mid,e.type),t.setDirection("sendrecv"),s.recvEntry=t,i.setEntrySource(t,e.sourceGroups||e.source)})),this.createDataChannelEntry();const n=this.offerSent;this.offerSent=!1;const a=i.entries.map((e=>e.mid)),o={type:n?"answer":"offer",sdp:i.generateSdp({bundle:a,entries:i.entries.filter((e=>a.includes(e.mid))),isAnswer:!n})};this.log("[sdp] remote",o.sdp),yield t.setRemoteDescription(o),yield this.tryToReleaseCandidates(),n||(yield this.doTheMagic());break}case"Candidates":for(const t of e.candidates){const e=D.generateCandidate(t);e.sdpMLineIndex=0;const i=new RTCIceCandidate(e);this.candidates.push(i)}yield this.tryToReleaseCandidates();break;default:this.log.error("unrecognized signaling data",e)}}))}tryToReleaseCandidates(){return B(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 B(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 B(this,void 0,void 0,(function*(){const{encryptor:e}=this;if(!e)return void this.log.warn("got encrypted signaling data before the encryption key");if(!this.decryptQueue.length)return;const t=this.decryptQueue.slice();this.decryptQueue.length=0;for(const i of t){const t=yield e.decryptRawPacket(i);if(!t)continue;const s=(new TextDecoder).decode(t);try{const e=JSON.parse(s);this.log("[update] updateNewCallSignalingData",e),this.applyCallSignalingData(e)}catch(e){this.log.error("wrong signaling data",s),this.hangUp("phoneCallDiscardReasonDisconnect"),g.Z.dispatchEvent("incompatible",this.interlocutorUserId)}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e),this.processDecryptQueue()}}},8500:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(3241),n=i(319),a=i(9125),o=i(9337),r=i(382),d=i(5424);function l(){const e={main:{},screen:{}};return t=>{return i=this,s=void 0,a=function*(){const{isScreen:i,constraints:s}=t,n=e[i?"screen":"main"];let a=n[s.audio?"audio":"video"];a||(a=(i?r.Z:d.Z)(s,t.muted),s.audio&&!n.audio&&(n.audio=a.finally((()=>n.audio=void 0))),s.video&&!n.video&&(n.video=a.finally((()=>n.video=void 0))));try{return yield a}catch(e){throw e}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}window.getStreamCached=l;var c=i(312),h=i(49),u=i(9585);class f extends s.Z{constructor(){super(!1);const e=this.player=document.createElement("div");e.classList.add("call-player"),e.style.display="none",document.body.append(e),this.elements=new Map;const t=this.audio=new Audio;t.autoplay=!0,t.volume=1,this.player.append(t),this.elements.set("audio",t),this.fixSafariAudio(),this.getStream=l()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(n.Z)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,i){const{streamManager:s}=this;if(s){const i=!e||this.isSharingAudio,s=!t||this.isSharingVideo;if(i&&s)return Promise.resolve()}const n={audio:e&&(0,a.Z)(),video:t&&(0,c.Z)()};return this.getStream({constraints:n,muted:i}).then((e=>{this.onInputStream(e)}))}requestScreen(){return this.getStream({isScreen:!0,constraints:(0,o.Z)(!0)}).then((e=>{this.onInputStream(e)}))}getElement(e){return this.elements.get(""+e)}cleanup(){this.player.textContent="",this.player.remove(),this.elements.clear(),this.streamManager.stop(),super.cleanup()}onTrack(e){this.tryAddTrack({stream:e.streams[0],track:e.track,type:"output"})}saveInputVideoStream(e,t){const i=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:i,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:i,source:s}){s||(s=u.Z.getSource(e,i)),this.log("tryAddTrack",e,t,i,s);const a="output"===i,{player:o,elements:r,streamManager:d}=this,l=t.kind,c="video"===l,h=c?s:l;let f=r.get(h);c&&t.addEventListener("ended",(()=>{this.log("[track] onended"),r.delete(h)}),{once:!0}),a&&d.addTrack(e,t,i);const p=c?e:d.outputStream;if(f)f.paused&&f.play().catch(n.Z),f.srcObject=p;else{if(f=document.createElement(l),f.autoplay=!0,f.srcObject=p,f.volume=1,"undefined"!==f.sinkId){const{outputDeviceId:e}=this;e&&f.setSinkId(e)}c?(f.setAttribute("playsinline","true"),f.muted=!0):o.appendChild(f),r.set(h,f)}return s}setMuted(e){this.streamManager.inputStream.getAudioTracks().forEach((t=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=void 0===e?!t.enabled:!e)}))}onInputStream(e){if(this.isClosing)e.getTracks().forEach((e=>{(0,h.Z)(e)}));else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:i}=this;t.addStream(e,"input"),i&&t.appendToConference(i)}}}},3335:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),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"}(s||(s={}));const n=s},2493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(5916);let n;var a=i(410),o=i(993),r=i(1655),d=i(6519),l=i(9895),c=i(3241),h=i(7298),u=i(5003),f=i(3855),p=i(1507),m=i(3512),g=i(2069),v=i(3335),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const y=45e3;class w extends c.Z{construct(e){this.managers=e,this.log=(0,u.kg)("CC"),o.Z&&(this.audioAsset=null!=n?n:n=new s.Z(["call_busy.mp3","call_connect.mp3","call_end.mp3","call_incoming.mp3","call_outgoing.mp3","voip_failed.mp3"]),this.tempId=0,this.instances=new Map,this.sortedInstances=[],m.Z.addEventListener("call_update",(e=>b(this,void 0,void 0,(function*(){var t;let i=this.instances.get(e.id);switch(i&&i.setPhoneCall(e),e._){case"phoneCallDiscarded":i&&i.hangUp(null===(t=e.reason)||void 0===t?void 0:t._,!0);break;case"phoneCallAccepted":i&&i.confirmCall();break;case"phoneCallRequested":i||(i=this.createCallInstance({isOutgoing:!1,interlocutorUserId:e.admin_id}),i.overrideConnectionState(v.Z.PENDING),i.setPhoneCall(e),i.setHangUpTimeout(y,"phoneCallDiscardReasonMissed"));break;case"phoneCall":{if(!i||i.encryptionKey)break;const t=i.dh.g_a=e.g_a_or_b,s=i.dh,n=yield f.Z.invokeCrypto("sha256",t);if(!(0,l.Z)(s.g_a_hash,n)){this.log.error("Incorrect g_a_hash",s.g_a_hash,n);break}const{key:a,key_fingerprint:o}=yield this.managers.appCallsManager.computeKey(t,s.b,s.p);if(e.key_fingerprint!==o){this.log.error("Incorrect key fingerprint",e.key_fingerprint,o,t,s),i.hangUp("phoneCallDiscardReasonDisconnect");break}i.encryptionKey=a,i.joinCall();break}}})))),m.Z.addEventListener("call_signaling",(({callId:e,data:t})=>{const i=this.instances.get(e);(null==i?void 0:i.id)===e&&i.onUpdatePhoneCallSignalingData(t)})))}get currentCall(){return this.sortedInstances[0]}getCallByUserId(e){for(const[t,i]of this.instances)if(i.interlocutorUserId===e)return i}createCallInstance(e){const t=new g.Z(Object.assign({managers:this.managers},e));return t.addEventListener("state",(e=>{const i=this.currentCall;e===v.Z.CLOSED?(this.instances.delete(t.id),(0,r.Z)(this.sortedInstances,t)):(0,d.Z)(this.sortedInstances,t,"sortIndex"),e===v.Z.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const s=void 0!==t.connectedAt;e===v.Z.EXCHANGING_KEYS||e===v.Z.CONNECTING&&s?t.setHangUpTimeout(y,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),i!==t&&i||(e===v.Z.CLOSED?t.isOutgoing||t.wasTryingToJoin?t.wasTryingToJoin&&!s?this.audioAsset.playSound("voip_failed.mp3"):this.audioAsset.playSound("phoneCallDiscardReasonBusy"===t.discardReason?"call_busy.mp3":"call_end.mp3"):this.audioAsset.stopSound():e===v.Z.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===v.Z.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===v.Z.CONNECTING?t.duration&&this.audioAsset.playSound("voip_connecting.mp3",!0):this.audioAsset.stopSound())})),t.addEventListener("id",((e,i)=>{void 0!==i&&this.instances.delete(i);const s=!!this.currentCall;this.instances.set(e,t),void 0===i&&this.dispatchEvent("instance",{instance:t,hasCurrent:s})})),t}startCallInternal(e,t){return b(this,void 0,void 0,(function*(){this.log("p2pStartCallInternal",e,t);const i=yield this.managers.appProfileManager.getProfile(e);if(!i)return;const{video_calls_available:s}=i.pFlags,n=this.createCallInstance({isOutgoing:!0,interlocutorUserId:e});n.requestInputSource(!0,!(!t||!s),!1),n.overrideConnectionState(v.Z.REQUESTING),n.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:p.NM,date:(0,h.Z)(!0),id:--this.tempId,participant_id:e,protocol:n.protocol,pFlags:{video:t||void 0}}),this.managers.appCallsManager.generateDh().then((i=>b(this,void 0,void 0,(function*(){return n.dh=i,this.managers.appCallsManager.requestCall(e,n.protocol,n.dh.g_a_hash,t&&s)})))).then((e=>{n.overrideConnectionState(v.Z.PENDING),n.setPhoneCall(e),n.setHangUpTimeout(y,"phoneCallDiscardReasonHangup")}))}))}}const S=new w;a.GO&&(a.GO.callsController=S);const C=S},1677:(e,t,i)=>{"use strict";i.d(t,{KM:()=>s,iK:()=>n});const s=50,n=100},9078:(e,t,i)=>{"use strict";i.d(t,{Z:()=>T});var s=i(4762),n=i(1655),a=i(5953),o=i(6724),r=i(5003),d=i(1507),l=i(3512),c=i(8500),h=i(7625),u=i(3075),f=i(8479),p=i(6752),m=i(9124),g=i(4373),v=i(3773),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class y extends u.Z{constructor(e){super(e),this.negotiateThrottled=(0,o.Z)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||super.createPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0})}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=super.createDataChannel();return e.addEventListener("open",(()=>{this.maybeUpdateRemoteVideoConstraints()})),e.addEventListener("close",(()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)})),e}createDescription(){return this.description?this.description:super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,i){return b(this,void 0,void 0,(function*(){const{groupCall:s,description:n}=this,a=s.id,o=t.map((t=>{const i=function(e,t){const i=(0,v.Z)(e,t),s=t.mediaType,n={source:i.source,sourceGroups:i.sourceGroups,type:s};i.fingerprint.setup="active";const a={fingerprints:[i.fingerprint],pwd:i.pwd,ssrc:i.source,"ssrc-groups":i.sourceGroups||[],ufrag:i.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(a)},source:i.source,media:t,sourceGroups:i.sourceGroups,entry:n}}(e,t);return this.sources[i.entry.type]=i.entry,i})),r=o.find((e=>"audio"===e.media.mediaType)),d=o.find((e=>"video"===e.media.mediaType));let{source:c,params:u}=r||{};const f=d||r,p={audio:r,video:d};if(n.entries.forEach((e=>{if("sendonly"===e.direction){const t=p[e.type];if(!t)return;n.setEntrySource(e,t.sourceGroups||t.source),n.setEntryPeerId(e,l.Z.myId)}})),u!==f.params){const e=JSON.parse(f.params.data);c?e.ssrc=c:delete e.ssrc,u={_:"dataJSON",data:JSON.stringify(e)}}const m=yield this.managers.appGroupCallsManager.joinGroupCall(a,u,i),g=JSON.parse(m.params.data);return g.audio=g.audio||s.connections.main.description.audio,n.setData(g),function(e,t){["audio","video"].filter((e=>t[e])).map((e=>[t[e],e])).forEach((([t,i])=>{const s=e.find((e=>e.mediaType===i));if(!s)return;const n=(e=>{const t={};return e.attributes.get("extmap").forEach((e=>{const i=e.key.split("/",1)[0];t[i]=e.value})),t})(s);(0,h.Z)(t["rtp-hdrexts"],((e,t,s)=>{n[e.id]!==e.uri&&(s.splice(t,1),console.log("[sdp] filtered extmap:",e,t,i))}))}))}(t,g),g}))}negotiateInternal(){return b(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,i="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,s=this.log.bindPrefix("startNegotiation");s("start");const n=yield e.createOffer({iceRestart:!1});i&&this.dataChannel&&t.createEntry("application").setDirection("sendrecv");const{sdp:a,offer:o}=function(e){const{offer:t,data:i}=e,s=(0,m.DV)(t.sdp);let n=!1;if(e.skipAddingMulticast||(n=(0,m.e6)(s)||n),(0,h.Z)(s.media,((e,t,a)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,r=o.mediaLineParts,d=(r.ids,o.toString()),l=i[e.mediaType]["payload-types"].map((e=>""+e.id));if(d!==(0,g.Px)(e.mediaType,void 0,l)){const o=(0,v.Z)(s,e),d=Object.assign({},i);d.transport=(0,f.Z)(d.transport),d.transport.ufrag=o.ufrag,d.transport.pwd=o.pwd,d.transport.fingerprints=[o.fingerprint],d.transport.candidates=[];const l=new p.Lp(o.mid,r.type);l.setPort(r.port),o.source&&l.setSource(o.sourceGroups||o.source),l.setDirection(e.direction);const c=(new g.DY).addSsrcEntry(l,d).finalize(),h=(0,m.DV)(c).media[0];a[t]=h,n=!0}})),n){const e=s.toString();t.sdp=e}return{offer:t,sdp:s}}({offer:n,data:t});s("[sdp] setLocalDescription",o.sdp),yield e.setLocalDescription(o);const r=a.media.filter((e=>"application"!==e.mediaType&&e.isSending));if(i)try{yield this.invokeJoinGroupCall(a,r,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],l=a.bundle;(0,h.Z)(l,((e,i,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(i,1),d.push(n))}));const c=a.media.map((e=>{const i=e.mid;let s=t.getEntryByMid(i);return s||(s=new p.Lp(i,e.mediaType),s.setDirection("inactive")),s})),u={type:"answer",sdp:t.generateSdp({bundle:l,entries:c,isAnswer:!0})};d.forEach((e=>{t.deleteEntry(e)})),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,u.sdp),yield e.setRemoteDescription(u),s("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then((()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1})),"presentation"===this.options.type&&e.then((()=>{this.connection.getTransceivers().find((e=>{var t,i;"video"===(null===(i=null===(t=e.sender)||void 0===t?void 0:t.track)||void 0===i?void 0:i.kind)&&e.sender.setParameters(Object.assign(Object.assign({},e.sender.getParameters()),{degradationPreference:"maintain-resolution"}))}))})),e)}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:i}=t;e.onStageEndpoints.push(i),e.constraints[i]={minHeight:180,maxHeight:720}}this.sendDataChannelData(e),e.onStageEndpoints.length?this.updateConstraintsInterval||(this.updateConstraintsInterval=window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this),5e3)):this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}addInputVideoStream(e){this.groupCall.saveInputVideoStream(e,this.type),this.streamManager.addStream(e,"input"),this.appendStreamToConference()}}var w=i(2207),S=i(9337),C=i(382),E=i(5424),L=i(312),I=i(49),M=i(9585),P=i(2946),Z=i(2059),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class T extends c.Z{constructor(e){super(),(0,a.Z)(this,e),this.log||(this.log=(0,r.kg)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=(0,o.Z)((()=>{this.dispatchEvent("pinned",this.pinnedSource)}),0,!1),this.addEventListener("state",(e=>{e===w.Z.CLOSED&&this.cleanup()}))}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return w.Z.CLOSED;if("connected"===e||s.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?w.Z.MUTED:w.Z.UNMUTED:w.Z.MUTED_BY_ADMIN}return w.Z.CONNECTING}get participants(){return this.managers.appGroupCallsManager.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==w.Z.UNMUTED}get isClosing(){const{state:e}=this;return e===w.Z.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){(0,n.Z)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),(0,n.Z)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return k(this,void 0,void 0,(function*(){return d.NM===e?this.participant:(yield this.participants).get(e)}))}toggleMuted(){return this.requestAudioSource(!0).then((()=>this.changeUserMuted(d.NM)))}changeUserMuted(e,t){return k(this,void 0,void 0,(function*(){const i=yield this.getParticipantByPeerId(e);return d.NM===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(i,{muted:t})}))}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let i;i=e.pFlags.self?"video"===t?"main":"presentation":e[t].source_groups[0].sources[0];const s=this.getElement(i);if(!s)return;const n=s.cloneNode();return n.srcObject=s.srcObject,{video:n,source:i}}createConnectionInstance(e){return this.connections[e.type]=new y(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type),managers:this.managers},e))}changeRaiseHand(e){return this.editParticipant(this.participant,{raiseHand:e})}startScreenSharingInternal(){return k(this,void 0,void 0,(function*(){try{const e="presentation",t=yield(0,C.Z)((0,S.Z)()),i=new M.Z,s=this.createConnectionInstance({streamManager:i,type:e,options:{type:e}});s.createPeerConnection().addEventListener("negotiationneeded",(()=>{s.negotiate()})),t.getVideoTracks()[0].addEventListener("ended",(()=>{this.connections.presentation&&this.stopScreenSharing()}),{once:!0}),s.createDescription(),s.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){var e;return null!==(e=this.startScreenSharingPromise)&&void 0!==e?e:this.startScreenSharingPromise=this.startScreenSharingInternal().finally((()=>{this.startScreenSharingPromise=void 0}))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,this.managers.appGroupCallsManager.saveApiParticipant(this.id,this.participant),this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id)):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return k(this,void 0,void 0,(function*(){const e={video:(0,L.Z)()};try{const t=yield(0,E.Z)(e,!1);this.connections.main.addInputVideoStream(t),yield this.editParticipant(this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){var e;return null!==(e=this.startVideoSharingPromise)&&void 0!==e?e:this.startVideoSharingPromise=this.startVideoSharingInternal().finally((()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return k(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&((0,I.Z)(t),e.streamManager.appendToConference(e.description),yield this.editParticipant(this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,i=!1){return k(this,void 0,void 0,(function*(){for(const e in this.connections)this.connections[e].closeConnectionAndStream(!t);if(this.dispatchEvent("state",this.state),!i&&!t){const t=e||(this.joined?this.connections.main.sources.audio.source:void 0);this.managers.appGroupCallsManager.hangUp(this.id,t)}}))}tryAddTrack(e){const{description:t}=this,i=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+i);this.getParticipantByPeerId(e.peerId).then((e=>{e&&l.Z.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:e})}))}return i}editParticipant(e,t){return k(this,void 0,void 0,(function*(){if(Object.keys(t).length){if(e){const i=e.pFlags.self;if(i&&void 0!==t.muted&&!this.isSharingAudio&&(delete t.muted,!Object.keys(t).length))return;const s=t.muted;void 0!==s&&e.pFlags.self&&(s?e.pFlags.muted=!0:e.pFlags.can_self_unmute&&delete e.pFlags.muted),void 0!==t.raiseHand&&(t.raiseHand?e.raise_hand_rating="1":delete e.raise_hand_rating),i&&(void 0!==t.videoStopped&&(t.videoStopped?delete e.video:e.video=(0,Z.KR)(this.connections.main.sources.video)),!e.pFlags.muted&&e.pFlags.can_self_unmute&&this.setMuted(!1),this.dispatchEvent("state",this.state))}return this.managers.appGroupCallsManager.editParticipant(this.id,e,t)}}))}onParticipantUpdate(e,t){const i=this.connections.main,{connection:s,description:n}=i,a=(0,P.Z)(e.peer),o=!!e.pFlags.left,r=this.participantsSsrcs.get(a)||[];if(e.presentation&&!o){const{source:t}=(0,Z._f)(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,i.sources.audio.source!==e.source&&this.hangUp();let s=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(s=!0):(this.stopScreenSharing(),this.stopVideoSharing(),s=!0),s&&this.setMuted(!0),void(t!==a&&this.dispatchEvent("state",this.state))}const d=o?[]:(0,Z.s$)(e);o?this.participantsSsrcs.delete(a):this.participantsSsrcs.set(a,d);const l=new Set;r.forEach((e=>{const t=e.source;if(!d.find((e=>e.source===t))){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),l.add(e.type))}})),d.forEach((e=>{let t=n.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),l.add(t.type)):(t=n.createEntry(e.type),n.setEntrySource(t,e.sourceGroups||e.source),n.setEntryPeerId(t,a),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(s,{direction:"recvonly"}),l.add(t.type))})),l.size&&(l.has("video")&&(i.updateConstraints=!0),i.negotiateThrottled())}}},2207:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),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"}(s||(s={}));const n=s},2059:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>E,KR:()=>w,_f:()=>y,s$:()=>b});var s=i(5916);let n;var a=i(410),o=i(3241),r=i(5003),d=i(3512),l=i(9078),c=i(2207),h=i(1677),u=i(9585),f=i(9125),p=i(5424),m=i(312),g=i(6752),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function b(e){var t,i;return[y(0,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&y(0,"audio",e.video.audio_source),e.video&&y(0,"video",e.video.source_groups,e.video.endpoint),(null===(i=e.presentation)||void 0===i?void 0:i.audio_source)&&y(0,"audio",e.presentation.audio_source),e.presentation&&y(0,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)}function y(e,t,i,s){return(0,g.z_)(t,i,s)}function w(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}class S extends o.Z{construct(e){this.managers=e,this.audioAsset=null!=n?n:n=new s.Z(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"]),this.log=(0,r.kg)("GCC"),d.Z.addEventListener("group_call_update",(e=>{const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&(t.groupCall=e,"groupCallDiscarded"===e._&&t.hangUp(!1,!1,!0))})),d.Z.addEventListener("group_call_participant",(({groupCallId:e,participant:t})=>{const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.onParticipantUpdate(t)}))}get groupCall(){return this.currentGroupCall}setCurrentGroupCall(e){this.currentGroupCall=e,e&&this.dispatchEvent("instance",e)}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}joinGroupCall(e,t,i=!0,s,n){return v(this,void 0,void 0,(function*(){let a;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${i} rejoin=${s}`),a=s?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return i=this,s=void 0,a=function*(){const i={audio:(0,f.Z)(),video:t&&(0,m.Z)()},s=new u.Z(h.iK);try{const t=yield(0,p.Z)(i,e);s.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,i),s.inputStream=new MediaStream}return s},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}(i,n),this.joinGroupCallInternal(e,t,a,i,s,n).then((()=>{const{currentGroupCall:e}=this;e.participants.then((t=>{this.currentGroupCall===e&&e.state!==c.Z.CLOSED&&t.forEach((t=>{t.pFlags.self||e.onParticipantUpdate(t)}))}))}))}))}joinGroupCallInternal(e,t,i,s,n=!1,a){return v(this,void 0,void 0,(function*(){const o=this.log.bindPrefix("joinGroupCallInternal");o("start",t);const r="main";let{currentGroupCall:h}=this;if(!h||!n){h=new l.Z({chatId:e,id:t,managers:this.managers}),h.fixSafariAudio(),h.addEventListener("state",(e=>{this.currentGroupCall===h&&e===c.Z.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),d.Z.dispatchEvent("chat_update",h.chatId))})),h.groupCall=yield this.managers.appGroupCallsManager.getGroupCallFull(t);const u=h.createConnectionInstance({streamManager:i,type:r,options:{type:r,isMuted:s,joinVideo:a,rejoin:n}}),f=u.createPeerConnection();return f.addEventListener("negotiationneeded",(()=>{u.negotiate()})),f.addEventListener("track",(e=>{o("ontrack",e),h.onTrack(e)})),f.addEventListener("iceconnectionstatechange",(()=>{h.dispatchEvent("state",h.state);const{iceConnectionState:e}=f;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":case"completed":case"disconnected":case"new":break;case"closed":case"failed":h.hangUp();break;case"connected":h.joined||(h.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.managers.appGroupCallsManager.getGroupCallParticipants(t))}})),u.createDescription(),u.createDataChannel(),u.appendStreamToConference(),this.setCurrentGroupCall(h),o("set currentGroupCall",t,h),this.startConnectingSound(),u.negotiate()}h.handleUpdateGroupCallParticipants=!1,h.updatingSdp=!1,o("update currentGroupCall",t,h)}))}}const C=new S;a.GO&&(a.GO.groupCallController=C);const E=C},9125:(e,t,i)=>{"use strict";function s(){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}i.d(t,{Z:()=>s})},9337:(e,t,i)=>{"use strict";function s(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}i.d(t,{Z:()=>s})},382:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e){return t=this,i=void 0,n=function*(){const t=yield navigator.mediaDevices.getDisplayMedia(e);return t.getVideoTracks()[0].contentHint="text",t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5424:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e,t){return i=this,s=void 0,a=function*(){const i=yield navigator.mediaDevices.getUserMedia(e);return i.getTracks().forEach((e=>{e.enabled=!t})),i},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}window.getStream=s},312:(e,t,i)=>{"use strict";function s(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}i.d(t,{Z:()=>s})},3773:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8957);function n(e,t){const i=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!i.fingerprint){const t=e.session.lines.find((e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}));i.fingerprint=t.parsed.value}const n=function(e){const t=e.map((e=>{const[t,...i]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:i.map((e=>(0,s.Fk)(+e)))}}));return t.length?t:void 0}(i["ssrc-group"]),[a,o]=i.fingerprint.split(" ",2),r=i.ssrc&&(0,s.Fk)(+i.ssrc.split(" ",1)[0]);return{raw:i,ufrag:i["ice-ufrag"],pwd:i["ice-pwd"],fingerprint:{fingerprint:o,setup:i.setup,hash:a},source:r,sourceGroups:n,mid:i.mid}}},49:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6669);function n(e){e.stop(),(0,s.Z)(e,"ended")}},6752:(e,t,i)=>{"use strict";i.d(t,{Lp:()=>o,ZP:()=>d,z_:()=>r});var s=i(1655),n=i(5953),a=i(4373);class o{constructor(e,t){this.mid=e,this.type=t,this.port=a._D}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((0,a.pl)(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 r(e,t,i){let s;if(Array.isArray(t)){if(!t[0])return;s=t,t=s[0].sources[0]}return{endpoint:i,type:e,source:t,sourceGroups:s}}class 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(0,n.Z)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,i=new o(t,e);return this.entries.push(i),this.entriesByMid.set(t,i),i}deleteEntry(e){(0,s.Z)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let i=this.entriesByPeerId.get(t);i||this.entriesByPeerId.set(t,i=new Set),i.add(e)}findEntry(e){return this.entries.find(e)}findFreeSendRecvEntry(e,t){let i=this.entries.find((i=>"sendrecv"===i.direction&&i.type===e&&!(t?i.sendEntry:i.recvEntry)));return i||(i=this.createEntry(e),i.setDirection("sendrecv")),i}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return a.DY.fromConference(Object.assign({conference:this},e))}}},9124:(e,t,i)=>{"use strict";i.d(t,{e6:()=>de,DV:()=>oe});var s,n,a=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},o=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class r{constructor(e,t){s.set(this,void 0),n.set(this,void 0),a(this,s,e,"f"),a(this,n,t,"f")}get session(){return o(this,s,"f")}get media(){return o(this,n,"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,i){const s=e.split(t),n=[];for(;i>0&&s.length;)n.push(s.shift()),--i;return s.length&&n.push(s.join(t)),n}s=new WeakMap,n=new WeakMap;var l,c,h,u=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},f=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class p{constructor(e,t){l.set(this,void 0),c.set(this,void 0),h.set(this,void 0),u(this,l,new Set,"f"),u(this,c,e,"f"),u(this,h,t,"f")}generate(){const e=f(this,c,"f"),t=f(this,h,"f"),i=f(this,l,"f"),s=t-e+1;let n=Math.floor(e+s*Math.random()),a=0;for(;i.has(n);)if(n=s)return null;return i.add(n),n}add(e){f(this,l,"f").add(e)}}l=new WeakMap,c=new WeakMap,h=new WeakMap;var m,g,v=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},b=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class y{constructor(e,t){m.set(this,void 0),g.set(this,void 0),v(this,m,e,"f"),v(this,g,t,"f")}get key(){return b(this,m,"f")}get value(){return b(this,g,"f")}}m=new WeakMap,g=new WeakMap;var w,S,C,E,L=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},I=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class M{constructor(e,t,i,s){w.set(this,void 0),S.set(this,void 0),C.set(this,void 0),E.set(this,void 0),L(this,w,e,"f"),L(this,S,t,"f"),L(this,C,i,"f"),L(this,E,s,"f")}get type(){return I(this,w,"f")}get port(){return I(this,S,"f")}get protocol(){return I(this,C,"f")}get ids(){return I(this,E,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}w=new WeakMap,S=new WeakMap,C=new WeakMap,E=new WeakMap;var P,Z,k,T,x=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},A=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class _{constructor(e,t){if(P.set(this,void 0),Z.set(this,void 0),k.set(this,void 0),T.set(this,void 0),x(this,P,e,"f"),"string"==typeof t){if(x(this,Z,t,"f"),"m"===e){const e=t.split(" ");x(this,k,new M(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=d(t,":",1);t=e[0],x(this,T,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof M?(x(this,k,t,"f"),x(this,Z,t.toString(),"f")):t instanceof y&&(x(this,T,t,"f"),x(this,Z,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return A(this,P,"f")}get value(){return A(this,Z,"f")}get parsed(){return A(this,T,"f")}get mediaLineParts(){return A(this,k,"f")}toString(){return`${this.key}=${this.value}`}}P=new WeakMap,Z=new WeakMap,k=new WeakMap,T=new WeakMap;var F,D,R,B,N,O,U=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},H=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class z{constructor(e,t,i=":",s=!1){F.set(this,void 0),D.set(this,void 0),R.set(this,void 0),B.set(this,void 0),N.set(this,void 0),O.set(this,void 0),U(this,F,e,"f"),U(this,D,t,"f"),U(this,R,i,"f"),U(this,N,s,"f"),U(this,B,s?new Map:null,"f"),U(this,O,s?[]:null,"f")}get lines(){return H(this,D,"f")}get value(){return H(this,N,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!H(this,N,"f")}get key(){return H(this,F,"f")}get keys(){return z.fill(this),H(this,O,"f")}forEach(e){z.fill(this),H(this,B,"f").forEach(e)}get(e){return z.fill(this),H(this,B,"f").get(e)||new z(e,[],":",!0)}static fill(e){if(null!==H(e,B,"f"))return;const t=new Map;e.lines.forEach((i=>{const[s,n]=d(i,H(e,R,"f"),1),a=t.get(s)||[];t.set(s,[...a,n||""])}));const i=U(e,B,z.makeAttributes(t),"f");U(e,O,Array.from(i.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach(((e,i)=>{t.set(i,new z(i,e))})),t}}F=new WeakMap,D=new WeakMap,R=new WeakMap,B=new WeakMap,N=new WeakMap,O=new WeakMap;var j,G,V=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},K=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class W{constructor(e){j.set(this,void 0),G.set(this,void 0),V(this,j,e,"f"),V(this,G,new Map,"f"),W.fillAttributes(this)}get(e){return K(this,G,"f").get(e)||new z(e,[]," ",!0)}static fillAttributes(e){const t=new Map;K(e,j,"f").forEach((e=>{if("a"===e.key){const{key:i,value:s}=e.parsed;let n=t.get(i);n||(n=[],t.set(i,n)),n.push(s||"")}})),t.forEach(((t,i)=>{K(e,G,"f").set(i,new z(i,t," ",!1))}))}}j=new WeakMap,G=new WeakMap;var $,q,Q,Y,J=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},X=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ee{constructor(e){$.set(this,void 0),q.set(this,void 0),Q.set(this,void 0),Y.set(this,void 0),J(this,$,e,"f"),J(this,q,e[0],"f"),J(this,Q,J(this,Y,null,"f"),"f")}get lines(){return X(this,$,"f")}get mediaLine(){return X(this,q,"f")}get mediaLineParts(){return X(this,q,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!X(this,Y,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",J(this,Y,t,"f")}return X(this,Y,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return X(this,Q,"f")||J(this,Q,new W(this.lines),"f"),X(this,Q,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const i in e){const s=this.attributes.get(i),n=!e[i];t[i]=s?n?s.lines:s.value:n?[]:void 0}return t}}$=new WeakMap,q=new WeakMap,Q=new WeakMap,Y=new WeakMap;var te,ie,se=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},ne=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ae{constructor(e){te.set(this,void 0),ie.set(this,void 0),se(this,te,e,"f"),se(this,ie,e.filter((e=>"o"===e.key)).map((e=>e.value.split(" ")[1]))[0],"f")}get lines(){return ne(this,te,"f")}get sessionId(){return ne(this,ie,"f")}}function oe(e){function t(){i?n.push(new ee(s)):i=new ae(s)}let i=null,s=[];const n=[];return e.split(/\r?\n/).forEach((e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const i=re(e);"m"===i.key&&(t(),s=[]),s.push(i)}})),t(),new r(i,n)}function re(e){const t=d(e,"=",1);return new _(t[0],t[1])}function de(e){let t;return e.media.forEach(((i,s)=>{if("video"===i.mediaType&&i.isSending&&!i.attributes.get("ssrc-group").get("SIM").exists){t||(t=new p(2,4294967295));const n=i.attributes.get("ssrc-group").get("FID").value.split(" "),a=i.lines;n.forEach((e=>t.add(+e)));const o=[n[0],t.generate(),t.generate()],r=[n[1],t.generate(),t.generate()];a.push(re("a=ssrc-group:SIM "+o.join(" ")));const d=i.attributes.get("ssrc").get(n[0]).lines;o.forEach(((e,t)=>{const i=r[t];t>0&&(a.push(re("a=ssrc-group:FID "+e+" "+i)),d.forEach((t=>{a.push(re("a=ssrc:"+e+" "+t))})),d.forEach((e=>{a.push(re("a=ssrc:"+i+" "+e))})))})),e.media[s]=new ee(a)}})),!!t}te=new WeakMap,ie=new WeakMap},4373:(e,t,i)=>{"use strict";i.d(t,{DY:()=>c,Px:()=>l,_D:()=>o,pl:()=>r});var s=i(4762),n=i(630),a=i(8957);const o="9";function r(e){return"screencast"===e?"video":e}function d(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function l(e,t=o,i){const s=d(e);return`m=${r(e)} ${t} ${s} ${i.join(" ")}`}class c extends n.Z{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(` generation ${e.generation}`),t.join("")}(e))}addHeader(e,t){const i=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed",`a=group:BUNDLE ${i}`,"a=ice-options:trickle","a=msid-semantic:WMS *")}addTransport(e,t){this.add(`a=ice-ufrag:${e.ufrag}`,`a=ice-pwd:${e.pwd}`,"a=ice-options:trickle");for(const t of e.fingerprints)this.add(`a=fingerprint:${t.hash} ${t.fingerprint}`,`a=setup:${t.setup}`);if(!t&&e.candidates)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:i,sourceGroups:s}=e;const n=(0,a.h)(e.source);t+=n,i+=n;const o=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${i}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${i}`)};return(()=>{this.add(`a=msid:${t} ${i}`)})(),(null==s?void 0:s.length)?s.forEach((e=>{if(e.sources.length){const t=e.sources.map(a.h);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(o)}})):o(n),this}addSsrcEntry(e,t,i){const s=(...e)=>this.add(...e),{type:n,mid:a,direction:o,port:c}=e,h=t.transport,u="application"===n,f=u?void 0:t[n],p="inactive"===o;if(e.shouldBeSkipped(i))return s(`m=${r(n)} 0 ${d(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive",`a=mid:${a}`);const m=u?[{id:5e3}]:f["payload-types"],g=m.map((e=>e.id));s(l(n,c,g),"c=IN IP4 0.0.0.0",`a=rtcp:${c} IN IP4 0.0.0.0`),h["rtcp-mux"]&&s("a=rtcp-mux"),s(`a=mid:${a}`);let v=o;if("sendrecv"===o||!i||p||u||(v="sendonly"===o?"recvonly":"sendonly"),s(`a=${v}`),this.addTransport(h),u)s(`a=sctpmap:${m[0].id} webrtc-datachannel 256`);else{const e=f["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach((e=>{s(`a=extmap:${e.id} ${e.uri}`)})),m.forEach((e=>{s(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?`/${e.channels}`:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const i=[];for(const e in t)i.push(`${e}=${t[e]}`);s(`a=fmtp:${e.id} ${i.join(";")}`)}const i=e["rtcp-fbs"];(null==i?void 0:i.length)&&i.forEach((t=>{s(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)}))}))}return!e.source||"sendonly"!==v&&"sendrecv"!==v||this.addSsrc(e),this}addConference(e){const{conference:t,entries:i,bundle:n,isAnswer:a}=e;this.addHeader(t.sessionId,n),s.IS_FIREFOX&&this.addTransport(t.transport);for(const e of i)this.addSsrcEntry((a?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,a);return this}static fromConference(e){return(new c).addConference(e).finalize()}}},9585:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3241),n=i(5003),a=i(1677),o=i(49),r=i(4373),d=i(8957);class l{constructor(e,t){const i=this.streamSource=e.createMediaStreamSource(t),s=this.analyser=e.createAnalyser();this.gain=e.createGain(),s.minDecibels=-100,s.maxDecibels=-30,s.smoothingTimeConstant=.05,s.fftSize=1024,i.connect(s)}}class c{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:i,track:s,source:n,type:a}=e,o=t.analyser;if(!o)return;const r=new Uint8Array(o.frequencyBinCount);return o.getByteFrequencyData(r),{type:a,source:n,stream:i,track:s,value:(0,d.UN)(r)}},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,a.KM).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),c.ANALYSER_LISTENER.dispatchEvent("amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.inputStream=new MediaStream,this.counter=0,this.log=(0,n.kg)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0,this.types=["audio","video"]}addStream(e,t){e.getTracks().forEach((i=>{this.addTrack(e,i,t)}))}addTrack(e,t,i){this.log("addTrack",i,t,e);const{context:s,items:n,inputStream:a,outputStream:o}=this,r=t.kind,d=c.getSource(e,i);switch(i){case"input":a?a.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)}),{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find((t=>"input"===t.type&&t.kind===e))}static getSource(e,t){return"input"===t?e.source||e.id:""+(0,d.Fk)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let i=!1;for(let s=0,n=t.length;!i&&s[e,n])),o=t.getTracks();for(const[t,n]of a){let a=e.findEntry((e=>e.direction===i&&e.type===t));if(!a){if(!s)continue;a=e.createEntry(t)}let{transceiver:d}=a;d||(d=a.createTransceiver(e.connection,n)),a.direction!==d.direction&&(d.direction=a.direction);const l=(0,r.pl)(t),c=o.findIndex((e=>e.kind===l)),h=-1!==c?o.splice(c,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=>{(0,o.Z)(e)}))}catch(e){this.log.error(e)}}}c.ANALYSER_LISTENER=new s.Z},630:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{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}}},8957:(e,t,i)=>{"use strict";function s(e){return e<<0}function n(e){return e>>>0}function a(e,t=3){if(!e)return 0;const{length:i}=e;let s=0;for(let t=0;ts,UN:()=>a,h:()=>n})},3785:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(7197),n=i(1229);const a=new RegExp(`(^${n.Z})`);function o(e,t=!1){const i=(e||"").trim().split(" ");if(!i[0])return{text:"",entities:[]};const n=[],o=i[0].match(a),r=(null==o?void 0:o[0])||i[0][0];o&&n.push((0,s.Z)(r));const d=i.length;if(t||1===d)return{text:r,entities:n};const l=i[d-1].match(a),c=(null==l?void 0:l[0])||i[d-1][0];return l&&n.push(Object.assign(Object.assign({},(0,s.Z)(c)),{offset:r.length})),{text:r+c,entities:n}}},7197:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(671);function n(e){return{_:"messageEntityEmoji",offset:0,length:e.length,unicode:(0,s.w1)(e).join("-").replace(/-?fe0f/g,"")}}},1171:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2423);function n(e){return e?e.match(s.E):null}},2521:(e,t,i)=>{"use strict";function s(e){return e.target="_blank",e.rel="noopener noreferrer",e}i.d(t,{Z:()=>s})},5798:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8115),n=i(3785);function a(e,t){const{text:i,entities:a}=(0,n.Z)(e,t);return(0,s.Z)(i,void 0,a)}},3066:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(5400);function a(e,t={}){if(!e)return(0,n.ZP)("");let i=t.entities;return i&&!s.Z.premium&&t.wrappingForPeerId!==s.Z.myId&&(i=i.filter((e=>"messageEntityCustomEmoji"!==e._))),(0,n.ZP)(e,Object.assign(Object.assign({},t),{entities:i,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}))}},8115:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6535),n=i(5400);function a(e,t=!1,i){return e?(null!=i||(i=(0,s.Z)(e).filter((e=>"messageEntityEmoji"===e._))),(0,n.ZP)(e,{entities:i,wrappingDraft:t})):(0,n.ZP)("")}},5400:(e,t,i)=>{"use strict";i.d(t,{LD:()=>_,KZ:()=>F,SZ:()=>G,ZP:()=>j,Cx:()=>K,Hc:()=>V});var s=i(2423),n=i(3447),a=i(9976),o=i(8479),r=i(4056),d=i(1379),l=i(6535),c=i(2521),h=i(3591);const u={};a.Z&&(u[""]=!0,[["14","🫱🏻"]].forEach((([e,t])=>{u[e]=function(e){const t=document.createElement("span");t.classList.add("emoji"),document.body.appendChild(t),t.innerText=e;const i=t.offsetWidth;t.innerText="❤️";const s=t.offsetWidth;return document.body.removeChild(t),Math.abs(i-s)<5}(t)})));const f=u;var p=i(2738),m=i(3512),g=i(4755),v=i(3541),b=i(3772),y=i(5814),w=i(2153),S=i(393),C=i(8938),E=i(319),L=i(8497),I=i(4881),M=i(3624),P=i(5565),Z=i(6854),k=i(645),T=i(4497);const x=new ResizeObserver((e=>{for(const t of e)t.target.parentElement.setDimensionsFromRect(t.contentRect)})),A=new w.Z;class _ extends HTMLElement{constructor(){super(),this.paused=!0,this.classList.add("custom-emoji")}get docId(){return this.dataset.docId}static create(e){const t=new _;return t.dataset.docId=""+e,t}get isConnected(){var e,t;return null!==(t=null===(e=this.placeholder)||void 0===e?void 0:e.isConnected)&&void 0!==t?t:super.isConnected}connectedCallback(){this.player&&y.Z.addAnimation(this,this.renderer.animationGroup,void 0,!0)}disconnectedCallback(){var e;!this.isConnected&&(null===(e=this.renderer)||void 0===e?void 0:e.isSelectable)&&this.clear()}destroy(){this.clear()}clear(e=!0){var t;if(this.clean)return;this.clean=!0,this.pause();const{syncedPlayer:i}=this;if(i&&i.pausedElements.delete(this),null===(t=this.middlewareHelper)||void 0===t||t.clean(),this.renderer){const t=this.renderer.customEmojis.get(this.docId);(null==t?void 0:t.delete(this))&&!t.size&&(this.renderer.customEmojis.delete(this.docId),this.renderer.playersSynced.delete(t)),e&&(this.renderer.isSelectable?this.replaceChildren(G(!0)):this.replaceChildren())}this.player&&y.Z.removeAnimationByPlayer(this),A&&A.delete({div:this}),this.elements=this.renderer=this.player=this.syncedPlayer=void 0}pause(){this.paused||(this.paused=!0,this.player instanceof HTMLVideoElement&&!this.syncedPlayer&&(this.renderer.lastPausedVideo=this.player,this.player.pause()),this.syncedPlayer&&!this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.add(this),this.syncedPlayer.player&&this.syncedPlayer.pausedElements.size===this.syncedPlayer.middlewares.size&&this.syncedPlayer.player.pause()))}play(){var e;this.paused&&(this.paused=!1,this.player instanceof HTMLVideoElement&&(this.player.currentTime=(null===(e=this.renderer.lastPausedVideo)||void 0===e?void 0:e.currentTime)||this.player.currentTime,this.player.play().catch(E.Z)),this.syncedPlayer&&this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.delete(this),this.syncedPlayer.pausedElements.size!==this.syncedPlayer.middlewares.size&&this.player.play()))}remove(){this.clear()}get autoplay(){return!0}}class F extends HTMLElement{constructor(){super(),this.classList.add("custom-emoji-renderer"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("custom-emoji-canvas"),this.context=this.canvas.getContext("2d"),this.append(this.canvas),this.playersSynced=new Map,this.clearedElements=new WeakSet,this.customEmojis=new Map,this.animationGroup="EMOJI",this.isCanvasClean=!1}connectedCallback(){B.has(this)||(x.observe(this.canvas),B.add(this),this.connectedCallback=void 0)}disconnectedCallback(){!this.isConnected&&this.auto&&(this.destroy(),this.disconnectedCallback=void 0)}destroy(){var e;x.unobserve(this.canvas),this.customEmojis.forEach((e=>{e.forEach((e=>{e.clear()}))})),B.delete(this),this.playersSynced.clear(),null===(e=this.middlewareHelper)||void 0===e||e.clean(),this.customEmojis.clear(),this.destroy=this.lastPausedVideo=void 0}getOffsets(e=new Map){if(!this.playersSynced.size)return e;const t=(0,L.Z)(this,"scrollable")||this.offsetParent;if(!t)return e;const i=t.getBoundingClientRect(),s=this.getBoundingClientRect();for(const n of this.playersSynced.keys()){const a=Array.from(n),o=this.isSelectable?a.map((e=>e.placeholder)):a,{visible:r}=(0,I.Z)({overflowElement:t,overflowRect:i,elements:o,extraSize:2.5*this.size.height}),d=r.map((({rect:e})=>({top:e.top-s.top,left:e.left-s.left,width:e.width})));d.length&&e.set(n,d)}return e}clearCanvas(){if(this.isCanvasClean)return;const{context:e,canvas:t}=this;e.clearRect(0,0,t.width,t.height),this.isCanvasClean=!0}render(e){const{context:t,canvas:i,isDimensionsSet:s}=this;s||this.setDimensionsFromRect(void 0,!1),this.isCanvasClean=!1;const{width:n,height:a,dpr:o}=i;for(const[i,s]of e){const e=this.playersSynced.get(i),a=O.get(e)||(e instanceof HTMLVideoElement?e:void 0);if(!a)continue;const r=a instanceof ImageData;let d,l;e instanceof HTMLVideoElement?(d=this.size.width*o,l=this.size.height*o):(d=a.width,l=a.height);const c=Math.round(s[0].width*o);c!==d&&(d=c,l=c);const h=n-d;this.clearedElements.has(i)||this.isSelectable||(this.isSelectable?i.forEach((e=>{var t;null!==(t=e.lastChildWas)&&void 0!==t||(e.lastChildWas=e.lastChild),(0,P.Z)(e,e.firstChild)})):i.forEach((e=>{e.replaceChildren()})),this.clearedElements.add(i)),s.forEach((({top:e,left:i})=>{e=Math.round(e*o),(i=Math.round(i*o))<0||i>h||(r?t.putImageData(a,i,e):t.drawImage(a,i,e,d,l))}))}}checkForAnyFrame(){for(const e of this.playersSynced.values())if(O.has(e)||e instanceof HTMLVideoElement)return!0;return!1}remove(){super.remove()}setDimensionsFromRect(e=this.lastRect,t=!0){const{canvas:i}=this,{dpr:s}=i;if(this.lastRect!==e&&(this.lastRect=e),!e||!s||this.ignoreSettingDimensions)return;const{width:n,height:a}=e,o=Math.floor(Math.round(n*s)),r=Math.floor(Math.round(a*s));i.width===o&&i.height===r||(i.width=o,i.height=r,this.isDimensionsSet=!0,this.isCanvasClean=!0,(this.forceRenderAfterSize||this.isSelectable&&t)&&(this.forceRenderAfterSize=void 0,this.forceRender()))}forceRender(){this.isDimensionsSet&&(U(new Set([this]))||this.clearCanvas())}add(e,t,i,s){const n=this;if(e.forEach(((t,i)=>{let s=this.customEmojis.get(i);s?this.clearedElements.delete(s):this.customEmojis.set(i,s=new Set);for(const e of t)s.has(e)?t.delete(e):(e.clean=!1,e.renderer=n,e.elements=s,e.middlewareHelper=this.middlewareHelper.get().create(),s.add(e),e.lastChildWas&&!e.lastChildWas.parentNode&&e.append(e.lastChildWas));t.size||e.delete(i)})),!e.size)return;const a=!(t||!1===t||!A),o=Array.from(e.keys()),r=m.Z.managers,d=this.middlewareHelper.get(),l=this.size;return r.appEmojiManager.getCachedCustomEmojiDocuments(o).then((c=>{if(d&&!d())return;const h=[],u=(o,c)=>{const h=o.id,u=e.get(h),f=n.customEmojis.get(h),p=2===o.sticker,m="video/webm"===o.mime_type&&!S.Z,g=(p||3===o.sticker&&this.isSelectable)&&!i&&!m,w=[],L=Array.from(u),I=(0,v.ZP)({div:L,doc:o,width:l.width,height:l.height,loop:!0,play:D,managers:r,isCustomEmoji:!0,group:"none",loadPromises:w,middleware:d,exportLoad:a||!1===t?2:1,needFadeIn:!1,loadStickerMiddleware:g&&d?d.create().get((()=>!!P.middlewares.size)):void 0,static:m,onlyThumb:i,withThumb:null!=s?s:!n.clearedElements.has(f)&&void 0,syncedVideo:this.isSelectable});c&&I.then((()=>c.push(...w)));const M={elements:u};if(1===o.sticker||i||m)return this.isSelectable&&(M.onRender=()=>Promise.all(w).then((()=>{d&&!d()||L.forEach((e=>{const{placeholder:t}=e;t.src=e.firstElementChild.src}))}))),I.then((e=>Object.assign(Object.assign({},e),M)));let P;M.onRender=e=>Promise.all(w).then((()=>{var t;if(d&&!d()||!o.animated)return;const i=Array.isArray(e)?e:[e],s=Array.isArray(i)?i[0]:i;if((0,C.Z)(s),L.forEach(((e,t)=>{const s=i[t]||i[0];e.player=s,P&&(e.syncedPlayer=P,e.paused?e.syncedPlayer.pausedElements.add(e):s.paused&&s.play()),e.isConnected&&y.Z.addAnimation(e,e.renderer.animationGroup,void 0,!0)})),(s instanceof b.Z||s instanceof HTMLVideoElement&&this.isSelectable)&&(P.player=s,n.playersSynced.set(f,s)),s instanceof b.Z?(s.group=n.animationGroup,null!==(t=s.overrideRender)&&void 0!==t||(s.overrideRender=e=>{O.set(s,e)})):HTMLVideoElement,g){const e=(0,b.a)(this.size.width,this.size.height);n.canvas.dpr=e,H()}}));const Z=[h,l.width,l.height].join("-");if(g){P=N.get(Z),P||(P={player:void 0,middlewares:new Set,pausedElements:new Set,key:Z},N.set(Z,P));for(const e of u){const t=e.middlewareHelper.get();P.middlewares.add(t),t.onClean((()=>{var i,s;if(P.middlewares.delete(t),!P.middlewares.size){if(P.player){const t=O.get(P.player);if(t&&(null===(s=(i=t).close)||void 0===s||s.call(i),O.delete(P.player)),O.delete(P.player),P.player instanceof b.Z)P.player.overrideRender=E.Z,P.player.remove();else if(P.player instanceof HTMLVideoElement){const t=k.Z.generateName(""+e.docId,0,0,void 0,void 0);delete v._i[t]}P.player=void 0}N.get(P.key)===P&&N.delete(P.key)&&!N.size&&z()}}))}}return I.then((e=>Object.assign(Object.assign({},e),M)))},f=[],p=c.map(((e,t)=>{if(e)return u(e,h);f.push(o[t])})).filter(Boolean),m=f.length?r.appEmojiManager.getCustomEmojiDocuments(f).then((e=>d&&!d()?[]:e.filter(Boolean).map((e=>u(e))))):Promise.resolve([]),g=e=>Promise.all(e).then((e=>{const t=e.map((({load:e,onRender:t,elements:i})=>{if(!e)return;const s=()=>e().then(t);if(!a)return s();i.forEach((e=>{A.push({div:e,load:()=>(i.forEach((e=>{A.delete({div:e})})),s())})}))}));return Promise.all(t)})),w=()=>{if(d&&!d())return;const e=g(p),t=m.then((e=>g(e)));return Promise.all([e,t])};return t?t.push({div:n.canvas,load:w}):w(),Promise.all(p).then((()=>Promise.all(h))).then((()=>{}))}))}static create(e){const t=new F;t.animationGroup=e.animationGroup,t.size=e.customEmojiSize||g.Z.active.customEmoji,t.isSelectable=e.isSelectable,e.wrappingDraft&&(t.contentEditable="false",t.style.height="inherit");let i=e.middleware;return i?(t.middlewareHelper=i.create(),i=t.middlewareHelper.get(),i.onDestroy((()=>{var e;null===(e=t.destroy)||void 0===e||e.call(t)}))):(t.auto=!0,t.middlewareHelper=(0,M.k)()),t}}const D=!0;let R;const B=new Set,N=new Map,O=new Map,U=(e=B)=>{const t=Array.from(e).filter((e=>e.isConnected&&e.checkForAnyFrame()&&!e.ignoreSettingDimensions));if(!t.length)return!1;const i=t.map((e=>{const t=[...e.playersSynced.values()].reduce(((e,t)=>e+ +!!t.paused),0);if(e.playersSynced.size===t)return;const i=e.getOffsets();return i.size?[e,i]:void 0})).filter(Boolean);for(const[e]of i)e.clearCanvas();for(const[e,t]of i)e.render(t);return!0},H=()=>{R||(R=window.setInterval(U,16.666666666666668),U())},z=()=>{R&&(clearInterval(R),R=void 0)};function j(e,t={}){var i,u,m,g,v,b,y,w;const S=document.createDocumentFragment();if(!e)return S;const C=null!==(i=t.nasty)&&void 0!==i?i:t.nasty={i:0,usedLength:0,text:e},E=(e,i)=>{const s=document.createElement("span");return t.wrappingDraft&&(s.contentEditable="false"),s.classList.add("input-something"),s.append(e),(D||S).append(s),e.classList.add("input-selectable"),!i&&e.append(G(!0)),I.add(s),s};t.isSelectable||(t.isSelectable=t.wrappingDraft);const L=null!==(u=t.customEmojis)&&void 0!==u?u:t.customEmojis=new Map,I=null!==(m=t.customWraps)&&void 0!==m?m:t.customWraps=new Set,M=null!==(g=t.entities)&&void 0!==g?g:t.entities=(0,l.Z)(C.text),P=null!==(v=t.passEntities)&&void 0!==v?v:t.passEntities={},Z=null!==(b=t.contextSite)&&void 0!==b?b:t.contextSite="Telegram",k="Telegram"!==Z,x=C.text.length,A=M.length;let D;for(;C.i=x){if("messageEntityCaret"!==e._)continue}else e.offset+e.length>x&&(e=(0,o.Z)(e),e.length=x-e.offset);e.length&&(C.lastEntity=e);let i=M[C.i+1];const l=e.offset,u=l+e.length,m=Math.min(u,null!==(y=null==i?void 0:i.offset)&&void 0!==y?y:65535),g=C.text.slice(l,u);let v=C.text.slice(l,m);C.usedLengthv.length&&b?b:S,t.voodoo)return S}var R;if(C.lastEntity&&(C.usedLength=C.lastEntity.offset+C.lastEntity.length),C.usedLength{const t=document.createElement("span");return t.classList.add(e?"input-filler2":"input-filler"),t.textContent=Z.Z,t};function V(e){var t;if((null==e?void 0:e.textContent)!==Z.Z||"false"===(null===(t=null==e?void 0:e.getAttribute)||void 0===t?void 0:t.call(e,"contenteditable"))){if(!e||e.textContent!==Z.Z||e.firstElementChild)return 2;if(e.nodeType===e.ELEMENT_NODE)return 1}return 0}function K(e){const t=(e,t,i)=>{const s=V(t);2===s?e[i](G()):1===s&&t.appendChild(document.createTextNode(Z.Z))};for(const i of e){const{previousSibling:e,nextSibling:s}=i;t(i,e,"before"),t(i,s,"after")}}window.wrapRichText=j},4497:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3591);function n(e){const{url:t,onclick:i}=(0,s.Z)(e),n=document.createElement("a");return n.href=t,i&&n.setAttribute("onclick",`${i}(this)`),n}},1447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(5814),n=i(410),a=i(5418),o=i(5003),r=i(3772),d=i(7328),l=i(3241);class c extends l.Z{constructor(e){super(),this.worker=e,this.worker.onerror=e=>{try{this.dispatchEvent("workerError",e),this.cleanup(),this.terminate()}catch(e){}},this.worker.onmessage=e=>{this.dispatchEvent(e.data.queryMethodListener,...e.data.queryMethodArguments)}}postMessage(e){this.worker.postMessage(e)}terminate(){this.worker.terminate()}sendQuery(e,t){this.worker.postMessage({queryMethod:e.shift(),queryMethodArguments:e},d.Z?t:void 0)}}var h=i(8975),u=i(3855);const f="undefined"!=typeof WebAssembly;var p=i(5471),m=i(4159);const g=new class{constructor(){this.loadPromise=f?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=m.Z.threads,this.players={},this.playersByCacheName={},this.workers=[],this.curWorkerNum=0,this.log=(0,o.kg)("LOTTIE",o.v9.Error),this.onPlayerLoaded=(e,t,i)=>{const s=this.players[e];s?(this.log.debug("onPlayerLoaded"),s.onLoad(t,i)):this.log.warn("onPlayerLoaded on destroyed player:",e,t)},this.onFrame=(e,t,i)=>{const s=this.players[e];s?(void 0!==s.clamped&&i instanceof Uint8ClampedArray&&(s.clamped=i),s.renderFrame(i,t)):this.log.warn("onFrame on destroyed player:",e,t)},this.onPlayerError=(e,t)=>{const i=this.players[e];i&&s.Z.getAnimations(i.el[0]).forEach((e=>{s.Z.removeAnimation(e)}))}}getAnimation(e){for(const t in this.players)if(this.players[t].el.includes(e))return this.players[t];return null}setLoop(e){for(const t in this.players){const i=this.players[t];i.loop=e,i.autoplay=i._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise(((e,t)=>{let s=this.workersLimit;for(let n=0;n{this.log("worker #"+n+" ready"),o.addEventListener("frame",this.onFrame),o.addEventListener("loaded",this.onPlayerLoaded),o.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),e(),this.loaded=!0)}),{once:!0}),o.addEventListener("workerError",(e=>{t("rlottie load error: "+e.message),this.loaded=!1}),{once:!0})}}))}makeAssetUrl(e){return"assets/tgs/"+e+".json"}loadAnimationAsAsset(e,t){return this.loadAnimationFromURL(e,this.makeAssetUrl(t))}loadAnimationDataFromURL(e){return f?(this.loadLottieWorkers(),fetch(e).then((e=>e.headers&&"application/octet-stream"!==e.headers.get("content-type")?e.blob():e.arrayBuffer().then((e=>u.Z.invokeCrypto("gzipUncompress",e))).then((e=>(0,h.Z)(e,"")))))):this.loadPromise}loadAnimationFromURLManually(e){const t=this.makeAssetUrl(e);return this.loadAnimationDataFromURL(t).then((e=>i=>this.loadAnimationFromURLNext(e,i,t)))}loadAnimationFromURL(e,t){return this.loadAnimationDataFromURL(t).then((i=>this.loadAnimationFromURLNext(i,e,t)))}loadAnimationFromURLNext(e,t,i){const s=Object.assign(t,{animationData:e,needUpscale:!0});return s.name||(s.name=i),this.loadAnimationWorker(s)}waitForFirstFrame(e){return Promise.race([new Promise((t=>{e.addEventListener("firstFrame",t,{once:!0})})),(0,a.Z)(2500)]).then((()=>e))}loadAnimationWorker(e,t=e.group||"",i){return n=this,a=void 0,d=function*(){if(!f)return this.loadPromise;if(this.loaded||(yield this.loadLottieWorkers()),i&&!i())throw(0,p.Z)("MIDDLEWARE");if(e.sync){const t=r.Z.CACHE.generateName(e.name,e.width,e.height,e.color,e.toneIndex),i=this.playersByCacheName[t];if(null==i?void 0:i.size)return Promise.resolve(i.entries().next().value[0])}const n=Array.isArray(e.container)?e.container:[e.container];if(e.width&&e.height||(e.width=parseInt(n[0].style.width),e.height=parseInt(n[0].style.height)),!e.width||!e.height)throw new Error("No size for sticker!");e.group=t;const a=this.initPlayer(n,e);return s.Z.addAnimation(a,t),a},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{r(d.next(e))}catch(e){t(e)}}function s(e){try{r(d.throw(e))}catch(e){t(e)}}function r(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}r((d=d.apply(n,a||[])).next())}));var n,a,o,d}onDestroy(e){delete this.players[e]}destroyWorkers(){f&&(this.workers.forEach(((e,t)=>{e.terminate(),this.log("worker #"+t+" terminated")})),this.log("workers destroyed"),this.workers.length=0,this.curWorkerNum=0,this.loaded=!1,this.loadPromise=void 0)}initPlayer(e,t){var i,s;const n=new r.Z({el:e,worker:this.workers[this.curWorkerNum++],options:t}),{reqId:a,cacheName:o}=n;this.players[a]=n;const d=o?null!==(i=(s=this.playersByCacheName)[o])&&void 0!==i?i:s[o]=new Set:void 0;return o&&d.add(n),this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),n.addEventListener("destroy",(()=>{this.onDestroy(a),d.delete(n)&&!d.size&&delete this.playersByCacheName[o]})),n.loadFromData(t.animationData),n}};n.GO.lottieLoader=g;const v=g},3772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,a:()=>h});var s=i(7328),n=i(8189),a=i(4762),o=i(3241),r=i(4755),d=i(3228),l=i(356),c=i(645);function h(e,t,i){let s=(0,d.Z)(window.devicePixelRatio,1,2);return s>1&&!i&&(e>90&&t>90?!a.IS_APPLE&&r.Z.isMobile&&(s=1):(e>60&&t>60||a.IS_ANDROID)&&(s=Math.max(1.5,s-1.5))),s}class u extends o.Z{constructor({el:e,worker:t,options:i}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.playedTimes=0,this.reqId=++u.reqId,this.el=e,this.worker=t;for(const e in i)this.hasOwnProperty(e)&&(this[e]=i[e]);let o;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=i.initFrame,this.color=i.color,this.inverseColor=i.inverseColor,this.name=i.name,this.skipFirstFrameRendering=i.skipFirstFrameRendering,this.toneIndex=i.toneIndex,this.raw=void 0!==this.color,this.name&&(this.cacheName=u.CACHE.generateName(this.name,this.width,this.height,this.color,this.toneIndex)),void 0!==i.skipRatio?o=i.skipRatio:(a.IS_ANDROID||a.IS_APPLE_MOBILE||a.IS_APPLE&&!a.IS_SAFARI&&!n.Z)&&this.width<100&&this.height<100&&!i.needUpscale&&(o=.5),this.skipDelta=void 0!==o?1/o|0:1;const r=h(this.width,this.height,i.needUpscale);this.width=Math.round(this.width*r),this.height=Math.round(this.height*r),i.noCache||(a.IS_APPLE&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=this.el.map((()=>{const e=document.createElement("canvas");return e.classList.add("rlottie"),e.width=this.width,e.height=this.height,e.dpr=r,e}))),this.contexts=this.canvas.map((e=>e.getContext("2d"))),l.Z&&!this.raw||(this.imageData=new ImageData(this.width,this.height),s.Z&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4))),this.name?this.cache=u.CACHE.getCache(this.cacheName):this.cache=c.M.createCache()}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&this.cache.counter>1||this.cache.clearCache())}sendQuery(e,t){this.worker.sendQuery([e.shift(),this.reqId,...e],t)}loadFromData(e){this.sendQuery(["loadFromData",e,this.width,this.height,this.toneIndex,void 0!==this.color])}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(e=!0){this.paused||(this.paused=!0,e&&(clearTimeout(this.rafId),this.rafId=void 0))}resetCurrentFrame(){var e;return this.curFrame=null!==(e=this.initFrame)&&void 0!==e?e:1===this.direction?this.minFrame:this.maxFrame}stop(e=!0){this.pause();const t=this.resetCurrentFrame();e&&this.requestFrame(t)}restart(){this.stop(!1),this.play()}setSpeed(e){this.speed!==e&&(this.speed=e,this.paused||this.setMainLoop())}setDirection(e){this.direction!==e&&(this.direction=e,this.paused||this.setMainLoop())}remove(){this.pause(),this.sendQuery(["destroy"]),this.cacheName&&u.CACHE.releaseCache(this.cacheName),this.dispatchEvent("destroy"),this.cleanup()}applyColor(e){const[t,i,s]=this.color;for(let n=0,a=e.length;n{let n=this.cache.framesNew.get(t);if(e instanceof Uint8ClampedArray?s>0&&(n=this.canvas[0]):n=e,!n){const e=document.createElement("canvas");e.width=i.canvas.width,e.height=i.canvas.height,e.getContext("2d").putImageData(this.imageData,0,0),this.cache.framesNew.set(t,e),n=e}this.overrideRender&&this.renderedFirstFrame?this.overrideRender(n||this.imageData):n?(i.clearRect(0,0,n.width,n.height),i.drawImage(n,0,0)):i.putImageData(this.imageData,0,0),this.renderedFirstFrame||(this.renderedFirstFrame=!0)})),this.dispatchEvent("enterFrame",t)}catch(e){console.error("RLottiePlayer renderFrame error:",e,this.width,this.height),this.autoplay=!1,this.pause()}}renderFrame(e,t){if(this.cachingDelta&&(t%this.cachingDelta||!t)&&(e instanceof Uint8ClampedArray&&!this.cache.frames.has(t)?this.cache.frames.set(t,new Uint8ClampedArray(e)):l.Z&&e instanceof ImageBitmap&&!this.cache.framesNew.has(t)&&this.cache.framesNew.set(t,e)),this.frInterval){const i=Date.now()-this.frThen;if(i<0){const s=this.frInterval>-i?-i%this.frInterval:this.frInterval;return this.rafId&&clearTimeout(this.rafId),void(this.rafId=window.setTimeout((()=>{this.renderFrame2(e,t)}),s))}}this.renderFrame2(e,t)}requestFrame(e){const t=this.cache.frames.get(e),i=this.cache.framesNew.get(e);i?this.renderFrame(i,e):t?this.renderFrame(t,e):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery(["renderFrame",e],this.clamped?[this.clamped.buffer]:void 0))}onLap(){return++this.playedTimes===this.loop&&(this.loop=!1),!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:e,maxFrame:t}=this,i=this.curFrame+e>t?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=e;return this.requestFrame(i),!(i+e>t)||this.onLap()}mainLoopBackwards(){const{skipDelta:e,minFrame:t}=this,i=this.curFrame-et?1:-1,callback:s})}playToFrame(e){this.pause();const{frame:t,speed:i,callback:s,direction:n}=e;this.setDirection(void 0===n?this.curFrame>t?-1:1:n),void 0!==i&&this.setSpeed(i);const a=[this.curFrame,t];-1===this.direction&&a.reverse(),this.loop=!1,this.setMinMax(a[0],a[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s&&(this.playToFrameOnFrameCallback=e=>{e===t&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(e,t){this.color=e,t&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(e){this.inverseColor=e}setMinMax(e=0,t=this.frameCount-1){this.minFrame=e,this.maxFrame=t}onLoad(e,t){return i=this,s=void 0,a=function*(){this.frameCount=e,this.fps=t,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=(0,d.Z)(this.initFrame,this.minFrame,this.maxFrame));const i=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const e=60/t;this.skipDelta=this.skipDelta/e|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(i),this.dispatchEvent("ready"),this.addEventListener("enterFrame",(()=>{this.dispatchEvent("firstFrame"),this.canvas[0].parentNode||!this.el||this.overrideRender||this.el.forEach(((e,t)=>e.append(this.canvas[t]))),this.frameListener=()=>{if(this.paused||!this.currentMethod)return;const e=Date.now();this.frThen=e+this.frInterval,this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener),"none"===this.group&&this.autoplay&&this.play()}),{once:!0})},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}u.CACHE=c.Z,u.reqId=0},4874:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(1447),n=i(6008),a=i(410),o=i(4789),r=i(2648);const d=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=(0,n.X)(null,this.scrollableDiv.querySelector(".tabs-container"),null,(()=>{var e;(null===(e=this.page)||void 0===e?void 0:e.onShown)&&this.page.onShown()}))}setPage(e){if(e.isAuthPage){this.pagesDiv.style.display="";const t=(0,r.Z)(e.pageEl);if(this.pageId===t)return;this.selectTab(t),-1!==this.pageId&&t>1&&s.Z.loadLottieWorkers(),this.pageId=t,this.scrollableDiv&&(0,o.Z)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",e.pageEl.style.display="",this.pageId=-1;this.page=e}};a.GO.pagesManager=d;const l=d;class c{constructor(e,t,i,s,n){this.isAuthPage=t,this.onFirstMount=i,this.onMount=s,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+e)}mount(...e){return t=this,i=void 0,n=function*(){if(this.onMount){const t=this.onMount(...e);t instanceof Promise&&(yield t)}if(!this.installed){if(this.onFirstMount)try{const t=this.onFirstMount(...e);t instanceof Promise&&(yield t)}catch(e){console.error("PAGE MOUNT ERROR:",e)}this.installed=!0}l.setPage(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}},671:(e,t,i)=>{"use strict";function s(e){return r(o(e)).join("-")}i.d(t,{Ml:()=>c,N0:()=>s,tB:()=>d,w1:()=>r,zu:()=>h});const n=/\uFE0F/g,a=String.fromCharCode(8205),o=e=>e.indexOf(a)<0?e.replace(n,""):e;function r(e){const t=[];let i=0,s=0,n=0;for(;n55296&&i<=56319?s=i:t.push(i.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}function d(e){const t=e.match(/[\uDFFB-\uDFFF]/);return t?5-(57343-t[0].charCodeAt(0)):0}const l=new Map([["FT","🏴‍☠"]]);function c(e){var t;return null!==(t=l.get(e))&&void 0!==t?t:String.fromCharCode(55356,56741+e.charCodeAt(0),55356,56741+e.charCodeAt(1))}function h(e){return e.split("-").reduce(((e,t)=>e+String.fromCodePoint(parseInt(t,16))),"")}},4329:function(e){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function i(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=e,i.c=t,i.d=function(e,t,s){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(s,n,function(t){return e[t]}.bind(null,n));return s},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=0)}([function(e,t,i){"use strict";(function(t){var i=t.AudioContext||t.webkitAudioContext,s=function(e){if(!s.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};s.isRecordingSupported=function(){return i&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},s.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},s.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],i=0;i{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},s.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then((e=>(this.stream=e,this.audioContext.createMediaStreamSource(e))))},s.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},s.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise(((t,i)=>{var s=i=>{switch(i.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=i.data.samplePosition,e(i.data.page);break;case"done":this.encoder.removeEventListener("message",s),this.finish()}};this.encoder.addEventListener("message",s),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))}))},s.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise(((e,i)=>{var s=i=>{"flushed"===i.data.message&&(t.removeEventListener("message",s),this.onpause(),e())};t.addEventListener("message",s),t.postMessage({command:"flush"})}))}return this.onpause(),Promise.resolve()}},s.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},s.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then((()=>this.initSourceNode(e))).then((e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)}))},s.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise((t=>{var i=s=>{"done"===s.data.message&&(e.removeEventListener("message",i),t())};e.addEventListener("message",i),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})}))}return Promise.resolve()},s.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},s.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},s.prototype.streamPage=function(e){this.ondataavailable(e)},s.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,i){return e.set(i,t),t+i.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},s.prototype.ondataavailable=function(){},s.prototype.onpause=function(){},s.prototype.onresume=function(){},s.prototype.onstart=function(){},s.prototype.onstop=function(){},e.exports=s}).call(this,i(1))},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i}])},6802:e=>{var t=.1,i="function"==typeof Float32Array;function s(e,t){return 1-3*t+3*e}function n(e,t){return 3*t-6*e}function a(e){return 3*e}function o(e,t,i){return((s(t,i)*e+n(t,i))*e+a(t))*e}function r(e,t,i){return 3*s(t,i)*e*e+2*n(t,i)*e+a(t)}function d(e){return e}e.exports=function(e,s,n,a){if(!(0<=e&&e<=1&&0<=n&&n<=1))throw new Error("bezier x values must be in [0, 1] range");if(e===s&&n===a)return d;for(var l=i?new Float32Array(11):new Array(11),c=0;c<11;++c)l[c]=o(c*t,e,n);return function(i){return 0===i||1===i?i:o(function(i){for(var s=0,a=1;10!==a&&l[a]<=i;++a)s+=t;--a;var d=s+(i-l[a])/(l[a+1]-l[a])*t,c=r(d,e,n);return c>=.001?function(e,t,i,s){for(var n=0;n<4;++n){var a=r(t,i,s);if(0===a)return t;t-=(o(t,i,s)-e)/a}return t}(i,d,e,n):0===c?d:function(e,t,i,s,n){var a,r,d=0;do{(a=o(r=t+(i-t)/2,s,n)-e)>0?i=r:t=r}while(Math.abs(a)>1e-7&&++d<10);return r}(i,s,s+t,e,n)}(i),s,a)}}}}]); +//# sourceMappingURL=567.2a93821ac1dd3216f099.chunk.js.map \ No newline at end of file diff --git a/public/567.2a93821ac1dd3216f099.chunk.js.map b/public/567.2a93821ac1dd3216f099.chunk.js.map new file mode 100644 index 00000000..f16503ee --- /dev/null +++ b/public/567.2a93821ac1dd3216f099.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"567.2a93821ac1dd3216f099.chunk.js","mappings":"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MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,OAAO,MAAO,OAAO,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,a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","sources":["webpack://tweb/./src/components/animationIntersector.ts","webpack://tweb/./src/components/appMediaPlaybackController.ts","webpack://tweb/./src/components/appMediaViewer.ts","webpack://tweb/./src/lib/mediaPlayer.ts","webpack://tweb/./src/components/appMediaViewerBase.ts","webpack://tweb/./src/helpers/fillPropertyValue.ts","webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/appSearch.ts","webpack://tweb/./src/components/appSearchSuper..ts","webpack://tweb/./src/helpers/dom/lockTouchScroll.ts","webpack://tweb/./src/components/appSelectPeers.ts","webpack://tweb/./src/components/audio.ts","webpack://tweb/./src/helpers/avatarListLoader.ts","webpack://tweb/./src/components/appMediaViewerAvatar.ts","webpack://tweb/./src/components/avatar.ts","webpack://tweb/./src/components/avatarEdit.ts","webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/buttonCorner.ts","webpack://tweb/./src/components/buttonIcon.ts","webpack://tweb/./src/components/buttonMenu.ts","webpack://tweb/./src/components/buttonMenuToggle.ts","webpack://tweb/./src/components/chat/gradientRenderer.ts","webpack://tweb/./src/helpers/easing/easeOutQuad.ts","webpack://tweb/./src/components/chat/selection.ts","webpack://tweb/./src/helpers/dom/getSelectedText.ts","webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/confirmationPopup.ts","webpack://tweb/./src/components/countryInputField.ts","webpack://tweb/./src/components/editPeer.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/stickers.ts","webpack://tweb/./src/components/emoticonsDropdown/index.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/emoji.ts","webpack://tweb/./src/lib/richTextProcessor/wrapSingleEmoji.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/stickers.ts","webpack://tweb/./src/components/generateDelimiter.ts","webpack://tweb/./src/components/generateFakeIcon.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat2.ts","webpack://tweb/./src/components/gifsMasonry.ts","webpack://tweb/./src/components/horizontalMenu.ts","webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/components/inputSearch.ts","webpack://tweb/./src/components/lazyLoadQueue.ts","webpack://tweb/./src/components/lazyLoadQueueIntersector.ts","webpack://tweb/./src/components/mediaProgressLine.ts","webpack://tweb/./src/components/middleEllipsis.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/components/peerProfileAvatars.ts","webpack://tweb/./src/components/peerProfile.ts","webpack://tweb/./src/components/generateTitleIcons.ts","webpack://tweb/./src/components/generateVerifiedIcon.ts","webpack://tweb/./src/components/generatePremiumIcon.ts","webpack://tweb/./src/components/peerTitle.ts","webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/deleteDialog.ts","webpack://tweb/./src/components/popups/deleteMessages.ts","webpack://tweb/./src/components/popups/forward.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/components/popups/mute.ts","webpack://tweb/./src/components/popups/peer.ts","webpack://tweb/./src/components/popups/pickUser.ts","webpack://tweb/./src/components/popups/sendNow.ts","webpack://tweb/./src/components/popups/stickers.ts","webpack://tweb/./src/components/preloader.ts","webpack://tweb/./src/components/putPhoto.ts","webpack://tweb/./src/components/wrappers/getPeerInitials.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/radioField.ts","webpack://tweb/./src/components/radioForm.ts","webpack://tweb/./src/components/rangeSelector.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/components/row.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/settingSection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newGroup.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/privacyType.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/getPrivacyRulesDetails.ts","webpack://tweb/./src/components/privacySection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack://tweb/./src/helpers/dom/canFocus.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/email.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack://tweb/./src/helpers/string/convertKeyToInputKey.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/voices.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack://tweb/./src/helpers/averageColor.ts","webpack://tweb/./src/helpers/highlightningColor.ts","webpack://tweb/./src/components/colorPicker.ts","webpack://tweb/./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack://tweb/./src/components/sidebarLeft/tabs/background.ts","webpack://tweb/./src/helpers/files/requestFile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/quickReaction.ts","webpack://tweb/./src/components/sidebarLeft/tabs/generalSettings.ts","webpack://tweb/./src/helpers/eachMinute.ts","webpack://tweb/./src/helpers/eachTimeout.ts","webpack://tweb/./src/components/sidebarLeft/tabs/notifications.ts","webpack://tweb/./src/components/sidebarLeft/tabs/language.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/photo.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/file.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/video.ts","webpack://tweb/./src/components/sidebarLeft/tabs/dataAndStorage.ts","webpack://tweb/./src/components/sidebarLeft/tabs/settings.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newChannel.ts","webpack://tweb/./src/components/popups/createContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/contacts.ts","webpack://tweb/./src/components/sidebarLeft/tabs/archivedTab.ts","webpack://tweb/./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack://tweb/./src/components/sidebarLeft/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/addMembers.ts","webpack://tweb/./src/components/sidebarLeft/tabs/chatFolders.ts","webpack://tweb/./src/components/sidebarLeft/tabs/includedChats.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editFolder.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editProfile.ts","webpack://tweb/./src/components/sidebarRight/index.ts","webpack://tweb/./src/components/sidebarRight/tabs/editContact.ts","webpack://tweb/./src/components/sidebarRight/tabs/editTopic.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatType.ts","webpack://tweb/./src/components/sidebarRight/tabs/userPermissions.ts","webpack://tweb/./src/components/sidebarRight/tabs/groupPermissions.ts","webpack://tweb/./src/lib/appManagers/utils/chats/combineParticipantBannedRights.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatReactions.ts","webpack://tweb/./src/components/sidebarRight/tabs/editChat.ts","webpack://tweb/./src/components/sidebarRight/tabs/sharedMedia.ts","webpack://tweb/./src/components/singleTransition.ts","webpack://tweb/./src/components/slider.ts","webpack://tweb/./src/components/sliderTab.ts","webpack://tweb/./src/components/sortedUserList.ts","webpack://tweb/./src/components/stickerViewer.ts","webpack://tweb/./src/components/stickyIntersector.ts","webpack://tweb/./src/components/swipeHandler.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/components/toast.ts","webpack://tweb/./src/components/transition.ts","webpack://tweb/./src/lib/richTextProcessor/isUsernameValid.ts","webpack://tweb/./src/components/usernameInputField.ts","webpack://tweb/./src/components/usernamesSection.ts","webpack://tweb/./src/components/visibilityIntersector.ts","webpack://tweb/./src/components/volumeSelector.ts","webpack://tweb/./src/components/wrappers/customEmoji.ts","webpack://tweb/./src/components/wrappers/document.ts","webpack://tweb/./src/components/wrappers/formatUserPhone.ts","webpack://tweb/./src/components/wrappers/getChatMembersString.ts","webpack://tweb/./src/components/wrappers/getPeerTitle.ts","webpack://tweb/./src/components/wrappers/getUserStatusString.ts","webpack://tweb/./src/components/wrappers/messageActionTextNew.ts","webpack://tweb/./src/components/topicAvatar.ts","webpack://tweb/./src/components/wrappers/joinVoiceChatAnchor.ts","webpack://tweb/./src/components/wrappers/messageActionTextNewUnsafe.ts","webpack://tweb/./src/components/wrappers/messageForReply.ts","webpack://tweb/./src/components/wrappers/peerTitle.ts","webpack://tweb/./src/components/wrappers/photo.ts","webpack://tweb/./src/components/wrappers/senderToPeer.ts","webpack://tweb/./src/components/wrappers/sentTime.ts","webpack://tweb/./src/components/wrappers/sticker.ts","webpack://tweb/./src/helpers/bytes/getPathFromBytes.ts","webpack://tweb/./src/helpers/computeLockColor.ts","webpack://tweb/./src/components/wrappers/stickerAnimation.ts","webpack://tweb/./src/components/wrappers/stickerEmoji.ts","webpack://tweb/./src/components/wrappers/stickerSetThumb.ts","webpack://tweb/./src/components/wrappers/stickerToRow.ts","webpack://tweb/./src/components/wrappers/topicNameButton.ts","webpack://tweb/./src/components/wrappers/video.ts","webpack://tweb/./src/components/wrappers/webPageDescription.ts","webpack://tweb/./src/components/wrappers/webPageTitle.ts","webpack://tweb/./src/config/currencies.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/config/font.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/helpers/animation.ts","webpack://tweb/./src/helpers/array/filterAsync.ts","webpack://tweb/./src/helpers/array/findAndSpliceAll.ts","webpack://tweb/./src/helpers/audioAssetPlayer.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/heavyQueue.ts","webpack://tweb/./src/helpers/blur.ts","webpack://tweb/./src/helpers/bytes/getPreviewURLFromBytes.ts","webpack://tweb/./src/helpers/bytes/bytesToDataURL.ts","webpack://tweb/./src/helpers/calcImageInBox.ts","webpack://tweb/./src/helpers/canvas/getTextWidth.ts","webpack://tweb/./src/helpers/canvas/scaleMediaElement.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/clipboard.ts","webpack://tweb/./src/helpers/contextMenuController.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/dom/anchorCopy.ts","webpack://tweb/./src/helpers/dom/attachContextMenuListener.ts","webpack://tweb/./src/helpers/dom/attachGrabListeners.ts","webpack://tweb/./src/helpers/dom/cancelSelection.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/controlsHover.ts","webpack://tweb/./src/helpers/dom/createContextMenu.ts","webpack://tweb/./src/helpers/dom/createStickersContextMenu.ts","webpack://tweb/./src/helpers/dom/createVideo.ts","webpack://tweb/./src/helpers/dom/customProperties.ts","webpack://tweb/./src/helpers/dom/dispatchEvent.ts","webpack://tweb/./src/helpers/dom/documentFragmentToHTML.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/getCaretPosNew.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValueWithCaret.ts","webpack://tweb/./src/helpers/dom/getViewportSlice.ts","webpack://tweb/./src/helpers/dom/getVisibleRect.ts","webpack://tweb/./src/helpers/dom/handleHorizontalSwipe.ts","webpack://tweb/./src/helpers/dom/handleTabSwipe.ts","webpack://tweb/./src/helpers/dom/htmlToDocumentFragment.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/positionElementByIndex.ts","webpack://tweb/./src/helpers/dom/renderImageFromUrl.ts","webpack://tweb/./src/helpers/dom/renderMediaWithFadeIn.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts","webpack://tweb/./src/helpers/dom/compareNodes.ts","webpack://tweb/./src/helpers/dom/richInputHandler.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/dom/whichChild.ts","webpack://tweb/./src/helpers/dropdownHover.ts","webpack://tweb/./src/helpers/fastSmoothScroll.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/filterChatPhotosMessages.ts","webpack://tweb/./src/helpers/formatBytes.ts","webpack://tweb/./src/helpers/formatCallDuration.ts","webpack://tweb/./src/helpers/formatDuration.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/helpers/framesCache.ts","webpack://tweb/./src/helpers/generatePathData.ts","webpack://tweb/./src/helpers/getImageFromStrippedThumb.ts","webpack://tweb/./src/helpers/getPreviewURLFromThumb.ts","webpack://tweb/./src/helpers/getStrippedThumbIfNeeded.ts","webpack://tweb/./src/helpers/listLoader.ts","webpack://tweb/./src/helpers/listenerSetter.ts","webpack://tweb/./src/helpers/mediaSize.ts","webpack://tweb/./src/helpers/mediaSizes.ts","webpack://tweb/./src/helpers/middlewarePromise.ts","webpack://tweb/./src/helpers/number/clamp.ts","webpack://tweb/./src/helpers/number/formatNumber.ts","webpack://tweb/./src/helpers/number/numberThousandSplitter.ts","webpack://tweb/./src/helpers/onMediaLoad.ts","webpack://tweb/./src/helpers/overlayClickHandler.ts","webpack://tweb/./src/helpers/paymentsWrapCurrencyAmount.ts","webpack://tweb/./src/helpers/positionMenu.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/helpers/saveLottiePreview.ts","webpack://tweb/./src/helpers/schedulers/throttleWithRaf.ts","webpack://tweb/./src/helpers/schedulers/throttleWith.ts","webpack://tweb/./src/helpers/scrollableLoader.ts","webpack://tweb/./src/helpers/searchListLoader.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/incrementMessageId.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/setAttachmentSize.ts","webpack://tweb/./src/helpers/sortedList.ts","webpack://tweb/./src/helpers/string/bom.ts","webpack://tweb/./src/helpers/string/encodeEntities.ts","webpack://tweb/./src/helpers/string/escapeRegExp.ts","webpack://tweb/./src/helpers/string/limitSymbols.ts","webpack://tweb/./src/helpers/string/toHHMMSS.ts","webpack://tweb/./src/helpers/textToSvgURL.ts","webpack://tweb/./src/helpers/windowSize.ts","webpack://tweb/./src/hooks/useHeavyAnimationCheck.ts","webpack://tweb/./src/components/dialogsContextMenu.ts","webpack://tweb/./src/components/connectionStatus.ts","webpack://tweb/./src/components/sendingStatus.ts","webpack://tweb/./src/helpers/easing/easeInOutSine.ts","webpack://tweb/./src/helpers/canvas/roundRect.ts","webpack://tweb/./src/components/groupCallActiveIcon.ts","webpack://tweb/./src/helpers/canvas/shimmer.ts","webpack://tweb/./src/helpers/dialogsPlaceholder.ts","webpack://tweb/./src/helpers/canvas/drawCircle.ts","webpack://tweb/./src/helpers/dom/shake.ts","webpack://tweb/./src/lib/appManagers/appDialogsManager.ts","webpack://tweb/./src/helpers/number/getUnsafeRandomInt.ts","webpack://tweb/./src/lib/appManagers/appDownloadManager.ts","webpack://tweb/./src/helpers/dom/createDownloadAnchor.ts","webpack://tweb/./src/components/chat/bubbleGroups.ts","webpack://tweb/./src/helpers/array/partition.ts","webpack://tweb/./src/components/popups/datePicker.ts","webpack://tweb/./src/components/divAndCaption.ts","webpack://tweb/./src/components/chat/replyContainer.ts","webpack://tweb/./src/components/wrappers/reply.ts","webpack://tweb/./src/components/stackedAvatars.ts","webpack://tweb/./src/components/chat/replies.ts","webpack://tweb/./src/components/chat/messageRender.ts","webpack://tweb/./src/helpers/dom/getElementByPoint.ts","webpack://tweb/./src/helpers/dom/reflowScrollableElement.ts","webpack://tweb/./src/lib/mtproto/constants.ts","webpack://tweb/./src/lib/appManagers/internalLink.ts","webpack://tweb/./src/components/popups/joinChatInvite.ts","webpack://tweb/./src/components/chat/reaction.ts","webpack://tweb/./src/components/chat/reactions.ts","webpack://tweb/./src/helpers/scrollSaver.ts","webpack://tweb/./src/helpers/dom/superIntersectionObserver.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMentionUnread.ts","webpack://tweb/./src/helpers/array/accumulate.ts","webpack://tweb/./src/helpers/cacheCallback.ts","webpack://tweb/./src/helpers/string/replaceNonNumber.ts","webpack://tweb/./src/helpers/cards/cardBrands.ts","webpack://tweb/./src/helpers/array/createArray.ts","webpack://tweb/./src/helpers/string/buggedNumbers.ts","webpack://tweb/./src/helpers/cards/patternCharacters.ts","webpack://tweb/./src/helpers/cards/cardFormattingPatterns.ts","webpack://tweb/./src/helpers/cards/formatValueByPattern.ts","webpack://tweb/./src/helpers/cards/validateCard.ts","webpack://tweb/./src/helpers/string/nbsp.ts","webpack://tweb/./src/components/telegramWebView.ts","webpack://tweb/./src/components/popups/paymentVerification.ts","webpack://tweb/./src/components/popups/paymentCard.ts","webpack://tweb/./src/helpers/cards/formatInputValueByPattern.ts","webpack://tweb/./src/components/popups/paymentCardConfirmation.ts","webpack://tweb/./src/components/popups/paymentShipping.ts","webpack://tweb/./src/components/popups/paymentShippingMethods.ts","webpack://tweb/./src/components/popups/payment.ts","webpack://tweb/./src/components/groupedLayout.ts","webpack://tweb/./src/components/prepareAlbum.ts","webpack://tweb/./src/components/dotRenderer.ts","webpack://tweb/./src/components/wrappers/mediaSpoiler.ts","webpack://tweb/./src/components/wrappers/album.ts","webpack://tweb/./src/components/sidebarRight/tabs/pollResults.ts","webpack://tweb/./src/components/poll.ts","webpack://tweb/./src/helpers/string/isRTL.ts","webpack://tweb/./src/components/chat/bubbles.ts","webpack://tweb/./src/helpers/dom/copyFromElement.ts","webpack://tweb/./src/components/wrappers/groupedDocuments.ts","webpack://tweb/./src/components/wrappers/poll.ts","webpack://tweb/./src/components/popups/unpinMessage.ts","webpack://tweb/./src/helpers/dom/isSelectionEmpty.ts","webpack://tweb/./src/helpers/preloadAnimatedEmojiSticker.ts","webpack://tweb/./src/components/popups/reportMessagesConfirm.ts","webpack://tweb/./src/components/popups/reportMessages.ts","webpack://tweb/./src/components/popups/sponsored.ts","webpack://tweb/./src/components/popups/reactedList.ts","webpack://tweb/./src/components/chat/reactionsMenu.ts","webpack://tweb/./src/components/chat/contextMenu.ts","webpack://tweb/./src/components/chat/sendContextMenu.ts","webpack://tweb/./src/components/popups/createPoll.ts","webpack://tweb/./src/helpers/createPoster.ts","webpack://tweb/./src/helpers/getGifDuration.ts","webpack://tweb/./src/components/popups/newMedia.ts","webpack://tweb/./src/helpers/dom/attachListNavigation.ts","webpack://tweb/./src/components/chat/autocompleteHelper.ts","webpack://tweb/./src/components/chat/stickersHelper.ts","webpack://tweb/./src/components/popups/schedule.ts","webpack://tweb/./src/components/chat/emojiHelper.ts","webpack://tweb/./src/components/chat/autocompletePeerHelper.ts","webpack://tweb/./src/components/chat/commandsHelper.ts","webpack://tweb/./src/components/chat/autocompleteHelperController.ts","webpack://tweb/./src/components/chat/mentionsHelper.ts","webpack://tweb/./src/components/chat/replyKeyboard.ts","webpack://tweb/./src/components/chat/inlineHelper.ts","webpack://tweb/./src/components/chat/botCommands.ts","webpack://tweb/./src/helpers/modifyAckedResult.ts","webpack://tweb/./src/components/chat/sendAs.ts","webpack://tweb/./src/components/inputFieldAnimated.ts","webpack://tweb/./src/helpers/dom/hasMarkupInSelection.ts","webpack://tweb/./src/components/chat/input.ts","webpack://tweb/./src/components/wrappers/draft.ts","webpack://tweb/./src/components/chat/pinnedContainer.ts","webpack://tweb/./src/components/chat/pinnedMessageBorder.ts","webpack://tweb/./src/components/chat/audio.ts","webpack://tweb/./src/components/chat/pinnedMessage.ts","webpack://tweb/./src/helpers/dom/handleScrollSideEvent.ts","webpack://tweb/./src/components/chat/topbar.ts","webpack://tweb/./src/components/sidebarRight/tabs/search.ts","webpack://tweb/./src/components/chat/search.ts","webpack://tweb/./src/components/chat/patternRenderer.ts","webpack://tweb/./src/components/chat/chat.ts","webpack://tweb/./src/helpers/autoDownload.ts","webpack://tweb/./src/components/chat/markupTooltip.ts","webpack://tweb/./src/components/chat/dragAndDrop.ts","webpack://tweb/./src/helpers/dom/disableTransition.ts","webpack://tweb/./src/components/lineBlobDrawable.ts","webpack://tweb/./src/components/topbarWeave.ts","webpack://tweb/./src/lib/rlottie/rlottieIcon.ts","webpack://tweb/./src/components/superIcon.ts","webpack://tweb/./src/components/groupCall/microphoneIcon.ts","webpack://tweb/./src/components/groupCall/participantMutedIcon.ts","webpack://tweb/./src/components/groupCall/index.ts","webpack://tweb/./src/components/groupCall/participantStatus.ts","webpack://tweb/./src/components/groupCall/participantsList.ts","webpack://tweb/./src/components/call/videoCanvasBlur.ts","webpack://tweb/./src/components/groupCall/participantVideo.ts","webpack://tweb/./src/components/groupCall/participantVideos.ts","webpack://tweb/./src/components/groupCall/participants.ts","webpack://tweb/./src/components/groupCall/description.ts","webpack://tweb/./src/components/groupCall/title.ts","webpack://tweb/./src/components/call/button.ts","webpack://tweb/./src/components/movableElement.ts","webpack://tweb/./src/helpers/movablePanel.ts","webpack://tweb/./src/helpers/toggleClassName.ts","webpack://tweb/./src/components/call/description.ts","webpack://tweb/./src/components/groupCall/microphoneIconMini.ts","webpack://tweb/./src/components/call/index.ts","webpack://tweb/./src/components/topbarCall.ts","webpack://tweb/./src/lib/appManagers/uiNotificationsManager.ts","webpack://tweb/./src/helpers/files/getFilesFromEvent.ts","webpack://tweb/./src/helpers/addAnchorListener.ts","webpack://tweb/./src/lib/appManagers/appImManager.ts","webpack://tweb/./src/lib/appManagers/utils/messages/canSaveMessageMedia.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMediaFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageSenderPeerIdOrName.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMessageRestricted.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerColorById.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerEditableUsername.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/photos/choosePhotoSize.ts","webpack://tweb/./src/lib/calls/callConnectionInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/createPeerConnection.ts","webpack://tweb/./src/lib/calls/helpers/createDataChannel.ts","webpack://tweb/./src/lib/calls/helpers/parseSignalingData.ts","webpack://tweb/./src/lib/calls/callConnectionInstance.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/calls/p2P/p2PEncryptor.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/calls/p2P/chromeP2PSdpBuilder.ts","webpack://tweb/./src/lib/calls/p2P/p2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/firefoxP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/safariP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/callInstance.ts","webpack://tweb/./src/lib/calls/p2P/getCallProtocol.ts","webpack://tweb/./src/lib/calls/p2P/getRtcConfiguration.ts","webpack://tweb/./src/lib/calls/helpers/getStreamCached.ts","webpack://tweb/./src/lib/calls/callInstanceBase.ts","webpack://tweb/./src/lib/calls/callState.ts","webpack://tweb/./src/components/call/getAudioAsset.ts","webpack://tweb/./src/lib/calls/callsController.ts","webpack://tweb/./src/lib/calls/constants.ts","webpack://tweb/./src/lib/calls/groupCallConnectionInstance.ts","webpack://tweb/./src/lib/calls/helpers/processMediaSection.ts","webpack://tweb/./src/lib/calls/helpers/filterServerCodecs.ts","webpack://tweb/./src/lib/calls/helpers/fixLocalOffer.ts","webpack://tweb/./src/lib/calls/groupCallInstance.ts","webpack://tweb/./src/lib/calls/groupCallState.ts","webpack://tweb/./src/components/groupCall/getAudioAsset.ts","webpack://tweb/./src/lib/calls/groupCallsController.ts","webpack://tweb/./src/lib/calls/helpers/createMainStreamManager.ts","webpack://tweb/./src/lib/calls/helpers/getAudioConstraints.ts","webpack://tweb/./src/environment/constraintSupport.ts","webpack://tweb/./src/lib/calls/helpers/getScreenConstraints.ts","webpack://tweb/./src/lib/calls/helpers/getScreenStream.ts","webpack://tweb/./src/lib/calls/helpers/getStream.ts","webpack://tweb/./src/lib/calls/helpers/getVideoConstraints.ts","webpack://tweb/./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack://tweb/./src/lib/calls/helpers/parseSourceGroups.ts","webpack://tweb/./src/lib/calls/helpers/stopTrack.ts","webpack://tweb/./src/lib/calls/localConferenceDescription.ts","webpack://tweb/./src/lib/calls/sdp/index.ts","webpack://tweb/./src/helpers/string/splitStringByLimitWithRest.ts","webpack://tweb/./src/helpers/uniqueNumberGenerator.ts","webpack://tweb/./src/lib/calls/sdp/attributeSplitted.ts","webpack://tweb/./src/lib/calls/sdp/mediaLineParts.ts","webpack://tweb/./src/lib/calls/sdp/line.ts","webpack://tweb/./src/lib/calls/sdp/attributeInner.ts","webpack://tweb/./src/lib/calls/sdp/attributes.ts","webpack://tweb/./src/lib/calls/sdp/mediaSection.ts","webpack://tweb/./src/lib/calls/sdp/sessionSection.ts","webpack://tweb/./src/lib/calls/sdp/utils.ts","webpack://tweb/./src/lib/calls/sdpBuilder.ts","webpack://tweb/./src/lib/calls/streamManager.ts","webpack://tweb/./src/lib/calls/stringFromLineBuilder.ts","webpack://tweb/./src/lib/calls/utils.ts","webpack://tweb/./src/lib/richTextProcessor/getAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiEntityFromEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchEmail.ts","webpack://tweb/./src/lib/richTextProcessor/setBlankToAnchor.ts","webpack://tweb/./src/lib/richTextProcessor/wrapAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/wrapDraftText.ts","webpack://tweb/./src/lib/richTextProcessor/wrapEmojiText.ts","webpack://tweb/./src/environment/emojiVersionsSupport.ts","webpack://tweb/./src/lib/richTextProcessor/wrapRichText.ts","webpack://tweb/./src/helpers/buildURLHash.ts","webpack://tweb/./src/lib/richTextProcessor/wrapTelegramUrlToAnchor.ts","webpack://tweb/./src/lib/rlottie/queryableWorker.ts","webpack://tweb/./src/environment/webAssemblySupport.ts","webpack://tweb/./src/lib/rlottie/lottieLoader.ts","webpack://tweb/./src/lib/rlottie/rlottiePlayer.ts","webpack://tweb/./src/pages/pagesManager.ts","webpack://tweb/./src/pages/page.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/./public/recorder.min.js","webpack://tweb/./src/vendor/bezier-easing/index.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 {CustomEmojiElement, CustomEmojiRendererElement} from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport forEachReverse from '../helpers/array/forEachReverse';\nimport idleController from '../helpers/idleController';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport {fastRaf} from '../helpers/schedulers';\n\nexport type AnimationItemGroup = '' | 'none' | 'chat' | 'lock' |\n 'STICKERS-POPUP' | 'emoticons-dropdown' | 'STICKERS-SEARCH' | 'GIFS-SEARCH' |\n `CHAT-MENU-REACTIONS-${number}` | 'INLINE-HELPER' | 'GENERAL-SETTINGS' | 'STICKER-VIEWER' | 'EMOJI' |\n 'EMOJI-STATUS' | `chat-${number}`;\nexport interface AnimationItem {\n el: HTMLElement,\n group: AnimationItemGroup,\n animation: AnimationItemWrapper,\n controlled?: boolean\n};\n\nexport interface AnimationItemWrapper {\n remove: () => void;\n paused: boolean;\n pause: () => any;\n play: () => any;\n autoplay: boolean;\n // onVisibilityChange?: (visible: boolean) => boolean;\n};\n\nexport class AnimationIntersector {\n private observer: IntersectionObserver;\n private visible: Set;\n\n private overrideIdleGroups: Set;\n private byGroups: {[group in AnimationItemGroup]?: AnimationItem[]};\n private byPlayer: Map;\n private lockedGroups: {[group in AnimationItemGroup]?: true};\n private onlyOnePlayableGroup: AnimationItemGroup;\n\n private intersectionLockedGroups: {[group in AnimationItemGroup]?: true};\n private videosLocked: boolean;\n\n constructor() {\n this.observer = new IntersectionObserver((entries) => {\n // if(rootScope.idle.isIDLE) return;\n\n for(const entry of entries) {\n const target = entry.target;\n\n for(const group in this.byGroups) {\n if(this.intersectionLockedGroups[group as AnimationItemGroup]) {\n continue;\n }\n\n const animation = this.byGroups[group as AnimationItemGroup].find((p) => p.el === target);\n if(!animation) {\n continue;\n }\n\n if(entry.isIntersecting) {\n this.visible.add(animation);\n this.checkAnimation(animation, false);\n\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\n animation.src = animation.dataset.src;\n animation.load();\n } */\n } else {\n this.visible.delete(animation);\n this.checkAnimation(animation, true);\n\n const _animation = animation.animation;\n if(_animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\n // console.warn('will clear cache', player);\n _animation.clearCache();\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\n animation.dataset.src = animation.src;\n animation.src = '';\n animation.load();\n } */\n }\n\n break;\n }\n }\n });\n\n this.visible = new Set();\n\n this.overrideIdleGroups = new Set();\n this.byGroups = {};\n this.byPlayer = new Map();\n this.lockedGroups = {};\n this.onlyOnePlayableGroup = '';\n\n this.intersectionLockedGroups = {};\n this.videosLocked = false;\n\n appMediaPlaybackController.addEventListener('play', ({doc}) => {\n if(doc.type === 'round') {\n this.videosLocked = true;\n this.checkAnimations2();\n }\n });\n\n appMediaPlaybackController.addEventListener('pause', () => {\n if(this.videosLocked) {\n this.videosLocked = false;\n this.checkAnimations2();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n this.checkAnimations2(idle);\n });\n }\n\n public setOverrideIdleGroup(group: string, override: boolean) {\n if(override) this.overrideIdleGroups.add(group);\n else this.overrideIdleGroups.delete(group);\n }\n\n public getAnimations(element: HTMLElement) {\n const found: AnimationItem[] = [];\n for(const group in this.byGroups) {\n for(const player of this.byGroups[group as AnimationItemGroup]) {\n if(player.el === element) {\n found.push(player);\n }\n }\n }\n\n return found;\n }\n\n public removeAnimation(player: AnimationItem) {\n const {el, animation} = player;\n // if(!(animation instanceof CustomEmojiElement)) {\n animation.remove();\n // }\n\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\n animation.src = '';\n animation.load();\n }, 1e3);\n }\n\n const group = this.byGroups[player.group];\n if(group) {\n indexOfAndSplice(group, player);\n if(!group.length) {\n delete this.byGroups[player.group];\n }\n }\n\n this.observer.unobserve(el);\n this.visible.delete(player);\n this.byPlayer.delete(animation);\n }\n\n public removeAnimationByPlayer(player: AnimationItemWrapper) {\n const item = this.byPlayer.get(player);\n if(item) {\n this.removeAnimation(item);\n }\n }\n\n public addAnimation(\n animation: AnimationItem['animation'],\n group: AnimationItemGroup = '',\n observeElement?: HTMLElement,\n controlled?: boolean\n ) {\n if(group === 'none' || this.byPlayer.has(animation)) {\n return;\n }\n\n if(!observeElement) {\n if(animation instanceof RLottiePlayer) {\n observeElement = animation.el[0];\n } else if(animation instanceof CustomEmojiRendererElement) {\n observeElement = animation.canvas;\n } else if(animation instanceof CustomEmojiElement) {\n observeElement = animation.placeholder ?? animation;\n } else if(animation instanceof HTMLElement) {\n observeElement = animation;\n }\n }\n\n const item: AnimationItem = {\n el: observeElement,\n animation: animation,\n group,\n controlled\n };\n\n if(animation instanceof RLottiePlayer) {\n if(!rootScope.settings.stickers.loop && animation.loop) {\n animation.loop = rootScope.settings.stickers.loop;\n }\n }\n\n (this.byGroups[group as AnimationItemGroup] ??= []).push(item);\n this.observer.observe(item.el);\n this.byPlayer.set(animation, item);\n }\n\n public checkAnimations(\n blurred?: boolean,\n group?: AnimationItemGroup,\n destroy?: boolean,\n imitateIntersection?: boolean\n ) {\n // if(rootScope.idle.isIDLE) return;\n\n if(group !== undefined && !this.byGroups[group]) {\n // console.warn('no animation group:', group);\n return;\n }\n\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups) as AnimationItemGroup[];\n\n for(const group of groups) {\n if(imitateIntersection && this.intersectionLockedGroups[group]) {\n continue;\n }\n\n const animations = this.byGroups[group];\n\n forEachReverse(animations, (animation) => {\n this.checkAnimation(animation, blurred, destroy);\n });\n }\n }\n\n public checkAnimations2(blurred?: boolean) {\n this.checkAnimations(blurred, undefined, undefined, true);\n }\n\n public checkAnimation(player: AnimationItem, blurred?: boolean, destroy?: boolean) {\n const {el, animation, group} = player;\n // return;\n if(destroy || (!this.lockedGroups[group] && !isInDOM(el))) {\n if(!player.controlled || destroy) {\n this.removeAnimation(player);\n }\n\n return;\n }\n\n if(blurred ||\n (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) ||\n (animation instanceof HTMLVideoElement && this.videosLocked)\n ) {\n if(!animation.paused) {\n // console.warn('pause animation:', animation);\n animation.pause();\n }\n } else if(animation.paused &&\n this.visible.has(player) &&\n animation.autoplay &&\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\n (!idleController.isIdle || this.overrideIdleGroups.has(player.group))\n ) {\n // console.warn('play animation:', animation);\n animation.play();\n }\n }\n\n public getOnlyOnePlayableGroup() {\n return this.onlyOnePlayableGroup;\n }\n\n public setOnlyOnePlayableGroup(group: AnimationItemGroup = '') {\n this.onlyOnePlayableGroup = group;\n }\n\n public lockGroup(group: AnimationItemGroup) {\n this.lockedGroups[group] = true;\n }\n\n public unlockGroup(group: AnimationItemGroup) {\n delete this.lockedGroups[group];\n this.checkAnimations(undefined, group);\n }\n\n public refreshGroup(group: AnimationItemGroup) {\n const animations = this.byGroups[group];\n if(!animations?.length) {\n return;\n }\n\n animations.forEach((animation) => {\n this.observer.unobserve(animation.el);\n });\n\n fastRaf(() => {\n animations.forEach((animation) => {\n this.observer.observe(animation.el);\n });\n });\n }\n\n public lockIntersectionGroup(group: AnimationItemGroup) {\n this.intersectionLockedGroups[group] = true;\n }\n\n public unlockIntersectionGroup(group: AnimationItemGroup) {\n delete this.intersectionLockedGroups[group];\n this.refreshGroup(group);\n }\n\n public toggleIntersectionGroup(group: AnimationItemGroup, lock: boolean) {\n if(lock) this.lockIntersectionGroup(group);\n else this.unlockIntersectionGroup(group);\n }\n}\n\nconst animationIntersector = new AnimationIntersector();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.animationIntersector = animationIntersector);\nexport default animationIntersector;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_APPLE, IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\nimport type {SearchSuperContext} from './appSearchSuper.';\nimport {Document, DocumentAttribute, Message, PhotoSize} from '../layer';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport I18n from '../lib/langPack';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport copy from '../helpers/object/copy';\nimport deepEqual from '../helpers/object/deepEqual';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\n\nexport type MediaItem = {mid: number, peerId: PeerId};\n\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\n\nconst SHOULD_USE_SAFARI_FIX = (() => {\n try {\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\n } catch(err) {\n return false;\n }\n})();\n\nconst SEEK_OFFSET = 10;\n\nexport type MediaSearchContext = SearchSuperContext & Partial<{\n isScheduled: boolean,\n useSearch: boolean\n}>;\n\ntype MediaDetails = {\n peerId: PeerId,\n mid: number,\n docId: DocId,\n doc: MyDocument,\n message: Message.message,\n clean?: boolean,\n isScheduled?: boolean,\n isSingle?: boolean\n};\n\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\n\nexport class AppMediaPlaybackController extends EventListenerBase<{\n play: (details: ReturnType) => void,\n pause: () => void,\n playbackParams: (params: ReturnType) => void,\n stop: () => void,\n}> {\n private container: HTMLElement;\n private media: Map> = new Map();\n private scheduled: AppMediaPlaybackController['media'] = new Map();\n private mediaDetails: Map = new Map();\n private playingMedia: HTMLMediaElement;\n private playingMediaType: PlaybackMediaType;\n\n private waitingMediaForLoad: Map>> = new Map();\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\n\n public willBePlayedMedia: HTMLMediaElement;\n private searchContext: MediaSearchContext;\n\n private listLoader: SearchListLoader;\n\n public volume: number;\n public muted: boolean;\n public playbackRate: number;\n public loop: boolean;\n public round: boolean;\n private _volume: number;\n private _muted: boolean;\n private _playbackRate: number;\n private _loop: boolean;\n private _round: boolean;\n private lockedSwitchers: boolean;\n private playbackRates: Record = {\n voice: 1,\n video: 1,\n audio: 1\n };\n\n private pip: HTMLVideoElement;\n private managers: AppManagers;\n private skipMediaPlayEvent: boolean;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n this.container = document.createElement('div');\n // this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\n this.container.style.cssText = 'display: none;';\n document.body.append(this.container);\n\n if(navigator.mediaSession) {\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\n play: this.browserPlay,\n pause: this.browserPause,\n stop: this.browserStop,\n seekbackward: this.browserSeekBackward,\n seekforward: this.browserSeekForward,\n seekto: this.browserSeekTo,\n previoustrack: this.browserPrevious,\n nexttrack: this.browserNext\n };\n\n for(const action in actions) {\n try {\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\n } catch(err) {\n console.warn('MediaSession action is not supported:', action);\n }\n }\n }\n\n rootScope.addEventListener('document_downloaded', (docId) => {\n const set = this.waitingDocumentsForLoad[docId];\n if(set) {\n for(const media of set) {\n this.onMediaDocumentLoad(media);\n }\n }\n });\n\n rootScope.addEventListener('media_play', () => {\n if(this.skipMediaPlayEvent) {\n this.skipMediaPlayEvent = false;\n return;\n }\n\n if(!this.pause() && this.pip) {\n this.pip.pause();\n }\n });\n\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\n const keys = [\n 'volume' as const,\n 'muted' as const,\n 'playbackRate' as const,\n 'loop' as const,\n 'round' as const\n ];\n keys.forEach((key) => {\n const _key = ('_' + key) as `_${typeof key}`;\n properties[key] = {\n get: () => this[_key],\n set: (value: number | boolean) => {\n if(this[_key] === value) {\n return;\n }\n\n // @ts-ignore\n this[_key] = value;\n if(this.playingMedia && (key !== 'loop' || this.playingMediaType === 'audio') && key !== 'round') {\n // @ts-ignore\n this.playingMedia[key] = value;\n }\n\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\n this.playbackRates[this.playingMediaType] = value as number;\n }\n\n this.dispatchPlaybackParams();\n }\n };\n });\n Object.defineProperties(this, properties);\n }\n\n private dispatchPlaybackParams() {\n this.dispatchEvent('playbackParams', this.getPlaybackParams());\n }\n\n public getPlaybackParams() {\n const {volume, muted, playbackRate, playbackRates, loop, round} = this;\n return {\n volume,\n muted,\n playbackRate,\n playbackRates,\n loop,\n round\n };\n }\n\n public setPlaybackParams(params: ReturnType) {\n this.playbackRates = params.playbackRates;\n this._volume = params.volume;\n this._muted = params.muted;\n this._playbackRate = params.playbackRate;\n this._loop = params.loop;\n this._round = params.round;\n }\n\n public seekBackward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekForward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekTo = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = details.seekTime;\n }\n };\n\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\n const {peerId, mid} = message;\n\n const isScheduled = !!message.pFlags.is_scheduled;\n const s = isScheduled ? this.scheduled : this.media;\n let storage = s.get(message.peerId);\n if(!storage) {\n s.set(message.peerId, storage = new Map());\n }\n\n let media = storage.get(mid);\n if(media) {\n return media;\n }\n\n const doc = getMediaFromMessage(message) as Document.document;\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\n // const source = document.createElement('source');\n // source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\n\n if(doc.type === 'round') {\n media.setAttribute('playsinline', 'true');\n // media.muted = true;\n }\n\n const details: MediaDetails = {\n peerId,\n mid,\n docId: doc.id,\n doc,\n message,\n clean,\n isScheduled: message.pFlags.is_scheduled\n };\n\n this.mediaDetails.set(media, details);\n\n // media.autoplay = true;\n media.volume = 1;\n // media.append(source);\n\n this.container.append(media);\n\n media.addEventListener('play', this.onPlay);\n media.addEventListener('pause', this.onPause);\n media.addEventListener('ended', this.onEnded);\n\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\n media.addEventListener('timeupdate', () => {\n this.managers.appMessagesManager.readMessages(peerId, [mid]);\n }, {once: true});\n }\n\n /* const onError = (e: Event) => {\n //console.log('appMediaPlaybackController: video onError', e);\n\n if(this.nextMid === mid) {\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\n if(this.nextMid && storage[this.nextMid]) {\n storage[this.nextMid].play();\n }\n });\n }\n };\n\n media.addEventListener('error', onError); */\n\n const deferred = deferredPromise();\n if(autoload) {\n deferred.resolve();\n } else {\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n let waitingStorage = w.get(peerId);\n if(!waitingStorage) {\n w.set(peerId, waitingStorage = new Map());\n }\n\n waitingStorage.set(mid, deferred);\n }\n\n deferred.then(async() => {\n // media.autoplay = true;\n // console.log('will set media url:', media, doc, doc.type, doc.url);\n\n if(doc.supportsStreaming || (await this.managers.thumbsStorage.getCacheContext(doc)).url) {\n this.onMediaDocumentLoad(media);\n } else {\n let set = this.waitingDocumentsForLoad[doc.id];\n if(!set) {\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\n }\n\n set.add(media);\n appDownloadManager.downloadMediaURL({media: doc});\n }\n }/* , onError */);\n\n return media;\n }\n\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\n return s?.get(mid);\n }\n\n private onMediaDocumentLoad = async(media: HTMLMediaElement) => {\n const details = this.mediaDetails.get(media);\n const doc = await this.managers.appDocsManager.getDoc(details.docId);\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\n this.handleSafariStreamable(media);\n }\n\n // setTimeout(() => {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n media.src = cacheContext.url;\n\n if(this.playingMedia === media) {\n media.playbackRate = this.playbackRate;\n\n if(doc.type === 'audio') {\n media.loop = this.loop;\n }\n }\n // }, doc.supportsStreaming ? 500e3 : 0);\n\n const set = this.waitingDocumentsForLoad[doc.id];\n if(set) {\n set.delete(media);\n\n if(!set.size) {\n delete this.waitingDocumentsForLoad[doc.id];\n }\n }\n };\n\n // safari подгрузит последний чанк и песня включится,\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\n private handleSafariStreamable(media: HTMLMediaElement) {\n media.addEventListener('play', () => {\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\n return;\n } */\n\n // media.volume = 0;\n const currentTime = media.currentTime;\n // this.setSafariBuffering(media, true);\n\n media.addEventListener('progress', () => {\n media.currentTime = media.duration - 1;\n\n media.addEventListener('progress', () => {\n media.currentTime = currentTime;\n // media.volume = 1;\n // this.setSafariBuffering(media, false);\n\n if(!media.paused) {\n media.play()/* .catch(() => {}) */;\n }\n }, {once: true});\n }, {once: true});\n }/* , {once: true} */);\n }\n\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n const storage = w.get(peerId);\n if(!storage) {\n return;\n }\n\n const promise = storage.get(mid);\n if(promise) {\n promise.resolve();\n storage.delete(mid);\n\n if(!storage.size) {\n w.delete(peerId);\n }\n }\n }\n\n /**\n * Only for audio\n */\n public isSafariBuffering(media: HTMLMediaElement) {\n // @ts-ignore\n return !!media.safariBuffering;\n }\n\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\n // @ts-ignore\n media.safariBuffering = value;\n }\n\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\n if(document.pictureInPictureElement) {\n return;\n }\n\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\n\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const artwork: MediaImage[] = [];\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n let title = '', artist = '';\n\n if(doc.thumbs?.length) {\n const size = doc.thumbs[doc.thumbs.length - 1];\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\n\n if(cacheContext.url) {\n artwork.push({\n src: cacheContext.url,\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\n type: 'image/jpeg'\n });\n } else {\n const download = appDownloadManager.downloadMediaURL({media: doc, thumb: size});\n download.then(() => {\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\n return;\n }\n\n this.setNewMediadata(message);\n });\n }\n }\n } else if(isVoice) {\n const peerId = message.fromId || message.peerId;\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n // const result = this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\n // if(result.cached) {\n // const url = await result.loadPromise;\n // artwork.push({\n // src: url,\n // sizes: '160x160',\n // type: 'image/jpeg'\n // });\n // } else {\n // result.loadPromise.then((url) => {\n // if(this.playingMedia !== playingMedia || !url) {\n // return;\n // }\n\n // this.setNewMediadata(message);\n // });\n // }\n }\n\n title = await getPeerTitle({peerId, plainText: true, onlyFirstName: false});\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\n }\n\n if(!isVoice) {\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = attribute?.title ?? doc.file_name;\n artist = attribute?.performer;\n }\n\n if(!artwork.length) {\n if(IS_APPLE) {\n if(IS_TOUCH_SUPPORTED) {\n artwork.push({\n src: `assets/img/apple-touch-icon-precomposed.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n } else {\n artwork.push({\n src: `assets/img/apple-touch-icon.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n }\n } else {\n [72, 96, 144, 192, 256, 384, 512].forEach((size) => {\n const sizes = `${size}x${size}`;\n artwork.push({\n src: `assets/img/android-chrome-${sizes}.png`,\n sizes,\n type: 'image/png'\n });\n });\n }\n }\n\n const metadata = new MediaMetadata({\n title,\n artist,\n artwork\n });\n\n navigator.mediaSession.metadata = metadata;\n }\n\n public setCurrentMediadata() {\n const {playingMedia} = this;\n if(!playingMedia) return;\n const message = this.getMessageByMedia(playingMedia);\n this.setNewMediadata(message, playingMedia);\n }\n\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\n const details = this.mediaDetails.get(media);\n return details.message;\n // const {peerId, mid} = details;\n // const message = details.isScheduled ?\n // this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) :\n // this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n // return message;\n }\n\n public getPlayingDetails() {\n const {playingMedia} = this;\n if(!playingMedia) {\n return;\n }\n\n const message = this.getMessageByMedia(playingMedia);\n return {\n doc: getMediaFromMessage(message) as MyDocument,\n message,\n media: playingMedia,\n playbackParams: this.getPlaybackParams()\n };\n }\n\n private onPlay = (e?: Event) => {\n const media = e.target as HTMLMediaElement;\n const details = this.mediaDetails.get(media);\n const {peerId, mid} = details;\n\n // console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\n\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n const message = this.getMessageByMedia(media);\n\n const previousMedia = this.playingMedia;\n if(previousMedia !== media) {\n this.stop();\n this.setMedia(media, message);\n\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\n const listLoader = this.listLoader;\n const current = listLoader.getCurrent();\n if(!current || !verify(current)) {\n let jumpLength: number;\n\n for(const withOtherSide of [false, true]) {\n const previous = listLoader.getPrevious(withOtherSide);\n\n let idx = previous.findIndex(verify);\n if(idx !== -1) {\n jumpLength = -(previous.length - idx);\n } else {\n const next = listLoader.getNext(withOtherSide);\n idx = next.findIndex(verify);\n if(idx !== -1) {\n jumpLength = idx + 1;\n }\n }\n\n if(jumpLength !== undefined) {\n break;\n }\n }\n\n if(jumpLength) {\n this.go(jumpLength, false);\n } else {\n this.setTargets({peerId, mid});\n }\n }\n }\n\n // audio_pause не успеет сработать без таймаута\n setTimeout(() => {\n if(this.playingMedia !== media) {\n return;\n }\n\n this.dispatchEvent('play', this.getPlayingDetails());\n this.pauseMediaInOtherTabs();\n }, 0);\n };\n\n private onPause = (e?: Event) => {\n /* const target = e.target as HTMLMediaElement;\n if(!isInDOM(target)) {\n this.container.append(target);\n target.play();\n return;\n } */\n\n // if(this.pip) {\n // this.pip.play();\n // }\n\n this.dispatchEvent('pause');\n };\n\n private onEnded = (e?: Event) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.onPause(e);\n\n // console.log('on media end');\n\n const listLoader = this.listLoader;\n if(this.lockedSwitchers ||\n (!this.round && listLoader.current && !listLoader.next.length) ||\n !listLoader.getNext(true).length ||\n !this.next()) {\n this.stop();\n this.dispatchEvent('stop');\n }\n };\n\n public pauseMediaInOtherTabs() {\n this.skipMediaPlayEvent = true;\n rootScope.dispatchEvent('media_play');\n }\n\n // public get pip() {\n // return document.pictureInPictureElement as HTMLVideoElement;\n // }\n\n public toggle(play?: boolean, media = this.playingMedia) {\n if(!media) {\n return false;\n }\n\n if(play === undefined) {\n play = media.paused;\n }\n\n if(media.paused !== play) {\n return false;\n }\n\n if(play) {\n media.play();\n } else {\n media.pause();\n }\n\n return true;\n }\n\n public play = () => {\n return this.toggle(true);\n };\n\n public pause = () => {\n return this.toggle(false);\n };\n\n public stop = (media = this.playingMedia) => {\n if(!media) {\n return false;\n }\n\n if(!media.paused) {\n media.pause();\n }\n\n media.currentTime = 0;\n simulateEvent(media, 'ended');\n\n if(media === this.playingMedia) {\n const details = this.mediaDetails.get(media);\n if(details?.clean) {\n media.src = '';\n const peerId = details.peerId;\n const s = details.isScheduled ? this.scheduled : this.media;\n const storage = s.get(peerId);\n if(storage) {\n storage.delete(details.mid);\n\n if(!storage.size) {\n s.delete(peerId);\n }\n }\n\n media.remove();\n\n this.mediaDetails.delete(media);\n }\n\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n return true;\n };\n\n public playItem = (item: MediaItem) => {\n const {peerId, mid} = item;\n const isScheduled = this.searchContext.isScheduled;\n const media = this.getMedia(peerId, mid, isScheduled);\n\n /* if(isSafari) {\n media.autoplay = true;\n } */\n\n media.play();\n\n setTimeout(() => {\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\n }, 0);\n };\n\n public go = (length: number, dispatchJump?: boolean) => {\n const listLoader = this.listLoader;\n if(this.lockedSwitchers || !listLoader) {\n return;\n }\n\n if(this.playingMediaType === 'audio') {\n return listLoader.goRound(length, dispatchJump);\n } else {\n return listLoader.go(length, dispatchJump);\n }\n };\n\n private bindBrowserCallback(cb: (video: HTMLVideoElement, details: MediaSessionActionDetails) => void) {\n const handler: MediaSessionActionHandler = (details) => {\n cb(this.pip, details);\n };\n\n return handler;\n }\n\n public browserPlay = this.bindBrowserCallback((video) => this.toggle(true, video));\n public browserPause = this.bindBrowserCallback((video) => this.toggle(false, video));\n public browserStop = this.bindBrowserCallback((video) => this.stop(video));\n public browserSeekBackward = this.bindBrowserCallback((video, details) => this.seekBackward(details, video));\n public browserSeekForward = this.bindBrowserCallback((video, details) => this.seekForward(details, video));\n public browserSeekTo = this.bindBrowserCallback((video, details) => this.seekTo(details, video));\n public browserNext = this.bindBrowserCallback((video) => video || this.next());\n public browserPrevious = this.bindBrowserCallback((video) => video ? this.seekToStart(video) : this.previous());\n\n public next = () => {\n return this.go(1);\n };\n\n public previous = () => {\n if(this.seekToStart(this.playingMedia)) {\n return;\n }\n\n return this.go(-1);\n };\n\n public seekToStart(media: HTMLMediaElement) {\n if(media?.currentTime > 5) {\n media.currentTime = 0;\n this.toggle(true, media);\n return true;\n }\n\n return false;\n }\n\n public willBePlayed(media: HTMLMediaElement) {\n this.willBePlayedMedia = media;\n }\n\n public setSearchContext(context: MediaSearchContext) {\n if(deepEqual(this.searchContext, context)) {\n return false;\n }\n\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\n return true;\n }\n\n public getSearchContext() {\n return this.searchContext;\n }\n\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\n let listLoader = this.listLoader;\n if(!listLoader) {\n listLoader = this.listLoader = new SearchListLoader({\n loadCount: 10,\n loadWhenLeft: 5,\n processItem: (message: Message.message) => {\n this.addMedia(message, false);\n return {peerId: message.peerId, mid: message.mid};\n },\n onJump: (item, older) => {\n this.playItem(item);\n },\n onEmptied: () => {\n this.dispatchEvent('stop');\n this.stop();\n }\n });\n } else {\n listLoader.reset();\n }\n\n const reverse = this.searchContext.folderId !== undefined ? false : true;\n if(prev) {\n listLoader.setTargets(prev, next, reverse);\n } else {\n listLoader.reverse = reverse;\n }\n\n listLoader.setSearchContext(this.searchContext);\n listLoader.current = current;\n\n listLoader.load(true);\n listLoader.load(false);\n }\n\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\n const doc = getMediaFromMessage(message) as MyDocument;\n let mediaType: PlaybackMediaType = 'audio';\n if(doc?.type) {\n if(doc.type === 'voice' || doc.type === 'round') {\n mediaType = 'voice';\n } else if(doc.type === 'video') {\n mediaType = 'video';\n }\n }\n\n return mediaType;\n }\n\n public setMedia(media: HTMLMediaElement, message: Message.message) {\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\n\n this._playbackRate = this.playbackRates[mediaType];\n\n this.playingMedia = media;\n this.playingMediaType = mediaType;\n this.playingMedia.volume = this.volume;\n this.playingMedia.muted = this.muted;\n this.playingMedia.playbackRate = this.playbackRate;\n\n if(mediaType === 'audio') {\n this.playingMedia.loop = this.loop;\n }\n\n if('mediaSession' in navigator) {\n this.setNewMediadata(message);\n }\n }\n\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\n const playingMedia = this.playingMedia;\n\n const wasPlaying = this.pause();\n\n let onPlay: () => void;\n if(media) {\n onPlay = () => {\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n this.pauseMediaInOtherTabs();\n };\n\n if(!media.paused) {\n onPlay();\n }\n\n media.addEventListener('play', onPlay);\n } else { // maybe it's voice recording\n this.pauseMediaInOtherTabs();\n }\n\n this.willBePlayed(undefined);\n if(media) this.setMedia(media, message);\n else this.playingMedia = undefined;\n this.toggleSwitchers(false);\n\n return (playPaused = wasPlaying) => {\n this.toggleSwitchers(true);\n\n if(playingMedia) {\n if(this.mediaDetails.get(playingMedia)) {\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\n } else {\n this.next() || this.previous();\n }\n }\n\n // If it's still not cleaned\n if(this.playingMedia === media) {\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n if(media) {\n media.removeEventListener('play', onPlay);\n }\n\n // I don't remember what it was for\n // if(media && this.playingMedia === media) {\n // this.stop();\n // }\n\n if(playPaused) {\n this.play();\n }\n };\n }\n\n public toggleSwitchers(enabled: boolean) {\n this.lockedSwitchers = !enabled;\n }\n\n public setPictureInPicture(video: HTMLVideoElement) {\n this.pip = video;\n\n // let wasPlaying = this.pause();\n\n const listenerSetter = new ListenerSetter();\n listenerSetter.add(video)('leavepictureinpicture', () => {\n if(this.pip !== video) {\n return;\n }\n\n this.pip = undefined;\n // if(wasPlaying) {\n // this.play();\n // }\n\n listenerSetter.removeAll();\n }, {once: true});\n\n listenerSetter.add(video)('play', (e) => {\n if(this.playingMedia !== video) {\n this.pause();\n }\n\n this.pauseMediaInOtherTabs();\n // if(this.pause()) {\n // listenerSetter.add(video)('pause', () => {\n // this.play();\n // }, {once: true});\n // }\n });\n }\n}\n\nconst appMediaPlaybackController = new AppMediaPlaybackController();\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\nexport default appMediaPlaybackController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport mediaSizes from '../helpers/mediaSizes';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport {Message} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport canSaveMessageMedia from '../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport {MediaSearchContext} from './appMediaPlaybackController';\nimport AppMediaViewerBase, {MEDIA_VIEWER_CLASSNAME} from './appMediaViewerBase';\nimport {ButtonMenuItemOptionsVerifiable} 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: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDownload: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDelete: ButtonMenuItemOptionsVerifiable;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = getMediaFromMessage(item);\n\n if(!media) return;\n\n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption', 'spoilers-container'/* , '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: ButtonMenuItemOptionsVerifiable[] = [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 const a = findUpTag(e.target, 'A');\n const spoiler = findUpClassName(e.target, 'spoiler');\n if(a instanceof HTMLAnchorElement && (!spoiler || this.content.caption.classList.contains('is-spoiler-visible'))) { // close viewer if it's t.me/ redirect\n const onclick = a.getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n this.content.caption.removeEventListener('click', onCaptionClick, {capture: true});\n a.click();\n });\n\n return false;\n }\n };\n\n this.content.caption.addEventListener('click', onCaptionClick, {capture: true});\n }\n\n /* public close(e?: MouseEvent) {\n const good = !this.setMoverAnimationPromise;\n const promise = super.close(e);\n\n if(good) { // clear\n this.currentMessageId = 0;\n this.peerId = 0;\n }\n\n return promise;\n } */\n\n protected getMessageByPeer(peerId: PeerId, mid: number) {\n return this.searchContext.isScheduled ? this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) : this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n // appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = async(e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = await this.getMessageByPeer(peerId, mid);\n this.close(e)\n // .then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(async() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer({\n peerId: message.peerId,\n lastMsgId: mid,\n type: threadId ? 'discussion' : undefined,\n threadId\n });\n });\n }\n };\n\n onDownloadClick = async() => {\n const {peerId, mid} = this.target;\n const message = await this.getMessageByPeer(peerId, mid);\n const media = getMediaFromMessage(message);\n if(!media) return;\n appDownloadManager.downloadToDisc({media, queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId});\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html: Parameters[1] = '';\n if(caption) {\n html = wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n\n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false,\n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = getMediaFromMessage(message);\n\n const noForwards = await this.managers.appPeersManager.noForwards(message.peerId);\n const isServiceMessage = message._ === 'messageService';\n const cantForwardMessage = isServiceMessage || !(await this.managers.appMessagesManager.canForward(message));\n const cantDownloadMessage = (isServiceMessage ? noForwards : cantForwardMessage) || !canSaveMessageMedia(message);\n const a: [(HTMLElement | ButtonMenuItemOptionsVerifiable)[], boolean][] = [\n [[this.buttons.forward, this.btnMenuForward], cantForwardMessage],\n [[this.buttons.download, this.btnMenuDownload], cantDownloadMessage],\n [[this.buttons.delete, this.btnMenuDelete], !(await this.managers.appMessagesManager.canDeleteMessage(message))]\n ];\n\n a.forEach(([buttons, hide]) => {\n buttons.forEach((button) => {\n if(button instanceof HTMLElement) {\n button.classList.toggle('hide', hide);\n } else {\n button.verify = () => !hide;\n }\n });\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantDownloadMessage);\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 appMediaPlaybackController from '../components/appMediaPlaybackController';\nimport {IS_APPLE_MOBILE, IS_MOBILE} from '../environment/userAgent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport {ButtonMenuSync} from '../components/buttonMenu';\nimport {ButtonMenuToggleHandler} from '../components/buttonMenuToggle';\nimport ControlsHover from '../helpers/dom/controlsHover';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../helpers/dom/fullScreen';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from '../components/mediaProgressLine';\nimport VolumeSelector from '../components/volumeSelector';\nimport debounce from '../helpers/schedulers/debounce';\nimport overlayCounter from '../helpers/overlayCounter';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport default class VideoPlayer extends ControlsHover {\n private static PLAYBACK_RATES = [0.5, 1, 1.5, 2];\n private static PLAYBACK_RATES_ICONS = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];\n\n protected video: HTMLVideoElement;\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n protected playbackRateButton: HTMLElement;\n protected pipButton: HTMLElement;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n protected onPip?: (pip: boolean) => void;\n protected onPipClose?: () => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle, onPip, onPipClose}: {\n video: HTMLVideoElement,\n play?: boolean,\n streamable?: boolean,\n duration?: number,\n onPlaybackRackMenuToggle?: VideoPlayer['onPlaybackRackMenuToggle'],\n onPip?: VideoPlayer['onPip'],\n onPipClose?: VideoPlayer['onPipClose']\n }) {\n super();\n\n this.video = video;\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.onPlaybackRackMenuToggle = onPlaybackRackMenuToggle;\n this.onPip = onPip;\n this.onPipClose = onPipClose;\n\n this.listenerSetter = new ListenerSetter();\n\n this.setup({\n element: this.wrapper,\n listenerSetter: this.listenerSetter,\n canHideControls: () => {\n return !this.video.paused && (!this.playbackRateButton || !this.playbackRateButton.classList.contains('menu-open'));\n },\n showOnLeaveToClassName: 'media-viewer-caption',\n ignoreClickClassName: 'ckin__controls'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n }\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.textContent = 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 attachClickEvent(button, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n });\n\n if(this.pipButton) {\n attachClickEvent(this.pipButton, () => {\n this.video.requestPictureInPicture();\n }, {listenerSetter: this.listenerSetter});\n\n const onPip = (pip: boolean) => {\n this.wrapper.style.visibility = pip ? 'hidden': '';\n if(this.onPip) {\n this.onPip(pip);\n }\n };\n\n const debounceTime = 20;\n const debouncedPip = debounce(onPip, debounceTime, false, true);\n\n listenerSetter.add(video)('enterpictureinpicture', () => {\n debouncedPip(true);\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n const onPause = () => {\n clearTimeout(timeout);\n if(this.onPipClose) {\n this.onPipClose();\n }\n };\n const listener = listenerSetter.add(video)('pause', onPause, {once: true}) as any as Listener;\n const timeout = setTimeout(() => {\n listenerSetter.remove(listener);\n }, debounceTime);\n }, {once: true});\n });\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n debouncedPip(false);\n });\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(video, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1 || document.pictureInPictureElement === video) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && (code === 'Equal' || code === 'Minus')) {\n const add = code === 'Equal' ? 1 : -1;\n const playbackRate = appMediaPlaybackController.playbackRate;\n const idx = VideoPlayer.PLAYBACK_RATES.indexOf(playbackRate);\n const nextIdx = idx + add;\n if(nextIdx >= 0 && nextIdx < VideoPlayer.PLAYBACK_RATES.length) {\n appMediaPlaybackController.playbackRate = VideoPlayer.PLAYBACK_RATES[nextIdx];\n }\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n attachClickEvent(fullScreenButton, () => {\n this.toggleFullScreen();\n }, {listenerSetter: this.listenerSetter});\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.textContent = toHHMMSS(video.currentTime | 0);\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('play', () => {\n this.hideControls(true);\n });\n }\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(appMediaPlaybackController)('playbackParams', () => {\n this.setPlaybackRateIcon();\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n\n if(video.duration || initDuration) {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration || initDuration));\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.textContent = 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]['buttons'] = 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 = ButtonMenuSync({buttons});\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler({\n el: this.playbackRateButton,\n onOpen: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined,\n onClose: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(false);\n } : undefined\n });\n this.playbackRateButton.append(btnMenu);\n\n this.setPlaybackRateIcon();\n }\n\n protected setPlaybackRateIcon() {\n const playbackRateButton = this.playbackRateButton;\n VideoPlayer.PLAYBACK_RATES_ICONS.forEach((className) => {\n className = 'tgico-' + className;\n playbackRateButton.classList.remove(className);\n });\n\n let idx = VideoPlayer.PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);\n if(idx === -1) idx = VideoPlayer.PLAYBACK_RATES.indexOf(1);\n\n playbackRateButton.classList.add('tgico-' + VideoPlayer.PLAYBACK_RATES_ICONS[idx]);\n }\n\n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n\n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n\n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n\n cancelFullScreen();\n }\n }\n\n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public cleanup() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = this.onPip = undefined;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise from '../helpers/cancellablePromise';\nimport mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE_SAFARI, IS_SAFARI} from '../environment/userAgent';\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {logger} from '../lib/logger';\nimport VideoPlayer from '../lib/mediaPlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector from './animationIntersector';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from './appMediaPlaybackController';\nimport AvatarElement from './avatar';\nimport ButtonIcon from './buttonIcon';\nimport {ButtonMenuItemOptions} from './buttonMenu';\nimport ButtonMenuToggle from './buttonMenuToggle';\nimport ProgressivePreloader from './preloader';\nimport SwipeHandler from './swipeHandler';\nimport {formatFullSentTime} from '../helpers/date';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport {Message} from '../layer';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport fillPropertyValue from '../helpers/fillPropertyValue';\nimport generatePathData from '../helpers/generatePathData';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {doubleRaf, fastRaf} from '../helpers/schedulers';\nimport RangeSelector from './rangeSelector';\nimport windowSize from '../helpers/windowSize';\nimport ListLoader from '../helpers/listLoader';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport {isFullScreen} from '../helpers/dom/fullScreen';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport createVideo from '../helpers/dom/createVideo';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../helpers/setAttachmentSize';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport LazyLoadQueueBase from './lazyLoadQueueBase';\nimport overlayCounter from '../helpers/overlayCounter';\nimport {ThumbCache} from '../lib/storages/thumbs';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPeerTitle from './wrappers/peerTitle';\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string,\n ButtonsAdditionType extends string,\n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n\n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n // protected targetContainer: HTMLElement = null;\n // protected loadMore: () => void = null;\n\n protected log: ReturnType;\n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n\n protected ctrlKeyDown: boolean;\n protected releaseSingleMedia: ReturnType;\n protected navigationItem: NavigationItem;\n\n protected managers: AppManagers;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader,\n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.managers = rootScope.managers;\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n\n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n\n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n\n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n\n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n\n authorRight.append(this.author.nameEl, this.author.date);\n\n this.author.container.append(this.author.avatarEl, authorRight);\n\n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n\n topButtons.concat(['download', 'zoom', 'close']).forEach((name) => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n attachClickEvent(this.zoomElements.btnOut, () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n attachClickEvent(this.zoomElements.btnIn, () => this.changeZoom(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: ZOOM_STEP,\n min: ZOOM_MIN_VALUE,\n max: ZOOM_MAX_VALUE,\n withTransition: true\n }, ZOOM_INITIAL_VALUE);\n this.zoomElements.rangeSelector.setListeners();\n this.zoomElements.rangeSelector.setHandlers({\n onScrub: this.setZoomValue,\n onMouseUp: () => this.setZoomValue()\n });\n\n this.zoomElements.container.append(this.zoomElements.btnOut, this.zoomElements.rangeSelector.container, this.zoomElements.btnIn);\n\n this.wholeDiv.append(this.zoomElements.container);\n\n // * content\n this.content.main = document.createElement('div');\n this.content.main.classList.add(MEDIA_VIEWER_CLASSNAME + '-content');\n\n this.content.container = document.createElement('div');\n this.content.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-container');\n\n this.content.media = document.createElement('div');\n this.content.media.classList.add(MEDIA_VIEWER_CLASSNAME + '-media');\n\n this.content.container.append(this.content.media);\n\n this.content.main.append(this.content.container);\n mainDiv.append(this.content.main);\n this.overlaysDiv.append(mainDiv);\n // * overlays end\n\n topbarLeft.append(this.buttons['mobile-close'], this.author.container);\n topbar.append(topbarLeft, buttonsDiv);\n\n this.buttons.prev = document.createElement('div');\n this.buttons.prev.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-left`;\n this.buttons.prev.innerHTML = ``;\n\n this.buttons.next = document.createElement('div');\n this.buttons.next.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-right`;\n this.buttons.next.innerHTML = ``;\n\n this.moversContainer = document.createElement('div');\n this.moversContainer.classList.add(MEDIA_VIEWER_CLASSNAME + '-movers');\n\n this.wholeDiv.append(this.overlaysDiv, this.buttons.prev, this.buttons.next, this.topbar, this.moversContainer);\n\n // * constructing html end\n\n this.listLoader.onLoadedMore = () => {\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n };\n\n this.setNewMover();\n }\n\n protected setListeners() {\n attachClickEvent(this.buttons.download, this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach((el) => {\n attachClickEvent(el, this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n // attachClickEvent(button, (e) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n\n this.listLoader.go(moveLength);\n });\n });\n\n attachClickEvent(this.buttons.zoom, () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n // ! cannot use the function because it'll cancel slide event on touch devices\n // attachClickEvent(this.wholeDiv, this.onClick);\n this.wholeDiv.addEventListener('click', this.onClick);\n\n this.listLoader.onJump = (item, older) => {\n if(older) this.onNextClick(item);\n else this.onPrevClick(item);\n };\n\n if(IS_TOUCH_SUPPORTED) {\n const swipeHandler = new SwipeHandler({\n element: this.wholeDiv,\n onSwipe: (xDiff, yDiff) => {\n if(isFullScreen()) {\n return;\n }\n // console.log(xDiff, yDiff);\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || xDiff > 125) {\n // console.log('will swipe', xDiff);\n\n if(xDiff < 0) {\n this.buttons.prev.click();\n } else {\n this.buttons.next.click();\n }\n\n return true;\n }\n\n const percentsY = Math.abs(yDiff) / windowSize.height;\n if(percentsY > .2 || yDiff > 125) {\n this.close();\n return true;\n }\n\n return false;\n },\n verifyTouchTarget: (evt) => {\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = -1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({buttonOptions: {onlyMobile: true}, direction: 'bottom-left', buttons});\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n }\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as SearchListLoader).cleanup && (this.listLoader as SearchListLoader).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n if((window as any).appMediaViewer === this) {\n (window as any).appMediaViewer = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n this.removeGlobalListeners();\n\n this.zoomSwipeHandler = undefined;\n\n promise.finally(() => {\n this.wholeDiv.remove();\n this.toggleOverlay(false);\n });\n\n return promise;\n }\n\n protected toggleOverlay(active: boolean) {\n overlayCounter.isOverlayActive = active;\n animationIntersector.checkAnimations2(active);\n }\n\n protected toggleGlobalListeners(active: boolean) {\n if(active) this.setGlobalListeners();\n else this.removeGlobalListeners();\n }\n\n protected removeGlobalListeners() {\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n }\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n }\n\n protected setGlobalListeners() {\n if(this.isZooming()) {\n this.zoomSwipeHandler.setListeners();\n }\n\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n\n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find((s) => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.close();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n // this.log('onKeyDown', e);\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n\n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(overlayCounter.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n // mover.append(this.buttons.prev, this.buttons.next);\n }\n\n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n // let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement, true);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n\n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n\n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map((r) => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n // let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n\n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n let src: string;\n\n // if(target instanceof HTMLVideoElement) {\n const selector = 'video, img, .canvas-thumbnail';\n const queryFrom = target.matches(selector) ? target.parentElement : target;\n const elements = Array.from(queryFrom.querySelectorAll(selector)) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if(target instanceof HTMLImageElement) {\n canvas.width = target.naturalWidth;\n canvas.height = target.naturalHeight;\n } else if(target instanceof HTMLVideoElement) {\n canvas.width = target.videoWidth;\n canvas.height = target.videoHeight;\n } else if(target instanceof HTMLCanvasElement) {\n canvas.width = target.width;\n canvas.height = target.height;\n }\n\n canvas.className = 'canvas-thumbnail thumbnail media-photo';\n context.drawImage(target as HTMLImageElement | HTMLCanvasElement, 0, 0);\n target = canvas;\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 } 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 } else if(target instanceof HTMLCanvasElement) {\n mediaElement = target;\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 if((el as HTMLImageElement).src !== url) {\n renderImageFromUrl(el, url);\n }\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n const isPeerId = fromId.isPeerId();\n let wrapTitlePromise: Promise | HTMLElement;\n if(isPeerId) {\n wrapTitlePromise = wrapPeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n })\n } else {\n const title = wrapTitlePromise = document.createElement('span');\n title.append(wrapEmojiText(fromId));\n title.classList.add('peer-title');\n }\n\n const oldAvatar = this.author.avatarEl;\n const newAvatar = this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n return Promise.all([\n (this.author.avatarEl as AvatarElement).updateWithOptions({\n peerId: fromId as PeerId || NULL_PEER_ID,\n peerTitle: isPeerId ? undefined : '' + fromId\n }),\n\n wrapTitlePromise\n ]).then(([_, title]) => {\n if(this.author.avatarEl !== newAvatar) {\n return;\n }\n\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n replaceContent(this.author.nameEl, title);\n oldAvatar.replaceWith(this.author.avatarEl);\n });\n }\n\n protected async _openMedia(\n media: MyDocument | MyPhoto,\n timestamp: number,\n fromId: PeerId | string,\n fromRight: number,\n target?: HTMLElement,\n reverse = false,\n prevTargets: TargetType[] = [],\n nextTargets: TargetType[] = [],\n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n const setAuthorPromise = this.setAuthorInfo(fromId, timestamp);\n\n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n // this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n // this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n if(this.listLoader.next.length < 10) {\n setTimeout(() => {\n this.listLoader.load(true);\n }, 0);\n }\n\n // if(prevTarget && (!prevTarget.parentElement || !this.isElementVisible(this.targetContainer, prevTarget))) prevTarget = null;\n // if(nextTarget && (!nextTarget.parentElement || !this.isElementVisible(this.targetContainer, nextTarget))) nextTarget = null;\n\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n\n const container = this.content.media;\n const useContainerAsTarget = !target || target === container;\n if(useContainerAsTarget) target = container;\n\n this.target = {element: target} as any;\n const tempId = ++this.tempId;\n\n if(container.firstElementChild) {\n container.innerHTML = '';\n }\n\n // ok set\n\n const wasActive = fromRight !== 0;\n if(wasActive) {\n this.moveTheMover(this.content.mover, fromRight === 1);\n this.setNewMover();\n } else {\n this.toggleOverlay(true);\n this.setGlobalListeners();\n await setAuthorPromise;\n\n if(!this.wholeDiv.parentElement) {\n this.pageEl.insertBefore(this.wholeDiv, document.getElementById('main-columns'));\n void this.wholeDiv.offsetLeft; // reflow\n }\n\n this.toggleWholeActive(true);\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n\n this.close();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n // //////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n // const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(media, size.type);\n let img: HTMLImageElement | HTMLCanvasElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n const getCacheContext = () => {\n return this.managers.thumbsStorage.getCacheContext(media, size?.type);\n };\n\n let setMoverPromise: Promise;\n if(isVideo) {\n // //////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ?\n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement :\n */createVideo({pip: useController});\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', cancelEvent);\n }\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 this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n\n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n\n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n } else if(media.duration < 60) {\n video.loop = true;\n }\n\n // if(!video.parentElement) {\n div.append(video);\n // }\n\n const canPlayThrough = new Promise((resolve) => {\n video.addEventListener('canplay', resolve, {once: true});\n });\n\n const createPlayer = () => {\n if(media.type !== 'gif') {\n video.dataset.ckin = 'default';\n video.dataset.overlay = '1';\n\n Promise.all([canPlayThrough, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n // const play = useController ? appMediaPlaybackController.willBePlayedMedia === video : true;\n const play = true;\n const player = this.videoPlayer = new VideoPlayer({\n video,\n play,\n streamable: supportsStreaming,\n onPlaybackRackMenuToggle: (open) => {\n this.wholeDiv.classList.toggle('hide-caption', !!open);\n },\n onPip: (pip) => {\n const otherMediaViewer = (window as any).appMediaViewer;\n if(!pip && otherMediaViewer && otherMediaViewer !== this) {\n this.releaseSingleMedia = undefined;\n this.close();\n return;\n }\n\n const mover = this.moversContainer.lastElementChild as HTMLElement;\n mover.classList.toggle('hiding', pip);\n this.toggleWholeActive(!pip);\n this.toggleOverlay(!pip);\n this.toggleGlobalListeners(!pip);\n\n if(this.navigationItem) {\n if(pip) appNavigationController.removeItem(this.navigationItem);\n else appNavigationController.pushItem(this.navigationItem);\n }\n\n if(useController) {\n if(pip) {\n // appMediaPlaybackController.toggleSwitchers(true);\n\n this.releaseSingleMedia(false);\n this.releaseSingleMedia = undefined;\n\n appMediaPlaybackController.setPictureInPicture(video);\n } else {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n }\n }\n },\n onPipClose: () => {\n // this.target = undefined;\n // this.toggleWholeActive(false);\n // this.toggleOverlay(false);\n this.close();\n }\n });\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.cleanup();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n\n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n // console.log('ppp 1');\n preloader.attach(mover, true);\n }\n\n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n\n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n // console.log('ppp 2');\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 // console.log('ppp 3');\n preloader.attach(mover, true);\n\n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', (e) => {\n cancelEvent(e);\n });\n }\n\n attachCanPlay();\n }\n\n // if(!video.src || media.url !== video.src) {\n const load = async() => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDownloadManager.downloadMediaURL({media});\n\n if(!supportsStreaming) {\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n // console.log('ppp 4');\n preloader.attach(mover, true, promise);\n }\n });\n }\n\n Promise.all([promise, onAnimationEnd]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n const url = (await getCacheContext()).url;\n\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 if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n // if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n // }\n } else {\n renderImageFromUrl(video, url);\n }\n\n // * have to set options (especially playbackRate) after src\n // * https://github.com/videojs/video.js/issues/2516\n if(useController) {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n if(this.releaseSingleMedia) {\n this.releaseSingleMedia();\n this.releaseSingleMedia = undefined;\n }\n }, {once: true});\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n\n return promise;\n };\n\n this.lazyLoadQueue.unshift({load});\n // } else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n // return; // set and don't move\n // if(wasActive) return;\n // return;\n\n const load = async() => {\n const cancellablePromise = isDocument ? appDownloadManager.downloadMediaURL({media}) : appDownloadManager.downloadMediaURL({media, thumb: size});\n\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n this.preloader.attachPromise(cancellablePromise);\n // this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n\n Promise.all([onAnimationEnd, cancellablePromise]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n\n // /////this.log('indochina', blob);\n\n const url = (await getCacheContext()).url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n\n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach((img) => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n const 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","/*\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 fillPropertyValue(str: string) {\n const splitted = str.split(' ');\n if(splitted.length !== 4) {\n if(!splitted[0]) splitted[0] = '0px';\n for(let i = splitted.length; i < 4; ++i) {\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\n }\n }\n\n return splitted;\n}\n","/*\n * 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 {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport {logger} from '../lib/logger';\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport isSwipingBackSafari from '../helpers/dom/isSwipingBackSafari';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\n\nexport type NavigationItem = {\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' |\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' |\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus' |\n 'toast' | 'dropdown' | 'forum',\n onPop: (canAnimate: boolean) => boolean | void,\n onEscape?: () => boolean,\n noHistory?: boolean,\n noBlurOnPop?: boolean,\n};\n\nexport class AppNavigationController {\n private navigations: Array;\n private id: number;\n private manual: boolean;\n private log: ReturnType;\n private debug: boolean;\n private currentHash: string; // have to start with # if not empty\n private overriddenHash: string; // have to start with # if not empty\n private isPossibleSwipe: boolean;\n public onHashChange: () => void;\n\n constructor() {\n this.navigations = [];\n this.id = Date.now();\n this.manual = false;\n this.log = logger('NC');\n this.debug = true;\n this.currentHash = window.location.hash;\n this.overriddenHash = '';\n this.isPossibleSwipe = false;\n\n window.addEventListener('popstate', this.onPopState);\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\n\n if(IS_MOBILE_SAFARI) {\n const options = {passive: true};\n window.addEventListener('touchstart', this.onTouchStart, options);\n }\n\n history.scrollRestoration = 'manual';\n\n this.pushState(); // * push init state\n }\n\n private onPopState = (e: PopStateEvent) => {\n const hash = window.location.hash;\n const id: number = e.state;\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\n if(hash !== this.currentHash) {\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\n this.overrideHash(this.overriddenHash);\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\n this.overrideHash();\n } else {\n this.currentHash = hash;\n this.onHashChange && this.onHashChange();\n // this.replaceState();\n return;\n }\n }\n\n if(id !== this.id/* && !this.navigations.length */) {\n this.pushState();\n\n if(!this.navigations.length) {\n return;\n }\n }\n\n const item = this.navigations.pop();\n if(!item) {\n this.pushState();\n return;\n }\n\n this.manual = !this.isPossibleSwipe;\n this.handleItem(item);\n // this.pushState(); // * prevent adding forward arrow\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const item = this.navigations[this.navigations.length - 1];\n if(!item) return;\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\n cancelEvent(e);\n this.back(item.type);\n }\n };\n\n private onTouchStart = (e: TouchEvent) => {\n if(e.touches.length > 1) return;\n this.debug && this.log('touchstart');\n\n if(isSwipingBackSafari(e)) {\n this.isPossibleSwipe = true;\n\n window.addEventListener('touchend', () => {\n setTimeout(() => {\n this.isPossibleSwipe = false;\n }, 100);\n }, {passive: true, once: true});\n }\n\n /* const detach = () => {\n window.removeEventListener('touchend', onTouchEnd);\n window.removeEventListener('touchmove', onTouchMove);\n };\n\n let moved = false;\n const onTouchMove = (e: TouchEvent) => {\n this.debug && this.log('touchmove');\n if(e.touches.length > 1) {\n detach();\n return;\n }\n\n moved = true;\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n this.debug && this.log('touchend');\n if(e.touches.length > 1 || !moved) {\n detach();\n return;\n }\n\n isPossibleSwipe = true;\n doubleRaf().then(() => {\n isPossibleSwipe = false;\n });\n\n detach();\n };\n\n window.addEventListener('touchend', onTouchEnd, options);\n window.addEventListener('touchmove', onTouchMove, options); */\n };\n\n public overrideHash(hash: string = '') {\n if(hash && hash[0] !== '#') hash = '#' + hash;\n else if(hash === '#') hash = '';\n\n if(this.currentHash === hash) {\n return;\n }\n\n this.overriddenHash = this.currentHash = hash;\n this.replaceState();\n this.pushState();\n }\n\n private handleItem(item: NavigationItem) {\n const good = item.onPop(!this.manual ? false : undefined);\n this.debug && this.log('popstate, navigation:', item, this.navigations);\n if(good === false) {\n this.pushItem(item);\n } else if(!item.noBlurOnPop) {\n blurActiveElement(); // no better place for it\n }\n\n this.manual = false;\n }\n\n public findItemByType(type: NavigationItem['type']) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n return {item, index: i};\n }\n }\n }\n\n public back(type?: NavigationItem['type']) {\n if(type) {\n const ret = this.findItemByType(type);\n if(ret) {\n this.backByItem(ret.item, ret.index);\n return;\n }\n }\n\n history.back();\n }\n\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\n this.manual = true;\n // ! commented because 'popstate' event will be fired with delay\n // if(index !== (this.navigations.length - 1)) {\n this.navigations.splice(index, 1);\n this.handleItem(item);\n // }\n }\n\n private onItemAdded(item: NavigationItem) {\n this.debug && this.log('onItemAdded', item, this.navigations);\n\n if(!item.noHistory) {\n this.pushState();\n }\n }\n\n public pushItem(item: NavigationItem) {\n this.navigations.push(item);\n this.onItemAdded(item);\n }\n\n public unshiftItem(item: NavigationItem) {\n this.navigations.unshift(item);\n this.onItemAdded(item);\n }\n\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\n this.navigations.splice(index, length, ...items);\n items.forEach((item) => {\n this.onItemAdded(item);\n });\n }\n\n private pushState() {\n this.debug && this.log('push');\n this.manual = false;\n history.pushState(this.id, '');\n }\n\n public replaceState() {\n this.debug && this.log.warn('replace');\n\n const url = location.origin + location.pathname + location.search + this.overriddenHash;\n history.replaceState(this.id, '', url);\n }\n\n public removeItem(item: NavigationItem) {\n if(!item) {\n return;\n }\n\n indexOfAndSplice(this.navigations, item);\n }\n\n public removeByType(type: NavigationItem['type'], single = false) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n this.navigations.splice(i, 1);\n\n if(single) {\n break;\n }\n }\n }\n }\n}\n\nconst appNavigationController = new AppNavigationController();\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\nexport default appNavigationController;\n","/*\n * 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 Scrollable from './scrollable';\nimport InputSearch from './inputSearch';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\n\nexport class SearchGroup {\n container: HTMLDivElement;\n nameEl: HTMLDivElement;\n list: HTMLUListElement;\n\n constructor(\n public name: LangPackKey | boolean,\n public type: string,\n private clearable = true,\n className?: string,\n clickable = true,\n public autonomous = true,\n public onFound?: () => void,\n public noIcons?: boolean\n ) {\n this.list = appDialogsManager.createChatList();\n this.container = document.createElement('div');\n if(className) this.container.className = className;\n\n if(name) {\n this.nameEl = document.createElement('div');\n this.nameEl.classList.add('search-group__name');\n if(typeof(name) === 'string') {\n this.nameEl.append(i18n(name));\n }\n this.container.append(this.nameEl);\n }\n\n this.container.classList.add('search-group', 'search-group-' + type);\n this.container.append(this.list);\n this.container.style.display = 'none';\n\n if(clickable) {\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\n }\n }\n\n clear() {\n this.container.style.display = 'none';\n\n if(this.clearable) {\n this.list.innerHTML = '';\n }\n }\n\n setActive() {\n this.container.style.display = '';\n }\n\n toggle() {\n if(this.list.childElementCount) {\n this.setActive();\n } else {\n this.clear();\n }\n }\n}\n\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\n\nexport default class AppSearch {\n private minMsgId = 0;\n private loadedCount = -1;\n private foundCount = -1;\n\n private searchPromise: Promise = null;\n private searchTimeout: number = 0;\n\n private query = '';\n\n private listsContainer: HTMLDivElement = null;\n\n private peerId: PeerId; // 0 - means global\n private threadId = 0;\n\n private scrollable: Scrollable;\n\n constructor(\n public container: HTMLElement,\n public searchInput: InputSearch,\n public searchGroups: {[group in SearchGroupType]: SearchGroup},\n public onSearch?: (count: number) => void,\n public noIcons?: boolean\n ) {\n this.scrollable = new Scrollable(this.container);\n this.listsContainer = this.scrollable.container as HTMLDivElement;\n for(const i in this.searchGroups) {\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\n }\n\n if(this.searchGroups.messages) {\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\n }\n\n this.searchInput.onChange = (value) => {\n /* if(!value.trim()) {\n //this.peerId = 0;\n return;\n } */\n\n this.query = value;\n this.reset(false);\n this.searchMore();\n };\n\n this.scrollable.onScrolledBottom = () => {\n if(!this.query.trim()) return;\n\n if(!this.searchTimeout) {\n this.searchTimeout = window.setTimeout(() => {\n this.searchMore();\n this.searchTimeout = 0;\n }, 0);\n }\n };\n }\n\n public reset(all = true) {\n if(all) {\n this.searchInput.value = '';\n this.query = '';\n this.peerId = undefined;\n this.threadId = 0;\n }\n\n this.minMsgId = 0;\n this.loadedCount = -1;\n this.foundCount = -1;\n\n for(const i in this.searchGroups) {\n this.searchGroups[i as SearchGroupType].clear();\n }\n\n this.searchPromise = null;\n }\n\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\n this.peerId = peerId;\n this.threadId = threadId;\n\n if(this.query !== query) {\n this.searchInput.inputField.value = query;\n }\n\n this.searchInput.input.focus();\n }\n\n public searchMore() {\n if(this.searchPromise) return this.searchPromise;\n\n const query = this.query;\n\n if(!query.trim()) {\n this.onSearch && this.onSearch(0);\n return;\n }\n\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\n return Promise.resolve();\n }\n\n const maxId = this.minMsgId || 0;\n\n return this.searchPromise = rootScope.managers.appMessagesManager.getSearch({\n peerId: this.peerId,\n query,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n maxId,\n limit: 20,\n threadId: this.threadId\n }).then((res) => {\n this.searchPromise = null;\n\n if(this.searchInput.value !== query) {\n return;\n }\n\n // console.log('input search result:', this.peerId, query, null, maxId, 20, res);\n\n const {count, history} = res;\n\n if(history.length && history[0].mid === this.minMsgId) {\n history.shift();\n }\n\n const searchGroup = this.searchGroups.messages;\n\n history.forEach((message) => {\n try {\n const peerId = this.peerId ? message.fromId : message.peerId;\n appDialogsManager.addDialogAndSetLastMessage({\n peerId,\n container: this.scrollable/* searchGroup.list */,\n avatarSize: 'bigger',\n meAsSaved: false,\n message,\n query,\n noIcons: this.noIcons\n });\n } catch(err) {\n console.error('[appSearch] render search result', err);\n }\n });\n\n searchGroup.toggle();\n\n this.minMsgId = history.length && history[history.length - 1].mid;\n\n if(this.loadedCount === -1) {\n this.loadedCount = 0;\n }\n this.loadedCount += history.length;\n\n if(this.foundCount === -1) {\n this.foundCount = count;\n\n if(searchGroup.nameEl) {\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\n }\n\n this.onSearch && this.onSearch(this.foundCount);\n }\n }).catch((err) => {\n console.error('search error', err);\n this.searchPromise = null;\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 {MyInputMessagesFilter, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport {SearchGroup, SearchGroupType} from './appSearch';\nimport {horizontalMenu} from './horizontalMenu';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport {putPreloader} from './putPreloader';\nimport ripple from './ripple';\nimport Scrollable, {ScrollableX} from './scrollable';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport I18n, {LangPackKey, i18n} from '../lib/langPack';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {ChannelParticipant, Chat, ChatFull, ChatParticipant, ChatParticipants, Document, Message, MessageMedia, Photo, WebPage} from '../layer';\nimport SortedUserList from './sortedUserList';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport appSidebarRight from './sidebarRight';\nimport mediaSizes from '../helpers/mediaSizes';\nimport appImManager from '../lib/appManagers/appImManager';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport cleanSearchText from '../helpers/cleanSearchText';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport handleTabSwipe from '../helpers/dom/handleTabSwipe';\nimport windowSize from '../helpers/windowSize';\nimport {formatPhoneNumber} from '../helpers/formatPhoneNumber';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from './buttonMenu';\nimport PopupForward from './popups/forward';\nimport PopupDeleteMessages from './popups/deleteMessages';\nimport Row from './row';\nimport htmlToDocumentFragment from '../helpers/dom/htmlToDocumentFragment';\nimport {SearchSelection} from './chat/selection';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport AppMediaViewer from './appMediaViewer';\nimport lockTouchScroll from '../helpers/dom/lockTouchScroll';\nimport copy from '../helpers/object/copy';\nimport getObjectKeysAndSort from '../helpers/object/getObjectKeysAndSort';\nimport safeAssign from '../helpers/object/safeAssign';\nimport escapeRegExp from '../helpers/string/escapeRegExp';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport {ScrollStartCallbackDimensions} from '../helpers/fastSmoothScroll';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapWebPageDescription from './wrappers/webPageDescription';\nimport wrapWebPageTitle from './wrappers/webPageTitle';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport matchUrl from '../lib/richTextProcessor/matchUrl';\nimport wrapPlainText from '../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport filterMessagesByInputFilter from '../lib/appManagers/utils/messages/filterMessagesByInputFilter';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport {Awaited} from '../types';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../helpers/contextMenuController';\nimport positionMenu from '../helpers/positionMenu';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport SwipeHandler from './swipeHandler';\nimport wrapDocument from './wrappers/document';\nimport wrapPhoto from './wrappers/photo';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\n\n// const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n private managers: AppManagers;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper,\n private listenerSetter: ListenerSetter\n ) {\n this.managers = searchSuper.managers;\n\n const onContextMenu: Parameters[1] = (e) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n await Promise.all(this.buttons.map(async(button) => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? await button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n }));\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n r();\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener(attachTo, onContextMenu as any, listenerSetter);\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: async() => this.managers.appMessagesManager.canForward(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected &&\n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenuSync({buttons: this.buttons, listenerSetter: this.listenerSetter});\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport type ProcessSearchSuperResult = {\n message: Message.message,\n middleware: Middleware,\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\n public searchContext: SearchSuperContext;\n public loadMutex: Promise = Promise.resolve();\n\n private nextRates: Partial<{[type in SearchSuperType]: number}> = {};\n private loadPromises: Partial<{[type in SearchSuperType]: Promise}> = {};\n private loaded: Partial<{[type in SearchSuperType]: boolean}> = {};\n private loadedChats = false;\n private firstLoad = true;\n\n private log = logger('SEARCH-SUPER');\n public selectTab: ReturnType;\n\n private monthContainers: Partial<{\n [type in SearchSuperType]: {\n [timestamp: number]: {\n container: HTMLElement,\n items: HTMLElement\n }\n }\n }> = {};\n\n private searchGroupMedia: SearchGroup;\n\n public mediaTabsMap: Map = new Map();\n\n private membersList: SortedUserList;\n\n private skipScroll: boolean;\n\n // * arguments\n public mediaTabs: SearchSuperMediaTab[];\n public scrollable: Scrollable;\n public searchGroups?: {[group in SearchGroupType]: SearchGroup};\n public asChatList? = false;\n public groupByMonth? = true;\n public hideEmptyTabs? = true;\n public onChangeTab?: (mediaTab: SearchSuperMediaTab) => void;\n public showSender? = false;\n\n private searchContextMenu: SearchContextMenu;\n public selection: SearchSelection;\n\n public scrollStartCallback: (dimensions: ScrollStartCallbackDimensions) => void;\n\n public managers: AppManagers;\n private loadFirstTimePromise: Promise;\n\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\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.listenerSetter = new ListenerSetter();\n this.searchContextMenu = new SearchContextMenu(this.container, this, this.listenerSetter);\n this.selection = new SearchSelection(this, this.managers, this.listenerSetter);\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 this.swipeHandler = handleTabSwipe({\n element: this.tabsContainer,\n onSwipe: (xDiff, yDiff, e) => {\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && this.canLoadMediaTab(this.mediaTab)/* && false */) {\n // this.log('onScrolledBottom will load media');\n this.load(true);\n }\n };\n // this.scroll.attachSentinels(undefined, 400);\n\n this.selectTab = horizontalMenu(this.tabsMenu, this.tabsContainer, (id, tabContent, animate) => {\n if(this.prevTabId === id && !this.skipScroll) {\n this.scrollable.scrollIntoViewNew({\n element: this.container,\n position: 'start',\n startCallback: this.scrollStartCallback\n });\n return;\n }\n\n const newMediaTab = this.mediaTabs[id];\n if(this.onChangeTab) {\n this.onChangeTab(newMediaTab);\n }\n\n const fromMediaTab = this.mediaTab;\n this.mediaTab = newMediaTab;\n\n if(this.prevTabId !== -1 && animate) {\n this.onTransitionStart();\n }\n\n if(this.skipScroll) {\n this.skipScroll = false;\n } else {\n const offsetTop = this.container.offsetTop;\n let scrollTop = this.scrollable.scrollTop;\n if(scrollTop < offsetTop) {\n this.scrollable.scrollIntoViewNew({\n element: this.container,\n position: 'start',\n startCallback: this.scrollStartCallback\n });\n scrollTop = offsetTop;\n }\n\n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n\n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n\n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n\n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n // console.log('what you gonna do', this.goingHard, diff);\n\n // this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n // }\n }\n }\n }\n\n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n // this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n\n // console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable, this.listenerSetter);\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, listenerSetter: this.listenerSetter});\n\n const onMediaClick = async(className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n\n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map((el) => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el,\n mid: +containerEl.dataset.mid,\n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n // const ids = Object.keys(this.mediaDivsByIds).map((k) => +k).sort((a, b) => a - b);\n const idx = targets.findIndex((item) => item.mid === mid && item.peerId === peerId);\n\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'), {listenerSetter: this.listenerSetter});\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'), {listenerSetter: this.listenerSetter});\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 }, this.listenerSetter);\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n return filterMessagesByInputFilter(type, messages, messages.length);\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const loadPromises: Promise[] = [];\n const dialogElement = appDialogsManager.addDialogNew({\n peerId: message.peerId,\n container: searchGroup.list,\n avatarSize: 'bigger',\n loadPromises\n });\n\n const setLastMessagePromise = appDialogsManager.setLastMessageN({\n dialog: {\n _: 'dialog',\n peerId: message.peerId\n } as any,\n lastMessage: message,\n dialogElement,\n highlightWord: this.searchContext.query\n });\n\n loadPromises.push(setLastMessagePromise);\n return Promise.all(loadPromises).then(noop);\n }\n\n private async processPhotoVideoFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n const media = getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n // this.log(message, photo);\n\n let wrapped: Awaited>;\n const size = choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = await (await wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n photoSize: size\n })).thumb;\n } else {\n wrapped = await wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n [wrapped.images.thumb, wrapped.images.full].filter(Boolean).forEach((image) => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n return {element: div, message};\n }\n\n private async processDocumentFilter({message, inputFilter}: ProcessSearchSuperResult) {\n const document = getMediaFromMessage(message) as Document.document;\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n\n const div = await wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n autoDownloadSize: 0\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n return {message, element: div};\n }\n\n private async processUrlFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n let webPage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage | WebPage.webPageEmpty;\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 const match = matchUrl(message.message);\n if(!match) {\n return;\n }\n\n url = match[0];\n } else {\n sliced = message.message.slice(entity.offset, entity.offset + entity.length);\n }\n\n if(entity?._ === 'messageEntityTextUrl') {\n url = entity.url;\n // display_url = sliced;\n } else {\n url = url || sliced;\n }\n\n display_url = url;\n\n const same = message.message === url;\n if(!url.match(/^(ftp|http|https):\\/\\//)) {\n display_url = 'https://' + url;\n url = url.includes('@') ? url : 'https://' + url;\n }\n\n display_url = new URL(display_url).hostname;\n\n webPage = {\n _: 'webPage',\n url,\n display_url,\n id: '',\n hash: 0\n };\n\n if(!same) {\n webPage.description = message.message;\n }\n }\n\n if(webPage._ === 'webPageEmpty') {\n return;\n }\n\n const previewDiv = document.createElement('div');\n previewDiv.classList.add('preview');\n\n // this.log('wrapping webpage', webpage);\n\n if(webPage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webPage.photo as Photo.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: choosePhotoSize(webPage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n setInnerHTML(previewDiv, wrapAbbreviation(webPage.title || webPage.display_url || webPage.description || webPage.url, true));\n }\n\n const title = wrapWebPageTitle(webPage);\n\n const subtitleFragment = wrapWebPageDescription(webPage);\n const aFragment = htmlToDocumentFragment(wrapRichText(webPage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n try { // can have 'URIError: URI malformed'\n a.innerText = decodeURIComponent(a.href);\n } catch(err) {\n\n }\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', await wrapSenderToPeer(message));\n }\n\n if(!title.textContent) {\n // title = new URL(webpage.url).hostname;\n title.append(wrapPlainText(webPage.display_url.split('/', 1)[0]));\n }\n\n const row = new Row({\n title,\n titleRight: wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n row.applyMediaElement(previewDiv, 'big');\n\n if(row.container.innerText.trim().length) {\n return {message, element: row.container};\n }\n }\n\n public async performSearchResult(messages: any[], mediaTab: SearchSuperMediaTab, append = true) {\n const elemsToAppend: {element: HTMLElement, message: any}[] = [];\n const sharedMediaDiv: HTMLElement = mediaTab.contentTab;\n const promises: Promise[] = [];\n const middleware = this.middleware.get();\n let inputFilter = mediaTab.inputFilter;\n\n await getHeavyAnimationPromise();\n\n let searchGroup: SearchGroup;\n if(inputFilter === 'inputMessagesFilterPhotoVideo' && !!this.searchContext.query.trim()) {\n inputFilter = 'inputMessagesFilterEmpty';\n searchGroup = this.searchGroupMedia;\n sharedMediaDiv.append(searchGroup.container);\n } else if(inputFilter === 'inputMessagesFilterEmpty') {\n searchGroup = this.searchGroups.messages;\n }\n\n const options: ProcessSearchSuperResult = {\n elemsToAppend,\n inputFilter,\n message: undefined,\n middleware,\n promises,\n searchGroup\n };\n\n let processCallback: (options: ProcessSearchSuperResult) => any;\n\n // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n processCallback = this.processEmptyFilter;\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n processCallback = this.processPhotoVideoFilter;\n break;\n }\n\n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n processCallback = this.processDocumentFilter;\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n processCallback = this.processUrlFilter;\n break;\n }\n\n default:\n // this.log.warn('death is my friend', messages);\n break;\n }\n\n if(processCallback) {\n processCallback = processCallback.bind(this);\n\n type K = {element: HTMLElement, message: Message.message | Message.messageService};\n const results: (Promise | K)[] = messages.map(async(message) => {\n try {\n options.message = message;\n return await processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n });\n\n const awaited = (await Promise.all(results)).filter(Boolean);\n elemsToAppend.push(...awaited);\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 if(!message) {\n debugger;\n }\n\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 : elemsToAppend.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(const i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.map((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n\n renderedPeerIds.add(peerId);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: group.list,\n avatarSize: 'abitbigger',\n autonomous: group.autonomous\n });\n\n return {dom, peerId};\n }).filter(Boolean).forEach(async({dom, peerId}) => {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(showMembersCount && ((peer as Chat.channel).participants_count || (peer as any).participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(await getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = await this.managers.appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n\n dom.lastMessageSpan.textContent = username;\n }\n });\n\n group.toggle();\n };\n\n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n\n // this.loadedContacts = true;\n\n return arg;\n };\n\n return Promise.all([\n this.managers.appUsersManager.getContactsPeerIds(query, true, undefined, 10)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n\n this.managers.appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild !== this.searchGroups.globalContacts.nameEl.firstElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n\n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n const intlElement = new I18n.IntlElement({\n key: 'Separator.ShowMore'\n });\n showMore.append(intlElement.element);\n this.searchGroups.globalContacts.nameEl.append(showMore);\n attachClickEvent(showMore, () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n intlElement.key = isShort ? 'Separator.ShowMore' : 'Separator.ShowLess';\n intlElement.update();\n });\n }\n }\n }),\n\n this.managers.dialogsStorage.getDialogs({query, offsetIndex: 0, limit: 20, filterId: 0})\n .then(onLoad)\n .then((value) => {\n if(value) {\n setResults(value.dialogs.map((d) => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return apiManagerProxy.getState().then((state) => {\n if(!middleware()) {\n return;\n }\n\n this.searchGroups.recent.list.replaceChildren();\n\n state.recentSearch.slice(0, 20).forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.searchGroups.recent.list,\n meAsSaved: true,\n avatarSize: 'abitbigger',\n autonomous: true\n });\n\n dom.lastMessageSpan.append(await (peerId.isUser() ?\n getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())) :\n getChatMembersString(peerId.toChatId())));\n });\n\n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n this.managers.appUsersManager.getTopPeers('correspondents').then((peers) => {\n if(!middleware()) return;\n\n const idx = peers.findIndex((peer) => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n\n peers.forEach((peer) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peer.id,\n container: this.searchGroups.people.list,\n onlyFirstName: true,\n avatarSize: 'bigger',\n autonomous: false,\n noIcons: this.searchGroups.people.noIcons\n });\n\n dom.subtitleEl.remove();\n });\n\n this.searchGroups.people.toggle();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private async loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n if(!this.membersList) {\n this.membersList = new SortedUserList({\n lazyLoadQueue: this.lazyLoadQueue,\n rippleEnabled: false,\n managers: this.managers\n });\n attachClickEvent(this.membersList.list, (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n\n promise.then(() => {\n appImManager.setInnerPeer({peerId});\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n for(const participant of participants) {\n const peerId = getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n continue;\n }\n\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n continue;\n }\n\n this.membersList.add(peerId);\n }\n };\n\n if(await this.managers.appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = this.managers.appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then((participants) => {\n if(!middleware()) {\n return;\n }\n\n const list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = this.managers.appProfileManager.getChatFull(id).then((chatFull) => {\n if(!middleware()) {\n return;\n }\n\n // console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = (chatFull as ChatFull.chatFull).participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n\n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ??= [];\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const promise = this.loadPromises[type] = Promise.resolve().then(async() => {\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n const messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n const ids = history.slice(used, used + loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n const notFilteredMessages = await Promise.all(ids.map((m) => this.managers.appMessagesManager.getMessageByPeer(m.peerId, m.mid)));\n\n messages.push(...this.filterMessagesByType(notFilteredMessages, type));\n } while(slicedLength < loadCount && used < history.length);\n\n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n // if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n // }\n }\n\n const maxId = history.length ? history[history.length - 1].mid : 0;\n\n const value = await this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId,\n limit: loadCount,\n nextRate: this.nextRates[type] ??= 0\n });\n\n history.push(...value.history.map((m) => ({mid: m.mid, peerId: m.peerId})));\n\n if(!middleware()) {\n // this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n // if((value.count || history.length === value.count) && history.length >= value.count) {\n // this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return;\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n promise.then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n // this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n // if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n // }\n }).catch((err) => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n\n return promise;\n }\n\n private canLoadMediaTab(mediaTab: SearchSuperMediaTab) {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n }\n\n private async loadFirstTime() {\n const middleware = this.middleware.get();\n const {peerId, threadId} = this.searchContext;\n if(!this.hideEmptyTabs) {\n return;\n }\n\n const mediaTabs = this.mediaTabs.filter((mediaTab) => mediaTab.inputFilter !== 'inputMessagesFilterEmpty');\n const filters = mediaTabs.map((mediaTab) => ({_: mediaTab.inputFilter}));\n\n const [counters, canViewMembers] = await Promise.all([\n this.managers.appMessagesManager.getSearchCounters(peerId, filters, undefined, threadId),\n this.canViewMembers()\n ]);\n\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach((mediaTab) => {\n const counter = counters.find((c) => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n // mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count) {\n if(firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n ++count;\n }\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n ++count;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n // firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n public async load(single = false, justLoad = false) {\n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n await (this.loadFirstTimePromise ??= this.loadFirstTime());\n if(!middleware()) {\n return;\n }\n\n this.loadFirstTimePromise = undefined;\n this.firstLoad = false;\n }\n\n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter((t) => t !== this.mediaTab);\n toLoad = toLoad.filter((mediaTab) => {\n return this.canLoadMediaTab(mediaTab);\n });\n\n if(peerId.isUser()) {\n findAndSplice(toLoad, (mediaTab) => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map((mediaTab) => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware);\n });\n\n return Promise.all(promises).catch((err) => {\n this.log.error('Load error all promises:', err);\n });\n }\n\n private 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 const {peerId} = this.searchContext;\n const isAnyChat = peerId.isAnyChat();\n if(!isAnyChat) return Promise.resolve(false);\n const chatId = peerId.toChatId();\n return Promise.all([\n this.managers.appChatsManager.isBroadcast(chatId),\n this.managers.appChatsManager.hasRights(chatId, 'view_participants'),\n this.managers.appChatsManager.isForum(chatId)\n ]).then(([isBroadcast, hasRights, isForum]) => {\n return !isBroadcast && hasRights && (!this.searchContext.threadId || !isForum);\n });\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n this.prevTabId = -1;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach((mediaTab) => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection?.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.loadFirstTimePromise = undefined;\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach((mediaTab) => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.replaceChildren();\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 public destroy() {\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.swipeHandler?.removeListeners();\n this.selection?.cleanup();\n\n this.scrollStartCallback = undefined;\n this.onChangeTab = undefined;\n this.selectTab = undefined;\n this.searchContextMenu = undefined;\n this.swipeHandler = undefined;\n this.selection = 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 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatRights} from '../lib/appManagers/appChatsManager';\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DialogElementSize as DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport Scrollable from './scrollable';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport CheckboxField from './checkboxField';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport PeerTitle from './peerTitle';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport debounce from '../helpers/schedulers/debounce';\nimport windowSize from '../helpers/windowSize';\nimport type {IsPeerType} from '../lib/appManagers/appPeersManager';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport filterUnique from '../helpers/array/filterUnique';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport AvatarElement from './avatar';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport filterAsync from '../helpers/array/filterAsync';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport {Chat, User} from '../layer';\nimport canSendToUser from '../lib/appManagers/utils/users/canSendToUser';\nimport hasRights from '../lib/appManagers/utils/chats/hasRights';\nimport getDialogIndex from '../lib/appManagers/utils/dialogs/getDialogIndex';\nimport {generateDelimiter} from './generateDelimiter';\nimport SettingSection from './settingSection';\n\ntype SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants';\n\n// TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени\n\nexport default class AppSelectPeers {\n public container = document.createElement('div');\n public list = appDialogsManager.createChatList(/* {\n handheldsSize: 66,\n avatarSize: 48\n } */);\n private chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n private selectedScrollable: Scrollable;\n\n private selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n\n // public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void | Promise;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize: DialogElementSize = 'abitbigger';\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n\n private needSwitchList = false;\n\n private sectionNameLangPackKey: LangPackKey;\n\n private managers: AppManagers;\n\n private design: 'round' | 'square' = 'round';\n\n constructor(options: {\n appendTo: AppSelectPeers['appendTo'],\n onChange?: AppSelectPeers['onChange'],\n peerType?: AppSelectPeers['peerType'],\n peerId?: AppSelectPeers['peerId'],\n onFirstRender?: () => void,\n renderResultsFunc?: AppSelectPeers['renderResultsFunc'],\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n multiSelect?: AppSelectPeers['multiSelect'],\n rippleEnabled?: AppSelectPeers['rippleEnabled'],\n avatarSize?: AppSelectPeers['avatarSize'],\n placeholder?: AppSelectPeers['placeholder'],\n selfPresence?: AppSelectPeers['selfPresence'],\n exceptSelf?: AppSelectPeers['exceptSelf'],\n filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'],\n sectionNameLangPackKey?: AppSelectPeers['sectionNameLangPackKey'],\n managers: AppSelectPeers['managers'],\n design?: AppSelectPeers['design']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector', 'selector-' + this.design);\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = async(peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n\n peerIds = peerIds.filter((peerId) => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = await filterAsync(peerIds, async(peerId) => {\n if(peerId.isPeerId()) {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(peer) {\n for(const method of this.filterPeerTypeBy) {\n if(await this.managers.appPeersManager[method](peerId)) {\n return true;\n }\n }\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n const section = new SettingSection({});\n section.innerContainer.classList.add('selector-search-section');\n const 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 simulateClickEvent(li);\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 const 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 = undefined;\n }\n\n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(const i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = undefined;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n\n // console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private async renderSaved() {\n if(\n !this.exceptSelf &&\n !this.offsetIndex &&\n this.folderId === 0 &&\n this.peerType.includes('dialogs') &&\n (!this.query || await this.managers.appUsersManager.testSelfSearch(this.query))\n ) {\n await this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n this.tempIds[type] ??= 0;\n const tempId = ++this.tempIds[type];\n return {\n tempId,\n middleware: () => this.tempIds[type] === tempId\n };\n }\n\n private async getMoreDialogs(): Promise {\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n\n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n\n const {middleware} = this.getTempId('dialogs');\n const promise = this.managers.dialogsStorage.getDialogs({\n query: this.query,\n offsetIndex: this.offsetIndex,\n limit: pageCount,\n filterId: this.folderId,\n skipMigrated: true\n });\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat[this.loadedWhat.dialogs ? 'archived' : 'dialogs'] = true;\n });\n\n const value = await promise;\n if(!middleware()) {\n return;\n }\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = getDialogIndex(dialogs[dialogs.length - 1]) || 0;\n\n dialogs = dialogs.slice();\n findAndSplice(dialogs, d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = await filterAsync(dialogs, (d) => this.filterByRights(d.peerId));\n if(!middleware()) {\n return;\n }\n }\n\n await this.renderSaved();\n if(!middleware()) {\n return;\n }\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map((dialog) => dialog.peerId));\n\n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n await this.renderSaved();\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private async filterByRights(peerId: PeerId) {\n const peer: User | Chat = await this.managers.appPeersManager.getPeer(peerId);\n if(peerId.isUser()) {\n return this.chatRightsAction !== 'send_messages' || canSendToUser(peer as User.user);\n } else if(hasRights(peer as Chat.chat, this.chatRightsAction)) {\n return true;\n }\n }\n\n private async getMoreContacts() {\n if(this.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 {middleware} = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? this.managers.appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? this.managers.appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.contacts = true;\n });\n\n const [cachedContacts, searchResult] = await promise;\n if(!middleware()) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = await filterAsync(resultPeerIds, (peerId) => this.filterByRights(peerId));\n if(!middleware()) {\n return;\n }\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 }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 56 * 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.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const {middleware} = this.getTempId('channelParticipants');\n const promise = this.managers.appProfileManager.getChannelParticipants(\n this.peerId.toChatId(),\n {\n _: 'channelParticipantsSearch',\n q: this.query\n },\n pageCount,\n this.list.childElementCount\n );\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.channelParticipants = true;\n });\n\n const participants = await promise;\n if(!middleware()) {\n return;\n }\n\n const peerIds = participants.participants.map((participant) => {\n return getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n if(this.promise) {\n return this.promise;\n }\n\n const get = () => {\n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n return this.getMoreSomething('dialogs');\n }\n\n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n return this.getMoreSomething('contacts');\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n return this.getMoreSomething('channelParticipants');\n }\n };\n\n const loadPromise = get();\n if(!loadPromise) {\n return Promise.resolve();\n }\n\n const promise = this.promise = loadPromise.catch((err) => {\n console.error('get more result error', err);\n }).finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n\n this.checkForTriggers();\n });\n\n return promise;\n }\n\n private getMoreSomething(peerType: SelectSearchPeerType) {\n const map: {[type in SelectSearchPeerType]: () => Promise} = {\n dialogs: this.getMoreDialogs,\n contacts: this.getMoreContacts,\n channelParticipants: this.getMoreChannelParticipants\n };\n\n const promise = map[peerType].call(this);\n return promise;\n }\n\n private async renderResults(peerIds: PeerId[]) {\n // console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = await filterAsync(peerIds, (peerId) => {\n return this.managers.appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.scrollable,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n // dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = await getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId()));\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n // console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n const peerTitle = new PeerTitle();\n peerTitle.update({peerId: key.toPeerId(), dialog: true});\n title = peerTitle.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.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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport ProgressivePreloader from './preloader';\nimport appMediaPlaybackController, {MediaItem, MediaSearchContext} from './appMediaPlaybackController';\nimport {DocumentAttribute, Message} from '../layer';\nimport mediaSizes from '../helpers/mediaSizes';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport rootScope from '../lib/rootScope';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport noop from '../helpers/noop';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {joinElementsWith} from '../lib/langPack';\nimport {MiddleEllipsisElement} from './middleEllipsis';\nimport {formatFullSentTime} from '../helpers/date';\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport formatBytes from '../helpers/formatBytes';\nimport {animateSingle} from '../helpers/animation';\nimport clamp from '../helpers/number/clamp';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from './mediaProgressLine';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPhoto from './wrappers/photo';\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 if(sumI < (barCount + 1) / 2) {\n if(maxValue < value) maxValue = value;\n }\n\n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n\n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n const container = document.createElement('div');\n container.classList.add('audio-waveform');\n container.append(svg);\n\n svg.insertAdjacentHTML('beforeend', html);\n return {svg, container, availW};\n}\n\nasync function wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n let waveform = (doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio).waveform || new Uint8Array([]);\n waveform = decodeWaveform(waveform.slice(0, 63));\n\n const {svg, container: svgContainer, availW} = createWaveformBars(waveform, doc.duration);\n\n const fakeSvgContainer = svgContainer.cloneNode(true) as HTMLElement;\n fakeSvgContainer.classList.add('audio-waveform-fake');\n svgContainer.classList.add('audio-waveform-background');\n\n const waveformContainer = document.createElement('div');\n waveformContainer.classList.add('audio-waveform-container');\n waveformContainer.append(svgContainer, fakeSvgContainer);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(waveformContainer, timeDiv);\n\n let progress = svg as any as HTMLElement;\n\n const onLoad = () => {\n let audio = audioEl.audio;\n\n const setAnimation = () => {\n animateSingle(() => {\n if(!audio) return false;\n onTimeUpdate();\n return !audio.paused;\n }, audioEl);\n };\n\n const onTimeUpdate = () => {\n fakeSvgContainer.style.width = (audio.currentTime / audio.duration * 100) + '%';\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onTimeUpdate();\n }\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n audioEl.addAudioListener('timeupdate', throttledTimeUpdate);\n audioEl.addAudioListener('ended', throttledTimeUpdate);\n audioEl.addAudioListener('play', setAnimation);\n\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n });\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n\n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n\n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n\n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n\n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nasync function wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n\n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(audioAttribute?.performer) {\n parts.push(wrapEmojiText(audioAttribute.performer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(await wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n middleEllipsisEl.dataset.fontSize = audioEl.dataset.fontSize;\n middleEllipsisEl.dataset.sizeType = audioEl.dataset.sizeType;\n if(isVoice) {\n middleEllipsisEl.append(await wrapSenderToPeer(message));\n } else {\n setInnerHTML(middleEllipsisEl, wrapEmojiText(audioAttribute?.title ?? doc.file_name));\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(wrapSentTime(message));\n }\n\n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement, anchorMid: number/* , useSearch: boolean */) => {\n let prev: MediaItem[], next: MediaItem[];\n // if(anchor.classList.contains('search-super-item') || !useSearch) {\n const isBubbles = !anchor.classList.contains('search-super-item');\n const container = findUpClassName(anchor, !isBubbles ? 'tabs-tab' : 'bubbles-inner');\n if(container) {\n const attr = `:not([data-is-outgoing=\"1\"])`;\n const justAudioSelector = `.audio:not(.is-voice)${attr}`;\n let selectors: string[];\n if(!anchor.matches(justAudioSelector)) {\n selectors = [`.audio.is-voice${attr}`, `.media-round${attr}`];\n } else {\n selectors = [justAudioSelector];\n }\n\n if(isBubbles) {\n const prefix = '.bubble:not(.webpage) ';\n selectors = selectors.map((s) => prefix + s);\n }\n\n const selector = selectors.join(', ');\n\n const elements = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n const idx = elements.indexOf(anchor);\n\n const mediaItems: MediaItem[] = elements.map((element) => ({peerId: element.dataset.peerId.toPeerId(), mid: +element.dataset.mid}));\n\n prev = mediaItems.slice(0, idx);\n next = mediaItems.slice(idx + 1);\n }\n // }\n\n if((next.length && next[0].mid < anchorMid) || (prev.length && prev[prev.length - 1].mid > anchorMid)) {\n [prev, next] = [next.reverse(), prev.reverse()];\n }\n\n // prev = next = undefined;\n\n return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n public managers: AppManagers;\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public async render() {\n this.classList.add('audio');\n this.managers = rootScope.managers;\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc = getMediaFromMessage(this.message) as MyDocument;\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploadingFileName = this.message?.uploadingFileName;\n\n const durationStr = toHHMMSS(doc.duration | 0);\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploadingFileName) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = await (isVoice ? wrapVoiceMessage(this) : wrapAudio(this));\n\n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n\n const getTimeStr = () => toHHMMSS(audio.currentTime | 0) + (isVoice ? (' / ' + durationStr) : '');\n\n const onPlay = () => {\n audioTimeDiv.innerText = getTimeStr();\n toggle.classList.toggle('playing', !audio.paused);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onPlay();\n }\n\n const togglePlay = (e?: Event, paused = audio.paused) => {\n e && cancelEvent(e);\n\n if(paused) {\n const hadSearchContext = !!this.searchContext;\n if(appMediaPlaybackController.setSearchContext(this.searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(this, this.message.mid/* , this.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLElement[] = [];\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: toggle,\n boxWidth: 48,\n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach((img) => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n const autoDownload = doc.type !== 'audio'/* || !this.noAutoDownload */;\n onLoad(autoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n\n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDownloadManager.downloadMediaURL({media: doc});\n\n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n if(this.classList.contains('corner-download')) {\n toggle.append(downloadDiv);\n } else {\n this.append(downloadDiv);\n }\n\n this.classList.add('downloading');\n\n this.readyPromise.then(() => {\n this.classList.remove('downloading');\n downloadDiv.classList.add('downloaded');\n setTimeout(() => {\n downloadDiv.remove();\n }, 200);\n\n // setTimeout(() => {\n // release loaded audio\n if(appMediaPlaybackController.willBePlayedMedia === this.audio) {\n this.audio.play();\n appMediaPlaybackController.willBePlayed(undefined);\n }\n // }, 10e3);\n });\n };\n\n if(!this.audio?.src) {\n if(autoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploadingFileName) {\n this.preloader = constructDownloadPreloader(false);\n this.preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n // onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n setTimeout(() => {\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 if(this.listenerSetter) {\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n }\n\n if(this.preloader) {\n this.preloader = null;\n }\n }, 100);\n }\n}\n\ncustomElements.define('audio-element', AudioElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Photo} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId, managers: AppManagers}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId;\n return this.managers.appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then((value) => {\n const items = value.photos.map((photoId) => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarListLoader from '../helpers/avatarListLoader';\nimport {Photo} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport AppMediaViewerBase from './appMediaViewerBase';\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId, managers: rootScope.managers}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n\n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = async() => {\n appDownloadManager.downloadToDisc({\n media: await this.managers.appPhotosManager.getPhoto(this.target.photoId),\n queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId\n });\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = await this.managers.appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {Message, Photo} from '../layer';\nimport type LazyLoadQueue from './lazyLoadQueue';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport AppMediaViewer from './appMediaViewer';\nimport AppMediaViewerAvatar from './appMediaViewerAvatar';\nimport isObject from '../helpers/object/isObject';\nimport {ArgumentTypes} from '../types';\nimport putPhoto from './putPhoto';\nimport {recordPromise} from '../helpers/recordPromise';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\n\nconst onAvatarUpdate = ({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n let query = 'avatar-element[data-peer-id=\"' + peerId + '\"]';\n if(threadId) {\n query += '[data-thread-id=\"' + threadId + '\"]';\n }\n\n (Array.from(document.querySelectorAll(query)) as AvatarElement[]).forEach((elem) => {\n // console.log('updating avatar:', elem);\n elem.update();\n });\n};\n\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\nrootScope.addEventListener('peer_title_edit', async(data) => {\n if(!(await rootScope.managers.appAvatarsManager.isAvatarCached(data.peerId))) {\n onAvatarUpdate(data);\n }\n});\n\nexport async function openAvatarViewer(\n target: HTMLElement,\n peerId: PeerId,\n middleware: () => boolean,\n message?: any,\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[],\n nextTargets?: typeof prevTargets\n) {\n let photo = await rootScope.managers.appProfileManager.getFullPhoto(peerId);\n if(!middleware() || !photo) {\n return;\n }\n\n const getTarget = () => {\n const good = Array.from(target.querySelectorAll('img')).find((img) => !img.classList.contains('emoji'));\n return good ? target : null;\n };\n\n if(peerId.isAnyChat()) {\n const hadMessage = !!message;\n const inputFilter = 'inputMessagesFilterChatPhotos';\n if(!message) {\n message = await rootScope.managers.appMessagesManager.getSearch({\n peerId,\n inputFilter: {_: inputFilter},\n maxId: 0,\n limit: 1\n }).then((value) => {\n // console.log(lol);\n // ! by descend\n return value.history[0];\n });\n\n if(!middleware()) {\n return;\n }\n }\n\n if(message) {\n // ! гений в деле, костылируем (но это гениально)\n const messagePhoto = message.action.photo;\n if(messagePhoto.id !== photo.id) {\n if(!hadMessage) {\n message = rootScope.managers.appMessagesManager.generateFakeAvatarMessage(peerId, photo);\n } else {\n\n }\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n mid: (el.item as Message.messageService).mid,\n peerId: (el.item as Message.messageService).peerId\n }));\n\n new AppMediaViewer()\n .setSearchContext({\n peerId,\n inputFilter: {_: inputFilter}\n })\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\n\n return;\n }\n }\n\n if(photo) {\n if(!isObject(message) && message) {\n photo = await rootScope.managers.appPhotosManager.getPhoto(message);\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n photoId: el.item as string\n }));\n\n new AppMediaViewerAvatar(peerId).openMedia(\n photo.id,\n getTarget(),\n undefined,\n prevTargets ? f(prevTargets) : undefined,\n nextTargets ? f(nextTargets) : undefined\n );\n }\n}\n\nconst believeMe: Map> = new Map();\nconst seen: Set = new Set();\n\nfunction getAvatarQueueKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n}\n\nexport default class AvatarElement extends HTMLElement {\n public peerId: PeerId;\n public isDialog: boolean;\n public peerTitle: string;\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public isBig: boolean;\n public threadId: number;\n private addedToQueue = false;\n public wrapOptions: WrapSomethingOptions;\n\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.classList.add('avatar-like');\n this.middlewareHelper = getMiddleware();\n }\n\n disconnectedCallback() {\n // браузер вызывает этот метод при удалении элемента из документа\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set?.has(this)) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n\n this.lazyLoadQueue?.delete({div: this});\n }\n\n public attachClickEvent() {\n let loading = false;\n attachClickEvent(this, async(e) => {\n cancelEvent(e);\n if(loading) return;\n const peerId = this.peerId;\n loading = true;\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\n loading = false;\n });\n }\n\n public updateOptions(options: Partial[0]>) {\n for(const i in options) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n public updateWithOptions(options: {\n peerId: PeerId,\n threadId?: number,\n isDialog?: boolean,\n isBig?: boolean,\n peerTitle?: string,\n lazyLoadQueue?: LazyLoadQueue | false,\n loadPromises?: Promise[],\n wrapOptions?: WrapSomethingOptions\n }) {\n const wasPeerId = this.peerId;\n const wasThreadId = this.threadId;\n this.updateOptions(options);\n const newPeerId = this.peerId;\n const threadId = this.threadId;\n\n if(wasPeerId === newPeerId && wasThreadId === threadId) {\n return;\n }\n\n this.dataset.peerId = '' + newPeerId;\n\n if(threadId) {\n this.dataset.threadId = '' + threadId;\n } else if(wasThreadId) {\n delete this.dataset.threadId;\n }\n\n if(wasPeerId) {\n const key = getAvatarQueueKey(wasPeerId, wasThreadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n }\n\n const middleware = options.wrapOptions?.middleware;\n this.middlewareHelper.destroy();\n if(middleware) {\n this.middlewareHelper = middleware.create();\n } else {\n this.middlewareHelper.destroy();\n }\n\n return this.update();\n }\n\n public remove() {\n this.middlewareHelper.destroy();\n super.remove();\n }\n\n private r(onlyThumb = false) {\n const promise = putPhoto({\n div: this,\n peerId: this.peerId,\n isDialog: this.isDialog,\n title: this.peerTitle,\n onlyThumb,\n isBig: this.isBig,\n threadId: this.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get(),\n ...(this.wrapOptions || {})\n }\n });\n // recordPromise(promise, 'avatar putPhoto-' + this.peerId);\n\n if(this.loadPromises) {\n this.loadPromises.push(promise);\n\n promise.finally(() => {\n this.loadPromises = undefined;\n });\n }\n\n return promise;\n }\n\n public update() {\n if(this.lazyLoadQueue) {\n if(!seen.has(this.peerId)) {\n if(this.addedToQueue) return;\n this.addedToQueue = true;\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n let set = believeMe.get(key);\n if(!set) {\n believeMe.set(key, set = new Set());\n }\n\n set.add(this);\n\n this.lazyLoadQueue.push({\n div: this,\n load: () => {\n seen.add(this.peerId);\n return this.update();\n }\n });\n\n return this.r(true);\n } else if(this.addedToQueue) {\n this.lazyLoadQueue.delete({div: this});\n }\n }\n\n seen.add(this.peerId);\n\n const promise = this.r();\n\n if(this.addedToQueue) {\n promise.finally(() => {\n this.addedToQueue = false;\n });\n }\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n const arr = Array.from(set);\n believeMe.delete(key);\n\n for(let i = 0, length = arr.length; i < length; ++i) {\n arr[i].update();\n }\n }\n\n return promise;\n }\n}\n\ncustomElements.define('avatar-element', AvatarElement);\n","/*\n * 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 {CancellablePromise} from '../helpers/cancellablePromise';\nimport type {InputFile} from '../layer';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport PopupElement from './popups';\nimport PopupAvatar from './popups/avatar';\n\nexport default class AvatarEdit {\n public container: HTMLElement;\n private canvas: HTMLCanvasElement;\n private icon: HTMLSpanElement;\n\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void, options?: ConstructorParameters[0]) {\n this.container = document.createElement('div');\n this.container.classList.add('avatar-edit');\n\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('avatar-edit-canvas');\n\n this.icon = document.createElement('span');\n this.icon.classList.add('tgico', 'tgico-cameraadd');\n\n this.container.append(this.canvas, this.icon);\n\n attachClickEvent(this.container, () => {\n PopupElement.createPopup(PopupAvatar, options).open(this.canvas, onChange);\n });\n }\n\n public clear() {\n const ctx = this.canvas.getContext('2d');\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n}\n","/*\n * 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';\nimport ripple from './ripple';\n\nexport type ButtonOptions = Partial<{\n noRipple: true,\n onlyMobile: true,\n icon: string,\n rippleSquare: true,\n text: LangPackKey,\n disabled: boolean,\n asDiv: boolean,\n asLink: boolean\n}>;\n\nexport default function Button(className: string, options: T = {} as T): T['asLink'] extends true ? HTMLAnchorElement : HTMLButtonElement {\n const button = document.createElement(options.asLink ? 'a' : (options.asDiv ? 'div' : 'button'));\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\n\n if(!options.noRipple) {\n if(options.rippleSquare) {\n button.classList.add('rp-square');\n }\n\n ripple(button);\n }\n\n if(options.onlyMobile) {\n button.classList.add('only-handhelds');\n }\n\n if(options.disabled) {\n button.setAttribute('disabled', 'true');\n }\n\n if(options.text) {\n button.append(i18n(options.text));\n }\n\n return button as any;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from './button';\n\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\n return button;\n};\n\nexport default ButtonCorner;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from './button';\n\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-icon', {\n icon: className || undefined,\n ...options\n });\n\n return button;\n};\n\nexport default ButtonIcon;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport flatten from '../helpers/array/flatten';\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport CheckboxField from './checkboxField';\nimport {Document} from '../layer';\nimport wrapPhoto from './wrappers/photo';\nimport textToSvgURL from '../helpers/textToSvgURL';\nimport customProperties from '../helpers/dom/customProperties';\n\nexport type ButtonMenuItemOptions = {\n icon?: string,\n iconDoc?: Document.document,\n text?: LangPackKey,\n textArgs?: FormatterArguments,\n regularText?: Parameters[1],\n onClick: (e: MouseEvent | TouchEvent) => void | boolean | any,\n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean,\n separator?: boolean | HTMLElement,\n multiline?: boolean,\n loadPromise?: Promise\n /* , cancelEvent?: true */\n};\n\nexport type ButtonMenuItemOptionsVerifiable = ButtonMenuItemOptions & {\n verify?: () => boolean | Promise\n};\n\nfunction ButtonMenuItem(options: ButtonMenuItemOptions) {\n if(options.element) return [options.separator as HTMLElement, options.element].filter(Boolean);\n\n const {icon, iconDoc, 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) {\n setInnerHTML(textElement, options.regularText);\n }\n }\n\n if(iconDoc) {\n const iconElement = document.createElement('span');\n iconElement.classList.add('btn-menu-item-icon');\n el.append(iconElement);\n\n options.loadPromise = wrapPhoto({\n container: iconElement,\n photo: iconDoc,\n boxWidth: 24,\n boxHeight: 24,\n withoutPreloader: true,\n noFadeIn: true,\n noBlur: true,\n processUrl: (url) => {\n return fetch(url)\n .then((response) => response.text())\n .then((text) => {\n const color = customProperties.getProperty('primary-text-color');\n const doc = new DOMParser().parseFromString(text, 'image/svg+xml');\n const svg = doc.firstElementChild as HTMLElement;\n svg.querySelectorAll('path').forEach((path) => {\n path.setAttributeNS(null, 'fill', color);\n path.style.stroke = color;\n path.style.strokeWidth = '.25px';\n });\n return textToSvgURL(svg.outerHTML);\n });\n }\n }).then((ret) => ret.loadPromises.thumb);\n }\n\n textElement.classList.add('btn-menu-item-text');\n el.append(textElement);\n\n const keepOpen = !!checkboxField || !!options.keepOpen;\n\n // * cancel mobile keyboard close\n onClick && attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ (e) => {\n cancelEvent(e);\n\n const menu = findUpClassName(e.target, 'btn-menu');\n if(menu && !menu.classList.contains('active')) {\n return;\n }\n\n const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\n contextMenuController.close();\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 if(options.separator === true) {\n options.separator = document.createElement('hr');\n }\n\n if(options.multiline) {\n el.classList.add('is-multiline');\n }\n\n return [options.separator as HTMLElement, options.element = el].filter(Boolean);\n}\n\nexport function ButtonMenuSync({listenerSetter, buttons}: {\n buttons: ButtonMenuItemOptions[],\n listenerSetter?: ListenerSetter\n}) {\n const el: HTMLElement = 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 el.append(...flatten(items));\n\n return el;\n}\n\nexport default async function ButtonMenu(options: Parameters[0]) {\n const el = ButtonMenuSync(options);\n await Promise.all(options.buttons.map(({loadPromise}) => loadPromise));\n return el;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, CLICK_EVENT_NAME} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonIcon from './buttonIcon';\nimport ButtonMenu, {ButtonMenuItemOptionsVerifiable} from './buttonMenu';\nimport filterAsync from '../helpers/array/filterAsync';\nimport {doubleRaf} from '../helpers/schedulers';\n\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\nexport function ButtonMenuToggleHandler({\n el,\n onOpen,\n options,\n onClose\n}: {\n el: HTMLElement,\n onOpen?: (e: Event) => any,\n options?: AttachClickOptions,\n onClose?: () => void\n}) {\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\n\n add(CLICK_EVENT_NAME, (e: Event) => {\n if(!el.classList.contains('btn-menu-toggle')) return false;\n\n cancelEvent(e);\n\n if(el.classList.contains('menu-open')) {\n contextMenuController.close();\n } else {\n const result = onOpen?.(e);\n const open = () => {\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\n contextMenuController.openBtnMenu(openedMenu, onClose);\n };\n\n if(result instanceof Promise) {\n result.then(open);\n } else {\n open();\n }\n }\n });\n}\n\nexport default function ButtonMenuToggle({\n buttonOptions,\n listenerSetter: attachListenerSetter,\n container,\n direction,\n buttons,\n onOpenBefore,\n onOpen,\n onClose,\n onCloseAfter\n}: {\n buttonOptions?: Parameters[1],\n listenerSetter?: ListenerSetter,\n container?: HTMLElement\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right',\n buttons: ButtonMenuItemOptionsVerifiable[],\n onOpenBefore?: (e: Event) => any,\n onOpen?: (e: Event, element: HTMLElement) => any,\n onClose?: () => void,\n onCloseAfter?: () => void\n}) {\n if(buttonOptions) {\n buttonOptions.asDiv = true;\n }\n\n const button = container ?? ButtonIcon('more', buttonOptions);\n button.classList.add('btn-menu-toggle');\n\n const listenerSetter = new ListenerSetter();\n\n let element: HTMLElement, closeTimeout: number;\n ButtonMenuToggleHandler({\n el: button,\n onOpen: async(e) => {\n await onOpenBefore?.(e);\n if(closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n return;\n }\n\n const f = (b: (typeof buttons[0])[]) => filterAsync(b, (button) => button?.verify?.() ?? true);\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add(direction);\n\n await onOpen?.(e, _element);\n\n button.append(_element);\n await doubleRaf();\n },\n options: {\n listenerSetter: attachListenerSetter\n },\n onClose: () => {\n onClose?.();\n\n closeTimeout = window.setTimeout(() => {\n onCloseAfter?.();\n closeTimeout = undefined;\n listenerSetter.removeAll();\n buttons.forEach((button) => button.element = undefined);\n element.remove();\n }, 300);\n }\n });\n\n return button;\n}\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 {animateSingle} from '../../helpers/animation';\nimport {hexToRgb} from '../../helpers/color';\nimport {easeOutQuadApply} from '../../helpers/easing/easeOutQuad';\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, 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 private _nextPositionTail: number;\n private _nextPositionTails: number;\n private _nextPositionLeft: number;\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 positions.push(...positions.splice(0, shift));\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 changeTailAndDraw(diff: number) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n\n private drawOnWheel = () => {\n const value = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n const diff = value > 0 ? Math.floor(value) : Math.ceil(value);\n if(diff) {\n this.changeTailAndDraw(diff);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = (getProgress?: () => number) => {\n let done: boolean, id: ImageData;\n if(getProgress) {\n const value = getProgress();\n done = value >= 1;\n const transitionValue = easeOutQuadApply(value, 1);\n const nextPositionTail = this._nextPositionTail ?? 0;\n const tail = this._nextPositionTail = this._nextPositionTails * transitionValue;\n const diff = tail - nextPositionTail;\n if(diff) {\n this._nextPositionLeft -= diff;\n this.changeTailAndDraw(diff);\n }\n } else {\n const frames = this._frames;\n id = frames.shift();\n done = !frames.length;\n }\n\n if(id) {\n this.drawImageData(id);\n }\n\n if(done) {\n this._nextPositionLeft = undefined;\n this._nextPositionTails = undefined;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = undefined;\n }\n\n return !done;\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', {alpha: false});\n }\n\n this._canvas = el;\n this._ctx = this._canvas.getContext('2d', {alpha: false});\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(getProgress?: () => number) {\n if(this._colors.length < 2) {\n return;\n }\n\n if(getProgress) {\n this._nextPositionLeft = this._tails + (this._nextPositionLeft ?? 0);\n this._nextPositionTails = this._nextPositionLeft;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated.bind(this, getProgress), this);\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 animateSingle(this.drawNextPositionAnimated, this);\n }\n\n // public toNextPositionThrottled = throttle(this.toNextPosition.bind(this), 100, true);\n\n public scrollAnimate(start?: boolean) {\n return;\n\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","export default function easeOutQuad(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeOutQuadApply(t / d, c) + b;\n}\n\nexport function easeOutQuadApply(v: number, c: number) {\n return -c * v * (v - 2);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppMessagesManager, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport type ChatBubbles from './bubbles';\nimport type ChatInput from './input';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport Button from '../button';\nimport ButtonIcon from '../buttonIcon';\nimport CheckboxField from '../checkboxField';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport 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 replaceContent from '../../helpers/dom/replaceContent';\nimport AppSearchSuper from '../appSearchSuper.';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {randomLong} from '../../helpers/random';\nimport {attachClickEvent, AttachClickOptions} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport appImManager from '../../lib/appManagers/appImManager';\n\nconst accumulateMapSet = (map: Map>) => {\n return [...map.values()].reduce((acc, v) => acc + v.size, 0);\n};\n\n// const MIN_CLICK_MOVE = 32; // minimum bubble height\n\nclass AppSelection extends EventListenerBase<{\n toggle: (isSelecting: boolean) => void\n}> {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void | Promise;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n protected doNotAnimate: boolean;\n protected managers: AppManagers;\n\n constructor(options: {\n managers: AppManagers,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n }\n\n public attachListeners(listenElement: HTMLElement, listenerSetter: ListenerSetter) {\n if(this.listenElement) {\n this.listenerSetter.removeAll();\n }\n\n this.listenElement = listenElement;\n this.listenerSetter = listenerSetter;\n\n if(!listenElement) {\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener(listenElement, (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n // this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n // cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n }, listenerSetter);\n\n return;\n }\n\n listenerSetter.add(listenElement)('mousedown', this.onMouseDown);\n }\n\n private onMouseDown = (e: MouseEvent) => {\n // console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n\n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(seenSet.has(mid)) {\n return;\n }\n\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n // bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = this.getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach((element) => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n };\n\n // const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n // console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n // bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n };\n\n private getElementsBetween = (first: HTMLElement, last: HTMLElement) => {\n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n\n const checkboxField = new CheckboxField({\n name: element.dataset.mid,\n round: true\n });\n\n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n\n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n SetTransition({\n element,\n className: 'is-selected',\n forwards: false,\n duration: 200\n });\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' &&\n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected async updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n\n let cantForward = !size,\n cantDelete = !size;\n const cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.isScheduled ? 'scheduled' : 'history'}`;\n const r = await this.managers.appMessagesManager.cantForwardDeleteMids(storageKey, Array.from(mids));\n cantForward = r.cantForward;\n cantDelete = r.cantDelete;\n\n if(cantForward && cantDelete) break;\n }\n\n this.onUpdateContainer?.(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 const toggleResult = 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 (toggleResult || Promise.resolve()).then(() => this.updateContainer(forceSelection));\n }\n\n return true;\n }\n\n public cancelSelection = async(doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && await this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n if(doNotAnimate) this.doNotAnimate = undefined;\n };\n\n public cleanup() {\n this.doNotAnimate = true;\n this.selectedMids.clear();\n this.toggleSelection(false);\n this.doNotAnimate = undefined;\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition({\n element,\n className: 'is-selected',\n forwards: isSelected,\n duration: 200\n });\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n // const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n // if(diff < 0) {\n // toast(I18n.format('Chat.Selection.LimitToast', true));\n // return false;\n // /* const it = this.selectedMids.values();\n // do {\n // const mid = it.next().value;\n // const mounted = this.appImManager.getMountedBubble(mid);\n // if(mounted) {\n // this.toggleByBubble(mounted.bubble);\n // } else {\n // const mids = this.appMessagesManager.getMidsByMid(mid);\n // for(const mid of mids) {\n // this.selectedMids.delete(mid);\n // }\n // }\n // } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n // }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach((mid) => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, managers: AppManagers, listenerSetter: ListenerSetter) {\n super({\n managers,\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n this.attachListeners(searchSuper.container, listenerSetter);\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach((element) => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n SetTransition({\n element: this.searchSuper.navScrollableContainer,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\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\n SetTransition({\n element: this.searchSuper.container,\n className: 'is-selecting',\n forwards,\n duration: 200\n });\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 attachClickEvent(btnCancel, () => this.cancelSelection(), {listenerSetter: this.listenerSetter, once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n appImManager.setInnerPeer({peerId, lastMsgId: mid});\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel,\n this.selectionCountEl,\n this.selectionGotoBtn,\n this.selectionForwardBtn,\n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n private selectionLeft: HTMLDivElement;\n private selectionRight: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private bubbles: ChatBubbles,\n private input: ChatInput,\n managers: AppManagers\n ) {\n super({\n managers,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size &&\n !(e.target as HTMLElement).classList.contains('bubble') &&\n !(e.target as HTMLElement).classList.contains('document-selection') &&\n target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element &&\n !(e.target as HTMLElement).classList.contains('document-selection') &&\n selecting === undefined &&\n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n if(this.bubbles.skippedMids.has(+mid)) {\n continue;\n }\n\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach((item) => this.toggleElementCheckbox(item, show));\n }\n }\n\n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement): Promise => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.chat.peerId);\n if(set) {\n // const mids = await this.chat.getMidsByMid(mid);\n const mids = this.getMidsFromGroupContainer(bubble);\n mids.forEach((mid) => set.delete(mid));\n }\n }\n\n /* const promises = */this.bubbles.getBubbleGroupedItems(bubble).map(this.toggleByElement);\n // await Promise.all(promises);\n return;\n }\n\n if(!this.toggleMid(this.chat.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(groupContainer);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.chat.peerId, mid));\n };\n\n protected toggleByMid = async(peerId: PeerId, mid: number) => {\n const mounted = await this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(element));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected getMidsFromGroupContainer(groupContainer: HTMLElement) {\n const elements = this.chat.bubbles.getBubbleGroupedItems(groupContainer);\n if(!elements.length) {\n elements.push(groupContainer);\n }\n\n return elements.map((element) => +element.dataset.mid);\n }\n\n protected isGroupedMidsSelected(groupContainer: HTMLElement) {\n const mids = this.getMidsFromGroupContainer(groupContainer);\n const selectedMids = mids.filter((mid) => this.isMidSelected(this.chat.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n\n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n\n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n\n return bubble.classList.contains('document-container') ?\n bubble.querySelector('label input') as HTMLInputElement :\n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') &&\n !bubble.classList.contains('is-outgoing') &&\n !bubble.classList.contains('is-error') &&\n !bubble.classList.contains('bubble-first') &&\n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = async(forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = await this.chat.input.center(animate);\n\n SetTransition({\n element: this.listenElement,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\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\n // const chatInput = this.appImManager.chatInput;\n\n const translateButtonsX = widthFrom < widthTo ? undefined : needTranslateX * 2;\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n this.selectionInputWrapper = document.createElement('div');\n this.selectionInputWrapper.classList.add('chat-input-wrapper', 'selection-wrapper');\n\n // const background = document.createElement('div');\n // background.classList.add('chat-input-wrapper-background');\n\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n const left = this.selectionLeft = document.createElement('div');\n left.classList.add('selection-container-left');\n left.append(btnCancel, this.selectionCountEl);\n\n const right = this.selectionRight = document.createElement('div');\n right.classList.add('selection-container-right');\n right.append(...[\n this.selectionSendNowBtn,\n this.selectionForwardBtn,\n this.selectionDeleteBtn\n ].filter(Boolean))\n\n if(translateButtonsX !== undefined) {\n left.style.transform = `translateX(${-translateButtonsX}px)`;\n right.style.transform = `translateX(${translateButtonsX}px)`;\n }\n\n this.selectionContainer.append(left, right);\n\n // background.style.opacity = '0';\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(/* background, */this.selectionContainer);\n this.input.inputContainer.append(this.selectionInputWrapper);\n\n void this.selectionInputWrapper.offsetLeft; // reflow\n // background.style.opacity = '';\n this.selectionInputWrapper.style.opacity = '';\n left.style.transform = '';\n right.style.transform = '';\n }\n } else if(this.selectionLeft && translateButtonsX !== undefined) {\n this.selectionLeft.style.transform = `translateX(-${translateButtonsX}px)`;\n this.selectionRight.style.transform = `translateX(${translateButtonsX}px)`;\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = async() => {\n return;\n const promises: Promise[] = [];\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n promises.push(this.bubbles.getMountedBubble(mid).then((m) => m?.bubble));\n }\n }\n\n const bubbles = filterUnique((await Promise.all(promises)).filter(Boolean));\n bubbles.forEach((bubble) => {\n this.toggleByElement(bubble);\n });\n };\n}\n","/*\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 getSelectedText(): string {\n if(window.getSelection) {\n return window.getSelection().toString();\n // @ts-ignore\n } else if(document.selection) {\n // @ts-ignore\n return document.selection.createRange().text;\n }\n\n return '';\n}\n","/*\n * 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 '../helpers/listenerSetter';\nimport ripple from './ripple';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport getDeepProperty from '../helpers/object/getDeepProperty';\nimport rootScope from '../lib/rootScope';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\n\nexport type CheckboxFieldOptions = {\n text?: LangPackKey,\n textArgs?: any[],\n name?: string,\n round?: boolean,\n toggle?: boolean,\n stateKey?: string,\n stateValues?: any[],\n disabled?: boolean,\n checked?: boolean,\n restriction?: boolean,\n withRipple?: boolean,\n withHover?: boolean,\n listenerSetter?: ListenerSetter\n};\nexport default class CheckboxField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public span: HTMLSpanElement;\n public listenerSetter: ListenerSetter;\n\n constructor(options: CheckboxFieldOptions = {}) {\n const label = this.label = document.createElement('label');\n label.classList.add('checkbox-field');\n\n if(options.restriction) {\n label.classList.add('checkbox-field-restriction');\n }\n\n if(options.round) {\n label.classList.add('checkbox-field-round');\n }\n\n if(options.disabled) {\n this.toggleDisability(true);\n }\n\n this.listenerSetter = options.listenerSetter;\n\n const input = this.input = document.createElement('input');\n input.classList.add('checkbox-field-input');\n input.type = 'checkbox';\n if(options.name) {\n input.id = 'input-' + options.name;\n }\n\n if(options.checked) {\n input.checked = true;\n }\n\n if(options.stateKey) {\n let loaded = false;\n const onChange = () => {\n if(!loaded) {\n return;\n }\n\n let value: any;\n if(options.stateValues) {\n value = options.stateValues[input.checked ? 1 : 0];\n } else {\n value = input.checked;\n }\n\n rootScope.managers.appStateManager.setByKey(options.stateKey, value);\n };\n\n apiManagerProxy.getState().then((state) => {\n loaded = true;\n const stateValue = getDeepProperty(state, options.stateKey);\n let checked: boolean;\n if(options.stateValues) {\n checked = options.stateValues.indexOf(stateValue) === 1;\n } else {\n checked = stateValue;\n }\n\n this.setValueSilently(checked);\n });\n\n if(options.listenerSetter) options.listenerSetter.add(input)('change', onChange);\n else input.addEventListener('change', onChange);\n }\n\n let span: HTMLSpanElement;\n if(options.text) {\n span = this.span = document.createElement('span');\n span.classList.add('checkbox-caption');\n _i18n(span, options.text, options.textArgs);\n } else {\n label.classList.add('checkbox-without-caption');\n }\n\n label.append(input);\n\n if(options.toggle) {\n label.classList.add('checkbox-field-toggle');\n\n const toggle = document.createElement('div');\n toggle.classList.add('checkbox-toggle');\n label.append(toggle);\n } else {\n const box = document.createElement('div');\n box.classList.add('checkbox-box');\n\n const checkSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n checkSvg.classList.add('checkbox-box-check');\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#check');\n use.setAttributeNS(null, 'x', '-1');\n checkSvg.append(use);\n\n const bg = document.createElement('div');\n bg.classList.add('checkbox-box-background');\n\n const border = document.createElement('div');\n border.classList.add('checkbox-box-border');\n\n box.append(border, bg, checkSvg);\n\n label.append(box);\n }\n\n if(span) {\n label.append(span);\n }\n\n if(options.withRipple) {\n label.classList.add('checkbox-ripple', 'hover-effect');\n ripple(label, undefined, undefined, true);\n // label.prepend(input);\n } else if(options.withHover) {\n label.classList.add('hover-effect');\n }\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n /* if(this.checked === checked) {\n return;\n } */\n\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n\n public toggleDisability(disable: boolean) {\n this.label.classList.toggle('checkbox-disabled', disable);\n return () => this.toggleDisability(!disable);\n }\n}\n","/*\n * 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, {InputFieldOptions} from './inputField';\n\nexport default class CodeInputField extends InputField {\n constructor(public options: InputFieldOptions & {\n length: number,\n onFill: (code: string) => void\n }) {\n super(Object.assign(options, {\n plainText: true\n }));\n\n const input = this.input as HTMLInputElement;\n input.type = 'tel';\n input.setAttribute('required', '');\n input.autocomplete = 'off';\n\n let lastLength = 0;\n this.input.addEventListener('input', (e) => {\n this.input.classList.remove('error');\n this.setLabel();\n\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\n this.setValueSilently(value);\n\n const length = this.value.length;\n if(length === options.length) { // submit code\n options.onFill(this.value);\n } else if(length === lastLength) {\n return;\n }\n\n lastLength = length;\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 {addCancelButton} from './popups';\nimport PopupPeer, {PopupPeerOptions} from './popups/peer';\n\n// type PopupConfirmationOptions = Pick;\nexport type 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(options.buttons || [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 IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport {randomLong} from '../helpers/random';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport I18n, {i18n} from '../lib/langPack';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../lib/rootScope';\nimport {getCountryEmoji} from '../vendor/emoji';\nimport InputField, {InputFieldOptions} from './inputField';\nimport Scrollable from './scrollable';\n\nlet countries: HelpCountry.helpCountry[];\nconst setCountries = () => {\n countries = I18n.countriesList\n .filter((country) => !country.pFlags?.hidden)\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\n};\n\nlet init = () => {\n setCountries();\n rootScope.addEventListener('language_change', () => {\n setCountries();\n });\n};\n\nconst VIRTUAL_COUNTRIES = new Set(['FT']);\n\nexport default class CountryInputField extends InputField {\n private lastCountrySelected: HelpCountry;\n private lastCountryCodeSelected: HelpCountryCode;\n\n private hideTimeout: number;\n private selectWrapper: HTMLElement;\n\n private liMap: Map;\n\n constructor(public options: InputFieldOptions & {\n onCountryChange?: (country: HelpCountry.helpCountry, code: HelpCountryCode.helpCountryCode) => void,\n noPhoneCodes?: boolean\n } = {}) {\n super({\n label: 'Country',\n name: randomLong(),\n ...options\n });\n\n if(init) {\n init();\n init = undefined;\n }\n\n this.liMap = new Map();\n\n this.container.classList.add('input-select');\n\n const selectWrapper = this.selectWrapper = document.createElement('div');\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\n\n const arrowDown = document.createElement('span');\n arrowDown.classList.add('arrow', 'arrow-down');\n this.container.append(arrowDown);\n\n const selectList = document.createElement('ul');\n selectWrapper.appendChild(selectList);\n\n const scroll = new Scrollable(selectWrapper);\n\n let initSelect = () => {\n initSelect = null;\n\n countries.forEach((c) => {\n if(options.noPhoneCodes && VIRTUAL_COUNTRIES.has(c.iso2)) {\n return;\n }\n\n const emoji = getCountryEmoji(c.iso2);\n\n const liArr: Array = [];\n for(let i = 0, length = Math.min(c.country_codes.length, options.noPhoneCodes ? 1 : Infinity); i < length; ++i) {\n const countryCode = c.country_codes[i];\n const li = document.createElement('li');\n\n const wrapped = wrapEmojiText(emoji);\n if(IS_EMOJI_SUPPORTED) {\n const spanEmoji = document.createElement('span');\n setInnerHTML(spanEmoji, wrapped);\n li.append(spanEmoji);\n } else {\n setInnerHTML(li, wrapped);\n }\n\n const el = i18n(c.default_name as any);\n el.dataset.defaultName = c.default_name;\n li.append(el);\n\n if(!options.noPhoneCodes) {\n const span = document.createElement('span');\n span.classList.add('phone-code');\n span.innerText = '+' + countryCode.country_code;\n li.appendChild(span);\n }\n\n liArr.push(li);\n selectList.append(li);\n }\n\n this.liMap.set(c.iso2, liArr);\n });\n\n selectList.addEventListener('mousedown', (e) => {\n if(e.button !== 0) { // other buttons but left shall not pass\n return;\n }\n\n const target = findUpTag(e.target, 'LI')\n this.selectCountryByTarget(target);\n // console.log('clicked', e, countryName, phoneCode);\n });\n\n this.container.appendChild(selectWrapper);\n };\n\n initSelect();\n\n this.input.addEventListener('focus', (e) => {\n if(initSelect) {\n initSelect();\n } else {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) return;\n arr.forEach((li) => li.style.display = '');\n });\n }\n\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n\n selectWrapper.classList.remove('hide');\n void selectWrapper.offsetWidth; // reflow\n selectWrapper.classList.add('active');\n\n this.select();\n\n fastSmoothScroll({\n // container: page.pageEl.parentElement.parentElement,\n container: findUpClassName(this.container, 'scrollable-y'),\n element: this.input,\n position: 'start',\n margin: 4\n });\n\n setTimeout(() => {\n if(!mouseDownHandlerAttached) {\n document.addEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = true;\n }\n }, 0);\n });\n\n let mouseDownHandlerAttached = false;\n const onMouseDown = (e: MouseEvent) => {\n if(findUpClassName(e.target, 'input-select')) {\n return;\n }\n if(e.target === this.input) {\n return;\n }\n\n this.hidePicker();\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = false;\n };\n\n /* false && this.input.addEventListener('blur', function(this: typeof this.input, e) {\n hidePicker();\n\n e.cancelBubble = true;\n }, {capture: true}); */\n\n const onKeyPress = (e: KeyboardEvent) => {\n const key = e.key;\n if(e.ctrlKey || key === 'Control') return false;\n\n // let i = new RegExp('^' + this.value, 'i');\n const _value = this.value.toLowerCase();\n const matches: HelpCountry[] = [];\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n const names = [\n c.name,\n c.default_name,\n c.iso2\n ];\n\n names.filter(Boolean).forEach((name) => {\n const abbr = name.split(' ').filter((word) => /\\w/.test(word)).map((word) => word[0]).join('');\n if(abbr.length > 1) {\n names.push(abbr);\n }\n });\n\n const good = !!names.filter(Boolean).find((str) => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;// i.test(c.name);\n\n arr.forEach((li) => li.style.display = good ? '' : 'none');\n if(good) matches.push(c);\n });\n\n // Код ниже автоматически выберет страну если она осталась одна при поиске\n /* if(matches.length === 1 && matches[0].li.length === 1) {\n if(matches[0].name === lastCountrySelected) return false;\n //console.log('clicking', matches[0]);\n\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initEvent('mousedown', true, true);\n matches[0].li[0].dispatchEvent(clickEvent);\n return false;\n } else */if(matches.length === 0) {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n arr.forEach((li) => li.style.display = '');\n });\n } else if(matches.length === 1 && key === 'Enter') {\n cancelEvent(e);\n this.selectCountryByTarget(this.liMap.get(matches[0].iso2)[0]);\n }\n };\n\n this.input.addEventListener('keyup', onKeyPress);\n this.input.addEventListener('keydown', (e) => {\n if(e.key === 'Enter') {\n onKeyPress(e);\n }\n });\n\n arrowDown.addEventListener('mousedown', (e) => {\n if(this.input.matches(':focus')) {\n this.hidePicker();\n this.input.blur();\n } else {\n e.cancelBubble = true;\n e.preventDefault();\n this.input.focus();\n }\n });\n }\n\n public getSelected() {\n return {country: this.lastCountrySelected, code: this.lastCountryCodeSelected};\n }\n\n public hidePicker = () => {\n if(this.hideTimeout !== undefined) return;\n this.selectWrapper.classList.remove('active');\n this.hideTimeout = window.setTimeout(() => {\n this.selectWrapper.classList.add('hide');\n this.hideTimeout = undefined;\n }, 200);\n }\n\n public selectCountryByTarget = (target: HTMLElement) => {\n const defaultName = target.querySelector('[data-default-name]').dataset.defaultName;\n const phoneCodeEl = target.querySelector('.phone-code');\n const phoneCode = phoneCodeEl?.innerText;\n const countryCode = phoneCode && phoneCode.replace(/\\D/g, '');\n\n replaceContent(this.input, i18n(defaultName as any));\n this.simulateInputEvent();\n this.lastCountrySelected = countries.find((c) => c.default_name === defaultName);\n this.lastCountryCodeSelected = countryCode && this.lastCountrySelected.country_codes.find((_countryCode) => _countryCode.country_code === countryCode);\n\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n this.hidePicker();\n }\n\n public selectCountryByIso2(iso2: string) {\n this.selectCountryByTarget(this.liMap.get(iso2)[0]);\n }\n\n public override(country: HelpCountry, code: HelpCountryCode, countryName?: string) {\n replaceContent(this.input, country ? i18n(country.default_name as any) : countryName);\n this.lastCountrySelected = country;\n this.lastCountryCodeSelected = code;\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputFile} from '../layer';\nimport AvatarEdit from './avatarEdit';\nimport AvatarElement from './avatar';\nimport InputField from './inputField';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonCorner from './buttonCorner';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\n\nexport default class EditPeer {\n public nextBtn: HTMLButtonElement;\n\n public uploadAvatar: () => Promise;\n public avatarEdit: AvatarEdit;\n public avatarElem: AvatarElement;\n\n private inputFields: InputField[];\n private listenerSetter: ListenerSetter;\n\n private peerId: PeerId;\n\n private _disabled = false;\n private avatarSize = 120;\n\n constructor(options: {\n peerId?: EditPeer['peerId'],\n inputFields: EditPeer['inputFields'],\n listenerSetter: ListenerSetter,\n doNotEditAvatar?: boolean,\n withoutAvatar?: boolean,\n nextBtn?: HTMLButtonElement,\n avatarSize?: number,\n popupOptions?: ConstructorParameters[1]\n }) {\n safeAssign(this, options);\n\n this.peerId ||= NULL_PEER_ID;\n\n if(!this.nextBtn) {\n this.nextBtn = ButtonCorner({icon: 'check'});\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\n this.handleChange = () => {\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\n };\n }\n\n if(!options.withoutAvatar) {\n this.avatarElem = new AvatarElement();\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\n this.avatarElem.updateWithOptions({peerId: this.peerId});\n\n if(!options.doNotEditAvatar) {\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n this.handleChange();\n this.avatarElem.remove();\n }, options.popupOptions);\n\n this.avatarEdit.container.append(this.avatarElem);\n }\n }\n\n this.inputFields.forEach((inputField) => {\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\n });\n\n this.handleChange();\n }\n\n public get disabled() {\n return this._disabled;\n }\n\n public set disabled(value) {\n this._disabled = value;\n this.inputFields.forEach((inputField) => inputField.input.toggleAttribute('disabled', value));\n this.handleChange();\n }\n\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\n this.disabled = true;\n promise.then(() => {\n if(unlockOnSuccess) {\n this.disabled = false;\n }\n }, () => {\n this.disabled = false;\n });\n }\n\n public isChanged = () => {\n if(this.uploadAvatar) {\n return true;\n }\n\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\n this.inputFields.forEach((inputField) => {\n if(inputField.isValid()) {\n if(inputField.isChanged()) {\n ++changedLength;\n }\n\n if(inputField.required) {\n ++requiredValidLength;\n }\n }\n\n if(inputField.required) {\n ++requiredLength;\n }\n });\n\n return requiredLength === requiredValidLength && changedLength > 0;\n };\n\n public handleChange = () => {\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\n };\n}\n","/*\n * 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, EMOTICONSSTICKERGROUP} from '..';\nimport GifsMasonry from '../../gifsMasonry';\nimport Scrollable from '../../scrollable';\nimport {putPreloader} from '../../putPreloader';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\n\nexport default class GifsTab implements EmoticonsTab {\n public content: HTMLElement;\n public scrollable: Scrollable;\n public tabId: number;\n\n constructor(private managers: AppManagers) {\n\n }\n\n init() {\n this.content = document.getElementById('content-gifs');\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\n attachClickEvent(gifsContainer, EmoticonsDropdown.onMediaClick);\n\n const scroll = this.scrollable = new Scrollable(this.content, 'GIFS');\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\n const preloader = putPreloader(this.content, true);\n\n this.managers.appDocsManager.getGifs().then((docs) => {\n docs.forEach((doc) => {\n masonry.add(doc);\n });\n\n preloader.remove();\n });\n\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\n\n this.init = null;\n }\n\n onClose() {\n\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {AppInlineBotsManager} from '../../../lib/appManagers/appInlineBotsManager';\nimport GifsMasonry from '../../gifsMasonry';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {NULL_PEER_ID} from '../../../lib/mtproto/mtproto_config';\n\nconst ANIMATIONGROUP: AnimationItemGroup = 'GIFS-SEARCH';\n\nexport default class AppGifsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private gifsDiv: HTMLDivElement;\n\n private nextOffset = '';\n private loadedAll = false;\n\n private gifBotPeerId: PeerId;\n private masonry: GifsMasonry;\n\n private searchPromise: ReturnType;\n\n public init() {\n this.container.id = 'search-gifs-container';\n\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\n this.reset();\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.gifsDiv = document.createElement('div');\n this.gifsDiv.classList.add('gifs-masonry');\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable.append(this.gifsDiv);\n\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\n // this.backBtn.parentElement.append(this.inputSearch.container);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.search('', true);\n\n this.scrollable.onScrolledBottom = () => {\n this.search(this.inputSearch.value, false);\n };\n });\n }\n\n private onGifsClick = async(e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'gif');\n if(!target) return;\n\n const fileId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(fileId)) {\n if(mediaSizes.isMobile) {\n appSidebarRight.onCloseBtnClick();\n }\n } else {\n console.warn('got no doc by id:', fileId);\n }\n };\n\n public onClose() {\n this.scrollable.onScrolledBottom = () => {};\n }\n\n public onCloseAfterTimeout() {\n this.reset();\n this.gifsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\n this.inputSearch.remove();\n return super.onCloseAfterTimeout();\n }\n\n private reset() {\n this.searchPromise = null;\n this.nextOffset = '';\n this.loadedAll = false;\n this.masonry.clear();\n }\n\n public async search(query: string, newSearch = true) {\n if(this.searchPromise || this.loadedAll) return;\n\n if(!this.gifBotPeerId) {\n this.gifBotPeerId = (await this.managers.appUsersManager.resolveUsername('gif')).id.toPeerId(false);\n }\n\n try {\n this.searchPromise = this.managers.appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\n const {results, next_offset} = await this.searchPromise;\n\n if(this.inputSearch.value !== query) {\n return;\n }\n\n this.searchPromise = null;\n this.nextOffset = next_offset;\n if(newSearch) {\n this.gifsDiv.innerHTML = '';\n }\n\n if(results.length) {\n results.forEach((result) => {\n if(result._ === 'botInlineMediaResult' && result.document) {\n this.masonry.add(result.document as MyDocument);\n }\n });\n } else {\n this.loadedAll = true;\n }\n\n this.scrollable.onScroll();\n } catch(err) {\n this.searchPromise = null;\n console.error('gifs loading error:', err);\n throw err;\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 {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport PopupStickers from '../../popups/stickers';\nimport animationIntersector from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {StickerSet, StickerSetCovered} from '../../../layer';\nimport {i18n} from '../../../lib/langPack';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport wrapSticker from '../../wrappers/sticker';\n\nexport default class AppStickersTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private setsDiv: HTMLDivElement;\n private lazyLoadQueue: LazyLoadQueue;\n\n public init() {\n this.container.id = 'stickers-container';\n this.container.classList.add('chatlist-container');\n\n this.lazyLoadQueue = new LazyLoadQueue();\n\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.setsDiv = document.createElement('div');\n this.setsDiv.classList.add('sticker-sets');\n this.scrollable.append(this.setsDiv);\n\n attachStickerViewerListeners({listenTo: this.setsDiv, listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.setsDiv, (e) => {\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\n if(sticker) {\n const docId = sticker.dataset.docId;\n appImManager.chat.input.sendMessageWithDocument(docId);\n return;\n }\n\n const target = findUpClassName(e.target, 'sticker-set');\n if(!target) return;\n\n const id = target.dataset.stickerSet as string;\n const access_hash = target.dataset.access_hash as string;\n\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\n if(button) {\n e.preventDefault();\n e.cancelBubble = true;\n\n button.setAttribute('disabled', 'true');\n\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n this.managers.appStickersManager.toggleStickerSet(full.set).then((changed) => {\n if(changed) {\n button.textContent = '';\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n button.classList.toggle('gray', !!full.set.installed_date);\n }\n }).finally(() => {\n // button.style.width = set.installed_date ? '68px' : '52px';\n button.removeAttribute('disabled');\n });\n });\n } else {\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n new PopupStickers(full.set).show();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.renderFeatured();\n });\n }\n\n public onCloseAfterTimeout() {\n this.setsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n return super.onCloseAfterTimeout();\n }\n\n public renderSet(set: StickerSet.stickerSet) {\n // console.log('renderSet:', set);\n const div = document.createElement('div');\n div.classList.add('sticker-set');\n\n const header = document.createElement('div');\n header.classList.add('sticker-set-header');\n\n const details = document.createElement('div');\n details.classList.add('sticker-set-details');\n details.innerHTML = `
`;\n\n setInnerHTML(details.firstElementChild, wrapEmojiText(set.title));\n\n const countDiv = document.createElement('div');\n countDiv.classList.add('sticker-set-count');\n countDiv.append(i18n('Stickers', [set.count]));\n details.append(countDiv);\n\n const button = document.createElement('button');\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n // button.style.width = set.installed_date ? '68px' : '52px';\n\n if(set.installed_date) {\n button.classList.add('gray');\n }\n\n // ripple(button);\n\n header.append(details, button);\n\n const stickersDiv = document.createElement('div');\n stickersDiv.classList.add('sticker-set-stickers');\n\n const count = Math.min(5, set.count);\n for(let i = 0; i < count; ++i) {\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add('sticker-set-sticker');\n\n stickersDiv.append(stickerDiv);\n }\n\n this.managers.appStickersManager.getStickerSet(set).then((set) => {\n // console.log('renderSet got set:', set);\n\n for(let i = 0; i < count; ++i) {\n const div = stickersDiv.children[i] as HTMLDivElement;\n const doc = set.documents[i];\n if(doc._ === 'documentEmpty') {\n continue;\n }\n\n wrapSticker({\n doc,\n div,\n lazyLoadQueue: this.lazyLoadQueue,\n group: 'STICKERS-SEARCH',\n /* play: false,\n loop: false, */\n play: true,\n loop: true,\n width: 68,\n height: 68,\n withLock: true\n });\n }\n });\n\n /* const onMouseOver = () => {\n const animations: AnimationItem['animation'][] = [];\n for(let i = 0; i < count; ++i) {\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\n const animationItem = animationIntersector.getAnimation(stickerDiv);\n if(!animationItem) continue;\n\n const animation = animationItem.animation;\n\n animations.push(animation);\n animation.loop = true;\n animation.play();\n }\n\n div.addEventListener('mouseout', () => {\n animations.forEach((animation) => {\n animation.loop = false;\n });\n\n div.addEventListener('mouseover', onMouseOver, {once: true});\n }, {once: true});\n };\n\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\n\n div.dataset.stickerSet = '' + set.id;\n div.dataset.access_hash = '' + set.access_hash;\n div.dataset.title = set.title;\n\n div.append(header, stickersDiv);\n\n this.setsDiv.append(div);\n }\n\n public renderFeatured() {\n return this.managers.appStickersManager.getFeaturedStickers().then((coveredSets) => {\n if(this.inputSearch.value) {\n return;\n }\n\n coveredSets = this.filterRendered('', coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\n });\n });\n }\n\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\n coveredSets = coveredSets.slice();\n\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\n forEachReverse(children, el => {\n const id = el.dataset.stickerSet;\n const index = coveredSets.findIndex((covered) => covered.set.id === id);\n\n if(index !== -1) {\n coveredSets.splice(index, 1);\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\n el.remove();\n }\n });\n\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n\n return coveredSets;\n }\n\n public search(query: string) {\n if(!query) {\n return this.renderFeatured();\n }\n\n return this.managers.appStickersManager.searchStickerSets(query, false).then((coveredSets) => {\n if(this.inputSearch.value !== query) {\n return;\n }\n\n // console.log('search result:', coveredSets);\n\n coveredSets = this.filterRendered(query, coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\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_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport {horizontalMenu} from '../horizontalMenu';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable, {ScrollableX} from '../scrollable';\nimport appSidebarRight from '../sidebarRight';\nimport StickyIntersector from '../stickyIntersector';\nimport EmojiTab from './tabs/emoji';\nimport GifsTab from './tabs/gifs';\nimport StickersTab, {EmoticonsTabC, StickersTabCategory} from './tabs/stickers';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport AppGifsTab from '../sidebarRight/tabs/gifs';\nimport AppStickersTab from '../sidebarRight/tabs/stickers';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport whichChild from '../../helpers/dom/whichChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport pause from '../../helpers/schedulers/pause';\nimport {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport type LazyLoadQueueIntersector from '../lazyLoadQueueIntersector';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport noop from '../../helpers/noop';\nimport {FocusDirection, ScrollOptions} from '../../helpers/fastSmoothScroll';\nimport BezierEasing from '../../vendor/bezier-easing';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {getCaretPosF} from '../../helpers/dom/getCaretPosNew';\nimport ListenerSetter from '../../helpers/listenerSetter';\n\nexport const EMOTICONSSTICKERGROUP: AnimationItemGroup = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n content: HTMLElement;\n scrollable: Scrollable;\n menuScroll?: ScrollableX;\n tabId: number;\n init: () => void;\n onOpen?: () => void;\n onOpened?: () => void;\n onClose?: () => void;\n onClosed?: () => void;\n}\n\nconst easing = BezierEasing(0.42, 0.0, 0.58, 1.0);\nconst scrollOptions: Partial = {\n forceDuration: 200,\n transitionFunction: easing\n};\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue(1);\n\n private emojiTab: EmojiTab;\n private stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n private managers: AppManagers;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement,\n ignoreOutClickClassName: 'input-message-input'\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 const tab = this.tab;\n tab.onOpen?.();\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlockAndRefresh();\n\n // this.container.classList.remove('disable-hover');\n\n const tab = this.tab;\n tab.onOpened?.();\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 const tab = this.tab;\n tab.onClose?.();\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 const tab = this.tab;\n tab.onClosed?.();\n });\n }\n\n public get tab() {\n return this.tabs[this.tabId];\n }\n\n public init() {\n this.managers = rootScope.managers;\n this.emojiTab = new EmojiTab({managers: this.managers});\n this.stickersTab = new StickersTab(this.managers);\n this.gifsTab = new GifsTab(this.managers);\n\n this.tabs = {};\n [this.emojiTab, this.stickersTab, this.gifsTab].forEach((tab, idx) => {\n tab.tabId = idx;\n this.tabs[idx] = tab;\n });\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.container.prepend(this.emojiTab.container, this.stickersTab.container);\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const {tab} = this;\n tab.init?.();\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 === this.stickersTab.tabId) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n appSidebarRight.createTab(AppStickersTab).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n appSidebarRight.createTab(AppGifsTab).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n attachClickEvent(this.deleteBtn, (e) => {\n cancelEvent(e);\n const input = appImManager.chat.input.messageInput;\n // RichInputHandler.getInstance().makeFocused(appImManager.chat.input.messageInput);\n let range = RichInputHandler.getInstance().getSavedRange(input);\n if(!range) {\n range = document.createRange();\n range.setStartAfter(input.lastChild);\n }\n\n const newRange = range.cloneRange();\n // if(range.endOffset === range.startOffset && range.endContainer === range.startContainer) {\n if(range.collapsed) {\n const {node, offset} = getCaretPosF(input, range.endContainer, range.endOffset);\n let newStartNode: Node;\n if(offset) {\n newStartNode = node;\n } else {\n newStartNode = node.previousSibling;\n if(!newStartNode) {\n return;\n }\n\n while(newStartNode.nodeType === newStartNode.TEXT_NODE && !newStartNode.nodeValue && (newStartNode = newStartNode.previousSibling)) {\n\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && !(newStartNode as HTMLElement).isContentEditable) {\n return;\n }\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && (newStartNode as any).tagName === 'IMG') {\n newRange.selectNode(newStartNode);\n } else {\n const text = [...newStartNode.textContent];\n let t: string;\n if(offset) {\n let length = 0;\n t = text.find((text) => (length += text.length, length >= offset));\n } else {\n t = text.pop() || '';\n }\n\n const newOffset = offset ? offset - t.length : newStartNode.textContent.length - t.length;\n newRange.setStart(newStartNode, newOffset);\n }\n }\n\n newRange.deleteContents();\n\n appImManager.chat.input.messageInputField.simulateInputEvent();\n // const selection = document.getSelection();\n // if(selection.isCollapsed) {\n // selection.modify('extend', 'backward', 'character');\n // }\n\n // selection.deleteFromDocument();\n // (document.activeElement as HTMLElement).blur();\n\n // document.execCommand('undo', false, null);\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\n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE && false;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? this.stickersTab.tabId : this.emojiTab.tabId;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n simulateClickEvent(this.tabsEl.children[INIT_TAB_ID + 1] as HTMLElement);\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n let lastMouseMoveEvent: MouseEvent, mouseMoveEventAttached = false;\n const onMouseMove = (e: MouseEvent) => {\n lastMouseMoveEvent = e;\n };\n overlayCounter.addEventListener('change', (isActive) => {\n if(isActive) {\n if(!mouseMoveEventAttached) {\n document.body.addEventListener('mousemove', onMouseMove);\n mouseMoveEventAttached = true;\n }\n } else if(mouseMoveEventAttached) {\n document.body.removeEventListener('mousemove', onMouseMove);\n if(lastMouseMoveEvent) {\n this.onMouseOut(lastMouseMoveEvent);\n }\n }\n });\n }\n\n appImManager.addEventListener('peer_changing', () => {\n this.toggle(false);\n });\n appImManager.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n public getElement() {\n return this.element;\n }\n\n public scrollTo(tab: EmoticonsTab, element: HTMLElement) {\n tab.scrollable.scrollIntoViewNew({\n element: element as HTMLElement,\n axis: 'y',\n position: 'start',\n ...scrollOptions\n });\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n const {tab} = this;\n this.scrollTo(tab, tab.scrollable.container.firstElementChild as HTMLElement);\n return;\n }\n\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === this.emojiTab.tabId);\n this.deleteBtn.classList.toggle('hide', this.tabId !== this.emojiTab.tabId);\n };\n\n private checkRights = async() => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const [canSendStickers, canSendGifs] = await Promise.all([\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers'),\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs')\n ]);\n\n tabsElements[this.stickersTab.tabId + 1].toggleAttribute('disabled', !canSendStickers);\n tabsElements[this.gifsTab.tabId + 1].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== (this.emojiTab.tabId + 1) && (!canSendStickers || !canSendGifs)) {\n this.selectTab(this.emojiTab.tabId, false);\n }\n };\n\n public static menuOnClick = (\n emoticons: EmoticonsTabC,\n menu: HTMLElement,\n scrollable: Scrollable,\n menuScroll?: ScrollableX,\n prevTab?: StickersTabCategory,\n listenerSetter?: ListenerSetter\n ) => {\n let jumpedTo = -1;\n\n const scrollToTab = (tab: typeof prevTab, f?: boolean) => {\n const m = tab.menuScroll || menuScroll;\n if(m) {\n m.scrollIntoViewNew({\n element: tab.elements.menuTab,\n position: 'center',\n axis: 'x',\n getElementPosition: f ? ({elementPosition}) => {\n return elementPosition - 106;\n } : undefined,\n ...scrollOptions\n });\n }\n };\n\n const setActive = (tab: typeof prevTab, scroll = true) => {\n if(tab === prevTab) {\n return false;\n }\n\n let f = false;\n if(prevTab) {\n prevTab.elements.menuTab.classList.remove('active');\n if(prevTab.menuScroll && prevTab.menuScroll !== tab.menuScroll) {\n f = true;\n // scroll to first\n prevTab.menuScroll.container.parentElement.classList.remove('active');\n prevTab.menuScroll.scrollIntoViewNew({\n element: prevTab.menuScroll.container.firstElementChild as HTMLElement,\n forceDirection: scroll ? undefined : FocusDirection.Static,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n }\n\n tab.elements.menuTab.classList.add('active');\n\n if(tab.menuScroll) {\n tab.menuScroll.container.parentElement.classList.add('active');\n scroll && menuScroll.scrollIntoViewNew({\n element: tab.menuScroll.container.parentElement,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n\n if(prevTab) {\n scrollToTab(tab, f);\n }\n\n prevTab = tab;\n\n return true;\n };\n\n const setActiveStatic = (tab: typeof prevTab) => {\n if(prevTab?.local) {\n return;\n }\n\n emoticons.scrollable.scrollTop = tab.elements.container.offsetTop + 1;\n const s = emoticons.menuScroll.container;\n const e = tab.elements.menuTab;\n s.scrollLeft = e.offsetLeft - s.clientWidth / 2 + e.offsetWidth / 2;\n setActive(tab, false);\n };\n\n let scrollingToContent = false;\n const stickyIntersector = new StickyIntersector(scrollable.container, (stuck, target) => {\n if(scrollingToContent) {\n return;\n }\n\n // console.log('sticky scrollTop', stuck, target, scrollable.container.scrollTop, jumpedTo);\n\n if(Math.abs(jumpedTo - scrollable.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const tab = emoticons.getCategoryByContainer(target);\n const which = whichChild(target);\n if(!stuck && (which || tab.menuScroll)) {\n return;\n }\n\n setActive(tab);\n });\n\n attachClickEvent(menu, (e) => {\n let target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-div-item');\n if(!target) {\n target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-inner');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n target = target.firstElementChild.firstElementChild as HTMLElement;\n }\n\n const which = whichChild(target);\n\n const tab = emoticons.getCategoryByMenuTab(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(setActive(tab)) {\n // scrollToTab(tab);\n // return;\n }\n\n let offsetTop = 0, additionalOffset = 0;\n if(which > 0 || tab.menuScroll) {\n const element = tab.elements.container;\n additionalOffset = 1;\n offsetTop = element.offsetTop + additionalOffset; // * due to stickyIntersector\n }\n\n jumpedTo = offsetTop;\n\n scrollingToContent = true;\n scrollable.scrollIntoViewNew({\n element: offsetTop ? tab.elements.container : scrollable.container.firstElementChild,\n position: 'start',\n axis: 'y',\n getElementPosition: offsetTop ? ({elementPosition}) => elementPosition + additionalOffset : undefined,\n ...scrollOptions\n }).finally(() => {\n setActive(tab);\n scrollingToContent = false;\n });\n }, {listenerSetter});\n\n const a = scrollable.onAdditionalScroll ? scrollable.onAdditionalScroll.bind(scrollable) : noop;\n scrollable.onAdditionalScroll = () => {\n emoticons.content.parentElement.classList.toggle('scrolled-top', !scrollable.scrollTop);\n a();\n };\n\n return {stickyIntersector, setActive, setActiveStatic};\n };\n\n public static onMediaClick = async(e: {target: EventTarget | Element}, clearDraft = false, silent?: boolean) => {\n const target = findUpTag(e.target as HTMLElement, 'DIV');\n if(!target) return false;\n\n const docId = target.dataset.docId;\n if(!docId) return false;\n\n return this.sendDocId(docId, clearDraft, silent);\n };\n\n public static async sendDocId(docId: DocId, clearDraft?: boolean, silent?: boolean) {\n if(await appImManager.chat.input.sendMessageWithDocument(docId, undefined, clearDraft, silent)) {\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:', docId);\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","/*\n * 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, EMOTICONSSTICKERGROUP} from '..';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {fastRaf} from '../../../helpers/schedulers';\nimport pause from '../../../helpers/schedulers/pause';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport {emojiFromCodePoints} from '../../../vendor/emoji';\nimport {putPreloader} from '../../putPreloader';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport IS_EMOJI_SUPPORTED from '../../../environment/emojiSupport';\nimport IS_TOUCH_SUPPORTED from '../../../environment/touchSupport';\nimport blurActiveElement from '../../../helpers/dom/blurActiveElement';\nimport Emoji from '../../../config/emoji';\nimport fixEmoji from '../../../lib/richTextProcessor/fixEmoji';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport wrapSingleEmoji from '../../../lib/richTextProcessor/wrapSingleEmoji';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {EmoticonsTabC, StickersTabCategory} from './stickers';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport {Document, StickerSet} from '../../../layer';\nimport {CustomEmojiElement, CustomEmojiRendererElement} from '../../../lib/richTextProcessor/wrapRichText';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport PopupStickers from '../../popups/stickers';\nimport {hideToast, toastNew} from '../../toast';\nimport safeAssign from '../../../helpers/object/safeAssign';\nimport type {AppStickersManager} from '../../../lib/appManagers/appStickersManager';\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container?: HTMLElement, prepend = false, unify = false) {\n // const emoji = details.unified;\n // const emoji = (details.unified as string).split('-')\n // .reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: DocumentFragment;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = wrapSingleEmoji(emoji);\n } else {\n emoji = fixEmoji(emoji);\n kek = wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n // console.log(kek);\n\n spanEmoji.append(kek);\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild?.tagName === 'IMG') {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n\n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n // spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n // spanEmoji.setAttribute('emoji', emoji);\n if(container) {\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n }\n\n return spanEmoji;\n}\n\nexport function getEmojiFromElement(element: HTMLElement): {docId?: DocId, emoji: string} {\n const superEmoji = findUpClassName(element, 'super-emoji');\n if(!superEmoji) return;\n\n const firstElementChild = superEmoji.firstElementChild as HTMLElement;\n if(firstElementChild && firstElementChild.classList.contains('custom-emoji')) {\n return {emoji: firstElementChild.dataset.stickerEmoji, docId: firstElementChild.dataset.docId} as const;\n } else {\n if(element.nodeType === element.TEXT_NODE) return {emoji: element.nodeValue};\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n\n return {emoji: element.getAttribute('alt') || element.innerText} as const;\n }\n}\n\nconst EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = 'Emoji.Recent';\nconst EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [EMOJI_RECENT_ID, 'recent'];\nconst CUSTOM_EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = '';\nconst CUSTOM_EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [CUSTOM_EMOJI_RECENT_ID, ''];\nconst EMOJI_CATEGORIES: [LangPackKey | '', string][] = [\n ['Emoji.SmilesAndPeople', 'smile'],\n ['Emoji.AnimalsAndNature', 'animals'],\n ['Emoji.FoodAndDrink', 'eats'],\n ['Emoji.TravelAndPlaces', 'car'],\n ['Emoji.ActivityAndSport', 'sport'],\n ['Emoji.Objects', 'lamp'],\n // ['Emoji.Symbols', 'info'],\n ['Emoji.Flags', 'flag'],\n ['Skin Tones' as any, '']\n];\n\nlet sorted: Map<(typeof EMOJI_CATEGORIES)[0], string[]>;\nfunction prepare() {\n if(sorted) {\n return sorted;\n }\n\n const a: Array<[(typeof EMOJI_CATEGORIES)[0], string[]]> = [\n [CUSTOM_EMOJI_RECENT_CATEGORY, []],\n [EMOJI_RECENT_CATEGORY, []]\n ];\n\n sorted = new Map(a);\n for(const emoji in Emoji) {\n const details = Emoji[emoji];\n const i = '' + details;\n const category = EMOJI_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 sorted.delete(EMOJI_CATEGORIES.pop());\n EMOJI_CATEGORIES.unshift(CUSTOM_EMOJI_RECENT_CATEGORY, EMOJI_RECENT_CATEGORY);\n const order = EMOJI_CATEGORIES.map(([id]) => id);\n const entries = [...sorted.entries()].sort((a, b) => order.indexOf(a[0][0]) - order.indexOf(b[0][0]));\n sorted = new Map(entries);\n\n return sorted;\n}\n\nconst EMOJI_ELEMENT_SIZE = makeMediaSize(42, 42);\nconst RECENT_MAX_LENGTH = 32;\n\ntype EmojiTabItem = {element: HTMLElement} & ReturnType;\ntype EmojiTabCategory = StickersTabCategory;\nexport default class EmojiTab extends EmoticonsTabC {\n private closeScrollTop: number;\n private menuInnerScroll: ScrollableX;\n private isStandalone?: boolean;\n private noRegularEmoji?: boolean;\n private stickerSetId?: Parameters[0];\n private onClick: (emoji: EmojiTabItem) => void;\n private activeEmoji: ReturnType;\n private activeElements: EmojiTabItem[];\n\n constructor(options: {\n managers: AppManagers,\n isStandalone?: boolean,\n noRegularEmoji?: boolean,\n stickerSetId?: EmojiTab['stickerSetId'],\n onClick?: EmojiTab['onClick']\n }) {\n super(\n options.managers,\n 'super-emojis',\n () => EMOJI_ELEMENT_SIZE,\n 16,\n 4,\n 0\n );\n\n safeAssign(this, options);\n this.container.classList.add('emoji-padding');\n this.content.id = 'content-emoji';\n this.activeElements = [];\n }\n\n private onCategoryVisibility = ({target, visible}: Pick) => {\n const category = this.categoriesMap.get(target);\n // console.log(target, visible, category);\n // if(category.local) return;\n\n const renderer = category.elements.renderer;\n const newChildren: HTMLElement[] = [];\n if(renderer) {\n newChildren.push(renderer);\n const customEmojis: Parameters[0] = new Map();\n if(visible) {\n newChildren.push(...category.items.map(({docId, element}) => {\n if(!docId) {\n return element;\n }\n\n // return element;\n\n // if(element.firstElementChild) {\n // return element;\n // }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear(false);\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n // element.append(customEmojiElement);\n return element;\n }));\n\n renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, undefined, false);\n } else {\n renderer.clearCanvas();\n renderer.middlewareHelper.clean();\n }\n } else if(visible) {\n newChildren.push(...category.items.map(({element}) => element));\n }\n\n // if(visible)\n category.elements.items.replaceChildren(...newChildren);\n\n if(renderer && !visible) {\n const customEmojis: Parameters[0] = new Map();\n category.items.forEach(({docId, element}) => {\n if(!docId) {\n return;\n }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear();\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n });\n\n /* const promise = */renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, true);\n // promise.then(() => {\n // customEmojis.forEach((elements) => {\n // elements.forEach((element) => {\n // if(!element.innerHTML) {\n // console.log('no thumb', element);\n // // debugger;\n // }\n // });\n // });\n\n // const set = customEmojis.get('5766933926429854499');\n // console.log(`wrapped ${customEmojis.size} thumbs`, set && set.values().next().value.innerHTML);\n // });\n }\n\n // if(!visible) {\n // const customEmojis: Parameters[0] = {};\n // category.items.forEach((item) => {\n // const {element, document} = item;\n // if(!element.firstElementChild) {\n // return;\n // }\n\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n // customEmojis[customEmojiElement.docId] = new Set([customEmojiElement]);\n // element.firstElementChild.replaceWith(customEmojiElement);\n // });\n\n // renderer.add(customEmojis, EmoticonsDropdown.lazyLoadQueue);\n // }\n };\n\n public destroy() {\n super.destroy();\n this.menuInnerScroll?.destroy();\n }\n\n public init() {\n super.init();\n this.init = undefined;\n\n const intersectionOptions: IntersectionObserverInit = {\n root: this.isStandalone ? this.content : emoticonsDropdown.getElement()\n };\n\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll, undefined, this.listenerSetter);\n\n const preloader = putPreloader(this.content, true);\n\n let innerScrollWrapper: HTMLElement;\n\n if(!this.isStandalone) {\n const x = this.menuInnerScroll = new ScrollableX(undefined);\n x.container.classList.add('menu-horizontal-inner-scroll');\n\n innerScrollWrapper = document.createElement('div');\n innerScrollWrapper.classList.add('menu-horizontal-inner');\n innerScrollWrapper.append(x.container);\n }\n\n let preparedMap: ReturnType;\n prepare();\n if(!this.noRegularEmoji) {\n preparedMap = prepare();\n } else {\n preparedMap = new Map([\n [[CUSTOM_EMOJI_RECENT_CATEGORY[0], 'recent'], []]\n // [EMOJI_RECENT_CATEGORY, []]\n ]);\n }\n\n preparedMap.forEach((emojis, [titleLangPackKey, icon]) => {\n const category = this.createLocalCategory(titleLangPackKey, titleLangPackKey, icon, !icon);\n category.elements.container.classList.remove('hide');\n category.elements.items.classList.add(icon && !this.isStandalone ? 'is-local' : 'not-local');\n\n emojis.forEach((unified) => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n const 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 this.addEmojiToCategory({\n category,\n emoji: {emoji},\n batch: true\n });\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n });\n\n const promise = Promise.all([\n this.isStandalone ? undefined : pause(200),\n !this.noRegularEmoji && this.managers.appEmojiManager.getRecentEmojis('native'),\n !this.isStandalone && this.managers.appEmojiManager.getRecentEmojis('custom'),\n this.stickerSetId && this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),\n this.managers.appEmojiManager.getCustomEmojis()\n ]).then(([_, recent, recentCustom, mainSet, sets]) => {\n preloader.remove();\n\n if(mainSet) {\n recentCustom = mainSet.documents.map((doc) => doc.id);\n }\n\n const recentCategory = this.categories[EMOJI_RECENT_ID];\n const recentCustomCategory = this.categories[CUSTOM_EMOJI_RECENT_ID];\n\n if(!this.isStandalone) {\n const a = [\n recentCategory && [recentCategory, recent] as const,\n recentCustomCategory && [recentCustomCategory, recentCustom] as const\n ];\n\n a.filter(Boolean).forEach(([category, recent]) => {\n category.limit = RECENT_MAX_LENGTH;\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n });\n }\n\n if(recentCategory && recent) for(const emoji of recent) {\n this.addEmojiToCategory({\n category: recentCategory,\n emoji: {emoji},\n batch: true\n });\n }\n\n if(recentCustomCategory) {\n this.createRendererForCategory(recentCustomCategory);\n if(recentCustom) for(const docId of recentCustom) {\n this.addEmojiToCategory({\n category: recentCustomCategory,\n emoji: {emoji: '', docId},\n batch: true\n });\n }\n recentCustomCategory.elements.container.style.paddingTop = '.5rem';\n }\n\n EMOJI_CATEGORIES.forEach(([id]) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.toggleLocalCategory(category, true);\n\n if(id !== EMOJI_RECENT_ID && id !== CUSTOM_EMOJI_RECENT_ID) {\n category.menuScroll = this.menuInnerScroll;\n this.menuInnerScroll.container.append(category.elements.menuTab);\n }\n });\n\n this.resizeCategories();\n\n recentCategory && innerScrollWrapper && recentCategory.elements.menuTab.after(innerScrollWrapper);\n\n sets.sets.forEach((set) => {\n this.renderStickerSet(set);\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleCustomCategory();\n });\n\n this.listenerSetter.add(rootScope)('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.positionCategory(category, true);\n\n this.listenerSetter.add(emoticonsDropdown)('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }));\n\n const toggleRenderers = (ignore: boolean) => {\n for(const id in this.categories) {\n const category = this.categories[id];\n const renderer = category.elements.renderer;\n if(renderer) {\n renderer.ignoreSettingDimensions = ignore;\n if(!ignore) {\n renderer.setDimensionsFromRect(undefined, true);\n }\n }\n }\n };\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('opened', () => {\n toggleRenderers(false);\n });\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('close', () => {\n toggleRenderers(true);\n });\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!this.categories[set.id] && set.pFlags.emojis) {\n this.renderStickerSet(set, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n const category = this.categories[set.id];\n if(this.deleteCategory(category)) {\n const {renderer} = category.elements;\n if(renderer) {\n renderer.middlewareHelper.clean();\n }\n }\n });\n\n !this.isStandalone && this.listenerSetter.add(rootScope)('emoji_recent', this.postponedEvent((emoji) => {\n const category = this.categories[emoji.docId ? CUSTOM_EMOJI_RECENT_ID : EMOJI_RECENT_ID];\n if(!category) {\n return;\n }\n\n const verify: (item: EmojiTabItem) => boolean = emoji.docId ?\n (item) => item.docId === emoji.docId :\n (item) => item.emoji === emoji.emoji;\n const found = findAndSplice(category.items, verify);\n if(found) {\n category.items.unshift(found);\n if(this.isCategoryVisible(category)) {\n const {renderer} = category.elements;\n positionElementByIndex(found.element, category.elements.items, renderer ? 1 : 0, -1);\n renderer?.forceRender();\n }\n } else {\n this.addEmojiToCategory({\n category,\n emoji,\n batch: false,\n prepend: true\n });\n }\n\n if(this.closeScrollTop === 0) {\n this.menuOnClickResult.setActive(emoji.docId ? this.categories[EMOJI_RECENT_ID] : category);\n }\n }));\n\n !this.isStandalone && this.listenerSetter.add(appImManager)('peer_changed', () => {\n this.toggleCustomCategory();\n });\n\n this.toggleCustomCategory();\n\n this.menuOnClickResult.setActive(recentCategory ?? recentCustomCategory);\n });\n\n attachClickEvent(this.content, this.onContentClick, {listenerSetter: this.listenerSetter});\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: this.listenerSetter});\n\n return promise;\n }\n\n private renderStickerSet(set: StickerSet.stickerSet, prepend?: boolean) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n this.positionCategory(category, prepend);\n const {container, menuTabPadding} = category.elements;\n category.elements.items.classList.add('not-local');\n category.elements.container.classList.add('is-premium-set');\n category.elements.title.classList.add('tgico');\n\n this.createRendererForCategory(category);\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n promise.then(({documents}) => {\n documents.forEach((document) => {\n this.addEmojiToCategory({\n category,\n emoji: {docId: document.id, emoji: (document as Document.document).stickerEmojiRaw},\n batch: true\n });\n });\n\n // if(this.isCategoryVisible(category)) {\n // category.elements.items.append(...category.items.map(({element}) => element));\n // }\n\n this.onCategoryVisibility({target: category.elements.container, visible: this.isCategoryVisible(category)});\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private get peerId() {\n return appImManager.chat.peerId;\n }\n\n public getCustomCategory() {\n return this.categories[CUSTOM_EMOJI_RECENT_ID];\n }\n\n private toggleCustomCategory() {\n const category = this.categories[CUSTOM_EMOJI_RECENT_ID];\n const hasPremium = rootScope.premium || this.peerId === rootScope.myId;\n const canSeeCustomCategory = hasPremium || this.isStandalone;\n super.toggleLocalCategory(category, !!category.items.length && canSeeCustomCategory);\n this.content.classList.toggle('has-premium', hasPremium);\n }\n\n protected toggleLocalCategory(category: EmojiTabCategory, visible: boolean) {\n if(category.id === CUSTOM_EMOJI_RECENT_ID) {\n this.toggleCustomCategory();\n return;\n }\n\n super.toggleLocalCategory(category, visible);\n }\n\n private createRendererForCategory(category: EmojiTabCategory) {\n const renderer = CustomEmojiRendererElement.create({\n animationGroup: EMOTICONSSTICKERGROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji\n });\n\n category.elements.renderer = renderer;\n category.elements.items.append(renderer);\n }\n\n public addEmojiToCategory(options: {\n category: EmojiTabCategory,\n emoji?: ReturnType,\n element?: HTMLElement,\n batch?: boolean,\n prepend?: boolean,\n active?: boolean\n }) {\n const {category, emoji, batch, prepend} = options;\n let element = options.element;\n if(element) {\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n spanEmoji.append(element);\n element = spanEmoji;\n } else if(emoji.docId) {\n const customEmojiElement = CustomEmojiElement.create(emoji.docId);\n const span = document.createElement('span');\n span.classList.add(/* 'emoji', */'super-emoji');\n span.append(customEmojiElement);\n element = span;\n } else {\n element = appendEmoji(emoji.emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, undefined, false/* , false */);\n }\n\n const item: typeof category['items'][0] = {\n ...(emoji || {emoji: undefined}),\n element\n };\n\n if(\n options.active || (\n this.activeEmoji && (\n item.docId ?\n this.activeEmoji.docId === item.docId :\n this.activeEmoji.emoji === item.emoji\n )\n )\n ) {\n this.activeEmoji === emoji;\n this.activeElements.push(item);\n element.classList.add('active');\n }\n\n category.items[prepend ? 'unshift' : 'push'](item);\n if(!batch && !this.spliceExceed(category)) {\n this.onLocalCategoryUpdate(category);\n }\n }\n\n // private addEmojisToCategory(category: EmojiTabCategory, emojis: string[], prepend?: boolean) {\n // emojis.forEach((emoji) => {\n // this.addEmojiToCategory(category, emoji, true, prepend);\n // });\n\n // this.onLocalCategoryUpdate(category);\n // }\n\n private onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n\n const {target} = e;\n\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(findUpClassName(target, 'category-title')) {\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}, true).show();\n return;\n }\n\n const emoji = getEmojiFromElement(target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n if(\n emoji.docId &&\n !rootScope.premium && (\n this.isStandalone ? category.id !== CUSTOM_EMOJI_RECENT_ID : this.peerId !== rootScope.myId\n )\n ) {\n const a = document.createElement('a');\n a.onclick = () => {\n appImManager.openUsername({userName: 'premiumbot'});\n hideToast();\n };\n toastNew({\n langPackKey: 'CustomEmoji.PremiumAlert',\n langPackArguments: [a]\n });\n return;\n }\n\n if(this.onClick) {\n this.onClick({\n ...emoji,\n element: findUpClassName(target, 'super-emoji').firstElementChild as HTMLElement\n });\n } else {\n appImManager.chat.input.onEmojiSelected(emoji, false);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n public setActive(emoji: ReturnType) {\n if(\n emoji === this.activeEmoji ||\n emoji?.docId ? emoji.docId === this.activeEmoji?.docId : emoji?.emoji === this.activeEmoji?.emoji\n ) {\n return;\n }\n\n this.activeEmoji = emoji;\n\n this.activeElements.forEach((item) => {\n item.element.classList.remove('active');\n });\n\n this.activeElements.length = 0;\n\n this.categoriesMap.forEach((category) => {\n category.items.forEach((item) => {\n if(emoji.docId ? item.docId === emoji.docId : item.emoji === emoji.emoji) {\n item.element.classList.add('active');\n this.activeElements.push(item);\n }\n });\n });\n }\n\n public onClose() {\n this.closeScrollTop = this.scrollable.scrollTop;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\n private elementsMap: Map = new Map();\n\n constructor(\n parallelLimit?: number,\n protected onVisibilityChange?: OnVisibilityChange,\n options?: IntersectionObserverInit\n ) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n\n const queueItem = this.elementsMap.get(target);\n queueItem.visible = visible;\n\n if(visible) {\n queueItem.wasSeen = true;\n if(!this.queue.includes(queueItem)) {\n this.queue.push(queueItem);\n }\n } else {\n indexOfAndSplice(this.queue, queueItem);\n }\n\n this.onVisibilityChange?.(item);\n this.setProcessQueueTimeout();\n }, options);\n }\n\n public clear() {\n super.clear();\n this.elementsMap.clear();\n }\n\n /* public async processItem(item: LazyLoadElement) {\n //await super.processItem(item);\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\n\n if(this.lazyLoadMedia.length) {\n this.processQueue();\n }\n } */\n\n public observe(el: LazyLoadElement) {\n this.elementsMap.set(el.div, el);\n super.observe(el);\n }\n\n public unobserve(el: LazyLoadElement) {\n this.elementsMap.delete(el.div);\n super.unobserve(el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab} from '..';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport {Document, MessagesAllStickers, StickerSet} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport LazyLoadQueueRepeat from '../../lazyLoadQueueRepeat';\nimport {putPreloader} from '../../putPreloader';\nimport PopupStickers from '../../popups/stickers';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport noop from '../../../helpers/noop';\nimport ButtonIcon from '../../buttonIcon';\nimport confirmationPopup from '../../confirmationPopup';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport createStickersContextMenu from '../../../helpers/dom/createStickersContextMenu';\nimport findUpAsChild from '../../../helpers/dom/findUpAsChild';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport wrapSticker from '../../wrappers/sticker';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport {AnyFunction} from '../../../types';\nimport {IgnoreMouseOutType} from '../../../helpers/dropdownHover';\n\nexport class SuperStickerRenderer {\n public lazyLoadQueue: LazyLoadQueueRepeat;\n private animated: Set = new Set();\n\n constructor(\n private regularLazyLoadQueue: LazyLoadQueue,\n private group: AnimationItemGroup,\n private managers: AppManagers,\n private options?: IntersectionObserverInit\n ) {\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, ({target, visible}) => {\n if(!visible) {\n this.processInvisible(target);\n }\n }, options);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n public renderSticker(doc: MyDocument, element?: HTMLElement, loadPromises?: Promise[]) {\n if(!element) {\n element = document.createElement('div');\n element.classList.add('grid-item', 'super-sticker');\n element.dataset.docId = '' + doc.id;\n\n if(doc.animated) {\n this.observeAnimated(element);\n }\n }\n\n // * This will wrap only a thumb\n /* !doc.animated && */wrapSticker({\n doc,\n div: element,\n lazyLoadQueue: this.regularLazyLoadQueue,\n group: this.group,\n onlyThumb: doc.animated,\n loadPromises\n });\n\n return element;\n }\n\n public observeAnimated(element: HTMLElement) {\n this.animated.add(element);\n this.lazyLoadQueue.observe({\n div: element,\n load: this.processVisible\n });\n }\n\n public unobserveAnimated(element: HTMLElement) {\n this.animated.delete(element);\n this.lazyLoadQueue.delete({div: element});\n }\n\n private checkAnimationContainer = (element: HTMLElement, visible: boolean) => {\n // console.error('checkAnimationContainer', div, visible);\n const players = animationIntersector.getAnimations(element);\n players.forEach((player) => {\n if(!visible) {\n animationIntersector.removeAnimation(player);\n } else {\n animationIntersector.checkAnimation(player, false);\n }\n });\n };\n\n private processVisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n const size = mediaSizes.active.esgSticker.width;\n\n // console.log('processVisibleDiv:', element);\n\n const promise = wrapSticker({\n doc,\n div: element,\n width: size,\n height: size,\n lazyLoadQueue: null,\n group: this.group,\n onlyThumb: false,\n play: true,\n loop: true,\n withLock: true\n }).then(({render}) => render);\n\n promise.then(() => {\n // clearTimeout(timeout);\n this.checkAnimationContainer(element, this.lazyLoadQueue.intersector.isVisible(element));\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n public processInvisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n // console.log('STICKER INvisible:', /* div, */docId);\n\n this.checkAnimationContainer(element, false);\n\n element.textContent = '';\n this.renderSticker(doc, element as HTMLDivElement);\n };\n}\n\nexport type StickersTabCategoryItem = {element: HTMLElement};\n\nexport class StickersTabCategory = {}> {\n public elements: {\n container: HTMLElement,\n title: HTMLElement,\n items: HTMLElement,\n menuTab: HTMLElement,\n menuTabPadding: HTMLElement\n } & AdditionalElements;\n public items: Item[];\n public mounted: boolean;\n public id: string;\n public limit: number;\n\n public getContainerSize: () => {width: number, height: number};\n private getElementMediaSize: () => MediaSize;\n\n private gapX: number;\n private gapY: number;\n\n public set?: StickerSet;\n public local?: boolean;\n public menuScroll?: ScrollableX;\n\n constructor(options: {\n id: string,\n title: HTMLElement | DocumentFragment,\n overflowElement: HTMLElement,\n getContainerSize: StickersTabCategory['getContainerSize'],\n getElementMediaSize: StickersTabCategory['getElementMediaSize'],\n gapX: number,\n gapY: number,\n noMenuTab?: boolean\n }) {\n const container = document.createElement('div');\n container.classList.add('emoji-category');\n\n const items = document.createElement('div');\n items.classList.add('category-items');\n\n let title: HTMLElement;\n if(options.title) {\n title = document.createElement('div');\n title.classList.add('category-title');\n title.append(options.title);\n }\n\n let menuTab: HTMLElement, menuTabPadding: HTMLElement;\n if(!options.noMenuTab) {\n menuTab = ButtonIcon(undefined, {noRipple: true});\n menuTab.classList.add('menu-horizontal-div-item');\n\n menuTabPadding = document.createElement('div');\n menuTabPadding.classList.add('menu-horizontal-div-item-padding');\n\n menuTab.append(menuTabPadding);\n }\n\n if(title) container.append(title);\n container.append(items);\n\n this.elements = {\n container,\n title,\n items,\n menuTab,\n menuTabPadding\n } as any;\n this.id = options.id;\n this.items = [];\n\n this.getContainerSize = options.getContainerSize;\n this.getElementMediaSize = options.getElementMediaSize;\n this.gapX = options.gapX ?? 0;\n this.gapY = options.gapY ?? 0;\n }\n\n public setCategoryItemsHeight() {\n const {width: containerWidth} = this.getContainerSize();\n const elementSize = this.getElementMediaSize().width;\n\n let itemsPerRow = containerWidth / elementSize;\n if(this.gapX) itemsPerRow -= (itemsPerRow - 1) * this.gapX / elementSize;\n itemsPerRow = Math.floor(itemsPerRow);\n\n const rows = Math.ceil(this.items.length / itemsPerRow);\n let height = rows * elementSize;\n if(this.gapY) height += (rows - 1) * this.gapY;\n\n this.elements.items.style.minHeight = height + 'px';\n }\n}\n\nexport class EmoticonsTabC> implements EmoticonsTab {\n public content: HTMLElement;\n public menuScroll: ScrollableX;\n public container: HTMLElement;\n public menuWrapper: HTMLElement;\n public menu: HTMLElement;\n\n protected categories: {[id: string]: Category};\n protected categoriesMap: Map;\n protected categoriesByMenuTabMap: Map;\n protected categoriesIntersector: VisibilityIntersector;\n protected localCategories: Category[];\n\n protected listenerSetter: ListenerSetter;\n\n public scrollable: Scrollable;\n protected mounted = false;\n protected menuOnClickResult: ReturnType;\n\n public tabId: number;\n\n protected postponedEvents: {cb: AnyFunction, args: any[]}[];\n\n public getContainerSize: Category['getContainerSize'];\n\n constructor(\n protected managers: AppManagers,\n protected categoryItemsClassName: string,\n protected getElementMediaSize: () => MediaSize,\n protected padding: number,\n protected gapX: number,\n protected gapY: number\n ) {\n this.categories = {};\n this.categoriesMap = new Map();\n this.categoriesByMenuTabMap = new Map();\n this.localCategories = [];\n this.postponedEvents = [];\n\n this.listenerSetter = new ListenerSetter();\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'emoticons-container');\n\n this.menuWrapper = document.createElement('div');\n this.menuWrapper.classList.add('menu-wrapper', 'emoticons-menu-wrapper');\n\n this.menu = document.createElement('nav');\n this.menu.className = 'menu-horizontal-div no-stripe justify-start emoticons-menu';\n\n this.menuWrapper.append(this.menu);\n this.menuScroll = new ScrollableX(this.menuWrapper);\n\n this.content = document.createElement('div');\n this.content.classList.add('emoticons-content');\n\n this.container.append(this.menuWrapper, this.content);\n\n this.scrollable = new Scrollable(this.content, 'STICKERS');\n }\n\n public getCategoryByContainer(container: HTMLElement) {\n return this.categoriesMap.get(container);\n }\n\n public getCategoryByMenuTab(menuTab: HTMLElement) {\n return this.categoriesByMenuTabMap.get(menuTab);\n }\n\n protected createCategory(stickerSet: StickerSet, title: HTMLElement | DocumentFragment, isLocal?: boolean, noMenuTab?: boolean) {\n const category: Category = new StickersTabCategory({\n id: '' + stickerSet.id,\n title,\n overflowElement: this.content,\n getContainerSize: () => {\n const {width, height} = this.getContainerSize?.() ?? this.content.getBoundingClientRect();\n return {width: width - this.padding, height};\n },\n getElementMediaSize: this.getElementMediaSize,\n gapX: this.gapX,\n gapY: this.gapY,\n noMenuTab\n }) as any;\n\n if(this.categoryItemsClassName) {\n category.elements.items.classList.add(this.categoryItemsClassName);\n }\n\n const container = category.elements.container;\n container.classList.add('hide');\n\n category.set = stickerSet;\n this.categories[stickerSet.id] = category;\n this.categoriesMap.set(container, category);\n !noMenuTab && this.categoriesByMenuTabMap.set(category.elements.menuTab, category);\n\n this.categoriesIntersector.observe(container);\n !noMenuTab && this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(container);\n\n if(!isLocal) {\n !noMenuTab && category.elements.menuTab.classList.add('not-local');\n }\n\n return category;\n }\n\n protected positionCategory(category: Category, prepend?: boolean) {\n const {menuTab, container} = category.elements;\n const posItems = prepend ? this.localCategories.filter((category) => category.mounted).length : 0xFFFF;\n let foundMenuScroll = false;\n const posMenu = prepend ? this.localCategories.filter((category) => {\n if(category.menuScroll && !foundMenuScroll) {\n foundMenuScroll = true;\n return true;\n }\n\n return category.mounted && !category.menuScroll && category.elements.menuTab;\n }).length : 0xFFFF;\n positionElementByIndex(container, this.scrollable.container, posItems);\n positionElementByIndex(menuTab, this.menu, posMenu);\n }\n\n protected isCategoryVisible(category: Category) {\n return this.categoriesIntersector.getVisible().includes(category.elements.container);\n }\n\n protected toggleLocalCategory(category: Category, visible: boolean) {\n if(!visible) {\n category.elements.menuTab?.remove();\n category.elements.container.remove();\n } else {\n const idx = this.localCategories.indexOf(category);\n const sliced = this.localCategories.slice(0, idx);\n let notMountedItems = 0, notMountedMenus = 0;\n sliced.forEach((category) => {\n if(!category.mounted) {\n ++notMountedItems;\n ++notMountedMenus;\n } else if(!category.elements.menuTab || category.menuScroll) {\n ++notMountedMenus;\n }\n });\n const itemsIdx = idx - notMountedItems, menuIdx = idx - notMountedMenus;\n category.elements.menuTab && positionElementByIndex(category.elements.menuTab, this.menu, menuIdx);\n positionElementByIndex(category.elements.container, this.scrollable.container, itemsIdx);\n }\n\n category.mounted = visible;\n // category.elements.container.classList.toggle('hide', !visible);\n }\n\n protected createLocalCategory(id: string, title: LangPackKey | '', icon?: string, noMenuTab?: boolean) {\n const category = this.createCategory({id} as any, title && i18n(title), true, noMenuTab);\n category.local = true;\n this.localCategories.push(category);\n if(category.elements.title) {\n category.elements.title.classList.add('disable-hover');\n }\n\n if(!noMenuTab) {\n if(icon) {\n category.elements.menuTab.classList.add('tgico', 'tgico-' + icon);\n }\n\n category.elements.menuTabPadding.remove();\n }\n\n this.toggleLocalCategory(category, false);\n return category;\n }\n\n protected onLocalCategoryUpdate(category: Category) {\n category.setCategoryItemsHeight();\n this.toggleLocalCategory(category, !!category.items.length);\n }\n\n protected resizeCategories = () => {\n for(const [container, category] of this.categoriesMap) {\n category.setCategoryItemsHeight();\n }\n };\n\n protected deleteCategory(category: Category) {\n if(category) {\n category.elements.container.remove();\n category.elements.menuTab.remove();\n this.categoriesIntersector.unobserve(category.elements.container);\n delete this.categories[category.id];\n this.categoriesMap.delete(category.elements.container);\n this.categoriesByMenuTabMap.delete(category.elements.menuTab);\n\n return true;\n }\n\n return false;\n }\n\n protected spliceExceed(category: Category) {\n if(category.limit === undefined) {\n return false;\n }\n\n const {items, limit} = category;\n items.splice(limit, items.length - limit).forEach(({element}) => {\n element.remove();\n });\n\n this.onLocalCategoryUpdate(category);\n\n return true;\n }\n\n public init() {\n this.listenerSetter.add(emoticonsDropdown)('closed', () => {\n this.postponedEvents.forEach(({cb, args}) => {\n cb(...args);\n });\n\n this.postponedEvents.length = 0;\n });\n }\n\n public destroy() {\n this.getContainerSize = undefined;\n this.postponedEvents.length = 0;\n this.categoriesIntersector?.disconnect();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.menuScroll?.destroy();\n this.menuOnClickResult?.stickyIntersector?.disconnect();\n }\n\n protected postponedEvent = (cb: (...args: K[]) => void) => {\n return (...args: K[]) => {\n if(emoticonsDropdown.isActive()) {\n this.postponedEvents.push({cb, args});\n } else {\n cb(...args);\n }\n };\n };\n}\n\ntype StickersTabItem = {element: HTMLElement, document: Document.document};\nexport default class StickersTab extends EmoticonsTabC> {\n private superStickerRenderer: SuperStickerRenderer;\n\n constructor(managers: AppManagers) {\n super(\n managers,\n 'super-stickers',\n () => mediaSizes.active.esgSticker,\n 3 * 2,\n 4,\n 4\n );\n\n this.container.classList.add('stickers-padding');\n this.content.id = 'content-stickers';\n }\n\n private setFavedLimit(limit: number) {\n const category = this.categories['faved'];\n category.limit = limit;\n }\n\n private categoryAppendStickers(\n category: StickersTabCategory,\n promise: Promise\n ) {\n const {container} = category.elements;\n\n promise.then((documents) => {\n const isVisible = this.isCategoryVisible(category);\n\n documents.forEach((document) => {\n const element = this.superStickerRenderer.renderSticker(document);\n category.items.push({document, element});\n\n if(isVisible) {\n category.elements.items.append(element);\n }\n });\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n }\n\n private async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n const {menuTabPadding} = category.elements;\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n this.categoryAppendStickers(\n category,\n promise.then((stickerSet) => stickerSet.documents as MyDocument[])\n );\n\n this.positionCategory(category, prepend);\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private onCategoryVisibility = ({target, visible, entry}: OnVisibilityChangeItem) => {\n const category = this.categoriesMap.get(target);\n category.elements.items.replaceChildren(...(!visible ? [] : category.items.map(({element}) => element)));\n };\n\n public init() {\n super.init();\n\n this.scrollable.onAdditionalScroll = () => {\n this.setTyping();\n };\n\n /* stickersDiv.addEventListener('mouseover', (e) => {\n let target = e.target as HTMLElement;\n\n if(target.tagName === 'CANVAS') { // turn on sticker\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\n\n if(animation) {\n // @ts-ignore\n if(animation.currentFrame === animation.totalFrames - 1) {\n animation.goToAndPlay(0, true);\n } else {\n animation.play();\n }\n }\n }\n }); */\n\n const intersectionOptions: IntersectionObserverInit = {root: emoticonsDropdown.getElement()};\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n const clearCategoryItems = (category: StickersTabCategory) => {\n category.elements.items.replaceChildren();\n category.items.forEach(({element}) => this.superStickerRenderer.unobserveAnimated(element));\n category.items.length = 0;\n };\n\n this.scrollable.container.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n if(findUpClassName(target, 'category-title')) {\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}).show();\n return;\n }\n\n EmoticonsDropdown.onMediaClick(e);\n });\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll);\n\n const preloader = putPreloader(this.content, true);\n\n const onCategoryStickers = (category: StickersTabCategory, stickers: MyDocument[]) => {\n // if(category.id === 'faved' && category.limit && category.limit < stickers.length) {\n // category.limit = stickers.length;\n // }\n\n if(category.limit) {\n stickers = stickers.slice(0, category.limit);\n }\n\n const ids = new Set(stickers.map((doc) => doc.id));\n forEachReverse(category.items, (item) => {\n if(!ids.has(item.document.id)) {\n this.deleteSticker(category, item.document, true);\n }\n });\n\n this.toggleLocalCategory(category, !!stickers.length);\n forEachReverse(stickers, (doc, idx) => {\n this.unshiftSticker(category, doc, true, idx);\n });\n this.spliceExceed(category);\n category.elements.container.classList.remove('hide');\n };\n\n const favedCategory = this.createLocalCategory('faved', 'FavoriteStickers', 'savedmessages');\n // favedCategory.elements.menuTab.classList.add('active');\n\n const recentCategory = this.createLocalCategory('recent', 'Stickers.Recent', 'recent');\n recentCategory.limit = 20;\n\n const clearButton = ButtonIcon('close', {noRipple: true});\n recentCategory.elements.title.append(clearButton);\n attachClickEvent(clearButton, () => {\n confirmationPopup({\n titleLangKey: 'ClearRecentStickersAlertTitle',\n descriptionLangKey: 'ClearRecentStickersAlertMessage',\n button: {\n langKey: 'Clear'\n }\n }).then(() => {\n this.managers.appStickersManager.clearRecentStickers();\n }, noop);\n });\n\n const premiumCategory = this.createLocalCategory('premium', 'PremiumStickersShort');\n const s = document.createElement('span');\n s.classList.add('tgico-star', 'color-premium');\n premiumCategory.elements.menuTab.append(s);\n\n const promises = [\n Promise.all([\n this.managers.apiManager.getLimit('favedStickers'),\n this.managers.appStickersManager.getFavedStickersStickers()\n ]).then(([limit, stickers]) => {\n this.setFavedLimit(limit);\n onCategoryStickers(favedCategory, stickers);\n }),\n\n this.managers.appStickersManager.getRecentStickersStickers().then((stickers) => {\n onCategoryStickers(recentCategory, stickers);\n }),\n\n this.managers.appStickersManager.getAllStickers().then((res) => {\n for(const set of (res as MessagesAllStickers.messagesAllStickers).sets) {\n this.renderStickerSet(set);\n }\n }),\n\n this.managers.appStickersManager.getPremiumStickers().then((stickers) => {\n const length = stickers.length;\n this.toggleLocalCategory(premiumCategory, rootScope.premium && !!length);\n this.categoryAppendStickers(premiumCategory, Promise.resolve(stickers));\n\n rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.toggleLocalCategory(this.categories['premium'], isPremium && !!length);\n });\n })\n ];\n\n Promise.race(promises).finally(() => {\n preloader.remove();\n });\n\n Promise.all(promises).finally(() => {\n this.mounted = true;\n this.setTyping();\n\n const favedCategory = this.categories['faved'];\n const recentCategory = this.categories['recent'];\n this.menuOnClickResult.setActive(favedCategory.items.length ? favedCategory : recentCategory);\n\n rootScope.addEventListener('stickers_installed', (set) => {\n if(!this.categories[set.id]) {\n this.renderStickerSet(set, true);\n }\n });\n });\n\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP, this.managers, intersectionOptions);\n\n const rendererLazyLoadQueue = this.superStickerRenderer.lazyLoadQueue;\n emoticonsDropdown.addLazyLoadQueueRepeat(rendererLazyLoadQueue, this.superStickerRenderer.processInvisible);\n\n // emoticonsDropdown.addEventListener('close', () => {\n // this.categoriesIntersector.lock();\n // });\n\n // emoticonsDropdown.addEventListener('closed', () => {\n // for(const [container] of this.categoriesMap) {\n // onCategoryVisibility(container, false);\n // }\n // });\n\n // emoticonsDropdown.addEventListener('opened', () => {\n // this.categoriesIntersector.unlockAndRefresh();\n // });\n\n // setInterval(() => {\n // // @ts-ignore\n // const players = Object.values(lottieLoader.players).filter((p) => p.width >= 80);\n\n // console.log(\n // 'STICKERS RENDERED IN PANEL:',\n // players.length,\n // players.filter((p) => !p.paused).length,\n // rendererLazyLoadQueue.intersector.getVisible().length\n // );\n // }, .25e3);\n\n rootScope.addEventListener('sticker_updated', ({type, document, faved}) => {\n // if(type === 'faved') {\n // return;\n // }\n\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n if(faved) {\n this.unshiftSticker(category, document);\n } else {\n this.deleteSticker(category, document);\n }\n }\n });\n\n rootScope.addEventListener('stickers_deleted', ({id}) => {\n const category = this.categories[id];\n if(this.deleteCategory(category)) {\n clearCategoryItems(category);\n }\n });\n\n rootScope.addEventListener('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(category) {\n this.positionCategory(category, true);\n emoticonsDropdown.addEventListener('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }\n }));\n\n rootScope.addEventListener('stickers_updated', ({type, stickers}) => {\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n onCategoryStickers(category, stickers);\n }\n });\n\n rootScope.addEventListener('app_config', () => {\n this.managers.apiManager.getLimit('favedStickers').then((limit) => {\n this.setFavedLimit(limit);\n });\n });\n\n mediaSizes.addEventListener('resize', this.resizeCategories);\n\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: new ListenerSetter()});\n\n const type: IgnoreMouseOutType = 'menu';\n createStickersContextMenu({\n listenTo: this.content,\n verifyRecent: (target) => !!findUpAsChild(target, this.categories['recent'].elements.items),\n onOpen: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, true);\n },\n onClose: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, false);\n }\n });\n\n this.init = null;\n }\n\n public deleteSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean) {\n const item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(item) {\n item.element.remove();\n\n if(!batch) {\n this.onLocalCategoryUpdate(category);\n }\n }\n }\n\n public unshiftSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean, idx?: number) {\n if(idx !== undefined) {\n const i = category.items[idx];\n if(i && i.document.id === doc.id) {\n return;\n }\n }\n\n let item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(!item) {\n item = {\n element: this.superStickerRenderer.renderSticker(doc),\n document: doc\n };\n }\n\n category.items.unshift(item);\n category.elements.items.prepend(item.element);\n\n if(!batch) {\n this.spliceExceed(category);\n }\n }\n\n public unshiftRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id);\n }\n\n public deleteRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id, true);\n }\n\n public setTyping = (cancel = false) => {\n if(!cancel && (!emoticonsDropdown.isActive() || emoticonsDropdown.tab !== this)) {\n return;\n }\n\n rootScope.dispatchEvent('choosing_sticker', !cancel);\n };\n\n public onClosed() {\n this.setTyping(true);\n }\n\n public onOpened() {\n this.setTyping();\n this.resizeCategories();\n }\n}\n","export const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n","import {_i18n} from '../lib/langPack';\n\nexport default function generateFakeIcon(isScam?: boolean) {\n const span = document.createElement('span');\n span.classList.add('badge-fake');\n _i18n(span, isScam ? 'ScamMessage' : 'FakeMessage');\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, protected onVisibilityChange?: OnVisibilityChange) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\n if(visible && spliced.length) {\n spliced.forEach((item) => {\n this.queue.unshift(item);\n });\n }\n\n this.onVisibilityChange && this.onVisibilityChange(item);\n this.setProcessQueueTimeout();\n });\n }\n\n public observe(el: LazyLoadElement) {\n super.observe(el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport Scrollable from './scrollable';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport calcImageInBox from '../helpers/calcImageInBox';\nimport {doubleRaf} from '../helpers/schedulers';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport rootScope from '../lib/rootScope';\nimport LazyLoadQueueRepeat2 from './lazyLoadQueueRepeat2';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\n\nconst width = 400;\nconst maxSingleWidth = width - 100;\nconst height = 100;\n\nexport default class GifsMasonry {\n public lazyLoadQueue: LazyLoadQueueRepeat2;\n private scrollPromise: CancellablePromise = Promise.resolve();\n private timeout: number = 0;\n private managers: AppManagers;\n\n constructor(\n private element: HTMLElement,\n private group: AnimationItemGroup,\n private scrollable: Scrollable,\n attach = true\n ) {\n this.managers = rootScope.managers;\n\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, ({target, visible}) => {\n if(visible) {\n this.processVisibleDiv(target);\n } else {\n this.processInvisibleDiv(target);\n }\n });\n\n /* setInterval(() => {\n // @ts-ignore\n const players = animationIntersector.byGroups[group];\n\n if(players) {\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter((p) => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\n }\n }, .25e3); */\n\n if(attach) {\n this.attach();\n }\n }\n\n private onScroll = () => {\n if(this.timeout) {\n clearTimeout(this.timeout);\n } else {\n this.scrollPromise = deferredPromise();\n // animationIntersector.checkAnimations(true, group);\n }\n\n this.timeout = window.setTimeout(() => {\n this.timeout = 0;\n this.scrollPromise.resolve();\n // animationIntersector.checkAnimations(false, group);\n }, 150);\n };\n\n public attach() {\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n\n public detach() {\n this.clear();\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n private processVisibleDiv(div: HTMLElement) {\n const video = div.querySelector('video');\n if(video) {\n return;\n }\n\n const load = () => {\n const docId = div.dataset.docId;\n const promise = Promise.all([this.managers.appDocsManager.getDoc(docId), this.scrollPromise]).then(async([doc]) => {\n const res = await wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n // lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n group: this.group,\n noInfo: true,\n noPreview: true\n });\n\n const promise = res.loadPromise;\n promise.finally(() => {\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n // div.style.opacity = '';\n thumb && thumb.classList.add('hide');\n\n if(video && !video.parentElement) {\n setTimeout(() => {\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }, 0);\n }\n\n // clearTimeout(timeout);\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\n this.processInvisibleDiv(div);\n }\n });\n\n return promise;\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n // return load();\n\n this.lazyLoadQueue.push({div, load});\n }\n\n public processInvisibleDiv = (div: HTMLElement) => {\n return this.scrollPromise.then(async() => {\n // return;\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n if(thumb) {\n thumb.classList.remove('hide');\n\n await doubleRaf();\n }\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n if(video) {\n video.remove();\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }\n });\n };\n\n public add(doc: MyDocument, appendTo = this.element) {\n // let gifWidth = doc.w;\n // let gifHeight = doc.h;\n // if(gifHeight < height) {\n // gifWidth = height / gifHeight * gifWidth;\n // gifHeight = height;\n // }\n\n // const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\n // const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\n\n const div = document.createElement('div');\n div.classList.add('gif', 'grid-item'/* , 'fade-in-transition' */);\n // div.style.width = size.width + 'px';\n // div.style.opacity = '0';\n // div.style.height = h + 'px';\n div.dataset.docId = '' + doc.id;\n\n appendTo.append(div);\n\n this.lazyLoadQueue.observe({div, load: noop as any});\n\n // let preloader = new ProgressivePreloader(div);\n\n wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n noInfo: true,\n onlyPreview: true\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport TransitionSlider from './transition';\nimport {ScrollableX} from './scrollable';\nimport rootScope from '../lib/rootScope';\nimport {fastRaf} from '../helpers/schedulers';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport whichChild from '../helpers/dom/whichChild';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport function horizontalMenu(\n tabs: HTMLElement,\n content: HTMLElement,\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean | Promise,\n onTransitionEnd?: () => void,\n transitionTime = 200,\n scrollableX?: ScrollableX,\n listenerSetter?: ListenerSetter\n) {\n const selectTab = TransitionSlider({\n content,\n type: tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation',\n transitionTime,\n onTransitionEnd,\n listenerSetter\n });\n\n if(!tabs) {\n return selectTab;\n }\n\n const proxy = new Proxy(selectTab, {\n apply: (target, that, args) => {\n const id = +args[0];\n const animate = args[1] !== undefined ? args[1] : true;\n\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\n selectTarget(el, id, animate);\n }\n });\n\n const selectTarget = async(target: HTMLElement, id: number, animate = true) => {\n const tabContent = content.children[id] as HTMLDivElement;\n\n if(onClick) {\n const result1 = onClick(id, tabContent, animate);\n const canChange = result1 instanceof Promise ? await result1 : result1;\n if(canChange !== undefined && !canChange) {\n return;\n }\n }\n\n if(scrollableX) {\n scrollableX.scrollIntoViewNew({\n element: target.parentElement.children[id] as HTMLElement,\n position: 'center',\n forceDirection: animate ? undefined : FocusDirection.Static,\n forceDuration: transitionTime,\n axis: 'x'\n });\n }\n\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n const prevId = selectTab.prevId();\n if(target.classList.contains('active') || id === prevId) {\n return false;\n }\n\n const mutateCallback = animate ? fastRaf : (cb: () => void) => cb();\n\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\n if(prev) {\n mutateCallback(() => {\n prev.classList.remove('active');\n });\n }\n\n // a great stripe from Jolly Cobra\n if(useStripe && prevId !== -1 && animate) {\n mutateCallback(() => {\n const indicator = target.querySelector('i')!;\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\n\n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n\n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\n\n fastRaf(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n }\n\n mutateCallback(() => {\n target.classList.add('active');\n });\n\n selectTab(id, animate);\n };\n\n const useStripe = !tabs.classList.contains('no-stripe');\n\n // const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\n const tagName = tabs.firstElementChild.tagName;\n attachClickEvent(tabs, (e) => {\n let target = e.target as HTMLElement;\n\n target = findUpAsChild(target, tabs);\n\n // console.log('tabs click:', target);\n\n if(!target) return false;\n\n let id: number;\n if(target.dataset.tab) {\n id = +target.dataset.tab;\n if(id === -1) {\n return false;\n }\n } else {\n id = whichChild(target);\n }\n\n selectTarget(target, id);\n }, {listenerSetter});\n\n return proxy;\n}\n","/*\n * 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 simulateEvent from '../helpers/dom/dispatchEvent';\nimport documentFragmentToHTML from '../helpers/dom/documentFragmentToHTML';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport getCaretPosNew from '../helpers/dom/getCaretPosNew';\nimport getRichValueWithCaret from '../helpers/dom/getRichValueWithCaret';\nimport isInputEmpty from '../helpers/dom/isInputEmpty';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport RichInputHandler, {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport selectElementContents from '../helpers/dom/selectElementContents';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport BOM from '../helpers/string/bom';\nimport {MessageEntity} from '../layer';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport mergeEntities from '../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../lib/richTextProcessor/wrapDraftText';\nimport {createCustomFiller, CustomEmojiElement, CustomEmojiRendererElement, insertCustomFillers, renderEmojis} from '../lib/richTextProcessor/wrapRichText';\n\nexport async function insertRichTextAsHTML(input: HTMLElement, text: string, entities: MessageEntity[], wrappingForPeerId: PeerId) {\n const loadPromises: Promise[] = [];\n const wrappingCustomEmoji = entities?.some((entity) => entity._ === 'messageEntityCustomEmoji');\n const renderer = wrappingCustomEmoji ? createCustomEmojiRendererForInput() : undefined;\n const fragment = wrapDraftText(text, {entities, wrappingForPeerId, loadPromises, customEmojiRenderer: renderer});\n const something = fragment.querySelectorAll('[contenteditable=\"false\"]');\n something.forEach((el) => {\n el.contentEditable = 'inherit';\n el.classList.add('pc');\n });\n\n loadPromises.length && await Promise.all(loadPromises);\n\n fragment.querySelectorAll('.input-selectable').forEach((el) => {\n el.prepend(createCustomFiller(true));\n });\n\n const richInputHandler = USING_BOMS ? RichInputHandler.getInstance() : undefined;\n // const restore = richInputHandler.prepareApplyingMarkdown();\n\n // fragment.querySelectorAll('.input-filler').forEach((el) => el.remove());\n\n // const fillers = Array.from(input.querySelectorAll('.input-filler')).map((el) => {\n // el.contentEditable = 'false';\n // return el;\n // });\n\n const customEmojiElements = Array.from(fragment.querySelectorAll('.custom-emoji-placeholder')).map((el) => {\n el.dataset.ces = '1';\n return (el as any).customEmojiElement as CustomEmojiElement;\n });\n\n const html = documentFragmentToHTML(fragment);\n renderer?.destroy();\n\n // console.log(html);\n\n const pre = getCaretPosNew(input);\n // console.log('pre', pre);\n let textNode: ChildNode, textNodeValue: string;\n if(pre.node) {\n // if(pre.node?.nodeValue === BOM && false) {\n // textNode = document.createTextNode(textNodeValue = BOM);\n // (pre.node.parentNode as any as ChildNode).after(textNode);\n // pre.selection.modify('extend', 'forward', 'character');\n // pre.selection.collapseToEnd();\n // }\n } else {\n const range = document.createRange();\n let node = input.lastChild;\n if(!node) {\n input.append(node /* = textNode */ = document.createTextNode(''));\n }\n\n range.setStartAfter(node);\n range.collapse(true);\n pre.selection.removeAllRanges();\n pre.selection.addRange(range);\n }\n\n // const fragmentLastChild = fragment.lastChild;\n\n // const s = document.createElement('span');\n // (node as ChildNode).replaceWith(s);\n // s.append(node);\n input.addEventListener('input', cancelEvent, {capture: true, once: true});\n richInputHandler?.onBeforeInput({inputType: 'insertContent'});\n window.document.execCommand('insertHTML', false, html);\n Array.from(input.querySelectorAll('[data-ces]')).forEach((el, idx) => {\n delete el.dataset.ces;\n const customEmojiElement = customEmojiElements[idx];\n (el as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = el;\n });\n // fillers.forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n input.querySelectorAll('.pc').forEach((el) => {\n el.contentEditable = 'false';\n });\n if(textNode) {\n const {nodeValue} = textNode;\n if(nodeValue === textNodeValue) {\n textNode.remove();\n } else {\n (textNode as CharacterData).replaceData(nodeValue.indexOf(textNodeValue), textNodeValue.length, '');\n }\n }\n // restore();\n richInputHandler?.removeExtraBOMs(input);\n simulateEvent(input, 'input');\n\n // if(textNode) {\n // const selection = document.getSelection();\n // const node = fragmentLastChild.nextSibling || fragmentLastChild;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }\n\n // const after = getCaretPosNew(input);\n // console.log('after', after);\n // if(after.node?.nodeValue === BOM) {\n // const smth = findUpClassName(after.node.parentElement, 'input-something');\n // if(smth) {\n // const selection = document.getSelection();\n // const node = smth.nextSibling;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n\n // // if(after.offset === 0) after.selection.modify('extend', 'forward', 'character');\n // // after.selection.modify('extend', 'forward', 'character');\n // // after.selection.collapseToEnd();\n // }\n // }\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // console.log('ASD');\n}\n\nlet init = () => {\n document.addEventListener('paste', (e) => {\n const input = findUpAttribute(e.target, 'contenteditable=\"true\"');\n if(!input) {\n return;\n }\n\n const noLinebreaks = !!input.dataset.noLinebreaks;\n e.preventDefault();\n let text: string, entities: MessageEntity[];\n\n // @ts-ignore\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\n let usePlainText = true;\n\n // @ts-ignore\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\n\n const filterEntity = (e: MessageEntity) => e._ === 'messageEntityEmoji' || (e._ === 'messageEntityLinebreak' && !noLinebreaks);\n if(noLinebreaks) {\n const regExp = /[\\r\\n]/g;\n plainText = plainText.replace(regExp, '');\n html = html.replace(regExp, '');\n }\n\n const peerId = (input.dataset.peerId || NULL_PEER_ID).toPeerId();\n if(html.trim()) {\n // console.log(html.replace(/ (style|class|id)=\".+?\"/g, ''));\n\n html = html.replace(//, '');\n html = html.replace(//, '');\n html = html.replace('
', '');\n\n const match = html.match(/([\\s\\S]*)<\\/body>/);\n if(match) {\n html = match[1].trim();\n }\n\n // const s = cleanHTML(html, true) as NodeList;\n // console.log(s);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const span = doc.body || document.createElement('body');\n\n // const span: HTMLElement = document.createElement('span');\n // span.innerHTML = html;\n // span.append(...Array.from(s));\n\n let curChild = span.firstChild;\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\n const nextSibling = curChild.nextSibling;\n if(curChild.nodeType === curChild.TEXT_NODE) {\n if(!curChild.nodeValue.trim()) {\n curChild.remove();\n }\n }\n\n curChild = nextSibling;\n }\n\n const richValue = getRichValueWithCaret(span, true, false);\n\n const canWrapCustomEmojis = !!peerId;\n if(!canWrapCustomEmojis) {\n richValue.entities = richValue.entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n { // * fix extra new lines appearing from

(can have them from some sources, like macOS Terminal)\n const lines = richValue.value.split('\\n');\n let textLength = 0;\n for(let i = 0; i < lines.length; ++i) {\n const line = lines[i];\n textLength += line.length;\n const index = textLength;\n if(plainText[index] !== '\\n' && i !== (lines.length - 1)) {\n lines[i] = line + lines.splice(i + 1, 1)[0];\n }\n textLength += 1;\n }\n\n const correctedText = lines.join('\\n');\n richValue.value = correctedText;\n }\n\n const richTextLength = richValue.value.replace(/\\s/g, '').length;\n const plainTextLength = plainText.replace(/\\s/g, '').length;\n if(richTextLength === plainTextLength ||\n richValue.entities.find((entity) => entity._ === 'messageEntityCustomEmoji')) {\n text = richValue.value;\n entities = richValue.entities;\n usePlainText = false;\n\n let entities2 = parseEntities(text);\n entities2 = entities2.filter(filterEntity);\n mergeEntities(entities, entities2);\n }\n }\n\n if(usePlainText) {\n text = plainText;\n entities = parseEntities(text);\n entities = entities.filter(filterEntity);\n }\n\n insertRichTextAsHTML(input, text, entities, peerId);\n });\n\n init = null;\n};\n\n// ! it doesn't respect symbols other than strongs\n/* const checkAndSetRTL = (input: HTMLElement) => {\n //const isEmpty = isInputEmpty(input);\n //console.log('input', isEmpty);\n\n //const char = [...getRichValue(input)][0];\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\n let direction = 'ltr';\n if(char && checkRTL(char)) {\n direction = 'rtl';\n }\n\n //console.log('RTL', direction, char);\n\n input.style.direction = direction;\n}; */\n\nexport enum InputState {\n Neutral = 0,\n Valid = 1,\n Error = 2\n};\n\nexport type InputFieldOptions = {\n placeholder?: LangPackKey,\n label?: LangPackKey,\n labelOptions?: any[],\n labelText?: string | DocumentFragment,\n name?: string,\n maxLength?: number,\n showLengthOn?: number,\n plainText?: true,\n required?: boolean,\n canBeEdited?: boolean,\n validate?: () => boolean,\n inputMode?: 'tel' | 'numeric',\n withLinebreaks?: boolean,\n autocomplete?: string\n};\n\nfunction createCustomEmojiRendererForInput() {\n const renderer = CustomEmojiRendererElement.create({\n wrappingDraft: true,\n isSelectable: true\n });\n return renderer;\n}\n\nfunction processCustomEmojisInInput(input: HTMLElement) {\n const customEmojiElements = Array.from(input.querySelectorAll('.custom-emoji, .custom-emoji-placeholder'));\n let renderer = input.querySelector('.custom-emoji-renderer');\n if(!renderer && customEmojiElements.length) {\n renderer = createCustomEmojiRendererForInput();\n input.prepend(renderer);\n } else if(renderer && !customEmojiElements.length) {\n renderer.remove();\n return;\n }\n\n if(!renderer) {\n return;\n }\n\n const customEmojis: Parameters[0] = new Map();\n customEmojiElements.forEach((element) => {\n const customEmojiElement = element instanceof CustomEmojiElement ? element : (element as any).customEmojiElement as CustomEmojiElement;\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) {\n customEmojis.set(docId, set = new Set());\n }\n\n set.add(customEmojiElement);\n });\n\n for(const [docId, customEmojiElements] of customEmojis) {\n let hasSet = renderer.customEmojis.get(docId);\n if(hasSet) {\n for(const customEmojiElement of hasSet) {\n if(!customEmojiElements.has(customEmojiElement)) {\n customEmojiElement.destroy();\n }\n }\n } else {\n hasSet = new Set();\n }\n\n for(const customEmojiElement of customEmojiElements) {\n if(!hasSet.has(customEmojiElement)) {\n customEmojiElement.connectedCallback();\n }\n }\n }\n\n renderer.add(customEmojis, false);\n renderer.forceRender();\n}\n\nexport default class InputField {\n public container: HTMLElement;\n public input: HTMLElement;\n public label: HTMLLabelElement;\n\n public originalValue: string;\n\n public required: boolean;\n public validate: () => boolean;\n\n constructor(public options: InputFieldOptions = {}) {\n this.container = document.createElement('div');\n this.container.classList.add('input-field');\n\n this.required = options.required;\n this.validate = options.validate;\n\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\n }\n\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true, autocomplete} = options;\n const label = options.label || options.labelText;\n\n const onInputCallbacks: Array<() => void> = [];\n let input: HTMLElement;\n if(!plainText) {\n if(init) {\n init();\n }\n\n this.container.innerHTML = `

`;\n\n input = this.container.firstElementChild as HTMLElement;\n input.contentEditable = '' + !!canBeEdited;\n // const observer = new MutationObserver(() => {\n // //checkAndSetRTL(input);\n\n // if(processInput) {\n // processInput();\n // }\n // });\n\n RichInputHandler.getInstance();\n\n input.addEventListener('mousedown', (e) => {\n const selection = document.getSelection();\n if(!selection.isCollapsed) {\n return;\n }\n\n const placeholder = findUpTag(e.target, 'IMG');\n if(!placeholder) {\n return;\n }\n\n const rect = placeholder.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const focusOnNext = e.clientX >= centerX;\n\n const range = document.createRange();\n range.setStartAfter(focusOnNext ? placeholder : placeholder.previousSibling ?? placeholder);\n selection.removeAllRanges();\n selection.addRange(range);\n });\n\n onInputCallbacks.push(() => {\n // console.log('input');\n // return;\n // * because if delete all characters there will br left\n if(isInputEmpty(input)) {\n // const textNode = Array.from(input.childNodes).find((node) => node.nodeType === node.TEXT_NODE) || document.createTextNode('');\n input.replaceChildren();\n // input.append(document.createTextNode('')); // need first text node to support history stack\n }\n\n // const fillers = Array.from(input.querySelectorAll('.emoji-filler')) as HTMLElement[];\n // fillers.forEach((filler) => {\n // const textContent = filler.textContent;\n // if(textContent === BOM) {\n // return;\n // }\n\n // if(textContent) {\n\n // } else {\n // let curChild = filler.firstChild;\n // while(curChild) {\n // curChild = curChild.nextSibling;\n // }\n // }\n\n // filler.classList.remove('emoji-filler');\n // });\n\n // Array.from(input.querySelectorAll('br, span:empty')).forEach((el) => {\n // const parentElement = el.parentElement;\n // (parentElement === input ? el : parentElement).remove();\n // });\n USING_BOMS && Array.from(input.querySelectorAll('br:not(.br-not-br)')).forEach((el) => {\n // const parentElement = el.parentElement;\n el.remove();\n // if(!parentElement.children.length && !parentElement.textContent) {\n // parentElement.textContent = '';\n // }\n });\n\n insertCustomFillers(Array.from(input.querySelectorAll('.input-something')));\n\n processCustomEmojisInInput(input);\n\n // .forEach((el) => el.remove());\n });\n\n // ! childList for paste first symbol\n // observer.observe(input, {characterData: true, childList: true, subtree: true});\n } else {\n this.container.innerHTML = `\n \n `;\n\n input = this.container.firstElementChild as HTMLElement;\n // input.addEventListener('input', () => checkAndSetRTL(input));\n }\n\n input.setAttribute('dir', 'auto');\n\n if(options.inputMode) {\n input.inputMode = options.inputMode;\n }\n\n if(placeholder) {\n _i18n(input, placeholder, undefined, 'placeholder');\n }\n\n if(label || placeholder) {\n const border = document.createElement('div');\n border.classList.add('input-field-border');\n this.container.append(border);\n }\n\n if(label) {\n this.label = document.createElement('label');\n this.setLabel();\n this.container.append(this.label);\n }\n\n if(maxLength) {\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\n let showingLength = false;\n\n const onInput = () => {\n const wasError = input.classList.contains('error');\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValueWithCaret(input, false, false).value].length;\n const diff = maxLength - inputLength;\n const isError = diff < 0;\n input.classList.toggle('error', isError);\n\n // this.onLengthChange && this.onLengthChange(inputLength, isError);\n\n if(isError || diff <= showLengthOn) {\n this.setLabel();\n labelEl.append(` (${maxLength - inputLength})`);\n if(!showingLength) showingLength = true;\n } else if((wasError && !isError) || showingLength) {\n this.setLabel();\n showingLength = false;\n }\n };\n\n onInputCallbacks.push(onInput);\n }\n\n const noLinebreaks = !options.withLinebreaks;\n if(noLinebreaks && !plainText) {\n input.dataset.noLinebreaks = '1';\n input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n e.preventDefault();\n return false;\n }\n });\n }\n\n if(onInputCallbacks.length) {\n input.addEventListener('input', () => {\n onInputCallbacks.forEach((callback) => callback());\n });\n }\n\n this.input = input;\n }\n\n public select() {\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\n return;\n }\n\n if(this.options.plainText) {\n (this.input as HTMLInputElement).select(); // * select text\n } else {\n selectElementContents(this.input);\n }\n }\n\n public setLabel() {\n this.label.textContent = '';\n if(this.options.labelText) {\n setInnerHTML(this.label, this.options.labelText);\n } else {\n this.label.append(i18n(this.options.label, this.options.labelOptions));\n }\n }\n\n get value(): string {\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValueWithCaret(this.input, false, false).value;\n // return getRichValue(this.input);\n }\n\n set value(value: Parameters[1]) {\n this.setValueSilently(value, true);\n this.simulateInputEvent();\n }\n\n public simulateInputEvent() {\n simulateEvent(this.input, 'input');\n }\n\n public setValueSilently(value: Parameters[1], fromSet?: boolean) {\n if(this.options.plainText) {\n (this.input as HTMLInputElement).value = value as string;\n } else {\n replaceContent(this.input, value);\n processCustomEmojisInInput(this.input);\n }\n }\n\n public isChanged() {\n return this.value !== this.originalValue;\n }\n\n public isValid() {\n return !this.input.classList.contains('error') &&\n (!this.validate || this.validate()) &&\n (!this.required || !isInputEmpty(this.input));\n }\n\n public isValidToChange() {\n return this.isValid() && this.isChanged();\n }\n\n public setDraftValue(value = '', silent?: boolean) {\n if(!this.options.plainText) {\n value = documentFragmentToHTML(wrapDraftText(value));\n }\n\n if(silent) {\n this.setValueSilently(value, false);\n } else {\n this.value = value;\n }\n }\n\n public setOriginalValue(value: InputField['originalValue'] = '', silent?: boolean) {\n this.originalValue = value;\n this.setDraftValue(value, silent);\n }\n\n public setState(state: InputState, label?: LangPackKey) {\n if(label) {\n this.label.textContent = '';\n this.label.append(i18n(label, this.options.labelOptions));\n } else {\n this.setLabel();\n }\n\n this.input.classList.toggle('error', !!(state & InputState.Error));\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\n }\n\n public setError(label?: LangPackKey) {\n this.setState(InputState.Error, label);\n }\n}\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","/*\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 { getRichValue } from \"../helpers/dom\";\nimport {LangPackKey} from '../lib/langPack';\nimport InputField from './inputField';\n\nexport default class InputSearch {\n public container: HTMLElement;\n public input: HTMLElement;\n public inputField: InputField;\n public clearBtn: HTMLElement;\n\n public prevValue = '';\n public timeout = 0;\n public onChange: (value: string) => void;\n public onClear: () => void;\n\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\n this.inputField = new InputField({\n placeholder,\n plainText: true\n });\n\n this.container = this.inputField.container;\n this.container.classList.remove('input-field');\n this.container.classList.add('input-search');\n\n this.onChange = onChange;\n\n this.input = this.inputField.input;\n this.input.classList.add('input-search-input');\n\n const searchIcon = document.createElement('i');\n searchIcon.classList.add('tgico', 'tgico-search');\n\n this.clearBtn = document.createElement('i');\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\n\n this.input.addEventListener('input', this.onInput);\n this.clearBtn.addEventListener('click', this.onClearClick);\n\n this.container.append(searchIcon, this.clearBtn);\n }\n\n onInput = () => {\n if(!this.onChange) return;\n\n const value = this.value;\n\n // this.input.classList.toggle('is-empty', !value.trim());\n\n if(value !== this.prevValue) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.timeout = window.setTimeout(() => {\n this.onChange(value);\n }, 200);\n }\n };\n\n onClearClick = () => {\n this.value = '';\n this.onChange && this.onChange('');\n this.onClear && this.onClear();\n };\n\n get value() {\n return this.inputField.value;\n }\n\n set value(value: string) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.inputField.value = value;\n }\n\n public remove() {\n clearTimeout(this.timeout);\n this.input.removeEventListener('input', this.onInput);\n this.clearBtn.removeEventListener('click', this.onClearClick);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport VisibilityIntersector, {OnVisibilityChangeItem} from './visibilityIntersector';\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\n\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, ignoreHeavyAnimation?: boolean) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\n\n !ignoreHeavyAnimation && useHeavyAnimationCheck(() => {\n this.lock();\n }, () => {\n this.unlockAndRefresh();\n });\n }\n\n private onVisibilityChange = ({target, visible}: OnVisibilityChangeItem) => {\n // if(DEBUG) {\n // this.log('isIntersecting', target, visible);\n // }\n\n // if visible - will move to the end of visible arary\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {\n if(visible) {\n item.wasSeen = true;\n }\n\n item.visible = visible;\n const index = this.queue.findIndex((item) => !item.visible);\n this.queue.splice(Math.max(0, index), 0, item);\n });\n\n this.setProcessQueueTimeout();\n };\n\n protected getItem() {\n return findAndSplice(this.queue, (item) => item.wasSeen);\n }\n\n public async processItem(item: LazyLoadElement) {\n await super.processItem(item);\n this.intersector.unobserve(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const inserted = super.addElement(method, el);\n\n if(!inserted) return false;\n\n this.observe(el);\n /* if(el.wasSeen) {\n this.processQueue(el);\n } else */\n el.wasSeen ??= false;\n\n return 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 findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueBase, {LazyLoadElementBase} from './lazyLoadQueueBase';\nimport VisibilityIntersector from './visibilityIntersector';\n\nexport type LazyLoadElement = Omit & {\n load: (target?: HTMLElement) => Promise,\n div: HTMLElement\n wasSeen?: boolean,\n visible?: boolean\n};\n\nexport default class LazyLoadQueueIntersector extends LazyLoadQueueBase {\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n public intersector: VisibilityIntersector;\n protected intersectorTimeout: number;\n\n constructor(parallelLimit?: number) {\n super(parallelLimit);\n }\n\n public lock() {\n super.lock();\n this.intersector.lock();\n }\n\n public unlock() {\n super.unlock();\n this.intersector.unlock();\n }\n\n public unlockAndRefresh() {\n super.unlock();\n this.intersector.unlockAndRefresh();\n }\n\n public clear() {\n super.clear();\n this.intersector.disconnect();\n }\n\n public refresh() {\n this.intersector.refresh();\n }\n\n protected loadItem(item: LazyLoadElement) {\n return item.load(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const item = this.queue.find((i) => i.div === el.div && i.load === el.load);\n if(item) {\n return false;\n } else {\n for(const item of this.inProcess) {\n if(item.div === el.div && item.load === el.load) {\n return false;\n }\n }\n }\n\n this.queue[method](el);\n return true;\n }\n\n protected setProcessQueueTimeout() {\n this.intersectorTimeout ??= window.setTimeout(() => {\n this.intersectorTimeout = undefined;\n this.processQueue();\n }, 0);\n }\n\n public push(el: LazyLoadElement) {\n super.push(el);\n }\n\n public unshift(el: LazyLoadElement) {\n super.unshift(el);\n }\n\n public delete(el: Omit) {\n findAndSpliceAll(this.queue, (i) => i.div === el.div);\n this.unobserve(el);\n }\n\n public observe(el: LazyLoadElement) {\n this.intersector.observe(el.div);\n }\n\n public unobserve(el: Omit) {\n this.intersector.unobserve(el.div);\n }\n}\n","/*\n * 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 const 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 {FontFamily, FontSize, FontWeight} from '../config/font';\nimport getTextWidth from '../helpers/canvas/getTextWidth';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport {fastRaf} from '../helpers/schedulers';\n\n// Thanks to https://stackoverflow.com/a/49349813\n\n/**\n * Attibute modifier to create middle ellipsis\n * When the attribute value is left blank the ellipsis will be in the middle\n * When positive the attribute value will be used as a percentage\n * When negative the attribute value will be used as character index counted from the end\n * @example\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n */\nconst ellipsis = '…';\nconst map: Map = new Map();\n\nconst testQueue: Set = new Set();\nconst fontSize = '16px';\nlet pendingTest = false;\n\nfunction setTestQueue() {\n if(pendingTest) {\n return;\n }\n\n pendingTest = true;\n fastRaf(() => {\n pendingTest = false;\n testQueueElements();\n });\n}\n\nfunction testQueueElements() {\n testQueue.forEach(testElement);\n testQueue.clear();\n}\n\nwindow.addEventListener('resize', () => {\n for(const [key] of map) {\n testQueue.add(key);\n }\n\n setTestQueue();\n}, {capture: true, passive: true});\n\nfunction getElementWidth(element: HTMLElement) {\n const type = element.dataset.sizeType;\n if(type) {\n const mediaSize = mediaSizes.active;\n // @ts-ignore\n const size: MediaSize = mediaSize[type];\n return size.width;\n }\n\n return element.getBoundingClientRect().width;\n}\n\nfunction testElement(element: HTMLElement) {\n // const perf = performance.now();\n // do not recalculate variables a second time\n let mapped = map.get(element);\n const firstTime = !mapped;\n\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\n // console.log('[MEE] testElement got mapped', mapped);\n\n if(firstTime) {\n text = element.textContent;\n textLength = text.length;\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\n multiplier = from > 0 && from / 100;\n\n let fontSize = element.dataset.fontSize;\n if(fontSize && +fontSize) fontSize += 'px';\n // const perf = performance.now();\n font = `${element.dataset.fontWeight || FontWeight} ${fontSize || FontSize} ${FontFamily}`;\n /* const computedStyle = window.getComputedStyle(elm, null);\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\n // console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\n\n textWidth = getTextWidth(text, font);\n // const perf = performance.now();\n elementWidth = getElementWidth(element);\n // console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\n map.set(element, mapped);\n\n // console.log('[MEE] testElement map set', element);\n }\n\n const newElementWidth = getElementWidth(element);\n const widthChanged = firstTime || elementWidth !== newElementWidth;\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\n\n if(widthChanged) {\n if(textWidth > elementWidth) {\n element.setAttribute('title', text);\n let smallerText = text;\n let smallerWidth = elementWidth;\n while(smallerText.length > 3) {\n const smallerTextLength = smallerText.length;\n const half = multiplier &&\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\n Math.max(smallerTextLength + from - 1, 1);\n const half1 = smallerText.substr(0, half).replace(/\\s*$/, '');\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/, '');\n smallerText = half1 + half2;\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\n if(smallerWidth < elementWidth) {\n element.textContent = half1 + ellipsis + half2;\n break;\n }\n }\n\n // * set new width after cutting text\n mapped.elementWidth = getElementWidth(element);\n // mapped.textWidth = smallerWidth;\n } else {\n element.removeAttribute('title');\n }\n }\n\n // console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\n}\n\nexport class MiddleEllipsisElement extends HTMLElement {\n connectedCallback() {\n // console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\n\n map.set(this, null);\n if(this.dataset.sizeType) {\n testElement(this);\n } else {\n testQueue.add(this);\n setTestQueue();\n }\n // testElement(this);\n\n // console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\n }\n\n disconnectedCallback() {\n const deleted = map.delete(this);\n testQueue.delete(this);\n // console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\n }\n}\n\ncustomElements.define('middle-ellipsis-element', MiddleEllipsisElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport lottieLoader, {LottieLoader} from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport PasswordInputField from '../passwordInputField';\n\nexport default class PasswordMonkey {\n public container: HTMLElement;\n public animation: RLottiePlayer;\n public needFrame = 0;\n protected loadPromise: ReturnType;\n\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size,\n noCache: true\n // }, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\n // return;\n this.animation = _animation;\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, this.needFrame);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n });\n\n this.passwordInputField.helpers.onVisibilityClickAdditional = () => {\n if(this.passwordInputField.helpers.passwordVisible) {\n this.animation.setDirection(1);\n this.animation.curFrame = 0;\n this.needFrame = 16;\n this.animation.play();\n } else {\n this.animation.setDirection(-1);\n this.animation.curFrame = 16;\n this.needFrame = 0;\n this.animation.play();\n }\n };\n\n return lottieLoader.waitForFirstFrame(_animation);\n });\n }\n\n public remove() {\n if(this.animation) {\n this.animation.remove();\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 InputField from '../inputField';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\n\nexport default class TrackingMonkey {\n public container: HTMLElement;\n\n protected max = 45;\n protected needFrame = 0;\n\n protected animation: RLottiePlayer;\n protected idleAnimation: RLottiePlayer;\n\n protected loadPromise: Promise;\n\n constructor(protected inputField: InputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n\n const input = inputField.input;\n\n input.addEventListener('blur', () => {\n this.playAnimation(0);\n });\n\n input.addEventListener('input', (e) => {\n this.playAnimation(inputField.value.length);\n });\n\n /* codeInput.addEventListener('focus', () => {\n playAnimation(Math.max(codeInput.value.length, 1));\n }); */\n }\n\n // 1st symbol = frame 15\n // end symbol = frame 165\n public playAnimation(length: number) {\n if(!this.animation) return;\n\n length = Math.min(length, 30);\n let frame: number;\n if(length) {\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\n\n if(this.idleAnimation) {\n this.idleAnimation.stop(true);\n this.idleAnimation.canvas[0].style.display = 'none';\n }\n\n this.animation.canvas[0].style.display = '';\n } else {\n /* const cb = (frameNo: number) => {\n if(frameNo <= 1) { */\n /* idleAnimation.play();\n idleAnimation.canvas.style.display = '';\n animation.canvas.style.display = 'none'; */\n /* animation.removeListener('enterFrame', cb);\n }\n };\n animation.addListener('enterFrame', cb); */\n\n frame = 0;\n }\n // animation.playSegments([1, 2]);\n\n const direction = this.needFrame > frame ? -1 : 1;\n // console.log('keydown', length, frame, direction);\n\n this.animation.setDirection(direction);\n if(this.needFrame !== 0 && frame === 0) {\n this.animation.setSpeed(7);\n }\n /* let diff = Math.abs(needFrame - frame * direction);\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\n this.needFrame = frame;\n\n this.animation.play();\n\n /* animation.goToAndStop(15, true); */\n // animation.goToAndStop(length / max * );\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = Promise.all([\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: true,\n autoplay: true,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\n this.idleAnimation = animation;\n\n // ! animationIntersector will stop animation instantly\n if(!this.inputField.value.length) {\n animation.play();\n }\n\n return lottieLoader.waitForFirstFrame(animation);\n }),\n\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\n this.animation = _animation;\n\n if(!this.inputField.value.length) {\n this.animation.canvas[0].style.display = 'none';\n }\n\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, needFrame);\n // let currentFrame = Math.round(e.currentTime);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n\n if(currentFrame === 0 && this.needFrame === 0) {\n // animation.curFrame = 0;\n\n if(this.idleAnimation) {\n this.idleAnimation.canvas[0].style.display = '';\n this.idleAnimation.play();\n this.animation.canvas[0].style.display = 'none';\n }\n }\n });\n // console.log(animation.getDuration(), animation.getDuration(true));\n\n return lottieLoader.waitForFirstFrame(_animation);\n })\n ]);\n }\n\n public remove() {\n if(this.animation) this.animation.remove();\n if(this.idleAnimation) this.idleAnimation.remove();\n }\n}\n","/*\n * 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 InputField, {InputFieldOptions} from './inputField';\n\nexport class PasswordInputHelpers {\n public passwordVisible = false;\n public toggleVisible: HTMLElement;\n public onVisibilityClickAdditional: () => void;\n\n constructor(public container: HTMLElement, public input: HTMLInputElement) {\n input.type = 'password';\n input.setAttribute('required', '');\n input.name = 'notsearch_password';\n input.autocomplete = 'off';\n\n // * https://stackoverflow.com/a/35949954/6758968\n const stealthy = document.createElement('input');\n stealthy.classList.add('stealthy');\n stealthy.tabIndex = -1;\n stealthy.type = 'password';\n input.parentElement.prepend(stealthy);\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\n\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\n input.setAttribute('readonly', '');\n input.addEventListener('focus', () => {\n input.removeAttribute('readonly');\n }, {once: true});\n } */\n\n const toggleVisible = this.toggleVisible = document.createElement('span');\n toggleVisible.classList.add('toggle-visible', 'tgico');\n\n container.classList.add('input-field-password');\n container.append(toggleVisible);\n\n toggleVisible.addEventListener('click', this.onVisibilityClick);\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\n }\n\n public onVisibilityClick = (e: Event) => {\n cancelEvent(e);\n this.passwordVisible = !this.passwordVisible;\n\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\n };\n}\n\nexport default class PasswordInputField extends InputField {\n public helpers: PasswordInputHelpers;\n\n constructor(options: InputFieldOptions = {}) {\n super({\n plainText: true,\n ...options\n });\n\n this.helpers = new PasswordInputHelpers(this.container, this.input as HTMLInputElement);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from '../environment/parallaxSupport';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport filterChatPhotosMessages from '../helpers/filterChatPhotosMessages';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ListLoader from '../helpers/listLoader';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Message, ChatFull, MessageAction, Photo} from '../layer';\nimport type {AppMessagesManager} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {openAvatarViewer} from './avatar';\nimport {putAvatar} from './putPhoto';\nimport Scrollable from './scrollable';\nimport SwipeHandler from './swipeHandler';\nimport wrapPhoto from './wrappers/photo';\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = IS_PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = IS_PARALLAX_SUPPORTED ? `translate3d({x}, 0, -1px) scale(${PeerProfileAvatars.SCALE})` : 'translate({x}, 0)';\n public container: HTMLElement;\n public avatars: HTMLElement;\n public gradient: HTMLElement;\n public info: HTMLElement;\n public arrowPrevious: HTMLElement;\n public arrowNext: HTMLElement;\n private tabs: HTMLDivElement;\n private listLoader: ListLoader;\n private peerId: PeerId;\n private intersectionObserver: IntersectionObserver;\n private loadCallbacks: Map void>;\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(\n public scrollable: Scrollable,\n private managers: AppManagers\n ) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n\n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n this.loadCallbacks = new Map();\n this.listenerSetter = new ListenerSetter();\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n return false;\n }\n\n return true;\n };\n\n const SWITCH_ZONE = 1 / 3;\n let cancel = false;\n let freeze = false;\n attachClickEvent(this.container, async(_e) => {\n if(freeze) {\n cancelEvent(_e);\n return;\n }\n\n if(cancel) {\n cancel = false;\n return;\n }\n\n if(!checkScrollTop()) {\n return;\n }\n\n const rect = this.container.getBoundingClientRect();\n\n // const e = (_e as TouchEvent).touches ? (_e as TouchEvent).touches[0] : _e as MouseEvent;\n const e = _e;\n const x = e.pageX;\n\n const clickX = x - rect.left;\n if((!this.listLoader.previous.length && !this.listLoader.next.length) ||\n (clickX > (rect.width * SWITCH_ZONE) && clickX < (rect.width - rect.width * SWITCH_ZONE))) {\n const peerId = this.peerId;\n\n const targets: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[] = [];\n this.listLoader.previous.concat(this.listLoader.current, this.listLoader.next).forEach((item, idx) => {\n targets.push({\n element: /* null */this.avatars.children[idx] as HTMLElement,\n item\n });\n });\n\n const prevTargets = targets.slice(0, this.listLoader.previous.length);\n const nextTargets = targets.slice(this.listLoader.previous.length + 1);\n\n const target = this.avatars.children[this.listLoader.previous.length] as HTMLElement;\n freeze = true;\n openAvatarViewer(target, peerId, () => peerId === this.peerId, this.listLoader.current, prevTargets, nextTargets);\n freeze = false;\n } else {\n const centerX = rect.right - (rect.width / 2);\n const toRight = x > centerX;\n\n // this.avatars.classList.remove('no-transition');\n // fastRaf(() => {\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n\n let distance: number;\n if(this.listLoader.index === 0 && !toRight) distance = this.listLoader.count - 1;\n else if(this.listLoader.index === (this.listLoader.count - 1) && toRight) distance = -(this.listLoader.count - 1);\n else distance = toRight ? 1 : -1;\n this.listLoader.go(distance);\n\n fastRaf(() => {\n this.avatars.classList.remove('no-transition');\n });\n // });\n }\n }, {listenerSetter: this.listenerSetter});\n\n const cancelNextClick = () => {\n cancel = true;\n document.body.addEventListener(IS_TOUCH_SUPPORTED ? 'touchend' : 'click', (e) => {\n cancel = false;\n }, {once: true});\n };\n\n let width = 0, x = 0, lastDiffX = 0, /* lastIndex = 0, */ minX = 0;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.avatars,\n onSwipe: (xDiff, yDiff) => {\n lastDiffX = xDiff;\n let lastX = x + xDiff * -PeerProfileAvatars.SCALE;\n if(lastX > 0) lastX = 0;\n else if(lastX < minX) lastX = minX;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', lastX + 'px');\n // console.log(xDiff, yDiff);\n return false;\n },\n verifyTouchTarget: (e) => {\n if(!checkScrollTop()) {\n cancelNextClick();\n cancelEvent(e);\n return false;\n } else if(this.container.classList.contains('is-single') || freeze) {\n return false;\n }\n\n return true;\n },\n onFirstSwipe: () => {\n const rect = this.avatars.getBoundingClientRect();\n width = rect.width;\n minX = -width * (this.tabs.childElementCount - 1);\n\n /* lastIndex = whichChild(this.tabs.querySelector('.active'));\n x = -width * lastIndex; */\n x = rect.left - this.container.getBoundingClientRect().left;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', x + 'px');\n\n this.container.classList.add('is-swiping');\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n },\n onReset: () => {\n const addIndex = Math.ceil(Math.abs(lastDiffX) / (width / PeerProfileAvatars.SCALE)) * (lastDiffX >= 0 ? 1 : -1);\n cancelNextClick();\n\n // console.log(addIndex);\n\n this.avatars.classList.remove('no-transition');\n fastRaf(() => {\n this.listLoader.go(addIndex);\n this.container.classList.remove('is-swiping');\n });\n }\n });\n\n this.intersectionObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if(!entry.isIntersecting) {\n return;\n }\n\n this.loadNearestToTarget(entry.target);\n });\n });\n\n /* this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(photo) {\n const id = photo.photo_id;\n const previous = this.listLoader.previous;\n for(let i = 0; i < previous.length; ++i) {\n if(previous[i] === id)\n }\n this.listLoader.previous.forEach((_id, idx, arr) => {});\n }\n }\n }); */\n }\n\n public async setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = anchor as any;\n return this.managers.appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then((value) => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise | ChatFull, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(this.managers.appProfileManager.getChatFull(peerId.toChatId()));\n }\n\n promises.push(this.managers.appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then(async(result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = findAndSplice(value.history, (message) => {\n return ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n\n listLoader.current = message || await this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n // console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n // const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n await this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = async(photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container', 'hide');\n\n this.avatars.append(avatar);\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ?\n await this.managers.appPhotosManager.getPhoto(photoId) :\n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = async() => {\n if(photo) {\n const res = await wrapPhoto({\n container: avatar,\n photo,\n size: choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n\n [res.images.thumb, res.images.full].filter(Boolean).forEach((img) => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n await putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n\n avatar.classList.remove('hide');\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n await loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach((target) => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.swipeHandler.removeListeners();\n this.intersectionObserver?.disconnect();\n }\n}\n","/*\n * 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 deferredPromise from '../helpers/cancellablePromise';\nimport {copyTextToClipboard} from '../helpers/clipboard';\nimport anchorCopy from '../helpers/dom/anchorCopy';\nimport {simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport makeError from '../helpers/makeError';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport middlewarePromise from '../helpers/middlewarePromise';\nimport {Chat, ChatFull, User, UserFull} from '../layer';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getServerMessageId from '../lib/appManagers/utils/messageId/getServerMessageId';\nimport getPeerActiveUsernames from '../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n, {i18n, join} from '../lib/langPack';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport AvatarElement from './avatar';\nimport CheckboxField from './checkboxField';\nimport {generateDelimiter} from './generateDelimiter';\nimport PeerProfileAvatars from './peerProfileAvatars';\nimport Row from './row';\nimport Scrollable from './scrollable';\nimport SettingSection from './settingSection';\nimport {toast} from './toast';\nimport formatUserPhone from './wrappers/formatUserPhone';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport wrapTopicNameButton from './wrappers/topicNameButton';\n\nconst setText = (text: Parameters[1], row: Row) => {\n // fastRaf(() => {\n setInnerHTML(row.title, text || '');\n row.container.style.display = text ? '' : 'none';\n // });\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n private avatars: PeerProfileAvatars;\n private avatar: AvatarElement;\n private section: SettingSection;\n private name: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private bio: Row;\n private username: Row;\n private phone: Row;\n private notifications: Row;\n private location: Row;\n private link: Row;\n\n private cleaned: boolean;\n private setMoreDetailsTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n private middlewareHelper: MiddlewareHelper;\n\n constructor(\n private managers: AppManagers,\n public scrollable: Scrollable,\n private listenerSetter?: ListenerSetter,\n private isDialog = true\n ) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n\n if(!listenerSetter) {\n this.listenerSetter = new ListenerSetter();\n }\n\n this.middlewareHelper = getMiddleware();\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.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 subtitle: true,\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n\n copyTextToClipboard(this.bio.title.textContent);\n toast(I18n.format('BioCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_About',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => !this.peerId.isUser()\n }, {\n icon: 'copy',\n text: 'Text.CopyLabel_Bio',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => this.peerId.isUser()\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 username = await this.managers.appPeersManager.getPeerUsername(this.peerId);\n copyTextToClipboard('@' + this.username.title.textContent);\n toast(I18n.format('UsernameCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_Username',\n onClick: () => {\n simulateClickEvent(this.username.container);\n }\n }]\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitle: true,\n icon: 'phone',\n clickable: () => {\n copyTextToClipboard(this.phone.title.textContent.replace(/\\s/g, ''));\n toast(I18n.format('PhoneCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_PhoneNumber',\n onClick: () => {\n simulateClickEvent(this.phone.container);\n }\n }, {\n icon: 'info',\n text: 'PeerInfo.Phone.AnonymousInfo',\n textArgs: [(() => {\n const a = document.createElement('a');\n return a;\n })()],\n onClick: () => {\n window.open('https://fragment.com/numbers', '_blank');\n },\n separator: true,\n multiline: true,\n verify: async() => {\n const {isAnonymous} = await this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()) || {};\n return isAnonymous;\n }\n }]\n }\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n const url = this.link.title.textContent;\n copyTextToClipboard(url);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then((chatFull) => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n const isPrivate = url.includes('/c/');\n toast(I18n.format(isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied', true));\n // });\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_ShareLink',\n onClick: () => {\n simulateClickEvent(this.link.container);\n }\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 listenerSetter: this.listenerSetter\n });\n\n listenerSetter.add(this.notifications.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n // let checked = this.notificationsCheckbox.checked;\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.threadId});\n });\n\n listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\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 const n = async({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n if(this.peerId !== peerId) {\n return false;\n }\n\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n if(isForum && this.threadId ? this.threadId === threadId : true) {\n return true;\n }\n\n return false;\n };\n\n listenerSetter.add(rootScope)('peer_title_edit', async(data) => {\n if(await n(data)) {\n this.fillUsername();\n this.setMoreDetails(true);\n }\n });\n\n listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n if(this.peerId === userId.toPeerId()) {\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user.pFlags.self || !this.isDialog) {\n this.fillUserPhone();\n }\n }\n });\n\n listenerSetter.add(rootScope)('avatar_update', async(data) => {\n if(await n(data)) {\n this.setAvatar();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(() => this.setPeerStatus(), 60e3);\n }\n\n private async setPeerStatus(\n needClear = false,\n manual?: T\n ): Promise void : void> {\n const peerId = this.peerId;\n\n const callbacks: Array<() => void> = [];\n callbacks.push(() => {\n this.element.classList.toggle('is-me', peerId === rootScope.myId);\n });\n\n let promise: Promise<(() => void) | void> = Promise.resolve();\n if(!(!peerId || (rootScope.myId === peerId && this.isDialog))) {\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n const middleware = this.middlewareHelper.get();\n if(isForum && this.threadId) {\n promise = wrapTopicNameButton({\n peerId,\n wrapOptions: {\n middleware\n }\n }).then(({element}) => {\n this.subtitle.replaceChildren(element);\n });\n } else {\n promise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: true,\n middleware,\n ignoreSelf: !this.isDialog\n });\n }\n\n promise.then((callback) => callback && callbacks.push(callback));\n }\n\n const callback = () => callbacks.forEach((callback) => callback());\n\n return promise.then(() => {\n if(manual) {\n return callback;\n }\n\n callback();\n }) as any;\n }\n\n public cleanupHTML() {\n [\n this.bio,\n this.phone,\n this.username,\n this.location,\n this.link\n ].forEach((row) => {\n row.container.style.display = 'none';\n });\n\n if(this.notifications) {\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n }\n\n this.clearSetMoreDetailsTimeout();\n }\n\n private canBeDetailed() {\n return this.peerId !== rootScope.myId || !this.isDialog;\n }\n\n private createAvatar() {\n const avatar = new AvatarElement();\n avatar.classList.add('profile-avatar', 'avatar-120');\n avatar.isDialog = this.isDialog;\n avatar.attachClickEvent();\n return avatar;\n }\n\n private async _setAvatar() {\n const {peerId} = this;\n const isTopic = !!(this.threadId && await this.managers.appPeersManager.isForum(peerId));\n if(this.canBeDetailed() && !isTopic) {\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable, this.managers);\n await this.avatars.setPeer(peerId);\n\n return () => {\n this.avatars.info.append(this.name, this.subtitle);\n\n this.avatar?.remove();\n this.avatar = undefined;\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 }\n }\n\n const avatar = this.createAvatar();\n await avatar.updateWithOptions({\n peerId,\n threadId: isTopic ? this.threadId : undefined,\n wrapOptions: {\n customEmojiSize: makeMediaSize(120, 120),\n middleware: this.middlewareHelper.get()\n }\n });\n\n return () => {\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?.remove();\n this.avatar = avatar;\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n };\n }\n\n private setAvatar(manual?: T): T extends true ? Promise<() => void> : Promise {\n const promise = this._setAvatar();\n return manual ? promise : promise.then((callback) => callback()) as any;\n }\n\n private getUsernamesAlso(usernames: string[]) {\n const also = usernames.slice(1);\n if(also.length) {\n const a = also.map((username) => anchorCopy({username}));\n const i = i18n('UsernameAlso', [join(a, false)]);\n return i;\n }\n }\n\n private async fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const usernames = await this.managers.appPeersManager.getPeerActiveUsernames(peerId);\n const also = this.getUsernamesAlso(usernames);\n\n return () => {\n this.username.subtitle.replaceChildren(also || i18n('Username'));\n setText(usernames[0], this.username);\n };\n }\n }\n\n private async fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const {phone, isAnonymous} = await this.managers.appUsersManager.getUserPhone(peerId.toUserId()) || {};\n\n return () => {\n this.phone.subtitle.replaceChildren(i18n(isAnonymous ? 'AnonymousNumber' : 'Phone'));\n setText(phone ? formatUserPhone(phone) : undefined, this.phone);\n };\n }\n }\n\n private async fillNotifications() {\n const notificationsRow = this.notifications;\n if(!notificationsRow) {\n return;\n }\n\n if(this.canBeDetailed()) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n return () => {\n notificationsRow.checkboxField.checked = !muted;\n };\n } else {\n return () => {\n // fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n // });\n };\n }\n }\n\n private async fillName() {\n const {peerId} = this;\n const [element/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: this.isDialog,\n withIcons: !this.threadId,\n threadId: this.threadId\n })\n\n // generateTitleIcons(peerId)\n ]);\n\n return () => {\n replaceContent(this.name, element);\n // this.name.append(...icons);\n };\n }\n\n private async fillRows(manual: Promise) {\n return Promise.all([\n this.fillName(),\n this.fillUsername(),\n this.fillUserPhone(),\n this.fillNotifications(),\n this.setMoreDetails(undefined, manual),\n this.setPeerStatus(true, true)\n ]).then((callbacks) => {\n return () => {\n callbacks.forEach((callback) => callback?.());\n };\n });\n }\n\n public async fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n\n this.cleanupHTML();\n const deferred = deferredPromise();\n const middleware = this.middlewareHelper.get();\n middleware.onClean(() => {\n deferred.reject();\n });\n\n const callbacks = await Promise.all([\n this.setAvatar(true),\n this.fillRows(deferred)\n ]);\n\n return () => {\n deferred.resolve();\n callbacks.forEach((callback) => callback?.());\n };\n }\n\n private async _setMoreDetails(peerId: PeerId, peerFull?: ChatFull | UserFull) {\n const m = this.getMiddlewarePromise();\n const isTopic = !!(this.threadId && await m(this.managers.appPeersManager.isForum(peerId)));\n if(isTopic) {\n let url = 'https://t.me/';\n const threadId = getServerMessageId(this.threadId);\n const username = await m(this.managers.appPeersManager.getPeerUsername(peerId));\n if(username) {\n url += `${username}/${threadId}`;\n } else {\n url += `c/${peerId.toChatId()}/${threadId}`;\n }\n\n return () => {\n setText(url, this.link);\n };\n }\n\n const callbacks: (() => void)[] = [];\n // if(peerFull.about) {\n callbacks.push(() => {\n this.bio.subtitle.replaceChildren(i18n(peerId.isUser() ? 'UserBio' : 'Info'));\n setText(peerFull.about ? wrapRichText(peerFull.about) : undefined, this.bio);\n });\n // }\n\n if(!peerId.isUser()) {\n const chat = await m(this.managers.appChatsManager.getChat(peerId.toChatId())) as Chat.channel;\n const usernames = getPeerActiveUsernames(chat);\n let also: HTMLElement;\n if(usernames.length) {\n also = this.getUsernamesAlso(usernames);\n callbacks.push(() => setText('https://t.me/' + usernames[0], this.link));\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite?._ === 'chatInviteExported') {\n callbacks.push(() => setText(exportedInvite.link, this.link));\n }\n }\n\n callbacks.push(() => this.link.subtitle.replaceChildren(also || i18n('SetUrlPlaceholder')));\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n callbacks.push(() => setText(location.address, this.location));\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n\n return () => {\n callbacks.forEach((callback) => callback());\n };\n }\n\n private async setMoreDetails(override?: true, manual?: Promise) {\n this.clearSetMoreDetailsTimeout();\n\n const {peerId} = this;\n const m = this.getMiddlewarePromise();\n\n if(!peerId || !this.canBeDetailed() || await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n return;\n }\n\n const result = await m(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId, override));\n const setPromise = m(result.result).then(async(peerFull) => {\n if(await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n // this.log.warn('peer changed');\n return;\n }\n\n return await m(this._setMoreDetails(peerId, peerFull));\n });\n\n if(result.cached && manual) {\n return setPromise;\n } else {\n (manual || Promise.resolve())\n .then(() => setPromise)\n .then((callback) => {\n callback?.();\n });\n }\n }\n\n private getMiddlewarePromise() {\n return middlewarePromise(this.middlewareHelper.get(), makeError('MIDDLEWARE'));\n }\n\n public setPeer(peerId: PeerId, threadId?: number) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n this.init?.();\n\n this.peerId = peerId;\n this.threadId = threadId;\n\n this.middlewareHelper.clean();\n this.cleaned = true;\n }\n\n public clearSetMoreDetailsTimeout() {\n if(this.setMoreDetailsTimeout !== undefined) {\n clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = undefined;\n }\n }\n\n public destroy() {\n this.peerId = this.threadId = undefined;\n this.clearSetMoreDetailsTimeout();\n clearInterval(this.setPeerStatusInterval);\n this.avatars?.cleanup();\n this.middlewareHelper.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 mediaSizes from '../helpers/mediaSizes';\nimport {Middleware} from '../helpers/middleware';\nimport {Chat, Document, EmojiStatus, User} from '../layer';\nimport rootScope from '../lib/rootScope';\nimport generateFakeIcon from './generateFakeIcon';\nimport generatePremiumIcon from './generatePremiumIcon';\nimport generateVerifiedIcon from './generateVerifiedIcon';\nimport wrapSticker from './wrappers/sticker';\n\nexport default async function generateTitleIcons(\n peerId: PeerId,\n middleware?: Middleware,\n noVerifiedIcon?: boolean,\n noFakeIcon?: boolean,\n noPremiumIcon?: boolean\n) {\n const elements: HTMLElement[] = [];\n const peer: Chat | User = await rootScope.managers.appPeersManager.getPeer(peerId);\n if((peer as Chat.channel).pFlags.verified && !noVerifiedIcon) {\n elements.push(generateVerifiedIcon());\n }\n\n if(((peer as Chat.channel).pFlags.fake || (peer as User.user).pFlags.scam) && !noFakeIcon) {\n elements.push(generateFakeIcon((peer as User.user).pFlags.scam));\n }\n\n if((peer as User.user).pFlags.premium && !noPremiumIcon) {\n const emojiStatus = (peer as User.user).emoji_status;\n if(emojiStatus && emojiStatus._ !== 'emojiStatusEmpty' && false) {\n const container = document.createElement('span');\n container.classList.add('emoji-status');\n const result = await rootScope.managers.acknowledged.appEmojiManager.getCustomEmojiDocument((emojiStatus as EmojiStatus.emojiStatus).document_id);\n const wrap = async(doc: Document.document) => {\n const size = mediaSizes.active.emojiStatus\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n div: container,\n width: size.width,\n height: size.height,\n loop: 2,\n play: true,\n group: 'EMOJI-STATUS',\n loadPromises,\n middleware\n // group: 'none'\n });\n\n await Promise.all(loadPromises);\n };\n\n const p = result.result.then(wrap);\n if(result.cached) {\n await p;\n }\n\n elements.push(container);\n } else {\n elements.push(generatePremiumIcon());\n }\n }\n\n return elements;\n}\n","export default function generateVerifiedIcon() {\n const span = document.createElement('span');\n span.classList.add('verified-icon', 'tgico');\n\n const size = 26; // 24\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${size} ${size}`);\n svg.setAttributeNS(null, 'width', `${size}`);\n svg.setAttributeNS(null, 'height', `${size}`);\n svg.classList.add('verified-icon-svg');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-icon-background');\n use.classList.add('verified-icon-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-icon-check');\n use2.classList.add('verified-icon-check');\n\n // svg.append(use, use2);\n svg.append(use2, use);\n\n span.append(svg);\n\n return span;\n // const span = document.createElement('span');\n // span.classList.add('verified-icon', 'tgico-verified_filled');\n // return span;\n}\n","export default function generatePremiumIcon() {\n const span = document.createElement('span');\n span.classList.add('premium-icon', 'tgico-star');\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {i18n} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport limitSymbols from '../helpers/string/limitSymbols';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport safeAssign from '../helpers/object/safeAssign';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport generateTitleIcons from './generateTitleIcons';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\n\nexport type PeerTitleOptions = {\n peerId?: PeerId,\n fromName?: string,\n plainText?: boolean,\n onlyFirstName?: boolean,\n dialog?: boolean,\n limitSymbols?: number,\n withIcons?: boolean,\n withPremiumIcon?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n};\n\nconst weakMap: WeakMap = new WeakMap();\n\nrootScope.addEventListener('peer_title_edit', ({peerId, threadId}) => {\n let query = `.peer-title[data-peer-id=\"${peerId}\"]`;\n if(threadId) {\n query += `[data-thread-id=\"${threadId}\"]`;\n }\n\n const elements = Array.from(document.querySelectorAll(query)) as HTMLElement[];\n elements.forEach((element) => {\n const peerTitle = weakMap.get(element);\n peerTitle?.update();\n });\n});\n\nexport default class PeerTitle {\n public element: HTMLElement;\n public options: PeerTitleOptions;\n private hasInner: boolean;\n\n constructor(options?: PeerTitleOptions) {\n this.element = document.createElement('span');\n this.element.classList.add('peer-title');\n this.element.setAttribute('dir', 'auto');\n\n this.options = {};\n\n if(options) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n public setOptions(options?: PeerTitleOptions) {\n if(!options) {\n return;\n }\n\n safeAssign(this.options, options);\n for(const i in options) {\n // @ts-ignore\n const value = options[i];\n\n if(typeof(value) !== 'object' && typeof(value) !== 'function') {\n // @ts-ignore\n this.element.dataset[i] = value ? '' + (typeof(value) === 'boolean' ? +value : value) : '0';\n }\n }\n }\n\n private setHasInner(hasInner: boolean) {\n if(this.hasInner !== hasInner) {\n this.hasInner = hasInner;\n this.element.classList.toggle('with-icons', hasInner);\n }\n }\n\n public async update(options?: PeerTitleOptions) {\n this.setOptions(options);\n\n let fromName = this.options.fromName;\n if(fromName !== undefined) {\n if(this.options.limitSymbols !== undefined) {\n fromName = limitSymbols(fromName, this.options.limitSymbols, this.options.limitSymbols);\n }\n\n setInnerHTML(this.element, wrapEmojiText(fromName));\n return;\n }\n\n this.options.peerId ??= NULL_PEER_ID;\n\n let hasInner: boolean;\n const {peerId, threadId} = this.options;\n if(peerId !== rootScope.myId || !this.options.dialog) {\n if(threadId) {\n const [topic, isForum] = await Promise.all([\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId),\n rootScope.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!topic && isForum) {\n rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId).then((forumTopic) => {\n if(!forumTopic && this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n return;\n }\n\n this.update();\n }, () => {\n if(this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n }\n });\n\n setInnerHTML(this.element, i18n('Loading'));\n this.setHasInner(false);\n return;\n }\n }\n\n const getTopicIconPromise = threadId && this.options.withIcons ?\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId).then((topic) => wrapTopicIcon({...(this.options.wrapOptions ?? {}), topic})) :\n undefined;\n\n const [title, icons, topicIcon] = await Promise.all([\n getPeerTitle(this.options as Required),\n (this.options.withIcons && generateTitleIcons(peerId, this.options.wrapOptions?.middleware)) || (this.options.withPremiumIcon && generateTitleIcons(peerId, this.options.wrapOptions?.middleware, true, true)),\n getTopicIconPromise\n ]);\n\n if(icons?.length || topicIcon) {\n const inner = document.createElement('span');\n inner.classList.add('peer-title-inner');\n hasInner = true;\n setInnerHTML(inner, title);\n\n const fragment = document.createDocumentFragment();\n fragment.append(...[topicIcon, inner, ...(icons ?? [])].filter(Boolean));\n setInnerHTML(this.element, fragment);\n } else {\n setInnerHTML(this.element, title);\n }\n } else {\n replaceContent(this.element, i18n(this.options.onlyFirstName ? 'Saved' : 'SavedMessages'));\n }\n\n this.setHasInner(hasInner);\n }\n}\n","/*\n * 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 {AppDownloadManager} from '../../lib/appManagers/appDownloadManager';\nimport resizeableImage from '../../lib/cropper';\nimport PopupElement from '.';\nimport {_i18n} from '../../lib/langPack';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport rootScope from '../../lib/rootScope';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\n\nexport default class PopupAvatar extends PopupElement {\n private cropContainer: HTMLElement;\n private input: HTMLInputElement;\n private h6: HTMLElement;\n\n private image = new Image();\n\n private canvas: HTMLCanvasElement;\n private blob: Blob;\n private cropper = {\n crop: () => {},\n removeHandlers: () => {}\n };\n\n private onCrop: (upload: () => ReturnType) => void;\n\n constructor(options: Partial<{\n isForum: boolean\n }> = {}) {\n super('popup-avatar', {closable: true, withConfirm: true});\n\n this.h6 = document.createElement('h6');\n _i18n(this.h6, 'Popup.Avatar.Title');\n\n this.btnClose.classList.remove('btn-icon');\n\n this.header.append(this.h6);\n\n this.cropContainer = document.createElement('div');\n this.cropContainer.classList.add('crop');\n this.cropContainer.append(this.image);\n\n if(options.isForum) {\n this.cropContainer.classList.add('is-forum');\n }\n\n this.input = document.createElement('input');\n this.input.type = 'file';\n this.input.style.display = 'none';\n this.listenerSetter.add(this.input)('change', (e: any) => {\n const file = e.target.files[0];\n if(!file) {\n return;\n }\n\n readBlobAsDataURL(file).then((contents) => {\n this.image = new Image();\n this.cropContainer.append(this.image);\n this.image.src = contents;\n\n this.image.onload = () => {\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\n cropContainer.style.width = w + 'px';\n cropContainer.style.height = h + 'px'; */\n this.show();\n\n this.cropper = resizeableImage(this.image, this.canvas);\n this.input.value = '';\n };\n });\n }, false);\n\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\n attachClickEvent(this.btnConfirm, () => {\n this.cropper.crop();\n this.hide();\n\n this.canvas.toBlob((blob) => {\n this.blob = blob; // save blob to send after reg\n this.darkenCanvas();\n this.resolve();\n }, 'image/jpeg', 1);\n }, {listenerSetter: this.listenerSetter});\n\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\n\n this.addEventListener('closeAfterTimeout', () => {\n this.cropper.removeHandlers();\n if(this.image) {\n this.image.remove();\n }\n });\n }\n\n private resolve() {\n this.onCrop(() => {\n return appDownloadManager.upload(this.blob);\n });\n }\n\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\n this.canvas = postCanvas;\n this.onCrop = onCrop;\n\n this.input.click();\n }\n\n public darkenCanvas() {\n const ctx = this.canvas.getContext('2d');\n ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\n let cropComponent: HTMLDivElement,\n container: HTMLDivElement,\n cropImage: HTMLImageElement,\n event_state: Partial<{\n mouse_x: number,\n mouse_y: number,\n container_width: number,\n container_height: number,\n container_left: number,\n container_top: number\n }> = {},\n keyZoomValue = 4.0,\n MINWIDTH = 50,\n MINHEIGHT = 50,\n CROPWIDTH = 200,\n CROPHEIGHT = 200,\n cropLeft = 0,\n cropTop = 0,\n cropWidth = 0,\n cropHeight = 0,\n scaledRatio = 0;\n\n if(originalImage.complete) init();\n else originalImage.onload = init;\n\n function removeHandlers() {\n container.removeEventListener('mousedown', startMoving);\n container.removeEventListener('touchstart', startMoving);\n container.removeEventListener('wheel', resizing);\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n document.removeEventListener('keypress', keyHandler);\n\n cropComponent.remove();\n container.remove();\n cropImage.remove();\n }\n\n function addHandlers() {\n container.addEventListener('mousedown', startMoving, false);\n container.addEventListener('touchstart', startMoving, false);\n container.addEventListener('wheel', resizing, false);\n\n document.addEventListener('keypress', keyHandler, false);\n // document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\n }\n\n function init() {\n originalImage.classList.add('crop-blur');\n originalImage.draggable = false;\n\n cropImage = new Image();\n cropImage.src = originalImage.src;\n cropImage.draggable = false;\n cropImage.classList.add('crop-overlay-image');\n\n if(!canvas) {\n canvas = document.createElement('canvas');\n }\n\n cropComponent = document.createElement('div');\n cropComponent.classList.add('crop-component');\n\n container = document.createElement('div');\n container.classList.add('crop-overlay');\n\n const overlayColor = document.createElement('div');\n overlayColor.classList.add('crop-overlay-color');\n\n cropComponent.appendChild(container);\n const wrapper = originalImage.parentNode as HTMLElement;\n wrapper.appendChild(cropComponent);\n cropComponent.appendChild(cropImage);\n cropComponent.appendChild(originalImage);\n cropComponent.appendChild(overlayColor);\n container.appendChild(cropImage);\n\n cropImage.style.maxWidth = originalImage.width + 'px';\n\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\n\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\n\n updateCropSize(CROPWIDTH, CROPHEIGHT);\n updateCropImage(left, top);\n updateContainer(left, top);\n addHandlers();\n // crop();\n }\n\n function updateCropSize(width: number, height: number) {\n cropWidth = width * scaledRatio;\n cropHeight = height * scaledRatio;\n\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n }\n\n function updateCropImage(left: number, top: number) {\n cropTop = top * scaledRatio;\n cropLeft = left * scaledRatio;\n\n cropImage.style.top = -top + 'px';\n cropImage.style.left = -left + 'px';\n }\n\n function updateContainer(left: number, top: number) {\n container.style.top = top + 'px';\n container.style.left = left + 'px';\n }\n\n // Save the initial event details and container state\n function saveEventState(e: any) {\n event_state.container_width = container.offsetWidth;\n event_state.container_height = container.offsetHeight;\n\n event_state.container_left = container.offsetLeft;\n event_state.container_top = container.offsetTop;\n\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\n }\n\n function imgZoom(zoom: number) {\n zoom = zoom * Math.PI * 2\n let newWidth = Math.floor(container.clientWidth + zoom),\n newHeight = Math.floor(container.clientHeight + zoom),\n w = cropImage.clientWidth,\n h = cropImage.clientHeight,\n left: number,\n top: number,\n right: number,\n bottom: number;\n\n if(newWidth < MINWIDTH) {\n return;\n } else if(newWidth > w) {\n return;\n }\n\n left = container.offsetLeft - (zoom / 2);\n top = container.offsetTop - (zoom / 2);\n right = left + newWidth;\n bottom = top + newHeight;\n\n if(left < 0) left = 0;\n if(top < 0) top = 0;\n\n if(right > w) return;\n if(bottom > h) return;\n\n updateCropSize(newWidth, newWidth);\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function keyHandler(e: KeyboardEvent) {\n e.preventDefault();\n\n switch(String.fromCharCode(e.charCode)) {\n case '+':\n imgZoom(keyZoomValue);\n break;\n case '-':\n imgZoom(-keyZoomValue);\n break;\n }\n }\n\n function resizing(e: any) {\n e.preventDefault();\n imgZoom(e.deltaY > 0 ? 1 : -1);\n }\n\n function startMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n saveEventState(e);\n\n document.addEventListener('mousemove', moving);\n document.addEventListener('touchmove', moving);\n document.addEventListener('mouseup', endMoving);\n document.addEventListener('touchend', endMoving);\n }\n\n function endMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n }\n\n function moving(e: any) {\n let currentTouch = {x: 0, y: 0},\n left: number,\n top: number,\n w: number,\n h: number;\n\n e.preventDefault();\n e.stopPropagation();\n\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\n\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\n w = container.offsetWidth;\n h = container.offsetHeight;\n\n if(left < 0) left = 0;\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\n\n if(top < 0) top = 0;\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\n\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function crop() {\n canvas.width = cropWidth;\n canvas.height = cropHeight;\n\n const ctx = canvas.getContext('2d');\n ctx.drawImage(originalImage,\n cropLeft, cropTop,\n cropWidth, cropHeight,\n 0, 0,\n cropWidth, cropHeight\n );\n }\n\n return {crop, removeHandlers};\n}\n\nexport default resizeableImage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport type {PeerType} from '../../lib/appManagers/appPeersManager';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\n\nexport default class PopupDeleteDialog {\n constructor(\n private peerId: PeerId,\n // actionType: 'leave' | 'delete',\n private peerType?: PeerType,\n private onSelect?: (promise: Promise) => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, peerType, onSelect, threadId} = this;\n const peerTitleElement = await wrapPeerTitle({peerId, threadId: threadId});\n\n const managers = PopupElement.MANAGERS;\n if(peerType === undefined) {\n peerType = await managers.appPeersManager.getDialogType(peerId);\n }\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = managers.appChatsManager.leave(peerId.toChatId());\n\n if(flush) {\n promise = promise.then(() => {\n return managers.appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n\n onSelect?.(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(threadId) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, true, threadId);\n } else if(peerId.isUser()) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = managers.appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n\n onSelect?.(promise);\n };\n\n let title: LangPackKey,\n titleArgs: FormatterArguments,\n description: LangPackKey,\n descriptionArgs: FormatterArguments,\n buttons: PopupPeerOptions['buttons'],\n checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n await wrapPeerTitle({peerId})\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(threadId) {\n title = 'DeleteTopics';\n titleArgs = [1];\n description = 'DeleteSelectedTopic';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback: callbackDelete\n }];\n } else if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n threadId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\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 rootScope from '../../lib/rootScope';\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport {ChatType} from '../chat/chat';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupDeleteMessages {\n constructor(\n private peerId: PeerId,\n private mids: number[],\n private type: ChatType,\n private onConfirm?: () => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, mids, type, onConfirm, threadId} = this;\n\n const peerTitleElement = await wrapPeerTitle({peerId, threadId});\n\n const managers = PopupElement.MANAGERS;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n managers.appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n managers.appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n const buttons: PopupPeerOptions['buttons'] = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n const checkboxes: PopupPeerOptions['checkboxes'] = [];\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n\n if(await managers.appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n\n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId());\n\n const _hasRights = hasRights(chat, 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = _hasRights ? mids.slice() : await filterAsync(mids, async(mid) => {\n const message = await managers.appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n // description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n threadId,\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 appImManager from '../../lib/appManagers/appImManager';\nimport PopupPickUser from './pickUser';\n\nexport default class PopupForward extends PopupPickUser {\n constructor(\n peerIdMids: {[fromPeerId: PeerId]: number[]},\n onSelect?: (peerId: PeerId) => Promise | void,\n overrideOnSelect = false\n ) {\n super({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\n if(onSelect) {\n const res = onSelect(peerId);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n appImManager.setInnerPeer({peerId});\n appImManager.chat.input.initMessagesForward(peerIdMids);\n },\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\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 ripple from '../ripple';\nimport animationIntersector from '../animationIntersector';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\nimport {addFullScreenListener, getFullScreenElement} from '../../helpers/dom/fullScreen';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport Scrollable from '../scrollable';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nexport type PopupButton = {\n text?: string,\n callback?: () => void,\n langKey?: LangPackKey,\n langArgs?: any[],\n isDanger?: true,\n isCancel?: true,\n element?: HTMLButtonElement\n};\n\nexport type PopupOptions = Partial<{\n closable: boolean,\n overlayClosable: boolean,\n withConfirm: LangPackKey | boolean,\n body: boolean,\n confirmShortcutIsSendShortcut: boolean,\n withoutOverlay: boolean,\n scrollable: boolean,\n buttons: Array,\n title: boolean | LangPackKey,\n titleRaw: string\n}>;\n\nexport interface PopupElementConstructable {\n new(...args: any[]): T;\n}\n\nconst DEFAULT_APPEND_TO = document.body;\nlet appendPopupTo = DEFAULT_APPEND_TO;\n\nconst onFullScreenChange = () => {\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\n PopupElement.reAppend();\n};\n\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\n\ntype PopupListeners = {\n close: () => void,\n closeAfterTimeout: () => void\n};\n\nexport default class PopupElement extends EventListenerBase {\n private static POPUPS: PopupElement[] = [];\n public static MANAGERS: AppManagers;\n\n protected element = document.createElement('div');\n protected container = document.createElement('div');\n protected header = document.createElement('div');\n protected title = document.createElement('div');\n protected btnClose: HTMLElement;\n protected btnConfirm: HTMLButtonElement;\n protected body: HTMLElement;\n protected buttonsEl: HTMLElement;\n\n protected onEscape: () => boolean = () => true;\n\n protected navigationItem: NavigationItem;\n\n protected listenerSetter: ListenerSetter;\n\n protected confirmShortcutIsSendShortcut: boolean;\n protected btnConfirmOnEnter: HTMLElement;\n\n protected withoutOverlay: boolean;\n\n protected managers: AppManagers;\n\n protected scrollable: Scrollable;\n\n protected buttons: Array;\n\n protected middlewareHelper: MiddlewareHelper;\n\n constructor(className: string, options: PopupOptions = {}) {\n super(false);\n this.element.classList.add('popup');\n this.element.className = 'popup' + (className ? ' ' + className : '');\n this.container.classList.add('popup-container', 'z-depth-1');\n\n this.header.classList.add('popup-header');\n\n if(options.title || options.titleRaw) {\n this.title.classList.add('popup-title');\n if(typeof(options.title) === 'string') {\n _i18n(this.title, options.title);\n } else if(options.titleRaw) {\n this.title.append(wrapEmojiText(options.titleRaw));\n }\n\n this.header.append(this.title);\n }\n\n this.middlewareHelper = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.managers = PopupElement.MANAGERS;\n\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\n\n if(options.closable) {\n this.btnClose = document.createElement('span');\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\n // ripple(this.closeBtn);\n this.header.prepend(this.btnClose);\n\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\n }\n\n this.withoutOverlay = options.withoutOverlay;\n if(this.withoutOverlay) {\n this.element.classList.add('no-overlay');\n }\n\n if(options.overlayClosable) {\n attachClickEvent(this.element, (e: MouseEvent) => {\n if(!findUpClassName(e.target, 'popup-container')) {\n this.hide();\n }\n }, {listenerSetter: this.listenerSetter});\n }\n\n if(options.withConfirm) {\n this.btnConfirm = document.createElement('button');\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\n if(options.withConfirm !== true) {\n this.btnConfirm.append(i18n(options.withConfirm));\n }\n this.header.append(this.btnConfirm);\n ripple(this.btnConfirm);\n }\n\n this.container.append(this.header);\n if(options.body) {\n this.body = document.createElement('div');\n this.body.classList.add('popup-body');\n this.container.append(this.body);\n }\n\n if(options.scrollable) {\n const scrollable = this.scrollable = new Scrollable(this.body);\n this.attachScrollableListeners();\n\n if(!this.body) {\n this.container.insertBefore(scrollable.container, this.header.nextSibling);\n }\n }\n\n let btnConfirmOnEnter = this.btnConfirm;\n const buttons = this.buttons = options.buttons;\n if(buttons?.length) {\n const buttonsDiv = this.buttonsEl = document.createElement('div');\n buttonsDiv.classList.add('popup-buttons');\n\n const buttonsElements = buttons.map((b) => {\n const button = document.createElement('button');\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\n\n ripple(button);\n\n if(b.text) {\n button.innerHTML = b.text;\n } else {\n button.append(i18n(b.langKey, b.langArgs));\n }\n\n attachClickEvent(button, () => {\n b.callback && b.callback();\n this.destroy();\n }, {listenerSetter: this.listenerSetter, once: true});\n\n return b.element = button;\n });\n\n if(!btnConfirmOnEnter && buttons.length === 2) {\n const button = buttons.find((button) => !button.isCancel);\n if(button) {\n btnConfirmOnEnter = button.element;\n }\n }\n\n buttonsDiv.append(...buttonsElements);\n this.container.append(buttonsDiv);\n }\n\n this.btnConfirmOnEnter = btnConfirmOnEnter;\n\n this.element.append(this.container);\n\n PopupElement.POPUPS.push(this);\n }\n\n protected attachScrollableListeners(setClassOn?: HTMLElement) {\n return this.scrollable.attachBorderListeners(setClassOn);\n }\n\n protected onContentUpdate() {\n if(this.scrollable) {\n this.scrollable.onAdditionalScroll();\n }\n }\n\n public show() {\n this.navigationItem = {\n type: 'popup',\n onPop: () => this.destroy(),\n onEscape: this.onEscape\n };\n\n appNavigationController.pushItem(this.navigationItem);\n\n blurActiveElement(); // * hide mobile keyboard\n appendPopupTo.append(this.element);\n void this.element.offsetWidth; // reflow\n this.element.classList.add('active');\n\n this.onContentUpdate();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = true;\n animationIntersector.checkAnimations2(true);\n }\n\n // cannot add event instantly because keydown propagation will fire it\n // if(this.btnConfirmOnEnter) {\n setTimeout(() => {\n if(!this.element.classList.contains('active')) {\n return;\n }\n\n this.listenerSetter.add(document.body)('keydown', (e) => {\n if(PopupElement.POPUPS[PopupElement.POPUPS.length - 1] !== this) {\n return;\n }\n\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\n simulateClickEvent(this.btnConfirmOnEnter);\n cancelEvent(e);\n }\n });\n }, 0);\n // }\n }\n\n public hide = () => {\n appNavigationController.backByItem(this.navigationItem);\n };\n\n protected destroy() {\n this.dispatchEvent('close');\n this.element.classList.add('hiding');\n this.element.classList.remove('active');\n this.listenerSetter.removeAll();\n this.middlewareHelper.destroy();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = false;\n }\n\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n\n indexOfAndSplice(PopupElement.POPUPS, this);\n\n // ! calm\n onFullScreenChange();\n\n setTimeout(() => {\n this.element.remove();\n this.dispatchEvent('closeAfterTimeout');\n this.cleanup();\n this.scrollable?.destroy();\n\n if(!this.withoutOverlay) {\n animationIntersector.checkAnimations2(false);\n }\n }, 150);\n }\n\n public static reAppend() {\n this.POPUPS.forEach((popup) => {\n const {element, container} = popup;\n const parentElement = element.parentElement;\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\n appendPopupTo.append(element);\n }\n });\n }\n\n public static getPopups(popupConstructor: PopupElementConstructable) {\n return this.POPUPS.filter((element) => element instanceof popupConstructor) as T[];\n }\n\n public static createPopup>(ctor: {new(...args: A): T}, ...args: A) {\n const popup = new ctor(...args);\n return popup;\n }\n}\n\nexport const addCancelButton = (buttons: PopupButton[]) => {\n const button = buttons.find((b) => b.isCancel);\n if(!button) {\n buttons.push({\n langKey: 'Cancel',\n isCancel: true\n });\n }\n\n return buttons;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport tsNow from '../../helpers/tsNow';\nimport {LangPackKey} from '../../lib/langPack';\nimport {MUTE_UNTIL} from '../../lib/mtproto/mtproto_config';\nimport {RadioFormFromValues} from '../row';\nimport PopupPeer from './peer';\n\nconst ONE_HOUR = 3600;\nconst times: {value: number | string, langPackKey: LangPackKey, checked?: boolean}[] = [{\n value: ONE_HOUR,\n langPackKey: 'ChatList.Mute.1Hour'\n}, {\n value: ONE_HOUR * 4,\n langPackKey: 'ChatList.Mute.4Hours'\n}, {\n value: ONE_HOUR * 8,\n langPackKey: 'ChatList.Mute.8Hours'\n}, {\n value: ONE_HOUR * 24,\n langPackKey: 'ChatList.Mute.1Day'\n}, {\n value: ONE_HOUR * 24 * 3,\n langPackKey: 'ChatList.Mute.3Days'\n}, {\n value: -1,\n langPackKey: 'ChatList.Mute.Forever',\n checked: true\n}];\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId, threadId?: number) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n this.managers.appMessagesManager.mutePeer({peerId, muteUntil: time === -1 ? MUTE_UNTIL : tsNow(true) + time, threadId});\n }\n }],\n body: true\n });\n\n let time: number;\n const radioForm = RadioFormFromValues(times, (value) => {\n time = +value;\n });\n\n this.body.append(radioForm);\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 AvatarElement from '../avatar';\nimport PopupElement, {addCancelButton, PopupButton, PopupOptions} from '.';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport CheckboxField, {CheckboxFieldOptions} from '../checkboxField';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = Omit & Partial<{\n peerId: PeerId,\n threadId: number,\n title: string | HTMLElement,\n titleLangKey: LangPackKey,\n titleLangArgs: any[],\n noTitle: boolean,\n description: string | DocumentFragment,\n descriptionLangKey: LangPackKey,\n descriptionLangArgs: any[],\n buttons: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n protected description: HTMLParagraphElement;\n\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), {\n overlayClosable: true,\n ...options,\n title: true,\n buttons: options.buttons && addCancelButton(options.buttons)\n });\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 threadId: options.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get()\n }\n });\n this.header.prepend(avatarEl);\n }\n\n if(!options.noTitle) {\n if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs));\n else if(options.title instanceof HTMLElement) {\n this.title.append(options.title);\n } else this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = this.description = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) setInnerHTML(p, options.description);\n\n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n\n options.checkboxes.forEach((o) => {\n o.withRipple = true;\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","/*\n * 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 AppSelectPeers from '../appSelectPeers';\nimport PopupElement from '.';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\n\nexport default class PopupPickUser extends PopupElement {\n protected selector: AppSelectPeers;\n\n constructor(options: {\n peerTypes: AppSelectPeers['peerType'],\n onSelect?: (peerId: PeerId) => Promise | void,\n placeholder: LangPackKey,\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n peerId?: number,\n selfPresence?: LangPackKey\n }) {\n super('popup-forward', {closable: true, overlayClosable: true, body: true, title: true});\n\n this.selector = new AppSelectPeers({\n appendTo: this.body,\n onChange: async() => {\n const selected = this.selector.getSelected();\n const peerId = selected[selected.length - 1].toPeerId();\n\n if(options.onSelect) {\n const res = options.onSelect(peerId);\n if(res instanceof Promise) {\n try {\n await res;\n } catch(err) {\n return;\n }\n }\n }\n\n this.selector = null;\n this.hide();\n },\n peerType: options.peerTypes,\n onFirstRender: () => {\n this.show();\n this.selector.checkForTriggers(); // ! due to zero height before mounting\n\n if(!IS_TOUCH_SUPPORTED) {\n this.selector.input.focus();\n }\n },\n chatRightsAction: options.chatRightsAction,\n multiSelect: false,\n rippleEnabled: false,\n avatarSize: 'abitbigger',\n peerId: options.peerId,\n placeholder: options.placeholder,\n selfPresence: options.selfPresence,\n managers: this.managers\n });\n\n this.scrollable = this.selector.scrollable;\n this.attachScrollableListeners();\n\n // this.scrollable = new Scrollable(this.body);\n\n this.title.append(this.selector.input);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupPeer from './peer';\n\nexport default class PopupSendNow extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-delete-chat', {\n title: `Send Message${mids.length > 1 ? 's' : ''} Now`,\n description: mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?',\n buttons: [{\n langKey: 'Send',\n callback: () => {\n onConfirm && onConfirm();\n this.managers.appMessagesManager.sendScheduledMessages(peerId, mids);\n }\n }]\n });\n\n this.show();\n }\n}\n","/*\n * 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 {AppStickersManager} from '../../lib/appManagers/appStickersManager';\nimport PopupElement from '.';\nimport wrapSticker from '../wrappers/sticker';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {putPreloader} from '../putPreloader';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {i18n} from '../../lib/langPack';\nimport Button from '../button';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {toastNew} from '../toast';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport createStickersContextMenu from '../../helpers/dom/createStickersContextMenu';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {Document, StickerSet} from '../../layer';\nimport Row from '../row';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport rootScope from '../../lib/rootScope';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport emoticonsDropdown from '../emoticonsDropdown';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'STICKERS-POPUP';\n\nexport default class PopupStickers extends PopupElement {\n private stickersFooter: HTMLElement;\n private appendTo: HTMLElement;\n private updateAdded: {[setId: Long]: (added: boolean) => void};\n private sets: StickerSet.stickerSet[];\n private button: HTMLElement;\n\n constructor(\n private stickerSetInput: Parameters[0] | Parameters[0][],\n private isEmojis?: boolean\n ) {\n super('popup-stickers', {closable: true, overlayClosable: true, body: true, scrollable: true, title: true});\n\n this.title.append(i18n('Loading'));\n this.updateAdded = {};\n\n emoticonsDropdown.setIgnoreMouseOut('popup', true);\n this.addEventListener('close', () => {\n emoticonsDropdown.setIgnoreMouseOut('popup', false);\n animationIntersector.setOnlyOnePlayableGroup();\n });\n\n this.appendTo = this.scrollable.container;\n\n this.appendTo.classList.add('is-loading');\n putPreloader(this.appendTo, true);\n\n this.stickersFooter = document.createElement('div');\n this.stickersFooter.classList.add('sticker-set-footer');\n\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\n this.stickersFooter.append(btn);\n\n this.body.append(this.stickersFooter);\n\n attachStickerViewerListeners({listenTo: this.appendTo, listenerSetter: this.listenerSetter});\n\n const onStickerSetUpdate = (set: StickerSet.stickerSet) => {\n const idx = this.sets.findIndex((_set) => _set.id === set.id);\n if(idx === -1) {\n return;\n }\n\n this.sets[idx] = set;\n const updateAdded = this.updateAdded[set.id];\n updateAdded?.(!!set.installed_date);\n this.updateButton();\n };\n\n this.listenerSetter.add(rootScope)('stickers_installed', onStickerSetUpdate);\n this.listenerSetter.add(rootScope)('stickers_deleted', onStickerSetUpdate);\n\n this.loadStickerSet();\n }\n\n private createStickerSetElements(set?: StickerSet.stickerSet) {\n const container = document.createElement('div');\n container.classList.add('sticker-set');\n\n let headerRow: Row, updateAdded: (added: boolean) => void;\n if(set) {\n headerRow = new Row({\n title: wrapEmojiText(set.title),\n subtitle: i18n(set.pFlags.emojis ? 'EmojiCount' : 'Stickers', [set.count]),\n buttonRight: true\n });\n\n updateAdded = (added) => {\n replaceContent(headerRow.buttonRight, i18n(added ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n headerRow.buttonRight.classList.toggle('active', added);\n };\n\n updateAdded(!!set.installed_date);\n\n container.append(headerRow.container);\n }\n\n const itemsContainer = document.createElement('div');\n itemsContainer.classList.add('sticker-set-stickers');\n\n container.append(itemsContainer);\n\n return {container, headerRow, updateAdded, itemsContainer};\n }\n\n private onStickersClick = async(e: MouseEvent) => {\n const target = findUpClassName(e.target, 'sticker-set-sticker');\n if(!target) return;\n\n const docId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(docId)) {\n this.hide();\n }\n };\n\n private async loadStickerSet() {\n const middleware = this.middlewareHelper.get();\n const inputs = Array.isArray(this.stickerSetInput) ? this.stickerSetInput : [this.stickerSetInput];\n const setsPromises = inputs.map((input) => this.managers.appStickersManager.getStickerSet(input));\n let sets = await Promise.all(setsPromises);\n if(!middleware()) return;\n let firstSet = sets[0];\n if(sets.length === 1 && !firstSet) {\n toastNew({langPackKey: this.isEmojis ? 'AddEmojiNotFound' : 'StickerSet.DontExist'});\n this.hide();\n return;\n }\n\n sets = sets.filter(Boolean);\n firstSet = sets[0];\n\n this.sets = sets.map((set) => set.set);\n\n const isEmojis = this.isEmojis ??= !!firstSet.set.pFlags.emojis;\n\n if(!isEmojis) {\n attachClickEvent(this.appendTo, this.onStickersClick, {listenerSetter: this.listenerSetter});\n\n const {destroy} = createStickersContextMenu({\n listenTo: this.appendTo,\n isStickerPack: true,\n onSend: () => this.hide()\n });\n\n this.addEventListener('close', destroy);\n }\n\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\n\n const lazyLoadQueue = new LazyLoadQueue();\n const loadPromises: Promise[] = [];\n\n const containersPromises = sets.map(async(set) => {\n const {container, itemsContainer, headerRow, updateAdded} = this.createStickerSetElements(sets.length > 1 ? set.set : undefined);\n\n if(headerRow) {\n attachClickEvent(headerRow.buttonRight, () => {\n this.managers.appStickersManager.toggleStickerSet(set.set);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.updateAdded[set.set.id] = updateAdded;\n\n let divs: (HTMLElement | DocumentFragment)[];\n\n const docs = set.documents.filter((doc) => doc?._ === 'document') as Document.document[];\n if(isEmojis) {\n const fragment = wrapCustomEmoji({\n docIds: docs.map((doc) => doc.id),\n loadPromises,\n animationGroup: ANIMATION_GROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji,\n middleware\n // lazyLoadQueue\n });\n\n (Array.from(fragment.children) as HTMLElement[]).slice(1).forEach((element) => {\n const span = document.createElement('span');\n span.classList.add('super-emoji');\n element.replaceWith(span);\n span.append(element);\n });\n\n divs = [fragment];\n\n itemsContainer.classList.replace('sticker-set-stickers', 'super-emojis');\n itemsContainer.classList.add('is-emojis', 'not-local');\n } else {\n divs = await Promise.all(docs.map(async(doc) => {\n const div = document.createElement('div');\n div.classList.add('sticker-set-sticker');\n\n const size = mediaSizes.active.popupSticker.width;\n\n await wrapSticker({\n doc,\n div,\n lazyLoadQueue,\n group: ANIMATION_GROUP,\n play: true,\n loop: true,\n width: size,\n height: size,\n withLock: true,\n loadPromises,\n middleware\n });\n\n return div;\n }));\n }\n\n itemsContainer.append(...divs.filter(Boolean));\n\n return container;\n });\n\n const containers = await Promise.all(containersPromises);\n await Promise.all(loadPromises);\n\n const button = this.button = Button('', {noRipple: true});\n\n this.updateButton();\n\n attachClickEvent(button, () => {\n const toggle = toggleDisability([button], true);\n\n this.managers.appStickersManager.toggleStickerSets(sets.map((set) => set.set)).then(() => {\n this.hide();\n }).catch(() => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n if(sets.length === 1) {\n setInnerHTML(this.title, wrapEmojiText(firstSet.set.title));\n } else {\n setInnerHTML(this.title, i18n('Emoji'));\n }\n\n this.stickersFooter.textContent = '';\n this.stickersFooter.append(button);\n\n this.appendTo.classList.remove('is-loading');\n this.appendTo.textContent = '';\n this.appendTo.append(...containers);\n\n this.scrollable.onAdditionalScroll();\n }\n\n private updateButton() {\n const {sets, isEmojis} = this;\n let isAdd: boolean, buttonAppend: HTMLElement;\n if(sets.length === 1) {\n const firstSet = sets[0];\n buttonAppend = i18n(isEmojis ? 'EmojiCount' : 'Stickers', [firstSet.count]);\n isAdd = !firstSet.installed_date;\n } else {\n const installed = sets.filter((set) => set.installed_date);\n let count: number;\n if(sets.length === installed.length) {\n isAdd = false;\n count = sets.length;\n } else {\n isAdd = true;\n count = sets.length - installed.length;\n }\n\n buttonAppend = i18n('EmojiPackCount', [count]);\n }\n\n this.button.className = isAdd ? 'btn-primary btn-color-primary' : 'btn-primary btn-primary-transparent danger';\n replaceContent(this.button, i18n(isAdd ? 'AddStickersCount' : 'RemoveStickersCount', [buttonAppend]));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CancellablePromise} from '../helpers/cancellablePromise';\nimport SetTransition from './singleTransition';\nimport {fastRaf} from '../helpers/schedulers';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport safeAssign from '../helpers/object/safeAssign';\n\nconst TRANSITION_TIME = 200;\n\nexport default class ProgressivePreloader {\n public preloader: HTMLDivElement;\n public circle: SVGCircleElement;\n private cancelSvg: SVGSVGElement;\n private downloadSvg: HTMLElement;\n\n private tempId = 0;\n public detached = true;\n\n public promise: CancellablePromise = null;\n\n public isUpload = false;\n private cancelable = true;\n private streamable = false;\n private tryAgainOnFail = true;\n private attachMethod: 'append' | 'prepend' = 'append';\n\n public loadFunc: (e?: Event) => any;\n\n public totalLength: number;\n\n constructor(options?: Partial<{\n isUpload: ProgressivePreloader['isUpload'],\n cancelable: ProgressivePreloader['cancelable'],\n streamable: ProgressivePreloader['streamable'],\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\n attachMethod: ProgressivePreloader['attachMethod']\n }>) {\n if(options) {\n safeAssign(this, options);\n }\n\n if(this.isUpload) {\n this.tryAgainOnFail = false;\n }\n }\n\n public constructContainer(options: Partial<{\n color: 'transparent',\n bold: boolean\n }> = {}) {\n if(!this.preloader) {\n this.preloader = document.createElement('div');\n this.preloader.classList.add('preloader-container');\n\n if(options.color) {\n this.preloader.classList.add('preloader-' + options.color);\n }\n\n if(options.bold) {\n this.preloader.classList.add('preloader-bold');\n }\n\n if(this.streamable) {\n this.preloader.classList.add('preloader-streamable');\n }\n }\n }\n\n public constructDownloadIcon() {\n this.constructContainer();\n }\n\n public construct() {\n this.construct = null;\n\n this.constructContainer();\n\n this.preloader.innerHTML = `\n
\n \n \n \n
`;\n\n if(this.streamable) {\n this.totalLength = 118.61124420166016;\n } else {\n this.totalLength = 149.82473754882812;\n }\n\n if(this.cancelable) {\n this.preloader.innerHTML += `\n \n \n \n \n \n \n \n \n \n \n \n `;\n\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\n } else {\n this.preloader.classList.add('preloader-swing');\n }\n\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\n\n if(this.cancelable) {\n attachClickEvent(this.preloader, this.onClick);\n }\n }\n\n public onClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.preloader.classList.contains('manual')) {\n if(this.loadFunc) {\n this.loadFunc(e);\n }\n } else {\n if(this.promise && this.promise.cancel) {\n this.promise.cancel();\n }\n }\n };\n\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\n this.loadFunc = func;\n }\n\n public setManual() {\n this.preloader.classList.add('manual');\n this.setProgress(0);\n }\n\n public attachPromise(promise: CancellablePromise) {\n if(this.isUpload && this.promise) return;\n\n this.promise = promise;\n\n const tempId = --this.tempId;\n const startTime = Date.now();\n\n const onEnd = (err: Error) => {\n promise.notify = promise.notifyAll = null;\n\n if(tempId !== this.tempId) {\n return;\n }\n\n const elapsedTime = Date.now() - startTime;\n\n // console.log('[PP]: end', this.detached, performance.now());\n\n if(!err && this.cancelable) {\n this.setProgress(100);\n\n const delay = TRANSITION_TIME * 0.75;\n\n if(elapsedTime < delay) {\n this.detach();\n } else {\n setTimeout(() => { // * wait for transition complete\n if(tempId === this.tempId) {\n this.detach();\n }\n }, delay);\n }\n } else {\n if(this.tryAgainOnFail) {\n this.attach(this.preloader.parentElement);\n fastRaf(() => {\n this.setManual();\n });\n } else {\n this.detach();\n }\n }\n\n this.promise = promise = null;\n };\n\n promise\n .then(() => onEnd(null))\n .catch((err) => onEnd(err));\n\n if(promise.addNotifyListener) {\n promise.addNotifyListener((details: {done: number, total: number}) => {\n /* if(details.done >= details.total) {\n onEnd();\n } */\n\n if(tempId !== this.tempId) return;\n\n // console.log('preloader download', promise, details);\n const percents = details.done / details.total * 100;\n this.setProgress(percents);\n });\n }\n }\n\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\n if(this.construct) {\n this.construct();\n }\n\n if(this.preloader.parentElement) {\n this.preloader.classList.remove('manual');\n }\n\n this.detached = false;\n\n if(promise/* && false */) {\n this.attachPromise(promise);\n }\n\n let useRafs = 0;\n if(this.detached || this.preloader.parentElement !== elem) {\n useRafs = isInDOM(this.preloader) ? 1 : 2;\n if(this.preloader.parentElement !== elem) {\n elem[this.attachMethod](this.preloader);\n }\n }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: true,\n duration: TRANSITION_TIME,\n useRafs\n });\n\n if(this.cancelable && reset) {\n this.setProgress(0);\n }\n }\n\n public detach() {\n if(this.detached) {\n return;\n }\n // return;\n\n this.detached = true;\n\n // return;\n\n if(this.preloader?.parentElement) {\n /* setTimeout(() => */// fastRaf(() => {\n /* if(!this.detached) return;\n this.detached = true; */\n\n // fastRaf(() => {\n // console.log('[PP]: detach after rAF', this.detached, performance.now());\n\n // if(!this.detached || !this.preloader.parentElement) {\n // return;\n // }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: false,\n duration: TRANSITION_TIME,\n onTransitionEnd: () => {\n this.preloader.remove();\n },\n useRafs: 1\n });\n // });\n // })/* , 5e3) */;\n }\n }\n\n public setProgress(percents: number) {\n if(!this.totalLength && !isInDOM(this.circle)) {\n return;\n }\n\n if(percents === 0) {\n this.circle.style.strokeDasharray = '';\n return;\n }\n\n try {\n if(!this.totalLength) {\n this.totalLength = this.circle.getTotalLength();\n }\n\n // console.log('setProgress', (percents / 100 * totalLength));\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\n } catch(err) {}\n }\n}\n","/*\n * 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 {PeerPhotoSize} from '../lib/appManagers/appAvatarsManager';\nimport getPreviewURLFromBytes from '../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {recordPromise} from '../helpers/recordPromise';\nimport sequentialDom from '../helpers/sequentialDom';\nimport {UserProfilePhoto, ChatPhoto, User, Chat} from '../layer';\nimport getPeerColorById from '../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerPhoto from '../lib/appManagers/utils/peers/getPeerPhoto';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport rootScope from '../lib/rootScope';\nimport getPeerInitials from './wrappers/getPeerInitials';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\nimport makeError from '../helpers/makeError';\nimport noop from '../helpers/noop';\n\nexport async function putAvatar(\n div: HTMLElement,\n peerId: PeerId,\n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto,\n size: PeerPhotoSize,\n img = new Image(),\n onlyThumb = false\n) {\n const r = await rootScope.managers.acknowledged.appAvatarsManager.loadAvatar(peerId, photo, size);\n const loadPromise = r.result;\n const cached = r.cached;\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n let isFullLoaded = false;\n if(size === 'photo_big') { // let's load small photo first\n const res = await putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadThumbPromise || res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n if(isFullLoaded) {\n return;\n }\n\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n isFullLoaded = true;\n\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n\n if(animate) {\n img.classList.remove('fade-in');\n }\n\n thumbImage?.remove();\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , !cached */))\n .then(callback);\n\n renderThumbPromise && await renderThumbPromise.catch(noop);\n\n return {\n cached,\n loadPromise: renderPromise,\n loadThumbPromise: cached ? renderPromise : renderThumbPromise || Promise.resolve(),\n thumbImage\n };\n}\n\nfunction set(\n div: HTMLElement,\n innerHTML: Parameters[1],\n color: string,\n icon?: string,\n isForum?: boolean,\n isTopic?: boolean\n) {\n setInnerHTML(div, innerHTML);\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled', 'is-forum', 'is-topic');\n icon && div.classList.add(icon);\n isForum && div.classList.add('is-forum');\n isTopic && div.classList.add('is-topic');\n}\n\n// peerId === peerId || title\nexport default async function putPhoto({\n div,\n peerId,\n isDialog = false,\n title = '',\n onlyThumb = false,\n isBig,\n threadId,\n wrapOptions = {}\n}: {\n div: HTMLElement,\n peerId: PeerId,\n isDialog?: boolean,\n title?: string,\n onlyThumb?: boolean,\n isBig?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n}) {\n const myId = rootScope.myId;\n\n if(peerId === myId && isDialog) {\n set(div, '', '', 'tgico-saved');\n return;\n }\n\n const managers = rootScope.managers;\n\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n set(div, '', '', undefined, undefined, true);\n\n if(wrapOptions.customEmojiSize) {\n div.style.setProperty('--size', wrapOptions.customEmojiSize.width + 'px');\n }\n\n return wrapTopicIcon({\n ...wrapOptions,\n topic,\n lazyLoadQueue: false\n }).then((icon) => {\n div.replaceChildren(icon);\n });\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n if(peerId !== NULL_PEER_ID && peerId.isUser() && (peer as User.user)?.pFlags?.deleted) {\n set(div, '', getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n\n const isForum = !!(peer as Chat.channel)?.pFlags?.forum;\n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n const photo = getPeerPhoto(peer);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !(await managers.appAvatarsManager.isAvatarCached(peerId, size))) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n set(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n const abbr = title ? wrapAbbreviation(title) : getPeerInitials(peer);\n set(div, abbr, color, '', isForum);\n // return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const promise = putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n // recordPromise(promise, 'putAvatar-' + peerId);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Chat, User} from '../../layer';\nimport wrapAbbreviation from '../../lib/richTextProcessor/wrapAbbreviation';\n\nexport default function getPeerInitials(peer: Chat | User) {\n let str = '';\n if(peer) {\n str = (peer as Chat.chat).title ?? [\n (peer as User.user).first_name,\n (peer as User.user).last_name\n ].filter(Boolean).join(' ');\n }\n\n return wrapAbbreviation(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';\n\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\n const html = `\n \n \n `;\n\n if(returnDiv) {\n const div = document.createElement('div');\n div.classList.add('preloader');\n div.innerHTML = html;\n\n if(elem) {\n elem.appendChild(div);\n }\n\n return div;\n }\n\n elem.insertAdjacentHTML('beforeend', html);\n return elem.lastElementChild as HTMLElement;\n}\n\nMOUNT_CLASS_TO.putPreloader = putPreloader;\n\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\n elem.classList.remove('tgico-' + icon);\n elem.disabled = true;\n putPreloader(elem);\n\n return () => {\n elem.innerHTML = '';\n elem.classList.add('tgico-' + icon);\n elem.removeAttribute('disabled');\n };\n}\n\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\n Array.from(elements).forEach((el) => {\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\n if(!match) return;\n to[match[1]] = el as HTMLElement;\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getDeepProperty from '../helpers/object/getDeepProperty';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport rootScope from '../lib/rootScope';\n\nexport default class RadioField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public main: HTMLElement;\n\n constructor(options: {\n text?: string,\n langKey?: LangPackKey,\n name: string,\n value?: string,\n stateKey?: string,\n alignRight?: boolean\n }) {\n const label = this.label = document.createElement('label');\n label.classList.add('radio-field');\n\n if(options.alignRight) {\n label.classList.add('radio-field-right');\n }\n\n const input = this.input = document.createElement('input');\n input.type = 'radio';\n /* input.id = */input.name = 'input-radio-' + options.name;\n\n if(options.value) {\n input.value = options.value;\n\n if(options.stateKey) {\n apiManagerProxy.getState().then((state) => {\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\n });\n\n input.addEventListener('change', () => {\n rootScope.managers.appStateManager.setByKey(options.stateKey, options.value);\n });\n }\n }\n\n const main = this.main = document.createElement('div');\n main.classList.add('radio-field-main');\n\n if(options.text) {\n main.innerHTML = options.text;\n /* const caption = document.createElement('div');\n caption.classList.add('radio-field-main-caption');\n caption.innerHTML = text;\n\n if(subtitle) {\n label.classList.add('radio-field-with-subtitle');\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\n }\n\n main.append(caption); */\n } else if(options.langKey) {\n _i18n(main, options.langKey);\n }\n\n label.append(input, main);\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n};\n","/*\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 RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\n const form = document.createElement('form');\n\n radios.forEach((r) => {\n const {container, input} = r;\n form.append(container);\n input.addEventListener('change', (e) => {\n if(input.checked) {\n onChange(input.value, e);\n }\n });\n });\n\n return form;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport attachGrabListeners, {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\n\nexport default class RangeSelector {\n public container: HTMLDivElement;\n protected filled: HTMLDivElement;\n protected seek: HTMLInputElement;\n\n public mousedown = false;\n protected rect: DOMRect;\n protected _removeListeners: () => void;\n\n private events: Partial<{\n // onMouseMove: ProgressLine['onMouseMove'],\n onMouseDown: RangeSelector['onMouseDown'],\n onMouseUp: RangeSelector['onMouseUp'],\n onScrub: (value: number) => void\n }> = {};\n\n protected decimals: number;\n\n protected step: number;\n protected min: number;\n protected max: number;\n protected withTransition = false;\n protected useTransform = false;\n protected vertical = false;\n\n constructor(\n options: {\n step: RangeSelector['step'],\n min: RangeSelector['min'],\n max: RangeSelector['max'],\n withTransition?: RangeSelector['withTransition'],\n useTransform?: RangeSelector['useTransform'],\n vertical?: RangeSelector['vertical']\n },\n value = 0\n ) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('progress-line');\n\n // there is no sense in using transition with transform, because it is updating every frame\n if(this.useTransform) {\n this.container.classList.add('use-transform');\n } else if(this.withTransition) {\n this.container.classList.add('with-transition');\n }\n\n this.filled = document.createElement('div');\n this.filled.classList.add('progress-line__filled');\n\n const seek = this.seek = document.createElement('input');\n seek.classList.add('progress-line__seek');\n // seek.setAttribute('max', '0');\n seek.type = 'range';\n seek.step = '' + this.step;\n seek.min = '' + this.min;\n seek.max = '' + this.max;\n seek.value = '' + value;\n\n if(value) {\n this.setProgress(value);\n }\n\n const stepStr = '' + this.step;\n const index = stepStr.indexOf('.');\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\n\n // this.setListeners();\n\n this.container.append(this.filled, seek);\n }\n\n get value() {\n return +this.seek.value;\n }\n\n public setHandlers(events: RangeSelector['events']) {\n this.events = events;\n }\n\n protected onMouseMove = (event: GrabEvent) => {\n this.scrub(event);\n };\n\n protected onMouseDown = (event: GrabEvent) => {\n this.rect = this.container.getBoundingClientRect();\n this.mousedown = true;\n this.scrub(event);\n this.container.classList.add('is-focused');\n this.events?.onMouseDown && this.events.onMouseDown(event);\n };\n\n protected onMouseUp = (event: GrabEvent) => {\n this.mousedown = false;\n this.container.classList.remove('is-focused');\n this.events?.onMouseUp && this.events.onMouseUp(event);\n };\n\n public setListeners() {\n this.seek.addEventListener('input', this.onInput);\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\n }\n\n public onInput = () => {\n const value = +this.seek.value;\n this.setFilled(value);\n this.events?.onScrub && this.events.onScrub(value);\n };\n\n public setProgress(value: number) {\n this.seek.value = '' + value;\n this.setFilled(+this.seek.value); // clamp\n }\n\n public addProgress(value: number) {\n this.seek.value = '' + (+this.seek.value + value);\n this.setFilled(+this.seek.value); // clamp\n }\n\n public setFilled(value: number) {\n let percents = (value - this.min) / (this.max - this.min);\n percents = clamp(percents, 0, 1);\n\n // using scaleX and width even with vertical because it will be rotated\n if(this.useTransform) {\n this.filled.style.transform = `scaleX(${percents})`;\n } else {\n this.filled.style.width = (percents * 100) + '%';\n }\n }\n\n protected scrub(event: GrabEvent) {\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\n\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\n\n if((value - this.min) < ((this.max - this.min) / 2)) {\n value -= this.step / 10;\n }\n\n value = +value.toFixed(this.decimals);\n value = clamp(value, this.min, this.max);\n\n // this.seek.value = '' + value;\n // this.onInput();\n\n this.setProgress(value);\n this.events?.onScrub && this.events.onScrub(value);\n\n return value;\n }\n\n public removeListeners() {\n if(this._removeListeners) {\n this._removeListeners();\n this._removeListeners = null;\n }\n\n this.seek.removeEventListener('input', this.onInput);\n\n this.events = {};\n }\n}\n","/*\n * 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 sequentialDom from '../helpers/sequentialDom';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport {fastRaf} from '../helpers/schedulers';\n\nlet rippleClickId = 0;\nexport default function ripple(\n elem: HTMLElement,\n callback: (id: number) => Promise = () => Promise.resolve(),\n onEnd: (id: number) => void = null,\n prepend = false,\n attachListenerTo = elem\n) {\n // return;\n if(elem.querySelector('.c-ripple')) return;\n elem.classList.add('rp');\n\n const r = document.createElement('div');\n r.classList.add('c-ripple');\n\n const isSquare = elem.classList.contains('rp-square');\n if(isSquare) {\n r.classList.add('is-square');\n }\n\n elem[prepend ? 'prepend' : 'append'](r);\n\n let handler: () => void;\n // let animationEndPromise: Promise;\n const drawRipple = (clientX: number, clientY: number) => {\n const startTime = Date.now();\n const circle = document.createElement('div');\n\n const clickId = rippleClickId++;\n\n // console.log('ripple drawRipple');\n\n // const auto = elem.classList.contains('row-sortable') && !elem.classList.contains('cant-sort');\n const auto = false;\n const duration = (auto ? .3 : +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '')) * 1000;\n // console.log('ripple duration', duration);\n\n const _handler = handler = () => {\n // handler = () => animationEndPromise.then((duration) => {\n // console.log('ripple animation was:', duration);\n\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\n // return;\n const elapsedTime = Date.now() - startTime;\n const cb = () => {\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\n sequentialDom.mutate(() => {\n circle.remove();\n });\n\n onEnd?.(clickId);\n };\n if(elapsedTime < duration) {\n const delay = Math.max(duration - elapsedTime, duration / 2);\n setTimeout(() => circle.classList.add('hiding'), Math.max(delay - duration / 2, 0));\n\n setTimeout(cb, delay);\n } else {\n circle.classList.add('hiding');\n setTimeout(cb, duration / 2);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('contextmenu', handler);\n window.removeEventListener('mousemove', handler);\n }\n\n handler = null;\n touchStartFired = false;\n };\n // });\n\n callback?.(clickId);\n\n /* callback().then((bad) => {\n if(bad) {\n span.remove();\n return;\n } */\n\n // console.log('ripple after promise', Date.now() - startTime);\n // console.log('ripple tooSlow:', tooSlow);\n /* if(tooSlow) {\n span.remove();\n return;\n } */\n\n fastRaf(() => {\n if(_handler !== handler) {\n return;\n }\n\n const rect = r.getBoundingClientRect();\n circle.classList.add('c-ripple__circle');\n\n const clickX = clientX - rect.left;\n const clickY = clientY - rect.top;\n\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);\n const size = radius;\n\n // center of circle\n const x = clickX - size / 2;\n const y = clickY - size / 2;\n\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\n\n circle.style.width = circle.style.height = size + 'px';\n circle.style.left = x + 'px';\n circle.style.top = y + 'px';\n\n // нижний код выполняется с задержкой\n /* animationEndPromise = new Promise((resolve) => {\n span.addEventListener('animationend', () => {\n // 713 -> 700\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\n }, {once: true});\n }); */\n\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\n /* span.style.display = 'none';\n r.append(span);\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\n span.style.display = ''; */\n\n r.append(circle);\n\n if(auto) {\n // window.addEventListener('mousemove', handler, {once: true, passive: true});\n handler();\n }\n\n // r.classList.add('active');\n // handler();\n });\n // });\n };\n\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\n ) && (\n attachListenerTo === elem ||\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\n );\n\n // TODO: rename this variable\n let touchStartFired = false;\n if(IS_TOUCH_SUPPORTED) {\n const touchEnd = () => {\n handler?.();\n };\n\n attachListenerTo.addEventListener('touchstart', (e) => {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n // console.log('ripple touchstart', e);\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\n return;\n }\n\n // console.log('touchstart', e);\n touchStartFired = true;\n\n const {clientX, clientY} = e.touches[0];\n drawRipple(clientX, clientY);\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\n\n window.addEventListener('touchmove', (e) => {\n e.cancelBubble = true;\n e.stopPropagation();\n touchEnd();\n attachListenerTo.removeEventListener('touchend', touchEnd);\n }, {once: true});\n }, {passive: true});\n } else {\n attachListenerTo.addEventListener('mousedown', (e) => {\n if(![0, 2].includes(e.button)) { // only left and right buttons\n return;\n }\n\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\n\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\n return;\n } else if(touchStartFired) {\n touchStartFired = false;\n return;\n }\n\n const {clientX, clientY} = e;\n drawRipple(clientX, clientY);\n window.addEventListener('mouseup', handler, {once: true, passive: true});\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\n }, {passive: 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 CheckboxField, {CheckboxFieldOptions} from './checkboxField';\nimport RadioField from './radioField';\nimport ripple from './ripple';\nimport {SliderSuperTab} from './slider';\nimport RadioForm from './radioForm';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport Button from './button';\nimport createContextMenu from '../helpers/dom/createContextMenu';\n\ntype K = string | HTMLElement | DocumentFragment | true;\n\nconst setContent = (element: HTMLElement, content: K) => {\n if(content === true) {\n\n } else if(typeof(content) === 'string') {\n setInnerHTML(element, content);\n } else {\n element.append(content);\n }\n};\n\nexport type RowMediaSizeType = 'small' | 'medium' | 'big' | 'abitbigger' | 'bigger';\n\nexport default class Row {\n public container: HTMLElement;\n public title: HTMLElement;\n public titleRow: HTMLElement;\n public titleRight: HTMLElement;\n public media: HTMLElement;\n\n public subtitleRow: HTMLElement;\n public subtitleRight: HTMLElement;\n\n public checkboxField: CheckboxField;\n public radioField: RadioField;\n\n public freezed = false;\n\n public buttonRight: HTMLElement;\n\n private _subtitle: HTMLElement;\n private _midtitle: HTMLElement;\n\n constructor(options: Partial<{\n icon: string,\n subtitle: K,\n subtitleLangKey: LangPackKey,\n subtitleLangArgs: any[],\n subtitleRight: K,\n radioField: Row['radioField'],\n checkboxField: Row['checkboxField'],\n checkboxFieldOptions: CheckboxFieldOptions,\n withCheckboxSubtitle: boolean,\n title: K,\n titleLangKey: LangPackKey,\n titleRight: K,\n titleRightSecondary: K,\n clickable: boolean | ((e: Event) => void),\n navigationTab: SliderSuperTab,\n havePadding: boolean,\n noRipple: boolean,\n noWrap: boolean,\n listenerSetter: ListenerSetter,\n buttonRight?: HTMLElement | boolean,\n buttonRightLangKey: LangPackKey,\n asLink: boolean,\n contextMenu: Omit[0], 'findElement' | 'listenTo' | 'listenerSetter'>\n }> = {}) {\n if(options.checkboxFieldOptions) {\n options.checkboxField = new CheckboxField({\n listenerSetter: options.listenerSetter,\n ...options.checkboxFieldOptions\n });\n }\n\n const tagName = options.asLink ? 'a' : (options.radioField || options.checkboxField ? 'label' : 'div');\n this.container = document.createElement(tagName);\n this.container.classList.add('row', 'no-subtitle');\n\n if(options.noWrap) {\n this.container.classList.add('no-wrap');\n }\n\n if(options.subtitle) {\n const subtitle = this.subtitle;\n setContent(subtitle, options.subtitle);\n\n if(options.noWrap) subtitle.classList.add('no-wrap');\n\n if(options.subtitleRight) {\n this.container.append(this.subtitleRow = this.createRow());\n this.subtitleRow.classList.add('row-subtitle-row');\n const subtitleRight = this.subtitleRight = document.createElement('div');\n subtitleRight.classList.add('row-subtitle', 'row-subtitle-right');\n\n setContent(subtitleRight, options.subtitleRight);\n this.subtitleRow.append(subtitle, subtitleRight);\n }\n } else if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\n }\n\n let havePadding = !!options.havePadding;\n if(options.radioField || options.checkboxField) {\n if(options.radioField) {\n this.radioField = options.radioField;\n this.container.append(this.radioField.label);\n havePadding = true;\n }\n\n if(options.checkboxField) {\n this.checkboxField = options.checkboxField;\n\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\n if(isToggle) {\n this.container.classList.add('row-with-toggle');\n options.titleRight = this.checkboxField.label;\n } else {\n havePadding = true;\n this.container.append(this.checkboxField.label);\n }\n\n if(options.withCheckboxSubtitle && !isToggle) {\n const onChange = () => {\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\n };\n\n if(options.listenerSetter) options.listenerSetter.add(this.checkboxField.input)('change', onChange);\n else this.checkboxField.input.addEventListener('change', onChange);\n }\n }\n\n const i = options.radioField || options.checkboxField;\n i.label.classList.add('disable-hover');\n }\n\n if(options.title || options.titleLangKey) {\n let c: HTMLElement;\n const titleRightContent = options.titleRight || options.titleRightSecondary;\n if(titleRightContent) {\n this.container.append(c = this.titleRow = this.createRow());\n this.titleRow.classList.add('row-title-row');\n } else {\n c = this.container;\n }\n\n this.title = this.createTitle();\n if(options.noWrap) this.title.classList.add('no-wrap');\n if(options.title) {\n setContent(this.title, options.title);\n } else if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n c.append(this.title);\n\n if(titleRightContent) {\n const titleRight = this.titleRight = document.createElement('div');\n titleRight.classList.add('row-title', 'row-title-right');\n\n if(options.titleRightSecondary) {\n titleRight.classList.add('row-title-right-secondary');\n }\n\n setContent(titleRight, titleRightContent);\n c.append(titleRight);\n }\n }\n\n if(options.icon) {\n havePadding = true;\n // this.title.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('row-with-icon');\n }\n\n if(havePadding) {\n this.container.classList.add('row-with-padding');\n }\n\n if(options.navigationTab) {\n options.clickable = () => options.navigationTab.open();\n }\n\n if(options.clickable || options.radioField || options.checkboxField) {\n if(typeof(options.clickable) === 'function') {\n attachClickEvent(this.container, (e) => {\n if(this.freezed) return;\n (options.clickable as any)(e);\n }, {listenerSetter: options.listenerSetter});\n }\n\n this.container.classList.add('row-clickable', 'hover-effect');\n\n if(!options.noRipple) {\n ripple(this.container, undefined, undefined, true);\n }\n\n /* if(options.radioField || options.checkboxField) {\n this.container.prepend(this.container.lastElementChild);\n } */\n }\n\n if(options.buttonRight || options.buttonRightLangKey) {\n this.buttonRight = options.buttonRight instanceof HTMLElement ?\n options.buttonRight :\n Button('btn-primary btn-color-primary', {text: options.buttonRightLangKey});\n this.container.append(this.buttonRight);\n }\n\n if(options.contextMenu) {\n createContextMenu({\n ...options.contextMenu,\n listenTo: this.container,\n listenerSetter: options.listenerSetter\n });\n }\n }\n\n public get subtitle() {\n return this._subtitle ??= this.createSubtitle();\n }\n\n public get midtitle() {\n return this._midtitle ??= this.createMidtitle();\n }\n\n private createRow() {\n const c = document.createElement('div');\n c.classList.add('row-row');\n return c;\n }\n\n private createTitle() {\n const title = document.createElement('div');\n title.classList.add('row-title');\n title.setAttribute('dir', 'auto');\n return title;\n }\n\n private createSubtitle() {\n const subtitle = document.createElement('div');\n subtitle.classList.add('row-subtitle');\n subtitle.setAttribute('dir', 'auto');\n if(this.title) this.title.after(subtitle);\n else this.container.prepend(subtitle);\n this.container.classList.remove('no-subtitle');\n return subtitle;\n }\n\n private createMidtitle() {\n const midtitle = document.createElement('div');\n midtitle.classList.add('row-midtitle');\n this.subtitle.parentElement.insertBefore(midtitle, this.subtitle);\n return midtitle;\n }\n\n public createMedia(size?: RowMediaSizeType) {\n const media = document.createElement('div');\n return this.applyMediaElement(media, size);\n }\n\n public applyMediaElement(media: HTMLElement, size?: RowMediaSizeType) {\n this.container.classList.add('row-with-padding');\n\n this.media = media;\n media.classList.add('row-media');\n\n if(size) {\n media.classList.add('row-media-' + size);\n }\n\n this.container.append(media);\n\n return media;\n }\n\n public disableWithPromise(promise: Promise) {\n this.container.classList.add('is-disabled');\n promise.finally(() => {\n this.container.classList.remove('is-disabled');\n });\n }\n}\n\nexport const CreateRowFromCheckboxField = (checkboxField: CheckboxField) => {\n return new Row({checkboxField, listenerSetter: checkboxField.listenerSetter});\n};\n\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\n return RadioForm(rows.map((r) => ({container: r.container, input: r.radioField.input})), onChange);\n};\n\nexport const RadioFormFromValues = (values: {langPackKey: LangPackKey, value: number | string, checked?: boolean}[], onChange: Parameters[1]) => {\n const name = 'name-' + (Math.random() * 0x7FFFFF | 0);\n let checkedRadioField: RadioField;\n const rows = values.map(({langPackKey, value, checked}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: '' + value\n })\n });\n\n if(checked) {\n checkedRadioField = row.radioField;\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, onChange);\n if(checkedRadioField) {\n checkedRadioField.checked = true;\n }\n return form;\n};\n","/*\n * 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 {logger, LogTypes} from '../lib/logger';\nimport fastSmoothScroll, {ScrollOptions} from '../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {IS_ANDROID} from '../environment/userAgent';\n/*\nvar el = $0;\nvar height = 0;\nvar checkUp = false;\n\ndo {\n height += el.scrollHeight;\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\nconsole.log(height);\n*/\n\n/*\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\n //_el.style.display = '';\n //return;\n\n let el = _el.parentElement;\n let height = el.scrollHeight;\n let width = el.scrollWidth;\n el.style.width = width + 'px';\n el.style.height = height + 'px';\n _el.style.display = 'none';\n});\n*/\n\n/* const scrollables: Map = new Map();\nconst scrollsIntersector = new IntersectionObserver((entries) => {\n for(let entry of entries) {\n const scrollable = scrollables.get(entry.target as HTMLElement);\n\n if(entry.isIntersecting) {\n scrollable.isVisible = true;\n } else {\n scrollable.isVisible = false;\n\n if(!isInDOM(entry.target)) {\n scrollsIntersector.unobserve(scrollable.container);\n scrollables.delete(scrollable.container);\n }\n }\n }\n}); */\n\nconst SCROLL_THROTTLE = IS_ANDROID ? 200 : 24;\n\nexport class ScrollableBase {\n protected log: ReturnType;\n\n public splitUp: HTMLElement;\n public onScrollMeasure: number = 0;\n\n public lastScrollPosition: number = 0;\n public lastScrollDirection: number = 0;\n\n public onAdditionalScroll: () => void;\n public onScrolledTop: () => void;\n public onScrolledBottom: () => void;\n\n public isHeavyAnimationInProgress = false;\n protected needCheckAfterAnimation = false;\n\n public checkForTriggers?: () => void;\n\n public scrollProperty: 'scrollTop' | 'scrollLeft';\n\n protected removeHeavyAnimationListener: () => void;\n protected addedScrollListener: boolean;\n\n constructor(public el?: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\n this.container.classList.add('scrollable');\n\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\n\n if(el) {\n Array.from(el.children).forEach((c) => this.container.append(c));\n\n el.append(this.container);\n }\n // this.onScroll();\n }\n\n public addScrollListener() {\n if(this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = true;\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\n }\n\n public removeScrollListener() {\n if(!this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = false;\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\n }\n\n public setListeners() {\n if(this.removeHeavyAnimationListener) {\n return;\n }\n\n window.addEventListener('resize', this.onScroll, {passive: true});\n this.addScrollListener();\n\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n\n if(this.onScrollMeasure) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(this.needCheckAfterAnimation) {\n this.onScroll();\n this.needCheckAfterAnimation = false;\n }\n });\n }\n\n public removeListeners() {\n if(!this.removeHeavyAnimationListener) {\n return;\n }\n\n window.removeEventListener('resize', this.onScroll);\n this.removeScrollListener();\n\n this.removeHeavyAnimationListener();\n this.removeHeavyAnimationListener = undefined;\n }\n\n public destroy() {\n this.removeListeners();\n this.onAdditionalScroll = undefined;\n this.onScrolledTop = undefined;\n this.onScrolledBottom = undefined;\n }\n\n public append(element: HTMLElement) {\n this.container.append(element);\n }\n\n public scrollIntoViewNew(options: Omit) {\n // return Promise.resolve();\n // this.removeListeners();\n return fastSmoothScroll({\n ...options,\n container: this.container\n });/* .finally(() => {\n this.setListeners();\n }); */\n }\n\n public onScroll = () => {\n // if(this.debug) {\n // this.log('onScroll call', this.onScrollMeasure);\n // }\n\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n return;\n }\n\n // if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\n if(this.onScrollMeasure) return;\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\n // this.onScrollMeasure = window.requestAnimationFrame(() => {\n this.onScrollMeasure = window.setTimeout(() => {\n this.onScrollMeasure = 0;\n\n const scrollPosition = this.container[this.scrollProperty];\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\n this.lastScrollPosition = scrollPosition;\n\n // lastScrollDirection check is useless here, every callback should decide on its own\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\n this.onAdditionalScroll();\n }\n\n if(this.checkForTriggers) {\n this.checkForTriggers();\n }\n // });\n }, SCROLL_THROTTLE);\n };\n\n public cancelMeasure() {\n if(this.onScrollMeasure) {\n // window.cancelAnimationFrame(this.onScrollMeasure);\n clearTimeout(this.onScrollMeasure);\n this.onScrollMeasure = 0;\n }\n }\n}\n\nexport type SliceSides = 'top' | 'bottom';\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\n\nexport default class Scrollable extends ScrollableBase {\n public padding: HTMLElement;\n\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\n\n constructor(el?: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\n super(el, logPrefix);\n\n /* if(withPaddingContainer) {\n this.padding = document.createElement('div');\n this.padding.classList.add('scrollable-padding');\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\n this.container.append(this.padding);\n } */\n\n this.container.classList.add('scrollable-y');\n this.setListeners();\n this.scrollProperty = 'scrollTop';\n }\n\n public attachBorderListeners(setClassOn = this.container) {\n const cb = this.onAdditionalScroll;\n this.onAdditionalScroll = () => {\n cb?.();\n setClassOn.classList.toggle('scrolled-top', !this.scrollTop);\n setClassOn.classList.toggle('scrolled-bottom', this.isScrolledDown);\n };\n\n setClassOn.classList.add('scrolled-top', 'scrolled-bottom', 'scrollable-y-bordered');\n }\n\n public setVirtualContainer(el?: HTMLElement) {\n this.splitUp = el;\n this.log('setVirtualContainer:', el, this);\n }\n\n public checkForTriggers = () => {\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\n\n if(this.isHeavyAnimationInProgress) {\n this.onScroll();\n return;\n }\n\n const scrollHeight = this.container.scrollHeight;\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\n return;\n }\n\n const clientHeight = this.container.clientHeight;\n const maxScrollTop = scrollHeight - clientHeight;\n const scrollTop = this.lastScrollPosition;\n\n // this.log('checkForTriggers:', scrollTop, maxScrollTop);\n\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\n this.onScrolledTop();\n }\n\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\n this.onScrolledBottom();\n }\n };\n\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).prepend(...elements);\n }\n\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).append(...elements);\n }\n\n public getDistanceToEnd() {\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\n }\n\n get isScrolledDown() {\n return this.getDistanceToEnd() <= 1;\n }\n\n set scrollTop(y: number) {\n this.container.scrollTop = y;\n }\n\n get scrollTop() {\n // this.log.trace('get scrollTop');\n return this.container.scrollTop;\n }\n\n public setScrollTopSilently(value: number) {\n this.lastScrollPosition = value;\n this.ignoreNextScrollEvent();\n\n this.scrollTop = value;\n }\n\n public ignoreNextScrollEvent() {\n if(this.removeHeavyAnimationListener) {\n this.removeScrollListener();\n this.container.addEventListener('scroll', (e) => {\n cancelEvent(e);\n this.addScrollListener();\n }, {capture: true, passive: false, once: true});\n }\n }\n\n get scrollHeight() {\n return this.container.scrollHeight;\n }\n}\n\nexport class ScrollableX extends ScrollableBase {\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\n super(el, logPrefix, container);\n\n this.container.classList.add('scrollable-x');\n\n if(!IS_TOUCH_SUPPORTED) {\n const scrollHorizontally = (e: any) => {\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\n this.container.scrollLeft += e.deltaY / 4;\n cancelEvent(e);\n }\n };\n\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\n }\n\n this.scrollProperty = 'scrollLeft';\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {LangPackKey, FormatterArguments, i18n_} from '../lib/langPack';\nimport {generateDelimiter} from './generateDelimiter';\nimport Scrollable from './scrollable';\n\nexport type SettingSectionOptions = {\n name?: LangPackKey,\n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n captionArgs?: FormatterArguments,\n captionOld?: SettingSectionOptions['caption'],\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean,\n // fullWidth?: boolean,\n // noPaddingTop?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport default 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 const caption = options.caption ?? options.captionOld;\n if(caption) {\n const el = this.caption = this.generateContentElement();\n el.classList.add(className + '-caption');\n\n if(!options.captionOld) {\n container.append(el);\n }\n\n if(caption !== true) {\n i18n_({element: el, key: caption, args: options.captionArgs});\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputFile} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport I18n from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\ninterface OpenStreetMapInterface {\n place_id?: number;\n license?: string;\n osm_type?: string;\n osm_id?: number;\n lat?: string;\n lon?: string;\n display_name: string;\n address?: object;\n boundingbox?: object;\n}\n\nexport default class AppNewGroupTab extends SliderSuperTab {\n private avatarEdit: AvatarEdit;\n private uploadAvatar: () => Promise = null;\n private peerIds: PeerId[];\n private isGeoChat: boolean = false;\n private nextBtn: HTMLButtonElement;\n private groupNameInputField: InputField;\n private list: HTMLUListElement;\n private groupLocationInputField: InputField;\n private userLocationCoords: {lat: number, long: number};\n private userLocationAddress: string;\n\n public init(\n peerIds: PeerId[],\n isGeoChat: boolean = false\n ) {\n this.isGeoChat = isGeoChat;\n this.peerIds = peerIds;\n\n this.container.classList.add('new-group-container');\n this.setTitle('NewGroup');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.groupNameInputField = new InputField({\n label: 'CreateGroup.NameHolder',\n maxLength: 128\n });\n\n this.groupLocationInputField = new InputField({\n label: 'ChatLocation',\n name: 'location',\n canBeEdited: false\n });\n\n inputWrapper.append(\n this.groupNameInputField.container,\n this.groupLocationInputField.container\n );\n\n this.listenerSetter.add(this.groupNameInputField.input)('input', () => {\n const value = this.groupNameInputField.value;\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\n });\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.groupNameInputField.value;\n\n let promise: Promise;\n if(this.isGeoChat) {\n if(!this.userLocationAddress || !this.userLocationCoords) return;\n promise = this.managers.appChatsManager.createChannel({\n title,\n about: '',\n geo_point: {\n _: 'inputGeoPoint',\n ...this.userLocationCoords\n },\n address: this.userLocationAddress,\n megagroup: true\n }).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n if(this.peerIds.length) {\n this.managers.appChatsManager.inviteToChannel(chatId, this.peerIds);\n }\n\n return chatId;\n });\n } else {\n this.nextBtn.disabled = true;\n promise = this.managers.appChatsManager.createChat(title, this.peerIds.map((peerId) => peerId.toUserId())).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n return chatId;\n });\n }\n\n if(!promise) {\n return;\n }\n\n promise.then((chatId) => {\n this.close();\n\n appImManager.setInnerPeer({peerId: chatId.toPeerId(true)});\n });\n }, {listenerSetter: this.listenerSetter});\n\n const chatsSection = new SettingSection({\n name: 'Members',\n nameArgs: [this.peerIds.length]\n });\n\n const list = this.list = appDialogsManager.createChatList({\n new: true\n });\n\n chatsSection.content.append(list);\n\n section.content.append(this.avatarEdit.container, inputWrapper);\n\n this.content.append(this.nextBtn);\n this.scrollable.append(section.container, chatsSection.container);\n\n if(isGeoChat) {\n this.setTitle('NearbyCreateGroup');\n this.groupLocationInputField.container.classList.remove('hide');\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\n this.startLocating();\n } else {\n this.groupLocationInputField.container.classList.add('hide');\n }\n\n return Promise.all(this.peerIds.map(async(userId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: userId,\n container: this.list,\n rippleEnabled: false,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(userId)));\n }));\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.groupNameInputField.value = '';\n this.groupLocationInputField.container.classList.add('hide');\n this.nextBtn.disabled = false;\n }\n\n private startLocating() {\n navigator.geolocation.getCurrentPosition((location) => {\n this.userLocationCoords = {\n lat: location.coords.latitude,\n long: location.coords.longitude\n };\n\n let uri = 'https://nominatim.openstreetmap.org/reverse';\n uri += '?lat='+location.coords.latitude;\n uri += '&lon='+location.coords.longitude;\n uri += '&format=json';\n uri += '&addressdetails=1';\n uri += '&accept-language=en';\n fetch(uri)\n .then((response) => response.json())\n .then((response: OpenStreetMapInterface) => {\n this.userLocationAddress = response.display_name;\n this.groupLocationInputField.setValueSilently(response.display_name);\n });\n }, (error) => {\n if(error instanceof GeolocationPositionError) {\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\n } else {\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\n }\n });\n }\n}\n","enum PrivacyType {\n Everybody = 2,\n Contacts = 1,\n Nobody = 0\n}\n\nexport default PrivacyType;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PrivacyRule} from '../../../../layer';\nimport PrivacyType from './privacyType';\n\nexport default function getPrivacyRulesDetails(rules: PrivacyRule[]) {\n const types: PrivacyType[] = [];\n\n type peers = {users: UserId[], chats: ChatId[]};\n const allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\n rules.forEach((rule) => {\n switch(rule._) {\n case 'privacyValueAllowAll':\n types.push(2);\n break;\n case 'privacyValueDisallowAll':\n types.push(0);\n break;\n case 'privacyValueAllowContacts':\n types.push(1);\n break;\n /* case 'privacyValueDisallowContacts':\n types.push('Except My Contacts');\n break; */\n case 'privacyValueAllowChatParticipants':\n allowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueAllowUsers':\n allowPeers.users.push(...rule.users);\n break;\n case 'privacyValueDisallowChatParticipants':\n disallowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueDisallowUsers':\n disallowPeers.users.push(...rule.users);\n break;\n }\n });\n\n return {type: types[0], disallowPeers, allowPeers};\n}\n","/*\n * 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 {randomLong} from '../helpers/random';\nimport {InputPrivacyKey, InputPrivacyRule} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getPrivacyRulesDetails from '../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../lib/appManagers/utils/privacy/privacyType';\nimport {i18n, join, LangPackKey, _i18n} from '../lib/langPack';\nimport RadioField from './radioField';\nimport Row, {RadioFormFromRows} from './row';\nimport Scrollable from './scrollable';\nimport SettingSection, {generateSection} from './settingSection';\nimport AppAddMembersTab from './sidebarLeft/tabs/addMembers';\nimport {SliderSuperTabEventable} from './sliderTab';\n\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\nexport default class PrivacySection {\n public radioRows: Map;\n public radioSection: SettingSection;\n public exceptions: Map;\n public peerIds: {\n disallow?: PeerId[],\n allow?: PeerId[]\n };\n public type: PrivacyType;\n\n constructor(public options: {\n tab: SliderSuperTabEventable,\n title: LangPackKey,\n inputKey: InputPrivacyKey['_'],\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\n appendTo?: Scrollable,\n noExceptions?: boolean,\n onRadioChange?: (value: number) => any,\n skipTypes?: PrivacyType[],\n exceptionTexts?: [LangPackKey, LangPackKey],\n managers: AppManagers\n }) {\n if(options.captions) {\n options.captions.reverse();\n }\n\n const managers = options.managers;\n\n this.radioSection = new SettingSection({name: options.title, caption: true});\n\n this.radioRows = new Map();\n\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\n type: PrivacyType.Everybody,\n langKey: 'PrivacySettingsController.Everbody'\n }, {\n type: PrivacyType.Contacts,\n langKey: 'PrivacySettingsController.MyContacts'\n }, {\n type: PrivacyType.Nobody,\n langKey: 'PrivacySettingsController.Nobody'\n }];\n\n if(options.skipTypes) {\n r = r.filter((r) => !options.skipTypes.includes(r.type));\n }\n\n const random = randomLong();\n r.forEach(({type, langKey}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey,\n name: random,\n value: '' + type\n })\n });\n\n this.radioRows.set(type, row);\n });\n\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\n\n this.radioSection.content.append(form);\n if(options.appendTo) {\n options.appendTo.append(this.radioSection.container);\n }\n\n if(!options.noExceptions) {\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\n\n this.exceptions = new Map([[\n 'disallow',\n {\n titleLangKey: options.exceptionTexts[0],\n key: 'disallow',\n row: null,\n icon: 'deleteuser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ], [\n 'allow',\n {\n titleLangKey: options.exceptionTexts[1],\n key: 'allow',\n row: null,\n icon: 'adduser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ]]);\n\n this.exceptions.forEach((exception) => {\n exception.row = new Row(exception);\n\n exception.row.container.addEventListener('click', () => {\n promise.then(() => {\n const _peerIds = this.peerIds[exception.key];\n options.tab.slider.createTab(AppAddMembersTab).open({\n type: 'privacy',\n skippable: true,\n title: exception.titleLangKey,\n placeholder: 'PrivacyModal.Search.Placeholder',\n takeOut: (newPeerIds) => {\n _peerIds.length = 0;\n _peerIds.push(...newPeerIds);\n exception.row.subtitle.innerHTML = '';\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\n },\n selectedPeerIds: _peerIds\n });\n });\n });\n\n container.append(exception.row.container);\n });\n }\n\n /* setTimeout(() => {\n this.setRadio(PrivacyType.Contacts);\n }, 0); */\n\n const promise = managers.appPrivacyManager.getPrivacy(options.inputKey).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n this.setRadio(details.type);\n\n if(this.exceptions) {\n this.peerIds = {};\n ['allow' as const, 'disallow' as const].forEach((k) => {\n const arr = [];\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\n arr.push(...from.users.map((id) => id.toPeerId()));\n arr.push(...from.chats.map((id) => id.toPeerId(true)));\n this.peerIds[k] = arr;\n const s = this.exceptions.get(k).row.subtitle;\n s.innerHTML = '';\n s.append(...this.generateStr(from));\n });\n }\n\n options.tab.eventListener.addEventListener('destroy', async() => {\n const rules: InputPrivacyRule[] = [];\n\n switch(this.type) {\n case PrivacyType.Everybody:\n rules.push({_: 'inputPrivacyValueAllowAll'});\n break;\n case PrivacyType.Contacts:\n rules.push({_: 'inputPrivacyValueAllowContacts'});\n break;\n case PrivacyType.Nobody:\n rules.push({_: 'inputPrivacyValueDisallowAll'});\n break;\n }\n\n if(this.exceptions) {\n const a = ([\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\n ] as Array<[\n 'allow' | 'disallow',\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants',\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\n ]>);\n for(const [k, chatKey, usersKey] of a) {\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\n continue;\n }\n\n const _peerIds = this.peerIds[k];\n if(_peerIds) {\n const splitted = this.splitPeersByType(_peerIds);\n if(splitted.chats.length) {\n rules.push({_: chatKey, chats: splitted.chats});\n }\n\n if(splitted.users.length) {\n rules.push({\n _: usersKey,\n users: await Promise.all(splitted.users.map((id) => managers.appUsersManager.getUserInput(id)))\n });\n }\n }\n }\n }\n\n managers.appPrivacyManager.setPrivacy(options.inputKey, rules);\n }, {once: true});\n });\n }\n\n private onRadioChange = (value: string | PrivacySection['type']) => {\n value = +value as PrivacySection['type'];\n this.type = value;\n\n const caption = this.options.captions[this.type];\n const captionElement = this.radioSection.caption;\n if(!caption) {\n captionElement.innerHTML = '';\n } else if(caption instanceof HTMLElement) {\n replaceContent(captionElement, caption);\n } else {\n _i18n(captionElement, caption);\n }\n captionElement.classList.toggle('hide', !caption);\n\n if(this.exceptions) {\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\n }\n\n this.options.onRadioChange && this.options.onRadioChange(value);\n };\n\n public setRadio(type: PrivacySection['type']) {\n const row = this.radioRows.get(type);\n this.onRadioChange(type);\n row.radioField.input.checked = true;\n }\n\n private splitPeersByType(peerIds: PeerId[]) {\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\n peerIds.forEach((peerId) => {\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\n });\n\n return peers;\n }\n\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\n if(!peers.users.length && !peers.chats.length) {\n return [i18n('PrivacySettingsController.AddUsers')];\n }\n\n return join([\n peers.users.length ? i18n('Users', [peers.users.length]) : null,\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\n ].filter(Boolean), false);\n }\n}\n","/*\n * 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 PrivacySection from '../../../privacySection';\nimport {i18n, LangPackKey} from '../../../../lib/langPack';\nimport anchorCopy from '../../../../helpers/dom/anchorCopy';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\n public async init() {\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\n this.setTitle('PrivacyPhone');\n\n const formatted = '+' + (await this.managers.appUsersManager.getSelf()).phone;\n const captionEl = document.createElement('div');\n captionEl.append(\n i18n('PrivacyPhoneInfo'),\n document.createElement('br'),\n document.createElement('br'),\n i18n('PrivacyPhoneInfo4'),\n document.createElement('br'),\n anchorCopy({\n mePath: formatted\n })\n );\n\n const phoneSection = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle',\n inputKey: 'inputPrivacyKeyPhoneNumber',\n captions: [captionEl, captionEl, ''],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n onRadioChange: (type) => {\n s.setRadio(PrivacyType.Everybody);\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\n },\n managers: this.managers\n });\n\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\n const s = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle2',\n inputKey: 'inputPrivacyKeyAddedByPhone',\n captions: [sCaption, sCaption, ''],\n noExceptions: true,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\n }\n}\n","/*\n * 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 Button from '../../../button';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\n\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\n this.setTitle('TwoStepVerificationPasswordSet');\n\n const section = new SettingSection({\n captionOld: 'TwoStepVerificationPasswordSetInfo',\n noDelimiter: true\n });\n\n const emoji = '🥳';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n emoji,\n div: stickerContainer,\n width: 160,\n height: 160\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\n\n attachClickEvent(btnReturn, (e) => {\n this.close();\n });\n\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n\n inputWrapper.append(btnReturn);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.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 {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport function canFocus(isFirstInput: boolean) {\n return !IS_MOBILE_SAFARI || !isFirstInput;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport CodeInputField from '../../../codeInputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {putPreloader} from '../../../putPreloader';\nimport {i18n, _i18n} from '../../../../lib/langPack';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../../helpers/dom/toggleDisability';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\n public codeInputField: CodeInputField;\n public state: AccountPassword;\n public email: string;\n public length: number;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\n this.setTitle('TwoStepAuth.RecoveryTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\n\n const emoji = '📬';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.codeInputField = new CodeInputField({\n name: 'recovery-email-code',\n label: 'TwoStepAuth.RecoveryCode',\n length: this.length,\n onFill: (code) => {\n freeze(true);\n\n this.managers.passwordManager.confirmPasswordEmail('' + code)\n .then((value) => {\n if(!value) {\n\n }\n\n goNext();\n })\n .catch((err) => {\n switch(err.type) {\n case 'CODE_INVALID':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\n break;\n\n case 'EMAIL_HASH_EXPIRED':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\n break;\n\n default:\n console.error('confirm error', err);\n break;\n }\n\n freeze(false);\n });\n }\n });\n\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const freeze = (disable: boolean) => {\n toggleDisability([inputField.input, btnChange, btnResend], disable);\n };\n\n attachClickEvent(btnChange, (e) => {\n freeze(true);\n this.managers.passwordManager.cancelPasswordEmail().then((value) => {\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\n this.close();\n }, () => {\n freeze(false);\n });\n });\n\n attachClickEvent(btnResend, (e) => {\n freeze(true);\n const d = putPreloader(btnResend);\n this.managers.passwordManager.resendPasswordEmail().then((value) => {\n d.remove();\n freeze(false);\n });\n });\n\n inputWrapper.append(inputField.container, btnChange, btnResend);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.codeInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport {putPreloader} from '../../../putPreloader';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport AppTwoStepVerificationEmailConfirmationTab from './emailConfirmation';\nimport PopupPeer from '../../../popups/peer';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport matchEmail from '../../../../lib/richTextProcessor/matchEmail';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n public hint: string;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\n this.setTitle('RecoveryEmailTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '💌';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'recovery-email',\n label: 'RecoveryEmail',\n plainText: true\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return onContinueClick();\n }\n });\n\n inputField.input.addEventListener('input', (e) => {\n inputField.input.classList.remove('error');\n });\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const onContinueClick = () => {\n const email = inputField.value.trim();\n const match = matchEmail(email);\n if(!match || match[0].length !== email.length) {\n inputField.input.classList.add('error');\n return;\n }\n\n toggleButtons(true);\n const d = putPreloader(btnContinue);\n\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email\n }).then((value) => {\n goNext();\n }, (err) => {\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.state = this.state;\n tab.email = email;\n tab.length = symbols;\n tab.open();\n } else {\n console.log('password set error', err);\n }\n\n toggleButtons(false);\n d.remove();\n });\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n const toggleButtons = (freeze: boolean) => {\n if(freeze) {\n btnContinue.setAttribute('disabled', 'true');\n btnSkip.setAttribute('disabled', 'true');\n } else {\n btnContinue.removeAttribute('disabled');\n btnSkip.removeAttribute('disabled');\n }\n };\n\n attachClickEvent(btnSkip, (e) => {\n const popup = new PopupPeer('popup-skip-email', {\n buttons: [{\n langKey: 'Cancel',\n isCancel: true\n }, {\n langKey: 'YourEmailSkip',\n callback: () => {\n // inputContent.classList.add('sidebar-left-section-disabled');\n toggleButtons(true);\n putPreloader(btnSkip);\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email: ''\n }).then(() => {\n goNext();\n }, (err) => {\n toggleButtons(false);\n });\n },\n isDanger: true\n }],\n titleLangKey: 'YourEmailSkipWarning',\n descriptionLangKey: 'YourEmailSkipWarningText'\n });\n\n popup.show();\n });\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.inputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {toast} from '../../../toast';\nimport I18n from '../../../../lib/langPack';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\n this.setTitle('TwoStepAuth.SetupHintTitle');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const emoji = '💡';\n const stickerContainer = document.createElement('div');\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'hint',\n label: 'TwoStepAuth.SetupHintPlaceholder'\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return inputField.value ? onContinueClick() : onSkipClick();\n }\n });\n\n const goNext = (e?: Event, saveHint?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n const hint = saveHint ? inputField.value : undefined;\n if(hint && this.newPassword === hint) {\n toast(I18n.format('PasswordAsHintError', true));\n return;\n }\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.hint = hint;\n\n tab.open();\n };\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const onContinueClick = (e?: Event) => goNext(e, true);\n const onSkipClick = (e?: Event) => goNext(e, false);\n attachClickEvent(btnContinue, onContinueClick);\n attachClickEvent(btnSkip, onSkipClick);\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n section.content.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n this.inputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport TrackingMonkey from '../../../monkeys/tracking';\nimport AppTwoStepVerificationHintTab from './hint';\nimport {InputState} from '../../../inputField';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\n this.setTitle('PleaseReEnterPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 're-enter-password',\n label: 'PleaseReEnterPassword'\n });\n\n const monkey = new TrackingMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.setState(InputState.Neutral);\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(this.newPassword !== passwordInputField.value) {\n passwordInputField.setError();\n return false;\n }\n\n return true;\n };\n\n const onContinueClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationHintTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.open();\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n this.passwordInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AppTwoStepVerificationTab from '.';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../../../helpers/dom/setInnerHTML';\nimport {AccountPassword} from '../../../../layer';\nimport I18n, {i18n} from '../../../../lib/langPack';\nimport wrapEmojiText from '../../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../../button';\nimport {putPreloader} from '../../../putPreloader';\nimport PasswordMonkey from '../../../monkeys/password';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationReEnterPasswordTab from './reEnterPassword';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public isFirst = true;\n\n public init() {\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 'enter-password',\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\n labelText: !isNew && this.state.hint ? wrapEmojiText(this.state.hint) : undefined\n });\n\n const monkey = new PasswordMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary');\n const textEl = new I18n.IntlElement({key: 'Continue'});\n\n btnContinue.append(textEl.element);\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.input.classList.remove('error');\n textEl.key = 'Continue';\n textEl.update();\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(!passwordInputField.value.length) {\n passwordInputField.input.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n let onContinueClick: (e?: Event) => void;\n if(!isNew) {\n let getStateInterval: number;\n\n const getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return this.managers.passwordManager.getState().then((_state) => {\n this.state = _state;\n\n if(this.state.hint) {\n setInnerHTML(passwordInputField.label, wrapEmojiText(this.state.hint));\n } else {\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\n }\n });\n };\n\n const submit = (e?: Event) => {\n if(!verifyInput()) {\n cancelEvent(e);\n return;\n }\n\n btnContinue.setAttribute('disabled', 'true');\n textEl.key = 'PleaseWait';\n textEl.update();\n const preloader = putPreloader(btnContinue);\n\n const plainPassword = passwordInputField.value;\n this.managers.passwordManager.check(passwordInputField.value, this.state).then((auth) => {\n console.log(auth);\n\n if(auth._ === 'auth.authorization') {\n clearInterval(getStateInterval);\n if(monkey) monkey.remove();\n const tab = this.slider.createTab(AppTwoStepVerificationTab);\n tab.state = this.state;\n tab.plainPassword = plainPassword;\n tab.open();\n this.slider.removeTabFromHistory(this);\n }\n }, (err) => {\n btnContinue.removeAttribute('disabled');\n passwordInputField.input.classList.add('error');\n\n switch(err.type) {\n default:\n // btnContinue.innerText = err.type;\n textEl.key = 'PASSWORD_HASH_INVALID';\n textEl.update();\n preloader.remove();\n passwordInputField.select();\n break;\n }\n\n getState();\n });\n };\n\n onContinueClick = submit;\n\n getState();\n } else {\n onContinueClick = (e) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationReEnterPasswordTab);\n tab.state = this.state;\n tab.newPassword = passwordInputField.value;\n tab.plainPassword = this.plainPassword;\n tab.open();\n };\n }\n\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.passwordInputField.input.focus();\n }\n}\n","/*\n * 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 {AccountPassword} from '../../../../layer';\nimport {_i18n} from '../../../../lib/langPack';\nimport Button from '../../../button';\nimport PopupPeer from '../../../popups/peer';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\nimport AppTwoStepVerificationEmailTab from './email';\nimport AppTwoStepVerificationEnterPasswordTab from './enterPassword';\n\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\n public state: AccountPassword;\n public plainPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\n this.setTitle('TwoStepVerificationTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '🔐';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 168,\n height: 168,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const c = section.generateContentElement();\n if(this.state.pFlags.has_password) {\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\n\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\n\n attachClickEvent(btnChangePassword, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.open();\n });\n\n attachClickEvent(btnDisablePassword, () => {\n const popup = new PopupPeer('popup-disable-password', {\n buttons: [{\n langKey: 'Disable',\n callback: () => {\n this.managers.passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n this.close();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'TurnPasswordOffQuestionTitle',\n descriptionLangKey: 'TurnPasswordOffQuestion'\n });\n\n popup.show();\n });\n\n attachClickEvent(btnSetRecoveryEmail, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.hint = this.state.hint;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.plainPassword;\n tab.isFirst = true;\n tab.open();\n });\n\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\n } else {\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\n\n inputWrapper.append(btnSetPassword);\n c.append(inputWrapper);\n\n attachClickEvent(btnSetPassword, (e) => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.open();\n });\n }\n\n this.scrollable.container.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 PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\n this.setTitle('PrivacyLastSeen');\n\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\n new PrivacySection({\n tab: this,\n title: 'LastSeenTitle',\n inputKey: 'inputPrivacyKeyStatusTimestamp',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n managers: this.managers\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\n this.setTitle('PrivacyProfilePhoto');\n\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyProfilePhotoTitle',\n inputKey: 'inputPrivacyKeyProfilePhoto',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\n this.setTitle('PrivacySettings.Forwards');\n\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyForwardsTitle',\n inputKey: 'inputPrivacyKeyForwards',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\n this.setTitle('PrivacySettings.Groups');\n\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanAddMe',\n inputKey: 'inputPrivacyKeyChatInvite',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-calls');\n this.setTitle('PrivacySettings.VoiceCalls');\n\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanCallMe',\n inputKey: 'inputPrivacyKeyPhoneCall',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n\n {\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\n new PrivacySection({\n tab: this,\n title: 'PrivacyP2PHeader',\n inputKey: 'inputPrivacyKeyPhoneP2P',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from '../../button';\nimport Row from '../../row';\nimport {Authorization} from '../../../layer';\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport {toast} from '../../toast';\nimport I18n from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport SettingSection from '../../settingSection';\n\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\n public authorizations: Authorization.authorization[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('active-sessions-container');\n this.setTitle('SessionsTitle');\n\n const Session = (auth: Authorization.authorization) => {\n const row = new Row({\n title: [auth.app_name, auth.app_version].join(' '),\n subtitle: [auth.ip, auth.country].join(' - '),\n clickable: true,\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n row.container.dataset.hash = '' + auth.hash;\n\n row.midtitle.textContent = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n const authorizations = this.authorizations.slice();\n\n {\n const section = new SettingSection({\n name: 'CurrentSession',\n caption: 'ClearOtherSessionsHelp'\n });\n\n const auth = findAndSplice(authorizations, auth => auth.pFlags.current);\n const session = Session(auth);\n\n section.content.append(session.container);\n\n if(authorizations.length) {\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\n attachClickEvent(btnTerminate, (e) => {\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.apiManager.invokeApi('auth.resetAuthorizations').then((value) => {\n // toggleDisability([btnTerminate], false);\n btnTerminate.remove();\n otherSection.container.remove();\n }, onError).finally(() => {\n toggle();\n });\n }\n }],\n titleLangKey: 'AreYouSureSessionsTitle',\n descriptionLangKey: 'AreYouSureSessions'\n }).show();\n });\n\n section.content.append(btnTerminate);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!authorizations.length) {\n return;\n }\n\n const otherSection = new SettingSection({\n name: 'OtherSessions',\n caption: 'SessionsListInfo'\n });\n\n authorizations.forEach((auth) => {\n otherSection.content.append(Session(auth).container);\n });\n\n this.scrollable.append(otherSection.container);\n\n const onError = (err: any) => {\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\n }\n };\n\n let target: HTMLElement;\n const onTerminateClick = () => {\n const hash = target.dataset.hash;\n\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n this.managers.apiManager.invokeApi('account.resetAuthorization', {hash})\n .then((value) => {\n if(value) {\n target.remove();\n }\n }, onError);\n }\n }],\n titleLangKey: 'AreYouSureSessionTitle',\n descriptionLangKey: 'TerminateSessionText'\n }).show();\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'stop',\n text: 'Terminate',\n onClick: onTerminateClick\n }]\n });\n element.id = 'active-sessions-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener(this.scrollable.container, (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n });\n\n attachClickEvent(this.scrollable.container, (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n onTerminateClick();\n });\n }\n\n onCloseAfterTimeout() {\n if(this.menuElement) {\n this.menuElement.remove();\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * 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 {ButtonMenuSync} from '../../buttonMenu';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport PopupPickUser from '../../popups/pickUser';\nimport rootScope from '../../../lib/rootScope';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport SettingSection from '../../settingSection';\n\nexport default class AppBlockedUsersTab extends SliderSuperTab {\n public peerIds: PeerId[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('blocked-users-container');\n this.setTitle('BlockedUsers');\n\n const section = new SettingSection({\n caption: 'BlockedUsersInfo'\n });\n\n section.caption.parentElement.prepend(section.caption);\n\n this.scrollable.append(section.container);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, (e) => {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'BlockModal.Search.Placeholder',\n onSelect: (peerId) => {\n // console.log('block', peerId);\n this.managers.appUsersManager.toggleBlock(peerId, true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n const list = appDialogsManager.createChatList();\n this.scrollable.container.classList.add('chatlist-container');\n section.content.append(list);\n\n const add = async(peerId: PeerId, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n if(!user) {\n return;\n }\n\n const usernames = getPeerActiveUsernames(user);\n const username = usernames[0];\n if(user.pFlags.bot) {\n dom.lastMessageSpan.append('@' + username);\n } else {\n if(user.phone) dom.lastMessageSpan.innerHTML = formatUserPhone(user.phone);\n else dom.lastMessageSpan.append(username ? '@' + username : getUserStatusString(user));\n }\n\n // dom.titleSpan.innerHTML = 'Raaid El Syed';\n // dom.lastMessageSpan.innerHTML = '+1 234 567891';\n };\n\n for(const peerId of this.peerIds) {\n add(peerId, true);\n }\n\n let target: HTMLElement;\n const onUnblock = () => {\n const peerId = target.dataset.peerId.toPeerId();\n this.managers.appUsersManager.toggleBlock(peerId, false);\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'lockoff',\n text: 'Unblock',\n onClick: onUnblock,\n options: {listenerSetter: this.listenerSetter}\n }]\n });\n element.id = 'blocked-users-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener(this.scrollable.container, (e) => {\n target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n }, this.listenerSetter);\n\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\n const {peerId, blocked} = update;\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\n if(blocked) {\n if(!li) {\n add(peerId, false);\n }\n } else {\n if(li) {\n li.remove();\n }\n }\n });\n\n const LOAD_COUNT = 50;\n let loading = false;\n this.scrollable.onScrolledBottom = () => {\n if(loading) {\n return;\n }\n\n loading = true;\n this.managers.appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then((res) => {\n for(const peerId of res.peerIds) {\n add(peerId, true);\n }\n\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\n this.scrollable.onScrolledBottom = null;\n }\n\n this.scrollable.checkForTriggers();\n }).finally(() => {\n loading = false;\n });\n };\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n if(this.menuElement) {\n this.menuElement.remove();\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\n}\n","/*\n * 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 PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyVoicesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-voices');\n this.setTitle('PrivacyVoiceMessages');\n\n const caption: LangPackKey = 'PrivacyVoiceMessagesInfo';\n new PrivacySection({\n tab: this,\n title: 'PrivacyVoiceMessagesTitle',\n inputKey: 'inputPrivacyKeyVoiceMessages',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\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 SliderSuperTab, {SliderSuperTabEventable} from '../../sliderTab';\nimport Row from '../../row';\nimport {AccountPassword, Authorization, InputPrivacyKey, Updates} from '../../../layer';\nimport AppPrivacyPhoneNumberTab from './privacy/phoneNumber';\nimport AppTwoStepVerificationTab from './2fa';\nimport AppTwoStepVerificationEnterPasswordTab from './2fa/enterPassword';\nimport AppTwoStepVerificationEmailConfirmationTab from './2fa/emailConfirmation';\nimport AppPrivacyLastSeenTab from './privacy/lastSeen';\nimport AppPrivacyProfilePhotoTab from './privacy/profilePhoto';\nimport AppPrivacyForwardMessagesTab from './privacy/forwardMessages';\nimport AppPrivacyAddToGroupsTab from './privacy/addToGroups';\nimport AppPrivacyCallsTab from './privacy/calls';\nimport AppActiveSessionsTab from './activeSessions';\nimport AppBlockedUsersTab from './blockedUsers';\nimport rootScope from '../../../lib/rootScope';\nimport {i18n, LangPackKey, _i18n} from '../../../lib/langPack';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport CheckboxField from '../../checkboxField';\nimport PopupPeer from '../../popups/peer';\nimport Button from '../../button';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport getPrivacyRulesDetails from '../../../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../../../lib/appManagers/utils/privacy/privacyType';\nimport confirmationPopup, {PopupConfirmationOptions} from '../../confirmationPopup';\nimport noop from '../../../helpers/noop';\nimport {toastNew} from '../../toast';\nimport AppPrivacyVoicesTab from './privacy/voices';\nimport SettingSection from '../../settingSection';\n\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\n private activeSessionsRow: Row;\n private authorizations: Authorization.authorization[];\n\n public static getInitArgs(fromTab: SliderSuperTab) {\n return {\n appConfig: fromTab.managers.apiManager.getAppConfig(),\n globalPrivacy: fromTab.managers.appPrivacyManager.getGlobalPrivacySettings(),\n contentSettings: fromTab.managers.apiManager.invokeApi('account.getContentSettings')\n };\n }\n\n public init(p: ReturnType) {\n this.container.classList.add('dont-u-dare-block-me');\n this.setTitle('PrivacySettings');\n\n const SUBTITLE: LangPackKey = 'Loading';\n\n {\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\n\n let blockedPeerIds: PeerId[];\n const blockedUsersRow = new Row({\n icon: 'deleteuser',\n titleLangKey: 'BlockedUsers',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppBlockedUsersTab);\n tab.peerIds = blockedPeerIds;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n blockedUsersRow.freezed = true;\n\n let passwordState: AccountPassword;\n const twoFactorRowOptions = {\n icon: 'lock',\n titleLangKey: 'TwoStepVerification' as LangPackKey,\n subtitleLangKey: SUBTITLE,\n clickable: (e: Event) => {\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\n if(passwordState.pFlags.has_password) {\n tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n } else if(passwordState.email_unconfirmed_pattern) {\n tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.email = passwordState.email_unconfirmed_pattern;\n tab.length = 6;\n tab.isFirst = true;\n this.managers.passwordManager.resendPasswordEmail();\n } else {\n tab = this.slider.createTab(AppTwoStepVerificationTab);\n }\n\n tab.state = passwordState;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n };\n\n const twoFactorRow = new Row(twoFactorRowOptions);\n twoFactorRow.freezed = true;\n\n const activeSessionsRow = this.activeSessionsRow = new Row({\n icon: 'activesessions',\n titleLangKey: 'SessionsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveSessions();\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n activeSessionsRow.freezed = true;\n\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container);\n this.scrollable.append(section.container);\n\n const setBlockedCount = (count: number) => {\n if(count) {\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\n } else {\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\n }\n };\n\n this.listenerSetter.add(rootScope)('peer_block', () => {\n /* const {blocked, peerId} = update;\n if(!blocked) blockedPeerIds.findAndSplice((p) => p === peerId);\n else blockedPeerIds.unshift(peerId);\n blockedCount += blocked ? 1 : -1;\n setBlockedCount(blockedCount); */\n updateBlocked();\n });\n\n const updateBlocked = () => {\n this.managers.appUsersManager.getBlocked().then((res) => {\n blockedUsersRow.freezed = false;\n setBlockedCount(res.count);\n blockedPeerIds = res.peerIds;\n });\n };\n\n updateBlocked();\n\n this.managers.passwordManager.getState().then((state) => {\n passwordState = state;\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\n twoFactorRow.freezed = false;\n\n // console.log('password state', state);\n });\n\n this.updateActiveSessions();\n }\n\n {\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\n\n section.content.classList.add('privacy-navigation-container');\n\n const rowsByKeys: Partial<{\n [key in InputPrivacyKey['_']]: Row\n }> = {};\n\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\n titleLangKey: 'PrivacyPhoneTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyPhoneNumberTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\n titleLangKey: 'LastSeenTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyLastSeenTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\n titleLangKey: 'PrivacyProfilePhotoTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyProfilePhotoTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\n titleLangKey: 'WhoCanCallMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyCallsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\n titleLangKey: 'PrivacyForwardsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyForwardMessagesTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\n titleLangKey: 'WhoCanAddMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyAddToGroupsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const voicesRow = rowsByKeys['inputPrivacyKeyVoiceMessages'] = new Row({\n titleLangKey: 'PrivacyVoiceMessagesTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n if(!rootScope.premium) {\n toastNew({langPackKey: 'PrivacyVoiceMessagesPremiumOnly'});\n } else {\n this.slider.createTab(AppPrivacyVoicesTab).open();\n }\n },\n listenerSetter: this.listenerSetter\n });\n\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\n const row = rowsByKeys[key];\n if(!row) {\n return;\n }\n\n this.managers.appPrivacyManager.getPrivacy(key).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\n\n row.subtitle.innerHTML = '';\n const s = i18n(langKey);\n row.subtitle.append(s);\n if(disallowLength || allowLength) {\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\n }\n });\n };\n\n section.content.append(\n numberVisibilityRow.container,\n lastSeenTimeRow.container,\n photoVisibilityRow.container,\n callRow.container,\n linkAccountRow.container,\n groupChatsAddRow.container,\n voicesRow.container\n );\n this.scrollable.append(section.container);\n\n for(const key in rowsByKeys) {\n updatePrivacyRow(key as keyof typeof rowsByKeys);\n }\n\n rootScope.addEventListener('privacy_update', (update) => {\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\n });\n }\n\n const promises: Promise[] = [];\n\n {\n const section = new SettingSection({name: 'NewChatsFromNonContacts', caption: 'ArchiveAndMuteInfo'});\n\n const checkboxField = new CheckboxField({text: 'ArchiveAndMute'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean, destroyed: boolean;\n this.eventListener.addEventListener('destroy', () => {\n destroyed = true;\n if(enabled === undefined || enabled === checkboxField.checked) return;\n return this.managers.appPrivacyManager.setGlobalPrivacySettings({\n _: 'globalPrivacySettings',\n archive_and_mute_new_noncontact_peers: checkboxField.checked\n });\n }, {once: true});\n\n const promise = Promise.all([\n p.appConfig,\n p.globalPrivacy\n ]).then(([appConfig, settings]) => {\n if(destroyed) {\n return;\n }\n\n const onPremiumToggle = (isPremium: boolean) => {\n section.container.classList.toggle('hide', !isPremium && !appConfig.autoarchive_setting_available);\n };\n\n this.listenerSetter.add(rootScope)('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n\n enabled = !!settings.archive_and_mute_new_noncontact_peers;\n\n checkboxField.setValueSilently(enabled);\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'Privacy.SensitiveContent', caption: 'PrivacyAndSecurity.SensitiveDesc'});\n section.container.classList.add('hide');\n\n const checkboxField = new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean;\n this.eventListener.addEventListener('destroy', () => {\n if(enabled === undefined) return;\n const _enabled = row.checkboxField.checked;\n const isChanged = _enabled !== enabled;\n if(!isChanged) {\n return;\n }\n\n return this.managers.apiManager.invokeApi('account.setContentSettings', {\n sensitive_enabled: _enabled\n });\n }, {once: true});\n\n const promise = p.contentSettings.then((settings) => {\n if(!settings.pFlags.sensitive_can_change) {\n return;\n }\n\n enabled = !!settings.pFlags.sensitive_enabled;\n checkboxField.setValueSilently(enabled);\n section.container.classList.remove('hide');\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'PrivacyPayments', caption: 'PrivacyPaymentsClearInfo'});\n\n const onClearClick = () => {\n const options: PopupConfirmationOptions = {\n titleLangKey: 'PrivacyPaymentsClearAlertTitle',\n descriptionLangKey: 'PrivacyPaymentsClearAlertText',\n button: {\n langKey: 'Clear'\n },\n checkboxes: [{\n text: 'PrivacyClearShipping',\n checked: true\n }, {\n text: 'PrivacyClearPayment',\n checked: true\n }]\n };\n\n confirmationPopup(options).then(() => {\n const [info, payment] = options.checkboxes.map((c) => c.checkboxField.checked);\n const toggle = toggleDisability([clearButton], true);\n this.managers.appPaymentsManager.clearSavedInfo(info, payment).then(() => {\n if(!info && !payment) {\n return;\n }\n\n toggle();\n toastNew({\n langPackKey: info && payment ? 'PrivacyPaymentsPaymentShippingCleared' : (info ? 'PrivacyPaymentsShippingInfoCleared' : 'PrivacyPaymentsPaymentInfoCleared')\n });\n });\n }, noop);\n };\n\n const clearButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyPaymentsClear'});\n this.listenerSetter.add(clearButton)('click', onClearClick);\n section.content.append(clearButton);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'FilterChats'});\n\n const onDeleteClick = () => {\n const popup = new PopupPeer('popup-delete-drafts', {\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([deleteButton], true);\n this.managers.appDraftsManager.clearAllDrafts().then(() => {\n toggle();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'AreYouSureClearDraftsTitle',\n descriptionLangKey: 'AreYouSureClearDrafts'\n });\n\n popup.show();\n };\n\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\n section.content.append(deleteButton);\n\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then((drafts) => {\n const draftsRow = new Row({\n titleLangKey: 'PrivacyDeleteCloudDrafts',\n subtitleLangKey: 'Drafts',\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\n icon: 'delete',\n clickable: onDeleteClick\n });\n\n section.content.append(draftsRow.container);\n })); */\n\n this.scrollable.append(section.container);\n }\n\n return Promise.all(promises);\n }\n\n public updateActiveSessions() {\n this.managers.apiManager.invokeApi('account.getAuthorizations').then((auths) => {\n this.activeSessionsRow.freezed = false;\n this.authorizations = auths.authorizations;\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\n // console.log('auths', auths);\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 {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\n\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n\n const pixel = new Array(4).fill(0);\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\n const pixelsLength = pixels.length / 4;\n for(let i = 0; i < pixels.length; i += 4) {\n // const alphaPixel = pixels[i + 3];\n pixel[0] += pixels[i]/* * (alphaPixel / 255) */;\n pixel[1] += pixels[i + 1]/* * (alphaPixel / 255) */;\n pixel[2] += pixels[i + 2]/* * (alphaPixel / 255) */;\n pixel[3] += pixels[i + 3];\n }\n\n const outPixel = new Uint8ClampedArray(4);\n outPixel[0] = pixel[0] / pixelsLength;\n outPixel[1] = pixel[1] / pixelsLength;\n outPixel[2] = pixel[2] / pixelsLength;\n outPixel[3] = pixel[3] / pixelsLength;\n // outPixel[3] = 255;\n return outPixel;\n}\n\nexport function averageColorFromImageSource(imageSource: CanvasImageSource, width: number, height: number) {\n const canvas = document.createElement('canvas');\n const ratio = width / height;\n const DIMENSIONS = 50;\n if(ratio === 1) {\n canvas.width = DIMENSIONS;\n canvas.height = canvas.width / ratio;\n } else if(ratio > 1) {\n canvas.height = DIMENSIONS;\n canvas.width = canvas.height / ratio;\n } else {\n canvas.width = canvas.height = DIMENSIONS;\n }\n\n const context = canvas.getContext('2d');\n context.drawImage(imageSource, 0, 0, width, height, 0, 0, canvas.width, canvas.height);\n return averageColorFromCanvas(canvas);\n}\n\nexport function averageColor(imageUrl: string) {\n const img = document.createElement('img');\n return renderImageFromUrlPromise(img, imageUrl, false).then(() => {\n return averageColorFromImageSource(img, img.naturalWidth, img.naturalHeight);\n });\n};\n","import {rgbaToHsla} from './color';\n\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\n if(s > 0) {\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\n }\n l = Math.max(0, l * .65);\n\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\n return hsla;\n}\n","import {ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla} from '../helpers/color';\nimport attachGrabListeners from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport InputField, {InputState} from './inputField';\n\nexport type ColorPickerColor = {\n hsl: string;\n rgb: string;\n hex: string;\n hsla: string;\n rgba: string;\n hexa: string;\n rgbaArray: ColorRgba;\n};\n\nexport default class ColorPicker {\n private static BASE_CLASS = 'color-picker';\n public container: HTMLElement;\n\n private boxRect: DOMRect;\n // private boxDraggerRect: DOMRect;\n private hueRect: DOMRect;\n // private hueDraggerRect: DOMRect;\n\n private hue = 0;\n private saturation = 100;\n private lightness = 50;\n private alpha = 1;\n private elements: {\n box: SVGSVGElement,\n boxDragger: SVGSVGElement,\n sliders: HTMLElement,\n hue: SVGSVGElement,\n hueDragger: SVGSVGElement,\n saturation: SVGLinearGradientElement,\n } = {} as any;\n private hexInputField: InputField;\n private rgbInputField: InputField;\n public onChange: (color: ReturnType) => void;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.classList.add(ColorPicker.BASE_CLASS);\n\n const html = `\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 `;\n\n this.container.innerHTML = html;\n\n this.elements.box = this.container.firstElementChild as any;\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\n\n this.elements.sliders = this.elements.box.nextElementSibling as any;\n\n this.elements.hue = this.elements.sliders.firstElementChild as any;\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\n\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\n\n const inputs = document.createElement('div');\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\n this.container.append(inputs);\n\n this.hexInputField.input.addEventListener('input', () => {\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\n\n const match = value.match(/([a-fA-F\\d]+)/);\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\n\n value = '#' + value;\n this.hexInputField.setValueSilently(value);\n\n if(valid) {\n this.setColor(value, false, true);\n }\n });\n\n // patched https://stackoverflow.com/a/34029238/6758968\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])\\)?)$/;\n this.rgbInputField.input.addEventListener('input', () => {\n const match = this.rgbInputField.value.match(rgbRegExp);\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\n\n if(match) {\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\n }\n });\n\n this.attachBoxListeners();\n this.attachHueListeners();\n }\n\n private onGrabStart = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\n };\n\n private onGrabEnd = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\n };\n\n private attachBoxListeners() {\n attachGrabListeners(this.elements.box as any, () => {\n this.onGrabStart();\n this.boxRect = this.elements.box.getBoundingClientRect();\n // this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\n }, (pos) => {\n this.saturationHandler(pos.x, pos.y);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n private attachHueListeners() {\n attachGrabListeners(this.elements.hue as any, () => {\n this.onGrabStart();\n this.hueRect = this.elements.hue.getBoundingClientRect();\n // this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\n }, (pos) => {\n this.hueHandler(pos.x);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\n if(color === undefined) { // * set to red\n color = {\n h: 0,\n s: 100,\n l: 50,\n a: 1\n };\n } else if(typeof(color) === 'string') {\n if(color[0] === '#') {\n color = hexaToHsla(color);\n } else {\n const rgb = color.match(/[.?\\d]+/g);\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\n }\n }\n\n // Set box\n this.boxRect = this.elements.box.getBoundingClientRect();\n\n const boxX = this.boxRect.width / 100 * color.s;\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\n const boxY = this.boxRect.height / 100 * percentY;\n\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\n\n // Set hue\n this.hueRect = this.elements.hue.getBoundingClientRect();\n\n const percentHue = color.h / 360;\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\n\n this.hueHandler(hueX, false);\n\n // Set values\n this.hue = color.h;\n this.saturation = color.s;\n this.lightness = color.l;\n this.alpha = color.a;\n\n this.updatePicker(updateHexInput, updateRgbInput);\n };\n\n public getCurrentColor(): ColorPickerColor {\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\n const hexa = rgbaToHexa(rgbaArray);\n const hex = hexa.slice(0, -2);\n\n return {\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\n hex: hex,\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\n hexa: hexa,\n rgbaArray: rgbaArray\n };\n }\n\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\n const color = this.getCurrentColor();\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\n\n if(updateHexInput) {\n this.hexInputField.setValueSilently(color.hex);\n this.hexInputField.setState(InputState.Neutral);\n }\n\n if(updateRgbInput) {\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\n this.rgbInputField.setState(InputState.Neutral);\n }\n\n if(this.onChange) {\n this.onChange(color);\n }\n }\n\n private hueHandler(pageX: number, update = true) {\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\n\n const percents = eventX / this.hueRect.width;\n this.hue = Math.round(360 * percents);\n\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\n\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\n\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\n\n if(update) {\n this.updatePicker();\n }\n }\n\n private saturationHandler(pageX: number, pageY: number, update = true) {\n const maxX = this.boxRect.width;\n const maxY = this.boxRect.height;\n\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\n\n const posX = eventX / maxX * 100;\n const posY = eventY / maxY * 100;\n\n const boxDragger = this.elements.boxDragger;\n boxDragger.setAttributeNS(null, 'x', posX + '%');\n boxDragger.setAttributeNS(null, 'y', posY + '%');\n\n const saturation = clamp(posX, 0, 100);\n\n const lightnessX = 100 - saturation / 2;\n const lightnessY = 100 - clamp(posY, 0, 100);\n\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\n\n this.saturation = saturation;\n this.lightness = lightness;\n\n if(update) {\n this.updatePicker();\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 {Theme} from '../../../config/state';\nimport {hexaToRgba} from '../../../helpers/color';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport throttle from '../../../helpers/schedulers/throttle';\nimport themeController from '../../../helpers/themeController';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport ColorPicker, {ColorPickerColor} from '../../colorPicker';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider';\n\nexport default class AppBackgroundColorTab extends SliderSuperTab {\n private colorPicker: ColorPicker;\n private grid: HTMLElement;\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\n private theme: Theme;\n\n init() {\n this.container.classList.add('background-container', 'background-color-container');\n this.setTitle('SetColor');\n\n this.theme = themeController.getTheme();\n\n const section = new SettingSection({});\n this.colorPicker = new ColorPicker();\n\n section.content.append(this.colorPicker.container);\n\n this.scrollable.append(section.container);\n\n const gridSection = new SettingSection({});\n\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n\n const colors = [\n '#E6EBEE',\n '#B2CEE1',\n '#008DD0',\n '#C6E7CB',\n '#C4E1A6',\n '#60B16E',\n '#CCD0AF',\n '#A6A997',\n '#7A7072',\n '#FDD7AF',\n '#FDB76E',\n '#DD8851'\n ];\n\n colors.forEach((color) => {\n const item = document.createElement('div');\n item.classList.add('grid-item');\n item.dataset.color = color.toLowerCase();\n\n // * need for transform scale\n const media = document.createElement('div');\n media.classList.add('grid-item-media');\n media.style.backgroundColor = color;\n\n item.append(media);\n grid.append(item);\n });\n\n attachClickEvent(grid, (e) => {\n const target = findUpClassName(e.target, 'grid-item');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n const color = target.dataset.color;\n if(!color) {\n return;\n }\n\n this.applyColor(color);\n }, {listenerSetter: this.listenerSetter});\n\n gridSection.content.append(grid);\n this.scrollable.append(gridSection.container);\n\n this.applyColor = throttle(this._applyColor, 16, true);\n }\n\n private setActive() {\n const active = this.grid.querySelector('.active');\n const background = this.theme.background;\n const target = background.color ? this.grid.querySelector(`.grid-item[data-color=\"${background.color}\"]`) : null;\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n }\n\n private _applyColor = (hex: string, updateColorPicker = true) => {\n if(updateColorPicker) {\n this.colorPicker.setColor(hex);\n } else {\n const rgba = hexaToRgba(hex);\n const background = this.theme.background;\n const hsla = highlightningColor(rgba);\n\n background.id = '2';\n background.intensity = 0;\n background.slug = '';\n background.color = hex.toLowerCase();\n background.highlightningColor = hsla;\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.setActive();\n }\n };\n\n private onColorChange = (color: ColorPickerColor) => {\n this.applyColor(color.hex, false);\n };\n\n onOpen() {\n setTimeout(() => {\n const background = this.theme.background;\n\n const color = (background.color || '').split(',')[0];\n const isColored = !!color && !background.slug;\n\n // * set active if type is color\n if(isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n\n this.colorPicker.setColor(color || '#cccccc');\n\n if(!isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n }, 0);\n }\n\n onCloseAfterTimeout() {\n this.colorPicker.onChange = undefined;\n this.colorPicker = undefined;\n\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {averageColor, averageColorFromCanvas} from '../../../helpers/averageColor';\nimport blur from '../../../helpers/blur';\nimport deferredPromise, {CancellablePromise} from '../../../helpers/cancellablePromise';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport copy from '../../../helpers/object/copy';\nimport sequentialDom from '../../../helpers/sequentialDom';\nimport ChatBackgroundGradientRenderer from '../../chat/gradientRenderer';\nimport {Document, PhotoSize, WallPaper} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {AppDownloadManager, DownloadBlob} from '../../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport ProgressivePreloader from '../../preloader';\nimport {SliderSuperTab} from '../../slider';\nimport AppBackgroundColorTab from './backgroundColor';\nimport choosePhotoSize from '../../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {STATE_INIT, Theme} from '../../../config/state';\nimport themeController from '../../../helpers/themeController';\nimport requestFile from '../../../helpers/files/requestFile';\nimport {renderImageFromUrlPromise} from '../../../helpers/dom/renderImageFromUrl';\nimport scaleMediaElement from '../../../helpers/canvas/scaleMediaElement';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport wrapPhoto from '../../wrappers/photo';\nimport {CreateRowFromCheckboxField} from '../../row';\nimport {generateSection} from '../../settingSection';\n\nexport default class AppBackgroundTab extends SliderSuperTab {\n private grid: HTMLElement;\n private tempId = 0;\n private clicked: Set = new Set();\n private blurCheckboxField: CheckboxField;\n\n private wallPapersByElement: Map = new Map();\n private elementsByKey: Map = new Map();\n\n private get theme() {\n return themeController.getTheme();\n }\n\n init() {\n this.container.classList.add('background-container', 'background-image-container');\n this.setTitle('ChatBackground');\n\n {\n const container = generateSection(this.scrollable);\n\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\n\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(colorButton, () => {\n this.slider.createTab(AppBackgroundColorTab).open();\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\n\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\n text: 'ChatBackground.Blur',\n name: 'blur',\n checked: this.theme.background.blur\n });\n\n this.listenerSetter.add(blurCheckboxField.input)('change', async() => {\n this.theme.background.blur = blurCheckboxField.input.checked;\n await this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n // * wait for animation end\n setTimeout(() => {\n const active = grid.querySelector('.active') as HTMLElement;\n if(!active) return;\n\n const wallpaper = this.wallPapersByElement.get(active);\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\n return;\n }\n\n this.setBackgroundDocument(wallpaper);\n }, 100);\n });\n\n container.append(\n uploadButton,\n colorButton,\n resetButton,\n CreateRowFromCheckboxField(blurCheckboxField).container\n );\n }\n\n rootScope.addEventListener('background_change', this.setActive);\n\n this.managers.appDocsManager.getWallPapers().then((wallPapers) => {\n wallPapers.forEach((wallPaper) => {\n this.addWallPaper(wallPaper);\n });\n });\n\n const gridContainer = generateSection(this.scrollable);\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\n gridContainer.append(grid);\n }\n\n private onUploadClick = () => {\n requestFile('image/x-png,image/png,image/jpeg').then(async(file) => {\n if(file.name.endsWith('.png')) {\n const img = document.createElement('img');\n const url = URL.createObjectURL(file);\n await renderImageFromUrlPromise(img, url, false);\n const mimeType = 'image/jpeg';\n const {blob} = await scaleMediaElement({media: img, size: new MediaSize(img.naturalWidth, img.naturalHeight), mimeType});\n file = new File([blob], file.name.replace(/\\.png$/, '.jpg'), {type: mimeType});\n }\n\n const wallPaper = await this.managers.appDocsManager.prepareWallPaperUpload(file);\n const uploadPromise = this.managers.appDocsManager.uploadWallPaper(wallPaper.id);\n const uploadDeferred: CancellablePromise = appDownloadManager.getNewDeferredForUpload(file.name, uploadPromise);\n\n const deferred = deferredPromise();\n deferred.addNotifyListener = uploadDeferred.addNotifyListener;\n deferred.cancel = uploadDeferred.cancel;\n\n uploadDeferred.then((wallPaper) => {\n this.clicked.delete(key);\n this.elementsByKey.delete(key);\n this.wallPapersByElement.set(container, wallPaper);\n const newKey = this.getWallPaperKey(wallPaper);\n this.elementsByKey.set(newKey, container);\n\n this.setBackgroundDocument(wallPaper).then(deferred.resolve, deferred.reject);\n }, deferred.reject);\n\n const key = this.getWallPaperKey(wallPaper);\n deferred.catch(() => {\n container.remove();\n });\n\n const preloader = new ProgressivePreloader({\n isUpload: true,\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const container = this.addWallPaper(wallPaper, false);\n this.clicked.add(key);\n\n preloader.attach(container, false, deferred);\n });\n };\n\n private onResetClick = () => {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === this.theme.name);\n if(defaultTheme) {\n ++this.tempId;\n this.theme.background = copy(defaultTheme.background);\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\n }\n };\n\n private getColorsFromWallPaper(wallPaper: WallPaper) {\n return wallPaper.settings ? [\n wallPaper.settings.background_color,\n wallPaper.settings.second_background_color,\n wallPaper.settings.third_background_color,\n wallPaper.settings.fourth_background_color\n ].filter(Boolean).map((color) => '#' + color.toString(16)).join(',') : '';\n }\n\n private getWallPaperKey(wallPaper: WallPaper) {\n return '' + wallPaper.id;\n }\n\n private getWallPaperKeyFromTheme(theme: Theme) {\n return '' + theme.background.id;\n }\n\n private addWallPaper(wallPaper: WallPaper, append = true) {\n const colors = this.getColorsFromWallPaper(wallPaper);\n const hasFile = wallPaper._ === 'wallPaper';\n if((hasFile && wallPaper.pFlags.pattern && !colors)/* ||\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\n return;\n }\n\n const isDark = !!wallPaper.pFlags.dark;\n\n const doc = hasFile ? wallPaper.document as Document.document : undefined;\n\n const container = document.createElement('div');\n container.classList.add('grid-item');\n\n container.dataset.id = '' + wallPaper.id;\n\n const key = this.getWallPaperKey(wallPaper);\n this.wallPapersByElement.set(container, wallPaper);\n this.elementsByKey.set(key, container);\n\n const media = document.createElement('div');\n media.classList.add('grid-item-media');\n\n let wrapped: ReturnType, size: ReturnType;\n if(hasFile) {\n size = choosePhotoSize(doc, 200, 200);\n wrapped = wrapPhoto({\n photo: doc,\n message: null,\n container: media,\n withoutPreloader: true,\n size: size,\n noFadeIn: wallPaper.pFlags.pattern\n });\n\n if(wallPaper.pFlags.pattern) {\n media.classList.add('is-pattern');\n }\n\n wrapped.then(async({loadPromises, images}) => {\n await loadPromises.thumb || loadPromises.full;\n return images;\n }).then((images) => {\n if(wallPaper.pFlags.pattern) {\n if(isDark) {\n images.full.style.display = 'none';\n if(images.thumb) {\n images.thumb.style.display = 'none';\n }\n } else if(wallPaper.settings?.intensity) {\n images.full.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\n }\n }\n\n sequentialDom.mutate(() => {\n container.append(media);\n });\n });\n } else {\n container.append(media);\n }\n\n if(wallPaper.settings && wallPaper.settings.background_color !== undefined) {\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\n canvas.classList.add('background-colors-canvas');\n\n if(isDark && hasFile) {\n wrapped.then(({loadPromises}) => {\n loadPromises.full.then(async() => {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\n canvas.style.opacity = '' + (wallPaper.pFlags.dark ? 100 + wallPaper.settings.intensity : wallPaper.settings.intensity) / 100;\n media.append(canvas);\n });\n });\n } else {\n media.append(canvas);\n }\n }\n\n if(this.getWallPaperKeyFromTheme(this.theme) === key) {\n container.classList.add('active');\n }\n\n this.grid[append ? 'append' : 'prepend'](container);\n\n return container;\n }\n\n private onGridClick = (e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\n if(!target) return;\n\n const wallpaper = this.wallPapersByElement.get(target);\n if(wallpaper._ === 'wallPaperNoFile') {\n this.setBackgroundDocument(wallpaper);\n return;\n }\n\n const key = this.getWallPaperKey(wallpaper);\n if(this.clicked.has(key)) return;\n this.clicked.add(key);\n\n const doc = wallpaper.document as MyDocument;\n const preloader = new ProgressivePreloader({\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const load = async() => {\n const promise = this.setBackgroundDocument(wallpaper);\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url || this.theme.background.blur) {\n preloader.attach(target, true, promise);\n }\n };\n\n preloader.construct();\n\n attachClickEvent(target, (e) => {\n if(preloader.preloader.parentElement) {\n preloader.onClick(e);\n preloader.detach();\n } else {\n load();\n }\n }, {listenerSetter: this.listenerSetter});\n\n load();\n\n // console.log(doc);\n };\n\n private saveToCache = (slug: string, url: string) => {\n fetch(url).then((response) => {\n appImManager.cacheStorage.save('backgrounds/' + slug, response);\n });\n };\n\n private setBackgroundDocument = (wallPaper: WallPaper) => {\n const _tempId = ++this.tempId;\n const middleware = () => _tempId === this.tempId;\n\n const doc = (wallPaper as WallPaper.wallPaper).document as MyDocument;\n const deferred = deferredPromise();\n let download: Promise | ReturnType;\n if(doc) {\n download = appDownloadManager.downloadMediaURL({media: doc, queueId: appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0});\n deferred.addNotifyListener = download.addNotifyListener;\n deferred.cancel = download.cancel;\n } else {\n download = Promise.resolve();\n }\n\n download.then(async() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const background = this.theme.background;\n const onReady = (url?: string) => {\n // const perf = performance.now();\n let getPixelPromise: Promise;\n const backgroundColor = this.getColorsFromWallPaper(wallPaper);\n if(url && !backgroundColor) {\n getPixelPromise = averageColor(url);\n } else {\n const {canvas} = ChatBackgroundGradientRenderer.create(backgroundColor);\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\n }\n\n getPixelPromise.then((pixel) => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const hsla = highlightningColor(Array.from(pixel) as any);\n // const hsla = 'rgba(0, 0, 0, 0.3)';\n // console.log(doc, hsla, performance.now() - perf);\n\n const slug = (wallPaper as WallPaper.wallPaper).slug ?? '';\n background.id = wallPaper.id;\n background.intensity = wallPaper.settings?.intensity ?? 0;\n background.color = backgroundColor;\n background.slug = slug;\n background.highlightningColor = hsla;\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n if(slug) {\n this.saveToCache(slug, url);\n }\n\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\n });\n };\n\n if(!doc) {\n onReady();\n return;\n }\n\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n if(background.blur) {\n setTimeout(() => {\n const {canvas, promise} = blur(cacheContext.url, 12, 4)\n promise.then(() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n onReady(canvas.toDataURL());\n });\n }, 200);\n } else {\n onReady(cacheContext.url);\n }\n });\n\n return deferred;\n };\n\n private setActive = () => {\n const active = this.grid.querySelector('.active');\n const target = this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n };\n}\n","export default function requestFile(accept?: string) {\n const input = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n\n if(accept) {\n input.accept = accept;\n }\n\n document.body.append(input);\n\n const promise = new Promise((resolve, reject) => {\n input.addEventListener('change', (e: any) => {\n const file: File = e.target.files[0];\n if(!file) {\n reject('NO_FILE_SELECTED');\n return;\n }\n\n resolve(file);\n }, {once: true});\n }).finally(() => {\n input.remove();\n });\n\n input.click();\n\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AvailableReaction} from '../../../layer';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport SliderSuperTab from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n public init() {\n this.setTitle('DoubleTapSetting');\n this.container.classList.add('quick-reaction-container');\n\n return Promise.all([\n this.managers.appReactionsManager.getQuickReaction(),\n this.managers.appReactionsManager.getAvailableReactions()\n ]).then(([quickReaction, availableReactions]) => {\n availableReactions = availableReactions.filter((reaction) => !reaction.pFlags.inactive);\n\n const section = new SettingSection();\n\n const name = 'quick-reaction';\n const rows = availableReactions.map((availableReaction) => {\n const radioField = new RadioField({\n name,\n text: availableReaction.title,\n value: availableReaction.reaction,\n alignRight: true\n });\n\n const row = new Row({\n radioField,\n havePadding: true\n });\n\n radioField.main.classList.add('quick-reaction-title');\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n if(availableReaction.reaction === (quickReaction as AvailableReaction).reaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n this.managers.appReactionsManager.setDefaultReaction({_: 'reactionEmoji', emoticon: value});\n });\n\n section.content.append(form);\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 RangeSelector from '../../rangeSelector';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport RadioField from '../../radioField';\nimport rootScope from '../../../lib/rootScope';\nimport {IS_APPLE} from '../../../environment/userAgent';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport AppBackgroundTab from './background';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport assumeType from '../../../helpers/assumeType';\nimport {AvailableReaction, MessagesAllStickers, StickerSet} from '../../../layer';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport PopupStickers from '../../popups/stickers';\nimport eachMinute from '../../../helpers/eachMinute';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport IS_GEOLOCATION_SUPPORTED from '../../../environment/geolocationSupport';\nimport AppQuickReactionTab from './quickReaction';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {State} from '../../../config/state';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\nimport SettingSection, {generateSection} from '../../settingSection';\n\nexport class RangeSettingSelector {\n public container: HTMLDivElement;\n public valueContainer: HTMLElement;\n private range: RangeSelector;\n\n public onChange: (value: number) => void;\n\n constructor(\n name: LangPackKey,\n step: number,\n initialValue: number,\n minValue: number,\n maxValue: number,\n writeValue = true\n ) {\n const BASE_CLASS = 'range-setting-selector';\n this.container = document.createElement('div');\n this.container.classList.add(BASE_CLASS);\n\n const details = document.createElement('div');\n details.classList.add(BASE_CLASS + '-details');\n\n const nameDiv = document.createElement('div');\n nameDiv.classList.add(BASE_CLASS + '-name');\n _i18n(nameDiv, name);\n\n const valueDiv = this.valueContainer = document.createElement('div');\n valueDiv.classList.add(BASE_CLASS + '-value');\n\n if(writeValue) {\n valueDiv.innerHTML = '' + initialValue;\n }\n\n details.append(nameDiv, valueDiv);\n\n this.range = new RangeSelector({\n step,\n min: minValue,\n max: maxValue\n }, initialValue);\n this.range.setListeners();\n this.range.setHandlers({\n onScrub: value => {\n if(this.onChange) {\n this.onChange(value);\n }\n\n if(writeValue) {\n // console.log('font size scrub:', value);\n valueDiv.innerText = '' + value;\n }\n }\n });\n\n this.container.append(details, this.range.container);\n }\n}\n\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\n init() {\n this.container.classList.add('general-settings-container');\n this.setTitle('General');\n\n const section = generateSection.bind(null, this.scrollable);\n\n {\n const container = section('Settings');\n\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\n range.onChange = (value) => {\n rootScope.managers.appStateManager.setByKey('settings.messagesTextSize', value);\n };\n\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\n\n attachClickEvent(chatBackgroundButton, () => {\n this.slider.createTab(AppBackgroundTab).open();\n });\n\n const animationsCheckboxField = new CheckboxField({\n text: 'EnableAnimations',\n name: 'animations',\n stateKey: 'settings.animationsEnabled',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n range.container,\n chatBackgroundButton,\n CreateRowFromCheckboxField(animationsCheckboxField).container\n );\n }\n\n {\n const container = section('General.Keyboard');\n\n const form = document.createElement('form');\n\n const name = 'send-shortcut';\n const stateKey = 'settings.sendShortcut';\n\n const enterRow = new Row({\n radioField: new RadioField({\n langKey: 'General.SendShortcut.Enter',\n name,\n value: 'enter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\n });\n\n const ctrlEnterRow = new Row({\n radioField: new RadioField({\n name,\n value: 'ctrlEnter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\n });\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\n\n form.append(enterRow.container, ctrlEnterRow.container);\n container.append(form);\n }\n\n if(IS_GEOLOCATION_SUPPORTED) {\n const container = section('DistanceUnitsTitle');\n\n const form = document.createElement('form');\n\n const name = 'distance-unit';\n const stateKey = 'settings.distanceUnit';\n\n const kilometersRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsKilometers',\n name,\n value: 'kilometers',\n stateKey\n })\n });\n\n const milesRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsMiles',\n name,\n value: 'miles',\n stateKey\n })\n });\n\n form.append(kilometersRow.container, milesRow.container);\n container.append(form);\n }\n\n {\n const container = section('General.TimeFormat');\n\n const form = document.createElement('form');\n\n const name = 'time-format';\n const stateKey = 'settings.timeFormat';\n\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\n ['h12', 'General.TimeFormat.h12'],\n ['h23', 'General.TimeFormat.h23']\n ];\n\n const rows = formats.map(([format, langPackKey]) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: format,\n stateKey\n })\n });\n\n return row;\n });\n\n const cancel = eachMinute(() => {\n const date = new Date();\n\n formats.forEach(([format], idx) => {\n const str = date.toLocaleTimeString('en-us-u-hc-' + format, {\n hour: '2-digit',\n minute: '2-digit'\n });\n\n rows[idx].subtitle.textContent = str;\n });\n });\n\n this.eventListener.addEventListener('destroy', cancel);\n\n form.append(...rows.map((row) => row.container));\n container.append(form);\n }\n\n {\n const container = section('Emoji');\n\n const suggestCheckboxField = new CheckboxField({\n text: 'GeneralSettings.EmojiPrediction',\n name: 'suggest-emoji',\n stateKey: 'settings.emoji.suggest',\n listenerSetter: this.listenerSetter\n });\n const bigCheckboxField = new CheckboxField({\n text: 'GeneralSettings.BigEmoji',\n name: 'emoji-big',\n stateKey: 'settings.emoji.big',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(bigCheckboxField).container\n );\n }\n\n {\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\n\n const reactionsRow = new Row({\n titleLangKey: 'DoubleTapSetting',\n havePadding: true,\n clickable: () => {\n this.slider.createTab(AppQuickReactionTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const renderQuickReaction = () => {\n this.managers.appReactionsManager.getQuickReaction().then((reaction) => {\n if(reaction._ === 'availableReaction') {\n return reaction.static_icon;\n } else {\n return this.managers.appEmojiManager.getCustomEmojiDocument(reaction.document_id);\n }\n }).then((doc) => {\n wrapStickerToRow({\n row: reactionsRow,\n doc,\n size: 'small'\n });\n });\n };\n\n renderQuickReaction();\n\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\n\n const suggestCheckboxField = new CheckboxField({\n text: 'Stickers.SuggestStickers',\n name: 'suggest',\n stateKey: 'settings.stickers.suggest',\n listenerSetter: this.listenerSetter\n });\n const loopCheckboxField = new CheckboxField({\n text: 'InstalledStickers.LoopAnimated',\n name: 'loop',\n stateKey: 'settings.stickers.loop',\n listenerSetter: this.listenerSetter\n });\n\n const stickerSets: {[id: string]: Row} = {};\n\n const stickersContent = section.generateContentElement();\n\n const lazyLoadQueue = new LazyLoadQueue();\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\n const row = new Row({\n title: wrapEmojiText(stickerSet.title),\n subtitleLangKey: 'Stickers',\n subtitleLangArgs: [stickerSet.count],\n havePadding: true,\n clickable: () => {\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\n },\n listenerSetter: this.listenerSetter\n });\n\n stickerSets[stickerSet.id] = row;\n\n const div = document.createElement('div');\n div.classList.add('row-media');\n\n wrapStickerSetThumb({\n set: stickerSet,\n container: div,\n group: 'GENERAL-SETTINGS',\n lazyLoadQueue,\n width: 36,\n height: 36,\n autoplay: true\n });\n\n row.container.append(div);\n\n stickersContent[method](row.container);\n };\n\n this.managers.appStickersManager.getAllStickers().then((allStickers) => {\n assumeType(allStickers);\n for(const stickerSet of allStickers.sets) {\n renderStickerSet(stickerSet);\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!stickerSets[set.id]) {\n renderStickerSet(set, 'prepend');\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n if(stickerSets[set.id]) {\n stickerSets[set.id].container.remove();\n delete stickerSets[set.id];\n }\n });\n\n section.content.append(\n reactionsRow.container,\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(loopCheckboxField).container\n );\n this.scrollable.append(section.container);\n }\n }\n\n onOpen() {\n if(this.init) {\n this.init();\n this.init = null;\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 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Row from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport {InputNotifyPeer, Update} from '../../../layer';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport rootScope from '../../../lib/rootScope';\nimport {LangPackKey} from '../../../lib/langPack';\nimport copy from '../../../helpers/object/copy';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport {MUTE_UNTIL} from '../../../lib/mtproto/mtproto_config';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\ntype InputNotifyKey = Exclude;\n\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('notifications-container');\n this.setTitle('Telegram.NotificationSettingsViewController');\n\n const NotifySection = (options: {\n name: LangPackKey,\n typeText: LangPackKey,\n inputKey: InputNotifyKey,\n }) => {\n const section = new SettingSection({\n name: options.name\n });\n\n const enabledRow = new Row({\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const previewEnabledRow = new Row({\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n section.content.append(enabledRow.container, previewEnabledRow.container);\n\n this.scrollable.append(section.container);\n\n const inputNotifyPeer = {_: options.inputKey};\n const ret = this.managers.appNotificationsManager.getNotifySettings(inputNotifyPeer);\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\n const applySettings = async() => {\n const muted = await this.managers.appNotificationsManager.isMuted(notifySettings);\n enabledRow.checkboxField.checked = !muted;\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\n\n return muted;\n };\n\n applySettings();\n\n this.eventListener.addEventListener('destroy', async() => {\n const mute = !enabledRow.checkboxField.checked;\n const showPreviews = previewEnabledRow.checkboxField.checked;\n\n if(mute === (await this.managers.appNotificationsManager.isMuted(notifySettings)) && showPreviews === notifySettings.show_previews) {\n return;\n }\n\n const inputSettings: any = copy(notifySettings);\n inputSettings._ = 'inputPeerNotifySettings';\n inputSettings.mute_until = mute ? MUTE_UNTIL : 0;\n inputSettings.show_previews = showPreviews;\n\n this.managers.appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\n }, {once: true});\n\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\n const inputKey = convertKeyToInputKey(update.peer._) as any;\n if(options.inputKey === inputKey) {\n notifySettings = update.notify_settings;\n applySettings();\n }\n });\n });\n };\n\n NotifySection({\n name: 'NotificationsPrivateChats',\n typeText: 'NotificationsForPrivateChats',\n inputKey: 'inputNotifyUsers'\n });\n\n NotifySection({\n name: 'NotificationsGroups',\n typeText: 'NotificationsForGroups',\n inputKey: 'inputNotifyChats'\n });\n\n NotifySection({\n name: 'NotificationsChannels',\n typeText: 'NotificationsForChannels',\n inputKey: 'inputNotifyBroadcasts'\n });\n\n {\n const section = new SettingSection({\n name: 'NotificationsOther'\n });\n\n const contactsSignUpRow = new Row({\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const soundRow = new Row({\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound', listenerSetter: this.listenerSetter}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n apiManagerProxy.getState().then((state) => {\n soundRow.checkboxField.checked = state.settings.notifications.sound;\n });\n\n section.content.append(contactsSignUpRow.container, soundRow.container);\n\n this.scrollable.append(section.container);\n\n this.managers.appNotificationsManager.getContactSignUpNotification().then((enabled) => {\n contactsSignUpRow.checkboxField.checked = enabled;\n\n this.eventListener.addEventListener('destroy', () => {\n const _enabled = contactsSignUpRow.checkboxField.checked;\n if(enabled !== _enabled) {\n this.managers.appNotificationsManager.setContactSignUpNotification(!_enabled);\n }\n }, {once: 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 {randomLong} from '../../../helpers/random';\nimport {LangPackLanguage} from '../../../layer';\nimport I18n from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider'\n\nexport default class AppLanguageTab extends SliderSuperTab {\n public static getInitArgs() {\n return {\n languages1: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n lang_pack: 'web'\n }),\n // languages2: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n // lang_pack: 'macos'\n // })\n languages2: Promise.resolve([] as LangPackLanguage[])\n };\n }\n\n public init(p: ReturnType) {\n this.header.classList.add('with-border');\n this.container.classList.add('language-container');\n this.setTitle('Telegram.LanguageViewController');\n\n const section = new SettingSection({});\n\n const radioRows: Map = new Map();\n\n const promise = Promise.all([\n p.languages1,\n p.languages2\n ]).then(([languages1, languages2]) => {\n const rendered: Set = new Set();\n const webLangCodes = languages1.map((language) => language.lang_code);\n\n const random = randomLong();\n languages1.concat(languages2).forEach((language) => {\n if(rendered.has(language.lang_code)) return;\n rendered.add(language.lang_code);\n\n const row = new Row({\n radioField: new RadioField({\n text: language.name,\n name: random,\n value: language.lang_code\n }),\n subtitle: language.native_name\n });\n\n radioRows.set(language.lang_code, row);\n });\n\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\n I18n.getLangPack(value, webLangCodes.includes(value));\n });\n\n I18n.getCacheLangPack().then((langPack) => {\n const row = radioRows.get(langPack.lang_code);\n if(!row) {\n console.error('no row', row, langPack);\n return;\n }\n\n row.radioField.setValueSilently(true);\n });\n\n section.content.append(form);\n });\n\n this.scrollable.append(section.container);\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 ListenerSetter from '../../../../helpers/listenerSetter';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport CheckboxField from '../../../checkboxField';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport Row, {CreateRowFromCheckboxField} from '../../../row';\nimport SettingSection from '../../../settingSection';\n\nexport function autoDownloadPeerTypeSection(type: 'photo' | 'video' | 'file', title: LangPackKey, listenerSetter: ListenerSetter) {\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 listenerSetter\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats',\n name: 'private',\n stateKey: key + 'private',\n listenerSetter\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats',\n name: 'groups',\n stateKey: key + 'groups',\n listenerSetter\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels',\n name: 'channels',\n stateKey: key + 'channels',\n listenerSetter\n });\n\n section.content.append(\n CreateRowFromCheckboxField(contactsCheckboxField).container,\n CreateRowFromCheckboxField(privateCheckboxField).container,\n CreateRowFromCheckboxField(groupsCheckboxField).container,\n CreateRowFromCheckboxField(channelsCheckboxField).container\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadPhotos');\n\n const section = autoDownloadPeerTypeSection('photo', 'AutoDownloadPhotosTitle', this.listenerSetter);\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport formatBytes from '../../../../helpers/formatBytes';\nimport debounce from '../../../../helpers/schedulers/debounce';\nimport I18n from '../../../../lib/langPack';\nimport rootScope from '../../../../lib/rootScope';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport {RangeSettingSelector} from '../generalSettings';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadFileTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadFiles');\n\n const debouncedSave = debounce((sizeMax: number) => {\n this.managers.appStateManager.setByKey('settings.autoDownloadNew.file_size_max', sizeMax);\n }, 200, false, true);\n\n const section = autoDownloadPeerTypeSection('file', 'AutoDownloadFilesTitle', this.listenerSetter);\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 public init() {\n this.setTitle('AutoDownloadVideos');\n\n const section = autoDownloadPeerTypeSection('video', 'AutoDownloadVideosTitle', this.listenerSetter);\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AutoDownloadPeerTypeSettings, STATE_INIT} from '../../../config/state';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport formatBytes from '../../../helpers/formatBytes';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {FormatterArguments, i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport {SliderSuperTabEventable, SliderSuperTabEventableConstructable} from '../../sliderTab';\nimport AppAutoDownloadFileTab from './autoDownload/file';\nimport AppAutoDownloadPhotoTab from './autoDownload/photo';\nimport AppAutoDownloadVideoTab from './autoDownload/video';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\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 public async init() {\n this.setTitle('DataSettings');\n\n {\n const section = new SettingSection({name: 'AutomaticMediaDownload', caption: 'AutoDownloadAudioInfo'});\n\n const state = await apiManagerProxy.getState();\n\n const autoCheckboxField = new CheckboxField({\n text: 'AutoDownloadMedia',\n name: 'auto',\n checked: !state.settings.autoDownloadNew.pFlags.disabled,\n listenerSetter: this.listenerSetter\n });\n\n const autoRow = new Row({\n checkboxField: autoCheckboxField,\n listenerSetter: this.listenerSetter\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 = this.slider.createTab(tabConstructor);\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 listenerSetter: this.listenerSetter\n });\n\n const videoRow = new Row({\n titleLangKey: 'AutoDownloadVideos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadVideoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const fileRow = new Row({\n titleLangKey: 'AutoDownloadFiles',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadFileTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const resetButton = Button('btn-primary btn-transparent primary', {icon: 'delete', text: 'ResetAutomaticMediaDownload'});\n attachClickEvent(resetButton, () => {\n confirmationPopup({\n titleLangKey: 'ResetAutomaticMediaDownloadAlertTitle',\n descriptionLangKey: 'ResetAutomaticMediaDownloadAlert',\n button: {\n langKey: 'Reset'\n }\n }).then(() => {\n const settings = rootScope.settings;\n settings.autoDownloadNew = copy(STATE_INIT.settings.autoDownloadNew);\n settings.autoDownload = copy(STATE_INIT.settings.autoDownload);\n state.settings = settings;\n this.managers.appStateManager.setByKey('settings', settings);\n\n setSubtitles();\n autoCheckboxField.checked = !state.settings.autoDownloadNew.pFlags.disabled;\n });\n });\n\n const onDisabledChange = () => {\n const disabled = !autoCheckboxField.checked;\n\n const settings = rootScope.settings;\n if(disabled) {\n settings.autoDownloadNew.pFlags.disabled = true;\n } else {\n delete settings.autoDownloadNew.pFlags.disabled;\n }\n\n [photoRow, videoRow, fileRow].forEach((row) => {\n row.container.classList.toggle('is-disabled', disabled);\n });\n\n this.managers.appStateManager.setByKey('settings', settings);\n\n onChange();\n };\n\n autoCheckboxField.input.addEventListener('change', onDisabledChange);\n onDisabledChange();\n setSubtitles();\n\n section.content.append(\n autoRow.container,\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 section.content.append(new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayGIF',\n name: 'gifs',\n stateKey: 'settings.autoPlay.gifs',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container, new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayVideo',\n name: 'videos',\n stateKey: 'settings.autoPlay.videos',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey;\n const 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","/*\n * 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 ButtonMenuToggle from '../../buttonMenuToggle';\nimport Button from '../../button';\nimport AppPrivacyAndSecurityTab from './privacyAndSecurity';\nimport AppGeneralSettingsTab from './generalSettings';\nimport AppEditProfileTab from './editProfile';\nimport AppChatFoldersTab from './chatFolders';\nimport AppNotificationsTab from './notifications';\nimport AppLanguageTab from './language';\nimport lottieLoader from '../../../lib/rlottie/lottieLoader';\nimport PopupPeer from '../../popups/peer';\nimport AppDataAndStorageTab from './dataAndStorage';\nimport ButtonIcon from '../../buttonIcon';\nimport PeerProfile from '../../peerProfile';\nimport rootScope from '../../../lib/rootScope';\nimport Row from '../../row';\nimport AppActiveSessionsTab from './activeSessions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport {SliderSuperTabConstructable, SliderSuperTabEventable} from '../../sliderTab';\nimport PopupAvatar from '../../popups/avatar';\nimport {AccountAuthorizations, Authorization} from '../../../layer';\nimport PopupElement from '../../popups';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n// import AppMediaViewer from \"../../appMediaViewerNew\";\n\nexport default class AppSettingsTab extends SliderSuperTab {\n private buttons: {\n edit: HTMLButtonElement,\n folders: HTMLButtonElement,\n general: HTMLButtonElement,\n notifications: HTMLButtonElement,\n storage: HTMLButtonElement,\n privacy: HTMLButtonElement,\n } = {} as any;\n private profile: PeerProfile;\n\n private languageRow: Row;\n private devicesRow: Row;\n\n private authorizations: Authorization.authorization[];\n private getAuthorizationsPromise: Promise;\n\n public async init() {\n this.container.classList.add('settings-container');\n this.setTitle('Settings');\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'logout',\n text: 'EditAccount.Logout',\n onClick: () => {\n new PopupPeer('logout', {\n titleLangKey: 'LogOut',\n descriptionLangKey: 'LogOut.Description',\n buttons: [{\n langKey: 'LogOut',\n callback: () => {\n this.managers.apiManager.logOut();\n },\n isDanger: true\n }]\n }).show();\n }\n }]\n });\n\n this.buttons.edit = ButtonIcon('edit');\n\n this.header.append(this.buttons.edit, btnMenu);\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter, false);\n this.profile.init();\n this.profile.setPeer(rootScope.myId);\n const fillPromise = this.profile.fillProfileElements();\n\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\n attachClickEvent(changeAvatarBtn, () => {\n const canvas = document.createElement('canvas');\n PopupElement.createPopup(PopupAvatar).open(canvas, (upload) => {\n upload().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n });\n });\n }, {listenerSetter: this.listenerSetter});\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\n\n const updateChangeAvatarBtn = async() => {\n const user = await this.managers.appUsersManager.getSelf();\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\n };\n\n updateChangeAvatarBtn();\n this.listenerSetter.add(rootScope)('avatar_update', ({peerId}) => {\n if(rootScope.myId === peerId) {\n updateChangeAvatarBtn();\n }\n });\n\n /* const div = document.createElement('div');\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\n //div.style.width = '135px';\n //div.style.height = '100px';\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\n div.style.width = '135px';\n div.style.height = '100px';\n\n const img = document.createElement('img');\n img.src = 'assets/img/pepe.jpg';\n img.classList.add('media-photo');\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\n\n div.append(img);\n\n div.addEventListener('click', () => {\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\n _: 'message',\n mid: 1,\n peerId: 61004386,\n fromId: 61004386,\n message: '',\n media: {\n _: 'messageMediaPhoto',\n photo: {\n _: 'photo',\n url: img.src,\n downloaded: 111,\n sizes: [{\n _: 'photoSize',\n type: 'x',\n w: 618,\n h: 412\n }]\n }\n },\n date: Date.now() / 1000 | 0\n }, img);\n });\n\n this.scrollable.append(div); */\n\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add('profile-buttons');\n\n type ConstructorP = T extends {\n new (...args: any[]): infer U;\n } ? U : never;\n\n const m = (\n icon: string,\n text: LangPackKey,\n c: T,\n getInitArgs?: () => Promise['init']>>\n ): {\n icon: string,\n text: LangPackKey,\n tabConstructor: T,\n getInitArgs?: typeof getInitArgs,\n // args?: ReturnType\n args?: any\n } => {\n if(!getInitArgs) {\n const g = (c as any as typeof SliderSuperTab).getInitArgs;\n if(g) {\n // @ts-ignore\n getInitArgs = () => [g(this)];\n }\n }\n\n return {\n icon,\n text,\n tabConstructor: c,\n getInitArgs,\n args: getInitArgs?.()\n };\n };\n\n // const k = (c: T): () => [ReturnType['getInitArgs']>] => {\n // return () => (c as any).getInitArgs(this);\n // };\n\n const b = [\n m('unmute', 'AccountSettings.Notifications', AppNotificationsTab),\n m('data', 'DataSettings', AppDataAndStorageTab),\n m('lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab),\n m('settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab),\n m('folder', 'AccountSettings.Filters', AppChatFoldersTab)\n ];\n\n const rows = b.map((item) => {\n const {icon, text: langPackKey, tabConstructor, getInitArgs} = item;\n return new Row({\n titleLangKey: langPackKey,\n icon,\n clickable: async() => {\n const args = item.args ? await item.args : [];\n const tab = this.slider.createTab(tabConstructor as any);\n tab.open(...args);\n\n if(tab instanceof SliderSuperTabEventable && getInitArgs) {\n tab.eventListener.addEventListener('destroyAfter', (promise) => {\n item.args = promise.then(() => getInitArgs() as any);\n });\n }\n },\n listenerSetter: this.listenerSetter\n });\n });\n\n const languageArgs = AppLanguageTab.getInitArgs();\n rows.push(\n this.devicesRow = new Row({\n titleLangKey: 'Devices',\n titleRightSecondary: ' ',\n icon: 'activesessions',\n clickable: async() => {\n if(!this.authorizations) {\n await this.updateActiveSessions();\n }\n\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.authorizations = undefined;\n this.updateActiveSessions(true);\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n }),\n\n this.languageRow = new Row({\n titleLangKey: 'AccountSettings.Language',\n titleRightSecondary: i18n('LanguageName'),\n icon: 'language',\n clickable: () => {\n this.slider.createTab(AppLanguageTab).open(languageArgs);\n },\n listenerSetter: this.listenerSetter\n })\n );\n\n buttonsDiv.append(...rows.map((row) => row.container));\n\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\n // profileSection.content.append(this.profile.element);\n\n const buttonsSection = new SettingSection();\n buttonsSection.content.append(buttonsDiv);\n\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\n\n const getEditProfileArgs = () => {\n editProfileArgs = AppEditProfileTab.getInitArgs();\n };\n let editProfileArgs: ReturnType;\n attachClickEvent(this.buttons.edit, () => {\n const tab = this.slider.createTab(AppEditProfileTab);\n tab.open(editProfileArgs);\n }, {listenerSetter: this.listenerSetter});\n getEditProfileArgs();\n // this.listenerSetter.add(rootScope)('user_full_update', (userId) => {\n // if(rootScope.myId.toUserId() === userId) {\n // getEditProfileArgs();\n // }\n // });\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(rootScope.myId.toUserId() === userId) {\n getEditProfileArgs();\n }\n });\n\n lottieLoader.loadLottieWorkers();\n\n this.updateActiveSessions();\n\n (await fillPromise)();\n }\n\n private getAuthorizations(overwrite?: boolean) {\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\n\n const promise = this.getAuthorizationsPromise = this.managers.apiManager.invokeApi('account.getAuthorizations')\n .finally(() => {\n if(this.getAuthorizationsPromise === promise) {\n this.getAuthorizationsPromise = undefined;\n }\n });\n\n return promise;\n }\n\n public updateActiveSessions(overwrite?: boolean) {\n return this.getAuthorizations(overwrite).then((auths) => {\n this.authorizations = auths.authorizations;\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\n });\n }\n\n public onCloseAfterTimeout() {\n this.profile.destroy();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appSidebarLeft from '..';\nimport {InputFile} from '../../../layer';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport AppAddMembersTab from './addMembers';\nimport {_i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppNewChannelTab extends SliderSuperTab {\n private uploadAvatar: () => Promise = null;\n\n private channelNameInputField: InputField;\n private channelDescriptionInputField: InputField;\n private nextBtn: HTMLButtonElement;\n private avatarEdit: AvatarEdit;\n\n public init() {\n this.container.classList.add('new-channel-container');\n this.setTitle('NewChannel');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({\n caption: 'Channel.DescriptionHolderDescrpiton'\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.channelNameInputField = new InputField({\n label: 'EnterChannelName',\n maxLength: 128\n });\n\n this.channelDescriptionInputField = new InputField({\n label: 'DescriptionOptionalPlaceholder',\n maxLength: 255\n });\n\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\n\n const onLengthChange = () => {\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length &&\n !this.channelNameInputField.input.classList.contains('error') &&\n !this.channelDescriptionInputField.input.classList.contains('error'));\n };\n\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.channelNameInputField.value;\n const about = this.channelDescriptionInputField.value;\n\n this.nextBtn.disabled = true;\n this.managers.appChatsManager.createChannel({\n title,\n about,\n broadcast: true\n }).then((channelId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(channelId, inputFile);\n });\n }\n\n appImManager.setInnerPeer({peerId: channelId.toPeerId(true)});\n\n appSidebarLeft.removeTabFromHistory(this);\n this.slider.createTab(AppAddMembersTab).open({\n type: 'channel',\n skippable: true,\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo',\n takeOut: (peerIds) => {\n return this.managers.appChatsManager.inviteToChannel(channelId, peerIds);\n }\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.content.append(this.nextBtn);\n section.content.append(this.avatarEdit.container, inputWrapper);\n this.scrollable.append(section.container);\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.channelNameInputField.value = '';\n this.channelDescriptionInputField.value = '';\n this.nextBtn.disabled = false;\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../inputField';\nimport PopupElement from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport EditPeer from '../editPeer';\nimport {_i18n} from '../../lib/langPack';\nimport TelInputField from '../telInputField';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport {toastNew} from '../toast';\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', {closable: true, withConfirm: 'Add', title: 'AddContactTitle'});\n this.construct();\n }\n\n private async construct() {\n attachClickEvent(this.btnConfirm, () => {\n const promise = this.managers.appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = getAbbreviation(name);\n editPeer.avatarElem.peerTitle = name;\n editPeer.avatarElem.update();\n };\n\n this.listenerSetter.add(nameInputField.input)('input', onInput);\n this.listenerSetter.add(lastNameInputField.input)('input', onInput);\n\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n const user = await this.managers.appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted.code) {\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputSearch from '../../inputSearch';\nimport {IS_MOBILE} from '../../../environment/userAgent';\nimport {canFocus} from '../../../helpers/dom/canFocus';\nimport windowSize from '../../../helpers/windowSize';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport PopupCreateContact from '../../popups/createContact';\nimport SortedUserList from '../../sortedUserList';\nimport {getMiddleware} from '../../../helpers/middleware';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport rootScope from '../../../lib/rootScope';\nimport PopupElement from '../../popups';\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n\n public init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n PopupElement.createPopup(PopupCreateContact);\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n const isContact = await this.managers.appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n this.openContacts();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList({\n managers: this.managers\n });\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 56 * 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 this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n this.managers.appUsersManager.getContactsPeerIds(query, undefined, 'online').then((contacts) => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 56 * 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","/*\n * 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';\nimport {FOLDER_ID_ARCHIVE, REAL_FOLDER_ID} from '../../../lib/mtproto/mtproto_config';\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId: REAL_FOLDER_ID = FOLDER_ID_ARCHIVE;\n private wasFilterId: number;\n\n public init() {\n this.wasFilterId = appDialogsManager.filterId;\n\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n this.header.classList.add('can-have-forum');\n this.content.classList.add('can-have-forum');\n\n if(!appDialogsManager.xds[AppArchivedTab.filterId]) {\n const {ul, scrollable} = appDialogsManager.l({\n title: undefined,\n id: AppArchivedTab.filterId,\n localId: FOLDER_ID_ARCHIVE\n });\n scrollable.container.append(ul);\n }\n\n const scrollable = appDialogsManager.xds[AppArchivedTab.filterId].scrollable;\n this.scrollable.container.replaceWith(scrollable.container);\n scrollable.attachBorderListeners(this.container);\n // ! DO NOT UNCOMMENT NEXT LINE - chats will stop loading on scroll after closing the tab\n // this.scrollable = scrollable;\n return appDialogsManager.setFilterIdAndChangeTab(AppArchivedTab.filterId).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.xds[this.wasFilterId].clear();\n }\n\n onClose() {\n this.scrollable.onAdditionalScroll = undefined;\n appDialogsManager.setFilterIdAndChangeTab(this.wasFilterId);\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.xds[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * 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 ButtonCorner from '../../buttonCorner';\nimport AppNewGroupTab from './newGroup';\nimport {toast} from '../../toast';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport {i18n, join, _i18n} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport wrapSticker from '../../wrappers/sticker';\nimport SortedUserList from '../../sortedUserList';\nimport {PeerLocated, Update, Updates} from '../../../layer';\nimport {SettingChatListSection} from '..';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport confirmationPopup from '../../confirmationPopup';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../../lazyLoadQueue';\n\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\n private isLocationWatched: boolean = false;\n private errorCategory: HTMLElement;\n private retryBtn: HTMLButtonElement;\n private btnOptions: HTMLButtonElement;\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected peopleSection: SettingChatListSection;\n protected chatsSection: SettingChatListSection;\n\n protected locatedPeers: Map;\n\n // public async init() {\n // this.container.classList.add('people-nearby-container');\n // this.setTitle('PeopleNearby');\n\n // this.errorCategory = document.createElement('div');\n // this.errorCategory.classList.add('text', 'hide', 'nearby-error');\n\n // this.retryBtn = ButtonCorner({icon: 'check'});\n\n // const emoji = '🧭';\n // const doc = await this.managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n // const stickerContainer = document.createElement('div');\n // stickerContainer.classList.add('sticker-container');\n\n // if(doc) {\n // wrapSticker({\n // doc,\n // div: stickerContainer,\n // loop: false,\n // play: true,\n // width: 86,\n // height: 86,\n // emoji,\n // needUpscale: true\n // }).then(() => {\n // // this.animation = player;\n // });\n // } else {\n // stickerContainer.classList.add('media-sticker-wrapper');\n // }\n\n // const caption = document.createElement('div');\n // caption.classList.add('caption');\n // _i18n(caption, 'PeopleNearbyInfo2');\n\n // this.locatedPeers = new Map();\n\n // const m = () => {\n // const sortedUserList = new SortedUserList({\n // avatarSize: 42,\n // createChatListOptions: {\n // dialogSize: 48,\n // new: true\n // },\n // autonomous: false,\n // onUpdate: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // const elements: HTMLElement[] = [\n // this.parseDistance(peer.distance)\n // ];\n\n // if(!element.id.isUser()) {\n // elements.push(this.managers.appProfileManager.getChatMembersString(element.id.toChatId()));\n // }\n\n // element.dom.lastMessageSpan.textContent = '';\n // element.dom.lastMessageSpan.append(...join(elements, false));\n // },\n // getIndex: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // return 0x7FFFFFFF - peer.distance;\n // },\n // appUsersManager: this.managers.appUsersManager\n // });\n\n // appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\n\n // return sortedUserList;\n // };\n\n // const peopleSection = this.peopleSection = new SettingChatListSection({\n // name: 'PeopleNearbyHeader',\n // sortedList: m()\n // });\n\n // const chatsSection = this.chatsSection = new SettingChatListSection({\n // name: 'ChatsNearbyHeader',\n // sortedList: m()\n // });\n\n // const btnMakeVisible = peopleSection.makeButton({\n // text: 'MakeMyselfVisible',\n // icon: 'location'\n // });\n\n // const btnMakeInvisible = peopleSection.makeButton({\n // text: 'StopShowingMe',\n // icon: 'location'\n // });\n\n // const btnCreateGroup = chatsSection.makeButton({\n // text: 'NearbyCreateGroup',\n // icon: 'newgroup'\n // });\n\n // attachClickEvent(btnMakeVisible, () => {\n // confirmationPopup({\n // titleLangKey: 'MakeMyselfVisibleTitle',\n // descriptionLangKey: 'MakeMyselfVisibleInfo',\n // button: {\n // langKey: 'OK'\n // }\n // }).then(() => {\n // this.startWatching();\n // });\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnMakeInvisible, () => {\n // this.stopWatching();\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnCreateGroup, () => {\n // this.slider.createTab(AppNewGroupTab).open([], true);\n // }, {listenerSetter: this.listenerSetter});\n\n // btnMakeVisible.classList.add('primary');\n // btnMakeInvisible.classList.add('danger');\n // btnCreateGroup.classList.add('primary');\n\n // this.content.append(this.retryBtn);\n // this.scrollable.append(\n // stickerContainer,\n // caption,\n // peopleSection.container,\n // chatsSection.container,\n // this.errorCategory\n // );\n // }\n\n private parseDistance(distance: number) {\n if(rootScope.settings.distanceUnit === 'miles') {\n if(distance > 1609.34) {\n return i18n('MilesAway', [Math.round(distance / 1609)]);\n } else {\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\n }\n } else {\n if(distance >= 1000) {\n return i18n('KMetersAway2', [distance / 1000]);\n } else {\n return i18n('MetersAway2', [distance]);\n }\n }\n }\n\n // public open() {\n // const result = super.open();\n // result.then(() => {\n // this.retryBtn.classList.remove('is-visible');\n // navigator.geolocation.getCurrentPosition((location) => {\n // this.latestLocationSaved = {\n // latitude: location.coords.latitude,\n // longitude: location.coords.longitude,\n // accuracy: location.coords.accuracy\n // };\n\n // console.log(this.latestLocationSaved);\n\n // this.managers.appUsersManager.getLocated(\n // location.coords.latitude,\n // location.coords.longitude,\n // location.coords.accuracy\n // ).then((response) => {\n // const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\n // const peers = update.peers as PeerLocated.peerLocated[];\n // const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\n // const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\n // const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\n // orderedPeers?.forEach((peer) => {\n // const peerId = getPeerId(peer.peer);\n // const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\n // this.locatedPeers.set(peerId, peer);\n // section.sortedList.add(peerId);\n // });\n\n // this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\n // this.errorCategory.innerHTML = 'No groups or channels found around you.';\n // });\n // }, (error) => {\n // this.errorCategory.classList.remove('hide');\n // this.retryBtn.classList.add('is-visible');\n // this.retryBtn.addEventListener('click', this.open);\n // if(error instanceof GeolocationPositionError) {\n // this.errorCategory.innerHTML = 'Location permission denied. Click below to retry.';\n // } else {\n // this.errorCategory.innerHTML = 'An error has occurred. Please retry later clicking the button below.';\n // }\n // });\n // });\n\n // return result;\n // }\n\n private startWatching() {\n if(!this.latestLocationSaved || this.isLocationWatched) return;\n this.isLocationWatched = true;\n\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\n\n this.managers.appUsersManager.getLocated(\n this.latestLocationSaved.latitude,\n this.latestLocationSaved.longitude,\n this.latestLocationSaved.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n\n navigator.geolocation.watchPosition((result) => {\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\n const distanceCheck = this.calculateDistance(\n result.coords.latitude, result.coords.longitude,\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\n ) > 100;\n\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\n this.managers.appUsersManager.getLocated(\n result.coords.latitude,\n result.coords.longitude,\n result.coords.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n this.latestLocationSaved = {\n latitude: result.coords.latitude,\n longitude: result.coords.longitude,\n accuracy: result.coords.accuracy\n }\n }\n });\n }\n\n private stopWatching() {\n if(!this.isLocationWatched) return;\n this.isLocationWatched = false;\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\n this.managers.appUsersManager.getLocated(\n 0, // latitude parameter\n 0, // longitude parameter\n 0, // accuracy parameter\n false, // background parameter\n 0 // self_expires parameter\n );\n }\n\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\n const p = 0.017453292519943295; // Math.PI/180\n return (\n 12742 * Math.asin(\n Math.sqrt(\n (0.5 - Math.cos((lat2 - lat1) * p)) +\n (\n Math.cos(lat1 * p) * Math.cos(lat2 * p) *\n (1 - Math.cos((long2 - long1) * p)/2)\n )\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 appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport {SearchGroup} from '../appSearch';\nimport '../avatar';\nimport Scrollable, {ScrollableX} from '../scrollable';\nimport InputSearch from '../inputSearch';\nimport SidebarSlider from '../slider';\nimport TransitionSlider from '../transition';\nimport AppNewGroupTab from './tabs/newGroup';\nimport AppSearchSuper from '../appSearchSuper.';\nimport {DateData, fillTipDates} from '../../helpers/date';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport AppSettingsTab from './tabs/settings';\nimport AppNewChannelTab from './tabs/newChannel';\nimport AppContactsTab from './tabs/contacts';\nimport AppArchivedTab from './tabs/archivedTab';\nimport AppAddMembersTab from './tabs/addMembers';\nimport I18n, {FormatterArguments, i18n, i18n_, LangPackKey} from '../../lib/langPack';\nimport AppPeopleNearbyTab from './tabs/peopleNearby';\nimport {ButtonMenuItemOptions} from '../buttonMenu';\nimport CheckboxField from '../checkboxField';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport PeerTitle from '../peerTitle';\nimport App from '../../config/app';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport sessionStorage from '../../lib/sessionStorage';\nimport {attachClickEvent, CLICK_EVENT_NAME, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport ButtonIcon from '../buttonIcon';\nimport confirmationPopup from '../confirmationPopup';\nimport IS_GEOLOCATION_SUPPORTED from '../../environment/geolocationSupport';\nimport type SortedUserList from '../sortedUserList';\nimport Button, {ButtonOptions} from '../button';\nimport noop from '../../helpers/noop';\nimport ripple from '../ripple';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AvatarElement from '../avatar';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport SettingSection, {SettingSectionOptions} from '../settingSection';\nimport {FOLDER_ID_ARCHIVE} from '../../lib/mtproto/mtproto_config';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {fastRaf} from '../../helpers/schedulers';\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 public rect: DOMRect;\n\n private newBtnMenu: HTMLElement;\n\n // private log = logger('SL');\n\n private searchGroups: {[k in 'contacts' | 'globalContacts' | 'messages' | 'people' | 'recent']: SearchGroup} = {} as any;\n private searchSuper: AppSearchSuper;\n\n private updateBtn: HTMLElement;\n private hasUpdate: boolean;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n // this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n this.createTab(AppAddMembersTab).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => this.createTab(AppNewGroupTab).open(peerIds),\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n this.createTab(AppContactsTab).open();\n };\n\n // this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: typeof menuButtons[0] = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n this.createTab(AppArchivedTab).open();\n },\n verify: async() => {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(FOLDER_ID_ARCHIVE, false);\n return !!folder.length || !(await this.managers.dialogsStorage.isDialogsLoaded(FOLDER_ID_ARCHIVE));\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: themeController.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', async() => {\n await this.managers.appStateManager.setByKey('settings.theme', themeCheckboxField.input.checked ? 'night' : 'day');\n rootScope.dispatchEvent('theme_change');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(themeController.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise})[] = [{\n icon: 'savedmessages',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer({\n peerId: appImManager.myId\n });\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, IS_GEOLOCATION_SUPPORTED ? {\n icon: 'group',\n text: 'PeopleNearby',\n onClick: () => {\n this.createTab(AppPeopleNearbyTab).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n this.createTab(AppSettingsTab).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n\n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n\n },\n checkboxField: new CheckboxField({\n toggle: true,\n checked: true,\n stateKey: 'settings.animationsEnabled'\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n const url = I18n.format('TelegramFeaturesUrl', true);\n appImManager.openUrl(url);\n }\n }, {\n icon: 'bug',\n text: 'ReportBug',\n onClick: () => {\n const a = document.createElement('a');\n a.target = '_blank';\n a.href = 'https://bugs.telegram.org/?tag_ids=40&sort=time';\n document.body.append(a);\n a.click();\n setTimeout(() => {\n a.remove();\n }, 0);\n }\n }, {\n icon: 'char z',\n text: 'ChatList.Menu.SwitchTo.Z',\n onClick: () => {\n Promise.all([\n sessionStorage.set({kz_version: 'Z'}),\n sessionStorage.delete('tgme_sync')\n ]).then(() => {\n location.href = 'https://web.telegram.org/z/';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'char w',\n text: 'ChatList.Menu.SwitchTo.Webogram',\n onClick: () => {\n sessionStorage.delete('tgme_sync').then(() => {\n location.href = 'https://web.telegram.org/?legacy=1';\n });\n },\n verify: () => App.isMainDomain\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({\n direction: 'bottom-right',\n buttons: filteredButtons,\n onOpen: (e, btnMenu) => {\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n contextMenuController.close();\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 btnArchive.element?.append(this.archivedCount);\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 this.newBtnMenu = ButtonMenuToggle({\n direction: 'top-left',\n buttons: [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n this.createTab(AppNewChannelTab).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]\n });\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.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n\n attachClickEvent(this.updateBtn, () => {\n if(this.updateBtn.classList.contains('is-hidden')) {\n return;\n }\n\n location.reload();\n });\n\n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === FOLDER_ID_ARCHIVE) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadPeerIds.size;\n this.archivedCount.textContent = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n this.managers.appUsersManager.getTopPeers('correspondents');\n\n // Focus search input by pressing Escape\n const navigationItem: NavigationItem = {\n type: 'global-search-focus',\n onPop: () => {\n setTimeout(() => {\n this.inputSearch.input.focus();\n }, 0);\n\n return false;\n },\n noHistory: true\n };\n appNavigationController.pushItem(navigationItem);\n\n apiManagerProxy.getState().then(() => {\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 const onResize = () => {\n const rect = this.rect = this.tabsContainer.getBoundingClientRect();\n document.documentElement.style.setProperty('--left-column-width', rect.width + 'px');\n };\n\n fastRaf(onResize);\n mediaSizes.addEventListener('resize', onResize);\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 simulateClickEvent(this.backBtn);\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, true),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }],\n scrollable,\n searchGroups: this.searchGroups,\n asChatList: true,\n hideEmptyTabs: false,\n showSender: true,\n managers: this.managers\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(),\n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true);\n };\n\n resetSearch();\n\n const 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-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()}).element;\n }\n\n avatarEl.updateWithOptions({peerId: key as PeerId});\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n\n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach((el) => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId,\n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n\n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then((dialogs) => dialogs.map((d) => d.peerId)),\n this.managers.dialogsStorage.getDialogs({query: value}).then(({dialogs}) => dialogs.map((d) => d.peerId)),\n this.managers.appUsersManager.getContactsPeerIds(value, true)\n ]).then((results) => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n\n peerIds.forEach((peerId) => {\n helper.append(renderEntity(peerId));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n // console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n\n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach((dateData) => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG) as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n this.managers.appUsersManager.pushRecentSearch(peerId);\n }, {capture: true});\n\n const 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 const 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({\n content: searchContainer.parentElement,\n type: 'zoom-fade',\n transitionTime: 150,\n onTransitionEnd: (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\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 attachClickEvent(this.backBtn, (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = ButtonIcon('close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n confirmationPopup({\n descriptionLangKey: 'Search.Confirm.ClearHistory',\n button: {\n langKey: 'ClearButton',\n isDanger: true\n }\n }).then(() => {\n return this.managers.appUsersManager.clearRecentSearch().then(() => {\n this.searchGroups.recent.clear();\n });\n });\n });\n }\n}\n\nexport 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","/*\n * 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 AppSelectPeers from '../../appSelectPeers';\nimport {setButtonLoader} from '../../putPreloader';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\n\nexport default class AppAddMembersTab extends SliderSuperTab {\n private nextBtn: HTMLButtonElement;\n private selector: AppSelectPeers;\n private peerType: 'channel' | 'chat' | 'privacy';\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\n private skippable: boolean;\n\n public init(options: {\n title: LangPackKey,\n placeholder: LangPackKey,\n type: AppAddMembersTab['peerType'],\n takeOut?: AppAddMembersTab['takeOut'],\n skippable: boolean,\n selectedPeerIds?: PeerId[]\n }) {\n this.container.classList.add('add-members-container');\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n this.content.append(this.nextBtn);\n this.scrollable.container.remove();\n\n this.nextBtn.addEventListener('click', () => {\n const peerIds = this.selector.getSelected().map((sel) => sel.toPeerId());\n const result = this.takeOut(peerIds);\n\n if(this.skippable) {\n this.close();\n } else if(result instanceof Promise) {\n this.attachToPromise(result);\n } else if(result === undefined) {\n this.close();\n }\n });\n\n //\n this.setTitle(options.title);\n this.peerType = options.type;\n this.takeOut = options.takeOut;\n this.skippable = options.skippable;\n\n const isPrivacy = this.peerType === 'privacy';\n this.selector = new AppSelectPeers({\n appendTo: this.content,\n onChange: this.skippable ? null : (length) => {\n this.nextBtn.classList.toggle('is-visible', !!length);\n },\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\n placeholder: options.placeholder,\n exceptSelf: isPrivacy,\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined,\n managers: this.managers,\n design: 'square'\n });\n\n if(options.selectedPeerIds) {\n this.selector.addInitial(options.selectedPeerIds);\n }\n\n this.nextBtn.classList.add('tgico-arrow_next');\n this.nextBtn.innerHTML = '';\n this.nextBtn.disabled = false;\n this.nextBtn.classList.toggle('is-visible', this.skippable);\n }\n\n public attachToPromise(promise: Promise) {\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\n\n promise.then(() => {\n this.close();\n }, () => {\n removeLoader();\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 {MyDialogFilter} from '../../../lib/storages/filters';\nimport type {DialogFilterSuggested} from '../../../layer';\nimport type _rootScope from '../../../lib/rootScope';\nimport {SliderSuperTab} from '../../slider';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport {toast} from '../../toast';\nimport Button from '../../button';\nimport rootScope from '../../../lib/rootScope';\nimport AppEditFolderTab from './editFolder';\nimport Row from '../../row';\nimport {i18n, i18n_, LangPackKey, join} from '../../../lib/langPack';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppChatFoldersTab extends SliderSuperTab {\n private createFolderBtn: HTMLElement;\n private foldersSection: SettingSection;\n private suggestedSection: SettingSection;\n private stickerContainer: HTMLElement;\n private animation: RLottiePlayer;\n\n private filtersRendered: {[filterId: number]: Row} = {};\n private loadAnimationPromise: ReturnType;\n\n public static getInitArgs() {\n return lottieLoader.loadAnimationFromURLManually('Folders_1');\n }\n\n private async renderFolder(\n dialogFilter: DialogFilterSuggested | MyDialogFilter,\n container?: HTMLElement,\n row?: Row,\n append?: boolean\n ) {\n let filter: MyDialogFilter;\n let description = '';\n const d: HTMLElement[] = [];\n if(dialogFilter._ === 'dialogFilterSuggested') {\n filter = dialogFilter.filter as MyDialogFilter;\n description = dialogFilter.description;\n } else {\n filter = dialogFilter;\n\n const enabledFilters = Object.keys(filter.pFlags).length;\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach((key) => {\n enabledFilters += +!!filter[key].length;\n }); */\n\n if(enabledFilters === 1) {\n const pFlags = filter.pFlags;\n let k: LangPackKey;\n if(pFlags.contacts) k = 'FilterAllContacts';\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\n else if(pFlags.groups) k = 'FilterAllGroups';\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\n else if(pFlags.bots) k = 'FilterAllBots';\n\n if(k) {\n d.push(i18n(k));\n }\n }\n\n if(!d.length) {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n let chats = 0, channels = 0, groups = 0;\n await Promise.all(folder.map(async(dialog) => {\n if(await this.managers.appPeersManager.isAnyGroup(dialog.peerId)) groups++;\n else if(await this.managers.appPeersManager.isBroadcast(dialog.peerId)) channels++;\n else chats++;\n }));\n\n if(chats) d.push(i18n('Chats', [chats]));\n if(channels) d.push(i18n('Channels', [channels]));\n if(groups) d.push(i18n('Groups', [groups]));\n }\n }\n\n if(!row) {\n row = new Row({\n title: filter.id === FOLDER_ID_ALL ? i18n('FilterAllChats') : wrapEmojiText(filter.title),\n subtitle: description,\n clickable: filter.id !== FOLDER_ID_ALL,\n buttonRightLangKey: dialogFilter._ === 'dialogFilterSuggested' ? 'Add' : undefined\n });\n\n if(d.length) {\n row.subtitle.append(...join(d));\n }\n\n if(dialogFilter._ === 'dialogFilter') {\n const filterId = filter.id;\n if(!this.filtersRendered[filter.id] && filter.id !== FOLDER_ID_ALL) {\n attachClickEvent(row.container, async() => {\n this.slider.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(filterId));\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.filtersRendered[filter.id] = row;\n }\n } else {\n if(filter.id !== FOLDER_ID_ALL) {\n replaceContent(row.title, wrapEmojiText(filter.title));\n }\n\n row.subtitle.textContent = '';\n row.subtitle.append(...join(d));\n }\n\n const div = row.container;\n\n if(append) {\n const localId = (filter as MyDialogFilter).localId;\n if(localId !== undefined) {\n // ! header will be at 0 index\n positionElementByIndex(div, div.parentElement || container, localId);\n } else if(container) {\n container.append(div);\n }\n }\n\n return row;\n }\n\n public init(p: ReturnType = AppChatFoldersTab.getInitArgs()) {\n this.container.classList.add('chat-folders-container');\n this.setTitle('ChatList.Filter.List.Title');\n\n this.scrollable.container.classList.add('chat-folders');\n\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\n\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'ChatList.Filter.NewTitle',\n icon: 'add'\n });\n\n this.foldersSection = new SettingSection({\n name: 'Filters'\n });\n this.foldersSection.container.style.display = 'none';\n\n this.suggestedSection = new SettingSection({\n name: 'FilterRecommended'\n });\n this.suggestedSection.container.style.display = 'none';\n\n this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container);\n\n attachClickEvent(this.createFolderBtn, async() => {\n if(!(await this.canCreateFolder())) {\n toast('Sorry, you can\\'t create more folders.');\n } else {\n this.slider.createTab(AppEditFolderTab).open();\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onFiltersContainerUpdate = () => {\n this.foldersSection.container.style.display = Object.keys(this.filtersRendered).length ? '' : 'none';\n };\n\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\n for(const filter of filters) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n continue;\n }\n\n await this.renderFolder(filter, this.foldersSection.content, undefined, true);\n }\n\n this.toggleAllChats();\n\n onFiltersContainerUpdate();\n });\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n await this.renderFolder(filter, null, filterRendered);\n } else if(filter.id !== FOLDER_ID_ARCHIVE) {\n await this.renderFolder(filter, this.foldersSection.content, undefined, true);\n }\n\n onFiltersContainerUpdate();\n\n this.getSuggestedFilters();\n });\n\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n /* for(const suggested of this.suggestedFilters) {\n if(deepEqual(suggested.filter, filter)) {\n\n }\n } */\n this.getSuggestedFilters();\n\n filterRendered.container.remove();\n delete this.filtersRendered[filter.id];\n }\n\n onFiltersContainerUpdate();\n });\n\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\n order.filter((filterId) => !!this.filtersRendered[filterId]).forEach((filterId, idx) => {\n const filterRendered = this.filtersRendered[filterId];\n const container = filterRendered.container;\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header\n });\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleAllChats();\n });\n\n this.loadAnimationPromise = p.then(async(cb) => {\n const player = await cb({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n });\n\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n });\n\n this.getSuggestedFilters();\n\n /* return Promise.all([\n this.loadAnimationPromise\n ]); */\n return this.loadAnimationPromise;\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n\n return super.onOpenAfterTimeout();\n }\n\n private toggleAllChats() {\n const filterRendered = this.filtersRendered[FOLDER_ID_ALL];\n filterRendered.container.classList.toggle('hide', !rootScope.premium);\n }\n\n private async canCreateFolder() {\n const [limit, filters] = await Promise.all([\n this.managers.apiManager.getLimit('folders'),\n this.managers.filtersStorage.getDialogFilters()\n ]);\n\n const filtersLength = filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).length;\n return filtersLength < limit;\n }\n\n private getSuggestedFilters() {\n return this.managers.filtersStorage.getSuggestedDialogsFilters().then(async(suggestedFilters) => {\n this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none';\n Array.from(this.suggestedSection.content.children).slice(1).forEach((el) => el.remove());\n\n for(const filter of suggestedFilters) {\n const row = await this.renderFolder(filter);\n this.suggestedSection.content.append(row.container);\n\n const button = row.buttonRight;\n attachClickEvent(button, async(e) => {\n cancelEvent(e);\n\n if(!(await this.canCreateFolder())) {\n toast('Sorry, you can\\'t create more folders.');\n return;\n }\n\n button.setAttribute('disabled', 'true');\n\n const f = filter.filter as MyDialogFilter;\n f.includePeerIds = [];\n f.excludePeerIds = [];\n f.pinnedPeerIds = [];\n\n this.managers.filtersStorage.createDialogFilter(f, true).then((bool) => {\n if(bool) {\n row.container.remove();\n }\n }).finally(() => {\n button.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\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 {SliderSuperTab} from '../../slider';\nimport AppSelectPeers from '../../appSelectPeers';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport AppEditFolderTab from './editFolder';\nimport I18n, {i18n, LangPackKey, _i18n, join} from '../../../lib/langPack';\nimport {toast} from '../../toast';\nimport copy from '../../../helpers/object/copy';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport rootScope from '../../../lib/rootScope';\nimport {MTAppConfig} from '../../../lib/mtproto/appConfig';\nimport {attachClickEvent, simulateClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppIncludedChatsTab extends SliderSuperTab {\n private editFolderTab: AppEditFolderTab;\n private confirmBtn: HTMLElement;\n\n private selector: AppSelectPeers;\n private type: 'included' | 'excluded';\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private dialogsByFilters: Map>;\n private limit: number;\n\n public init(\n filter: DialogFilter,\n type: 'included' | 'excluded',\n editFolderTab: AppIncludedChatsTab['editFolderTab']\n ) {\n this.originalFilter = filter;\n this.filter = copy(this.originalFilter);\n this.type = type;\n this.editFolderTab = editFolderTab;\n\n this.content.remove();\n this.container.classList.add('included-chatlist-container');\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\n this.confirmBtn.style.display = 'none';\n\n this.header.append(this.confirmBtn);\n\n attachClickEvent(this.confirmBtn, async() => {\n const selected = this.selector.getSelected();\n\n // this.filter.pFlags = {};\n\n if(this.type === 'included') {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') === 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n } else {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') !== 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n }\n\n const peerIds: PeerId[] = [];\n for(const key of selected) {\n if(key.isPeerId()) {\n peerIds.push(key.toPeerId());\n } else {\n // @ts-ignore\n this.filter.pFlags[key] = true;\n }\n }\n\n let cmp: (peerId: PeerId) => boolean;\n if(this.type === 'included') {\n cmp = (peerId) => peerIds.includes(peerId);\n } else {\n cmp = (peerId) => !peerIds.includes(peerId);\n }\n\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\n if(!cmp(peerId)) {\n this.filter.pinnedPeerIds.splice(idx, 1);\n this.filter.pinned_peers.splice(idx, 1);\n }\n });\n\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\n forEachReverse(this.filter[other], (peerId, idx) => {\n if(peerIds.includes(peerId)) {\n this.filter[other].splice(idx, 1);\n this.filter[otherLegacy].splice(idx, 1);\n }\n });\n\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = await Promise.all(peerIds.map((peerId) => this.managers.appPeersManager.getInputPeerById(peerId)));\n // this.filter.pinned_peers = this.filter.pinned_peers.filter((peerId) => this.filter.include_peers.includes(peerId));\n\n this.editFolderTab.setFilter(this.filter, false);\n this.close();\n }, {listenerSetter: this.listenerSetter});\n\n const onAppConfig = (appConfig: MTAppConfig) => {\n this.limit = rootScope.premium ? appConfig.dialog_filters_chats_limit_premium : appConfig.dialog_filters_chats_limit_default;\n };\n\n this.listenerSetter.add(rootScope)('app_config', onAppConfig);\n\n this.dialogsByFilters = new Map();\n return Promise.all([\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\n await Promise.all(filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).map(async(filter) => {\n const dialogs = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n const peerIds = dialogs.map((d) => d.peerId);\n this.dialogsByFilters.set(filter, new Set(peerIds));\n }));\n }),\n\n this.managers.apiManager.getAppConfig().then((appConfig) => {\n onAppConfig(appConfig);\n })\n ]);\n }\n\n checkbox(selected?: boolean) {\n const checkboxField = new CheckboxField({\n round: true\n });\n if(selected) {\n checkboxField.input.checked = selected;\n }\n\n return checkboxField.label;\n }\n\n renderResults = async(peerIds: PeerId[]) => {\n // const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\n\n await this.managers.appUsersManager.getContacts();\n peerIds.forEach((peerId) => {\n // if(other.includes(peerId)) return;\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.selector.scrollable,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n const selected = this.selector.selected.has(peerId);\n dom.containerEl.append(this.checkbox(selected));\n // if(selected) dom.listEl.classList.add('active');\n\n const foundInFilters: HTMLElement[] = [];\n this.dialogsByFilters.forEach((dialogs, filter) => {\n if(dialogs.has(peerId)) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(filter.title));\n foundInFilters.push(span);\n }\n });\n\n const joined = join(foundInFilters, false);\n joined.forEach((el) => {\n dom.lastMessageSpan.append(el);\n });\n });\n };\n\n onOpen() {\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\n\n const filter = this.filter;\n\n const categoriesSection = new SettingSection({\n noDelimiter: true,\n name: 'FilterChatTypes'\n });\n\n categoriesSection.container.classList.add('folder-categories');\n\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\n if(this.type === 'excluded') {\n details = {\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\n };\n } else {\n details = {\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\n };\n }\n\n const f = document.createDocumentFragment();\n for(const key in details) {\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\n button.dataset.peerId = key;\n button.append(this.checkbox());\n f.append(button);\n }\n categoriesSection.content.append(f);\n\n // ///////////////\n\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\n\n this.selector = new AppSelectPeers({\n appendTo: this.container,\n onChange: this.onSelectChange,\n peerType: ['dialogs'],\n renderResultsFunc: this.renderResults,\n placeholder: 'Search',\n sectionNameLangPackKey: 'FilterChats',\n managers: this.managers\n });\n this.selector.selected = new Set(selectedPeers);\n\n let addedInitial = false;\n const _add = this.selector.add.bind(this.selector);\n this.selector.add = (peerId, title, scroll) => {\n if(this.selector.selected.size >= this.limit && addedInitial && !details[peerId]) {\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\n if(el) {\n setTimeout(() => {\n el.checked = false;\n }, 0);\n }\n\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\n toast(str);\n return;\n }\n\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\n if(details[peerId]) {\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\n }\n return div;\n };\n\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\n\n this.selector.addInitial(selectedPeers);\n addedInitial = true;\n\n for(const flag in filter.pFlags) {\n // @ts-ignore\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\n simulateClickEvent(categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement);\n }\n }\n }\n\n onSelectChange = (length: number) => {\n // const changed = !deepEqual(this.filter, this.originalFilter);\n if(this.type === 'included') {\n this.confirmBtn.style.display = length ? '' : 'none';\n }\n };\n\n onCloseAfterTimeout() {\n if(this.selector) {\n this.selector.container.remove();\n this.selector = null;\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * 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 {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport {SliderSuperTab} from '../../slider';\nimport {toast} from '../../toast';\nimport InputField from '../../inputField';\nimport ButtonIcon from '../../buttonIcon';\nimport ButtonMenuToggle from '../../buttonMenuToggle';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport Button from '../../button';\nimport AppIncludedChatsTab from './includedChats';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport wrapDraftText from '../../../lib/richTextProcessor/wrapDraftText';\nimport filterAsync from '../../../helpers/array/filterAsync';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nconst MAX_FOLDER_NAME_LENGTH = 12;\n\nexport default class AppEditFolderTab extends SliderSuperTab {\n private caption: HTMLElement;\n private stickerContainer: HTMLElement;\n\n private confirmBtn: HTMLElement;\n private menuBtn: HTMLElement;\n private nameInputField: InputField;\n\n private includePeerIds: SettingSection;\n private excludePeerIds: SettingSection;\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\n\n private animation: RLottiePlayer;\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private type: 'edit' | 'create';\n private loadAnimationPromise: ReturnType;\n\n public init() {\n this.container.classList.add('edit-folder-container');\n this.caption = document.createElement('div');\n this.caption.classList.add('caption');\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\n const deleteFolderButton: ButtonMenuItemOptions = {\n icon: 'delete danger',\n text: 'FilterMenuDelete',\n onClick: () => {\n new PopupPeer('filter-delete', {\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n deleteFolderButton.element.setAttribute('disabled', 'true');\n this.managers.filtersStorage.updateDialogFilter(this.filter, true).then((bool) => {\n if(bool) {\n this.close();\n }\n }).finally(() => {\n deleteFolderButton.element.removeAttribute('disabled');\n });\n },\n isDanger: true\n }]\n }).show();\n }\n };\n this.menuBtn = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [deleteFolderButton]\n });\n this.menuBtn.classList.add('hide');\n\n this.header.append(this.confirmBtn, this.menuBtn);\n\n const inputSection = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FilterNameHint',\n maxLength: MAX_FOLDER_NAME_LENGTH\n });\n\n inputWrapper.append(this.nameInputField.container);\n inputSection.content.append(inputWrapper);\n\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\n const section = new SettingSection({\n name: h2Text,\n noDelimiter: true\n });\n\n section.container.classList.add('folder-list', className);\n\n const categories = section.generateContentElement();\n categories.classList.add('folder-categories');\n\n buttons.forEach((o) => {\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\n icon: o.icon,\n text: o.text,\n noRipple: o.withRipple ? undefined : true\n });\n\n if(o.name) {\n to[o.name] = button;\n }\n\n categories.append(button);\n });\n\n return section;\n };\n\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\n icon: 'add primary',\n text: 'ChatList.Filter.Include.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.Contacts',\n icon: 'newprivate',\n name: 'contacts'\n }, {\n text: 'ChatList.Filter.NonContacts',\n icon: 'noncontacts',\n name: 'non_contacts'\n }, {\n text: 'ChatList.Filter.Groups',\n icon: 'group',\n name: 'groups'\n }, {\n text: 'ChatList.Filter.Channels',\n icon: 'channel',\n name: 'broadcasts'\n }, {\n text: 'ChatList.Filter.Bots',\n icon: 'bots',\n name: 'bots'\n }], this.flags);\n\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\n icon: 'minus primary',\n text: 'ChatList.Filter.Exclude.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.MutedChats',\n icon: 'mute',\n name: 'exclude_muted'\n }, {\n text: 'ChatList.Filter.Archive',\n icon: 'archive',\n name: 'exclude_archived'\n }, {\n text: 'ChatList.Filter.ReadChats',\n icon: 'readchats',\n name: 'exclude_read'\n }], this.flags);\n\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\n\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\n\n attachClickEvent(includedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'included', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(excludedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'excluded', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.confirmBtn, () => {\n if(this.nameInputField.input.classList.contains('error')) {\n return;\n }\n\n if(!this.nameInputField.value.trim()) {\n this.nameInputField.input.classList.add('error');\n return;\n }\n\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\n include += this.filter.include_peers.length;\n\n if(!include) {\n toast('Please choose at least one chat for this folder.');\n return;\n }\n\n this.confirmBtn.setAttribute('disabled', 'true');\n\n let promise: Promise;\n if(!this.filter.id) {\n promise = this.managers.filtersStorage.createDialogFilter(this.filter);\n } else {\n promise = this.managers.filtersStorage.updateDialogFilter(this.filter);\n }\n\n promise.then((bool) => {\n if(bool) {\n this.close();\n }\n }).catch((err) => {\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\n toast('Sorry, you can\\'t create more folders.');\n } else {\n console.error('updateDialogFilter error:', err);\n }\n }).finally(() => {\n this.confirmBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(this.nameInputField.input)('input', () => {\n this.filter.title = this.nameInputField.value;\n this.editCheckForChange();\n });\n\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\n ] : [];\n\n return Promise.all([\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n }, 'Folders_2').then((player) => {\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n }),\n\n ...reloadMissingPromises\n ]);\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n }\n\n private onCreateOpen() {\n // this.caption.style.display = '';\n this.setTitle('FilterNew');\n this.menuBtn.classList.add('hide');\n this.confirmBtn.classList.remove('hide');\n this.nameInputField.value = '';\n\n for(const flag in this.flags) {\n // @ts-ignore\n this.flags[flag].style.display = 'none';\n }\n }\n\n private onEditOpen() {\n // this.caption.style.display = 'none';\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\n\n if(this.type === 'edit') {\n this.menuBtn.classList.remove('hide');\n this.confirmBtn.classList.add('hide');\n }\n\n const filter = this.filter;\n this.nameInputField.value = wrapDraftText(filter.title);\n\n for(const flag in this.flags) {\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\n }\n\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(async(key) => {\n const section = this[key];\n const ul = appDialogsManager.createChatList({ignoreClick: true});\n\n let peers = filter[key];\n\n // filter peers where we're kicked\n const hasPeer = async(peerId: PeerId) => {\n return !!(await this.managers.appMessagesManager.getDialogOnly(peerId)) || (peerId.isUser() ? (await this.managers.appUsersManager.getUser(peerId.toUserId()))._ === 'user' : false);\n };\n\n const filtered = await filterAsync(peers, (peerId) => hasPeer(peerId));\n peers.length = 0;\n peers.push(...filtered);\n\n peers = peers.slice();\n\n const renderMore = async(_length: number) => {\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\n const peerId = peers.shift();\n if(peerId.isUser() ? false : !(await this.managers.appMessagesManager.getDialogOnly(peerId))) {\n continue;\n }\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: ul,\n rippleEnabled: false,\n meAsSaved: true,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n }\n\n if(peers.length) {\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\n } else if(showMore) {\n showMore.remove();\n }\n };\n\n section.generateContentElement().append(ul);\n\n let showMore: HTMLElement;\n if(peers.length) {\n const content = section.generateContentElement();\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\n showMore.classList.add('load-more', 'rp-overflow');\n attachClickEvent(showMore, () => renderMore(20), {listenerSetter: this.listenerSetter});\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\n\n content.append(showMore);\n }\n\n renderMore(4);\n });\n }\n\n editCheckForChange() {\n if(this.type === 'edit') {\n const changed = !deepEqual(this.originalFilter, this.filter);\n this.confirmBtn.classList.toggle('hide', !changed);\n this.menuBtn.classList.toggle('hide', changed);\n }\n };\n\n setFilter(filter: DialogFilter, firstTime: boolean) {\n if(this.container) {\n // cleanup\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach((el) => el.remove());\n }\n\n if(firstTime) {\n this.originalFilter = filter;\n this.filter = copy(filter);\n } else {\n this.filter = filter;\n this.onEditOpen();\n this.editCheckForChange();\n }\n }\n\n public open(filter?: DialogFilter) {\n if(filter === undefined) {\n this.setFilter({\n _: 'dialogFilter',\n id: 0,\n title: '',\n pFlags: {},\n pinned_peers: [],\n include_peers: [],\n exclude_peers: [],\n pinnedPeerIds: [],\n includePeerIds: [],\n excludePeerIds: []\n }, true);\n this.type = 'create';\n } else {\n this.setFilter(filter, true);\n this.type = 'edit';\n }\n\n // @ts-ignore\n return super.open().then(() => {\n if(this.type === 'edit') {\n this.setFilter(this.originalFilter, true);\n this.onEditOpen();\n } else {\n this.onCreateOpen();\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 InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport EditPeer from '../../editPeer';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {i18n, i18n_, LangPackKey} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport rootScope from '../../../lib/rootScope';\nimport setBlankToAnchor from '../../../lib/richTextProcessor/setBlankToAnchor';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport SettingSection, {generateSection} from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\n\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\n\nexport function purchaseUsernameCaption() {\n const p = document.createElement('div');\n const FRAGMENT_USERNAME_URL = 'https://fragment.com/username/';\n const a = setBlankToAnchor(document.createElement('a'));\n const purchaseText = i18n('Username.Purchase', [a]);\n purchaseText.classList.add('username-purchase-help');\n p.append(\n purchaseText,\n document.createElement('br'),\n document.createElement('br')\n );\n p.classList.add('hide');\n\n return {\n element: p,\n setUsername: (username: string) => {\n if(username) {\n a.href = FRAGMENT_USERNAME_URL + username;\n }\n\n p.classList.toggle('hide', !username);\n }\n };\n}\n\nexport default class AppEditProfileTab extends SliderSuperTab {\n private firstNameInputField: InputField;\n private lastNameInputField: InputField;\n private bioInputField: InputField;\n private usernameInputField: UsernameInputField;\n\n private profileUrlContainer: HTMLDivElement;\n private profileUrlAnchor: HTMLAnchorElement;\n\n private editPeer: EditPeer;\n\n public static getInitArgs() {\n return {\n bioMaxLength: rootScope.managers.apiManager.getLimit('bio'),\n user: rootScope.managers.appUsersManager.getSelf(),\n userFull: rootScope.managers.appProfileManager.getProfile(rootScope.myId.toUserId())\n };\n }\n\n public async init(p: ReturnType) {\n this.container.classList.add('edit-profile-container');\n this.setTitle('EditAccount.Title');\n\n const inputFields: InputField[] = [];\n\n const [bioMaxLength, user, userFull] = await Promise.all([p.bioMaxLength, p.user, p.userFull]);\n\n {\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.firstNameInputField = new InputField({\n label: 'EditProfile.FirstNameLabel',\n name: 'first-name',\n maxLength: 70\n });\n this.lastNameInputField = new InputField({\n label: 'Login.Register.LastName.Placeholder',\n name: 'last-name',\n maxLength: 64\n });\n this.bioInputField = new InputField({\n label: 'EditProfile.BioLabel',\n name: 'bio',\n maxLength: bioMaxLength\n });\n\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'Bio.Description'});\n\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\n\n this.editPeer = new EditPeer({\n peerId: rootScope.myId,\n inputFields,\n listenerSetter: this.listenerSetter\n });\n\n this.content.append(this.editPeer.nextBtn);\n\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\n }\n\n {\n const section = new SettingSection({\n name: 'EditAccount.Username',\n caption: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.usernameInputField = new UsernameInputField({\n label: 'EditProfile.Username.Label',\n name: 'username',\n plainText: true,\n listenerSetter: this.listenerSetter,\n onChange: () => {\n this.editPeer.handleChange();\n // this.setProfileUrl();\n\n const {error} = this.usernameInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? this.usernameInputField.value : undefined);\n },\n availableText: 'EditProfile.Username.Available',\n takenText: 'EditProfile.Username.Taken',\n invalidText: 'EditProfile.Username.Invalid'\n }, this.managers);\n\n inputWrapper.append(this.usernameInputField.container);\n\n const caption = section.caption;\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n caption.append(\n p,\n i18n('UsernameHelp')\n // document.createElement('br'),\n // document.createElement('br')\n );\n\n // const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\n // profileUrlContainer.classList.add('profile-url-container');\n // const profileUrlAnchor = this.profileUrlAnchor = anchorCopy();\n // profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\n // caption.append(profileUrlContainer);\n\n inputFields.push(this.usernameInputField);\n section.content.append(inputWrapper);\n this.scrollable.append(section.container);\n }\n\n {\n const section = new UsernamesSection({\n peerId: rootScope.myId,\n peer: user,\n listenerSetter: this.listenerSetter,\n usernameInputField: this.usernameInputField,\n middleware: this.middlewareHelper.get()\n });\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const profilePromise = this.managers.appProfileManager.updateProfile(\n this.firstNameInputField.value,\n this.lastNameInputField.value,\n this.bioInputField.value\n );\n promises.push(profilePromise.then(() => {\n this.close();\n }, (err) => {\n console.error('updateProfile error:', err);\n }));\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n }));\n }\n\n if(this.usernameInputField.isValidToChange()) {\n promises.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.firstNameInputField.setOriginalValue(user.first_name, true);\n this.lastNameInputField.setOriginalValue(user.last_name, true);\n this.bioInputField.setOriginalValue(userFull.about, true);\n this.usernameInputField.setOriginalValue(getPeerEditableUsername(user), true);\n\n // this.setProfileUrl();\n this.editPeer.handleChange();\n }\n\n // private setProfileUrl() {\n // if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\n // this.profileUrlContainer.style.display = 'none';\n // } else {\n // this.profileUrlContainer.style.display = '';\n // this.profileUrlAnchor.replaceWith(this.profileUrlAnchor = anchorCopy({mePath: this.usernameInputField.value}));\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 appImManager from '../../lib/appManagers/appImManager';\nimport SidebarSlider from '../slider';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport AppSharedMediaTab from './tabs/sharedMedia';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\n\nexport class AppSidebarRight extends SidebarSlider {\n private isColumnProportionSet = false;\n private sharedMediaTab: AppSharedMediaTab;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-right') as HTMLElement,\n canHideFirst: true,\n navigationType: 'right'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\n this.toggleSidebar(false);\n }\n });\n\n mediaSizes.addEventListener('resize', () => {\n this.setColumnProportion();\n });\n }\n\n public createSharedMediaTab() {\n const tab = this.createTab(AppSharedMediaTab, false, true);\n tab.slider = this;\n // this.tabsContainer.prepend(tab.container);\n return tab;\n }\n\n public replaceSharedMediaTab(tab?: AppSharedMediaTab) {\n const previousTab = this.sharedMediaTab;\n if(previousTab) {\n const idx = this.historyTabIds.indexOf(previousTab);\n\n if(this._selectTab.getFrom() === previousTab.container) {\n this._selectTab.setFrom(tab?.container);\n }\n\n if(tab) {\n if(idx !== -1) {\n this.historyTabIds[idx] = tab;\n }\n\n const wasActive = previousTab.container.classList.contains('active');\n if(wasActive) {\n tab.container.classList.add('active');\n }\n\n previousTab.container.replaceWith(tab.container);\n } else {\n if(idx !== -1) {\n this.historyTabIds.splice(idx, 1);\n }\n\n previousTab.container.remove();\n }\n } else {\n this.tabsContainer.prepend(tab.container);\n }\n\n this.sharedMediaTab = tab;\n }\n\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\n if(!this.historyTabIds.length) {\n this.toggleSidebar(false, animate);\n }\n\n super.onCloseTab(id, animate, isNavigation);\n }\n\n private setColumnProportion() {\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\n }\n\n public toggleSidebar(enable?: boolean, animate?: boolean) {\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n let willChange: boolean;\n if(enable !== undefined) {\n if(enable) {\n if(!active) {\n willChange = true;\n }\n } else if(active) {\n willChange = true;\n }\n } else {\n willChange = true;\n }\n\n if(!willChange) return Promise.resolve();\n\n if(!active && !this.historyTabIds.length) {\n this.sharedMediaTab.open();\n }\n\n if(!this.isColumnProportionSet) {\n this.setColumnProportion();\n this.isColumnProportionSet = true;\n }\n\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\n return animationPromise;\n\n /* return new Promise((resolve, reject) => {\n const hidden: {element: HTMLDivElement, height: number}[] = [];\n const observer = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const bubble = entry.target as HTMLDivElement;\n if(!entry.isIntersecting) {\n hidden.push({element: bubble, height: bubble.scrollHeight});\n }\n }\n\n for(const item of hidden) {\n item.element.style.minHeight = item.height + 'px';\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\n item.element.style.width = '1px';\n }\n\n //console.log('hidden', hidden);\n observer.disconnect();\n\n set();\n\n setTimeout(() => {\n for(const item of hidden) {\n item.element.style.minHeight = '';\n item.element.style.width = '';\n (item.element.firstElementChild as HTMLElement).style.display = '';\n }\n\n resolve();\n }, 200);\n });\n\n const length = Object.keys(appImManager.bubbles).length;\n if(length) {\n for(const i in appImManager.bubbles) {\n observer.observe(appImManager.bubbles[i]);\n }\n } else {\n set();\n setTimeout(resolve, 200);\n }\n }); */\n }\n}\n\nconst appSidebarRight = new AppSidebarRight();\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\nexport default appSidebarRight;\n","/*\n * 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 InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport PeerTitle from '../../peerTitle';\nimport rootScope from '../../../lib/rootScope';\nimport PopupPeer from '../../popups/peer';\nimport {addCancelButton} from '../../popups';\nimport {i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport SettingSection from '../../settingSection';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppEditContactTab extends SliderSuperTab {\n private nameInputField: InputField;\n private lastNameInputField: InputField;\n private editPeer: EditPeer;\n private sharePhoneCheckboxField: CheckboxField;\n public peerId: PeerId;\n\n public async init() {\n const {peerId} = this;\n const userId = peerId.toUserId();\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\n const [isContact, privacy] = await Promise.all([\n this.managers.appUsersManager.isContact(userId),\n this.managers.appPrivacyManager.getPrivacy('inputPrivacyKeyPhoneNumber')\n ]);\n const isNew = !isContact;\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\n\n {\n const section = new SettingSection({noDelimiter: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FirstName',\n name: 'contact-name',\n maxLength: 70,\n required: true\n });\n this.lastNameInputField = new InputField({\n label: 'LastName',\n name: 'contact-lastname',\n maxLength: 70\n });\n\n if(userId) {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n if(isNew) {\n this.nameInputField.setDraftValue(user.first_name);\n this.lastNameInputField.setDraftValue(user.last_name);\n } else {\n this.nameInputField.setOriginalValue(user.first_name);\n this.lastNameInputField.setOriginalValue(user.last_name);\n }\n }\n\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\n inputFields.push(this.nameInputField, this.lastNameInputField);\n\n this.editPeer = new EditPeer({\n peerId: peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true\n });\n this.content.append(this.editPeer.nextBtn);\n\n if(peerId) {\n const div = document.createElement('div');\n div.classList.add('avatar-edit');\n div.append(this.editPeer.avatarElem);\n\n const notificationsCheckboxField = new CheckboxField({\n text: 'Notifications'\n });\n\n notificationsCheckboxField.input.addEventListener('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.managers.appMessagesManager.togglePeerMute({peerId});\n });\n\n this.listenerSetter.add(rootScope)('notify_settings', async(update) => {\n if(update.peer._ !== 'notifyPeer') return;\n const peerId = getPeerId(update.peer.peer);\n if(peerId === peerId) {\n const enabled = !(await this.managers.appNotificationsManager.isMuted(update.notify_settings));\n if(enabled !== notificationsCheckboxField.checked) {\n notificationsCheckboxField.checked = enabled;\n }\n }\n });\n\n const profileNameDiv = document.createElement('div');\n profileNameDiv.classList.add('profile-name');\n profileNameDiv.append(new PeerTitle({\n peerId: peerId\n }).element);\n // profileNameDiv.innerHTML = 'Karen Stanford';\n\n const profileSubtitleDiv = document.createElement('div');\n profileSubtitleDiv.classList.add('profile-subtitle');\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\n\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\n\n if(!isNew) {\n const notificationsRow = new Row({\n checkboxField: notificationsCheckboxField,\n withCheckboxSubtitle: true,\n listenerSetter: this.listenerSetter\n });\n\n const enabled = !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false}));\n notificationsCheckboxField.checked = enabled;\n\n section.content.append(notificationsRow.container);\n } else {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n const phoneRow = new Row({\n icon: 'phone',\n titleLangKey: user.phone ? undefined : 'MobileHidden',\n title: user.phone ? formatUserPhone(user.phone) : undefined,\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: peerId}).element]\n });\n\n section.content.append(phoneRow.container);\n }\n } else {\n section.content.append(inputWrapper);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!isNew) {\n const section = new SettingSection();\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\n\n attachClickEvent(btnDelete, () => {\n new PopupPeer('popup-delete-contact', {\n peerId: peerId,\n titleLangKey: 'DeleteContact',\n descriptionLangKey: 'AreYouSureDeleteContact',\n buttons: addCancelButton([{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n this.managers.appUsersManager.deleteContacts([userId]).then(() => {\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 } else if(\n privacy.some((privacyRule) => privacyRule._ === 'privacyValueDisallowAll') &&\n !privacy.some((privacyRule) => privacyRule._ === 'privacyValueAllowUsers' && privacyRule.users.includes(userId))\n ) {\n const section = new SettingSection({\n caption: 'NewContact.Exception.ShareMyPhoneNumber.Desc',\n captionArgs: [await wrapPeerTitle({peerId: this.peerId})]\n });\n const checkboxField = this.sharePhoneCheckboxField = new CheckboxField({\n text: 'NewContact.Exception.ShareMyPhoneNumber',\n checked: true\n });\n const row = CreateRowFromCheckboxField(checkboxField);\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, async() => {\n this.editPeer.nextBtn.disabled = true;\n\n this.managers.appUsersManager.addContact(\n userId,\n this.nameInputField.value,\n this.lastNameInputField.value,\n (await this.managers.appUsersManager.getUser(userId)).phone,\n this.sharePhoneCheckboxField?.checked\n ).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n }\n}\n","/*\n * 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 {makeMediaSize} from '../../../helpers/mediaSize';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ForumTopic} from '../../../layer';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {GENERAL_TOPIC_ID, TOPIC_COLORS} from '../../../lib/mtproto/mtproto_config';\nimport getAbbreviation from '../../../lib/richTextProcessor/getAbbreviation';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport EmojiTab from '../../emoticonsDropdown/tabs/emoji';\nimport InputField from '../../inputField';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport appSidebarLeft from '../../sidebarLeft';\nimport SliderSuperTab from '../../sliderTab';\nimport {wrapTopicIcon} from '../../wrappers/messageActionTextNewUnsafe';\n\nconst size = 64;\nconst mediaSize = makeMediaSize(size, size);\n\nexport default class AppEditTopicTab extends SliderSuperTab {\n private iconDiv: HTMLElement;\n private colorIndex: number;\n private nameInputField: InputField;\n private topic: Parameters[0]['topic'];\n private emojiElement: HTMLElement;\n private confirmBtn: HTMLButtonElement;\n private originalTopic: ForumTopic.forumTopic;\n\n public async init(peerId: PeerId, threadId?: number) {\n this.colorIndex = 0;\n const isNew = !threadId;\n const isGeneral = threadId === GENERAL_TOPIC_ID;\n this.container.classList.add('edit-topic-container');\n this.setTitle(isNew ? 'NewTopic' : 'ForumTopic.Title.Edit');\n const chatId = peerId.toChatId();\n\n if(threadId) {\n this.topic = this.originalTopic = copy(await this.managers.dialogsStorage.getForumTopic(peerId, threadId));\n }\n\n {\n const section = new SettingSection({\n name: isGeneral ? 'CreateGeneralTopicTitle' : 'CreateTopicTitle'\n });\n\n const iconDiv = this.iconDiv = document.createElement('div');\n iconDiv.classList.add('edit-topic-icon-container');\n\n !threadId && attachClickEvent(iconDiv, () => {\n if(this.topic.icon_emoji_id) {\n return;\n }\n\n this.colorIndex = (this.colorIndex + 1) % TOPIC_COLORS.length;\n this.setIcon();\n }, {listenerSetter: this.listenerSetter});\n\n if(threadId) {\n iconDiv.classList.add('disable-hover');\n }\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const nameInputField = this.nameInputField = new InputField({\n label: 'ForumTopic.Name.Placeholder',\n withLinebreaks: false,\n name: 'topic-name',\n maxLength: 70,\n required: true\n });\n\n if(this.topic) {\n nameInputField.setOriginalValue(this.topic.title, true);\n }\n\n const confirmBtn = this.confirmBtn = ButtonIcon('check btn-confirm blue hide', {noRipple: true});\n this.header.append(confirmBtn);\n\n attachClickEvent(confirmBtn, () => {\n const toggle = toggleDisability([confirmBtn], true);\n if(threadId) {\n this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n title: nameInputField.value,\n iconEmojiId: this.topic.icon_emoji_id || 0\n }).then(() => {\n this.close();\n }).catch((err) => {\n console.error('edit topic error', err);\n toggle();\n });\n } else {\n this.managers.appChatsManager.createForumTopic({\n chatId,\n iconColor: TOPIC_COLORS[this.colorIndex],\n iconEmojiId: this.topic.icon_emoji_id,\n title: nameInputField.value\n }).then((threadId) => {\n this.close();\n appImManager.setInnerPeer({\n peerId,\n threadId\n });\n }).catch((err) => {\n console.error('create topic error', err);\n toggle();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(nameInputField.input)('input', () => {\n this.validate();\n this.setIcon(this.topic?.icon_emoji_id);\n });\n\n inputWrapper.append(nameInputField.container);\n\n section.content.append(iconDiv, inputWrapper);\n\n this.scrollable.append(section.container);\n }\n\n const promises: Promise[] = [];\n\n if(!isGeneral) {\n const section = new SettingSection({});\n section.container.classList.add('edit-topic-emoticons-container');\n const emojiTab = new EmojiTab({\n managers: this.managers,\n isStandalone: true,\n noRegularEmoji: true,\n stickerSetId: 'inputStickerSetEmojiDefaultTopicIcons',\n onClick: (emoji) => {\n emojiTab.setActive(!emoji.docId ? {emoji: undefined, docId: undefined} : emoji);\n this.setIcon(emoji.docId);\n }\n });\n emojiTab.getContainerSize = () => ({\n width: appSidebarLeft.rect.width,\n height: 400\n });\n\n this.middlewareHelper.onDestroy(() => {\n emojiTab.destroy();\n });\n\n emojiTab.container.classList.remove('tabs-tab');\n\n this.emojiElement = document.createElement('span');\n this.emojiElement.classList.add('super-emoji-topic-icon');\n\n const promise = emojiTab.init().then(async() => {\n const category = emojiTab.getCustomCategory();\n\n const iconEmojiId = this.topic?.icon_emoji_id;\n emojiTab.addEmojiToCategory({\n category,\n element: this.emojiElement,\n batch: false,\n prepend: true,\n active: !iconEmojiId\n });\n\n if(iconEmojiId) {\n emojiTab.setActive({docId: iconEmojiId, emoji: ''});\n }\n });\n\n promises.push(promise);\n\n section.content.replaceWith(emojiTab.container);\n this.scrollable.append(section.container);\n } else {\n const section = new SettingSection({caption: 'EditTopicHideInfo'});\n\n const checkboxField = new CheckboxField({\n // toggle: true,\n checked: !(this.topic as ForumTopic.forumTopic).pFlags.hidden,\n text: 'EditTopicHide'\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const promise = this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n hidden: !checkboxField.checked\n });\n\n row.disableWithPromise(promise);\n });\n\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n return Promise.all(promises).then(() => {\n return this.s();\n });\n }\n\n private validate() {\n let isChanged = this.nameInputField.isValidToChange();\n if(!isChanged && this.originalTopic) {\n isChanged = this.topic.icon_emoji_id !== this.originalTopic.icon_emoji_id;\n }\n\n this.confirmBtn.classList.toggle('hide', !isChanged);\n }\n\n private s() {\n if(this.topic?.icon_color) {\n this.colorIndex = TOPIC_COLORS.indexOf(this.topic.icon_color);\n }\n\n return this.setIcon(this.topic?.icon_emoji_id, undefined, true);\n }\n\n private async setIcon(iconEmojiId?: Long, appendTo = this.iconDiv, force?: boolean) {\n const title = this.nameInputField.value;\n\n const isMainIcon = appendTo === this.iconDiv;\n\n if(isMainIcon) {\n const newTopic: AppEditTopicTab['topic'] = {\n id: this.topic?.id,\n icon_color: TOPIC_COLORS[this.colorIndex],\n title: getAbbreviation(title, true).text || 'A',\n icon_emoji_id: iconEmojiId\n };\n\n const oldTopic = this.topic;\n this.topic = newTopic;\n\n if(\n force ||\n !oldTopic ||\n oldTopic.icon_color !== newTopic.icon_color ||\n oldTopic.title !== newTopic.title\n ) {\n this.setIcon(undefined, this.emojiElement);\n }\n\n if(deepEqual(oldTopic, newTopic) && !force) {\n return;\n }\n\n this.validate();\n }\n\n const el = await wrapTopicIcon({\n topic: isMainIcon ? this.topic : {...this.topic, icon_emoji_id: undefined},\n customEmojiSize: mediaSize,\n middleware: this.middlewareHelper.get()\n });\n\n const span = document.createElement('div');\n span.classList.add('edit-topic-icon');\n span.append(el);\n\n const oldEl = appendTo.lastElementChild as HTMLElement;\n appendTo.append(span);\n\n const applyFadeAnimation = (el: HTMLElement, fadeIn: boolean) => {\n const frames: Keyframe[] = [\n {opacity: '0', transform: 'scale(0.8)'},\n {opacity: '1', transform: 'scale(1)'}\n ];\n\n const animation = el.animate(frames, {\n duration: 200,\n iterations: 1,\n easing: 'ease-in-out',\n fill: 'forwards',\n direction: fadeIn ? 'normal' : 'reverse'\n });\n\n return new Promise((resolve) => {\n animation.addEventListener('finish', () => {\n resolve();\n }, {once: true});\n });\n };\n\n if(oldEl) {\n applyFadeAnimation(oldEl, false).then(() => oldEl.remove());\n }\n\n applyFadeAnimation(span, 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 {copyTextToClipboard} from '../../../helpers/clipboard';\nimport {randomLong} from '../../../helpers/random';\nimport {Chat, ChatFull, ExportedChatInvite} from '../../../layer';\nimport Button from '../../button';\nimport {setButtonLoader} from '../../putPreloader';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport {toast} from '../../toast';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport I18n, {i18n} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport rootScope from '../../../lib/rootScope';\nimport SettingSection from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport {purchaseUsernameCaption} from '../../sidebarLeft/tabs/editProfile';\nimport confirmationPopup from '../../confirmationPopup';\n\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n public chatFull: ChatFull;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'group-type-container');\n\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\n\n const section = new SettingSection({\n name: isBroadcast ? 'ChannelType' : 'GroupType'\n });\n\n const random = randomLong();\n const privateRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate',\n name: random,\n value: 'private'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\n });\n const publicRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic',\n name: random,\n value: 'public'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\n });\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\n const a: HTMLElement[][] = [[privateSection.container], [publicContainer]];\n if(value === 'public') a.reverse();\n\n a[0].forEach((container) => container.classList.remove('hide'));\n a[1].forEach((container) => container.classList.add('hide'));\n\n onChange();\n });\n\n const chat: Chat = await this.managers.appChatsManager.getChat(this.chatId);\n\n section.content.append(form);\n\n const privateSection = new SettingSection({});\n\n // let revoked = false;\n const linkRow = new Row({\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\n clickable: () => {\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\n toast(I18n.format('LinkCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\n\n attachClickEvent(btnRevoke, () => {\n new PopupPeer('revoke-link', {\n buttons: [{\n langKey: 'RevokeButton',\n callback: () => {\n const toggle = toggleDisability([btnRevoke], true);\n\n this.managers.appProfileManager.getChatInviteLink(this.chatId, true).then((link) => {\n toggle();\n linkRow.title.innerHTML = link;\n // revoked = true;\n // onChange();\n });\n }\n }],\n titleLangKey: 'RevokeLink',\n descriptionLangKey: 'RevokeAlert'\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n privateSection.content.append(linkRow.container, btnRevoke);\n\n const publicSection = new SettingSection({\n caption: true,\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const placeholder = 't.me/';\n\n const onChange = () => {\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) ||\n (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\n applyBtn.classList.toggle('is-visible', changed);\n\n const {error} = linkInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? linkInputField.getValue() : undefined);\n };\n\n const linkInputField = new UsernameInputField({\n label: 'SetUrlPlaceholder',\n name: 'group-public-link',\n plainText: true,\n listenerSetter: this.listenerSetter,\n availableText: 'Link.Available',\n invalidText: 'Link.Invalid',\n takenText: 'Link.Taken',\n onChange: onChange,\n peerId: this.chatId.toPeerId(true),\n head: placeholder\n }, this.managers);\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n publicSection.caption.append(\n p,\n i18n(isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup')\n );\n\n const usernamesSection = new UsernamesSection({\n peerId: this.chatId.toPeerId(true),\n peer: chat as Chat.channel,\n listenerSetter: this.listenerSetter,\n usernameInputField: linkInputField,\n middleware: this.middlewareHelper.get()\n });\n\n const publicContainer = document.createElement('div');\n publicContainer.append(publicSection.container, usernamesSection.container);\n\n const originalValue = placeholder + (getPeerEditableUsername(chat as Chat.channel) || '');\n\n inputWrapper.append(linkInputField.container)\n publicSection.content.append(inputWrapper);\n\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\n this.content.append(applyBtn);\n\n attachClickEvent(applyBtn, async() => {\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\n if(!username) {\n const chat = await this.managers.appChatsManager.getChat(this.chatId);\n const wasUsername = getPeerEditableUsername(chat as Chat.channel);\n if(wasUsername) {\n await confirmationPopup({\n descriptionLangKey: isBroadcast ? 'ChannelVisibility.Confirm.MakePrivate.Channel' : 'ChannelVisibility.Confirm.MakePrivate.Group',\n descriptionLangArgs: [wasUsername],\n button: {\n langKey: 'OK'\n }\n });\n }\n }\n\n /* const unsetLoader = */setButtonLoader(applyBtn);\n this.managers.appChatsManager.migrateChat(this.chatId).then((channelId) => {\n if(!username) {\n return this.managers.appChatsManager.makeChannelPrivate(channelId);\n } else {\n return this.managers.appChatsManager.updateUsername(channelId, username);\n }\n }).then(() => {\n // unsetLoader();\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n (originalValue !== placeholder || getPeerActiveUsernames(chat as Chat.channel).length ? publicRow : privateRow).radioField.checked = true;\n linkInputField.setOriginalValue(originalValue, true);\n\n this.scrollable.append(section.container, privateSection.container, publicContainer);\n\n {\n const section = new SettingSection({\n name: 'SavingContentTitle',\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\n });\n\n const checkboxField = new CheckboxField({\n text: 'RestrictSavingContent',\n withRipple: true\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const toggle = checkboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\n toggle();\n });\n });\n\n const onChatUpdate = () => {\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.chatId === chatId) {\n onChatUpdate();\n }\n });\n\n onChatUpdate();\n\n section.content.append(checkboxField.label);\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 toggleDisability from '../../../helpers/dom/toggleDisability';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ChannelParticipant} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport Button from '../../button';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {ChatPermissions} from './groupPermissions';\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo'\n });\n\n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: this.userId.toPeerId(false),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(this.userId)));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n }, this.managers);\n\n destroyListener = () => {\n // appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n this.managers.appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n this.managers.appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport ScrollableLoader from '../../../helpers/scrollableLoader';\nimport {ChannelParticipant, Chat, ChatBannedRights, Update} from '../../../layer';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport appDialogsManager, {DialogDom, DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport combineParticipantBannedRights from '../../../lib/appManagers/utils/chats/combineParticipantBannedRights';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport CheckboxField from '../../checkboxField';\nimport PopupPickUser from '../../popups/pickUser';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport {toast} from '../../toast';\nimport AppUserPermissionsTab from './userPermissions';\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(private options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }, private managers: AppManagers) {\n this.construct();\n }\n\n public async construct() {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const options = this.options;\n const chat = await this.managers.appChatsManager.getChat(options.chatId) as Chat.chat | Chat.channel;\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? combineParticipantBannedRights(chat as Chat.channel, options.participant.banned_rights) : defaultBannedRights;\n\n const restrictionText: LangPackKey = options.participant ? 'UserRestrictionsDisabled' : 'EditCantEditPermissionsPublic';\n for(const info of this.v) {\n const mainFlag = info.flags[0];\n const row = CreateRowFromCheckboxField(\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: hasRights(chat, mainFlag, rights),\n restriction: true,\n listenerSetter: options.listenerSetter\n })\n );\n\n if((\n options.participant &&\n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n getPeerActiveUsernames(chat as Chat.channel)[0] &&\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(row.container);\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 public async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader'\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content\n }, this.managers);\n\n this.eventListener.addEventListener('destroy', () => {\n this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId\n });\n },\n listenerSetter: this.listenerSetter\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await this.managers.appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = this.slider.createTab(AppUserPermissionsTab);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n\n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = async(dom: DialogDom, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;// appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = ((await this.managers.appChatsManager.getChat(this.chatId)) as Chat.channel).default_banned_rights;\n // const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach((info) => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = dom.lastMessageSpan as HTMLElement;\n\n if(cantWhat.length) {\n el.replaceChildren(...join(cantWhat.map((t) => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n\n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: getPeerId(participant.peer),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n setSubtitle(dom, participant);\n\n // dom.titleSpan.innerHTML = 'Chinaza Akachi';\n // dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n // this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n // const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n // const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n // if(needAdd) {\n // if(!li) {\n // add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n // } else {\n // setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n // }\n\n // if(update.prev_participant?._ !== 'channelParticipantBanned') {\n // ++exceptionsCount;\n // }\n // } else {\n // if(li) {\n // li.remove();\n // }\n\n // if(update.prev_participant?._ === 'channelParticipantBanned') {\n // --exceptionsCount;\n // }\n // }\n\n // setLength();\n // });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return this.managers.appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then((res) => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n\n exceptionsCount = res.count;\n setLength();\n\n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(await this.managers.appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport copy from '../../../../helpers/object/copy';\nimport {ChatBannedRights, Chat} from '../../../../layer';\n\nexport default function combineParticipantBannedRights(chat: Chat.channel, rights: ChatBannedRights) {\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(const i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport debounce from '../../../helpers/schedulers/debounce';\nimport {ChatReactions, Reaction} from '../../../layer';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport CheckboxField from '../../checkboxField';\nimport Row, {RadioFormFromValues} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.setTitle('Reactions');\n\n const availableReactions = await this.managers.appReactionsManager.getActiveAvailableReactions();\n const chatFull = await this.managers.appProfileManager.getChatFull(this.chatId);\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n let _chatReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n let chatReactions = _chatReactions;\n let emoticons = new Set(_chatReactions._ === 'chatReactionsSome' ? _chatReactions.reactions.map((reaction) => (reaction as Reaction.reactionEmoji).emoticon) : []);\n\n const makeReactionFromEmoticons = (emoticons: Array): Reaction[] => emoticons.map((emoticon) => ({_: 'reactionEmoji', emoticon}));\n\n const getCaptionLangPackKey = (): LangPackKey => {\n if(isBroadcast) {\n return 'EnableReactionsChannelInfo';\n }\n\n return chatReactions._ === 'chatReactionsAll' ? 'EnableAllReactionsInfo' : (chatReactions._ === 'chatReactionsNone' ? 'DisableReactionsInfo' : 'EnableSomeReactionsInfo');\n };\n\n const toggleSection = new SettingSection({\n name: isBroadcast ? undefined : 'AvailableReactions',\n caption: getCaptionLangPackKey()\n });\n\n const reactionsSection = new SettingSection({\n name: 'OnlyAllowThisReactions'\n });\n\n const toggleCheckboxFieldsByEmoticons = () => {\n const r: Reaction.reactionEmoji[] = (chatReactions as ChatReactions.chatReactionsSome).reactions as any ?? [];\n emoticons = new Set(r.map(({emoticon}) => emoticon));\n checkboxFieldsByEmoticon.forEach((checkboxField, emoticon) => {\n checkboxField.setValueSilently(emoticons.has(emoticon));\n });\n };\n\n let toggleCheckboxField: CheckboxField;\n if(isBroadcast) {\n toggleCheckboxField = new CheckboxField({toggle: true, checked: _chatReactions._ === 'chatReactionsSome'});\n const toggleRow = new Row({\n checkboxField: toggleCheckboxField,\n titleLangKey: 'EnableReactions',\n listenerSetter: this.listenerSetter\n });\n\n toggleSection.content.append(toggleRow.container);\n\n this.listenerSetter.add(toggleCheckboxField.input)('change', () => {\n let save = true;\n if(!toggleCheckboxField.checked) {\n chatReactions = {_: 'chatReactionsNone'};\n } else if(checkboxFields.every((checkboxField) => !checkboxField.checked)) {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(availableReactions.map(({reaction}) => reaction))};\n } else if(chatReactions._ !== 'chatReactionsSome') {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(Array.from(emoticons))};\n } else {\n save = false;\n }\n\n if(save) {\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n }\n });\n } else {\n const a: [ChatReactions['_'], LangPackKey][] = [\n ['chatReactionsAll', 'AllReactions'],\n ['chatReactionsSome', 'SomeReactions'],\n ['chatReactionsNone', 'NoReactions']\n ];\n\n const onChange = () => {\n reactionsSection.container.classList.toggle('hide', chatReactions._ !== 'chatReactionsSome');\n };\n\n let value = _chatReactions._;\n const form = RadioFormFromValues(a.map(([value, langPackKey]) => {\n return {\n langPackKey,\n value,\n checked: _chatReactions._ === value\n };\n }), (_value) => {\n value = _value as any;\n\n if(value === 'chatReactionsAll') {\n chatReactions = {\n _: value,\n pFlags: {\n allow_custom: true\n }\n };\n } else if(value === 'chatReactionsNone') {\n chatReactions = {\n _: value\n };\n } else {\n chatReactions = {\n _: value,\n reactions: makeReactionFromEmoticons(['👍', '👎'])\n };\n }\n\n replaceContent(toggleSection.caption, i18n(getCaptionLangPackKey()));\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n onChange();\n });\n\n toggleSection.content.append(form);\n onChange();\n }\n\n const checkboxFieldsByEmoticon: Map = new Map();\n const checkboxFields = availableReactions.map((availableReaction) => {\n const emoticon = availableReaction.reaction;\n const checkboxField = new CheckboxField({\n toggle: true,\n checked: emoticons.has(emoticon)\n });\n\n checkboxFieldsByEmoticon.set(emoticon, checkboxField);\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n emoticons.add(emoticon);\n\n if(toggleCheckboxField && !toggleCheckboxField.checked) {\n toggleCheckboxField.checked = true;\n }\n } else {\n emoticons.delete(emoticon);\n\n if(toggleCheckboxField?.checked && !emoticons.size) {\n toggleCheckboxField.checked = false;\n }\n }\n\n saveReactionsDebounced();\n });\n\n const row = new Row({\n checkboxField,\n title: availableReaction.title,\n havePadding: true,\n listenerSetter: this.listenerSetter\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 const saveReactions = async() => {\n saveReactionsDebounced.clearTimeout();\n // const newReactions = Array.from(enabledReactions);\n // if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n // return;\n // }\n\n if(chatReactions._ === 'chatReactionsSome') {\n chatReactions.reactions = makeReactionFromEmoticons(Array.from(emoticons));\n }\n\n // const r = (chatReactions as ChatReactions.chatReactionsSome).reactions;\n // if(r?.length === availableReactions.length) {\n // chatReactions = {_: 'chatReactionsAll'};\n // }\n\n this.managers.appChatsManager.setChatAvailableReactions(this.chatId, chatReactions);\n _chatReactions = chatReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', () => {\n if(saveReactionsDebounced.isDebounced()) {\n saveReactions();\n }\n }, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.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 {SliderSuperTab} from '../../slider'\nimport InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport Button from '../../button';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport {Chat, ChatFull} from '../../../layer';\nimport AppChatTypeTab from './chatType';\nimport rootScope from '../../../lib/rootScope';\nimport AppGroupPermissionsTab from './groupPermissions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupDeleteDialog from '../../popups/deleteDialog';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport AppChatReactionsTab from './chatReactions';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\n\nexport default class AppEditChatTab extends SliderSuperTab {\n private chatNameInputField: InputField;\n private descriptionInputField: InputField;\n private editPeer: EditPeer;\n public chatId: ChatId;\n\n protected async _init() {\n // * cleanup prev\n this.listenerSetter.removeAll();\n this.scrollable.container.replaceChildren();\n\n this.container.classList.add('edit-peer-container', 'edit-group-container');\n this.setTitle('Edit');\n\n let [\n chatFull,\n chat,\n isBroadcast,\n isChannel,\n canChangeType,\n canChangePermissions,\n canManageTopics,\n appConfig\n ] = await Promise.all([\n this.managers.appProfileManager.getChatFull(this.chatId, true),\n this.managers.appChatsManager.getChat(this.chatId) as Promise,\n this.managers.appChatsManager.isBroadcast(this.chatId),\n this.managers.appChatsManager.isChannel(this.chatId),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_type'),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_permissions'),\n this.managers.appChatsManager.hasRights(this.chatId, 'manage_topics'),\n this.managers.apiManager.getAppConfig()\n ]);\n\n const chatUpdateListeners: {[type in 'full' | 'basic']: (() => void)[]} = {full: [], basic: []};\n const addChatUpdateListener = (callback: () => void, type: 'full' | 'basic' = 'basic') => {\n chatUpdateListeners[type].push(callback);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.chatId === chatId) {\n chat = await this.managers.appChatsManager.getChat(this.chatId) as typeof chat;\n chatUpdateListeners['basic'].forEach((callback) => callback());\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_full_update', async(chatId) => {\n if(this.chatId === chatId) {\n chatFull = await this.managers.appProfileManager.getCachedFullChat(chatId) || chatFull;\n chatUpdateListeners['full'].forEach((callback) => callback());\n }\n });\n\n const peerId = this.chatId.toPeerId(true);\n\n {\n const section = new SettingSection({noDelimiter: true, caption: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.chatNameInputField = new InputField({\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\n name: 'chat-name',\n maxLength: 255,\n required: true\n });\n this.descriptionInputField = new InputField({\n label: 'DescriptionPlaceholder',\n name: 'chat-description',\n maxLength: 255\n });\n\n this.chatNameInputField.setOriginalValue(chat.title);\n this.descriptionInputField.setOriginalValue(chatFull.about);\n\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\n\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\n\n this.editPeer = new EditPeer({\n peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n popupOptions: {isForum: (chat as Chat.channel).pFlags.forum}\n });\n this.content.append(this.editPeer.nextBtn);\n\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\n\n if(canChangeType) {\n const chatTypeRow = new Row({\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\n clickable: () => {\n const tab = this.slider.createTab(AppChatTypeTab);\n tab.chatId = this.chatId;\n tab.chatFull = chatFull;\n tab.open();\n },\n icon: 'lock',\n listenerSetter: this.listenerSetter\n });\n\n const setChatTypeSubtitle = () => {\n let key: LangPackKey;\n const username = getPeerActiveUsernames(chat as Chat.channel)[0];\n if(isBroadcast) {\n key = username ? 'TypePublic' : 'TypePrivate';\n } else {\n key = username ? 'TypePublicGroup' : 'TypePrivateGroup';\n }\n\n chatTypeRow.subtitle.replaceChildren(i18n(key));\n };\n\n setChatTypeSubtitle();\n addChatUpdateListener(setChatTypeSubtitle);\n section.content.append(chatTypeRow.container);\n }\n\n if(canChangeType || canChangePermissions) {\n const reactionsRow = new Row({\n titleLangKey: 'Reactions',\n icon: 'reactions',\n clickable: () => {\n const tab = this.slider.createTab(AppChatReactionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const availableReactions = await this.managers.appReactionsManager.getAvailableReactions();\n const availableReactionsLength = availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive).length;\n const setReactionsLength = () => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n if(chatAvailableReactions._ === 'chatReactionsSome') {\n const length = chatAvailableReactions.reactions.length;\n if(length === availableReactionsLength) {\n replaceContent(reactionsRow.subtitle, i18n('ReactionsAll'));\n } else {\n reactionsRow.subtitle.textContent = length + '/' + availableReactionsLength;\n }\n } else {\n replaceContent(reactionsRow.subtitle, i18n(chatAvailableReactions._ === 'chatReactionsAll' ? 'ReactionsAll' : 'Checkbox.Disabled'));\n }\n };\n\n setReactionsLength();\n addChatUpdateListener(setReactionsLength, 'full');\n section.content.append(reactionsRow.container);\n }\n\n if(canChangePermissions && !isBroadcast) {\n const flags = [\n 'send_messages',\n 'send_media',\n 'send_stickers',\n 'send_polls',\n 'embed_links',\n 'invite_users',\n 'pin_messages',\n 'change_info'\n ] as ChatRights[];\n\n const permissionsRow = new Row({\n titleLangKey: 'ChannelPermissions',\n clickable: () => {\n const tab = this.slider.createTab(AppGroupPermissionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n icon: 'permissions',\n listenerSetter: this.listenerSetter\n });\n\n const setPermissionsLength = () => {\n permissionsRow.subtitle.textContent = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;\n };\n\n setPermissionsLength();\n addChatUpdateListener(setPermissionsLength);\n section.content.append(permissionsRow.container);\n }\n\n if(canManageTopics && (chat.participants_count >= appConfig.forum_upgrade_participants_min || (chat as Chat.channel).pFlags.forum)) {\n const topicsRow = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Topics',\n clickable: () => {},\n icon: 'topics',\n listenerSetter: this.listenerSetter\n });\n\n const setTopics = () => {\n const isForum = !!(chat as Chat.channel).pFlags.forum;\n this.editPeer.avatarElem.parentElement.classList.toggle('is-forum', isForum);\n topicsRow.checkboxField.setValueSilently(isForum);\n };\n\n this.listenerSetter.add(topicsRow.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n const promise = this.managers.appChatsManager.toggleForum(this.chatId, topicsRow.checkboxField.checked);\n topicsRow.disableWithPromise(promise);\n });\n\n setTopics();\n addChatUpdateListener(setTopics);\n\n section.caption.replaceChildren(i18n('ForumToggleDescription'));\n section.content.append(topicsRow.container);\n }\n\n section.caption.classList.toggle('hide', !section.caption.childElementCount);\n\n /* const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n this.scrollable.append(section.container);\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const id = this.chatId;\n if(this.chatNameInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editTitle(id, this.chatNameInputField.value));\n }\n\n if(this.descriptionInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editAbout(id, this.descriptionInputField.value));\n }\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appChatsManager.editPhoto(id, inputFile);\n }));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\n const discussionRow = new Row({\n titleLangKey: 'PeerInfo.Discussion',\n subtitleLangKey: 'PeerInfo.Discussion.Add',\n clickable: true,\n icon: 'message'\n });\n\n section.content.append(discussionRow.container);\n }\n\n const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + chatFull.admins_count,\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n if(isBroadcast && await this.managers.appChatsManager.hasRights(this.chatId, 'change_info')) {\n const signMessagesCheckboxField = new CheckboxField({\n text: 'ChannelSignMessages',\n checked: !!(chat as Chat.channel).pFlags.signatures\n });\n\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\n const toggle = signMessagesCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n addChatUpdateListener(() => {\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\n });\n\n section.content.append(CreateRowFromCheckboxField(signMessagesCheckboxField).container);\n }\n }\n\n if(!isBroadcast) {\n const section = new SettingSection({\n\n });\n\n /* const membersRow = new Row({\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\n icon: 'newgroup',\n clickable: true\n });\n\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\n\n section.content.append(membersRow.container); */\n\n if(!isBroadcast && canChangeType) {\n const showChatHistoryCheckboxField = new CheckboxField({\n text: 'ChatHistory'\n });\n\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n // ! it won't be updated because chatFull will be old\n const onChatUpdate = () => {\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\n };\n\n onChatUpdate();\n addChatUpdateListener(onChatUpdate);\n\n section.content.append(CreateRowFromCheckboxField(showChatHistoryCheckboxField).container);\n }\n\n if(section.content.childElementCount) {\n this.scrollable.append(section.container);\n }\n }\n\n if(await this.managers.appChatsManager.hasRights(this.chatId, 'delete_chat')) {\n const section = new SettingSection({});\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\n\n attachClickEvent(btnDelete, () => {\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\n const toggle = toggleDisability([btnDelete], true);\n promise.then(() => {\n this.close();\n }, () => {\n toggle();\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n\n if(!isChannel) {\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(peerId === migrateFrom) {\n this.chatId = migrateTo.toChatId();\n this._init();\n }\n });\n }\n }\n\n public init() {\n return this._init();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../../lib/rootScope';\nimport AppSearchSuper, {SearchSuperType} from '../../appSearchSuper.';\nimport SidebarSlider, {SliderSuperTab} from '../../slider';\nimport TransitionSlider from '../../transition';\nimport AppEditChatTab from './editChat';\nimport PeerTitle from '../../peerTitle';\nimport AppEditContactTab from './editContact';\nimport Button from '../../button';\nimport ButtonIcon from '../../buttonIcon';\nimport I18n, {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';\nimport {Message} from '../../../layer';\nimport getMessageThreadId from '../../../lib/appManagers/utils/messages/getMessageThreadId';\nimport AppEditTopicTab from './editTopic';\n\ntype SharedMediaHistoryStorage = Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n}>;\n\nconst historiesStorage: {\n [peerId: PeerId]: {\n [threadId: number]: SharedMediaHistoryStorage\n }\n} = {};\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId: number;\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n private titleI18n: I18n.IntlElement;\n\n public isFirst: boolean;\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 if(this.isFirst) {\n animatedCloseIcon.classList.add('state-back');\n }\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.titleI18n = new I18n.IntlElement();\n this.title.append(this.titleI18n.element);\n this.editBtn = ButtonIcon('edit');\n // const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter);\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', this.isFirst || 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({\n content: transitionContainer,\n type: 'slide-fade',\n transitionTime: 400,\n isHeavy: false\n });\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(transition.prevId()) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n transition(0);\n\n if(!this.isFirst) {\n animatedCloseIcon.classList.remove('state-back');\n }\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.editBtn, async() => {\n let tab: AppEditChatTab | AppEditContactTab | AppEditTopicTab;\n const {peerId, threadId} = this;\n if(threadId && await this.managers.appPeersManager.isForum(peerId)) {\n tab = this.slider.createTab(AppEditTopicTab)\n } else if(peerId.isAnyChat()) {\n tab = this.slider.createTab(AppEditChatTab);\n } else {\n tab = this.slider.createTab(AppEditContactTab);\n }\n\n if(tab) {\n if(tab instanceof AppEditTopicTab) {\n tab.open(peerId, this.threadId);\n } else {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = peerId.toChatId();\n } else {\n tab.peerId = peerId;\n }\n\n tab.open();\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', ({message}) => {\n this.renderNewMessage(message);\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 const timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n },\n managers: this.managers\n });\n\n this.searchSuper.scrollStartCallback = () => {\n setIsSharedMedia(true);\n };\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n attachClickEvent(btnAddMembers, async() => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = await this.managers.appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map((peerId) => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n\n if(isChannel) {\n const tab = this.slider.createTab(AppAddMembersTab);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = this.managers.appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n this.managers.appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n }\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n // console.log('construct shared media time:', performance.now() - perf);\n }\n\n private _renderNewMessage(message: Message.message | Message.messageService, threadId?: number) {\n const historyStorage = historiesStorage[message.peerId]?.[threadId];\n if(!historyStorage) return;\n\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const history = historyStorage[inputFilter];\n if(!history) {\n continue;\n }\n\n const filtered = this.searchSuper.filterMessagesByType([message], inputFilter)\n .filter((message) => !history.find((m) => m.mid === message.mid && m.peerId === message.peerId));\n if(filtered.length) {\n history.unshift(...filtered.map((message) => ({mid: message.mid, peerId: message.peerId})));\n\n if(this.peerId === message.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 private async renderNewMessage(message: Message.message | Message.messageService) {\n if(this.init) return; // * not inited yet\n\n const {peerId} = message;\n const isForum = await this.managers.appPeersManager.isForum(peerId);\n const threadId = getMessageThreadId(message, isForum);\n\n this._renderNewMessage(message);\n if(threadId) {\n this._renderNewMessage(message, threadId);\n }\n }\n\n public _deleteDeletedMessages(historyStorage: SharedMediaHistoryStorage, peerId: PeerId, mids: number[]) {\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = historyStorage[inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex((m) => m.mid === mid);\n if(idx === -1) {\n continue;\n }\n\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n\n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n --this.searchSuper.usedFromHistory[inputFilter];\n }\n }\n\n // can have element in different tabs somehow\n // break;\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n const h = historiesStorage[peerId];\n if(!h) return;\n\n for(const threadId in h) {\n this._deleteDeletedMessages(h[threadId], peerId, mids);\n }\n\n this.scrollable.onScroll();\n }\n\n private async cleanupHTML() {\n // const perf = performance.now();\n const isAnyChat = this.peerId.isAnyChat();\n const [canViewMembers, hasRights] = await Promise.all([\n isAnyChat ? this.searchSuper.canViewMembers() : false,\n isAnyChat ? this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users') : false\n ]);\n\n return () => {\n this.profile.cleanupHTML();\n this.editBtn.classList.add('hide');\n this.searchSuper.cleanupHTML(true);\n this.container.classList.toggle('can-add-members', canViewMembers && hasRights);\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?: number) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId,\n threadId,\n historyStorage: (historiesStorage[peerId] ??= {})[threadId] ??= {}\n });\n\n this.profile.setPeer(peerId, threadId);\n\n return true;\n }\n\n private async changeTitleKey() {\n const isForum = this.managers.appPeersManager.isForum(this.peerId);\n\n return () => {\n this.titleI18n.compareAndUpdate({key: this.threadId && isForum ? 'AccDescrTopic' : 'Profile'});\n };\n }\n\n public async fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n const callbacks = await Promise.all([\n this.cleanupHTML(),\n this.toggleEditBtn(true),\n this.profile.fillProfileElements(),\n this.changeTitleKey()\n ]);\n\n return () => {\n callbacks.forEach((callback) => {\n callback?.();\n });\n };\n }\n\n private async toggleEditBtn(manual?: T): Promise void : void> {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && await this.managers.appUsersManager.isContact(this.peerId.toUserId());\n } else {\n show = await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'change_info');\n }\n\n const callback = () => {\n this.editBtn.classList.toggle('hide', !show);\n };\n\n return manual ? callback : callback() as any;\n }\n\n public loadSidebarMedia(single: boolean, justLoad?: boolean) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n super.onOpenAfterTimeout();\n\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n\n if(this.destroyable) {\n this.profile.destroy();\n this.searchSuper.destroy();\n }\n }\n\n public destroy() {\n this.destroyable = true;\n this.onCloseAfterTimeout();\n }\n}\n","/*\n * 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\ntype SetTransitionOptions = {\n element: HTMLElement,\n className: string,\n forwards: boolean,\n duration: number,\n onTransitionEnd?: () => void,\n useRafs?: number,\n onTransitionStart?: () => void\n};\nconst SetTransition = (options: SetTransitionOptions) => {\n const {element, className, forwards, duration, onTransitionEnd, onTransitionStart, useRafs} = options;\n const {timeout, raf} = element.dataset;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n // useRafs = undefined;\n // duration = 0;\n\n if(raf !== undefined) {\n window.cancelAnimationFrame(+raf);\n if(!useRafs) {\n delete element.dataset.raf;\n }\n }\n\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\n // return;\n // }\n\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\n delete element.dataset.raf;\n SetTransition({\n ...options,\n useRafs: useRafs - 1\n });\n });\n\n return;\n }\n\n if(forwards && className) {\n element.classList.add(className);\n }\n\n const afterTimeout = () => {\n delete element.dataset.timeout;\n if(!forwards && className) {\n element.classList.remove('backwards', className);\n }\n\n element.classList.remove('animating');\n\n onTransitionEnd?.();\n };\n\n onTransitionStart?.();\n if(!rootScope.settings.animationsEnabled || !duration) {\n element.classList.remove('animating', 'backwards');\n afterTimeout();\n return;\n }\n\n element.classList.add('animating');\n\n element.classList.toggle('backwards', !forwards);\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\n};\n\nexport default SetTransition;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {horizontalMenu} from './horizontalMenu';\nimport TransitionSlider from './transition';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport SliderSuperTab, {SliderSuperTabConstructable} from './sliderTab';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport {MaybePromise} from '../types';\n\nconst TRANSITION_TIME = 250;\n\nexport {SliderSuperTab};\n\nexport default class SidebarSlider {\n protected _selectTab: ReturnType;\n protected historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\n protected tabsContainer: HTMLElement;\n public sidebarEl: HTMLElement;\n protected tabs: Map; // * key is any, since right sidebar is ugly now\n private canHideFirst = false;\n private navigationType: NavigationItem['type'];\n protected managers: AppManagers;\n protected middlewareHelper: MiddlewareHelper;\n public onOpenTab: () => MaybePromise;\n\n constructor(options: {\n sidebarEl: SidebarSlider['sidebarEl'],\n tabs?: SidebarSlider['tabs'],\n canHideFirst?: SidebarSlider['canHideFirst'],\n navigationType: SidebarSlider['navigationType']\n }) {\n safeAssign(this, options);\n\n this.tabs ??= new Map();\n\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\n this._selectTab = TransitionSlider({\n content: this.tabsContainer,\n type: 'navigation',\n transitionTime: TRANSITION_TIME\n });\n if(!this.canHideFirst) {\n this._selectTab(0);\n }\n\n this.middlewareHelper = getMiddleware();\n\n // Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach((el) => {\n // attachClickEvent(el, this.onCloseBtnClick);\n // });\n }\n\n public getMiddleware() {\n return this.middlewareHelper.get();\n }\n\n public onCloseBtnClick = () => {\n const item = appNavigationController.findItemByType(this.navigationType);\n if(item) {\n appNavigationController.back(this.navigationType);\n } else if(this.historyTabIds.length) {\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\n }\n // this.closeTab();\n };\n\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\n this.removeTabFromHistory(id);\n return false;\n }\n\n // console.log('sidebar-close-button click:', this.historyTabIDs);\n const closingId = this.historyTabIds.pop(); // pop current\n this.onCloseTab(closingId, animate, isNavigation);\n\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\n return true;\n };\n\n public async selectTab(id: number | SliderSuperTab) {\n /* if(id instanceof SliderSuperTab) {\n id = id.id;\n } */\n\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\n return false;\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n this.onOpenTab && await this.onOpenTab();\n\n if(tab) {\n // @ts-ignore\n tab.onOpen?.();\n\n // @ts-ignore\n if(tab.onOpenAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onOpenAfterTimeout();\n }, TRANSITION_TIME);\n }\n }\n\n // if(!this.canHideFirst || this.historyTabIds.length) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.closeTab(undefined, canAnimate, true);\n return true;\n }\n });\n // }\n\n this.historyTabIds.push(id);\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\n return true;\n }\n\n public removeTabFromHistory(id: number | SliderSuperTab) {\n indexOfAndSplice(this.historyTabIds, id);\n this.onCloseTab(id, undefined);\n }\n\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\n const tab = this.historyTabIds[i];\n if(tab === preserveTab) continue;\n else if(tab instanceof tabConstructor) {\n break;\n }\n\n this.removeTabFromHistory(tab);\n // appNavigationController.removeByType(this.navigationType, true);\n }\n }\n\n public getTab(tabConstructor: SliderSuperTabConstructable) {\n return this.historyTabIds.find((t) => t instanceof tabConstructor) as T;\n }\n\n public getHistory() {\n return this.historyTabIds;\n }\n\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\n return !!this.getTab(tabConstructor);\n }\n\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\n if(!isNavigation) {\n appNavigationController.removeByType(this.navigationType, true);\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n if(tab) {\n try {\n // @ts-ignore\n tab.onClose?.();\n } catch(err) {\n console.error('tab onClose error', tab);\n }\n\n // @ts-ignore\n if(tab.onCloseAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onCloseAfterTimeout();\n }, TRANSITION_TIME + 30);\n }\n }\n }\n\n public addTab(tab: SliderSuperTab) {\n if(!tab.container.parentElement) {\n this.tabsContainer.append(tab.container);\n\n if(tab.closeBtn) {\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\n }\n }\n }\n\n public deleteTab(tab: SliderSuperTab) {\n this.tabs.delete(tab);\n }\n\n public createTab(\n ctor: SliderSuperTabConstructable,\n destroyable = true,\n doNotAppend?: boolean\n ) {\n const tab = new ctor(doNotAppend ? undefined : this, destroyable);\n tab.managers = this.managers;\n return tab;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport ButtonIcon from './buttonIcon';\nimport Scrollable from './scrollable';\nimport SidebarSlider from './slider';\n\nexport interface SliderSuperTabConstructable {\n new(slider: SidebarSlider, destroyable: boolean): T;\n}\n\nexport interface SliderSuperTabEventableConstructable {\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\n}\n\nexport default class SliderSuperTab {\n public static getInitArgs?(fromTab: SliderSuperTab): any;\n\n public container: HTMLElement;\n\n public header: HTMLElement;\n public closeBtn: HTMLElement;\n public title: HTMLElement;\n\n public content: HTMLElement;\n public scrollable: Scrollable;\n\n public slider: SidebarSlider;\n public destroyable: boolean;\n public listenerSetter: ListenerSetter;\n\n public managers: AppManagers;\n public middlewareHelper: MiddlewareHelper;\n\n constructor(slider: SidebarSlider, destroyable?: boolean) {\n this._constructor(slider, destroyable);\n }\n\n public _constructor(slider: SidebarSlider, destroyable = true): any {\n this.slider = slider;\n this.middlewareHelper = slider ? slider.getMiddleware().create() : getMiddleware();\n this.destroyable = destroyable;\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\n\n // * Header\n this.header = document.createElement('div');\n this.header.classList.add('sidebar-header');\n\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\n this.title = document.createElement('div');\n this.title.classList.add('sidebar-header__title');\n this.header.append(this.closeBtn, this.title);\n\n // * Content\n this.content = document.createElement('div');\n this.content.classList.add('sidebar-content');\n\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\n this.scrollable.attachBorderListeners(this.container);\n\n this.container.append(this.header, this.content);\n\n this.slider?.addTab(this);\n\n this.listenerSetter = new ListenerSetter();\n }\n\n public close() {\n return this.slider.closeTab(this);\n }\n\n public async open(...args: Parameters) {\n if(this.init) {\n try {\n const result = this.init(...args);\n this.init = null;\n\n if(result instanceof Promise) {\n await result;\n }\n } catch(err) {\n console.error('open tab error', err);\n }\n }\n\n this.slider.selectTab(this);\n }\n\n public init(...args: any[]): Promise | any {\n\n }\n\n protected onOpen() {}\n protected onOpenAfterTimeout() {}\n protected onClose() {}\n\n protected onCloseAfterTimeout() {\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\n this.slider?.deleteTab(this);\n this.container.remove();\n this.scrollable.destroy();\n this.listenerSetter?.removeAll();\n this.middlewareHelper?.destroy();\n }\n }\n\n protected setTitle(key: LangPackKey) {\n this.title.replaceChildren(i18n(key));\n }\n}\n\nexport class SliderSuperTabEventable extends SliderSuperTab {\n public eventListener: EventListenerBase<{\n destroy: () => void | Promise,\n destroyAfter: (promise: Promise) => void,\n close: () => void\n }>;\n\n constructor(slider: SidebarSlider) {\n super(slider);\n this.eventListener = new EventListenerBase();\n }\n\n onClose() {\n this.eventListener.dispatchEvent('close');\n }\n\n onCloseAfterTimeout() {\n const results = this.eventListener.dispatchResultableEvent('destroy');\n this.eventListener.dispatchEvent('destroyAfter', Promise.all(results).then(noop, noop));\n this.eventListener.cleanup();\n return super.onCloseAfterTimeout();\n }\n}\n\n/* // @ts-ignore\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\n superConstructor: (...args: any[]) => any;\n}\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\n constructor(slider: SidebarSlider) {\n this.superConstructor([slider, true]);\n }\n}\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\n\n(window as any).lol = SliderSuperEventsTab\n\nexport {SliderSuperEventsTab}; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, {AppDialogsManager, DialogDom, DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {fastRaf} from '../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n protected getIndex: (element: SortedUser) => number;\n protected onUpdate: (element: SortedUser) => void;\n protected managers: AppManagers;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n createChatListOptions: SortedUserList['createChatListOptions'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange'],\n getIndex: SortedUserList['getIndex'],\n onUpdate: SortedUserList['onUpdate']\n }> & {\n managers: SortedUserList['managers']\n }) {\n super({\n getIndex: options.getIndex || ((element) => this.managers.appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || (async(element) => {\n const status = getUserStatusString(await this.managers.appUsersManager.getUser(element.id));\n replaceContent(element.dom.lastMessageSpan, status);\n }),\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n await getHeavyAnimationPromise();\n\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {simulateClickEvent, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {doubleRaf} from '../helpers/schedulers';\nimport pause from '../helpers/schedulers/pause';\nimport windowSize from '../helpers/windowSize';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport getStickerEffectThumb from '../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport {CustomEmojiElement} from '../lib/richTextProcessor/wrapRichText';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport SetTransition from './singleTransition';\nimport wrapSticker from './wrappers/sticker';\nimport {STICKER_EFFECT_MULTIPLIER} from './wrappers/sticker';\n\nlet hasViewer = false;\nexport default function attachStickerViewerListeners({listenTo, listenerSetter, selector, findTarget: originalFindTarget}: {\n listenerSetter: ListenerSetter,\n listenTo: HTMLElement,\n selector?: string,\n findTarget?: (e: MouseEvent) => HTMLElement\n}) {\n if(IS_TOUCH_SUPPORTED) {\n return;\n }\n\n const findTarget = (e: MouseEvent, checkForParent?: boolean) => {\n let el: HTMLElement;\n if(originalFindTarget) el = originalFindTarget(e);\n else {\n const s = selector || `.media-sticker-wrapper`;\n el = (e.target as HTMLElement).closest(s) as HTMLElement;\n }\n\n return el && (!checkForParent || findUpAsChild(el, listenTo)) ? el : undefined;\n };\n\n const managers = rootScope.managers;\n\n listenerSetter.add(listenTo)('mousedown', (e) => {\n if(hasViewer || e.buttons > 1 || e.button !== 0) return;\n let mediaContainer = findTarget(e);\n if(!mediaContainer) {\n return;\n }\n\n // const img: HTMLImageElement = mediaContainer.querySelector('img.media-sticker');\n\n const docId = mediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n const className = 'sticker-viewer';\n const group: AnimationItemGroup = 'STICKER-VIEWER';\n const openDuration = 200;\n const switchDuration = 200;\n const previousGroup = animationIntersector.getOnlyOnePlayableGroup();\n const _middleware = getMiddleware();\n let container: HTMLElement, previousTransformer: HTMLElement;\n\n const doThatSticker = async({mediaContainer, doc, middleware, lockGroups, isSwitching}: {\n mediaContainer: HTMLElement,\n doc: MyDocument,\n middleware: Middleware,\n lockGroups?: boolean,\n isSwitching?: boolean\n }) => {\n const effectThumb = getStickerEffectThumb(doc);\n const mediaRect: DOMRect = mediaContainer.getBoundingClientRect();\n const s = makeMediaSize(doc.w, doc.h);\n const size = effectThumb ? 280 : 360;\n const boxSize = makeMediaSize(size, size);\n const fitted = mediaRect.width === mediaRect.height ? boxSize : s.aspectFitted(boxSize);\n\n const bubble = findUpClassName(mediaContainer, 'bubble');\n const isOut = bubble ? bubble.classList.contains('is-out') : true;\n\n const transformer = document.createElement('div');\n transformer.classList.add(className + '-transformer');\n\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add(className + '-sticker');\n /* transformer.style.width = */stickerContainer.style.width = fitted.width + 'px';\n /* transformer.style.height = */stickerContainer.style.height = fitted.height + 'px';\n\n const stickerEmoji = document.createElement('div');\n stickerEmoji.classList.add(className + '-emoji');\n stickerEmoji.append(wrapEmojiText(doc.stickerEmojiRaw));\n\n if(effectThumb) {\n const margin = (size * STICKER_EFFECT_MULTIPLIER - size) / 3 * (isOut ? 1 : -1);\n transformer.classList.add('has-effect');\n // const property = `--margin-${isOut ? 'right' : 'left'}`;\n // stickerContainer.style.setProperty(property, `${margin * 2}px`);\n transformer.style.setProperty('--translateX', `${margin}px`);\n stickerEmoji.style.setProperty('--translateX', `${-margin}px`);\n }\n\n const overflowElement = findUpClassName(mediaContainer, 'scrollable');\n const visibleRect = getVisibleRect(mediaContainer, overflowElement, true, mediaRect);\n if(visibleRect.overflow.vertical || visibleRect.overflow.horizontal) {\n stickerContainer.classList.add('is-overflow');\n }\n\n // if(img) {\n // const ratio = img.naturalWidth / img.naturalHeight;\n // if((mediaRect.width / mediaRect.height).toFixed(1) !== ratio.toFixed(1)) {\n\n // mediaRect = mediaRect.toJSON();\n // }\n // }\n\n const rect = mediaContainer.getBoundingClientRect();\n const scaleX = rect.width / fitted.width;\n const scaleY = rect.height / fitted.height;\n const transformX = rect.left - (windowSize.width - rect.width) / 2;\n const transformY = rect.top - (windowSize.height - rect.height) / 2;\n transformer.style.transform = `translate(${transformX}px, ${transformY}px) scale(${scaleX}, ${scaleY})`;\n if(isSwitching) transformer.classList.add('is-switching');\n transformer.append(stickerContainer, stickerEmoji);\n container.append(transformer);\n\n const o = await wrapSticker({\n doc,\n div: stickerContainer,\n group,\n width: fitted.width,\n height: fitted.height,\n play: false,\n loop: true,\n middleware,\n managers,\n needFadeIn: false,\n isOut,\n withThumb: false,\n relativeEffect: true,\n loopEffect: true\n }).then(({render}) => render);\n if(!middleware()) return;\n\n if(!container.parentElement) {\n document.body.append(container);\n }\n\n const player = Array.isArray(o) ? o[0] : o;\n\n const firstFramePromise = player instanceof RLottiePlayer ?\n new Promise((resolve) => player.addEventListener('firstFrame', resolve, {once: true})) :\n Promise.resolve();\n await Promise.all([firstFramePromise, doubleRaf()]);\n await pause(0); // ! need it because firstFrame will be called just from the loop\n if(!middleware()) return;\n\n if(lockGroups) {\n animationIntersector.setOnlyOnePlayableGroup(group);\n animationIntersector.checkAnimations2(true);\n }\n\n if(player instanceof RLottiePlayer) {\n const prevPlayer = mediaContainer instanceof CustomEmojiElement ?\n mediaContainer.player as RLottiePlayer :\n lottieLoader.getAnimation(mediaContainer);\n if(prevPlayer) {\n player.curFrame = prevPlayer.curFrame;\n player.play();\n await new Promise((resolve) => {\n let i = 0;\n const c = () => {\n if(++i === 2) {\n resolve();\n player.removeEventListener('enterFrame', c);\n }\n };\n\n player.addEventListener('enterFrame', c);\n });\n if(!middleware()) return;\n player.pause();\n }\n } else if(player instanceof HTMLVideoElement) {\n const prevPlayer = mediaContainer.querySelector('video');\n if(prevPlayer) {\n player.currentTime = prevPlayer.currentTime;\n }\n }\n\n return {\n ready: () => {\n if(player instanceof RLottiePlayer || player instanceof HTMLVideoElement) {\n player.play();\n }\n\n if(effectThumb) {\n simulateClickEvent(stickerContainer);\n }\n },\n transformer\n };\n };\n\n const timeout = window.setTimeout(async() => {\n document.removeEventListener('mousemove', onMousePreMove);\n\n container = document.createElement('div');\n container.classList.add(className);\n hasViewer = true;\n\n const middleware = _middleware.get();\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let result: Awaited>;\n try {\n result = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n lockGroups: true\n });\n if(!result) return;\n } catch(err) {\n return;\n }\n\n const {ready, transformer} = result;\n\n previousTransformer = transformer;\n\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: true,\n duration: openDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n\n document.addEventListener('mousemove', onMouseMove);\n }, 125);\n\n const onMouseMove = async(e: MouseEvent) => {\n const newMediaContainer = findTarget(e, true);\n if(!newMediaContainer || mediaContainer === newMediaContainer) {\n return;\n }\n\n const docId = newMediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n mediaContainer = newMediaContainer;\n _middleware.clean();\n const middleware = _middleware.get();\n\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let r: Awaited>;\n try {\n r = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n isSwitching: true\n });\n if(!r) return;\n } catch(err) {\n console.error('sticker viewer error', err);\n return;\n }\n\n const {ready, transformer} = r;\n\n const _previousTransformer = previousTransformer;\n SetTransition({\n element: _previousTransformer,\n className: 'is-switching',\n forwards: true,\n duration: switchDuration,\n onTransitionEnd: () => {\n _previousTransformer.remove();\n }\n });\n\n previousTransformer = transformer;\n\n SetTransition({\n element: transformer,\n className: 'is-switching',\n forwards: false,\n duration: switchDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n };\n\n const onMousePreMove = (e: MouseEvent) => {\n if(!findUpAsChild(e.target as HTMLElement, mediaContainer)) {\n onMouseUp();\n }\n };\n\n const onMouseUp = () => {\n clearTimeout(timeout);\n _middleware.clean();\n\n if(container) {\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: false,\n duration: openDuration,\n onTransitionEnd: () => {\n container.remove();\n animationIntersector.setOnlyOnePlayableGroup(previousGroup);\n animationIntersector.checkAnimations2(false);\n hasViewer = false;\n }\n });\n\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n document.removeEventListener('mousemove', onMousePreMove);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp, {capture: true});\n };\n\n document.addEventListener('mousemove', onMousePreMove);\n document.addEventListener('mouseup', onMouseUp, {once: true, capture: 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\nexport default class StickyIntersector {\n private headersObserver: IntersectionObserver;\n private elementsObserver: IntersectionObserver;\n\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\n this.observeHeaders();\n this.observeElements();\n }\n\n /**\n * Sets up an intersection observer to notify when elements with the class\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\n * @param {!Element} container\n */\n private observeHeaders() {\n this.headersObserver = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const targetInfo = entry.boundingClientRect;\n const stickyTarget = entry.target.parentElement;\n const rootBoundsInfo = entry.rootBounds;\n\n // Started sticking.\n if(targetInfo.bottom < rootBoundsInfo.top) {\n this.handler(true, stickyTarget);\n }\n\n // Stopped sticking.\n if(targetInfo.bottom >= rootBoundsInfo.top &&\n targetInfo.bottom < rootBoundsInfo.bottom) {\n this.handler(false, stickyTarget);\n }\n }\n }, {threshold: 0, root: this.container});\n }\n\n private observeElements() {\n this.elementsObserver = new IntersectionObserver((entries) => {\n const entry = entries\n .filter((entry) => entry.boundingClientRect.top < entry.rootBounds.top)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\n if(!entry) return;\n\n const container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\n this.handler(true, container as HTMLElement);\n }, {root: this.container});\n }\n\n /**\n * @param {!Element} container\n * @param {string} className\n */\n private addSentinel(container: HTMLElement, className: string) {\n const sentinel = document.createElement('div');\n sentinel.classList.add('sticky_sentinel', className);\n return container.appendChild(sentinel);\n }\n\n /**\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\n * Note: the elements should be children of `container`.\n * @param {!Element} container\n */\n public observeStickyHeaderChanges(element: HTMLElement) {\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\n this.headersObserver.observe(headerSentinel);\n\n this.elementsObserver.observe(element);\n }\n\n public disconnect() {\n this.headersObserver.disconnect();\n this.elementsObserver.disconnect();\n }\n\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\n this.elementsObserver.unobserve(element);\n this.headersObserver.unobserve(headerSentinel);\n }\n}\n","/*\n * 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 IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from '../helpers/object/safeAssign';\nimport contextMenuController from '../helpers/contextMenuController';\nimport {Middleware} from '../helpers/middleware';\nimport ListenerSetter, {ListenerOptions} from '../helpers/listenerSetter';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\n\nconst getEvent = (e: TouchEvent | MouseEvent) => {\n return (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent;\n};\n\nconst attachGlobalListenerTo = window;\n\nlet RESET_GLOBAL = false;\ncontextMenuController.addEventListener('toggle', (visible) => {\n RESET_GLOBAL = visible;\n});\n\nexport type SwipeHandlerOptions = {\n element: SwipeHandler['element'],\n onSwipe: SwipeHandler['onSwipe'],\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\n onReset?: SwipeHandler['onReset'],\n cursor?: SwipeHandler['cursor'],\n cancelEvent?: SwipeHandler['cancelEvent'],\n listenerOptions?: SwipeHandler['listenerOptions'],\n setCursorTo?: HTMLElement,\n middleware?: Middleware,\n withDelay?: boolean\n};\n\nconst TOUCH_MOVE_OPTIONS: ListenerOptions = {passive: false, capture: true};\nconst MOUSE_MOVE_OPTIONS: ListenerOptions = false as any;\n\nexport default class SwipeHandler {\n private element: HTMLElement;\n private onSwipe: (xDiff: number, yDiff: number, e: TouchEvent | MouseEvent) => boolean | void;\n private verifyTouchTarget: (evt: TouchEvent | MouseEvent) => boolean | Promise;\n private onFirstSwipe: (e: TouchEvent | MouseEvent) => void;\n private onReset: () => void;\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';\n private cancelEvent = true;\n private listenerOptions: boolean | AddEventListenerOptions = false;\n private setCursorTo: HTMLElement;\n\n private hadMove = false;\n private xDown: number = null;\n private yDown: number = null;\n\n private withDelay: boolean;\n private listenerSetter: ListenerSetter;\n\n constructor(options: SwipeHandlerOptions) {\n safeAssign(this, options);\n\n this.setCursorTo ??= this.element;\n this.listenerSetter = new ListenerSetter();\n this.setListeners();\n\n options.middleware?.onDestroy(() => {\n this.reset();\n this.removeListeners();\n });\n }\n\n public setListeners() {\n if(!IS_TOUCH_SUPPORTED) {\n this.listenerSetter.add(this.element)('mousedown', this.handleStart, this.listenerOptions);\n this.listenerSetter.add(attachGlobalListenerTo)('mouseup', this.reset);\n } else {\n if(this.withDelay) {\n attachContextMenuListener(this.element, this.handleStart, this.listenerSetter);\n } else {\n this.listenerSetter.add(this.element)('touchstart', this.handleStart, this.listenerOptions);\n }\n\n this.listenerSetter.add(attachGlobalListenerTo)('touchend', this.reset);\n }\n }\n\n public removeListeners() {\n this.listenerSetter.removeAll();\n }\n\n public setCursor(cursor: SwipeHandler['cursor'] = '') {\n this.cursor = cursor;\n\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n }\n\n reset = (e?: Event) => {\n /* if(e) {\n cancelEvent(e);\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n this.setCursorTo.style.cursor = '';\n }\n\n if(this.hadMove) {\n this.onReset?.();\n }\n\n this.xDown = this.yDown = null;\n this.hadMove = false;\n };\n\n handleStart = async(_e: TouchEvent | MouseEvent) => {\n const e = getEvent(_e);\n if(this.verifyTouchTarget && !(await this.verifyTouchTarget(_e))) {\n return this.reset();\n }\n\n this.xDown = e.clientX;\n this.yDown = e.clientY;\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.add(attachGlobalListenerTo)('touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n this.listenerSetter.add(attachGlobalListenerTo)('mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n }\n };\n\n handleMove = (_e: TouchEvent | MouseEvent) => {\n if(this.xDown === null || this.yDown === null || RESET_GLOBAL) {\n this.reset();\n return;\n }\n\n if(this.cancelEvent) {\n cancelEvent(_e);\n }\n\n const e = getEvent(_e);\n const xUp = e.clientX;\n const yUp = e.clientY;\n\n const xDiff = this.xDown - xUp;\n const yDiff = this.yDown - yUp;\n\n if(!this.hadMove) {\n if(!xDiff && !yDiff) {\n return;\n }\n\n this.hadMove = true;\n\n if(!IS_TOUCH_SUPPORTED) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n\n this.onFirstSwipe?.(_e);\n }\n\n // if(Math.abs(xDiff) > Math.abs(yDiff)) { /*most significant*/\n // if(xDiff > 0) { /* left swipe */\n\n // } else { /* right swipe */\n\n // }\n // } else {\n // if(yDiff > 0) { /* up swipe */\n\n // } else { /* down swipe */\n\n // }\n // }\n\n /* reset values */\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\n if(onSwipeResult !== undefined && onSwipeResult) {\n this.reset();\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 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 const 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","/*\n * 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 OverlayClickHandler from '../helpers/overlayClickHandler';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\n\nconst toastEl = document.createElement('div');\ntoastEl.classList.add('toast');\nlet timeout: number;\n\nconst x = new OverlayClickHandler('toast');\nx.addEventListener('toggle', (open) => {\n if(!open) {\n hideToast();\n }\n});\n\nexport function hideToast() {\n x.close();\n\n toastEl.classList.remove('is-visible');\n timeout && clearTimeout(+timeout);\n\n timeout = window.setTimeout(() => {\n toastEl.remove();\n timeout = undefined;\n }, 200);\n}\n\nexport function toast(content: string | Node, onClose?: () => void) {\n x.close();\n\n replaceContent(toastEl, content);\n\n if(!toastEl.parentElement) {\n document.body.append(toastEl);\n void toastEl.offsetLeft; // reflow\n }\n\n toastEl.classList.add('is-visible');\n\n timeout && clearTimeout(+timeout);\n x.open(toastEl);\n\n timeout = window.setTimeout(hideToast, 3000);\n\n if(onClose) {\n x.addEventListener('toggle', onClose, {once: true});\n }\n}\n\nexport function toastNew(options: Partial<{\n langPackKey: LangPackKey,\n langPackArguments: FormatterArguments,\n onClose: () => void\n}>) {\n toast(i18n(options.langPackKey, options.langPackArguments), options.onClose);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport whichChild from '../helpers/dom/whichChild';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\n\nfunction makeTransitionFunction(options: TransitionFunction) {\n return options;\n}\n\nconst slideNavigation = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n const width = prevTabContent.getBoundingClientRect().width;\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.filter = `brightness(80%)`;\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n tabContent.style.filter = '';\n\n return () => {\n prevTabContent.style.transform = prevTabContent.style.filter = '';\n };\n },\n animateFirst: false\n});\n\nconst slideTabs = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\n // scrollableContainer.style.overflowY = 'hidden';\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\n // // this.container.classList.add('sliding');\n // }\n\n // window.requestAnimationFrame(() => {\n const width = prevTabContent.getBoundingClientRect().width;\n /* tabContent.style.setProperty('--width', width + 'px');\n prevTabContent.style.setProperty('--width', width + 'px');\n\n tabContent.classList.add('active'); */\n // void tabContent.offsetWidth; // reflow\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n // });\n\n return () => {\n prevTabContent.style.transform = '';\n\n // if(scrollableContainer) {\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\n // scrollableContainer.style.display = 'none';\n // }\n\n // scrollableContainer.style.overflowY = '';\n\n // if(isSafari) {\n // void scrollableContainer.offsetLeft; // reflow\n // scrollableContainer.style.display = '';\n // }\n\n // // scrollableContainer.style.paddingRight = '0';\n // // this.container.classList.remove('sliding');\n // }\n };\n },\n animateFirst: false\n});\n\nconst slideTopics = makeTransitionFunction({\n callback: (tabContent, prevTabContent) => {\n const rect = tabContent.getBoundingClientRect();\n const offsetX = rect.width - 80;\n\n tabContent.style.transform = `transformX(${offsetX}px)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n\n return () => {};\n },\n animateFirst: true\n});\n\nconst transitions: {[type in TransitionSliderType]?: TransitionFunction} = {\n navigation: slideNavigation,\n tabs: slideTabs\n // topics: slideTopics\n};\n\ntype TransitionSliderType = 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'topics' | 'none'/* | 'counter' */;\n\ntype TransitionSliderOptions = {\n content: HTMLElement,\n type: TransitionSliderType,\n transitionTime: number,\n onTransitionEnd?: (id: number) => void,\n isHeavy?: boolean,\n once?: boolean,\n withAnimationListener?: boolean,\n listenerSetter?: ListenerSetter,\n animateFirst?: boolean\n};\n\ntype TransitionFunction = {\n callback: (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => () => void,\n animateFirst: boolean\n};\n\nconst TransitionSlider = (options: TransitionSliderOptions) => {\n let {\n content,\n type,\n transitionTime,\n onTransitionEnd,\n isHeavy = true,\n once = false,\n withAnimationListener = true,\n listenerSetter,\n animateFirst = false\n } = options;\n\n const {callback: animationFunction, animateFirst: _animateFirst} = transitions[type] || {};\n content.dataset.animation = type;\n\n if(_animateFirst !== undefined) {\n animateFirst = _animateFirst;\n }\n\n const onTransitionEndCallbacks: Map = new Map();\n let animationDeferred: CancellablePromise;\n // let animationStarted = 0;\n let from: HTMLElement = null;\n\n if(withAnimationListener) {\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\n\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\n cancelEvent(e);\n\n if((e.target as HTMLElement).parentElement !== content) {\n return;\n }\n\n // console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\n\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\n callback?.();\n\n if(e.target !== from) {\n return;\n }\n\n if(!animationDeferred && isHeavy) return;\n\n if(animationDeferred) {\n animationDeferred.resolve();\n animationDeferred = undefined;\n }\n\n onTransitionEnd?.(selectTab.prevId());\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n if(once) {\n if(listenerSetter) listenerSetter.removeManual(content, listenerName, onEndEvent);\n else content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\n from = animationDeferred = undefined;\n onTransitionEndCallbacks.clear();\n }\n };\n\n // TODO: check for transition type (transform, etc) using by animationFunction\n if(listenerSetter) listenerSetter.add(content)(listenerName, onEndEvent);\n else content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\n }\n\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\n if(overrideFrom) {\n from = overrideFrom;\n }\n\n if(id instanceof HTMLElement) {\n id = whichChild(id);\n }\n\n const prevId = selectTab.prevId();\n if(id === prevId) return false;\n\n // console.log('selectTab id:', id);\n\n const to = content.children[id] as HTMLElement;\n\n if(!rootScope.settings.animationsEnabled || (prevId === -1 && !animateFirst)) {\n animate = false;\n }\n\n if(!withAnimationListener) {\n const timeout = content.dataset.timeout;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n delete content.dataset.timeout;\n }\n\n if(!animate) {\n if(from) from.classList.remove('active', 'to', 'from');\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\n const callback = onTransitionEndCallbacks.get(to);\n callback?.();\n }\n\n if(to) {\n to.classList.remove('to', 'from');\n to.classList.add('active');\n }\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n from = to;\n\n onTransitionEnd?.(id);\n return;\n }\n\n if(!withAnimationListener) {\n content.dataset.timeout = '' + window.setTimeout(() => {\n to.classList.remove('to');\n from && from.classList.remove('from');\n content.classList.remove('animating', 'backwards', 'disable-hover');\n delete content.dataset.timeout;\n }, transitionTime);\n }\n\n if(from) {\n from.classList.remove('to');\n from.classList.add('from');\n }\n\n content.classList.add('animating'/* , 'disable-hover' */);\n const toRight = prevId < id;\n content.classList.toggle('backwards', !toRight);\n\n let onTransitionEndCallback: ReturnType;\n if(!to) {\n // prevTabContent.classList.remove('active');\n } else {\n if(animationFunction) {\n onTransitionEndCallback = animationFunction(to, from, toRight);\n } else {\n to.classList.add('active');\n }\n\n to.classList.remove('from');\n to.classList.add('to');\n }\n\n if(to) {\n const transitionTimeout = to.dataset.transitionTimeout;\n if(transitionTimeout) {\n clearTimeout(+transitionTimeout);\n }\n\n onTransitionEndCallbacks.set(to, () => {\n to.classList.remove('to');\n onTransitionEndCallbacks.delete(to);\n });\n }\n\n if(from/* && false */) {\n let timeout: number;\n const _from = from;\n const callback = () => {\n clearTimeout(timeout);\n _from.classList.remove('active', 'from');\n\n onTransitionEndCallback?.();\n\n onTransitionEndCallbacks.delete(_from);\n };\n\n if(to) {\n timeout = window.setTimeout(callback, transitionTime + 100); // something happened to container\n onTransitionEndCallbacks.set(_from, callback);\n } else {\n timeout = window.setTimeout(callback, transitionTime);\n onTransitionEndCallbacks.set(_from, () => {\n clearTimeout(timeout);\n onTransitionEndCallbacks.delete(_from);\n });\n }\n\n _from.dataset.transitionTimeout = '' + timeout;\n\n if(isHeavy) {\n if(!animationDeferred) {\n animationDeferred = deferredPromise();\n // animationStarted = performance.now();\n }\n\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\n }\n }\n\n from = to;\n }\n\n // selectTab.prevId = -1;\n selectTab.prevId = () => from ? whichChild(from) : -1;\n selectTab.getFrom = () => from;\n selectTab.setFrom = (_from: HTMLElement) => from = _from;\n\n return selectTab;\n};\n\nexport default TransitionSlider;\n","export default function isUsernameValid(username: string) {\n return ((username.length >= 3 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ListenerSetter from '../helpers/listenerSetter';\nimport debounce from '../helpers/schedulers/debounce';\nimport {LangPackKey} from '../lib/langPack';\nimport InputField, {InputFieldOptions, InputState} from './inputField';\nimport isUsernameValid from '../lib/richTextProcessor/isUsernameValid';\nimport {AppManagers} from '../lib/appManagers/managers';\n\nexport class UsernameInputField extends InputField {\n private checkUsernamePromise: Promise;\n private checkUsernameDebounced: (username: string) => void;\n public options: InputFieldOptions & {\n peerId?: PeerId,\n listenerSetter: ListenerSetter,\n onChange?: () => void,\n invalidText: LangPackKey,\n takenText: LangPackKey,\n availableText: LangPackKey,\n head?: string\n };\n public error: ApiError;\n\n constructor(\n options: UsernameInputField['options'],\n private managers: AppManagers\n ) {\n super(options);\n\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\n\n options.listenerSetter.add(this.input)('input', () => {\n const value = this.getValue();\n\n this.error = undefined;\n if(value === this.originalValue || !value.length) {\n this.setState(InputState.Neutral);\n this.options.onChange?.();\n return;\n } else if(!isUsernameValid(value)) { // does not check the last underscore\n this.setError(this.options.invalidText);\n } else {\n this.setState(InputState.Neutral);\n }\n\n if(this.input.classList.contains('error')) {\n this.options.onChange?.();\n return;\n }\n\n this.checkUsernameDebounced(value);\n });\n }\n\n public getValue() {\n let value = this.value;\n if(this.options.head) {\n value = value.slice(this.options.head.length);\n this.setValueSilently(this.options.head + value);\n }\n\n return value;\n }\n\n private checkUsername(username: string) {\n if(this.checkUsernamePromise) return;\n\n this.error = undefined;\n let checkPromise: Promise\n if(this.options.peerId) {\n checkPromise = this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(), username);\n } else {\n checkPromise = this.managers.appUsersManager.checkUsername(username);\n }\n\n const promise = this.checkUsernamePromise = checkPromise.then((available) => {\n if(this.getValue() !== username) return;\n\n if(available) {\n this.setState(InputState.Valid, this.options.availableText);\n } else {\n this.setError(this.options.takenText);\n }\n }, (err) => {\n if(this.getValue() !== username) return;\n\n this.error = err;\n switch((err as ApiError).type) {\n case 'USERNAME_PURCHASE_AVAILABLE': {\n this.setError(this.options.takenText);\n break;\n }\n\n case 'USERNAME_INVALID':\n default: {\n this.setError(this.options.invalidText);\n break;\n }\n }\n }).then(() => {\n if(this.checkUsernamePromise === promise) {\n this.checkUsernamePromise = undefined;\n }\n\n this.options.onChange?.();\n\n const value = this.getValue();\n if(value !== username && this.isValidToChange() && isUsernameValid(value)) {\n this.checkUsername(value);\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_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport whichChild from '../helpers/dom/whichChild';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {Middleware} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport clamp from '../helpers/number/clamp';\nimport pause from '../helpers/schedulers/pause';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport {Chat, User, Username} from '../layer';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport confirmationPopup from './confirmationPopup';\nimport Row from './row';\nimport SettingSection from './settingSection';\nimport SwipeHandler from './swipeHandler';\nimport {UsernameInputField} from './usernameInputField';\n\nexport default class UsernamesSection extends SettingSection {\n // public section: SettingSection;\n\n constructor(options: {\n peerId: PeerId,\n peer: Chat.channel | User.user,\n listenerSetter: ListenerSetter,\n usernameInputField: UsernameInputField,\n middleware: Middleware\n }) {\n /* const section = this.section = new SettingSection */super({\n name: 'UsernamesProfileHeader',\n caption: !options.peerId.isUser() ? 'UsernamesChannelHelp' : 'UsernamesProfileHelp'\n });\n\n const {peerId, peer, usernameInputField, listenerSetter, middleware} = options;\n const managers = rootScope.managers;\n const channelId = peerId.isUser() ? undefined : peerId.toChatId();\n\n const section = this;\n\n const CLASS_NAME = 'usernames';\n const list = document.createElement('div');\n list.classList.add(CLASS_NAME);\n\n let _usernames: Username[];\n\n interface SortedUsername extends SortedElementBase {\n row: Row\n }\n\n const sortedList = new SortedList({\n getIndex: (element) => _usernames.length - _usernames.findIndex((username) => username.username === element.id),\n onDelete: (element) => {\n element.row.container.remove();\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.row.container, list, idx);\n },\n onElementCreate: (base) => {\n const username = _usernames.find((username) => username.username === base.id);\n const row = new Row({\n title: '@' + username.username,\n subtitle: true,\n clickable: true\n });\n\n const editable = !!username.pFlags.editable;\n const active = !!username.pFlags.active;\n\n if(editable) row.container.dataset.editable = '1';\n row.container.dataset.username = username.username;\n row.container.classList.add(CLASS_NAME + '-username');\n row.subtitle.classList.add(CLASS_NAME + '-username-status');\n const media = row.createMedia('medium');\n media.classList.add(CLASS_NAME + '-username-icon', 'tgico');\n\n const sortIcon = document.createElement('span');\n row.container.classList.add('row-sortable', 'tgico');\n sortIcon.classList.add('row-sortable-icon', 'tgico-menu');\n row.container.append(sortIcon);\n\n changeActive(row, active);\n\n (base as SortedUsername).row = row;\n\n return base as SortedUsername;\n }\n });\n\n const changeActive = (row: Row, active: boolean) => {\n row.subtitle.replaceChildren(i18n(row.container.dataset.editable ? 'UsernameLinkEditable' : (active ? 'UsernameLinkActive' : 'UsernameLinkInactive')));\n row.container.classList.toggle('active', active);\n row.container.classList.toggle('cant-sort', !active);\n };\n\n const applyUsernames = (usernames: Username[] = []) => {\n _usernames = usernames;\n\n sortedList.getAll().forEach((element) => {\n if(!usernames.some((username) => username.username === element.id)) {\n sortedList.delete(element.id);\n }\n });\n\n usernames.forEach((username) => {\n if(!sortedList.has(username.username)) {\n sortedList.add(username.username);\n } else {\n const element = sortedList.get(username.username);\n sortedList.update(username.username, element);\n changeActive(element.row, !!username.pFlags.active);\n }\n });\n\n section.container.classList.toggle('hide', !sortedList.getAll().size);\n };\n\n applyUsernames(peer.usernames);\n\n listenerSetter.add(rootScope)('peer_title_edit', async({peerId: _peerId}) => {\n if(_peerId !== peerId) {\n return;\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n applyUsernames((peer as User.user).usernames);\n });\n\n let cancelClick = false;\n attachClickEvent(list, async(e) => {\n if(cancelClick) {\n cancelClick = false;\n return;\n }\n\n const container = findUpAsChild(e.target as HTMLElement, list);\n if(!container) {\n return;\n }\n\n if(container.dataset.editable) {\n placeCaretAtEnd(usernameInputField.input, true, true);\n return;\n }\n\n const username = container.dataset.username;\n\n const active = container.classList.contains('active');\n let titleLangKey: LangPackKey, descriptionLangKey: LangPackKey;\n if(active) {\n titleLangKey = 'UsernameDeactivateLink';\n descriptionLangKey = channelId ? 'UsernameDeactivateLinkChannelMessage' : 'UsernameDeactivateLinkProfileMessage';\n } else {\n titleLangKey = 'UsernameActivateLink';\n descriptionLangKey = channelId ? 'UsernameActivateLinkChannelMessage' : 'UsernameActivateLinkProfileMessage';\n }\n\n try {\n await confirmationPopup({\n titleLangKey,\n descriptionLangKey,\n button: {\n langKey: active ? 'Hide' : 'Show'\n }\n });\n } catch(err) {\n return;\n }\n\n const newActive = !active;\n let promise: Promise;\n if(channelId) {\n promise = managers.appChatsManager.toggleUsername(channelId, username, newActive);\n } else {\n promise = managers.appUsersManager.toggleUsername(username, newActive);\n }\n\n promise.catch((err: ApiError) => {\n if(err.type === 'USERNAMES_ACTIVE_TOO_MUCH') {\n confirmationPopup({\n titleLangKey: 'UsernameActivateErrorTitle',\n descriptionLangKey: 'UsernameActivateErrorMessage',\n button: {langKey: 'OK', isCancel: true}\n }).catch(noop);\n } else {\n console.error('turn username error', err);\n }\n });\n });\n\n const getSortableTarget = (target: HTMLElement) => {\n if(!target) {\n return;\n }\n\n let child = findUpAsChild(target as HTMLElement, list);\n if(child && child.classList.contains('cant-sort')) {\n child = undefined;\n }\n\n return child;\n };\n\n let element: HTMLElement,\n elementRect: DOMRect,\n containerRect: DOMRect,\n minY: number,\n maxY: number,\n siblings: HTMLElement[];\n const swipeHandler = new SwipeHandler({\n element: list,\n onSwipe: (xDiff, yDiff) => {\n yDiff = clamp(-yDiff, minY, maxY);\n element.style.transform = `translateY(${yDiff}px)`;\n const count = Math.round(Math.abs(yDiff) / elementRect.height);\n const lastSiblings = siblings;\n siblings = [];\n const property = yDiff < 0 ? 'previousElementSibling' : 'nextElementSibling';\n let sibling = element[property] as HTMLElement;\n for(let i = 0; i < count; ++i) {\n if(getSortableTarget(sibling)) {\n siblings.push(sibling);\n sibling = sibling[property] as HTMLElement;\n } else {\n break;\n }\n }\n\n (lastSiblings || []).forEach((sibling) => {\n if(!siblings.includes(sibling)) {\n sibling.style.transform = '';\n }\n });\n\n siblings.forEach((sibling) => {\n const y = elementRect.height * (yDiff < 0 ? 1 : -1);\n sibling.style.transform = `translateY(${y}px)`;\n });\n },\n verifyTouchTarget: (e) => {\n if(list.classList.contains('is-reordering')) {\n return false;\n }\n\n element = getSortableTarget(e.target as HTMLElement);\n return !!element/* && pause(150).then(() => true) */;\n },\n onFirstSwipe: () => {\n list.classList.add('is-reordering');\n element.classList.add('is-dragging', 'no-transition');\n swipeHandler.setCursor('grabbing');\n elementRect = element.getBoundingClientRect();\n containerRect = list.getBoundingClientRect();\n\n minY = containerRect.top - elementRect.top;\n maxY = containerRect.bottom - elementRect.bottom;\n },\n onReset: async() => {\n const length = siblings.length;\n const move = length && length * (siblings[0].previousElementSibling === element ? 1 : -1);\n const idx = whichChild(element);\n const newIdx = idx + move;\n\n element.classList.remove('no-transition');\n element.style.transform = move ? `translateY(${move * elementRect.height}px)` : '';\n swipeHandler.setCursor('');\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n if(rootScope.settings.animationsEnabled) {\n await pause(250);\n }\n\n list.classList.remove('is-reordering');\n element.classList.remove('is-dragging');\n positionElementByIndex(element, list, newIdx, idx);\n [element, ...siblings].forEach((element) => {\n element.style.transform = '';\n });\n\n element =\n siblings =\n elementRect =\n containerRect =\n minY =\n maxY =\n undefined;\n\n // cancelClick = true;\n\n if(!move) {\n return;\n }\n\n const username = _usernames.splice(idx, 1)[0];\n _usernames.splice(newIdx, 0, username);\n sortedList.updateList();\n // can't just update particular element, have to change indexes\n // sortedList.update(username.username);\n\n const usernames = _usernames.filter((username) => username.pFlags.active).map((username) => username.username);\n if(channelId) {\n managers.appChatsManager.reorderUsernames(channelId, usernames);\n } else {\n managers.appUsersManager.reorderUsernames(usernames);\n }\n },\n setCursorTo: document.body,\n middleware: middleware,\n withDelay: true\n });\n\n section.content.append(list);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\ntype TargetType = HTMLElement;\nexport type OnVisibilityChangeItem = {target: TargetType, visible: boolean, entry: IntersectionObserverEntry, index: number};\nexport type OnVisibilityChange = (item: OnVisibilityChangeItem) => void;\n\nexport default class VisibilityIntersector {\n private observer: IntersectionObserver;\n private items: Map = new Map();\n private locked = false;\n\n constructor(onVisibilityChange: OnVisibilityChange, options?: IntersectionObserverInit) {\n this.observer = new IntersectionObserver((entries) => {\n if(this.locked) {\n return;\n }\n\n const changed: OnVisibilityChangeItem[] = [];\n\n entries.forEach((entry, index) => {\n const target = entry.target as TargetType;\n\n if(this.items.get(target) === entry.isIntersecting) {\n return;\n } else {\n this.items.set(target, entry.isIntersecting);\n }\n\n /* if(entry.isIntersecting) {\n console.log('ooo', entry);\n } */\n\n /* if(this.locked) {\n return;\n } */\n\n const change: typeof changed[0] = {target, visible: entry.isIntersecting, entry, index};\n\n // ! order will be incorrect so can't use it\n // changed[entry.isIntersecting ? 'unshift' : 'push'](change);\n changed.push(change);\n\n // onVisibilityChange(target, entry.isIntersecting);\n });\n\n changed.forEach((item) => {\n onVisibilityChange(item);\n });\n }, options);\n }\n\n public getVisible() {\n const items: TargetType[] = [];\n this.items.forEach((value, key) => {\n if(value) {\n items.push(key);\n }\n });\n\n return items;\n }\n\n public clearVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.items.set(target, false);\n }\n }\n\n public isVisible(target: TargetType) {\n return this.items.get(target);\n }\n\n public disconnect() {\n this.observer.disconnect();\n this.items.clear();\n }\n\n public refresh() {\n this.observer.disconnect();\n\n // window.requestAnimationFrame(() => {\n const targets = [...this.items.keys()];\n for(const target of targets) {\n // this.items.set(target, false);\n this.observer.observe(target);\n }\n // });\n }\n\n public refreshVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.observer.unobserve(target);\n }\n\n for(const target of visible) {\n this.observer.observe(target);\n }\n }\n\n public observe(target: TargetType) {\n this.items.set(target, false);\n this.observer.observe(target);\n }\n\n public unobserve(target: TargetType) {\n this.observer.unobserve(target);\n this.items.delete(target);\n }\n\n public unlock() {\n this.locked = false;\n }\n\n public unlockAndRefresh() {\n this.unlock();\n this.refresh();\n }\n\n public lock() {\n this.locked = 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 cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport rootScope from '../lib/rootScope';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class VolumeSelector extends RangeSelector {\n private static ICONS = ['volume_off', 'volume_mute', 'volume_down', 'volume_up'];\n public btn: HTMLElement;\n protected icon: HTMLSpanElement;\n\n constructor(protected listenerSetter: ListenerSetter, protected vertical = false) {\n super({\n step: 0.01,\n min: 0,\n max: 1,\n vertical\n }, 1);\n\n this.setListeners();\n this.setHandlers({\n onScrub: currentTime => {\n const value = Math.max(Math.min(currentTime, 1), 0);\n\n // console.log('volume scrub:', currentTime, value);\n\n appMediaPlaybackController.muted = false;\n appMediaPlaybackController.volume = value;\n }\n\n /* onMouseUp: (e) => {\n cancelEvent(e.event);\n } */\n });\n\n const className = 'player-volume';\n const btn = this.btn = document.createElement('div');\n btn.classList.add('btn-icon', className);\n const icon = this.icon = document.createElement('span');\n icon.classList.add(className + '__icon');\n\n btn.append(icon, this.container);\n\n attachClickEvent(icon, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n public setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n let iconIndex: number;\n if(!volume || muted) {\n iconIndex = 0;\n } else if(volume > .5) {\n iconIndex = 3;\n } else if(volume > 0 && volume < .25) {\n iconIndex = 1;\n } else {\n iconIndex = 2;\n }\n\n VolumeSelector.ICONS.forEach((icon) => this.icon.classList.remove('tgico-' + icon));\n this.icon.classList.add('tgico-' + VolumeSelector.ICONS[iconIndex]);\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapCustomEmoji({\n docIds,\n loadPromises,\n middleware,\n lazyLoadQueue,\n customEmojiSize,\n animationGroup\n}: {\n docIds: DocId[],\n loadPromises?: Promise[]\n} & WrapSomethingOptions) {\n const text = ' '.repeat(docIds.length);\n const entities: MessageEntity[] = [];\n docIds.forEach((docId, idx) => {\n entities.push({\n _: 'messageEntityCustomEmoji',\n offset: idx,\n length: 1,\n document_id: docId\n });\n });\n\n const wrapped = wrapRichText(text, {\n entities,\n loadPromises,\n animationGroup,\n customEmojiSize,\n middleware,\n lazyLoadQueue\n });\n\n return wrapped;\n}\n\nexport function wrapCustomEmojiAwaited(options: Parameters[0]) {\n const loadPromises: Promise[] = options.loadPromises ??= [];\n const wrapped = wrapCustomEmoji(options);\n return Promise.all(loadPromises).then(() => wrapped);\n}\n","/*\n * 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 {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {clearBadCharsAndTrim} from '../../helpers/cleanSearchText';\nimport {formatFullSentTime} from '../../helpers/date';\nimport {simulateClickEvent, attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatBytes from '../../helpers/formatBytes';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport noop from '../../helpers/noop';\nimport {Message, MessageMedia, WebPage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {Progress} from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getDownloadMediaDetails from '../../lib/appManagers/utils/download/getDownloadMediaDetails';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {joinElementsWith} from '../../lib/langPack';\nimport {MAX_FILE_SAVE_SIZE} from '../../lib/mtproto/mtproto_config';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport AudioElement from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {MiddleEllipsisElement} from '../middleEllipsis';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\nimport wrapSenderToPeer from './senderToPeer';\nimport wrapSentTime from './sentTime';\n\nrootScope.addEventListener('document_downloading', (docId) => {\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n if(element.querySelector('.preloader-container.manual')) {\n simulateClickEvent(element);\n }\n });\n});\n\nexport default async function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, autoDownloadSize, lazyLoadQueue, sizeType, managers = rootScope.managers, cacheContext, fontSize}: {\n message: Message.message,\n withTime?: boolean,\n fontWeight?: number,\n voiceAsMusic?: boolean,\n showSender?: boolean,\n searchContext?: MediaSearchContext,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n cacheContext?: ThumbCache,\n fontSize?: number\n}): Promise {\n fontWeight ??= 500;\n sizeType ??= '' as any;\n fontSize ??= 0;\n const noAutoDownload = autoDownloadSize === 0;\n\n const doc = ((message.media as MessageMedia.messageMediaDocument).document || ((message.media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document) as MyDocument;\n const uploadFileName = message?.uploadingFileName;\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\n const audioElement = new AudioElement();\n audioElement.withTime = withTime;\n audioElement.message = message;\n audioElement.noAutoDownload = noAutoDownload;\n audioElement.lazyLoadQueue = lazyLoadQueue;\n audioElement.loadPromises = loadPromises;\n\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\n if(searchContext) audioElement.searchContext = searchContext;\n if(showSender) audioElement.showSender = showSender;\n\n audioElement.dataset.fontWeight = '' + fontWeight;\n audioElement.dataset.fontSize = '' + fontSize;\n audioElement.dataset.sizeType = sizeType;\n await audioElement.render();\n return audioElement;\n }\n\n const extSplitted = doc.file_name ? doc.file_name.split('.') : '';\n let ext = '';\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ?\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) :\n 'file';\n\n const docDiv = document.createElement('div');\n docDiv.classList.add('document', `ext-${ext}`);\n docDiv.dataset.docId = '' + doc.id;\n (docDiv as any).doc = doc;\n\n // return docDiv;\n\n const icoDiv = document.createElement('div');\n icoDiv.classList.add('document-ico');\n let icoTextEl: HTMLElement;\n\n const hadContext = !!cacheContext;\n const getCacheContext = () => {\n return hadContext ? cacheContext : managers.thumbsStorage.getCacheContext(doc);\n };\n\n cacheContext = await getCacheContext();\n let hasThumb = false;\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\n docDiv.classList.add('document-with-thumb');\n hasThumb = true;\n\n const imgs: (HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)[] = [];\n // ! WARNING, use thumbs for check when thumb will be generated for media\n if(message.pFlags.is_outgoing && ['photo', 'video'].includes(doc.type) && cacheContext.url) {\n icoDiv.innerHTML = ``;\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\n } else {\n const perf = performance.now();\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: icoDiv,\n boxWidth: 54,\n boxHeight: 54,\n loadPromises,\n withoutPreloader: true,\n lazyLoadQueue,\n size: choosePhotoSize(doc, 54, 54, true),\n managers\n });\n // console.log('was wrapping photo', performance.now() - perf);\n icoDiv.style.width = icoDiv.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n }\n\n imgs.forEach((img) => img.classList.add('document-thumb'));\n } else {\n icoTextEl = document.createElement('span');\n icoTextEl.classList.add('document-ico-text');\n icoTextEl.innerText = ext;\n icoDiv.append(icoTextEl);\n }\n\n // let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\n const fileName = doc.file_name ? wrapPlainText(doc.file_name) : 'Unknown.file';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('document-description');\n const bytesContainer = document.createElement('span');\n const bytesEl = formatBytes(doc.size);\n const bytesJoiner = ' / ';\n\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [bytesEl];\n\n if(withTime) {\n descriptionParts.push(formatFullSentTime(message.date));\n }\n\n if(showSender) {\n descriptionParts.push(await wrapSenderToPeer(message));\n }\n\n if(!withTime && !showSender) {\n const b = document.createElement('span');\n const bytesMaxEl = formatBytes(doc.size);\n b.append(bytesJoiner, bytesMaxEl);\n b.style.visibility = 'hidden';\n descriptionParts.push(b);\n }\n\n docDiv.innerHTML = `\n ${(cacheContext.downloaded && !uploadFileName) || !message.mid || !hasThumb ? '' : `
`}\n
\n
\n `;\n\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\n middleEllipsisEl.dataset.fontSize = '' + fontSize;\n middleEllipsisEl.dataset.sizeType = sizeType;\n middleEllipsisEl.textContent = fileName;\n // setInnerHTML(middleEllipsisEl, fileName);\n\n // * new media popup\n if(!message.mid) {\n docDiv.classList.add('downloaded');\n }\n\n nameDiv.append(middleEllipsisEl);\n\n if(showSender) {\n nameDiv.append(wrapSentTime(message));\n }\n\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\n bytesContainer.append(...joinElementsWith(descriptionParts, ' · '));\n sizeDiv.append(bytesContainer);\n\n docDiv.prepend(icoDiv);\n\n if(!uploadFileName && message.pFlags.is_outgoing && !message.mid) {\n return docDiv;\n }\n\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\n const onLoad = () => {\n docDiv.classList.remove('downloading');\n\n if(/* !hasThumb || */(doc.size > MAX_FILE_SAVE_SIZE && !uploadFileName)) {\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.preloader.classList.add('manual');\n preloader.setDownloadFunction(load);\n return;\n }\n\n if(doc.size <= MAX_FILE_SAVE_SIZE) {\n docDiv.classList.add('downloaded');\n }\n\n if(downloadDiv) {\n if(downloadDiv !== icoDiv) {\n const _downloadDiv = downloadDiv;\n setTimeout(() => {\n _downloadDiv.remove();\n }, 200);\n }\n\n downloadDiv = null;\n }\n\n if(preloader) {\n preloader = null;\n }\n };\n\n const addByteProgress = (promise: CancellablePromise) => {\n docDiv.classList.add('downloading');\n\n const sizeContainer = document.createElement('span');\n const _bytesContainer = formatBytes(doc.size);\n sizeContainer.style.position = 'absolute';\n sizeContainer.style.left = '0';\n promise.then(onLoad, noop).finally(() => {\n // sizeContainer.replaceWith(bytesContainer);\n bytesContainer.style.visibility = '';\n sizeContainer.remove();\n // b && b.classList.remove('hide');\n });\n\n // b && b.classList.add('hide');\n\n const format = (bytes: number) => formatBytes(bytes);\n let d = format(0);\n bytesContainer.style.visibility = 'hidden';\n // bytesContainer.replaceWith(sizeContainer);\n sizeContainer.append(d, bytesJoiner, _bytesContainer);\n bytesContainer.parentElement.append(sizeContainer);\n promise.addNotifyListener((progress: Progress) => {\n const _d = format(progress.done);\n d.replaceWith(_d);\n d = _d;\n });\n };\n\n // ! DO NOT USE ASYNC/AWAIT HERE ! SAFARI WON'T LET DOWNLOAD THE FILE BECAUSE OF ASYNC\n const load = (e?: Event) => {\n const save = !e || e.isTrusted;\n const doc = (docDiv as any).doc;\n // const doc = await managers.appDocsManager.getDoc(docDiv.dataset.docId);\n let download: CancellablePromise;\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\n if(!save) {\n download = appDownloadManager.downloadToDisc({media: doc, queueId}, true);\n } else if(doc.type === 'pdf') {\n const canOpenAfter = /* managers.appDocsManager.downloading.has(doc.id) || */!preloader || preloader.detached;\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n if(canOpenAfter) {\n download.then(() => {\n setTimeout(async() => { // wait for preloader animation end\n const url = (await getCacheContext()).url;\n window.open(url);\n }, rootScope.settings.animationsEnabled ? 250 : 0);\n });\n }\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n } else {\n download = appDownloadManager.downloadToDisc({media: doc, queueId});\n }\n\n download.catch(() => {\n docDiv.classList.remove('downloading');\n });\n\n if(downloadDiv) {\n preloader.attach(downloadDiv, true, download);\n addByteProgress(download);\n }\n };\n\n const {fileName: downloadFileName} = getDownloadMediaDetails({media: doc, downloadId: '1'});\n if(await managers.apiFileManager.isDownloading(downloadFileName)) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n const promise = appDownloadManager.downloadToDisc({media: doc}, true);\n\n preloader = new ProgressivePreloader();\n preloader.attach(downloadDiv, false, promise);\n preloader.setDownloadFunction(load);\n addByteProgress(promise);\n } else if(!cacheContext.downloaded || uploadFileName) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n preloader = new ProgressivePreloader({\n isUpload: !!uploadFileName\n });\n\n if(!uploadFileName) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.setDownloadFunction(load);\n\n if(autoDownloadSize !== undefined && autoDownloadSize >= doc.size) {\n simulateClickEvent(preloader.preloader);\n }\n } else {\n const uploadPromise = appDownloadManager.getUpload(uploadFileName);\n preloader.attachPromise(uploadPromise);\n preloader.attach(downloadDiv);\n addByteProgress(uploadPromise);\n }\n }\n\n attachClickEvent(docDiv, (e) => {\n if(findUpClassName(e.target, 'time')) { // prevent downloading by clicking on time\n return;\n }\n\n if(preloader) {\n preloader.onClick(e);\n } else {\n load(e);\n }\n });\n\n return docDiv;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\n\nexport default function formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {Chat, ChatParticipants} from '../../layer';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\n\nexport default async function getChatMembersString(chatId: ChatId, managers = rootScope.managers) {\n const chat: Chat = await managers.appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = await managers.appProfileManager.getCachedFullChat(chatId);\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isBroadcast = (chat as Chat.channel).pFlags.broadcast;\n count = count || 1;\n\n const key: LangPackKey = isBroadcast ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport _limitSymbols from '../../helpers/string/limitSymbols';\nimport {Chat} from '../../layer';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\n\ntype GetPeerTitleOptions = {\n peerId: PeerId,\n plainText?: boolean,\n onlyFirstName?: boolean,\n limitSymbols?: number,\n threadId?: number\n} & Pick;\n\nexport default async function getPeerTitle(\n options: T\n): Promise {\n const {\n peerId = rootScope.myId,\n plainText,\n onlyFirstName,\n limitSymbols,\n managers = rootScope.managers,\n threadId\n } = options;\n\n let title = '';\n if(peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId.toUserId());\n if(user) {\n if(user.first_name) title += user.first_name;\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\n }\n\n if(!title) title = !user || user.pFlags.deleted ? I18n.format(onlyFirstName ? 'Deleted' : 'HiddenName', true) : getPeerActiveUsernames(user)[0] || '';\n else title = title.trim();\n } else {\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n title = topic?.title || '';\n }\n\n if(!title) {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n title = chat?.title || '';\n }\n\n if(onlyFirstName) {\n title = title.split(' ')[0];\n }\n }\n\n if(limitSymbols !== undefined) {\n title = _limitSymbols(title, limitSymbols, limitSymbols);\n }\n\n return plainText ? title : wrapEmojiText(title) as any;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatFullSentTimeRaw} from '../../helpers/date';\nimport {User} from '../../layer';\nimport {LangPackKey, i18n} from '../../lib/langPack';\nimport {REPLIES_PEER_ID, SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\n\nexport default function getUserStatusString(user: User.user): HTMLElement {\n if(!user) {\n return document.createElement('span');\n }\n\n let key: LangPackKey;\n let args: any[];\n\n switch(user.id) {\n case REPLIES_PEER_ID.toUserId():\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID.toUserId():\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(user.pFlags.bot) {\n key = 'Bot';\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n\n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n\n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n\n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n\n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n\n break;\n }\n\n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n\n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n\n return i18n(key, args);\n}\n","/*\n * 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 {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport wrapMessageActionTextNewUnsafe from './messageActionTextNewUnsafe';\n\nexport type WrapMessageActionTextOptions = {\n message: MyMessage,\n plain?: boolean\n} & WrapSomethingOptions;\n\nexport default async function wrapMessageActionTextNew(\n options: T\n): Promise {\n try {\n return await wrapMessageActionTextNewUnsafe(options) as any;\n } catch(err) {\n console.error('wrapMessageActionTextNewUnsafe error:', err);\n return options.plain ? '' : document.createElement('span') 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 {hexaToHsla} from '../helpers/color';\nimport {TOPIC_COLORS} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\n\nlet svg: SVGSVGElement, span: HTMLElement, defs: HTMLElement;\nconst hadColors: Map = new Map();\nexport default function topicAvatar(color: number, content: string) {\n if(!svg) {\n defs = document.getElementById('svg-defs') as HTMLElement;\n\n const ns = 'http://www.w3.org/2000/svg';\n\n svg = document.createElementNS(ns, 'svg');\n svg.setAttributeNS(null, 'width', '26');\n svg.setAttributeNS(null, 'height', '26');\n svg.setAttributeNS(null, 'viewBox', '0 0 26 26');\n svg.classList.add('topic-icon-svg');\n\n const use = document.createElementNS(ns, 'use');\n use.setAttributeNS(null, 'href', '#topic-icon');\n svg.append(use);\n\n span = document.createElement('span');\n span.classList.add('topic-icon', 'avatar-like');\n\n const contentSpan = document.createElement('span');\n contentSpan.classList.add('topic-icon-content');\n span.append(svg, contentSpan);\n }\n\n if(!color) {\n console.error('NO TOPIC ICON COLOR!');\n color = TOPIC_COLORS[0];\n }\n\n if(!content) {\n console.error('NO TOPIC NAME!');\n content = '';\n }\n\n const hex = color.toString(16);\n\n const gradientId = `topic-icon-gradient-${color}`;\n let strokeColor = hadColors.get(color);\n if(!strokeColor) {\n const {h, s, l, a} = hexaToHsla('#' + hex);\n defs.insertAdjacentHTML('beforeend', `\n \n \n \n \n `);\n\n hadColors.set(color, strokeColor = `hsla(${h}, ${s}%, ${Math.max(0, l - 40)}%, ${a})`);\n }\n\n const clone = span.cloneNode(true) as typeof span;\n (clone.firstElementChild as HTMLElement).style.fill = `url(#${gradientId})`;\n // (clone.firstElementChild as HTMLElement).style.stroke = `var(--peer-avatar-${color}-filled)`;\n (clone.firstElementChild as HTMLElement).style.stroke = strokeColor;\n clone.lastElementChild.append(wrapAbbreviation(content, true));\n return clone;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageAction} from '../../layer';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\n\nexport default function wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n\n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {formatTime, ONE_DAY} from '../../helpers/date';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {ForumTopic, Message, MessageAction} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {FormatterArgument, FormatterArguments, i18n, join, langPack, LangPackKey, _i18n} from '../../lib/langPack';\nimport {GENERAL_TOPIC_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport topicAvatar from '../topicAvatar';\nimport {wrapCustomEmojiAwaited} from './customEmoji';\nimport getPeerTitle from './getPeerTitle';\nimport wrapJoinVoiceChatAnchor from './joinVoiceChatAnchor';\nimport {WrapMessageActionTextOptions} from './messageActionTextNew';\nimport wrapMessageForReply, {WrapMessageForReplyOptions} from './messageForReply';\nimport wrapPeerTitle from './peerTitle';\n\nasync function wrapLinkToMessage(options: WrapMessageForReplyOptions) {\n const wrapped = await wrapMessageForReply(options);\n\n if(options.plain) {\n return wrapped;\n }\n\n const a = document.createElement('i');\n a.dataset.savedFrom = (options.message as Message.message).peerId + '_' + (options.message as Message.message).mid;\n a.dir = 'auto';\n a.append(wrapped);\n return a;\n}\n\nfunction wrapSomeText(text: string, plain?: boolean) {\n return plain ? text : htmlToSpan(wrapEmojiText(text));\n}\n\ntype WrapTopicIconOptions = {\n topic: Pick,\n plain?: boolean\n} & WrapSomethingOptions;\nexport async function wrapTopicIcon(options: T): Promise {\n const topic = options.topic;\n\n let iconEmojiId = topic?.icon_emoji_id;\n if(topic?.id === GENERAL_TOPIC_ID) {\n iconEmojiId = '5390854796011906616';\n }\n\n if(!iconEmojiId) {\n if(options.plain) return '' as any;\n\n // if(topic?.id === GENERAL_TOPIC_ID) {\n // const span = document.createElement('span');\n // span.innerHTML = `\n // \n // \n // \n // `;\n\n // span.classList.add('topic-icon');\n\n // return span as any;\n // }\n\n return topicAvatar(topic?.icon_color, topic?.title) as any;\n }\n\n return options.plain ?\n rootScope.managers.appEmojiManager.getCustomEmojiDocument(iconEmojiId).then((doc) => doc.stickerEmojiRaw) :\n wrapCustomEmojiAwaited({\n ...options,\n docIds: [iconEmojiId]\n }).then((fragment) => {\n fragment.lastElementChild.classList.add('topic-icon');\n return fragment;\n }) as any;\n}\n\nfunction wrapMessageActionTopicIcon(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n return wrapTopicIcon({\n ...options,\n topic: action as any as ForumTopic.forumTopic\n });\n}\n\nasync function wrapMessageActionTopicIconAndName(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n const span = document.createElement('span');\n span.classList.add('topic-name');\n span.append(await wrapMessageActionTopicIcon(options), wrapSomeText(action.title, options.plain));\n return span;\n}\n\nexport default async function wrapMessageActionTextNewUnsafe(options: WrapMessageActionTextOptions) {\n const {plain, message, middleware, lazyLoadQueue, customEmojiSize, animationGroup} = options;\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return wrapPlainText(unsafeMessage);\n } else {\n setInnerHTML(element, wrapRichText(unsafeMessage, {noLinebreaks: true}));\n return element;\n }\n } else {\n let _ = action._;\n // let suffix = '';\n let langPackKey: LangPackKey;\n let args: Array>;\n\n const managers = rootScope.managers;\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? getPeerTitle({peerId, plainText: plain}) : wrapPeerTitle({peerId});\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = rootScope.myId;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map((peerId) => getNameDivHTML(peerId, plain));\n args.push(wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey;\n const _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date,\n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n\n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = await managers.appMessagesManager.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain)\n ];\n\n if(!pinnedMessage/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n managers.appMessagesManager.fetchMessageReplyTo(message);\n }\n } else {\n args.push(wrapLinkToMessage({\n ...options,\n message: pinnedMessage\n }));\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(wrapSomeText(action.title));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users ||\n [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n await Promise.all(users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain))),\n false,\n plain\n );\n\n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n case 'messageActionPaymentSent': {\n const isRecurringInit = action.pFlags.recurring_init;\n const isRecurringUsed = action.pFlags.recurring_used;\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsedNoTitle' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInitNoTitle' : 'Chat.Service.PaymentSent1NoTitle');\n const price = paymentsWrapCurrencyAmount(action.total_amount, action.currency);\n args = [price, getNameDivHTML(message.peerId, plain)];\n\n if(message.reply_to_mid) {\n const invoiceMessage = await managers.appMessagesManager.getMessageByPeer(\n message.reply_to?.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId,\n message.reply_to_mid\n );\n\n if(!invoiceMessage) {\n managers.appMessagesManager.fetchMessageReplyTo(message);\n } else {\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsed' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInit' : 'Chat.Service.PaymentSent1');\n args.push(wrapLinkToMessage({\n ...options,\n message: invoiceMessage\n }).then((el) => {\n if(el instanceof HTMLElement) {\n el.classList.add('is-receipt-link');\n }\n\n return el;\n }));\n }\n }\n\n break;\n }\n\n case 'messageActionSetMessagesTTL': {\n args = [];\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(action.period) {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelChanged';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouChanged';\n } else {\n langPackKey = 'ActionTTLChanged';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let duration: ReturnType;\n if(action.period > 1814400) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const year = 31536000;\n if(action.period >= year) {\n key = 'Years';\n args.push(action.period / year | 0);\n } else {\n key = 'Months';\n args.push(action.period / (ONE_DAY * 30) | 0);\n }\n\n duration = plain ? I18n.format(key, true, args) : i18n(key, args);\n } else {\n duration = formatCallDuration(action.period, plain);\n }\n\n args.push(duration);\n } else {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelDisabled';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouDisabled';\n } else {\n langPackKey = 'ActionTTLDisabled';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n }\n break;\n }\n\n case 'messageActionTopicEdit': {\n let iconElement: (typeof args)[0];\n let titleElement: typeof iconElement;\n let authorElement: ReturnType;\n const isMe = !!message.pFlags.out;\n const isIconChanged = action.icon_emoji_id !== undefined;\n const isIconRemoved = isIconChanged && !+action.icon_emoji_id;\n const isTitleChanged = action.title !== undefined;\n const isHiddenChanged = action.hidden !== undefined;\n\n if(!isMe) {\n authorElement = getNameDivHTML(message.fromId, plain);\n }\n\n if(isTitleChanged) {\n titleElement = wrapSomeText(action.title);\n }\n\n if(isIconChanged && !isIconRemoved) {\n iconElement = wrapMessageActionTopicIcon(options);\n }\n\n args = authorElement ? [authorElement] : [];\n\n if(action.closed) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Paused' : 'Chat.Service.Group.TopicEdited.Paused';\n } else if(action.closed === false) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Resumed' : 'Chat.Service.Group.TopicEdited.Resumed';\n } else if(isIconRemoved && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed.IconRemoved' : 'Chat.Service.TopicEdited.Mixed.IconRemoved';\n args.push(titleElement);\n } else if(isIconChanged && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed' : 'Chat.Service.TopicEdited.Mixed';\n args.push(wrapMessageActionTopicIconAndName(options));\n } else if(isIconRemoved) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon.Removed' : 'Chat.Service.Group.TopicEdited.Icon.Removed';\n } else if(isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Title' : 'Chat.Service.Group.TopicEdited.Title';\n args.push(titleElement);\n } else if(isIconChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon' : 'Chat.Service.Group.TopicEdited.Icon';\n args.push(iconElement);\n } else if(isHiddenChanged) {\n langPackKey = isMe ?\n (action.hidden ? 'Chat.Service.Group.TopicEdited.You.Hided' : 'Chat.Service.Group.TopicEdited.You.Unhided') :\n (action.hidden ? 'Chat.Service.Group.TopicEdited.Hided' : 'Chat.Service.Group.TopicEdited.Unhided');\n }\n\n break;\n }\n\n case 'messageActionTopicCreate': {\n args = [wrapMessageActionTopicIconAndName(options)];\n langPackKey = 'TopicWasCreatedAction';\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n const waited = args && await Promise.all(args);\n\n if(plain) {\n return I18n.format(langPackKey, true, waited);\n } else {\n return _i18n(element, langPackKey, waited);\n }\n\n // str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport assumeType from '../../helpers/assumeType';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport escapeRegExp from '../../helpers/string/escapeRegExp';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Message, DocumentAttribute, DraftMessage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport isMessageRestricted from '../../lib/appManagers/utils/messages/isMessageRestricted';\nimport I18n, {LangPackKey, i18n, UNSUPPORTED_LANG_PACK_KEY} from '../../lib/langPack';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport {Modify} from '../../types';\nimport wrapMessageActionTextNew, {WrapMessageActionTextOptions} from './messageActionTextNew';\n\nexport type WrapMessageForReplyOptions = Modify & {\n text?: string,\n usingMids?: number[],\n highlightWord?: string,\n withoutMediaType?: boolean\n};\n\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): Promise {\nexport default async function wrapMessageForReply(\n options: T\n): Promise {\n let {message, text, usingMids, plain, highlightWord, withoutMediaType} = options;\n text ??= (message as Message.message).message;\n\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement | DocumentFragment) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n\n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n\n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('span');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n const managers = rootScope.managers;\n const appMessagesManager = managers.appMessagesManager;\n\n const isRestricted = isMessageRestricted(message as any);\n\n let entities = (message as Message.message).totalEntities ?? (message as DraftMessage.draftMessage).entities;\n if((message as Message.message).media && !isRestricted) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = await appMessagesManager.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = await appMessagesManager.getAlbumText(message.grouped_id);\n text = albumText?.message || '';\n entities = albumText?.totalEntities || [];\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n const f = '📊' + ' ' + (media.poll.question || 'poll');\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n\n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n const i = parts.length;\n if(document.stickerEmojiRaw) {\n const f = document.stickerEmojiRaw + ' ';\n addPart(undefined, plain ? f : wrapEmojiText(f));\n }\n\n addPart('AttachSticker');\n\n // will combine two parts into one\n const p = parts.splice(i, 2);\n if(plain) parts.push((p[0] as string) + (p[1] ? p[1] as string : ''));\n else {\n const span = window.document.createElement('span');\n span.append(...p);\n parts.push(span);\n }\n\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find((attribute) => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : wrapEmojiText(document.file_name));\n }\n\n break;\n }\n\n case 'messageMediaInvoice': {\n if(media.extended_media?._ === 'messageExtendedMediaPreview') {\n addPart(undefined, plain ? media.description : wrapEmojiText(media.description));\n } else {\n addPart(undefined, plain ? media.title : wrapEmojiText(media.title));\n }\n\n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n\n default:\n // messageText += media._;\n // /////appMessagesManager.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n }\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = await wrapMessageActionTextNew({message: (message as Message.messageService), plain});\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(isRestricted) {\n text = getRestrictionReason((message as Message.message).restriction_reason).text;\n entities = [];\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(wrapPlainText(text, entities));\n } else {\n // let entities = parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n const regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n entities = entities.slice(); // fix leaving highlight entity\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n\n if(found) {\n sortEntities(entities);\n }\n }\n\n const messageWrapped = wrapRichText(text, {\n noLinebreaks: true,\n entities,\n noLinks: true,\n noTextFormat: true\n });\n\n parts.push(htmlToDocumentFragment(messageWrapped));\n }\n }\n\n if(plain) {\n return parts.join('') as any;\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment 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 PeerTitle, {PeerTitleOptions} from '../peerTitle';\n\nexport default async function wrapPeerTitle(options: PeerTitleOptions) {\n const peerTitle = new PeerTitle();\n await peerTitle.update(options);\n return peerTitle.element;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Message, PhotoSize, VideoSize, WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport rootScope from '../../lib/rootScope';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport blur from '../../helpers/blur';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport isWebDocument from '../../lib/appManagers/utils/webDocs/isWebDocument';\nimport createVideo from '../../helpers/dom/createVideo';\nimport noop from '../../helpers/noop';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport {Middleware} from '../../helpers/middleware';\n\nexport default async function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, autoDownloadSize, noBlur, noThumb, noFadeIn, blurAfter, managers = rootScope.managers, processUrl}: {\n photo: MyPhoto | MyDocument | WebDocument,\n message?: Message.message | Message.messageService,\n container: HTMLElement,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n middleware?: Middleware,\n size?: PhotoSize | VideoSize,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n noBlur?: boolean,\n noThumb?: boolean,\n noFadeIn?: boolean,\n blurAfter?: boolean,\n managers?: AppManagers,\n processUrl?: (url: string) => Promise\n}) {\n const ret = {\n loadPromises: {\n thumb: Promise.resolve() as Promise,\n full: Promise.resolve() as Promise\n },\n images: {\n thumb: null as HTMLImageElement | HTMLCanvasElement,\n full: null as HTMLVideoElement | HTMLImageElement\n },\n preloader: null as ProgressivePreloader,\n aspecter: null as HTMLElement\n };\n\n const isDocument = photo._ === 'document';\n const isImageFromDocument = isDocument && photo.mime_type.startsWith('image/') && !size;\n const isWebDoc = isWebDocument(photo);\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs) && !isWebDoc && !isImageFromDocument) {\n if(boxWidth && boxHeight && !size && isDocument) {\n setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\n }\n\n return ret;\n }\n\n let noAutoDownload = autoDownloadSize === 0;\n\n if(!size) {\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\n }\n\n container.classList.add('media-container');\n let aspecter = container;\n\n let isFit = true;\n let loadThumbPromise: Promise = Promise.resolve();\n let thumbImage: HTMLImageElement | HTMLCanvasElement;\n // let image: HTMLImageElement;\n let cacheContext: ThumbCache;\n // if(withTail) {\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\n // } else {\n\n if(boxWidth && boxHeight && !size) { // !album\n const set = setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isImageFromDocument ? {\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n } : undefined);\n size = set.photoSize;\n isFit = set.isFit;\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size.type);\n\n if(!isFit && !isWebDoc) {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-container-aspecter');\n aspecter.style.width = set.size.width + 'px';\n aspecter.style.height = set.size.height + 'px';\n\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\n if(gotThumb) {\n loadThumbPromise = gotThumb.loadPromise;\n const thumbImage = gotThumb.image; // local scope\n thumbImage.classList.add('media-photo');\n container.append(thumbImage);\n } else {\n const res = await wrapPhoto({\n container,\n message,\n photo,\n boxWidth: 0,\n boxHeight: 0,\n size,\n lazyLoadQueue,\n isOut,\n loadPromises,\n middleware,\n withoutPreloader,\n withTail,\n autoDownloadSize,\n noBlur,\n noThumb: true,\n blurAfter: true,\n managers\n // noFadeIn: true\n });\n const thumbImage = res.images.full;\n thumbImage.classList.add('media-photo', 'thumbnail');\n // container.append(thumbImage);\n }\n\n container.classList.add('media-container-fitted');\n container.append(aspecter);\n }\n } else {\n if(!size) {\n size = choosePhotoSize(photo, boxWidth, boxHeight, true);\n }\n\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n }\n\n if(!noThumb && !isWebDoc) {\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\n if(gotThumb) {\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\n ret.loadPromises.thumb = ret.loadPromises.full = loadThumbPromise;\n thumbImage = ret.images.thumb = gotThumb.image;\n thumbImage.classList.add('media-photo');\n aspecter.append(thumbImage);\n }\n }\n // }\n\n ret.aspecter = aspecter;\n\n if((size?._ === 'photoSizeEmpty' && isDocument) || (size as PhotoSize.photoStrippedSize)?.bytes) {\n return ret;\n }\n\n let media: HTMLVideoElement | HTMLImageElement;\n if(size?._ === 'videoSize') {\n media = ret.images.full = createVideo();\n media.autoplay = true;\n media.loop = true;\n media.muted = true;\n media.classList.add('media-photo');\n } else {\n media = ret.images.full = new Image();\n media.classList.add('media-photo');\n }\n\n // console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\n\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\n\n let preloader: ProgressivePreloader;\n const uploadingFileName = (message as Message.message)?.uploadingFileName;\n if(!withoutPreloader) {\n if(!cacheContext.downloaded || uploadingFileName) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: !!uploadingFileName\n });\n }\n\n if(uploadingFileName) { // means upload\n preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n preloader.attach(container);\n noAutoDownload = undefined;\n }\n }\n\n\n const getDownloadPromise = () => {\n // const promise = isGif && !size ?\n // managers.appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) :\n // managers.appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\n const haveToDownload = isImageFromDocument && !size;\n const promise = appDownloadManager.downloadMediaURL({\n media: photo,\n thumb: size,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: haveToDownload ? undefined : noAutoDownload\n });\n\n return promise;\n };\n\n const renderOnLoad = (url: string) => {\n return renderMediaWithFadeIn(container, media, url, needFadeIn, aspecter, thumbImage);\n };\n\n const onLoad = async(url: string) => {\n if(middleware && !middleware()) return;\n\n if(processUrl) {\n url = await processUrl(url);\n }\n\n if(blurAfter) {\n const result = blur(url, 12);\n return result.promise.then(() => {\n // image = result.canvas;\n return renderOnLoad(result.canvas.toDataURL());\n });\n }\n\n return renderOnLoad(url);\n };\n\n let loadPromise: Promise;\n const canAttachPreloader = (\n (size as PhotoSize.photoSize).w >= 150 &&\n (size as PhotoSize.photoSize).h >= 150\n ) || noAutoDownload;\n const load = async() => {\n if(noAutoDownload && !withoutPreloader && preloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n const promise = getDownloadPromise();\n const cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n if(\n preloader &&\n !cacheContext.downloaded &&\n !withoutPreloader &&\n canAttachPreloader\n ) {\n preloader.attach(container, false, promise);\n }\n\n noAutoDownload = undefined;\n\n const renderPromise = promise.then(onLoad);\n renderPromise.catch(noop);\n return {download: promise, render: renderPromise};\n };\n\n if(preloader) {\n preloader.setDownloadFunction(load);\n }\n\n if(cacheContext.downloaded) {\n loadThumbPromise = loadPromise = (await load()).render;\n } else {\n if(!lazyLoadQueue) loadPromise = (await load()).render;\n /* else if(noAutoDownload) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(container);\n } */ else lazyLoadQueue.push({div: container, load: () => load().then(({download}) => download)});\n }\n\n if(loadPromises && loadThumbPromise) {\n loadPromises.push(loadThumbPromise);\n }\n\n // const perf = performance.now();\n await loadThumbPromise;\n ret.loadPromises.thumb = loadThumbPromise;\n ret.loadPromises.full = loadPromise || Promise.resolve();\n ret.preloader = preloader;\n\n // const elapsedTime = performance.now() - perf;\n // if(elapsedTime > 4) {\n // console.log('wrapping photo thumb time', elapsedTime, photo, size);\n // }\n\n return 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 {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport getMessageSenderPeerIdOrName from '../../lib/appManagers/utils/messages/getMessageSenderPeerIdOrName';\nimport {i18n} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n\n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ?\n i18n('FromYou') :\n await wrapPeerTitle({\n ...getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n })\n );\n\n if(await rootScope.managers.appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = await wrapPeerTitle({peerId: message.peerId});\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\n\nexport default function wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport assumeType from '../../helpers/assumeType';\nimport getPathFromBytes from '../../helpers/bytes/getPathFromBytes';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport computeLockColor from '../../helpers/computeLockColor';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport getPreviewURLFromThumb from '../../helpers/getPreviewURLFromThumb';\nimport makeError from '../../helpers/makeError';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {isSavingLottiePreview, saveLottiePreview} from '../../helpers/saveLottiePreview';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport type RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport webpWorkerController from '../../lib/webp/webpWorkerController';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport {getEmojiToneIndex} from '../../vendor/emoji';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport PopupStickers from '../popups/stickers';\nimport {hideToast, toastNew} from '../toast';\nimport wrapStickerAnimation from './stickerAnimation';\nimport framesCache from '../../helpers/framesCache';\n\n// https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp#L40\nexport const STICKER_EFFECT_MULTIPLIER = 1 + 0.245 * 2;\nconst EMOJI_EFFECT_MULTIPLIER = 3;\n\nconst locksUrls: {[docId: string]: string} = {};\n\nexport const videosCache: {[key: string]: Promise} = {};\n\nexport default async function wrapSticker({doc, div, middleware, loadStickerMiddleware, lazyLoadQueue, exportLoad, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic, managers = rootScope.managers, fullThumb, isOut, noPremium, withLock, relativeEffect, loopEffect, isCustomEmoji, syncedVideo}: {\n doc: MyDocument,\n div: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n loadStickerMiddleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n exportLoad?: number,\n group?: AnimationItemGroup,\n play?: boolean,\n onlyThumb?: boolean,\n emoji?: string,\n width?: number,\n height?: number,\n withThumb?: boolean,\n loop?: RLottiePlayer['loop'],\n loadPromises?: Promise[],\n needFadeIn?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n static?: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n isOut?: boolean,\n noPremium?: boolean,\n withLock?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean,\n isCustomEmoji?: boolean,\n syncedVideo?: boolean\n}) {\n div = Array.isArray(div) ? div : [div];\n\n if(isCustomEmoji) {\n emoji = doc.stickerEmojiRaw;\n }\n\n const stickerType = doc.sticker;\n if(stickerType === 1) {\n asStatic = true;\n }\n\n if(!width && !height) {\n const sizes = mediaSizes.active;\n const boxSize = emoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n const size = makeMediaSize(doc.w, doc.h).aspectFitted(boxSize);\n width = size.width;\n height = size.height;\n }\n\n if(stickerType === 2) {\n // LottieLoader.loadLottie();\n lottieLoader.loadLottieWorkers();\n }\n\n div.forEach((div) => {\n div.dataset.docId = '' + doc.id;\n if(emoji) {\n div.dataset.stickerEmoji = emoji;\n }\n\n div.classList.add('media-sticker-wrapper');\n });\n\n /* if(stickerType === 3) {\n const videoRes = wrapVideo({\n doc,\n boxWidth: width,\n boxHeight: height,\n container: div,\n group,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n noPlayButton: true,\n noInfo: true\n });\n\n if(videoRes.thumb) {\n if(videoRes.thumb.images.thumb) {\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\n }\n\n if(videoRes.thumb.images.full) {\n videoRes.thumb.images.full.classList.add('media-sticker');\n }\n }\n\n return videoRes.loadPromise;\n } */\n\n // console.log('wrap sticker', doc, div, onlyThumb);\n\n let cacheContext: ThumbCache;\n const getCacheContext = async(type: string = cacheContext?.type) => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, type);\n };\n\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\n\n const effectThumb = getStickerEffectThumb(doc);\n if(isOut !== undefined && effectThumb && !isOut) {\n div.forEach((div) => div.classList.add('reflect-x'));\n }\n\n const willHaveLock = effectThumb && withLock;\n if(willHaveLock) {\n const lockUrl = locksUrls[doc.id];\n div.forEach((div) => {\n div.classList.add('is-premium-sticker', 'tgico-premium_lock');\n lockUrl && div.style.setProperty('--lock-url', `url(${lockUrl})`);\n });\n }\n\n if(asStatic && stickerType !== 1) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n await getCacheContext(thumb.type);\n } else {\n await getCacheContext(fullThumb?.type);\n }\n\n const toneIndex = emoji && !isCustomEmoji ? getEmojiToneIndex(emoji) : -1;\n const downloaded = cacheContext.downloaded && !needFadeIn;\n\n const isThumbNeededForType = isAnimated;\n const lottieCachedThumb = stickerType === 2 || stickerType === 3 ? await managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex) : undefined;\n\n const ret = {render: undefined as typeof loadPromise, load: undefined as typeof load};\n let loadThumbPromise = deferredPromise();\n let haveThumbCached = false;\n if((\n doc.thumbs?.length ||\n lottieCachedThumb\n ) &&\n !div[0].firstElementChild && (\n !downloaded ||\n isThumbNeededForType ||\n onlyThumb\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\n ) {\n let thumb = lottieCachedThumb || doc.thumbs[0];\n\n // console.log('wrap sticker', thumb, div);\n\n const afterRender = (div: HTMLElement, thumbImage: HTMLElement) => {\n if(!div.childElementCount) {\n thumbImage.classList.add('media-sticker', 'thumbnail');\n\n sequentialDom.mutateElement(div, () => {\n div.append(thumbImage);\n loadThumbPromise.resolve();\n });\n } else {\n loadThumbPromise.resolve();\n }\n };\n\n if('url' in thumb) {\n haveThumbCached = true;\n div.forEach((div) => {\n const thumbImage = new Image();\n renderImageFromUrl(thumbImage, (thumb as any).url, () => afterRender(div, thumbImage));\n });\n } else if('bytes' in thumb) {\n if(thumb._ === 'photoPathSize') {\n if(!thumb.bytes.length) {\n thumb = doc.thumbs.find((t) => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\n }\n\n const d = getPathFromBytes((thumb as PhotoSize.photoStrippedSize).bytes);\n const ns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(ns, 'svg');\n svg.classList.add('rlottie-vector', 'media-sticker', 'thumbnail');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${doc.w || 512} ${doc.h || 512}`);\n\n // const defs = document.createElementNS(ns, 'defs');\n // const linearGradient = document.createElementNS(ns, 'linearGradient');\n // linearGradient.setAttributeNS(null, 'id', 'g');\n // linearGradient.setAttributeNS(null, 'x1', '-300%');\n // linearGradient.setAttributeNS(null, 'x2', '-200%');\n // linearGradient.setAttributeNS(null, 'y1', '0');\n // linearGradient.setAttributeNS(null, 'y2', '0');\n // const stops = [\n // ['-10%', '.1'],\n // ['30%', '.07'],\n // ['70%', '.07'],\n // ['110%', '.1']\n // ].map(([offset, stopOpacity]) => {\n // const stop = document.createElementNS(ns, 'stop');\n // stop.setAttributeNS(null, 'offset', offset);\n // stop.setAttributeNS(null, 'stop-opacity', stopOpacity);\n // return stop;\n // });\n // const animates = [\n // ['-300%', '1200%'],\n // ['-200%', '1300%']\n // ].map(([from, to], idx) => {\n // const animate = document.createElementNS(ns, 'animate');\n // animate.setAttributeNS(null, 'attributeName', 'x' + (idx + 1));\n // animate.setAttributeNS(null, 'from', from);\n // animate.setAttributeNS(null, 'to', to);\n // animate.setAttributeNS(null, 'dur', '3s');\n // animate.setAttributeNS(null, 'repeatCount', 'indefinite');\n // return animate;\n // });\n // linearGradient.append(...stops, ...animates);\n // defs.append(linearGradient);\n // svg.append(defs);\n\n const path = document.createElementNS(ns, 'path');\n path.setAttributeNS(null, 'd', d);\n if(rootScope.settings.animationsEnabled && !isCustomEmoji) path.setAttributeNS(null, 'fill', 'url(#g)');\n svg.append(path);\n div.forEach((div, idx) => div.append(idx > 0 ? svg.cloneNode(true) : svg));\n haveThumbCached = true;\n loadThumbPromise.resolve();\n } else if(toneIndex <= 0) {\n const r = () => {\n (div as HTMLElement[]).forEach((div) => {\n const thumbImage = new Image();\n const url = getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n });\n };\n\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\n haveThumbCached = true;\n r();\n } else {\n haveThumbCached = true;\n webpWorkerController.convert('main-' + doc.id, thumb.bytes).then((bytes) => {\n managers.appDocsManager.saveWebPConvertedStrippedThumb(doc.id, bytes);\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\n doc.pFlags.stickerThumbConverted = true;\n\n if((middleware && !middleware()) || (div as HTMLElement[])[0].childElementCount) {\n loadThumbPromise.resolve();\n return;\n }\n\n r();\n }).catch(() => loadThumbPromise.resolve());\n }\n }\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\n const load = async() => {\n if((div as HTMLElement[])[0].childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n const r = (div: HTMLElement, thumbImage: HTMLElement, url: string) => {\n if(div.childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n if(!url) afterRender(div, thumbImage);\n else renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n };\n\n await getCacheContext();\n (div as HTMLElement[]).forEach((div) => {\n if(cacheContext.url) {\n r(div, new Image(), cacheContext.url);\n } else if('bytes' in thumb) {\n const res = getImageFromStrippedThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n res.loadPromise.then(() => r(div, res.image, ''));\n\n // return managers.appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\n } else {\n appDownloadManager.downloadMediaURL({\n media: doc,\n thumb: thumb as PhotoSize\n }).then(async(url) => {\n return r(div, new Image(), url);\n });\n }\n });\n };\n\n if(lazyLoadQueue && onlyThumb) {\n lazyLoadQueue.push({div: div[0], load});\n loadThumbPromise.resolve();\n return ret;\n } else {\n load();\n\n if((thumb as any).url) {\n haveThumbCached = true;\n }\n }\n }\n }\n\n if(loadPromises && haveThumbCached) {\n loadPromises.push(loadThumbPromise);\n }\n\n if(onlyThumb/* || true */) { // for sticker panel\n return ret;\n }\n\n const middlewareError = makeError('MIDDLEWARE');\n const load = async() => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n if(stickerType === 2 && !asStatic) {\n return appDownloadManager.downloadMedia({media: doc, queueId: lazyLoadQueue?.queueId, thumb: fullThumb})\n .then(async(blob) => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n const animation = await lottieLoader.loadAnimationWorker({\n container: (div as HTMLElement[])[0],\n loop: !!(!emoji || isCustomEmoji) && loop,\n autoplay: play,\n animationData: blob,\n width,\n height,\n name: 'doc' + doc.id,\n needUpscale,\n skipRatio,\n toneIndex,\n sync: isCustomEmoji\n }, group, loadStickerMiddleware ?? middleware);\n\n // const deferred = deferredPromise();\n\n const setLockColor = willHaveLock ? () => {\n const lockUrl = locksUrls[doc.id] ??= computeLockColor(animation.canvas[0]);\n (div as HTMLElement[]).forEach((div) => div.style.setProperty('--lock-url', `url(${lockUrl})`));\n } : undefined;\n\n const onFirstFrame = (container: HTMLElement, canvas: HTMLCanvasElement) => {\n const element = container.firstElementChild;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\n }\n\n const cb = () => {\n if(element && element !== canvas && element.tagName !== 'DIV') {\n element.remove();\n }\n };\n\n if(!needFadeIn) {\n if(element) {\n sequentialDom.mutate(cb);\n }\n } else {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.add('fade-in');\n if(element) {\n element.classList.add('fade-out');\n }\n\n (canvas || element).addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.remove('fade-in');\n cb();\n });\n }, {once: true});\n });\n }\n };\n\n animation.addEventListener('firstFrame', () => {\n const canvas = animation.canvas[0];\n if(withThumb !== false || isCustomEmoji) {\n saveLottiePreview(doc, canvas, toneIndex);\n }\n\n if(willHaveLock) {\n setLockColor();\n }\n\n if(!isCustomEmoji) {\n (div as HTMLElement[]).forEach((container, idx) => {\n onFirstFrame(container, animation.canvas[idx]);\n });\n }\n }, {once: true});\n\n if(emoji) {\n managers.appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\n }\n\n return animation;\n\n // return deferred;\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n });\n } else if(asStatic || stickerType === 3) {\n const isSingleVideo = isAnimated && syncedVideo;\n const cacheName = isSingleVideo ? framesCache.generateName('' + doc.id, 0, 0, undefined, undefined) : undefined;\n\n const cachePromise = videosCache[cacheName];\n if(cachePromise) {\n return cachePromise as typeof promise;\n }\n\n const d = isSingleVideo ? (div as HTMLElement[]).slice(0, 1) : div as HTMLElement[];\n const media: HTMLElement[] = d.map(() => {\n let media: HTMLElement;\n if(asStatic) {\n media = new Image();\n } else {\n const video = media = createVideo();\n video.muted = true;\n if(play) video.autoplay = true;\n if(loop) video.loop = true;\n\n if(loop && typeof(loop) === 'number') {\n let previousTime = 0, playedTimes = 0;\n function onTimeupdate(this: HTMLVideoElement) {\n if(previousTime > this.currentTime && ++playedTimes === loop as number) {\n this.autoplay = false;\n this.loop = false;\n this.pause();\n video.removeEventListener('timeupdate', onTimeupdate);\n }\n\n previousTime = this.currentTime;\n }\n\n video.addEventListener('timeupdate', onTimeupdate);\n }\n }\n\n media.classList.add('media-sticker');\n return media;\n });\n\n const thumbImage = (div as HTMLElement[]).map((div, idx) => (div.firstElementChild as HTMLElement) !== media[idx] && div.firstElementChild) as HTMLElement[];\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage[0] : (!thumbImage[0] || thumbImage[0].tagName === 'svg'))) && rootScope.settings.animationsEnabled;\n }\n\n if(needFadeIn) {\n media.forEach((media) => media.classList.add('fade-in'));\n }\n\n const promise = new Promise(async(resolve, reject) => {\n const r = async() => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n const mediaLength = media.length;\n const loaded: HTMLElement[] = [];\n const onLoad = (div: HTMLElement, media: HTMLElement, thumbImage: HTMLElement) => {\n sequentialDom.mutateElement(div, () => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n if(!media) {\n if(!isSingleVideo || !isAnimated) {\n thumbImage?.remove();\n }\n\n return;\n }\n\n if(media as HTMLVideoElement) {\n const w = width * window.devicePixelRatio;\n const h = height * window.devicePixelRatio;\n if(!isSavingLottiePreview(doc, toneIndex, w, h)) {\n // const perf = performance.now();\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(media as HTMLVideoElement, 0, 0, canvas.width, canvas.height);\n saveLottiePreview(doc, canvas, toneIndex);\n // console.log('perf', performance.now() - perf);\n }\n }\n\n if(isSingleVideo) {\n resolve(media as any);\n return;\n }\n\n div.append(media);\n\n if(needFadeIn) {\n thumbImage && thumbImage.classList.add('fade-out');\n media.addEventListener('animationend', () => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n\n if(isAnimated) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n\n if(loaded.push(media) === mediaLength) {\n resolve(loaded as any);\n }\n });\n };\n\n await getCacheContext();\n let lastPromise: Promise;\n (div as HTMLElement[]).forEach((div, idx) => {\n const _media = media[idx];\n const cb = () => onLoad(div, _media, thumbImage[idx]);\n if(_media) lastPromise = renderImageFromUrlPromise(_media, cacheContext.url);\n lastPromise.then(cb);\n });\n };\n\n await getCacheContext();\n if(cacheContext.url) r();\n else {\n let promise: Promise;\n if(stickerType !== 1 && asStatic) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n // promise = managers.appDocsManager.getThumbURL(doc, thumb).promise\n promise = appDownloadManager.downloadMediaURL({media: doc, thumb, queueId: lazyLoadQueue?.queueId});\n } else {\n promise = appDownloadManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId});\n }\n\n promise.then(r, reject);\n }\n });\n\n if(cacheName) {\n videosCache[cacheName] = promise as any;\n loadStickerMiddleware && promise.finally(() => {\n if(!loadStickerMiddleware()) {\n delete videosCache[cacheName];\n }\n });\n }\n\n return promise;\n }\n };\n\n if(exportLoad && ((exportLoad === 1 && (!downloaded || isAnimated)) || exportLoad === 2)) {\n ret.load = load;\n return ret;\n }\n\n const loadPromise: Promise> | void> = lazyLoadQueue && (!downloaded || isAnimated) ?\n (lazyLoadQueue.push({div: div[0], load}), Promise.resolve()) :\n load();\n\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\n loadThumbPromise = loadPromise as any;\n if(loadPromises) {\n loadPromises.push(loadThumbPromise);\n }\n }\n\n if(stickerType === 2 && effectThumb && isOut !== undefined && !noPremium) {\n attachStickerEffectHandler({\n container: div[0],\n doc,\n managers,\n middleware,\n isOut,\n width,\n loadPromise,\n relativeEffect,\n loopEffect\n });\n }\n\n ret.render = loadPromise as any;\n return ret;\n}\n\nfunction attachStickerEffectHandler({container, doc, managers, middleware, isOut, width, loadPromise, relativeEffect, loopEffect}: {\n container: HTMLElement,\n doc: MyDocument,\n managers: AppManagers,\n middleware: Middleware,\n isOut: boolean,\n width: number,\n loadPromise: Promise,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n managers.appStickersManager.preloadSticker(doc.id, true);\n\n let playing = false;\n attachClickEvent(container, async(e) => {\n cancelEvent(e);\n if(playing) {\n const a = document.createElement('a');\n a.onclick = () => {\n hideToast();\n new PopupStickers(doc.stickerSetInput).show();\n };\n\n toastNew({\n langPackKey: 'Sticker.Premium.Click.Info',\n langPackArguments: [a]\n });\n\n return;\n }\n\n playing = true;\n\n await loadPromise;\n const {animationDiv, stickerPromise} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: width * STICKER_EFFECT_MULTIPLIER,\n target: container,\n play: true,\n fullThumb: getStickerEffectThumb(doc),\n relativeEffect,\n loopEffect\n });\n\n if(isOut !== undefined && !isOut/* && !relativeEffect */) {\n animationDiv.classList.add('reflect-x');\n }\n\n stickerPromise.then((player) => {\n player.addEventListener('destroy', () => {\n playing = false;\n });\n });\n });\n}\n\nexport async function onEmojiStickerClick({event, container, managers, peerId, middleware}: {\n event: Event,\n container: HTMLElement,\n managers: AppManagers,\n peerId: PeerId,\n middleware: Middleware\n}) {\n cancelEvent(event);\n\n const bubble = findUpClassName(container, 'bubble');\n const emoji = container.dataset.stickerEmoji;\n\n const animation = !container.classList.contains('custom-emoji') ? lottieLoader.getAnimation(container) : undefined;\n if(animation?.paused) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSoundDocument(emoji);\n if(doc) {\n const audio = document.createElement('audio');\n audio.style.display = 'none';\n container.parentElement.append(audio);\n\n try {\n const url = await appDownloadManager.downloadMediaURL({media: doc});\n\n audio.src = url;\n audio.play();\n await onMediaLoad(audio, undefined, true);\n\n audio.addEventListener('ended', () => {\n audio.src = '';\n audio.remove();\n }, {once: true});\n } catch(err) {\n\n }\n }\n\n animation.autoplay = true;\n animation.restart();\n }\n\n if(!peerId.isUser()) {\n return;\n }\n\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji, true);\n if(!doc) {\n return;\n }\n\n const data: SendMessageEmojiInteractionData = (container as any).emojiData ??= {\n a: [],\n v: 1\n };\n\n const sendInteractionThrottled: () => void = (container as any).sendInteractionThrottled = throttle(() => {\n const length = data.a.length;\n if(!length) {\n return;\n }\n\n const firstTime = data.a[0].t;\n\n data.a.forEach((a) => {\n a.t = (a.t - firstTime) / 1000;\n });\n\n const bubble = findUpClassName(container, 'bubble');\n managers.appMessagesManager.setTyping(appImManager.chat.peerId, {\n _: 'sendMessageEmojiInteraction',\n msg_id: getServerMessageId(+bubble.dataset.mid),\n emoticon: emoji,\n interaction: {\n _: 'dataJSON',\n data: JSON.stringify(data)\n }\n }, true, appImManager.chat.threadId);\n\n data.a.length = 0;\n }, 1000, false);\n\n const isOut = bubble ? bubble.classList.contains('is-out') : undefined;\n const {animationDiv} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: 360,\n target: container,\n play: true,\n withRandomOffset: true\n });\n\n if(isOut !== undefined && !isOut) {\n animationDiv.classList.add('reflect-x');\n }\n\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\n if(event.isTrusted) {\n data.a.push({\n i: 1,\n t: Date.now()\n });\n\n sendInteractionThrottled();\n }\n // });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n/**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\nexport default function getPathFromBytes(bytes: Uint8Array) {\n const lookup = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,';\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-';\n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n}\n","// https://github.com/telegramdesktop/tdesktop/blob/543bfab24a76402992421063f1e6444f347d31fe/Telegram/SourceFiles/boxes/sticker_set_box.cpp#L75\nexport default function computeLockColor(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const size = 20 * (canvas.dpr ?? 1);\n const width = size;\n const height = size;\n const skipx = (canvas.width - width) / 2;\n const margin = 0/* * (canvas.dpr ?? 1) */;\n const skipy = canvas.height - height - margin;\n const imageData = context.getImageData(skipx, skipy, width, height).data;\n let sr = 0, sg = 0, sb = 0, sa = 0;\n for(let i = 0; i < imageData.length; i += 4) {\n sr += imageData[i];\n sg += imageData[i + 1];\n sb += imageData[i + 2];\n sa += imageData[i + 3];\n }\n\n const outCanvas = document.createElement('canvas');\n outCanvas.width = size;\n outCanvas.height = size;\n const outContext = outCanvas.getContext('2d');\n const color = new Uint8ClampedArray([sr * 255 / sa, sg * 255 / sa, sb * 255 / sa, 255]);\n const rgba = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`;\n outContext.fillStyle = rgba;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n outContext.fillStyle = `rgba(112, 117, 121, 0.3)`;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n // document.querySelector('.popup-title').append(c);\n return outCanvas.toDataURL('image/jpeg');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport assumeType from '../../helpers/assumeType';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport makeError from '../../helpers/makeError';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport throttleWithRaf from '../../helpers/schedulers/throttleWithRaf';\nimport windowSize from '../../helpers/windowSize';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerAnimation({\n size,\n doc,\n middleware,\n target,\n side,\n skipRatio,\n play,\n managers,\n fullThumb,\n withRandomOffset,\n relativeEffect,\n loopEffect\n}: {\n size: number,\n doc: MyDocument,\n middleware?: Middleware,\n target: HTMLElement,\n side: 'left' | 'center' | 'right',\n skipRatio?: number,\n play: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n withRandomOffset?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n const animationDiv = document.createElement('div');\n animationDiv.classList.add('emoji-animation');\n\n // const size = 280;\n animationDiv.style.width = size + 'px';\n animationDiv.style.height = size + 'px';\n\n let animation: RLottiePlayer;\n const unmountAnimation = () => {\n middlewareHelper.clean();\n animation?.remove();\n animationDiv.remove();\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\n };\n\n const middlewareHelper = middleware?.create() ?? getMiddleware();\n middleware = middlewareHelper.get();\n\n const stickerPromise = wrapSticker({\n div: animationDiv,\n doc,\n middleware,\n withThumb: false,\n needFadeIn: false,\n loop: !!loopEffect,\n width: size,\n height: size,\n play,\n group: 'none',\n skipRatio,\n managers,\n fullThumb\n }).then(({render}) => render).then((_animation) => {\n assumeType(_animation);\n if(!middleware()) {\n _animation.remove();\n throw makeError('MIDDLEWARE');\n }\n\n animation = _animation;\n animation.addEventListener('enterFrame', (frameNo) => {\n if((!loopEffect && frameNo === animation.maxFrame) || !isInDOM(target)) {\n unmountAnimation();\n }\n });\n\n if(IS_VIBRATE_SUPPORTED) {\n animation.addEventListener('firstFrame', () => {\n navigator.vibrate(100);\n }, {once: true});\n }\n\n return animation;\n });\n\n const generateRandomSigned = (max: number) => {\n const r = Math.random() * max * 2;\n return r > max ? -r % max : r;\n };\n\n const randomOffsetX = withRandomOffset ? generateRandomSigned(16) : 0;\n const randomOffsetY = withRandomOffset ? generateRandomSigned(4) : 0;\n const setPosition = () => {\n if(!isInDOM(target)) {\n unmountAnimation();\n return;\n }\n\n const rect = target.getBoundingClientRect();\n\n const factor = rect.width / 200;\n const stableOffsetX = side === 'center' ? 0 : 16 * (side === 'right' ? 1 : -1) * factor;\n // const stableOffsetY = side === 'center' ? 0 : -50 * factor;\n const stableOffsetY = side === 'center' ? 0 : 0 * factor;\n\n const rectX = side === 'right' ? rect.right : rect.left;\n const rectY = rect.top;\n\n const addOffsetX = (side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0)) + stableOffsetX + randomOffsetX;\n const addOffsetY = (side === 'center' || true ? (rect.height - size) / 2 : 0) + stableOffsetY + randomOffsetY;\n const x = rectX + addOffsetX;\n const y = rectY + addOffsetY;\n\n if(y <= -size || y >= windowSize.height) {\n unmountAnimation();\n return;\n }\n\n if(relativeEffect) {\n if(side !== 'center') animationDiv.style[side] = Math.abs(stableOffsetX) * -1 + 'px';\n else animationDiv.style.left = addOffsetX + 'px';\n animationDiv.style.top = addOffsetY + 'px';\n } else {\n animationDiv.style.top = y + 'px';\n animationDiv.style.left = x + 'px';\n }\n };\n\n const onScroll = throttleWithRaf(setPosition);\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\n\n setPosition();\n\n if(relativeEffect) {\n animationDiv.classList.add('is-relative');\n target.parentElement.append(animationDiv);\n } else {\n appImManager.emojiAnimationContainer.append(animationDiv);\n }\n\n return {animationDiv, stickerPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport wrapSticker from './sticker'\n\nexport default async function wrapStickerEmoji({emoji, div, width, height, managers = rootScope.managers}: {\n emoji: string,\n div: HTMLElement,\n managers?: AppManagers,\n width: number,\n height: number\n}) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n if(!doc) {\n div.classList.add('media-sticker-wrapper');\n throw new Error('no sticker');\n }\n\n return wrapSticker({\n doc,\n div,\n emoji,\n width,\n height,\n loop: false,\n play: true\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport createVideo from '../../helpers/dom/createVideo';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport {Document, StickerSet} from '../../layer';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapSticker from './sticker';\n\nexport default async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height, managers = rootScope.managers}: {\n set: StickerSet.stickerSet,\n lazyLoadQueue: LazyLoadQueue,\n container: HTMLElement,\n group: AnimationItemGroup,\n autoplay: boolean,\n width: number,\n height: number,\n managers?: AppManagers\n}) {\n if(set.thumbs?.length) {\n container.classList.add('media-sticker-wrapper');\n lazyLoadQueue.push({\n div: container,\n load: async() => {\n const downloadOptions = await managers.appStickersManager.getStickerSetThumbDownloadOptions(set);\n const promise = appDownloadManager.download(downloadOptions);\n\n if(set.pFlags.animated && !set.pFlags.videos) {\n return promise\n .then((blob) => {\n lottieLoader.loadAnimationWorker({\n container,\n loop: true,\n autoplay,\n animationData: blob,\n width,\n height,\n needUpscale: true,\n name: 'setThumb' + set.id\n }, group);\n });\n } else {\n let media: HTMLElement;\n if(set.pFlags.videos) {\n media = createVideo();\n (media as HTMLVideoElement).autoplay = true;\n (media as HTMLVideoElement).muted = true;\n (media as HTMLVideoElement).loop = true;\n } else {\n media = new Image();\n }\n\n media.classList.add('media-sticker');\n\n return promise.then((blob) => {\n renderImageFromUrl(media, URL.createObjectURL(blob), () => {\n container.append(media);\n\n if(set.pFlags.videos) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n });\n });\n }\n }\n });\n\n return;\n }\n\n let getDocPromise: Promise;\n\n if(set.thumb_document_id) {\n getDocPromise = managers.appEmojiManager.getCustomEmojiDocument(set.thumb_document_id);\n } else {\n getDocPromise = managers.appStickersManager.getStickerSet(set).then((stickerSet) => stickerSet.documents[0]);\n }\n\n const doc = await getDocPromise;\n if(doc._ !== 'documentEmpty') { // as thumb will be used first sticker\n wrapSticker({\n doc,\n div: container,\n group: group,\n lazyLoadQueue,\n managers,\n width,\n height\n }); // kostil\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport Row from '../row';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerToRow({doc, row, size, managers}: {\n doc: MyDocument,\n row: Row,\n size?: 'small' | 'large',\n managers?: AppManagers\n}) {\n const previousMedia = row.media;\n const media = row.createMedia('small');\n\n if(previousMedia) {\n media.classList.add('hide');\n }\n\n const loadPromises: Promise[] = previousMedia ? [] : undefined;\n\n const _size = size === 'small' ? 32 : 48;\n const result = wrapSticker({\n div: media,\n doc: doc,\n width: _size,\n height: _size,\n loadPromises,\n managers\n }).then(({render}) => render);\n\n loadPromises && Promise.all(loadPromises).then(() => {\n media.classList.remove('hide');\n previousMedia.remove();\n });\n\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {i18n} from '../../lib/langPack';\nimport wrapTelegramUrlToAnchor from '../../lib/richTextProcessor/wrapTelegramUrlToAnchor';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function wrapTopicNameButton(\n options: {\n lastMsgId?: number\n } & Pick[0], 'peerId' | 'threadId' | 'wrapOptions' | 'withIcons'>\n) {\n const {peerId, threadId, lastMsgId} = options;\n\n const loadPromise: Promise = Promise.resolve();\n const a = wrapTelegramUrlToAnchor('t.me/c/' + peerId.toChatId() + (threadId ? '/' + getServerMessageId(threadId) : '') + (lastMsgId ? '/' + getServerMessageId(lastMsgId) : ''));\n a.classList.add('topic-name', 'topic-name-button');\n // if(threadId) {\n // const topic = await rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId);\n // if(!topic) {\n // a.append(i18n('Loading'));\n // loadPromise = rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId)\n // }\n // } else {\n a.append(await wrapPeerTitle(options));\n // }\n\n return {\n cached: true,\n element: a,\n loadPromise\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport {animateSingle} from '../../helpers/animation';\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport makeError from '../../helpers/makeError';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {fastRaf} from '../../helpers/schedulers';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {Message, PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport rootScope from '../../lib/rootScope';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appMediaPlaybackController, {MediaSearchContext} from '../appMediaPlaybackController';\nimport {findMediaTargets} from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\n\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\n\nlet roundVideoCircumference = 0;\nmediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\n const width = mediaSizes.active.round.width;\n const halfSize = width / 2;\n const radius = halfSize - 7;\n roundVideoCircumference = 2 * Math.PI * radius;\n elements.forEach((element) => {\n element.setAttributeNS(null, 'width', '' + width);\n element.setAttributeNS(null, 'height', '' + width);\n\n const circle = element.firstElementChild as SVGCircleElement;\n circle.setAttributeNS(null, 'cx', '' + halfSize);\n circle.setAttributeNS(null, 'cy', '' + halfSize);\n circle.setAttributeNS(null, 'r', '' + radius);\n\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n });\n }\n});\n\nexport default async function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, noPreview, withoutPreloader, loadPromises, noPlayButton, photoSize, videoSize, searchContext, autoDownload, managers = rootScope.managers, noAutoplayAttribute}: {\n doc: MyDocument,\n container?: HTMLElement,\n message?: Message.message,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n noInfo?: boolean,\n noPlayButton?: boolean,\n group?: AnimationItemGroup,\n onlyPreview?: boolean,\n noPreview?: boolean,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n photoSize?: PhotoSize,\n videoSize?: VideoSize,\n searchContext?: MediaSearchContext,\n managers?: AppManagers,\n noAutoplayAttribute?: boolean\n}) {\n const autoDownloadSize = autoDownload?.video;\n let noAutoDownload = autoDownloadSize === 0;\n const isAlbumItem = !(boxWidth && boxHeight);\n const canAutoplay = /* doc.sticker || */(\n (\n doc.type !== 'video' || (\n doc.size <= MAX_VIDEO_AUTOPLAY_SIZE &&\n !isAlbumItem\n )\n ) && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos)\n );\n let spanTime: HTMLElement, spanPlay: HTMLElement;\n\n if(!noInfo) {\n spanTime = document.createElement('span');\n spanTime.classList.add('video-time');\n container.append(spanTime);\n\n let needPlayButton = false;\n if(doc.type !== 'gif') {\n spanTime.innerText = toHHMMSS(doc.duration, false);\n\n if(!noPlayButton && doc.type !== 'round') {\n if(canAutoplay && !noAutoDownload) {\n spanTime.classList.add('tgico', 'can-autoplay');\n } else {\n needPlayButton = true;\n }\n }\n } else {\n spanTime.innerText = 'GIF';\n\n if(!canAutoplay && !noPlayButton) {\n needPlayButton = true;\n noAutoDownload = undefined;\n }\n }\n\n if(needPlayButton) {\n spanPlay = document.createElement('span');\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\n container.append(spanPlay);\n }\n }\n\n const res: {\n thumb?: typeof photoRes,\n loadPromise: Promise\n } = {} as any;\n\n if(doc.mime_type === 'image/gif') {\n const photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader,\n loadPromises,\n autoDownloadSize,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\n if(video.parentElement) {\n video.remove();\n } */\n\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\n\n const video = createVideo();\n video.classList.add('media-video');\n video.muted = true;\n if(doc.type === 'round') {\n const divRound = document.createElement('div');\n divRound.classList.add('media-round', 'z-depth-1');\n divRound.dataset.mid = '' + message.mid;\n divRound.dataset.peerId = '' + message.peerId;\n (divRound as any).message = message;\n\n const size = mediaSizes.active.round;\n const halfSize = size.width / 2;\n const strokeWidth = 3.5;\n const radius = halfSize - (strokeWidth * 2);\n divRound.innerHTML = `\n \n `;\n\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\n if(!roundVideoCircumference) {\n roundVideoCircumference = 2 * Math.PI * radius;\n }\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n\n spanTime.classList.add('tgico');\n\n const isUnread = message.pFlags.media_unread;\n if(isUnread) {\n divRound.classList.add('is-unread');\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\n\n divRound.prepend(canvas, spanTime);\n divRound.append(video);\n container.append(divRound);\n\n const ctx = canvas.getContext('2d');\n /* ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\n ctx.clip(); */\n\n const onLoad = () => {\n const message: Message.message = (divRound as any).message;\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\n const clear = () => {\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\n if(isInDOM(globalVideo)) {\n return;\n }\n\n globalVideo.removeEventListener('play', onPlay);\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.removeEventListener('pause', onPaused);\n globalVideo.removeEventListener('ended', onEnded);\n });\n };\n\n const onFrame = () => {\n ctx.drawImage(globalVideo, 0, 0);\n\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\n circle.style.strokeDashoffset = '' + offset;\n\n return !globalVideo.paused;\n };\n\n const onTimeUpdate = () => {\n if(!globalVideo.duration) {\n return;\n }\n\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n if(globalVideo.paused) {\n onFrame();\n }\n\n spanTime.innerText = toHHMMSS(globalVideo.duration - globalVideo.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1000, false);\n\n const onPlay = () => {\n video.classList.add('hide');\n divRound.classList.remove('is-paused');\n animateSingle(onFrame, canvas);\n\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\n preloader.onClick();\n }\n };\n\n const onPaused = () => {\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n divRound.classList.add('is-paused');\n };\n\n const onEnded = () => {\n video.classList.remove('hide');\n divRound.classList.add('is-paused');\n\n video.currentTime = 0;\n spanTime.innerText = toHHMMSS(globalVideo.duration, false);\n\n if(globalVideo.currentTime) {\n globalVideo.currentTime = 0;\n }\n };\n\n globalVideo.addEventListener('play', onPlay);\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.addEventListener('pause', onPaused);\n globalVideo.addEventListener('ended', onEnded);\n\n attachClickEvent(canvas, (e) => {\n cancelEvent(e);\n\n // ! костыль\n if(preloader && !preloader.detached) {\n preloader.onClick();\n }\n\n // ! can't use it here. on Safari iOS video won't start.\n /* if(globalVideo.readyState < 2) {\n return;\n } */\n\n if(globalVideo.paused) {\n const hadSearchContext = !!searchContext;\n if(appMediaPlaybackController.setSearchContext(searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound, message.mid/* , searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\n }\n\n globalVideo.play();\n } else {\n globalVideo.pause();\n }\n });\n\n if(globalVideo.paused) {\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\n onFrame();\n onTimeUpdate();\n video.classList.add('hide');\n } else {\n onPaused();\n }\n } else {\n onPlay();\n }\n };\n\n if(message.pFlags.is_outgoing) {\n (divRound as any).onLoad = onLoad;\n divRound.dataset.isOutgoing = '1';\n } else {\n onLoad();\n }\n } else if(!noAutoplayAttribute) {\n video.autoplay = true; // для safari\n }\n\n let photoRes: Awaited>;\n if(message) {\n photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n autoDownloadSize: autoDownload?.photo,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n if(withTail) {\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\n video.width = +foreignObject.getAttributeNS(null, 'width');\n video.height = +foreignObject.getAttributeNS(null, 'height');\n foreignObject.append(video);\n }\n } else if(!noPreview) { // * gifs masonry\n const gotThumb = getStrippedThumbIfNeeded(doc, {} as ThumbCache, true);\n if(gotThumb) {\n const thumbImage = gotThumb.image;\n thumbImage.classList.add('media-poster');\n container.append(thumbImage);\n res.thumb = {\n loadPromises: {\n thumb: gotThumb.loadPromise,\n full: Promise.resolve()\n },\n images: {\n thumb: thumbImage,\n full: null\n },\n preloader: null,\n aspecter: null\n };\n\n loadPromises?.push(gotThumb.loadPromise);\n res.loadPromise = gotThumb.loadPromise;\n }\n }\n\n if(onlyPreview) {\n return res;\n }\n\n if(!video.parentElement && container) {\n (photoRes?.aspecter || container).append(video);\n }\n\n let cacheContext: ThumbCache;\n const getCacheContext = async() => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, videoSize?.type);\n };\n\n await getCacheContext();\n\n const uploadFileName = message?.uploadingFileName;\n if(uploadFileName) { // means upload\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: true\n });\n preloader.attachPromise(appDownloadManager.getUpload(uploadFileName));\n preloader.attach(container, false);\n noAutoDownload = undefined;\n } else if(!cacheContext.downloaded && !doc.supportsStreaming && !withoutPreloader) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend'\n });\n } else if(doc.supportsStreaming) {\n preloader = new ProgressivePreloader({\n cancelable: false,\n attachMethod: 'prepend'\n });\n }\n\n const renderDeferred = deferredPromise();\n video.addEventListener('error', (e) => {\n if(video.error.code !== 4) {\n console.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n if(!renderDeferred.isFulfilled) {\n renderDeferred.resolve();\n }\n }, {once: true});\n\n if(doc.type === 'video') {\n const onTimeUpdate = () => {\n if(!video.duration) {\n return;\n }\n\n spanTime.innerText = toHHMMSS(video.duration - video.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1e3, false);\n\n video.addEventListener('timeupdate', throttledTimeUpdate);\n\n if(spanPlay) {\n video.addEventListener('timeupdate', () => {\n sequentialDom.mutateElement(spanPlay, () => {\n spanPlay.remove();\n });\n }, {once: true});\n }\n }\n\n video.muted = true;\n video.loop = true;\n // video.play();\n if(!noAutoplayAttribute) {\n video.autoplay = true;\n }\n\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\n const load = async() => {\n if(preloader && noAutoDownload && !withoutPreloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n await getCacheContext();\n let loadPromise: Promise = Promise.resolve();\n if((preloader && !uploadFileName) || withoutPreloader) {\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\n const promise = loadPromise = appDownloadManager.downloadMediaURL({\n media: doc,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: noAutoDownload,\n thumb: videoSize\n });\n\n if(preloader) {\n preloader.attach(container, false, promise);\n }\n } else if(doc.supportsStreaming) {\n if(noAutoDownload) {\n loadPromise = Promise.reject(makeError('NO_AUTO_DOWNLOAD'));\n } else if(!cacheContext.downloaded && preloader) { // * check for uploading video\n preloader.attach(container, false, null);\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\n preloader.detach();\n }, {once: true});\n }\n }\n }\n\n if(!noAutoDownload && loadPhotoThumbFunc) {\n loadPhotoThumbFunc();\n loadPhotoThumbFunc = null;\n }\n\n noAutoDownload = undefined;\n\n loadPromise.then(async() => {\n if(middleware && !middleware()) {\n renderDeferred.resolve();\n return;\n }\n\n if(doc.type === 'round') {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n }\n\n await getCacheContext();\n\n onMediaLoad(video).then(() => {\n if(group) {\n animationIntersector.addAnimation(video, group);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n renderDeferred.resolve();\n }, (err) => {\n console.error('video load error', err);\n renderDeferred.reject(err);\n });\n\n renderImageFromUrl(video, cacheContext.url);\n }, noop);\n\n return {download: loadPromise, render: Promise.all([loadPromise, renderDeferred])};\n };\n\n if(preloader && !uploadFileName) {\n preloader.setDownloadFunction(load);\n }\n\n /* if(doc.size >= 20e6 && !doc.downloaded) {\n let downloadDiv = document.createElement('div');\n downloadDiv.classList.add('download');\n\n let span = document.createElement('span');\n span.classList.add('btn-circle', 'tgico-download');\n downloadDiv.append(span);\n\n downloadDiv.addEventListener('click', () => {\n downloadDiv.remove();\n loadVideo();\n });\n\n container.prepend(downloadDiv);\n\n return;\n } */\n\n if(doc.type === 'gif' && !canAutoplay) {\n attachClickEvent(container, (e) => {\n cancelEvent(e);\n spanPlay.remove();\n load();\n }, {capture: true, once: true});\n } else {\n res.loadPromise = !lazyLoadQueue ?\n (await load()).render :\n (lazyLoadQueue.push({div: container, load: () => load().then(({render}) => render)}), Promise.resolve());\n }\n\n if(res.thumb) {\n await res.thumb.loadPromises.thumb;\n }\n\n return res;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageDescription(webPage: WebPage.webPage) {\n const shortDescriptionText = limitSymbols(webPage.description || '', 150, 180);\n // const siteName = webPage.site_name;\n // let contextHashtag = '';\n // if(siteName === 'GitHub') {\n // const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\n // if(matches) {\n // contextHashtag = matches[0] + '/issues/{1}';\n // }\n // }\n return wrapRichText(shortDescriptionText/* , {\n contextSite: siteName || 'external',\n contextHashtag: contextHashtag\n } */);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageTitle(webPage: WebPage.webPage) {\n let shortTitle = webPage.title || webPage.author || webPage.site_name || '';\n shortTitle = limitSymbols(shortTitle, 80, 100);\n return wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\n}\n","// Taken from https://core.telegram.org/bots/payments/currencies.json\nexport type Currency = {\n code: string,\n title: string,\n symbol: string,\n native: string,\n thousands_sep: string,\n decimal_sep: string,\n symbol_left: boolean,\n space_between: boolean,\n exp: number,\n min_amount: string | number,\n max_amount: string | number\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nconst Currencies: {[currency: string]: Currency} = {\"AED\":{\"code\":\"AED\",\"title\":\"United Arab Emirates Dirham\",\"symbol\":\"AED\",\"native\":\"د.إ.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"367\",\"max_amount\":\"3673030\"},\"AFN\":{\"code\":\"AFN\",\"title\":\"Afghan Afghani\",\"symbol\":\"AFN\",\"native\":\"؋\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8729\",\"max_amount\":\"87299487\"},\"ALL\":{\"code\":\"ALL\",\"title\":\"Albanian Lek\",\"symbol\":\"ALL\",\"native\":\"Lek\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"11842\",\"max_amount\":\"118421187\"},\"AMD\":{\"code\":\"AMD\",\"title\":\"Armenian Dram\",\"symbol\":\"AMD\",\"native\":\"դր.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"40943\",\"max_amount\":\"409436718\"},\"ARS\":{\"code\":\"ARS\",\"title\":\"Argentine Peso\",\"symbol\":\"ARS\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14705\",\"max_amount\":\"147059002\"},\"AUD\":{\"code\":\"AUD\",\"title\":\"Australian Dollar\",\"symbol\":\"AU$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"153\",\"max_amount\":\"1536825\"},\"AZN\":{\"code\":\"AZN\",\"title\":\"Azerbaijani Manat\",\"symbol\":\"AZN\",\"native\":\"ман.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"169\",\"max_amount\":\"1699858\"},\"BAM\":{\"code\":\"BAM\",\"title\":\"Bosnia & Herzegovina Convertible Mark\",\"symbol\":\"BAM\",\"native\":\"KM\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1990677\"},\"BDT\":{\"code\":\"BDT\",\"title\":\"Bangladeshi Taka\",\"symbol\":\"BDT\",\"native\":\"৳\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"10009\",\"max_amount\":\"100094046\"},\"BGN\":{\"code\":\"BGN\",\"title\":\"Bulgarian Lev\",\"symbol\":\"BGN\",\"native\":\"лв.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1993315\"},\"BND\":{\"code\":\"BND\",\"title\":\"Brunei Dollar\",\"symbol\":\"BND\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"142\",\"max_amount\":\"1421883\"},\"BOB\":{\"code\":\"BOB\",\"title\":\"Bolivian Boliviano\",\"symbol\":\"BOB\",\"native\":\"Bs\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"683\",\"max_amount\":\"6832607\"},\"BRL\":{\"code\":\"BRL\",\"title\":\"Brazilian Real\",\"symbol\":\"R$\",\"native\":\"R$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"539\",\"max_amount\":\"5397799\"},\"BYN\":{\"code\":\"BYN\",\"title\":\"Belarusian ruble\",\"symbol\":\"BYN\",\"native\":\"BYN\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"249\",\"max_amount\":\"2495801\"},\"CAD\":{\"code\":\"CAD\",\"title\":\"Canadian Dollar\",\"symbol\":\"CA$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"136\",\"max_amount\":\"1366860\"},\"CHF\":{\"code\":\"CHF\",\"title\":\"Swiss Franc\",\"symbol\":\"CHF\",\"native\":\"CHF\",\"thousands_sep\":\"'\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"97\",\"max_amount\":\"976705\"},\"CLP\":{\"code\":\"CLP\",\"title\":\"Chilean Peso\",\"symbol\":\"CLP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"963\",\"max_amount\":\"9637495\"},\"CNY\":{\"code\":\"CNY\",\"title\":\"Chinese Renminbi Yuan\",\"symbol\":\"CN¥\",\"native\":\"CN¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"709\",\"max_amount\":\"7094102\"},\"COP\":{\"code\":\"COP\",\"title\":\"Colombian Peso\",\"symbol\":\"COP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"452870\",\"max_amount\":\"4528700000\"},\"CRC\":{\"code\":\"CRC\",\"title\":\"Costa Rican Colón\",\"symbol\":\"CRC\",\"native\":\"₡\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"62506\",\"max_amount\":\"625061070\"},\"CZK\":{\"code\":\"CZK\",\"title\":\"Czech Koruna\",\"symbol\":\"CZK\",\"native\":\"Kč\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"2497\",\"max_amount\":\"24975029\"},\"DKK\":{\"code\":\"DKK\",\"title\":\"Danish Krone\",\"symbol\":\"DKK\",\"native\":\"kr\",\"thousands_sep\":\"\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"755\",\"max_amount\":\"7555990\"},\"DOP\":{\"code\":\"DOP\",\"title\":\"Dominican Peso\",\"symbol\":\"DOP\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5275\",\"max_amount\":\"52757308\"},\"DZD\":{\"code\":\"DZD\",\"title\":\"Algerian Dinar\",\"symbol\":\"DZD\",\"native\":\"د.ج.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14035\",\"max_amount\":\"140353307\"},\"EGP\":{\"code\":\"EGP\",\"title\":\"Egyptian Pound\",\"symbol\":\"EGP\",\"native\":\"ج.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1953\",\"max_amount\":\"19537405\"},\"ETB\":{\"code\":\"ETB\",\"title\":\"Ethiopian Birr\",\"symbol\":\"ETB\",\"native\":\"ብር\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5224\",\"max_amount\":\"52247069\"},\"EUR\":{\"code\":\"EUR\",\"title\":\"Euro\",\"symbol\":\"€\",\"native\":\"€\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"101\",\"max_amount\":\"1016045\"},\"GBP\":{\"code\":\"GBP\",\"title\":\"British Pound\",\"symbol\":\"£\",\"native\":\"£\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"89\",\"max_amount\":\"894445\"},\"GEL\":{\"code\":\"GEL\",\"title\":\"Georgian Lari\",\"symbol\":\"GEL\",\"native\":\"GEL\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"283\",\"max_amount\":\"2830234\"},\"GTQ\":{\"code\":\"GTQ\",\"title\":\"Guatemalan Quetzal\",\"symbol\":\"GTQ\",\"native\":\"Q\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"778\",\"max_amount\":\"7781323\"},\"HKD\":{\"code\":\"HKD\",\"title\":\"Hong Kong Dollar\",\"symbol\":\"HK$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"784\",\"max_amount\":\"7849750\"},\"HNL\":{\"code\":\"HNL\",\"title\":\"Honduran Lempira\",\"symbol\":\"HNL\",\"native\":\"L\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"2441\",\"max_amount\":\"24413729\"},\"HRK\":{\"code\":\"HRK\",\"title\":\"Croatian Kuna\",\"symbol\":\"HRK\",\"native\":\"kn\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"764\",\"max_amount\":\"7648805\"},\"HUF\":{\"code\":\"HUF\",\"title\":\"Hungarian Forint\",\"symbol\":\"HUF\",\"native\":\"Ft\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"42685\",\"max_amount\":\"426850229\"},\"IDR\":{\"code\":\"IDR\",\"title\":\"Indonesian Rupiah\",\"symbol\":\"IDR\",\"native\":\"Rp\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"1523370\",\"max_amount\":\"15233700000\"},\"ILS\":{\"code\":\"ILS\",\"title\":\"Israeli New Sheqel\",\"symbol\":\"₪\",\"native\":\"₪\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"354\",\"max_amount\":\"3543350\"},\"INR\":{\"code\":\"INR\",\"title\":\"Indian Rupee\",\"symbol\":\"₹\",\"native\":\"₹\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8155\",\"max_amount\":\"81555550\"},\"ISK\":{\"code\":\"ISK\",\"title\":\"Icelandic Króna\",\"symbol\":\"ISK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"142\",\"max_amount\":\"1425603\"},\"JMD\":{\"code\":\"JMD\",\"title\":\"Jamaican Dollar\",\"symbol\":\"JMD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"15013\",\"max_amount\":\"150131044\"},\"JPY\":{\"code\":\"JPY\",\"title\":\"Japanese Yen\",\"symbol\":\"¥\",\"native\":\"¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"144\",\"max_amount\":\"1443065\"},\"KES\":{\"code\":\"KES\",\"title\":\"Kenyan Shilling\",\"symbol\":\"KES\",\"native\":\"Ksh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12075\",\"max_amount\":\"120750271\"},\"KGS\":{\"code\":\"KGS\",\"title\":\"Kyrgyzstani Som\",\"symbol\":\"KGS\",\"native\":\"KGS\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"8018\",\"max_amount\":\"80182898\"},\"KRW\":{\"code\":\"KRW\",\"title\":\"South Korean Won\",\"symbol\":\"₩\",\"native\":\"₩\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"1431\",\"max_amount\":\"14315201\"},\"KZT\":{\"code\":\"KZT\",\"title\":\"Kazakhstani Tenge\",\"symbol\":\"KZT\",\"native\":\"₸\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"47186\",\"max_amount\":\"471867112\"},\"LBP\":{\"code\":\"LBP\",\"title\":\"Lebanese Pound\",\"symbol\":\"LBP\",\"native\":\"ل.ل.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"150999\",\"max_amount\":\"1509998778\"},\"LKR\":{\"code\":\"LKR\",\"title\":\"Sri Lankan Rupee\",\"symbol\":\"LKR\",\"native\":\"රු.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"35546\",\"max_amount\":\"355469651\"},\"MAD\":{\"code\":\"MAD\",\"title\":\"Moroccan Dirham\",\"symbol\":\"MAD\",\"native\":\"د.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1093\",\"max_amount\":\"10938136\"},\"MDL\":{\"code\":\"MDL\",\"title\":\"Moldovan Leu\",\"symbol\":\"MDL\",\"native\":\"MDL\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1926\",\"max_amount\":\"19264439\"},\"MNT\":{\"code\":\"MNT\",\"title\":\"Mongolian Tögrög\",\"symbol\":\"MNT\",\"native\":\"MNT\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"322444\",\"max_amount\":\"3224442056\"},\"MUR\":{\"code\":\"MUR\",\"title\":\"Mauritian Rupee\",\"symbol\":\"MUR\",\"native\":\"MUR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"4453\",\"max_amount\":\"44535174\"},\"MVR\":{\"code\":\"MVR\",\"title\":\"Maldivian Rufiyaa\",\"symbol\":\"MVR\",\"native\":\"MVR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1546\",\"max_amount\":\"15460397\"},\"MXN\":{\"code\":\"MXN\",\"title\":\"Mexican Peso\",\"symbol\":\"MX$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"2012\",\"max_amount\":\"20122860\"},\"MYR\":{\"code\":\"MYR\",\"title\":\"Malaysian Ringgit\",\"symbol\":\"MYR\",\"native\":\"RM\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"463\",\"max_amount\":\"4632502\"},\"MZN\":{\"code\":\"MZN\",\"title\":\"Mozambican Metical\",\"symbol\":\"MZN\",\"native\":\"MTn\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"6382\",\"max_amount\":\"63829729\"},\"NGN\":{\"code\":\"NGN\",\"title\":\"Nigerian Naira\",\"symbol\":\"NGN\",\"native\":\"₦\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"43203\",\"max_amount\":\"432039828\"},\"NIO\":{\"code\":\"NIO\",\"title\":\"Nicaraguan Córdoba\",\"symbol\":\"NIO\",\"native\":\"C$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"3556\",\"max_amount\":\"35566412\"},\"NOK\":{\"code\":\"NOK\",\"title\":\"Norwegian Krone\",\"symbol\":\"NOK\",\"native\":\"kr\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1069\",\"max_amount\":\"10690975\"},\"NPR\":{\"code\":\"NPR\",\"title\":\"Nepalese Rupee\",\"symbol\":\"NPR\",\"native\":\"नेरू\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12954\",\"max_amount\":\"129546657\"},\"NZD\":{\"code\":\"NZD\",\"title\":\"New Zealand Dollar\",\"symbol\":\"NZ$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"174\",\"max_amount\":\"1746220\"},\"PAB\":{\"code\":\"PAB\",\"title\":\"Panamanian Balboa\",\"symbol\":\"PAB\",\"native\":\"B\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"98\",\"max_amount\":\"988722\"},\"PEN\":{\"code\":\"PEN\",\"title\":\"Peruvian Nuevo Sol\",\"symbol\":\"PEN\",\"native\":\"S\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"390\",\"max_amount\":\"3902208\"},\"PHP\":{\"code\":\"PHP\",\"title\":\"Philippine Peso\",\"symbol\":\"PHP\",\"native\":\"₱\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5862\",\"max_amount\":\"58627496\"},\"PKR\":{\"code\":\"PKR\",\"title\":\"Pakistani Rupee\",\"symbol\":\"PKR\",\"native\":\"₨\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"22642\",\"max_amount\":\"226426805\"},\"PLN\":{\"code\":\"PLN\",\"title\":\"Polish Złoty\",\"symbol\":\"PLN\",\"native\":\"zł\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"493\",\"max_amount\":\"4932350\"},\"PYG\":{\"code\":\"PYG\",\"title\":\"Paraguayan Guaraní\",\"symbol\":\"PYG\",\"native\":\"₲\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"6977\",\"max_amount\":\"69772317\"},\"QAR\":{\"code\":\"QAR\",\"title\":\"Qatari Riyal\",\"symbol\":\"QAR\",\"native\":\"ر.ق.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"364\",\"max_amount\":\"3640989\"},\"RON\":{\"code\":\"RON\",\"title\":\"Romanian Leu\",\"symbol\":\"RON\",\"native\":\"RON\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"502\",\"max_amount\":\"5028645\"},\"RSD\":{\"code\":\"RSD\",\"title\":\"Serbian Dinar\",\"symbol\":\"RSD\",\"native\":\"дин.\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"11918\",\"max_amount\":\"119184990\"},\"RUB\":{\"code\":\"RUB\",\"title\":\"Russian Ruble\",\"symbol\":\"RUB\",\"native\":\"₽\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"7128\",\"max_amount\":\"71281218\"},\"SAR\":{\"code\":\"SAR\",\"title\":\"Saudi Riyal\",\"symbol\":\"SAR\",\"native\":\"ر.س.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"375\",\"max_amount\":\"3756546\"},\"SEK\":{\"code\":\"SEK\",\"title\":\"Swedish Krona\",\"symbol\":\"SEK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1109\",\"max_amount\":\"11094972\"},\"SGD\":{\"code\":\"SGD\",\"title\":\"Singapore Dollar\",\"symbol\":\"SGD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"143\",\"max_amount\":\"1430495\"},\"THB\":{\"code\":\"THB\",\"title\":\"Thai Baht\",\"symbol\":\"฿\",\"native\":\"฿\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3780\",\"max_amount\":\"37800497\"},\"TJS\":{\"code\":\"TJS\",\"title\":\"Tajikistani Somoni\",\"symbol\":\"TJS\",\"native\":\"TJS\",\"thousands_sep\":\" \",\"decimal_sep\":\";\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"975\",\"max_amount\":\"9753854\"},\"TRY\":{\"code\":\"TRY\",\"title\":\"Turkish Lira\",\"symbol\":\"TRY\",\"native\":\"TL\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1854\",\"max_amount\":\"18543598\"},\"TTD\":{\"code\":\"TTD\",\"title\":\"Trinidad and Tobago Dollar\",\"symbol\":\"TTD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"672\",\"max_amount\":\"6722681\"},\"TWD\":{\"code\":\"TWD\",\"title\":\"New Taiwan Dollar\",\"symbol\":\"NT$\",\"native\":\"NT$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3173\",\"max_amount\":\"31738502\"},\"TZS\":{\"code\":\"TZS\",\"title\":\"Tanzanian Shilling\",\"symbol\":\"TZS\",\"native\":\"TSh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"233199\",\"max_amount\":\"2331999890\"},\"UAH\":{\"code\":\"UAH\",\"title\":\"Ukrainian Hryvnia\",\"symbol\":\"UAH\",\"native\":\"₴\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"3633\",\"max_amount\":\"36338830\"},\"UGX\":{\"code\":\"UGX\",\"title\":\"Ugandan Shilling\",\"symbol\":\"UGX\",\"native\":\"USh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"3816\",\"max_amount\":\"38166726\"},\"USD\":{\"code\":\"USD\",\"title\":\"United States Dollar\",\"symbol\":\"$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"100\",\"max_amount\":1000000},\"UYU\":{\"code\":\"UYU\",\"title\":\"Uruguayan Peso\",\"symbol\":\"UYU\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"4080\",\"max_amount\":\"40801205\"},\"UZS\":{\"code\":\"UZS\",\"title\":\"Uzbekistani Som\",\"symbol\":\"UZS\",\"native\":\"UZS\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1089058\",\"max_amount\":\"10890583014\"},\"VND\":{\"code\":\"VND\",\"title\":\"Vietnamese Đồng\",\"symbol\":\"₫\",\"native\":\"₫\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"23862\",\"max_amount\":\"238625000\"},\"YER\":{\"code\":\"YER\",\"title\":\"Yemeni Rial\",\"symbol\":\"YER\",\"native\":\"ر.ي.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"25030\",\"max_amount\":\"250300677\"},\"ZAR\":{\"code\":\"ZAR\",\"title\":\"South African Rand\",\"symbol\":\"ZAR\",\"native\":\"R\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1789\",\"max_amount\":\"17894299\"}};\n\nexport default Currencies;\n","/*\n * 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 {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[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 as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\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 FontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\nexport const FontSize = '16px';\nexport const FontWeight = '400';\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_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\n// * Jolly Cobra's animation.ts\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n deferred: CancellablePromise\n}\n\ntype AnimationInstanceKey = any;\nconst instances: Map = new Map();\n\nexport function createAnimationInstance(key: AnimationInstanceKey) {\n cancelAnimationByKey(key);\n\n const instance: AnimationInstance = {\n isCancelled: false,\n deferred: deferredPromise()\n };\n\n instances.set(key, instance);\n instance.deferred.then(() => {\n if(getAnimationInstance(key) === instance) {\n instances.delete(key);\n }\n });\n\n return instance;\n}\n\nexport function getAnimationInstance(key: AnimationInstanceKey) {\n return instances.get(key);\n}\n\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\n const instance = getAnimationInstance(key);\n if(instance) {\n instance.isCancelled = true;\n instance.deferred.resolve();\n }\n}\n\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\n if(!instance) {\n instance = createAnimationInstance(key);\n }\n\n fastRaf(() => {\n if(instance.isCancelled) {\n return;\n }\n\n if(tick()) {\n animateSingle(tick, key, instance);\n } else {\n instance.deferred.resolve();\n }\n });\n\n return instance.deferred;\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if(tick()) {\n animate(tick);\n }\n });\n}\n","type K = boolean;\nexport default async function filterAsync(arr: T[], callback: (item: T, idx: number, arr: T[]) => Promise | K) {\n const promises = arr.map(async(item, idx, arr) => {\n if(await callback(item, idx, arr)) {\n return item;\n }\n });\n\n return (await Promise.all(promises)).filter(Boolean);\n}\n","export default function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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","/*\n * 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\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport {fastRaf} from './schedulers';\nimport {ArgumentTypes} from '../types';\n\ntype HeavyQueue> = {\n items: ArgumentTypes[],\n process: (...args: any[]) => ReturnType,\n context: any,\n promise?: CancellablePromise[]>\n};\nconst heavyQueue: HeavyQueue[] = [];\nlet processingQueue = false;\n\nexport default function addHeavyTask>(queue: T, method: 'push' | 'unshift' = 'push') {\n if(!queue.items.length) {\n return Promise.resolve([]) as typeof promise;\n }\n\n const promise = queue.promise = deferredPromise();\n heavyQueue[method](queue);\n processHeavyQueue();\n\n return promise;\n}\n\nfunction processHeavyQueue() {\n if(!processingQueue) {\n const queue = heavyQueue.shift();\n timedChunk(queue).finally(() => {\n processingQueue = false;\n if(heavyQueue.length) {\n processHeavyQueue();\n }\n });\n }\n}\n\nfunction timedChunk>(queue: HeavyQueue) {\n if(!queue.items.length) {\n queue.promise.resolve([] as any);\n return Promise.resolve([]);\n }\n\n const todo = queue.items.slice();\n const results: ReturnType[] = [];\n\n return new Promise((resolve, reject) => {\n const f = async() => {\n const start = performance.now();\n\n do {\n await getHeavyAnimationPromise();\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\n let realResult: typeof results[0];\n // @ts-ignore\n if(possiblePromise instanceof Promise) {\n try {\n realResult = await possiblePromise;\n } catch(err) {\n reject(err);\n return;\n }\n } else {\n realResult = possiblePromise;\n }\n\n results.push(realResult);\n } while(todo.length > 0 && (performance.now() - start) < 6);\n\n if(todo.length > 0) {\n fastRaf(f);\n // setTimeout(f, 25);\n } else {\n resolve(results);\n }\n };\n\n fastRaf(f);\n // setTimeout(f, 25);\n }).then(queue.promise.resolve, queue.promise.reject);\n}\n","/*\n * 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 fastBlur from '../vendor/fastBlur';\nimport addHeavyTask from './heavyQueue';\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nlet requireBlurPromise: Promise;\nlet fastBlurFunc: typeof fastBlur;\nif(!IS_CANVAS_FILTER_SUPPORTED) {\n requireBlurPromise = import('../vendor/fastBlur').then((m) => {\n fastBlurFunc = m.default;\n });\n} else {\n requireBlurPromise = Promise.resolve();\n}\n\nfunction processBlurNext(\n img: HTMLImageElement,\n radius: number,\n iterations: number,\n canvas: HTMLCanvasElement = document.createElement('canvas')\n) {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', {alpha: false});\n if(IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${radius}px)`;\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\n } else {\n ctx.drawImage(img, 0, 0);\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\n }\n\n return canvas;\n}\n\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise};\nconst cache: Map = new Map();\nconst CACHE_SIZE = 150;\n\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\n if(!dataUri) {\n throw 'no dataUri for blur: ' + dataUri;\n }\n\n if(cache.size > CACHE_SIZE) {\n cache.clear();\n }\n\n const canvas = document.createElement('canvas');\n canvas.className = 'canvas-thumbnail';\n\n let cached = cache.get(dataUri);\n if(!cached) {\n const promise: CacheValue['promise'] = new Promise((resolve) => {\n // return resolve(dataUri);\n requireBlurPromise.then(() => {\n const img = new Image();\n img.onload = () => {\n // if(IS_CANVAS_FILTER_SUPPORTED) {\n // resolve(processBlurNext(img, radius, iterations));\n // } else {\n const promise = addHeavyTask({\n items: [[img, radius, iterations, canvas]],\n context: null,\n process: processBlurNext\n }, 'unshift');\n\n promise.then(() => {\n resolve();\n });\n // }\n };\n img.src = dataUri;\n });\n });\n\n cache.set(dataUri, cached = {\n canvas,\n promise\n });\n } else {\n canvas.width = cached.canvas.width;\n canvas.height = cached.canvas.height;\n cached.promise.then(() => {\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\n });\n }\n\n return {\n ...cached,\n 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 {IS_SAFARI} from '../../environment/userAgent';\nimport bytesFromHex from './bytesFromHex';\nimport bytesToDataURL from './bytesToDataURL';\n\nconst JPEG_HEADER = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\nconst JPEG_TAIL = bytesFromHex('ffd9');\n\nexport default function getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\n arr = new Uint8Array(JPEG_HEADER.concat(Array.from(bytes.slice(3)), JPEG_TAIL));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n return bytesToDataURL(arr, mimeType);\n}\n","export default function bytesToDataURL(bytes: Uint8Array, mimeType: string = 'image/jpeg') {\n return `data:${mimeType};base64,${btoa(String.fromCharCode(...bytes))}`;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * 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 {makeMediaSize} from './mediaSize';\n\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\n if(imageW < boxW && imageH < boxH && noZoom) {\n return makeMediaSize(imageW, imageH);\n }\n\n let boxedImageW = boxW;\n let boxedImageH = boxH;\n\n if((imageW / imageH) > (boxW / boxH)) {\n boxedImageH = (imageH * boxW / imageW) | 0;\n } else {\n boxedImageW = (imageW * boxH / imageH) | 0;\n if(boxedImageW > boxW) {\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\n boxedImageW = boxW;\n }\n }\n\n // if (Config.Navigator.retina) {\n // imageW = Math.floor(imageW / 2)\n // imageH = Math.floor(imageH / 2)\n // }\n\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\n boxedImageW = imageW;\n boxedImageH = imageH;\n }\n\n return makeMediaSize(boxedImageW, boxedImageH);\n}\n\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { MOUNT_CLASS_TO } from \"../../config/debug\";\n\nlet context: CanvasRenderingContext2D;\n/**\n * Get the text width\n * @param {string} text\n * @param {string} font\n */\nexport default function getTextWidth(text: string, font: string) {\n // const perf = performance.now();\n if(!context) {\n const canvas = document.createElement('canvas');\n context = canvas.getContext('2d', {alpha: false});\n }\n\n if(context.font !== font) {\n context.font = font;\n }\n\n // context.font = font;\n const metrics = context.measureText(text);\n // console.log('getTextWidth perf:', performance.now() - perf);\n return metrics.width;\n // return Math.round(metrics.width);\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.getTextWidth = getTextWidth);\n","import type {MediaSize} from '../mediaSize';\n\nexport default function scaleMediaElement(options: {\n media: CanvasImageSource,\n mediaSize?: MediaSize,\n boxSize?: MediaSize,\n quality?: number,\n mimeType?: 'image/jpeg' | 'image/png',\n size?: MediaSize\n}): Promise<{blob: Blob, size: MediaSize}> {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n const size = options.size ?? options.mediaSize.aspectFitted(options.boxSize);\n canvas.width = size.width * window.devicePixelRatio;\n canvas.height = size.height * window.devicePixelRatio;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\n canvas.toBlob((blob) => {\n resolve({blob, size});\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\n });\n}\n","/*\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://stackoverflow.com/a/30810322\nfunction fallbackCopyTextToClipboard(text: string) {\n var textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n document.execCommand('copy');\n // const successful = document.execCommand('copy');\n // const msg = successful ? 'successful' : 'unsuccessful';\n // console.log('Fallback: Copying text command was ' + msg);\n } catch(err) {\n // console.error('Fallback: Oops, unable to copy', err);\n }\n\n document.body.removeChild(textArea);\n}\n\nexport function copyTextToClipboard(text: string) {\n if(!navigator.clipboard) {\n fallbackCopyTextToClipboard(text);\n return;\n }\n\n navigator.clipboard.writeText(text).catch((err) => {\n console.error('clipboard error', err);\n fallbackCopyTextToClipboard(text);\n });\n}\n","/*\n * 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 mediaSizes from './mediaSizes';\nimport OverlayClickHandler from './overlayClickHandler';\n\nclass ContextMenuController extends OverlayClickHandler {\n constructor() {\n super('menu', true);\n\n mediaSizes.addEventListener('resize', () => {\n if(this.element) {\n this.close();\n }\n\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\n const rect = openedMenu.getBoundingClientRect();\n const {innerWidth, innerHeight} = window;\n\n console.log(innerWidth, innerHeight, rect);\n } */\n });\n }\n\n public isOpened() {\n return !!this.element;\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const rect = this.element.getBoundingClientRect();\n const {clientX, clientY} = e;\n\n const diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n const diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n\n if(diffX >= 100 || diffY >= 100) {\n this.close();\n // openedMenu.parentElement.click();\n }\n // console.log('mousemove', diffX, diffY);\n };\n\n public close() {\n if(this.element) {\n this.element.classList.remove('active');\n this.element.parentElement.classList.remove('menu-open');\n }\n\n super.close();\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('mousemove', this.onMouseMove);\n }\n }\n\n public openBtnMenu(element: HTMLElement, onClose?: () => void) {\n super.open(element);\n\n this.element.classList.add('active');\n this.element.parentElement.classList.add('menu-open');\n\n if(onClose) {\n this.addEventListener('toggle', onClose, {once: true});\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.addEventListener('mousemove', this.onMouseMove);\n }\n }\n}\n\nconst contextMenuController = new ContextMenuController();\nexport default contextMenuController;\n","/*\n * 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 I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/*\n * 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 {LangPackKey} from '../../lib/langPack';\nimport {copyTextToClipboard} from '../clipboard';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\n\nconst T_ME = 'https://t.me/';\nexport default function anchorCopy(options: Partial<{\n // href: string,\n mePath: string,\n username: string\n}> = {}) {\n const anchor = document.createElement('a');\n anchor.classList.add('anchor-copy');\n\n let copyWhat: string, copyText: LangPackKey = 'LinkCopied';\n if(options.mePath) {\n const href = T_ME + options.mePath;\n copyWhat = anchor.href = anchor.innerText = href;\n }\n\n if(options.username) {\n const href = T_ME + options.username;\n anchor.href = href;\n copyWhat = anchor.innerText = '@' + options.username;\n copyText = 'UsernameCopied';\n }\n\n attachClickEvent(anchor, (e) => {\n cancelEvent(e);\n copyTextToClipboard(copyWhat ?? anchor.href);\n toastNew({langPackKey: copyText});\n });\n\n return anchor;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter from '../listenerSetter';\nimport cancelEvent from './cancelEvent';\n\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\nexport function cancelContextMenuOpening() {\n if(_cancelContextMenuOpeningTimeout) {\n clearTimeout(_cancelContextMenuOpeningTimeout);\n }\n\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\n _cancelContextMenuOpeningTimeout = 0;\n _cancelContextMenuOpening = false;\n }, .4e3);\n\n _cancelContextMenuOpening = true;\n}\n\nexport function attachContextMenuListener(\n element: HTMLElement,\n callback: (e: TouchEvent | MouseEvent) => void,\n listenerSetter?: ListenerSetter\n) {\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\n\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\n let timeout: number;\n\n const options: EventListenerOptions = {capture: true};\n\n const onCancel = () => {\n clearTimeout(timeout);\n // @ts-ignore\n remove('touchmove', onCancel, options);\n // @ts-ignore\n remove('touchend', onCancel, options);\n // @ts-ignore\n remove('touchcancel', onCancel, options);\n };\n\n add('touchstart', (e: TouchEvent) => {\n if(e.touches.length > 1) {\n onCancel();\n return;\n }\n\n add('touchmove', onCancel, options);\n add('touchend', onCancel, options);\n add('touchcancel', onCancel, options);\n\n timeout = window.setTimeout(() => {\n if(_cancelContextMenuOpening) {\n onCancel();\n return;\n }\n\n callback(e);\n onCancel();\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n });\n\n /* if(!isSafari) {\n add('contextmenu', (e: any) => {\n cancelEvent(e);\n }, {passive: false, capture: true});\n } */\n } else {\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\n callback(e);\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\n\nexport default function attachGrabListeners(element: HTMLElement,\n onStart: (position: GrabEvent) => void,\n onMove: (position: GrabEvent) => void,\n onEnd?: (position: GrabEvent) => void) {\n // * Mouse\n const onMouseMove = (event: MouseEvent) => {\n onMove({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseUp = (event: MouseEvent) => {\n document.removeEventListener('mousemove', onMouseMove);\n element.addEventListener('mousedown', onMouseDown, {once: true});\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseDown = (event: MouseEvent) => {\n if(event.button !== 0) {\n element.addEventListener('mousedown', onMouseDown, {once: true});\n return;\n }\n\n onStart({x: event.pageX, y: event.pageY, event});\n onMouseMove(event);\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp, {once: true});\n };\n\n element.addEventListener('mousedown', onMouseDown, {once: true});\n\n // * Touch\n const onTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n };\n\n const onTouchEnd = (event: TouchEvent) => {\n document.removeEventListener('touchmove', onTouchMove);\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n };\n\n const onTouchStart = (event: TouchEvent) => {\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n onTouchMove(event);\n\n document.addEventListener('touchmove', onTouchMove, {passive: false});\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\n };\n\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n\n return () => {\n element.removeEventListener('mousedown', onMouseDown);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n element.removeEventListener('touchstart', onTouchStart);\n document.removeEventListener('touchmove', onTouchMove);\n document.removeEventListener('touchend', onTouchEnd);\n };\n}\n","/*\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 cancelSelection() {\n if(window.getSelection) {\n if(window.getSelection().empty) { // Chrome\n window.getSelection().empty();\n } else if(window.getSelection().removeAllRanges) { // Firefox\n window.getSelection().removeAllRanges();\n }\n // @ts-ignore\n } else if(document.selection) { // IE?\n // @ts-ignore\n document.selection.empty();\n }\n}\n","/*\n * 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';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport simulateEvent from './dispatchEvent';\n\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\n const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\n\n options.touchMouseDown = true;\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\n add('mousedown', callback, options);\n } else if(CLICK_EVENT_NAME === 'touchend') {\n const o = {...options, once: true};\n\n const onTouchStart = (e: TouchEvent) => {\n const onTouchMove = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n remove('touchend', onTouchEnd, o);\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n callback(e);\n if(options.once) {\n remove('touchstart', onTouchStart);\n }\n };\n\n add('touchend', onTouchEnd, o);\n add('touchmove', onTouchMove, o);\n };\n\n add('touchstart', onTouchStart);\n } else {\n add(CLICK_EVENT_NAME, callback, options);\n } */\n add(CLICK_EVENT_NAME, callback, options);\n\n // @ts-ignore\n return () => remove(CLICK_EVENT_NAME, callback, options);\n}\n\nexport function detachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\n // if(CLICK_EVENT_NAME === 'touchend') {\n // elem.removeEventListener('touchstart', callback, options);\n // } else {\n elem.removeEventListener(CLICK_EVENT_NAME, callback as any, options);\n // }\n}\n\nexport function simulateClickEvent(elem: HTMLElement) {\n simulateEvent(elem, CLICK_EVENT_NAME);\n}\n","/*\n * 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 ButtonMenu, {ButtonMenuItemOptionsVerifiable} from '../../components/buttonMenu';\nimport filterAsync from '../array/filterAsync';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter from '../listenerSetter';\nimport {getMiddleware} from '../middleware';\nimport positionMenu from '../positionMenu';\nimport {attachContextMenuListener} from './attachContextMenuListener';\n\nexport default function createContextMenu({\n buttons,\n findElement,\n listenTo,\n appendTo,\n filterButtons,\n onOpen,\n onClose,\n onBeforeOpen,\n listenerSetter: attachListenerSetter\n}: {\n buttons: T[],\n findElement?: (e: MouseEvent | TouchEvent) => HTMLElement,\n listenTo: HTMLElement,\n appendTo?: HTMLElement,\n filterButtons?: (buttons: T[]) => Promise,\n onOpen?: (target: HTMLElement) => any,\n onClose?: () => any,\n onBeforeOpen?: () => any,\n listenerSetter?: ListenerSetter\n}) {\n appendTo ??= document.body;\n\n attachListenerSetter ??= new ListenerSetter();\n const listenerSetter = new ListenerSetter();\n const middleware = getMiddleware();\n let element: HTMLElement;\n\n attachContextMenuListener(listenTo, (e) => {\n const target = findElement ? findElement(e as any) : listenTo;\n if(!target) {\n return;\n }\n\n let _element = element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(_element && _element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n const r = async() => {\n await onOpen?.(target);\n\n const initResult = await init();\n if(!initResult) {\n return;\n }\n\n _element = initResult.element;\n const {cleanup, destroy} = initResult;\n\n positionMenu(e, _element);\n contextMenuController.openBtnMenu(_element, () => {\n onClose?.();\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n };\n\n r();\n }, attachListenerSetter);\n\n const cleanup = () => {\n listenerSetter.removeAll();\n middleware.clean();\n };\n\n const destroy = () => {\n cleanup();\n attachListenerSetter.removeAll();\n };\n\n const init = async() => {\n cleanup();\n\n buttons.forEach((button) => button.element = undefined);\n const f = filterButtons || ((buttons: T[]) => filterAsync(buttons, (button) => button?.verify?.() ?? true));\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add('contextmenu');\n\n await onBeforeOpen?.();\n\n appendTo.append(_element);\n\n return {\n element: _element,\n cleanup,\n destroy: () => {\n _element.remove();\n }\n };\n };\n\n return {element, destroy};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport PopupStickers from '../../components/popups/stickers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport createContextMenu from './createContextMenu';\nimport findUpClassName from './findUpClassName';\nimport emoticonsDropdown, {EmoticonsDropdown} from '../../components/emoticonsDropdown';\n\nexport default function createStickersContextMenu(options: {\n listenTo: HTMLElement,\n isStickerPack?: boolean,\n verifyRecent?: (target: HTMLElement) => boolean,\n appendTo?: HTMLElement,\n onOpen?: () => any,\n onClose?: () => any,\n onSend?: () => any\n}) {\n const {listenTo, isStickerPack, verifyRecent, appendTo, onOpen, onClose, onSend} = options;\n let target: HTMLElement, doc: MyDocument;\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const favedStickers = await rootScope.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n return createContextMenu({\n listenTo: listenTo,\n appendTo,\n findElement: (e) => target = findUpClassName(e.target, 'media-sticker-wrapper'),\n onOpen: async() => {\n doc = await rootScope.managers.appDocsManager.getDoc(target.dataset.docId);\n return onOpen?.();\n },\n onClose,\n buttons: [{\n icon: 'stickers',\n text: 'Context.ViewStickerSet',\n onClick: () => new PopupStickers(doc.stickerSetInput).show(),\n verify: () => !isStickerPack\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'delete',\n text: 'DeleteFromRecent',\n onClick: () => rootScope.managers.appStickersManager.saveRecentSticker(doc.id, true),\n verify: () => verifyRecent?.(target) ?? false\n }, {\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: () => {\n onSend?.();\n return EmoticonsDropdown.sendDocId(doc.id, false, true);\n },\n verify: () => !!(appImManager.chat.peerId && appImManager.chat.peerId !== rootScope.myId)\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: () => appImManager.chat.input.scheduleSending(() => appImManager.chat.input.sendMessageWithDocument(doc)),\n verify: () => !!appImManager.chat.peerId\n }]\n });\n}\n","export default function createVideo(options: {\n pip?: boolean\n} = {}) {\n const video = document.createElement('video');\n if(!options.pip) video.disablePictureInPicture = true;\n video.setAttribute('playsinline', 'true');\n return video;\n}\n","/*\n * 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(const 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","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","import encodeEntities from '../string/encodeEntities';\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === node.TEXT_NODE ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).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\nexport default function findUpAsChild(el: T, parent: HTMLElement): T {\n if(!el) return null;\n if(el.parentElement === parent) return el;\n\n while(el.parentElement) {\n el = el.parentElement as any;\n if(el.parentElement === parent) {\n return el;\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\n return el.closest(`[${attribute}]`);\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.getAttribute(attribute) !== null)\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpTag(el: any, tag: string): HTMLElement {\n return el.closest(tag);\n /* if(el.tagName === tag) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.tagName === tag)\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpAsChild from './findUpAsChild';\n\nexport default function getCaretPosNew(input: HTMLElement, anchor?: boolean): ReturnType & {selection: Selection} {\n const selection = document.getSelection();\n // let {focusNode: node, focusOffset: offset} = selection;\n const node = selection[anchor ? 'anchorNode' : 'focusNode'];\n const offset = selection[anchor ? 'anchorOffset' : 'focusOffset'];\n if(!findUpAsChild(node, input) && node !== input) {\n return {selection} as any;\n }\n\n return {...getCaretPosF(input, node, offset), selection};\n}\n\nexport function getCaretPosF(input: HTMLElement, node: Node, offset: number) {\n if(node === input) {\n const childNodes = input.childNodes;\n const childNodesLength = childNodes.length;\n if(childNodesLength && offset >= childNodesLength) {\n node = childNodes[childNodesLength - 1];\n offset = (node.textContent || (node as HTMLImageElement).alt || '').length;\n } else {\n node = childNodes[offset];\n offset = 0;\n }\n }\n\n return {node: node as ChildNode, offset};\n}\n","/*\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 {MessageEntity} from '../../layer';\nimport BOM from '../string/bom';\n\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler'/* | 'customEmoji' */;\nexport type MarkdownTag = {\n match: string,\n entityName: Extract;\n};\n\n// https://core.telegram.org/bots/api#html-style\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\n bold: {\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\n entityName: 'messageEntityBold'\n },\n underline: {\n match: '[style*=\"underline\"], u, ins',\n entityName: 'messageEntityUnderline'\n },\n italic: {\n match: '[style*=\"italic\"], i, em',\n entityName: 'messageEntityItalic'\n },\n monospace: {\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\n entityName: 'messageEntityCode'\n },\n strikethrough: {\n match: '[style*=\"line-through\"], [style*=\"strikethrough\"], strike, del, s',\n entityName: 'messageEntityStrike'\n },\n link: {\n match: 'A:not(.follow)',\n entityName: 'messageEntityTextUrl'\n },\n mentionName: {\n match: 'A.follow',\n entityName: 'messageEntityMentionName'\n },\n spoiler: {\n match: '[style*=\"spoiler\"]',\n entityName: 'messageEntitySpoiler'\n }\n // customEmoji: {\n // match: '.custom-emoji',\n // entityName: 'messageEntityCustomEmoji'\n // }\n};\n\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\n\n/* export function getDepth(child: Node, container?: Node) {\n let depth = 0;\n\n do {\n if(child === container) {\n return depth;\n }\n\n ++depth;\n } while((child = child.parentNode) !== null);\n\n return depth;\n} */\n\nconst BLOCK_TAGS = new Set([\n 'DIV',\n 'P',\n 'BR',\n 'LI',\n 'SECTION',\n 'H6',\n 'H5',\n 'H4',\n 'H3',\n 'H2',\n 'H1',\n 'TR',\n 'OL',\n 'UL'\n]);\n\nconst INSERT_NEW_LINE_TAGS = new Set([\n 'OL',\n 'UL'\n]);\n\nconst BOM_REG_EXP = new RegExp(BOM, 'g');\n\nfunction checkNodeForEntity(node: Node, value: string, entities: MessageEntity[], offset: {offset: number}) {\n const parentElement = node.parentElement;\n\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\n for(const type in markdownTags) {\n const tag = markdownTags[type as MarkdownType];\n const closest: HTMLElement = parentElement.closest(tag.match + ', [contenteditable=\"true\"]');\n if(closest?.getAttribute('contenteditable') !== null) {\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\n if(closestDepth > depth) {\n closestDepth = depth;\n closestTag = tag;\n closestElementByTag = closest;\n } */\n continue;\n }\n\n if(tag.entityName === 'messageEntityTextUrl') {\n entities.push({\n _: tag.entityName,\n url: (closest as HTMLAnchorElement).href,\n offset: offset.offset,\n length: value.length\n });\n } else if(tag.entityName === 'messageEntityMentionName') {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length,\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\n });\n }/* else if(tag.entityName === 'messageEntityCustomEmoji') {\n entities.push({\n _: tag.entityName,\n document_id: (closest as HTMLElement).dataset.docId,\n offset: offset.offset,\n length: emoji.length\n });\n } */ else {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length\n });\n }\n }\n}\n\nexport default function getRichElementValue(\n node: HTMLElement,\n lines: string[],\n line: string[],\n selNode?: Node,\n selOffset?: number,\n entities?: MessageEntity[],\n offset = {offset: 0}\n) {\n if(node.nodeType === node.TEXT_NODE) { // TEXT\n let nodeValue = node.nodeValue;\n // if(nodeValue[0] === BOM) {\n nodeValue = nodeValue.replace(BOM_REG_EXP, '');\n // }\n\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\n if(tabulation?.getAttribute('contenteditable') === null) {\n nodeValue += ' ';\n // line.push('\\t');\n // ++offset.offset;\n } */\n\n if(nodeValue) {\n if(selNode === node) {\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\n } else {\n line.push(nodeValue);\n }\n } else if(selNode === node) {\n line.push('\\x01');\n }\n\n if(entities && nodeValue.length && node.parentNode) {\n checkNodeForEntity(node, nodeValue, entities, offset);\n }\n\n offset.offset += nodeValue.length;\n return;\n }\n\n if(node.nodeType !== node.ELEMENT_NODE) { // NON-ELEMENT\n return;\n }\n\n const isSelected = selNode === node;\n const isBlock = BLOCK_TAGS.has(node.tagName);\n if(isBlock && (line.length || node.tagName === 'BR'/* || (BLOCK_TAGS.has(node.tagName) && lines.length) */)) {\n lines.push(line.join(''));\n line.length = 0;\n ++offset.offset;\n } else {\n const alt = node.dataset.stickerEmoji || (node as HTMLImageElement).alt;\n const stickerEmoji = node.dataset.stickerEmoji;\n\n if(alt && entities) {\n checkNodeForEntity(node, alt, entities, offset);\n }\n\n if(stickerEmoji && entities) {\n entities.push({\n _: 'messageEntityCustomEmoji',\n document_id: node.dataset.docId,\n offset: offset.offset,\n length: alt.length\n });\n }\n\n if(alt) {\n line.push(alt);\n offset.offset += alt.length;\n }\n }\n\n if(isSelected && !selOffset) {\n line.push('\\x01');\n }\n\n const isTableCell = node.matches(tabulationMatch);\n const wasEntitiesLength = entities?.length;\n\n let curChild = node.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n\n if(isSelected && selOffset) {\n line.push('\\x01');\n }\n\n if(isTableCell && node.nextSibling && line.length) {\n line.push(' ');\n ++offset.offset;\n\n // * combine entities such as url after adding space\n if(wasEntitiesLength !== undefined) {\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\n ++entities[i].length;\n }\n }\n }\n\n const wasLength = line.length;\n if(isBlock && wasLength) {\n lines.push(line.join(''));\n line.splice(0, wasLength);\n ++offset.offset;\n }\n\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\n lines.push('');\n ++offset.offset;\n }\n}\n","/*\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 {MessageEntity} from '../../layer';\nimport combineSameEntities from '../../lib/richTextProcessor/combineSameEntities';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport getRichElementValue from './getRichElementValue';\n\nexport function getCaretPos(field: HTMLElement) {\n const sel = window.getSelection();\n let selNode: Node;\n let selOffset: number;\n if(sel?.rangeCount) {\n const range = sel.getRangeAt(0);\n const startOffset = range.startOffset;\n if(\n range.startContainer &&\n range.startContainer == range.endContainer &&\n startOffset == range.endOffset\n ) {\n // * if focused on img, or caret has been set via placeCaretAtEnd\n const possibleChildrenFocusOffset = startOffset - 1;\n const childNodes = field.childNodes;\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\n selNode = childNodes[possibleChildrenFocusOffset];\n selOffset = 0;\n\n for(let i = 0; i < range.endOffset; ++i) {\n const node = childNodes[i];\n const value = node.nodeValue || (node as HTMLImageElement).alt;\n\n if(value) {\n selOffset += value.length;\n }\n }\n } else {\n selNode = range.startContainer;\n selOffset = startOffset;\n }\n }\n }\n\n return {node: selNode, offset: selOffset};\n}\n\nexport default function getRichValueWithCaret(\n field: HTMLElement | DocumentFragment,\n withEntities = true,\n withCaret = true\n) {\n const lines: string[] = [];\n const line: string[] = [];\n\n const {node: selNode, offset: selOffset} = !(field instanceof DocumentFragment) && withCaret && getCaretPos(field);\n\n const entities: MessageEntity[] = withEntities ? [] : undefined;\n const offset = {offset: 0};\n if(field instanceof DocumentFragment) {\n let curChild = field.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n } else {\n getRichElementValue(field, lines, line, selNode, selOffset, entities, offset);\n }\n\n if(line.length) {\n lines.push(line.join(''));\n }\n\n let value = lines.join('\\n');\n const caretPos = value.indexOf('\\x01');\n if(caretPos !== -1) {\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\n }\n value = value.replace(/\\u00A0/g, ' ');\n\n if(entities?.length) {\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\n /* const entity = entities[entities.length - 1];\n const length = value.length;\n const trimmedLength = value.trimRight().length;\n if(length !== trimmedLength) {\n entity.length -= length - trimmedLength;\n } */\n\n combineSameEntities(entities);\n sortEntities(entities);\n }\n\n return {value, entities, caretPos};\n}\n\nMOUNT_CLASS_TO.getRichValueWithCaret = getRichValueWithCaret;\n","/*\n * 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, overflowRect, selector, extraSize, elements}: {\n overflowElement: HTMLElement,\n overflowRect?: DOMRectMinified,\n extraSize?: number,\n selector?: string,\n elements?: HTMLElement[]\n}) {\n // const perf = performance.now();\n overflowRect ??= overflowElement.getBoundingClientRect();\n elements ??= Array.from(overflowElement.querySelectorAll(selector));\n\n if(extraSize) {\n overflowRect = {\n top: overflowRect.top - extraSize,\n right: overflowRect.right + extraSize,\n bottom: overflowRect.bottom + extraSize,\n left: overflowRect.left - extraSize\n };\n }\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 windowSize from '../windowSize';\n\nexport default function getVisibleRect(\n element: HTMLElement,\n overflowElement: HTMLElement,\n lookForSticky?: boolean,\n rect: DOMRectMinified = element.getBoundingClientRect(),\n overflowRect: DOMRectMinified = overflowElement.getBoundingClientRect()\n) {\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\n\n // * respect sticky headers\n if(lookForSticky) {\n const sticky = overflowElement.querySelector('.sticky');\n if(sticky) {\n const stickyRect = sticky.getBoundingClientRect();\n overflowTop = stickyRect.bottom;\n }\n }\n\n if(rect.top >= overflowBottom ||\n rect.bottom <= overflowTop ||\n rect.right <= overflowLeft ||\n rect.left >= overflowRight) {\n return null;\n }\n\n const overflow = {\n top: false,\n right: false,\n bottom: false,\n left: false,\n vertical: 0 as 0 | 1 | 2,\n horizontal: 0 as 0 | 1 | 2\n };\n\n const windowWidth = windowSize.width;\n const windowHeight = windowSize.height;\n\n return {\n rect: {\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\n },\n overflow\n };\n}\n\n(window as any).getVisibleRect = getVisibleRect;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SwipeHandler, {SwipeHandlerOptions} from '../../components/swipeHandler';\nimport cancelEvent from './cancelEvent';\nimport findUpClassName from './findUpClassName';\nimport isSwipingBackSafari from './isSwipingBackSafari';\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') &&\n !isSwipingBackSafari(e) &&\n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {cancelContextMenuOpening} from './attachContextMenuListener';\nimport handleHorizontalSwipe, {SwipeHandlerHorizontalOptions} from './handleHorizontalSwipe';\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function htmlToDocumentFragment(html: string | DocumentFragment) {\n if(html instanceof DocumentFragment) return html;\n const template = document.createElement('template');\n html = html.trim(); // Never return a text node of whitespace as the result\n template.innerHTML = html;\n return template.content;\n}\n","/*\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 htmlToSpan(html: string | DocumentFragment) {\n const span = document.createElement('span');\n if(typeof(html) === 'string') span.innerHTML = html;\n else span.append(html);\n return span;\n}\n","/*\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/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\n if(!element) {\n return false;\n }\n\n parentNode = parentNode || document.body;\n if(element === parentNode) {\n return true;\n }\n return isInDOM(element.parentNode as HTMLElement, parentNode);\n} */\nexport default function isInDOM(element: Element): boolean {\n return element?.isConnected;\n}\n","/*\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 isInputEmpty(element: HTMLElement) {\n if(element.isContentEditable || element.tagName !== 'INPUT') {\n /* const value = element.innerText;\n\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\n // return !getRichValueWithCaret(element, false, false).value.trim();\n return !element.textContent.trim() && !element.querySelector('.emoji, .custom-emoji, .custom-emoji-placeholder');\n } else {\n return !(element as HTMLInputElement).value.trim();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\nimport {IS_MOBILE, IS_APPLE} from '../../environment/userAgent';\n\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\n /* if(e.ctrlKey || e.metaKey) {\n this.messageInput.innerHTML += '
';\n placeCaretAtEnd(this.message)\n return;\n } */\n\n if(rootScope.settings.sendShortcut === 'enter') {\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\n return;\n }\n\n return true;\n } else {\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\n return;\n }\n\n if(secondaryKey) {\n return true;\n }\n }\n }\n\n return false;\n}\n","/*\n * 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","/*\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 IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false, focus = true) {\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || (document.activeElement.tagName !== 'INPUT' && !(document.activeElement as HTMLElement).isContentEditable))) {\n return;\n }\n\n focus && el.focus();\n if(el instanceof HTMLInputElement) {\n const length = el.value.length;\n el.selectionStart = length;\n el.selectionEnd = length;\n } else {\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n\n(window as any).placeCaretAtEnd = placeCaretAtEnd;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport whichChild from './whichChild';\n\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\n if(prevPos === undefined) {\n prevPos = element.parentElement === container ? whichChild(element) : -1;\n }\n\n if(prevPos === pos) {\n return false;\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\n pos += 1;\n }\n\n if(!pos) {\n container.prepend(element);\n } else if(container.childElementCount > pos) {\n container.insertBefore(element, container.children[pos]);\n } else {\n container.append(element);\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 onMediaLoad from '../onMediaLoad';\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement,\n url: string,\n callback?: () => void,\n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback?.();\n return;\n }\n\n const isVideo = elem instanceof HTMLVideoElement;\n if(((loadedURLs[url]/* && false */) && useCache) || isVideo) {\n if(elem) {\n set(elem, url);\n }\n\n if(callback) {\n if(isVideo) {\n onMediaLoad(elem).then(callback);\n } else {\n callback?.();\n }\n // callback && getHeavyAnimationPromise().then(() => callback());\n }\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\n const onLoad = () => {\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?.();\n\n loader.removeEventListener('error', onError);\n };\n\n const onError = (err: ErrorEvent) => {\n console.error('Render image from url failed:', err, url, loader);\n loader.removeEventListener('load', onLoad);\n callback?.();\n };\n\n loader.addEventListener('load', onLoad, {once: true});\n loader.addEventListener('error', onError, {once: true});\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport sequentialDom from '../sequentialDom';\nimport {renderImageFromUrlPromise} from './renderImageFromUrl';\n\nexport default function renderMediaWithFadeIn(\n container: HTMLElement,\n media: Parameters[0],\n url: string,\n needFadeIn: boolean,\n aspecter = container,\n thumbImage?: HTMLElement\n) {\n if(needFadeIn) {\n media.classList.add('fade-in');\n }\n\n const promise = renderImageFromUrlPromise(media, url).then(() => {\n return sequentialDom.mutateElement(container, () => {\n aspecter.append(media);\n\n if(needFadeIn) {\n media.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n });\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n });\n });\n\n // recordPromise(promise, 'renderImageWithFadeIn');\n\n return promise;\n}\n","/*\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 replaceContent(elem: HTMLElement, node: string | Node) {\n if(typeof(node) === 'string') {\n elem.innerHTML = node;\n return;\n }\n\n // * children.length doesn't count text nodes\n const firstChild = elem.firstChild;\n if(firstChild) {\n if(elem.lastChild === firstChild) {\n firstChild.replaceWith(node);\n } else {\n elem.textContent = '';\n elem.append(node);\n }\n } else {\n elem.append(node);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport clamp from '../number/clamp';\nimport findUpAsChild from './findUpAsChild';\nimport whichChild from './whichChild';\n\nexport default function compareNodes(node1: ChildNode, node1Offset: number, node2: ChildNode, node2Offset: number) {\n let diff: number;\n if(node1 === node2) {\n diff = node1Offset - node2Offset;\n } else if(node1.parentElement === node2.parentElement) {\n diff = whichChild(node1, true) - whichChild(node2, true);\n } else {\n const parents: HTMLElement[] = [];\n let parentElement = node1.parentElement;\n do {\n parents.push(parentElement);\n } while(parentElement = parentElement.parentElement);\n\n parentElement = node2.parentElement;\n do {\n if(parents.includes(parentElement)) {\n break;\n }\n } while(parentElement = parentElement.parentElement);\n\n const commonAncestorContainer = parentElement;\n // const range = document.createRange();\n // range.setStart(node1, 0);\n // range.setEnd(node2, node2.textContent.length);\n // const {commonAncestorContainer} = range;\n node1 = findUpAsChild(node1 as HTMLElement, commonAncestorContainer as HTMLElement);\n node2 = findUpAsChild(node2 as HTMLElement, commonAncestorContainer as HTMLElement);\n diff = whichChild(node1, true) - whichChild(node2, true);\n }\n\n return clamp(diff, -1, 1);\n}\n\n(window as any).compareNodes = compareNodes;\n","/*\n * 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_FIREFOX} from '../../environment/userAgent';\nimport {logger} from '../../lib/logger';\nimport {isCustomFillerNeededBySiblingNode} from '../../lib/richTextProcessor/wrapRichText';\nimport ListenerSetter from '../listenerSetter';\nimport BOM from '../string/bom';\nimport compareNodes from './compareNodes';\nimport getCaretPosNew from './getCaretPosNew';\nimport placeCaretAtEnd from './placeCaretAtEnd';\nimport whichChild from './whichChild';\n\nconst NOT_ONLY_BOMS_REG_EXP = new RegExp(`[^${BOM}]`);\n\nexport const USING_BOMS = false;\n\nexport default class RichInputHandler {\n private static INSTANCE: RichInputHandler;\n\n private listenerSetter: ListenerSetter;\n\n private lastNode: Node;\n private lastOffset: number;\n private savedRanges: WeakMap;\n\n private log: ReturnType;\n\n private inputCaptureCallbacks: Function[];\n\n constructor() {\n this.log = logger('RICH-INPUT');\n this.listenerSetter = new ListenerSetter();\n this.savedRanges = new WeakMap();\n\n this.listenerSetter.add(document)('selectionchange', this.saveSelectionOnChange);\n if(USING_BOMS) {\n this.listenerSetter.add(document)('focusout', this.onFocusOut);\n this.listenerSetter.add(document)('selectionchange', this.onSelectionChange);\n this.listenerSetter.add(document)('beforeinput', this.onBeforeInput);\n this.listenerSetter.add(document)('keydown', this.onKeyDown, {capture: true});\n\n if(IS_FIREFOX) {\n this.inputCaptureCallbacks = [];\n this.listenerSetter.add(document)('input', () => {\n this.inputCaptureCallbacks.forEach((callback) => callback());\n this.inputCaptureCallbacks.length = 0;\n }, {capture: true});\n }\n }\n }\n\n private get input() {\n const selection = document.getSelection();\n const {anchorNode: node} = selection;\n if(!node) return;\n return ((node as HTMLElement).closest ? node as HTMLElement : node.parentElement).closest('[contenteditable=\"true\"]');\n }\n\n private saveRangeForElement(element: HTMLElement) {\n if(element && (element.isContentEditable || element.tagName === 'INPUT')) {\n const selection = document.getSelection();\n if(selection.rangeCount) {\n this.savedRanges.set(element as HTMLElement, document.getSelection().getRangeAt(0));\n }\n }\n }\n\n private saveSelectionOnChange = (e: Event) => {\n const element = document.activeElement as HTMLElement; // e.target as HTMLElement;\n this.saveRangeForElement(element);\n };\n\n private onFocusOut = (e: FocusEvent) => {\n this.lastNode = this.lastOffset = undefined;\n };\n\n private findPreviousSmthIndex(input: HTMLElement, node: ChildNode, something?: NodeListOf) {\n // node = this.getFiller(node);\n // const childNodes = Array.from(node.parentElement.childNodes);\n // fillerIndex = childNodes.indexOf(node);\n // let smthIndex = -1;\n // for(let i = fillerIndex; i >= 0; --i) {\n // const node = childNodes[i];\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // smthIndex = i;\n // break;\n // }\n // }\n // return smthIndex;\n\n const elements = Array.from(something ?? input.querySelectorAll('.input-something'));\n const index = elements.findIndex((element) => compareNodes(element, 0, node, 0) >= 0);\n return index === -1 ? elements.length - 1 : Math.max(0, index - 1);\n }\n\n private superMove(\n input: HTMLElement,\n caret: ReturnType,\n toLeft: boolean,\n fromSelectionChange: boolean\n ) {\n const {node, offset, move} = caret;\n const something = input.querySelectorAll('.input-something');\n const smthIndex = this.findPreviousSmthIndex(input, node, something);\n const r = document.createRange();\n r[toLeft ? 'setEnd' : 'setStart'](node, offset);\n\n if(fromSelectionChange) {\n move(toLeft);\n }\n\n const c = this.getCaretPosN();\n if(c.node?.nodeValue === BOM && (!fromSelectionChange || node === this.lastNode)) {\n const idx = this.findPreviousSmthIndex(input, c.node, something);\n\n let moved = !fromSelectionChange;\n\n do {\n const c = this.getCaretPosN();\n const idxidx = this.findPreviousSmthIndex(input, c.node, something);\n r[toLeft ? 'setStart' : 'setEnd'](c.node, c.offset);\n const rangeString = r.toString();\n const onlyBOMs = !NOT_ONLY_BOMS_REG_EXP.test(rangeString);\n this.log('test cursor', rangeString, onlyBOMs, idx, idxidx);\n if(\n onlyBOMs &&\n c.node?.nodeValue === BOM &&\n idxidx === idx &&\n // (idxidx > 1 || c.offset) &&\n // (idxidx < (getFiller(c.node).parentElement.childNodes.length - 2) || c.offset < BOM.length)\n (idxidx || c.offset) &&\n (idxidx < (something.length - 1) || c.offset < BOM.length)\n ) {\n move(toLeft);\n moved = true;\n } else if(!moved) {\n break;\n } else {\n if((!this.getFiller(node as HTMLElement).classList.contains('input-filler-text') && idx !== smthIndex) || c.offset === BOM.length) {\n move(!toLeft);\n }\n\n break;\n }\n } while(true);\n }\n }\n\n private onSelectionChange = (e: Event) => {\n const {input} = this;\n if(!input) {\n this.setSelectionClassName(document.getSelection());\n return;\n }\n\n // return;\n\n // this.log('selectionchange', document.getSelection(), document.getSelection().rangeCount && document.getSelection().getRangeAt(0), getCaretPosN());\n // let {node, offset} = getCaretPos(this.messageInput);\n\n let caret = this.getCaretPosN();\n do {\n const {node, offset, selection, move} = caret;\n\n const nodeValue = node?.nodeValue;\n // if(!nodeValue?.includes(BOM)) {\n if(nodeValue !== BOM || !this.lastNode) {\n break;\n }\n\n // node = getFiller(node);\n\n // const childIndex = whichChild(getFiller(node), true);\n // let toLeft: boolean;\n // // if(node === lastNode) toLeft = lastOffset >= offset;\n // if(node === lastNode) toLeft = lastOffset > offset;\n // else {\n // // toLeft = whichChild(getFiller(lastNode)) > childIndex;\n // toLeft = (lastNode.nodeValue === BOM ? whichChild(getFiller(lastNode), true) : whichChild(findUpAsChild(lastNode as any, getFiller(node).parentElement), true)) > childIndex;\n // }\n\n const toLeft = compareNodes(node, offset, this.lastNode as ChildNode, this.lastOffset) < 0;\n\n // const childNodes = Array.from(node.parentElement.childNodes);\n // if(toLeft) {\n // for(let i = childIndex; i >= 0; --i) {\n // const sibling = childNodes[i];\n // const {textContent} = sibling;\n // for()\n // }\n // }\n\n // {\n // if(toLeft === undefined) {\n // return;\n // }\n\n // const selection = window.getSelection();\n // selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // return;\n // }\n\n // const parent = getFiller(node);\n if(toLeft !== undefined) {\n // let newNode = toLeft ? parent.previousSibling : parent.nextSibling;\n if(selection.isCollapsed) {\n this.superMove(input, caret, toLeft, true);\n\n // if(offset === BOM.length) {\n // newNode = toLeft ? newNode.nextSibling.nextSibling : parent.previousSibling.previousSibling;\n // }\n\n // setCaretAt(newNode);\n } else {\n selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // const range = selection.getRangeAt(0);\n\n // if(toLeft) {\n // newNode = parent.previousSibling.previousSibling.firstChild;\n // const value = newNode.nodeValue;\n // range.setStart(newNode, value?.length);\n // } else {\n // newNode = parent.nextSibling.nextSibling.firstChild;\n // range.setEnd(newNode, 0);\n // }\n }\n }\n\n this.log('selectionchange',\n node,\n offset,\n this.lastNode,\n this.lastOffset,\n node === this.lastNode,\n whichChild(this.getFiller(node)),\n whichChild(this.getFiller(this.lastNode)),\n toLeft,\n selection,\n document.getSelection(),\n document.getSelection().getRangeAt(0),\n node?.parentNode,\n this.lastNode?.parentNode\n );\n\n caret = this.getCaretPosN();\n this.lastNode = node;\n this.lastOffset = offset;\n\n break;\n\n // if(findPreviousSmthIndex(caret.node) !== smthIndex) {\n // break;\n // }\n } while(true);\n\n this.lastNode = this.lastOffset = undefined;\n\n // if(offset === BOM.length) {\n // setCaretAt(parent);\n // } else {\n // setCaretAt(parent.nextSibling);\n // }\n\n this.setSelectionClassName(caret.selection, input);\n };\n\n public restoreSavedRange(input: HTMLElement) {\n const range = this.getSavedRange(input);\n if(!range) {\n return false;\n }\n\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n }\n\n public getSavedRange(input: HTMLElement) {\n return this.savedRanges.get(input);\n }\n\n public makeFocused(input: HTMLElement) {\n if(document.activeElement !== input && !this.restoreSavedRange(input)) {\n placeCaretAtEnd(input, false, false);\n }\n }\n\n private fixInsertedLineBreaks(input: HTMLElement) {\n input.querySelectorAll('br').forEach((br) => {\n br.classList.add('br-not-br');\n });\n }\n\n private fixBuggedCaret() {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n public onBeforeInput = (e: Pick) => {\n const {input, log} = this;\n if(!input) {\n return;\n }\n\n const addInputCallback = this.addInputCallback.bind(this, input);\n\n const caretPos = this.getCaretPosN();\n let {node, offset, selection, move} = caretPos;\n log('beforeinput', e, node, offset, selection, caretPos);\n this.lastNode = this.lastOffset = undefined;\n\n if(e.inputType.startsWith('delete')) { // delete current BOM\n addInputCallback(() => {\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.fixInsertedLineBreaks(input);\n });\n\n if(node?.nodeValue === BOM && selection.isCollapsed && e.inputType.includes('deleteContent')) {\n const toLeft = e.inputType.includes('Backward');\n const moveFirst = (offset === BOM.length && toLeft) || (!offset && !toLeft);\n this.superMove(input, caretPos, toLeft, moveFirst);\n // if((offset === BOM.length && toLeft) || (!offset && !toLeft)) {\n // move(toLeft);\n // }\n\n // addInputCallback(() => {\n // removePossibleBOMSiblingsByNode(getFiller(node));\n // });\n\n // if(node.parentNode.childNodes.length === 1) {\n // (node.parentNode as HTMLElement).remove();\n // move(e.inputType.includes('Backward') ? false : true);\n // } else {\n // move(e.inputType.includes('Backward') ? true : false);\n // addInputCallback(() => {\n // move(e.inputType.includes('Backward') ? false : true);\n // });\n // }\n\n // for(let i = 0, length = BOM.length + (direction === 'backward' ? offset : BOM.length - offset); i < length; ++i) {\n // selection.modify('extend', direction, 'character');\n // }\n\n // selection.modify('extend', direction, 'character');\n // selection.modify('extend', direction, 'character');\n\n // selection.deleteFromDocument();\n // e.preventDefault();\n } else {\n // const filler = getFiller(node);\n // if(filler?.classList?.contains('input-filler-text')) {\n // const {previousSibling, nextSibling} = filler;\n // addInputCallback(() => {\n // if(!filler.isConnected) {\n // removePossibleBOMSiblings(previousSibling, nextSibling);\n // }\n // // removeExtraBOMs();\n // // processEmptiedFillers();\n // });\n // }\n // addInputCallback(() => {\n // this.fixInsertedLineBreaks(input);\n // });\n }\n } else if(e.inputType.startsWith('insert')) { // clear current BOM\n if((node as HTMLElement)?.classList?.contains('input-something')/* || (node.textContent === BOM && offset === BOM.length) */) {\n node = node.previousSibling.firstChild;\n const range = selection.getRangeAt(0);\n range.setStart(node, 0);\n range.setEnd(node, 0);\n range.collapse(true);\n // selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n if(node && node.textContent === BOM && offset === BOM.length) {\n // const range = selection.getRangeAt(0);\n // range.setStart(node, 0);\n // range.setEnd(node, 0);\n // range.collapse(true);\n selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n // if(node && node.textContent === BOM && offset === 0) {\n // selection.modify('move', 'forward', 'character');\n // offset = BOM.length;\n // }\n\n if(e.inputType === 'insertLineBreak' || true) {\n // const appendix = 'X';\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // selection.modify('move', 'forward', 'character');\n // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n /* if(node?.nodeValue === BOM) */ {\n // const parent = node.parentElement;\n // parent.contentEditable = 'false';\n // addInputCallback(() => {\n // parent.contentEditable = 'inherit';\n // });\n // node.parentElement.remove();\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // fix case when focused somehow on span instead of text node\n if(node && node.nodeType === node.ELEMENT_NODE) {\n node = node.firstChild;\n log.warn('fixing focus on span');\n }\n\n const isBOM = node?.nodeValue === BOM;\n log('inserting line break', isBOM, node, `\"${node?.nodeValue}\"`, node?.parentElement ? Array.from(node.parentElement.childNodes).slice() : []);\n if(isBOM) {\n // (node as ChildNode).replaceWith(this.messageInput.querySelector('.lol'));\n\n const parentElement = node.parentElement;\n parentElement.classList.replace('input-filler', 'input-filler-text');\n const childNodesLength = parentElement.childNodes.length;\n addInputCallback(() => {\n const newChildNodesLength = parentElement.childNodes.length;\n if(newChildNodesLength > 1/* && newChildNodesLength !== childNodesLength */) {\n log('inserting line break, remove');\n node = Array.from(parentElement.childNodes).find((node) => node.nodeValue === BOM);\n (parentElement as any).t = node;\n // node?.remove();\n\n // const n = parentElement.firstChild;\n // const range = selection.getRangeAt(0);\n // range.setStart(n, n.nodeValue.length);\n // range.setEnd(n, n.nodeValue.length);\n } else if(node.nodeValue !== BOM) {\n log('inserting line break, deleteData');\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // node = document.createTextNode(BOM);\n }\n\n this.fixInsertedLineBreaks(input);\n // (parentElement as any).t = node;\n // node.remove();\n });\n // addInputCallback(() => {\n // node.parentElement.classList.replace('input-filler', 'input-filler3');\n // const s = document.createElement('span');\n // s.style.display = 'none';\n // node.replaceWith(s);\n // s.prepend(node);\n // });\n } else if(e.inputType === 'insertLineBreak') {\n addInputCallback(() => {\n this.fixInsertedLineBreaks(input);\n });\n // const range = selection.getRangeAt(0);\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }, false);\n }/* else if(node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n\n } */\n\n // if(e.inputType === 'insertLineBreak') {\n // e.preventDefault();\n // document.execCommand('insertHTML', false, '\\n');\n\n // this.messageInputField.simulateInputEvent();\n // }\n\n // node.parentElement.replaceWith(node);\n // selection.removeAllRanges();\n // const range = new Range();\n // range.setStart(node, 0);\n // range.setEnd(node, node.nodeValue.length);\n // selection.addRange(range);\n // node.parentElement.classList.remove('input-filler');\n // node.parentElement\n }\n\n // document.execCommand('insertHTML', false, '\\n');\n // e.preventDefault();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // if(node?.nodeValue === BOM) {\n // addInputCallback(() => {\n // node.remove();\n // });\n // }\n // this.messageInputField.simulateInputEvent();\n\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n // });\n return;\n }\n\n if(node?.nodeValue === BOM) {\n // node.nodeValue = ''; // ! will move cursor forward\n // addInputCallback(() => {\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // });\n\n if(e.inputType === 'insertLineBreak') {\n if(offset === BOM.length) {\n selection.modify('move', 'backward', 'character');\n }\n\n // if(offset !== BOM.length) {\n // selection.modify('move', 'forward', 'character');\n // }\n\n addInputCallback(() => {\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n\n setTimeout(() => {\n selection.modify('move', 'forward', 'character');\n }, 0);\n });\n }\n\n // node.parentElement.replaceWith(node);\n\n // node.parentElement.replaceWith(node);\n if(e.inputType === 'insertLineBreak') {\n // const previousParentSibling = node.parentNode.previousSibling;\n // addInputCallback(() => {\n // if(previousParentSibling.nextSibling.nodeValue === '\\n') {\n // previousParentSibling.nextSibling.remove();\n\n // setTimeout(() => {\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // }, 0);\n // } else {\n // previousParentSibling.nextSibling.nodeValue = previousParentSibling.nextSibling.nodeValue.replace('\\n\\n', '\\n');\n // }\n // });\n } else {\n // if(node.parentElement !== this.messageInput) {\n // node.parentElement.replaceWith(node);\n // }\n\n // setTimeout(() => {\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // node.nodeValue = node.nodeValue.replace(BOM, '');\n // // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // }, 1000);\n\n addInputCallback(() => {\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n if(!node.nodeValue) {\n node.remove();\n }\n\n // selection.modify('move', 'forward', 'character');\n });\n }\n\n if(selection.isCollapsed && false) {\n node.parentElement.replaceWith(node);\n // const textNode = document.createTextNode(BOM);\n // (node.parentNode as any as ChildNode).after(textNode);\n // setCaretAt(textNode.nextSibling);\n // selection.modify('move', 'forward', 'character');\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n // selection.collapseToEnd();\n\n // addInputCallback(() => {\n // (textNode as CharacterData).deleteData(textNode.nodeValue.indexOf(BOM), BOM.length);\n // node.parentElement.remove();\n // });\n }\n } else if(e.inputType === 'insertLineBreak' &&\n node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n log('inserting line break');\n // const appendix = '\\x01';\n\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'inherit';\n });\n addInputCallback(() => {\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'false';\n });\n });\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // const offset = node.nodeValue.length;\n // (node as CharacterData).insertData(offset, appendix);\n // addInputCallback(() => {\n // selection.modify('move', 'forward', 'character');\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(appendix), appendix.length);\n // if(!node.nodeValue) {\n // node.remove();\n // }\n // });\n }\n } else if(e.inputType === 'historyUndo') { // have to remove extra BOMs\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.removeEmptyTextNodes(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n\n // lol\n // this.messageInput.querySelectorAll('.has-text').forEach((el) => {\n // if(el.textContent === BOM) {\n // el.firstElementChild.replaceWith(el.firstElementChild.firstChild);\n // el.classList.replace('input-filler3', 'input-filler');\n // }\n // });\n });\n } else if(e.inputType === 'historyRedo') {\n // if(node?.nodeValue === BOM && offset === BOM.length) {\n // selection.modify('move', 'backward', 'character');\n // }\n\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n\n // fix contenteditable attribute\n input.querySelectorAll('.input-something:not([contenteditable])').forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n });\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n\n // // have to ignore line up and down\n if(key === 'ArrowDown' || key === 'ArrowUp') {\n this.lastNode = this.lastOffset = undefined;\n } else {\n const {node, offset} = this.getCaretPosN();\n this.lastNode = node/* getFiller(node) */, this.lastOffset = offset;\n if(this.lastNode === this.input) {\n this.lastNode = this.lastOffset = undefined;\n }\n }\n\n this.log('keydown', this.lastNode, this.lastNode?.parentNode, this.lastOffset, this.getCaretPosN(), e);\n };\n\n private addInputCallback(input: HTMLElement, callback: () => void, capture = true) {\n const newCallback = () => {\n this.log('input modify callback');\n callback();\n };\n\n if(capture && IS_FIREFOX) this.inputCaptureCallbacks.push(newCallback);\n else this.listenerSetter.add(input)('input', newCallback, {once: true, capture});\n }\n\n public removeExtraBOMs(input: HTMLElement) {\n const c = (sibling: ChildNode) => {\n return (sibling as HTMLElement)?.classList?.contains('input-something');\n };\n\n input.querySelectorAll('.input-filler').forEach((el) => {\n const {previousSibling, nextSibling} = el;\n let needed = false;\n\n // if(!(previousSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(previousSibling)) {\n if(!(nextSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(nextSibling)) {\n needed = c(previousSibling) || c(nextSibling);\n }\n\n if(!needed) {\n this.log.warn('removing empty bom node', el);\n el.remove();\n }\n });\n }\n\n private getFiller(node: Node) {\n return node && node.nodeType === node.TEXT_NODE && node.parentElement !== this.input ? node.parentElement : node as HTMLElement;\n }\n\n private getCaretPosN() {\n const ret = getCaretPosNew(this.input);\n // const {node} = ret;\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // ret.node = node.previousSibling;\n // ret.offset = ret.node.textContent.length;\n // }\n\n return {...ret, move: this.move.bind(this, ret.selection)};\n }\n\n private removeEmptyTextNodes(input: HTMLElement) {\n const {log} = this;\n // let i = -1;\n // remove empty text nodes\n const treeWalker = document.createTreeWalker(\n input,\n NodeFilter.SHOW_TEXT,\n {acceptNode: (node) => node.parentElement === input && !node.nodeValue/* && !++i */ ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let textNode: Text;\n while(textNode = treeWalker.nextNode() as Text) {\n log.warn('removing empty text node', textNode);\n textNode.remove();\n }\n }\n\n private removePossibleBOMSiblings(previousSibling: ChildNode, nextSibling: ChildNode) {\n [previousSibling, nextSibling].forEach((sibling) => {\n if((sibling as HTMLElement)?.classList?.contains('input-filler')) {\n sibling.remove();\n }\n });\n }\n\n private removePossibleBOMSiblingsByNode(node: ChildNode) {\n const {previousSibling, nextSibling} = node;\n this.removePossibleBOMSiblings(previousSibling, nextSibling);\n };\n\n private processEmptiedFillers(input: HTMLElement) {\n input.querySelectorAll('.input-filler-text').forEach((el) => {\n this.removeExtraBOMs(el);\n\n let cleanSiblings = true;\n if(!el.textContent) {\n el.classList.replace('input-filler-text', 'input-filler');\n\n const textNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE);\n if(textNode) {\n (textNode as CharacterData).insertData(0, BOM);\n } else if(((el as any).t as ChildNode)?.nodeValue) {\n el.append((el as any).t);\n } else {\n el.append(document.createTextNode(BOM));\n }\n } else if(!NOT_ONLY_BOMS_REG_EXP.test(el.textContent) && !el.querySelector('.input-something')) {\n el.classList.replace('input-filler-text', 'input-filler');\n } else {\n cleanSiblings = false;\n }\n\n if(cleanSiblings) {\n this.removePossibleBOMSiblingsByNode(el);\n }\n });\n }\n\n private processFilledFillers(input: HTMLElement) {\n // remove the BOM when changing to text\n input.querySelectorAll('.input-filler').forEach((el) => {\n if(el.textContent !== BOM) {\n el.classList.replace('input-filler', 'input-filler-text');\n const t = (el as any).t as ChildNode;\n const bomNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE && node.nodeValue.includes(BOM));\n if(bomNode && !t?.nodeValue) {\n const idx = bomNode.nodeValue.indexOf(BOM);\n if(idx !== -1) {\n (bomNode as CharacterData).deleteData(idx, BOM.length);\n }\n }\n\n // t?.remove();\n }\n });\n }\n\n private setSelectionClassName(selection: Selection, input?: HTMLElement) {\n // Array.from(this.messageInput.querySelectorAll('.selection')).forEach((element) => {\n // element.classList.remove('selection');\n // });\n\n if(selection.rangeCount) {\n const range = selection.getRangeAt(0);\n\n if(input) {\n Array.from(input.querySelectorAll('.input-selectable')).forEach((element) => {\n element.classList.toggle('selection', !range.collapsed && range.intersectsNode(element));\n });\n } else {\n Array.from(document.querySelectorAll('.input-selectable.selection')).forEach((element) => element.classList.remove('selection'));\n }\n }\n }\n\n private move(selection: Selection, left: boolean) {\n const {focusNode: focusNodeBefore, focusOffset: focusOffsetBefore} = selection;\n selection.modify('extend', left ? 'backward' : 'forward', 'character');\n // if(offset === nodeValue.length) {\n // selection.modify('extend', !left ? 'backward' : 'forward', 'character');\n // }\n if(left) selection.collapseToStart();\n else selection.collapseToEnd();\n const {focusNode: focusNodeAfter, focusOffset: focusOffsetAfter} = selection;\n this.log(\n 'moving cursor',\n left,\n focusNodeBefore,\n focusNodeBefore.nodeType === focusNodeBefore.ELEMENT_NODE ? focusNodeBefore : focusNodeBefore.parentElement,\n focusOffsetBefore,\n focusNodeAfter,\n focusNodeAfter.nodeType === focusNodeAfter.ELEMENT_NODE ? focusNodeAfter : focusNodeAfter.parentElement,\n focusOffsetAfter\n );\n }\n\n public prepareApplyingMarkdown() {\n const {input} = this;\n\n // do not wrap fillers into spans\n const fillers = input.querySelectorAll('.input-filler');\n // fillers.forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n const smths = input.querySelectorAll('.input-something');\n smths.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n return () => {\n fillers.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n smths.forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n };\n }\n\n public static getInstance() {\n return this.INSTANCE ??= new RichInputHandler();\n }\n}\n","/*\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 setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n elem.setAttribute('dir', 'auto');\n if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.innerHTML = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n","/*\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 toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\n if(disable) {\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\n } else {\n elements.forEach((el) => el.removeAttribute('disabled'));\n }\n\n return () => toggleDisability(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\nexport default function whichChild(elem: Node, countNonElements?: boolean) {\n if(!elem.parentNode) {\n return -1;\n }\n\n if(countNonElements) {\n return Array.from(elem.parentNode.childNodes).indexOf(elem as ChildNode);\n }\n\n let i = 0;\n // @ts-ignore\n while((elem = elem.previousElementSibling) !== null) ++i;\n return 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 {attachClickEvent, detachClickEvent} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\nimport ListenerSetter from './listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from './object/safeAssign';\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport findUpClassName from './dom/findUpClassName';\nimport rootScope from '../lib/rootScope';\n\nconst KEEP_OPEN = false;\nconst TOGGLE_TIMEOUT = 200;\nconst ANIMATION_DURATION = 200;\n\nexport type IgnoreMouseOutType = 'click' | 'menu' | 'popup';\ntype DropdownHoverTimeoutType = 'toggle' | 'done';\n\nexport default class DropdownHover extends EventListenerBase<{\n open: () => Promise | void,\n openAfterLayout: () => void,\n opened: () => any,\n close: () => any,\n closed: () => any\n}> {\n protected element: HTMLElement;\n protected forceClose: boolean;\n protected inited: boolean;\n protected ignoreMouseOut: Set;\n protected ignoreButtons: Set;\n protected navigationItem: NavigationItem;\n protected ignoreOutClickClassName: string;\n protected timeouts: {[type in DropdownHoverTimeoutType]?: number};\n\n constructor(options: {\n element: DropdownHover['element'],\n ignoreOutClickClassName?: string\n }) {\n super(false);\n safeAssign(this, options);\n this.forceClose = false;\n this.inited = false;\n this.ignoreMouseOut = new Set();\n this.ignoreButtons = new Set();\n this.timeouts = {};\n }\n\n public attachButtonListener(\n button: HTMLElement,\n listenerSetter: ListenerSetter\n ) {\n let firstTime = true;\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(button, () => {\n if(firstTime) {\n firstTime = false;\n this.toggle(true);\n } else {\n this.toggle();\n }\n }, {listenerSetter});\n } else {\n listenerSetter.add(button)('mouseover', (e) => {\n if(firstTime) {\n listenerSetter.add(button)('mouseout', (e) => {\n this.clearTimeout('toggle');\n this.onMouseOut(e);\n });\n firstTime = false;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(true);\n }, TOGGLE_TIMEOUT);\n });\n\n attachClickEvent(button, () => {\n const type: IgnoreMouseOutType = 'click';\n const ignore = !this.ignoreMouseOut.has(type);\n\n if(ignore && !this.ignoreMouseOut.size) {\n this.ignoreButtons.add(button);\n setTimeout(() => {\n attachClickEvent(window, this.onClickOut, {capture: true});\n }, 0);\n }\n\n this.setIgnoreMouseOut(type, ignore);\n this.toggle(ignore);\n }, {listenerSetter});\n }\n }\n\n protected onClickOut = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if(\n !findUpAsChild(target, this.element) &&\n !Array.from(this.ignoreButtons).some((button) => findUpAsChild(target, button) || target === button) &&\n this.ignoreMouseOut.size <= 1 &&\n (!this.ignoreOutClickClassName || !findUpClassName(target, this.ignoreOutClickClassName))\n ) {\n this.toggle(false);\n }\n };\n\n protected onMouseOut = (e: MouseEvent) => {\n if(KEEP_OPEN || !this.isActive()) return;\n this.clearTimeout('toggle');\n\n if(this.ignoreMouseOut.size) {\n return;\n }\n\n const toElement = (e as any).toElement as HTMLElement;\n if(toElement && findUpAsChild(toElement, this.element)) {\n return;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(false);\n }, TOGGLE_TIMEOUT);\n };\n\n protected clearTimeout(type: DropdownHoverTimeoutType) {\n if(this.timeouts[type] !== undefined) {\n clearTimeout(this.timeouts[type]);\n delete this.timeouts[type];\n }\n }\n\n protected setTimeout(type: DropdownHoverTimeoutType, cb: () => void, timeout: number) {\n this.clearTimeout(type);\n this.timeouts[type] = window.setTimeout(() => {\n this.clearTimeout(type);\n cb();\n }, timeout);\n }\n\n public init() {\n if(!IS_TOUCH_SUPPORTED) {\n this.element.onmouseout = this.onMouseOut;\n this.element.onmouseover = (e) => {\n if(this.forceClose) {\n return;\n }\n\n // console.log('onmouseover element');\n this.clearTimeout('toggle');\n };\n }\n }\n\n public toggle = async(enable?: boolean) => {\n // if(!this.element) return;\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\n if(this.init) {\n if(willBeActive) {\n this.init();\n this.init = null;\n } else {\n return;\n }\n }\n\n if(willBeActive === this.isActive()) {\n return;\n }\n\n const delay = IS_TOUCH_SUPPORTED || !rootScope.settings.animationsEnabled ? 0 : ANIMATION_DURATION;\n if((this.element.style.display && enable === undefined) || enable) {\n const res = this.dispatchResultableEvent('open');\n await Promise.all(res);\n\n this.element.style.display = '';\n void this.element.offsetLeft; // reflow\n this.element.classList.add('active');\n\n this.dispatchEvent('openAfterLayout');\n\n appNavigationController.pushItem(this.navigationItem = {\n type: 'dropdown',\n onPop: () => {\n this.toggle(false);\n }\n });\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.forceClose = false;\n this.dispatchEvent('opened');\n }, delay);\n\n // ! can't use together with resizeObserver\n /* if(isTouchSupported) {\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n console.log('[ESG]: toggle: enable height', height);\n appImManager.chat.bubbles.scrollable.scrollTop += height;\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n } else {\n this.dispatchEvent('close');\n this.ignoreMouseOut.clear();\n this.ignoreButtons.clear();\n\n this.element.classList.remove('active');\n\n appNavigationController.removeItem(this.navigationItem);\n detachClickEvent(window, this.onClickOut, {capture: true});\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.element.style.display = 'none';\n this.forceClose = false;\n this.dispatchEvent('closed');\n }, delay);\n\n /* if(isTouchSupported) {\n const scrollHeight = this.container.scrollHeight;\n if(scrollHeight) {\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\n }\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n }\n\n // animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n };\n\n public isActive() {\n return this.element.classList.contains('active');\n }\n\n public setIgnoreMouseOut(type: IgnoreMouseOutType, ignore: boolean) {\n ignore ? this.ignoreMouseOut.add(type) : this.ignoreMouseOut.delete(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\n// * Jolly Cobra's fastSmoothScroll slightly patched\n\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport {fastRafPromise} from './schedulers';\nimport {animateSingle, cancelAnimationByKey} from './animation';\nimport rootScope from '../lib/rootScope';\nimport isInDOM from './dom/isInDOM';\n\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n};\n\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\nexport type ScrollGetElementPositionCallback = (options: {elementRect: DOMRect, containerRect: DOMRect, elementPosition: number}) => number;\nexport type ScrollStartCallbackDimensions = {\n scrollSize: number,\n scrollPosition: number,\n distanceToEnd: number,\n path: number,\n duration: number,\n containerRect: DOMRect,\n elementRect: DOMRect,\n getProgress: () => number\n};\n\nexport type ScrollOptions = {\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin?: number,\n maxDistance?: number,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n axis?: 'x' | 'y',\n getNormalSize?: ScrollGetNormalSizeCallback,\n getElementPosition?: ScrollGetElementPositionCallback,\n fallbackToElementStartWhenCentering?: HTMLElement,\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void,\n transitionFunction?: (value: number) => number\n};\n\nexport default function fastSmoothScroll(options: ScrollOptions) {\n options.margin ??= 0;\n options.maxDistance ??= LONG_TRANSITION_MAX_DISTANCE;\n options.axis ??= 'y';\n // return;\n\n if(!rootScope.settings.animationsEnabled || options.forceDuration === 0) {\n options.forceDirection = FocusDirection.Static;\n }\n\n if(options.forceDirection === FocusDirection.Static) {\n options.forceDuration = 0;\n return scrollWithJs(options);\n /* return Promise.resolve();\n\n element.scrollIntoView({ block: position });\n\n cancelAnimationByKey(container);\n return Promise.resolve(); */\n }\n\n const promise = fastRafPromise().then(() => scrollWithJs(options));\n\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\n}\n\nfunction scrollWithJs(options: ScrollOptions): Promise {\n const {element, container, getNormalSize, getElementPosition, transitionFunction, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\n if(!isInDOM(element)) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n const rectStartKey = axis === 'y' ? 'top' : 'left';\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\n const sizeKey = axis === 'y' ? 'height' : 'width';\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\n const elementScrollSizeKey = axis === 'y' ? 'scrollHeight' : 'offsetWidth'; // can use offsetWidth for X, since it's almost same as scrollWidth\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n // const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\n\n // const transformable = container.firstElementChild as HTMLElement;\n\n const possibleElementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\n const elementPosition = getElementPosition ? getElementPosition({elementRect, containerRect, elementPosition: possibleElementPosition}) : possibleElementPosition;\n const elementSize = element[elementScrollSizeKey]; // margin is exclusive in DOMRect\n\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\n\n let scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n /* const elementPosition = element.offsetTop;\n const elementSize = element.offsetHeight;\n\n const scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n const containerSize = container.offsetHeight; */\n\n let path!: number;\n\n switch(position) {\n case 'start':\n path = elementPosition - margin;\n break;\n case 'end':\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n if(elementSize < containerSize) {\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\n } else {\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\n options.element = options.fallbackToElementStartWhenCentering;\n options.position = 'start';\n return scrollWithJs(options);\n }\n\n path = elementPosition - margin;\n }\n\n break;\n }\n /* switch (position) {\n case 'start':\n path = (elementPosition - margin) - scrollPosition;\n break;\n case 'end':\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementSize < containerSize\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\n : (elementPosition - margin) - scrollPosition;\n break;\n } */\n\n if(Math.abs(path - (margin || 0)) < 1) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n if(axis === 'y') {\n if(forceDirection === undefined) {\n if(path > maxDistance) {\n scrollPosition = container.scrollTop += path - maxDistance;\n path = maxDistance;\n } else if(path < -maxDistance) {\n scrollPosition = container.scrollTop += path + maxDistance;\n path = -maxDistance;\n }\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\n } */\n }\n\n // console.log('scrollWithJs: will scroll path:', path, element);\n\n /* let existsTransform = 0;\n const currentTransform = transformable.style.transform;\n if(currentTransform) {\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\n //path += existsTransform;\n } */\n\n if(path < 0) {\n const remainingPath = -scrollPosition;\n path = Math.max(path, remainingPath);\n } else if(path > 0) {\n const remainingPath = scrollSize - (scrollPosition + containerSize);\n path = Math.min(path, remainingPath);\n }\n\n const target = container[scrollPositionKey] + path;\n const absPath = Math.abs(path);\n const duration = forceDuration ?? (\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n /* transformable.classList.add('no-transition');\n\n const tickTransform = () => {\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const currentPath = path * transition(t);\n\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\n container.dataset.translate = '' + -currentPath;\n\n const willContinue = t < 1;\n if(!willContinue) {\n fastRaf(() => {\n delete container.dataset.transform;\n container.dataset.transform = '';\n transformable.style.transform = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n container[scrollPositionKey] = Math.round(target);\n });\n }\n\n return willContinue;\n };\n\n return animateSingle(tickTransform, container); */\n\n /* return new Promise((resolve) => {\n fastRaf(() => {\n transformable.style.transform = '';\n transformable.style.transition = '';\n\n setTimeout(resolve, duration);\n });\n });\n\n const transformableHeight = transformable.scrollHeight;\n //transformable.style.minHeight = `${transformableHeight}px`;\n */\n\n const transition = transitionFunction ?? (absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition);\n const getProgress = () => duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const tick = () => {\n const t = getProgress();\n const value = transition(t);\n const currentPath = path * (1 - value);\n container[scrollPositionKey] = Math.round(target - currentPath);\n\n return t < 1;\n };\n\n if(!duration || !path) {\n cancelAnimationByKey(container);\n tick();\n return Promise.resolve();\n }\n\n /* return new Promise((resolve) => {\n setTimeout(resolve, duration);\n }).then(() => {\n transformable.classList.add('no-transition');\n void transformable.offsetLeft; // reflow\n transformable.style.transform = '';\n transformable.style.transition = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n fastRaf(() => {\n\n container[scrollPositionKey] = Math.round(target);\n //transformable.style.minHeight = ``;\n });\n\n }); */\n\n if(options.startCallback) {\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\n options.startCallback({\n scrollSize,\n scrollPosition,\n distanceToEnd,\n path,\n duration,\n containerRect,\n elementRect,\n getProgress\n });\n }\n\n return animateSingle(tick, container);\n}\n\nfunction longTransition(t: number) {\n return 1 - ((1 - t) ** 5);\n}\n\nfunction shortTransition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","/*\n * 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 {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = location.volume_id + '_' + location.local_id;\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\n}\n","/*\n * 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 {i18n, LangPackKey} from '../lib/langPack';\n\nexport default function formatBytes(bytes: number, decimals: number | 'auto' = 'auto') {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const strictDecimals = decimals === 'auto';\n\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const _decimals = decimals === 'auto' ? Math.max(0, i - 1) : decimals;\n\n const dm = Math.max(0, _decimals);\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const fixed = (bytes / Math.pow(k, i)).toFixed(dm);\n return i18n(sizes[i], [strictDecimals ? fixed : parseFloat(fixed)]);\n}\n","/*\n * 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, join, LangPackKey} from '../lib/langPack';\nimport formatDuration, {DurationType} from './formatDuration';\n\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\n s: 'Seconds',\n m: 'Minutes',\n h: 'Hours',\n d: 'Days',\n w: 'Weeks',\n mm: 'Months',\n y: 'Years'\n};\nexport default function formatCallDuration(duration: number, plain?: boolean) {\n const a = formatDuration(duration, 2);\n if(plain) {\n const strings = a.map((d) => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\n return join(strings, false, plain);\n }\n\n const elements = a.map((d) => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\n\n const fragment = document.createElement('span');\n fragment.append(...join(elements, false));\n\n return fragment;\n}\n","/*\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 DurationType = 's' | 'm' | 'h' | 'd' | 'w' | 'mm' | 'y';\nexport default function formatDuration(duration: number, showLast = 2) {\n if(!duration) {\n duration = 1;\n }\n\n const d: {duration: number, type: DurationType}[] = [];\n const p = [\n {m: 1, t: 's'},\n {m: 60, t: 'm'},\n {m: 60, t: 'h'},\n {m: 24, t: 'd'},\n {m: 7, t: 'w'}\n ] as Array<{m?: number, t: DurationType}>\n const s = 1;\n let t = s;\n p.forEach((o, idx) => {\n t = Math.round(t * o.m);\n\n if(duration < t) {\n return;\n }\n\n let dd = duration / t;\n if(idx !== (p.length - 1)) {\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\n dd %= modulus;\n }\n\n d.push({\n duration: dd | 0,\n type: o.t\n });\n });\n\n const out = d.slice(-showLast).reverse();\n for(let i = out.length - 1; i >= 0; --i) {\n if(out[i].duration === 0) {\n out.splice(i, 1);\n }\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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 const 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]) {\n patternMatches += 1.01;\n } else if(_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 type {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type FramesCacheMap = Map;\nexport type FramesCacheMapNew = Map;\nexport type FramesCacheMapURLs = Map;\nexport type FramesCacheItem = {\n frames: FramesCacheMap,\n framesNew: FramesCacheMapNew,\n framesURLs: FramesCacheMapURLs,\n clearCache: () => void,\n counter: number\n};\n\nexport class FramesCache {\n private cache: Map;\n\n constructor() {\n this.cache = new Map();\n }\n\n public static createCache(): FramesCacheItem {\n const cache: FramesCacheItem = {\n frames: new Map(),\n framesNew: new Map(),\n framesURLs: new Map(),\n clearCache: () => {\n cache.framesNew.forEach((value) => {\n (value as ImageBitmap).close?.();\n });\n\n cache.frames.clear();\n cache.framesNew.clear();\n cache.framesURLs.clear();\n },\n counter: 0\n };\n\n return cache;\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = FramesCache.createCache());\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name,\n width,\n height,\n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst framesCache = new FramesCache();\n\nexport default framesCache;\n","/*\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// generate a path's arc data parameter\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\n return [rx, ',', ry, ' ',\n xAxisRotation, ' ',\n largeArcFlag, ',',\n sweepFlag, ' ',\n x, ',', y].join('');\n}\n\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\n const data: string[] = [];\n\n // start point in top-middle of the rectangle\n data.push('M' + (x + width / 2) + ',' + y);\n\n // next we go to the right\n data.push('H' + (x + width - tr));\n\n if(tr > 0) {\n // now we draw the arc in the top-right corner\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\n }\n\n // next we go down\n data.push('V' + (y + height - br));\n\n if(br > 0) {\n // now we draw the arc in the lower-right corner\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\n }\n\n // now we go to the left\n data.push('H' + (x + bl));\n\n if(bl > 0) {\n // now we draw the arc in the lower-left corner\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\n }\n\n // next we go up\n data.push('V' + (y + tl));\n\n if(tl > 0) {\n // now we draw the arc in the top-left corner\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\n }\n\n // and we close the path\n data.push('Z');\n\n return data.join(' ');\n}\n\nMOUNT_CLASS_TO.generatePathData = generatePathData;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize} from '../layer';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\nimport getPreviewURLFromThumb from './getPreviewURLFromThumb';\nimport blur from './blur';\n\nexport default function getImageFromStrippedThumb(\n photo: MyPhoto | MyDocument,\n thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize,\n useBlur: boolean\n) {\n const url = getPreviewURLFromThumb(photo, thumb, false);\n\n let element: HTMLImageElement | HTMLCanvasElement, loadPromise: Promise;\n if(!useBlur) {\n element = new Image();\n loadPromise = renderImageFromUrlPromise(element, url);\n } else {\n const result = blur(url);\n element = result.canvas;\n loadPromise = result.promise;\n }\n\n element.classList.add('thumbnail');\n\n return {image: element, loadPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {PhotoSize} from '../layer';\n// import appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport getPreviewURLFromBytes from './bytes/getPreviewURLFromBytes';\n\nexport default function getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n // const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n // return cacheContext.url || (cacheContext.url = getPreviewURLFromBytes(thumb.bytes, isSticker));\n return getPreviewURLFromBytes(thumb.bytes, isSticker);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../lib/mtproto/mtproto_config';\nimport type {ThumbCache} from '../lib/storages/thumbs';\nimport getImageFromStrippedThumb from './getImageFromStrippedThumb';\n\nexport default function getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false) {\n const isVideo = (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type);\n if(!cacheContext.downloaded || isVideo || ignoreCache) {\n if(\n photo._ === 'document' &&\n cacheContext.downloaded &&\n !ignoreCache &&\n (!isVideo || cacheContext.type !== THUMB_TYPE_FULL)\n ) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find((size) => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from './array/forEachReverse';\nimport safeAssign from './object/safeAssign';\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T | Promise;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n\n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n /* public filter(callback: (item: T, idx: number, arr: T[]) => boolean) {\n const filter = (item: T, idx: number, arr: T[]) => {\n if(!callback(item, idx, arr)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n } */\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.setLoaded(true, loadedAll);\n this.setLoaded(false, loadedAll);\n }\n\n public go(length: number, dispatchJump = true) {\n let items: T[], item: T;\n if(length > 0) {\n items = this.next.splice(0, length);\n item = items.pop();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.unshift(this.current);\n this.previous.push(...items);\n } else {\n items = this.previous.splice(Math.max(0, this.previous.length + length), -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.push(this.current);\n this.next.unshift(...items);\n }\n\n if(this.next.length < this.loadWhenLeft) {\n this.load(!this.reverse);\n }\n\n if(this.previous.length < this.loadWhenLeft) {\n this.load(this.reverse);\n }\n\n this.current = item;\n dispatchJump && this.onJump && this.onJump(item, length > 0);\n return this.current;\n }\n\n protected unsetCurrent(toPrevious: boolean) {\n if(toPrevious) this.previous.push(this.current);\n else this.next.unshift(this.current);\n\n this.current = undefined;\n }\n\n public goUnsafe(length: number, dispatchJump?: boolean) {\n const leftLength = length > 0 ? Math.max(0, length - this.next.length) : Math.min(0, length + this.previous.length);\n const item = this.go(length, leftLength ? false : dispatchJump);\n\n /* if(length > 0 ? this.loadedAllUp : this.loadedAllDown) {\n this.unsetCurrent(length > 0);\n } */\n\n return {\n item: !leftLength ? item : undefined,\n leftLength\n };\n }\n\n protected setLoaded(down: boolean, value: boolean) {\n const isChanged = (down ? this.loadedAllDown : this.loadedAllUp) !== value;\n if(!isChanged) {\n return false;\n }\n\n if(down) this.loadedAllDown = value;\n else this.loadedAllUp = value;\n\n if(!value) {\n if(down) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n }\n\n return true;\n }\n\n // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older ? this.loadedAllDown : this.loadedAllUp) return Promise.resolve();\n\n let promise = older ? this.loadPromiseDown : this.loadPromiseUp;\n if(promise) return promise;\n\n let anchor: T;\n if(older) {\n anchor = this.reverse ? this.previous[0] : this.next[this.next.length - 1];\n } else {\n anchor = this.reverse ? this.next[this.next.length - 1] : this.previous[0];\n }\n\n anchor ??= this.current;\n promise = this.loadMore(anchor, older, this.loadCount).then(async(result) => {\n if((older ? this.loadPromiseDown : this.loadPromiseUp) !== promise) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n this.setLoaded(older, true);\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const processedArr: (Promise | any)[] = [];\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n processedArr.push(processed);\n });\n\n const results = await Promise.all(processedArr);\n if(older) {\n if(this.reverse) this.previous.unshift(...results);\n else this.next.push(...results);\n } else {\n if(this.reverse) this.next.push(...results);\n else this.previous.unshift(...results);\n }\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\n","/*\n * 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 EventListenerBase from './eventListenerBase';\n\nexport type Listener = {\n element: ListenerElement,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions,\n\n onceFired?: true, // will be set only when options.once is set\n onceCallback?: () => void,\n};\n\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\nexport type ListenerEvent = string;\nexport type ListenerCallback = Function;\nexport type ListenerOptions = AddEventListenerOptions;\n\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\n console.log('nu zdarova', name);\n originalAddEventListener.call(this, name, callback, options);\n\n if(options?.ls) {\n return options.ls.addFromElement(this, name, callback as any, options);\n }\n}; */\n\nexport default class ListenerSetter {\n private listeners: Set = new Set();\n\n public add(element: T): T['addEventListener'] {\n return ((event: string, callback: Function, options: ListenerOptions) => {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n }) as any;\n }\n\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n } */\n\n public addManual(listener: Listener) {\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.options?.once) { // remove listener when its called\n listener.onceCallback = () => {\n this.remove(listener);\n listener.onceFired = true;\n };\n\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\n }\n\n this.listeners.add(listener);\n }\n\n public remove(listener: Listener) {\n if(!listener.onceFired) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.onceCallback) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\n }\n }\n\n this.listeners.delete(listener);\n }\n\n public removeManual(\n element: T,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions\n ) {\n let listener: Listener;\n for(const _listener of this.listeners) {\n if(_listener.element === element &&\n _listener.event === event &&\n _listener.callback === callback &&\n _listener.options === options) {\n listener = _listener;\n break;\n }\n }\n\n if(listener) {\n this.remove(listener);\n }\n }\n\n public removeAll() {\n this.listeners.forEach((listener) => {\n this.remove(listener);\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 calcImageInBox from './calcImageInBox';\n\nexport class MediaSize {\n constructor(public width = 0, public height = width) {\n\n }\n\n public aspect(boxSize: MediaSize, fitted: boolean) {\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\n }\n\n public aspectFitted(boxSize: MediaSize) {\n return this.aspect(boxSize, true);\n }\n\n public aspectCovered(boxSize: MediaSize) {\n return this.aspect(boxSize, false);\n }\n}\n\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\n return new MediaSize(width, height);\n}\n","/*\n * 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 EventListenerBase from './eventListenerBase';\nimport {makeMediaSize, MediaSize} from './mediaSize';\n\ntype MediaTypeSizes = {\n regular: MediaSize,\n webpage: MediaSize,\n album: MediaSize,\n esgSticker: MediaSize,\n animatedSticker: MediaSize,\n staticSticker: MediaSize,\n emojiSticker: MediaSize,\n poll: MediaSize,\n round: MediaSize,\n documentName: MediaSize,\n invoice: MediaSize,\n extendedInvoice: MediaSize,\n customEmoji: MediaSize,\n esgCustomEmoji: MediaSize,\n emojiStatus: MediaSize,\n popupSticker: MediaSize\n};\n\nexport type MediaSizeType = keyof MediaTypeSizes;\n\nexport enum ScreenSize {\n mobile,\n medium,\n large\n}\n\nconst MOBILE_SIZE = 600;\nconst MEDIUM_SIZE = 1275;\nconst LARGE_SIZE = 1680;\n\nconst CUSTOM_EMOJI_SIZE = makeMediaSize(20, 20);\nconst ESG_CUSTOM_EMOJI_SIZE = makeMediaSize(36, 36);\nconst EMOJI_STATUS_SIZE = makeMediaSize(18, 18);\n\nclass MediaSizes extends EventListenerBase<{\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\n resize: () => void\n}> {\n private screenSizes: {key: ScreenSize, value: number}[] = [\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\n {key: ScreenSize.large, value: LARGE_SIZE}\n ];\n\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\n handhelds: {\n regular: makeMediaSize(270, 270),\n webpage: makeMediaSize(270, 200),\n album: makeMediaSize(270, 0),\n esgSticker: makeMediaSize(68, 68),\n animatedSticker: makeMediaSize(180, 180),\n staticSticker: makeMediaSize(180, 180),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(240, 0),\n round: makeMediaSize(200, 200),\n documentName: makeMediaSize(200, 0),\n invoice: makeMediaSize(270, 270),\n extendedInvoice: makeMediaSize(270, 270),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(68, 68)\n },\n desktop: {\n regular: makeMediaSize(420, 340),\n webpage: makeMediaSize(420, 340),\n album: makeMediaSize(420, 0),\n esgSticker: makeMediaSize(72, 72),\n animatedSticker: makeMediaSize(200, 200),\n staticSticker: makeMediaSize(200, 200),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(330, 0),\n round: makeMediaSize(280, 280),\n documentName: makeMediaSize(240, 0),\n invoice: makeMediaSize(320, 320),\n extendedInvoice: makeMediaSize(420, 340),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(80, 80)\n }\n };\n\n public isMobile = false;\n public active: MediaTypeSizes;\n public activeScreen: ScreenSize;\n private rAF: number;\n\n constructor() {\n super();\n\n window.addEventListener('resize', () => {\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n this.handleResize();\n this.rAF = 0;\n });\n });\n this.handleResize();\n }\n\n private handleResize = () => {\n const innerWidth = window.innerWidth;\n // this.isMobile = innerWidth <= 720;\n\n let activeScreen = this.screenSizes[0].key;\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\n if(this.screenSizes[i].value < innerWidth) {\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\n break;\n }\n }\n\n const wasScreen = this.activeScreen;\n this.activeScreen = activeScreen;\n this.isMobile = this.activeScreen === ScreenSize.mobile;\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\n\n // console.time('esg');\n // const computedStyle = window.getComputedStyle(document.documentElement);\n // this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\n // console.timeEnd('esg');\n\n if(wasScreen !== activeScreen) {\n // console.log('changeScreen', this.activeScreen, activeScreen);\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\n }\n }\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('resize');\n }\n\n /* if(this.isMobile) {\n for(let i in this.active) {\n // @ts-ignore\n let size = this.active[i];\n size.width = innerWidth\n }\n } */\n };\n}\n\nconst mediaSizes = new MediaSizes();\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\nexport default mediaSizes;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport makeError from './makeError';\n\nconst error = makeError('MIDDLEWARE');\nexport default function middlewarePromise(middleware: () => boolean, throwWhat: any = error) {\n return (promise: T): T => {\n if(!(promise instanceof Promise)) {\n if(promise instanceof Error) {\n throw promise;\n } else {\n return promise;\n }\n }\n\n return (promise as any as Promise).then((result) => {\n if(!middleware()) {\n throw throwWhat;\n }\n\n return result;\n }) as any;\n };\n}\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\n}\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","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","import {IS_APPLE_MOBILE} from '../environment/userAgent';\n\nexport default function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\n return new Promise((resolve, reject) => {\n if(media.readyState >= readyState) {\n resolve();\n return;\n }\n\n const loadEventName = IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay';\n const errorEventName = 'error';\n const onLoad = () => {\n media.removeEventListener(errorEventName, onError);\n resolve();\n };\n const onError = (e: ErrorEvent) => {\n media.removeEventListener(loadEventName, onLoad);\n reject(e);\n };\n media.addEventListener(loadEventName, onLoad, {once: true});\n media.addEventListener(errorEventName, onError, {once: true});\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport cancelEvent from './dom/cancelEvent';\nimport {CLICK_EVENT_NAME} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\n\nexport default class OverlayClickHandler extends EventListenerBase<{\n toggle: (open: boolean) => void\n}> {\n protected element: HTMLElement;\n protected overlay: HTMLElement;\n protected listenerOptions: AddEventListenerOptions;\n\n constructor(\n protected navigationType: NavigationItem['type'],\n protected withOverlay?: boolean\n ) {\n super(false);\n this.listenerOptions = withOverlay ? {} : {capture: true};\n }\n\n protected onClick = (e: MouseEvent | TouchEvent) => {\n if(this.element && findUpAsChild(e.target as HTMLElement, this.element)) {\n return;\n }\n\n if(this.listenerOptions?.capture) {\n cancelEvent(e);\n }\n\n this.close();\n };\n\n public close() {\n if(this.element) {\n this.overlay?.remove();\n this.element = undefined;\n this.dispatchEvent('toggle', false);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.removeEventListener('keydown', onKeyDown, {capture: true});\n window.removeEventListener('contextmenu', this.onClick, this.listenerOptions);\n }\n\n document.removeEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n public open(element: HTMLElement) {\n this.close();\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.close();\n }\n });\n }\n\n this.element = element;\n\n if(!this.overlay && this.withOverlay) {\n this.overlay = document.createElement('div');\n this.overlay.classList.add('btn-menu-overlay');\n\n // ! because this event must be canceled, and can't cancel on menu click (below)\n this.overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n this.onClick(e);\n });\n }\n\n this.overlay && this.element.parentElement.insertBefore(this.overlay, this.element);\n\n // document.body.classList.add('disable-hover');\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.addEventListener('keydown', onKeyDown, {capture: true});\n window.addEventListener('contextmenu', this.onClick, {...this.listenerOptions, once: true});\n }\n\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n }); */\n\n // ! safari iOS doesn't handle window click event on overlay, idk why\n document.addEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n this.dispatchEvent('toggle', true);\n }\n}\n","import Currencies from '../config/currencies';\n\n// https://stackoverflow.com/a/34141813\nfunction number_format(number: any, decimals: any, dec_point: any, thousands_sep: any): string {\n // Strip all characters but numerical ones.\n number = (number + '').replace(/[^0-9+\\-Ee.]/g, '');\n var n = !isFinite(+number) ? 0 : +number,\n prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),\n sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,\n dec = (typeof dec_point === 'undefined') ? '.' : dec_point,\n s: any = '',\n toFixedFix = function(n: number, prec: number) {\n var k = Math.pow(10, prec);\n return '' + Math.round(n * k) / k;\n };\n // Fix for IE parseFloat(0.55).toFixed(0) = 0;\n s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');\n if(s[0].length > 3) {\n s[0] = s[0].replace(/\\B(?=(?:\\d{3})+(?!\\d))/g, sep);\n }\n if((s[1] || '').length < prec) {\n s[1] = s[1] || '';\n s[1] += new Array(prec - s[1].length + 1).join('0');\n }\n return s.join(dec);\n}\n\nexport default function paymentsWrapCurrencyAmount(amount: number | string, currency: string, skipSymbol?: boolean) {\n amount = +amount;\n\n const isNegative = amount < 0;\n\n const currencyData = Currencies[currency];\n if(!currencyData) {\n throw new Error('CURRENCY_WRAP_INVALID');\n }\n\n const amountExp = amount / Math.pow(10, currencyData.exp);\n\n let decimals = currencyData.exp;\n if(currency == 'IRR' && Math.floor(amountExp) == amountExp) {\n decimals = 0; // у иранцев копейки почти всегда = 0 и не показываются в UI\n }\n\n let formatted = number_format(amountExp, decimals, currencyData.decimal_sep, currencyData.thousands_sep);\n if(skipSymbol) {\n return formatted;\n }\n\n let symbol = currencyData.symbol;\n if(isNegative && !currencyData.space_between && currencyData.symbol_left) {\n symbol = '-' + symbol;\n formatted = formatted.replace('-', '');\n }\n\n let out: string;\n const splitter = currencyData.space_between ? ' ' : '';\n if(currencyData.symbol_left) {\n out = symbol + splitter + formatted;\n } else {\n out = formatted + splitter + symbol;\n }\n return out;\n}\n\n(window as any).p = paymentsWrapCurrencyAmount;\n\n// function paymentsGetCurrencyExp($currency: string) {\n// if($currency == 'CLF') {\n// return 4;\n// }\n// if(['BHD','IQD','JOD','KWD','LYD','OMR','TND'].includes($currency)) {\n// return 3;\n// }\n// if(['BIF','BYR','CLP','CVE','DJF','GNF','ISK','JPY','KMF','KRW','MGA', 'PYG','RWF','UGX','UYI','VND','VUV','XAF','XOF','XPF'].includes($currency)) {\n// return 0;\n// }\n// if($currency == 'MRO') {\n// return 1;\n// }\n// return 2;\n// }\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from './mediaSizes';\n\nexport type MenuPositionPadding = {\n top?: number,\n right?: number,\n bottom?: number,\n left?: number\n};\n\nconst PADDING_TOP = 8;\nconst PADDING_BOTTOM = PADDING_TOP;\nconst PADDING_LEFT = 8;\nconst PADDING_RIGHT = PADDING_LEFT;\nexport default function positionMenu(e: MouseEvent | Touch | TouchEvent, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\n if((e as TouchEvent).touches) {\n e = (e as TouchEvent).touches[0];\n }\n\n const {pageX, pageY} = e as Touch;\n // let {clientX, clientY} = e;\n\n // * side mean the OPEN side\n\n const getScrollWidthFromElement = (Array.from(elem.children) as HTMLElement[]).find((element) => element.classList.contains('btn-menu-item') && !element.classList.contains('hide')) || elem;\n\n let {scrollWidth: menuWidth} = getScrollWidthFromElement;\n const {scrollHeight: menuHeight} = elem;\n // let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\n const rect = document.body.getBoundingClientRect();\n const windowWidth = rect.width;\n const windowHeight = rect.height;\n\n menuWidth += getScrollWidthFromElement.offsetLeft * 2;\n\n let paddingTop = PADDING_TOP, paddingRight = PADDING_RIGHT, paddingBottom = PADDING_BOTTOM, paddingLeft = PADDING_LEFT;\n if(additionalPadding) {\n if(additionalPadding.top) paddingTop += additionalPadding.top;\n if(additionalPadding.right) paddingRight += additionalPadding.right;\n if(additionalPadding.bottom) paddingBottom += additionalPadding.bottom;\n if(additionalPadding.left) paddingLeft += additionalPadding.left;\n }\n\n side = mediaSizes.isMobile ? 'right' : 'left';\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\n\n const maxTop = windowHeight - menuHeight - paddingBottom;\n const maxLeft = windowWidth - menuWidth - paddingRight;\n const minTop = paddingTop;\n const minLeft = paddingLeft;\n\n const getSides = () => {\n return {\n x: {\n left: pageX,\n right: Math.min(maxLeft, pageX - menuWidth)\n },\n intermediateX: side === 'right' ? minLeft : maxLeft,\n // intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n y: {\n top: pageY,\n bottom: pageY - menuHeight\n },\n // intermediateY: verticalSide === 'top' ? paddingTop : windowHeight - menuHeight - paddingTop,\n // intermediateY: pageY < (windowHeight / 2) ? paddingTop : windowHeight - menuHeight - paddingBottom,\n intermediateY: maxTop\n };\n };\n\n const sides = getSides();\n\n const possibleSides = {\n x: {\n left: (sides.x.left + menuWidth + paddingRight) <= windowWidth,\n right: sides.x.right >= paddingLeft\n },\n y: {\n top: (sides.y.top + menuHeight + paddingBottom) <= windowHeight,\n bottom: (sides.y.bottom - paddingBottom) >= paddingBottom\n }\n };\n\n /* if(side === undefined) {\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\n side = 'right';\n }\n } */\n\n {\n /* const x = sides.x;\n\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\n if(side) {\n s.findAndSplice((s) => s === side);\n s.unshift(side);\n }\n\n const possibleSide = s.find((s) => possibleSides.x[s]); */\n // let left: number;\n /* if(possibleSide) {\n left = x[possibleSide];\n side = possibleSide;\n } else {\n left = sides.intermediateX;\n side = undefined;\n } */\n const left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\n\n elem.style.left = left + 'px';\n }\n\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\n verticalSide = 'bottom';\n } else {\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\n verticalSide = 'top';\n } */\n\n {\n const top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\n\n elem.style.top = top + 'px';\n }\n\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\n elem.classList.add(\n // (verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\n (verticalSide === 'center' ? verticalSide : 'bottom') +\n '-' +\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\n\n return {\n width: menuWidth,\n height: menuHeight\n };\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport rootScope from '../lib/rootScope';\n\nconst savingLottiePreview: {[docId: DocId]: {width: number, height: number}} = {};\n\nexport function isSavingLottiePreview(doc: MyDocument, toneIndex: number, width: number, height: number) {\n const key = doc.id + '-' + toneIndex;\n const saving = savingLottiePreview[key];\n return saving && saving.width >= width && saving.height >= height;\n}\n\nexport async function saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n const {width, height} = canvas;\n if(isSavingLottiePreview(doc, toneIndex, width, height)) {\n return;\n }\n\n const saving = savingLottiePreview[key] = {\n width,\n height\n };\n\n const thumb = await rootScope.managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex);\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n const promise = new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob));\n });\n\n const blob = await promise;\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n // console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n rootScope.managers.appDocsManager.saveLottiePreview(doc.id, blob, width, height, toneIndex);\n\n // delete savingLottiePreview[key];\n\n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice((t) => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n}\n","// * 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 Scrollable from '../components/scrollable';\nimport safeAssign from './object/safeAssign';\n\nexport default class ScrollableLoader {\n public loading = false;\n private scrollable: Scrollable;\n private getPromise: () => Promise;\n private promise: Promise;\n private loaded = false;\n\n constructor(options: {\n scrollable: ScrollableLoader['scrollable'],\n getPromise: ScrollableLoader['getPromise']\n }) {\n safeAssign(this, options);\n\n options.scrollable.onScrolledBottom = () => {\n this.load();\n };\n }\n\n public load() {\n if(this.loaded) {\n return Promise.resolve();\n }\n\n if(this.loading) {\n return this.promise;\n }\n\n this.loading = true;\n this.promise = this.getPromise().then((done) => {\n this.loading = false;\n this.promise = undefined;\n\n if(done) {\n this.loaded = true;\n this.scrollable.onScrolledBottom = null;\n } else {\n this.scrollable.checkForTriggers();\n }\n }, () => {\n this.promise = undefined;\n this.loading = 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 type {MediaSearchContext} from '../components/appMediaPlaybackController';\nimport type {SearchSuperContext} from '../components/appSearchSuper.';\nimport type {Message} from '../layer';\nimport type {MessagesStorageKey, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport incrementMessageId from '../lib/appManagers/utils/messageId/incrementMessageId';\nimport rootScope from '../lib/rootScope';\nimport forEachReverse from './array/forEachReverse';\nimport filterChatPhotosMessages from './filterChatPhotosMessages';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class SearchListLoader extends ListLoader {\n public searchContext: MediaSearchContext;\n public onEmptied: () => void;\n\n private otherSideLoader: SearchListLoader;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {\n onEmptied?: () => void,\n isInner?: boolean,\n managers?: AppManagers\n } = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = anchor?.mid;\n\n if(maxId === undefined) maxId = this.searchContext.maxId;\n if(!older) maxId = incrementMessageId(maxId, 1);\n\n return this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then((value) => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: async(message) => {\n const filtered = await this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n this.managers ??= rootScope.managers;\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n\n if(!options.isInner) {\n this.otherSideLoader = new SearchListLoader({\n ...options,\n isInner: true\n });\n\n // this.otherSideLoader.onLoadedMore = () => {\n\n // };\n }\n }\n\n protected async filterMids(mids: number[]) {\n const storageKey: MessagesStorageKey = `${this.searchContext.peerId}_${this.searchContext.isScheduled ? 'scheduled' : 'history'}`;\n const filtered = (await this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._, mids, storageKey, mids.length)) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n this.current = undefined;\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = async(message: Message.message | Message.messageService) => {\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 if(message.peerId !== this.searchContext.peerId) {\n return;\n }\n\n const filtered = await this.filterMids([message.mid]);\n const targets = (await Promise.all(filtered.map((message) => this.processItem(message)))).filter(Boolean);\n if(targets.length) {\n /* const {previous, current, next} = this;\n const targets = previous.concat(current, next);\n const currentIdx = targets.length;\n const mid = targets[0].mid;\n let i = 0, length = targets.length;\n for(; i < length; ++i) {\n const target = targets[i];\n if(!target || mid < target.mid) {\n break;\n }\n }\n\n if(i < currentIdx) previous.push(...targets);\n else next. */\n\n if(!this.current) {\n this.previous.push(...targets);\n } else {\n this.next.push(...targets);\n }\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend(message);\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(withOtherSide?: boolean) {\n let previous = this.previous;\n\n if(this.otherSideLoader && withOtherSide) {\n previous = previous.concat(this.otherSideLoader.previous);\n }\n\n return previous;\n }\n\n public getNext(withOtherSide?: boolean) {\n let next = this.next;\n\n if(this.otherSideLoader && withOtherSide) {\n next = next.concat(this.otherSideLoader.next);\n }\n\n return next;\n }\n\n public getCurrent() {\n return this.current || this.otherSideLoader?.current;\n }\n\n private goToOtherEnd(length: number) {\n if(length > 0) return this.go(-this.previous.length);\n else return this.go(this.next.length);\n }\n\n public goRound(length: number, dispatchJump?: boolean) {\n let ret: ReturnType['goUnsafe']>;\n\n if(this.otherSideLoader?.current) {\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n if(ret.item) {\n return ret.item;\n }\n\n length = ret.leftLength;\n if(!(length > 0 ? this.otherSideLoader.next : this.otherSideLoader.previous).length) {\n const loaded = length > 0 ? this.otherSideLoader.loadedAllUp : this.otherSideLoader.loadedAllDown;\n if(!loaded) { // do not reset anything until it's loaded\n return;\n }\n\n // if other side is loaded too will start from its begin\n if((length > 0 && (this.otherSideLoader.searchContext.maxId === 1 || this.otherSideLoader.loadedAllDown)) ||\n (length < 0 && (this.otherSideLoader.searchContext.maxId === 0 || this.otherSideLoader.loadedAllUp))) {\n return this.otherSideLoader.goToOtherEnd(length);\n }\n\n this.otherSideLoader.unsetCurrent(length > 0);\n }\n }\n\n ret = this.goUnsafe(length, dispatchJump);\n if(!ret.item) {\n if(this.loadedAllUp && this.loadedAllDown) { // just use the same loader if the list is too short\n return this.goToOtherEnd(length);\n } else if(this.otherSideLoader) {\n length = ret.leftLength;\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n\n if(ret.item) {\n this.unsetCurrent(length > 0);\n }\n }\n }\n\n return ret?.item;\n }\n\n // public setTargets(previous: Item[], next: Item[], reverse: boolean) {\n // super.setTargets(previous, next, reverse);\n // }\n\n protected setLoaded(down: boolean, value: boolean) {\n const changed = super.setLoaded(down, value);\n\n if(changed &&\n this.otherSideLoader &&\n value &&\n this.searchContext?.useSearch !== false/* &&\n (this.reverse ? this.loadedAllUp : this.loadedAllDown) */) {\n const reverse = this.loadedAllUp;\n this.otherSideLoader.setSearchContext({\n ...this.searchContext,\n maxId: reverse ? 1 : 0\n });\n\n // these 'reverse' are different, not a mistake here.\n this.otherSideLoader.reverse = this.reverse;\n this.otherSideLoader.setLoaded(reverse, true);\n this.otherSideLoader.load(!reverse);\n }\n\n return changed;\n }\n\n public cleanup() {\n this.reset();\n rootScope.removeEventListener('history_delete', this.onHistoryDelete);\n rootScope.removeEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.removeEventListener('message_sent', this.onMessageSent);\n this.onEmptied = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.cleanup();\n this.otherSideLoader = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport generateMessageId from './generateMessageId';\nimport getServerMessageId from './getServerMessageId';\n\nexport default function incrementMessageId(messageId: number, increment: number) {\n return generateMessageId(getServerMessageId(messageId) + increment);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from './dom/isInDOM';\n\nclass SequentialDom {\n private promises: Partial<{\n read: CancellablePromise,\n write: CancellablePromise\n }> = {};\n private raf = fastRaf.bind(null);\n private scheduled = false;\n\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\n let promise = this.promises[kind];\n if(!promise) {\n this.scheduleFlush();\n promise = this.promises[kind] = deferredPromise();\n }\n\n if(callback !== undefined) {\n promise.then(() => callback());\n }\n\n return promise;\n }\n\n public measure(callback?: VoidFunction) {\n return this.do('read', callback);\n }\n\n public mutate(callback?: VoidFunction) {\n return this.do('write', callback);\n }\n\n /**\n * Will fire instantly if element is not connected\n * @param element\n * @param callback\n */\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\n const isConnected = isInDOM(element);\n const promise = isConnected ? this.mutate() : Promise.resolve();\n\n if(callback !== undefined) {\n if(!isConnected) {\n callback();\n } else {\n promise.then(() => callback());\n }\n }\n\n return promise;\n }\n\n private scheduleFlush() {\n if(!this.scheduled) {\n this.scheduled = true;\n\n this.raf(() => {\n this.promises.read && this.promises.read.resolve();\n this.promises.write && this.promises.write.resolve();\n\n this.scheduled = false;\n this.promises = {};\n });\n }\n }\n}\n\nconst sequentialDom = new SequentialDom();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\nexport default sequentialDom;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize, WebDocument} from '../layer';\nimport {REPLIES_HIDDEN_CHANNEL_ID} from '../lib/mtproto/mtproto_config';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {MediaSize, makeMediaSize} from './mediaSize';\nimport isWebDocument from '../lib/appManagers/utils/webDocs/isWebDocument';\n\nexport default function setAttachmentSize(\n photo: MyPhoto | MyDocument | WebDocument,\n element: HTMLElement | SVGForeignObjectElement,\n boxWidth: number,\n boxHeight: number,\n noZoom = true,\n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n) {\n const _isWebDocument = isWebDocument(photo);\n // if(_isWebDocument && pushDocumentSize === undefined) {\n // pushDocumentSize = true;\n // }\n\n if(!photoSize) {\n photoSize = choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n // console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n\n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument || _isWebDocument) {\n size = makeMediaSize(photo.w || (photoSize as PhotoSize.photoSize).w || 512, photo.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.type) || _isWebDocument) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n\n if(message &&\n (message.message ||\n message.reply_to_mid ||\n message.media.webpage ||\n (message.replies && message.replies.pFlags.comments && message.replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n\n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n\n return {photoSize, size, isFit};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger} from '../lib/logger';\nimport insertInDescendSortedArray from './array/insertInDescendSortedArray';\nimport {getMiddleware, MiddlewareHelper} from './middleware';\nimport middlewarePromise from './middlewarePromise';\nimport safeAssign from './object/safeAssign';\nimport pause from './schedulers/pause';\n\nexport type SortedElementBase = {\n id: T,\n index: number\n};\n\nlet id = 0;\n\nexport class BatchProcessor {\n protected queue: Promise[];\n protected promise: Promise;\n\n protected middlewareHelper: MiddlewareHelper;\n protected log: ReturnType;\n\n protected process: (batch: Item[], m: ReturnType, log: BatchProcessor['log']) => Promise;\n protected possibleError: any;\n\n constructor(options: {\n log?: BatchProcessor['log'],\n // middleware: MiddlewareHelper,\n process: BatchProcessor['process'],\n possibleError?: BatchProcessor['possibleError']\n }) {\n safeAssign(this, options);\n\n this.queue = [];\n this.middlewareHelper ??= getMiddleware();\n\n const prefix = 'BATCH-PROCESSOR-' + ++id;\n if(this.log) {\n this.log = this.log.bindPrefix(prefix);\n } else {\n this.log = logger(prefix);\n }\n }\n\n public get queuePromise() {\n return this.promise;\n }\n\n public clear() {\n this.log('clear');\n this.queue.length = 0;\n this.promise = undefined;\n this.middlewareHelper.clean();\n }\n\n public addToQueue(item: BatchProcessor['queue'][0]) {\n this.queue.push(item);\n return this.setQueue();\n }\n\n protected setQueue() {\n if(!this.queue.length) {\n return Promise.resolve();\n }\n\n if(this.promise) {\n return this.promise;\n }\n\n const middleware = this.middlewareHelper.get();\n const log = this.log.bindPrefix('queue');\n const m = middlewarePromise(middleware, this.possibleError);\n\n const processQueue = async(): Promise => {\n log('start', this.queue.length);\n\n const queue = this.queue.splice(0, this.queue.length);\n\n const perf = performance.now();\n const promises = queue.map((promise) => {\n promise.then((details) => {\n log('render item time', performance.now() - perf, details);\n });\n\n return promise;\n });\n\n const renderedQueue = await m(Promise.all(promises));\n await m(this.process(renderedQueue, m, log));\n\n log('queue rendered');\n\n if(this.queue.length) {\n log('have new items to render');\n return processQueue();\n } else {\n log('end');\n }\n };\n\n log('setting pause');\n const promise = this.promise = m(pause(0))\n .then(\n () => processQueue().catch((err: ApiError) => {\n if(err !== this.possibleError) {\n log.error('process queue error', err);\n }\n\n throw err;\n }),\n (err) => {\n log('pause has been cleared');\n throw err;\n }\n )\n .finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n });\n\n return promise;\n }\n}\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => PromiseLike | number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase) => PromiseLike | SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware: MiddlewareHelper;\n\n protected batchProcessor: BatchProcessor;\n\n protected log: ReturnType;\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 log?: SortedList['log']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n this.middleware = getMiddleware();\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: async(batch, m, log) => {\n // const elements = await Promise.all(batch.map((element) => this.onElementCreate(element)));\n const elements = batch;\n const promises = elements.map((element) => this.update(element.id, element));\n await m(Promise.all(promises));\n }\n });\n }\n\n public clear() {\n this.batchProcessor.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);\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 callback?.(false);\n return;\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 async add(id: SortedElementId) {\n const element = this.get(id);\n if(element) {\n return;\n // return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n this.elements.set(id, base as SortedElement);\n const createPromise = Promise.resolve(this.onElementCreate(base));\n return this.batchProcessor.addToQueue(createPromise);\n\n // return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n\n this.elements.delete(id);\n\n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public async update(id: SortedElementId, element = this.get(id)) {\n if(!element) {\n return;\n }\n\n element.index = await this.getIndex(element);\n if(this.get(id) !== element) {\n return;\n }\n\n this.onUpdate?.(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n this.onSort(element, idx);\n }\n}\n","const BOM = '';\n// const BOM = 'K';\nexport default BOM;\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","// 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","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","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","export default function textToSvgURL(text: string) {\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\n\n // * because iOS Safari doesn't want to eat objectURL\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n resolve(e.target.result as string);\n };\n reader.readAsDataURL(blob);\n });\n // return URL.createObjectURL(blob);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_WORKER} from './context';\n\nexport class WindowSize {\n public width: number;\n public height: number;\n\n constructor() {\n if(IS_WORKER) {\n return;\n }\n\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n","/*\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// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\n\nimport {AnyToVoidFunction} from '../types';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport DEBUG from '../config/debug';\nimport pause from '../helpers/schedulers/pause';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\nconst eventListener = new EventListenerBase<{\n start: () => void,\n end: () => void\n}>();\nconst ANIMATION_START_EVENT = 'start';\nconst ANIMATION_END_EVENT = 'end';\n\nlet isAnimating = false;\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\nlet promisesInQueue = 0;\n\nheavyAnimationPromise.resolve();\n\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\n\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\n if(!isAnimating) {\n heavyAnimationPromise = deferredPromise();\n eventListener.dispatchEvent(ANIMATION_START_EVENT);\n isAnimating = true;\n DEBUG && log('start');\n }\n\n ++promisesInQueue;\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\n\n const promises = [\n timeout !== undefined ? pause(timeout) : undefined,\n promise.finally(() => {})\n ].filter(Boolean);\n\n const perf = performance.now();\n const _heavyAnimationPromise = heavyAnimationPromise;\n Promise.race(promises).then(() => {\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\n return;\n }\n\n --promisesInQueue;\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\n if(promisesInQueue <= 0) {\n onHeavyAnimationEnd();\n }\n });\n\n return heavyAnimationPromise;\n}\n\n(window as any).dispatchHeavyAnimationEvent = dispatchHeavyAnimationEvent;\n\nfunction onHeavyAnimationEnd() {\n if(heavyAnimationPromise.isFulfilled) {\n return;\n }\n\n isAnimating = false;\n promisesInQueue = 0;\n eventListener.dispatchEvent(ANIMATION_END_EVENT);\n heavyAnimationPromise.resolve();\n\n DEBUG && log('end');\n}\n\nexport function interruptHeavyAnimation() {\n onHeavyAnimationEnd();\n}\n\nexport function getHeavyAnimationPromise() {\n return heavyAnimationPromise;\n}\n\nexport default function(\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n listenerSetter?: ListenerSetter\n) {\n // useEffect(() => {\n if(isAnimating) {\n handleAnimationStart();\n }\n\n const add = listenerSetter ? listenerSetter.add(eventListener) : eventListener.addEventListener.bind(eventListener);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener);\n add(ANIMATION_START_EVENT, handleAnimationStart);\n add(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\n remove(ANIMATION_START_EVENT, handleAnimationStart);\n };\n // }, [handleAnimationEnd, handleAnimationStart]);\n}\n","/*\n * 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 '../lib/appManagers/appMessagesManager';\nimport type {ApiLimitType} from '../lib/mtproto/api_methods';\nimport type {ForumTopic} from '../layer';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport {ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from './buttonMenu';\nimport PopupDeleteDialog from './popups/deleteDialog';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport PopupPeer, {PopupPeerButton} from './popups/peer';\nimport AppChatFoldersTab from './sidebarLeft/tabs/chatFolders';\nimport appSidebarLeft from './sidebarLeft';\nimport {toastNew} from './toast';\nimport PopupMute from './popups/mute';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport positionMenu from '../helpers/positionMenu';\nimport contextMenuController from '../helpers/contextMenuController';\nimport {GENERAL_TOPIC_ID} from '../lib/mtproto/mtproto_config';\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: ButtonMenuItemOptionsVerifiable[];\n\n private peerId: PeerId;\n private filterId: number;\n private threadId: number;\n private dialog: Dialog | ForumTopic.forumTopic;\n private canManageTopics: boolean;\n\n constructor(private managers: AppManagers) {\n\n }\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: async() => !this.threadId && !(await this.managers.appMessagesManager.isDialogUnread(this.dialog))\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => this.managers.appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.peerId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.peerId !== rootScope.myId\n }, {\n icon: 'eye2',\n text: 'Hide',\n onClick: this.hideTopic,\n verify: async() => {\n return this.canManageTopics && (this.dialog as ForumTopic.forumTopic).id === GENERAL_TOPIC_ID;\n }\n }, {\n icon: 'lock',\n text: 'CloseTopic',\n onClick: this.toggleTopic,\n verify: () => {\n return this.canManageTopics && !(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'lockoff',\n text: 'RestartTopic',\n onClick: this.toggleTopic,\n verify: () => {\n return this.canManageTopics && !!(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => {\n if(this.threadId) {\n if(!this.canManageTopics) {\n return false;\n }\n\n return (this.dialog as ForumTopic.forumTopic).id !== GENERAL_TOPIC_ID;\n }\n\n return true;\n }\n }];\n\n this.element = ButtonMenuSync({buttons: this.buttons});\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = async() => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.peerId);\n if(dialog) {\n this.managers.appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private hideTopic = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n hidden: true\n });\n };\n\n private toggleTopic = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n closed: !(this.dialog as ForumTopic.forumTopic).pFlags.closed\n });\n };\n\n private onPinClick = () => {\n const {peerId, filterId, threadId} = this;\n this.managers.appMessagesManager.toggleDialogPin({\n peerId,\n filterId,\n topicId: threadId\n }).catch(async(err: ApiError) => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH' || err.type === 'PINNED_TOO_MUCH') {\n if(threadId) {\n this.managers.apiManager.getLimit('topicPin').then((limit) => {\n toastNew({langPackKey: 'LimitReachedPinnedTopics', langPackArguments: [limit]});\n });\n } else if(filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n // const a: {[type in ApiLimitType]?: {\n // title: LangPackKey,\n // description: LangPackKey,\n // descriptionPremium: LangPackKey,\n // descriptionLocked: LangPackKey,\n // icon: string\n // }} = {\n // pin: {\n // title: 'LimitReached',\n // description: 'LimitReachedPinDialogs',\n // descriptionPremium: 'LimitReachedPinDialogsPremium',\n // descriptionLocked: 'LimitReachedPinDialogsLocked',\n // icon: 'limit_pin'\n // }\n // };\n\n // class P extends PopupPeer {\n // constructor(options: {\n // isPremium: boolean,\n // limit: number,\n // limitPremium: number\n // }, _a: typeof a[keyof typeof a]) {\n // super('popup-limit', {\n // buttons: options.isPremium === undefined ? [{\n // langKey: 'LimitReached.Ok',\n // isCancel: true\n // }] : (options.isPremium ? [{\n // langKey: 'OK',\n // isCancel: true\n // }] : [{\n // langKey: 'IncreaseLimit',\n // callback: () => {\n\n // }\n // }, {\n // langKey: 'Cancel',\n // isCancel: true\n // }]),\n // descriptionLangKey: options.isPremium === undefined ? _a.descriptionLocked : (options.isPremium ? _a.descriptionPremium : _a.description),\n // descriptionLangArgs: options.isPremium ? [options.limitPremium] : [options.limit, options.limitPremium],\n // titleLangKey: _a.title\n // });\n\n // const isLocked = options.isPremium === undefined;\n // if(isLocked) {\n // this.element.classList.add('is-locked');\n // }\n\n // const limitContainer = document.createElement('div');\n // limitContainer.classList.add('popup-limit-line');\n\n // const hint = document.createElement('div');\n // hint.classList.add('popup-limit-hint');\n // const i = document.createElement('span');\n // i.classList.add('popup-limit-hint-icon', 'tgico-' + _a.icon);\n // hint.append(i, '' + (options.isPremium ? options.limitPremium : options.limit));\n\n // limitContainer.append(hint);\n\n // if(!isLocked) {\n // const limit = document.createElement('div');\n // limit.classList.add('limit-line');\n\n // const free = document.createElement('div');\n // free.classList.add('limit-line-free');\n\n // const premium = document.createElement('div');\n // premium.classList.add('limit-line-premium');\n\n // limit.append(free, premium);\n\n // _i18n(free, 'LimitFree');\n // premium.append(i18n('LimitPremium'), '' + options.limitPremium);\n\n // limitContainer.append(limit);\n // }\n\n // this.container.insertBefore(limitContainer, this.description);\n\n // if(options.isPremium === false) {\n // this.buttons.pop().element.remove();\n // }\n // }\n // }\n\n // async function showLimitPopup(type: keyof typeof a) {\n // const _a = a[type];\n // const [appConfig, limit, limitPremium] = await Promise.all([\n // rootScope.managers.apiManager.getAppConfig(),\n // ...[false, true].map((v) => rootScope.managers.apiManager.getLimit(type, v))\n // ]);\n // const isLocked = appConfig.premium_purchase_blocked;\n // new P({\n // isPremium: isLocked ? undefined : rootScope.premium,\n // limit,\n // limitPremium\n // }, _a).show();\n // }\n\n // showLimitPopup('pin');\n\n const config = await this.managers.apiManager.getConfig();\n new PopupPeer('pinned-dialogs-too-much', {\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'FiltersSetupPinAlert',\n callback: () => {\n appSidebarLeft.createTab(AppChatFoldersTab).open();\n }\n }],\n descriptionLangKey: 'PinToTopLimitReached2',\n descriptionLangArgs: [i18n('Chats', [config.pinned_dialogs_count_max])]\n }).show();\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, mute: false, threadId: this.threadId});\n };\n\n private onMuteClick = () => {\n new PopupMute(this.peerId, this.threadId);\n };\n\n private onUnreadClick = async() => {\n const {peerId, dialog} = this;\n if(dialog.unread_count) {\n this.managers.appMessagesManager.readHistory(peerId, dialog.top_message, this.threadId);\n\n if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n } else if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.peerId, undefined, undefined, this.threadId);\n };\n\n onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n\n try {\n li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n } catch(e) {}\n\n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.peerId = li.dataset.peerId.toPeerId();\n this.threadId = +li.dataset.threadId || undefined;\n this.dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.peerId, this.threadId);\n this.filterId = this.threadId ? undefined : appDialogsManager.filterId;\n this.canManageTopics = this.threadId ? await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics') : undefined;\n\n await Promise.all(this.buttons.map(async(button) => {\n const good = await button.verify();\n\n button.element.classList.toggle('hide', !good);\n }));\n\n const langPackKey: LangPackKey = this.threadId ? 'Delete' : await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(langPackKey));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.peerId = this.dialog = this.filterId = this.threadId = this.canManageTopics = undefined;\n });\n };\n\n r();\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../config/app';\nimport DEBUG from '../config/debug';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {LangPackKey, i18n} from '../lib/langPack';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport ProgressivePreloader from './preloader';\nimport SetTransition from './singleTransition';\nimport sessionStorage from '../lib/sessionStorage';\nimport {ConnectionStatus} from '../lib/mtproto/connectionStatus';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport singleInstance from '../lib/mtproto/singleInstance';\n\nexport default class ConnectionStatusComponent {\n public static CHANGE_STATE_DELAY = 1000;\n\n private statusContainer: HTMLElement;\n private statusEl: HTMLElement;\n private statusPreloader: ProgressivePreloader;\n\n private currentLangPackKey: LangPackKey;\n\n private hadConnect = false;\n private retryAt: number;\n private connecting = false;\n private timedOut = false;\n private updating = false;\n\n private log: ReturnType;\n\n private setFirstConnectionTimeout: number;\n private setStateTimeout: number;\n\n constructor(private managers: AppManagers, chatsContainer: HTMLElement) {\n this.log = logger('CS', undefined, undefined);\n\n this.statusContainer = document.createElement('div');\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\n\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\n this.statusContainer.append(this.statusEl);\n\n chatsContainer.prepend(this.statusContainer);\n\n rootScope.addEventListener('connection_status_change', (status) => {\n // console.log(status);\n\n this.setConnectionStatus();\n });\n\n rootScope.addEventListener('state_synchronizing', (channelId) => {\n if(!channelId) {\n this.updating = true;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n rootScope.addEventListener('state_synchronized', (channelId) => {\n DEBUG && this.log('state_synchronized', channelId);\n if(!channelId) {\n this.updating = false;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\n\n // let bool = true;\n // document.addEventListener('dblclick', () => {\n // this.setConnectionStatus(bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected));\n // });\n }\n\n private setConnectionStatus = (overrideStatus?: ConnectionStatus) => {\n Promise.all([\n sessionStorage.get('dc'),\n rootScope.managers.rootScope.getConnectionStatus()\n ]).then(([baseDcId, connectionStatus]) => {\n if(!baseDcId) {\n baseDcId = App.baseDcId;\n }\n\n if(this.setFirstConnectionTimeout) {\n clearTimeout(this.setFirstConnectionTimeout);\n this.setFirstConnectionTimeout = 0;\n }\n\n const status = connectionStatus['NET-' + baseDcId];\n const online = status && (overrideStatus || status.status) === ConnectionStatus.Connected;\n\n if(this.connecting && online) {\n this.managers.apiUpdatesManager.forceGetDifference();\n }\n\n if(online && !this.hadConnect) {\n this.hadConnect = true;\n }\n\n this.timedOut = status && (overrideStatus || status.status) === ConnectionStatus.TimedOut;\n this.connecting = !online;\n this.retryAt = status && status.retryAt;\n DEBUG && this.log('connecting', this.connecting);\n this.setState();\n });\n };\n\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\n if(this.currentLangPackKey === langPackKey) return;\n this.currentLangPackKey = langPackKey;\n replaceContent(this.statusEl, i18n(langPackKey, args));\n this.statusPreloader.attach(this.statusEl);\n };\n\n private getA(langPackKey: LangPackKey, callback: () => void) {\n const a = document.createElement('a');\n a.classList.add('force-reconnect');\n a.append(i18n(langPackKey));\n attachClickEvent(a, (e) => {\n cancelEvent(e);\n callback();\n });\n\n return a;\n }\n\n private setState = () => {\n if(singleInstance.deactivatedReason) {\n return;\n }\n\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\n if(this.connecting) {\n if(this.timedOut) {\n const a = this.getA('ConnectionStatus.ForceReconnect', () => this.managers.networkerFactory.forceReconnect());\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\n } else if(this.hadConnect) {\n if(this.retryAt !== undefined) {\n const timerSpan = document.createElement('span');\n const retryAt = this.retryAt;\n const setTime = () => {\n const now = Date.now();\n timerSpan.innerText = '' + Math.round((retryAt - now) / 1000);\n if(now > retryAt) {\n clearInterval(interval);\n }\n };\n const interval = setInterval(setTime, 1e3);\n setTime();\n\n const a = this.getA('ConnectionStatus.Reconnect', () => this.managers.networkerFactory.forceReconnectTimeout());\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\n } else {\n this.setStatusText('ConnectionStatus.Reconnecting');\n }\n } else {\n this.setStatusText('ConnectionStatus.Waiting');\n }\n } else if(this.updating) {\n this.setStatusText('Updating');\n }\n\n DEBUG && this.log('setState', this.connecting || this.updating);\n window.requestAnimationFrame(() => {\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\n\n const cb = () => {\n SetTransition({\n element: this.statusContainer,\n className: 'is-shown',\n forwards: this.connecting || this.updating,\n duration: 200\n });\n this.setStateTimeout = 0;\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\n };\n\n this.setStateTimeout = window.setTimeout(cb, timeout);\n // cb();\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\n else cb(); */\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 {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\ntype C = 'check' | 'checks' | 'sending' | 'sendingerror' | 'premium_lock';\nexport function setSendingStatus(\n container: HTMLElement,\n message?: C | Message.message | Message.messageService,\n disableAnimationIfRippleFound?: boolean\n) {\n let className: C;\n if(typeof(message) === 'string') {\n className = message;\n } else if(message?.pFlags.out) {\n if(message.error) {\n className = 'sendingerror';\n } else 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","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeInOutSineApply(t / d, c) + b;\n}\n\nexport function easeInOutSineApply(v: number, c: number) {\n return -c / 2 * (Math.cos(Math.PI * v) - 1);\n}\n","export default function roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number,\n fill?: boolean,\n stroke?: boolean\n) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n width *= dpr;\n height *= dpr;\n }\n\n if(typeof(radius) === 'number') {\n if(dpr) radius *= dpr;\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] ? (dpr ? radius[side] * dpr : radius[side]) : defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animate} from '../helpers/animation';\nimport customProperties from '../helpers/dom/customProperties';\nimport easeInOutSine from '../helpers/easing/easeInOutSine';\nimport mediaSizes from '../helpers/mediaSizes';\nimport roundRect from '../helpers/canvas/roundRect';\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n\n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n\n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n\n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n\n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n\n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n\n height *= DPR;\n const y = (SIZE - height) / 2;\n\n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\n","import customProperties from '../dom/customProperties';\nimport clamp from '../number/clamp';\n\nexport default class Shimmer {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private font = '30pt Helvetica';\n private currTime = Date.now();\n private diffTime = 0;\n private spread = 0;\n private paused = false;\n private pausedTime = 0;\n private pauseInterval = 850;\n private lightSource = 0;\n private inc = 0.032;\n private lightSpread = 0.55;\n private animations = ['slide', 'slide', 'slide', 'slide'];\n private currentAnimationIndex = 0;\n private text: string;\n private fillStyle: CanvasRenderingContext2D['fillStyle'];\n\n private keepTime() {\n this.diffTime = Date.now() - this.currTime;\n this.currTime = Date.now();\n }\n\n private cycleAnimation() {\n ++this.currentAnimationIndex;\n if(this.currentAnimationIndex >= this.animations.length) {\n this.currentAnimationIndex = 0;\n }\n }\n\n private animate() {\n const currentAnimation = this.animations[this.currentAnimationIndex];\n if(currentAnimation === 'glow') {\n return this.animateGlow(); // return glow style\n } else if(currentAnimation === 'slide') {\n return this.animateSlide(); // return slide gradient\n } else {\n console.log('unknown animation type: ' + String(currentAnimation));\n }\n }\n\n private animateGlow() {\n var glowEnd = 255,\n rgbStart = 68,\n r = rgbStart,\n g = r,\n b = r,\n increment = 10,\n interval = 800;\n\n return () => {\n var smartInc = increment * (this.diffTime / (1000 / 60));\n if(this.paused) {\n if((Date.now() - this.pausedTime) > interval) {\n r = rgbStart;\n this.cycleAnimation()\n this.paused = false;\n }\n } else {\n r = parseInt('' + (r + smartInc));\n if(r >= glowEnd) {\n this.paused = true;\n this.pausedTime = Date.now()\n }\n }\n return 'rgb('+ r + ',' + r + ',' + r + ')';\n };\n }\n\n private animateSlide(): CanvasGradient {\n var gradient = this.ctx.createLinearGradient(0, 0, this.canvas.width, 0),\n smartInc = this.inc * (this.diffTime / (1000 / 60)),\n lightLeft,\n lightRight,\n lightCenter;\n if(this.paused) {\n if((Date.now() - this.pausedTime) > this.pauseInterval) {\n this.lightSource = -0.6;\n this.cycleAnimation()\n this.paused = false;\n return this.animateSlide();\n }\n } else {\n this.lightSource += smartInc;\n if(this.lightSource > (1 + this.lightSpread)) {\n this.paused = true;\n this.pausedTime = Date.now();\n }\n }\n // lighting positions:\n lightCenter = clamp(this.lightSource, 0, 1);\n lightLeft = clamp(this.lightSource - this.lightSpread, 0, 1);\n lightRight = clamp(this.lightSource + this.lightSpread, 0, 1);\n\n const backgroundColor = customProperties.getProperty('background-color-true');\n const shimmerColor = customProperties.getProperty('surface-color');\n gradient.addColorStop(lightLeft, backgroundColor);\n gradient.addColorStop(lightCenter, shimmerColor);\n gradient.addColorStop(lightRight, backgroundColor);\n\n return gradient;\n }\n\n public settings(dict: Partial<{\n canvas: Shimmer['canvas'],\n fillStyle: Shimmer['fillStyle'],\n font: Shimmer['font'],\n lightSpread: Shimmer['lightSpread'],\n inc: Shimmer['inc'],\n animations: Shimmer['animations'],\n text: Shimmer['text']\n }> = {}) {\n this.canvas = dict.canvas ?? document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n this.font = dict.font ?? this.font;\n this.lightSpread = dict.lightSpread ?? this.lightSpread;\n this.inc = dict.inc ?? this.inc;\n this.animations = dict.animations ?? this.animations;\n this.text = dict.text ?? this.text;\n this.fillStyle = dict.fillStyle;\n\n this.canvas.classList.add('shimmer-canvas');\n }\n\n public on() {\n const {width, height} = this.canvas;\n // record the time we ran:\n this.keepTime();\n // clear and fill the canvas:\n this.ctx.clearRect(0, 0, width, height);\n\n if(this.font) {\n this.ctx.font = this.font;\n }\n\n this.ctx.fillStyle = this.animate() as any;\n this.ctx.fillRect(0, 0, width, height);\n\n if(this.fillStyle) {\n this.ctx.fillStyle = this.fillStyle;\n this.ctx.fillRect(0, 0, width, height);\n }\n\n if(this.text) {\n this.ctx.fillText(this.text, 50, 50);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport rootScope from '../lib/rootScope';\nimport {animate} from './animation';\nimport {drawCircleFromStart} from './canvas/drawCircle';\nimport roundRect from './canvas/roundRect';\nimport Shimmer from './canvas/shimmer';\nimport customProperties from './dom/customProperties';\nimport easeInOutSine from './easing/easeInOutSine';\nimport mediaSizes from './mediaSizes';\n\nexport default class DialogsPlaceholder {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private shimmer: Shimmer;\n private tempId: number;\n private detachTime: number;\n\n private length: number;\n private dialogHeight: number;\n private availableLength: number;\n\n private avatarSize: number;\n private marginVertical: number;\n private totalHeight: number;\n private lineHeight: number;\n private lineBorderRadius: number;\n private lineMarginVertical: number;\n private statusWidth: number;\n private generatedValues: {\n firstLineWidth: number,\n secondLineWidth: number,\n statusWidth: number\n }[];\n\n private getRectFrom: () => DOMRectEditable;\n private onRemove: () => void;\n private blockScrollable: Scrollable;\n\n constructor(sizes: Partial<{\n avatarSize: number,\n marginVertical: number,\n totalHeight: number\n }> = {}) {\n this.shimmer = new Shimmer();\n this.tempId = 0;\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('dialogs-placeholder-canvas');\n this.ctx = this.canvas.getContext('2d');\n\n this.generatedValues = [];\n this.avatarSize = sizes.avatarSize ?? 54;\n this.marginVertical = sizes.marginVertical ?? 9;\n this.totalHeight = sizes.totalHeight ?? (this.avatarSize + this.marginVertical * 2);\n this.lineHeight = 10;\n this.lineBorderRadius = 6;\n this.lineMarginVertical = 8;\n this.statusWidth = 24;\n }\n\n public attach({container, rect, getRectFrom, onRemove, blockScrollable}: {\n container: HTMLElement,\n rect?: ReturnType,\n getRectFrom?: HTMLElement | DialogsPlaceholder['getRectFrom'],\n onRemove?: DialogsPlaceholder['onRemove'],\n blockScrollable?: DialogsPlaceholder['blockScrollable']\n }) {\n const {canvas} = this;\n\n this.onRemove = onRemove;\n this.getRectFrom = typeof(getRectFrom) === 'function' ? getRectFrom : (getRectFrom || container).getBoundingClientRect.bind(getRectFrom || container);\n if(this.blockScrollable = blockScrollable) {\n blockScrollable.container.style.overflowY = 'hidden';\n }\n\n this.updateCanvasSize(rect);\n this.startAnimation();\n container.append(canvas);\n }\n\n public detach(availableLength: number) {\n if(this.detachTime) {\n return;\n }\n\n this.availableLength = availableLength;\n this.detachTime = Date.now();\n\n if(!rootScope.settings.animationsEnabled) {\n this.remove();\n }\n }\n\n public remove() {\n this.stopAnimation();\n\n if(this.canvas.parentElement) {\n this.canvas.remove();\n\n if(this.onRemove) {\n this.onRemove();\n this.onRemove = undefined;\n }\n\n if(this.blockScrollable) {\n this.blockScrollable.container.style.overflowY = '';\n this.blockScrollable = undefined;\n }\n }\n }\n\n private updateCanvasSize(rect = this.getRectFrom()) {\n const {canvas} = this;\n const dpr = canvas.dpr = window.devicePixelRatio;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n canvas.style.width = rect.width + 'px';\n canvas.style.height = rect.height + 'px';\n }\n\n private renderDetachAnimationFrame() {\n const {\n canvas,\n ctx,\n detachTime,\n length,\n availableLength\n } = this;\n\n if(!detachTime) {\n return;\n } else if(!rootScope.settings.animationsEnabled) {\n this.remove();\n return;\n }\n\n const {width} = canvas;\n\n ctx.globalCompositeOperation = 'destination-out';\n\n // ctx.fillStyle = 'rgba(0, 0, 0, 0)';\n // ctx.fillRect(0, 0, width, height);\n\n // const DURATION = 500;\n // const DELAY = DURATION;\n const DURATION = 150;\n const DELAY = 15;\n const elapsedTime = Date.now() - detachTime;\n let completed = true;\n for(let i = 0; i < length; ++i) {\n const delay = availableLength < length && i >= availableLength ? DELAY * (availableLength - 1) : DELAY * i;\n const elapsedRowTime = elapsedTime - delay;\n if(elapsedRowTime <= 0) {\n completed = false;\n continue;\n }\n\n const progress = easeInOutSine(elapsedRowTime, 0, 1, DURATION);\n\n ctx.beginPath();\n ctx.rect(0, this.dialogHeight * i, width, this.dialogHeight);\n ctx.fillStyle = `rgba(0, 0, 0, ${progress})`;\n ctx.fill();\n\n if(progress < 1) {\n completed = false;\n }\n }\n\n // const totalRadius = Math.sqrt(width ** 2 + height ** 2);\n // const gradient = ctx.createRadialGradient(\n // 0, 0, 0,\n // 0, 0, totalRadius);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // const gradient = ctx.createLinearGradient(0, 0, 0, height);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // ctx.fillStyle = gradient;\n // ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'source-over';\n\n if(completed) {\n this.remove();\n }\n }\n\n private renderFrame() {\n this.shimmer.on();\n this.renderDetachAnimationFrame();\n }\n\n private startAnimation() {\n const {canvas, shimmer} = this;\n const tempId = ++this.tempId;\n const pattern = this.createPattern();\n\n shimmer.settings({\n canvas,\n fillStyle: pattern\n });\n\n const middleware = () => {\n return this.tempId === tempId;\n };\n\n this.renderFrame();\n animate(() => {\n if(!middleware()) {\n return false;\n }\n\n // ! should've removed the loop if animations are disabled\n if(rootScope.settings.animationsEnabled) {\n this.renderFrame();\n }\n\n // ! tempId can be changed during renderFrame\n return middleware();\n });\n\n rootScope.addEventListener('theme_change', this.onThemeChange);\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private stopAnimation() {\n ++this.tempId;\n rootScope.removeEventListener('theme_change', this.onThemeChange);\n mediaSizes.removeEventListener('resize', this.onResize);\n }\n\n private onThemeChange = () => {\n this.stopAnimation();\n this.startAnimation();\n };\n\n private onResize = () => {\n const {canvas} = this;\n const {width, height, dpr} = canvas;\n this.updateCanvasSize();\n if(canvas.width === width && canvas.height === height && canvas.dpr === dpr) {\n return;\n }\n\n this.stopAnimation();\n this.startAnimation();\n };\n\n private createPattern() {\n const {canvas, ctx} = this;\n\n const patternCanvas = document.createElement('canvas');\n const patternContext = patternCanvas.getContext('2d');\n const dpr = canvas.dpr;\n patternCanvas.dpr = dpr;\n patternCanvas.width = canvas.width;\n patternCanvas.height = canvas.height;\n\n patternContext.fillStyle = customProperties.getProperty('surface-color');\n patternContext.fillRect(0, 0, patternCanvas.width, patternCanvas.height);\n\n patternContext.fillStyle = '#000';\n patternContext.globalCompositeOperation = 'destination-out';\n\n const dialogHeight = this.dialogHeight = this.totalHeight * dpr;\n const length = this.length = Math.ceil(canvas.height / dialogHeight);\n for(let i = 0; i < length; ++i) {\n this.drawChat(patternContext, i, i * dialogHeight);\n }\n\n return ctx.createPattern(patternCanvas, 'no-repeat');\n }\n\n private drawChat(ctx: CanvasRenderingContext2D, i: number, y: number) {\n let generatedValues = this.generatedValues[i];\n if(!generatedValues) {\n generatedValues = this.generatedValues[i] = {\n firstLineWidth: 40 + Math.random() * 100, // 120\n secondLineWidth: 120 + Math.random() * 130, // 240\n statusWidth: 24 + Math.random() * 16\n };\n }\n\n const {\n firstLineWidth,\n secondLineWidth,\n statusWidth\n } = generatedValues;\n\n const {canvas} = ctx;\n const {dpr} = canvas;\n y /= dpr;\n\n const {\n avatarSize,\n marginVertical,\n lineHeight,\n lineBorderRadius,\n lineMarginVertical\n } = this;\n\n let marginLeft = 17;\n\n if(avatarSize) {\n drawCircleFromStart(ctx, marginLeft, y + marginVertical, avatarSize / 2, true);\n marginLeft += avatarSize + 10;\n }\n\n // 9 + 54 - 10 - 8 = 45 ........ 72 - 9 - 10 - 8\n roundRect(ctx, marginLeft, y + marginVertical + lineMarginVertical, firstLineWidth, lineHeight, lineBorderRadius, true);\n // roundRect(ctx, marginLeft, y + marginVertical + avatarSize - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n roundRect(ctx, marginLeft, y + this.totalHeight - marginVertical - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n\n roundRect(ctx, canvas.width / dpr - 24 - statusWidth, y + marginVertical + lineMarginVertical, statusWidth, lineHeight, lineBorderRadius, true);\n }\n}\n","export default function drawCircle(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n radius *= dpr;\n }\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, 2 * Math.PI, false);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n\nexport function drawCircleFromStart(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n return drawCircle(ctx, x + radius, y + radius, radius, fill, stroke);\n}\n","import rootScope from '../../lib/rootScope';\n\nexport default function shake(element: HTMLElement) {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n const keyframes: Keyframe[] = [\n {transform: 'translateX(0)'},\n {transform: 'translateX(.25rem)'},\n {transform: 'translateX(-.25rem)'},\n {transform: 'translateX(0)'}\n ];\n\n element.animate([...keyframes, ...keyframes, ...keyframes], {\n duration: 300,\n iterations: 1,\n easing: 'ease-in-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 type {MyDialogFilter as DialogFilter, MyDialogFilter} from '../storages/filters';\nimport type LazyLoadQueue from '../../components/lazyLoadQueue';\nimport type {Dialog, ForumTopic, MyMessage} from './appMessagesManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyDocument} from './appDocsManager';\nimport type {State} from '../../config/state';\nimport AvatarElement from '../../components/avatar';\nimport DialogsContextMenu from '../../components/dialogsContextMenu';\nimport {horizontalMenu} from '../../components/horizontalMenu';\nimport ripple from '../../components/ripple';\nimport Scrollable, {ScrollableX, SliceSides} from '../../components/scrollable';\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {IS_MOBILE_SAFARI, IS_SAFARI} from '../../environment/userAgent';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport appImManager, {AppImManager} from './appImManager';\nimport Button from '../../components/button';\nimport SetTransition from '../../components/singleTransition';\nimport {MyDraftMessage} from './appDraftsManager';\nimport DEBUG, {MOUNT_CLASS_TO} from '../../config/debug';\nimport PeerTitle from '../../components/peerTitle';\nimport I18n, {FormatterArguments, i18n, LangPackKey, _i18n} from '../langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport wrapPhoto from '../../components/wrappers/photo';\nimport AppEditFolderTab from '../../components/sidebarLeft/tabs/editFolder';\nimport appSidebarLeft from '../../components/sidebarLeft';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport ConnectionStatusComponent from '../../components/connectionStatus';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport {fastRafConventional, fastRafPromise} from '../../helpers/schedulers';\nimport SortedUserList from '../../components/sortedUserList';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport handleTabSwipe from '../../helpers/dom/handleTabSwipe';\nimport windowSize from '../../helpers/windowSize';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {setSendingStatus} from '../../components/sendingStatus';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport groupCallActiveIcon from '../../components/groupCallActiveIcon';\nimport {Chat, Message, NotifyPeer} from '../../layer';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport appNavigationController, {NavigationItem} from '../../components/appNavigationController';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {AppManagers} from './managers';\nimport appSidebarRight from '../../components/sidebarRight';\nimport PopupElement from '../../components/popups';\nimport choosePhotoSize from './utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport isMessageRestricted from './utils/messages/isMessageRestricted';\nimport getMediaFromMessage from './utils/messages/getMediaFromMessage';\nimport getMessageSenderPeerIdOrName from './utils/messages/getMessageSenderPeerIdOrName';\nimport wrapStickerEmoji from '../../components/wrappers/stickerEmoji';\nimport getDialogIndexKey from './utils/dialogs/getDialogIndexKey';\nimport getProxiedManagers from './getProxiedManagers';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport appDownloadManager from './appDownloadManager';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport noop from '../../helpers/noop';\nimport DialogsPlaceholder from '../../helpers/dialogsPlaceholder';\nimport pause from '../../helpers/schedulers/pause';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport makeError from '../../helpers/makeError';\nimport getUnsafeRandomInt from '../../helpers/number/getUnsafeRandomInt';\nimport Row, {RowMediaSizeType} from '../../components/row'\nimport SettingSection from '../../components/settingSection';\nimport {SliderSuperTabEventable} from '../../components/sliderTab';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport ButtonMenuToggle from '../../components/buttonMenuToggle';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AppSharedMediaTab from '../../components/sidebarRight/tabs/sharedMedia';\nimport {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport AppArchivedTab from '../../components/sidebarLeft/tabs/archivedTab';\nimport shake from '../../helpers/dom/shake';\nimport AppEditTopicTab from '../../components/sidebarRight/tabs/editTopic';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport const DIALOG_LIST_ELEMENT_TAG = 'A';\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge?: HTMLElement,\n unreadAvatarBadge?: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLElement,\n subtitleEl: HTMLElement,\n\n setLastMessagePromise?: CancellablePromise,\n setUnreadMessagePromise?: CancellablePromise\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n dialogElement: DialogElement\n}\n\nfunction setPromiseMiddleware}, K extends keyof T>(obj: T, key: K) {\n const oldPromise: CancellablePromise = obj[key] as any;\n oldPromise?.reject();\n\n // @ts-ignore\n const deferred = obj[key] = deferredPromise();\n deferred.catch(() => {}).finally(() => {\n if((obj[key] as any) === deferred) {\n delete obj[key];\n }\n });\n\n const middleware = middlewarePromise(() => (obj[key] as any) === deferred);\n return {deferred, middleware};\n}\n\nconst BADGE_SIZE = 22;\nconst BADGE_TRANSITION_TIME = 250;\n\nclass SortedDialogList extends SortedList {\n public managers: AppManagers;\n public log: ReturnType;\n public list: HTMLElement;\n public indexKey: ReturnType;\n public onListLengthChange: () => void;\n public forumPeerId: PeerId;\n\n constructor(options: {\n managers: SortedDialogList['managers'],\n log?: SortedDialogList['log'],\n list: SortedDialogList['list'],\n indexKey: SortedDialogList['indexKey'],\n onListLengthChange?: SortedDialogList['onListLengthChange'],\n forumPeerId?: SortedDialogList['forumPeerId']\n }) {\n super({\n getIndex: (element) => this.managers.dialogsStorage.getDialogIndex(this.forumPeerId ?? element.id, this.indexKey, this.forumPeerId ? element.id : undefined),\n onDelete: (element) => {\n element.dom.listEl.remove();\n 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?.();\n }\n },\n onElementCreate: async(base) => {\n const loadPromises: Promise[] = [];\n\n const dialogElement = appDialogsManager.addListDialog({\n peerId: this.forumPeerId ?? base.id,\n loadPromises,\n isBatch: true,\n threadId: this.forumPeerId ? base.id : undefined,\n isMainList: this.indexKey === 'index_0'\n });\n (base as SortedDialog).dom = dialogElement.dom;\n (base as SortedDialog).dialogElement = dialogElement;\n\n await Promise.all(loadPromises);\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional,\n log: options.log\n });\n\n safeAssign(this, options);\n }\n\n public clear() {\n this.list.replaceChildren();\n super.clear();\n }\n}\n\nexport type DialogElementSize = RowMediaSizeType;\ntype DialogElementOptions = {\n peerId: PeerId,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n avatarSize?: RowMediaSizeType,\n autonomous?: boolean,\n loadPromises?: Promise[],\n fromName?: string,\n noIcons?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions,\n isMainList?: boolean\n};\nclass DialogElement extends Row {\n public dom: DialogDom;\n\n constructor({\n peerId,\n rippleEnabled = true,\n onlyFirstName = false,\n meAsSaved = true,\n avatarSize = 'bigger',\n autonomous,\n loadPromises,\n fromName,\n noIcons,\n threadId,\n wrapOptions = {},\n isMainList\n }: DialogElementOptions) {\n super({\n clickable: true,\n noRipple: !rippleEnabled,\n havePadding: !threadId,\n title: true,\n titleRightSecondary: true,\n subtitle: true,\n subtitleRight: true,\n noWrap: true,\n asLink: true\n });\n\n this.subtitleRight.remove();\n\n const avatarEl = threadId ? undefined : new AvatarElement();\n if(avatarEl) {\n const avatarSizeMap: {[k in DialogElementSize]?: number} = {\n bigger: 54,\n abitbigger: 42,\n small: 32\n };\n const s = avatarSizeMap[avatarSize];\n avatarEl.classList.add('dialog-avatar', 'avatar-' + s);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue: wrapOptions.lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n this.applyMediaElement(avatarEl, avatarSize);\n }\n\n const captionDiv = this.container;\n\n const titleSpanContainer = this.title;\n titleSpanContainer.classList.add('user-title');\n\n this.titleRow.classList.add('dialog-title');\n\n const peerTitle = new PeerTitle();\n const peerTitlePromise = peerTitle.update({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n withIcons: !noIcons,\n threadId: threadId\n });\n\n loadPromises?.push(peerTitlePromise);\n titleSpanContainer.append(peerTitle.element);\n\n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n\n // const titleIconsPromise = generateTitleIcons(peerId).then((elements) => {\n // titleSpanContainer.append(...elements);\n // });\n\n // if(loadPromises) {\n // loadPromises.push(titleIconsPromise);\n // }\n // }\n\n const span = this.subtitle;\n // span.classList.add('user-last-message');\n\n const li = this.container;\n li.classList.add('chatlist-chat', 'chatlist-chat-' + avatarSize);\n if(!autonomous) {\n (li as HTMLAnchorElement).href = '#' + peerId;\n }\n // if(rippleEnabled) {\n // ripple(li);\n // }\n\n if(avatarSize === 'bigger') {\n this.container.classList.add('row-big');\n } else if(avatarSize === 'small') {\n this.container.classList.add('row-small');\n }\n\n li.dataset.peerId = '' + peerId;\n if(threadId) {\n li.dataset.threadId = '' + threadId;\n }\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 rightSpan = this.titleRight;\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n\n this.subtitleRow.classList.add('dialog-subtitle');\n\n const dom: DialogDom = this.dom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl: this.subtitleRow\n };\n\n if(!autonomous) {\n (li as any).dialogDom = dom;\n\n const chat = appImManager.chat;\n if(chat && appImManager.isSamePeer(chat, {peerId, threadId: threadId, type: 'chat'})) {\n appDialogsManager.setDialogActive(li, true);\n }\n\n if(isMainList && appDialogsManager.forumTab?.peerId === peerId && !threadId) {\n li.classList.add('is-forum-open');\n }\n }\n }\n\n public createUnreadBadge() {\n if(this.dom.unreadBadge) return;\n const badge = this.dom.unreadBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE}`;\n this.dom.subtitleEl.append(badge);\n }\n\n public createUnreadAvatarBadge() {\n if(this.dom.unreadAvatarBadge) return;\n const badge = this.dom.unreadAvatarBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} avatar-badge`;\n this.dom.listEl.append(badge);\n }\n\n public createMentionsBadge() {\n if(this.dom.mentionsBadge) return;\n const badge = this.dom.mentionsBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} mention mention-badge`;\n badge.innerText = '@';\n this.dom.lastMessageSpan.after(badge);\n }\n\n public toggleBadgeByKey(\n key: Extract,\n hasBadge: boolean,\n justCreated: boolean,\n batch?: boolean\n ) {\n SetTransition({\n element: this.dom[key],\n className: 'is-visible',\n forwards: hasBadge,\n duration: batch ? 0 : BADGE_TRANSITION_TIME,\n onTransitionEnd: hasBadge ? undefined : () => {\n this.dom[key].remove();\n delete this.dom[key];\n },\n useRafs: !justCreated || !isInDOM(this.dom[key]) ? 2 : 0\n });\n }\n}\n\nclass ForumTab extends SliderSuperTabEventable {\n private rows: HTMLElement;\n private subtitle: HTMLElement;\n\n public peerId: PeerId;\n private firstTime: boolean;\n\n private log: ReturnType;\n\n private xd: Some3;\n\n public async toggle(value: boolean) {\n if(this.init2) {\n await this.init2();\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: value,\n duration: 300,\n onTransitionEnd: !value ? () => {\n this.onCloseAfterTimeout();\n } : undefined,\n useRafs: this.firstTime ? (this.firstTime = undefined, 2) : undefined\n });\n }\n\n public init(options: {\n peerId: PeerId,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n this.log = logger('FORUM');\n this.firstTime = true;\n this.container.classList.add('topics-container');\n\n const isFloating = !this.slider;\n if(isFloating) {\n this.closeBtn.classList.replace('tgico-left', 'tgico-close');\n this.container.classList.add('active', 'is-floating');\n\n attachClickEvent(this.closeBtn, () => {\n appDialogsManager.toggleForumTab(undefined, this);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.rows = document.createElement('div');\n this.rows.classList.add('sidebar-header__rows');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('sidebar-header__subtitle');\n\n this.title.replaceWith(this.rows);\n this.rows.append(this.title, this.subtitle);\n\n const list = appDialogsManager.createChatList();\n appDialogsManager.setListClickListener(list, null, true);\n this.scrollable.append(list);\n\n this.xd = new Some3(this.peerId, isFloating ? 80 : 0);\n this.xd.scrollable = this.scrollable;\n this.xd.sortedList = new SortedDialogList({\n managers: this.managers,\n log: this.log,\n list,\n indexKey: 'index_0',\n forumPeerId: this.peerId\n });\n this.xd.bindScrollable();\n\n const getOptionsForMessages = (): Parameters[0] => {\n return {\n peerId: this.peerId,\n type: 'chat'\n };\n };\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'info',\n text: 'ForumTopic.Context.Info',\n onClick: async() => {\n const tab = appSidebarLeft.createTab(AppSharedMediaTab, true);\n tab.isFirst = true;\n tab.setPeer(this.peerId);\n (await tab.fillProfileElements())();\n tab.loadSidebarMedia(true);\n tab.open();\n }\n }, {\n icon: 'message',\n text: 'ForumTopic.Context.ShowAsMessages',\n onClick: () => {\n const chat = appImManager.chat;\n appImManager[chat?.peerId === this.peerId ? 'setPeer' : 'setInnerPeer'](getOptionsForMessages());\n },\n verify: () => {\n const chat = appImManager.chat;\n return !chat || !appImManager.isSamePeer(chat, getOptionsForMessages());\n }\n }, {\n icon: 'adduser',\n text: 'ForumTopic.Context.AddMember',\n onClick: () => {},\n verify: () => this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users')\n }, {\n icon: 'add',\n text: 'ForumTopic.Context.New',\n onClick: () => {\n appSidebarLeft.createTab(AppEditTopicTab).open(this.peerId);\n },\n separator: true,\n verify: () => this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics')\n }]\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(this.peerId !== peerId) {\n return;\n }\n\n this.xd.fullReset();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(!(chat as Chat.channel).pFlags.forum) {\n appDialogsManager.toggleForumTab(undefined, this);\n }\n });\n\n this.header.append(btnMenu);\n\n if(!isFloating) {\n return this.init2();\n }\n }\n\n public async init2() {\n this.init2 = undefined;\n\n const middleware = this.middlewareHelper.get();\n const peerId = this.peerId;\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId());\n middleware.onDestroy(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId());\n });\n\n const peerTitlePromise = wrapPeerTitle({\n peerId,\n dialog: true,\n wrapOptions: {middleware}\n });\n\n const setStatusPromise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear: true,\n useWhitespace: false,\n middleware,\n noTyping: true\n });\n\n // this.managers.dialogsStorage.getForumTopics(this.peerId).then((messagesForumTopics) => {\n // console.log(messagesForumTopics);\n\n // const promises = messagesForumTopics.topics.map((forumTopic) => {\n // return this.sortedDialogList.add(forumTopic.id);\n // });\n\n // return Promise.all(promises);\n // }).then(() => {\n // this.dialogsPlaceholder.detach(this.sortedDialogList.getAll().size);\n // });\n\n return Promise.all([\n peerTitlePromise,\n setStatusPromise,\n this.xd.onChatsScroll().then((loadResult) => {\n return loadResult.cached ? loadResult.renderPromise : undefined\n })\n ]).then(([\n peerTitle,\n setStatus,\n _\n ]) => {\n if(!middleware()) {\n return;\n }\n\n this.title.append(peerTitle);\n setStatus?.();\n });\n }\n\n public onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n this.xd.destroy();\n }\n}\n\nconst NOT_IMPLEMENTED_ERROR = new Error('not implemented');\n\ntype DialogKey = Parameters[0];\nclass Some {\n public sortedList: SortedDialogList;\n public scrollable: Scrollable;\n public loadedDialogsAtLeastOnce: boolean;\n public needPlaceholderAtFirstTime: boolean;\n protected offsets: {top: number, bottom: number};\n protected indexKey: ReturnType;\n protected sliceTimeout: number;\n protected managers: AppManagers;\n protected listenerSetter: ListenerSetter;\n protected loadDialogsPromise: Promise<{cached: boolean, renderPromise: Some2['loadDialogsRenderPromise']}>;\n protected loadDialogsRenderPromise: Promise;\n protected placeholder: DialogsPlaceholder;\n protected log: ReturnType;\n protected placeholderOptions: ConstructorParameters[0];\n\n constructor() {\n this.log = logger('CL');\n this.offsets = {top: 0, bottom: 0};\n this.managers = rootScope.managers;\n this.listenerSetter = new ListenerSetter();\n }\n\n public getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scrollable.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n protected isDialogMustBeInViewport(dialog: T) {\n // return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n\n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n\n const index = getDialogIndex(dialog, this.indexKey);\n return (!topOffset.index || index <= topOffset.index) &&\n (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n public setIndexKey(indexKey: Some['indexKey']) {\n this.indexKey = indexKey;\n this.sortedList.indexKey = indexKey;\n }\n\n protected deleteDialogByKey(key: DialogKey) {\n this.sortedList.delete(key);\n }\n\n public deleteDialog(dialog: T) {\n return this.deleteDialogByKey(this.getDialogKey(dialog));\n }\n\n public updateDialog(dialog: T) {\n const key = this.getDialogKey(dialog);\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(key) && this.loadedDialogsAtLeastOnce) {\n this.sortedList.add(key);\n return;\n }\n } else {\n this.deleteDialog(dialog);\n return;\n }\n\n const dialogElement = this.getDialogElement(key);\n if(dialogElement) {\n appDialogsManager.setLastMessageN({\n dialog,\n dialogElement,\n setUnread: true\n });\n this.sortedList.update(key);\n }\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.sortedList.list.childElementCount || appDialogsManager.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 const perf = performance.now();\n\n const scrollTopWas = this.scrollable.scrollTop;\n\n const firstElementChild = this.sortedList.list.firstElementChild;\n const rectContainer = this.scrollable.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scrollable.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scrollable.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.scrollable.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scrollable.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach((el) => {\n this.deleteDialogByKey(this.getDialogKeyFromElement(el));\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.scrollable.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 public onChatsScrollTop() {\n return this.onChatsScroll('top');\n };\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n return this.loadDialogs(side);\n };\n\n public createPlaceholder(): DialogsPlaceholder {\n const placeholder = this.placeholder = new DialogsPlaceholder(this.placeholderOptions);\n const getRectFrom = this.getRectFromForPlaceholder();\n placeholder.attach({\n container: this.sortedList.list.parentElement,\n getRectFrom,\n onRemove: () => {\n this.placeholder = undefined;\n },\n blockScrollable: this.scrollable\n });\n\n return placeholder;\n }\n\n public loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n\n const log = this.log.bindPrefix('load-' + getUnsafeRandomInt(1000, 9999));\n log('try', side);\n\n if(this.loadDialogsPromise || this.loadDialogsRenderPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n else if(this.scrollable.loadedAll[side]) {\n return Promise.resolve({\n cached: true,\n renderPromise: Promise.resolve()\n });\n }\n\n log.warn('start', side);\n const middlewareError = makeError('MIDDLEWARE');\n\n const cachedInfoPromise = deferredPromise();\n const renderPromise = new Promise(async(resolve, reject) => {\n const chatList = this.sortedList.list;\n\n let placeholder = this.placeholder;\n try {\n const getConversationsResult = this.loadDialogsInner(side);\n if(\n !chatList.childElementCount &&\n !placeholder &&\n (\n (!this.loadedDialogsAtLeastOnce && this.needPlaceholderAtFirstTime) ||\n !(await getConversationsResult).cached\n )\n ) {\n placeholder = this.createPlaceholder();\n\n cachedInfoPromise.resolve(false);\n }\n\n const a = await getConversationsResult;\n const result = await a.result;\n // await pause(5000);\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n cachedInfoPromise.resolve(a.cached);\n\n // console.timeEnd('getDialogs time');\n\n // * loaded all\n // if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n // if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scrollable.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scrollable.loadedAll[side] = true;\n }\n\n const length = result.dialogs.length;\n log(`will render ${length} dialogs`);\n if(length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n\n const loadPromises = dialogs.map((dialog) => {\n return this.sortedList.add(this.getDialogKey(dialog as T));\n });\n\n await Promise.all(loadPromises).catch();\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : length - 1];\n if(offsetDialog) {\n this.offsets[side] = getDialogIndex(offsetDialog, this.indexKey);\n }\n\n // don't set it before - no need to fire length change with every dialog\n this.loadedDialogsAtLeastOnce = true;\n appDialogsManager.onListLengthChange();\n\n log('getDialogs', result, chatList.childElementCount);\n\n setTimeout(() => {\n this.scrollable.onScroll();\n }, 0);\n\n if(placeholder) {\n // await pause(500);\n placeholder.detach(chatList.childElementCount);\n }\n } catch(err) {\n if((err as ApiError)?.type !== 'MIDDLEWARE') {\n log.error(err);\n }\n\n reject(err);\n cachedInfoPromise.reject(err);\n return;\n }\n\n resolve();\n }).finally(() => {\n if(this.loadDialogsRenderPromise === renderPromise) {\n log('end');\n this.loadDialogsRenderPromise = undefined;\n } else {\n log('has been cleared');\n }\n });\n\n this.loadDialogsRenderPromise = renderPromise;\n const loadDialogsPromise = this.loadDialogsPromise = cachedInfoPromise.then((cached) => {\n return {\n cached,\n renderPromise\n };\n }).finally(() => {\n if(this.loadDialogsPromise === loadDialogsPromise) {\n this.loadDialogsPromise = undefined;\n }\n });\n\n return loadDialogsPromise;\n }\n\n public async setOffsets() {\n const chatList = this.sortedList.list;\n const [firstDialog, lastDialog] = await Promise.all([\n this.getDialogFromElement(chatList.firstElementChild as HTMLElement),\n this.getDialogFromElement(chatList.lastElementChild as HTMLElement)\n ]);\n\n const {indexKey} = this;\n this.offsets.top = getDialogIndex(firstDialog, indexKey);\n this.offsets.bottom = getDialogIndex(lastDialog, indexKey);\n }\n\n public getDialogKey(dialog: T): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogKeyFromElement(element: HTMLElement): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getRectFromForPlaceholder(): Parameters[0]['getRectFrom'] {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogFromElement(element: HTMLElement): Promise {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public loadDialogsInner(side: SliceSides): ReturnType {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public async setTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dom = this.getDialogDom(key);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = await appImManager.getPeerTyping(\n dialog.peerId,\n oldTypingElement,\n dialog._ === 'forumTopic' ? dialog.id : undefined\n );\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dialogElement = this.getDialogElement(key);\n if(!dialogElement) {\n return;\n }\n\n dialogElement.dom.lastMessageSpan.classList.remove('user-typing');\n appDialogsManager.setLastMessageN({\n dialog,\n lastMessage: null,\n dialogElement,\n setUnread: null\n });\n }\n\n public getDialogDom(key: DialogKey) {\n // return this.doms[peerId];\n const element = this.sortedList.get(key);\n return element?.dom;\n }\n\n public getDialogElement(key: DialogKey) {\n const element = this.sortedList.get(key);\n return element?.dialogElement;\n }\n\n public bindScrollable() {\n this.scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n this.scrollable.onScrolledTop = this.onChatsScrollTop.bind(this);\n this.scrollable.onScrolledBottom = this.onChatsScroll.bind(this);\n this.scrollable.setVirtualContainer(this.sortedList.list);\n }\n\n public clear() {\n this.sortedList.clear();\n this.placeholder?.remove();\n }\n\n public reset() {\n this.scrollable.loadedAll.top = true;\n this.scrollable.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n }\n\n public fullReset() {\n this.reset();\n this.clear();\n return this.onChatsScroll();\n }\n\n public destroy() {\n this.scrollable.destroy();\n this.listenerSetter.removeAll();\n }\n}\n\nclass Some3 extends Some {\n constructor(public peerId: PeerId, public paddingX: number) {\n super();\n\n this.placeholderOptions = {\n avatarSize: 0,\n marginVertical: 5,\n totalHeight: 64\n };\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, threadId, typings}) => {\n if(!threadId || this.peerId !== peerId) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getForumTopic(peerId, threadId);\n\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(peerId !== this.peerId || !topics?.size) {\n continue;\n }\n\n topics.forEach((forumTopic) => {\n this.updateDialog(forumTopic);\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(dialog?._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // возможно это не нужно, но нужно менять is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n this.deleteDialogByKey(this.getDialogKey(dialog));\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n });\n }\n\n protected isDialogMustBeInViewport(dialog: ForumTopic) {\n if(dialog.pFlags.hidden) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n public getDialogKey(dialog: ForumTopic) {\n return dialog.id;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.threadId;\n }\n\n public getRectFromForPlaceholder() {\n return (): DOMRectEditable => {\n const sidebarRect = appSidebarLeft.rect;\n const paddingY = 56;\n return {\n top: paddingY,\n right: sidebarRect.right,\n bottom: 0,\n left: this.paddingX,\n width: sidebarRect.width - this.paddingX,\n height: sidebarRect.height - paddingY\n };\n };\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return this.managers.dialogsStorage.getForumTopic(+element.dataset.peerId, +element.dataset.threadId);\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {indexKey} = this;\n let loadCount = windowSize.height / 64 * 1.25 | 0;\n let offsetIndex = 0;\n\n const filterId = this.peerId;\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n offsetIndex = currentOffsetIndex;\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n return this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n }\n}\n\nclass Some2 extends Some {\n constructor(protected filterId: number) {\n super();\n\n this.needPlaceholderAtFirstTime = true;\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, typings}) => {\n const [dialog, isForum] = await Promise.all([\n this.managers.appMessagesManager.getDialogOnly(peerId),\n this.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!dialog || isForum) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', async(userId) => {\n if(!this.isActive) {\n return;\n }\n\n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(!dom) {\n return;\n }\n\n const status = await this.managers.appUsersManager.getUserStatus(userId);\n const online = status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const peerId = chatId.toPeerId(true);\n this.processDialogForCallStatus(peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({dialog}) => {\n if(!this.isActive || !dialog) {\n return;\n }\n\n appDialogsManager.setLastMessageN({\n dialog,\n setUnread: true\n });\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!this.isActive) {\n return;\n }\n\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(dialog?._ !== 'dialog') {\n continue;\n }\n\n this.updateDialog(dialog);\n\n appDialogsManager.processContact?.(peerId.toPeerId());\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(!this.isActive || dialog._ !== 'dialog') {\n return;\n }\n\n this.deleteDialogByKey(dialog.peerId);\n appDialogsManager.processContact?.(dialog.peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(!this.isActive || dialog?._ !== 'dialog') {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n this.validateDialogForFilter(dialog);\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // возможно это не нужно, но нужно менять is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n\n appDialogsManager.processContact?.(peerId);\n });\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n if(this.isActive && filter.id === this.filterId && !REAL_FOLDERS.has(filter.id)) {\n const dialogs = await this.managers.dialogsStorage.getCachedDialogs(true);\n await this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n });\n }\n\n private get isActive() {\n return appDialogsManager.xd === this;\n }\n\n public getRectFromForPlaceholder() {\n return this.filterId === FOLDER_ID_ARCHIVE ? appDialogsManager.chatsContainer : appDialogsManager.folders.container;\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {filterId, indexKey} = this;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n\n const doNotRenderChatList = appDialogsManager.doNotRenderChatList; // cache before awaits\n\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n const promise = this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n\n const a = await promise;\n if(doNotRenderChatList) {\n a.result = Promise.reject(makeError('MIDDLEWARE'));\n }\n\n return a;\n }\n\n public 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({\n element: element,\n className: 'is-visible',\n forwards: online,\n duration: 250,\n onTransitionEnd: online ? undefined : () => {\n element.classList.remove(className);\n },\n useRafs: online && !hasClassName ? 2 : 0\n });\n }\n\n public generateScrollable(list: HTMLUListElement, filter: Parameters[0]) {\n const filterId = filter.id;\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.dataset.filterId = '' + filterId;\n\n const indexKey = getDialogIndexKey(filter.localId);\n const sortedDialogList = new SortedDialogList({\n managers: rootScope.managers,\n log: this.log,\n list: list,\n indexKey,\n onListLengthChange: appDialogsManager.onListLengthChange\n });\n\n this.scrollable = scrollable;\n this.sortedList = sortedDialogList;\n this.setIndexKey(indexKey);\n this.bindScrollable();\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 public testDialogForFilter(dialog: Dialog) {\n if(!REAL_FOLDERS.has(this.filterId) ? getDialogIndex(dialog, this.indexKey) === undefined : this.filterId !== dialog.folder_id) {\n return false;\n }\n\n return true;\n }\n\n protected isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n public async validateListForFilter() {\n this.sortedList.getAll().forEach(async(element) => {\n const dialog = await rootScope.managers.appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n public validateDialogForFilter(dialog: Dialog) {\n if(!this.getDialogElement(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n }\n\n public 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({\n element: dom.callIcon.canvas,\n className: 'is-visible',\n forwards: visible,\n duration: BADGE_TRANSITION_TIME,\n onTransitionEnd: visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n },\n useRafs: visible ? 2 : 0\n });\n }\n\n public async processDialogForCallStatus(peerId: PeerId, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(peerId);\n if(!dom) return;\n\n const chat = await rootScope.managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat | Chat.channel;\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n if(this.scrollable.loadedAll[side]) {\n appDialogsManager.loadContacts?.();\n }\n\n this.log('onChatsScroll', side);\n return super.onChatsScroll(side);\n }\n\n public toggleAvatarUnreadBadges(value: boolean, useRafs: number) {\n if(!value) {\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n if(!dom.unreadAvatarBadge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', false, false, false);\n });\n\n return;\n }\n\n const reuseClassNames = ['unread', 'mention'];\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n const unreadContent = dom.unreadBadge?.textContent;\n if(!unreadContent || dom.unreadBadge.classList.contains('backwards')) {\n return;\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n dialogElement.createUnreadAvatarBadge();\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', true, isUnreadAvatarBadgeMounted);\n dom.unreadAvatarBadge.textContent = unreadContent;\n const unreadAvatarBadgeClassList = dom.unreadAvatarBadge.classList;\n const unreadBadgeClassList = dom.unreadBadge.classList;\n reuseClassNames.forEach((className) => {\n unreadAvatarBadgeClassList.toggle(className, unreadBadgeClassList.contains(className));\n });\n });\n }\n\n public getDialogKey(dialog: Dialog) {\n return dialog.peerId;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.peerId;\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return rootScope.managers.appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n}\n\n// const testScroll = false;\n// let testTopSlice = 1;\n\nexport class AppDialogsManager {\n public chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n\n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu: DialogsContextMenu;\n\n public filterId: number;\n public 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\n private lastActiveElements: Set = new Set();\n\n public loadContacts: () => void;\n public processContact: (peerId: PeerId) => void;\n\n private initedListeners = false;\n\n public onListLengthChange: () => Promise;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n private filtersNavigationItem: NavigationItem;\n\n private managers: AppManagers;\n private selectTab: ReturnType;\n\n public doNotRenderChatList: boolean;\n\n private stateMiddlewareHelper: MiddlewareHelper;\n\n private forumsTabs: Map;\n private forumsSlider: HTMLElement;\n public forumTab: ForumTab;\n private forumNavigationItem: NavigationItem;\n\n public xd: Some2;\n public xds: {[filterId: number]: Some2} = {};\n\n public start() {\n const managers = this.managers = getProxiedManagers();\n\n this.contextMenu = new DialogsContextMenu(managers);\n this.stateMiddlewareHelper = getMiddleware();\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 this.forumsTabs = new Map();\n this.forumsSlider = document.createElement('div');\n this.forumsSlider.classList.add('topics-slider');\n this.chatsContainer.parentElement.parentElement.append(this.forumsSlider);\n // findUpClassName(this.chatsContainer, 'chatlist-container').append(this.forumsSlider);\n\n // appSidebarLeft.onOpenTab = () => {\n // return this.toggleForumTab();\n // };\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n\n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff > 0 ? prevId + 1 : prevId - 1);\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n\n rootScope.addEventListener('premium_toggle', async(isPremium) => {\n if(isPremium) {\n return;\n }\n\n const isFolderAvailable = await this.managers.filtersStorage.isFilterIdAvailable(this.filterId);\n if(!isFolderAvailable) {\n selectTab(whichChild(this.filtersRendered[FOLDER_ID_ALL].menu), false);\n }\n });\n\n rootScope.addEventListener('state_cleared', () => {\n const clearCurrent = REAL_FOLDERS.has(this.filterId);\n // setTimeout(() =>\n apiManagerProxy.getState().then(async(state) => {\n this.xd.loadedDialogsAtLeastOnce = false;\n this.showFiltersPromise = undefined;\n\n /* const clearPromises: Promise[] = [];\n for(const name in this.managers.appStateManager.storagesResults) {\n const results = this.managers.appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = this.managers.appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n if(clearCurrent) {\n this.xd.clear();\n this.onTabChange();\n }\n\n this.onStateLoaded(state);\n })// , 5000);\n });\n\n this.setFilterId(FOLDER_ID_ALL, FOLDER_ID_ALL);\n this.addFilter({\n id: FOLDER_ID_ALL,\n title: '',\n localId: FOLDER_ID_ALL\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = this.selectTab = horizontalMenu(this.folders.menu, this.folders.container, async(id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n const _id = id;\n id = +tabContent.dataset.filterId || FOLDER_ID_ALL;\n\n const isFilterAvailable = this.filterId === -1 || REAL_FOLDERS.has(id) || await this.managers.filtersStorage.isFilterIdAvailable(id);\n if(!isFilterAvailable) {\n return false;\n }\n\n const wasFilterId = this.filterId;\n if(!IS_MOBILE_SAFARI) {\n if(_id) {\n if(!this.filtersNavigationItem) {\n this.filtersNavigationItem = {\n type: 'filters',\n onPop: () => {\n selectTab(0);\n this.filtersNavigationItem = undefined;\n }\n };\n\n appNavigationController.spliceItems(1, 0, this.filtersNavigationItem);\n }\n } else if(this.filtersNavigationItem) {\n appNavigationController.removeItem(this.filtersNavigationItem);\n this.filtersNavigationItem = undefined;\n }\n }\n\n if(wasFilterId === id) return;\n\n this.xds[id].clear();\n const promise = this.setFilterIdAndChangeTab(id).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n\n if(wasFilterId !== -1) {\n return promise;\n }\n }, () => {\n for(const folderId in this.xds) {\n if(+folderId !== this.filterId) {\n this.xds[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n apiManagerProxy.getState().then((state) => {\n // * it should've had a better place :(\n appMediaPlaybackController.setPlaybackParams(state.playbackParams);\n appMediaPlaybackController.addEventListener('playbackParams', (params) => {\n this.managers.appStateManager.pushToState('playbackParams', params);\n });\n\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n this.managers.appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.managers, this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n\n PopupElement.MANAGERS = rootScope.managers = managers;\n appDownloadManager.construct(managers);\n appSidebarLeft.construct(managers);\n appSidebarRight.construct(managers);\n groupCallsController.construct(managers);\n callsController.construct(managers);\n appImManager.construct(managers);\n\n // start\n\n this.xd = this.xds[this.filterId];\n\n // selectTab(0, false);\n }\n\n public get chatList() {\n return this.xd.sortedList.list;\n }\n\n public setFilterId(filterId: number, localId: MyDialogFilter['localId']) {\n this.filterId = filterId;\n }\n\n public async setFilterIdAndChangeTab(filterId: number) {\n this.filterId = filterId;\n return this.onTabChange();\n }\n\n private initListeners() {\n rootScope.addEventListener('dialog_flush', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('folder_unread', async(folder) => {\n if(folder.id < 0) {\n const dialogElement = this.xd.getDialogElement(folder.id);\n if(!dialogElement) {\n return;\n }\n\n this.setUnreadMessagesN({\n dialog: await this.managers.dialogsStorage.getDialogOnly(folder.id),\n dialogElement\n });\n } else {\n this.setFilterUnreadCount(folder.id);\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact?.(userId.toPeerId());\n });\n\n appImManager.addEventListener('peer_changed', ({peerId, threadId, isForum}) => {\n const options: Parameters[0] = {peerId, threadId: isForum ? threadId : undefined};\n // const perf = performance.now();\n for(const element of this.lastActiveElements) {\n const elementThreadId = +element.dataset.threadId || undefined;\n const elementPeerId = element.dataset.peerId.toPeerId();\n if(!appImManager.isSamePeer({peerId: elementPeerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] .chatlist-chat[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n const elementThreadId = +element.dataset.threadId || undefined;\n if(appImManager.isSamePeer({peerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, true);\n }\n });\n // this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', async(filter) => {\n if(REAL_FOLDERS.has(filter.id)) {\n return;\n }\n\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n }\n\n const elements = this.filtersRendered[filter.id];\n setInnerHTML(elements.title, wrapEmojiText(filter.title));\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n // (this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n elements.container.remove();\n elements.menu.remove();\n\n this.xds[filter.id].destroy();\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n\n if(this.filterId === filter.id) {\n this.selectTab(0, false);\n }\n });\n\n rootScope.addEventListener('filter_order', async(order) => {\n order = order.slice();\n indexOfAndSplice(order, FOLDER_ID_ARCHIVE);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const r = await Promise.all(order.map(async(filterId) => {\n const [indexKey, filter] = await Promise.all([\n this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId),\n this.managers.filtersStorage.getFilter(filterId)\n ]);\n\n return {indexKey, filter};\n }));\n\n order.forEach((filterId, idx) => {\n const {indexKey, filter} = r[idx];\n const renderedFilter = this.filtersRendered[filterId];\n\n this.xds[filterId].setIndexKey(indexKey);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n });\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n }\n\n public setDialogActive(listEl: HTMLElement, active: boolean) {\n const dom = (listEl as any).dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n listEl.classList.toggle('is-forum-open', this.forumTab?.peerId === listEl.dataset.peerId.toPeerId() && !listEl.dataset.threadId);\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 this.stateMiddlewareHelper.clean();\n const middleware = this.stateMiddlewareHelper.get();\n const filtersArr = state.filtersArr;\n const haveFilters = filtersArr.length > REAL_FOLDERS.size;\n // const filter = filtersArr.find((filter) => filter.id !== FOLDER_ID_ARCHIVE);\n\n const addFilters = (filters: MyDialogFilter[]) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n };\n\n let addFiltersPromise: Promise;\n if(haveFilters) {\n addFilters(filtersArr);\n } else {\n addFiltersPromise = this.managers.filtersStorage.getDialogFilters().then(addFilters);\n }\n\n this.doNotRenderChatList = true;\n const loadDialogsPromise = this.xd.onChatsScroll();\n const m = middlewarePromise(middleware);\n try {\n await m(loadDialogsPromise);\n } catch(err) {\n\n }\n\n // show the placeholder before the filters, and then will reset to the default tab again\n if(!haveFilters) {\n this.selectTab(0, false);\n }\n\n addFiltersPromise && await m(addFiltersPromise);\n // this.folders.menu.children[0].classList.add('active');\n\n this.doNotRenderChatList = undefined;\n\n this.filterId = -1;\n this.selectTab(0, false);\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n\n haveFilters && this.showFiltersPromise && await m(this.showFiltersPromise);\n\n this.managers.appNotificationsManager.getNotifyPeerTypeSettings();\n\n await (await m(loadDialogsPromise)).renderPromise.catch(noop);\n this.managers.appMessagesManager.fillConversations();\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = this.managers.appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n\n public onTabChange = () => {\n this.xd = this.xds[this.filterId];\n this.xd.reset();\n return this.xd.onChatsScroll();\n };\n\n private async setFilterUnreadCount(filterId: number) {\n // if(filterId === FOLDER_ID_ALL) {\n // return;\n // }\n\n const unreadSpan = this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const {unreadUnmutedCount, unreadCount} = await this.managers.dialogsStorage.getFolderUnreadCount(filterId);\n unreadSpan.classList.toggle('badge-gray', !unreadUnmutedCount);\n const count = filterId === FOLDER_ID_ALL ? unreadUnmutedCount : unreadCount;\n unreadSpan.innerText = count ? '' + count : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n public l(filter: Parameters[0]) {\n const ul = this.createChatList();\n const xd = this.xds[filter.id] = new Some2(filter.id);\n const scrollable = xd.generateScrollable(ul, filter);\n this.setListClickListener(ul, null, true);\n\n return {ul, xd, scrollable};\n }\n\n private addFilter(filter: Pick) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const renderedFilter = this.filtersRendered[filter.id];\n if(renderedFilter) {\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n return;\n }\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.id === FOLDER_ID_ALL) titleSpan.append(this.allChatsIntlElement.element);\n else setInnerHTML(titleSpan, wrapEmojiText(filter.title));\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n ripple(menuTab);\n menuTab.append(span);\n\n menuTab.dataset.filterId = '' + filter.id;\n\n positionElementByIndex(menuTab, containerToAppend, filter.localId);\n // containerToAppend.append(li);\n\n const {ul, scrollable} = this.l(filter);\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.localId);\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 let promise = this.showFiltersPromise;\n return promise ??= this.showFiltersPromise = pause(0).then(() => {\n if(this.showFiltersPromise !== promise) {\n return;\n }\n\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 });\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 === FOLDER_ID_ARCHIVE) {\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.xd.scrollable.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType, type: 'dialogs' | 'folder';\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: type = 'dialogs'\n });\n\n placeholderContainer = placeholder.container;\n\n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n\n this.emptyDialogsPlaceholderSubtitle = new I18n.IntlElement({\n element: placeholder.subtitle\n });\n\n Promise.all([\n this.updateContactsLength(false),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(([usersLength]) => {\n placeholderContainer.classList.add('visible');\n part.classList.toggle('has-contacts', !!usersLength);\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: type = 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n const div = document.createElement('div');\n const emoji = '📂';\n const size = 128;\n wrapStickerEmoji({\n div,\n emoji: emoji,\n width: size,\n height: size\n });\n\n placeholderContainer.prepend(div);\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, async() => {\n appSidebarLeft.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(this.filterId));\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n part.dataset.placeholderType = type;\n }\n\n private updateContactsLength(updatePartClassName: boolean) {\n return this.updateContactsLengthPromise ??= this.managers.appUsersManager.getContacts().then((users) => {\n const subtitle = this.emptyDialogsPlaceholderSubtitle;\n if(subtitle) {\n let key: LangPackKey, args: FormatterArguments;\n\n if(users.length/* && false */) {\n key = 'ChatList.Main.EmptyPlaceholder.Subtitle';\n args = [i18n('Contacts.Count', [users.length])];\n } else {\n key = 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts';\n args = [];\n }\n\n subtitle.compareAndUpdate({\n key,\n args\n });\n }\n\n if(updatePartClassName) {\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n part.classList.toggle('has-contacts', !!users.length);\n }\n\n this.updateContactsLengthPromise = undefined;\n\n return users.length;\n });\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.replaceChildren();\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.xd.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId !== FOLDER_ID_ALL) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n this.managers.appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then((contacts) => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n\n this.updateContactsLength(true);\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 'abitbigger',\n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false,\n onListLengthChange,\n managers: this.managers\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const promise = filterAsync(contacts.splice(0, pageCount), this.verifyPeerIdForContacts);\n\n promise.then((arr) => {\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = async(peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = await this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = async(peerId: PeerId) => {\n const [isContact, dialog] = await Promise.all([\n this.managers.appPeersManager.isContact(peerId),\n this.managers.appMessagesManager.getDialogOnly(peerId)\n ]);\n\n return isContact && !dialog;\n };\n\n public async toggleForumTab(newTab?: ForumTab, hideTab = this.forumTab) {\n if(!hideTab && !newTab) {\n return;\n }\n\n if(hideTab) {\n const dialogElement = this.xd.getDialogElement(hideTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.remove('is-forum-open');\n }\n }\n\n if(hideTab === newTab) {\n newTab = undefined;\n }\n\n hideTab?.toggle(false);\n const promise = newTab?.toggle(true);\n if(hideTab === this.forumTab) {\n this.forumTab = newTab;\n }\n\n if(newTab) {\n const dialogElement = this.xd.getDialogElement(newTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.add('is-forum-open');\n }\n }\n\n if(promise) {\n await promise;\n }\n\n if(newTab && !this.forumNavigationItem) {\n this.forumNavigationItem = {\n type: 'forum',\n onPop: () => {\n this.forumNavigationItem = undefined;\n this.toggleForumTab();\n }\n };\n\n appNavigationController.pushItem(this.forumNavigationItem);\n } else if(!newTab && this.forumNavigationItem) {\n appNavigationController.removeItem(this.forumNavigationItem);\n this.forumNavigationItem = undefined;\n }\n\n const forwards = !!newTab;\n const useRafs = promise ? 2 : undefined;\n this.xd.toggleAvatarUnreadBadges(forwards, useRafs);\n\n const deferred = deferredPromise();\n const duration = 300;\n SetTransition({\n element: this.forumsSlider.parentElement,\n className: 'is-forum-visible',\n duration,\n forwards,\n useRafs,\n onTransitionEnd: () => {\n deferred.resolve();\n }\n });\n\n dispatchHeavyAnimationEvent(deferred, duration).then(() => deferred.resolve());\n }\n\n public toggleForumTabByPeerId(peerId: PeerId, show?: boolean) {\n const {managers} = this;\n const history = appSidebarLeft.getHistory();\n const lastTab = history[history.length - 1];\n let forumTab: ForumTab;\n if(lastTab/* && !(lastTab instanceof AppArchivedTab) */) {\n if(lastTab instanceof ForumTab && lastTab.peerId === peerId && show) {\n shake(lastTab.container);\n return;\n }\n\n forumTab = appSidebarLeft.createTab(ForumTab);\n forumTab.open({peerId, managers});\n return;\n }\n\n forumTab = this.forumsTabs.get(peerId);\n const isSameTab = this.forumTab && this.forumTab === forumTab;\n show ??= !isSameTab;\n if(show === isSameTab) {\n if(show) {\n shake(forumTab.container);\n }\n\n return;\n }\n\n if(show && !forumTab) {\n forumTab = new ForumTab(undefined);\n forumTab.init({peerId, managers});\n\n this.forumsTabs.set(peerId, forumTab);\n this.forumsSlider.append(forumTab.container);\n\n forumTab.managers = this.managers;\n forumTab.eventListener.addEventListener('destroy', () => {\n this.forumsTabs.delete(peerId);\n });\n }\n\n return this.toggleForumTab(forumTab);\n }\n\n public setListClickListener(\n list: HTMLUListElement,\n onFound?: () => void,\n withContext = false,\n autonomous = false,\n openInner = false\n ) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, DIALOG_LIST_ELEMENT_TAG);\n\n if(!elem) {\n return;\n }\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n const threadId = +elem.dataset.threadId || undefined;\n\n onFound?.();\n\n const isForum = !!elem.querySelector('.is-forum');\n if(isForum && !e.shiftKey && !lastMsgId) {\n this.toggleForumTabByPeerId(peerId);\n return;\n }\n\n if(e.ctrlKey || e.metaKey) {\n window.open((elem as HTMLAnchorElement).href || ('#' + peerId), '_blank');\n cancelEvent(e);\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(\n (!threadId || lastMsgId) &&\n this.xd.sortedList.list === list &&\n this.xd !== this.xds[FOLDER_ID_ARCHIVE]\n ) {\n this.toggleForumTab();\n }\n\n setPeerFunc({\n peerId,\n lastMsgId,\n threadId: threadId\n });\n }, {capture: true});\n\n // cancel link click\n // ! do not change it to attachClickEvent\n list.addEventListener('click', (e) => {\n if(e.button === 0) {\n cancelEvent(e);\n }\n }, {capture: true});\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number,\n ignoreClick?: boolean\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* ,\n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n // if(options.ignoreClick) {\n // list.classList.add('disable-hover');\n // }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessageN(options: Parameters[0]) {\n const promise = this.setLastMessage(options);\n return promise.catch((err: ApiError) => {\n if(err?.type !== 'MIDDLEWARE') {\n this.log.error('set last message error', err);\n }\n });\n }\n\n private async setLastMessage({\n dialog,\n lastMessage,\n dialogElement,\n highlightWord,\n isBatch = false,\n setUnread = false\n }: {\n dialog: Dialog | ForumTopic,\n lastMessage?: Message.message | Message.messageService,\n dialogElement?: DialogElement,\n highlightWord?: string,\n isBatch?: boolean,\n setUnread?: boolean\n }) {\n if(!dialogElement) {\n dialogElement = this.xd.getDialogElement(dialog.peerId);\n\n if(!dialogElement) {\n return;\n }\n }\n\n const {dom} = dialogElement;\n const {peerId} = dialog;\n\n const {deferred: promise, middleware} = setPromiseMiddleware(dom, 'setLastMessagePromise');\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(\n dialog.draft?._ === 'draftMessage' && (\n !peerId.isAnyChat() ||\n dialog._ === 'forumTopic' ||\n !(await this.managers.appPeersManager.isForum(peerId))\n )\n ) {\n draftMessage = dialog.draft;\n }\n\n lastMessage = (dialog as Dialog).topMessage;\n if(lastMessage?.mid !== dialog.top_message) {\n const promise = this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message);\n lastMessage = await middleware(promise);\n }\n }\n\n // * do not uncomment next line - unsetTyping right after this call will interrupt setting unread badges\n // if(setUnread) {\n this.setUnreadMessagesN({dialog, dialogElement, isBatch, setLastMessagePromise: promise});\n // }\n\n if(!lastMessage/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.replaceChildren();\n dom.lastTimeSpan.replaceChildren();\n delete dom.listEl.dataset.mid;\n\n promise.resolve();\n return;\n }\n\n const isRestricted = lastMessage && isMessageRestricted(lastMessage as Message.message);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n let mediaContainer: HTMLElement;\n const willPrepend: (Promise | HTMLElement)[] = [];\n if(lastMessage && !draftMessage && !isRestricted) {\n const media: MyDocument | MyPhoto = getMediaFromMessage(lastMessage);\n const videoTypes: Set = new Set(['video', 'gif', 'round']);\n if(media && (media._ === 'photo' || videoTypes.has(media.type))) {\n const size = choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n\n if((media as MyDocument).type === 'round') {\n mediaContainer.classList.add('is-round');\n }\n\n willPrepend.push(wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size\n }).then(() => mediaContainer));\n\n if(videoTypes.has((media as MyDocument).type)) {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const span = document.createElement('span');\n span.classList.add('danger');\n span.append(i18n('Draft'), ': ');\n willPrepend.unshift(span);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !(lastMessage as Message.messageService).action) {\n const span = document.createElement('span');\n span.classList.add('primary-text');\n\n if(lastMessage.fromId === rootScope.myId) {\n span.append(i18n('FromYou'));\n willPrepend.unshift(span);\n } else {\n // str = sender.first_name || sender.last_name || sender.username;\n const p = middleware(wrapPeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true\n })).then((element) => {\n span.prepend(element);\n return span;\n }, noop);\n\n willPrepend.unshift(p);\n }\n\n span.append(': ');\n // console.log(sender, senderBold.innerText);\n }\n\n const withoutMediaType = !!mediaContainer && !!(lastMessage as Message.message)?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && (lastMessage as Message.message).message) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, highlightWord, withoutMediaType}));\n } else if(draftMessage) {\n fragment = await middleware(wrapMessageForReply({message: draftMessage}));\n } else if(lastMessage) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, withoutMediaType}));\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(willPrepend.length) {\n const elements = await middleware(Promise.all(willPrepend));\n fragment.prepend(...elements);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n }\n\n if(lastMessage || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null && !setUnread) { // means search\n dom.listEl.dataset.mid = '' + lastMessage.mid;\n\n const replyTo = lastMessage.reply_to;\n if(replyTo?.pFlags?.forum_topic) {\n dom.listEl.dataset.threadId = '' + getMessageThreadId(lastMessage);\n }\n }\n\n promise.resolve();\n }\n\n public setUnreadMessagesN(options: Parameters[0]) {\n return this.setUnreadMessages(options).catch(() => {});\n }\n\n private async setUnreadMessages({\n dialog,\n dialogElement,\n isBatch = false,\n setLastMessagePromise\n }: {\n dialog: Dialog | ForumTopic,\n dialogElement: DialogElement,\n isBatch?: boolean,\n setLastMessagePromise?: Promise\n }) {\n const {dom} = dialogElement;\n if(!dom) {\n // this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n const isTopic = dialog._ === 'forumTopic';\n\n const {deferred, middleware} = setPromiseMiddleware(dom, 'setUnreadMessagePromise');\n\n const {peerId} = dialog;\n const promises = Promise.all([\n this.managers.appNotificationsManager.isPeerLocalMuted({peerId: peerId, respectType: true, threadId: isTopic ? dialog.id : undefined}),\n dialog.draft?._ !== 'draftMessage' ? this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message) : undefined,\n isTopic ? !!dialog.pFlags.pinned : this.managers.dialogsStorage.isDialogPinned(peerId, this.filterId),\n this.managers.appMessagesManager.isDialogUnread(dialog),\n peerId.isAnyChat() && !isTopic ? this.managers.acknowledged.dialogsStorage.getForumUnreadCount(peerId).then((result) => {\n if(result.cached) {\n return result.result;\n } else {\n result.result.then(() => {\n this.setUnreadMessagesN({dialog, dialogElement});\n });\n\n return 0;\n }\n }).catch(() => undefined as number) : undefined\n ]);\n\n let [isMuted, lastMessage, isPinned, isDialogUnread, unreadTopicsCount] = await middleware(promises);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n\n let setStatusMessage: MyMessage;\n if(lastMessage && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n\n const unreadCount = unreadTopicsCount ?? dialog.unread_count;\n if(unreadTopicsCount !== undefined) {\n isDialogUnread = !!unreadCount;\n }\n\n if(isTopic && !isDialogUnread) {\n isDialogUnread = !getServerMessageId(dialog.read_inbox_max_id);\n }\n\n const hasUnreadBadge = isPinned || isDialogUnread;\n const hasUnreadAvatarBadge = this.xd !== this.xds[FOLDER_ID_ARCHIVE] && !isTopic && !!this.forumTab && this.xd.getDialogElement(peerId) === dialogElement && isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n // * have to await all promises before modifying something\n\n if(setLastMessagePromise) {\n try {\n await middleware(setLastMessagePromise);\n } catch(err) {\n // return;\n }\n }\n\n const transitionDuration = isBatch ? 0 : BADGE_TRANSITION_TIME;\n\n if(isMuted !== wasMuted) {\n SetTransition({\n element: dom.listEl,\n className: 'is-muted',\n forwards: isMuted,\n duration: transitionDuration\n });\n }\n\n setSendingStatus(dom.statusSpan, isTopic && dialog.pFlags.closed ? 'premium_lock' : setStatusMessage, true);\n\n // if(isTopic) {\n // dom.statusSpan.parentElement.classList.toggle('is-closed', !!dialog.pFlags.closed);\n // }\n\n const isUnreadBadgeMounted = !!dom.unreadBadge;\n if(hasUnreadBadge) {\n dialogElement.createUnreadBadge();\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n if(hasUnreadAvatarBadge) {\n dialogElement.createUnreadAvatarBadge();\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionsBadgeMounted = !!dom.mentionsBadge;\n if(hasMentionsBadge) {\n dialogElement.createMentionsBadge();\n }\n\n const a: [Parameters[0], boolean, boolean][] = [\n ['unreadBadge', hasUnreadBadge, isUnreadBadgeMounted],\n ['unreadAvatarBadge', hasUnreadAvatarBadge, isUnreadAvatarBadgeMounted],\n ['mentionsBadge', hasMentionsBadge, isMentionsBadgeMounted]\n ];\n\n a.forEach(([key, hasBadge, isBadgeMounted]) => {\n const badge = dom[key];\n if(!badge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey(key, hasBadge, isBadgeMounted, isBatch);\n });\n\n if(!hasUnreadBadge) {\n deferred.resolve();\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else if(dom.unreadBadge) {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false, unreadBadgeText: string;\n if(dialog.unread_mentions_count && unreadCount === 1) {\n unreadBadgeText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n // dom.unreadMessagesSpan.innerText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n unreadBadgeText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n } else {\n unreadBadgeText = '';\n isUnread = false;\n }\n\n if(isTopic) {\n const notVisited = isDialogUnread && unreadBadgeText === ' ';\n dom.unreadBadge.classList.toggle('not-visited', notVisited);\n }\n\n const b: Array<[HTMLElement, string]> = [\n [dom.unreadBadge, unreadBadgeText],\n [dom.unreadAvatarBadge, unreadBadgeText || undefined]\n ];\n\n b.filter(Boolean).forEach(([badge, text]) => {\n if(text !== undefined) {\n badge.innerText = unreadBadgeText;\n }\n\n badge.classList.toggle('unread', isUnread);\n badge.classList.toggle('mention', isMention);\n });\n\n deferred.resolve();\n }\n\n private async getDialog(dialog: Dialog | ForumTopic | PeerId, threadId?: number) {\n if(typeof(dialog) !== 'object') {\n let originalDialog: Dialog | ForumTopic;\n if(threadId) {\n originalDialog = await this.managers.dialogsStorage.getForumTopic(dialog, threadId);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n pFlags: {}\n } as any as ForumTopic;\n }\n } else {\n originalDialog = await this.managers.appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: await this.managers.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any as Dialog;\n }\n }\n\n return originalDialog;\n }\n\n return dialog as Dialog | ForumTopic;\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = options;\n const getDialogPromise = this.getDialog(peerId, options.threadId);\n const promise = getDialogPromise.then((dialog) => {\n const promises: Promise[] = [];\n const isUser = peerId.isUser();\n if(!isUser && dialog._ === 'dialog') {\n promises.push(this.xd.processDialogForCallStatus(peerId, ret.dom));\n }\n\n if(peerId !== rootScope.myId && isUser) {\n promises.push(this.managers.appUsersManager.getUserStatus(peerId.toUserId()).then((status) => {\n if(status?._ === 'userStatusOnline') {\n this.xd.setOnlineStatus(ret.dom.avatarEl, true);\n }\n }));\n }\n\n promises.push(this.setLastMessageN({\n dialog,\n dialogElement: ret,\n isBatch: options.isBatch,\n setUnread: true\n }));\n\n return Promise.all(promises);\n });\n\n options.loadPromises?.push(promise);\n }\n\n return ret;\n }\n\n /**\n * use for rendering search result\n */\n public addDialogAndSetLastMessage(options: Omit[0], 'dialog'> & {\n message: MyMessage,\n peerId: PeerId,\n query?: string\n }) {\n const {peerId, message, query} = options;\n const ret = this.addDialogNew({\n ...options,\n ...getMessageSenderPeerIdOrName(message),\n peerId\n });\n\n this.setLastMessageN({\n dialog: {_: 'dialog', peerId} as any,\n lastMessage: message,\n dialogElement: ret,\n highlightWord: query\n });\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: DialogElementOptions & {container?: HTMLElement | Scrollable | false, append?: boolean}) {\n const d = new DialogElement({\n autonomous: !!options.container,\n avatarSize: 'bigger',\n ...options\n // avatarSize: !options.avatarSize || options.avatarSize >= 54 ? 'bigger' : 'abitbigger',\n });\n\n if(options.container) {\n const method = !options.append ? 'append' : 'prepend';\n options.container[method](d.container);\n }\n\n return d;\n // return this.addDialog(options.peerId, options.container, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName, options.noIcons);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","export default function getUnsafeRandomInt(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","/*\n * 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 {DownloadMediaOptions, DownloadOptions} from '../mtproto/apiFileManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {MyDocument} from './appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {InputFile, Photo, PhotoSize} from '../../layer';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport {AppManagers} from './managers';\nimport rootScope from '../rootScope';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport noop from '../../helpers/noop';\nimport getDownloadMediaDetails from './utils/download/getDownloadMediaDetails';\nimport getDownloadFileNameFromOptions from './utils/download/getDownloadFileNameFromOptions';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport makeError from '../../helpers/makeError';\nimport createDownloadAnchor from '../../helpers/dom/createDownloadAnchor';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport getDocumentDownloadOptions from './utils/docs/getDocumentDownloadOptions';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\n\nexport type ResponseMethodBlob = 'blob';\nexport type ResponseMethodJson = 'json';\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\n\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\nexport type DownloadBlob = CancellablePromise;\nexport type DownloadUrl = CancellablePromise;\nexport type DownloadJson = CancellablePromise;\n// export type Download = DownloadBlob/* | DownloadJson */;\nexport type Download = DownloadBlob | DownloadUrl/* | DownloadJson */;\n\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\nexport type ProgressCallback = (details: Progress) => void;\n\ntype DownloadType = 'url' | 'blob' | 'void' | 'disc';\n\nexport class AppDownloadManager {\n private downloads: {[fileName: string]: {main: Download} & {[type in DownloadType]?: Download}} = {};\n // private downloadsToDisc: {[fileName: string]: Download} = {};\n private progress: {[fileName: string]: Progress} = {};\n // private progressCallbacks: {[fileName: string]: Array} = {};\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n rootScope.addEventListener('download_progress', (details) => {\n // const callbacks = this.progressCallbacks[details.fileName];\n // if(callbacks) {\n // callbacks.forEach((callback) => callback(details));\n // }\n\n const download = this.downloads[details.fileName];\n if(download?.main?.notifyAll) {\n this.progress[details.fileName] = details;\n download.main.notifyAll(details);\n }\n });\n }\n\n private getNewDeferred(fileName: string, type?: DownloadType) {\n const deferred = deferredPromise();\n\n let download = this.downloads[fileName];\n if(!download) {\n download = this.downloads[fileName] = {\n main: deferred as any\n };\n\n deferred.cancel = () => {\n const error = makeError('DOWNLOAD_CANCELED');\n\n this.managers.apiFileManager.cancelDownload(fileName);\n\n deferred.reject(error);\n deferred.cancel = noop;\n };\n\n deferred.catch(() => {\n this.clearDownload(fileName, type);\n }).finally(() => {\n delete this.progress[fileName];\n // delete this.progressCallbacks[fileName];\n });\n } else {\n const main = download.main;\n (['cancel', 'addNotifyListener', 'notify', 'notifyAll'] as (keyof CancellablePromise)[]).forEach((key) => {\n if(!main[key]) {\n return;\n }\n\n // @ts-ignore\n deferred[key] = main[key].bind(main);\n });\n }\n\n const haveToClear = type === 'disc';\n if(haveToClear) {\n deferred.catch(noop).finally(() => {\n this.clearDownload(fileName, type);\n });\n }\n\n return download[type] = deferred as any;\n }\n\n public getNewDeferredForUpload>(fileName: string, promise: T) {\n const deferred = this.getNewDeferred(fileName);\n promise.then(deferred.resolve, deferred.reject);\n\n deferred.finally(() => {\n this.clearDownload(fileName);\n });\n\n return deferred as CancellablePromise>;\n }\n\n private clearDownload(fileName: string, type?: DownloadType) {\n const downloads = this.downloads[fileName];\n if(!downloads) {\n return;\n }\n\n delete downloads[type];\n\n const length = Object.keys(downloads).length;\n if(!length || (downloads.main && length === 1)) {\n delete this.downloads[fileName];\n }\n }\n\n public getUpload(fileName: string): ReturnType['promise'] {\n let deferred: CancellablePromise = this.getDownload(fileName);\n if(deferred) {\n return deferred;\n }\n\n deferred = this.getNewDeferred(fileName);\n this.managers.appMessagesManager.getUploadPromise(fileName).then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n /* public fakeDownload(fileName: string, value: Blob | string) {\n const deferred = this.getNewDeferred(fileName);\n if(typeof(value) === 'string') {\n fetch(value)\n .then((response) => response.blob())\n .then((blob) => deferred.resolve(blob));\n } else {\n deferred.resolve(value);\n }\n\n return deferred;\n } */\n\n private d(fileName: string, getPromise: () => Promise, type?: DownloadType) {\n let deferred = this.getDownload(fileName, type);\n if(deferred) return deferred;\n\n deferred = this.getNewDeferred(fileName, type);\n getPromise().then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n public download(options: DownloadOptions): DownloadBlob {\n const fileName = getDownloadFileNameFromOptions(options);\n return this.d(fileName, () => this.managers.apiFileManager.download(options), 'blob') as any;\n }\n\n public downloadMedia(options: DownloadMediaOptions, type: DownloadType = 'blob', promiseBefore?: Promise): DownloadBlob {\n const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n\n return this.d(fileName, () => {\n let cb: any;\n if(type === 'url') {\n cb = this.managers.apiFileManager.downloadMediaURL;\n } else if(type === 'void'/* || type === 'disc' */) {\n cb = this.managers.apiFileManager.downloadMediaVoid;\n } else /* if(type === 'blob') */ {\n cb = this.managers.apiFileManager.downloadMedia;\n }\n\n if(promiseBefore) {\n return promiseBefore.then(() => cb(options));\n }\n\n return cb(options);\n }, type) as any;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): DownloadUrl {\n return this.downloadMedia(options, 'url') as any;\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions): DownloadBlob {\n return this.downloadMedia(options, 'void');\n }\n\n public upload(file: File | Blob, fileName?: string, promise?: Promise) {\n if(!fileName) {\n fileName = getFileNameForUpload(file);\n }\n\n if(!promise) {\n promise = this.managers.apiFileManager.upload({file, fileName});\n }\n\n const deferred = this.getNewDeferredForUpload(fileName, promise);\n return deferred as any as CancellablePromise;\n }\n\n public getDownload(fileName: string, type?: DownloadType) {\n const d = this.downloads[fileName];\n return d && d[type];\n }\n\n // public addProgressCallback(fileName: string, callback: ProgressCallback) {\n // const progress = this.progress[fileName];\n // (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\n\n // if(progress) {\n // callback(progress);\n // }\n // }\n\n public downloadToDisc(options: DownloadMediaOptions, justAttach?: boolean) {\n const media = options.media;\n const isDocument = media._ === 'document';\n if(!isDocument && !options.thumb) {\n options.thumb = (media as Photo.photo).sizes.slice().pop() as PhotoSize.photoSize;\n }\n\n // const {fileName: cacheFileName} = getDownloadMediaDetails(options);\n // if(justAttach) {\n // const promise = this.downloadsToDisc[cacheFileName];\n // if(promise) {\n // return promise;\n // }\n // }\n\n // const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n // if(downloadOptions.size && downloadOptions.size > MAX_FILE_SAVE_SIZE) {\n const id = '' + (Math.random() * 0x7FFFFFFF | 0);\n // const id = 'test';\n const url = `download/${id}`;\n options.downloadId = id;\n\n const pingPromise = apiManagerProxy.pingServiceWorkerWithIframe();\n\n const promise = this.downloadMedia(options, 'disc', pingPromise);\n // this.downloadsToDisc[cacheFileName] = promise;\n\n if(justAttach) {\n return promise;\n }\n\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n\n pingPromise.then(() => {\n iframe.src = url;\n document.body.append(iframe);\n });\n\n // createDownloadAnchor(url, 'asd.txt');\n\n // const events = [\n // 'emptied',\n // 'abort',\n // 'suspend',\n // 'reset',\n // 'error',\n // 'ended',\n // 'load'\n // ].forEach((event) => {\n // iframe.addEventListener(event, () => alert(event));\n // iframe.contentWindow.addEventListener(event, () => alert(event));\n // });\n\n let element: HTMLElement, hadProgress = false;\n const onProgress = () => {\n if(hadProgress) {\n return;\n }\n\n hadProgress = true;\n element = iframe;\n\n indexOfAndSplice(promise.listeners, onProgress);\n };\n\n promise.addNotifyListener(onProgress);\n promise.then((blob) => {\n if(!blob) {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n const downloadOptions = isDocument ?\n getDocumentDownloadOptions(media) :\n getPhotoDownloadOptions(media as any, options.thumb as PhotoSize.photoSize);\n const fileName = (options.media as MyDocument).file_name || getFileNameByLocation(downloadOptions.location);\n createDownloadAnchor(url, downloadOptions.fileName || fileName, () => {\n URL.revokeObjectURL(url);\n });\n }).catch(noop).finally(() => {\n if(!hadProgress) {\n onProgress();\n }\n\n setTimeout(() => {\n element?.remove();\n }, 1000);\n\n // if(this.downloadsToDisc[cacheFileName] === promise) {\n // delete this.downloadsToDisc[cacheFileName];\n // }\n });\n\n return promise;\n }\n}\n\nconst appDownloadManager = new AppDownloadManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\nexport default appDownloadManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.target = '_blank';\n\n a.style.position = 'absolute';\n a.style.top = '1px';\n a.style.left = '1px';\n\n document.body.append(a);\n\n try {\n const clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n a.dispatchEvent(clickEvent);\n } catch(e) {\n console.error('Download click error', e);\n try {\n a.click();\n } catch(e) {\n window.open(url as string, '_blank');\n }\n }\n\n setTimeout(() => {\n a.remove();\n onRemove && onRemove();\n }, 100);\n}\n","/*\n * 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// import { generatePathData } from \"../../helpers/dom\";\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type Chat from './chat';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport AvatarElement from '../avatar';\nimport {Message} from '../../layer';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {SERVICE_AS_REGULAR, STICKY_OFFSET} from './bubbles';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport partition from '../../helpers/array/partition';\nimport noop from '../../helpers/noop';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\n\ntype GroupItem = {\n bubble: HTMLElement,\n fromId: PeerId,\n mid: number,\n groupMid?: number,\n timestamp: number,\n dateTimestamp: number,\n mounted: boolean,\n single: boolean,\n group?: BubbleGroup,\n message: Message.message | Message.messageService // use it only to set avatar\n};\n\nclass BubbleGroup {\n container: HTMLElement;\n chat: Chat;\n groups: BubbleGroups;\n items: GroupItem[]; // descend sorted\n avatarContainer: HTMLElement;\n avatarLoadPromise: ReturnType;\n avatar: AvatarElement;\n mounted: boolean;\n dateTimestamp: number;\n offset: number;\n\n constructor(chat: Chat, groups: BubbleGroups, dateTimestamp: number) {\n this.container = document.createElement('div');\n this.container.classList.add('bubbles-group');\n this.chat = chat;\n this.groups = groups;\n this.items = [];\n this.dateTimestamp = dateTimestamp;\n this.offset = 0;\n }\n\n createAvatar(message: Message.message | Message.messageService) {\n if(this.avatarLoadPromise) {\n return this.avatarLoadPromise;\n } else if(message._ === 'messageService') {\n return;\n }\n\n this.avatarContainer = document.createElement('div');\n this.avatarContainer.classList.add('bubbles-group-avatar-container');\n ++this.offset;\n\n const fwdFrom = message.fwd_from;\n const fwdFromId = message.fwdFromId;\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\n const currentPeerId = this.chat.peerId;\n const avatar = this.avatar = new AvatarElement();\n this.avatar.classList.add('bubbles-group-avatar', 'user-avatar', 'avatar-40'/* , 'can-zoom-fade' */);\n const peerId = ((fwdFrom && (currentPeerId === rootScope.myId || currentPeerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID;\n const avatarLoadPromise = this.avatar.updateWithOptions({\n lazyLoadQueue: this.chat.bubbles.lazyLoadQueue,\n peerId,\n peerTitle: !fwdFromId && fwdFrom && fwdFrom.from_name ? /* '🔥 FF 🔥' */fwdFrom.from_name : undefined\n });\n\n // this.avatarLoadPromise = Promise.all([\n // avatarLoadPromise,\n // peerId && peerId.isUser() ? this.chat.managers.appUsersManager.getUser(peerId.toUserId()) : undefined\n // ]).then(([result, user]) => {\n // if(user?.pFlags?.premium) {\n // avatar.classList.add('is-premium', 'tgico-star');\n // }\n\n // return result;\n // });\n this.avatarLoadPromise = avatarLoadPromise;\n\n this.avatarContainer.append(this.avatar);\n this.container.append(this.avatarContainer);\n\n return this.avatarLoadPromise;\n }\n\n get firstTimestamp() {\n return this.firstItem.timestamp;\n }\n\n get firstMid() {\n return this.firstItem.mid;\n }\n\n get firstItem() {\n return this.items[this.items.length - 1];\n }\n\n get lastTimestamp() {\n return this.lastItem.timestamp;\n }\n\n get lastMid() {\n return this.lastItem.mid;\n }\n\n get lastItem() {\n return this.items[0];\n }\n\n updateClassNames() {\n const items = this.items;\n const length = items.length;\n if(!length) {\n return;\n }\n\n // const elements = Array.from(this.container.children);\n // if(this.offset) elements.splice(0, this.offset);\n\n // const length = elements.length;\n // if(!length) {\n // return;\n // }\n\n const first = items[length - 1].bubble;\n\n if(items.length === 1) {\n first.classList.add('is-group-first', 'is-group-last');\n // this.setClipIfNeeded(first);\n return;\n } else {\n first.classList.remove('is-group-last');\n first.classList.add('is-group-first');\n // this.setClipIfNeeded(first, true);\n }\n\n for(let i = 1, _length = length - 1; i < _length; ++i) {\n const bubble = items[i].bubble;\n bubble.classList.remove('is-group-last', 'is-group-first');\n // this.setClipIfNeeded(bubble, true);\n }\n\n const last = items[0].bubble;\n last.classList.remove('is-group-first');\n last.classList.add('is-group-last');\n // this.setClipIfNeeded(last);\n }\n\n insertItem(item: GroupItem) {\n const {items} = this;\n insertInDescendSortedArray(items, item, this.groups.sortGroupItemsKey);\n\n item.group = this;\n if(items.length === 1) {\n this.groups.insertGroup(this);\n }\n }\n\n removeItem(item: GroupItem) {\n indexOfAndSplice(this.items, item);\n\n if(!this.items.length) {\n indexOfAndSplice(this.groups.groups, this);\n }\n\n item.group = undefined;\n }\n\n mount(updateClassNames?: boolean) {\n if(!this.groups.groups.includes(this) || !this.items.length) { // group can be already removed\n debugger;\n\n if(this.mounted) {\n this.onItemUnmount();\n }\n\n return;\n }\n\n const {offset, items} = this;\n const {length} = items;\n forEachReverse(items, (item, idx) => {\n this.mountItem(item, length - 1 - idx, offset);\n });\n\n if(updateClassNames) {\n this.updateClassNames();\n }\n\n this.onItemMount();\n }\n\n mountItem(item: GroupItem, idx = this.items.indexOf(item), offset = this.offset) {\n if(item.mounted) {\n return;\n }\n\n positionElementByIndex(item.bubble, this.container, offset + idx);\n item.mounted = true;\n }\n\n unmountItem(item: GroupItem) {\n if(!item.mounted) {\n return;\n }\n\n item.bubble.remove();\n item.mounted = false;\n this.onItemUnmount();\n }\n\n onItemMount() {\n if(this.mounted) {\n return;\n }\n\n const dateContainer = this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp / 1000);\n // const idx = this.groups.indexOf(group);\n const dateGroups = this.groups.groups.filter((_group) => _group.dateTimestamp === this.dateTimestamp);\n const dateGroupsLength = dateGroups.length;\n const idx = dateGroups.indexOf(this);\n const unmountedLength = dateGroups.slice(idx + 1).reduce((acc, v) => acc + (v.mounted ? 0 : 1), 0);\n positionElementByIndex(this.container, dateContainer.container, STICKY_OFFSET + dateGroupsLength - 1 - idx - unmountedLength);\n this.mounted = true;\n }\n\n onItemUnmount() {\n if(!this.mounted) {\n return;\n }\n\n if(!this.items.length) {\n this.container.remove();\n this.chat.bubbles.deleteEmptyDateGroups();\n this.mounted = false;\n } else {\n this.updateClassNames();\n }\n }\n}\n\n// class BubbleGroupItem implements GroupItem {\n// bubble: HTMLElement;\n// fromId: PeerId;\n// mid: number;\n// timestamp: number;\n// dateTimestamp: number;\n// mounted: boolean;\n// single: boolean;\n// group: BubbleGroup;\n\n// constructor(details: GroupItem) {\n// Object.assign(this, details);\n// }\n// }\n\nexport default class BubbleGroups {\n public itemsArr: Array = []; // descend sorted\n private itemsMap: Map = new Map();\n public groups: Array = []; // descend sorted\n private newGroupDiff = 121; // * 121 in scheduled messages\n private sortItemsKey: Extract;\n private sortGroupsKey: Extract;\n public sortGroupItemsKey: Extract;\n\n constructor(private chat: Chat) {\n this.sortItemsKey = chat.type === 'scheduled' ? 'timestamp' : 'mid';\n this.sortGroupsKey = chat.type === 'scheduled' ? 'lastTimestamp' : 'lastMid';\n this.sortGroupItemsKey = /* chat.type === 'scheduled' ? 'timestamp' : */'groupMid';\n }\n\n removeItem(item: GroupItem) {\n item.group?.removeItem(item);\n this.removeItemFromCache(item);\n }\n\n removeAndUnmountBubble(bubble: HTMLElement) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n if(bubble.parentElement) {\n bubble.remove(); // * can be a placeholder\n }\n\n return false;\n }\n\n const items = this.itemsArr;\n const index = items.indexOf(item);\n const siblings = this.getSiblingsAtIndex(index, items);\n\n const group = item.group;\n this.removeItem(item);\n\n const modifiedGroups: Set = new Set();\n if(group) {\n group.unmountItem(item);\n modifiedGroups.add(group);\n }\n\n const [previousSibling, nextSibling] = siblings;\n if(\n previousSibling &&\n nextSibling &&\n this.canItemsBeGrouped(previousSibling, nextSibling) &&\n previousSibling.group !== nextSibling.group\n ) {\n const group = nextSibling.group;\n this.f(nextSibling.group.items);\n group.onItemUnmount();\n modifiedGroups.add(previousSibling.group);\n this.groupUngrouped();\n }\n\n this.mountUnmountGroups(Array.from(modifiedGroups));\n\n return true;\n }\n\n mountUnmountGroups(groups: BubbleGroup[]) {\n // groups.sort((a, b) => (b.lastItem?.mid ?? 0) - (a.lastItem?.mid ?? 0));\n\n const [toMount, toUnmount] = partition(groups, (group) => !!group.items.length);\n toUnmount.forEach((group) => {\n group.onItemUnmount();\n })\n\n toMount.forEach((group) => {\n group.mount(true);\n });\n\n // toMount.forEach((group) => {\n // group.updateClassNames();\n // });\n }\n\n f(items: GroupItem[], index: number = 0, length = items.length) {\n for(; index < length; ++index) {\n const item = items[index];\n item.mounted = false;\n item.group.removeItem(item);\n --length;\n --index;\n }\n }\n\n getItemByBubble(bubble: HTMLElement) {\n return this.itemsMap.get(bubble);\n }\n\n getLastGroup() {\n return this.groups[0];\n }\n\n changeBubbleMid(bubble: HTMLElement, mid: number) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n return;\n }\n\n item.mid = mid;\n\n // indexOfAndSplice(item.group.items, item);\n // // const canChangeGroupMid = !item.group.items.length || item.group.items.every((item) => item.groupMid === item.mid);\n // // if(canChangeGroupMid) item.groupMid = mid;\n // item.group.insertItem(item);\n\n indexOfAndSplice(this.itemsArr, item);\n this.insertItemToArray(item, this.itemsArr);\n }\n\n changeItemBubble(item: GroupItem, bubble: HTMLElement) {\n this.itemsMap.delete(item.bubble);\n item.bubble = bubble;\n this.itemsMap.set(bubble, item);\n }\n\n changeBubbleByBubble(from: HTMLElement, to: HTMLElement) {\n const item = this.getItemByBubble(from);\n if(!item) {\n return;\n }\n\n this.changeItemBubble(item, to);\n }\n\n canItemsBeGrouped(item1: GroupItem, item2: GroupItem) {\n return item2.fromId === item1.fromId &&\n Math.abs(item2.timestamp - item1.timestamp) <= this.newGroupDiff &&\n item1.dateTimestamp === item2.dateTimestamp &&\n !item1.single &&\n !item2.single &&\n (!this.chat.isAllMessagesForum || getMessageThreadId(item1.message, true) === getMessageThreadId(item2.message, true));\n }\n\n getSiblingsAtIndex(itemIndex: number, items: GroupItem[]) {\n return [items[itemIndex - 1], items[itemIndex + 1]] as const;\n }\n\n // findGroupSiblingInSiblings(item: GroupItem, siblings: ReturnType) {\n // return siblings.find((sibling) => sibling && this.canItemsBeGrouped(item, sibling));\n // }\n\n findGroupSiblingByItem(item: GroupItem, items: GroupItem[]) {\n items = items.slice();\n const idx = this.insertItemToArray(item, items);\n // return this.findGroupSiblingInSiblings(item, this.getSiblingsAtIndex(idx, items));\n return this.findGroupSiblingInItems(item, items, idx);\n }\n\n findGroupSiblingInItems(item: GroupItem, items: GroupItem[], index = items.indexOf(item), length = items.length) {\n const previousItem = items[index - 1];\n let siblingGroupedItem: GroupItem;\n if(previousItem?.group && this.canItemsBeGrouped(item, previousItem)) {\n siblingGroupedItem = previousItem;\n } else {\n for(let k = index + 1; k < length; ++k) {\n const nextItem = items[k];\n if(this.canItemsBeGrouped(item, nextItem)) {\n if(nextItem.group) {\n siblingGroupedItem = nextItem;\n }\n } else {\n break;\n }\n }\n }\n\n return siblingGroupedItem;\n }\n\n addItemToGroup(item: GroupItem, group: BubbleGroup) {\n group.insertItem(item);\n this.addItemToCache(item);\n }\n\n insertItemToArray(item: GroupItem, array: GroupItem[]) {\n return insertInDescendSortedArray(array, item, this.sortItemsKey);\n }\n\n insertGroup(group: BubbleGroup) {\n return insertInDescendSortedArray(this.groups, group, this.sortGroupsKey);\n }\n\n addItemToCache(item: GroupItem) {\n this.insertItemToArray(item, this.itemsArr);\n this.itemsMap.set(item.bubble, item);\n }\n\n removeItemFromCache(item: GroupItem) {\n indexOfAndSplice(this.itemsArr, item);\n this.itemsMap.delete(item.bubble);\n }\n\n getMessageFromId(message: MyMessage) {\n let fromId = message.viaBotId || message.fromId;\n\n // fix for saved messages forward to self\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as Message.message).fwdFromId === fromId) {\n fromId = fromId.toPeerId(true);\n }\n\n return fromId;\n }\n\n createItem(bubble: HTMLElement, message: MyMessage) {\n const single = !(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._)));\n const {mid, date: timestamp} = message;\n const {dateTimestamp} = this.chat.bubbles.getDateForDateContainer(timestamp);\n const item: GroupItem = {\n mid,\n groupMid: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : mid,\n fromId: this.getMessageFromId(message),\n bubble,\n // timestamp: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : timestamp,\n timestamp,\n dateTimestamp,\n mounted: false,\n single,\n message\n };\n\n return item;\n }\n\n splitSiblingsOnGrouping(siblings: ReturnType) {\n const [previousSibling, nextSibling] = siblings;\n const previousGroup = previousSibling?.group;\n const nextGroup = nextSibling?.group;\n\n if(!previousGroup) {\n return;\n }\n\n // will refresh group\n // if(previousGroup === nextGroup) {\n const items = previousGroup.items;\n const index = items.indexOf(previousSibling) + 1;\n const length = items.length;\n if(index === length) {\n return;\n }\n\n const modifiedGroups: BubbleGroup[] = [previousGroup];\n // if(previousGroup !== nextGroup && nextGroup) {\n // modifiedGroups.push(nextGroup);\n // }\n\n this.f(items, index, length);\n return modifiedGroups;\n // }\n }\n\n prepareForGrouping(bubble: HTMLElement, message: MyMessage) {\n const foundItem = this.getItemByBubble(bubble);\n if(foundItem) { // should happen only on edit\n // debugger;\n return;\n }\n\n const item = this.createItem(bubble, message);\n this.addItemToCache(item);\n }\n\n groupUngrouped() {\n const items = this.itemsArr;\n const length = items.length;\n const modifiedGroups: Set = new Set();\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const item = items[i];\n if(item.group) {\n continue;\n }\n\n let hadGroup = true;\n const siblings = this.getSiblingsAtIndex(i, items);\n const siblingGroupedItem = this.findGroupSiblingInItems(item, items, i, length);\n\n // const foundItem = this.findGroupSiblingInSiblings(item, siblings);\n const foundItem = siblingGroupedItem;\n const group = foundItem?.group ?? (hadGroup = false, new BubbleGroup(this.chat, this, item.dateTimestamp));\n\n modifiedGroups.add(group);\n group.insertItem(item);\n\n if(!hadGroup) {\n const splittedGroups = this.splitSiblingsOnGrouping(siblings);\n if(splittedGroups) {\n splittedGroups.forEach((group) => modifiedGroups.add(group));\n }\n }\n }\n\n return modifiedGroups;\n }\n\n // addBubble(bubble: HTMLElement, message: MyMessage, unmountIfFound?: boolean) {\n // const oldItem = this.getItemByBubble(bubble);\n // if(unmountIfFound) { // updating position\n // this.removeAndUnmountBubble(bubble);\n // } else if(oldItem) { // editing\n // const group = oldItem.group;\n // this.changeItemBubble(oldItem, bubble);\n // oldItem.mounted = false;\n\n // return {item: oldItem, group};\n // }\n\n // const item = this.createItem(bubble, message);\n\n // const foundItem = this.findSameGroupItem(item, this.itemsArr);\n\n // const group = foundItem?.group ?? new BubbleGroup(this.chat, this, item.dateTimestamp);\n // this.addItemToGroup(item, group);\n\n // return {item, group};\n // }\n\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\n //console.log('setClipIfNeeded', bubble, remove);\n const className = bubble.className;\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\n //console.log('setClipIfNeeded', bubble, remove, container);\n if(!container) return;\n\n try {\n Array.from(container.children).forEach((object) => {\n if(object instanceof SVGDefsElement) return;\n\n if(remove) {\n object.removeAttributeNS(null, 'clip-path');\n } else {\n let clipId = container.dataset.clipId;\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\n let width = +object.getAttributeNS(null, 'width');\n let height = +object.getAttributeNS(null, 'height');\n let isOut = className.includes('is-out');\n let isReply = className.includes('is-reply');\n let d = '';\n\n //console.log('setClipIfNeeded', object, width, height, isOut);\n\n let tr: number, tl: number;\n if(className.includes('forwarded') || isReply) {\n tr = tl = 0;\n } else if(isOut) {\n tr = className.includes('is-group-first') ? 12 : 6;\n tl = 12;\n } else {\n tr = 12;\n tl = className.includes('is-group-first') ? 12 : 6;\n }\n\n if(isOut) {\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\n } else {\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\n }\n\n path.setAttributeNS(null, 'd', d);\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\n }\n });\n } catch(err) {}\n }\n } */\n\n // updateGroupByMessageId(mid: number) {\n // const item = this.itemsArr.find((g) => g.mid === mid);\n // if(item) {\n // item.group.updateGroup();\n // }\n // }\n\n cleanup() {\n this.itemsArr = [];\n this.groups = [];\n this.itemsMap.clear();\n }\n\n // findIncorrentPositions() {\n // var bubbles = Array.from(this.chat.bubbles.chatInner.querySelectorAll('.bubbles-group .bubble')).reverse();\n // var items = this.itemsArr;\n // for(var i = 0, length = items.length; i < length; ++i) {\n // const item = items[i];\n // const foundBubble = bubbles[i];\n // if(item.bubble !== foundBubble) {\n // console.log('incorrect position', i, item, foundBubble);\n // // debugger;\n // // break;\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\nexport default function partition(arr: T[], callback: (item: T, idx: number, arr: T[]) => boolean) {\n const good: T[] = [], bad: T[] = [];\n for(let i = 0, length = arr.length; i < length; ++i) {\n const item = arr[i];\n (callback(item, i, arr) ? good : bad).push(item);\n }\n\n return [good, bad];\n}\n","/*\n * 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, {PopupOptions} from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport InputField from '../inputField';\n\nexport default class PopupDatePicker extends PopupElement {\n protected controlsDiv: HTMLElement;\n protected monthTitle: HTMLElement;\n protected prevBtn: HTMLElement;\n protected nextBtn: HTMLElement;\n\n protected monthsContainer: HTMLElement;\n protected month: HTMLElement;\n\n protected minMonth: Date;\n protected maxMonth: Date;\n protected minDate: Date;\n protected maxDate: Date;\n protected selectedDate: Date;\n protected selectedMonth: Date;\n protected selectedEl: HTMLElement;\n\n protected timeDiv: HTMLDivElement;\n protected hoursInputField: InputField;\n protected minutesInputField: InputField;\n\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\n noButtons: true,\n noTitle: true,\n minDate: Date,\n maxDate: Date\n withTime: true,\n showOverflowMonths: true\n }> & PopupOptions = {}) {\n super('popup-date-picker', {\n body: true,\n overlayClosable: true,\n buttons: options.noButtons ? [] : [{\n langKey: 'JumpToDate',\n callback: () => {\n if(this.onPick) {\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n }\n }, {\n langKey: 'Cancel',\n isCancel: true\n }],\n title: true,\n ...options\n });\n\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\n\n if(initDate < this.minDate) {\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\n }\n\n // Controls\n this.controlsDiv = document.createElement('div');\n this.controlsDiv.classList.add('date-picker-controls');\n\n this.prevBtn = document.createElement('button');\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\n\n this.nextBtn = document.createElement('button');\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\n\n this.monthTitle = document.createElement('div');\n this.monthTitle.classList.add('date-picker-month-title');\n\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\n\n // Month\n this.monthsContainer = document.createElement('div');\n this.monthsContainer.classList.add('date-picker-months');\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.controlsDiv, this.monthsContainer);\n\n // Time inputs\n if(options.withTime) {\n this.timeDiv = document.createElement('div');\n this.timeDiv.classList.add('date-picker-time');\n\n const delimiter = document.createElement('div');\n delimiter.classList.add('date-picker-time-delimiter');\n delimiter.append(':');\n\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\n const maxString = '' + max;\n this.listenerSetter.add(inputField.input)('input', (e) => {\n let value = inputField.value.replace(/\\D/g, '');\n if(value.length > 2) {\n value = value.slice(0, 2);\n } else {\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\n if(value.length === 2 && onOverflow) {\n onOverflow(+value[1]);\n }\n\n value = '0' + value[0];\n }\n }\n\n inputField.setValueSilently(value);\n onInput(value.length);\n });\n };\n\n this.hoursInputField = new InputField({plainText: true});\n this.minutesInputField = new InputField({plainText: true});\n\n handleTimeInput(23, this.hoursInputField, (length) => {\n if(length === 2) {\n this.minutesInputField.input.focus();\n }\n\n this.setTimeTitle();\n }, (number) => {\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\n });\n handleTimeInput(59, this.minutesInputField, (length) => {\n if(!length) {\n this.hoursInputField.input.focus();\n }\n\n this.setTimeTitle();\n });\n\n this.selectedDate = initDate;\n\n initDate.setMinutes(initDate.getMinutes() + 10);\n\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\n\n initDate.setHours(0, 0, 0, 0);\n\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\n\n attachClickEvent(this.btnConfirm, () => {\n if(this.onPick) {\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n\n this.hide();\n }, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.timeDiv);\n\n this.prevBtn.classList.add('primary');\n this.nextBtn.classList.add('primary');\n }\n\n const popupCenterer = document.createElement('div');\n popupCenterer.classList.add('popup-centerer');\n popupCenterer.append(this.container);\n this.element.append(popupCenterer);\n\n // const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\n // this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\n initDate.setHours(0, 0, 0, 0);\n this.selectedDate = initDate;\n\n this.maxDate = options.maxDate || new Date();\n this.maxDate.setHours(0, 0, 0, 0);\n\n this.selectedMonth = new Date(this.selectedDate);\n this.selectedMonth.setDate(1);\n\n this.maxMonth = new Date(this.maxDate);\n this.maxMonth.setDate(1);\n\n this.minMonth = new Date(this.minDate);\n this.minMonth.setHours(0, 0, 0, 0);\n this.minMonth.setDate(1);\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n if(options.noTitle) {\n this.setTitle = () => {};\n }\n\n this.setTimeTitle();\n this.setTitle();\n this.setMonth();\n }\n\n onPrevClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n this.nextBtn.removeAttribute('disabled');\n };\n\n onNextClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n this.prevBtn.removeAttribute('disabled');\n };\n\n onDateClick = (e: MouseEvent) => {\n // cancelEvent(e);\n const target = e.target as HTMLElement;\n\n if(!target.dataset.timestamp) return;\n\n if(this.selectedEl) {\n if(this.selectedEl === target) return;\n this.selectedEl.classList.remove('active');\n }\n\n this.selectedEl = target;\n\n target.classList.add('active');\n const timestamp = +target.dataset.timestamp;\n\n this.selectedDate = new Date(timestamp);\n\n this.setTitle();\n this.setTimeTitle();\n };\n\n public setTimeTitle() {\n if(this.btnConfirm && this.selectedDate) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const date = new Date();\n date.setHours(0, 0, 0, 0);\n\n const timeOptions: Intl.DateTimeFormatOptions = {\n minute: '2-digit',\n hour: '2-digit'\n };\n\n const sendDate = new Date(this.selectedDate.getTime());\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\n\n if(this.selectedDate.getTime() === date.getTime()) {\n key = 'Schedule.SendToday';\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\n dayStr = 'Tomorrow';\n } */ else {\n key = 'Schedule.SendDate';\n\n const dateOptions: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: 'numeric'\n };\n\n if(sendDate.getFullYear() !== date.getFullYear()) {\n dateOptions.year = 'numeric';\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: dateOptions\n }).element);\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: timeOptions\n }).element);\n\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\n }\n }\n\n public setTitle() {\n // const splitted = this.selectedDate.toString().split(' ', 3);\n // this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\n this.title.textContent = '';\n this.title.append(new I18n.IntlDateElement({\n date: this.selectedDate,\n options: {\n day: 'numeric',\n month: 'long',\n weekday: 'short'\n }\n }).element);\n }\n\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\n const el = document.createElement('button');\n el.classList.add('btn-icon', 'date-picker-month-date');\n\n if(disabled) {\n el.setAttribute('disabled', 'true');\n }\n\n if(innerText) {\n el.append(innerText);\n }\n\n return el;\n }\n\n public setMonth() {\n const firstDate = new Date(this.selectedMonth);\n\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\n };\n\n this.monthTitle.textContent = '';\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\n // this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\n\n if(this.month) {\n this.month.remove();\n }\n\n this.month = document.createElement('div');\n this.month.classList.add('date-picker-month');\n\n const weekStartDate = new Date();\n const day = weekStartDate.getDay();\n if(day !== 1) {\n weekStartDate.setHours(-24 * (day - 1));\n }\n\n for(let i = 0; i < 7; ++i) {\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\n el.classList.remove('date-picker-month-date');\n el.classList.add('date-picker-month-day');\n this.month.append(el);\n weekStartDate.setDate(weekStartDate.getDate() + 1);\n }\n\n // 0 - sunday\n let dayIndex = firstDate.getDay() - 1;\n if(dayIndex === -1) dayIndex = 7 - 1;\n\n const clonedDate = new Date(firstDate.getTime());\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\n\n // Padding first week\n for(let i = 0; i < dayIndex; ++i) {\n if(this.options.showOverflowMonths) {\n clonedDate.setDate(clonedDate.getDate() + 1);\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\n } else {\n this.month.append(this.renderElement(true));\n }\n }\n\n do {\n const date = firstDate.getDate();\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\n el.dataset.timestamp = '' + firstDate.getTime();\n\n if(firstDate.getTime() === this.selectedDate.getTime()) {\n this.selectedEl = el;\n el.classList.add('active');\n }\n\n this.month.append(el);\n\n firstDate.setDate(date + 1);\n } while(firstDate.getDate() !== 1);\n\n const remainder = this.month.childElementCount % 7;\n if(this.options.showOverflowMonths && remainder) {\n for(let i = remainder; i < 7; ++i) {\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\n firstDate.setDate(firstDate.getDate() + 1);\n }\n }\n\n const lines = Math.ceil(this.month.childElementCount / 7);\n this.container.dataset.lines = '' + lines;\n\n this.monthsContainer.append(this.month);\n }\n}\n","/*\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 DivAndCaption {\n public container: HTMLElement;\n public border: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLElement;\n\n constructor(protected className: string, public fill?: T) {\n this.container = document.createElement('div');\n this.container.className = className;\n\n this.border = document.createElement('div');\n this.border.classList.add(className + '-border');\n\n this.content = document.createElement('div');\n this.content.classList.add(className + '-content');\n\n this.title = document.createElement('div');\n this.title.classList.add(className + '-title');\n this.title.setAttribute('dir', 'auto');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add(className + '-subtitle');\n this.subtitle.setAttribute('dir', 'auto');\n\n this.content.append(this.title, this.subtitle);\n this.container.append(this.border, this.content);\n }\n}\n","/*\n * 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 {Middleware} from '../../helpers/middleware';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Document, Message, MessageMedia, Photo, WebPage} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport DivAndCaption from '../divAndCaption';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapVideo from '../wrappers/video';\nimport {AnimationItemGroup} from '../animationIntersector';\n\nconst MEDIA_SIZE = 32;\n\nexport async function wrapReplyDivAndCaption(options: {\n title: string | HTMLElement | DocumentFragment,\n titleEl: HTMLElement,\n subtitle: string | HTMLElement | DocumentFragment,\n subtitleEl: HTMLElement,\n message: Message.message | Message.messageService,\n mediaEl: HTMLElement,\n loadPromises?: Promise[],\n animationGroup: AnimationItemGroup\n}) {\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises, animationGroup} = options;\n if(title !== undefined) {\n if(typeof(title) === 'string') {\n title = limitSymbols(title, 140);\n title = wrapEmojiText(title);\n }\n\n replaceContent(titleEl, title);\n }\n\n if(!loadPromises) {\n loadPromises = [];\n }\n\n let messageMedia: MessageMedia | WebPage.webPage = (message as Message.message)?.media;\n let setMedia = false, isRound = false;\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\n let middleware: Middleware;\n if(messageMedia && mediaEl) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message, animationGroup, withoutMediaType: true}));\n\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || messageMedia;\n const photo = (messageMedia as MessageMedia.messageMediaPhoto).photo as Photo.photo;\n const document = (messageMedia as MessageMedia.messageMediaDocument).document as Document.document;\n if(photo || (document && document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(document.type) !== -1) */) {\n middleware = appImManager.chat.bubbles.getMiddleware();\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\n\n if(document?.type === 'sticker') {\n await wrapSticker({\n doc: document,\n div: mediaEl,\n lazyLoadQueue,\n group: animationGroup,\n // onlyThumb: document.sticker === 2,\n width: MEDIA_SIZE,\n height: MEDIA_SIZE,\n middleware,\n loadPromises\n });\n setMedia = true;\n } else if(document?.type === 'gif' && document.video_thumbs) {\n setMedia = true;\n await wrapVideo({\n doc: document,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n lazyLoadQueue,\n noPlayButton: true,\n noInfo: true,\n middleware,\n loadPromises,\n withoutPreloader: true,\n videoSize: document.video_thumbs[0],\n group: animationGroup\n });\n } else {\n const m = photo || document;\n isRound = document?.type === 'round';\n\n try {\n await wrapPhoto({\n photo: m,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n size: choosePhotoSize(m, MEDIA_SIZE, MEDIA_SIZE),\n middleware,\n lazyLoadQueue,\n noBlur: true,\n withoutPreloader: true,\n loadPromises\n });\n setMedia = true;\n } catch(err) {\n\n }\n }\n }\n } else {\n if(message) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message}));\n } else {\n if(typeof(subtitle) === 'string') {\n subtitle = limitSymbols(subtitle, 140);\n subtitle = wrapEmojiText(subtitle);\n }\n\n replaceContent(subtitleEl, subtitle || '');\n }\n }\n\n Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n mediaChildren.forEach((child) => child.remove());\n\n if(mediaEl) {\n mediaEl.classList.toggle('is-round', isRound);\n }\n });\n\n return setMedia;\n}\n\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => Promise> {\n private mediaEl: HTMLElement;\n\n constructor(protected className: string, protected animationGroup: AnimationItemGroup) {\n super(className, async(title, subtitle = '', message?) => {\n if(!this.mediaEl) {\n this.mediaEl = document.createElement('div');\n this.mediaEl.classList.add(this.className + '-media');\n }\n\n const isMediaSet = await wrapReplyDivAndCaption({\n title,\n titleEl: this.title,\n subtitle,\n subtitleEl: this.subtitle,\n mediaEl: this.mediaEl,\n message,\n animationGroup\n });\n\n this.container.classList.toggle('is-media', isMediaSet);\n if(isMediaSet) {\n this.content.prepend(this.mediaEl);\n } else {\n this.mediaEl.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 {hexToRgb} from '../../helpers/color';\nimport {Message} from '../../layer';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport ReplyContainer from '../chat/replyContainer';\n\nexport default function wrapReply(\n title: Parameters[0],\n subtitle: Parameters[1],\n animationGroup: AnimationItemGroup,\n message?: Message.message | Message.messageService,\n setColorPeerId?: PeerId\n) {\n const replyContainer = new ReplyContainer('reply', animationGroup);\n const fillPromise = replyContainer.fill(title, subtitle, message);\n\n if(setColorPeerId) {\n const hex = getPeerColorById(setColorPeerId, false);\n const [r, g, b] = hexToRgb(hex);\n replyContainer.container.style.setProperty('--override-color', `${r}, ${g}, ${b}`);\n replyContainer.container.classList.add('is-overriding-color');\n // replyContainer.border.style.backgroundColor = hex;\n // replyContainer.title.style.color = hex;\n }\n\n return {container: replyContainer.container, fillPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from './avatar';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\nconst CLASS_NAME = 'stacked-avatars';\nconst AVATAR_CLASS_NAME = CLASS_NAME + '-avatar';\nconst AVATAR_CONTAINER_CLASS_NAME = AVATAR_CLASS_NAME + '-container';\n\nexport default class StackedAvatars {\n public container: HTMLElement;\n private lazyLoadQueue: LazyLoadQueue;\n private avatarSize: number;\n\n constructor(options: {\n lazyLoadQueue?: StackedAvatars['lazyLoadQueue'],\n avatarSize: StackedAvatars['avatarSize']\n }) {\n this.lazyLoadQueue = options.lazyLoadQueue;\n this.avatarSize = options.avatarSize;\n\n this.container = document.createElement('div');\n this.container.classList.add(CLASS_NAME);\n\n this.container.style.setProperty('--avatar-size', options.avatarSize + 'px');\n }\n /**\n * MACOS, ANDROID - без реверса\n * WINDOWS DESKTOP - реверс\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\n */\n public render(peerIds: PeerId[], loadPromises?: Promise[]) {\n const children = this.container.children;\n peerIds = peerIds.slice().reverse();\n if(peerIds.length > 3) {\n peerIds = peerIds.slice(-3);\n }\n\n peerIds.forEach((peerId, idx) => {\n let avatarContainer = children[idx] as HTMLElement;\n if(!avatarContainer) {\n avatarContainer = document.createElement('div');\n avatarContainer.classList.add(AVATAR_CONTAINER_CLASS_NAME);\n }\n\n let avatarElem = avatarContainer.firstElementChild as AvatarElement;\n if(!avatarElem) {\n avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-' + this.avatarSize, AVATAR_CLASS_NAME);\n avatarElem.updateOptions({\n isDialog: false,\n loadPromises\n });\n }\n\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: peerId\n });\n\n if(!avatarElem.parentNode) {\n avatarContainer.append(avatarElem);\n }\n\n if(!avatarContainer.parentNode) {\n this.container.append(avatarContainer);\n }\n });\n\n // if were 3 and became 2\n (Array.from(children) as HTMLElement[]).slice(peerIds.length).forEach((el) => el.remove());\n }\n}\n","/*\n * 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';\nimport rootScope from '../../lib/rootScope';\nimport ripple from '../ripple';\nimport I18n from '../../lib/langPack';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport StackedAvatars from '../stackedAvatars';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\nconst TAG_NAME = 'replies-element';\n\nrootScope.addEventListener('replies_updated', (message) => {\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach((element) => {\n element.message = message;\n element.render();\n });\n});\n\nexport default class RepliesElement extends HTMLElement {\n public message: Message.message;\n public type: 'footer' | 'beside';\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public stackedAvatars: StackedAvatars;\n public text: I18n.IntlElement;\n public managers: AppManagers;\n\n private updated = false;\n\n constructor() {\n super();\n this.managers = rootScope.managers;\n }\n\n public init() {\n this.render();\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\n this.classList.add('replies', 'replies-' + this.type);\n }\n\n public render() {\n const replies = this.message.replies;\n\n /* if(this.firstChild) {\n this.innerHTML = '';\n } */\n\n if(this.type === 'footer') {\n let leftPart: HTMLElement;\n if(this.firstElementChild) {\n leftPart = this.firstElementChild as HTMLElement;\n }\n\n if(replies?.recent_repliers) {\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\n this.innerHTML = '';\n leftPart = null;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n lazyLoadQueue: this.lazyLoadQueue,\n avatarSize: 30\n });\n\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\n }\n\n leftPart = this.stackedAvatars.container;\n\n this.stackedAvatars.render(replies.recent_repliers.map((peer) => getPeerId(peer)), this.loadPromises);\n } else {\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\n leftPart.remove();\n leftPart = null;\n }\n\n if(!leftPart) {\n leftPart = document.createElement('span');\n leftPart.classList.add('tgico-comments');\n }\n }\n\n if(!leftPart.parentElement) {\n this.prepend(leftPart);\n }\n\n if(!this.text) {\n this.text = new I18n.IntlElement();\n }\n\n const text = this.text;\n if(replies) {\n if(replies.replies) {\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\n } else {\n text.compareAndUpdate({key: 'LeaveAComment'});\n }\n } else {\n text.compareAndUpdate({key: 'ViewInChat'});\n }\n\n if(replies) {\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\n let isUnread = false;\n if(replies.replies) {\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\n isUnread = replies.read_max_id < replies.max_id;\n }/* else {\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\n } */\n }\n this.classList.toggle('is-unread', isUnread);\n }\n\n let textSpan = this.children[1] as HTMLElement;\n if(!textSpan) {\n textSpan = document.createElement('span');\n textSpan.classList.add('replies-footer-text');\n\n const iconSpan = document.createElement('span');\n iconSpan.classList.add('tgico-next');\n\n const rippleContainer = document.createElement('div');\n ripple(rippleContainer);\n\n this.append(textSpan, iconSpan, rippleContainer);\n }\n\n replaceContent(textSpan, text.element);\n } else {\n this.classList.add('bubble-beside-button');\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\n }\n\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\n this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\n this.managers.appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\n this.updated = true;\n }\n\n if(this.loadPromises) {\n this.loadPromises = undefined;\n }\n }\n}\n\ncustomElements.define(TAG_NAME, RepliesElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatTime, getFullDate} from '../../helpers/date';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Message} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\nimport type LazyLoadQueue from '../lazyLoadQueue';\nimport PeerTitle from '../peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport Chat, {ChatType} from './chat';\nimport RepliesElement from './replies';\n\nconst NBSP = ' ';\n\nconst makeEdited = () => {\n const edited = document.createElement('i');\n edited.classList.add('edited');\n _i18n(edited, 'EditedMessage');\n return edited;\n};\n\nconst makeSponsored = () => i18n('SponsoredMessage');\n\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (options: {\n chatType: ChatType,\n message: Message.message | Message.messageService,\n reactionsMessage?: Message.message\n }) => {\n const {chatType, message} = options;\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n\n let editedSpan: HTMLElement,\n sponsoredSpan: HTMLElement;\n // reactionsElement: ReactionsElement,\n // 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 const time: HTMLElement = isSponsored ? undefined : formatTime(date);\n if(isMessage) {\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n\n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n\n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n\n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(postAuthor));\n span.insertAdjacentHTML('beforeend', ',' + NBSP)\n args.push(span);\n }\n }\n\n if(message.edit_date && chatType !== 'scheduled' && !message.pFlags.edit_hide) {\n args.unshift(editedSpan = makeEdited());\n }\n\n if(chatType !== 'pinned' && message.pFlags.pinned) {\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n\n // if(USER_REACTIONS_INLINE && message.peer_id._ === 'peerUser'/* && message.reactions?.results?.length */) {\n // hasReactions = true;\n\n // reactionsMessage = options.reactionsMessage;\n // reactionsElement = new ReactionsElement();\n // reactionsElement.init(reactionsMessage, 'inline', true);\n // reactionsElement.render();\n // args.unshift(reactionsElement);\n // }\n } else if(isSponsored) {\n args.push(sponsoredSpan = makeSponsored());\n }\n\n if(time) {\n args.push(time);\n }\n\n let title = isSponsored ? undefined : getFullDate(date);\n if(isMessage) {\n title += (message.edit_date && !message.pFlags.edit_hide ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '') +\n (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n }\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n // if(title) timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n if(title) inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n if(sponsoredSpan) {\n clonedArgs[clonedArgs.indexOf(sponsoredSpan)] = makeSponsored();\n }\n // if(reactionsElement) {\n // const _reactionsElement = clonedArgs[clonedArgs.indexOf(reactionsElement)] = new ReactionsElement();\n // _reactionsElement.init(reactionsMessage, 'inline');\n // _reactionsElement.render();\n // }\n clonedArgs = clonedArgs.map((a) => a instanceof HTMLElement && !a.classList.contains('i18n') && !a.classList.contains('reactions') ? a.cloneNode(true) as HTMLElement : a);\n if(time) {\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n }\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueue\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = async({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n currentReplyDiv?.remove();\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n const originalMessage = await rootScope.managers.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n\n // ///////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n\n let titlePeerId: PeerId;\n // need to download separately\n if(!originalMessage) {\n // ////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n rootScope.managers.appMessagesManager.fetchMessageReplyTo(message);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n\n originalPeerTitle = i18n('Loading');\n } else {\n const originalMessageFwdFromId = (originalMessage as Message.message).fwdFromId;\n titlePeerId = message.fwdFromId && message.fwdFromId === originalMessageFwdFromId ? message.fwdFromId : originalMessage.fromId || originalMessageFwdFromId;\n originalPeerTitle = new PeerTitle({\n peerId: titlePeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const {container, fillPromise} = wrapReply(originalPeerTitle, undefined, chat.animationGroup, originalMessage, chat.isAnyGroup ? titlePeerId : undefined);\n await fillPromise;\n if(currentReplyDiv) {\n if(currentReplyDiv.classList.contains('floating-part')) {\n container.classList.add('floating-part');\n }\n currentReplyDiv.replaceWith(container);\n } else {\n bubbleContainer.append(container);\n }\n // bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\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 {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\n // return null;\n const rect = container.getBoundingClientRect();\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\n return document.elementFromPoint(x, y) as any;\n};\n\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\n","/*\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 reflowScrollableElement(element: HTMLElement) {\n element.style.display = 'none';\n void element.offsetLeft; // reflow\n element.style.display = '';\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\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT,\n USER_PHONE_NUMBER,\n INVOICE,\n EMOJI_SET\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat | InternalLink.InternalLinkUserPhoneNumber | InternalLink.InternalLinkInvoice | InternalLink.InternalLinkEmojiSet;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n thread?: string,\n start?: string,\n stack?: number // local\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 stack?: number // local\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 export interface InternalLinkInvoice {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: string\n }\n\n export interface InternalLinkEmojiSet {\n _: INTERNAL_LINK_TYPE.EMOJI_SET,\n set: 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 [INTERNAL_LINK_TYPE.INVOICE]: InternalLink.InternalLinkInvoice,\n [INTERNAL_LINK_TYPE.EMOJI_SET]: InternalLink.InternalLinkEmojiSet\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {addCancelButton} from '.';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {ChatInvite} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport putPhoto from '../putPhoto';\nimport {toastNew} from '../toast';\nimport wrapPhoto from '../wrappers/photo';\n\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\n\nexport default class PopupJoinChatInvite extends PopupElement {\n constructor(\n private hash: string,\n private chatInvite: ChatInvite.chatInvite\n ) {\n super('popup-join-chat-invite', {\n closable: true,\n overlayClosable: true,\n body: true,\n buttons: addCancelButton([{\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\n callback: () => {\n this.managers.appChatsManager.importChatInvite(hash)\n .then((chatId) => {\n const peerId = chatId.toPeerId(true);\n appImManager.setInnerPeer({peerId});\n }, (error) => {\n if(error.type === 'INVITE_REQUEST_SENT') {\n toastNew({langPackKey: 'RequestToJoinSent'});\n }\n });\n }\n }])\n });\n\n this.construct();\n }\n\n private async construct() {\n this.header.remove();\n /* const fakeChat: Chat.channel | Chat.chat = {\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\n id: FAKE_CHAT_ID,\n title: chatInvite.title,\n photo: chatInvite.photo as any,\n date: Date.now() / 1000 | 0,\n version: 0,\n participants_count: chatInvite.participants_count,\n pFlags: chatInvite.pFlags as any\n };\n\n appChatsManager.saveApiChat(fakeChat); */\n\n const {chatInvite, managers, hash} = this;\n\n const avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-100');\n avatarElem.isDialog = false;\n if(chatInvite.photo._ === 'photo') {\n chatInvite.photo = await managers.appPhotosManager.savePhoto(chatInvite.photo);\n wrapPhoto({\n container: avatarElem,\n message: null,\n photo: chatInvite.photo,\n boxHeight: 100,\n boxWidth: 100,\n withoutPreloader: true\n });\n avatarElem.style.width = avatarElem.style.height = '';\n } else {\n putPhoto({\n div: avatarElem,\n peerId: NULL_PEER_ID,\n isDialog: false,\n title: chatInvite.title\n });\n }\n\n const title = document.createElement('div');\n title.classList.add('chat-title');\n setInnerHTML(title, wrapEmojiText(chatInvite.title));\n // avatarElem.setAttribute('peer', '' + -fakeChat.id);\n\n const isBroadcast = chatInvite.pFlags.broadcast;\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\n peopleCount.classList.add('chat-participants-count');\n\n this.body.append(avatarElem, title, peopleCount);\n\n if(chatInvite.pFlags.request_needed) {\n const caption = document.createElement('div');\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\n caption.classList.add('chat-participants-count', 'request-caption');\n\n this.body.append(caption);\n }\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 callbackify from '../../helpers/callbackify';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Document, MessagePeerReaction, ReactionCount} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport rootScope from '../../lib/rootScope';\nimport SetTransition from '../singleTransition';\nimport StackedAvatars from '../stackedAvatars';\nimport {Awaited} from '../../types';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport wrapStickerAnimation from '../wrappers/stickerAnimation';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport {fastRaf} from '../../helpers/schedulers';\nimport noop from '../../helpers/noop';\nimport {Middleware} from '../../helpers/middleware';\n\nconst CLASS_NAME = 'reaction';\nconst TAG_NAME = CLASS_NAME + '-element';\nconst REACTION_INLINE_SIZE = 14;\nconst REACTION_BLOCK_SIZE = 22;\n\nexport const REACTION_DISPLAY_INLINE_COUNTER_AT = 2;\nexport const REACTION_DISPLAY_BLOCK_COUNTER_AT = 4;\n\nexport type ReactionLayoutType = 'block' | 'inline';\n\nexport default class ReactionElement extends HTMLElement {\n private type: ReactionLayoutType;\n private counter: HTMLElement;\n private stickerContainer: HTMLElement;\n private stackedAvatars: StackedAvatars;\n private canRenderAvatars: boolean;\n private _reactionCount: ReactionCount;\n private wrapStickerPromise: Awaited>['render'];\n private managers: AppManagers;\n private middleware: Middleware;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.managers = rootScope.managers;\n }\n\n public get reactionCount() {\n return this._reactionCount;\n }\n\n public set reactionCount(reactionCount: ReactionCount) {\n this._reactionCount = reactionCount;\n }\n\n public get count() {\n return this.reactionCount.count;\n }\n\n public init(type: ReactionLayoutType, middleware: Middleware) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n this.middleware = middleware;\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 reaction = reactionCount.reaction;\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = this.managers.appReactionsManager.getReaction(reaction.emoticon);\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 this.renderDoc(availableReaction.center_icon ?? availableReaction.static_icon);\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n this.stickerContainer.classList.add('is-custom');\n const wrapped = wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: makeMediaSize(REACTION_BLOCK_SIZE, REACTION_BLOCK_SIZE)\n });\n\n this.stickerContainer.append(wrapped);\n }\n }\n }\n\n private renderDoc(doc: Document.document) {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc,\n width: size,\n height: size,\n static: true,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\n }\n\n public renderCounter() {\n const reactionCount = this.reactionCount;\n const displayOn = this.type === 'inline' ? REACTION_DISPLAY_INLINE_COUNTER_AT : REACTION_DISPLAY_BLOCK_COUNTER_AT;\n if(reactionCount.count >= displayOn || (this.type === 'block' && !this.canRenderAvatars)) {\n if(!this.counter) {\n this.counter = document.createElement(this.type === 'inline' ? 'i' : 'span');\n this.counter.classList.add(CLASS_NAME + '-counter');\n }\n\n const formatted = formatNumber(reactionCount.count);\n if(this.counter.textContent !== formatted) {\n this.counter.textContent = formatted;\n }\n\n if(!this.counter.parentElement) {\n this.append(this.counter);\n }\n } else if(this.counter?.parentElement) {\n this.counter.remove();\n this.counter = undefined;\n }\n }\n\n public renderAvatars(recentReactions: MessagePeerReaction[]) {\n if(this.type === 'inline') {\n return;\n }\n\n if(this.reactionCount.count >= REACTION_DISPLAY_BLOCK_COUNTER_AT || !this.canRenderAvatars) {\n if(this.stackedAvatars) {\n this.stackedAvatars.container.remove();\n this.stackedAvatars = undefined;\n }\n\n return;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n avatarSize: 24\n });\n\n this.append(this.stackedAvatars.container);\n }\n\n this.stackedAvatars.render(recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n public setIsChosen(isChosen = this.reactionCount.chosen_order !== undefined) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition({\n element: this,\n className: 'is-chosen',\n forwards: isChosen,\n duration: this.isConnected ? 300 : 0\n });\n }\n }\n\n public fireAroundAnimation() {\n const reaction = this.reactionCount.reaction;\n if(reaction._ !== 'reactionEmoji') return;\n callbackify(this.managers.appReactionsManager.getReaction(reaction.emoticon), (availableReaction) => {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE + 14 : REACTION_BLOCK_SIZE + 18;\n const div = document.createElement('div');\n div.classList.add(CLASS_NAME + '-sticker-activate');\n\n Promise.all([\n wrapSticker({\n div: div,\n doc: availableReaction.center_icon,\n width: size,\n height: size,\n withThumb: false,\n needUpscale: true,\n play: false,\n skipRatio: 1,\n group: 'none',\n needFadeIn: false,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render as Promise),\n\n wrapStickerAnimation({\n doc: availableReaction.around_animation,\n size: 80,\n target: this.stickerContainer,\n side: 'center',\n skipRatio: 1,\n play: false,\n managers: this.managers,\n middleware: this.middleware\n }).stickerPromise.catch(noop)\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n };\n\n if(!aroundPlayer) {\n remove();\n return;\n }\n\n const removeOnFrame = () => {\n // if(!isInDOM(div)) return;\n fastRaf(remove);\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(removeOnFrame, 1e3);\n });\n } else {\n removeOnFrame();\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 {Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport {Message, ReactionCount} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport reactionsEqual from '../../lib/appManagers/utils/reactions/reactionsEqual';\nimport rootScope from '../../lib/rootScope';\nimport ReactionElement, {ReactionLayoutType, REACTION_DISPLAY_BLOCK_COUNTER_AT} from './reaction';\n\nconst CLASS_NAME = 'reactions';\nconst TAG_NAME = CLASS_NAME + '-element';\n\nconst REACTIONS_ELEMENTS: Map> = new Map();\nexport {REACTIONS_ELEMENTS};\n\nexport default class ReactionsElement extends HTMLElement {\n private message: Message.message;\n private key: string;\n private isPlaceholder: boolean;\n private type: ReactionLayoutType;\n private sorted: ReactionElement[];\n private onConnectCallback: () => void;\n private managers: AppManagers;\n private middleware: Middleware;\n private middlewareHelpers: Map;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\n this.middlewareHelpers = new Map();\n this.managers = rootScope.managers;\n }\n\n connectedCallback() {\n let set = REACTIONS_ELEMENTS.get(this.key);\n if(!set) {\n REACTIONS_ELEMENTS.set(this.key, set = new Set());\n }\n\n set.add(this);\n\n if(this.onConnectCallback && this.isConnected) {\n this.onConnectCallback();\n this.onConnectCallback = undefined;\n }\n }\n\n disconnectedCallback() {\n const set = REACTIONS_ELEMENTS.get(this.key);\n set.delete(this);\n if(!set.size) {\n REACTIONS_ELEMENTS.delete(this.key);\n }\n }\n\n public getReactionCount(reactionElement: ReactionElement) {\n return this.sorted[this.sorted.indexOf(reactionElement)].reactionCount;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public init(\n message: Message.message,\n type: ReactionLayoutType,\n middleware: Middleware,\n isPlaceholder = this.isPlaceholder\n ) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n if(this.middleware !== middleware) {\n middleware.onDestroy(() => {\n this.middlewareHelpers.clear();\n });\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\n this.middleware = middleware;\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.middleware);\n }\n\n public update(message: Message.message, changedResults?: ReactionCount[]) {\n this.message = message;\n this.render(changedResults);\n }\n\n public render(changedResults?: ReactionCount[]) {\n const reactions = this.message.reactions;\n const hasReactions = !!(reactions && reactions.results.length);\n this.classList.toggle('has-no-reactions', !hasReactions);\n if(!hasReactions && !this.sorted.length) return;\n\n const availableReactionsResult = this.managers.appReactionsManager.getAvailableReactions();\n // callbackify(availableReactionsResult, () => {\n const counts = hasReactions ? (\n reactions.results\n // availableReactionsResult instanceof Promise ?\n // reactions.results :\n // reactions.results.filter((reactionCount) => {\n // return this.managers.appReactionsManager.isReactionActive(reactionCount.reaction);\n // })\n ) : [];\n\n // if(this.message.peerId.isUser()) {\n // counts.sort((a, b) => (b.count - a.count) || ((b.chosen_order ?? 0) - (a.chosen_order ?? 0)));\n // } else {\n counts.sort((a, b) => (b.count - a.count) || ((a.chosen_order ?? 0) - (b.chosen_order ?? 0)));\n // }\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some((reactionCount) => reactionsEqual(reactionCount.reaction, reaction));\n if(!found) {\n const middlewareHelper = this.middlewareHelpers.get(reactionElement);\n middlewareHelper.destroy();\n this.middlewareHelpers.delete(reactionElement);\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 || this.message.peerId.isUser()) && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n let reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n if(!reactionElement) {\n const middlewareHelper = this.middleware.create();\n reactionElement = new ReactionElement();\n reactionElement.init(this.type, middlewareHelper.get());\n this.middlewareHelpers.set(reactionElement, middlewareHelper);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n\n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter((reaction) => reactionsEqual(reaction.reaction, reactionCount.reaction)) : [];\n reactionElement.reactionCount = {...reactionCount};\n reactionElement.setCanRenderAvatars(canRenderAvatars);\n reactionElement.render(this.isPlaceholder);\n reactionElement.renderCounter();\n reactionElement.renderAvatars(recentReactions);\n reactionElement.setIsChosen();\n\n return reactionElement;\n });\n\n // this.sorted.forEach((reactionElement, idx) => {\n // /* if(this.type === 'block' && this.childElementCount !== this.sorted.length) { // because of appended time\n // idx += 1;\n // } */\n\n // positionElementByIndex(reactionElement, this, idx);\n // });\n\n if(!this.isPlaceholder && changedResults?.length) {\n if(this.isConnected) {\n this.handleChangedResults(changedResults);\n } else {\n this.onConnectCallback = () => {\n this.handleChangedResults(changedResults);\n };\n }\n }\n // });\n\n // ! тут вообще не должно быть этого кода, но пока он побудет тут\n if(!this.sorted.length && this.type === 'block') {\n const parentElement = this.parentElement;\n this.remove();\n\n if(parentElement.classList.contains('document-message') && !parentElement.childNodes.length) {\n parentElement.remove();\n return;\n }\n\n const timeSpan = this.querySelector('.time');\n if(timeSpan) {\n parentElement.append(timeSpan);\n }\n }\n }\n\n private handleChangedResults(changedResults: ReactionCount[]) {\n // ! temp\n if(this.message.peerId !== appImManager.chat.peerId) return;\n\n changedResults.forEach((reactionCount) => {\n const reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n reactionElement?.fireAroundAnimation();\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport getVisibleRect from './dom/getVisibleRect';\nimport reflowScrollableElement from './dom/reflowScrollableElement';\n\nexport default class ScrollSaver {\n private scrollHeight: number;\n private scrollHeightMinusTop: number;\n private scrollTop: number;\n private clientHeight: number;\n private elements: {element: HTMLElement, rect: DOMRect}[];\n\n /**\n *\n * @param scrollable to reset scroll position and direction\n * @param reverse true means top\n */\n constructor(\n private scrollable: Scrollable,\n private query: string,\n private reverse: boolean\n ) {\n\n }\n\n private get container() {\n return this.scrollable.container;\n }\n\n public getSaved() {\n return {\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n clientHeight: this.clientHeight\n };\n }\n\n public findElements() {\n if(!this.query) return [];\n\n const {container} = this;\n const containerRect = container.getBoundingClientRect();\n const bubbles = Array.from(container.querySelectorAll(this.query)) as HTMLElement[];\n const elements: ScrollSaver['elements'] = [];\n for(const bubble of bubbles) {\n const elementRect = bubble.getBoundingClientRect();\n const visibleRect = getVisibleRect(bubble, container, undefined, elementRect, containerRect);\n if(visibleRect) {\n elements.push({element: bubble, rect: elementRect});\n // break; // find first\n } else if(elements.length) { // find last\n break;\n }\n }\n\n if(!elements.length) {\n const bubble = bubbles[0];\n if(bubble) {\n elements.push({element: bubble, rect: bubble.getBoundingClientRect()});\n }\n }\n\n return elements;\n }\n\n public replaceSaved(from: HTMLElement, to: HTMLElement) {\n if(!this.elements) {\n return;\n }\n\n const idx = this.elements.findIndex(({element}) => from === element);\n if(idx !== -1) {\n this.elements[idx].element = to;\n }\n }\n\n public findAndSetElements() {\n this.elements = this.findElements();\n }\n\n public save() {\n this.findAndSetElements();\n // console.warn('scroll save', this.elements);\n this._save();\n }\n\n public _save() {\n const {scrollTop, scrollHeight, clientHeight} = this.container;\n\n // previousScrollHeight = scrollHeight;\n // previousScrollHeight = scrollHeight + padding;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n this.clientHeight = clientHeight;\n this.scrollHeightMinusTop = this.reverse ? scrollHeight - scrollTop : scrollTop;\n\n // this.chatInner.style.paddingTop = padding + 'px';\n /* if(reverse) {\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\n } else {\n previousScrollHeightMinusTop = scrollTop;\n } */\n }\n\n private onRestore(useReflow?: boolean) {\n if(IS_SAFARI && useReflow/* && !isAppleMobile */) { // * fix blinking and jumping\n reflowScrollableElement(this.container);\n }\n }\n\n private setScrollTop(newScrollTop: number, useReflow?: boolean) {\n // touchSupport for safari iOS\n // isTouchSupported && isApple && (container.container.style.overflow = 'hidden');\n this.scrollable.setScrollTopSilently(this.scrollTop = newScrollTop);\n // container.scrollTop = scrollHeight;\n // isTouchSupported && isApple && (container.container.style.overflow = '');\n\n this.onRestore(useReflow);\n }\n\n public restore(useReflow?: boolean) {\n const {scrollTop, scrollHeight} = this.scrollable;\n this.scrollHeight = scrollHeight;\n\n if(!this.elements.length) { // maybe all messages have been deleted\n this._restore(useReflow);\n return;\n }\n\n let anchor: ScrollSaver['elements'][0];\n // for(let i = this.elements.length - 1; i >= 0; --i) {\n // const _anchor = this.elements[i];\n // if(_anchor.element.parentElement) {\n // anchor = _anchor;\n // break;\n // }\n // }\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor?.element?.parentElement) { // try to find new anchor\n this.findAndSetElements();\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor) { // fallback to old method if smth is really strange\n this._restore(useReflow);\n return;\n }\n }\n\n const {element, rect} = anchor;\n const newRect = element.getBoundingClientRect();\n const diff = newRect.bottom - rect.bottom;\n this.setScrollTop(scrollTop + diff, useReflow);\n // if(diff) debugger;\n // console.warn('scroll restore', rect, diff, newRect);\n }\n\n public _restore(useReflow?: boolean) {\n const {scrollHeightMinusTop: previousScrollHeightMinusTop, scrollable} = this;\n // if(previousScrollHeightMinusTop === undefined) {\n // throw new Error('scroll was not saved');\n // }\n\n // const scrollHeight = container.scrollHeight;\n const scrollHeight = this.scrollHeight;\n // if(scrollHeight === this.scrollHeight) {\n // return;\n // }\n\n // this.scrollHeight = scrollHeight;\n\n /* const scrollHeight = container.scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\n /* const scrollHeight = scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\n\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n this.log('performHistoryResult: will set scrollTop',\n previousScrollHeightMinusTop, scrollHeight,\n newScrollTop, container.container.clientHeight); */\n // const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = this.reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n\n /* if(DEBUG) {\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\n } */\n\n this.setScrollTop(newScrollTop, useReflow);\n\n /* if(DEBUG) {\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, container.scrollTop, container.scrollHeight, this.isHeavyAnimationInProgress);\n } */\n }\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.ScrollSaver = ScrollSaver);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type IntersectionTarget = Element;\nexport type IntersectionCallback = (entry: IntersectionObserverEntry) => void;\n\nexport default class SuperIntersectionObserver {\n private observing: Map>;\n private observingQueue: SuperIntersectionObserver['observing'];\n private observer: IntersectionObserver;\n private freezedObservingNew: boolean;\n\n constructor(init?: IntersectionObserverInit) {\n this.observing = new Map();\n this.observingQueue = new Map();\n this.freezedObservingNew = false;\n\n this.observer = new IntersectionObserver((entries) => {\n const observing = this.observing;\n for(let i = 0, length = entries.length; i < length; ++i) {\n const entry = entries[i];\n const callbacks = observing.get(entry.target);\n if(!callbacks) {\n console.error('intersection process no callbacks:', entry);\n debugger;\n continue;\n }\n\n for(const callback of callbacks) {\n try {\n callback(entry);\n } catch(err) {\n console.error('intersection process callback error:', err);\n }\n }\n }\n }, init);\n }\n\n public disconnect() {\n this.observing.clear();\n this.observingQueue.clear();\n this.observer.disconnect();\n }\n\n public toggleObservingNew(value: boolean) {\n if(this.freezedObservingNew === value) {\n return;\n }\n\n this.freezedObservingNew = value;\n\n const queue = this.observingQueue;\n if(!value && queue.size) {\n for(const [target, callbacks] of queue) {\n for(const callback of callbacks) {\n this.observe(target, callback);\n }\n }\n\n queue.clear();\n }\n }\n\n public has(target: IntersectionTarget, callback: IntersectionCallback, observing = this.observing) {\n const callbacks = observing.get(target);\n return !!(callbacks && callbacks.has(callback));\n }\n\n public observe(target: IntersectionTarget, callback: IntersectionCallback) {\n if(this.freezedObservingNew && this.has(target, callback)) {\n return;\n }\n\n const observing = this.freezedObservingNew ? this.observingQueue : this.observing;\n let callbacks = observing.get(target);\n if(callbacks && callbacks.has(callback)) {\n return;\n }\n\n if(!callbacks) {\n callbacks = new Set();\n observing.set(target, callbacks);\n\n if(observing === this.observing) {\n this.observer.observe(target);\n }\n }\n\n callbacks.add(callback);\n }\n\n public unobserve(target: IntersectionTarget, callback: IntersectionCallback) {\n const observing = this.freezedObservingNew && !this.has(target, callback) ? this.observingQueue : this.observing;\n const callbacks = observing.get(target);\n if(!callbacks) {\n return;\n }\n\n callbacks.delete(callback);\n if(!callbacks.size) {\n observing.delete(target);\n this.observer.unobserve(target);\n }\n }\n}\n","import type {MyDocument} from '../../appDocsManager';\nimport type {MyMessage} from '../../appMessagesManager';\nimport {Message, MessageMedia} from '../../../../layer';\n\nexport default function isMentionUnread(message: MyMessage) {\n if(!message) {\n return false;\n }\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return !!(\n message.pFlags.media_unread &&\n message.pFlags.mentioned &&\n (\n !doc ||\n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n )\n );\n}\n","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","function cacheCallback(callback: (str: A) => T) {\n const stringResults: any = {}, numberResults: any = {};\n return (value: A): T => {\n const key = '_' + value;\n return (typeof(value) === 'string' ? stringResults : numberResults)[key] ??= callback(value);\n };\n}\n\nexport default cacheCallback;\n","export default function replaceNonNumber(str: string) {\n return str.replace(/\\D/g, '');\n}\n","import cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nconst CARD_BRAND_REGEXP: {[brand: string]: RegExp} = {\n visa: /^4/,\n mastercard: /^(51|52|53|54|55|222|23|24|25|26|27)/,\n amex: /^(34|37)/,\n discover: /^(60|64|65)/,\n diners: /^(30|38|39)/,\n diners14: /^(36)/,\n jcb: /^(35)/,\n unionpay: /^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,\n elo: /^(5067|509|636368|627780)/,\n mir: /^(220[0-4])/\n};\n\n// * taken from Stripe\nexport const CARD_BRANDS: {[b: string]: {\n minLength: number,\n maxLength: number,\n cvcMaxLength: number,\n cvcMinLength: number | null\n}} = {\n visa: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mastercard: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n amex: {\n minLength: 15,\n maxLength: 15,\n cvcMaxLength: 4,\n cvcMinLength: 3\n },\n unionpay: {\n minLength: 13,\n maxLength: 19,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners14: {\n minLength: 14,\n maxLength: 14,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n discover: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n jcb: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n elo: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mir: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n unknown: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 4,\n cvcMinLength: 3\n }\n};\n\nexport const detectCardBrand = cacheCallback((card: string = '') => {\n const keys = Object.keys(CARD_BRAND_REGEXP);\n const sanitizedCard = replaceNonNumber(card);\n let brand: string;\n let last = 0;\n keys.forEach((key) => {\n const regExp = CARD_BRAND_REGEXP[key];\n const match = sanitizedCard.match(regExp);\n if(match) {\n const result = match[0];\n if(result && result.length > last) {\n brand = key;\n last = result.length;\n }\n }\n });\n\n return brand || 'unknown';\n});\n\nexport function cardBrandToUnifiedBrand(brand: string) {\n return brand === 'diners14' ? 'diners' : brand;\n}\n\nexport function detectUnifiedCardBrand(card = '') {\n const brand = detectCardBrand(card);\n return cardBrandToUnifiedBrand(brand);\n}\n","export default function createArray(length: number, fill?: T1, map?: any): T1[] {\n const arr = new Array(length);\n arr.fill(fill);\n return map ? arr.map(map) : arr;\n}\n","const delta = '0'.charCodeAt(0) - '0'.charCodeAt(0);\nconst buggedRegExp = /[0-9]/g;\n\n// function hasBuggedNumbers(str: string) {\n// return !!str.match(a);\n// }\n\nfunction getDistanceFromBuggedToNormal(char: string) {\n return String.fromCharCode(char.charCodeAt(0) - delta);\n}\n\nexport function fixBuggedNumbers(str: string) {\n return str.replace(buggedRegExp, getDistanceFromBuggedToNormal);\n}\n","import {fixBuggedNumbers} from '../string/buggedNumbers';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternCharacter = {\n type: 'optional',\n result: string,\n consumed: number\n} | {\n type: 'required',\n result: string,\n consumed: number,\n partial?: boolean\n} | {\n type: 'formatting',\n result: string,\n consumed: number\n};\n\nexport type PatternFunction = (str: string) => ((str: string) => PatternCharacter)[];\n\nfunction makeOptionalCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'optional', result, consumed};\n}\n\nfunction makeRequiredCharacter(result: string, consumed: number, partial?: boolean): PatternCharacter {\n return {type: 'required', result, consumed, partial};\n}\n\nfunction makeFormattingCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'formatting', result, consumed};\n}\n\nfunction wrapCharacterRegExpFactory(regExp: RegExp, optional?: boolean) {\n return (str: string) => {\n const _regExp = new RegExp('^'.concat(regExp.source.replace(/^\\^/, '')));\n const match = str.match(_regExp);\n const makeCharacter = optional ? makeOptionalCharacter : makeRequiredCharacter;\n if(match) {\n const result = match[0];\n return makeCharacter(result, match.index + result.length);\n }\n\n return makeCharacter('', str.length);\n };\n}\n\nfunction makeCapitalPatternCharacter(str: string) {\n const char = wrapCharacterRegExpFactory(/\\w/)(str);\n return char.result ? makeRequiredCharacter(char.result.toUpperCase(), char.consumed) : char;\n}\n\nconst makeMonthDigitPatternCharacter = wrapCharacterRegExpFactory(/1[0-2]|0?[1-9]|0/);\n\nfunction digit(str: string) {\n return wrapCharacterRegExpFactory(/[0-9]/)(fixBuggedNumbers(str));\n}\n\nconst patternCharacters = {\n digit,\n capitalCharacter: makeCapitalPatternCharacter,\n month: (str: string) => {\n const char = makeMonthDigitPatternCharacter(fixBuggedNumbers(str));\n const cleanedResult = replaceNonNumber(char.result);\n const isPartial = ['0', '1'].includes(char.result) && str.length === 1;\n if(isPartial || (char.result === '0' && str.length >= 2)) {\n return makeRequiredCharacter(char.result, str.length, true);\n }\n\n return makeRequiredCharacter(cleanedResult.length === 1 ? '0' + cleanedResult : cleanedResult, char.consumed);\n },\n formattingCharacter: (str: string) => {\n return (str1: string) => {\n const consumed = str === str1[0] ? 1 : 0;\n return makeFormattingCharacter(str, consumed);\n }\n },\n optionalPattern: (regExp: RegExp) => {\n return (str: string) => {\n const char = wrapCharacterRegExpFactory(regExp, true)(str);\n return char.result ? char : makeOptionalCharacter('', 0);\n };\n }\n};\n\nexport default patternCharacters;\n","import {IS_ANDROID} from '../../environment/userAgent';\nimport createArray from '../array/createArray';\nimport cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\nimport {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport patternCharacters from './patternCharacters';\n\nconst digit = patternCharacters.digit;\nconst capitalCharacter = patternCharacters.capitalCharacter;\nconst spaceCharacter = patternCharacters.formattingCharacter(' ');\nconst yearOptionalPattern = patternCharacters.optionalPattern(/\\d\\d/);\nconst sixteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit];\nconst fifteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit];\n\nconst requiredPostcodes = new Set(['DZ', 'AR', 'AM', 'AU', 'AT', 'AZ', 'PT', 'BD', 'BY', 'BE', 'BA', 'BR', 'BN', 'BG', 'CA', 'IC', 'CN', 'CO', 'HR', 'CY', 'CZ', 'DK', 'EC', 'GB', 'EE', 'FO', 'FI', 'FR', 'GE', 'DE', 'GR', 'GL', 'GU', 'GG', 'NL', 'HU', 'IN', 'ID', 'IL', 'IT', 'JP', 'JE', 'KZ', 'KR', 'FM', 'KG', 'LV', 'LI', 'LT', 'LU', 'MK', 'MG', 'PT', 'MY', 'MH', 'MQ', 'YT', 'MX', 'MN', 'ME', 'NL', 'NZ', 'GB', 'NO', 'PK', 'PH', 'PL', 'FM', 'PT', 'PR', 'RE', 'RU', 'SA', 'SF', 'RS', 'SG', 'SK', 'SI', 'ZA', 'ES', 'LK', 'SX', 'VI', 'VI', 'SE', 'CH', 'TW', 'TJ', 'TH', 'TU', 'TN', 'TR', 'TM', 'VI', 'UA', 'GB', 'US', 'UY', 'UZ', 'VA', 'VN', 'GB', 'FM']);\n\nconst generateFourPattern = cacheCallback((length: number) => {\n const out: Array = [];\n\n for(let i = 0, k = 0; i < length;) {\n if(k === 4) {\n out.push(spaceCharacter);\n k = 0;\n } else {\n out.push(digit);\n ++i;\n ++k;\n }\n }\n\n return out;\n});\n\nfunction generateCardNumberPattern(card: string) {\n const brand = detectCardBrand(card);\n if(brand === 'amex') return sixteenPattern;\n if(brand === 'diners14') return fifteenPattern;\n const {minLength, maxLength} = CARD_BRANDS[brand];\n const s = replaceNonNumber(card).length;\n const d = Math.min(Math.max(minLength, s), maxLength);\n return generateFourPattern(d);\n}\n\nconst cardFormattingPatterns = {\n cardNumber: generateCardNumberPattern,\n cardExpiry: () => [patternCharacters.month, patternCharacters.formattingCharacter('/'), digit, digit, yearOptionalPattern],\n cardCvc: (card?: string) => cardFormattingPatterns.cardCvcFromBrand(detectCardBrand(card)),\n cardCvcFromBrand: cacheCallback((brand: string) => {\n const info = CARD_BRANDS[brand];\n const {cvcMinLength, cvcMaxLength} = info;\n const pattern = createArray(cvcMinLength || cvcMaxLength, digit);\n if(cvcMinLength && cvcMinLength < cvcMaxLength) {\n const i = cvcMaxLength - cvcMinLength;\n const h = patternCharacters.optionalPattern(/\\d/);\n if(i) {\n pattern.push(...createArray(i, h));\n }\n }\n\n return pattern;\n }),\n postalCodeFromCountry: cacheCallback((iso2: string) => {\n switch(iso2) {\n case 'US':\n return createArray(5, digit);\n case 'CA':\n return IS_ANDROID ? null : [capitalCharacter, capitalCharacter, capitalCharacter, spaceCharacter, capitalCharacter, capitalCharacter, capitalCharacter];\n default:\n const optionalDigits = createArray(10, patternCharacters.optionalPattern(/\\d/));\n if(requiredPostcodes.has(iso2)) {\n optionalDigits[0] = digit;\n }\n return optionalDigits;\n }\n })\n};\n\nexport default cardFormattingPatterns;\n","import accumulate from '../array/accumulate';\nimport {PatternFunction} from './patternCharacters';\n\nfunction accumulateLengths(strs: string[]) {\n return accumulate(strs.map((str) => str.length), 0);\n}\n\nfunction formatValueByPattern(\n getPattern: PatternFunction,\n value: string,\n options: Partial<{\n selectionStart: number,\n selectionEnd: number\n }> = {},\n pushRest?: boolean\n) {\n const pattern = getPattern(value);\n\n if(!pattern) {\n return {\n value: value,\n selection: null as typeof options,\n autocorrectComplete: !!value\n };\n }\n\n const length = pattern.length;\n const c: string[] = [];\n const s: string[] = [];\n\n let l = 0;\n let i = 0;\n let f = options.selectionStart === 0 ? 0 : null;\n let d = options.selectionEnd === 0 ? 0 : null;\n const p = () => {\n if(f === null && (i + 1) >= options.selectionStart) f = accumulateLengths(c) + (pushRest ? s.length : 0);\n if(d === null && (i + 1) >= options.selectionEnd) d = accumulateLengths(c) + (pushRest ? s.length : 0);\n };\n const m = (e: number) => {\n if(e > 0) {\n p();\n i += e;\n }\n };\n\n for(; l < length;) {\n const getCharacter = pattern[l];\n const character = getCharacter(value.slice(i));\n const {type, result, consumed} = character;\n if(type === 'required') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n ++l;\n\n if(character.partial) {\n m(value.length - i);\n break;\n }\n\n m(consumed);\n } else {\n if(!consumed) {\n break;\n }\n\n m(1);\n }\n } else if(type === 'optional') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n m(consumed);\n }\n\n ++l;\n } else if(type === 'formatting') {\n if(!pushRest && i >= value.length) {\n break;\n }\n\n s.push(result);\n ++l;\n m(consumed);\n }\n }\n\n if(pushRest) {\n c.push(...s);\n }\n\n return {\n value: c.join(''),\n selection: {\n selectionStart: f === null || value.length && options.selectionStart === value.length ? accumulateLengths(c) : f,\n selectionEnd: d === null || value.length && options.selectionEnd === value.length ? accumulateLengths(c) : d\n },\n autocorrectComplete: l === length\n };\n}\n\nexport default formatValueByPattern;\n","import {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport formatInputValueByPattern from './formatInputValueByPattern';\nimport NBSP from '../string/nbsp';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternValidationOptions = Partial<{\n ignoreIncomplete: boolean\n}>;\n\nconst nbspRegExp = new RegExp(NBSP, 'g');\n\nfunction makeValidationError(code?: string) {\n return code ? {\n type: 'invalid',\n code\n } : null;\n}\n\n// Luhn algorithm\nfunction validateCompleteCardNumber(card: string) {\n const t = '0'.charCodeAt(0);\n const n = card.length % 2;\n let a = 0;\n for(let i = card.length - 1; i >= 0; --i) {\n const c = n === (i % 2);\n let o = card.charCodeAt(i) - t;\n if(c) o *= 2;\n if(o > 9) o -= 9;\n a += o;\n }\n return !(a % 10);\n}\n\nfunction validateExpiry(year: number, month: number, options?: PatternValidationOptions) {\n const date = new Date(Date.now());\n const _year = year < 100 ? date.getFullYear() % 100 : date.getFullYear();\n const nextMonth = date.getMonth() + 1;\n\n if(isNaN(year) || isNaN(month)) {\n return options?.ignoreIncomplete ? null : 'incomplete';\n }\n\n if((year - _year) < 0) {\n return 'invalid_expiry_year_past';\n }\n\n if((year - _year) > 50) {\n return 'invalid_expiry_year';\n }\n\n return !(year - _year) && month < nextMonth ? 'invalid_expiry_month_past' : null;\n}\n\nfunction getCardInfoByNumber(card: string) {\n const sanitized = replaceNonNumber(card);\n const brand = detectCardBrand(card);\n return {\n sanitized,\n brand,\n minLength: CARD_BRANDS[brand].minLength\n };\n}\n\nfunction makeCardNumberError(str: string, length: number, ignoreIncomplete: boolean) {\n if(str.length >= length) {\n return validateCompleteCardNumber(str) || detectCardBrand(str) === 'mir' ? null : makeValidationError('invalid');\n }\n\n return ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n\nexport function validateCardNumber(str: string, options: PatternValidationOptions = {}) {\n const {sanitized, minLength} = getCardInfoByNumber(str);\n return makeCardNumberError(sanitized, minLength, options.ignoreIncomplete);\n}\n\nexport function validateCardExpiry(str: string, options: PatternValidationOptions = {}) {\n const sanitized = str.replace(nbspRegExp, '').split(/ ?\\/ ?/);\n const [monthStr, yearStr = ''] = sanitized;\n const [month, year] = [monthStr, yearStr].map((str) => +str);\n const s = yearStr.length === 2 ? year % 100 : year;\n return yearStr.length < 2 || yearStr.length === 3 ? (options.ignoreIncomplete ? null : makeValidationError('incomplete')) : makeValidationError(validateExpiry(s, month, options));\n}\n\nexport function validateAnyIncomplete(formatted: ReturnType, str: string, options: PatternValidationOptions = {}) {\n return formatted.meta.autocorrectComplete || options.ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n","const NBSP = '‎';\nexport default NBSP;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {TelegramWebViewEvent, TelegramWebViewEventCallback, TelegramWebViewEventMap} from '../types';\n\nconst weakMap: WeakMap = new WeakMap();\nwindow.addEventListener('message', (e) => {\n const callback = weakMap.get(e.source as Window);\n if(!callback) {\n return;\n }\n\n callback(JSON.parse(e.data));\n});\n\nexport default class TelegramWebView extends EventListenerBase<{\n [type in keyof TelegramWebViewEventMap]: (data: TelegramWebViewEventMap[type]) => void\n}> {\n public iframe: HTMLIFrameElement;\n\n constructor({url, sandbox}: {\n url: string,\n sandbox?: string\n }) {\n super(false);\n\n const iframe = this.iframe = document.createElement('iframe');\n iframe.src = url;\n if(sandbox) iframe.setAttribute('sandbox', sandbox);\n }\n\n public onMount() {\n weakMap.set(this.iframe.contentWindow, this.onTelegramWebViewEvent);\n }\n\n public destroy() {\n this.cleanup();\n weakMap.delete(this.iframe.contentWindow);\n }\n\n private onTelegramWebViewEvent = ({eventType, eventData}: TelegramWebViewEvent) => {\n if((eventData as any) === '') {\n eventData = undefined;\n }\n\n console.log('onTelegramWebViewEvent', eventType, eventData);\n this.dispatchEvent(eventType, eventData 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 PopupElement from '.';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport TelegramWebView from '../telegramWebView';\n\nexport function createVerificationIframe(options: ConstructorParameters[0]) {\n const result = new TelegramWebView({\n ...options,\n sandbox: 'allow-forms allow-scripts allow-same-origin allow-modals'\n });\n const {iframe} = result;\n iframe.allow = 'payment';\n iframe.classList.add('payment-verification');\n return result;\n}\n\nexport default class PopupPaymentVerification extends PopupElement<{\n finish: () => void\n}> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string, private openPathAfter?: boolean) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n title: 'Checkout.WebConfirmation.Title'\n });\n\n this.d();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: this.url\n });\n\n telegramWebView.addEventListener('web_app_open_tg_link', (e) => {\n this.dispatchEvent('finish');\n this.hide();\n if(this.openPathAfter) {\n appImManager.openUrl('https://t.me' + e.path_full);\n }\n });\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.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 PopupElement from '.';\nimport cardFormattingPatterns from '../../helpers/cards/cardFormattingPatterns';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport formatInputValueByPattern from '../../helpers/cards/formatInputValueByPattern';\nimport {validateAnyIncomplete, validateCardExpiry, validateCardNumber} from '../../helpers/cards/validateCard';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport noop from '../../helpers/noop';\nimport {PaymentsPaymentForm} from '../../layer';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\nimport CheckboxField from '../checkboxField';\nimport confirmationPopup from '../confirmationPopup';\nimport CountryInputField from '../countryInputField';\nimport InputField, {InputFieldOptions, InputState} from '../inputField';\nimport Row from '../row';\nimport {getPaymentBrandIconPath, PaymentButton, PaymentsCredentialsToken} from './payment';\nimport {createVerificationIframe} from './paymentVerification';\nimport {PasswordInputHelpers} from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport TelegramWebView from '../telegramWebView';\n\nexport type PaymentCardDetails = {\n cardNumber: string;\n cardholderName: string;\n expiryFull: string;\n expiryMonth: string;\n expiryYear: string;\n cvc: string;\n country: string;\n zip: string;\n save?: boolean;\n};\n\nexport type PaymentCardDetailsShort = {\n title: string,\n save?: boolean;\n icon?: string;\n};\n\nexport type PaymentCardDetailsResult = PaymentCardDetails | PaymentCardDetailsShort;\n\nexport class InputFieldCorrected extends InputField {\n private lastKeyDown: string;\n private lastTransformed: ReturnType;\n\n constructor(public options: InputFieldOptions & {\n formatMethod: typeof cardFormattingPatterns['cardNumber'],\n validateMethod?: typeof validateCardNumber,\n errorKeys?: {[code: string]: LangPackKey},\n optional?: boolean,\n onChange?: (transformed: InputFieldCorrected['lastTransformed']) => void,\n onKeyDown?: (e: KeyboardEvent) => void\n }) {\n super(options);\n\n // const handleIncomplete = (t?: any) => {\n // if(\n // (!lastTransformed.value && t) ||\n // lastTransformed.meta.autocorrectComplete ||\n // lastTransformed.meta.error ||\n // optional\n // ) {\n // return;\n // }\n\n\n // };\n\n this.input.addEventListener('keydown', this.onKeyDown);\n this.input.addEventListener('input', this.onInput);\n this.input.addEventListener('blur', this.onBlur);\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n this.lastKeyDown = e.key;\n this.options.onKeyDown?.(e);\n };\n\n private onInput = () => {\n const value = this.value;\n const deleting = this.lastKeyDown === 'Backspace' && (((this.lastTransformed && this.lastTransformed.value.length) || 0) - value.length) === 1;\n const result = this.lastTransformed = formatInputValueByPattern({\n value: value,\n getPattern: this.options.formatMethod,\n deleting,\n input: this.input\n });\n\n const transformedValue = result.value;\n if(transformedValue !== value) {\n this.setValueSilently(transformedValue);\n\n if(result.selection) {\n (this.input as HTMLInputElement).selectionStart = result.selection.selectionStart;\n (this.input as HTMLInputElement).selectionEnd = result.selection.selectionEnd;\n }\n }\n\n this.validateNew(transformedValue, {ignoreIncomplete: true/* !result.meta.autocorrectComplete */});\n\n this.options.onChange?.(result);\n };\n\n private onBlur = () => {\n const value = this.lastTransformed?.value;\n if(value) {\n this.validateNew(value);\n }\n };\n\n public update() {\n this.onInput();\n }\n\n public validate = () => {\n return this.validateNew();\n };\n\n public validateNew(\n value = this.lastTransformed?.value ?? '',\n t: any = {},\n justReturn?: boolean\n ) {\n let result: ReturnType;\n if(this.options.validateMethod) {\n result = this.options.validateMethod?.(value, t);\n } else {\n result = validateAnyIncomplete(this.lastTransformed, value, t);\n }\n\n if(result?.code) {\n const langPackKey: LangPackKey = this.options.errorKeys?.[result.code];\n !justReturn && this.setState(InputState.Error, langPackKey);\n return false;\n }\n\n !justReturn && this.setState(InputState.Neutral);\n return true;\n }\n}\n\nexport function handleInputFieldsOnChange(inputFields: (CountryInputField | InputField | InputFieldCorrected)[], _onChange: (valid: boolean) => void) {\n const onChange = () => {\n const valid = inputFields.every((inputField) => {\n return 'validateNew' in inputField ? inputField.validateNew(undefined, undefined, true) : inputField.isValid();\n });\n\n _onChange(valid);\n };\n\n inputFields.forEach((inputField) => {\n if(inputField instanceof InputFieldCorrected) {\n const original = inputField.options.onChange;\n inputField.options.onChange = (...args: any[]) => {\n // @ts-ignore\n original?.(...args);\n onChange();\n };\n\n if('update' in inputField) {\n inputField.update();\n }\n } else {\n inputField.input.addEventListener('input', onChange);\n }\n });\n\n return {validate: onChange};\n}\n\nexport function createCountryZipFields(country?: boolean, zip?: boolean) {\n let countryInputField: CountryInputField, postcodeInputField: InputFieldCorrected;\n if(country || zip) {\n if(country) countryInputField = new CountryInputField({\n noPhoneCodes: true,\n onCountryChange: () => {\n postcodeInputField?.update();\n },\n required: true,\n autocomplete: 'country'\n });\n if(zip) postcodeInputField = new InputFieldCorrected({\n label: 'PaymentShippingZipPlaceholder',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'postal-code',\n formatMethod: (/* ...args */) => {\n const {country} = countryInputField.getSelected();\n const iso2 = country?.iso2;\n return cardFormattingPatterns.postalCodeFromCountry(iso2 && iso2.toUpperCase());\n }\n });\n }\n\n return {countryInputField, postcodeInputField};\n}\n\nexport type PaymentsNativeProvider = 'stripe' | 'smartglocal';\nexport type PaymentsNativeParams = {\n need_country?: boolean,\n need_zip?: boolean,\n need_cardholder_name?: boolean,\n publishable_key?: string, // stripe\n public_token?: string, // smartglocal\n gpay_params: string,\n};\nconst SUPPORTED_NATIVE_PROVIDERS: Set = new Set(['stripe', 'smartglocal']);\n\nexport default class PopupPaymentCard extends PopupElement<{\n finish: (obj: {token: any, card: PaymentCardDetailsResult}) => void\n}> {\n protected telegramWebView: TelegramWebView;\n\n constructor(private paymentForm: PaymentsPaymentForm, private savedCard?: PaymentCardDetails) {\n super('popup-payment popup-payment-card', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider),\n title: 'PaymentCardInfo'\n });\n\n if(SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider)) {\n this.d();\n } else {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: paymentForm.url\n });\n\n telegramWebView.addEventListener('payment_form_submit', (data) => {\n const cardOut = {title: data.title, save: false} as any as PaymentCardDetails;\n this.dispatchEvent('finish', {\n token: data.credentials,\n card: cardOut\n });\n\n this.hide();\n\n if(paymentForm.pFlags.can_save_credentials) {\n confirmationPopup({\n titleLangKey: 'PaymentCardSavePaymentInformation',\n descriptionLangKey: 'PaymentCardSavePaymentInformationInfoLine1',\n button: {\n langKey: 'Save'\n }\n }).then(() => {\n cardOut.save = true;\n }, noop);\n }\n });\n\n // putPreloader(this.body, true);\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n\n private d() {\n const savedCard = this.savedCard;\n const cardSection = new SettingSection({name: 'PaymentInfo.Card.Title', noDelimiter: true, noShadow: true});\n\n const nativeParams: PaymentsNativeParams = JSON.parse(this.paymentForm.native_params.data);\n\n let lastBrand: string, brandIconTempId = 0, lastBrandImg: HTMLImageElement;\n const setBrandIcon = (brand: string) => {\n if(lastBrand === brand) {\n return;\n }\n\n const tempId = ++brandIconTempId;\n lastBrand = brand;\n\n const path = getPaymentBrandIconPath(brand);\n if(!path) {\n if(lastBrandImg) {\n lastBrandImg.remove();\n lastBrandImg = undefined;\n }\n\n return;\n }\n\n const img = new Image();\n img.classList.add('input-field-icon');\n renderImageFromUrlPromise(img, path, false).then(() => {\n if(brandIconTempId !== tempId) {\n return;\n }\n\n if(lastBrandImg) {\n lastBrandImg.replaceWith(img);\n } else {\n cardInputField.container.append(img);\n }\n\n lastBrandImg = img;\n });\n };\n const cardInputField = new InputFieldCorrected({\n label: 'PaymentCardNumber',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-number',\n formatMethod: cardFormattingPatterns.cardNumber,\n validateMethod: validateCardNumber,\n errorKeys: {\n invalid: 'PaymentCard.Error.Invalid',\n incomplete: 'PaymentCard.Error.Incomplete'\n },\n onChange: (transformed) => {\n setBrandIcon(detectUnifiedCardBrand(transformed.value));\n cvcInputField.update(); // format cvc\n }\n });\n\n let nameInputField: InputField;\n if(nativeParams.need_cardholder_name) nameInputField = new InputField({\n label: 'Checkout.NewCard.CardholderNamePlaceholder',\n maxLength: 255,\n required: true,\n autocomplete: 'cc-name'\n });\n\n const expireInputField = new InputFieldCorrected({\n label: 'SecureId.Identity.Placeholder.ExpiryDate',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-exp',\n formatMethod: cardFormattingPatterns.cardExpiry,\n validateMethod: validateCardExpiry\n });\n\n // handle autocomplete: 01/2345 -> 01/45\n expireInputField.input.addEventListener('input', () => {\n let value = expireInputField.value;\n if(value.length < 5) {\n return;\n }\n\n const splitted = value.split('/');\n if(splitted[1].length !== 4) {\n return;\n }\n\n value = [splitted[0], splitted[1].slice(2)].join('/');\n expireInputField.setValueSilently(value);\n }, {capture: true});\n\n const cvcInputField = new InputFieldCorrected({\n labelText: 'CVC',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-csc',\n name: 'cvc',\n formatMethod: () => cardFormattingPatterns.cardCvc(cardInputField.value)\n // validateMethod: (...args) => _5AH3.a.cardCvc(cardInputField.value)(...args)\n });\n\n const passwordHelpers = new PasswordInputHelpers(cvcInputField.container, cvcInputField.input as HTMLInputElement);\n\n const switchFocusOrder: (InputFieldCorrected | InputField)[] = [\n cardInputField,\n expireInputField,\n cvcInputField,\n nameInputField\n ].filter(Boolean);\n switchFocusOrder.forEach((inputField) => {\n const onKeyDown = (e: KeyboardEvent) => {\n if(!inputField.value && e.key === 'Backspace') {\n const previousInputField = switchFocusOrder[switchFocusOrder.indexOf(inputField) - 1];\n if(previousInputField) {\n // previousInputField.value = previousInputField.value.slice(0, -1);\n placeCaretAtEnd(previousInputField.input, true);\n }\n }\n };\n\n if(inputField instanceof InputFieldCorrected) {\n inputField.options.onKeyDown = onKeyDown;\n\n const original = inputField.options.onChange;\n inputField.options.onChange = (transformed) => {\n original?.(transformed);\n\n if(document.activeElement === inputField.input && transformed.meta.autocorrectComplete) {\n for(let i = switchFocusOrder.indexOf(inputField), length = switchFocusOrder.length; i < length; ++i) {\n const nextInputField = switchFocusOrder[i];\n if(\n nextInputField instanceof InputFieldCorrected ?\n !nextInputField.validateNew(undefined, undefined, true) :\n !nextInputField.value\n ) {\n placeCaretAtEnd(nextInputField.input, true);\n break;\n }\n }\n }\n };\n } else {\n inputField.input.addEventListener('keydown', onKeyDown);\n }\n });\n\n const inputFieldsRow = document.createElement('div');\n inputFieldsRow.classList.add('input-fields-row');\n inputFieldsRow.append(expireInputField.container, cvcInputField.container);\n\n const form = document.createElement('form');\n form.append(...[\n cardInputField.container,\n inputFieldsRow,\n nameInputField?.container\n ].filter(Boolean))\n\n cardSection.content.append(form);\n\n let billingSection: SettingSection;\n // let saveCheckboxField: CheckboxField;\n const {countryInputField, postcodeInputField} = createCountryZipFields(nativeParams.need_country, nativeParams.need_zip);\n if(nativeParams.need_country || nativeParams.need_zip) {\n billingSection = new SettingSection({name: 'PaymentInfo.Billing.Title', noDelimiter: true, noShadow: true});\n\n // const inputFieldsRow2 = inputFieldsRow.cloneNode() as HTMLElement;\n // inputFieldsRow2.append(countryInputField.container, postcodeInputField.container);\n // billingSection.content.append(inputFieldsRow2);\n billingSection.content.append(...[countryInputField, postcodeInputField].filter(Boolean).map((i) => i.container));\n }\n\n const canSave = !!this.paymentForm.pFlags.can_save_credentials;\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentCardSavePaymentInformation',\n checked: !!canSave\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: canSave ? 'PaymentCardSavePaymentInformationInfoLine1' : 'Checkout.2FA.Text'\n });\n\n if(!canSave) {\n saveRow.container.classList.add('is-disabled');\n }\n\n (billingSection || cardSection).content.append(saveRow.container);\n\n this.scrollable.append(...[cardSection, billingSection].filter(Boolean).map((s) => s.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const data: PaymentCardDetails = {\n cardNumber: cardInputField.value,\n expiryFull: expireInputField.value,\n expiryMonth: expireInputField.value.split('/')[0],\n expiryYear: expireInputField.value.split('/')[1],\n cvc: cvcInputField.value,\n\n cardholderName: nameInputField?.value,\n country: countryInputField?.value,\n zip: postcodeInputField?.value,\n\n save: saveCheckboxField?.checked\n };\n\n const nativeProvider: PaymentsNativeProvider = this.paymentForm.native_provider as any;\n let out: PaymentsCredentialsToken;\n if(nativeProvider === 'stripe') {\n const url = new URL('https://api.stripe.com/v1/tokens');\n url.search = new URLSearchParams({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvc,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n 'card[name]': data.cardholderName\n }).toString();\n\n const response = await fetch(url.toString(), {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': `Bearer ${nativeParams.publishable_key}`\n }\n });\n\n out = await response.json();\n } else if(nativeProvider === 'smartglocal') {\n const params = {\n card: {\n number: data.cardNumber.replace(/[^\\d]+/g, ''),\n expiration_month: data.expiryMonth,\n expiration_year: data.expiryYear,\n security_code: data.cvc.replace(/[^\\d]+/g, '')\n }\n };\n\n const url = /* DEBUG_PAYMENT_SMART_GLOCAL */false ?\n 'https://tgb-playground.smart-glocal.com/cds/v1/tokenize/card' :\n 'https://tgb.smart-glocal.com/cds/v1/tokenize/card';\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'X-PUBLIC-TOKEN': nativeParams.public_token\n },\n body: JSON.stringify(params)\n });\n\n const json: { // smartglocal\n data: {\n info: {\n card_network: string,\n card_type: string,\n masked_card_number: string\n },\n token: string\n },\n status: 'ok'\n } = await response.json();\n\n out = {type: 'card', token: json.data.token}\n }\n\n this.dispatchEvent('finish', {token: out, card: data});\n this.hide();\n }\n });\n\n const inputFields = ([\n cardInputField,\n nameInputField,\n expireInputField,\n cvcInputField,\n countryInputField,\n postcodeInputField\n ] as const).filter(Boolean);\n handleInputFieldsOnChange(inputFields, (valid) => {\n payButton.disabled = !valid;\n // payButton.classList.toggle('btn-disabled', !valid);\n });\n\n if(savedCard) {\n cardInputField.value = savedCard.cardNumber;\n expireInputField.value = savedCard.expiryFull;\n cvcInputField.value = savedCard.cvc;\n nameInputField && (nameInputField.value = savedCard.cardholderName);\n countryInputField && (countryInputField.value = savedCard.country);\n postcodeInputField && (postcodeInputField.value = savedCard.zip);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n\n if(!cardInputField.validateNew(undefined, undefined, true)) {\n placeCaretAtEnd(cardInputField.input);\n }\n }\n}\n","import formatValueByPattern from './formatValueByPattern';\n\nexport default function formatInputValueByPattern(options: {\n value: string,\n getPattern: Parameters[0],\n deleting?: boolean,\n input?: HTMLElement\n}) {\n const {value: originalValue, getPattern, deleting, input} = options;\n const pushRest = !deleting && !!originalValue.length;\n const result = formatValueByPattern(getPattern, originalValue, {\n selectionStart: input ? (input as HTMLInputElement).selectionStart : 0,\n selectionEnd: input ? (input as HTMLInputElement).selectionEnd : 0\n }, pushRest)\n const {value, selection} = result;\n\n return {\n value,\n meta: {\n autocorrectComplete: result.autocorrectComplete,\n empty: !value\n },\n selection\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {AccountPassword, AccountTmpPassword} from '../../layer';\nimport {InputState} from '../inputField';\nimport PasswordInputField from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentCardConfirmation extends PopupElement<{\n finish: (tmpPassword: AccountTmpPassword) => void\n}> {\n constructor(card: string, passwordState: AccountPassword) {\n super('popup-payment popup-payment-card-confirmation', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'Checkout.PasswordEntry.Title'\n });\n\n const section = new SettingSection({noDelimiter: true, noShadow: true, caption: 'Checkout.PasswordEntry.Text', captionArgs: [card]});\n const passwordInputField = new PasswordInputField({labelText: passwordState.hint});\n section.content.append(passwordInputField.container);\n this.scrollable.append(section.container);\n\n const onInput = () => {\n payButton.disabled = !passwordInputField.value;\n passwordInputField.setState(InputState.Neutral);\n };\n\n passwordInputField.input.addEventListener('input', onInput);\n\n const payButton = PaymentButton({\n key: 'Checkout.PasswordEntry.Pay',\n onClick: async() => {\n try {\n const inputCheckPassword = await this.managers.passwordManager.getInputCheckPassword(passwordInputField.value, passwordState);\n const tmpPassword = await this.managers.apiManager.invokeApi('account.getTmpPassword', {\n password: inputCheckPassword,\n period: 60\n });\n\n this.dispatchEvent('finish', tmpPassword);\n this.hide();\n } catch(err) {\n if((err as ApiError).type === 'PASSWORD_HASH_INVALID') {\n (err as ApiError).handled = true;\n passwordInputField.setError('PASSWORD_HASH_INVALID');\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n onInput();\n\n this.show();\n\n placeCaretAtEnd(passwordInputField.input);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {InputInvoice, PaymentRequestedInfo, PaymentsPaymentForm, PaymentsValidatedRequestedInfo} from '../../layer';\nimport matchEmail from '../../lib/richTextProcessor/matchEmail';\nimport CheckboxField from '../checkboxField';\nimport CountryInputField from '../countryInputField';\nimport InputField from '../inputField';\nimport Row from '../row';\nimport SettingSection from '../settingSection';\nimport TelInputField from '../telInputField';\nimport {PaymentButton} from './payment';\nimport {createCountryZipFields, handleInputFieldsOnChange, InputFieldCorrected} from './paymentCard';\n\nexport type PaymentShippingAddress = PaymentRequestedInfo;\n\ntype ShippingFocusField = 'name' | 'email' | 'phone';\n\nexport default class PopupPaymentShipping extends PopupElement<{\n finish: (o: {shippingAddress: PaymentShippingAddress, requestedInfo: PaymentsValidatedRequestedInfo}) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private inputInvoice: InputInvoice,\n private focus?: ShippingFocusField\n ) {\n super('popup-payment popup-payment-shipping', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingInfo'\n });\n\n this.d();\n }\n\n private d() {\n const paymentForm = this.paymentForm;\n const invoice = paymentForm.invoice;\n const savedInfo = this.paymentForm.saved_info;\n\n let addressSection: SettingSection,\n address1InputField: InputField,\n address2InputField: InputField,\n cityInputField: InputField,\n stateInputField: InputField,\n countryInputField: CountryInputField,\n postcodeInputField: InputFieldCorrected;\n if(invoice.pFlags.shipping_address_requested) {\n addressSection = new SettingSection({name: 'PaymentShippingAddress', noDelimiter: true, noShadow: true});\n address1InputField = new InputField({label: 'PaymentShippingAddress1Placeholder', maxLength: 64, required: true});\n address2InputField = new InputField({label: 'PaymentShippingAddress2Placeholder', maxLength: 64});\n cityInputField = new InputField({label: 'PaymentShippingCityPlaceholder', maxLength: 64, required: true});\n stateInputField = new InputField({label: 'PaymentShippingStatePlaceholder', maxLength: 64});\n const res = createCountryZipFields(true, true);\n countryInputField = res.countryInputField;\n postcodeInputField = res.postcodeInputField;\n\n addressSection.content.append(...[\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n let receiverSection: SettingSection;\n let nameInputField: InputField, emailInputField: InputField, telInputField: TelInputField;\n if([invoice.pFlags.name_requested, invoice.pFlags.email_requested, invoice.pFlags.phone_requested].includes(true)) {\n receiverSection = new SettingSection({name: 'PaymentShippingReceiver', noDelimiter: true, noShadow: true});\n\n const validateEmail = () => {\n const value = emailInputField.value;\n const match = matchEmail(value);\n if(!match || match[0].length !== value.length) {\n return false;\n }\n\n return true;\n };\n\n const validatePhone = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n if(invoice.pFlags.name_requested) nameInputField = new InputField({label: 'PaymentShippingName', maxLength: 256, required: true});\n if(invoice.pFlags.email_requested) emailInputField = new InputField({label: 'PaymentShippingEmailPlaceholder', maxLength: 64, required: true, validate: validateEmail});\n if(invoice.pFlags.phone_requested) telInputField = new TelInputField({required: true, validate: validatePhone});\n\n receiverSection.content.append(...[\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentShippingSave',\n checked: true\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: 'PaymentShippingSaveInfo'\n });\n\n (receiverSection || addressSection).content.append(saveRow.container);\n\n this.scrollable.append(...[addressSection, receiverSection].filter(Boolean).map((section) => section.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const selectedCountry = countryInputField && countryInputField.getSelected().country;\n const data: PaymentShippingAddress = {\n _: 'paymentRequestedInfo',\n shipping_address: selectedCountry && {\n _: 'postAddress',\n street_line1: address1InputField.value,\n street_line2: address2InputField.value,\n city: cityInputField.value,\n state: stateInputField.value,\n // country: countryInputField.value,\n country_iso2: selectedCountry?.iso2,\n post_code: postcodeInputField.value\n },\n name: nameInputField?.value,\n email: emailInputField?.value,\n phone: telInputField?.value\n };\n\n try {\n const requestedInfo = await this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice, data, saveCheckboxField?.checked);\n\n this.dispatchEvent('finish', {\n shippingAddress: data,\n requestedInfo\n });\n\n this.hide();\n } catch(err: any) {\n const errorMap: {[err: string]: InputField} = {\n ADDRESS_STREET_LINE1_INVALID: address1InputField,\n ADDRESS_STREET_LINE2_INVALID: address2InputField,\n ADDRESS_COUNTRY_INVALID: countryInputField,\n ADDRESS_CITY_INVALID: cityInputField,\n ADDRESS_STATE_INVALID: stateInputField,\n ADDRESS_POSTCODE_INVALID: postcodeInputField,\n\n REQ_INFO_NAME_INVALID: nameInputField,\n REQ_INFO_EMAIL_INVALID: emailInputField,\n REQ_INFO_PHONE_INVALID: telInputField\n };\n\n const inputField = errorMap[(err as ApiError).type];\n if(inputField) {\n inputField.setError();\n (err as any).handled = true;\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n if(savedInfo) {\n const shippingAddress = savedInfo.shipping_address;\n if(shippingAddress) {\n address1InputField.value = shippingAddress.street_line1;\n address2InputField.value = shippingAddress.street_line2;\n cityInputField.value = shippingAddress.city;\n stateInputField.value = shippingAddress.state;\n countryInputField.selectCountryByIso2(shippingAddress.country_iso2);\n postcodeInputField.value = shippingAddress.post_code;\n }\n\n savedInfo.name && nameInputField && (nameInputField.value = savedInfo.name);\n savedInfo.email && emailInputField && (emailInputField.value = savedInfo.email);\n savedInfo.phone && telInputField && (telInputField.value = savedInfo.phone);\n }\n\n const {validate} = handleInputFieldsOnChange([\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField,\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean), (valid) => {\n payButton.disabled = !valid;\n });\n\n validate();\n\n this.show();\n\n let focusField: InputField;\n if(this.focus) {\n const focusMap: {[field in ShippingFocusField]?: InputField} = {\n name: nameInputField,\n email: emailInputField,\n phone: telInputField\n };\n\n focusField = focusMap[this.focus];\n } else {\n focusField = address1InputField;\n }\n\n if(focusField) {\n placeCaretAtEnd(focusField.input);\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 PopupElement from '.';\nimport accumulate from '../../helpers/array/accumulate';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {PaymentsPaymentForm, PaymentsValidatedRequestedInfo, ShippingOption} from '../../layer';\nimport RadioField from '../radioField';\nimport Row, {RadioFormFromRows} from '../row';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentShippingMethods extends PopupElement<{\n finish: (shippingOption: ShippingOption) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private requestedInfo: PaymentsValidatedRequestedInfo,\n private shippingOption: ShippingOption\n ) {\n super('popup-payment popup-payment-shipping-methods', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingMethod'\n });\n\n this.d();\n }\n\n private d() {\n const section = new SettingSection({name: 'PaymentCheckoutShippingMethod', noDelimiter: true, noShadow: true});\n\n const rows = this.requestedInfo.shipping_options.map((shippingOption) => {\n return new Row({\n radioField: new RadioField({\n text: shippingOption.title,\n name: 'shipping-method',\n value: shippingOption.id\n }),\n subtitle: paymentsWrapCurrencyAmount(\n accumulate(shippingOption.prices.map(({amount}) => +amount), 0),\n this.paymentForm.invoice.currency\n )\n });\n });\n\n let lastShippingId: string;\n const form = RadioFormFromRows(rows, (value) => {\n lastShippingId = value;\n });\n\n if(this.shippingOption) {\n rows.find((row) => row.radioField.input.value === this.shippingOption.id).radioField.checked = true;\n } else {\n rows[0].radioField.checked = true;\n }\n\n section.content.append(form);\n\n this.scrollable.append(section.container);\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: () => {\n this.dispatchEvent('finish', this.requestedInfo.shipping_options.find((option) => option.id === lastShippingId));\n this.hide();\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport Currencies from '../../config/currencies';\nimport {FontFamily, FontSize} from '../../config/font';\nimport accumulate from '../../helpers/array/accumulate';\nimport getTextWidth from '../../helpers/canvas/getTextWidth';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport tsNow from '../../helpers/tsNow';\nimport {AccountTmpPassword, InputInvoice, InputPaymentCredentials, LabeledPrice, Message, MessageMedia, PaymentRequestedInfo, PaymentSavedCredentials, PaymentsPaymentForm, PaymentsPaymentReceipt, PaymentsValidatedRequestedInfo, PostAddress, ShippingOption} from '../../layer';\nimport I18n, {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport CheckboxField from '../checkboxField';\nimport PeerTitle from '../peerTitle';\nimport {putPreloader} from '../putPreloader';\nimport Row from '../row';\nimport {toastNew} from '../toast';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapPhoto from '../wrappers/photo';\nimport PopupPaymentCard, {PaymentCardDetails, PaymentCardDetailsResult} from './paymentCard';\nimport PopupPaymentCardConfirmation from './paymentCardConfirmation';\nimport PopupPaymentShipping, {PaymentShippingAddress} from './paymentShipping';\nimport PopupPaymentShippingMethods from './paymentShippingMethods';\nimport PopupPaymentVerification from './paymentVerification';\n\nconst iconPath = 'assets/img/';\nconst icons = [\n 'amex',\n 'card',\n 'diners',\n 'discover',\n 'jcb',\n 'mastercard',\n 'visa',\n 'unionpay',\n 'mir',\n 'logo'\n];\n\nexport function getPaymentBrandIconPath(brand: string) {\n if(!icons.includes(brand)) {\n return;\n }\n\n return `${iconPath}${brand}.svg`;\n}\n\nexport function PaymentButton(options: {\n onClick: () => Promise | void,\n key?: LangPackKey,\n textEl?: I18n.IntlElement\n}) {\n const textEl = options.textEl ?? new I18n.IntlElement({key: options.key ?? 'PaymentInfo.Done'});\n const key = textEl.key;\n const payButton = Button('btn-primary btn-color-primary payment-item-pay');\n payButton.append(textEl.element);\n attachClickEvent(payButton, async() => {\n const result = options.onClick();\n if(!(result instanceof Promise)) {\n return;\n }\n\n const d = putPreloader(payButton);\n const toggle = toggleDisability([payButton], true);\n textEl.compareAndUpdate({key: 'PleaseWait'});\n try {\n await result;\n } catch(err) {\n if(!(err as any).handled) {\n console.error('payment button error', err);\n }\n\n toggle();\n textEl.compareAndUpdate({key});\n d.remove();\n }\n });\n return payButton;\n}\n\nexport type PaymentsCredentialsToken = {type: 'card', token?: string, id?: string};\n\nexport default class PopupPayment extends PopupElement {\n private tipButtonsMap: Map;\n\n constructor(\n private message: Message.message,\n private inputInvoice: InputInvoice,\n private paymentForm?: PaymentsPaymentForm | PaymentsPaymentReceipt,\n private isReceipt?: boolean\n ) {\n super('popup-payment', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: true\n });\n\n this.tipButtonsMap = new Map();\n this.d().catch((err) => {\n console.error('payment popup error', err);\n this.hide();\n });\n }\n\n private async d() {\n this.element.classList.add('is-loading');\n this.show();\n\n let confirmed = false;\n const onConfirmed = () => {\n if(confirmed) {\n return;\n }\n\n confirmed = true;\n if(popupPaymentVerification) {\n popupPaymentVerification.hide();\n }\n\n this.hide();\n };\n\n let {paymentForm, message} = this;\n\n if(message) {\n this.listenerSetter.add(rootScope)('payment_sent', ({peerId, mid}) => {\n if(message.peerId === peerId && message.mid === mid) {\n onConfirmed();\n }\n });\n }\n\n const mediaInvoice = message?.media as MessageMedia.messageMediaInvoice;\n const isReceipt = this.isReceipt ??\n (\n mediaInvoice ?\n !!mediaInvoice.receipt_msg_id || mediaInvoice.extended_media?._ === 'messageExtendedMedia' :\n paymentForm._ === 'payments.paymentReceipt'\n );\n const isTest = mediaInvoice ? mediaInvoice.pFlags.test : paymentForm.invoice.pFlags.test;\n\n const photo = mediaInvoice ? mediaInvoice.photo : paymentForm.photo;\n const title = mediaInvoice ? mediaInvoice.title : paymentForm.title;\n const description = mediaInvoice ? mediaInvoice.description : paymentForm.description;\n\n _i18n(this.title, isReceipt ? 'PaymentReceipt' : 'PaymentCheckout');\n if(isTest) {\n this.title.append(' (Test)');\n }\n\n const className = 'payment-item';\n\n const itemEl = document.createElement('div');\n itemEl.classList.add(className);\n\n const detailsClassName = className + '-details';\n const details = document.createElement('div');\n details.classList.add(detailsClassName);\n\n let photoEl: HTMLElement;\n if(photo) {\n photoEl = document.createElement('div');\n photoEl.classList.add(detailsClassName + '-photo', 'media-container-contain');\n wrapPhoto({\n photo: photo,\n container: photoEl,\n boxWidth: 100,\n boxHeight: 100,\n size: {_: 'photoSizeEmpty', type: ''}\n });\n details.append(photoEl);\n }\n\n const linesClassName = detailsClassName + '-lines';\n const linesEl = document.createElement('div');\n linesEl.classList.add(linesClassName);\n\n const titleEl = document.createElement('div');\n titleEl.classList.add(linesClassName + '-title');\n\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add(linesClassName + '-description');\n\n const botName = document.createElement('div');\n botName.classList.add(linesClassName + '-bot-name');\n\n linesEl.append(titleEl, descriptionEl, botName);\n\n setInnerHTML(titleEl, wrapEmojiText(title));\n setInnerHTML(descriptionEl, wrapEmojiText(description));\n\n const peerTitle = new PeerTitle();\n botName.append(peerTitle.element);\n\n details.append(linesEl);\n itemEl.append(details);\n this.scrollable.append(itemEl);\n\n const preloaderContainer = document.createElement('div');\n preloaderContainer.classList.add(className + '-preloader-container');\n const preloader = putPreloader(preloaderContainer, true);\n this.scrollable.container.append(preloaderContainer);\n\n const inputInvoice = this.inputInvoice;\n if(!paymentForm) {\n if(isReceipt) paymentForm = await this.managers.appPaymentsManager.getPaymentReceipt(message.peerId, mediaInvoice.receipt_msg_id || (inputInvoice as InputInvoice.inputInvoiceMessage).msg_id);\n else paymentForm = await this.managers.appPaymentsManager.getPaymentForm(inputInvoice);\n this.paymentForm = paymentForm;\n }\n\n let savedInfo = (paymentForm as PaymentsPaymentForm).saved_info || (paymentForm as PaymentsPaymentReceipt).info;\n const savedCredentials = (paymentForm as PaymentsPaymentForm).saved_credentials?.[0];\n let [lastRequestedInfo, passwordState, providerPeerTitle] = await Promise.all([\n !isReceipt && savedInfo && this.managers.appPaymentsManager.validateRequestedInfo(inputInvoice, savedInfo),\n savedCredentials && this.managers.passwordManager.getState(),\n wrapPeerTitle({peerId: paymentForm.provider_id.toPeerId()})\n ]);\n\n // console.log(paymentForm, lastRequestedInfo);\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const wrapAmount = (amount: string | number, skipSymbol?: boolean) => {\n return paymentsWrapCurrencyAmount(amount, currency, skipSymbol);\n };\n\n const {invoice} = paymentForm;\n const currency = invoice.currency;\n\n const isRecurring = invoice.pFlags.recurring && !isReceipt;\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n const peerTitle2 = isRecurring ? await wrapPeerTitle({peerId: paymentForm.bot_id.toPeerId()}) : undefined;\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const makeLabel = () => {\n const labelEl = document.createElement('div');\n labelEl.classList.add(pricesClassName + '-price');\n\n const left = document.createElement('span');\n const right = document.createElement('span');\n labelEl.append(left, right);\n return {label: labelEl, left, right};\n };\n\n const pricesClassName = className + '-prices';\n const prices = document.createElement('div');\n prices.classList.add(pricesClassName);\n const makePricesElements = (prices: LabeledPrice[]) => {\n return prices.map((price) => {\n const {amount, label} = price;\n\n const _label = makeLabel();\n _label.left.textContent = label;\n\n const wrappedAmount = wrapAmount(amount);\n _label.right.textContent = wrappedAmount;\n\n return _label.label;\n });\n };\n\n const pricesElements = makePricesElements(invoice.prices);\n\n let getTipsAmount = (): number => 0;\n let shippingAmount = 0;\n\n const getTotalTotal = () => totalAmount + getTipsAmount() + shippingAmount;\n const setTotal = () => {\n const wrapped = wrapAmount(getTotalTotal());\n totalLabel.right.textContent = wrapped;\n payI18n.compareAndUpdate({\n key: 'PaymentCheckoutPay',\n args: [wrapped]\n });\n };\n\n const payI18n = new I18n.IntlElement();\n\n const totalLabel = makeLabel();\n totalLabel.label.classList.add('is-total');\n _i18n(totalLabel.left, 'PaymentTransactionTotal');\n const totalAmount = accumulate(invoice.prices.map(({amount}) => +amount), 0);\n\n const canTip = (invoice.max_tip_amount !== undefined && !isReceipt) || !!(paymentForm as PaymentsPaymentReceipt).tip_amount;\n if(canTip) {\n const tipsClassName = className + '-tips';\n\n const currencyData = Currencies[currency];\n\n getTipsAmount = () => +getInputValue().replace(/\\D/g, '');\n\n const getInputValue = () => {\n // return input.textContent;\n return input.value;\n };\n\n const setInputWidth = () => {\n const width = getTextWidth(getInputValue(), `500 ${FontSize} ${FontFamily}`);\n input.style.width = width + 'px';\n };\n\n const setInputValue = (amount: string | number) => {\n amount = Math.min(+amount, +invoice.max_tip_amount);\n const wrapped = wrapAmount(amount, true);\n\n input.value = wrapped;\n // input.textContent = wrapped;\n if(document.activeElement === input) {\n placeCaretAtEnd(input);\n }\n\n unsetActiveTip && unsetActiveTip();\n const tipEl = this.tipButtonsMap.get(amount);\n if(tipEl) {\n tipEl.classList.add('active');\n }\n\n setInputWidth();\n setTotal();\n };\n\n const tipsLabel = makeLabel();\n _i18n(tipsLabel.left, isReceipt ? 'PaymentTip' : 'PaymentTipOptional');\n const input = document.createElement('input');\n input.type = 'tel';\n // const input: HTMLElement = document.createElement('div');\n // input.contentEditable = 'true';\n input.classList.add('input-clear', tipsClassName + '-input');\n tipsLabel.right.append(input);\n\n if(!isReceipt) {\n tipsLabel.label.style.cursor = 'text';\n } else {\n tipsLabel.label.classList.add('disable-hover');\n }\n\n tipsLabel.label.addEventListener('mousedown', (e) => {\n if(!findUpAsChild(e.target as HTMLElement, input)) {\n placeCaretAtEnd(input);\n }\n });\n\n const haveToIgnoreEvents = input instanceof HTMLInputElement ? 1 : 2;\n const onSelectionChange = () => {\n if(ignoreNextSelectionChange) {\n --ignoreNextSelectionChange;\n return;\n }\n\n // setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n // }, 0);\n };\n\n const onFocus = () => {\n // cancelEvent(e);\n setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n document.addEventListener('selectionchange', onSelectionChange);\n }, 0);\n };\n\n const onFocusOut = () => {\n input.addEventListener('focus', onFocus, {once: true});\n document.removeEventListener('selectionchange', onSelectionChange);\n };\n\n let ignoreNextSelectionChange: number;\n input.addEventListener('focusout', onFocusOut);\n onFocusOut();\n\n input.addEventListener('input', () => {\n setInputValue(getTipsAmount());\n });\n\n const s = [currencyData.symbol, currencyData.space_between ? ' ' : ''];\n if(!currencyData.symbol_left) s.reverse();\n tipsLabel.right[currencyData.symbol_left ? 'prepend' : 'append'](s.join(''));\n\n pricesElements.push(tipsLabel.label);\n\n //\n let unsetActiveTip: () => void;\n if(!isReceipt) {\n const tipsEl = document.createElement('div');\n tipsEl.classList.add(tipsClassName);\n\n const tipClassName = tipsClassName + '-tip';\n const tipButtons = invoice.suggested_tip_amounts.map((tipAmount) => {\n const button = Button(tipClassName, {noRipple: true});\n button.textContent = wrapAmount(tipAmount);\n\n this.tipButtonsMap.set(+tipAmount, button);\n return button;\n });\n\n unsetActiveTip = () => {\n const prevTipEl = tipsEl.querySelector('.active');\n if(prevTipEl) {\n prevTipEl.classList.remove('active');\n }\n };\n\n attachClickEvent(tipsEl, (e) => {\n const tipEl = findUpClassName(e.target, tipClassName);\n if(!tipEl) {\n return;\n }\n\n let tipAmount = 0;\n if(tipEl.classList.contains('active')) {\n tipEl.classList.remove('active');\n } else {\n unsetActiveTip();\n tipEl.classList.add('active');\n\n for(const [amount, el] of this.tipButtonsMap) {\n if(el === tipEl) {\n tipAmount = amount;\n break;\n }\n }\n }\n\n setInputValue(tipAmount);\n });\n\n setInputValue(0);\n\n tipsEl.append(...tipButtons);\n pricesElements.push(tipsEl);\n } else {\n setInputValue((paymentForm as PaymentsPaymentReceipt).tip_amount);\n }\n } else {\n setTotal();\n }\n\n pricesElements.push(totalLabel.label);\n\n prices.append(...pricesElements);\n itemEl.append(prices);\n\n // /\n\n const setRowIcon = async(row: Row, icon?: string) => {\n const img = document.createElement('img');\n img.classList.add('media-photo');\n await renderImageFromUrlPromise(img, getPaymentBrandIconPath(icon));\n let container = row.media;\n if(!container) {\n container = row.createMedia('small');\n container.classList.add('media-container-cover');\n container.append(img);\n } else {\n replaceContent(container, img);\n }\n\n row.container.classList.remove('row-with-icon');\n };\n\n const createRow = (options: ConstructorParameters[0]) => {\n if(options.titleLangKey) {\n options.subtitleLangKey = options.titleLangKey;\n }\n\n options.noWrap = true;\n const row = new Row(options);\n row.container.classList.add(className + '-row');\n\n if(options.titleLangKey) {\n row.subtitle.classList.add('hide');\n }\n\n return row;\n };\n\n const setRowTitle = (row: Row, textContent: string) => {\n row.title.textContent = textContent;\n if(!textContent) {\n const e = I18n.weakMap.get(row.subtitle.firstElementChild as HTMLElement) as I18n.IntlElement;\n row.title.append(i18n(e.key));\n }\n\n row.subtitle.classList.toggle('hide', !textContent);\n };\n\n const setCardSubtitle = (card: PaymentCardDetailsResult) => {\n let brand: string;\n let str: string;\n let icon: string;\n if('title' in card) {\n brand = card.title.split(' ').shift();\n str = card.title;\n icon = card.icon;\n } else {\n brand = detectUnifiedCardBrand(card.cardNumber);\n str = brand + ' *' + card.cardNumber.split(' ').pop();\n }\n\n methodRow.title.classList.remove('tgico', 'tgico-card_outline');\n setRowIcon(methodRow, icon || brand.toLowerCase());\n setRowTitle(methodRow, str);\n };\n\n const onMethodClick = () => {\n new PopupPaymentCard(paymentForm as PaymentsPaymentForm, previousCardDetails as PaymentCardDetails).addEventListener('finish', ({token, card}) => {\n previousToken = token, previousCardDetails = card;\n\n setCardSubtitle(card);\n });\n };\n\n let previousCardDetails: PaymentCardDetailsResult, previousToken: PaymentsCredentialsToken;\n const methodRow = createRow({\n titleLangKey: 'PaymentCheckoutMethod',\n clickable: isReceipt ? undefined : onMethodClick,\n icon: 'card_outline'\n });\n\n methodRow.container.classList.add(className + '-method-row');\n\n if(savedCredentials) {\n setCardSubtitle(savedCredentials);\n } else if((paymentForm as PaymentsPaymentReceipt).credentials_title) {\n setCardSubtitle({title: (paymentForm as PaymentsPaymentReceipt).credentials_title});\n }\n\n const providerRow = createRow({\n title: providerPeerTitle,\n subtitleLangKey: 'PaymentCheckoutProvider'\n });\n\n const providerAvatar = new AvatarElement();\n providerAvatar.classList.add('avatar-32');\n providerRow.createMedia('small').append(providerAvatar);\n /* await */ providerAvatar.updateWithOptions({peerId: paymentForm.provider_id.toPeerId()});\n\n let shippingAddressRow: Row, shippingNameRow: Row, shippingEmailRow: Row, shippingPhoneRow: Row, shippingMethodRow: Row;\n let lastShippingOption: ShippingOption, onShippingAddressClick: (focus?: ConstructorParameters[2]) => void, onShippingMethodClick: () => void;\n const setShippingTitle = invoice.pFlags.shipping_address_requested ? (shippingAddress?: PaymentShippingAddress) => {\n if(!shippingAddress) {\n shippingMethodRow.subtitle.classList.add('hide');\n replaceContent(shippingMethodRow.title, i18n('PaymentShippingAddress'));\n return;\n }\n\n const postAddress = shippingAddress.shipping_address;\n setRowTitle(shippingAddressRow, [postAddress.city, postAddress.street_line1, postAddress.street_line2].filter(Boolean).join(', '));\n\n shippingMethodRow.container.classList.toggle('hide', !lastRequestedInfo && !isReceipt);\n } : undefined;\n\n const setShippingInfo = (info: PaymentRequestedInfo) => {\n setShippingTitle && setShippingTitle(info);\n shippingNameRow && setRowTitle(shippingNameRow, info.name);\n shippingEmailRow && setRowTitle(shippingEmailRow, info.email);\n shippingPhoneRow && setRowTitle(shippingPhoneRow, info.phone && ('+' + formatPhoneNumber(info.phone).formatted));\n };\n\n if(!isReceipt) {\n onShippingAddressClick = (focus) => {\n new PopupPaymentShipping(paymentForm as PaymentsPaymentForm, inputInvoice, focus).addEventListener('finish', ({shippingAddress, requestedInfo}) => {\n lastRequestedInfo = requestedInfo;\n savedInfo = (paymentForm as PaymentsPaymentForm).saved_info = shippingAddress;\n setShippingInfo(shippingAddress);\n });\n };\n }\n\n if(invoice.pFlags.shipping_address_requested) {\n const setShippingOption = (shippingOption?: ShippingOption) => {\n const scrollSaver = new ScrollSaver(this.scrollable, undefined, true);\n scrollSaver.save();\n if(lastShippingPricesElements) {\n lastShippingPricesElements.forEach((node) => node.remove());\n }\n\n if(!shippingOption) {\n shippingAmount = 0;\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n return;\n }\n\n lastShippingOption = shippingOption;\n setRowTitle(shippingMethodRow, shippingOption.title);\n\n shippingAmount = accumulate(shippingOption.prices.map(({amount}) => +amount), 0);\n lastShippingPricesElements = makePricesElements(shippingOption.prices);\n let l = totalLabel.label;\n if(canTip) {\n l = l.previousElementSibling as any;\n if(!isReceipt) {\n l = l.previousElementSibling as any;\n }\n }\n\n lastShippingPricesElements.forEach((element) => l.parentElement.insertBefore(element, l));\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n };\n\n shippingAddressRow = createRow({\n icon: 'location',\n titleLangKey: 'PaymentShippingAddress',\n clickable: !isReceipt && onShippingAddressClick.bind(null, undefined)\n });\n\n let lastShippingPricesElements: HTMLElement[];\n shippingMethodRow = createRow({\n icon: 'shipping',\n titleLangKey: 'PaymentCheckoutShippingMethod',\n clickable: !isReceipt && (onShippingMethodClick = () => {\n new PopupPaymentShippingMethods(paymentForm as PaymentsPaymentForm, lastRequestedInfo, lastShippingOption).addEventListener('finish', (shippingOption) => {\n setShippingOption(shippingOption);\n });\n })\n });\n\n shippingMethodRow.container.classList.add('hide');\n\n const shippingOption = (paymentForm as PaymentsPaymentReceipt).shipping;\n if(shippingOption) {\n setShippingOption(shippingOption);\n }\n }\n\n if(invoice.pFlags.name_requested) {\n shippingNameRow = createRow({\n icon: 'newprivate',\n titleLangKey: 'PaymentCheckoutName',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'name')\n });\n }\n\n if(invoice.pFlags.email_requested) {\n shippingEmailRow = createRow({\n icon: 'mention',\n titleLangKey: 'PaymentShippingEmailPlaceholder',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'email')\n });\n }\n\n if(invoice.pFlags.phone_requested) {\n shippingPhoneRow = createRow({\n icon: 'phone',\n titleLangKey: 'PaymentCheckoutPhoneNumber',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'phone')\n });\n }\n\n if(savedInfo) {\n setShippingInfo(savedInfo);\n }\n\n const rows = [\n methodRow,\n providerRow,\n shippingAddressRow,\n shippingMethodRow,\n shippingNameRow,\n shippingEmailRow,\n shippingPhoneRow\n ].filter(Boolean);\n\n const acceptTermsCheckboxField = isRecurring && new CheckboxField({\n text: 'Payments.Recurrent.Accept',\n textArgs: [wrapRichText(invoice.recurring_terms_url), peerTitle2]\n });\n\n const acceptTermsRow = isRecurring && createRow({\n checkboxField: acceptTermsCheckboxField\n });\n\n const recurringElements = isRecurring ? [document.createElement('hr'), acceptTermsRow.container] : [];\n\n this.scrollable.append(...[\n document.createElement('hr'),\n ...rows.map((row) => row.container),\n ...recurringElements\n ].filter(Boolean));\n\n // /\n let popupPaymentVerification: PopupPaymentVerification, lastTmpPasword: AccountTmpPassword;\n const onClick = () => {\n const missingInfo = invoice.pFlags.name_requested && !savedInfo?.name ? 'name' : (invoice.pFlags.email_requested && !savedInfo?.email ? 'email' : (invoice.pFlags.phone_requested && !savedInfo?.phone ? 'phone' : undefined));\n if(invoice.pFlags.shipping_address_requested) {\n if(!lastRequestedInfo) {\n onShippingAddressClick();\n return;\n } else if(!lastShippingOption) {\n onShippingMethodClick();\n return;\n }\n } else if(missingInfo) {\n onShippingAddressClick(missingInfo);\n return;\n }\n\n if(!previousCardDetails && !lastTmpPasword) {\n if(!savedCredentials) {\n onMethodClick();\n return;\n }\n\n Promise.resolve(passwordState ?? this.managers.passwordManager.getState()).then((_passwordState) => {\n new PopupPaymentCardConfirmation(savedCredentials.title, _passwordState).addEventListener('finish', (tmpPassword) => {\n passwordState = undefined;\n lastTmpPasword = tmpPassword;\n simulateClickEvent(payButton);\n\n // * reserve 5 seconds\n const diff = tmpPassword.valid_until - tsNow(true) - 5;\n setTimeout(() => {\n if(lastTmpPasword === tmpPassword) {\n lastTmpPasword = undefined;\n }\n }, diff * 1000);\n });\n });\n\n return;\n }\n\n return Promise.resolve().then(async() => {\n const credentials: InputPaymentCredentials = lastTmpPasword ? {\n _: 'inputPaymentCredentialsSaved',\n id: savedCredentials.id,\n tmp_password: lastTmpPasword.tmp_password\n } : {\n _: 'inputPaymentCredentials',\n data: {\n _: 'dataJSON',\n data: JSON.stringify(previousToken.token ? previousToken : {type: previousToken.type, id: previousToken.id})\n },\n pFlags: {\n save: previousCardDetails.save || undefined\n }\n };\n\n try {\n const paymentResult = await this.managers.appPaymentsManager.sendPaymentForm(\n inputInvoice,\n (paymentForm as PaymentsPaymentForm).form_id,\n lastRequestedInfo?.id,\n lastShippingOption?.id,\n credentials,\n getTipsAmount()\n );\n\n if(paymentResult._ === 'payments.paymentResult') {\n onConfirmed();\n } else {\n popupPaymentVerification = new PopupPaymentVerification(paymentResult.url, !mediaInvoice.extended_media);\n popupPaymentVerification.addEventListener('finish', () => {\n popupPaymentVerification = undefined;\n\n onConfirmed();\n });\n await new Promise((resolve, reject) => {\n popupPaymentVerification.addEventListener('close', () => {\n popupPaymentVerification = undefined;\n if(confirmed) {\n resolve();\n } else {\n const err = new Error('payment not finished');\n (err as ApiError).handled = true;\n reject(err);\n }\n });\n });\n }\n } catch(err) {\n if((err as ApiError).type === 'BOT_PRECHECKOUT_TIMEOUT') {\n toastNew({langPackKey: 'Error.AnError'});\n (err as ApiError).handled = true;\n } else if((err as ApiError).type === 'TMP_PASSWORD_INVALID') {\n passwordState = lastTmpPasword = undefined;\n simulateClickEvent(payButton);\n (err as ApiError).handled = true;\n }\n\n throw err;\n }\n });\n };\n\n const onChange = () => {\n payButton.disabled = !!(acceptTermsCheckboxField && !acceptTermsCheckboxField.checked);\n };\n\n let payButton: HTMLButtonElement;\n if(isReceipt) {\n payButton = PaymentButton({\n onClick: () => this.hide(),\n key: 'Done'\n });\n } else {\n payButton = PaymentButton({\n onClick: onClick,\n textEl: payI18n\n });\n }\n\n onChange();\n if(acceptTermsCheckboxField) {\n acceptTermsCheckboxField.input.addEventListener('change', onChange);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.onContentUpdate();\n }\n}\n","/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\nFor license and copyright information please follow this link:\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\n*/\n\nimport accumulate from '../helpers/array/accumulate';\nimport clamp from '../helpers/number/clamp';\n\ntype Size = {w: number, h: number};\nexport type GroupMediaLayout = {\n geometry: {\n x: number,\n y: number,\n width: number,\n height: number\n },\n sides: number\n};\ntype Attempt = {\n lineCounts: number[],\n heights: number[]\n};\nexport const RectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8\n};\n\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\nexport class Layouter {\n private count: number;\n private ratios: number[];\n private proportions: string;\n private averageRatio: number;\n private maxSizeRatio: number;\n\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\n this.count = sizes.length;\n this.ratios = Layouter.countRatios(sizes);\n this.proportions = Layouter.countProportions(this.ratios);\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\n this.maxSizeRatio = maxWidth / this.maxHeight;\n }\n\n public layout(): GroupMediaLayout[] {\n if(!this.count) return [];\n // else if(this.count === 1) return this.layoutOne();\n\n if(this.count >= 5 || this.ratios.find((r) => r > 2)) {\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\n }\n\n if(this.count === 2) return this.layoutTwo();\n else if(this.count === 3) return this.layoutThree();\n return this.layoutFour();\n }\n\n private layoutTwo(): ReturnType {\n if((this.proportions === 'ww') &&\n (this.averageRatio > 1.4 * this.maxSizeRatio) &&\n (this.ratios[1] - this.ratios[0] < 0.2)) {\n return this.layoutTwoTopBottom();\n } else if(this.proportions === 'ww' || this.proportions === 'qq') {\n return this.layoutTwoLeftRightEqual();\n }\n return this.layoutTwoLeftRight();\n }\n\n private layoutThree(): ReturnType {\n // console.log('layoutThree:', this);\n if(this.proportions[0] === 'n') {\n return this.layoutThreeLeftAndOther();\n }\n return this.layoutThreeTopAndOther();\n }\n\n private layoutFour(): ReturnType {\n if(this.proportions[0] === 'w') {\n return this.layoutFourTopAndOther();\n }\n return this.layoutFourLeftAndOther();\n }\n\n private layoutTwoTopBottom(): ReturnType {\n const width = this.maxWidth;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(\n width / this.ratios[1],\n (this.maxHeight - this.spacing) / 2)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: height + this.spacing, width, height},\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutTwoLeftRightEqual(): ReturnType {\n const width = (this.maxWidth - this.spacing) / 2;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: width + this.spacing, y: 0, width, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutTwoLeftRight(): ReturnType {\n const minimalWidth = Math.round(this.minWidth * 1.5);\n const secondWidth = Math.min(\n Math.round(Math.max(\n 0.4 * (this.maxWidth - this.spacing),\n (this.maxWidth - this.spacing) / this.ratios[0] /\n (1 / this.ratios[0] + 1 / this.ratios[1]))),\n this.maxWidth - this.spacing - minimalWidth);\n const firstWidth = this.maxWidth -\n secondWidth -\n this.spacing;\n const height = Math.min(\n this.maxHeight,\n Math.round(Math.min(\n firstWidth / this.ratios[0],\n secondWidth / this.ratios[1])));\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutThreeLeftAndOther(): ReturnType {\n const firstHeight = this.maxHeight;\n const thirdHeight = Math.round(Math.min(\n (this.maxHeight - this.spacing) / 2.,\n (this.ratios[1] * (this.maxWidth - this.spacing) /\n (this.ratios[2] + this.ratios[1]))));\n const secondHeight = firstHeight -\n thirdHeight -\n this.spacing;\n const rightWidth = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - this.spacing) / 2.,\n Math.min(\n thirdHeight * this.ratios[2],\n secondHeight * this.ratios[1]))));\n const leftWidth = Math.min(\n Math.round(firstHeight * this.ratios[0]),\n this.maxWidth - this.spacing - rightWidth);\n\n return [\n {\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutThreeTopAndOther(): ReturnType {\n const firstWidth = this.maxWidth;\n const firstHeight = Math.round(Math.min(\n firstWidth / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const secondWidth = (this.maxWidth - this.spacing) / 2;\n const secondHeight = Math.min(\n this.maxHeight - firstHeight - this.spacing,\n Math.round(Math.min(\n secondWidth / this.ratios[1],\n secondWidth / this.ratios[2])));\n const thirdWidth = firstWidth - secondWidth - this.spacing;\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutFourTopAndOther(): ReturnType {\n const w = this.maxWidth;\n const h0 = Math.round(Math.min(\n w / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const h = Math.round(\n (this.maxWidth - 2 * this.spacing) /\n (this.ratios[1] + this.ratios[2] + this.ratios[3]));\n const w0 = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - 2 * this.spacing) * 0.4,\n h * this.ratios[1])));\n const w2 = Math.round(Math.max(\n Math.max(\n this.minWidth * 1.,\n (this.maxWidth - 2 * this.spacing) * 0.33),\n h * this.ratios[3]));\n const w1 = w - w0 - w2 - 2 * this.spacing;\n const h1 = Math.min(\n this.maxHeight - h0 - this.spacing,\n h);\n\n return [\n {\n geometry: {x: 0, y: 0, width: w, height: h0},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\n sides: RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutFourLeftAndOther(): ReturnType {\n const h = this.maxHeight;\n const w0 = Math.round(Math.min(\n h * this.ratios[0],\n (this.maxWidth - this.spacing) * 0.6));\n\n const w = Math.round(\n (this.maxHeight - 2 * this.spacing) /\n (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\n );\n const h0 = Math.round(w / this.ratios[1]);\n const h1 = Math.round(w / this.ratios[2]);\n const h2 = h - h0 - h1 - 2 * this.spacing;\n const w1 = Math.max(\n this.minWidth,\n Math.min(this.maxWidth - w0 - this.spacing, w));\n\n return [\n {\n geometry: {x: 0, y: 0, width: w0, height: h},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private static countRatios(sizes: Size[]) {\n return sizes.map((size) => size.w / size.h);\n }\n\n private static countProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\n }\n}\n\nclass ComplexLayouter {\n private ratios: number[];\n private count: number;\n\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\n this.count = ratios.length;\n }\n\n private static cropRatios(ratios: number[], averageRatio: number) {\n const kMaxRatio = 2.75;\n const kMinRatio = 0.6667;\n return ratios.map((ratio) => {\n return averageRatio > 1.1 ?\n clamp(ratio, 1., kMaxRatio) :\n clamp(ratio, kMinRatio, 1.);\n });\n }\n\n public layout(): GroupMediaLayout[] {\n const result = new Array(this.count);\n\n const attempts: Attempt[] = [];\n const multiHeight = (offset: number, count: number) => {\n const ratios = this.ratios.slice(offset, offset + count); // warn\n const sum = accumulate(ratios, 0);\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\n };\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n for(const count of lineCounts) {\n heights.push(multiHeight(offset, count));\n offset += count;\n }\n attempts.push({lineCounts, heights}); // warn\n };\n\n for(let first = 1; first !== this.count; ++first) {\n const second = this.count - first;\n if(first > 3 || second > 3) {\n continue;\n }\n pushAttempt([first, second]);\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n const third = this.count - first - second;\n if((first > 3) ||\n (second > ((this.averageRatio < 0.85) ? 4 : 3)) ||\n (third > 3)) {\n continue;\n }\n pushAttempt([first, second, third]);\n }\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n for(let third = 1; third !== this.count - first - second; ++third) {\n const fourth = this.count - first - second - third;\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\n continue;\n }\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n\n let optimalAttempt: Attempt = null;\n let optimalDiff = 0;\n for(const attempt of attempts) {\n const {heights, lineCounts: counts} = attempt;\n const lineCount = counts.length;\n const totalHeight = accumulate(heights, 0) +\n this.spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const maxLineHeight = Math.max(...heights);\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\n const bad2 = (() => {\n for(let line = 1; line !== lineCount; ++line) {\n if(counts[line - 1] > counts[line]) {\n return 1.5;\n }\n }\n return 1.;\n })();\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\n if(!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempt;\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt.lineCounts;\n const optimalHeights = optimalAttempt.heights;\n const rowCount = optimalCounts.length;\n\n let index = 0;\n let y = 0;\n for(let row = 0; row !== rowCount; ++row) {\n const colCount = optimalCounts[row];\n const lineHeight = optimalHeights[row];\n const height = Math.round(lineHeight);\n\n let x = 0;\n for(let col = 0; col !== colCount; ++col) {\n const sides = RectPart.None |\n (row === 0 ? RectPart.Top : RectPart.None) |\n (row === rowCount - 1 ? RectPart.Bottom : RectPart.None) |\n (col === 0 ? RectPart.Left : RectPart.None) |\n (col === colCount - 1 ? RectPart.Right : RectPart.None);\n\n const ratio = this.ratios[index];\n const width = (col === colCount - 1) ?\n (this.maxWidth - x) :\n Math.round(ratio * lineHeight);\n result[index] = {\n geometry: {x, y, width, height},\n sides\n };\n\n x += width + this.spacing;\n ++index;\n }\n y += height + this.spacing;\n }\n\n return result;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Layouter, RectPart} from './groupedLayout';\n\nexport default function prepareAlbum(options: {\n container: HTMLElement,\n items: {w: number, h: number}[],\n maxWidth: number,\n minWidth: number,\n spacing: number,\n maxHeight?: number,\n forMedia?: true\n}) {\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\n const layout = layouter.layout();\n\n const widthItem = layout.find((item) => item.sides & RectPart.Right);\n const width = widthItem.geometry.width + widthItem.geometry.x;\n\n const heightItem = layout.find((item) => item.sides & RectPart.Bottom);\n const height = heightItem.geometry.height + heightItem.geometry.y;\n\n const container = options.container;\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n const children = container.children;\n\n layout.forEach(({geometry, sides}, idx) => {\n let div: HTMLElement;\n div = children[idx] as HTMLElement;\n if(!div) {\n div = document.createElement('div');\n container.append(div);\n }\n\n div.classList.add('album-item', 'grouped-item');\n\n div.style.width = (geometry.width / width * 100) + '%';\n div.style.height = (geometry.height / height * 100) + '%';\n div.style.top = (geometry.y / height * 100) + '%';\n div.style.left = (geometry.x / width * 100) + '%';\n\n if(sides & RectPart.Left && sides & RectPart.Top) {\n div.style.borderTopLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\n div.style.borderBottomLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Top) {\n div.style.borderTopRightRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\n div.style.borderBottomRightRadius = 'inherit';\n }\n\n if(options.forMedia) {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n div.append(mediaDiv);\n }\n\n // @ts-ignore\n // div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\n });\n\n /* if(options.forMedia) {\n layout.forEach((_, i) => {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n options.container.children[i].append(mediaDiv);\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE} from '../environment/userAgent';\nimport {animate} from '../helpers/animation';\nimport drawCircle, {drawCircleFromStart} from '../helpers/canvas/drawCircle';\nimport {Middleware} from '../helpers/middleware';\nimport clamp from '../helpers/number/clamp';\nimport animationIntersector, {AnimationItemGroup, AnimationItemWrapper} from './animationIntersector';\n\ntype DotRendererDot = {\n x: number,\n y: number,\n opacity: number,\n radius: number\n mOpacity: number,\n adding: boolean,\n counter: number,\n path: Path2D\n};\nexport default class DotRenderer implements AnimationItemWrapper {\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n private dots: DotRendererDot[];\n\n public paused: boolean;\n public autoplay: boolean;\n public tempId: number;\n\n private dpr: number;\n\n constructor(private width: number, private height: number) {\n const canvas = this.canvas = document.createElement('canvas');\n const dpr = this.dpr = window.devicePixelRatio;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.classList.add('canvas-thumbnail', 'canvas-dots');\n\n this.paused = true;\n this.autoplay = true;\n this.tempId = 0;\n this.context = canvas.getContext('2d');\n }\n\n private prepare() {\n let count = Math.round(this.width * this.height / (35 * (IS_MOBILE ? 2 : 1)));\n count = Math.min(IS_MOBILE ? 1000 : 2200, count);\n const dots: DotRendererDot[] = this.dots = new Array(count);\n\n for(let i = 0; i < count; ++i) {\n dots[i] = this.generateDot();\n }\n }\n\n private generateDot(adding?: boolean): DotRendererDot {\n const x = Math.floor(Math.random() * this.canvas.width);\n const y = Math.floor(Math.random() * this.canvas.height);\n const opacity = adding ? 0 : Math.random();\n const radius = (Math.random() >= .8 ? 1 : 0.5) * this.dpr;\n const path = new Path2D();\n path.arc(x, y, radius, 0, 2 * Math.PI, false);\n return {\n x,\n y,\n opacity,\n radius,\n mOpacity: opacity,\n adding: adding ?? Math.random() >= .5,\n counter: 0,\n path\n };\n }\n\n private draw() {\n const {context, canvas, dots} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n context.fillStyle = '#fff';\n\n const add = 0.02;\n for(let i = 0, length = dots.length; i < length; ++i) {\n const dot = dots[i];\n const addOpacity = dot.adding ? add : -add;\n\n dot.mOpacity += addOpacity;\n // if(dot.mOpacity <= 0) dot.mOpacity = dot.opacity;\n\n // const easedOpacity = easing(dot.mOpacity);\n const easedOpacity = clamp(dot.mOpacity, 0, 1);\n context.globalAlpha = easedOpacity;\n context.fill(dot.path);\n\n if(dot.mOpacity <= 0) {\n dot.adding = true;\n\n if(++dot.counter >= 1) {\n dots[i] = this.generateDot(dot.adding);\n }\n } else if(dot.mOpacity >= 1) {\n dot.adding = false;\n }\n }\n }\n\n public remove() {\n this.pause();\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n ++this.tempId;\n }\n\n public renderFirstFrame() {\n if(!this.dots) {\n this.prepare();\n }\n\n this.draw();\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n const tempId = ++this.tempId;\n\n if(!this.dots) {\n this.prepare();\n }\n\n animate(() => {\n if(this.tempId !== tempId || this.paused) {\n return false;\n }\n\n this.draw();\n return true;\n });\n }\n\n public static create({\n width,\n height,\n middleware,\n animationGroup\n }: {\n width: number,\n height: number,\n middleware: Middleware,\n animationGroup: AnimationItemGroup\n }) {\n middleware.onClean(() => {\n animationIntersector.removeAnimationByPlayer(dotRenderer);\n });\n\n const dotRenderer = new DotRenderer(width, height);\n dotRenderer.renderFirstFrame();\n\n animationIntersector.addAnimation(dotRenderer, animationGroup, dotRenderer.canvas, true);\n\n return dotRenderer;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport {Middleware} from '../../helpers/middleware';\nimport {Document, Photo, PhotoSize} from '../../layer';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport DotRenderer from '../dotRenderer';\n\nexport default async function wrapMediaSpoiler({\n media,\n middleware,\n width,\n height,\n animationGroup\n}: {\n media: Document.document | Photo.photo,\n middleware: Middleware,\n width: number,\n height: number,\n animationGroup: AnimationItemGroup\n}) {\n const sizes = (media as Photo.photo).sizes || (media as Document.document).thumbs;\n const thumb = sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n const {image, loadPromise} = getImageFromStrippedThumb(media, thumb, true);\n await loadPromise;\n\n if(!middleware()) {\n return;\n }\n\n image.classList.add('media-spoiler-thumbnail');\n\n const container = document.createElement('div');\n container.classList.add('media-spoiler-container');\n container.middlewareHelper = middleware.create();\n\n const dotRenderer = DotRenderer.create({\n width,\n height,\n middleware: container.middlewareHelper.get(),\n animationGroup\n });\n\n container.append(image, dotRenderer.canvas);\n\n return container;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport {Document, Message, MessageMedia, Photo, PhotoSize} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport rootScope from '../../lib/rootScope';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport prepareAlbum from '../prepareAlbum';\nimport wrapMediaSpoiler from './mediaSpoiler';\nimport wrapPhoto from './photo';\nimport wrapVideo from './video';\n\nexport default function wrapAlbum({messages, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, autoDownload, managers = rootScope.managers, animationGroup}: {\n messages: Message.message[],\n attachmentDiv: HTMLElement,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n uploading?: boolean,\n isOut: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n managers?: AppManagers,\n animationGroup?: AnimationItemGroup\n}) {\n const items: {size: PhotoSize.photoSize, media: Photo.photo | Document.document, message: Message.message}[] = [];\n\n // !lowest msgID will be the FIRST in album\n for(const message of messages) {\n const media: Photo.photo | Document.document = getMediaFromMessage(message);\n\n const size: any = media._ === 'photo' ? choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\n items.push({size, media, message});\n }\n\n /* // * pending\n if(storage[0] < 0) {\n items.reverse();\n } */\n\n prepareAlbum({\n container: attachmentDiv,\n items: items.map((i) => ({w: i.size.w, h: i.size.h})),\n maxWidth: mediaSizes.active.album.width,\n minWidth: 100,\n spacing: 2,\n forMedia: true\n });\n\n const {width, height} = attachmentDiv.style;\n const containerWidth = parseInt(width);\n const containerHeight = parseInt(height);\n\n items.forEach((item, idx) => {\n const {size, media, message} = item;\n\n const messageMedia = message.media;\n const hasSpoiler = !!(messageMedia as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument).pFlags?.spoiler;\n\n const div = attachmentDiv.children[idx] as HTMLElement;\n div.dataset.mid = '' + message.mid;\n div.dataset.peerId = '' + message.peerId;\n const mediaDiv = div.firstElementChild as HTMLElement;\n const isPhoto = media._ === 'photo';\n let thumbPromise: Promise;\n if(isPhoto) {\n thumbPromise = wrapPhoto({\n photo: media,\n message,\n container: mediaDiv,\n boxWidth: 0,\n boxHeight: 0,\n isOut,\n lazyLoadQueue,\n middleware,\n size,\n loadPromises,\n autoDownloadSize: autoDownload.photo,\n managers\n });\n } else {\n thumbPromise = wrapVideo({\n doc: media,\n container: mediaDiv,\n message,\n boxWidth: 0,\n boxHeight: 0,\n withTail: false,\n isOut,\n lazyLoadQueue,\n middleware,\n loadPromises,\n autoDownload,\n managers,\n noAutoplayAttribute: hasSpoiler\n });\n }\n\n if(thumbPromise) {\n loadPromises?.push(thumbPromise);\n }\n\n if(hasSpoiler) {\n const promise = (thumbPromise || Promise.resolve()).then(async() => {\n if(!middleware()) {\n return;\n }\n\n const {width, height} = div.style;\n const itemWidth = +width.slice(0, -1) / 100 * containerWidth;\n const itemHeight = +height.slice(0, -1) / 100 * containerHeight;\n const container = await wrapMediaSpoiler({\n media,\n animationGroup,\n middleware,\n width: itemWidth,\n height: itemHeight\n });\n\n if(!middleware()) {\n return;\n }\n\n mediaDiv.append(container);\n });\n\n loadPromises?.push(promise);\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 {SliderSuperTab} from '../../slider';\nimport appSidebarRight from '..';\nimport {roundPercents} from '../../poll';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {i18n} from '../../../lib/langPack';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../button';\nimport {Message, MessageMedia} from '../../../layer';\n\nexport default class AppPollResultsTab extends SliderSuperTab {\n private resultsDiv: HTMLElement;\n\n public async init(message: Message.message) {\n this.container.id = 'poll-results-container';\n this.container.classList.add('chatlist-container');\n\n this.resultsDiv = document.createElement('div');\n this.resultsDiv.classList.add('poll-results');\n this.scrollable.append(this.resultsDiv);\n\n const poll = await this.managers.appPollsManager.getPoll((message.media as MessageMedia.messageMediaPoll).poll.id);\n\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\n\n const title = document.createElement('h3');\n setInnerHTML(title, wrapEmojiText(poll.poll.question));\n\n const percents = poll.results.results.map((v) => v.voters / poll.results.total_voters * 100);\n roundPercents(percents);\n\n const fragment = document.createDocumentFragment();\n poll.results.results.forEach((result, idx) => {\n if(!result.voters) return;\n\n const hr = document.createElement('hr');\n\n const answer = poll.poll.answers[idx];\n\n // Head\n const answerEl = document.createElement('div');\n answerEl.classList.add('poll-results-answer');\n\n const answerTitle = document.createElement('div');\n setInnerHTML(answerTitle, wrapEmojiText(answer.text));\n\n const answerPercents = document.createElement('div');\n answerPercents.innerText = Math.round(percents[idx]) + '%';\n\n answerEl.append(answerTitle, answerPercents);\n\n // Humans\n const list = appDialogsManager.createChatList();\n list.classList.add('poll-results-voters');\n\n appDialogsManager.setListClickListener(list, () => {\n appSidebarRight.onCloseBtnClick();\n }, undefined, true);\n\n list.style.minHeight = Math.min(result.voters, 4) * 48 + 'px';\n\n fragment.append(hr, answerEl, list);\n\n let offset: string, limit = 4, loading = false, left = Math.max(0, result.voters - 4);\n const load = () => {\n if(loading) return;\n loading = true;\n\n this.managers.appPollsManager.getVotes(message, answer.option, offset, limit).then((votesList) => {\n votesList.votes.forEach((vote) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: vote.user_id.toPeerId(false),\n container: list,\n rippleEnabled: false,\n meAsSaved: false,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n });\n\n if(offset) {\n left = Math.max(0, left - votesList.votes.length);\n\n if(left) {\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n }\n }\n\n offset = votesList.next_offset;\n limit = 20;\n\n if(!left || !votesList.votes.length) {\n showMore.remove();\n }\n }).finally(() => {\n loading = false;\n });\n };\n\n const showMore = Button('poll-results-more btn btn-primary btn-transparent', {icon: 'down'});\n showMore.addEventListener('click', load);\n showMore.append(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n\n fragment.append(showMore);\n\n load();\n });\n\n this.resultsDiv.append(title, fragment);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n /* appPollsManager.getVotes(mid).then((votes) => {\n console.log('gOt VotEs', votes);\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 mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport ripple from './ripple';\nimport appSidebarRight from './sidebarRight';\nimport AppPollResultsTab from './sidebarRight/tabs/pollResults';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport {fastRaf} from '../helpers/schedulers';\nimport SetTransition from './singleTransition';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport windowSize from '../helpers/windowSize';\nimport {Message, MessageMedia, Poll, PollResults} from '../layer';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport StackedAvatars from './stackedAvatars';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\n\nlet lineTotalLength = 0;\nconst tailLength = 9;\nconst times = 10;\nconst fullTime = 340;\nconst oneTime = fullTime / times;\n\nexport const roundPercents = (percents: number[]) => {\n // console.log('roundPercents before percents:', percents);\n\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\n if(sum > 100) {\n const diff = sum - 100;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, minRemainder = 1;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder >= 0.5 && remainder < minRemainder) {\n minRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] -= minRemainder;\n }\n } else if(sum < 100) {\n const diff = 100 - sum;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, maxRemainder = 0;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder < 0.5 && remainder > maxRemainder) {\n maxRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] += 1 - maxRemainder;\n }\n }\n\n // console.log('roundPercents after percents:', percents);\n};\n\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\nrootScope.on('poll_update', (e) => {\n const {poll, results} = e as {poll: Poll, results: PollResults};\n\n //console.log('poll_update', poll, results);\n for(const connected of connectedPolls) {\n if(connected.id === poll.id) {\n const pollElement = connected.element;\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n }\n }\n}); */\n\nrootScope.addEventListener('poll_update', ({poll, results}) => {\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\n pollElements.forEach((pollElement) => {\n // console.log('poll_update', poll, results);\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n });\n});\n\nmediaSizes.addEventListener('resize', () => {\n PollElement.setMaxLength();\n PollElement.resizePolls();\n});\n\nmediaSizes.addEventListener('changeScreen', () => {\n PollElement.setMaxLength();\n});\n\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\n element.classList.remove('active');\n\n clearTimeout(timeout);\n setTimeout(() => {\n onHide();\n element.remove();\n\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\n prevQuizHint = prevQuizHintOnHide = null;\n prevQuizHintTimeout = 0;\n }\n }, 200);\n};\n\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\nlet isListenerSet = false;\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n\n const element = document.createElement('div');\n element.classList.add('quiz-hint');\n\n const container = document.createElement('div');\n container.classList.add('container', 'tgico');\n\n const textEl = document.createElement('div');\n textEl.classList.add('text');\n\n container.append(textEl);\n element.append(container);\n\n setInnerHTML(textEl, wrapRichText(solution, {entities: solution_entities}));\n appImManager.chat.bubbles.container.append(element);\n\n void element.offsetLeft; // reflow\n element.classList.add('active');\n\n prevQuizHint = element;\n prevQuizHintOnHide = onHide;\n prevQuizHintTimeout = window.setTimeout(() => {\n hideQuizHint(element, onHide, prevQuizHintTimeout);\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\n\n if(!isListenerSet) {\n isListenerSet = true;\n appImManager.addEventListener('peer_changed', () => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n });\n }\n};\n\nexport default class PollElement extends HTMLElement {\n public static MAX_OFFSET = -46.5;\n public static MAX_LENGTH = 0;\n public svgLines: SVGSVGElement[];\n private numberDivs: HTMLDivElement[];\n private answerDivs: HTMLDivElement[];\n private descDiv: HTMLElement;\n private typeDiv: HTMLElement;\n private avatarsDiv: HTMLElement;\n private viewResults: HTMLElement;\n private votersCountDiv: HTMLDivElement;\n\n // private maxLength: number;\n // private maxLengths: number[];\n private maxPercents: number[];\n\n public isClosed = false;\n private isQuiz = false;\n private isRetracted = false;\n private isPublic = false;\n private isMultiple = false;\n private chosenIndexes: number[] = [];\n private percents: number[];\n\n public message: Message.message;\n public managers: AppManagers;\n\n private quizInterval: number;\n private quizTimer: SVGSVGElement;\n\n private sendVoteBtn: HTMLElement;\n private chosingIndexes: number[] = [];\n\n private sendVotePromise: Promise;\n private sentVote = false;\n\n public static setMaxLength() {\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\n }\n\n public static resizePolls() {\n if(!this.MAX_LENGTH) return;\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\n pollElements.forEach((pollElement) => {\n pollElement.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n pollElement.setLineProgress(idx, 1);\n });\n });\n }\n\n public async render() {\n // браузер вызывает этот метод при добавлении элемента в документ\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\n\n if(!lineTotalLength) {\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\n // console.log('line total length:', lineTotalLength);\n PollElement.setMaxLength();\n }\n\n // const {poll, results} = this.managers.appPollsManager.getPoll(pollId);\n const {poll, results} = this.message.media as MessageMedia.messageMediaPoll;\n\n /* const timestamp = Date.now() / 1000 | 0;\n if(timestamp < this.message.date) { */\n if(this.message.pFlags.is_scheduled) {\n this.classList.add('disable-hover');\n }\n\n // console.log('pollElement poll:', poll, results);\n\n let descKey: LangPackKey;\n if(poll.pFlags) {\n this.isPublic = !!poll.pFlags.public_voters;\n this.isQuiz = !!poll.pFlags.quiz;\n this.isClosed = !!poll.pFlags.closed;\n this.isMultiple = !!poll.pFlags.multiple_choice;\n\n if(this.isClosed) {\n descKey = 'Chat.Poll.Type.Closed';\n this.classList.add('is-closed');\n } else if(this.isQuiz) {\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\n } else {\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\n }\n }\n\n this.classList.toggle('is-multiple', this.isMultiple);\n\n const multipleSelect = this.isMultiple ? '' : '';\n const votes = poll.answers.map((answer, idx) => {\n return `\n
\n
\n
\n \n \n \n ${multipleSelect}\n
\n
\n
\n \n \n \n \n
\n `;\n }).join('');\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n ${votes}`;\n\n setInnerHTML(this.firstElementChild, wrapEmojiText(poll.question));\n\n Array.from(this.querySelectorAll('.poll-answer-text')).forEach((el, idx) => {\n setInnerHTML(el, wrapEmojiText(poll.answers[idx].text));\n });\n\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\n\n if(descKey) {\n this.typeDiv.append(i18n(descKey));\n }\n\n if(this.isQuiz) {\n this.classList.add('is-quiz');\n\n if(poll.close_period && poll.close_date) {\n const timeLeftDiv = document.createElement('div');\n timeLeftDiv.classList.add('poll-time');\n this.descDiv.append(timeLeftDiv);\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n // svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\n svg.classList.add('poll-quiz-timer');\n\n this.quizTimer = svg;\n\n const strokeWidth = 2;\n const radius = 7;\n const circumference = 2 * Math.PI * radius;\n\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n circle.classList.add('poll-quiz-timer-circle');\n circle.setAttributeNS(null, 'cx', '16');\n circle.setAttributeNS(null, 'cy', '16');\n circle.setAttributeNS(null, 'r', '' + radius);\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\n\n svg.append(circle);\n this.descDiv.append(svg);\n\n const period = poll.close_period * 1000;\n const closeTime = (poll.close_date - await rootScope.managers.timeManager.getServerTimeOffset()) * 1000;\n\n // console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\n\n // let time = Date.now();\n // let percents = (closeTime - time) / period;\n\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\n\n // // @ts-ignore\n // circle.style.strokeDashoffset = circumference + percents * circumference;\n // circle.style.strokeDasharray = ${circumference} ${circumference};\n\n this.quizInterval = window.setInterval(() => {\n const time = Date.now();\n const percents = (closeTime - time) / period;\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\n timeLeftDiv.innerHTML = toHHMMSS(timeLeft);\n\n if(timeLeft <= 5) {\n timeLeftDiv.style.color = '#ee545c';\n circle.style.stroke = '#ee545c';\n }\n // timeLeftDiv.style.visibility = 'visible';\n\n // @ts-ignore\n circle.style.strokeDashoffset = circumference + percents * circumference;\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n\n if(time >= closeTime) {\n clearInterval(this.quizInterval);\n timeLeftDiv.innerHTML = '';\n // @ts-ignore\n circle.style.strokeDashoffset = circumference;\n this.quizInterval = 0;\n\n setTimeout(() => {\n // нужно запросить апдейт чтобы опрос обновился\n this.managers.appPollsManager.getResults(this.message);\n }, 3e3);\n }\n }, 1e3);\n }\n }\n\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\n\n const footerDiv = document.createElement('div');\n footerDiv.classList.add('poll-footer');\n\n this.viewResults = document.createElement('div');\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\n\n this.votersCountDiv = document.createElement('div');\n this.votersCountDiv.className = 'poll-votes-count';\n\n footerDiv.append(this.viewResults, this.votersCountDiv);\n this.append(footerDiv);\n\n this.viewResults.addEventListener('click', (e) => {\n cancelEvent(e);\n\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\n appSidebarRight.createTab(AppPollResultsTab).open(this.message);\n }\n });\n ripple(this.viewResults);\n\n if(this.isMultiple) {\n this.sendVoteBtn = document.createElement('div');\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\n ripple(this.sendVoteBtn);\n\n if(!poll.chosenIndexes.length) {\n this.votersCountDiv.classList.add('hide');\n }\n\n attachClickEvent(this.sendVoteBtn, (e) => {\n cancelEvent(e);\n /* const indexes = this.answerDivs.filter((el) => el.classList.contains('is-chosing')).map((el) => +el.dataset.index);\n if(indexes.length) {\n\n } */\n if(this.chosingIndexes.length) {\n this.sendVotes(this.chosingIndexes).then(() => {\n this.chosingIndexes.length = 0;\n this.answerDivs.forEach((el) => {\n el.classList.remove('is-chosing');\n });\n });\n }\n });\n\n footerDiv.append(this.sendVoteBtn);\n }\n\n // const width = this.getBoundingClientRect().width;\n // const width = mediaSizes.active.poll.width;\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\n\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\n if(!canVote || this.isPublic) {\n this.performResults(results, poll.chosenIndexes, false);\n }\n\n if(canVote) {\n this.setVotersCount(results);\n attachClickEvent(this, this.clickHandler);\n }\n }\n\n initQuizHint(results: PollResults) {\n if(results.solution && results.solution_entities) {\n const toggleHint = document.createElement('div');\n toggleHint.classList.add('tgico-tip', 'poll-hint');\n this.descDiv.append(toggleHint);\n\n // let active = false;\n attachClickEvent(toggleHint, (e) => {\n cancelEvent(e);\n\n // active = true;\n toggleHint.classList.add('active');\n setQuizHint(results.solution, results.solution_entities, () => {\n // active = false;\n toggleHint.classList.remove('active');\n });\n });\n\n if(this.sentVote) {\n const correctResult = results.results.find((r) => r.pFlags.correct);\n if(correctResult && !correctResult.pFlags.chosen) {\n simulateClickEvent(toggleHint);\n }\n }\n }\n }\n\n clickHandler(e: Event) {\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\n if(!target) {\n return;\n }\n\n cancelEvent(e);\n const answerIndex = +target.dataset.index;\n if(this.isMultiple) {\n target.classList.toggle('is-chosing');\n\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\n if(foundIndex !== -1) {\n this.chosingIndexes.splice(foundIndex, 1);\n } else {\n this.chosingIndexes.push(answerIndex);\n }\n } else {\n this.sendVotes([answerIndex]);\n }\n\n /* target.classList.add('is-voting');\n setTimeout(() => { // simulate\n this.setResults([100, 0], answerIndex);\n target.classList.remove('is-voting');\n }, 1000); */\n }\n\n sendVotes(indexes: number[]) {\n if(this.sendVotePromise) return this.sendVotePromise;\n\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\n targets.forEach((target) => {\n target.classList.add('is-voting');\n });\n\n this.classList.add('disable-hover');\n this.sentVote = true;\n return this.sendVotePromise = this.managers.appPollsManager.sendVote(this.message, indexes).then(() => {\n targets.forEach((target) => {\n target.classList.remove('is-voting');\n });\n\n this.classList.remove('disable-hover');\n }).catch(() => {\n this.sentVote = false;\n }).finally(() => {\n this.sendVotePromise = null;\n });\n }\n\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\n });\n\n if(this.initQuizHint) {\n this.initQuizHint(results);\n this.initQuizHint = null;\n }\n\n if(this.quizInterval) {\n clearInterval(this.quizInterval);\n this.quizInterval = 0;\n }\n\n if(this.quizTimer?.parentElement) {\n this.quizTimer.remove();\n }\n\n const timeEl = this.descDiv.querySelector('.poll-time');\n if(timeEl) {\n timeEl.remove();\n }\n }\n\n if(this.isClosed) {\n this.classList.add('is-closed');\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\n }\n\n // set chosen\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\n this.chosenIndexes = chosenIndexes.slice();\n\n if(this.isRetracted) {\n attachClickEvent(this, this.clickHandler);\n } else {\n detachClickEvent(this, this.clickHandler);\n }\n }\n\n // is need update\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\n const percents = results.results.map((v) => results.total_voters ? v.voters / results.total_voters * 100 : 0);\n\n this.classList.toggle('no-transition', !animate);\n if(animate) {\n SetTransition({\n element: this,\n className: '',\n forwards: !this.isRetracted,\n duration: 340\n });\n }\n\n fastRaf(() => {\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\n this.percents = percents;\n this.isRetracted = false;\n });\n }\n\n this.setVotersCount(results);\n\n if(this.isPublic) {\n if(!this.isMultiple) {\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\n }\n\n const peerIds = (results.recent_voters || []).map((userId) => userId.toPeerId());\n const stackedAvatars = new StackedAvatars({avatarSize: 16});\n stackedAvatars.render(peerIds);\n replaceContent(this.avatarsDiv, stackedAvatars.container);\n }\n\n if(this.isMultiple) {\n const isVoted = !!this.chosenIndexes.length;\n\n const hideSendVoteBtn = this.isClosed || isVoted;\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\n }\n }\n\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\n this.svgLines.forEach((svg) => svg.style.display = '');\n\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\n });\n\n const maxValue = Math.max(...percents);\n // this.maxLengths = percents.map((p) => p / maxValue * this.maxLength);\n this.maxPercents = percents.map((p) => p / maxValue);\n\n // line\n if(this.isRetracted) {\n this.svgLines.forEach((svg, idx) => {\n this.setLineProgress(idx, -1);\n });\n } else {\n const cb = () => {\n this.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n this.setLineProgress(idx, 1);\n });\n };\n\n animate ? fastRaf(cb) : cb();\n }\n\n percents = percents.slice();\n roundPercents(percents);\n let getPercentValue: (percents: number, index: number) => number;\n const iterate = (i: number) => {\n percents.forEach((percents, idx) => {\n const value = getPercentValue(percents, i);\n this.numberDivs[idx].innerText = value + '%';\n });\n };\n // numbers\n if(this.isRetracted) {\n getPercentValue = (percents, index) => Math.round(percents / times * index);\n\n if(animate) {\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * k);\n }\n } else {\n iterate(0);\n }\n } else {\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\n\n if(animate) {\n for(let i = 0; i < times; ++i) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * i);\n }\n } else {\n iterate(times - 1);\n }\n }\n\n if(this.isRetracted) {\n if(animate) {\n this.classList.add('is-retracting');\n }\n\n this.classList.remove('is-voted');\n const cb = () => {\n this.svgLines.forEach((svg) => svg.style.display = 'none');\n };\n\n if(animate) {\n setTimeout(() => {\n this.classList.remove('is-retracting');\n cb();\n }, fullTime);\n } else {\n cb();\n }\n } else {\n this.classList.add('is-voted');\n }\n }\n\n setVotersCount(results: PollResults) {\n const votersCount = results.total_voters || 0;\n let key: LangPackKey;\n const args: FormatterArguments = [votersCount];\n if(this.isClosed) {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\n } else {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\n }\n\n replaceContent(this.votersCountDiv, i18n(key, args));\n }\n\n setLineProgress(index: number, multiplier: number) {\n const svg = this.svgLines[index];\n\n if(multiplier === -1) {\n svg.style.strokeDasharray = '';\n svg.style.strokeDashoffset = '';\n } else {\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\n }\n }\n\n // у элемента могут быть ещё другие методы и свойства\n}\n\ncustomElements.define('poll-element', PollElement);\n","// https://stackoverflow.com/a/14824756/6758968\nconst ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\n fullRtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']'),\n justRtlDirCheck = new RegExp('['+rtlChars+']');\n\nexport default function isRTL(s: string, anyChar?: boolean) {\n return anyChar ? justRtlDirCheck.test(s) : fullRtlDirCheck.test(s);\n}\n","/*\n * 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 {AppImManager, ChatSavedPosition, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {HistoryResult, MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {logger} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport BubbleGroups from './bubbleGroups';\nimport PopupDatePicker from '../popups/datePicker';\nimport PopupForward from '../popups/forward';\nimport PopupStickers from '../popups/stickers';\nimport ProgressivePreloader from '../preloader';\nimport Scrollable, {SliceSides} from '../scrollable';\nimport StickyIntersector from '../stickyIntersector';\nimport animationIntersector from '../animationIntersector';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport I18n, {FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n} from '../../lib/langPack';\nimport AvatarElement from '../avatar';\nimport ripple from '../ripple';\nimport {MessageRender} from './messageRender';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PollElement from '../poll';\nimport AudioElement from '../audio';\nimport {Chat as MTChat, ChatInvite, Document, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, User, WebPage} from '../../layer';\nimport {BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {FocusDirection, ScrollStartCallbackDimensions} from '../../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation} from '../../hooks/useHeavyAnimationCheck';\nimport {fastRaf, fastRafPromise} from '../../helpers/schedulers';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport RepliesElement from './replies';\nimport DEBUG from '../../config/debug';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport PeerTitle from '../peerTitle';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport {getElementByPoint} from '../../helpers/dom/getElementByPoint';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport reflowScrollableElement from '../../helpers/dom/reflowScrollableElement';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {cancelAnimationByKey} from '../../helpers/animation';\nimport assumeType from '../../helpers/assumeType';\nimport debounce, {DebounceReturnType} from '../../helpers/schedulers/debounce';\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport windowSize from '../../helpers/windowSize';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport AppMediaViewer from '../appMediaViewer';\nimport SetTransition from '../singleTransition';\nimport handleHorizontalSwipe from '../../helpers/dom/handleHorizontalSwipe';\nimport findUpAttribute from '../../helpers/dom/findUpAttribute';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport Button from '../button';\nimport {CallType} from '../../lib/calls/types';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport PopupJoinChatInvite from '../popups/joinChatInvite';\nimport {InternalLink, INTERNAL_LINK_TYPE} from '../../lib/appManagers/internalLink';\nimport ReactionsElement, {REACTIONS_ELEMENTS} from './reactions';\nimport type ReactionElement from './reaction';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport pause from '../../helpers/schedulers/pause';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport SuperIntersectionObserver from '../../helpers/dom/superIntersectionObserver';\nimport generateFakeIcon from '../generateFakeIcon';\nimport copyFromElement from '../../helpers/dom/copyFromElement';\nimport PopupElement from '../popups';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport wrapWebPageDescription from '../wrappers/webPageDescription';\nimport wrapWebPageTitle from '../wrappers/webPageTitle';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport wrapMessageActionTextNew from '../wrappers/messageActionTextNew';\nimport isMentionUnread from '../../lib/appManagers/utils/messages/isMentionUnread';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../../lib/appManagers/utils/messageId/generateMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport idleController from '../../helpers/idleController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport {cancelContextMenuOpening} from '../../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport noop from '../../helpers/noop';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport PopupPayment from '../popups/payment';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport wrapSticker, {onEmojiStickerClick} from '../wrappers/sticker';\nimport wrapAlbum from '../wrappers/album';\nimport wrapDocument from '../wrappers/document';\nimport wrapGroupedDocuments from '../wrappers/groupedDocuments';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapPoll from '../wrappers/poll';\nimport wrapVideo from '../wrappers/video';\nimport isRTL from '../../helpers/string/isRTL';\nimport NBSP from '../../helpers/string/nbsp';\nimport DotRenderer from '../dotRenderer';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {BatchProcessor} from '../../helpers/sortedList';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\nimport wrapTopicNameButton from '../wrappers/topicNameButton';\nimport wrapMediaSpoiler from '../wrappers/mediaSpoiler';\n\nexport const USER_REACTIONS_INLINE = false;\nconst USE_MEDIA_TAILS = false;\ntype MESSAGE_ACTION_TYPE = Message.messageService['action']['_'];\ntype IGNORE_ACTION_KEY = MESSAGE_ACTION_TYPE;\ntype IGNORE_ACTION_VALUE = true | ((message: Message.messageService) => boolean);\nconst IGNORE_ACTIONS: Map = new Map([\n ['messageActionHistoryClear', true],\n ['messageActionChatCreate', (message) => message.pFlags.out]\n // 'messageActionChannelMigrateFrom'\n] as [IGNORE_ACTION_KEY, IGNORE_ACTION_VALUE][]);\n\nexport const SERVICE_AS_REGULAR: Set = new Set();\n\nif(IS_CALL_SUPPORTED) {\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\n}\n\nconst TEST_SCROLL_TIMES: number = undefined;\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\n\nlet queueId = 0;\n\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\n\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\nexport const STICKY_OFFSET = 3;\nconst SCROLLED_DOWN_THRESHOLD = 300;\nconst PEER_CHANGED_ERROR = new Error('peer changed');\n\nconst DO_NOT_SLICE_VIEWPORT = false;\nconst DO_NOT_SLICE_VIEWPORT_ON_RENDER = false;\nconst DO_NOT_UPDATE_MESSAGE_VIEWS = false;\nconst DO_NOT_UPDATE_MESSAGE_REACTIONS = false;\nconst DO_NOT_UPDATE_MESSAGE_REPLY = false;\n\nconst BIG_EMOJI_SIZES: {[size: number]: number} = {\n 1: 96,\n 2: 90,\n 3: 84,\n 4: 72,\n 5: 60,\n 6: 48,\n 7: 36\n};\nconst BIG_EMOJI_SIZES_LENGTH = Object.keys(BIG_EMOJI_SIZES).length;\n\ntype Bubble = {\n bubble: HTMLElement,\n mids: Set,\n groupedId?: string\n};\n\ntype MyHistoryResult = HistoryResult | {history: number[]};\n\nfunction getMainMidForGrouped(mids: number[]) {\n return Math.max(...mids);\n}\n\nexport default class ChatBubbles {\n public container: HTMLDivElement;\n public chatInner: HTMLDivElement;\n public scrollable: Scrollable;\n\n private getHistoryTopPromise: Promise;\n private getHistoryBottomPromise: Promise;\n\n // public messagesCount: number = -1;\n\n private unreadOut = new Set();\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\n\n public bubbles: {[mid: string]: HTMLElement} = {};\n public skippedMids: Set = new Set();\n public bubblesNewByGroupedId: {[groupId: string]: Bubble} = {};\n public bubblesNew: {[mid: string]: Bubble} = {};\n private dateMessages: {[timestamp: number]: {\n div: HTMLElement,\n firstTimestamp: number,\n container: HTMLElement,\n timeout?: number\n }} = {};\n\n private scrolledDown = true;\n private isScrollingTimeout = 0;\n\n private stickyIntersector: StickyIntersector;\n\n private unreaded: Map = new Map();\n private unreadedSeen: Set = new Set();\n private readPromise: Promise;\n\n private bubbleGroups: BubbleGroups;\n\n private preloader: ProgressivePreloader = null;\n\n // private messagesQueueOnRender: () => void = null;\n private messagesQueueOnRenderAdditional: () => void = null;\n\n private firstUnreadBubble: HTMLElement = null;\n private attachedUnreadBubble: boolean;\n\n public lazyLoadQueue: LazyLoadQueue;\n\n private middlewareHelper = getMiddleware();\n\n private log: ReturnType;\n\n public listenerSetter: ListenerSetter;\n\n private followStack: number[] = [];\n\n private isHeavyAnimationInProgress = false;\n private scrollingToBubble: HTMLElement;\n\n private isFirstLoad = true;\n private needReflowScroll: boolean;\n\n private fetchNewPromise: Promise;\n\n private passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }> = {};\n\n private onAnimateLadder: () => Promise | void;\n // private ladderDeferred: CancellablePromise;\n private resolveLadderAnimation: () => Promise;\n private emptyPlaceholderBubble: HTMLElement;\n\n private viewsMids: Set = new Set();\n private sendViewCountersDebounced: () => Promise;\n\n private isTopPaddingSet = false;\n\n private getSponsoredMessagePromise: Promise;\n\n private previousStickyDate: HTMLElement;\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\n\n private hoverBubble: HTMLElement;\n private hoverReaction: HTMLElement;\n private sliceViewportDebounced: DebounceReturnType;\n private resizeObserver: ResizeObserver;\n private willScrollOnLoad: boolean;\n public observer: SuperIntersectionObserver;\n\n private renderingMessages: Set = new Set();\n private setPeerCached: boolean;\n private attachPlaceholderOnRender: () => void;\n\n private bubblesToEject: Set = new Set();\n private bubblesToReplace: Map = new Map(); // TO -> FROM\n private updatePlaceholderPosition: () => void;\n private setPeerOptions: {lastMsgId: number; topMessage: number;};\n\n private setPeerTempId: number = 0;\n\n private renderNewPromises: Set> = new Set();\n private updateGradient: boolean;\n\n private extendedMediaMessages: Set = new Set();\n private pollExtendedMediaMessagesPromise: Promise;\n\n private batchProcessor: BatchProcessor>>;\n\n // private reactions: Map;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.log = this.chat.log;\n // this.chat.log.error('Bubbles construction');\n\n this.listenerSetter = new ListenerSetter();\n\n this.constructBubbles();\n\n // * constructor end\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: this.processBatch,\n possibleError: PEER_CHANGED_ERROR\n });\n this.bubbleGroups = new BubbleGroups(this.chat);\n this.preloader = new ProgressivePreloader({\n cancelable: false\n });\n this.lazyLoadQueue = new LazyLoadQueue(undefined, true);\n this.lazyLoadQueue.queueId = ++queueId;\n\n // this.reactions = new Map();\n\n // * events\n\n // will call when sent for update pos\n this.listenerSetter.add(rootScope)('history_update', async({storageKey, sequential, message}) => {\n if(this.chat.messagesStorageKey !== storageKey || this.chat.type === 'scheduled') {\n return;\n }\n\n const {mid} = message;\n const log = false ? this.log.bindPrefix('history_update-' + mid) : undefined;\n log && log('start');\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n if(this.renderNewPromises.size) {\n log && log.error('will await new messages render');\n await Promise.all(Array.from(this.renderNewPromises));\n }\n\n if(this.messagesQueuePromise) {\n log && log.error('messages render in process');\n await this.messagesQueuePromise;\n }\n\n if(this.bubbles[mid] !== bubble) return;\n\n // await getHeavyAnimationPromise();\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) { // probably a group item\n log && log.error('no item by bubble', bubble);\n return;\n } else if(item.mid === mid) {\n log && log.warn('wow what', item, mid);\n return;\n }\n\n if(sequential) {\n const group = item.group;\n const newItem = this.bubbleGroups.createItem(bubble, message);\n // newItem.mid = item.mid;\n const _items = this.bubbleGroups.itemsArr.slice();\n indexOfAndSplice(_items, item);\n const foundItem = this.bubbleGroups.findGroupSiblingByItem(newItem, _items);\n if(\n group === foundItem?.group ||\n (group === this.bubbleGroups.getLastGroup() && group.items.length === 1 && newItem.dateTimestamp === item.dateTimestamp) ||\n (this.peerId === rootScope.myId && sequential && newItem.dateTimestamp === item.dateTimestamp)\n ) {\n log && log('item has correct position', item);\n this.bubbleGroups.changeBubbleMid(bubble, mid);\n return;\n }\n }\n\n // return;\n\n // await fastRafPromise();\n // if(this.bubbles[mid] !== bubble) return;\n\n // const groupIndex = this.bubbleGroups.groups.indexOf(group);\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n // if(!group.items.length) { // group has collapsed, next message can have higher mid so have to reposition them too\n // log && log('group has collapsed', item);\n\n // const siblingGroups = this.bubbleGroups.groups.slice(0, groupIndex + 1);\n // for(let length = siblingGroups.length, i = length - 2; i >= 0; --i) {\n // const siblingGroup = siblingGroups[i];\n // const siblingItems = siblingGroup.items;\n // const nextGroup = siblingGroups[i + 1];\n // const nextItems = nextGroup.items;\n\n // let _break = false, moved = false;\n // for(let j = siblingItems.length - 1; j >= 0; --j) {\n // const siblingItem = siblingItems[j];\n // const foundItem = this.bubbleGroups.findGroupSiblingByItem(siblingItem, nextItems);\n // if(!foundItem) {\n // _break = true;\n // break;\n // }\n\n // log('will move item', siblingItem, nextGroup);\n // this.bubbleGroups.removeAndUnmountBubble(siblingItem.bubble);\n // this.bubbleGroups.addItemToGroup(siblingItem, nextGroup);\n // moved = true;\n // }\n\n // if(moved) {\n // nextGroup.mount();\n // }\n\n // if(_break) {\n // break;\n // }\n // }\n // }\n\n const {groups} = this.groupBubbles([{bubble, message}]);\n this.bubbleGroups.mountUnmountGroups(groups);\n\n if(this.scrollingToBubble) {\n this.scrollToEnd();\n }\n\n log && log('end');\n\n // this.bubbleGroups.findIncorrentPositions();\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\n if(this.peerId === peerId) {\n this.deleteMessagesByIds(Object.keys(this.bubbles).map((m) => +m));\n }\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', async(e) => {\n const {storageKey, tempId, tempMessage, mid, message} = e;\n\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\n if(this.chat.messagesStorageKey !== storageKey) {\n return;\n }\n\n const bubbles = this.bubbles;\n const _bubble = bubbles[tempId];\n if(_bubble) {\n const bubble = bubbles[tempId];\n bubbles[mid] = bubble;\n bubble.dataset.mid = '' + mid;\n delete bubbles[tempId];\n\n fastRaf(() => {\n const mid = +bubble.dataset.mid;\n if(bubbles[mid] === bubble && bubble.classList.contains('is-outgoing')) {\n bubble.classList.remove('is-sending', 'is-outgoing');\n bubble.classList.add((this.peerId === rootScope.myId && this.chat.type !== 'scheduled') || !this.unreadOut.has(mid) ? 'is-read' : 'is-sent');\n }\n });\n }\n\n if(this.unreadOut.has(tempId)) {\n this.unreadOut.delete(tempId);\n this.unreadOut.add(mid);\n }\n\n // * check timing of scheduled message\n if(this.chat.type === 'scheduled') {\n const timestamp = Date.now() / 1000 | 0;\n const maxTimestamp = tempMessage.date - 10;\n if(timestamp >= maxTimestamp) {\n this.deleteMessagesByIds([mid]);\n }\n }\n\n if(!_bubble) {\n return;\n }\n\n let messages: (Message.message | Message.messageService)[], tempIds: number[];\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n messages = await this.managers.appMessagesManager.getMessagesByAlbum(groupedId);\n const mids = messages.map(({mid}) => mid);\n if(!mids.length || getMainMidForGrouped(mids) !== mid || bubbles[mid] !== _bubble) {\n return;\n }\n\n if(bubbles[mid] !== _bubble) {\n return;\n }\n\n tempIds = (Array.from(_bubble.querySelectorAll('.grouped-item')) as HTMLElement[]).map((el) => +el.dataset.mid);\n } else {\n messages = [message];\n tempIds = [tempId];\n }\n\n const reactionsElements = Array.from(_bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\n if(reactionsElements.length) {\n reactionsElements.forEach((reactionsElement) => {\n reactionsElement.changeMessage(message as Message.message);\n });\n }\n\n (messages as Message.message[]).forEach((message, idx) => {\n if(!message) {\n return;\n }\n\n const tempId = tempIds[idx];\n const mid = message.mid;\n const bubble: HTMLElement = _bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || _bubble;\n\n if(message._ !== 'message') {\n return;\n }\n\n if(message.replies) {\n const repliesElement = _bubble.querySelector('replies-element') as RepliesElement;\n if(repliesElement) {\n repliesElement.message = message;\n repliesElement.init();\n }\n }\n\n const media = message.media ?? {} as MessageMedia.messageMediaEmpty;\n const doc = (media as MessageMedia.messageMediaDocument).document as Document.document;\n const poll = (media as MessageMedia.messageMediaPoll).poll;\n const webPage = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage;\n if(doc) {\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\n if(div) {\n const container = findUpClassName(div, 'document-container');\n\n if(!tempMessage.media?.document?.thumbs?.length && doc.thumbs?.length) {\n getHeavyAnimationPromise().then(async() => {\n const timeSpan = div.querySelector('.time');\n const newDiv = await wrapDocument({message, fontSize: rootScope.settings.messagesTextSize});\n div.replaceWith(newDiv);\n\n if(timeSpan) {\n (newDiv.querySelector('.document') || newDiv).append(timeSpan);\n }\n });\n }\n\n if(container) {\n container.dataset.mid = '' + mid;\n }\n }\n\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\n if(element) {\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\n element.dataset.mid = '' + message.mid;\n delete element.dataset.isOutgoing;\n (element as any).message = message;\n (element as any).onLoad(true);\n } else {\n element.dataset.docId = '' + doc.id;\n (element as any).doc = doc;\n }\n }\n } else if(poll) {\n const pollElement = bubble.querySelector('poll-element') as PollElement;\n if(pollElement) {\n pollElement.message = message;\n pollElement.setAttribute('poll-id', '' + poll.id);\n pollElement.setAttribute('message-id', '' + mid);\n }\n } else if(webPage && !bubble.querySelector('.web')) {\n getHeavyAnimationPromise().then(() => {\n this.safeRenderMessage(message, true, bubble);\n this.scrollToBubbleIfLast(bubble);\n });\n }\n\n // set new mids to album items for mediaViewer\n if(groupedId) {\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\n if(item) {\n item.dataset.mid = '' + mid;\n }\n }\n });\n });\n\n this.listenerSetter.add(rootScope)('message_edit', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[message.mid] !== bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n });\n\n this.listenerSetter.add(rootScope)('message_error', async({storageKey, tempId}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[tempId];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[tempId] !== bubble) return;\n\n bubble.classList.remove('is-outgoing');\n bubble.classList.add('is-error');\n });\n\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, messages, deletedMids}) => {\n if(peerId !== this.peerId) return;\n\n const mids = messages.map(({mid}) => mid);\n const oldMids = mids.concat(Array.from(deletedMids));\n const wasMainMid = getMainMidForGrouped(oldMids);\n const bubble = this.bubbles[wasMainMid];\n if(!bubble) {\n return;\n }\n\n const mainMid = getMainMidForGrouped(mids);\n const message = messages.find((message) => message.mid === mainMid);\n this.safeRenderMessage(message, true, bubble);\n });\n\n // this.listenerSetter.add(rootScope)('peer_title_edit', async(peerId) => {\n // if(peerId.isUser()) {\n // const middleware = this.getMiddleware();\n // const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n // if(!middleware()) return;\n\n // const isPremium = user?.pFlags?.premium;\n // const groups = this.bubbleGroups.groups.filter((group) => group.avatar?.peerId === peerId);\n // groups.forEach((group) => {\n // group.avatar.classList.toggle('is-premium', isPremium);\n // group.avatar.classList.toggle('tgico-star', isPremium);\n // });\n // }\n // });\n\n if(!DO_NOT_UPDATE_MESSAGE_REACTIONS/* && false */) {\n this.listenerSetter.add(rootScope)('messages_reactions', async(arr) => {\n if(this.chat.type === 'scheduled') {\n return;\n }\n\n let scrollSaver: ScrollSaver;\n\n const a = arr.map(async({message, changedResults}) => {\n if(this.peerId !== message.peerId) {\n return;\n }\n\n const result = await this.getMountedBubble(message.mid, message);\n if(!result) {\n return;\n }\n\n return {bubble: result.bubble, message, changedResults};\n });\n\n let top: number;\n (await Promise.all(a)).filter(Boolean).forEach(({bubble, message, changedResults}) => {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(false);\n scrollSaver.save();\n }\n\n const key = message.peerId + '_' + message.mid;\n const set = REACTIONS_ELEMENTS.get(key);\n if(set) {\n for(const element of set) {\n element.update(message, changedResults);\n }\n } else if(!message.reactions || !message.reactions.results.length) {\n return;\n } else {\n this.appendReactionsElementToBubble(bubble, message, message, changedResults);\n }\n });\n\n if(scrollSaver) {\n scrollSaver.restore();\n }\n });\n }\n\n !DO_NOT_UPDATE_MESSAGE_REPLY && this.listenerSetter.add(rootScope)('messages_downloaded', async({peerId, mids}) => {\n const middleware = this.getMiddleware();\n await getHeavyAnimationPromise();\n if(!middleware()) return;\n\n (mids as number[]).forEach((mid) => {\n const needUpdate = this.needUpdate;\n const filtered: typeof needUpdate[0][] = [];\n forEachReverse(this.needUpdate, (obj, idx) => {\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\n this.needUpdate.splice(idx, 1)[0];\n filtered.push(obj);\n }\n });\n\n filtered.forEach(async({mid, replyMid, replyToPeerId}) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n MessageRender.setReply({\n chat: this.chat,\n bubble,\n message\n });\n });\n });\n });\n\n attachStickerViewerListeners({\n listenTo: this.scrollable.container,\n listenerSetter: this.listenerSetter,\n findTarget: (e) => {\n const target = e.target as HTMLElement;\n const found = target.closest('.attachment.media-sticker-wrapper') || (findUpClassName(target, 'attachment') && target.closest('.custom-emoji'));\n return found as HTMLElement;\n }\n });\n attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\n\n this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {\n if(e.button !== 0) return;\n\n const code: HTMLElement = findUpTag(e.target, 'CODE');\n if(code) {\n cancelEvent(e);\n copyFromElement(code);\n\n const onClick = (e: MouseEvent) => {\n cancelEvent(e);\n toastNew({\n langPackKey: 'TextCopied',\n onClose: () => {\n detach();\n }\n });\n };\n\n const detach = attachClickEvent(window, onClick, {listenerSetter: this.listenerSetter, once: true, capture: true});\n return;\n }\n });\n\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\n for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n if(dateMessage.container === target) {\n const dateBubble = dateMessage.div;\n\n // dateMessage.container.classList.add('has-sticky-dates');\n\n // SetTransition(dateBubble, 'kek', stuck, this.previousStickyDate ? 300 : 0);\n // if(this.previousStickyDate) {\n // dateBubble.classList.add('kek');\n // }\n\n dateBubble.classList.toggle('is-sticky', stuck);\n if(stuck) {\n this.previousStickyDate = dateBubble;\n }\n\n break;\n }\n }\n\n if(this.previousStickyDate) {\n // fastRaf(() => {\n // this.bubblesContainer.classList.add('has-sticky-dates');\n // });\n }\n });\n\n if(!IS_SAFARI) {\n this.sliceViewportDebounced = debounce(this.sliceViewport.bind(this), 3000, false, true);\n }\n\n let middleware: ReturnType;\n useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n this.lazyLoadQueue.lock();\n middleware = this.getMiddleware();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced.clearTimeout();\n // }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(middleware?.()) {\n this.lazyLoadQueue.unlockAndRefresh();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced();\n // }\n }\n\n middleware = null;\n }, this.listenerSetter);\n }\n\n private constructBubbles() {\n const container = this.container = document.createElement('div');\n container.classList.add('bubbles', 'scrolled-down');\n\n const chatInner = this.chatInner = document.createElement('div');\n chatInner.classList.add('bubbles-inner');\n\n this.setScroll();\n\n container.append(this.scrollable.container);\n }\n\n public attachContainerListeners() {\n const container = this.container;\n\n this.chat.contextMenu.attachTo(container);\n this.chat.selection.attachListeners(container, new ListenerSetter());\n\n if(DEBUG) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\n if(bubble) {\n const mid = +bubble.dataset.mid\n this.log('debug message:', await this.chat.getMessage(mid));\n this.highlightBubble(bubble);\n }\n });\n }\n\n if(!IS_MOBILE) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n if(this.chat.type === 'pinned' ||\n this.chat.selection.isSelecting ||\n !(await this.chat.canSend())) {\n return;\n }\n\n const target = e.target as HTMLElement;\n const bubble = target.classList.contains('bubble') ?\n target :\n (target.classList.contains('document-selection') ? target.parentElement : null);\n if(bubble && !bubble.classList.contains('bubble-first')) {\n const mid = +bubble.dataset.mid;\n const message = await this.chat.getMessage(mid);\n if(message.pFlags.is_outgoing) {\n return;\n }\n\n this.chat.input.initMessageReply(mid);\n }\n });\n } else if(IS_TOUCH_SUPPORTED) {\n const className = 'is-gesturing-reply';\n const MAX = 64;\n const replyAfter = MAX * .75;\n let shouldReply = false;\n let target: HTMLElement;\n let icon: HTMLElement;\n handleHorizontalSwipe({\n element: container,\n verifyTouchTarget: async(e) => {\n if(this.chat.type === 'pinned' || this.chat.selection.isSelecting || !(await this.chat.canSend())) {\n return false;\n }\n\n // cancelEvent(e);\n target = findUpClassName(e.target, 'bubble');\n if(target) {\n SetTransition({\n element: target,\n className,\n forwards: true,\n duration: 250\n });\n void target.offsetLeft; // reflow\n\n if(!icon) {\n icon = document.createElement('span');\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\n } else {\n icon.classList.remove('is-visible');\n icon.style.opacity = '';\n }\n\n target/* .querySelector('.bubble-content') */.append(icon);\n }\n\n return !!target;\n },\n onSwipe: (xDiff, yDiff) => {\n shouldReply = xDiff >= replyAfter;\n\n if(shouldReply && !icon.classList.contains('is-visible')) {\n icon.classList.add('is-visible');\n }\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\n\n const x = -Math.max(0, Math.min(MAX, xDiff));\n target.style.transform = `translateX(${x}px)`;\n cancelContextMenuOpening();\n },\n onReset: () => {\n const _target = target;\n SetTransition({\n element: _target,\n className,\n forwards: false,\n duration: 250,\n onTransitionEnd: () => {\n if(icon.parentElement === _target) {\n icon.classList.remove('is-visible');\n icon.remove();\n }\n }\n });\n\n fastRaf(() => {\n _target.style.transform = ``;\n\n if(shouldReply) {\n const {mid} = _target.dataset;\n this.chat.input.initMessageReply(+mid);\n shouldReply = false;\n }\n });\n },\n listenerOptions: {capture: true}\n });\n }\n }\n\n public constructPeerHelpers() {\n // will call when message is sent (only 1)\n this.listenerSetter.add(rootScope)('history_append', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey || this.chat.type === 'scheduled') return;\n\n if(rootScope.settings.animationsEnabled) {\n this.updateGradient = true;\n }\n\n if(!this.scrollable.loadedAll.bottom) {\n this.chat.setMessageId();\n } else {\n this.renderNewMessage(message, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n if(this.peerId !== message.peerId || this.chat.type === 'scheduled') return;\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(peerId !== this.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.deleteMessagesByIds(Array.from(msgs));\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\n if(peerId === this.peerId) {\n this.chat.input.setUnreadCount();\n\n getHeavyAnimationPromise().then(() => {\n this.updateUnreadByDialog();\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!dialogs.has(this.peerId) || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(this.peerId !== dialog.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const {peerId} = this;\n if(peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n const hadRights = this.chatInner.classList.contains('has-rights');\n const hasRights = await this.chat.canSend();\n\n if(hadRights !== hasRights) {\n const callbacks = await Promise.all([\n this.finishPeerChange(),\n this.chat.input.finishPeerChange()\n ]);\n\n callbacks.forEach((callback) => callback());\n }\n\n if(!!(chat as MTChat.channel).pFlags.forum !== this.chat.isForum && this.chat.type === 'chat') {\n this.chat.peerId = 0;\n this.chat.appImManager.setPeer({peerId});\n }\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(peerId !== this.peerId) {\n return;\n }\n\n const mids = getObjectKeysAndSort(this.bubbles, 'desc').filter((mid) => mid > 0);\n const middleware = this.getMiddleware();\n this.managers.appMessagesManager.reloadMessages(this.peerId, mids).then((messages) => {\n if(!middleware()) return;\n\n const toDelete: number[] = [];\n messages.forEach((message, idx) => {\n const mid = mids[idx];\n if(message) {\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n } else {\n toDelete.push(mid);\n }\n });\n\n this.deleteMessagesByIds(toDelete);\n\n this.setLoaded('top', false);\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n });\n });\n\n this.listenerSetter.add(rootScope)('settings_updated', async({key}) => {\n if(key === 'settings.emoji.big') {\n const middleware = this.getMiddleware();\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\n const m = mids.map(async(mid) => {\n const bubble = this.bubbles[mid];\n if(bubble.classList.contains('can-have-big-emoji')) {\n return {bubble, message: await this.chat.getMessage(mid)};\n }\n });\n\n const awaited = await Promise.all(m);\n if(!middleware()) {\n return;\n }\n\n awaited.filter(Boolean).forEach(({bubble, message}) => {\n if(this.bubbles[message.mid] !== bubble) {\n return;\n }\n\n this.safeRenderMessage(message, true, bubble);\n });\n }\n });\n\n !DO_NOT_UPDATE_MESSAGE_VIEWS && this.listenerSetter.add(rootScope)('messages_views', (arr) => {\n if(this.chat.type === 'scheduled') return;\n\n fastRaf(() => {\n let scrollSaver: ScrollSaver;\n for(const {peerId, views, mid} of arr) {\n if(this.peerId !== peerId) continue;\n\n const bubble = this.bubbles[mid];\n if(!bubble) continue;\n\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\n if(!postViewsElements.length) continue;\n\n const str = formatNumber(views, 1);\n let different = false;\n postViewsElements.forEach((postViews) => {\n if(different || postViews.textContent !== str) {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(true);\n scrollSaver.save();\n }\n\n different = true;\n postViews.textContent = str;\n }\n });\n }\n\n scrollSaver?.restore();\n });\n });\n\n this.observer = new SuperIntersectionObserver({root: this.scrollable.container});\n\n this.sendViewCountersDebounced = debounce(() => {\n const mids = [...this.viewsMids];\n this.viewsMids.clear();\n\n this.managers.appMessagesManager.incrementMessageViews(this.peerId, mids);\n }, 1000, false, true);\n\n // * pinned part start\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids, pinned}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n if(!pinned) {\n this.deleteMessagesByIds(mids);\n }\n }\n });\n // * pinned part end\n\n // * scheduled part start\n const onUpdate = async() => {\n this.chat.topbar.setTitle((await this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size);\n };\n\n this.listenerSetter.add(rootScope)('scheduled_new', (message) => {\n if(this.chat.type !== 'scheduled' || message.peerId !== this.peerId) return;\n\n this.renderNewMessage(message);\n onUpdate();\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type !== 'scheduled' || peerId !== this.peerId) return;\n\n this.deleteMessagesByIds(mids);\n onUpdate();\n });\n // * scheduled part end\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public get messagesQueuePromise() {\n return this.batchProcessor.queuePromise;\n }\n\n private createScrollSaver(reverse = true) {\n const scrollSaver = new ScrollSaver(this.scrollable, '.bubble:not(.is-date)', reverse);\n return scrollSaver;\n }\n\n private unreadedObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const target = entry.target as HTMLElement;\n const mid = this.unreaded.get(target as HTMLElement);\n this.onUnreadedInViewport(target, mid);\n }\n };\n\n private viewsObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const mid = +(entry.target as HTMLElement).dataset.mid;\n this.observer.unobserve(entry.target, this.viewsObserverCallback);\n\n if(mid) {\n this.viewsMids.add(mid);\n this.sendViewCountersDebounced();\n } else {\n const {sponsoredMessage} = this;\n const randomId = sponsoredMessage?.random_id;\n if(randomId) {\n this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(), randomId);\n delete sponsoredMessage.random_id;\n }\n }\n }\n };\n\n private stickerEffectObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n this.observer.unobserve(entry.target, this.stickerEffectObserverCallback);\n\n const attachmentDiv: HTMLElement = entry.target.querySelector('.attachment');\n getHeavyAnimationPromise().then(() => {\n if(isInDOM(attachmentDiv)) {\n simulateClickEvent(attachmentDiv);\n }\n });\n }\n };\n\n private createResizeObserver() {\n if(!('ResizeObserver' in window) || this.resizeObserver) {\n return;\n }\n\n const container = this.scrollable.container;\n let wasHeight = 0/* container.offsetHeight */;\n let resizing = false;\n let skip = false;\n let scrolled = 0;\n let part = 0;\n let rAF = 0;\n // let skipNext = true;\n\n const onResizeEnd = () => {\n const height = container.offsetHeight;\n const isScrolledDown = this.scrollable.isScrolledDown;\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\n part += wasHeight - height;\n }\n\n /* if(DEBUG) {\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\n } */\n\n if(part) {\n this.scrollable.setScrollTopSilently(this.scrollable.scrollTop + Math.round(part));\n }\n\n wasHeight = height;\n scrolled = 0;\n rAF = 0;\n part = 0;\n resizing = false;\n skip = false;\n };\n\n const setEndRAF = (single: boolean) => {\n if(rAF) window.cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\n rAF = window.requestAnimationFrame(onResizeEnd);\n // this.log('resize after RAF', part);\n });\n };\n\n const processEntries: ResizeObserverCallback = (entries) => {\n /* if(skipNext) {\n skipNext = false;\n return;\n } */\n\n if(skip) {\n setEndRAF(false);\n return;\n }\n\n const entry = entries[0];\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\n\n if(!wasHeight) {\n wasHeight = height;\n return;\n }\n\n const realDiff = wasHeight - height;\n let diff = realDiff + part;\n const _part = diff % 1;\n diff -= _part;\n\n if(!resizing) {\n resizing = true;\n\n /* if(DEBUG) {\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\n } */\n\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\n // if(isSafari) { // * fix opening keyboard while ESG is active\n part = -realDiff;\n // }\n\n skip = true;\n setEndRAF(false);\n return;\n }\n }\n\n scrolled += diff;\n\n /* if(DEBUG) {\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\n } */\n\n if(diff) {\n const needScrollTop = this.scrollable.scrollTop + diff;\n this.scrollable.setScrollTopSilently(needScrollTop);\n }\n\n setEndRAF(false);\n\n part = _part;\n wasHeight = height;\n };\n\n const resizeObserver = this.resizeObserver = new ResizeObserver(processEntries);\n resizeObserver.observe(container);\n }\n\n private destroyResizeObserver() {\n const resizeObserver = this.resizeObserver;\n if(!resizeObserver) {\n return;\n }\n\n resizeObserver.disconnect();\n this.resizeObserver = undefined;\n }\n\n private onBubblesMouseMove = async(e: MouseEvent) => {\n const content = findUpClassName(e.target, 'bubble-content');\n if(\n this.chat.type !== 'scheduled' &&\n content &&\n !this.chat.selection.isSelecting &&\n !findUpClassName(e.target, 'service') &&\n !findUpClassName(e.target, 'bubble-beside-button')\n ) {\n const bubble = findUpClassName(content, 'bubble');\n if(!this.chat.selection.canSelectBubble(bubble)) {\n this.unhoverPrevious();\n return;\n }\n\n let {hoverBubble, hoverReaction} = this;\n if(bubble === hoverBubble) {\n return;\n }\n\n this.unhoverPrevious();\n\n hoverBubble = this.hoverBubble = bubble;\n hoverReaction = this.hoverReaction;\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\n if(!hoverReaction) {\n hoverReaction = this.hoverReaction = document.createElement('div');\n hoverReaction.classList.add('bubble-hover-reaction');\n\n const stickerWrapper = document.createElement('div');\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\n hoverReaction.append(stickerWrapper);\n\n content.append(hoverReaction);\n\n let message = await this.chat.getMessage(+bubble.dataset.mid);\n if(message?._ !== 'message') {\n this.unhoverPrevious();\n return;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\n Promise.all([\n this.managers.appReactionsManager.getAvailableReactionsByMessage(message),\n pause(400)\n ]).then(([availableReactions]) => {\n const availableReaction = availableReactions[0];\n if(!availableReaction) {\n hoverReaction.remove();\n return;\n }\n\n wrapSticker({\n div: stickerWrapper,\n doc: availableReaction.select_animation,\n width: 18,\n height: 18,\n needUpscale: true,\n middleware,\n group: this.chat.animationGroup,\n withThumb: false,\n needFadeIn: false\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n player.addEventListener('firstFrame', () => {\n if(!middleware()) {\n // debugger;\n return;\n }\n\n hoverReaction.dataset.loaded = '1';\n this.setHoverVisible(hoverReaction, true);\n }, {once: true});\n\n attachClickEvent(hoverReaction, (e) => {\n cancelEvent(e); // cancel triggering selection\n\n this.managers.appReactionsManager.sendReaction(message as Message.message, availableReaction);\n this.unhoverPrevious();\n }, {listenerSetter: this.listenerSetter});\n }, noop);\n });\n } else if(hoverReaction.dataset.loaded) {\n this.setHoverVisible(hoverReaction, true);\n }\n } else {\n this.unhoverPrevious();\n }\n };\n\n public setReactionsHoverListeners() {\n this.listenerSetter.add(contextMenuController)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(overlayCounter)('change', this.unhoverPrevious);\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(this.container)('mousemove', this.onBubblesMouseMove);\n }\n\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\n if(hoverReaction.parentElement) {\n hoverReaction.parentElement.classList.toggle('hover-reaction-visible', visible);\n }\n\n SetTransition({\n element: hoverReaction,\n className: 'is-visible',\n forwards: visible,\n duration: 200,\n onTransitionEnd: visible ? undefined : () => {\n hoverReaction.remove();\n },\n useRafs: 2\n });\n }\n\n private unhoverPrevious = () => {\n const {hoverBubble, hoverReaction} = this;\n if(hoverBubble) {\n this.setHoverVisible(hoverReaction, false);\n this.hoverBubble = undefined;\n this.hoverReaction = undefined;\n }\n };\n\n public setStickyDateManually() {\n return;\n\n const timestamps = Object.keys(this.dateMessages).map((k) => +k).sort((a, b) => b - a);\n let lastVisible: HTMLElement;\n\n // if(this.chatInner.classList.contains('is-scrolling')) {\n const {scrollTop} = this.scrollable.container;\n const isOverflown = scrollTop > 0;\n if(isOverflown) {\n for(const timestamp of timestamps) {\n const dateMessage = this.dateMessages[timestamp];\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\n if(visibleRect && visibleRect.overflow.top) {\n lastVisible = dateMessage.div;\n } else if(lastVisible) {\n break;\n }\n }\n }\n // }\n\n if(lastVisible === this.previousStickyDate) {\n return;\n }\n\n if(lastVisible) {\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\n if(needReflow) {\n lastVisible.classList.add('no-transition');\n }\n\n lastVisible.classList.add('is-sticky');\n\n if(needReflow) {\n void lastVisible.offsetLeft; // reflow\n lastVisible.classList.remove('no-transition');\n }\n }\n\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\n this.previousStickyDate.classList.remove('is-sticky');\n }\n\n this.previousStickyDate = lastVisible;\n }\n\n public getRenderedLength() {\n return Object.keys(this.bubbles).length - this.skippedMids.size;\n }\n\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\n this.unreadedSeen.add(mid);\n this.observer.unobserve(target, this.unreadedObserverCallback);\n this.unreaded.delete(target);\n this.readUnreaded();\n }\n\n private readUnreaded() {\n if(this.readPromise) return;\n\n const middleware = this.getMiddleware();\n this.readPromise = idleController.getFocusPromise().then(async() => {\n if(!middleware()) return;\n let maxId = Math.max(...Array.from(this.unreadedSeen));\n\n // ? if message with maxId is not rendered ?\n if(this.scrollable.loadedAll.bottom) {\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map((i) => +i));\n if(maxId >= bubblesMaxId) {\n maxId = Math.max((await this.chat.getHistoryMaxId()) || 0, maxId);\n }\n }\n\n this.unreaded.forEach((mid, target) => {\n if(mid <= maxId) {\n this.onUnreadedInViewport(target, mid);\n }\n });\n\n const readContents: number[] = [];\n for(const mid of this.unreadedSeen) {\n const message: MyMessage = await this.chat.getMessage(mid);\n if(isMentionUnread(message)) {\n readContents.push(mid);\n }\n }\n\n this.managers.appMessagesManager.readMessages(this.peerId, readContents);\n\n this.unreadedSeen.clear();\n\n if(DEBUG) {\n this.log('will readHistory by maxId:', maxId);\n }\n\n // return;\n\n return this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\n this.log.error('readHistory err:', err);\n this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\n }).finally(() => {\n if(!middleware()) return;\n this.readPromise = undefined;\n\n if(this.unreadedSeen.size) {\n this.readUnreaded();\n }\n });\n });\n }\n\n public onBubblesClick = async(e: Event) => {\n let target = e.target as HTMLElement;\n let bubble: HTMLElement = null;\n try {\n bubble = findUpClassName(target, 'bubble');\n } catch(err) {}\n\n if(!bubble && !this.chat.selection.isSelecting) {\n const avatar = findUpClassName(target, 'user-avatar');\n if(!avatar) {\n return;\n }\n\n const peerId = avatar.dataset.peerId.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n return;\n }\n\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\n if(bubble.classList.contains('is-fake')) {\n bubble = bubble.previousElementSibling as HTMLElement;\n }\n\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n for(const timestamp in this.dateMessages) {\n const d = this.dateMessages[timestamp];\n if(d.div === bubble) {\n PopupElement.createPopup(PopupDatePicker, new Date(+timestamp), this.onDatePick).show();\n break;\n }\n }\n\n return;\n }\n\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\n this.chat.selection.toggleByElement(bubble);\n return;\n }\n\n // ! Trusted - due to audio autoclick\n if(this.chat.selection.isSelecting && e.isTrusted) {\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\n return;\n }\n\n cancelEvent(e);\n // console.log('bubble click', e);\n\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\n this.chat.selection.selectedText = undefined;\n return;\n }\n\n // this.chatSelection.toggleByBubble(bubble);\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\n return;\n }\n\n const mediaSpoiler: HTMLElement = findUpClassName(target, 'media-spoiler-container');\n if(mediaSpoiler) {\n cancelEvent(e);\n\n if(mediaSpoiler.classList.contains('is-revealing')) {\n return;\n }\n\n const video = mediaSpoiler.parentElement.querySelector('video');\n if(video && !mediaSpoiler.parentElement.querySelector('.video-play')) {\n video.autoplay = true;\n video.play().catch(noop);\n }\n\n SetTransition({\n element: mediaSpoiler,\n forwards: true,\n className: 'is-revealing',\n duration: 250,\n onTransitionEnd: () => {\n mediaSpoiler.remove();\n mediaSpoiler.middlewareHelper.destroy();\n }\n });\n return;\n }\n\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\n if(contactDiv) {\n this.chat.appImManager.setInnerPeer({\n peerId: contactDiv.dataset.peerId.toPeerId()\n });\n return;\n }\n\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\n if(callDiv) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\n return;\n }\n\n const buyButton: HTMLElement = findUpClassName(target, 'is-buy');\n if(buyButton) {\n cancelEvent(e);\n\n const message = await this.chat.getMessage(+bubble.dataset.mid);\n if(!message) {\n return;\n }\n\n new PopupPayment(\n message as Message.message,\n await this.managers.appPaymentsManager.getInputInvoiceByPeerId(message.peerId, message.mid)\n );\n return;\n }\n\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\n if(reactionElement) {\n cancelEvent(e);\n if(reactionElement.classList.contains('is-inactive')) {\n return;\n }\n\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\n\n const message = reactionsElement.getMessage();\n this.managers.appReactionsManager.sendReaction(message, reactionCount.reaction);\n\n return;\n }\n\n const stickerEmojiEl = findUpAttribute(target, 'data-sticker-emoji');\n if(stickerEmojiEl && stickerEmojiEl.parentElement.querySelectorAll('[data-sticker-emoji]').length === 1 && bubble.classList.contains('emoji-big')) {\n onEmojiStickerClick({\n event: e,\n container: stickerEmojiEl,\n managers: this.managers,\n middleware: this.getMiddleware(),\n peerId: this.peerId\n });\n\n return;\n }\n\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\n if(commentsDiv) {\n const bubbleMid = +bubble.dataset.mid;\n if(this.peerId === REPLIES_PEER_ID) {\n const message = await this.chat.getMessage(bubbleMid) as Message.message;\n const peerId = getPeerId(message.reply_to.reply_to_peer_id);\n const threadId = message.reply_to.reply_to_top_id;\n const lastMsgId = message.fwd_from.saved_from_msg_id;\n this.chat.appImManager.openThread({\n peerId,\n lastMsgId,\n threadId\n });\n } else {\n const message1 = await this.chat.getMessage(bubbleMid);\n const message = await this.managers.appMessagesManager.getMessageWithReplies(message1 as Message.message);\n const replies = message.replies;\n if(replies) {\n this.managers.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then((message) => {\n this.chat.appImManager.setInnerPeer({\n peerId: replies.channel_id.toPeerId(true),\n type: 'discussion',\n threadId: (message as MyMessage).mid\n });\n });\n }\n }\n\n return;\n }\n\n const via = findUpClassName(target, 'is-via');\n if(via) {\n const el = via.querySelector('.peer-title') as HTMLElement;\n if(target === el || findUpAsChild(target, el)) {\n const message = el.innerText + ' ';\n this.managers.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\n cancelEvent(e);\n\n return;\n }\n }\n\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\n if(nameDiv && nameDiv !== bubble) {\n target = nameDiv || target;\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer') || (target as AvatarElement).peerId;\n const savedFrom = target.dataset.savedFrom;\n if(typeof(peerIdStr) === 'string' || savedFrom) {\n if(savedFrom) {\n const [peerId, mid] = savedFrom.split('_');\n if(target.classList.contains('is-receipt-link')) {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n const inputInvoice = await this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId, +bubble.dataset.mid);\n new PopupPayment(message as Message.message, inputInvoice, undefined, true);\n }\n } else {\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n }\n } else {\n const peerId = peerIdStr.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n }\n }\n\n return;\n }\n\n // this.log('chatInner click:', target);\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\n /* if(isVideoComponentElement) {\n const video = target.parentElement.querySelector('video') as HTMLElement;\n if(video) {\n video.click(); // hot-fix for time and play button\n return;\n }\n } */\n\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\n const messageId = +bubble.dataset.mid;\n const message = await this.chat.getMessage(messageId);\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as Document.document;\n\n if(doc?.stickerSetInput) {\n new PopupStickers(doc.stickerSetInput).show();\n }\n\n return;\n }\n\n const documentDiv = findUpClassName(target, 'document-with-thumb');\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) ||\n target.classList.contains('album-item') ||\n // || isVideoComponentElement\n (target.tagName === 'VIDEO' && !bubble.classList.contains('round')) ||\n (documentDiv && !documentDiv.querySelector('.preloader-container')) ||\n target.classList.contains('canvas-thumbnail')) {\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\n if(preloader) {\n simulateClickEvent(preloader);\n cancelEvent(e);\n return;\n }\n\n cancelEvent(e);\n const messageId = +(groupedItem || bubble).dataset.mid;\n const message = await this.chat.getMessage(messageId);\n if(!message) {\n this.log.warn('no message by messageId:', messageId);\n return;\n }\n\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\n\n const f = documentDiv ? (media: any) => {\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\n } : (media: any) => {\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\n };\n\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\n const ids = isSingleMedia ? [messageId] : (await Promise.all(Object.keys(this.bubbles).map((k) => +k).map(async(mid) => {\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\n return false;\n } */\n // if(!this.scrollable.visibleElements.find((e) => e.element === this.bubbles[id])) return false;\n\n const message = await this.chat.getMessage(mid);\n const media = getMediaFromMessage(message);\n\n return media && f(media) && mid;\n }))).filter(Boolean).sort((a, b) => a - b);\n\n ids.forEach((id) => {\n let selector: string;\n if(documentDiv) {\n selector = '.document-container';\n } else {\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\n if(withTail) {\n selector += '.bubble__media-container';\n } else {\n selector += '.attachment video, .attachment img';\n }\n }\n\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\n const parents: Set = new Set();\n if(documentDiv) {\n elements.forEach((element) => {\n targets.push({\n element: element.querySelector('.document-ico'),\n mid: +element.dataset.mid,\n peerId: this.peerId\n });\n });\n } else {\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\n elements.forEach((element) => {\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\n const albumItem = findUpClassName(element, 'album-item');\n const parent = albumItem || element.parentElement;\n if(parents.has(parent)) return;\n parents.add(parent);\n targets.push({\n element,\n mid: albumItem ? +albumItem.dataset.mid : id,\n peerId: this.peerId\n });\n });\n }\n });\n\n targets.sort((a, b) => a.mid - b.mid);\n\n const idx = targets.findIndex((t) => t.mid === messageId);\n\n if(DEBUG) {\n this.log('open mediaViewer single with ids:', ids, idx, targets);\n }\n\n if(!targets[idx]) {\n this.log('no target for media viewer!', target);\n return;\n }\n\n new AppMediaViewer()\n .setSearchContext({\n threadId: this.chat.threadId,\n peerId: this.peerId,\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\n isScheduled: this.chat.type === 'scheduled'\n })\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\n\n // appMediaViewer.openMedia(message, target as HTMLImageElement);\n return;\n }\n\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\n\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\n if(target.classList.contains('goto-original')) {\n const savedFrom = bubble.dataset.savedFrom;\n const [peerId, mid] = savedFrom.split('_');\n // //this.log('savedFrom', peerId, msgID);\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n return;\n } else if(target.classList.contains('forward')) {\n const mid = +bubble.dataset.mid;\n const message = await this.managers.appMessagesManager.getMessageByPeer(this.peerId, mid);\n new PopupForward({\n [this.peerId]: await this.managers.appMessagesManager.getMidsByMessage(message)\n });\n // appSidebarRight.forwardTab.open([mid]);\n return;\n }\n\n let isReplyClick = false;\n\n try {\n isReplyClick = !!findUpClassName(e.target, 'reply');\n } catch(err) {}\n\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\n const bubbleMid = +bubble.dataset.mid;\n this.followStack.push(bubbleMid);\n\n const message = (await this.chat.getMessage(bubbleMid)) as Message.message;\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\n const replyToMid = message.reply_to.reply_to_msg_id;\n\n this.chat.appImManager.setInnerPeer({\n peerId: replyToPeerId,\n lastMsgId: replyToMid,\n type: this.chat.type,\n threadId: this.chat.threadId\n });\n\n /* if(this.chat.type === 'discussion') {\n this.chat.appImManager.setMessageId(, originalMessageId);\n } else {\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\n } */\n // this.chat.setMessageId(, originalMessageId);\n }\n }\n\n // console.log('chatInner click', e);\n };\n\n public async onGoDownClick() {\n if(!this.followStack.length) {\n // this.onScroll(true, undefined, true);\n this.chat.setMessageId(/* , dialog.top_message */);\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n\n // if(dialog) {\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\n // } else {\n // this.log('will scroll down 3');\n // this.scroll.scrollTop = this.scroll.scrollHeight;\n // }\n\n return;\n }\n\n const middleware = this.getMiddleware();\n const slice = this.followStack.slice();\n const messages = await Promise.all(slice.map((mid) => this.chat.getMessage(mid)));\n if(!middleware()) return;\n\n slice.forEach((mid, idx) => {\n const message = messages[idx];\n\n const bubble = this.bubbles[mid];\n let bad = true;\n if(bubble) {\n const rect = bubble.getBoundingClientRect();\n bad = (windowSize.height / 2) > rect.top;\n } else if(message) {\n bad = false;\n }\n\n if(bad) {\n this.followStack.splice(this.followStack.indexOf(mid), 1);\n }\n });\n\n this.followStack.sort((a, b) => b - a);\n\n const mid = this.followStack.pop();\n this.chat.setMessageId(mid);\n }\n\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\n /* if(element) {\n if(element.classList.contains('bubbles-date-group')) {\n const children = Array.from(element.children) as HTMLElement[];\n if(verticalSide === 'top') {\n element = children[this.stickyIntersector ? 2 : 1];\n } else {\n element = children[children.length - 1];\n }\n } else {\n element = findUpClassName(element, 'bubble');\n if(element && element.classList.contains('is-date')) {\n element = element.nextElementSibling as HTMLElement;\n }\n }\n } */\n if(element) element = findUpClassName(element, 'bubble');\n\n return element;\n }\n\n public async getGroupedBubble(groupId: string) {\n const mids = await this.managers.appMessagesManager.getMidsByAlbum(groupId);\n for(const mid of mids) {\n if(this.bubbles[mid] && !this.skippedMids.has(mid)) {\n // const maxId = Math.max(...mids); // * because in scheduled album can be rendered by lowest mid during sending\n return {\n bubble: this.bubbles[mid],\n mid: mid\n // message: await this.chat.getMessage(maxId) as Message.message\n };\n }\n }\n }\n\n public getBubbleGroupedItems(bubble: HTMLElement) {\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\n }\n\n public async getMountedBubble(mid: number, message?: Message.message | Message.messageService) {\n if(message === undefined) {\n message = await this.chat.getMessage(mid);\n }\n\n if(!message) {\n return;\n }\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const a = await this.getGroupedBubble(groupedId);\n if(a) {\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\n return a;\n }\n }\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n return {bubble, mid};\n }\n\n private findNextMountedBubbleByMsgId(mid: number, prev?: boolean) {\n const mids = getObjectKeysAndSort(this.bubbles, prev ? 'desc' : 'asc');\n\n let filterCallback: (_mid: number) => boolean;\n if(prev) filterCallback = (_mid) => _mid < mid;\n else filterCallback = (_mid) => mid < _mid;\n\n const foundMid = mids.find((_mid) => {\n if(!filterCallback(_mid)) return false;\n return !!this.bubbles[_mid]?.parentElement;\n });\n\n return this.bubbles[foundMid];\n }\n\n public loadMoreHistory(top: boolean, justLoad = false) {\n // this.log('loadMoreHistory', top);\n if(\n !this.peerId ||\n /* TEST_SCROLL || */\n this.chat.setPeerPromise ||\n this.isHeavyAnimationInProgress ||\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) ||\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\n ) {\n return;\n }\n\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\n // some messages can have negative id (such as sponsored message)\n const history = Object.keys(this.bubbles)\n .map((id) => +id)\n .filter((id) => id > 0 && !this.skippedMids.has(id))\n .sort((a, b) => a - b);\n\n if(!history.length) {\n history.push(0);\n }\n\n if(top) {\n if(DEBUG) {\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[0], true, undefined, undefined, justLoad);\n } else {\n // let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n // const historyMaxId = await this.chat.getHistoryMaxId();\n\n // // if scroll down after search\n // if(history.indexOf(historyMaxId) !== -1) {\n // this.setLoaded('bottom', true);\n // return;\n // }\n\n if(DEBUG) {\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[history.length - 1], false, true, undefined, justLoad);\n }\n }\n\n public onScroll = (ignoreHeavyAnimation?: boolean, scrollDimensions?: ScrollStartCallbackDimensions, forceDown?: boolean) => {\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.sliceViewportDebounced?.clearTimeout();\n\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\n if(this.scrolledDown && !ignoreHeavyAnimation) {\n return;\n }\n } else {\n this.chat.topbar.pinnedMessage?.setCorrectIndexThrottled(this.scrollable.lastScrollDirection);\n this.sliceViewportDebounced?.();\n this.setStickyDateManually();\n }\n\n // lottieLoader.checkAnimations(false, 'chat');\n\n if(scrollDimensions && scrollDimensions.distanceToEnd < SCROLLED_DOWN_THRESHOLD && this.scrolledDown) {\n return;\n }\n\n const distanceToEnd = forceDown ? 0 : scrollDimensions?.distanceToEnd ?? this.scrollable.getDistanceToEnd();\n if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) || scrollDimensions || forceDown) {\n // if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 || scrollDimensions) && distanceToEnd > 0) {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350 + (scrollDimensions?.duration ?? 0));\n }\n\n if(distanceToEnd < SCROLLED_DOWN_THRESHOLD && (forceDown || this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\n this.container.classList.add('scrolled-down');\n this.scrolledDown = true;\n } else if(this.container.classList.contains('scrolled-down')) {\n this.container.classList.remove('scrolled-down');\n this.scrolledDown = false;\n }\n };\n\n public setScroll() {\n if(this.scrollable) {\n this.destroyScrollable();\n }\n\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n this.scrollable.container.append(this.chatInner);\n\n /* const getScrollOffset = () => {\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\n return 300;\n };\n\n window.addEventListener('resize', () => {\n this.scrollable.onScrollOffset = getScrollOffset();\n });\n\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\n\n this.scrollable.onAdditionalScroll = this.onScroll;\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\n // this.scrollable.attachSentinels(undefined, 300);\n\n if(IS_TOUCH_SUPPORTED && false) {\n this.scrollable.container.addEventListener('touchmove', () => {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n }, {passive: true});\n\n this.scrollable.container.addEventListener('touchend', () => {\n if(!this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350);\n }, {passive: true});\n }\n }\n\n public async updateUnreadByDialog() {\n const historyStorage = await this.chat.getHistoryStorage();\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\n\n // /////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\n\n for(const msgId of this.unreadOut) {\n if(msgId > 0 && msgId <= maxId) {\n const bubble = this.bubbles[msgId];\n if(bubble) {\n this.unreadOut.delete(msgId);\n\n if(bubble.classList.contains('is-outgoing') || bubble.classList.contains('is-error')) {\n continue;\n }\n\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)\n bubble.classList.add('is-read');\n }\n }\n }\n }\n\n public destroyBubble(bubble: HTMLElement, mid = +bubble.dataset.mid) {\n // this.log.warn('destroy bubble', bubble, mid);\n bubble.middlewareHelper.destroy();\n\n /* const mounted = this.getMountedBubble(mid);\n if(!mounted) return; */\n\n if(this.bubbles[mid] === bubble) { // have to check because can clear bubble with same id later\n delete this.bubbles[mid];\n }\n\n this.skippedMids.delete(mid);\n\n if(this.firstUnreadBubble === bubble) {\n this.firstUnreadBubble = null;\n }\n\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n if(this.observer) {\n this.observer.unobserve(bubble, this.unreadedObserverCallback);\n this.unreaded.delete(bubble);\n\n this.observer.unobserve(bubble, this.viewsObserverCallback);\n this.viewsMids.delete(mid);\n\n this.observer.unobserve(bubble, this.stickerEffectObserverCallback);\n }\n\n // this.reactions.delete(mid);\n }\n\n public deleteMessagesByIds(mids: number[], permanent = true, ignoreOnScroll?: boolean) {\n let deleted = false;\n mids.forEach((mid) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n this.destroyBubble(bubble, mid);\n\n deleted = true;\n });\n\n if(!deleted) {\n return;\n }\n\n this.scrollable.ignoreNextScrollEvent();\n if(permanent && this.chat.selection.isSelecting) {\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\n }\n\n animationIntersector.checkAnimations(false, this.chat.animationGroup);\n this.deleteEmptyDateGroups();\n\n if(!ignoreOnScroll) {\n this.scrollable.onScroll();\n // this.onScroll();\n }\n }\n\n private pollExtendedMediaMessages() {\n const mids = Array.from(this.extendedMediaMessages);\n return this.managers.appMessagesManager.getExtendedMedia(this.peerId, mids);\n }\n\n private setExtendedMediaMessagesPollInterval() {\n if(this.pollExtendedMediaMessagesPromise || !this.extendedMediaMessages.size) {\n return;\n }\n\n this.pollExtendedMediaMessagesPromise = pause(30000)\n .then(() => this.pollExtendedMediaMessages())\n .then(() => this.setExtendedMediaMessagesPollInterval());\n }\n\n private setTopPadding(middleware = this.getMiddleware()) {\n let isPaddingNeeded = false;\n let setPaddingTo: HTMLElement;\n if(!this.isTopPaddingSet && this.chat.type !== 'scheduled') {\n const {clientHeight, scrollHeight} = this.scrollable.container;\n isPaddingNeeded = clientHeight === scrollHeight;\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\n if(this.chatInner.firstElementChild) {\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\n } else {\n isPaddingNeeded = true;\n } */\n\n if(isPaddingNeeded) {\n /* const add = clientHeight - scrollHeight;\n this.chatInner.style.paddingTop = add + 'px';\n this.scrollable.scrollTop += add; */\n setPaddingTo = this.chatInner;\n setPaddingTo.style.paddingTop = clientHeight + 'px';\n this.scrollable.setScrollTopSilently(scrollHeight);\n this.isTopPaddingSet = true;\n }\n }\n\n return {\n isPaddingNeeded,\n unsetPadding: isPaddingNeeded ? () => {\n if(middleware() && isPaddingNeeded) {\n setPaddingTo.style.paddingTop = '';\n this.isTopPaddingSet = false;\n }\n } : undefined\n };\n }\n\n private renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n const promise = this._renderNewMessage(message, scrolledDown);\n this.renderNewPromises.add(promise);\n promise.catch(noop).finally(() => {\n this.renderNewPromises.delete(promise);\n });\n return promise;\n }\n\n private async _renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\n // this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise) {\n const middleware = this.getMiddleware();\n setPeerPromise.then(async() => {\n if(!middleware()) return;\n const newMessage = await this.chat.getMessage(message.mid);\n if(!middleware()) return;\n this.renderNewMessage(newMessage);\n });\n }\n\n return;\n }\n\n if(this.chat.threadId && getMessageThreadId(message, this.chat.isForum) !== this.chat.threadId) {\n return;\n }\n\n if(this.bubbles[message.mid]) {\n return;\n }\n // ! should scroll even without new messages\n /* if(!mids.length) {\n return;\n } */\n\n if(!scrolledDown) {\n scrolledDown = this.scrolledDown && (\n !this.scrollingToBubble ||\n this.scrollingToBubble === this.getLastBubble() ||\n this.scrollingToBubble === this.chatInner\n );\n }\n\n const middleware = this.getMiddleware();\n const {isPaddingNeeded, unsetPadding} = this.setTopPadding(middleware);\n\n const promise = this.performHistoryResult({history: [message]}, false);\n if(scrolledDown) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\n // const bubble = this.bubbles[Math.max(...mids)];\n\n let bubble: HTMLElement;\n if(this.chat.type === 'scheduled') {\n bubble = this.bubbles[message.mid];\n }\n\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\n if(isPaddingNeeded) {\n // it will be called only once even if was set multiple times (that won't happen)\n promise.then(unsetPadding);\n }\n\n // this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\n\n /* setTimeout(() => {\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\n }, 10); */\n });\n }\n\n return promise;\n }\n\n public getLastBubble() {\n const group = this.bubbleGroups.getLastGroup();\n return group?.lastItem?.bubble;\n }\n\n public scrollToBubble(\n element: HTMLElement,\n position: ScrollLogicalPosition,\n forceDirection?: FocusDirection,\n forceDuration?: number\n ) {\n const bubble = findUpClassName(element, 'bubble');\n\n if(!element.parentElement) {\n this.log.error('element is not connected', bubble);\n }\n\n let fallbackToElementStartWhenCentering: HTMLElement;\n // * if it's a start, then scroll to start of the group\n if(bubble && position !== 'end') {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.firstItem === item && whichChild(item.group.container) === (this.stickyIntersector ? STICKY_OFFSET : 1)) {\n const dateGroup = item.group.container.parentElement;\n // if(whichChild(dateGroup) === 0) {\n fallbackToElementStartWhenCentering = dateGroup;\n // position = 'start';\n // element = dateGroup;\n // }\n }\n }\n\n // const isLastBubble = this.getLastBubble() === bubble;\n /* if(isLastBubble) {\n element = this.getLastDateGroup();\n } */\n\n const margin = 4; // * 4 = .25rem\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\n margin = 20;\n } */\n\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\n const promise = this.scrollable.scrollIntoViewNew({\n element,\n position,\n margin,\n forceDirection,\n forceDuration,\n axis: 'y',\n getNormalSize: isChangingHeight ? ({rect}) => {\n // return rect.height;\n\n let height = windowSize.height;\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\n height -= this.container.offsetTop;\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\n return height;\n\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\n const diff = rowsWrapperHeight - 54;\n return rect.height + diff; */\n } : undefined,\n fallbackToElementStartWhenCentering,\n startCallback: (dimensions) => {\n // this.onScroll(true, this.scrolledDown && dimensions.distanceToEnd <= SCROLLED_DOWN_THRESHOLD ? undefined : dimensions);\n this.onScroll(true, dimensions);\n\n if(this.updateGradient) {\n const {gradientRenderer} = this.chat;\n gradientRenderer?.toNextPosition(dimensions.getProgress);\n this.updateGradient = undefined;\n }\n }\n });\n\n // fix flickering date when opening unread chat and focusing message\n if(forceDirection === FocusDirection.Static) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n\n return promise;\n }\n\n public scrollToEnd() {\n return this.scrollToBubbleEnd(this.chatInner);\n }\n\n public async scrollToBubbleEnd(bubble: HTMLElement) {\n /* if(DEBUG) {\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\n } */\n\n if(bubble) {\n this.scrollingToBubble = bubble;\n const middleware = this.getMiddleware();\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\n if(!middleware()) return;\n this.scrollingToBubble = undefined;\n }\n }\n\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\n // private getLastDateGroup() {\n // let lastTime = 0, lastElem: HTMLElement;\n // for(const i in this.dateMessages) {\n // const dateMessage = this.dateMessages[i];\n // if(dateMessage.firstTimestamp > lastTime) {\n // lastElem = dateMessage.container;\n // lastTime = dateMessage.firstTimestamp;\n // }\n // }\n\n // return lastElem;\n // }\n\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\n if(this.getLastBubble() === bubble) {\n // return this.scrollToBubbleEnd(bubble);\n return this.scrollToEnd();\n }\n }\n\n public highlightBubble(element: HTMLElement) {\n const datasetKey = 'highlightTimeout';\n if(element.dataset[datasetKey]) {\n clearTimeout(+element.dataset[datasetKey]);\n element.classList.remove('is-highlighted');\n void element.offsetWidth; // reflow\n }\n\n element.classList.add('is-highlighted');\n element.dataset[datasetKey] = '' + setTimeout(() => {\n element.classList.remove('is-highlighted');\n delete element.dataset[datasetKey];\n }, 2000);\n }\n\n private createDateBubble(timestamp: number, date: Date = new Date(timestamp * 1000)) {\n let dateElement: HTMLElement;\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const isScheduled = this.chat.type === 'scheduled';\n\n if(today.getTime() === date.getTime()) {\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\n } else if(isScheduled && timestamp === SEND_WHEN_ONLINE_TIMESTAMP) {\n dateElement = i18n('MessageScheduledUntilOnline');\n } else {\n const options: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'long'\n };\n\n if(date.getFullYear() !== today.getFullYear()) {\n options.year = 'numeric';\n }\n\n dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n\n if(isScheduled) {\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\n }\n }\n\n const bubble = document.createElement('div');\n bubble.className = 'bubble service is-date';\n const bubbleContent = document.createElement('div');\n bubbleContent.classList.add('bubble-content');\n const serviceMsg = document.createElement('div');\n serviceMsg.classList.add('service-msg');\n\n serviceMsg.append(dateElement);\n\n bubbleContent.append(serviceMsg);\n bubble.append(bubbleContent);\n\n return bubble;\n }\n\n public getDateForDateContainer(timestamp: number) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n return {date, dateTimestamp: date.getTime()};\n }\n\n public getDateContainerByTimestamp(timestamp: number) {\n const {date, dateTimestamp} = this.getDateForDateContainer(timestamp);\n let ret = this.dateMessages[dateTimestamp];\n if(ret) {\n return ret;\n }\n\n const bubble = this.createDateBubble(timestamp, date);\n // bubble.classList.add('is-sticky');\n const fakeBubble = this.createDateBubble(timestamp, date);\n fakeBubble.classList.add('is-fake');\n\n const container = document.createElement('section');\n container.className = 'bubbles-date-group';\n container.append(bubble, fakeBubble);\n\n ret = this.dateMessages[dateTimestamp] = {\n div: bubble,\n container,\n firstTimestamp: date.getTime()\n };\n\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\n const length = haveTimestamps.length;\n let i = 0, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n insertBefore = this.dateMessages[t].container;\n if(dateTimestamp < t) {\n break;\n }\n }\n\n if(i === length && insertBefore) {\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\n }\n\n if(!insertBefore) {\n this.chatInner.append(container);\n } else {\n this.chatInner.insertBefore(container, insertBefore);\n }\n\n this.stickyIntersector?.observeStickyHeaderChanges(container);\n\n if(this.chatInner.parentElement) {\n this.container.classList.add('has-groups');\n }\n\n return ret;\n }\n\n private destroyScrollable() {\n this.scrollable.destroy();\n }\n\n public destroy() {\n // this.chat.log.error('Bubbles destroying');\n\n this.destroyScrollable();\n\n this.listenerSetter.removeAll();\n\n this.lazyLoadQueue.clear();\n this.observer && this.observer.disconnect();\n this.stickyIntersector && this.stickyIntersector.disconnect();\n\n delete this.lazyLoadQueue;\n this.observer && delete this.observer;\n this.stickyIntersector && delete this.stickyIntersector;\n }\n\n public cleanup(bubblesToo = false) {\n this.log('cleanup');\n\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\n // //console.time('appImManager cleanup');\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n // cancel scroll\n cancelAnimationByKey(this.scrollable.container);\n\n // do not wait ending of previous scale animation\n interruptHeavyAnimation();\n\n if(TEST_SCROLL !== undefined) {\n TEST_SCROLL = TEST_SCROLL_TIMES;\n }\n\n this.skippedMids.clear();\n this.dateMessages = {};\n this.bubbleGroups.cleanup();\n this.unreadOut.clear();\n this.needUpdate.length = 0;\n this.lazyLoadQueue.clear();\n this.renderNewPromises.clear();\n\n // clear messages\n if(bubblesToo) {\n this.scrollable.container.textContent = '';\n this.chatInner.textContent = '';\n this.cleanupPlaceholders();\n }\n\n this.firstUnreadBubble = null;\n this.attachedUnreadBubble = false;\n\n this.batchProcessor.clear();\n\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\n this.fetchNewPromise = undefined;\n this.getSponsoredMessagePromise = undefined;\n this.updateGradient = undefined;\n\n if(this.stickyIntersector) {\n this.stickyIntersector.disconnect();\n }\n\n if(this.observer) {\n this.observer.disconnect();\n\n this.unreaded.clear();\n this.unreadedSeen.clear();\n this.readPromise = undefined;\n\n this.viewsMids.clear();\n }\n\n this.middlewareHelper.clean();\n\n this.onAnimateLadder = undefined;\n this.resolveLadderAnimation = undefined;\n this.attachPlaceholderOnRender = undefined;\n this.emptyPlaceholderBubble = undefined;\n this.sponsoredMessage = undefined;\n this.previousStickyDate = undefined;\n\n this.scrollingToBubble = undefined;\n // //console.timeEnd('appImManager cleanup');\n\n this.isTopPaddingSet = false;\n\n this.renderingMessages.clear();\n this.bubblesToEject.clear();\n this.bubblesToReplace.clear();\n\n // this.reactions.clear();\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n this.isScrollingTimeout = 0;\n }\n\n this.container.classList.remove('has-sticky-dates');\n this.scrollable.cancelMeasure();\n }\n\n private cleanupPlaceholders(bubble = this.emptyPlaceholderBubble) {\n if(bubble) {\n this.destroyBubble(bubble);\n }\n }\n\n public async setPeer(options: ChatSetPeerOptions & {samePeer: boolean}): Promise<{cached?: boolean, promise: Chat['setPeerPromise']}> {\n const {samePeer, peerId, stack} = options;\n let {lastMsgId, startParam} = options;\n const tempId = ++this.setPeerTempId;\n\n if(!peerId) {\n this.cleanup(true);\n this.preloader.detach();\n return null;\n }\n\n const perf = performance.now();\n const log = this.log.bindPrefix('setPeer');\n log.warn('start');\n\n const middleware = () => {\n return this.setPeerTempId === tempId;\n };\n\n const m = middlewarePromise(middleware, PEER_CHANGED_ERROR);\n\n if(!samePeer) {\n await m(this.chat.onChangePeer(options, m));\n }\n\n /* if(samePeer && this.chat.setPeerPromise) {\n return {cached: true, promise: this.chat.setPeerPromise};\n } */\n\n const chatType = this.chat.type;\n\n if(chatType === 'scheduled' || this.chat.isRestricted) {\n lastMsgId = 0;\n }\n\n const historyStorage = await m(this.chat.getHistoryStorage());\n const topMessage = chatType === 'pinned' ? await m(this.managers.appMessagesManager.getPinnedMessagesMaxId(peerId, this.chat.threadId)) : historyStorage.maxId ?? 0;\n const isTarget = lastMsgId !== undefined;\n\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\n topMessage = 0;\n } */\n\n let followingUnread: boolean;\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\n if(!isTarget) {\n if(!samePeer) {\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\n }\n\n if(savedPosition) {\n\n } else if(topMessage) {\n readMaxId = await m(this.managers.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId));\n const dialog = await m(this.chat.getDialogOrTopic());\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\n }\n\n followingUnread = !isTarget;\n lastMsgId = readMaxId;\n } else {\n lastMsgId = topMessage;\n // lastMsgID = topMessage;\n }\n }\n }\n\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\n\n if(startParam === undefined && await m(this.chat.isStartButtonNeeded())) {\n startParam = BOT_START_PARAM;\n }\n\n if(samePeer) {\n if(stack && lastMsgId) {\n this.followStack.push(stack);\n }\n\n const mounted = await m(this.getMountedBubble(lastMsgId));\n if(mounted) {\n if(isTarget) {\n this.scrollToBubble(mounted.bubble, 'center');\n this.highlightBubble(mounted.bubble);\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\n } else if(topMessage && !isJump) {\n // log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\n // scrollable.setScrollTopSilently(scrollable.scrollHeight);\n this.scrollToEnd();\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\n }\n\n if(startParam !== undefined) {\n this.chat.input.setStartParam(startParam);\n }\n\n return null;\n }\n } else {\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\n this.lazyLoadQueue.queueId = ++queueId;\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }\n\n this.followStack.length = 0;\n\n this.passEntities = {\n messageEntityBotCommand: await m(this.managers.appPeersManager.isAnyGroup(peerId)) || this.chat.isBot\n };\n }\n\n if(DEBUG) {\n log('setPeer peerId:', peerId, historyStorage, lastMsgId, topMessage);\n }\n\n // add last message, bc in getHistory will load < max_id\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\n\n let maxBubbleId = 0;\n if(samePeer) {\n const el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\n // this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(el) {\n maxBubbleId = +el.dataset.mid;\n }\n\n if(maxBubbleId <= 0) {\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map((mid) => +mid));\n }\n } else {\n this.isFirstLoad = true;\n this.destroyResizeObserver();\n }\n\n const oldChatInner = this.chatInner;\n const oldPlaceholderBubble = this.emptyPlaceholderBubble;\n this.cleanup();\n const chatInner = this.chatInner = document.createElement('div');\n if(samePeer) {\n chatInner.className = oldChatInner.className;\n chatInner.classList.remove('disable-hover', 'is-scrolling');\n } else {\n chatInner.classList.add('bubbles-inner');\n }\n\n this.lazyLoadQueue.lock();\n\n // const haveToScrollToBubble = (topMessage && (isJump || samePeer)) || isTarget;\n const haveToScrollToBubble = samePeer || (topMessage && isJump) || isTarget;\n const fromUp = maxBubbleId > 0 && (!lastMsgId || maxBubbleId < lastMsgId || lastMsgId < 0);\n const scrollFromDown = !fromUp && samePeer;\n const scrollFromUp = !scrollFromDown && fromUp/* && (samePeer || forwardingUnread) */;\n this.willScrollOnLoad = scrollFromDown || scrollFromUp;\n\n this.setPeerOptions = {\n lastMsgId,\n topMessage\n };\n\n let result: Awaited>;\n if(!savedPosition) {\n result = await m(this.getHistory1(lastMsgId, true, isJump, additionMsgId));\n } else {\n result = {\n promise: getHeavyAnimationPromise().then(() => {\n return this.performHistoryResult({history: savedPosition.mids}, true);\n }) as any,\n cached: true,\n waitPromise: Promise.resolve()\n };\n }\n\n this.setPeerCached = result.cached;\n\n log.warn('got history');// warning\n\n const {promise, cached} = result;\n\n if(!cached && !samePeer) {\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam));\n this.scrollable.container.textContent = '';\n // oldContainer.textContent = '';\n // oldChatInner.remove();\n this.preloader.attach(this.container);\n }\n\n /* this.ladderDeferred && this.ladderDeferred.resolve();\n this.ladderDeferred = deferredPromise(); */\n\n animationIntersector.lockGroup(this.chat.animationGroup);\n const setPeerPromise = m(promise).then(async() => {\n log.warn('promise fulfilled');\n\n const mountedByLastMsgId = haveToScrollToBubble ? await m(lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()}) : undefined;\n if(cached && !samePeer) {\n log.warn('finishing peer change');\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam)); // * костыль\n log.warn('finished peer change');\n }\n\n this.preloader.detach();\n\n if(this.resolveLadderAnimation) {\n this.resolveLadderAnimation();\n this.resolveLadderAnimation = undefined;\n }\n\n this.setPeerCached = undefined;\n\n // this.ladderDeferred.resolve();\n\n const scrollable = this.scrollable;\n scrollable.lastScrollDirection = 0;\n scrollable.lastScrollPosition = 0;\n replaceContent(scrollable.container, chatInner);\n // this.chat.topbar.container.nextElementSibling.replaceWith(container);\n\n if(oldPlaceholderBubble) {\n this.cleanupPlaceholders(oldPlaceholderBubble);\n }\n\n if(this.attachPlaceholderOnRender) {\n this.attachPlaceholderOnRender();\n }\n\n if(!isTarget && this.chat.isPinnedMessagesNeeded()) {\n this.chat.topbar.pinnedMessage?.setCorrectIndex(0);\n }\n\n this.container.classList.toggle('has-groups', !!Object.keys(this.dateMessages).length);\n\n log.warn('mounted chat', this.chatInner === chatInner, this.chatInner.parentElement, performance.now() - perf);\n\n animationIntersector.unlockGroup(this.chat.animationGroup);\n animationIntersector.checkAnimations(false, this.chat.animationGroup/* , true */);\n\n // fastRaf(() => {\n this.lazyLoadQueue.unlock();\n // });\n\n // if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\n if(savedPosition) {\n scrollable.setScrollTopSilently(savedPosition.top);\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\n }\n\n if(bubble) {\n const top = bubble.getBoundingClientRect().top;\n const distance = savedPosition.top - top;\n scrollable.scrollTop += distance;\n } */\n } else if(haveToScrollToBubble) {\n let unsetPadding: () => void;\n if(scrollFromDown) {\n scrollable.setScrollTopSilently(99999);\n } else if(scrollFromUp) {\n const set = this.setTopPadding();\n if(set.isPaddingNeeded) {\n unsetPadding = set.unsetPadding;\n }\n\n scrollable.setScrollTopSilently(0);\n }\n\n // const mountedByLastMsgId = lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()};\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId, false) || this.findNextMountedBubbleByMsgId(lastMsgId, true);\n }\n\n let promise: Promise;\n // ! sometimes there can be no bubble\n if(bubble) {\n const lastBubble = this.getLastBubble();\n const position: ScrollLogicalPosition = followingUnread ? 'start' : (!isJump && !isTarget && lastBubble === bubble ? 'end' : 'center');\n\n if(position === 'end' && lastBubble === bubble && samePeer) {\n promise = this.scrollToEnd();\n } else {\n promise = this.scrollToBubble(bubble, position, !samePeer ? FocusDirection.Static : undefined);\n }\n\n if(!followingUnread && isTarget) {\n this.highlightBubble(bubble);\n }\n }\n\n if(unsetPadding) {\n (promise || Promise.resolve()).then(() => {\n unsetPadding();\n });\n }\n } else {\n scrollable.setScrollTopSilently(99999);\n }\n\n // if(!cached) {\n this.onRenderScrollSet();\n // }\n\n this.onScroll();\n\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\n afterSetPromise.then(() => { // check whether list isn't full\n scrollable.checkForTriggers();\n\n // if(cached) {\n // this.onRenderScrollSet();\n // }\n });\n\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\n\n Promise.all([\n this.setFetchReactionsInterval(afterSetPromise),\n this.setFetchHistoryInterval({\n afterSetPromise,\n lastMsgId,\n samePeer,\n savedPosition,\n topMessage\n })\n ]).then(() => {\n log('scrolledAllDown:', scrollable.loadedAll.bottom);\n // if(!this.unreaded.length && dialog) { // lol\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\n this.onScrolledAllDown();\n }\n });\n\n if(chatType === 'chat' && !this.chat.isForumTopic) {\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\n if(dialog?.pFlags.unread_mark) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n }\n\n // this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\n }).catch((err) => {\n log.error('setPeer promise error:', err);\n if(!middleware()) {\n this.preloader.detach();\n }\n\n throw err;\n });\n\n return {cached, promise: setPeerPromise};\n }\n\n private async setFetchReactionsInterval(afterSetPromise: Promise) {\n const middleware = this.getMiddleware();\n const needReactionsInterval = this.chat.isChannel;\n if(needReactionsInterval) {\n const fetchReactions = async() => {\n if(!middleware()) return;\n\n const mids: number[] = [];\n for(const mid in this.bubbles) {\n let message = await this.chat.getMessage(+mid);\n if(message?._ !== 'message') {\n continue;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n mids.push(message.mid);\n }\n\n const promise = mids.length ? this.managers.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\n promise.then(() => {\n setTimeout(fetchReactions, 10e3);\n });\n };\n\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\n fetchReactions();\n });\n }\n }\n\n private async setFetchHistoryInterval({\n lastMsgId,\n topMessage,\n afterSetPromise,\n savedPosition,\n samePeer\n }: {\n lastMsgId: number,\n topMessage: number,\n afterSetPromise: Promise,\n savedPosition: ChatSavedPosition,\n samePeer: boolean\n }) {\n const middleware = this.getMiddleware();\n const peerId = this.peerId;\n\n const needFetchInterval = await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId);\n const needFetchNew = savedPosition || needFetchInterval;\n if(!needFetchNew) {\n return;\n }\n\n await afterSetPromise;\n if(!middleware()) {\n return;\n }\n\n const chatId = peerId.toChatId();\n middleware.onClean(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(chatId);\n });\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(chatId);\n return;\n\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n\n if(!needFetchInterval) {\n return;\n }\n\n const f = () => {\n this.fetchNewPromise = new Promise(async(resolve) => {\n if(!middleware() || !(await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId))) {\n resolve();\n return;\n }\n\n this.managers.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((result) => {\n if(!middleware() || !result) {\n resolve();\n return;\n }\n\n const {isBottomEnd} = result;\n if(this.scrollable.loadedAll.bottom && this.scrollable.loadedAll.bottom !== isBottomEnd) {\n this.setLoaded('bottom', isBottomEnd);\n this.onScroll();\n }\n\n setTimeout(f, 30e3);\n resolve();\n });\n }).finally(() => {\n this.fetchNewPromise = undefined;\n });\n };\n\n if(samePeer) {\n setTimeout(f, 30e3);\n } else {\n f();\n }\n }\n\n public async onScrolledAllDown() {\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n const historyMaxId = await this.chat.getHistoryMaxId();\n this.managers.appMessagesManager.readHistory(this.peerId, historyMaxId, this.chat.threadId, true);\n }\n }\n\n public async finishPeerChange() {\n const [isChannel, canWrite, isAnyGroup] = await Promise.all([\n this.chat.isChannel,\n this.chat.canSend(),\n this.chat.isAnyGroup\n ]);\n\n return () => {\n this.chatInner.classList.toggle('has-rights', canWrite);\n this.container.classList.toggle('is-chat-input-hidden', !canWrite);\n\n this.chatInner.classList.toggle('is-chat', isAnyGroup);\n this.chatInner.classList.toggle('is-channel', isChannel);\n\n this.createResizeObserver();\n };\n }\n\n private processBatch = async(...args: Parameters) => {\n let [loadQueue, m, log] = args;\n\n const filterQueue = (queue: typeof loadQueue) => {\n return queue.filter((details) => {\n // message can be deleted during rendering\n return details && this.bubbles[details.bubble.dataset.mid] === details.bubble;\n });\n };\n\n loadQueue = filterQueue(loadQueue);\n\n log('messages rendered');\n\n const reverse = loadQueue[0]?.reverse;\n\n const {groups, avatarPromises} = this.groupBubbles(loadQueue.filter((details) => details.updatePosition));\n\n // if(groups.length > 2 && loadQueue.length === 1) {\n // debugger;\n // }\n\n const promises = loadQueue.reduce((acc, details) => {\n const perf = performance.now();\n\n const promises = details.promises.slice();\n const timePromises = promises.map(async(promise) => (await promise, performance.now() - perf));\n Promise.all(timePromises).then((times) => {\n log.groupCollapsed('media message time', performance.now() - perf, details, times);\n times.forEach((time, idx) => {\n log('media message time', time, idx, promises[idx]);\n });\n log.groupEnd();\n });\n\n // if(details.updatePosition) {\n // if(res) {\n // groups.add(res.group);\n // if(details.needAvatar) {\n // details.promises.push(res.group.createAvatar(details.message));\n // }\n // }\n // }\n\n acc.push(...details.promises);\n return acc;\n }, [] as Promise[]);\n\n promises.push(...avatarPromises);\n // promises.push(pause(200));\n\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\n // promises.push(getHeavyAnimationPromise());\n\n log('media promises to call', promises, loadQueue, this.isHeavyAnimationInProgress);\n await m(Promise.all([...promises, this.setUnreadDelimiter()]).catch(noop)); // не нашёл места лучше\n await m(fastRafPromise()); // have to be the last\n log('media promises end');\n\n loadQueue = filterQueue(loadQueue);\n\n const {restoreScroll, scrollSaver} = this.prepareToSaveScroll(reverse);\n // if(this.messagesQueueOnRender) {\n // this.messagesQueueOnRender();\n // }\n\n this.messagesQueueOnRenderAdditional?.();\n\n this.ejectBubbles();\n for(const [bubble, oldBubble] of this.bubblesToReplace) {\n if(scrollSaver) {\n scrollSaver.replaceSaved(oldBubble, bubble);\n }\n\n if(!loadQueue.find((details) => details.bubble === bubble)) {\n continue;\n }\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) {\n this.log.error('NO ITEM BY BUBBLE', bubble);\n } else {\n item.mounted = false;\n if(!groups.includes(item.group)) {\n groups.push(item.group);\n }\n }\n\n this.bubblesToReplace.delete(bubble);\n }\n\n if(this.chat.selection.isSelecting) {\n loadQueue.forEach(({bubble}) => {\n this.chat.selection.toggleElementCheckbox(bubble, true);\n });\n }\n\n loadQueue.forEach(({message, bubble, updatePosition}) => {\n if(message.pFlags.local && updatePosition) {\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\n return;\n }\n });\n\n this.bubbleGroups.mountUnmountGroups(groups);\n // this.bubbleGroups.findIncorrentPositions();\n\n this.updatePlaceholderPosition?.();\n\n restoreScroll?.();\n\n // this.setStickyDateManually();\n };\n\n public renderMessagesQueue(options: ReturnType) {\n return this.batchProcessor.addToQueue(options);\n }\n\n private ejectBubbles() {\n for(const bubble of this.bubblesToEject) {\n bubble.remove();\n // this.bubbleGroups.removeAndUnmountBubble(bubble);\n }\n\n this.bubblesToEject.clear();\n }\n\n public groupBubbles(items: Array<{\n // Awaited> &\n bubble: HTMLElement,\n message: Message.message | Message.messageService\n }/* & {\n unmountIfFound?: boolean\n } */>) {\n let modifiedGroups: typeof groups;\n\n if(this.chat.type === 'scheduled') {\n modifiedGroups = new Set();\n items.forEach(({bubble, message}) => {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n const group = item?.group;\n if(group && item.message.date !== message.date) {\n this.bubbleGroups.removeItem(item);\n modifiedGroups.add(group);\n }\n });\n }\n\n items.forEach(({bubble, message}) => {\n this.bubbleGroups.prepareForGrouping(bubble, message);\n });\n\n const groups = this.bubbleGroups.groupUngrouped();\n\n const avatarPromises = Array.from(groups).map((group) => {\n if(group.avatar) return;\n const firstItem = group.firstItem;\n if(firstItem && this.chat.isAvatarNeeded(firstItem.message)) {\n return group.createAvatar(firstItem.message);\n }\n }).filter(Boolean);\n\n if(modifiedGroups) {\n for(const group of modifiedGroups) {\n groups.add(group);\n }\n }\n\n return {\n groups: [...groups],\n avatarPromises\n };\n }\n\n public getMiddleware(additionalCallback?: () => boolean) {\n return this.middlewareHelper.get(additionalCallback);\n }\n\n private async wrapMediaSpoiler({\n media,\n promise,\n middleware,\n attachmentDiv\n }: {\n media: Photo.photo | MyDocument,\n promise: Promise,\n middleware: Middleware,\n attachmentDiv: HTMLElement\n }) {\n await promise;\n if(!middleware()) {\n return;\n }\n\n const {width, height} = attachmentDiv.style;\n const container = await wrapMediaSpoiler({\n media,\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n if(!middleware()) {\n return;\n }\n\n attachmentDiv.append(container);\n }\n\n private async safeRenderMessage(\n message: Message.message | Message.messageService,\n reverse?: boolean,\n bubble?: HTMLElement,\n updatePosition = true,\n processResult?: (result: ReturnType, bubble: HTMLElement) => typeof result\n ) {\n if(!message || this.renderingMessages.has(message.mid) || (this.bubbles[message.mid] && !bubble)) {\n return;\n }\n\n const middlewareHelper = this.getMiddleware().create();\n const middleware = middlewareHelper.get();\n\n let result: Awaited> & {updatePosition: typeof updatePosition};\n try {\n this.renderingMessages.add(message.mid);\n\n // const groupedId = (message as Message.message).grouped_id;\n const newBubble = document.createElement('div');\n newBubble.middlewareHelper = middlewareHelper;\n newBubble.dataset.mid = '' + message.mid;\n newBubble.dataset.peerId = '' + message.peerId;\n newBubble.dataset.timestamp = '' + message.date;\n\n // const bubbleNew: Bubble = this.bubblesNew[message.mid] ??= {\n // bubble: newBubble,\n // mids: new Set(),\n // groupedId\n // };\n\n // bubbleNew.mids.add(message.mid);\n\n if(bubble) {\n bubble.middlewareHelper.destroy();\n this.skippedMids.delete(message.mid);\n\n this.bubblesToEject.add(bubble);\n this.bubblesToReplace.delete(bubble);\n this.bubblesToReplace.set(newBubble, bubble);\n this.bubbleGroups.changeBubbleByBubble(bubble, newBubble);\n }\n\n bubble = this.bubbles[message.mid] = newBubble;\n let originalPromise = this.renderMessage(message, reverse, bubble, middleware);\n if(processResult) {\n originalPromise = processResult(originalPromise, bubble);\n }\n\n const promise = originalPromise.then((r) => ((r && middleware() ? {...r, updatePosition} : undefined) as typeof result));\n\n this.renderMessagesQueue(promise.catch(() => undefined));\n\n result = await promise;\n if(!middleware()) {\n return;\n }\n\n if(!result) {\n this.skippedMids.add(+message.mid);\n }\n } catch(err) {\n this.log.error('renderMessage error:', err);\n }\n\n if(!middleware()) {\n return;\n }\n\n this.renderingMessages.delete(message.mid);\n return result;\n }\n\n // reverse means top\n private async renderMessage(\n message: Message.message | Message.messageService,\n reverse = false,\n bubble: HTMLElement,\n middleware: Middleware\n ) {\n // if(DEBUG) {\n // this.log('message to render:', message);\n // }\n\n // if(!bubble && this.bubbles[message.mid]) {\n // return;\n // }\n\n // await pause(1000);\n\n const isMessage = message._ === 'message';\n const groupedId = isMessage && message.grouped_id;\n let albumMids: number[], reactionsMessage: Message.message;\n const albumMessages = groupedId ? await this.managers.appMessagesManager.getMessagesByAlbum(groupedId) : undefined;\n\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\n\n if(groupedId && albumMustBeRenderedFull) { // will render only last album's message\n albumMids = albumMessages.map((message) => message.mid);\n const mainMid = getMainMidForGrouped(albumMids);\n if(message.mid !== mainMid) {\n return;\n }\n }\n\n if(isMessage) {\n reactionsMessage = groupedId ? albumMessages[0] : message;\n }\n\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\n const our = this.chat.isOurMessage(message);\n\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('message', 'spoilers-container');\n\n const contentWrapper = document.createElement('div');\n contentWrapper.classList.add('bubble-content-wrapper');\n\n const bubbleContainer = document.createElement('div');\n bubbleContainer.classList.add('bubble-content');\n\n bubble.classList.add('bubble');\n contentWrapper.append(bubbleContainer);\n bubble.append(contentWrapper);\n\n let isInUnread = !our &&\n !message.pFlags.out &&\n (\n message.pFlags.unread ||\n isMentionUnread(message)\n );\n\n if(!isInUnread && this.chat.peerId.isAnyChat()) {\n const readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId, this.chat.threadId);\n if(readMaxId !== undefined && readMaxId < message.mid) {\n isInUnread = true;\n }\n }\n\n if(isInUnread && this.observer) {\n // this.log('not our message', message, message.pFlags.unread);\n this.observer.observe(bubble, this.unreadedObserverCallback);\n this.unreaded.set(bubble, message.mid);\n }\n\n const loadPromises: Promise[] = [];\n const ret = {\n bubble,\n promises: loadPromises,\n message,\n reverse\n };\n\n const wrapOptions: WrapSomethingOptions = {\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n customEmojiSize: this.chat.appImManager.customEmojiSize,\n animationGroup: this.chat.animationGroup\n };\n\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\n const action = message.action;\n if(action) {\n const _ = action._;\n\n const ignoreAction = IGNORE_ACTIONS.get(_);\n if(ignoreAction && (ignoreAction === true || ignoreAction(message))) {\n return;\n }\n\n if(langPack.hasOwnProperty(_) && !langPack[_]) {\n return;\n }\n }\n\n bubble.className = 'bubble service';\n\n bubbleContainer.innerHTML = '';\n const s = document.createElement('div');\n s.classList.add('service-msg');\n if(action) {\n let promise: Promise;\n if(action._ === 'messageActionChannelMigrateFrom') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.chat_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.From', [peerTitle.element]));\n } else if(action._ === 'messageActionChatMigrateTo') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.channel_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.To', [peerTitle.element]));\n } else {\n s.append(await wrapMessageActionTextNew({\n message,\n ...wrapOptions\n }));\n }\n }\n bubbleContainer.append(s);\n\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\n bubble.classList.add('is-group-last');\n }\n\n return ret;\n }\n\n let messageMedia: MessageMedia = isMessage && message.media;\n let needToSetHTML = true;\n let messageMessage: string, totalEntities: MessageEntity[];\n if(isMessage) {\n if(groupedId && albumMustBeRenderedFull) {\n const t = getAlbumText(albumMessages);\n messageMessage = t?.message || '';\n // totalEntities = t.entities;\n totalEntities = t?.totalEntities || [];\n } else {\n messageMessage = message.message;\n // totalEntities = message.entities;\n totalEntities = message.totalEntities;\n }\n\n const document = (messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n if(document?.type === 'sticker') {\n messageMessage = totalEntities = undefined;\n } else if(!['video', 'gif'].includes(document.type)) {\n needToSetHTML = false;\n }\n }\n } else {\n if(message.action._ === 'messageActionPhoneCall') {\n messageMedia = {\n _: 'messageMediaCall',\n action: message.action\n };\n }\n }\n\n let bigEmojis = 0, customEmojiSize: MediaSize;\n if(totalEntities && !messageMedia) {\n const emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji'/* || e._ === 'messageEntityCustomEmoji' */);\n const strLength = messageMessage.replace(/\\s/g, '').length;\n const emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\n\n if(emojiStrLength === strLength /* && emojiEntities.length <= 3 *//* && totalEntities.length === emojiEntities.length */) {\n bigEmojis = Math.min(BIG_EMOJI_SIZES_LENGTH, emojiEntities.length);\n\n customEmojiSize = mediaSizes.active.customEmoji;\n\n const size = BIG_EMOJI_SIZES[bigEmojis];\n if(size) {\n customEmojiSize = makeMediaSize(size, size);\n bubble.style.setProperty('--emoji-size', size + 'px');\n }\n }\n }\n\n customEmojiSize ??= this.chat.appImManager.customEmojiSize;\n\n const richText = wrapRichText(messageMessage, {\n entities: totalEntities,\n passEntities: this.passEntities,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue,\n customEmojiSize,\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n let canHaveTail = true;\n let isStandaloneMedia = false;\n let attachmentDiv: HTMLElement;\n if(bigEmojis) {\n if(rootScope.settings.emoji.big) {\n const sticker = bigEmojis === 1 &&\n !totalEntities.find((entity) => entity._ === 'messageEntityCustomEmoji') &&\n await this.managers.appStickersManager.getAnimatedEmojiSticker(messageMessage);\n if(bigEmojis === 1 && !messageMedia && sticker) {\n messageMedia = {\n _: 'messageMediaDocument',\n document: sticker\n };\n } else {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment', 'spoilers-container');\n\n setInnerHTML(attachmentDiv, richText);\n\n bubbleContainer.append(attachmentDiv);\n }\n\n bubble.classList.add('is-message-empty', 'emoji-big');\n isStandaloneMedia = true;\n canHaveTail = false;\n needToSetHTML = false;\n }\n\n bubble.classList.add('can-have-big-emoji');\n }\n\n if(needToSetHTML) {\n setInnerHTML(messageDiv, richText);\n }\n\n const haveRTLChar = isRTL(messageMessage, true);\n\n const timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n messageDiv.append(timeSpan);\n bubbleContainer.prepend(messageDiv);\n // bubble.prepend(timeSpan, messageDiv); // that's bad\n\n if(haveRTLChar) {\n timeSpan.classList.add('is-block');\n }\n\n let topicNameButtonContainer: HTMLElement;\n if(isMessage && this.chat.isAllMessagesForum) {\n const result = await wrapTopicNameButton({\n peerId: this.peerId,\n threadId: getMessageThreadId(message, this.chat.isForum),\n lastMsgId: message.mid,\n wrapOptions: {\n middleware\n },\n withIcons: true\n });\n\n const {element} = result;\n // if(isStandaloneMedia) {\n // element.classList.add('floating-part');\n // }\n\n topicNameButtonContainer = document.createElement('div');\n topicNameButtonContainer.classList.add(/* 'name', */'topic-name-button-container');\n topicNameButtonContainer.append(element);\n }\n\n if(isMessage && message.views) {\n bubble.classList.add('channel-post');\n\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\n const forward = document.createElement('div');\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\n bubbleContainer.prepend(forward);\n bubble.classList.add('with-beside-button');\n }\n\n if(!message.pFlags.is_outgoing && this.observer) {\n this.observer.observe(bubble, this.viewsObserverCallback);\n }\n }\n\n const replyMarkup = isMessage && message.reply_markup;\n let replyMarkupRows = replyMarkup?._ === 'replyInlineMarkup' && replyMarkup.rows;\n if(replyMarkupRows) {\n replyMarkupRows = replyMarkupRows.filter((row) => row.buttons.length);\n }\n\n if(replyMarkupRows) {\n const containerDiv = document.createElement('div');\n containerDiv.classList.add('reply-markup');\n replyMarkupRows.forEach((row) => {\n const buttons = row.buttons;\n\n const rowDiv = document.createElement('div');\n rowDiv.classList.add('reply-markup-row');\n\n buttons.forEach((button) => {\n let text: DocumentFragment | HTMLElement | string = wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\n\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\n\n switch(button._) {\n case 'keyboardButtonUrl': {\n const r = wrapRichText(' ', {\n entities: [{\n _: 'messageEntityTextUrl',\n length: 1,\n offset: 0,\n url: button.url\n }]\n });\n\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\n buttonEl.classList.add('is-link');\n\n break;\n }\n\n case 'keyboardButtonSwitchInline': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-switch-inline');\n attachClickEvent(buttonEl, (e) => {\n cancelEvent(e);\n\n const botId = message.viaBotId || message.fromId;\n let promise: Promise;\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\n else promise = this.managers.appInlineBotsManager.checkSwitchReturn(botId).then((peerId) => {\n if(peerId) {\n return peerId;\n }\n\n return new Promise((resolve, reject) => {\n const popup = new PopupForward({\n [this.peerId]: []\n }, (peerId) => {\n resolve(peerId);\n }, true);\n\n popup.addEventListener('close', () => {\n reject();\n });\n });\n });\n\n promise.then((peerId) => {\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\n });\n });\n break;\n }\n\n case 'keyboardButtonBuy': {\n const mediaInvoice = messageMedia._ === 'messageMediaInvoice' ? messageMedia : undefined;\n if(mediaInvoice?.extended_media) {\n break;\n }\n\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-buy');\n\n if(mediaInvoice?.receipt_msg_id) {\n text = i18n('Message.ReplyActionButtonShowReceipt');\n }\n\n break;\n }\n\n default: {\n buttonEl = document.createElement('button');\n break;\n }\n }\n\n if(!buttonEl) {\n return;\n }\n\n buttonEl.classList.add('reply-markup-button', 'rp', 'tgico');\n const t = document.createElement('span');\n t.classList.add('reply-markup-button-text');\n if(typeof(text) === 'string') {\n t.insertAdjacentHTML('beforeend', text);\n } else {\n t.append(text);\n }\n\n ripple(buttonEl);\n buttonEl.append(t);\n\n rowDiv.append(buttonEl);\n });\n\n if(!rowDiv.childElementCount) {\n return;\n }\n\n containerDiv.append(rowDiv);\n });\n\n const haveButtons = !!containerDiv.childElementCount;\n\n haveButtons && attachClickEvent(containerDiv, (e) => {\n let target = e.target as HTMLElement;\n\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\n if(\n !target ||\n target.classList.contains('is-link') ||\n target.classList.contains('is-switch-inline') ||\n target.classList.contains('is-buy')\n ) return;\n\n cancelEvent(e);\n\n const column = whichChild(target);\n const row = replyMarkupRows[whichChild(target.parentElement)];\n\n if(!row.buttons || !row.buttons[column]) {\n this.log.warn('no such button', row, column, message);\n return;\n }\n\n const button = row.buttons[column];\n this.managers.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button).then((callbackAnswer) => {\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\n toast(wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\n }\n\n // console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\n });\n });\n\n if(haveButtons) {\n // canHaveTail = false;\n bubble.classList.add('with-reply-markup');\n contentWrapper.append(containerDiv);\n }\n }\n\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\n if(our) {\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\n let status = '';\n if(message.error) status = 'is-error';\n else if(isOutgoing) status = 'is-sending';\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\n bubble.classList.add(status);\n }\n\n if(isOutgoing && !message.error) {\n bubble.classList.add('is-outgoing');\n }\n\n const messageWithReplies = isMessage && await this.managers.appMessagesManager.getMessageWithCommentReplies(message);\n const withReplies = !!messageWithReplies && message.mid > 0;\n\n if(withReplies) {\n bubble.classList.add('with-replies');\n }\n\n const fwdFrom = isMessage && message.fwd_from;\n const fwdFromId = isMessage && message.fwdFromId;\n\n const isOut = this.chat.isOutMessage(message);\n let nameContainer: HTMLElement = bubbleContainer;\n\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\n\n const isMessageEmpty = !messageMessage/* && (!topicNameButtonContainer || isStandaloneMedia) */;\n\n let viewButton: HTMLAnchorElement;\n // media\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment');\n\n if(isMessageEmpty) {\n bubble.classList.add('is-message-empty');\n }\n\n let processingWebPage = false;\n\n /* if(isMessage) */switch(messageMedia._) {\n case 'messageMediaPhoto': {\n const photo = messageMedia.photo;\n // //////this.log('messageMediaPhoto', photo);\n\n if(isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add('photo');\n\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware: this.getMiddleware(),\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n\n break;\n }\n\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapPhoto({\n photo: photo as Photo.photo,\n message,\n container: attachmentDiv,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: photo as Photo.photo,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n processingWebPage = true;\n\n const webPage: WebPage = messageMedia.webpage;\n // //////this.log('messageMediaWebPage', webpage);\n if(webPage._ !== 'webPage') {\n break;\n }\n\n const wrapped = wrapUrl(webPage.url);\n if(wrapped?.onclick === 'im') {\n const map: {[type: string]: LangPackKey} = {\n telegram_channel: 'Chat.Message.ViewChannel',\n telegram_megagroup: 'OpenGroup'\n };\n\n const langPackKey = map[webPage.type] || 'OpenMessage';\n viewButton = this.makeViewButton({text: langPackKey, asLink: true});\n viewButton.href = wrapped.url;\n viewButton.setAttribute('onclick', `${wrapped.onclick}(this)`);\n }\n\n bubble.classList.add('webpage');\n\n const box = document.createElement('div');\n box.classList.add('web');\n\n const quote = document.createElement('div');\n quote.classList.add('quote');\n\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\n const photo: Photo.photo = webPage.photo as any;\n if(photo || webPage.document) {\n previewResizer = document.createElement('div');\n previewResizer.classList.add('preview-resizer');\n preview = document.createElement('div');\n preview.classList.add('preview');\n previewResizer.append(preview);\n }\n\n const quoteTextDiv = document.createElement('div');\n quoteTextDiv.classList.add('quote-text');\n\n const doc = webPage.document as MyDocument;\n if(doc) {\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\n // if(doc.size <= 20e6) {\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\n if(doc.type === 'round') {\n bubble.classList.add('round');\n preview.classList.add('is-round');\n } else {\n bubble.classList.add('video');\n }\n wrapVideo({\n doc,\n container: preview,\n message: message as Message.message,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n isOut,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n noInfo: message.mid < 0\n });\n // }\n } else {\n const docDiv = await wrapDocument({\n message: message as Message.message,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises,\n sizeType: 'documentName',\n searchContext: {\n useSearch: false,\n peerId: this.peerId,\n inputFilter: {\n _: 'inputMessagesFilterEmpty'\n }\n },\n fontSize: rootScope.settings.messagesTextSize\n });\n preview.append(docDiv);\n preview.classList.add('preview-with-document');\n quoteTextDiv.classList.add('has-document');\n // messageDiv.classList.add((webpage.type || 'document') + '-message');\n // doc = null;\n }\n }\n\n if(previewResizer) {\n quoteTextDiv.append(previewResizer);\n }\n\n let t: HTMLElement;\n if(webPage.site_name) {\n const html = wrapRichText(webPage.url);\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\n a.classList.add('webpage-name');\n const strong = document.createElement('strong');\n setInnerHTML(strong, wrapEmojiText(webPage.site_name));\n a.textContent = '';\n a.append(strong);\n quoteTextDiv.append(a);\n t = a;\n }\n\n const title = wrapWebPageTitle(webPage);\n if(title.textContent) {\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('title');\n const strong = document.createElement('strong');\n setInnerHTML(strong, title);\n titleDiv.append(strong);\n quoteTextDiv.append(titleDiv);\n t = titleDiv;\n }\n\n const description = wrapWebPageDescription(webPage);\n if(description.textContent) {\n const textDiv = document.createElement('div');\n textDiv.classList.add('text');\n setInnerHTML(textDiv, description);\n quoteTextDiv.append(textDiv);\n t = textDiv;\n }\n\n /* if(t) {\n t.append(timeSpan);\n } else {\n box.classList.add('no-text');\n } */\n\n quote.append(quoteTextDiv);\n\n if(photo && !doc) {\n bubble.classList.add('photo');\n\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\n let isSquare = false;\n if(size.w === size.h && t) {\n bubble.classList.add('is-square-photo');\n isSquare = true;\n setAttachmentSize(photo, preview, 48, 48, false);\n\n /* if(t) {\n t.append(timeSpan);\n } */\n } else if(size.h > size.w) {\n bubble.classList.add('is-vertical-photo');\n }\n\n wrapPhoto({\n photo,\n message,\n container: preview,\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width,\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n withoutPreloader: isSquare,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n }\n\n box.append(quote);\n\n // bubble.prepend(box);\n // if(timeSpan.parentElement === messageDiv) {\n messageDiv.insertBefore(box, timeSpan);\n // } else {\n // messageDiv.append(box);\n // }\n\n // this.log('night running', bubble.scrollHeight);\n\n break;\n }\n\n case 'messageMediaDocument': {\n const doc = messageMedia.document as MyDocument;\n\n // this.log('messageMediaDocument', doc, bubble);\n\n if(doc.sticker/* && doc.size <= 1e6 */) {\n bubble.classList.add('sticker');\n canHaveTail = false;\n isStandaloneMedia = true;\n\n if(doc.animated) {\n bubble.classList.add('sticker-animated');\n }\n\n const sizes = mediaSizes.active;\n const isEmoji = bubble.classList.contains('emoji-big');\n const boxSize = isEmoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n setAttachmentSize(doc, attachmentDiv, boxSize.width, boxSize.height);\n // let preloader = new ProgressivePreloader(attachmentDiv, false);\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\n // appPhotosManager.setAttachmentSize(doc, bubble);\n wrapSticker({\n doc,\n div: attachmentDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n emoji: isEmoji ? messageMessage : undefined,\n withThumb: true,\n loadPromises,\n isOut,\n noPremium: messageMedia?.pFlags?.nopremium\n });\n\n if((getStickerEffectThumb(doc) || isEmoji) && (isInUnread || isOutgoing)/* || true */) {\n this.observer.observe(bubble, this.stickerEffectObserverCallback);\n }\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\n // this.log('never get free 2', doc);\n\n const isRound = doc.type === 'round';\n if(isRound) {\n isStandaloneMedia = true;\n }\n\n if(isRound || isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add(isRound ? 'round' : 'video');\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware,\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n } else {\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapVideo({\n doc,\n container: attachmentDiv,\n message: message as Message.message,\n boxWidth: mediaSizes.active.regular.width,\n boxHeight: mediaSizes.active.regular.height,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n searchContext: isRound ? {\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n noInfo: message.mid < 0,\n noAutoplayAttribute: !!messageMedia.pFlags.spoiler\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: doc,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n }\n } else {\n const newNameContainer = await wrapGroupedDocuments({\n albumMustBeRenderedFull,\n message,\n bubble,\n messageDiv,\n chat: this.chat,\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\n peerId: this.peerId,\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n sizeType: 'documentName',\n fontSize: rootScope.settings.messagesTextSize,\n richTextFragment: richText\n });\n\n if(newNameContainer) {\n nameContainer = newNameContainer;\n }\n\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document, .audio');\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\n lastContainer && lastContainer.append(timeSpan);\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\n processingWebPage = true;\n }\n\n break;\n }\n\n case 'messageMediaCall': {\n const action = messageMedia.action;\n const div = document.createElement('div');\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\n\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\n div.dataset.type = type;\n\n const title = document.createElement('div');\n title.classList.add('bubble-call-title');\n\n _i18n(title, isOut ?\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') :\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('bubble-call-subtitle');\n\n if(action.duration !== undefined) {\n subtitle.append(formatCallDuration(action.duration));\n } else {\n let langPackKey: LangPackKey;\n switch(action.reason._) {\n case 'phoneCallDiscardReasonBusy':\n langPackKey = 'Call.StatusBusy';\n break;\n case 'phoneCallDiscardReasonMissed':\n langPackKey = 'Chat.Service.Call.Missed';\n break;\n // case 'phoneCallDiscardReasonHangup':\n default:\n langPackKey = 'Chat.Service.Call.Cancelled';\n break;\n }\n\n subtitle.classList.add('is-reason');\n _i18n(subtitle, langPackKey);\n }\n\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\n\n div.append(title, subtitle);\n\n processingWebPage = true;\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('call-message');\n messageDiv.append(div);\n\n break;\n }\n\n case 'messageMediaContact': {\n // this.log('wrapping contact', message);\n\n const contact = messageMedia;\n const contactDiv = document.createElement('div');\n contactDiv.classList.add('contact');\n contactDiv.dataset.peerId = '' + contact.user_id;\n\n processingWebPage = true;\n\n const contactDetails = document.createElement('div');\n contactDetails.className = 'contact-details';\n const contactNameDiv = document.createElement('div');\n contactNameDiv.className = 'contact-name';\n contactNameDiv.append(\n wrapEmojiText([\n contact.first_name,\n contact.last_name\n ].filter(Boolean).join(' '))\n );\n\n const contactNumberDiv = document.createElement('div');\n contactNumberDiv.className = 'contact-number';\n contactNumberDiv.textContent = contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number';\n\n contactDiv.append(contactDetails);\n contactDetails.append(contactNameDiv, contactNumberDiv);\n\n const avatarElem = new AvatarElement();\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: contact.user_id.toPeerId()\n });\n avatarElem.classList.add('contact-avatar', 'avatar-54');\n\n contactDiv.prepend(avatarElem);\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('contact-message');\n messageDiv.append(contactDiv);\n\n break;\n }\n\n case 'messageMediaPoll': {\n bubble.classList.remove('is-message-empty');\n\n const pollElement = wrapPoll(message);\n messageDiv.prepend(pollElement);\n messageDiv.classList.add('poll-message');\n\n break;\n }\n\n case 'messageMediaInvoice': {\n const isTest = messageMedia.pFlags.test;\n const extendedMedia = messageMedia.extended_media;\n const isAlreadyPaid = extendedMedia?._ === 'messageExtendedMedia';\n const isNotPaid = extendedMedia?._ === 'messageExtendedMediaPreview';\n let innerMedia = isAlreadyPaid ?\n (extendedMedia.media as MessageMedia.messageMediaPhoto).photo as Photo.photo ||\n (extendedMedia.media as MessageMedia.messageMediaDocument).document as Document.document :\n messageMedia.photo;\n\n const wrappedPrice = paymentsWrapCurrencyAmount(messageMedia.total_amount, messageMedia.currency);\n let priceEl: HTMLElement;\n if(!extendedMedia) {\n priceEl = document.createElement(innerMedia ? 'span' : 'div');\n const f = document.createDocumentFragment();\n const l = i18n(messageMedia.receipt_msg_id ? 'PaymentReceipt' : (isTest ? 'PaymentTestInvoice' : 'PaymentInvoice'));\n l.classList.add('text-uppercase');\n const joiner = ' ' + NBSP;\n const p = document.createElement('span');\n p.classList.add('text-bold');\n p.textContent = wrappedPrice + joiner;\n f.append(p, l);\n if(isTest && messageMedia.receipt_msg_id) {\n const a = document.createElement('span');\n a.classList.add('text-uppercase', 'pre-wrap');\n a.append(joiner + '(Test)');\n f.append(a);\n }\n setInnerHTML(priceEl, f);\n } else if(isNotPaid) {\n priceEl = document.createElement('span');\n priceEl.classList.add('extended-media-buy', 'tgico-premium_lock');\n attachmentDiv.classList.add('is-buy');\n _i18n(priceEl, 'Checkout.PayPrice', [wrappedPrice]);\n\n if(extendedMedia.video_duration !== undefined) {\n const videoTime = document.createElement('span');\n videoTime.classList.add('video-time');\n videoTime.textContent = toHHMMSS(extendedMedia.video_duration, false);\n attachmentDiv.append(videoTime);\n }\n }\n\n if(isNotPaid) {\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).w = extendedMedia.w;\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).h = extendedMedia.h;\n innerMedia = {\n _: 'photo',\n access_hash: '',\n pFlags: {},\n date: 0,\n dc_id: 0,\n file_reference: [],\n id: 0,\n sizes: [extendedMedia.thumb]\n };\n }\n\n if(innerMedia) {\n const mediaSize = extendedMedia ? mediaSizes.active.extendedInvoice : mediaSizes.active.invoice;\n if(innerMedia._ === 'document') {\n wrapVideo({\n doc: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n group: this.chat.animationGroup,\n message: message as Message.message\n });\n bubble.classList.add('video');\n } else {\n wrapPhoto({\n photo: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n message: isAlreadyPaid ? message : undefined\n });\n bubble.classList.add('photo');\n }\n\n if(priceEl) {\n if(!extendedMedia) {\n priceEl.classList.add('video-time');\n }\n\n attachmentDiv.append(priceEl);\n }\n } else {\n attachmentDiv = undefined;\n }\n\n if(isNotPaid) {\n const {mid} = message;\n this.extendedMediaMessages.add(mid);\n middleware.onClean(() => {\n this.extendedMediaMessages.delete(mid);\n });\n this.setExtendedMediaMessagesPollInterval();\n\n const {width, height} = attachmentDiv.style;\n const dotRenderer = DotRenderer.create({\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n attachmentDiv.append(dotRenderer.canvas);\n }\n\n let titleDiv: HTMLElement;\n if(!extendedMedia) {\n titleDiv = document.createElement('div');\n titleDiv.classList.add('bubble-primary-color');\n setInnerHTML(titleDiv, wrapEmojiText(messageMedia.title));\n }\n\n const richText = isAlreadyPaid ? undefined : wrapEmojiText(messageMedia.description);\n messageDiv.prepend(...[titleDiv, !innerMedia && priceEl, richText].filter(Boolean));\n\n if(!richText) canHaveTail = false;\n else bubble.classList.remove('is-message-empty');\n bubble.classList.add('is-invoice');\n\n break;\n }\n\n default:\n attachmentDiv = undefined;\n bubble.classList.remove('is-message-empty');\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\n this.log.warn('unrecognized media type:', messageMedia._, message);\n break;\n }\n\n if(!processingWebPage && attachmentDiv) {\n bubbleContainer.append(attachmentDiv);\n }\n\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\n bubble.classList.add('no-tail');\n\n if(!bubble.classList.contains('with-media-tail')) {\n bubble.classList.add('use-border-radius');\n }\n } */\n }\n\n if(isStandaloneMedia) {\n bubble.classList.add('just-media');\n }\n\n if(viewButton) {\n timeSpan.before(viewButton);\n // messageDiv.append(viewButton);\n }\n\n let savedFrom = '';\n\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\n const needName = (message.fromId !== rootScope.myId && this.chat.isAnyGroup) || message.viaBotId || (message as Message.message).pFlags.sponsored;\n if(needName || fwdFrom || message.reply_to_mid || topicNameButtonContainer) { // chat\n let title: HTMLElement | DocumentFragment;\n let titleVia: typeof title;\n\n const isForwardFromChannel = message.from_id?._ === 'peerChannel' && message.fromId === fwdFromId;\n\n const mustHaveName = !!(message.viaBotId/* || topicNameButtonContainer */);\n const isHidden = fwdFrom && !fwdFrom.from_id;\n if(message.viaBotId) {\n titleVia = document.createElement('span');\n titleVia.innerText = '@' + (await this.managers.appPeersManager.getPeerUsername(message.viaBotId));\n titleVia.classList.add('peer-title');\n }\n\n if(mustHaveName) {\n bubble.classList.add('must-have-name');\n }\n\n const isForward = fwdFromId || fwdFrom;\n if(isHidden) {\n // /////this.log('message to render hidden', message);\n title = document.createElement('span');\n setInnerHTML(title, wrapEmojiText(fwdFrom.from_name));\n title.classList.add('peer-title');\n // title = fwdFrom.from_name;\n bubble.classList.add('hidden-profile');\n } else {\n title = new PeerTitle({peerId: fwdFromId || message.fromId, withPremiumIcon: !isForward, wrapOptions}).element;\n }\n\n let replyContainer: HTMLElement;\n if(\n isMessage &&\n message.reply_to_mid &&\n message.reply_to_mid !== this.chat.threadId &&\n (!this.chat.isAllMessagesForum || message.reply_to.reply_to_top_id)\n ) {\n replyContainer = await MessageRender.setReply({\n chat: this.chat,\n bubble,\n bubbleContainer,\n message\n });\n }\n\n // this.log(title);\n\n let nameDiv: HTMLElement;\n if(isForward) {\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\n bubble.classList.add('forwarded');\n }\n\n if(message.savedFrom) {\n savedFrom = message.savedFrom;\n title.dataset.savedFrom = savedFrom;\n }\n\n nameDiv = document.createElement('div');\n title.dataset.peerId = '' + fwdFromId;\n\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\n nameDiv.style.color = getPeerColorById(fwdFromId, false);\n nameDiv.classList.add('colored-name');\n nameDiv.append(title);\n } else {\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\n const args: FormatterArguments = [title];\n if(isStandaloneMedia) {\n const br = document.createElement('br');\n br.classList.add('hide-ol');\n args.unshift(br);\n }\n nameDiv.append(i18n('ForwardedFrom', [args]));\n }\n } else if(!message.viaBotId) {\n if(!isStandaloneMedia && needName) {\n nameDiv = document.createElement('div');\n nameDiv.append(title);\n\n const peer = await this.managers.appPeersManager.getPeer(message.fromId);\n const pFlags = (peer as User.user)?.pFlags;\n if(pFlags && (pFlags.scam || pFlags.fake)) {\n nameDiv.append(generateFakeIcon(pFlags.scam));\n }\n\n if(!our) {\n nameDiv.style.color = getPeerColorById(message.fromId, false);\n nameDiv.classList.add('colored-name');\n }\n\n nameDiv.dataset.peerId = '' + message.fromId;\n } else /* if(!message.reply_to_mid) */ {\n bubble.classList.add('hide-name');\n }\n }\n\n if(message.viaBotId) {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n } else {\n nameDiv.append(' ');\n }\n\n const span = document.createElement('span');\n span.append(i18n('ViaBot'), ' ', titleVia);\n span.classList.add('is-via');\n\n nameDiv.append(span);\n }\n\n if(topicNameButtonContainer) {\n if(isStandaloneMedia) {\n topicNameButtonContainer.classList.add('floating-part');\n } else {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n }\n\n nameDiv.append(topicNameButtonContainer);\n\n bubble.classList.remove('hide-name');\n }\n }\n\n if(nameDiv) {\n nameDiv.classList.add('name');\n\n if(isStandaloneMedia) {\n nameContainer.append(nameContainer = document.createElement('div'));\n nameContainer.classList.add('name-with-reply', 'floating-part');\n } else {\n nameDiv.classList.add('floating-part');\n }\n\n nameContainer.append(nameDiv);\n\n if(isStandaloneMedia && replyContainer) {\n nameContainer.append(replyContainer);\n }\n } else if(isStandaloneMedia && replyContainer) {\n replyContainer.classList.add('floating-part');\n }\n\n if(topicNameButtonContainer && isStandaloneMedia) {\n if(!attachmentDiv) {\n this.log.error('no attachment div?', bubble, message);\n debugger;\n } else {\n attachmentDiv.after(topicNameButtonContainer);\n }\n }\n } else {\n bubble.classList.add('hide-name');\n }\n\n if(this.chat.type === 'pinned') {\n savedFrom = `${this.chat.peerId}_${message.mid}`;\n }\n\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\n if(isThreadStarter) {\n bubble.classList.add('is-thread-starter', 'is-group-last');\n }\n\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\n const goto = document.createElement('div');\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\n bubbleContainer.append(goto);\n bubble.dataset.savedFrom = savedFrom;\n bubble.classList.add('with-beside-button');\n }\n\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\n\n if(withReplies) {\n const isFooter = MessageRender.renderReplies({\n bubble,\n bubbleContainer,\n message: messageWithReplies,\n messageDiv,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n if(isFooter) {\n canHaveTail = true;\n } else {\n bubble.classList.add('with-beside-replies');\n }\n }\n\n if(isMessage) {\n this.appendReactionsElementToBubble(bubble, message, reactionsMessage);\n }\n\n /* if(isMessage) {\n const reactionHover = document.createElement('div');\n reactionHover.classList.add('bubble-reaction-hover');\n contentWrapper.append(reactionHover);\n } */\n\n if(canHaveTail) {\n bubble.classList.add('can-have-tail');\n\n bubbleContainer.append(generateTail());\n }\n\n return ret;\n }\n\n private appendReactionsElementToBubble(\n bubble: HTMLElement,\n message: Message.message,\n reactionsMessage: Message.message,\n changedResults?: ReactionCount[]\n ) {\n if(this.peerId.isUser() && USER_REACTIONS_INLINE/* || true */) {\n return;\n }\n\n if(!reactionsMessage?.reactions || !reactionsMessage.reactions.results.length) {\n return;\n }\n\n // message = this.appMessagesManager.getMessageWithReactions(message);\n\n const reactionsElement = new ReactionsElement();\n reactionsElement.init(reactionsMessage, 'block', bubble.middlewareHelper.get());\n reactionsElement.render(changedResults);\n\n if(bubble.classList.contains('is-message-empty')) {\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\n } else {\n const messageDiv = bubble.querySelector('.message');\n if(bubble.classList.contains('is-multiple-documents')) {\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\n let documentMessageDiv = documentContainer.querySelector('.document-message');\n\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\n if(!timeSpan) {\n timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n }\n\n reactionsElement.append(timeSpan);\n\n if(!documentMessageDiv) {\n documentMessageDiv = document.createElement('div');\n documentMessageDiv.classList.add('document-message');\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\n }\n\n documentMessageDiv.append(reactionsElement);\n } else {\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\n reactionsElement.append(timeSpan);\n\n messageDiv.append(reactionsElement);\n }\n }\n }\n\n private prepareToSaveScroll(reverse?: boolean) {\n const isMounted = !!this.chatInner.parentElement;\n if(!isMounted) {\n return {};\n }\n\n const log = this.log.bindPrefix('prepareToSaveScroll');\n log('save');\n const scrollSaver = this.createScrollSaver(reverse);\n scrollSaver.save(); // * let's save scroll position by point before the slicing, not after\n\n if(this.getRenderedLength() && !this.chat.setPeerPromise) {\n const viewportSlice = this.getViewportSlice();\n this.deleteViewportSlice(viewportSlice, true);\n }\n\n // scrollSaver.save(); // ! slicing will corrupt scroll position\n // const saved = scrollSaver.getSaved();\n // const hadScroll = saved.scrollHeight !== saved.clientHeight;\n\n return {\n restoreScroll: () => {\n log('restore');\n // scrollSaver.restore(_history.length === 1 && !reverse ? false : true);\n scrollSaver.restore(reverse);\n this.onRenderScrollSet(scrollSaver.getSaved());\n },\n scrollSaver\n };\n }\n\n public async performHistoryResult(\n historyResult: HistoryResult | {history: (Message.message | Message.messageService | number)[]},\n reverse: boolean\n ) {\n const log = false ? this.log.bindPrefix('perform-' + (Math.random() * 1000 | 0)) : undefined;\n log?.('start', this.chatInner.parentElement);\n\n let history = historyResult.history;\n history = history.slice(); // need\n\n if(this.needReflowScroll) {\n reflowScrollableElement(this.scrollable.container);\n this.needReflowScroll = false;\n }\n\n const cb = (message: Message.message | Message.messageService) => {\n if(!message) {\n return;\n } else if(message.pFlags.local) {\n return this.processLocalMessageRender(message);\n } else {\n return this.safeRenderMessage(message, reverse);\n }\n };\n\n const messages = await Promise.all(history.map((mid) => {\n return typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\n }));\n\n const setLoadedPromises: Promise[] = [];\n if(!this.scrollable.loadedAll['bottom'] || !this.scrollable.loadedAll['top']) {\n let isEnd = (historyResult as HistoryResult).isEnd;\n if(!isEnd) {\n const historyStorage = await this.chat.getHistoryStorage();\n const firstSlice = historyStorage.history.first;\n const lastSlice = historyStorage.history.last;\n isEnd = {top: false, bottom: false, both: false};\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\n isEnd.bottom = true;\n }\n\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\n isEnd.top = true;\n }\n }\n\n if(!isEnd.bottom && this.setPeerOptions) {\n const {lastMsgId, topMessage} = this.setPeerOptions;\n this.setPeerOptions = undefined;\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\n isEnd.bottom = true;\n }\n }\n\n if(isEnd.top) setLoadedPromises.push(this.setLoaded('top', true));\n if(isEnd.bottom) setLoadedPromises.push(this.setLoaded('bottom', true));\n }\n\n await Promise.all(setLoadedPromises);\n\n // ! it is important to insert bubbles to group reversed way\n // const length = history.length, promises: Promise[] = [];\n // if(reverse) for(let i = 0; i < length; ++i) promises.push(cb(messages[i]));\n // else for(let i = length - 1; i >= 0; --i) promises.push(cb(messages[i]));\n const promises = messages.map(cb);\n\n // cannot combine them into one promise\n await Promise.all(promises);\n await this.messagesQueuePromise;\n\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\n this.messagesQueueOnRenderAdditional();\n this.messagesQueueOnRenderAdditional?.(); // * can set it second time\n }\n\n log?.('performHistoryResult end');\n }\n\n private onRenderScrollSet(state?: {scrollHeight: number, clientHeight: number}) {\n const className = 'has-sticky-dates';\n if(!this.container.classList.contains(className)) {\n const isLoading = !this.preloader.detached;\n\n if(isLoading ||\n (\n state ??= {\n scrollHeight: this.scrollable.scrollHeight,\n clientHeight: this.scrollable.container.clientHeight\n },\n state.scrollHeight !== state.clientHeight\n )\n ) {\n /* for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n dateMessage.div.classList.add('is-sticky');\n } */\n\n const middleware = this.getMiddleware();\n const callback = () => {\n if(!middleware()) return;\n this.container.classList.add(className);\n };\n\n if(this.willScrollOnLoad) {\n callback();\n } else {\n setTimeout(callback, 600);\n }\n\n return;\n }\n }\n\n this.willScrollOnLoad = undefined;\n }\n\n public onDatePick = (timestamp: number) => {\n const peerId = this.peerId;\n this.managers.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then((history) => {\n if(!history?.messages?.length) {\n this.log.error('no history!');\n return;\n } else if(this.peerId !== peerId) {\n return;\n }\n\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\n // console.log('got history date:', history);\n });\n };\n\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\n // const middleware = this.getMiddleware();\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n return this.managers.acknowledged.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\n } else if(this.chat.type === 'pinned') {\n return this.managers.acknowledged.appMessagesManager.getSearch({\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId,\n limit: loadCount,\n backLimit\n }).then((ackedResult) => {\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((value) => {\n return {history: value.history.map((m) => m.mid)};\n })\n };\n });\n } else if(this.chat.type === 'scheduled') {\n return this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((ackedResult) => {\n // this.setLoaded('top', true);\n // this.setLoaded('bottom', true);\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((mids) => ({history: mids.slice().reverse()}))\n };\n });\n }\n }\n\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\n /* const middleware = this.getMiddleware();\n await this.ladderDeferred; */\n\n const log = this.log.bindPrefix('ladder');\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\n log.warn('will be delayed');\n // @ts-ignore\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n return;\n }\n\n /* if(!middleware()) {\n return;\n } */\n\n if(!Object.keys(this.bubbles).length) {\n log.warn('no bubbles');\n return;\n }\n\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\n\n if(isAdditionRender && additionMsgIds.length) {\n sortedMids = sortedMids.filter((mid) => !additionMsgIds.includes(mid));\n }\n\n let targetMid: number;\n if(backLimit) {\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\n } else {\n if(additionMsgId) {\n targetMid = additionMsgId;\n } else { // * if maxId === 0\n targetMid = Math.max(...sortedMids);\n }\n }\n\n const topIds = sortedMids.slice(sortedMids.findIndex((mid) => targetMid > mid));\n const middleIds = isAdditionRender ? [] : [targetMid];\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex((mid) => targetMid >= mid)).reverse();\n\n if(DEBUG) {\n log('targeting mid:', targetMid, maxId, additionMsgId,\n topIds.map((m) => getServerMessageId(m)),\n bottomIds.map((m) => getServerMessageId(m)));\n }\n\n const setBubbles: HTMLElement[] = [];\n\n this.chatInner.classList.add('zoom-fading');\n const delay = isAdditionRender ? 10 : 40;\n const offsetIndex = isAdditionRender ? 0 : 1;\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\n const animationPromise = deferredPromise();\n let lastMsDelay = 0;\n mids.forEach((mid, idx) => {\n const bubble = this.bubbles[mid];\n if(!bubble || this.skippedMids.has(mid)) {\n log.warn('no bubble by mid:', mid);\n return;\n }\n\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\n // lastMsDelay = (idx + offsetIndex) * delay;\n // lastMsDelay = (idx || 0.1) * 1000;\n\n const contentWrapper = bubble.lastElementChild as HTMLElement;\n const elementsToAnimate: HTMLElement[] = [contentWrapper];\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.avatar && item.group.lastItem === item) {\n elementsToAnimate.push(item.group.avatar);\n }\n\n elementsToAnimate.forEach((element) => {\n element.classList.add('zoom-fade', 'can-zoom-fade');\n element.style.transitionDelay = lastMsDelay + 'ms';\n });\n\n if(idx === (mids.length - 1)) {\n const onTransitionEnd = (e: TransitionEvent) => {\n if(e.target !== contentWrapper) {\n return;\n }\n\n animationPromise.resolve();\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\n };\n\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\n }\n\n setBubbles.push(...elementsToAnimate);\n });\n\n if(!mids.length) {\n animationPromise.resolve();\n }\n\n return {lastMsDelay, animationPromise};\n };\n\n const topRes = animateAsLadder(topIds, offsetIndex);\n const middleRes = animateAsLadder(middleIds);\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\n\n if(this.onAnimateLadder) {\n await this.onAnimateLadder();\n }\n\n fastRaf(() => {\n this.setStickyDateManually(); // ! maybe it's not efficient\n\n setBubbles.forEach((element) => {\n element.classList.remove('zoom-fade');\n });\n });\n\n let promise: Promise;\n if(topIds.length || middleIds.length || bottomIds.length) {\n promise = Promise.all(promises);\n\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\n .then(() => {\n fastRaf(() => {\n setBubbles.forEach((element) => {\n element.style.transitionDelay = '';\n element.classList.remove('can-zoom-fade');\n });\n\n this.chatInner.classList.remove('zoom-fading');\n });\n\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх,\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\n // if(!IS_SAFARI) {\n // this.needReflowScroll = true;\n // }\n });\n }\n\n return promise;\n }\n\n private async renderEmptyPlaceholder(\n type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted',\n bubble: HTMLElement,\n message: any,\n elements: (Node | string)[]\n ) {\n const BASE_CLASS = 'empty-bubble-placeholder';\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\n\n let title: HTMLElement;\n if(type === 'group') title = i18n('GroupEmptyTitle1');\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\n else if(type === 'restricted') {\n title = document.createElement('span');\n title.innerText = await this.managers.appPeersManager.getRestrictionReasonText(this.peerId);\n }\n title.classList.add('center', BASE_CLASS + '-title');\n\n elements.push(title);\n\n let listElements: HTMLElement[];\n if(type === 'group') {\n elements.push(i18n('GroupEmptyTitle2'));\n listElements = [\n i18n('GroupDescription1'),\n i18n('GroupDescription2'),\n i18n('GroupDescription3'),\n i18n('GroupDescription4')\n ];\n } else if(type === 'saved') {\n listElements = [\n i18n('ChatYourSelfDescription1'),\n i18n('ChatYourSelfDescription2'),\n i18n('ChatYourSelfDescription3'),\n i18n('ChatYourSelfDescription4')\n ];\n } else if(type === 'greeting') {\n const subtitle = i18n('NoMessagesGreetingsDescription');\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\n\n // findAndSplice(this.messagesQueue, q => q.bubble === bubble);\n\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\n\n const middleware = this.getMiddleware();\n\n await this.managers.appStickersManager.getGreetingSticker().then(async(doc) => {\n if(!middleware()) return;\n\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\n div: stickerDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n withThumb: true,\n loadPromises\n });\n\n attachClickEvent(stickerDiv, (e) => {\n cancelEvent(e);\n EmoticonsDropdown.onMediaClick({target: e.target});\n });\n\n return Promise.all(loadPromises);\n });\n\n // this.renderMessagesQueue({\n // message,\n // bubble,\n // reverse: false,\n // promises: [loadPromise]\n // });\n\n elements.push(subtitle, stickerDiv);\n }\n\n if(listElements) {\n elements.push(\n ...listElements.map((elem) => {\n const span = document.createElement('span');\n span.classList.add(BASE_CLASS + '-list-item');\n span.append(elem);\n return span;\n })\n );\n\n if(type === 'group') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add('tgico-check');\n elem.prepend(i);\n });\n } else if(type === 'saved') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add(BASE_CLASS + '-list-bullet');\n i.innerText = '•';\n elem.prepend(i);\n });\n }\n }\n\n if(elements.length > 1) {\n bubble.classList.add('has-description');\n }\n\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\n }\n\n private async processLocalMessageRender(\n message: Message.message | Message.messageService,\n animate?: boolean,\n middleware = this.getMiddleware()\n ) {\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const m = middlewarePromise(middleware);\n\n const p: Parameters[4] = async(result) => {\n const {bubble} = await m(result);\n if(!bubble) {\n return result;\n }\n\n (bubble as any).message = message;\n\n bubble.classList.add('is-group-last', 'is-group-first');\n\n const updatePosition = () => {\n if(this.updatePlaceholderPosition === updatePosition) {\n this.updatePlaceholderPosition = undefined;\n }\n\n appendTo[method](bubble);\n };\n\n if(!isSponsored) {\n bubble.classList.add('bubble-first');\n bubble.classList.remove('can-have-tail', 'is-in');\n }\n\n const elements: (Node | string)[] = [];\n const isBot = this.chat.isBot;\n let renderPromise: Promise, appendTo = this.container, method: 'append' | 'prepend' = 'append';\n if(this.chat.isRestricted) {\n renderPromise = this.renderEmptyPlaceholder('restricted', bubble, message, elements);\n } else if(isSponsored) {\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\n\n bubble.classList.add('avoid-selection');\n bubble.style.order = '999999';\n\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\n const peerId = getPeerId(sponsoredMessage.from_id);\n // const peer = this.appPeersManager.getPeer(peerId);\n if(sponsoredMessage.channel_post) {\n text = 'OpenChannelPost';\n mid = generateMessageId(sponsoredMessage.channel_post);\n } else if(sponsoredMessage.start_param || isBot) {\n text = 'Chat.Message.ViewBot';\n startParam = sponsoredMessage.start_param;\n } else {\n text = await this.managers.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\n }\n\n if(sponsoredMessage.chat_invite) {\n callback = () => {\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite);\n };\n } else if(sponsoredMessage.chat_invite_hash) {\n callback = () => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: sponsoredMessage.chat_invite_hash\n };\n\n this.chat.appImManager.processInternalLink(link);\n };\n } else {\n callback = () => {\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n startParam\n });\n };\n }\n\n const button = this.makeViewButton({text});\n\n this.observer.observe(button, this.viewsObserverCallback);\n\n if(callback) {\n attachClickEvent(button, callback);\n }\n\n bubble.querySelector('.bubble-content').prepend(button);\n\n appendTo = this.chatInner;\n method = 'append';\n animate = false;\n\n // return result;\n } else if(isBot && message._ === 'message') {\n const b = document.createElement('b');\n b.append(i18n('BotInfoTitle'));\n elements.push(b, '\\n\\n');\n appendTo = this.chatInner;\n method = 'prepend';\n } else if(this.chat.isAnyGroup && ((await m(this.managers.appPeersManager.getPeer(this.peerId))) as MTChat.chat).pFlags.creator) {\n renderPromise = this.renderEmptyPlaceholder('group', bubble, message, elements);\n } else if(this.chat.type === 'scheduled') {\n renderPromise = this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\n } else if(rootScope.myId === this.peerId) {\n renderPromise = this.renderEmptyPlaceholder('saved', bubble, message, elements);\n } else if(this.peerId.isUser() && !isBot && await m(this.chat.canSend()) && this.chat.type === 'chat') {\n renderPromise = this.renderEmptyPlaceholder('greeting', bubble, message, elements);\n } else {\n renderPromise = this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\n }\n\n if(renderPromise) {\n await renderPromise;\n }\n\n if(elements.length) {\n const messageDiv = bubble.querySelector('.message, .service-msg');\n messageDiv.prepend(...elements);\n }\n\n const isWaitingForAnimation = !!this.messagesQueueOnRenderAdditional;\n const noTransition = this.setPeerCached && !isWaitingForAnimation;\n if(noTransition) {\n const setOn = bubble.firstElementChild;\n setOn.classList.add('no-transition');\n\n if(this.chat.setPeerPromise) {\n this.chat.setPeerPromise.catch(noop).finally(() => {\n setOn.classList.remove('no-transition');\n });\n }\n }\n\n if(animate === undefined && !noTransition) {\n animate = true;\n }\n\n if(isWaitingForAnimation || animate) {\n this.updatePlaceholderPosition = updatePosition;\n\n this.onAnimateLadder = () => {\n // appendTo[method](bubble);\n this.onAnimateLadder = undefined;\n\n // need raf here because animation won't fire if this message is single\n if(!this.messagesQueuePromise) {\n return fastRafPromise();\n }\n };\n } else if(this.chat.setPeerPromise) {\n this.attachPlaceholderOnRender = () => {\n this.attachPlaceholderOnRender = undefined;\n updatePosition();\n // appendTo[method](bubble);\n };\n } else {\n this.updatePlaceholderPosition = updatePosition;\n // appendTo[method](bubble);\n }\n\n if(!isWaitingForAnimation && animate) {\n await m(getHeavyAnimationPromise());\n const additionMsgIds = getObjectKeysAndSort(this.bubbles);\n indexOfAndSplice(additionMsgIds, message.mid);\n this.animateAsLadder(message.mid, additionMsgIds, false, 0, 0);\n }\n\n bubble.middlewareHelper.onDestroy(() => {\n if(this.emptyPlaceholderBubble === bubble) {\n this.emptyPlaceholderBubble = undefined;\n }\n });\n\n this.emptyPlaceholderBubble = bubble;\n\n return result;\n };\n\n return this.safeRenderMessage(\n message,\n !isSponsored,\n undefined,\n false,\n p\n );\n }\n\n private makeViewButton[1]>(options: T) {\n return Button('btn-primary btn-primary-transparent bubble-view-button', options);\n }\n\n private generateLocalMessageId(addOffset = 0) {\n // const INCREMENT = 0x10;\n const offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\n // offset = generateMessageId(offset);\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\n const id = -Math.abs(offset);\n const mid = -Math.abs(generateMessageId(id));\n return {id, mid};\n }\n\n private async generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): Promise> {\n const {id, mid} = this.generateLocalMessageId(addOffset);\n let message: Omit & {message?: string} = {\n _: service ? 'messageService' : 'message',\n date: 0,\n id,\n mid,\n peer_id: await this.managers.appPeersManager.getOutputPeer(this.peerId),\n pFlags: {\n local: true\n }\n };\n\n if(!service) {\n message.message = '';\n }/* else {\n (message as Message.messageService).action = {} as any;\n } */\n\n assumeType>(message);\n\n fill && fill(message);\n\n const savedMessages = await this.managers.appMessagesManager.saveMessages([message], {storage: new Map() as any});\n message = savedMessages[0];\n message.mid = mid;\n return message as any;\n }\n\n public getViewportSlice() {\n // this.log.trace('viewport slice');\n return getViewportSlice({\n overflowElement: this.scrollable.container,\n selector: '.bubbles-date-group .bubble:not(.is-date)',\n extraSize: Math.max(700, windowSize.height) * 2\n });\n }\n\n public deleteViewportSlice(slice: ReturnType, ignoreScrollSaving?: boolean) {\n if(DO_NOT_SLICE_VIEWPORT_ON_RENDER) {\n return;\n }\n\n const {invisibleTop, invisibleBottom} = slice;\n const invisible = invisibleTop.concat(invisibleBottom);\n if(!invisible.length) {\n return;\n }\n\n if(invisibleTop.length) {\n this.setLoaded('top', false);\n this.getHistoryTopPromise = undefined;\n }\n\n if(invisibleBottom.length) {\n this.setLoaded('bottom', false);\n this.getHistoryBottomPromise = undefined;\n }\n\n const mids = invisible.map(({element}) => +element.dataset.mid);\n\n let scrollSaver: ScrollSaver;\n if(/* !!invisibleTop.length !== !!invisibleBottom.length && */!ignoreScrollSaving) {\n scrollSaver = this.createScrollSaver(!!invisibleTop.length);\n scrollSaver.save();\n }\n\n this.deleteMessagesByIds(mids, false, true);\n\n if(scrollSaver) {\n scrollSaver.restore();\n } else if(invisibleTop.length) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n }\n\n public sliceViewport(ignoreHeavyAnimation?: boolean) {\n // Safari cannot reset the scroll.\n if(IS_SAFARI || (this.isHeavyAnimationInProgress && !ignoreHeavyAnimation) || DO_NOT_SLICE_VIEWPORT) {\n return;\n }\n\n // const scrollSaver = new ScrollSaver(this.scrollable, true);\n // scrollSaver.save();\n const slice = this.getViewportSlice();\n // if(IS_SAFARI) slice.invisibleTop = [];\n this.deleteViewportSlice(slice);\n // scrollSaver.restore();\n }\n\n private async setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\n const willChange = this.scrollable.loadedAll[side] !== value;\n if(!willChange) {\n return;\n }\n\n const log = this.log.bindPrefix('setLoaded');\n log('change', side, value);\n\n this.scrollable.loadedAll[side] = value;\n this.scrollable.onScroll(); // ! WARNING\n // return;\n\n if(!checkPlaceholders) {\n return;\n }\n\n if(!this.chat.isRestricted) {\n if(side === 'bottom' && this.chat.isBroadcast/* && false */) {\n this.toggleSponsoredMessage(value);\n }\n\n if(side === 'top' && value && this.chat.isBot) {\n return this.renderBotPlaceholder();\n }\n }\n\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n private async toggleSponsoredMessage(value: boolean) {\n const log = this.log.bindPrefix('sponsored');\n log('checking');\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\n if(value) {\n const middleware = this.getMiddleware(() => {\n return this.scrollable.loadedAll.bottom && this.getSponsoredMessagePromise === promise;\n });\n\n const promise = this.getSponsoredMessagePromise = this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId())\n .then(async(sponsoredMessages) => {\n if(!middleware() || sponsoredMessages._ === 'messages.sponsoredMessagesEmpty') {\n return;\n }\n\n const sponsoredMessage = sponsoredMessages.messages[0];\n if(!sponsoredMessage) {\n log('no message');\n return;\n }\n\n const messagePromise = this.generateLocalFirstMessage(false, (message) => {\n message.message = sponsoredMessage.message;\n message.from_id = sponsoredMessage.from_id;\n message.entities = sponsoredMessage.entities;\n message.pFlags.sponsored = true;\n message.sponsoredMessage = sponsoredMessage;\n }, SPONSORED_MESSAGE_ID_OFFSET);\n\n return Promise.all([\n messagePromise,\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\n this.messagesQueuePromise\n ]).then(([message]) => {\n if(!middleware()) return;\n // this.processLocalMessageRender(message);\n log('rendering', message);\n return this.performHistoryResult({history: [message]}, false);\n });\n }).finally(() => {\n if(this.getSponsoredMessagePromise === promise) {\n this.getSponsoredMessagePromise = undefined;\n }\n });\n } else {\n log('clearing rendered', mid);\n this.getSponsoredMessagePromise = undefined;\n this.deleteMessagesByIds([mid]);\n }\n }\n\n private async renderBotPlaceholder() {\n const _log = this.log.bindPrefix('bot placeholder');\n\n const middleware = this.getMiddleware();\n const result = await this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());\n _log('getting profile, cached:', result.cached);\n const processPromise = result.result.then(async(userFull) => {\n if(!middleware()) {\n return;\n }\n\n if(!userFull.bot_info?.description) {\n _log.warn('no description');\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n const message = await this.generateLocalFirstMessage(false, (message) => {\n const botInfo = userFull.bot_info;\n message.message = botInfo.description;\n if(botInfo.description_document) message.media = {_: 'messageMediaDocument', document: botInfo.description_document};\n if(botInfo.description_photo) message.media = {_: 'messageMediaPhoto', photo: botInfo.description_photo};\n });\n\n if(!middleware()) {\n return;\n }\n\n _log('rendering');\n const renderPromise = this.processLocalMessageRender(message, !result.cached).then(() => {\n _log('done');\n });\n\n return {renderPromise};\n });\n\n if(!result.cached) {\n return;\n }\n\n return processPromise;\n }\n\n public async checkIfEmptyPlaceholderNeeded() {\n if(this.scrollable.loadedAll.top &&\n this.scrollable.loadedAll.bottom &&\n this.emptyPlaceholderBubble === undefined &&\n (\n this.chat.isRestricted ||\n !(await this.chat.getHistoryStorage()).count ||\n (\n // !Object.keys(this.bubbles).length ||\n // ! WARNING ! ! ! ! ! ! REPLACE LINE ABOVE WITH THESE\n Object.keys(this.bubbles).length &&\n !this.getRenderedLength()\n ) ||\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\n )\n ) {\n this.log('inject empty peer placeholder');\n\n const message = await this.generateLocalFirstMessage(true);\n return {renderPromise: this.processLocalMessageRender(message)};\n }\n }\n\n public getHistory1(maxId?: number, reverse?: boolean, isBackLimit?: boolean, additionMsgId?: number, justLoad?: boolean) {\n const middleware = this.getMiddleware(justLoad ? undefined : () => {\n return (reverse ? this.getHistoryTopPromise : this.getHistoryBottomPromise) === waitPromise;\n });\n\n const result = this.getHistory(maxId, reverse, isBackLimit, additionMsgId, justLoad, middleware);\n const waitPromise = result.then((res) => res && (res.waitPromise || res.promise));\n\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\n waitPromise.then(() => {\n if(!middleware()) {\n return;\n }\n\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\n\n if(!justLoad) {\n // preload more\n // if(!isFirstMessageRender) {\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\n setTimeout(() => {\n if(reverse) {\n this.loadMoreHistory(true, true);\n } else {\n this.loadMoreHistory(false, true);\n }\n }, 0);\n // }\n }\n // }\n\n // this.scrollable.onScroll();\n }\n });\n\n return result;\n }\n\n /**\n * Load and render history\n * @param maxId max message id\n * @param reverse 'true' means up\n * @param isBackLimit is search\n * @param additionMsgId for the last message\n * @param justLoad do not render\n */\n public async getHistory(\n maxId = 0,\n reverse = false,\n isBackLimit = false,\n additionMsgId = 0,\n justLoad = false,\n middleware?: () => boolean\n ): Promise<{cached: boolean, promise: Promise, waitPromise: Promise}> {\n const peerId = this.peerId;\n\n const isBroadcast = this.chat.isBroadcast;\n // console.time('appImManager call getHistory');\n const pageCount = Math.min(30, windowSize.height / 40/* * 1.25 */ | 0);\n // const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\n // const realLoadCount = pageCount;//const realLoadCount = 50;\n let loadCount = realLoadCount;\n\n /* if(TEST_SCROLL) {\n //loadCount = 1;\n if(Object.keys(this.bubbles).length > 0)\n return {cached: false, promise: Promise.resolve(true)};\n } */\n if(TEST_SCROLL !== undefined) {\n if(TEST_SCROLL) {\n if(Object.keys(this.bubbles).length > 0) {\n --TEST_SCROLL;\n }\n } else {\n return {cached: false, promise: Promise.resolve(), waitPromise: Promise.resolve()};\n }\n }\n\n // //console.time('render history total');\n\n let backLimit = 0;\n if(isBackLimit) {\n backLimit = loadCount;\n\n if(!reverse) { // if not jump\n loadCount = 0;\n // maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\n }\n }\n\n let additionMsgIds: number[];\n if(additionMsgId && !isBackLimit) {\n if(this.chat.type === 'pinned') {\n additionMsgIds = [additionMsgId];\n } else {\n const historyStorage = await this.chat.getHistoryStorage();\n const slice = historyStorage.history.slice;\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\n additionMsgIds = slice.slice();\n\n // * filter last album, because we don't know is it the last item\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\n const message = await this.chat.getMessage(additionMsgIds[i]);\n if((message as Message.message)?.grouped_id) additionMsgIds.splice(i, 1);\n else break;\n }\n\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\n }\n }\n }\n\n /* const result = additionMsgID ?\n {history: [additionMsgID]} :\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\n let result: AckedResult = await this.requestHistory(maxId, loadCount, backLimit) as any;\n let resultPromise: typeof result['result'];\n\n this.log('i vin brehnya', result, maxId, loadCount, backLimit);\n\n // const isFirstMessageRender = !!additionMsgID && result.cached && !appMessagesManager.getMessage(additionMsgID).grouped_id;\n const isAdditionRender = additionMsgIds?.length && !result.cached;\n const isFirstMessageRender = (this.isFirstLoad && backLimit && !result.cached) || isAdditionRender;\n if(isAdditionRender) {\n resultPromise = result.result;\n\n result = {\n cached: true,\n result: Promise.resolve({history: additionMsgIds})\n };\n\n // additionMsgID = 0;\n }\n\n this.isFirstLoad = false;\n\n const processResult = async(historyResult: Awaited) => {\n if((historyResult as HistoryResult).isEnd?.top) {\n if(this.chat.type === 'discussion') { // * inject discussion start\n const serviceStartMessageId = await this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId, this.chat.threadId);\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\n const mids = await this.chat.getMidsByMid(this.chat.threadId);\n historyResult.history.push(...mids.reverse());\n }\n\n // synchronize bot placeholder appearance\n await this.managers.appProfileManager.getProfileByPeerId(peerId);\n\n // await this.setLoaded('top', true);\n }\n };\n\n const sup = (historyResult: Awaited) => {\n return getHeavyAnimationPromise().then(() => {\n return processResult(historyResult);\n }).then(() => {\n if(!isAdditionRender && additionMsgId) {\n historyResult.history.unshift(additionMsgId);\n }\n\n return this.performHistoryResult(historyResult, reverse);\n });\n };\n\n const processPromise = (_promise: typeof result['result']) => {\n const promise = Promise.resolve(_promise).then((result) => {\n if(middleware && !middleware()) {\n throw PEER_CHANGED_ERROR;\n }\n\n if(justLoad) {\n // нужно делать из-за ранней прогрузки\n this.scrollable.onScroll();\n // fastRaf(() => {\n // this.scrollable.checkForTriggers();\n // });\n return;\n }\n\n return sup(result);\n }, (err) => {\n this.log.error('getHistory error:', err);\n throw err;\n });\n\n return promise;\n };\n\n let promise: Promise, cached: boolean;\n if(!result.cached) {\n cached = false;\n promise = processPromise(result.result);\n } else if(justLoad) {\n // нужно делать из-за ранней прогрузки\n this.scrollable.onScroll();\n return null;\n } else {\n cached = true;\n promise = sup(await result.result);\n }\n\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\n\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\n let times = isAdditionRender ? 2 : 1;\n this.messagesQueueOnRenderAdditional = () => {\n this.log('messagesQueueOnRenderAdditional');\n\n if(--times) return;\n\n this.messagesQueueOnRenderAdditional = undefined;\n\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n promise.then(() => {\n setTimeout(() => { // preload messages\n this.loadMoreHistory(reverse, true);\n }, 0);\n });\n };\n } else {\n this.messagesQueueOnRenderAdditional = undefined;\n }\n\n if(justLoad) {\n return null;\n }\n\n return {cached, promise, waitPromise};\n }\n\n public async setUnreadDelimiter() {\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n return;\n }\n\n if(this.attachedUnreadBubble) {\n return;\n }\n\n const historyMaxId = await this.chat.getHistoryMaxId();\n let readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\n if(!readMaxId) return;\n\n readMaxId = Object.keys(this.bubbles)\n .filter((mid) => !this.bubbles[mid].classList.contains('is-out'))\n .map((i) => +i)\n .sort((a, b) => a - b)\n .find((i) => i > readMaxId);\n\n if(readMaxId && this.bubbles[readMaxId]) {\n const bubble = this.bubbles[readMaxId];\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\n this.firstUnreadBubble.classList.remove('is-first-unread');\n this.firstUnreadBubble = null;\n }\n\n if(readMaxId !== historyMaxId) {\n bubble.classList.add('is-first-unread');\n }\n\n this.firstUnreadBubble = bubble;\n this.attachedUnreadBubble = true;\n }\n }\n\n public deleteEmptyDateGroups() {\n const mustBeCount = this.stickyIntersector ? STICKY_OFFSET : 1;\n let deleted = false;\n for(const i in this.dateMessages) {\n const dateMessage = this.dateMessages[i];\n\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\n dateMessage.container.remove();\n if(this.stickyIntersector) {\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\n }\n delete this.dateMessages[i];\n deleted = true;\n\n // * no sense in it\n /* if(dateMessage.div === this.previousStickyDate) {\n this.previousStickyDate = undefined;\n } */\n }\n }\n\n if(!deleted) {\n return;\n }\n\n if(!Object.keys(this.dateMessages).length) {\n this.container.classList.remove('has-groups');\n }\n\n this.checkIfEmptyPlaceholderNeeded();\n this.setStickyDateManually();\n }\n}\n\nexport function generateTail() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\n svg.setAttributeNS(null, 'width', '11');\n svg.setAttributeNS(null, 'height', '20');\n svg.classList.add('bubble-tail');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#message-tail-filled');\n\n svg.append(use);\n\n return svg;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {copyTextToClipboard} from '../clipboard';\n// import SelectionSaver from \"../selectionSaver\";\n// import selectElementContents from \"./selectElementContents\";\n\nexport default function copyFromElement(element: HTMLElement) {\n copyTextToClipboard(element.textContent);\n // const saver = new SelectionSaver();\n // saver.save();\n // selectElementContents(element);\n // document.execCommand('copy');\n // saver.restore();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport {Message} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapDocument from './document';\n\nexport default async function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch, sizeType, managers, fontWeight, fontSize, richTextFragment}: {\n albumMustBeRenderedFull: boolean,\n message: any,\n messageDiv: HTMLElement,\n bubble: HTMLElement,\n uploading?: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n searchContext?: MediaSearchContext,\n useSearch?: boolean,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n fontWeight?: number,\n fontSize?: number,\n richTextFragment?: DocumentFragment\n}) {\n let nameContainer: HTMLElement;\n const mids = albumMustBeRenderedFull ? await chat.getMidsByMid(message.mid) : [message.mid];\n /* if(isPending) {\n mids.reverse();\n } */\n\n const promises = mids.map(async(mid, idx) => {\n const message = (await chat.getMessage(mid)) as Message.message;\n const div = await wrapDocument({\n message,\n loadPromises,\n autoDownloadSize,\n lazyLoadQueue,\n searchContext,\n sizeType,\n managers,\n fontWeight,\n fontSize\n });\n\n const container = document.createElement('div');\n container.classList.add('document-container');\n container.dataset.mid = '' + mid;\n container.dataset.peerId = '' + message.peerId;\n\n const wrapper = document.createElement('div');\n wrapper.classList.add('document-wrapper');\n\n if(message.message) {\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('document-message');\n\n setInnerHTML(messageDiv, richTextFragment);\n wrapper.append(messageDiv);\n }\n\n if(mids.length > 1) {\n const selection = document.createElement('div');\n selection.classList.add('document-selection');\n container.append(selection);\n\n container.classList.add('grouped-item');\n\n if(idx === 0) {\n nameContainer = wrapper;\n }\n }\n\n wrapper.append(div);\n container.append(wrapper);\n return container;\n });\n\n const containers = await Promise.all(promises);\n messageDiv.append(...containers);\n\n if(mids.length > 1) {\n bubble.classList.add('is-multiple-documents', 'is-grouped');\n }\n\n return nameContainer;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport PollElement from '../poll';\n\nexport default function wrapPoll(message: any, managers: AppManagers = rootScope.managers) {\n const elem = new PollElement();\n elem.message = message;\n elem.managers = managers;\n elem.setAttribute('peer-id', '' + message.peerId);\n elem.setAttribute('poll-id', message.media.poll.id);\n elem.setAttribute('message-id', '' + message.mid);\n elem.render();\n return elem;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport rootScope from '../../lib/rootScope';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupPinMessage {\n constructor(private peerId: PeerId, private mid: number, private unpin?: true, private onConfirm?: () => void) {\n this.construct();\n }\n\n private async construct() {\n const {peerId, mid, unpin, onConfirm} = this;\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments;\n const buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const managers = PopupElement.MANAGERS;\n\n const canUnpin = await managers.appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = managers.appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = managers.appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = managers.appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + ((await managers.appMessagesManager.getPinnedMessagesCount(peerId)) || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n\n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n\n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(await managers.appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n\n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [await wrapPeerTitle({peerId})],\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","/*\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 isSelectionEmpty(selection = window.getSelection()) {\n if(!selection?.rangeCount) {\n return true;\n }\n\n const selectionRange = selection.getRangeAt(0);\n if(selectionRange.collapsed || !selectionRange.START_TO_END) {\n return true;\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport rootScope from '../lib/rootScope';\nimport {getEmojiToneIndex} from '../vendor/emoji';\nimport mediaSizes from './mediaSizes';\nimport {saveLottiePreview} from './saveLottiePreview';\n\nexport default function preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n return rootScope.managers.appStickersManager.preloadAnimatedEmojiSticker(emoji).then(({doc}) => {\n if(!doc) {\n return;\n }\n\n return appDownloadManager.downloadMedia({media: doc})\n .then(async(blob) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: blob,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false,\n toneIndex\n }, 'none');\n\n animation.addEventListener('firstFrame', () => {\n saveLottiePreview(doc, animation.canvas[0], toneIndex);\n animation.remove();\n }, {once: true});\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ReportReason} from '../../layer';\nimport InputField from '../inputField';\nimport {toastNew} from '../toast';\nimport wrapStickerEmoji from '../wrappers/stickerEmoji';\nimport PopupPeer from './peer';\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true,\n descriptionLangKey: 'ReportInfo',\n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n this.managers.appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then((bool) => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }],\n body: true\n });\n\n const div = document.createElement('div');\n const size = 100;\n wrapStickerEmoji({\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size\n }).then(({render}) => render).finally(() => {\n this.show();\n });\n\n this.header.append(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport whichChild from '../../helpers/dom/whichChild';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {ReportReason} from '../../layer';\nimport {LangPackKey} from '../../lib/langPack';\nimport Button from '../button';\nimport PopupPeer from './peer';\nimport PopupReportMessagesConfirm from './reportMessagesConfirm';\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther'],\n ['ReportChatPersonalDetails', 'inputReportReasonPersonalDetails'],\n ['ReportChatIllegalDrugs', 'inputReportReasonIllegalDrugs']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach((b) => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n\n // this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, {i18n} from '../../lib/langPack';\nimport 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 scrollable: true\n });\n\n this.scrollable.append(this.description);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport {Message, Reaction} from '../../layer';\nimport ReactionsElement from '../chat/reactions';\nimport {horizontalMenu} from '../horizontalMenu';\nimport Scrollable from '../scrollable';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport appDialogsManager from '../../lib/appManagers/appDialogsManager';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapSticker from '../wrappers/sticker';\nimport ReactionElement from '../chat/reaction';\nimport getUserStatusString from '../wrappers/getUserStatusString';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport SettingSection from '../settingSection';\n\nexport default class PopupReactedList extends PopupElement {\n constructor(\n private message: Message.message\n ) {\n super('popup-reacted-list', {closable: true, overlayClosable: true, body: true});\n\n this.init();\n }\n\n private async init() {\n const middleware = this.middlewareHelper.get();\n const message = await this.managers.appMessagesManager.getGroupsFirstMessage(this.message);\n if(!middleware()) return;\n const canViewReadParticipants = await this.managers.appMessagesManager.canViewMessageReadParticipants(message);\n if(!middleware()) return;\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 chosen_order: undefined,\n pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block', this.middlewareHelper.get());\n reactionsElement.render();\n reactionsElement.classList.add('no-stripe');\n reactionsElement.classList.remove('has-no-reactions');\n\n reactionsElement.append(this.btnClose);\n\n this.header.append(reactionsElement);\n\n const tabsContainer = document.createElement('div');\n tabsContainer.classList.add('tabs-container');\n tabsContainer.dataset.animation = 'tabs';\n\n const loaders: Map = new Map();\n\n let hasAllReactions = false;\n if(newMessage.reactions.results.length) {\n const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0));\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasAllReactions = true;\n }\n\n let hasReadParticipants = false;\n if(canViewReadParticipants) {\n try {\n const readUserIds = await this.managers.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid);\n if(!middleware()) return;\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 as any) !== 'checks';\n const skipReactionsList = (reactionCount.reaction as any) === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction as any)) {\n reactionCount.reaction = undefined;\n }\n\n const size = 24;\n const mediaSize = makeMediaSize(size, size);\n\n let nextOffset: string;\n const loader = new ScrollableLoader({\n scrollable,\n getPromise: async() => {\n const result = await this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList);\n nextOffset = result.nextOffset;\n\n await Promise.all(result.combined.map(async({peerId, reaction}) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n autonomous: true,\n container: chatlist,\n avatarSize: 'abitbigger',\n rippleEnabled: false,\n meAsSaved: false\n });\n\n if(reaction) {\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add('reacted-list-reaction-icon');\n\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = await this.managers.appReactionsManager.getReactionCached(reaction.emoticon);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24,\n middleware\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n stickerContainer.append(wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: mediaSize,\n middleware\n }));\n }\n\n dom.listEl.append(stickerContainer);\n }\n\n replaceContent(dom.lastMessageSpan, getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())));\n }));\n\n return !nextOffset;\n }\n });\n\n loaders.set(scrollable.container, loader);\n\n tabsContainer.append(scrollable.container);\n });\n\n this.body.append(tabsContainer);\n\n const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => {\n if(id === (reactionsElement.childElementCount - 1)) {\n return false;\n }\n\n const reaction = reactionsElement.children[id] as ReactionElement;\n const prevId = selectTab.prevId();\n if(prevId !== -1) {\n (reactionsElement.children[prevId] as ReactionElement).setIsChosen(false);\n }\n\n reaction.setIsChosen(true);\n\n const loader = loaders.get(tabContent);\n loader.load();\n }, undefined, undefined, undefined, this.listenerSetter);\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', this.middlewareHelper.get());\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon as any\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, Reaction} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport Scrollable, {ScrollableBase, ScrollableX} from '../scrollable';\nimport wrapSticker from '../wrappers/sticker';\n\nconst REACTIONS_CLASS_NAME = 'btn-menu-reactions';\nconst REACTION_CLASS_NAME = REACTIONS_CLASS_NAME + '-reaction';\n\nconst REACTION_SIZE = 26;\nconst PADDING = 4;\nexport const REACTION_CONTAINER_SIZE = REACTION_SIZE + PADDING * 2;\n\nconst CAN_USE_TRANSFORM = !IS_SAFARI;\n\ntype ChatReactionsMenuPlayers = {\n select?: RLottiePlayer,\n appear?: RLottiePlayer,\n selectWrapper: HTMLElement,\n appearWrapper: HTMLElement,\n reaction: Reaction\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n public container: HTMLElement;\n private reactionsMap: Map;\n public scrollable: ScrollableBase;\n private animationGroup: AnimationItemGroup;\n private middleware: ReturnType;\n private message: Message.message;\n\n constructor(\n private managers: AppManagers,\n private type: 'horizontal' | 'vertical',\n middleware: ChatReactionsMenu['middleware']\n ) {\n const widthContainer = this.widthContainer = document.createElement('div');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container-' + type);\n\n const reactionsContainer = this.container = document.createElement('div');\n reactionsContainer.classList.add(REACTIONS_CLASS_NAME);\n\n const reactionsScrollable = this.scrollable = type === 'vertical' ? new Scrollable(undefined) : new ScrollableX(undefined);\n reactionsContainer.append(reactionsScrollable.container);\n reactionsScrollable.onAdditionalScroll = this.onScroll;\n reactionsScrollable.setListeners();\n\n reactionsScrollable.container.classList.add('no-scrollbar');\n\n // ['big'].forEach((type) => {\n // const bubble = document.createElement('div');\n // bubble.classList.add(REACTIONS_CLASS_NAME + '-bubble', REACTIONS_CLASS_NAME + '-bubble-' + type);\n // reactionsContainer.append(bubble);\n // });\n\n this.reactionsMap = new Map();\n this.animationGroup = `CHAT-MENU-REACTIONS-${Date.now()}`;\n animationIntersector.setOverrideIdleGroup(this.animationGroup, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n reactionsContainer.addEventListener('mousemove', this.onMouseMove);\n }\n\n attachClickEvent(reactionsContainer, (e) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) return;\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) return;\n\n this.managers.appReactionsManager.sendReaction(this.message, players.reaction);\n });\n\n widthContainer.append(reactionsContainer);\n\n this.middleware = middleware ?? getMiddleware();\n }\n\n public init(message: Message.message) {\n this.message = message;\n\n const middleware = this.middleware.get();\n // const result = Promise.resolve(this.appReactionsManager.getAvailableReactionsForPeer(message.peerId)).then((res) => pause(1000).then(() => res));\n const result = this.managers.appReactionsManager.getAvailableReactionsByMessage(message);\n callbackify(result, (reactions) => {\n if(!middleware() || !reactions.length) return;\n reactions.forEach((reaction) => {\n if(reaction.pFlags.premium && !rootScope.premium) return;\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: {_: 'reactionEmoji', emoticon: reaction.reaction}\n };\n this.reactionsMap.set(reactionDiv, players);\n\n const middleware = this.middleware.get();\n\n const hoverScale = IS_TOUCH_SUPPORTED ? 1 : 1.25;\n const size = REACTION_SIZE * hoverScale;\n\n const options = {\n width: size,\n height: size,\n skipRatio: 1,\n needFadeIn: false,\n withThumb: false,\n group: this.animationGroup,\n middleware\n };\n\n if(!this.canUseAnimations()) {\n delete options.needFadeIn;\n delete options.withThumb;\n\n wrapSticker({\n doc: reaction.static_icon,\n div: appearWrapper,\n ...options\n });\n } else {\n let isFirst = true;\n wrapSticker({\n doc: reaction.appear_animation,\n div: appearWrapper,\n play: true,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n players.appear = player;\n\n player.addEventListener('enterFrame', (frameNo) => {\n if(player.maxFrame === frameNo) {\n selectLoadPromise.then((selectPlayer) => {\n assumeType(selectPlayer);\n appearWrapper.classList.add('hide');\n selectWrapper.classList.remove('hide');\n\n if(isFirst) {\n players.select = selectPlayer;\n isFirst = false;\n }\n }, noop);\n }\n });\n }, noop);\n\n const selectLoadPromise = wrapSticker({\n doc: reaction.select_animation,\n div: selectWrapper,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n return lottieLoader.waitForFirstFrame(player);\n }).catch(noop);\n }\n\n scaleContainer.append(appearWrapper);\n selectWrapper && scaleContainer.append(selectWrapper);\n reactionDiv.append(scaleContainer);\n this.scrollable.append(reactionDiv);\n }\n\n private onScrollProcessItem(div: HTMLElement, players: ChatReactionsMenuPlayers) {\n // return;\n\n const scaleContainer = div.firstElementChild as HTMLElement;\n const visibleRect = getVisibleRect(div, this.scrollable.container);\n let transform: string;\n if(!visibleRect) {\n if(!players.appearWrapper.classList.contains('hide') || !players.appear) {\n return;\n }\n\n if(players.select) {\n players.select.stop();\n }\n\n players.appear.stop();\n players.appear.autoplay = true;\n players.appearWrapper.classList.remove('hide');\n players.selectWrapper.classList.add('hide');\n\n transform = '';\n } else if(visibleRect.overflow.left || visibleRect.overflow.right) {\n const diff = Math.abs(visibleRect.rect.left - visibleRect.rect.right);\n const scale = Math.min(diff ** 2 / REACTION_CONTAINER_SIZE ** 2, 1);\n\n transform = 'scale(' + scale + ')';\n } else {\n transform = '';\n }\n\n if(CAN_USE_TRANSFORM) {\n scaleContainer.style.transform = transform;\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) {\n return;\n }\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) {\n return;\n }\n\n // do not play select animation when appearing\n if(!players.appear?.paused) {\n return;\n }\n\n const player = players.select;\n if(!player) {\n return;\n }\n\n if(player.paused) {\n player.autoplay = true;\n player.restart();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport {copyTextToClipboard} from '../../helpers/clipboard';\nimport PopupSendNow from '../popups/sendNow';\nimport {toast} from '../toast';\nimport I18n, {i18n, LangPackKey} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction, MessageEntity, InputStickerSet, StickerSet, Document, Reaction} from '../../layer';\nimport PopupReportMessages from '../popups/reportMessages';\nimport assumeType from '../../helpers/assumeType';\nimport PopupSponsored from '../popups/sponsored';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport PeerTitle from '../peerTitle';\nimport StackedAvatars from '../stackedAvatars';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport PopupReactedList from '../popups/reactedList';\nimport {ChatReactionsMenu, REACTION_CONTAINER_SIZE} from './reactionsMenu';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport positionMenu, {MenuPositionPadding} from '../../helpers/positionMenu';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport PopupStickers from '../popups/stickers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport canSaveMessageMedia from '../../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\n\nexport default class ChatContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise, notDirect?: () => boolean, withSelection?: true, isSponsored?: true, localName?: 'views' | 'emojis'})[];\n private element: HTMLElement;\n\n private isSelectable: boolean;\n private isSelected: boolean;\n private target: HTMLElement;\n private isTargetAGroupedItem: boolean;\n private isTextSelected: boolean;\n private isAnchorTarget: boolean;\n private isUsernameTarget: boolean;\n private isSponsored: boolean;\n private isOverBubble: boolean;\n private peerId: PeerId;\n private mid: number;\n private message: Message.message | Message.messageService;\n private noForwards: boolean;\n\n private reactionsMenu: ChatReactionsMenu;\n private listenerSetter: ListenerSetter;\n private attachListenerSetter: ListenerSetter;\n\n private viewerPeerId: PeerId;\n private middleware: ReturnType;\n private canOpenReactedList: boolean;\n\n private emojiInputsPromise: CancellablePromise;\n private albumMessages: Message.message[];\n private linkToMessage: Awaited>;\n private selectedMessagesText: string;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n this.attachListenerSetter = new ListenerSetter();\n this.middleware = getMiddleware();\n }\n\n public attachTo(element: HTMLElement) {\n this.attachListenerSetter.removeAll();\n\n if(IS_TOUCH_SUPPORTED/* && false */) {\n attachClickEvent(element, (e) => {\n if(this.chat.selection.isSelecting) {\n return;\n }\n\n this.chat.log('touchend', e);\n\n const badSelectors = [\n '.name',\n '.peer-title',\n '.reply',\n '.document',\n 'audio-element',\n 'avatar-element',\n 'a',\n '.bubble-beside-button',\n 'replies-element',\n '[data-saved-from]:not(.bubble)',\n 'poll-element',\n '.attachment',\n '.reply-markup-button'\n ];\n const good = !(e.target as HTMLElement).closest(badSelectors.join(', '));\n if(good) {\n cancelEvent(e);\n // onContextMenu((e as TouchEvent).changedTouches[0]);\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\n this.onContextMenu(e);\n }\n }, {listenerSetter: this.attachListenerSetter});\n } else attachContextMenuListener(element, this.onContextMenu, this.attachListenerSetter);\n }\n\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\n let bubble: HTMLElement, contentWrapper: HTMLElement;\n\n try {\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\n } catch(e) {}\n\n // ! context menu click by date bubble (there is no pointer-events)\n if(!bubble || bubble.classList.contains('bubble-first')) return;\n\n let element = this.element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(element && element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n let mid = +bubble.dataset.mid;\n if(!mid) return;\n\n const r = async() => {\n const isSponsored = this.isSponsored = mid < 0;\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\n this.peerId = this.chat.peerId;\n // this.msgID = msgID;\n this.target = e.target as HTMLElement;\n this.isTextSelected = !isSelectionEmpty();\n this.isAnchorTarget = this.target.tagName === 'A' && (\n (this.target as HTMLAnchorElement).target === '_blank' ||\n this.target.classList.contains('anchor-url')\n );\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\n\n const mids = await this.chat.getMidsByMid(mid);\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\n if(this.chat.selection.isSelecting && !contentWrapper) {\n if(isSponsored) {\n return;\n }\n\n if(mids.length > 1) {\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ?\n mid :\n mids.find((mid) => this.chat.selection.isMidSelected(this.peerId, mid));\n if(selectedMid) {\n mid = selectedMid;\n }\n }\n }\n\n this.isOverBubble = !!contentWrapper;\n\n const groupedItem = findUpClassName(this.target, 'grouped-item');\n this.isTargetAGroupedItem = !!groupedItem;\n if(groupedItem) {\n this.mid = +groupedItem.dataset.mid;\n } else {\n this.mid = mid;\n }\n\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\n this.message = (bubble as any).message || await this.chat.getMessage(this.mid);\n this.albumMessages = (this.message as Message.message).grouped_id ? await this.managers.appMessagesManager.getMessagesByAlbum((this.message as Message.message).grouped_id) : undefined;\n this.noForwards = !isSponsored && !(await this.managers.appMessagesManager.canForward(this.message));\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n this.linkToMessage = await this.getUrlToMessage();\n this.selectedMessagesText = await this.getSelectedMessagesText();\n\n const initResult = await this.init();\n if(!initResult) {\n return;\n }\n\n element = initResult.element;\n const {cleanup, destroy, menuPadding, reactionsMenu, reactionsMenuPosition} = initResult;\n let isReactionsMenuVisible = false;\n if(reactionsMenu) {\n const className = 'is-visible';\n isReactionsMenuVisible = reactionsMenu.container.classList.contains(className);\n if(isReactionsMenuVisible) reactionsMenu.container.classList.remove(className);\n\n if(reactionsMenuPosition === 'horizontal') {\n const offsetSize = element[/* reactionsMenuPosition === 'vertical' ? 'offsetHeight' : */'offsetWidth'];\n // if(reactionsMenu.scrollable.container.scrollWidth > offsetWidth) {\n const INNER_CONTAINER_PADDING = 8;\n const visibleLength = (offsetSize - INNER_CONTAINER_PADDING) / REACTION_CONTAINER_SIZE;\n const nextVisiblePart = visibleLength % 1;\n const MIN_NEXT_VISIBLE_PART = 0.65;\n if(nextVisiblePart < MIN_NEXT_VISIBLE_PART) {\n const minSize = (offsetSize + (MIN_NEXT_VISIBLE_PART - nextVisiblePart) * REACTION_CONTAINER_SIZE) | 0;\n element.style[/* reactionsMenuPosition === 'vertical' ? 'minHeight' : */'minWidth'] = minSize + 'px';\n }\n // }\n }\n }\n\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\n // bubble.parentElement.append(element);\n // appImManager.log('contextmenu', e, bubble, side);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\n\n if(reactionsMenu) {\n reactionsMenu.widthContainer.style.top = element.style.top;\n reactionsMenu.widthContainer.style.left = element.style.left;\n reactionsMenu.widthContainer.style.setProperty('--menu-width', element[reactionsMenuPosition === 'vertical' ? 'offsetHeight' : 'offsetWidth'] + 'px');\n element.parentElement.append(reactionsMenu.widthContainer);\n if(isReactionsMenuVisible) void reactionsMenu.container.offsetLeft; // reflow\n }\n\n contextMenuController.openBtnMenu(element, () => {\n if(reactionsMenu) {\n reactionsMenu.container.classList.remove('is-visible');\n }\n\n this.mid = 0;\n this.peerId = undefined;\n this.target = null;\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n\n if(isReactionsMenuVisible) {\n reactionsMenu.container.classList.add('is-visible');\n }\n };\n\n r();\n };\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.reactionsMenu && this.reactionsMenu.cleanup();\n this.middleware.clean();\n }\n\n public destroy() {\n this.cleanup();\n this.attachListenerSetter.removeAll();\n }\n\n private async filterButtons(buttons: ChatContextMenu['buttons']) {\n if(this.isSponsored) {\n return buttons.filter((button) => {\n return button.isSponsored;\n });\n } else {\n return filterAsync(buttons, async(button) => {\n let good: boolean;\n\n // if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\n if(this.chat.selection.isSelecting && !button.withSelection) {\n good = false;\n } else {\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ?\n await button.verify() :\n button.notDirect && await button.verify() && button.notDirect();\n }\n\n return !!good;\n });\n }\n }\n\n private setButtons() {\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const doc = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document;\n if(!(doc as MyDocument)?.sticker) {\n return false;\n }\n\n const favedStickers = await this.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n this.buttons = [{\n icon: 'send2',\n text: 'MessageScheduleSend',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\n }, {\n icon: 'send2',\n text: 'Message.Context.Selection.SendNow',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'schedule',\n text: 'MessageScheduleEditTime',\n onClick: () => {\n this.chat.input.scheduleSending(() => {\n assumeType(this.message);\n this.managers.appMessagesManager.editMessage(this.message, this.message.message, {\n scheduleDate: this.chat.input.scheduleDate,\n entities: this.message.entities\n });\n\n this.chat.input.onMessageSent(false, false);\n }, new Date(this.message.date * 1000));\n },\n verify: () => this.chat.type === 'scheduled'\n }, {\n icon: 'reply',\n text: 'Reply',\n onClick: this.onReplyClick,\n verify: async() => await this.chat.canSend() &&\n !this.message.pFlags.is_outgoing &&\n !!this.chat.input.messageInput &&\n this.chat.type !== 'scheduled'/* ,\n cancelEvent: true */\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: this.onFaveStickerClick.bind(this, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: this.onFaveStickerClick.bind(this, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'edit',\n text: 'Edit',\n onClick: this.onEditClick,\n verify: async() => (await this.managers.appMessagesManager.canEditMessage(this.message, 'text')) && !!this.chat.input.messageInput\n }, {\n icon: 'copy',\n text: 'Copy',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\n }, {\n icon: 'copy',\n text: 'Chat.CopySelectedText',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\n }, {\n icon: 'copy',\n text: 'Message.Context.Selection.Copy',\n onClick: this.onCopyClick,\n verify: async() => {\n if(!this.isSelected || this.noForwards) {\n return false;\n }\n\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.chat.type === 'scheduled' ? 'scheduled' : 'history'}`;\n for(const mid of mids) {\n const message = (await this.managers.appMessagesManager.getMessageFromStorage(storageKey, mid)) as Message.message;\n if(!!message.message) {\n return true;\n }\n }\n }\n\n return false;\n },\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'CopyLink',\n onClick: this.onCopyAnchorLinkClick,\n verify: () => this.isAnchorTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Username',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.isUsernameTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Hashtag',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.target.classList.contains('anchor-hashtag'),\n withSelection: true\n }, {\n icon: 'link',\n text: 'MessageContext.CopyMessageLink1',\n onClick: this.onCopyLinkClick,\n verify: async() => await this.managers.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\n }, {\n icon: 'pin',\n text: 'Message.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => !this.message.pFlags.is_outgoing &&\n this.message._ !== 'messageService' &&\n !this.message.pFlags.pinned &&\n await this.managers.appPeersManager.canPinMessage(this.peerId) &&\n this.chat.type !== 'scheduled'\n }, {\n icon: 'unpin',\n text: 'Message.Context.Unpin',\n onClick: this.onUnpinClick,\n verify: async() => (this.message as Message.message).pFlags.pinned && await this.managers.appPeersManager.canPinMessage(this.peerId)\n }, {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: () => {\n appDownloadManager.downloadToDisc({media: getMediaFromMessage(this.message)});\n },\n verify: () => {\n if(!canSaveMessageMedia(this.message) || this.noForwards) {\n return false;\n }\n\n const isPhoto: boolean = !!((this.message as Message.message).media as MessageMedia.messageMediaPhoto)?.photo;\n let isGoodType = false\n\n if(isPhoto) {\n isGoodType = true;\n } else {\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\n if(!doc) return false;\n // isGoodType = doc.type && (['gif', 'video', 'audio', 'voice', 'sticker'] as MyDocument['type'][]).includes(doc.type)\n isGoodType = true;\n }\n\n let hasTarget = !!IS_TOUCH_SUPPORTED;\n\n if(isGoodType) hasTarget ||= !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio') || !!findUpClassName(this.target, 'media-sticker-wrapper') || !!findUpClassName(this.target, 'media-photo') || !!findUpClassName(this.target, 'media-video');\n\n return isGoodType && hasTarget;\n }\n }, {\n icon: 'checkretract',\n text: 'Chat.Poll.Unvote',\n onClick: this.onRetractVote,\n verify: () => {\n const poll = (this.message as any).media?.poll as Poll;\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'stop',\n text: 'Chat.Poll.Stop',\n onClick: this.onStopPoll,\n verify: async() => {\n const poll = (this.message as any).media?.poll;\n return await this.managers.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || this.message.fromId === SERVICE_PEER_ID) && this.message._ !== 'messageService'\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.chat.selection.selectionForwardBtn &&\n this.isSelected &&\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'flag',\n text: 'ReportChat',\n onClick: () => {\n new PopupReportMessages(this.peerId, [this.mid]);\n },\n verify: async() => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && await this.managers.appPeersManager.isChannel(this.peerId),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick,\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n notDirect: () => true,\n withSelection: true\n }, {\n onClick: () => {\n if(this.viewerPeerId) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.viewerPeerId\n });\n } else if(this.canOpenReactedList) {\n new PopupReactedList(this.message as Message.message);\n } else {\n return false;\n }\n },\n verify: async() => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)),\n notDirect: () => true,\n localName: 'views'\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(this.message)\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'info',\n text: 'Chat.Message.Sponsored.What',\n onClick: () => {\n new PopupSponsored();\n },\n verify: () => false,\n isSponsored: true\n }, {\n // icon: 'smile',\n text: 'Loading',\n onClick: () => {\n this.emojiInputsPromise.then((inputs) => {\n new PopupStickers(inputs, true).show();\n });\n },\n verify: () => !!this.getUniqueCustomEmojisFromMessage().length,\n notDirect: () => true,\n localName: 'emojis'\n }];\n }\n\n private getUniqueCustomEmojisFromMessage() {\n const docIds: DocId[] = [];\n\n const message = this.albumMessages ? getAlbumText(this.albumMessages) || this.message : this.message;\n\n const entities = (message as Message.message).entities;\n if(entities) {\n const filtered = entities.filter((entity) => entity._ === 'messageEntityCustomEmoji') as MessageEntity.messageEntityCustomEmoji[];\n docIds.push(...filtered.map((entity) => entity.document_id));\n }\n\n const reactions = (message as Message.message).reactions;\n if(reactions) {\n const results = reactions.results.filter((reactionCount) => reactionCount.reaction._ === 'reactionCustomEmoji');\n docIds.push(...results.map((reactionCount) => (reactionCount.reaction as Reaction.reactionCustomEmoji).document_id));\n }\n\n return filterUnique(docIds);\n }\n\n private async init() {\n this.cleanup();\n this.setButtons();\n\n const filteredButtons = await this.filterButtons(this.buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const element = this.element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter: this.listenerSetter\n });\n element.id = 'bubble-contextmenu';\n element.classList.add('contextmenu');\n\n const viewsButton = filteredButtons.find((button) => button.localName === 'views');\n if(viewsButton) {\n const reactions = (this.message as Message.message).reactions;\n const recentReactions = reactions?.recent_reactions;\n const isViewingReactions = !!recentReactions?.length;\n const participantsCount = await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message) ?\n ((await this.managers.appPeersManager.getPeer(this.peerId)) as MTChat.chat).participants_count :\n undefined;\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\n\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\n const i18nElem = new I18n.IntlElement({\n key: isViewingReactions ? (\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\n ) : 'NobodyViewed',\n args: isViewingReactions ? (\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\n ) : undefined,\n element: viewsButton.textElement\n });\n\n let fakeText: HTMLElement;\n if(isViewingReactions) {\n if(participantsCount === undefined) {\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\n } else {\n fakeText = i18n(\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n [recentReactions.length, participantsCount]\n );\n }\n } else {\n fakeText = i18n('Loading');\n }\n\n fakeText.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeText);\n\n const AVATAR_SIZE = 22;\n const MAX_AVATARS = 3;\n const PADDING_PER_AVATAR = 1.125;\n i18nElem.element.style.visibility = 'hidden';\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\n const middleware = this.middleware.get();\n this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\n if(!middleware()) {\n return;\n }\n\n if(fakeText) {\n fakeText.remove();\n }\n\n const reactions = result.combined;\n const reactedLength = participantsCount === undefined ?\n result.reactionsCount :\n (\n isViewingReactions ?\n reactions.filter((reaction) => reaction.reaction).length :\n reactions.length\n );\n\n let fakeElem: HTMLElement;\n if(reactions.length === 1) {\n fakeElem = new PeerTitle({\n peerId: reactions[0].peerId,\n onlyFirstName: true,\n dialog: false\n }).element;\n\n if(!isViewingReactions || result.readParticipants.length <= 1) {\n this.viewerPeerId = reactions[0].peerId;\n }\n } else if(isViewingReactions) {\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\n fakeElem = i18n(\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n isFull ? [reactedLength] : [reactedLength, reactions.length]\n );\n } else {\n if(!reactions.length) {\n i18nElem.element.style.visibility = '';\n } else {\n fakeElem = i18n('MessageSeen', [reactions.length]);\n }\n }\n\n if(fakeElem) {\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\n fakeElem.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeElem);\n }\n\n if(reactions.length) {\n const avatars = new StackedAvatars({avatarSize: AVATAR_SIZE});\n avatars.render(recentReactions ? recentReactions.map((r) => getPeerId(r.peer_id)) : reactions.map((reaction) => reaction.peerId));\n viewsButton.element.append(avatars.container);\n\n // if(reactions.length > 1) {\n // if(isViewingReactions) {\n this.canOpenReactedList = true;\n // }\n }\n });\n }\n\n let menuPadding: MenuPositionPadding;\n let reactionsMenu: ChatReactionsMenu;\n let reactionsMenuPosition: 'horizontal' | 'vertical';\n if(\n this.message._ === 'message' &&\n !this.chat.selection.isSelecting &&\n !this.message.pFlags.is_outgoing &&\n !this.message.pFlags.is_scheduled &&\n !this.message.pFlags.local\n ) {\n reactionsMenuPosition = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.managers, reactionsMenuPosition, this.middleware);\n reactionsMenu.init(await this.managers.appMessagesManager.getGroupsFirstMessage(this.message));\n // element.prepend(reactionsMenu.widthContainer);\n\n const size = 36;\n const margin = 8;\n const totalSize = size + margin;\n const paddingLeft = 0, paddingRight = 0;\n if(reactionsMenuPosition === 'vertical') {\n menuPadding = {\n top: paddingLeft,\n // bottom: 36, // positionMenu will detect it itself somehow\n left: totalSize\n };\n } else {\n menuPadding = {\n top: totalSize,\n right: paddingRight,\n left: paddingLeft\n };\n }\n }\n\n const emojisButton = filteredButtons.find((button) => button.localName === 'emojis');\n if(emojisButton) {\n emojisButton.element.classList.add('is-multiline');\n emojisButton.element.parentElement.insertBefore(document.createElement('hr'), emojisButton.element);\n\n const setPadding = () => {\n menuPadding ??= {};\n menuPadding.bottom = 24;\n };\n\n const docIds = this.getUniqueCustomEmojisFromMessage();\n const inputsPromise = this.emojiInputsPromise = deferredPromise();\n\n await this.managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then(async(docs) => {\n const p = async(docs: Document.document[]) => {\n const s: Map = new Map();\n docs.forEach((doc) => {\n if(!doc || s.has(doc.stickerSetInput.id)) {\n return;\n }\n\n s.set(doc.stickerSetInput.id, doc.stickerSetInput);\n });\n\n const inputs = [...s.values()];\n inputsPromise.resolve(inputs);\n if(s.size === 1) {\n const result = await this.managers.acknowledged.appStickersManager.getStickerSet(inputs[0]);\n const promise = result.result.then((set) => {\n const el = i18n('MessageContainsEmojiPack', [wrapEmojiText(set.set.title)]);\n replaceContent(emojisButton.textElement, el);\n });\n\n return result.cached ? promise : (setPadding(), undefined);\n }\n\n replaceContent(emojisButton.textElement, i18n('MessageContainsEmojiPacks', [s.size]));\n };\n\n if(docs.some((doc) => !doc)) {\n setPadding();\n this.managers.appEmojiManager.getCustomEmojiDocuments(docIds).then(p);\n } else {\n return p(docs);\n }\n });\n // emojisButton.element.append(i18n('Loading'));\n }\n\n this.chat.container.append(element);\n\n return {\n element,\n cleanup: () => {\n this.cleanup();\n reactionsMenu && reactionsMenu.cleanup();\n },\n destroy: () => {\n element.remove();\n reactionsMenu && reactionsMenu.widthContainer.remove();\n },\n menuPadding,\n reactionsMenu,\n reactionsMenuPosition\n };\n }\n\n private async getUrlToMessage() {\n if(this.peerId.isUser()) {\n return;\n }\n\n let threadMessage: Message.message;\n const {peerId, mid} = this;\n const threadId = this.chat.threadId;\n if(this.chat.type === 'discussion') {\n threadMessage = (await this.managers.appMessagesManager.getMessageByPeer(peerId, threadId)) as Message.message;\n }\n\n const username = await this.managers.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : peerId);\n const msgId = getServerMessageId(mid);\n let url = 'https://t.me/';\n if(username) {\n url += username;\n if(threadMessage) url += `/${getServerMessageId(threadMessage.fwd_from.channel_post)}?comment=${msgId}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n } else {\n url += 'c/' + peerId.toChatId();\n if(threadMessage) url += `/${msgId}?thread=${getServerMessageId(threadMessage.mid)}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n }\n\n return {url, isPrivate: !username};\n }\n\n private async getSelectedMessagesText() {\n if(!isSelectionEmpty()) {\n return '';\n }\n\n const mids = this.chat.selection.isSelecting ?\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) :\n [this.mid];\n\n const parts: string[] = await Promise.all(mids.map(async(mid) => {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n return message?.message ? message.message + '\\n' : '';\n }));\n\n return parts.join('');\n }\n\n private onSendScheduledClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\n } else {\n new PopupSendNow(this.peerId, await this.chat.getMidsByMid(this.mid));\n }\n };\n\n private onReplyClick = () => {\n this.chat.input.initMessageReply(this.mid);\n };\n\n private onFaveStickerClick = (unfave?: boolean) => {\n const docId = ((this.message as Message.message).media as MessageMedia.messageMediaDocument).document.id;\n this.managers.appStickersManager.faveSticker(docId, unfave);\n };\n\n private onEditClick = () => {\n this.chat.input.initMessageEditing(this.mid);\n };\n\n private onCopyClick = async() => {\n if(isSelectionEmpty()) {\n copyTextToClipboard(this.selectedMessagesText);\n } else {\n document.execCommand('copy');\n // cancelSelection();\n }\n };\n\n private onCopyAnchorLinkClick = () => {\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\n };\n\n private onCopyLinkClick = () => {\n const {url, isPrivate} = this.linkToMessage;\n const key: LangPackKey = isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied';\n toast(I18n.format(key, true));\n copyTextToClipboard(url);\n };\n\n private onPinClick = () => {\n new PopupPinMessage(this.peerId, this.mid);\n };\n\n private onUnpinClick = () => {\n new PopupPinMessage(this.peerId, this.mid, true);\n };\n\n private onRetractVote = () => {\n this.managers.appPollsManager.sendVote(this.message as Message.message, []);\n };\n\n private onStopPoll = () => {\n this.managers.appPollsManager.stopPoll(this.message as Message.message);\n };\n\n private onForwardClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\n } else {\n const peerId = this.peerId;\n const mids = this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid);\n new PopupForward({\n [peerId]: mids\n });\n }\n };\n\n private onSelectClick = () => {\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\n };\n\n private onClearSelectionClick = () => {\n this.chat.selection.cancelSelection();\n };\n\n private onDeleteClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid), this.chat.type);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\n\nexport default class SendMenu {\n public sendMenu: HTMLElement;\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private type: 'schedule' | 'reminder';\n\n constructor(options: {\n onSilentClick: () => void,\n onScheduleClick: () => void,\n listenerSetter?: ListenerSetter,\n openSide: string,\n onContextElement: HTMLElement,\n onOpen?: () => boolean\n }) {\n this.sendMenuButtons = [{\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: options.onSilentClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.SetReminder',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'reminder'\n }];\n\n this.sendMenu = ButtonMenuSync({buttons: this.sendMenuButtons, listenerSetter: options.listenerSetter});\n this.sendMenu.classList.add('menu-send', options.openSide);\n\n attachContextMenuListener(options.onContextElement, (e) => {\n if(options.onOpen && !options.onOpen()) {\n return;\n }\n\n this.sendMenuButtons.forEach((button) => {\n button.element.classList.toggle('hide', !button.verify());\n });\n\n cancelEvent(e);\n contextMenuController.openBtnMenu(this.sendMenu);\n }, options.listenerSetter);\n }\n\n public setPeerId(peerId: PeerId) {\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\n }\n};\n","/*\n * 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 PopupElement from '.';\nimport CheckboxField from '../checkboxField';\nimport InputField from '../inputField';\nimport RadioField from '../radioField';\nimport Scrollable from '../scrollable';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport I18n, {_i18n} from '../../lib/langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Poll} from '../../layer';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\n\nconst MAX_LENGTH_QUESTION = 255;\nconst MAX_LENGTH_OPTION = 100;\nconst MAX_LENGTH_SOLUTION = 200;\n\nexport default class PopupCreatePoll extends PopupElement {\n private questionInputField: InputField;\n private questions: HTMLElement;\n protected scrollable: Scrollable;\n private tempId = 0;\n\n private anonymousCheckboxField: CheckboxField;\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n\n private correctAnswers: Uint8Array[];\n private quizSolutionField: InputField;\n private optionInputFields: InputField[];\n\n constructor(private chat: Chat) {\n super('popup-create-poll popup-new-media', {closable: true, withConfirm: 'Create', body: true, title: 'NewPoll'});\n this.construct();\n }\n\n private async construct() {\n this.questionInputField = new InputField({\n placeholder: 'AskAQuestion',\n label: 'AskAQuestion',\n name: 'question',\n maxLength: MAX_LENGTH_QUESTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n this.optionInputFields = [];\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 });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.header.append(this.questionInputField.container);\n\n const hr = document.createElement('hr');\n const d = document.createElement('div');\n d.classList.add('caption');\n _i18n(d, 'PollOptions');\n\n this.questions = document.createElement('form');\n this.questions.classList.add('poll-create-questions');\n\n const dd = document.createElement('div');\n dd.classList.add('poll-create-settings');\n\n const settingsCaption = document.createElement('div');\n settingsCaption.classList.add('caption');\n _i18n(settingsCaption, 'Settings');\n\n if(!(await this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))) {\n this.anonymousCheckboxField = new CheckboxField({\n text: 'NewPoll.Anonymous',\n name: 'anonymous'\n });\n this.anonymousCheckboxField.input.checked = true;\n dd.append(this.anonymousCheckboxField.label);\n }\n\n this.multipleCheckboxField = new CheckboxField({\n text: 'NewPoll.MultipleChoice',\n name: 'multiple'\n });\n this.quizCheckboxField = new CheckboxField({\n text: 'NewPoll.Quiz',\n name: 'quiz'\n });\n\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\n const checked = this.multipleCheckboxField.input.checked;\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\n });\n\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\n const checked = this.quizCheckboxField.input.checked;\n\n (Array.from(this.questions.children) as HTMLElement[]).map((el) => {\n el.classList.toggle('radio-field', checked);\n });\n\n if(!checked) {\n this.correctAnswers = undefined;\n this.quizSolutionField.setValueSilently('');\n }\n\n quizElements.forEach((el) => el.classList.toggle('hide', !checked));\n\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\n this.handleChange();\n });\n\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\n\n const quizElements: HTMLElement[] = [];\n\n const quizSolutionCaption = document.createElement('div');\n quizSolutionCaption.classList.add('caption');\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\n\n const quizHr = document.createElement('hr');\n\n const quizSolutionContainer = document.createElement('div');\n quizSolutionContainer.classList.add('poll-create-questions');\n\n this.quizSolutionField = new InputField({\n placeholder: 'NewPoll.Explanation.Placeholder',\n label: 'NewPoll.Explanation.Placeholder',\n name: 'solution',\n maxLength: MAX_LENGTH_SOLUTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n const quizSolutionSubtitle = document.createElement('div');\n quizSolutionSubtitle.classList.add('subtitle');\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\n\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\n\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\n quizElements.forEach((el) => el.classList.add('hide'));\n\n this.body.parentElement.insertBefore(hr, this.body);\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\n\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable = new Scrollable(this.body);\n this.appendMoreField();\n\n this.onEscape = () => {\n return !this.getFilledAnswers().length;\n };\n\n this.handleChange();\n }\n\n private getFilledAnswers() {\n const answers = Array.from(this.questions.children).map((el, idx) => {\n const input = el.querySelector('.input-field-input') as HTMLElement;\n return input instanceof HTMLInputElement ? input.value : getRichValueWithCaret(input, false, false).value;\n }).filter((v) => !!v.trim());\n\n return answers;\n }\n\n private onSubmitClick = () => {\n this.send();\n };\n\n private validate() {\n const question = this.questionInputField.value;\n if(!question) {\n return false;\n }\n\n if(question.length > MAX_LENGTH_QUESTION) {\n return false;\n }\n\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\n return false;\n }\n\n const answers = this.getFilledAnswers();\n if(answers.length < 2) {\n return false;\n }\n\n const tooLongOption = answers.find((a) => a.length > MAX_LENGTH_OPTION);\n if(tooLongOption) {\n return false;\n }\n\n const {value: quizSolution} = getRichValueWithCaret(this.quizSolutionField.input, false, false);\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\n return false;\n }\n\n return true;\n }\n\n private handleChange() {\n const valid = this.validate();\n this.btnConfirm.toggleAttribute('disabled', !valid);\n }\n\n public async send(force = false) {\n const question = this.questionInputField.value;\n\n const answers = this.getFilledAnswers();\n\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValueWithCaret(this.quizSolutionField.input, true, false);\n\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n this.hide();\n\n // const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\n // const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\n\n const pFlags: Poll['pFlags'] = {};\n\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\n pFlags.public_voters = true;\n }\n\n if(this.multipleCheckboxField.input.checked) {\n pFlags.multiple_choice = true;\n }\n\n if(this.quizCheckboxField.input.checked) {\n pFlags.quiz = true;\n }\n\n const poll: Poll = {\n _: 'poll',\n pFlags,\n question,\n answers: answers.map((value, idx) => {\n return {\n _: 'pollAnswer',\n text: value,\n option: new Uint8Array([idx])\n };\n }),\n id: undefined\n };\n // poll.id = randomIDS;\n\n const inputMediaPoll = await this.chat.managers.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\n\n // console.log('Will try to create poll:', inputMediaPoll);\n\n this.chat.managers.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\n ...this.chat.getMessageSendingParams()\n });\n\n if(this.chat.input.helperType === 'reply') {\n this.chat.input.clearHelper();\n }\n\n this.chat.input.onMessageSent(false, false);\n }\n\n onInput = (e: Event) => {\n const target = e.target as HTMLInputElement;\n\n const radioLabel = findUpTag(target, 'LABEL');\n const isEmpty = isInputEmpty(target);\n if(!isEmpty) {\n target.parentElement.classList.add('is-filled');\n radioLabel.classList.remove('hidden-widget');\n radioLabel.firstElementChild.removeAttribute('disabled');\n }\n\n const isLast = !radioLabel.nextElementSibling;\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\n this.appendMoreField();\n }\n\n this.handleChange();\n };\n\n onDeleteClick = (e: MouseEvent) => {\n const target = e.target as HTMLSpanElement;\n const label = findUpTag(target, 'LABEL');\n const idx = whichChild(label);\n\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\n this.correctAnswers = undefined;\n }\n\n label.remove();\n this.optionInputFields.splice(idx, 1);\n\n this.optionInputFields.forEach((inputField, idx) => {\n inputField.options.labelOptions.length = 0;\n inputField.options.labelOptions.push(idx + 1);\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\n i18nElement.update();\n });\n\n this.handleChange();\n };\n\n private appendMoreField() {\n const tempId = this.tempId++;\n const idx = this.questions.childElementCount + 1;\n const questionField = new InputField({\n placeholder: 'NewPoll.OptionsAddOption',\n label: 'NewPoll.OptionLabel',\n labelOptions: [idx],\n name: 'question-' + tempId,\n maxLength: MAX_LENGTH_OPTION\n });\n this.listenerSetter.add(questionField.input)('input', this.onInput);\n\n const radioField = new RadioField({\n text: '',\n name: 'question'\n });\n radioField.main.append(questionField.container);\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\n radioField.label.classList.add('hidden-widget');\n radioField.input.disabled = true;\n if(!this.quizCheckboxField.input.checked) {\n radioField.label.classList.remove('radio-field');\n }\n this.listenerSetter.add(radioField.input)('change', () => {\n const checked = radioField.input.checked;\n if(checked) {\n const idx = whichChild(radioField.label);\n this.correctAnswers = [new Uint8Array([idx])];\n this.handleChange();\n }\n });\n\n const deleteBtn = document.createElement('span');\n deleteBtn.classList.add('btn-icon', 'tgico-close');\n questionField.container.append(deleteBtn);\n\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\n\n this.questions.append(radioField.label);\n\n this.scrollable.scrollIntoViewNew({\n element: this.questions.lastElementChild as HTMLElement,\n position: 'center'\n });\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\n\n this.optionInputFields.push(questionField);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from './schedulers/pause';\nimport {makeMediaSize} from './mediaSize';\nimport scaleMediaElement from './canvas/scaleMediaElement';\nimport preloadVideo from './preloadVideo';\n\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\n let width: number, height: number;\n if(media instanceof HTMLVideoElement) {\n width = media.videoWidth;\n height = media.videoHeight;\n } else {\n width = media.naturalWidth;\n height = media.naturalHeight;\n }\n\n return scaleMediaElement({\n media,\n mediaSize: makeMediaSize(width, height),\n boxSize: makeMediaSize(320, 240),\n quality: .9\n });\n}\n\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\n return new Promise((resolve, reject) => {\n video.onseeked = () => {\n video.onseeked = () => {\n createPosterFromMedia(video).then(resolve);\n\n video.onseeked = undefined;\n };\n\n video.currentTime = 0;\n };\n\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n });\n}\n\nexport async function createPosterForVideo(url: string) {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n createPosterFromVideo(video)\n ]);\n}\n\n\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 CheckboxField from '../checkboxField';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport {createPosterFromMedia, createPosterFromVideo} from '../../helpers/createPoster';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport calcImageInBox from '../../helpers/calcImageInBox';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from '../../helpers/getGifDuration';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport prepareAlbum from '../prepareAlbum';\nimport {MediaSize} from '../../helpers/mediaSize';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport wrapDocument from '../wrappers/document';\n\ntype SendFileParams = Partial<{\n file: File,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n width: number,\n height: number,\n duration: number,\n noSound: boolean,\n itemDiv: HTMLElement\n}>;\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private inputField: InputField;\n private captionLengthMax: number;\n\n constructor(private chat: Chat, private files: File[], willAttachType: PopupNewMedia['willAttach']['type']) {\n super('popup-send-photo popup-new-media', {closable: true, withConfirm: 'Modal.Send', confirmShortcutIsSendShortcut: true, body: true, title: true});\n this.construct(willAttachType);\n }\n\n private async construct(willAttachType: PopupNewMedia['willAttach']['type']) {\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n const config = await this.managers.apiManager.getConfig();\n this.captionLengthMax = config.caption_length_max;\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n\n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: this.captionLengthMax,\n withLinebreaks: true\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.isContentEditable) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n let caption = this.inputField.value;\n if(caption.length > this.captionLengthMax) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n this.hide();\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' ? true : undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n // console.log('will send files with options:', willAttach);\n\n const {peerId, input} = this.chat;\n\n sendFileDetails.forEach((d) => {\n d.itemDiv = undefined;\n });\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileDetails) => {\n if(caption && sendFileDetails.length !== length) {\n this.managers.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const w = {\n ...willAttach,\n sendFileDetails\n };\n\n this.managers.appMessagesManager.sendAlbum(peerId, w.sendFileDetails.map((d) => d.file), Object.assign({\n ...sendingParams,\n caption,\n isMedia: isMedia,\n clearDraft: true as true\n }, w));\n\n caption = undefined;\n });\n\n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n }\n\n private async attachMedia(params: SendFileParams, itemDiv: HTMLElement) {\n itemDiv.classList.add('popup-item-media');\n\n const file = params.file;\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = createVideo();\n const source = document.createElement('source');\n source.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n promise = onMediaLoad(video).then(async() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n\n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n const thumb = await createPosterFromVideo(video);\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n });\n\n video.append(source);\n } else {\n const img = new Image();\n promise = new Promise((resolve) => {\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n\n itemDiv.append(img);\n\n if(file.type === 'image/gif') {\n params.noSound = true;\n\n Promise.all([\n getGifDuration(img).then((duration) => {\n params.duration = Math.ceil(duration);\n }),\n\n createPosterFromMedia(img).then(async(thumb) => {\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {\n resolve();\n });\n } else {\n resolve();\n }\n };\n });\n\n img.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n return promise;\n }\n\n private async attachDocument(params: SendFileParams, itemDiv: HTMLElement): ReturnType {\n itemDiv.classList.add('popup-item-document');\n const file = params.file;\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio || file.size < 20e6) {\n params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n let cacheContext: ThumbCache;\n if(params.objectURL) {\n cacheContext = {\n url: params.objectURL,\n downloaded: file.size,\n type: THUMB_TYPE_FULL\n };\n }\n\n const docDiv = await wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any,\n cacheContext\n });\n\n const promise = new Promise((resolve) => {\n const finish = () => {\n itemDiv.append(docDiv);\n resolve();\n };\n\n if(isPhoto) {\n const img = new Image();\n img.src = params.objectURL;\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n\n finish();\n };\n\n img.onerror = finish;\n } else {\n finish();\n }\n });\n\n return promise;\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const params: SendFileParams = {};\n params.file = file;\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(params, itemDiv) : this.attachDocument(params, itemDiv);\n willAttach.sendFileDetails.push(params);\n return promise;\n };\n\n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach((file) => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter((n) => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else\n\n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(div: HTMLElement, params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n div.style.width = size.width + 'px';\n div.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(div);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach((p) => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n willAttach.sendFileDetails.length = 0;\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n Promise.all(files.map(this.attachFile)).then(() => {\n mediaContainer.innerHTML = '';\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n if(this.shouldCompress(sendFileDetails[0].file.type) && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map((s) => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map((o) => ({w: o.width, h: o.height})),\n maxWidth: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params.itemDiv, params);\n });\n }\n });\n }).then(() => {\n this.onRender();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport fastSmoothScroll from '../fastSmoothScroll';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent, detachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport findUpClassName from './findUpClassName';\n\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\nconst HANDLE_EVENT = 'keydown';\nconst ACTIVE_CLASS_NAME = 'active';\n\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\n\nexport type ListNavigationOptions = {\n list: HTMLElement,\n type: 'xy' | 'x' | 'y',\n onSelect: (target: Element) => void | boolean | Promise,\n once: boolean,\n waitForKey?: string[]\n};\n\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: ListNavigationOptions) {\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS));\n\n let target: Element;\n const getCurrentTarget = () => {\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\n };\n\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\n if(target === _target) {\n return;\n }\n\n let hadTarget = false;\n if(target) {\n hadTarget = true;\n target.classList.remove(ACTIVE_CLASS_NAME);\n }\n\n target = _target;\n if(!target) return;\n target.classList.add(ACTIVE_CLASS_NAME);\n\n if(hadTarget && scrollable && scrollTo) {\n fastSmoothScroll({\n container: scrollable,\n element: target as HTMLElement,\n position: 'center',\n forceDuration: 100,\n axis: type === 'x' ? 'x' : 'y'\n });\n }\n };\n\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\n let nextTarget: Element;\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\n\n return nextTarget;\n };\n\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\n const currentRect = currentTarget.getBoundingClientRect();\n\n let nextTarget = currentTarget[property] || list[endProperty];\n while(nextTarget !== currentTarget) {\n const targetRect = nextTarget.getBoundingClientRect();\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\n break;\n }\n\n nextTarget = nextTarget[property] || list[endProperty];\n }\n\n return nextTarget;\n };\n\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\n handleArrowKey = (currentTarget, key) => {\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\n };\n } else { // flex-direction: row | column;\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\n }\n\n let onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(!keyNames.has(key as any)) {\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\n cancelEvent(e);\n fireSelect(getCurrentTarget());\n }\n\n return;\n }\n\n cancelEvent(e);\n\n if(list.childElementCount > 1) {\n let currentTarget = getCurrentTarget();\n currentTarget = handleArrowKey(currentTarget, key as any);\n setCurrentTarget(currentTarget, true);\n }\n };\n\n const scrollable = findUpClassName(list, 'scrollable');\n list.classList.add('navigable-list');\n\n const onMouseMove = (e: MouseEvent) => {\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n };\n\n const onClick = (e: Event) => {\n cancelEvent(e); // cancel keyboard closening\n\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n fireSelect(getCurrentTarget());\n };\n\n const fireSelect = async(target: Element) => {\n const canContinue = await onSelect(target);\n if(canContinue !== undefined ? !canContinue : once) {\n detach();\n }\n };\n\n let attached = false;\n const attach = () => {\n if(attached) return;\n attached = true;\n // const input = document.activeElement as HTMLElement;\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n list.addEventListener('mousemove', onMouseMove, {passive: true});\n attachClickEvent(list, onClick);\n };\n\n const detach = () => {\n if(!attached) return;\n attached = false;\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n list.removeEventListener('mousemove', onMouseMove);\n detachClickEvent(list, onClick);\n };\n\n const resetTarget = () => {\n if(waitForKeySet) return;\n setCurrentTarget(list.firstElementChild, false);\n };\n\n if(waitForKeySet) {\n const _onKeyDown = onKeyDown;\n onKeyDown = (e) => {\n if(waitForKeySet.has(e.key)) {\n cancelEvent(e);\n\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n onKeyDown = _onKeyDown;\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n\n waitForKeySet = undefined;\n resetTarget();\n }\n };\n } else {\n resetTarget();\n }\n\n attach();\n\n return {\n attach,\n detach,\n resetTarget\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport attachListNavigation, {ListNavigationOptions} from '../../helpers/dom/attachListNavigation';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport SetTransition from '../singleTransition';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nexport default class AutocompleteHelper extends EventListenerBase<{\n hidden: () => void,\n visible: () => void,\n hiding: () => void\n}> {\n protected hidden = true;\n protected container: HTMLElement;\n protected list: HTMLElement;\n protected resetTarget: () => void;\n protected attach: () => void;\n protected detach: () => void;\n protected init?(): void;\n\n protected controller: AutocompleteHelperController;\n protected listType: 'xy' | 'x' | 'y';\n protected onSelect: ListNavigationOptions['onSelect'];\n protected waitForKey?: string[];\n\n protected navigationItem: NavigationItem;\n\n constructor(options: {\n appendTo: HTMLElement,\n controller?: AutocompleteHelper['controller'],\n listType: AutocompleteHelper['listType'],\n onSelect: AutocompleteHelper['onSelect'],\n waitForKey?: AutocompleteHelper['waitForKey']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\n\n options.appendTo.append(this.container);\n\n this.attachNavigation();\n\n this.controller && this.controller.addHelper(this);\n }\n\n public toggleListNavigation(enabled: boolean) {\n if(enabled) {\n this.attach && this.attach();\n } else {\n this.detach && this.detach();\n }\n }\n\n protected onVisible = () => {\n if(this.detach) { // it can be so because 'visible' calls before animation's end\n this.detach();\n }\n\n const list = this.list;\n const {attach, detach, resetTarget} = attachListNavigation({\n list,\n type: this.listType,\n onSelect: this.onSelect,\n once: true,\n waitForKey: this.waitForKey\n });\n\n this.attach = attach;\n this.detach = detach;\n this.resetTarget = resetTarget;\n if(!IS_MOBILE && !this.navigationItem) {\n this.navigationItem = {\n type: 'autocomplete-helper',\n onPop: () => {\n this.navigationItem = undefined;\n this.toggle(true);\n },\n noBlurOnPop: true\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n\n this.addEventListener('hidden', () => {\n this.resetTarget = undefined;\n this.attach = undefined;\n this.detach = undefined;\n\n list.innerHTML = '';\n detach();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n }, {once: true});\n };\n\n protected attachNavigation() {\n this.addEventListener('visible', this.onVisible);\n }\n\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\n if(this.init) {\n return;\n }\n\n if(hide === undefined) {\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\n }\n\n if(this.hidden === hide) {\n if(!hide) {\n this.dispatchEvent('visible'); // reset target and listener\n }\n\n return;\n }\n\n this.hidden = hide;\n\n if(!hide) {\n this.controller && this.controller.hideOtherHelpers(this);\n this.dispatchEvent('visible'); // fire it before so target will be set\n } else {\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n\n if(!fromController && this.controller) {\n this.controller.hideOtherHelpers();\n }\n\n if(this.detach) { // force detach here\n this.detach();\n }\n }\n\n const useRafs = this.controller || hide ? 0 : 2;\n\n if(hide) {\n this.dispatchEvent('hiding');\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: !hide,\n duration: rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0,\n onTransitionEnd: () => {\n this.hidden && this.dispatchEvent('hidden');\n },\n useRafs\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 Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class StickersHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private superStickerRenderer: SuperStickerRenderer;\n private lazyLoadQueue: LazyLoadQueue;\n private onChangeScreen: () => void;\n private listenerSetter: ListenerSetter;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n onSelect: async(target) => {\n return !(await EmoticonsDropdown.onMediaClick({target}, true));\n },\n waitForKey: ['ArrowUp', 'ArrowDown']\n });\n\n this.container.classList.add('stickers-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n\n rootScope.dispatchEvent('choosing_sticker', true);\n });\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n\n this.listenerSetter.removeAll();\n this.listenerSetter = undefined;\n }\n\n rootScope.dispatchEvent('choosing_sticker', false);\n });\n }\n\n public checkEmoticon(emoticon: string) {\n const middleware = this.controller.getMiddleware();\n\n if(this.lazyLoadQueue) {\n this.lazyLoadQueue.clear();\n }\n\n preloadAnimatedEmojiSticker(emoticon);\n this.managers.appStickersManager.getStickersByEmoticon(emoticon)\n .then((stickers) => {\n if(!middleware()) {\n return;\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const container = this.list.cloneNode() as HTMLElement;\n\n let ready: Promise;\n\n this.lazyLoadQueue.clear();\n if(stickers.length) {\n ready = new Promise((resolve) => {\n const promises: Promise[] = [];\n stickers.forEach((sticker) => {\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\n });\n\n (Promise.all(promises) as Promise).finally(resolve);\n });\n } else {\n ready = Promise.resolve();\n }\n\n ready.then(() => {\n this.list.replaceWith(container);\n this.list = container;\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n\n this.listenerSetter = new ListenerSetter();\n attachStickerViewerListeners({listenTo: this.container, listenerSetter: this.listenerSetter});\n }\n\n this.onChangeScreen();\n\n this.toggle(!stickers.length);\n this.scrollable.scrollTop = 0;\n });\n });\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, this.chat.animationGroup, this.managers);\n }\n}\n","/*\n * 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 {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport Button from '../button';\nimport PopupDatePicker from './datePicker';\n\nconst getMinDate = () => {\n const date = new Date();\n // date.setDate(date.getDate() - 1);\n date.setHours(0, 0, 0, 0);\n return date;\n};\n\nconst getMaxDate = () => {\n const date = new Date();\n date.setFullYear(date.getFullYear() + 1);\n date.setDate(date.getDate() - 1);\n return date;\n};\n\nconst checkDate = (date: Date) => {\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\n};\n\nexport default class PopupSchedule extends PopupDatePicker {\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\n super(checkDate(initDate), onPick, {\n noButtons: true,\n noTitle: true,\n closable: true,\n withConfirm: true,\n minDate: getMinDate(),\n maxDate: getMaxDate(),\n withTime: true,\n showOverflowMonths: true,\n confirmShortcutIsSendShortcut: true,\n title: true\n });\n\n this.element.classList.add('popup-schedule');\n this.header.append(this.controlsDiv);\n this.title.replaceWith(this.monthTitle);\n this.body.append(this.btnConfirm);\n\n if(canSendWhenOnline) {\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\n this.body.append(btnSendWhenOnline);\n\n attachClickEvent(btnSendWhenOnline, () => {\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\n this.hide();\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 ChatInput from './input';\nimport {appendEmoji, getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport {ScrollableX} from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class EmojiHelper extends AutocompleteHelper {\n private scrollable: ScrollableX;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'x',\n onSelect: (target) => {\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\n }\n });\n\n this.container.classList.add('emoji-helper');\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\n\n this.container.append(this.list);\n\n this.scrollable = new ScrollableX(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollLeft = 0;\n }, 0);\n });\n }\n\n public render(emojis: string[], waitForKey: boolean) {\n if(this.init) {\n if(!emojis.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n emojis = emojis.slice(0, 80);\n\n if(emojis.length) {\n this.list.innerHTML = '';\n emojis.forEach((emoji) => {\n appendEmoji(emoji, this.list, false, true);\n });\n }\n\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\n this.toggle(!emojis.length);\n\n /* window.requestAnimationFrame(() => {\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\n }); */\n }\n\n public checkQuery(query: string, firstChar: string) {\n const middleware = this.controller.getMiddleware();\n this.managers.appEmojiManager.getBothEmojiKeywords().then(async() => {\n if(!middleware()) {\n return;\n }\n\n const q = query.replace(/^:/, '');\n const emojis = await this.managers.appEmojiManager.searchEmojis(q);\n if(!middleware()) {\n return;\n }\n\n this.render(emojis, firstChar !== ':');\n // console.log(emojis);\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 wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport PeerTitle from '../peerTitle';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\n protected static BASE_CLASS = 'autocomplete-peer-helper';\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\n private scrollable: Scrollable;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n protected className: string,\n onSelect: (target: Element) => boolean | void\n ) {\n super({\n appendTo,\n controller,\n listType: 'y',\n onSelect\n });\n\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n }\n\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\n if(this.init) {\n if(!data.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n if(data.length) {\n this.list.innerHTML = '';\n data.forEach((d) => {\n const div = AutocompletePeerHelper.listElement({\n className: this.className,\n peerId: d.peerId,\n name: d.name,\n description: d.description\n });\n\n this.list.append(div);\n });\n }\n\n if(!doNotShow) {\n this.toggle(!data.length);\n }\n }\n\n public static listElement(options: {\n className: string,\n peerId: PeerId,\n name?: string,\n description?: string\n }) {\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\n options.className += '-list-element';\n\n const div = document.createElement('div');\n div.classList.add(BASE, options.className);\n div.dataset.peerId = '' + options.peerId;\n\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\n avatar.updateWithOptions({\n isDialog: false,\n peerId: options.peerId\n });\n\n const name = document.createElement('div');\n name.classList.add(BASE + '-name', options.className + '-name');\n if(!options.name) {\n name.append(new PeerTitle({\n peerId: options.peerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element);\n } else {\n setInnerHTML(name, wrapEmojiText(options.name));\n }\n\n div.append(avatar, name);\n\n if(options.description) {\n const description = document.createElement('div');\n description.classList.add(BASE + '-description', options.className + '-description');\n setInnerHTML(description, wrapEmojiText(options.description));\n div.append(description);\n }\n\n return div;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport type {BotInfo, ChatFull, UserFull} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport SearchIndex from '../../lib/searchIndex';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport function processPeerFullForCommands(peerId: PeerId, full: ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull, query?: string) {\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n let index: SearchIndex;\n\n if(query !== undefined) {\n index = new SearchIndex({\n ignoreCase: true\n });\n }\n\n type T = {peerId: PeerId, name: string, description: string, index: number, command: string};\n const commands: Map = new Map();\n botInfos.forEach((botInfo) => {\n if(!botInfo.commands) {\n return;\n }\n\n botInfo.commands.forEach(({command, description}, idx) => {\n const c = '/' + command;\n commands.set(command, {\n peerId: botInfo.user_id ? botInfo.user_id.toPeerId(false) : peerId,\n command: command,\n name: c,\n description: description,\n index: idx\n });\n\n if(index) {\n index.indexObject(command, c);\n }\n });\n });\n\n let out: T[];\n if(!index) {\n out = [...commands.values()];\n } else {\n const found = index.search(query);\n out = Array.from(found).map((command) => commands.get(command));\n }\n\n out = out.sort((a, b) => commands.get(a.command).index - commands.get(b.command).index);\n\n return out;\n}\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo,\n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public async checkQuery(query: string, peerId: PeerId) {\n if(!(await this.managers.appUsersManager.isBot(peerId))) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getProfileByPeerId(peerId).then((full) => {\n if(!middleware()) {\n return;\n }\n\n const filtered = processPeerFullForCommands(peerId, full, query);\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getMiddleware} from '../../helpers/middleware';\nimport AutocompleteHelper from './autocompleteHelper';\n\nexport default class AutocompleteHelperController {\n private helpers: Set = new Set();\n private middleware = getMiddleware();\n /* private tempId = 0;\n\n public incrementToggleCount() {\n return ++this.tempId;\n }\n\n public getToggleCount() {\n return this.tempId;\n } */\n\n public toggleListNavigation(enabled: boolean) {\n for(const helper of this.helpers) {\n helper.toggleListNavigation(enabled);\n }\n }\n\n public getMiddleware() {\n this.middleware.clean();\n return this.middleware.get();\n }\n\n public addHelper(helper: AutocompleteHelper) {\n this.helpers.add(helper);\n }\n\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\n this.helpers.forEach((helper) => {\n if(helper !== preserveHelper) {\n helper.toggle(true, true);\n }\n });\n\n if(!preserveHelper) {\n this.middleware.clean();\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 ChatInput from './input';\nimport type {MessageEntity} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport rootScope from '../../lib/rootScope';\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(\n appendTo,\n controller,\n 'mentions-helper',\n (target) => {\n const userId = (target as HTMLElement).dataset.peerId.toUserId();\n const user = Promise.resolve(managers.appUsersManager.getUser(userId)).then((user) => {\n let str = '', entity: MessageEntity;\n const usernames = getPeerActiveUsernames(user);\n if(usernames[0]) {\n str = '@' + usernames[0];\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(async(peerIds) => {\n if(!middleware()) return;\n\n peerIds = peerIds.filter((peerId) => peerId !== rootScope.myId);\n\n // const username = trimmed.slice(1).toLowerCase();\n\n const p = peerIds.map(async(peerId) => {\n const user = await this.managers.appUsersManager.getUser(peerId);\n const usernames = getPeerActiveUsernames(user);\n // if(usernames.length && usernames.some((_username) => _username.toLowerCase() === username)) { // hide full matched suggestion\n // return;\n // }\n\n return {\n peerId,\n description: usernames[0] ? '@' + usernames[0] : undefined\n };\n });\n\n this.render((await Promise.all(p)).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport {KeyboardButton, ReplyMarkup} from '../../layer';\nimport rootScope from '../../lib/rootScope';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport confirmationPopup from '../confirmationPopup';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport Scrollable from '../scrollable';\n\nexport default class ReplyKeyboard extends DropdownHover {\n private static BASE_CLASS = 'reply-keyboard';\n private appendTo: HTMLElement;\n private listenerSetter: ListenerSetter;\n private managers: AppManagers;\n private btnHover: HTMLElement;\n private peerId: PeerId;\n private touchListener: Listener;\n private chatInput: ChatInput;\n private scrollable: Scrollable;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n managers: AppManagers,\n appendTo: HTMLElement,\n btnHover: HTMLElement,\n chatInput: ChatInput\n }) {\n super({\n element: document.createElement('div')\n });\n\n safeAssign(this, options);\n\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\n this.element.style.display = 'none';\n\n this.scrollable = new Scrollable();\n this.element.append(this.scrollable.container);\n\n this.attachButtonListener(this.btnHover, this.listenerSetter);\n this.listenerSetter.add(rootScope)('history_reply_markup', async({peerId}) => {\n if(this.peerId === peerId) {\n if(this.checkAvailability() && this.isActive()) {\n await this.render();\n }\n\n getHeavyAnimationPromise().then(() => {\n this.checkForceReply();\n });\n }\n });\n }\n\n public init() {\n this.appendTo.append(this.element);\n\n this.listenerSetter.add(this)('open', async() => {\n await this.render();\n\n if(IS_TOUCH_SUPPORTED) {\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\n this.listenerSetter.add(this)('close', () => {\n this.listenerSetter.remove(this.touchListener);\n }, {once: true});\n }\n });\n\n attachClickEvent(this.element, (e) => {\n const target = findUpClassName(e.target, 'btn');\n if(!target) {\n return;\n }\n\n const type = target.dataset.type as KeyboardButton['_'];\n const {peerId} = this;\n switch(type) {\n case 'keyboardButtonRequestPhone': {\n confirmationPopup({\n titleLangKey: 'ShareYouPhoneNumberTitle',\n button: {\n langKey: 'OK'\n },\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\n }).then(() => {\n this.managers.appMessagesManager.sendContact(peerId, rootScope.myId);\n });\n break;\n }\n\n default: {\n this.managers.appMessagesManager.sendText(peerId, target.dataset.text);\n break;\n }\n }\n\n this.toggle(false);\n }, {listenerSetter: this.listenerSetter});\n\n return super.init();\n }\n\n private onBodyTouchStart = (e: TouchEvent) => {\n const target = e.touches[0].target as HTMLElement;\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\n cancelEvent(e);\n this.toggle(false);\n }\n };\n\n public async checkForceReply() {\n const replyMarkup = await this.getReplyMarkup();\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\n !replyMarkup.pFlags.hidden &&\n !replyMarkup.pFlags.used) {\n replyMarkup.pFlags.used = true;\n this.chatInput.initMessageReply(replyMarkup.mid);\n }\n }\n\n private async getReplyMarkup() {\n return (await this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup ?? {\n _: 'replyKeyboardHide'\n };\n }\n\n public async render(replyMarkup?: ReplyMarkup.replyKeyboardMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup() as any;\n }\n\n this.scrollable.container.replaceChildren();\n\n for(const row of replyMarkup.rows) {\n const div = document.createElement('div');\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\n\n for(const button of row.buttons) {\n const btn = document.createElement('button');\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\n setInnerHTML(btn, wrapEmojiText(button.text));\n btn.dataset.text = button.text;\n btn.dataset.type = button._;\n div.append(btn);\n }\n\n this.scrollable.container.append(div);\n }\n }\n\n public async checkAvailability(replyMarkup?: ReplyMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup();\n }\n\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\n this.btnHover.classList.toggle('hide', hide);\n\n if(hide) {\n this.toggle(false);\n }\n\n return !hide;\n }\n\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n this.checkAvailability();\n this.checkForceReply();\n }\n}\n","/*\n * 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';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport Button from '../button';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport assumeType from '../../helpers/assumeType';\nimport GifsMasonry from '../gifsMasonry';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport generateQId from '../../lib/appManagers/utils/inlineBots/generateQId';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport wrapPhoto from '../wrappers/photo';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'INLINE-HELPER';\n// const GRID_ITEMS = 5;\n\nexport default class InlineHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private lazyLoadQueue: LazyLoadQueue;\n private gifsMasonry: GifsMasonry;\n private superStickerRenderer: SuperStickerRenderer;\n private onChangeScreen: () => void;\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n waitForKey: ['ArrowUp', 'ArrowDown'],\n onSelect: (target) => {\n if(!target) return false; // can happen when there is only button\n const {peerId, botId, queryId} = this.list.dataset;\n return this.chat.input.getReadyToSend(() => {\n const queryAndResultIds = generateQId(queryId, (target as HTMLElement).dataset.resultId);\n this.managers.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\n ...this.chat.getMessageSendingParams(),\n clearDraft: true\n });\n\n this.chat.input.onMessageSent(true, true);\n });\n }\n });\n\n this.container.classList.add('inline-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n }\n });\n }\n\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\n const middleware = this.controller.getMiddleware();\n\n const peer = await this.managers.appUsersManager.resolveUsername(username);\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(peer._ !== 'user' || !peer.pFlags.bot) {\n throw 'NOT_A_BOT';\n }\n\n const renderPromise = this.managers.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then((botResults) => {\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const list = this.list.cloneNode() as HTMLElement;\n list.dataset.peerId = '' + peerId;\n list.dataset.botId = '' + peer.id;\n list.dataset.queryId = '' + botResults.query_id;\n\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\n\n this.lazyLoadQueue.clear();\n this.superStickerRenderer.clear();\n\n const loadPromises: Promise[] = [];\n const isGallery = !!botResults.pFlags.gallery;\n // botResults.results.length = 3;\n for(const item of botResults.results) {\n const container = document.createElement('div');\n container.classList.add('inline-helper-result');\n container.dataset.resultId = item.id;\n\n const preview = isGallery ? undefined : document.createElement('div');\n if(preview) {\n preview.classList.add('inline-helper-result-preview');\n\n container.append(preview);\n }\n\n list.append(container);\n\n if(!isGallery) {\n preview.classList.add('empty');\n setInnerHTML(preview, wrapEmojiText([...item.title.trim()][0]));\n\n const title = document.createElement('div');\n title.classList.add('inline-helper-result-title');\n setInnerHTML(title, wrapEmojiText(item.title));\n\n const description = document.createElement('div');\n description.classList.add('inline-helper-result-description');\n setInnerHTML(description, wrapRichText(item.description, {\n noCommands: true,\n noLinks: true\n }));\n\n container.append(title, description);\n\n const separator = document.createElement('div');\n separator.classList.add('inline-helper-separator');\n\n list.append(separator);\n } else {\n container.classList.add('grid-item');\n }\n\n if(item._ === 'botInlineResult') {\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\n let mediaContainer: HTMLElement;\n if(preview) {\n mediaContainer = document.createElement('div');\n preview.append(mediaContainer);\n } else {\n mediaContainer = container;\n }\n\n mediaContainer.classList.add('media-container');\n isGallery && mediaContainer.classList.add('no-border-radius');\n\n this.lazyLoadQueue.push({\n div: container,\n load: () => {\n return appDownloadManager.download({\n dcId: 4,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\n url: item.thumb.url\n },\n size: item.thumb.size,\n mimeType: item.thumb.mime_type\n }).then((blob) => {\n const image = new Image();\n image.classList.add('media-photo');\n readBlobAsDataURL(blob).then((dataURL) => {\n renderMediaWithFadeIn(mediaContainer, image, dataURL, true);\n });\n });\n }\n });\n }\n } else {\n const media = item.document as MyDocument || item.photo as MyPhoto;\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\n assumeType(media);\n\n if(media.type === 'gif') {\n gifsMasonry.add(media, container);\n } else if(media.type === 'sticker') {\n container.classList.add('super-sticker');\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\n if(media.animated) {\n this.superStickerRenderer.observeAnimated(container);\n }\n }\n } else if(media) {\n const size = isGallery ? 48 : undefined;\n isGallery && container.classList.add('no-border-radius');\n wrapPhoto({\n photo: media,\n container: isGallery ? container : preview,\n boxWidth: size,\n boxHeight: size,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises\n });\n }\n }\n }\n\n return Promise.all(loadPromises).then(() => {\n if(!middleware()) {\n gifsMasonry.clear();\n return;\n }\n\n list.classList.toggle('is-gallery', isGallery);\n list.classList.toggle('super-stickers', isGallery);\n this.container.classList.toggle('is-gallery', isGallery);\n\n /* if(isGallery) {\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\n }\n\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\n\n const parent = this.list.parentElement;\n parent.textContent = '';\n if(botResults.switch_pm) {\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\n setInnerHTML(btnSwitchToPM, wrapEmojiText(botResults.switch_pm.text));\n attachClickEvent(btnSwitchToPM, (e) => {\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\n });\n parent.append(btnSwitchToPM);\n }\n parent.append(this.list = list);\n\n if(this.gifsMasonry) {\n this.gifsMasonry.detach();\n }\n this.gifsMasonry = gifsMasonry;\n gifsMasonry.attach();\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n if(this.list.classList.contains('is-gallery')) {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n } else {\n this.list.style.width = '';\n }\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n }\n\n this.onChangeScreen();\n\n this.toggle(!botResults.results.length && !botResults.switch_pm);\n this.scrollable.scrollTop = 0;\n });\n });\n\n return {user: peer, renderPromise};\n };\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('inline-helper-results');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP, this.managers);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport callbackify from '../../helpers/callbackify';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {processPeerFullForCommands} from './commandsHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst CLASS_NAME = 'bot-commands';\nexport default class ChatBotCommands extends AutocompletePeerHelper {\n private userId: UserId;\n\n constructor(\n appendTo: HTMLElement,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo, undefined, CLASS_NAME, (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n this.toggle(true);\n });\n });\n }\n\n public setUserId(userId: UserId, middleware: () => boolean) {\n if(this.userId === userId && this.list?.childElementCount) {\n this.toggle(false);\n return;\n }\n\n this.userId = userId;\n return callbackify(this.managers.appProfileManager.getProfile(userId), (full) => {\n if(!middleware()) return;\n const filtered = processPeerFullForCommands(userId.toPeerId(false), full);\n\n const PADDING_TOP = 8;\n // const PADDING_BOTTOM = 8;\n const PADDING_BOTTOM = 24;\n const height = filtered.length * 50 + PADDING_TOP + PADDING_BOTTOM;\n this.container.style.setProperty('--height', height + 'px');\n\n this.render(filtered);\n\n // this.container.style.top =\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AckedResult} from '../lib/mtproto/superMessagePort';\nimport {Modify} from '../types';\n\nexport default async function modifyAckedResult(acked: AckedResult): Promise, {result: T | Promise}>> {\n return {\n cached: acked.cached,\n result: acked.cached ? await acked.result : acked.result\n };\n}\n\nexport function modifyAckedPromise(promise: Promise>) {\n return promise.then(modifyAckedResult);\n}\n","/*\n * 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 callbackify from '../../helpers/callbackify';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport {ChatFull} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n} from '../../lib/langPack';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport PeerTitle from '../peerTitle';\nimport SetTransition from '../singleTransition';\nimport getChatMembersString from '../wrappers/getChatMembersString';\n\nconst SEND_AS_ANIMATION_DURATION = 300;\n\nexport default class ChatSendAs {\n private avatar: AvatarElement;\n private container: HTMLElement;\n private closeBtn: HTMLElement;\n private btnMenu: HTMLElement;\n private sendAsPeerIds: PeerId[];\n private sendAsPeerId: PeerId;\n private updatingPromise: ReturnType;\n private middleware: ReturnType;\n private listenerSetter: ListenerSetter;\n private peerId: PeerId;\n private addedListener: boolean;\n private buttons: ButtonMenuItemOptions[];\n\n constructor(\n private managers: AppManagers,\n private onReady: (container: HTMLElement, skipAnimation?: boolean) => void,\n private onChange: (sendAsPeerId: PeerId) => void\n ) {\n this.middleware = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.construct();\n }\n\n private construct() {\n this.container = document.createElement('div');\n this.container.classList.add('new-message-send-as-container');\n\n this.closeBtn = document.createElement('div');\n this.closeBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\n\n const sendAsButtons: ButtonMenuItemOptions[] = [{\n text: 'SendMessageAsTitle',\n onClick: undefined\n }];\n\n this.buttons = [];\n\n let previousAvatar: HTMLElement;\n const onSendAsMenuToggle = (visible: boolean) => {\n if(visible) {\n previousAvatar = this.avatar;\n }\n\n const isChanged = this.avatar !== previousAvatar;\n const useRafs = !visible && isChanged ? 2 : 0;\n\n SetTransition({\n element: this.closeBtn,\n className: 'is-visible',\n forwards: visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n if(!isChanged) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: !visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n }\n };\n\n ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n container: this.container,\n direction: 'top-right',\n buttons: sendAsButtons,\n onOpenBefore: () => {\n onSendAsMenuToggle(true);\n },\n onOpen: (e, btnMenu) => {\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\n this.btnMenu = btnMenu as any;\n this.btnMenu.classList.add('scrollable', 'scrollable-y');\n this.btnMenu.append(...this.buttons.map((button) => button.element));\n },\n onClose: () => {\n onSendAsMenuToggle(false);\n },\n onCloseAfter: () => {\n this.btnMenu = undefined;\n }\n });\n\n this.container.append(this.closeBtn);\n }\n\n private async updateButtons(peerIds: PeerId[]) {\n const promises: Promise[] = peerIds.map(async(sendAsPeerId, idx) => {\n const textElement = document.createElement('div');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('btn-menu-item-subtitle');\n if(sendAsPeerId.isUser()) {\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\n } else if(sendAsPeerId === this.peerId) {\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\n } else {\n subtitle.append(await getChatMembersString(sendAsPeerId.toChatId()));\n }\n\n textElement.append(\n new PeerTitle({peerId: sendAsPeerId}).element,\n subtitle\n );\n\n return {\n onClick: idx ? async() => {\n const currentPeerId = this.peerId;\n this.changeSendAsPeerId(sendAsPeerId);\n\n const middleware = this.middleware.get();\n const executeButtonsUpdate = () => {\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\n const peerIds = this.sendAsPeerIds.slice();\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n };\n\n if(rootScope.settings.animationsEnabled) {\n setTimeout(executeButtonsUpdate, 250);\n } else {\n executeButtonsUpdate();\n }\n\n // return;\n this.managers.appMessagesManager.saveDefaultSendAs(currentPeerId, sendAsPeerId);\n } : undefined,\n textElement\n };\n });\n\n const buttons = await Promise.all(promises);\n const btnMenu = ButtonMenuSync({buttons}/* , this.listenerSetter */);\n buttons.forEach((button, idx) => {\n const peerId = peerIds[idx];\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-26', 'btn-menu-item-icon');\n avatar.updateWithOptions({peerId});\n\n if(!idx) {\n avatar.classList.add('active');\n }\n\n button.element.prepend(avatar);\n });\n\n this.buttons = buttons;\n\n // if already opened\n this.btnMenu?.append(...this.buttons.map((button) => button.element));\n }\n\n private async updateAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n const previousAvatar = this.avatar;\n if(previousAvatar) {\n if(previousAvatar.peerId === sendAsPeerId) {\n return;\n }\n }\n\n if(!previousAvatar) {\n skipAnimation = true;\n }\n\n const useRafs = skipAnimation ? 0 : 2;\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\n const avatar = this.avatar = new AvatarElement();\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\n await avatar.updateWithOptions({\n isDialog: false,\n peerId: sendAsPeerId\n });\n\n SetTransition({\n element: avatar,\n className: 'is-visible',\n forwards: true,\n duration,\n useRafs\n });\n if(previousAvatar) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: false,\n duration,\n onTransitionEnd: () => {\n previousAvatar.remove();\n },\n useRafs\n });\n }\n\n this.container.append(avatar);\n }\n\n private changeSendAsPeerId(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n this.sendAsPeerId = sendAsPeerId;\n this.onChange(sendAsPeerId);\n return this.updateAvatar(sendAsPeerId, skipAnimation);\n }\n\n private getDefaultSendAs(): Promise> {\n // return rootScope.myId;\n return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((acked) => {\n return {\n cached: acked.cached,\n result: acked.result.then((channelFull) => {\n return channelFull.default_send_as ? getPeerId(channelFull.default_send_as) : undefined\n })\n };\n });\n }\n\n public async updateManual(skipAnimation?: boolean): Promise<() => void> {\n const peerId = this.peerId;\n if(this.updatingPromise || !(await this.managers.appPeersManager.isChannel(peerId))) {\n return;\n }\n\n const middleware = this.middleware.get(() => {\n return !this.updatingPromise || this.updatingPromise === updatingPromise;\n });\n\n const {container} = this;\n const chatId = peerId.toChatId();\n const result = (await modifyAckedPromise(this.getDefaultSendAs())).result;\n // const result = Promise.resolve(this.getDefaultSendAs());\n\n const wasSkippingAnimation = skipAnimation;\n if(result instanceof Promise) {\n skipAnimation = undefined;\n }\n\n const auto = wasSkippingAnimation && !skipAnimation;\n\n const updatingPromise = this.updatingPromise = callbackify(result, async(sendAsPeerId) => {\n if(!middleware() || sendAsPeerId === undefined) return;\n\n await this.changeSendAsPeerId(sendAsPeerId, skipAnimation);\n if(!middleware()) return;\n\n this.managers.appChatsManager.getSendAs(chatId).then((sendAsPeers) => {\n if(!middleware()) return;\n\n const peers = sendAsPeers.filter((sendAsPeer) => !sendAsPeer.pFlags.premium_required).map((sendAsPeer) => sendAsPeer.peer);\n const peerIds = peers.map((peer) => getPeerId(peer));\n this.sendAsPeerIds = peerIds.slice();\n\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n });\n\n const callback = () => {\n this.onReady(container, skipAnimation);\n\n if(!this.addedListener) {\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.update();\n }\n });\n\n this.addedListener = true;\n }\n };\n\n if(auto) {\n callback();\n return;\n }\n\n return callback;\n });\n\n updatingPromise.finally(() => {\n if(this.updatingPromise === updatingPromise) {\n this.updatingPromise = undefined;\n }\n });\n\n if(!auto) {\n return updatingPromise;\n }\n }\n\n public update(skipAnimation?: boolean) {\n return this.updateManual(skipAnimation).then((callback) => callback?.());\n }\n\n public setPeerId(peerId?: PeerId) {\n /* if(this.avatar) {\n this.avatar.remove();\n this.avatar = undefined;\n } */\n\n this.middleware.clean();\n this.updatingPromise = undefined;\n this.peerId = peerId;\n }\n\n public destroy() {\n this.container.remove();\n this.setPeerId();\n this.listenerSetter.removeAll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport BOM from '../helpers/string/bom';\nimport {_i18n} from '../lib/langPack';\nimport InputField, {InputFieldOptions} from './inputField';\nimport SetTransition from './singleTransition';\n\nconst USELESS_REG_EXP = new RegExp(`(${BOM})|()`, 'g');\n\nexport default class InputFieldAnimated extends InputField {\n public inputFake: HTMLElement;\n\n // public onLengthChange: (length: number, isOverflow: boolean) => void;\n // protected wasInputFakeClientHeight: number;\n // protected showScrollDebounced: () => void;\n\n constructor(options?: InputFieldOptions) {\n super(options);\n\n this.input.addEventListener('input', () => {\n this.updateInnerHTML();\n this.onFakeInput();\n });\n\n if(options.placeholder) {\n _i18n(this.inputFake, options.placeholder, undefined, 'placeholder');\n }\n\n this.input.classList.add('scrollable', 'scrollable-y');\n // this.wasInputFakeClientHeight = 0;\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\n this.inputFake = document.createElement('div');\n // this.inputFake.contentEditable = 'true';\n this.inputFake.contentEditable = 'true';\n this.inputFake.tabIndex = -1;\n this.inputFake.className = this.input.className + ' input-field-input-fake';\n }\n\n public onFakeInput(setHeight = true) {\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\n this.showScrollDebounced();\n } */\n\n const currentHeight = +this.input.style.height.replace('px', '');\n if(currentHeight === newHeight) {\n return;\n }\n\n const TRANSITION_DURATION_FACTOR = 50;\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight))\n );\n\n // this.wasInputFakeClientHeight = clientHeight;\n this.input.style.transitionDuration = `${transitionDuration}ms`;\n\n if(setHeight) {\n this.input.style.height = newHeight ? newHeight + 'px' : '';\n }\n\n const className = 'is-changing-height';\n SetTransition({\n element: this.input,\n className,\n forwards: true,\n duration: transitionDuration,\n onTransitionEnd: () => {\n this.input.classList.remove(className);\n }\n });\n }\n\n protected updateInnerHTML(innerHTML = this.input.innerHTML) {\n innerHTML = innerHTML.replace(//, '')\n .replace(/().+?\\/custom-emoji-element>/g, '$1')\n\n if(USING_BOMS) {\n innerHTML = innerHTML.replace(USELESS_REG_EXP, '');\n }\n\n this.inputFake.innerHTML = innerHTML;\n }\n\n public setValueSilently(value: Parameters[0], fromSet?: boolean) {\n super.setValueSilently(value, fromSet);\n\n this.updateInnerHTML();\n if(!fromSet) {\n this.onFakeInput();\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 {markdownTags, MarkdownType} from './getRichElementValue';\n\nexport default function hasMarkupInSelection(types: T[]) {\n const result: Record = {} as any;\n types.forEach((tag) => result[tag] = false);\n const selection = window.getSelection();\n if(!selection.isCollapsed) {\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n const treeWalker = document.createTreeWalker(\n (commonAncestor.nodeType === commonAncestor.ELEMENT_NODE ? commonAncestor as HTMLElement : (commonAncestor as ChildNode).parentElement).closest('[contenteditable=\"true\"]'),\n NodeFilter.SHOW_ELEMENT,\n {acceptNode: (node) => range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let element: HTMLElement;\n while(element = treeWalker.nextNode() as HTMLElement) {\n for(const type of types) {\n if(result[type]) {\n continue;\n }\n\n const tag = markdownTags[type];\n if(element.matches(tag.match)) {\n result[type] = true;\n }\n }\n }\n }\n\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type {AppImManager} from '../../lib/appManagers/appImManager';\nimport type {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport type Chat from './chat';\nimport Recorder from '../../../public/recorder.min';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n// import Recorder from '../opus-recorder/dist/recorder.min';\nimport opusDecodeController from '../../lib/opusDecodeController';\nimport {ButtonMenuItemOptions, ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from '../buttonMenu';\nimport emoticonsDropdown from '../emoticonsDropdown';\nimport PopupCreatePoll from '../popups/createPoll';\nimport PopupForward from '../popups/forward';\nimport PopupNewMedia from '../popups/newMedia';\nimport {toast, toastNew} from '../toast';\nimport {MessageEntity, DraftMessage, WebPage, Message, UserFull, AttachMenuPeerType} from '../../layer';\nimport StickersHelper from './stickersHelper';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport Button from '../button';\nimport PopupSchedule from '../popups/schedule';\nimport SendMenu from './sendContextMenu';\nimport rootScope from '../../lib/rootScope';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport tsNow from '../../helpers/tsNow';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE, IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport I18n, {i18n, join, LangPackKey} from '../../lib/langPack';\nimport {generateTail} from './bubbles';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ButtonCorner from '../buttonCorner';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport cancelSelection from '../../helpers/dom/cancelSelection';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\nimport EmojiHelper from './emojiHelper';\nimport CommandsHelper from './commandsHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompleteHelper from './autocompleteHelper';\nimport MentionsHelper from './mentionsHelper';\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\nimport ReplyKeyboard from './replyKeyboard';\nimport InlineHelper from './inlineHelper';\nimport debounce from '../../helpers/schedulers/debounce';\nimport noop from '../../helpers/noop';\nimport {putPreloader} from '../putPreloader';\nimport SetTransition from '../singleTransition';\nimport PeerTitle from '../peerTitle';\nimport {fastRaf} from '../../helpers/schedulers';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport fixSafariStickyInputFocusing, {IS_STICKY_INPUT_BUGGED} from '../../helpers/dom/fixSafariStickyInputFocusing';\nimport PopupPeer from '../popups/peer';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport {BOT_START_PARAM, NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport setCaretAt from '../../helpers/dom/setCaretAt';\nimport CheckboxField from '../checkboxField';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport RadioForm from '../radioForm';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport callbackify from '../../helpers/callbackify';\nimport ChatBotCommands from './botCommands';\nimport copy from '../../helpers/object/copy';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\nimport PopupElement from '../popups';\nimport getEmojiEntityFromEmoji from '../../lib/richTextProcessor/getEmojiEntityFromEmoji';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport parseMarkdown from '../../lib/richTextProcessor/parseMarkdown';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\nimport wrapDraft from '../wrappers/draft';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport ChatSendAs from './sendAs';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport InputFieldAnimated from '../inputFieldAnimated';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport PopupStickers from '../popups/stickers';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport {getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {insertRichTextAsHTML} from '../inputField';\nimport getCaretPosNew from '../../helpers/dom/getCaretPosNew';\nimport draftsAreEqual from '../../lib/appManagers/utils/drafts/draftsAreEqual';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport getAttachMenuBotIcon from '../../lib/appManagers/utils/attachMenuBots/getAttachMenuBotIcon';\nimport TelegramWebView from '../telegramWebView';\n\nconst RECORD_MIN_TIME = 500;\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\n\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\n\nexport default class ChatInput {\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\n public messageInput: HTMLElement;\n public messageInputField: InputFieldAnimated;\n private fileInput: HTMLInputElement;\n private inputMessageContainer: HTMLDivElement;\n private btnSend: HTMLButtonElement;\n private btnCancelRecord: HTMLButtonElement;\n private lastUrl = '';\n private lastTimeType = 0;\n\n public chatInput: HTMLElement;\n public inputContainer: HTMLElement;\n public rowsWrapper: HTMLDivElement;\n private newMessageWrapper: HTMLDivElement;\n private btnToggleEmoticons: HTMLButtonElement;\n private btnToggleReplyMarkup: HTMLButtonElement;\n private btnSendContainer: HTMLDivElement;\n\n private replyKeyboard: ReplyKeyboard;\n\n private attachMenu: HTMLElement;\n private attachMenuButtons: ButtonMenuItemOptionsVerifiable[];\n\n private sendMenu: SendMenu;\n\n private replyElements: {\n container: HTMLElement,\n cancelBtn: HTMLButtonElement,\n iconBtn: HTMLButtonElement\n } = {} as any;\n\n private forwardElements: {\n changePeer: ButtonMenuItemOptions,\n showSender: ButtonMenuItemOptions,\n hideSender: ButtonMenuItemOptions,\n showCaption: ButtonMenuItemOptions,\n hideCaption: ButtonMenuItemOptions,\n container: HTMLElement,\n modifyArgs?: ButtonMenuItemOptions[]\n };\n private forwardHover: DropdownHover;\n private forwardWasDroppingAuthor: boolean;\n\n private getWebPagePromise: Promise;\n private willSendWebPage: WebPage = null;\n private forwarding: {[fromPeerId: PeerId]: number[]};\n public replyToMsgId: number;\n public editMsgId: number;\n public editMessage: Message.message;\n private noWebPage: true;\n public scheduleDate: number;\n public sendSilent: true;\n public startParam: string;\n\n private recorder: any;\n public recording = false;\n private recordCanceled = false;\n private recordTimeEl: HTMLElement;\n private recordRippleEl: HTMLElement;\n private recordStartTime = 0;\n private recordingOverlayListener: Listener;\n private recordingNavigationItem: NavigationItem;\n\n // private scrollTop = 0;\n // private scrollOffsetTop = 0;\n // private scrollDiff = 0;\n\n public helperType: Exclude;\n private helperFunc: () => void | Promise;\n private helperWaitingForward: boolean;\n\n public willAttachType: 'document' | 'media';\n\n private lockRedo = false;\n private canRedoFromHTML = '';\n private readonly undoHistory: string[] = [];\n private readonly executedHistory: string[] = [];\n private canUndoFromHTML = '';\n\n private autocompleteHelperController: AutocompleteHelperController;\n private stickersHelper: StickersHelper;\n private emojiHelper: EmojiHelper;\n private commandsHelper: CommandsHelper;\n private mentionsHelper: MentionsHelper;\n private inlineHelper: InlineHelper;\n private listenerSetter: ListenerSetter;\n\n private pinnedControlBtn: HTMLButtonElement;\n\n private goDownBtn: HTMLButtonElement;\n private goDownUnreadBadge: HTMLElement;\n private goMentionBtn: HTMLButtonElement;\n private goMentionUnreadBadge: HTMLSpanElement;\n private btnScheduled: HTMLButtonElement;\n\n private btnPreloader: HTMLButtonElement;\n\n private saveDraftDebounced: () => void;\n\n private fakeRowsWrapper: HTMLDivElement;\n\n private previousQuery: string;\n\n private releaseMediaPlayback: () => void;\n\n private botStartBtn: HTMLButtonElement;\n private rowsWrapperWrapper: HTMLDivElement;\n private controlContainer: HTMLElement;\n private fakeSelectionWrapper: HTMLDivElement;\n\n private fakeWrapperTo: HTMLElement;\n private toggleBotStartBtnDisability: () => void;\n\n private botCommandsToggle: HTMLElement;\n private botCommands: ChatBotCommands;\n private botCommandsIcon: HTMLDivElement;\n private hasBotCommands: boolean;\n\n // private activeContainer: HTMLElement;\n\n private sendAs: ChatSendAs;\n public sendAsPeerId: PeerId;\n\n constructor(\n private chat: Chat,\n private appImManager: AppImManager,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n }\n\n public construct() {\n this.chatInput = document.createElement('div');\n this.chatInput.classList.add('chat-input', 'hide');\n\n this.inputContainer = document.createElement('div');\n this.inputContainer.classList.add('chat-input-container');\n\n this.rowsWrapperWrapper = document.createElement('div');\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\n\n this.rowsWrapper = document.createElement('div');\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\n\n this.rowsWrapperWrapper.append(this.rowsWrapper);\n\n const tail = generateTail();\n this.rowsWrapper.append(tail);\n\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\n\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\n\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\n this.chatInput.append(this.inputContainer);\n\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button chat-secondary-button bubbles-go-down hide'});\n this.inputContainer.append(this.goDownBtn);\n\n attachClickEvent(this.goDownBtn, (e) => {\n cancelEvent(e);\n this.chat.bubbles.onGoDownClick();\n }, {listenerSetter: this.listenerSetter});\n\n // * constructor end\n\n /* let setScrollTopTimeout: number;\n // @ts-ignore\n let height = window.visualViewport.height; */\n // @ts-ignore\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\n // const scrollable = this.chat.bubbles.scrollable;\n // const wasScrolledDown = scrollable.isScrolledDown;\n\n // /* if(wasScrolledDown) {\n // this.saveScroll();\n // } */\n\n // // @ts-ignore\n // let newHeight = window.visualViewport.height;\n // const diff = height - newHeight;\n // const scrollTop = scrollable.scrollTop;\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\n\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n // scrollable.scrollTop = needScrollTop;\n\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n // setScrollTopTimeout = window.setTimeout(() => {\n // const diff = height - newHeight;\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\n // height = newHeight;\n\n // scrollable.scrollTop = needScrollTop;\n\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n\n // /* if(isScrolledDown) {\n // scrollable.scrollTop = scrollable.scrollHeight;\n // } */\n\n // //scrollable.scrollTop += diff;\n // setScrollTopTimeout = 0;\n // }, 0);\n // });\n\n // ! Can't use it with resizeObserver\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\n const scrollable = this.chat.bubbles.scrollable;\n const wasScrolledDown = scrollable.isScrolledDown;\n\n // @ts-ignore\n let newHeight = window.visualViewport.height;\n const diff = height - newHeight;\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\n\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n scrollable.scrollTop = needScrollTop;\n height = newHeight;\n\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\n scrollable.scrollTop = needScrollTop;\n\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n setScrollTopTimeout = 0;\n }, 0);\n }); */\n\n const c = this.controlContainer = document.createElement('div');\n c.classList.add('chat-input-control', 'chat-input-wrapper');\n this.inputContainer.append(c);\n }\n\n public constructPeerHelpers() {\n this.replyElements.container = document.createElement('div');\n this.replyElements.container.classList.add('reply-wrapper');\n\n this.replyElements.iconBtn = ButtonIcon('');\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\n\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\n\n //\n\n const onHideAuthorClick = () => {\n isChangingAuthor = true;\n return this.canToggleHideAuthor();\n };\n\n const onHideCaptionClick = () => {\n isChangingAuthor = false;\n };\n\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\n let isChangingAuthor = false;\n const forwardButtons: ButtonMenuItemOptions[] = [\n forwardElements.showSender = {\n text: 'Chat.Alert.Forward.Action.Show1',\n onClick: onHideAuthorClick,\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideSender = {\n text: 'Chat.Alert.Forward.Action.Hide1',\n onClick: onHideAuthorClick,\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.showCaption = {\n text: 'Chat.Alert.Forward.Action.ShowCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideCaption = {\n text: 'Chat.Alert.Forward.Action.HideCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.changePeer = {\n text: 'Chat.Alert.Forward.Action.Another',\n onClick: () => {\n this.changeForwardRecipient();\n },\n icon: 'replace'\n }\n ];\n const forwardBtnMenu = forwardElements.container = ButtonMenuSync({\n buttons: forwardButtons,\n listenerSetter: this.listenerSetter\n });\n // forwardBtnMenu.classList.add('top-center');\n\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\n const groups: {\n elements: HTMLElement[],\n onChange: (value: string, event: Event) => void\n }[] = [{\n elements: children.slice(0, 2),\n onChange: (value, e) => {\n const checked = !!+value;\n if(isChangingAuthor) {\n this.forwardWasDroppingAuthor = !checked;\n }\n\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\n if(replyTitle) {\n const el = replyTitle.firstElementChild as HTMLElement;\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n i.key = langPackKey;\n i.update();\n }\n }\n }, {\n elements: children.slice(2, 4),\n onChange: (value) => {\n const checked = !!+value;\n let b: ButtonMenuItemOptions;\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\n } else {\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\n }\n\n b.checkboxField.checked = true;\n }\n }];\n groups.forEach((group) => {\n const container = RadioForm(group.elements.map((e) => {\n return {\n container: e,\n input: e.querySelector('input')\n };\n }), group.onChange);\n\n const hr = document.createElement('hr');\n container.append(hr);\n forwardBtnMenu.append(container);\n });\n\n forwardBtnMenu.append(forwardElements.changePeer.element);\n\n if(!IS_TOUCH_SUPPORTED) {\n const forwardHover = this.forwardHover = new DropdownHover({\n element: forwardBtnMenu\n });\n }\n\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\n this.replyElements.container.append(forwardBtnMenu);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const {input} = b.checkboxField;\n input.type = 'radio';\n input.name = idx < 2 ? 'author' : 'caption';\n input.value = '' + +!(idx % 2);\n });\n\n //\n\n this.newMessageWrapper = document.createElement('div');\n this.newMessageWrapper.classList.add('new-message-wrapper');\n\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\n\n this.inputMessageContainer = document.createElement('div');\n this.inputMessageContainer.classList.add('input-message-container');\n\n this.goDownUnreadBadge = document.createElement('span');\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goDownBtn.append(this.goDownUnreadBadge);\n\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button chat-secondary-button bubbles-go-mention'});\n this.goMentionUnreadBadge = document.createElement('span');\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goMentionBtn.append(this.goMentionUnreadBadge);\n this.inputContainer.append(this.goMentionBtn);\n\n attachClickEvent(this.goMentionBtn, (e) => {\n cancelEvent(e);\n const middleware = this.chat.bubbles.getMiddleware();\n this.managers.appMessagesManager.goToNextMention(this.chat.peerId, this.chat.threadId).then((mid) => {\n if(!middleware()) {\n return;\n }\n\n if(mid) {\n this.chat.setMessageId(mid);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\n\n attachClickEvent(this.btnScheduled, (e) => {\n this.appImManager.openScheduled(this.chat.peerId);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.btnScheduled.classList.remove('hide');\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((value) => {\n this.btnScheduled.classList.toggle('hide', !value.length);\n });\n });\n\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\n this.replyKeyboard = new ReplyKeyboard({\n appendTo: this.rowsWrapper,\n listenerSetter: this.listenerSetter,\n managers: this.managers,\n btnHover: this.btnToggleReplyMarkup,\n chatInput: this\n });\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\n\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.managers);\n this.botCommandsToggle = document.createElement('div');\n this.botCommandsToggle.classList.add('new-message-bot-commands');\n\n const scaler = document.createElement('div');\n scaler.classList.add('new-message-bot-commands-icon-scale');\n\n const icon = this.botCommandsIcon = document.createElement('div');\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\n scaler.append(icon);\n this.botCommandsToggle.append(scaler);\n\n attachClickEvent(this.botCommandsToggle, (e) => {\n cancelEvent(e);\n const isShown = icon.classList.contains('state-back');\n if(isShown) {\n this.botCommands.toggle(true);\n icon.classList.remove('state-back');\n } else {\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\n icon.classList.add('state-back');\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.botCommands.addEventListener('visible', () => {\n icon.classList.add('state-back');\n });\n\n this.botCommands.addEventListener('hiding', () => {\n icon.classList.remove('state-back');\n });\n\n this.attachMenuButtons = [{\n icon: 'image',\n text: 'Chat.Input.Attach.PhotoOrVideo',\n onClick: () => {\n this.fileInput.value = '';\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\n this.fileInput.setAttribute('accept', accept);\n this.willAttachType = 'media';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'document',\n text: 'Chat.Input.Attach.Document',\n onClick: () => {\n this.fileInput.value = '';\n this.fileInput.removeAttribute('accept');\n this.willAttachType = 'document';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'poll',\n text: 'Poll',\n onClick: () => {\n PopupElement.createPopup(PopupCreatePoll, this.chat).show();\n },\n verify: () => (this.chat.peerId.isAnyChat() || this.chat.isBot) && this.chat.canSend('send_polls')\n }];\n\n const attachMenuButtons = this.attachMenuButtons.slice();\n this.attachMenu = ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n direction: 'top-left',\n buttons: this.attachMenuButtons,\n onOpenBefore: async() => {\n const attachMenuBots = await this.managers.appAttachMenuBotsManager.getAttachMenuBots();\n const buttons = attachMenuButtons.slice();\n const attachMenuBotsButtons = attachMenuBots.filter((attachMenuBot) => {\n return !attachMenuBot.pFlags.inactive;\n }).map((attachMenuBot) => {\n const icon = getAttachMenuBotIcon(attachMenuBot);\n const button: typeof buttons[0] = {\n regularText: wrapEmojiText(attachMenuBot.short_name),\n onClick: () => {\n this.managers.appAttachMenuBotsManager.requestWebView({\n botId: attachMenuBot.bot_id,\n peerId: this.chat.peerId,\n ...this.chat.getMessageSendingParams()\n }).then((webViewResultUrl) => {\n const SANDBOX_ATTRIBUTES = [\n 'allow-scripts',\n 'allow-same-origin',\n 'allow-popups',\n 'allow-forms',\n 'allow-modals',\n 'allow-storage-access-by-user-activation'\n ].join(' ');\n\n class P extends PopupElement<{\n finish: () => void\n }> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n titleRaw: attachMenuBot.short_name\n });\n\n this.d();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = new TelegramWebView({\n url: this.url,\n sandbox: SANDBOX_ATTRIBUTES\n });\n\n telegramWebView.iframe.classList.add('payment-verification');\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n new P(webViewResultUrl.url);\n });\n },\n iconDoc: icon?.icon as MyDocument,\n verify: async() => {\n let found = false;\n\n const verifyMap: {\n [type in AttachMenuPeerType['_']]: () => boolean | Promise\n } = {\n attachMenuPeerTypeSameBotPM: () => this.chat.peerId.toUserId() === attachMenuBot.bot_id,\n attachMenuPeerTypeBotPM: () => this.chat.isBot,\n attachMenuPeerTypePM: () => this.chat.peerId.isUser(),\n attachMenuPeerTypeChat: () => this.chat.isAnyGroup,\n attachMenuPeerTypeBroadcast: () => this.chat.isBroadcast\n };\n\n for(const peerType of attachMenuBot.peer_types) {\n const verify = verifyMap[peerType._];\n found = await verify();\n if(found) {\n break;\n }\n }\n\n return found;\n }\n };\n\n return button;\n });\n\n buttons.splice(buttons.length, 0, ...attachMenuBotsButtons);\n this.attachMenuButtons.splice(0, this.attachMenuButtons.length, ...buttons);\n }\n });\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\n this.attachMenu.classList.remove('tgico-more');\n\n // this.inputContainer.append(this.sendMenu);\n\n this.recordTimeEl = document.createElement('div');\n this.recordTimeEl.classList.add('record-time');\n\n this.fileInput = document.createElement('input');\n this.fileInput.type = 'file';\n this.fileInput.multiple = true;\n this.fileInput.style.display = 'none';\n\n this.newMessageWrapper.append(...[this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\n\n this.rowsWrapper.append(this.replyElements.container);\n this.autocompleteHelperController = new AutocompleteHelperController();\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.rowsWrapper.append(this.newMessageWrapper);\n\n this.btnCancelRecord = ButtonIcon('binfilled btn-circle btn-record-cancel chat-secondary-button');\n\n this.btnSendContainer = document.createElement('div');\n this.btnSendContainer.classList.add('btn-send-container');\n\n this.recordRippleEl = document.createElement('div');\n this.recordRippleEl.classList.add('record-ripple');\n\n this.btnSend = ButtonIcon('none btn-circle btn-send animated-button-icon');\n this.btnSend.insertAdjacentHTML('afterbegin', `\n \n \n \n \n `);\n\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\n\n this.sendMenu = new SendMenu({\n onSilentClick: () => {\n this.sendSilent = true;\n this.sendMessage();\n },\n onScheduleClick: () => {\n this.scheduleSending(undefined);\n },\n listenerSetter: this.listenerSetter,\n openSide: 'top-left',\n onContextElement: this.btnSend,\n onOpen: () => {\n return this.chat.type !== 'scheduled' && (!this.isInputEmpty() || !!Object.keys(this.forwarding).length);\n }\n });\n\n this.btnSendContainer.append(this.sendMenu.sendMenu);\n\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\n\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\n\n this.attachMessageInputField();\n\n /* this.attachMenu.addEventListener('mousedown', (e) => {\n const hidden = this.attachMenu.querySelectorAll('.hide');\n if(hidden.length === this.attachMenuButtons.length) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n cancelEvent(e);\n return false;\n }\n }, {passive: false, capture: true}); */\n\n this.listenerSetter.add(rootScope)('settings_updated', () => {\n if(this.stickersHelper || this.emojiHelper) {\n // this.previousQuery = undefined;\n this.previousQuery = '';\n this.checkAutocomplete();\n /* if(!rootScope.settings.stickers.suggest) {\n this.stickersHelper.checkEmoticon('');\n } else {\n this.onMessageInput();\n } */\n }\n\n this.messageInputField?.onFakeInput();\n });\n\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId || this.chat.type === 'scheduled') return;\n this.setDraft(draft, true, force);\n });\n\n this.listenerSetter.add(this.appImManager)('peer_changing', (chat) => {\n if(this.chat === chat && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n this.saveDraft();\n }\n });\n\n this.listenerSetter.add(this.appImManager)('chat_changing', ({from, to}) => {\n if(this.chat === from) {\n this.autocompleteHelperController.toggleListNavigation(false);\n } else if(this.chat === to) {\n this.autocompleteHelperController.toggleListNavigation(true);\n }\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type === 'scheduled' && this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\n this.onMessageSent();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(this.chat.peerId === peerId && this.chat.type !== 'scheduled') {\n if(msgs.has(this.editMsgId)) {\n this.onMessageSent();\n }\n\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\n this.clearHelper('reply');\n }\n\n /* if(this.chat.isStartButtonNeeded()) {\n this.setStartParam(BOT_START_PARAM);\n } */\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(dialogs.has(this.chat.peerId) && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n if(this.startParam === BOT_START_PARAM) {\n this.setStartParam();\n } else { // updateNewMessage comes earlier than dialog appers\n this.center(true);\n }\n }\n });\n\n try {\n this.recorder = new Recorder({\n // encoderBitRate: 32,\n // encoderPath: \"../dist/encoderWorker.min.js\",\n encoderSampleRate: 48000,\n monitorGain: 0,\n numberOfChannels: 1,\n recordingGain: 1,\n reuseWorker: true\n });\n } catch(err) {\n console.error('Recorder constructor error:', err);\n }\n\n this.updateSendBtn();\n\n this.listenerSetter.add(this.fileInput)('change', (e) => {\n const files = (e.target as HTMLInputElement & EventTarget).files;\n if(!files.length) {\n return;\n }\n\n PopupElement.createPopup(PopupNewMedia, this.chat, Array.from(files).slice(), this.willAttachType);\n this.fileInput.value = '';\n }, false);\n\n /* let time = Date.now();\n this.btnSend.addEventListener('touchstart', (e) => {\n time = Date.now();\n });\n\n let eventName1 = 'touchend';\n this.btnSend.addEventListener(eventName1, (e: Event) => {\n //cancelEvent(e);\n console.log(eventName1 + ', time: ' + (Date.now() - time));\n });\n\n let eventName = 'mousedown';\n this.btnSend.addEventListener(eventName, (e: Event) => {\n cancelEvent(e);\n console.log(eventName + ', time: ' + (Date.now() - time));\n }); */\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\n\n if(this.recorder) {\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\n\n this.recorder.onstop = () => {\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n this.recordRippleEl.style.transform = '';\n };\n\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\n if(this.releaseMediaPlayback) {\n this.releaseMediaPlayback();\n this.releaseMediaPlayback = undefined;\n }\n\n if(this.recordingOverlayListener) {\n this.listenerSetter.remove(this.recordingOverlayListener);\n this.recordingOverlayListener = undefined;\n }\n\n if(this.recordingNavigationItem) {\n appNavigationController.removeItem(this.recordingNavigationItem);\n this.recordingNavigationItem = undefined;\n }\n\n if(this.recordCanceled) {\n return;\n }\n\n const {peerId, threadId} = this.chat;\n const replyToMsgId = this.replyToMsgId;\n\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\n /* const fileName = new Date().toISOString() + \".opus\";\n console.log('Recorder data received', typedArray, dataBlob); */\n\n // let perf = performance.now();\n opusDecodeController.decode(typedArray, true).then((result) => {\n // console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\n\n opusDecodeController.setKeepAlive(false);\n\n // тут objectURL ставится уже с audio/wav\n this.managers.appMessagesManager.sendFile(peerId, dataBlob, {\n isVoiceMessage: true,\n isMedia: true,\n duration,\n waveform: result.waveform,\n objectURL: result.url,\n replyToMsgId,\n threadId,\n clearDraft: true\n });\n\n this.onMessageSent(false, true);\n });\n };\n }\n\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\n\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\n\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\n this.botStartBtn.append(i18n('BotStart'));\n\n attachClickEvent(this.botStartBtn, () => {\n const {startParam} = this;\n if(startParam === undefined) {\n return;\n }\n\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\n const peerId = this.chat.peerId;\n const middleware = this.chat.bubbles.getMiddleware(() => {\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\n });\n\n this.managers.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\n if(middleware()) {\n toggle();\n this.toggleBotStartBtnDisability = undefined;\n this.setStartParam();\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.controlContainer.append(this.botStartBtn);\n\n // * pinned part start\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\n this.controlContainer.append(this.pinnedControlBtn);\n\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\n const peerId = this.chat.peerId;\n\n new PopupPinMessage(peerId, 0, true, () => {\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 // * pinned part end\n }\n\n public _center(neededFakeContainer: HTMLElement, animate?: boolean) {\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\n return;\n }\n\n if(neededFakeContainer === this.fakeWrapperTo) {\n return;\n }\n\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\n this.inputContainer.classList.remove('is-centering');\n void this.rowsWrapper.offsetLeft; // reflow\n // this.inputContainer.classList.add('is-centering');\n // void this.rowsWrapper.offsetLeft; // reflow\n } */\n\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\n const forwards = !!neededFakeContainer;\n const oldFakeWrapperTo = this.fakeWrapperTo;\n let transform = '', borderRadius = '', needTranslateX: number;\n // if(forwards) {]\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\n const widthFrom = fakeRowsRect.width;\n const widthTo = fakeSelectionRect.width;\n\n if(widthFrom !== widthTo) {\n const scale = (widthTo/* - 8 */) / widthFrom;\n const initTranslateX = (widthFrom - widthTo) / 2;\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\n\n if(forwards) {\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\n // transform = `translateX(0px) scaleX(${scale})`;\n\n if(scale < 1) {\n const br = 16;\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\n }\n }\n // scale = widthTo / widthFrom;\n }\n // }\n\n this.fakeWrapperTo = neededFakeContainer;\n\n const duration = animate ? 200 : 0;\n SetTransition({\n element: this.inputContainer,\n className: 'is-centering',\n forwards,\n duration\n });\n SetTransition({\n element: this.rowsWrapperWrapper,\n className: 'is-centering-to-control',\n forwards: !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')),\n duration\n });\n this.rowsWrapper.style.transform = transform;\n this.rowsWrapper.style.borderRadius = borderRadius;\n\n return {\n transform,\n borderRadius,\n needTranslateX: oldFakeWrapperTo && (\n (\n neededFakeContainer &&\n neededFakeContainer.classList.contains('chat-input-control') &&\n oldFakeWrapperTo === this.fakeSelectionWrapper\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\n ) ? needTranslateX * -.5 : needTranslateX,\n widthFrom,\n widthTo\n };\n }\n\n public async center(animate = false) {\n return this._center(await this.getNeededFakeContainer(), animate);\n }\n\n public setStartParam(startParam?: string) {\n if(this.startParam === startParam) {\n return;\n }\n\n this.startParam = startParam;\n this.center(true);\n }\n\n public async getNeededFakeContainer(startParam = this.startParam) {\n if(this.chat.selection.isSelecting) {\n return this.fakeSelectionWrapper;\n } else if(\n startParam !== undefined ||\n !(await this.chat.canSend()) ||\n this.chat.type === 'pinned' ||\n await this.chat.isStartButtonNeeded()\n ) {\n return this.controlContainer;\n }\n }\n\n // public getActiveContainer() {\n // if(this.chat.selection.isSelecting) {\n // return this.chat\n // }\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\n // }\n\n // public setActiveContainer() {\n // const container = this.activeContainer;\n // const newContainer = this.getActiveContainer();\n // if(newContainer === container) {\n // return;\n // }\n\n\n // }\n\n private onCancelRecordClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n this.recordCanceled = true;\n this.recorder.stop();\n opusDecodeController.setKeepAlive(false);\n };\n\n private onEmoticonsOpen = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\n };\n\n private onEmoticonsClose = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\n };\n\n public getReadyToSend(callback: () => void) {\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\n }\n\n public scheduleSending = async(callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\n const {peerId} = this.chat;\n const middleware = this.chat.bubbles.getMiddleware();\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && await this.managers.appUsersManager.isUserOnlineVisible(peerId);\n\n new PopupSchedule(initDate, (timestamp) => {\n if(!middleware()) {\n return;\n }\n\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(timestamp <= minTimestamp) {\n timestamp = undefined;\n }\n\n this.scheduleDate = timestamp;\n callback();\n\n if(this.chat.type !== 'scheduled' && timestamp) {\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\n if(!middleware()) {\n return;\n }\n\n const popups = PopupElement.getPopups(PopupStickers);\n popups.forEach((popup) => popup.hide());\n\n this.appImManager.openScheduled(peerId);\n }, 0);\n }\n }, canSendWhenOnline).show();\n };\n\n public async setUnreadCount() {\n if(!this.goDownUnreadBadge) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId, this.chat.type === 'discussion' ? undefined : this.chat.threadId);\n const count = dialog?.unread_count;\n this.goDownUnreadBadge.innerText = '' + (count || '');\n this.goDownUnreadBadge.classList.toggle('badge-gray', await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.chat.peerId, respectType: true, threadId: this.chat.threadId}));\n\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\n }\n }\n\n public getCurrentInputAsDraft() {\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n let draft: DraftMessage.draftMessage;\n if(value.length || this.replyToMsgId) {\n draft = {\n _: 'draftMessage',\n date: tsNow(true),\n message: value,\n entities: entities.length ? entities : undefined,\n pFlags: {\n no_webpage: this.noWebPage\n },\n reply_to_msg_id: this.replyToMsgId\n };\n }\n\n return draft;\n }\n\n public saveDraft() {\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\n const draft = this.getCurrentInputAsDraft();\n this.managers.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\n }\n\n public destroy() {\n // this.chat.log.error('Input destroying');\n\n this.listenerSetter.removeAll();\n }\n\n public cleanup(helperToo = true) {\n if(!this.chat.peerId) {\n this.chatInput.classList.add('hide');\n this.goDownBtn.classList.add('hide');\n }\n\n cancelSelection();\n\n this.lastTimeType = 0;\n this.startParam = undefined;\n\n if(this.toggleBotStartBtnDisability) {\n this.toggleBotStartBtnDisability();\n this.toggleBotStartBtnDisability = undefined;\n }\n\n if(this.messageInput) {\n this.clearInput();\n helperToo && this.clearHelper();\n }\n }\n\n public async setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\n\n if(!draft) {\n draft = await this.managers.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\n\n if(!draft) {\n if(force) { // this situation can only happen when sending message with clearDraft\n /* const height = this.chatInput.getBoundingClientRect().height;\n const willChangeHeight = 78 - height;\n this.willChangeHeight = willChangeHeight; */\n if(this.chat.container.classList.contains('is-helper-active')) {\n this.t();\n }\n\n this.messageInputField.inputFake.textContent = '';\n this.messageInputField.onFakeInput(false);\n\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\n fastRaf(() => {\n this.onMessageSent();\n });\n });\n }\n\n return false;\n }\n }\n\n const wrappedDraft = wrapDraft(draft, this.chat.peerId);\n const currentDraft = this.getCurrentInputAsDraft();\n\n if(draftsAreEqual(draft, currentDraft) &&/* this.messageInputField.value === wrappedDraft && */this.replyToMsgId === draft.reply_to_msg_id) return false;\n\n if(fromUpdate) {\n this.clearHelper();\n }\n\n this.noWebPage = draft.pFlags.no_webpage;\n if(draft.reply_to_msg_id) {\n this.initMessageReply(draft.reply_to_msg_id);\n }\n\n this.setInputValue(wrappedDraft, fromUpdate, fromUpdate);\n return true;\n }\n\n private createSendAs() {\n this.sendAsPeerId = undefined;\n\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n let firstChange = true;\n this.sendAs = new ChatSendAs(\n this.managers,\n (container, skipAnimation) => {\n let useRafs = 0;\n if(!container.parentElement) {\n this.newMessageWrapper.prepend(container);\n useRafs = 2;\n }\n\n this.updateOffset('as', true, skipAnimation, useRafs);\n },\n (sendAsPeerId) => {\n this.sendAsPeerId = sendAsPeerId;\n\n // do not change placeholder earlier than finishPeerChange does\n if(firstChange) {\n firstChange = false;\n return;\n }\n\n this.getPlaceholderKey().then((key) => {\n this.updateMessageInputPlaceholder(key);\n });\n }\n );\n } else {\n this.sendAs = undefined;\n }\n\n return this.sendAs;\n }\n\n public async finishPeerChange(startParam?: string) {\n const peerId = this.chat.peerId;\n\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, botCommandsToggle} = this;\n\n const previousSendAs = this.sendAs;\n const sendAs = this.createSendAs();\n\n const [\n isBroadcast,\n canPinMessage,\n isBot,\n canSend,\n neededFakeContainer,\n ackedPeerFull,\n ackedScheduledMids,\n setSendAsCallback,\n filteredAttachMenuButtons\n ] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.canPinMessage(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.chat.canSend(),\n this.getNeededFakeContainer(startParam),\n modifyAckedPromise(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId)),\n btnScheduled ? modifyAckedPromise(this.managers.acknowledged.appMessagesManager.getScheduledMessages(peerId)) : undefined,\n sendAs ? (sendAs.setPeerId(this.chat.peerId), sendAs.updateManual(true)) : undefined,\n this.filterAttachMenuButtons()\n ]);\n\n const placeholderKey = this.messageInput ? await this.getPlaceholderKey() : undefined;\n\n return () => {\n // console.warn('[input] finishpeerchange start');\n\n chatInput.classList.remove('hide');\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\n goDownBtn.classList.remove('hide');\n\n this.messageInputField?.onFakeInput();\n\n if(this.goDownUnreadBadge) {\n this.setUnreadCount();\n }\n\n if(this.chat.type === 'pinned') {\n chatInput.classList.toggle('can-pin', canPinMessage);\n }/* else if(this.chat.type === 'chat') {\n } */\n\n if(forwardElements) {\n this.forwardWasDroppingAuthor = false;\n forwardElements.showCaption.checkboxField.setValueSilently(true);\n forwardElements.showSender.checkboxField.setValueSilently(true);\n }\n\n if(btnScheduled && ackedScheduledMids) {\n btnScheduled.classList.add('hide');\n const middleware = this.chat.bubbles.getMiddleware();\n callbackify(ackedScheduledMids.result, (mids) => {\n if(!middleware() || !mids) return;\n btnScheduled.classList.toggle('hide', !mids.length);\n });\n }\n\n if(this.newMessageWrapper) {\n this.updateOffset(null, false, true);\n }\n\n if(botCommandsToggle) {\n this.hasBotCommands = undefined;\n this.botCommands.toggle(true, undefined, true);\n this.updateBotCommandsToggle(true);\n botCommandsToggle.remove();\n if(isBot) {\n const middleware = this.chat.bubbles.getMiddleware();\n const result = ackedPeerFull.result;\n callbackify(result, (userFull) => {\n if(!middleware()) return;\n this.updateBotCommands(userFull as UserFull.userFull, !(result instanceof Promise));\n });\n }\n }\n\n if(previousSendAs) {\n previousSendAs.destroy();\n }\n\n if(setSendAsCallback) {\n setSendAsCallback();\n }\n\n if(replyKeyboard) {\n replyKeyboard.setPeer(peerId);\n }\n\n if(sendMenu) {\n sendMenu.setPeerId(peerId);\n }\n\n if(this.messageInput) {\n this.updateMessageInput(canSend, placeholderKey, filteredAttachMenuButtons);\n this.messageInput.dataset.peerId = '' + peerId;\n }\n\n if(this.pinnedControlBtn) {\n this.pinnedControlBtn.classList.toggle('hide', this.chat.type !== 'pinned');\n this.pinnedControlBtn.replaceChildren(i18n(canPinMessage ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\n }\n\n this.botStartBtn.classList.toggle('hide', this.chat.type === 'pinned');\n\n // * testing\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\n\n this.startParam = startParam;\n\n this._center(neededFakeContainer, false);\n\n // console.warn('[input] finishpeerchange ends');\n };\n }\n\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\n if(type) {\n this.newMessageWrapper.dataset.offset = type;\n } else {\n delete this.newMessageWrapper.dataset.offset;\n }\n\n SetTransition({\n element: this.newMessageWrapper,\n className: 'has-offset',\n forwards,\n duration: skipAnimation ? 0 : 300,\n useRafs\n });\n }\n\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\n this.hasBotCommands = !!userFull.bot_info?.commands?.length;\n this.updateBotCommandsToggle(skipAnimation);\n }\n\n private updateBotCommandsToggle(skipAnimation?: boolean) {\n const {botCommandsToggle, hasBotCommands} = this;\n\n const show = !!hasBotCommands && this.isInputEmpty();\n if(!hasBotCommands) {\n if(!botCommandsToggle.parentElement) {\n return;\n }\n\n botCommandsToggle.remove();\n }\n\n const forwards = show;\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\n\n if(!botCommandsToggle.parentElement) {\n this.newMessageWrapper.prepend(botCommandsToggle);\n }\n\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\n }\n\n private async getPlaceholderKey() {\n const {peerId, threadId, isForum} = this.chat;\n let key: LangPackKey;\n if(threadId && !isForum) {\n key = 'Comment';\n } else if(await this.managers.appPeersManager.isBroadcast(peerId)) {\n key = 'ChannelBroadcast';\n } else if(\n (this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) ||\n await this.managers.appMessagesManager.isAnonymousSending(peerId)\n ) {\n key = 'SendAnonymously';\n } else {\n key = 'Message';\n }\n\n return key;\n }\n\n private updateMessageInputPlaceholder(key: LangPackKey) {\n // console.warn('[input] update placeholder');\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\n if(!i) {\n return;\n }\n\n i.compareAndUpdate({key});\n }\n\n private filterAttachMenuButtons() {\n if(!this.attachMenuButtons) return;\n return filterAsync(this.attachMenuButtons, (button) => {\n return button.verify();\n });\n }\n\n public updateMessageInput(canSend: boolean, placeholderKey: LangPackKey, visible: ChatInput['attachMenuButtons']) {\n const {chatInput, attachMenu, messageInput} = this;\n const {peerId, threadId} = this.chat;\n const isHidden = chatInput.classList.contains('is-hidden');\n const willBeHidden = !canSend;\n if(isHidden !== willBeHidden) {\n chatInput.classList.add('no-transition');\n chatInput.classList.toggle('is-hidden', !canSend);\n void chatInput.offsetLeft; // reflow\n chatInput.classList.remove('no-transition');\n }\n\n this.updateMessageInputPlaceholder(placeholderKey);\n\n if(!canSend) {\n messageInput.contentEditable = 'inherit';\n } else {\n messageInput.contentEditable = 'true';\n this.setDraft(undefined, false);\n\n if(!messageInput.innerHTML) {\n this.messageInputField.onFakeInput();\n }\n }\n\n if(attachMenu) {\n attachMenu.toggleAttribute('disabled', !visible.length);\n attachMenu.classList.toggle('btn-disabled', !visible.length);\n }\n\n this.updateSendBtn();\n }\n\n private attachMessageInputField() {\n const oldInputField = this.messageInputField;\n this.messageInputField = new InputFieldAnimated({\n placeholder: 'Message',\n name: 'message',\n withLinebreaks: true\n });\n\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\n this.messageInput = this.messageInputField.input;\n this.messageInput.classList.add('no-scrollbar');\n this.attachMessageInputListeners();\n\n if(IS_STICKY_INPUT_BUGGED) {\n fixSafariStickyInputFocusing(this.messageInput);\n }\n\n if(oldInputField) {\n oldInputField.input.replaceWith(this.messageInputField.input);\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\n } else {\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\n }\n }\n\n private attachMessageInputListeners() {\n this.listenerSetter.add(this.messageInput)('keydown', (e) => {\n const key = e.key;\n\n if(isSendShortcutPressed(e)) {\n cancelEvent(e);\n this.sendMessage();\n } else if(e.ctrlKey || e.metaKey) {\n this.handleMarkdownShortcut(e);\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\n e.preventDefault();\n\n if(key === 'PageUp') {\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\n range.collapse(true);\n\n sel.removeAllRanges();\n sel.addRange(range);\n } else {\n placeCaretAtEnd(this.messageInput);\n }\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(this.messageInput, (e) => {\n if(emoticonsDropdown.isActive()) {\n emoticonsDropdown.toggle(false);\n blurActiveElement();\n cancelEvent(e);\n // this.messageInput.focus();\n return;\n }\n\n this.appImManager.selectTab(1); // * set chat tab for album orientation\n // this.saveScroll();\n }, {listenerSetter: this.listenerSetter});\n\n /* this.listenerSetter.add(window)('resize', () => {\n this.restoreScroll();\n }); */\n\n /* if(isSafari) {\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n emoticonsDropdown.toggle(false);\n });\n });\n });\n } */\n }\n\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\n // * validate due to manual formatting through browser's context menu\n const inputType = (e as InputEvent).inputType;\n //console.log('message beforeinput event', e);\n\n if(inputType.indexOf('format') === 0) {\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\n if(this.applyMarkdown(markdownType)) {\n cancelEvent(e); // * cancel legacy markdown event\n }\n }\n }); */\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\n this.listenerSetter.add(this.messageInput)('keyup', () => {\n this.checkAutocomplete();\n });\n\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n this.listenerSetter.add(this.messageInput)('focusin', () => {\n if(this.chat.bubbles.scrollable.loadedAll.bottom) {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\n }\n });\n }\n }\n\n private prepareDocumentExecute = () => {\n this.executedHistory.push(this.messageInput.innerHTML);\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\n };\n\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\n cancelEvent(e); // cancel legacy event\n\n let html = this.messageInput.innerHTML;\n if(html && html !== needHTML) {\n this.lockRedo = true;\n\n let sameHTMLTimes = 0;\n do {\n document.execCommand(type, false, null);\n const currentHTML = this.messageInput.innerHTML;\n if(html === currentHTML) {\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\n break;\n }\n } else {\n sameHTMLTimes = 0;\n }\n\n html = currentHTML;\n } while(html !== needHTML);\n\n this.lockRedo = false;\n }\n };\n\n public applyMarkdown(type: MarkdownType, href?: string) {\n // const MONOSPACE_FONT = 'var(--font-monospace)';\n // const SPOILER_FONT = 'spoiler';\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\n // bold: 'Bold',\n // italic: 'Italic',\n // underline: 'Underline',\n // strikethrough: 'Strikethrough',\n // monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null)\n // spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)\n };\n\n const c = (type: MarkdownType) => {\n commandsMap[type] = () => {\n const k = (canCombine.includes(type) ? canCombine : [type]).filter((type) => hasMarkup[type]);\n if(!indexOfAndSplice(k, type)) {\n k.push(type);\n }\n\n if(!k.length) {\n return this.resetCurrentFontFormatting();\n } else {\n return document.execCommand('fontName', false, 'markup-' + k.join('-'));\n }\n };\n };\n\n const canCombine = ['bold', 'italic', 'underline', 'strikethrough', 'spoiler'] as (typeof type)[];\n canCombine.forEach((type) => {\n c(type);\n });\n\n c('monospace');\n\n if(!commandsMap[type]) {\n return false;\n }\n\n const command = commandsMap[type];\n\n // type = 'monospace';\n\n // const saveExecuted = this.prepareDocumentExecute();\n const executed: any[] = [];\n /**\n * * clear previous formatting, due to Telegram's inability to handle several entities\n */\n /* const checkForSingle = () => {\n const nodes = getSelectedNodes();\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\n\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\n //const differentParents = !!nodes.find((node) => node.parentNode !== firstParent);\n const differentParents = parents.length > 1;\n\n let notSingle = false;\n if(differentParents) {\n notSingle = true;\n } else {\n const node = nodes[0];\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\n notSingle = true;\n }\n }\n\n if(notSingle) {\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n //}\n\n executed.push(document.execCommand('unlink', false, null));\n executed.push(document.execCommand('removeFormat', false, null));\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n //}\n }\n }; */\n\n // fix applying markdown when range starts from contenteditable=\"false\"\n let textNode: Text;\n // do {\n // // const {node, offset, selection} = getCaretPosNew(this.messageInput, true);\n // const selection = document.getSelection();\n // const range = selection.getRangeAt(0);\n // const {node, offset} = getCaretPosF(this.messageInput, range.startContainer, range.startOffset);\n // // const node = range.startContainer as ChildNode;\n // if(node?.textContent === BOM || (node as HTMLElement)?.isContentEditable === false) {\n // // selection.modify('extend', 'backward', 'character');\n // textNode = document.createTextNode(BOM);\n // (node.nodeType === node.ELEMENT_NODE ? node : node.parentElement).before(textNode);\n // range.setStart(textNode, 0);\n // }/* else {\n // break;\n // } */\n\n // break;\n // } while(true);\n\n const richInputHandler = RichInputHandler.getInstance();\n const restore = richInputHandler.prepareApplyingMarkdown();\n\n const listener = this.listenerSetter.add(this.messageInput)('input', cancelEvent, {capture: true, passive: false}) as any as Listener;\n\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const hasMarkup = hasMarkupInSelection(Object.keys(commandsMap) as (typeof type)[]);\n\n // * monospace can't be combined with different types\n /* if(type === 'monospace' || type === 'spoiler') {\n // executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const haveThisType = hasMarkup[type];\n // executed.push(document.execCommand('removeFormat', false, null));\n\n if(haveThisType) {\n executed.push(this.resetCurrentFontFormatting());\n } else {\n // if(type === 'monospace' || hasMarkup['monospace']) {\n // executed.push(this.resetCurrentFormatting());\n // }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n } else */{\n if(hasMarkup['monospace'] && type === 'link') {\n executed.push(this.resetCurrentFormatting());\n }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n\n restore();\n\n // checkForSingle();\n // saveExecuted();\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.setActiveMarkupButton();\n }\n\n if(textNode) {\n (textNode.parentElement === this.messageInput ? textNode : textNode.parentElement).remove();\n textNode.nodeValue = '';\n }\n\n this.listenerSetter.remove(listener);\n this.messageInputField.simulateInputEvent();\n\n return true;\n }\n\n private resetCurrentFormatting() {\n return document.execCommand('removeFormat', false, null);\n }\n\n private resetCurrentFontFormatting() {\n return document.execCommand('fontName', false, 'Roboto');\n }\n\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\n // console.log('handleMarkdownShortcut', e);\n const formatKeys: {[key: string]: MarkdownType} = {\n 'KeyB': 'bold',\n 'KeyI': 'italic',\n 'KeyU': 'underline',\n 'KeyS': 'strikethrough',\n 'KeyM': 'monospace',\n 'KeyP': 'spoiler'\n };\n\n if(this.appImManager.markupTooltip) {\n formatKeys['KeyK'] = 'link';\n }\n\n const code = e.code;\n const applyMarkdown = formatKeys[code];\n\n const selection = document.getSelection();\n if(!isSelectionEmpty(selection) && applyMarkdown) {\n // * костыльчик\n if(code === 'KeyK') {\n this.appImManager.markupTooltip.showLinkEditor();\n } else {\n this.applyMarkdown(applyMarkdown);\n }\n\n cancelEvent(e); // cancel legacy event\n }\n\n // return;\n if(code === 'KeyZ') {\n let html = this.messageInput.innerHTML;\n\n if(e.shiftKey) {\n if(this.undoHistory.length) {\n this.executedHistory.push(html);\n html = this.undoHistory.pop();\n this.undoRedo(e, 'redo', html);\n html = this.messageInput.innerHTML;\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\n this.canUndoFromHTML = html;\n }\n } else {\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\n this.undoHistory.push(html);\n html = this.executedHistory.pop();\n this.undoRedo(e, 'undo', html);\n\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\n }\n }\n }\n };\n\n private onMessageInput = (e?: Event) => {\n // * validate due to manual formatting through browser's context menu\n /* const inputType = (e as InputEvent).inputType;\n console.log('message input event', e);\n if(inputType === 'formatBold') {\n console.log('message input format', this.messageInput.innerHTML);\n cancelEvent(e);\n }\n\n if(!isSelectionSingle()) {\n alert('not single');\n } */\n\n // console.log('messageInput input', this.messageInput.innerText);\n // const value = this.messageInput.innerText;\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\n\n // const entities = parseEntities(value);\n const value = parseMarkdown(richValue, markdownEntities, true);\n const entities = mergeEntities(markdownEntities, parseEntities(value));\n\n // this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\n\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n }\n\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter((e) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\n if(urlEntities.length) {\n for(const entity of urlEntities) {\n let url: string;\n if(entity._ === 'messageEntityTextUrl') {\n url = entity.url;\n } else {\n url = richValue.slice(entity.offset, entity.offset + entity.length);\n\n if(!(url.includes('http://') || url.includes('https://'))) {\n continue;\n }\n }\n\n // console.log('messageInput url:', url);\n\n if(this.lastUrl !== url) {\n this.lastUrl = url;\n // this.willSendWebPage = null;\n const promise = this.getWebPagePromise = this.managers.appWebPagesManager.getWebPage(url).then((webpage) => {\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\n if(this.lastUrl !== url) return;\n if(webpage._ === 'webPage') {\n // console.log('got webpage: ', webpage);\n\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\n delete this.noWebPage;\n this.willSendWebPage = webpage;\n } else if(this.willSendWebPage) {\n this.onHelperCancel();\n }\n });\n }\n\n break;\n }\n } else if(this.lastUrl) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n\n if(this.helperType) {\n this.helperFunc();\n } else {\n this.clearHelper();\n }\n }\n\n const isEmpty = !richValue.trim();\n if(isEmpty) {\n if(this.lastTimeType) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'}, undefined, this.chat.threadId);\n }\n\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.hide();\n }\n\n // * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared\n // * so have to reset formatting\n if(document.activeElement === this.messageInput) {\n // document.execCommand('styleWithCSS', false, 'true');\n setTimeout(() => {\n if(document.activeElement === this.messageInput) {\n this.resetCurrentFontFormatting();\n }\n }, 0);\n // document.execCommand('styleWithCSS', false, 'false');\n }\n } else {\n const time = Date.now();\n if((time - this.lastTimeType) >= 6000) {\n this.lastTimeType = time;\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'}, undefined, this.chat.threadId);\n }\n\n if(this.botCommands) {\n this.botCommands.toggle(true);\n }\n }\n\n if(this.botCommands) {\n this.updateBotCommandsToggle();\n }\n\n if(!this.editMsgId) {\n this.saveDraftDebounced();\n }\n\n this.checkAutocomplete(richValue, caretPos, entities);\n\n this.updateSendBtn();\n };\n\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\n RichInputHandler.getInstance().makeFocused(this.messageInput);\n\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\n const prefix = fullValue.substr(0, pos);\n const suffix = fullValue.substr(pos);\n\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\n\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\n const newPrefix = prefix.slice(0, matchIndex);\n const newValue = newPrefix + insertText + suffix;\n\n if(isHelper && caretPos !== -1) {\n const match = matches[2];\n // const {node, selection} = getCaretPosNew(this.messageInput);\n\n const selection = document.getSelection();\n // const range = document.createRange();\n let counter = 0;\n while(selection.toString() !== match) {\n if(++counter >= 10000) {\n throw new Error('lolwhat');\n }\n\n // for(let i = 0; i < match.length; ++i) {\n selection.modify('extend', 'backward', 'character');\n }\n }\n\n {\n // const fragment = wrapDraftText(insertText, {entities: insertEntity ? [insertEntity] : undefined, wrappingForPeerId: this.chat.peerId});\n insertRichTextAsHTML(this.messageInput, insertText, insertEntity ? [insertEntity] : undefined, this.chat.peerId);\n // const {node, offset} = getCaretPos(this.messageInput);\n // const fragmentLastChild = fragment.lastChild;\n // if(node?.nodeType === node.TEXT_NODE) {\n // const prefix = node.nodeValue.slice(0, offset);\n // const suffix = node.nodeValue.slice(offset);\n\n // const suffixNode = document.createTextNode(suffix);\n\n // node.nodeValue = prefix;\n // node.parentNode.insertBefore(suffixNode, node.nextSibling);\n // node.parentNode.insertBefore(fragment, suffixNode);\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // this.messageInputField.simulateInputEvent();\n // }\n }\n return;\n\n // merge emojis\n const hadEntities = parseEntities(fullValue);\n mergeEntities(entities, hadEntities);\n\n // max for additional whitespace\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\n const addEntities: MessageEntity[] = [];\n if(insertEntity) {\n addEntities.push(insertEntity);\n insertEntity.offset = matchIndex;\n }\n\n // add offset to entities next to emoji\n const diff = matches ? insertLength - matches[2].length : insertLength;\n entities.forEach((entity) => {\n if(entity.offset >= matchIndex) {\n entity.offset += diff;\n }\n });\n\n mergeEntities(entities, addEntities);\n\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\n const caretEntity: MessageEntity.messageEntityCaret = {\n _: 'messageEntityCaret',\n offset: matchIndex + insertLength,\n length: 0\n };\n\n let insertCaretAtIndex = 0;\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\n const entity = entities[insertCaretAtIndex];\n if(entity.offset > caretEntity.offset) {\n break;\n }\n }\n\n entities.splice(insertCaretAtIndex, 0, caretEntity);\n }\n\n // const saveExecuted = this.prepareDocumentExecute();\n // can't exec .value here because it will instantly check for autocomplete\n const value = documentFragmentToHTML(wrapDraftText(newValue, {entities}));\n this.messageInputField.setValueSilently(value);\n\n const caret = this.messageInput.querySelector('.composer-sel');\n if(caret) {\n setCaretAt(caret);\n caret.remove();\n }\n\n // but it's needed to be checked only here\n this.onMessageInput();\n\n // saveExecuted();\n\n // document.execCommand('insertHTML', true, wrapEmojiText(emoji));\n }\n\n public onEmojiSelected = (emoji: ReturnType, autocomplete: boolean) => {\n const entity: MessageEntity = emoji.docId ? {_: 'messageEntityCustomEmoji', document_id: emoji.docId, length: emoji.emoji.length, offset: 0} : getEmojiEntityFromEmoji(emoji.emoji);\n this.insertAtCaret(emoji.emoji, entity, autocomplete);\n };\n\n private async checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\n // return;\n\n if(value === undefined) {\n const r = getRichValueWithCaret(this.messageInputField.input, true, true);\n value = r.value;\n caretPos = r.caretPos;\n entities = r.entities;\n }\n\n if(caretPos === -1) {\n caretPos = value.length;\n }\n\n if(entities === undefined) {\n const _value = parseMarkdown(value, entities, true);\n entities = mergeEntities(entities, parseEntities(_value));\n }\n\n value = value.slice(0, caretPos);\n\n if(this.previousQuery === value) {\n return;\n }\n\n this.previousQuery = value;\n\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\n let foundHelper: AutocompleteHelper;\n if(matches) {\n const entity = entities[0];\n\n let query = matches[2];\n const firstChar = query[0];\n\n if(this.stickersHelper &&\n rootScope.settings.stickers.suggest &&\n await this.chat.canSend('send_stickers') &&\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\n foundHelper = this.stickersHelper;\n this.stickersHelper.checkEmoticon(value);\n } else if(firstChar === '@') { // mentions\n const topMsgId = this.chat.threadId ? getServerMessageId(this.chat.threadId) : undefined;\n if(await this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\n foundHelper = this.mentionsHelper;\n }\n } else if(!matches[1] && firstChar === '/') { // commands\n if(await this.commandsHelper.checkQuery(query, this.chat.peerId)) {\n foundHelper = this.commandsHelper;\n }\n } else if(rootScope.settings.emoji.suggest) { // emoji\n query = query.replace(/^\\s*/, '');\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\n foundHelper = this.emojiHelper;\n this.emojiHelper.checkQuery(query, firstChar);\n }\n }\n }\n\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\n\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\n }\n\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\n let needPlaceholder = false;\n\n const setPreloaderShow = (show: boolean) => {\n if(!this.btnPreloader) {\n return;\n }\n\n SetTransition({\n element: this.btnPreloader,\n className: 'show',\n forwards: show,\n duration: 400\n });\n };\n\n if(!foundHelper) {\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\n if(inlineMatch) {\n const username = inlineMatch[1];\n const query = value.slice(inlineMatch[0].length);\n needPlaceholder = inlineMatch[0].length === value.length;\n\n foundHelper = this.inlineHelper;\n\n if(!this.btnPreloader) {\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\n putPreloader(this.btnPreloader, true);\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\n } else {\n setPreloaderShow(true);\n }\n\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\n if(needPlaceholder && user.bot_inline_placeholder) {\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\n }\n\n renderPromise.then(() => {\n setPreloaderShow(false);\n });\n }).catch((err: ApiError) => {\n setPreloaderShow(false);\n });\n }\n }\n\n if(!needPlaceholder) {\n delete this.messageInput.dataset.inlinePlaceholder;\n }\n\n if(foundHelper !== this.inlineHelper) {\n setPreloaderShow(false);\n }\n\n return foundHelper;\n }\n\n private setRecording(value: boolean) {\n if(this.recording === value) {\n return;\n }\n\n SetTransition({\n element: this.chatInput,\n className: 'is-recording',\n forwards: value,\n duration: 200\n });\n this.recording = value;\n this.updateSendBtn();\n }\n\n private onBtnSendClick = async(e: Event) => {\n cancelEvent(e);\n\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\n if(this.recording) {\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\n this.onCancelRecordClick();\n } else {\n this.recorder.stop();\n }\n } else {\n this.sendMessage();\n }\n } else {\n const isAnyChat = this.chat.peerId.isAnyChat();\n if(isAnyChat && !(await this.chat.canSend('send_media'))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return;\n }\n\n this.chatInput.classList.add('is-locked');\n blurActiveElement();\n\n let restricted = false;\n if(!isAnyChat) {\n const userFull = await this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());\n if(userFull?.pFlags.voice_messages_forbidden) {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId: this.chat.peerId})]\n });\n restricted = true;\n }\n }\n\n if(restricted) {\n this.chatInput.classList.remove('is-locked');\n return;\n }\n\n this.recorder.start().then(() => {\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\n this.recordCanceled = false;\n\n this.setRecording(true);\n opusDecodeController.setKeepAlive(true);\n\n const showDiscardPopup = () => {\n new PopupPeer('popup-cancel-record', {\n titleLangKey: 'DiscardVoiceMessageTitle',\n descriptionLangKey: 'DiscardVoiceMessageDescription',\n buttons: [{\n langKey: 'DiscardVoiceMessageAction',\n callback: () => {\n simulateClickEvent(this.btnCancelRecord);\n }\n }, {\n langKey: 'Continue',\n isCancel: true\n }]\n }).show();\n };\n\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\n cancelEvent(e);\n showDiscardPopup();\n }\n }, {capture: true, passive: false}) as any;\n\n appNavigationController.pushItem(this.recordingNavigationItem = {\n type: 'voice',\n onPop: () => {\n setTimeout(() => {\n showDiscardPopup();\n }, 0);\n\n return false;\n }\n });\n\n this.recordStartTime = Date.now();\n\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\n const context = sourceNode.context;\n\n const analyser = context.createAnalyser();\n sourceNode.connect(analyser);\n // analyser.connect(context.destination);\n analyser.fftSize = 32;\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n const max = frequencyData.length * 255;\n const min = 54 / 150;\n const r = () => {\n if(!this.recording) return;\n\n analyser.getByteFrequencyData(frequencyData);\n\n let sum = 0;\n frequencyData.forEach((value) => {\n sum += value;\n });\n\n const percents = Math.min(1, (sum / max) + min);\n // console.log('frequencyData', frequencyData, percents);\n\n this.recordRippleEl.style.transform = `scale(${percents})`;\n\n const diff = Date.now() - this.recordStartTime;\n const ms = diff % 1000;\n\n const formatted = toHHMMSS(diff / 1000) + ',' + ('00' + Math.round(ms / 10)).slice(-2);\n\n this.recordTimeEl.innerText = formatted;\n\n fastRaf(r);\n };\n\n r();\n }).catch((e: Error) => {\n switch(e.name as string) {\n case 'NotAllowedError': {\n toast('Please allow access to your microphone');\n break;\n }\n\n case 'NotReadableError': {\n toast(e.message);\n break;\n }\n\n default:\n console.error('Recorder start error:', e, e.name, e.message);\n toast(e.message);\n break;\n }\n\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n });\n }\n };\n\n private onHelperCancel = async(e?: Event, force?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.willSendWebPage) {\n const lastUrl = this.lastUrl;\n let needReturn = false;\n if(this.helperType) {\n // if(this.helperFunc) {\n await this.helperFunc();\n // }\n\n needReturn = true;\n }\n\n // * restore values\n this.lastUrl = lastUrl;\n this.noWebPage = true;\n this.willSendWebPage = null;\n\n if(needReturn) return;\n }\n\n if(this.helperType === 'edit' && !force) {\n const message = this.editMessage;\n const draft = this.getCurrentInputAsDraft();\n if(draft) {\n delete draft.pFlags.no_webpage;\n }\n // const value = parseMarkdown(this.messageInputField.value, []);\n // if(message.message !== value) {\n if(!draftsAreEqual(draft, {...message, _: 'draftMessage'} as any)) {\n new PopupPeer('discard-editing', {\n buttons: [{\n langKey: 'Alert.Confirm.Discard',\n callback: () => {\n this.onHelperCancel(undefined, true);\n }\n }],\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\n }).show();\n\n return;\n }\n }\n\n this.clearHelper();\n this.updateSendBtn();\n };\n\n private onHelperClick = (e: Event) => {\n cancelEvent(e);\n\n if(!findUpClassName(e.target, 'reply')) return;\n if(this.helperType === 'forward') {\n const {forwardElements} = this;\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\n contextMenuController.openBtnMenu(forwardElements.container);\n }\n } else if(this.helperType === 'reply') {\n this.chat.setMessageId(this.replyToMsgId);\n } else if(this.helperType === 'edit') {\n this.chat.setMessageId(this.editMsgId);\n }\n };\n\n private changeForwardRecipient() {\n if(this.helperWaitingForward) return;\n this.helperWaitingForward = true;\n\n const forwarding = copy(this.forwarding);\n const helperFunc = this.helperFunc;\n this.clearHelper();\n this.updateSendBtn();\n let selected = false;\n const popup = new PopupForward(forwarding, () => {\n selected = true;\n });\n\n popup.addEventListener('close', () => {\n this.helperWaitingForward = false;\n\n if(!selected) {\n helperFunc();\n }\n });\n }\n\n public async clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\n const i = document.createElement('input');\n document.body.append(i);\n fixSafariStickyInput(i);\n this.messageInputField.setValueSilently(clearValue);\n fixSafariStickyInput(this.messageInput);\n i.remove();\n } else {\n this.messageInputField.setValueSilently(clearValue);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n // this.messageInput.innerText = '';\n } else {\n // this.attachMessageInputField();\n // this.messageInput.innerText = '';\n\n // clear executions\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n this.executedHistory.length = 0;\n this.canUndoFromHTML = '';\n }\n\n let set = false;\n if(canSetDraft) {\n set = await this.setDraft(undefined, false);\n }\n\n if(!set && fireEvent) {\n this.onMessageInput();\n }\n }\n\n public isInputEmpty() {\n return isInputEmpty(this.messageInput);\n }\n\n public updateSendBtn() {\n let icon: 'send' | 'record' | 'edit' | 'schedule';\n\n const isInputEmpty = this.isInputEmpty();\n\n if(this.editMsgId) icon = 'edit';\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\n else icon = 'record';\n\n ['send', 'record', 'edit', 'schedule'].forEach((i) => {\n this.btnSend.classList.toggle(i, icon === i);\n });\n\n if(this.btnScheduled) {\n this.btnScheduled.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n\n if(this.btnToggleReplyMarkup) {\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n }\n\n private getValueAndEntities(input: HTMLElement) {\n const {entities: apiEntities, value} = getRichValueWithCaret(this.messageInput, true, false);\n const myEntities = parseEntities(value);\n const totalEntities = mergeEntities(apiEntities, myEntities);\n\n return {value, totalEntities};\n }\n\n public onMessageSent(clearInput = true, clearReply?: boolean) {\n if(this.chat.type !== 'scheduled') {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\n }\n\n this.scheduleDate = undefined;\n this.sendSilent = undefined;\n\n const {totalEntities} = this.getValueAndEntities(this.messageInput);\n let nextOffset = 0;\n const emojiEntities: (MessageEntity.messageEntityEmoji | MessageEntity.messageEntityCustomEmoji)[] = totalEntities.filter((entity) => {\n if(entity._ === 'messageEntityEmoji' || entity._ === 'messageEntityCustomEmoji') {\n const endOffset = entity.offset + entity.length;\n return endOffset <= nextOffset ? false : (nextOffset = endOffset, true);\n }\n\n return false;\n }) as any;\n emojiEntities.forEach((entity) => {\n const emoji: AppEmoji = entity._ === 'messageEntityEmoji' ? {emoji: emojiFromCodePoints(entity.unicode)} : {docId: entity.document_id, emoji: ''};\n this.managers.appEmojiManager.pushRecentEmoji(emoji);\n });\n\n if(clearInput) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n this.clearInput();\n }\n\n if(clearReply || clearInput) {\n this.clearHelper();\n }\n\n this.updateSendBtn();\n }\n\n public sendMessage(force = false) {\n const {editMsgId, chat} = this;\n if(chat.type === 'scheduled' && !force && !editMsgId) {\n this.scheduleSending();\n return;\n }\n\n const {peerId} = chat;\n const {noWebPage} = this;\n const sendingParams = this.chat.getMessageSendingParams();\n\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n // return;\n if(editMsgId) {\n const message = this.editMessage;\n if(value.trim() || message.media) {\n this.managers.appMessagesManager.editMessage(message, value, {\n entities,\n noWebPage: noWebPage\n });\n\n this.onMessageSent();\n } else {\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\n\n return;\n }\n } else if(value.trim()) {\n this.managers.appMessagesManager.sendText(peerId, value, {\n entities,\n ...sendingParams,\n noWebPage: noWebPage,\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\n clearDraft: true\n });\n\n if(this.chat.type === 'scheduled') {\n this.onMessageSent(true);\n } else {\n this.onMessageSent(false, false);\n }\n // this.onMessageSent();\n }\n\n // * wait for sendText set messageId for invokeAfterMsg\n if(this.forwarding) {\n const forwarding = copy(this.forwarding);\n // setTimeout(() => {\n for(const fromPeerId in forwarding) {\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\n ...sendingParams,\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\n dropCaptions: this.isDroppingCaptions()\n }).catch(async(err: ApiError) => {\n if(err.type === 'VOICE_MESSAGES_FORBIDDEN') {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId})]\n });\n }\n });\n }\n\n if(!value) {\n this.onMessageSent();\n }\n // }, 0);\n }\n\n // this.onMessageSent();\n }\n\n public async sendMessageWithDocument(\n document: MyDocument | DocId,\n force = false,\n clearDraft = false,\n silent = false\n ) {\n document = await this.managers.appDocsManager.getDoc(document);\n\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend(flag))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return false;\n }\n\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft, silent));\n return false;\n }\n\n if(!document) {\n return false;\n }\n\n if(document.sticker && getStickerEffectThumb(document) && !rootScope.premium) {\n return false;\n }\n\n this.managers.appMessagesManager.sendFile(this.chat.peerId, document, {\n ...this.chat.getMessageSendingParams(),\n isMedia: true,\n clearDraft: clearDraft || undefined,\n silent\n });\n this.onMessageSent(clearDraft, true);\n\n if(document.type === 'sticker') {\n this.managers.appStickersManager.saveRecentSticker(document.id);\n }\n\n return true;\n }\n\n private canToggleHideAuthor() {\n const {forwardElements} = this;\n if(!forwardElements) return false;\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\n return !hideCaptionCheckboxField.checked ||\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\n }\n\n private isDroppingCaptions() {\n return !this.canToggleHideAuthor();\n }\n\n /* public sendSomething(callback: () => void, force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendSomething(callback, true));\n return false;\n }\n\n callback();\n this.onMessageSent(false, true);\n\n return true;\n } */\n\n public async initMessageEditing(mid: number) {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n let input = wrapDraftText(message.message, {entities: message.totalEntities, wrappingForPeerId: this.chat.peerId});\n const f = async() => {\n const replyFragment = await wrapMessageForReply({message, usingMids: [message.mid]});\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\n\n this.editMsgId = mid;\n this.editMessage = message;\n input = undefined;\n };\n f();\n }\n\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\n const f = async() => {\n // const peerTitles: string[]\n const fromPeerIds = Object.keys(fromPeerIdsMids).map((fromPeerId) => fromPeerId.toPeerId());\n const smth: Set = new Set();\n let length = 0, messagesWithCaptionsLength = 0;\n\n const p = fromPeerIds.map(async(fromPeerId) => {\n const mids = fromPeerIdsMids[fromPeerId];\n const promises = mids.map(async(mid) => {\n const message = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mid)) as Message.message;\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\n smth.add('N' + message.fwd_from.from_name);\n } else {\n smth.add('P' + message.fromId);\n }\n\n if(message.media && message.message) {\n ++messagesWithCaptionsLength;\n }\n });\n\n await Promise.all(promises);\n\n length += mids.length;\n });\n\n await Promise.all(p);\n\n const onlyFirstName = smth.size > 2;\n const peerTitles = [...smth].map((smth) => {\n const type = smth[0];\n smth = smth.slice(1);\n if(type === 'P') {\n const peerId = smth.toPeerId();\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\n } else {\n return onlyFirstName ? smth.split(' ')[0] : smth;\n }\n });\n\n const {forwardElements} = this;\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\n form.classList.toggle('hide', !messagesWithCaptionsLength);\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\n if(messagesWithCaptionsLength && hideCaption) {\n forwardElements.hideSender.checkboxField.setValueSilently(true);\n } else if(this.forwardWasDroppingAuthor !== undefined) {\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\n }\n\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n const title = i18n(titleKey, [length]);\n\n const senderTitles = document.createDocumentFragment();\n if(peerTitles.length < 3) {\n senderTitles.append(...join(peerTitles, false));\n } else {\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\n }\n\n let firstMessage: Message.message, usingFullAlbum: boolean;\n if(fromPeerIds.length === 1) {\n const fromPeerId = fromPeerIds[0];\n const mids = fromPeerIdsMids[fromPeerId];\n firstMessage = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mids[0])) as Message.message;\n\n usingFullAlbum = !!firstMessage.grouped_id;\n if(usingFullAlbum) {\n const albumMids = await this.managers.appMessagesManager.getMidsByMessage(firstMessage);\n if(albumMids.length !== length || albumMids.find((mid) => !mids.includes(mid))) {\n usingFullAlbum = false;\n }\n }\n }\n\n const subtitleFragment = document.createDocumentFragment();\n const delimiter = ': ';\n if(usingFullAlbum || length === 1) {\n const mids = fromPeerIdsMids[fromPeerIds[0]];\n const replyFragment = await wrapMessageForReply({message: firstMessage, usingMids: mids});\n subtitleFragment.append(\n senderTitles,\n delimiter,\n replyFragment\n );\n } else {\n subtitleFragment.append(\n i18n('Chat.Accessory.Forward.From'),\n delimiter,\n senderTitles\n );\n }\n\n const newReply = this.setTopInfo('forward', f, title, subtitleFragment);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const text = b.textElement;\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\n intl.update();\n });\n\n if(this.forwardHover) {\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\n }\n\n this.forwarding = fromPeerIdsMids;\n };\n\n f();\n }\n\n public async initMessageReply(mid: number) {\n if(this.replyToMsgId === mid) {\n return;\n }\n\n let message = await this.chat.getMessage(mid);\n const f = () => {\n let peerTitleEl: HTMLElement;\n if(!message) { // load missing replying message\n peerTitleEl = i18n('Loading');\n\n this.managers.appMessagesManager.reloadMessages(this.chat.peerId, mid).then((_message) => {\n if(this.replyToMsgId !== mid) {\n return;\n }\n\n message = _message;\n if(!message) {\n this.clearHelper('reply');\n } else {\n f();\n }\n });\n } else {\n peerTitleEl = new PeerTitle({\n peerId: message.fromId,\n dialog: false\n }).element;\n }\n\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\n this.replyToMsgId = mid;\n };\n f();\n }\n\n public clearHelper(type?: ChatInputHelperType) {\n if(this.helperType === 'edit' && type !== 'edit') {\n this.clearInput();\n }\n\n if(type) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n }\n\n if(type !== 'reply') {\n this.replyToMsgId = undefined;\n this.forwarding = undefined;\n }\n\n this.editMsgId = this.editMessage = undefined;\n this.helperType = this.helperFunc = undefined;\n\n if(this.chat.container.classList.contains('is-helper-active')) {\n appNavigationController.removeByType('input-helper');\n this.chat.container.classList.remove('is-helper-active');\n this.t();\n }\n }\n\n private t() {\n const className = 'is-toggling-helper';\n SetTransition({\n element: this.chat.container,\n className,\n forwards: true,\n duration: 150,\n onTransitionEnd: () => {\n this.chat.container.classList.remove(className);\n }\n });\n }\n\n public setInputValue(value: Parameters[0], clear = true, focus = true) {\n if(!value) value = '';\n\n if(clear) this.clearInput(false, false, value as string);\n else this.messageInputField.setValueSilently(value);\n\n fastRaf(() => {\n focus && placeCaretAtEnd(this.messageInput);\n this.onMessageInput();\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\n });\n }\n\n public setTopInfo(\n type: ChatInputHelperType,\n callerFunc: () => void,\n title: Parameters[0] = '',\n subtitle: Parameters[1] = '',\n input?: Parameters[0],\n message?: any\n ) {\n if(this.willSendWebPage && type === 'reply') {\n return;\n }\n\n if(type !== 'webpage') {\n this.clearHelper(type);\n this.helperType = type;\n this.helperFunc = callerFunc;\n }\n\n const replyParent = this.replyElements.container;\n const oldReply = replyParent.lastElementChild.previousElementSibling;\n const haveReply = oldReply.classList.contains('reply');\n\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\n const {container} = wrapReply(title, subtitle, this.chat.animationGroup, message);\n if(haveReply) {\n oldReply.replaceWith(container);\n } else {\n replyParent.insertBefore(container, replyParent.lastElementChild);\n }\n\n if(type === 'webpage') {\n container.style.cursor = 'default';\n }\n\n if(!this.chat.container.classList.contains('is-helper-active')) {\n this.chat.container.classList.add('is-helper-active');\n this.t();\n }\n\n /* const scroll = appImManager.scrollable;\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\n } */\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'input-helper',\n onPop: () => {\n this.onHelperCancel();\n }\n });\n }\n\n if(input !== undefined) {\n this.setInputValue(input);\n }\n\n setTimeout(() => {\n this.updateSendBtn();\n }, 0);\n\n return container;\n }\n\n // public saveScroll() {\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\n // this.scrollOffsetTop = this.chatInput.offsetTop;\n // }\n\n // public restoreScroll() {\n // if(this.chatInput.style.display) return;\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\n // let newOffsetTop = this.chatInput.offsetTop;\n // let container = this.chat.bubbles.scrollable.container;\n // let scrollTop = container.scrollTop;\n // let clientHeight = container.clientHeight;\n // let maxScrollTop = container.scrollHeight;\n\n // if(newOffsetTop < this.scrollOffsetTop) {\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\n // container.scrollTop += this.scrollDiff;\n // } else if(scrollTop !== this.scrollTop) {\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\n // if(endDiff < this.scrollDiff/* && false */) {\n // //container.scrollTop -= endDiff;\n // } else {\n // container.scrollTop -= this.scrollDiff;\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 {DraftMessage} from '../../layer';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\n\nexport default function wrapDraft(draft: DraftMessage.draftMessage, wrappingForPeerId: PeerId, loadPromises?: Promise[]) {\n const myEntities = parseEntities(draft.message);\n const apiEntities = draft.entities || [];\n const totalEntities = mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n\n return wrapDraftText(draft.message, {entities: totalEntities, wrappingForPeerId, loadPromises});\n}\n","/*\n * 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';\nimport type ChatTopbar from './topbar';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport DivAndCaption from '../divAndCaption';\nimport ripple from '../ripple';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Message} from '../../layer';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\nconst CLASSNAME_BASE = 'pinned-container';\nconst HEIGHT = 52;\n\nexport default class PinnedContainer {\n public wrapperUtils: HTMLElement;\n public btnClose: HTMLElement;\n protected wrapper: HTMLElement;\n\n protected topbar: ChatTopbar;\n protected chat: Chat;\n protected listenerSetter: ListenerSetter;\n public className: string;\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\n\n protected floating = false;\n\n public onClose?: () => void | Promise;\n\n constructor(options: {\n topbar: PinnedContainer['topbar'],\n chat: PinnedContainer['chat'],\n listenerSetter: PinnedContainer['listenerSetter'],\n className: PinnedContainer['className'],\n divAndCaption: PinnedContainer['divAndCaption'],\n onClose?: PinnedContainer['onClose'],\n floating?: PinnedContainer['floating']\n }) {\n safeAssign(this, options);\n\n const {divAndCaption, className} = this;\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\n\n this.btnClose = document.createElement('button');\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\n ripple(this.wrapper);\n\n this.wrapperUtils = document.createElement('div');\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\n this.wrapperUtils.append(this.btnClose);\n\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\n\n divAndCaption.container.append(this.wrapper/* , this.close */);\n\n this.attachOnCloseEvent(this.btnClose);\n }\n\n public attachOnCloseEvent(elem: HTMLElement) {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then((needClose) => {\n if(needClose) {\n this.toggle(true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n }\n\n public toggle(hide?: boolean) {\n const isHidden = this.divAndCaption.container.classList.contains('hide');\n if(hide === undefined) {\n hide = !isHidden;\n } else if(hide === isHidden) {\n return;\n }\n\n // const scrollable = this.chat.bubbles.scrollable;\n\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\n\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\n this.divAndCaption.container.classList.toggle('hide', hide);\n\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\n\n // const active = classNames.filter((className) => this.topbar.container.classList.contains(className));\n // const maxActive = hide ? 0 : 1;\n\n // * not sure when it became unneeded\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\n // }\n\n this.topbar.setFloating();\n this.topbar.setUtilsWidth();\n }\n\n public isVisible() {\n return !this.divAndCaption.container.classList.contains('hide');\n }\n\n public isFloating() {\n return this.divAndCaption.container.classList.contains('is-floating');\n }\n\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\n this.divAndCaption.container.dataset.mid = '' + message.mid;\n this.divAndCaption.fill(title, subtitle, message);\n this.topbar.setUtilsWidth();\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}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppMessagesManager} from '../../lib/appManagers/appMessagesManager';\nimport type ChatTopbar from './topbar';\nimport rootScope from '../../lib/rootScope';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from '../appMediaPlaybackController';\nimport DivAndCaption from '../divAndCaption';\nimport PinnedContainer from './pinnedContainer';\nimport Chat from './chat';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport PeerTitle from '../peerTitle';\nimport {i18n} from '../../lib/langPack';\nimport {formatFullSentTime} from '../../helpers/date';\nimport ButtonIcon from '../buttonIcon';\nimport {DocumentAttribute} from '../../layer';\nimport MediaProgressLine from '../mediaProgressLine';\nimport VolumeSelector from '../volumeSelector';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n private fasterEl: HTMLElement;\n private repeatEl: HTMLButtonElement;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected managers: AppManagers) {\n super({\n topbar,\n chat,\n listenerSetter: topbar.listenerSetter,\n className: 'audio',\n divAndCaption: new DivAndCaption(\n 'pinned-audio',\n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ),\n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('fast_rewind active', {noRipple: true});\n const nextEl = ButtonIcon('fast_forward active', {noRipple: true});\n\n const attachClick = (elem: HTMLElement, callback: () => void) => {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n callback();\n }, {listenerSetter: this.topbar.listenerSetter});\n };\n\n attachClick(prevEl, () => {\n appMediaPlaybackController.previous();\n });\n\n attachClick(nextEl, () => {\n appMediaPlaybackController.next();\n });\n\n this.toggleEl = ButtonIcon('', {noRipple: true});\n this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico');\n attachClick(this.toggleEl, () => {\n appMediaPlaybackController.toggle();\n });\n this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl);\n\n this.volumeSelector = new VolumeSelector(this.listenerSetter, true);\n const volumeProgressLineContainer = document.createElement('div');\n volumeProgressLineContainer.classList.add('progress-line-container');\n volumeProgressLineContainer.append(this.volumeSelector.container);\n const tunnel = document.createElement('div');\n tunnel.classList.add('pinned-audio-volume-tunnel');\n this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active');\n this.volumeSelector.btn.prepend(tunnel);\n this.volumeSelector.btn.append(volumeProgressLineContainer);\n\n this.repeatEl = ButtonIcon('audio_repeat', {noRipple: true});\n attachClick(this.repeatEl, () => {\n const params = appMediaPlaybackController.getPlaybackParams();\n if(!params.round) {\n appMediaPlaybackController.round = true;\n } else if(params.loop) {\n appMediaPlaybackController.round = false;\n appMediaPlaybackController.loop = false;\n } else {\n appMediaPlaybackController.loop = !appMediaPlaybackController.loop;\n }\n });\n\n const fasterEl = this.fasterEl = ButtonIcon('playback_2x', {noRipple: true});\n attachClick(fasterEl, () => {\n appMediaPlaybackController.playbackRate = fasterEl.classList.contains('active') ? 1 : 1.75;\n });\n\n this.wrapperUtils.prepend(this.volumeSelector.btn, fasterEl, this.repeatEl);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(appMediaPlaybackController)('play', this.onMediaPlay);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('pause', this.onPause);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('stop', this.onStop);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.onPlaybackParams);\n\n const playingDetails = appMediaPlaybackController.getPlayingDetails();\n if(playingDetails) {\n this.onMediaPlay(playingDetails);\n this.onPlaybackParams(playingDetails.playbackParams);\n }\n }\n\n public destroy() {\n if(this.progressLine) {\n this.progressLine.removeListeners();\n }\n }\n\n private onPlaybackParams = (playbackParams: ReturnType) => {\n this.fasterEl.classList.toggle('active', playbackParams.playbackRate > 1);\n\n this.repeatEl.classList.remove('tgico-audio_repeat', 'tgico-audio_repeat_single');\n this.repeatEl.classList.add(playbackParams.loop ? 'tgico-audio_repeat_single' : 'tgico-audio_repeat');\n this.repeatEl.classList.toggle('active', playbackParams.loop || playbackParams.round);\n };\n\n private onPause = () => {\n this.toggleEl.classList.remove('flip-icon');\n };\n\n private onStop = () => {\n this.toggle(true);\n };\n\n private onMediaPlay = ({doc, message, media, playbackParams}: ReturnType) => {\n let title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment;\n const isMusic = doc.type !== 'voice' && doc.type !== 'round';\n if(!isMusic) {\n title = new PeerTitle({peerId: message.fromId, fromName: message.fwd_from?.from_name}).element;\n\n // subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = wrapEmojiText(audioAttribute?.title ?? doc.file_name);\n subtitle = audioAttribute?.performer ? wrapEmojiText(audioAttribute.performer) : i18n('AudioUnknownArtist');\n }\n\n this.fasterEl.classList.toggle('hide', isMusic);\n this.repeatEl.classList.toggle('hide', !isMusic);\n\n this.onPlaybackParams(playbackParams);\n this.volumeSelector.setVolume();\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n // this.toggleEl.classList.add('flip-icon');\n this.toggleEl.classList.toggle('flip-icon', !media.paused);\n this.toggle(false);\n };\n}\n","/*\n * 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 ChatTopbar from './topbar';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport PinnedContainer from './pinnedContainer';\nimport PinnedMessageBorder from './pinnedMessageBorder';\nimport ReplyContainer, {wrapReplyDivAndCaption} from './replyContainer';\nimport rootScope from '../../lib/rootScope';\nimport Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport ButtonIcon from '../buttonIcon';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport {i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport handleScrollSideEvent from '../../helpers/dom/handleScrollSideEvent';\nimport debounce from '../../helpers/schedulers/debounce';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Message} from '../../layer';\nimport {logger} from '../../lib/logger';\n\nclass AnimatedSuper {\n static DURATION = 200;\n static BASE_CLASS = 'animated-super';\n container: HTMLDivElement;\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\n clearTimeout: number;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.className = AnimatedSuper.BASE_CLASS;\n }\n\n public getRow(index: number, animateFirst = false) {\n if(this.rows[index]) return this.rows[index].element;\n const row = document.createElement('div');\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\n this.rows[index] = {element: row, new: true};\n this.container.append(row);\n return row;\n }\n\n public clearRow(index: number) {\n if(!this.rows[index]) return;\n this.rows[index].element.remove();\n delete this.rows[index];\n }\n\n public clearRows(currentIndex?: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n this.clearTimeout = window.setTimeout(() => {\n for(const i in this.rows) {\n if(+i === currentIndex) continue;\n this.clearRow(+i);\n }\n }, AnimatedSuper.DURATION);\n }\n\n public setNewRow(index: number, reflow = false) {\n const row = this.rows[index];\n if(row.new) {\n if(reflow) {\n row.element.classList.remove('hide');\n void row.element.offsetLeft; // reflow\n } else {\n row.element.classList.remove('is-hiding', 'hide');\n }\n\n delete row.new;\n }\n\n this.clearRows(index);\n }\n\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\n return this.setNewRow(index);\n }\n\n const row = this.rows[index];\n const previousRow = this.rows[previousIndex];\n if(!previousRow && !ignorePrevious) {\n return this.setNewRow(index);\n }\n\n const sides = ['from-top', 'from-bottom'];\n if(!fromTop) sides.reverse();\n\n row.element.classList.add(sides[0]);\n row.element.classList.remove(sides[1]);\n if(previousRow) {\n previousRow.element.classList.add(sides[1]);\n previousRow.element.classList.remove(sides[0]);\n }\n\n if(row.new) {\n this.setNewRow(index, true);\n }\n\n row.element.classList.toggle('is-hiding', false);\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\n\n /* const height = row.element.getBoundingClientRect().height;\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\n if(previousRow) {\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\n } */\n\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\n if(previousRow) {\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\n } */\n\n this.clearRows(index);\n }\n}\n\nclass AnimatedCounter {\n static EMPTY_INDEX = -1;\n static BASE_CLASS = 'animated-counter';\n container: HTMLElement;\n decimals: {\n container: HTMLElement,\n placeholder: HTMLElement,\n animatedSuper: AnimatedSuper\n }[] = [];\n previousNumber = 0;\n clearTimeout: number;\n\n constructor(private reverse = false) {\n this.container = document.createElement('div');\n this.container.className = AnimatedCounter.BASE_CLASS;\n }\n\n getDecimal(index: number) {\n if(this.decimals[index]) return this.decimals[index];\n const item = document.createElement('div');\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\n\n const placeholder = document.createElement('div');\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\n\n const animatedSuper = new AnimatedSuper();\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\n\n item.append(placeholder, animatedSuper.container);\n\n this.container.append(item);\n\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\n }\n\n clear(number: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n\n const decimals = ('' + number).length;\n if(decimals >= this.decimals.length) {\n return;\n }\n\n this.clearTimeout = window.setTimeout(() => {\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\n byDecimal.forEach((decimal) => {\n decimal.container.remove();\n });\n }, AnimatedSuper.DURATION);\n }\n\n /* prepareNumber(number: number) {\n const decimals = ('' + number).length;\n if(this.decimals.length < decimals) {\n for(let i = this.decimals.length; i < decimals; ++i) {\n this.getDecimal(i);\n }\n }\n } */\n\n hideLeft(number: number) {\n const decimals = ('' + number).length;\n const byDecimal = this.decimals.slice(decimals);// this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\n byDecimal.forEach((decimal) => {\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.clear(number);\n }\n\n setCount(number: number) {\n // this.prepareNumber(number);\n\n const previousByDecimal = Array.from('' + this.previousNumber).map((n) => +n);\n const byDecimal = Array.from('' + number).map((n) => +n);\n byDecimal.forEach((decimalNumber, idx) => {\n const decimal = this.getDecimal(idx);\n // const row = decimal.animatedSuper.getRow(number, true);\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\n // decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.hideLeft(number);\n // this.clear(number);\n this.previousNumber = number;\n }\n}\n\nexport default class ChatPinnedMessage {\n private static LOAD_COUNT = 50;\n private static LOAD_OFFSET = 5;\n\n public pinnedMessageContainer: PinnedContainer;\n private pinnedMessageBorder: PinnedMessageBorder;\n\n private pinnedMaxMid = 0;\n public pinnedMid = 0;\n public pinnedIndex = -1;\n private wasPinnedIndex = 0;\n private wasPinnedMediaIndex = 0;\n\n public locked = false;\n private waitForScrollBottom = false;\n\n public count = 0;\n private mids: number[] = [];\n private offsetIndex = 0;\n\n private loading = false;\n private loadedBottom = false;\n private loadedTop = false;\n\n private animatedSubtitle: AnimatedSuper;\n private animatedMedia: AnimatedSuper;\n private animatedCounter: AnimatedCounter;\n\n private listenerSetter: ListenerSetter;\n private scrollDownListenerSetter: ListenerSetter = null;\n\n public hidden = false;\n\n private getCurrentIndexPromise: Promise = null;\n private btnOpen: HTMLButtonElement;\n\n private setPinnedMessage: () => void;\n\n private isStatic: boolean;\n\n private debug: boolean;\n\n public setCorrectIndexThrottled: (lastScrollDirection?: number) => void;\n\n private log: ReturnType;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, private managers: AppManagers) {\n this.listenerSetter = new ListenerSetter();\n this.log = logger('PM');\n this.debug = true;\n this.isStatic = false;\n\n const dAC = new ReplyContainer('pinned-message', chat.animationGroup);\n this.pinnedMessageContainer = new PinnedContainer({\n topbar,\n chat,\n listenerSetter: this.listenerSetter,\n className: 'message',\n divAndCaption: dAC,\n onClose: async() => {\n if(await managers.appPeersManager.canPinMessage(this.chat.peerId)) {\n new PopupPinMessage(this.chat.peerId, this.pinnedMid, true);\n } else {\n new PopupPinMessage(this.chat.peerId, 0, true);\n }\n\n return false;\n }\n });\n\n this.pinnedMessageBorder = new PinnedMessageBorder();\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\n\n this.animatedSubtitle = new AnimatedSuper();\n dAC.subtitle.append(this.animatedSubtitle.container);\n\n this.animatedMedia = new AnimatedSuper();\n this.animatedMedia.container.classList.add('pinned-message-media-container');\n dAC.content.prepend(this.animatedMedia.container);\n\n this.animatedCounter = new AnimatedCounter(true);\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\n\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\n dAC.container.prepend(btnClose);\n\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\n\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\n\n attachClickEvent(this.btnOpen, (e) => {\n cancelEvent(e);\n this.topbar.openPinned(true);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n // this.wasPinnedIndex = 0;\n // setTimeout(() => {\n if(this.hidden) {\n this.pinnedMessageContainer.toggle(this.hidden = false);\n }\n\n this.loadedTop = this.loadedBottom = false;\n this.pinnedIndex = -1;\n this.pinnedMid = 0;\n this.count = 0;\n this.mids = [];\n this.offsetIndex = 0;\n this.pinnedMaxMid = 0;\n this.setCorrectIndex(0);\n // }, 300);\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n this.pinnedMessageContainer.toggle(this.hidden = true);\n }\n });\n\n // * 200 - no lags\n // * 100 - need test\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\n this.setCorrectIndexThrottled = throttle(this.setCorrectIndex.bind(this), 100, false);\n\n this.isStatic = !this.chat.isPinnedMessagesNeeded();\n }\n\n public destroy() {\n this.pinnedMessageContainer.divAndCaption.container.remove();\n this.pinnedMessageContainer.toggle(true);\n this.listenerSetter.removeAll();\n this.unsetScrollDownListener(false);\n }\n\n public setCorrectIndex(lastScrollDirection?: number) {\n if(this.isStatic) return;\n // return;\n\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\n return;\n }\n\n if((this.loadedBottom || this.loadedTop) && !this.count) {\n return;\n }\n\n // const perf = performance.now();\n const el = this.chat.bubbles.getBubbleByPoint('bottom');\n // this.log('setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(!el) return;\n\n // return;\n\n const mid = el.dataset.mid;\n if(el && mid !== undefined) {\n // this.log('setCorrectIndex will test mid:', mid);\n this.testMid(+mid, lastScrollDirection);\n }\n }\n\n public testMid(mid: number, lastScrollDirection?: number) {\n if(this.isStatic) return;\n\n // if(lastScrollDirection !== undefined) return;\n if(this.hidden) return;\n\n // this.log('testMid', mid);\n\n let currentIndex: number = this.mids.findIndex((_mid) => _mid <= mid);\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\n currentIndex += this.offsetIndex;\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\n // currentIndex = 0;\n currentIndex = this.mids.length - 1 + this.offsetIndex;\n } else {\n if(!this.getCurrentIndexPromise) {\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\n }\n\n return;\n }\n\n // const idx = Math.max(0, this.mids.indexOf(mid));\n\n /* if(currentIndex === this.count) {\n currentIndex = 0;\n } */\n\n // this.log('testMid: pinned currentIndex', currentIndex, mid);\n\n const changed = this.pinnedIndex !== currentIndex;\n if(changed) {\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\n return;\n }\n }\n\n this.pinnedIndex = currentIndex;\n this.pinnedMid = this.mids.find((_mid) => _mid <= mid) || this.mids[this.mids.length - 1];\n this.setPinnedMessage();\n }\n }\n\n private isNeededMore(currentIndex: number) {\n return (this.count > ChatPinnedMessage.LOAD_COUNT &&\n (\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) ||\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\n )\n );\n }\n\n private async getCurrentIndex(mid: number, correctAfter = true) {\n if(this.loading) return;\n this.loading = true;\n\n try {\n const log = this.debug ? this.log.bindPrefix('getCurrentIndex') : undefined;\n log && log('start', mid, correctAfter);\n\n let gotRest = false;\n const promises = [\n this.managers.appMessagesManager.getSearch({\n peerId: this.chat.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: mid,\n limit: ChatPinnedMessage.LOAD_COUNT,\n backLimit: ChatPinnedMessage.LOAD_COUNT,\n threadId: this.chat.threadId\n })\n .then((r) => {\n gotRest = true;\n return r;\n })\n ];\n\n if(!this.pinnedMaxMid) {\n const promise = this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId, this.chat.threadId).then((p) => {\n if(!p.maxId) return;\n this.pinnedMaxMid = p.maxId;\n\n if(!gotRest && correctAfter) {\n this.mids = [this.pinnedMaxMid];\n this.count = p.count;\n this.pinnedIndex = 0;\n this.pinnedMid = this.mids[0];\n this.setPinnedMessage();\n // this.pinnedMessageContainer.toggle(false);\n }\n });\n\n promises.push(promise as any);\n }\n\n const result = (await Promise.all(promises))[0];\n\n let backLimited = result.history.findIndex((message) => message.mid <= mid);\n if(backLimited === -1) {\n backLimited = result.history.length;\n }/* else {\n backLimited -= 1;\n } */\n\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\n this.mids = result.history.map((message) => message.mid).slice();\n this.count = result.count;\n\n if(!this.count) {\n this.pinnedMessageContainer.toggle(true);\n }\n\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\n this.loadedBottom = !this.offsetIndex;\n\n log && log('result', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\n } catch(err) {\n this.log.error('getCurrentIndex error', err);\n }\n\n this.loading = false;\n\n if(this.locked) {\n this.testMid(mid);\n } else if(correctAfter) {\n this.setCorrectIndex(0);\n }\n\n this.getCurrentIndexPromise = null;\n // return result.offset_id_offset || 0;\n }\n\n public setScrollDownListener() {\n this.waitForScrollBottom = true;\n\n if(!this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter = new ListenerSetter();\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\n this.unsetScrollDownListener();\n }, this.scrollDownListenerSetter);\n }\n }\n\n public unsetScrollDownListener(refreshPosition = true) {\n this.waitForScrollBottom = false;\n\n if(this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter.removeAll();\n this.scrollDownListenerSetter = null;\n }\n\n if(refreshPosition) {\n this.setCorrectIndex(0);\n }\n }\n\n public async handleFollowingPinnedMessage() {\n this.locked = true;\n\n this.debug && this.log('handleFollowingPinnedMessage');\n try {\n this.setScrollDownListener();\n\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise instanceof Promise) {\n await setPeerPromise;\n }\n\n // await this.chat.bubbles.scrollable.scrollLockedPromise;\n await getHeavyAnimationPromise();\n\n if(this.getCurrentIndexPromise) {\n await this.getCurrentIndexPromise;\n }\n\n this.debug && this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n\n /* // подождём, пока скролл остановится\n setTimeout(() => {\n this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n }, 50); */\n } catch(err) {\n this.log.error('handleFollowingPinnedMessage error:', err);\n\n this.locked = false;\n this.waitForScrollBottom = false;\n this.setCorrectIndex(0);\n }\n }\n\n public async followPinnedMessage(mid: number) {\n const message = await this.chat.getMessage(mid);\n if(!message) {\n return;\n }\n\n this.chat.setMessageId(mid);\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\n this.handleFollowingPinnedMessage();\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\n });\n }\n\n public async _setPinnedMessage() {\n // ///this.log('setting pinned message', message);\n // return;\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\n Promise.all([\n promise\n ]).then(() => { */\n // const mids = results[0];\n const count = this.count;\n if(count) {\n const pinnedIndex = this.pinnedIndex;\n const message = await this.chat.getMessage(this.pinnedMid);\n\n // this.animatedCounter.prepareNumber(count);\n\n // setTimeout(() => {\n const isLast = pinnedIndex === 0;\n this.animatedCounter.container.classList.toggle('is-last', isLast);\n // SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\n if(!isLast) {\n this.animatedCounter.setCount(count - pinnedIndex);\n }\n // }, 100);\n\n // this.pinnedMessageContainer.fill(undefined, message.message, message);\n this.pinnedMessageContainer.toggle(false);\n\n const fromTop = pinnedIndex > this.wasPinnedIndex;\n\n this.debug && this.log('setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\n\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\n writeMediaTo.classList.add('pinned-message-media');\n // writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\n const loadPromises: Promise[] = [];\n const isMediaSet = await wrapReplyDivAndCaption({\n title: undefined,\n titleEl: null,\n subtitle: (message as Message.message).message,\n subtitleEl: writeTo,\n message,\n mediaEl: writeMediaTo,\n loadPromises,\n animationGroup: this.chat.animationGroup\n });\n\n await Promise.all(loadPromises);\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\n\n // if(this.wasPinnedIndex !== this.pinnedIndex) {\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\n if(isMediaSet) {\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\n this.wasPinnedMediaIndex = pinnedIndex;\n } else {\n this.animatedMedia.clearRows();\n }\n // }\n\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\n this.wasPinnedIndex = pinnedIndex;\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\n } else {\n this.pinnedMessageContainer.toggle(true);\n this.wasPinnedIndex = 0;\n }\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 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 type ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\n if(IS_TOUCH_SUPPORTED) {\n let lastY: number;\n const options = {passive: true};\n listenerSetter.add(elem)('touchstart', (e) => {\n if(e.touches.length > 1) {\n onTouchEnd();\n return;\n }\n\n lastY = e.touches[0].clientY;\n\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\n }, options);\n\n const onTouchMove = (e: TouchEvent) => {\n const clientY = e.touches[0].clientY;\n\n const isDown = clientY < lastY;\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n lastY = clientY;\n // alert('isDown: ' + !!isDown);\n };\n\n const onTouchEnd = () => {\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\n };\n } else {\n listenerSetter.add(elem)('wheel', (e) => {\n const isDown = e.deltaY > 0;\n // this.log('wheel', e, isDown);\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n }, {passive: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Channel} from '../../lib/appManagers/appChatsManager';\nimport type {AppSidebarRight} from '../sidebarRight';\nimport type Chat from './chat';\nimport {RIGHT_COLUMN_ACTIVE_CLASSNAME} from '../sidebarRight';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ChatAudio from './audio';\nimport ChatPinnedMessage from './pinnedMessage';\nimport {ButtonMenuItemOptions} from '../buttonMenu';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PopupDeleteDialog from '../popups/deleteDialog';\nimport appNavigationController from '../appNavigationController';\nimport {LEFT_COLUMN_ACTIVE_CLASSNAME} from '../sidebarLeft';\nimport PeerTitle from '../peerTitle';\nimport {i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {ChatFull, Chat as MTChat, GroupCall} from '../../layer';\nimport PopupPickUser from '../popups/pickUser';\nimport PopupPeer from '../popups/peer';\nimport 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 {AppManagers} from '../../lib/appManagers/managers';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport groupCallsController from '../../lib/calls/groupCallsController';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {makeMediaSize} from '../../helpers/mediaSize';\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean | Promise};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnCall: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLElement;\n\n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: Parameters[0]['buttons'];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n private person: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appSidebarRight: AppSidebarRight,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n // this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar', 'hide');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = this.person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.managers);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: this.menuButtons,\n onOpen: async(e, element) => {\n const deleteButton = this.menuButtons[this.menuButtons.length - 1];\n if(deleteButton?.element) {\n const deleteButtonText = await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n deleteButton.element.lastChild.replaceWith(i18n(deleteButtonText));\n }\n }\n });\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null,\n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null,\n this.btnJoin,\n this.btnPinned,\n this.btnCall,\n this.btnGroupCall,\n this.btnMute,\n this.btnSearch,\n this.btnMore\n ].filter(Boolean));\n\n this.pushButtonToVerify(this.btnCall, this.verifyCallButton.bind(this, 'voice'));\n this.pushButtonToVerify(this.btnGroupCall, this.verifyVideoChatButton);\n\n this.chatInfoContainer.append(this.btnBack, this.chatInfo, this.chatUtils);\n this.container.append(this.chatInfoContainer);\n\n if(this.chatAudio) {\n // this.container.append(this.chatAudio.divAndCaption.container, this.chatUtils);\n this.container.append(this.chatAudio.divAndCaption.container);\n }\n\n // * construction end\n\n // * fix topbar overflow section\n\n this.listenerSetter.add(window)('resize', this.onResize);\n this.listenerSetter.add(mediaSizes)('changeScreen', this.onChangeScreen);\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'pinned-container');\n blurActiveElement();\n if(container) {\n cancelEvent(e);\n\n if(findUpClassName(e.target, 'progress-line')) {\n return;\n }\n\n const mid = +container.dataset.mid;\n if(container.classList.contains('pinned-message')) {\n // if(!this.pinnedMessage.locked) {\n this.pinnedMessage.followPinnedMessage(mid);\n // }\n } else {\n const peerId = container.dataset.peerId.toPeerId();\n const searchContext = appMediaPlaybackController.getSearchContext();\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n type: searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined),\n threadId: searchContext.threadId\n });\n }\n } else {\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n onBtnBackClick();\n } else if(findUpTag(e.target, 'AVATAR-ELEMENT')) {\n this.appSidebarRight.toggleSidebar(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME));\n } else {\n this.appSidebarRight.toggleSidebar(true);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onBtnBackClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n // const item = appNavigationController.findItemByType('chat');\n // * return manually to chat by arrow, since can't get back to\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.chat.appImManager.setPeer({peerId: this.peerId});\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: ButtonToVerify['verify']) {\n if(!element) {\n return;\n }\n\n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const r = async() => {\n const buttons = this.buttonsToVerify.concat(isMenuOpen ? this.menuButtons as any : []);\n const results = await Promise.all(buttons.map(async(button) => {\n return {\n result: await button.verify(),\n button\n }\n }));\n\n results.forEach(({button, result}) => {\n button.element.classList.toggle('hide', !result);\n });\n };\n\n r();\n };\n\n private verifyVideoChatButton = async(type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser() || this.chat.type !== 'chat' || this.chat.threadId) return false;\n\n const currentGroupCall = groupCallsController.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if(((await this.managers.appPeersManager.isBroadcast(this.peerId)) && type === 'group') ||\n ((await this.managers.appPeersManager.isAnyGroup(this.peerId)) && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || hasRights(chat, 'manage_call');\n };\n\n private verifyCallButton = async(type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = await this.managers.appProfileManager.getCachedFullUser(userId);\n\n return !!userFull && !!(type === 'voice' ? userFull.pFlags.phone_calls_available : userFull.pFlags.video_calls_available);\n };\n\n public constructUtils() {\n this.menuButtons = [{\n icon: 'search',\n text: 'Search',\n onClick: () => {\n this.chat.initSearch();\n },\n verify: () => mediaSizes.isMobile\n }, /* {\n icon: 'pinlist',\n text: 'Pinned Messages',\n onClick: () => this.openPinned(false),\n verify: () => mediaSizes.isMobile\n }, */{\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.chat.threadId});\n },\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((channelFull) => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer({\n peerId: channelFull.linked_chat_id.toPeerId(true)\n });\n }\n });\n },\n verify: async() => {\n const chatFull = await this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'phone',\n text: 'Call',\n onClick: this.onCallClick.bind(this, 'voice'),\n verify: this.verifyCallButton.bind(this, 'voice')\n }, {\n icon: 'videocamera',\n text: 'VideoCall',\n onClick: this.onCallClick.bind(this, 'video'),\n verify: this.verifyCallButton.bind(this, 'video')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n apiManagerProxy.getState().then((state) => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = async(bubble) => {\n this.managers.appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!this.chat.bubbles.getRenderedLength()\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = this.appSidebarRight.createTab(AppEditContactTab);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: async() => this.peerId.isUser() && !(await this.managers.appPeersManager.isContact(this.peerId))\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.managers.appMessagesManager.sendContact(peerId, contactPeerId);\n this.chat.appImManager.setInnerPeer({peerId});\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: async() => rootScope.myId !== this.peerId && this.peerId.isUser() && (await this.managers.appPeersManager.isContact(this.peerId)) && !!(await this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone\n }, {\n icon: 'bots',\n text: 'Settings',\n onClick: () => {\n this.managers.appMessagesManager.sendText(this.peerId, '/settings');\n },\n verify: async() => {\n try {\n const attachMenuBot = await this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());\n return !!attachMenuBot?.pFlags?.has_settings;\n } catch(err) {\n return false;\n }\n }\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, true).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: async() => {\n if(!this.peerId.isUser()) return false;\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, false).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: async() => {\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: async() => this.chat.type === 'chat' && !!(await this.managers.appMessagesManager.getDialogOnly(this.peerId))\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onCallClick(type: CallType) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), type);\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n private constructAvatar() {\n const avatarElement = new AvatarElement();\n avatarElement.isDialog = true;\n avatarElement.classList.add('avatar-42', 'person-avatar');\n return avatarElement;\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public constructPeerHelpers() {\n this.avatarElement = this.constructAvatar();\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnCall = ButtonIcon('phone');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnCall, this.onCallClick.bind(this, 'voice'));\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, this.onMuteClick);\n\n this.attachClickEvent(this.btnJoin, async() => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(await this.managers.appChatsManager.isChannel(chatId)) {\n promise = this.managers.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.managers.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = await this.managers.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n\n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n apiManagerProxy.getState().then((state) => {\n if(!middleware() || !this.pinnedMessage) 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 this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n this.setTitle();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\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 this.pinnedMessage?.destroy(); // * возможно это можно не делать\n this.chatAudio?.destroy();\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public cleanup() {\n if(!this.chat.peerId) {\n this.container.classList.add('hide');\n }\n }\n\n public async finishPeerChange(isTarget: boolean) {\n const {peerId, threadId} = this.chat;\n\n let newAvatar: AvatarElement;\n if(this.chat.type === 'chat') {\n if(this.avatarElement?.peerId !== this.peerId || this.avatarElement.threadId !== this.chat.threadId) {\n newAvatar = this.constructAvatar();\n } else {\n newAvatar = this.avatarElement;\n }\n }\n\n const [isBroadcast, isAnyChat, chat, _, setTitleCallback, setStatusCallback, state] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isAnyChat(peerId),\n peerId.isAnyChat() ? this.managers.appChatsManager.getChat(peerId.toChatId()) : undefined,\n newAvatar ? newAvatar.updateWithOptions({peerId, threadId, wrapOptions: {customEmojiSize: makeMediaSize(32, 32)}}) : undefined,\n this.setTitleManual(),\n this.setPeerStatusManual(true),\n apiManagerProxy.getState()\n ]);\n\n return () => {\n const canHaveSomeButtons = !(this.chat.type === 'pinned' || this.chat.type === 'scheduled');\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast || !canHaveSomeButtons);\n if(this.btnJoin) {\n if(isAnyChat && !this.chat.isRestricted && canHaveSomeButtons) {\n replaceContent(this.btnJoin, i18n(isBroadcast ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !(chat as MTChat.chat)?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n if(this.btnSearch) {\n this.btnSearch.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.btnPinned) {\n this.btnPinned.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.avatarElement !== newAvatar) {\n if(newAvatar) {\n if(this.avatarElement) {\n this.avatarElement.replaceWith(newAvatar);\n } else {\n this.person.prepend(newAvatar);\n }\n }\n\n this.avatarElement?.remove();\n this.avatarElement = newAvatar;\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n if(this.btnMore) {\n this.btnMore.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n const isPinnedMessagesNeeded = this.chat.isPinnedMessagesNeeded();\n if(isPinnedMessagesNeeded || this.chat.type === 'discussion') {\n if(this.chat.wasAlreadyUsed || !this.pinnedMessage) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n if(this.pinnedMessage) {\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n // this.pinnedMessage.pinnedMessageContainer.toggle(true);\n } else {\n this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container);\n }\n\n this.pinnedMessage = newPinnedMessage;\n }\n\n if(isPinnedMessagesNeeded) {\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n } else if(this.pinnedMessage) {\n this.pinnedMessage.destroy();\n this.pinnedMessage = undefined;\n }\n\n setTitleCallback();\n setStatusCallback?.();\n this.subtitle.classList.toggle('hide', !setStatusCallback);\n this.setMutedState();\n\n this.container.classList.remove('hide');\n };\n }\n\n public async setTitleManual(count?: number) {\n const {peerId, threadId} = this.chat;\n const middleware = () => this.chat.bubbles.getMiddleware();\n let titleEl: HTMLElement, icons: Element[];\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.managers.appMessagesManager.getSearchCounters(peerId, [{_: 'inputMessagesFilterPinned'}], false).then((result) => {\n if(!middleware()) return;\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n titleEl = i18n(peerId === rootScope.myId ? 'Reminders' : 'ScheduledMessages');\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) {\n const result = await this.managers.acknowledged.appMessagesManager.getHistory(peerId, 0, 1, 0, threadId);\n if(!middleware()) return;\n if(result.cached) {\n const historyResult = await result.result;\n if(!middleware()) return;\n count = historyResult.count;\n } else result.result.then((historyResult) => {\n if(!middleware()) return;\n this.setTitle(historyResult.count);\n });\n }\n\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n } else if(this.chat.type === 'chat') {\n [titleEl/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: true,\n withIcons: !threadId,\n threadId: threadId\n })\n // generateTitleIcons(peerId)\n ]);\n\n if(!middleware()) {\n return;\n }\n }\n\n return () => {\n replaceContent(this.title, titleEl);\n // if(icons) {\n // this.title.append(...icons);\n // }\n };\n }\n\n public setTitle(count?: number) {\n this.setTitleManual(count).then((setTitleCallback) => setTitleCallback());\n }\n\n public async setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId: this.chat.threadId});\n if(await this.managers.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n // return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n // mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n // 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?.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.isFloating();\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n\n if(!container.isVisible()) {\n return acc;\n }\n\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatusManual = async(needClear = false) => {\n if(!this.subtitle || this.chat.type !== 'chat') return;\n\n if(this.chat.threadId) {\n const title = await wrapPeerTitle({peerId: this.peerId, dialog: true});\n const span = i18n('TopicProfileStatus', [title]);\n return () => replaceContent(this.subtitle, span);\n }\n\n const peerId = this.peerId;\n return this.chat.appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: false,\n middleware: () => peerId === this.peerId\n });\n };\n\n public setPeerStatus = (needClear?: boolean) => {\n return this.setPeerStatusManual(needClear).then((callback) => {\n callback?.();\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 appSidebarRight from '..';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport AppSearch, {SearchGroup} from '../../appSearch';\nimport ButtonIcon from '../../buttonIcon';\nimport InputSearch from '../../inputSearch';\nimport PopupElement from '../../popups';\nimport PopupDatePicker from '../../popups/datePicker';\nimport {SliderSuperTab} from '../../slider';\n\nexport default class AppPrivateSearchTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private appSearch: AppSearch;\n private btnPickDate: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n private query = '';\n private onDatePick: (timestamp: number) => void;\n\n onOpenAfterTimeout() {\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\n }\n\n public init(\n peerId: PeerId,\n threadId?: number,\n onDatePick?: AppPrivateSearchTab['onDatePick'],\n query?: string\n ) {\n this.container.id = 'search-private-container';\n this.container.classList.add('chatlist-container');\n this.inputSearch = new InputSearch('Search');\n this.title.replaceWith(this.inputSearch.container);\n\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\n this.header.append(this.btnPickDate);\n\n const c = document.createElement('div');\n c.classList.add('chatlist-container');\n this.scrollable.container.replaceWith(c);\n this.appSearch = new AppSearch(c, this.inputSearch, {\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\n });\n\n if(!this.peerId) {\n this.query = query;\n this.peerId = peerId;\n this.threadId = threadId;\n this.onDatePick = onDatePick;\n\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\n if(this.onDatePick) {\n attachClickEvent(this.btnPickDate, () => {\n PopupElement.createPopup(PopupDatePicker, new Date(), this.onDatePick).show();\n });\n }\n\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\n\n appSidebarRight.toggleSidebar(true);\n } else {\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\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 ChatTopbar from './topbar';\nimport AppSearch, {SearchGroup} from '../appSearch';\nimport PopupDatePicker from '../popups/datePicker';\nimport ripple from '../ripple';\nimport InputSearch from '../inputSearch';\nimport type Chat from './chat';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {i18n} from '../../lib/langPack';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport PopupElement from '../popups';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\n\nexport default class ChatSearch {\n private element: HTMLElement;\n private backBtn: HTMLElement;\n private inputSearch: InputSearch;\n\n private results: HTMLElement;\n\n private footer: HTMLElement;\n private dateBtn: HTMLElement;\n private foundCountEl: HTMLElement;\n private controls: HTMLElement;\n private downBtn: HTMLElement;\n private upBtn: HTMLElement;\n\n private appSearch: AppSearch;\n private searchGroup: SearchGroup;\n\n private foundCount = 0;\n private selectedIndex = 0;\n private setPeerPromise: Promise;\n private listenerSetter: ListenerSetter;\n private navigationItem: NavigationItem;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\n this.element = document.createElement('div');\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\n\n this.backBtn = document.createElement('button');\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\n ripple(this.backBtn);\n\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\n attachClickEvent(element, callback, {listenerSetter});\n };\n\n attachClick(this.backBtn, () => {\n this.destroy();\n });\n\n this.inputSearch = new InputSearch('Search');\n\n // Results\n this.results = document.createElement('div');\n this.results.classList.add('chat-search-results', 'chatlist-container');\n\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\n attachClick(this.searchGroup.list, this.onResultsClick);\n\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\n messages: this.searchGroup\n }, (count) => {\n this.foundCount = count;\n\n if(!this.foundCount) {\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\n }\n });\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\n\n // appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\n this.chat.bubbles.container.append(this.results);\n\n // Footer\n this.footer = document.createElement('div');\n this.footer.classList.add('chat-search-footer');\n\n attachClick(this.footer, this.onFooterClick);\n ripple(this.footer);\n\n this.foundCountEl = document.createElement('span');\n this.foundCountEl.classList.add('chat-search-count');\n\n this.dateBtn = document.createElement('button');\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\n\n this.controls = document.createElement('div');\n this.controls.classList.add('chat-search-controls');\n\n this.upBtn = document.createElement('button');\n this.upBtn.classList.add('btn-icon', 'tgico-up');\n this.downBtn = document.createElement('button');\n this.downBtn.classList.add('btn-icon', 'tgico-down');\n\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n\n attachClick(this.dateBtn, this.onDateClick);\n attachClick(this.upBtn, this.onUpClick);\n attachClick(this.downBtn, this.onDownClick);\n this.controls.append(this.upBtn, this.downBtn);\n\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\n\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\n\n // Append container\n this.element.append(this.backBtn, this.inputSearch.container);\n\n this.topbar.container.classList.add('hide-pinned');\n this.topbar.container.parentElement.append(this.element);\n\n this.inputSearch.input.focus();\n\n if(query) {\n this.setQuery(query);\n }\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'mobile-search',\n onPop: () => {\n this.destroy();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n public destroy() {\n this.topbar.container.classList.remove('hide-pinned');\n this.element.remove();\n this.inputSearch.remove();\n this.results.remove();\n this.footer.remove();\n this.listenerSetter.removeAll();\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.chat.search = undefined;\n appNavigationController.removeItem(this.navigationItem);\n }\n\n public setQuery(query: string) {\n this.inputSearch.inputField.value = query;\n }\n\n private onDateClick = (e: MouseEvent) => {\n cancelEvent(e);\n PopupElement.createPopup(PopupDatePicker, new Date(), this.chat.bubbles.onDatePick).show();\n };\n\n private selectResult(elem: HTMLElement) {\n if(this.setPeerPromise) return this.setPeerPromise;\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n const index = whichChild(elem);\n\n if(index === (this.foundCount - 1)) {\n this.upBtn.setAttribute('disabled', 'true');\n } else {\n this.upBtn.removeAttribute('disabled');\n }\n\n if(!index) {\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.downBtn.removeAttribute('disabled');\n }\n\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n\n const res = this.chat.setPeer({peerId, lastMsgId});\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\n this.selectedIndex = index;\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\n\n const renderedCount = this.searchGroup.list.childElementCount;\n if(this.selectedIndex >= (renderedCount - 6)) {\n this.appSearch.searchMore();\n }\n }).finally(() => {\n this.setPeerPromise = null;\n });\n }\n\n private onResultsClick = (e: MouseEvent) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(target) {\n this.selectResult(target);\n }\n };\n\n private onFooterClick = (e: MouseEvent) => {\n if(this.foundCount) {\n this.chat.bubbles.container.classList.toggle('search-results-active');\n this.results.classList.toggle('active');\n }\n };\n\n private onUpClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\n };\n\n private onDownClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\n };\n}\n","/*\n * 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';\nimport windowSize from '../../helpers/windowSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\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 image: HTMLImageElement;\n private imageBitmap: ImageBitmap;\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.image = document.createElement('img');\n img.crossOrigin = 'anonymous';\n return this.renderImageFromUrlPromise = renderImageFromUrlPromise(img, url, false).then(() => {\n if(!IS_IMAGE_BITMAP_SUPPORTED) {\n return img;\n }\n\n return createImageBitmap(img, {\n resizeWidth: 1440,\n resizeHeight: 2960\n }).then((imageBitmap) => {\n this.imageBitmap = imageBitmap;\n return img;\n });\n });\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 this.imageBitmap?.close();\n URL.revokeObjectURL(this.objectUrl);\n }\n }\n }\n\n public fillCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const {width, height} = canvas;\n // const perf = performance.now();\n // if(context.fillStyle instanceof CanvasPattern) {\n // context.clearRect(0, 0, width, height);\n // }\n\n const source = this.imageBitmap || this.image;\n\n let imageWidth = source.width, imageHeight = source.height;\n // let patternHeight = 1480 * canvas.dpr;\n // if(+canvas.dataset.originalHeight !== height) patternHeight *= .6875;\n const patternHeight = (500 + (windowSize.height / 2.5)) * canvas.dpr;\n const ratio = patternHeight / imageHeight;\n imageWidth *= ratio;\n imageHeight = patternHeight;\n\n if(this.options.mask) {\n context.fillStyle = '#000';\n context.fillRect(0, 0, width, height);\n context.globalCompositeOperation = 'destination-out';\n } else {\n context.globalCompositeOperation = 'source-over';\n }\n\n const d = (y: number) => {\n for(let x = 0; x < width; x += imageWidth) {\n context.drawImage(source, x, y, imageWidth, imageHeight);\n }\n };\n\n const centerY = (height - imageHeight) / 2;\n d(centerY);\n\n if(centerY > 0) {\n let topY = centerY;\n do {\n d(topY -= imageHeight);\n } while(topY >= 0);\n }\n\n const endY = height - 1;\n for(let bottomY = centerY + imageHeight; bottomY < endY; bottomY += imageHeight) {\n d(bottomY);\n }\n\n // for(let x = 0; x < width; x += imageWidth) {\n // for(let y = 0; y < height; y += imageHeight) {\n // context.drawImage(img, x, y, imageWidth, imageHeight);\n // }\n // }\n // context.fillStyle = this.pattern;\n // context.fillRect(0, 0, width, 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 const width = this.options.width * devicePixelRatio;\n let height = this.options.height * devicePixelRatio;\n\n canvas.dpr = devicePixelRatio;\n canvas.dataset.originalHeight = '' + height;\n if(mediaSizes.activeScreen === ScreenSize.large) height *= 1.5;\n canvas.width = width;\n canvas.height = height;\n }\n\n public createCanvas() {\n const canvas = document.createElement('canvas');\n this.canvases.add(canvas);\n this.setCanvasDimensions(canvas);\n return canvas;\n }\n\n public resize(width: number, height: number) {\n this.init({\n ...this.options,\n width,\n height\n });\n\n const promises: Promise[] = [];\n for(const canvas of this.canvases) {\n this.setCanvasDimensions(canvas);\n promises.push(this.renderToCanvas(canvas));\n }\n\n return Promise.all(promises);\n }\n\n public static resizeInstances(width: number, height: number) {\n return Promise.all(this.INSTANCES.map((instance) => instance.resize(width, height)));\n }\n\n /* public setResizeMode(resizing: boolean) {\n const canvases = Array.from(this.canvases);\n const canvas = canvases[canvases.length - 1];\n canvas.style.display = resizing ? 'none' : '';\n const img = this.img;\n img.style.display = resizing ? '' : 'none';\n\n return {img, canvas};\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatRights} from '../../lib/appManagers/appChatsManager';\nimport type {AppImManager, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {MessageSendingParams, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {logger, LogTypes} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport appSidebarRight from '../sidebarRight';\nimport ChatBubbles from './bubbles';\nimport ChatContextMenu from './contextMenu';\nimport ChatInput from './input';\nimport ChatSelection from './selection';\nimport ChatTopbar from './topbar';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport SetTransition from '../singleTransition';\nimport AppPrivateSearchTab from '../sidebarRight/tabs/search';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport ChatSearch from './search';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport getAutoDownloadSettingsByPeerId, {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport ChatBackgroundGradientRenderer from './gradientRenderer';\nimport ChatBackgroundPatternRenderer from './patternRenderer';\nimport pause from '../../helpers/schedulers/pause';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport SlicedArray from '../../helpers/slicedArray';\nimport themeController from '../../helpers/themeController';\nimport AppSharedMediaTab from '../sidebarRight/tabs/sharedMedia';\nimport noop from '../../helpers/noop';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {Message} from '../../layer';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\n\nexport type ChatType = 'chat' | 'pinned' | 'discussion' | 'scheduled';\n\nexport default class Chat extends EventListenerBase<{\n setPeer: (mid: number, isTopMessage: boolean) => void\n}> {\n public container: HTMLElement;\n public backgroundEl: HTMLElement;\n\n public topbar: ChatTopbar;\n public bubbles: ChatBubbles;\n public input: ChatInput;\n public selection: ChatSelection;\n public contextMenu: ChatContextMenu;\n public search: ChatSearch;\n\n public wasAlreadyUsed: boolean;\n // public initPeerId = 0;\n public peerId: PeerId;\n public threadId: number;\n public setPeerPromise: Promise;\n public peerChanged: boolean;\n\n public log: ReturnType;\n\n public type: ChatType;\n public messagesStorageKey: MessagesStorageKey;\n\n public noForwards: boolean;\n\n public inited: boolean;\n\n public isRestricted: boolean;\n public autoDownload: ChatAutoDownloadSettings;\n\n public gradientRenderer: ChatBackgroundGradientRenderer;\n public patternRenderer: ChatBackgroundPatternRenderer;\n public gradientCanvas: HTMLCanvasElement;\n public patternCanvas: HTMLCanvasElement;\n public backgroundTempId: number;\n public setBackgroundPromise: Promise;\n public sharedMediaTab: AppSharedMediaTab;\n public sharedMediaTabs: AppSharedMediaTab[];\n // public renderDarkPattern: () => Promise;\n\n public isBot: boolean;\n public isChannel: boolean;\n public isBroadcast: boolean;\n public isAnyGroup: boolean;\n public isMegagroup: boolean;\n public isForum: boolean;\n public isAllMessagesForum: boolean;\n\n public animationGroup: AnimationItemGroup;\n\n constructor(\n public appImManager: AppImManager,\n public managers: AppManagers\n ) {\n super();\n\n this.type = 'chat';\n this.animationGroup = `chat-${Math.round(Math.random() * 65535)}`;\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.warn('constructor');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n\n this.backgroundTempId = 0;\n this.sharedMediaTabs = [];\n }\n\n public setBackground(url: string, skipAnimation?: boolean): Promise {\n const theme = themeController.getTheme();\n\n let item: HTMLElement;\n const isColorBackground = !!theme.background.color && !theme.background.slug && !theme.background.intensity;\n if(\n isColorBackground &&\n document.documentElement.style.cursor === 'grabbing' &&\n this.gradientRenderer &&\n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = theme.background.color;\n this.gradientRenderer.init(this.gradientCanvas);\n return Promise.resolve();\n }\n\n const tempId = ++this.backgroundTempId;\n\n const previousGradientRenderer = this.gradientRenderer;\n const previousPatternRenderer = this.patternRenderer;\n const previousGradientCanvas = this.gradientCanvas;\n const previousPatternCanvas = this.patternCanvas;\n\n this.gradientRenderer =\n this.patternRenderer =\n this.gradientCanvas =\n this.patternCanvas =\n // this.renderDarkPattern =\n undefined;\n\n const intensity = theme.background.intensity && theme.background.intensity / 100;\n const isDarkPattern = !!intensity && intensity < 0;\n\n let patternRenderer: ChatBackgroundPatternRenderer;\n let patternCanvas = item?.firstElementChild as HTMLCanvasElement;\n let gradientCanvas: HTMLCanvasElement;\n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n\n if(url) {\n if(intensity) {\n item.classList.add('is-pattern');\n\n const rect = this.appImManager.chatsContainer.getBoundingClientRect();\n patternRenderer = this.patternRenderer = ChatBackgroundPatternRenderer.getInstance({\n url,\n width: rect.width,\n height: rect.height,\n mask: isDarkPattern\n });\n\n patternCanvas = this.patternCanvas = patternRenderer.createCanvas();\n patternCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-pattern-canvas');\n\n if(isDarkPattern) {\n item.classList.add('is-dark');\n }\n\n // if(isDarkPattern) {\n // this.renderDarkPattern = () => {\n // return patternRenderer.exportCanvasPatternToImage(patternCanvas).then((url) => {\n // if(this.backgroundTempId !== tempId) {\n // return;\n // }\n\n // gradientCanvas.style.webkitMaskImage = `url(${url})`;\n // });\n // };\n // }\n } else if(theme.background.slug) {\n item.classList.add('is-image');\n }\n } else if(theme.background.color) {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n const color = theme.background.color;\n if(color) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(color);\n gradientRenderer = this.gradientRenderer = _gradientRenderer;\n gradientCanvas = this.gradientCanvas = canvas;\n gradientCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-color-canvas');\n\n if(rootScope.settings.animationsEnabled) {\n gradientRenderer.scrollAnimate(true);\n }\n // } else {\n // item.style.backgroundColor = color;\n // item.style.backgroundImage = 'none';\n // }\n }\n\n if(patternRenderer) {\n const setOpacityTo = isDarkPattern ? gradientCanvas : patternCanvas;\n setOpacityTo.style.setProperty('--opacity-max', '' + (Math.abs(intensity) * (isDarkPattern ? .5 : 1)));\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({\n element: item,\n className: 'is-visible',\n forwards: true,\n duration: !skipAnimation ? 200 : 0,\n onTransitionEnd: prev ? () => {\n previousPatternRenderer?.cleanup(previousPatternCanvas);\n previousGradientRenderer?.cleanup();\n\n prev.remove();\n } : null,\n useRafs: 2\n });\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 // const promise = Promise.resolve();\n // }\n\n // promise.then(cb);\n cb();\n });\n } else if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n\n return this.setBackgroundPromise = Promise.race([\n pause(500),\n promise\n ]);\n }\n\n public setType(type: ChatType) {\n this.type = type;\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.managers);\n this.bubbles = new ChatBubbles(this, this.managers);\n this.input = new ChatInput(this, this.appImManager, this.managers);\n this.contextMenu = new ChatContextMenu(this, this.managers);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.managers);\n\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n\n this.topbar.construct();\n this.input.construct();\n\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n\n if(!IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.bubbles.attachContainerListeners();\n\n this.container.append(this.topbar.container, this.bubbles.container, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer({peerId: migrateTo});\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog.peerId === this.peerId && (dialog._ === 'dialog' || this.threadId === dialog.id)) {\n this.appImManager.setPeer();\n }\n });\n\n this.bubbles.listenerSetter.add(this.appImManager)('chat_changing', ({to}) => {\n const freeze = to !== this;\n\n const cb = () => {\n this.bubbles.observer?.toggleObservingNew(freeze);\n animationIntersector.toggleIntersectionGroup(this.animationGroup, freeze);\n if(freeze) {\n animationIntersector.checkAnimations(freeze, this.animationGroup);\n }\n };\n\n if(!freeze) {\n setTimeout(() => {\n cb();\n }, 400);\n } else {\n cb();\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.destroySharedMediaTab();\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n this.contextMenu && this.contextMenu.destroy();\n this.selection && this.selection.attachListeners(undefined, undefined);\n\n this.cleanupBackground();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n // this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.topbar.cleanup();\n this.selection.cleanup();\n }\n\n public get isForumTopic() {\n return !!(this.isForum && this.threadId);\n }\n\n public async onChangePeer(options: ChatSetPeerOptions, m: ReturnType) {\n const {peerId, threadId} = this;\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n const [\n noForwards,\n isRestricted,\n isAnyGroup,\n _,\n isMegagroup,\n isBroadcast,\n isChannel,\n isBot,\n isForum\n ] = await m(Promise.all([\n this.managers.appPeersManager.noForwards(peerId),\n this.managers.appPeersManager.isPeerRestricted(peerId),\n this._isAnyGroup(peerId),\n this.setAutoDownloadMedia(),\n this.managers.appPeersManager.isMegagroup(peerId),\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isChannel(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.managers.appPeersManager.isForum(peerId)\n ]));\n\n // ! WARNING: TEMPORARY, HAVE TO GET TOPIC\n if(isForum && threadId) {\n await m(this.managers.dialogsStorage.getForumTopicOrReload(peerId, threadId));\n }\n\n this.noForwards = noForwards;\n this.isRestricted = isRestricted;\n this.isAnyGroup = isAnyGroup;\n this.isMegagroup = isMegagroup;\n this.isBroadcast = isBroadcast;\n this.isChannel = isChannel;\n this.isBot = isBot;\n this.isForum = isForum;\n this.isAllMessagesForum = isForum && !threadId;\n\n if(threadId && !this.isForum) {\n options.type = 'discussion';\n }\n\n const type = options.type ?? 'chat';\n this.setType(type);\n\n this.messagesStorageKey = `${this.peerId}_${this.type === 'scheduled' ? 'scheduled' : 'history'}`;\n\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n this.sharedMediaTab = appSidebarRight.createSharedMediaTab();\n this.sharedMediaTabs.push(this.sharedMediaTab);\n\n this.sharedMediaTab.setPeer(peerId, threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n }\n\n public setPeer(options: ChatSetPeerOptions) {\n const {peerId, threadId} = options;\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 appMediaViewer = (window as any).appMediaViewer as AppMediaViewerBase;\n // if(appMediaViewer) {\n // appMediaViewer.close();\n // }\n\n const samePeer = this.appImManager.isSamePeer(this, options);\n if(!samePeer) {\n this.appImManager.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n this.threadId = threadId;\n } else if(this.setPeerPromise) {\n return;\n }\n\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.bubbles.setPeer({samePeer: false, peerId});\n this.peerId = 0;\n this.appImManager.dispatchEvent('peer_changed', this);\n\n appSidebarRight.replaceSharedMediaTab();\n this.destroySharedMediaTab();\n this.sharedMediaTab = undefined;\n\n return;\n }\n\n this.peerChanged = samePeer;\n\n const bubblesSetPeerPromise = this.bubbles.setPeer({...options, samePeer});\n const setPeerPromise = this.setPeerPromise = bubblesSetPeerPromise.then((result) => {\n return result.promise;\n }).catch(noop).finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n return bubblesSetPeerPromise;\n }\n\n public destroySharedMediaTab(tab = this.sharedMediaTab) {\n if(!tab) {\n return;\n }\n\n indexOfAndSplice(this.sharedMediaTabs, tab);\n tab.destroy();\n }\n\n public async setAutoDownloadMedia() {\n this.autoDownload = await getAutoDownloadSettingsByPeerId(this.peerId);\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer({\n peerId: this.peerId,\n threadId: this.threadId,\n lastMsgId: messageId\n });\n }\n\n public async finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n const peerId = this.peerId;\n this.peerChanged = true;\n this.wasAlreadyUsed = true;\n\n const middleware = this.bubbles.getMiddleware();\n\n this.cleanup(false);\n\n const sharedMediaTab = this.sharedMediaTab;\n\n const callbacksPromise = Promise.all([\n this.topbar.finishPeerChange(isTarget),\n this.bubbles.finishPeerChange(),\n this.input.finishPeerChange(startParam),\n sharedMediaTab.fillProfileElements()\n ]);\n\n const callbacks = await callbacksPromise;\n sharedMediaTab.loadSidebarMedia(true);\n\n if(!middleware()) {\n return;\n }\n\n callbacks.forEach((callback) => {\n callback?.();\n });\n\n appSidebarRight.replaceSharedMediaTab(sharedMediaTab);\n\n this.sharedMediaTabs.filter((tab) => tab !== sharedMediaTab).forEach((tab) => this.destroySharedMediaTab(tab));\n\n this.container.dataset.type = this.type;\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n this.appImManager.dispatchEvent('peer_changed', this);\n }\n\n public getMessage(mid: number) {\n return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey, mid);\n }\n\n public async getMidsByMid(mid: number) {\n return this.managers.appMessagesManager.getMidsByMessage(await this.getMessage(mid));\n }\n\n public getHistoryStorage(ignoreThreadId?: boolean) {\n return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId, ignoreThreadId ? undefined : this.threadId)\n .then((historyStorageTransferable) => {\n return {\n ...historyStorageTransferable,\n history: SlicedArray.fromJSON(historyStorageTransferable.historySerialized)\n }\n });\n }\n\n public getDialogOrTopic() {\n return this.isForum && this.threadId ? this.managers.dialogsStorage.getForumTopic(this.peerId, this.threadId) : this.managers.dialogsStorage.getDialogOnly(this.peerId);\n }\n\n public getHistoryMaxId() {\n return this.getHistoryStorage().then((historyStorage) => historyStorage.maxId);\n }\n\n public async _isAnyGroup(peerId: PeerId) {\n return peerId === rootScope.myId || peerId === REPLIES_PEER_ID || (await this.managers.appPeersManager.isAnyGroup(peerId));\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n if(!this.search) {\n this.search = new ChatSearch(this.topbar, this, query);\n } else {\n this.search.setQuery(query);\n }\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = appSidebarRight.createTab(AppPrivateSearchTab);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.managers.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return Promise.all([\n this.managers.appPeersManager.isBot(this.peerId),\n this.managers.appMessagesManager.getDialogOnly(this.peerId),\n this.getHistoryStorage(true)\n ]).then(([isBot, dialog, historyStorage]) => {\n return isBot && !dialog && !historyStorage.history.length;\n });\n }\n\n public getMessageSendingParams(): MessageSendingParams {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n silent: this.input.sendSilent,\n sendAsPeerId: this.input.sendAsPeerId\n };\n }\n\n public isOurMessage(message: Message.message | Message.messageService) {\n return message.fromId === rootScope.myId || (!!message.pFlags.out && this.isMegagroup);\n }\n\n public isOutMessage(message: Message.message | Message.messageService) {\n const fwdFrom = (message as Message.message).fwd_from;\n const isOut = this.isOurMessage(message) && (!fwdFrom || this.peerId !== rootScope.myId);\n return !!isOut;\n }\n\n public isAvatarNeeded(message: Message.message | Message.messageService) {\n return this.isAnyGroup && !this.isOutMessage(message);\n }\n\n public isPinnedMessagesNeeded() {\n return this.type === 'chat' || this.isForum;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {State} from '../config/state';\nimport rootScope from '../lib/rootScope';\n\nexport type ChatAutoDownloadSettings = {\n photo: number,\n video: number,\n file: number\n};\n\nexport default async function getAutoDownloadSettingsByPeerId(peerId: PeerId): Promise {\n let type: keyof State['settings']['autoDownload'];\n\n let photoSizeMax = 0, videoSizeMax = 0, fileSizeMax = 0;\n const settings = rootScope.settings;\n const appPeersManager = rootScope.managers.appPeersManager;\n if(!settings.autoDownloadNew.pFlags.disabled && peerId) {\n if(peerId.isUser()) {\n if(await appPeersManager.isContact(peerId)) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n } else if(await appPeersManager.isBroadcast(peerId)) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n\n if(settings.autoDownload.photo[type]) photoSizeMax = settings.autoDownloadNew.photo_size_max;\n if(settings.autoDownload.video[type]) videoSizeMax = settings.autoDownloadNew.video_size_max;\n if(settings.autoDownload.file[type]) fileSizeMax = settings.autoDownloadNew.file_size_max;\n }\n\n return {\n photo: photoSizeMax,\n video: videoSizeMax,\n file: fileSizeMax\n };\n}\n","/*\n * 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 {AppImManager} from '../../lib/appManagers/appImManager';\nimport ButtonIcon from '../buttonIcon';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE, IS_MOBILE} from '../../environment/userAgent';\nimport appNavigationController from '../appNavigationController';\nimport {_i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport clamp from '../../helpers/number/clamp';\nimport matchUrl from '../../lib/richTextProcessor/matchUrl';\nimport matchUrlProtocol from '../../lib/richTextProcessor/matchUrlProtocol';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\n\nexport default class MarkupTooltip {\n public container: HTMLElement;\n private wrapper: HTMLElement;\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\n private linkBackButton: HTMLElement;\n private linkApplyButton: HTMLButtonElement;\n private hideTimeout: number;\n private addedListener = false;\n private waitingForMouseUp = false;\n private linkInput: HTMLInputElement;\n private savedRange: Range;\n private mouseUpCounter: number = 0;\n // private log: ReturnType;\n\n constructor(private appImManager: AppImManager) {\n // this.log = logger('MARKUP');\n }\n\n private init() {\n this.container = document.createElement('div');\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('markup-tooltip-wrapper');\n\n const tools1 = document.createElement('div');\n const tools2 = document.createElement('div');\n tools1.classList.add('markup-tooltip-tools');\n tools2.classList.add('markup-tooltip-tools');\n\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\n arr.forEach((c) => {\n const button = ButtonIcon(c, {noRipple: true});\n tools1.append(this.buttons[c] = button);\n\n if(c !== 'link') {\n button.addEventListener('mousedown', (e) => {\n cancelEvent(e);\n this.appImManager.chat.input.applyMarkdown(c);\n this.cancelClosening();\n\n /* this.mouseUpCounter = 0;\n this.setMouseUpEvent(); */\n // this.hide();\n });\n } else {\n attachClickEvent(button, (e) => {\n cancelEvent(e);\n this.showLinkEditor();\n this.cancelClosening();\n });\n }\n });\n\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\n this.linkInput = document.createElement('input');\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\n this.linkInput.classList.add('input-clear');\n this.linkInput.addEventListener('keydown', (e) => {\n const valid = !this.linkInput.value.length || !!matchUrl(this.linkInput.value);// /^(http)|(https):\\/\\//i.test(this.linkInput.value);\n\n if(e.key === 'Enter') {\n if(!valid) {\n if(this.linkInput.classList.contains('error')) {\n this.linkInput.classList.remove('error');\n void this.linkInput.offsetLeft; // reflow\n }\n\n this.linkInput.classList.add('error');\n } else {\n this.applyLink(e);\n }\n }\n });\n\n this.linkInput.addEventListener('input', (e) => {\n const valid = this.isLinkValid();\n\n this.linkInput.classList.toggle('is-valid', valid);\n this.linkInput.classList.remove('error');\n });\n\n this.linkBackButton.addEventListener('mousedown', (e) => {\n // this.log('linkBackButton click');\n cancelEvent(e);\n this.container.classList.remove('is-link');\n // input.value = '';\n this.resetSelection();\n this.setTooltipPosition();\n this.cancelClosening();\n });\n\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\n this.linkApplyButton.addEventListener('mousedown', (e) => {\n // this.log('linkApplyButton click');\n this.applyLink(e);\n });\n\n const applyDiv = document.createElement('div');\n applyDiv.classList.add('markup-tooltip-link-apply-container');\n\n const delimiter1 = document.createElement('span');\n const delimiter2 = document.createElement('span');\n const delimiter3 = document.createElement('span');\n delimiter1.classList.add('markup-tooltip-delimiter');\n delimiter2.classList.add('markup-tooltip-delimiter');\n delimiter3.classList.add('markup-tooltip-delimiter');\n tools1.insertBefore(delimiter1, this.buttons.link);\n applyDiv.append(delimiter3, this.linkApplyButton);\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\n // tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\n\n this.wrapper.append(tools1, tools2);\n this.container.append(this.wrapper);\n document.body.append(this.container);\n\n window.addEventListener('resize', () => {\n this.hide();\n });\n }\n\n public showLinkEditor() {\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\n this.show();\n }\n\n const button = this.buttons.link;\n this.container.classList.add('is-link');\n\n const selection = document.getSelection();\n this.savedRange = selection.getRangeAt(0);\n\n if(button.classList.contains('active')) {\n const startContainer = this.savedRange.startContainer;\n const anchor = startContainer.parentElement as HTMLAnchorElement;\n this.linkInput.value = anchor.href;\n } else {\n this.linkInput.value = '';\n }\n\n this.setTooltipPosition(true);\n\n setTimeout(() => {\n this.linkInput.focus(); // !!! instant focus will break animation\n }, 200);\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\n }\n\n private applyLink(e: Event) {\n cancelEvent(e);\n this.resetSelection();\n let url = this.linkInput.value;\n if(url && !matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n this.appImManager.chat.input.applyMarkdown('link', url);\n setTimeout(() => {\n this.hide();\n }, 0);\n }\n\n private isLinkValid() {\n return !this.linkInput.value.length || !!matchUrl(this.linkInput.value);\n }\n\n private resetSelection(range: Range = this.savedRange) {\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n this.appImManager.chat.input.messageInput.focus();\n }\n\n public hide() {\n // return;\n\n if(this.init) return;\n\n this.container.classList.remove('is-visible');\n // document.removeEventListener('mouseup', this.onMouseUp);\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n this.waitingForMouseUp = false;\n\n appNavigationController.removeByType('markup');\n\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\n this.hideTimeout = window.setTimeout(() => {\n this.hideTimeout = undefined;\n this.container.classList.add('hide');\n this.container.classList.remove('is-link');\n }, 200);\n }\n\n public getActiveMarkupButton() {\n const currentMarkups: Set = new Set();\n\n // const nodes = getSelectedNodes();\n // const parents = [...new Set(nodes.map((node) => node.parentNode))];\n // // if(parents.length > 1 && parents) return [];\n\n // (parents as HTMLElement[]).forEach((node) => {\n // for(const type in markdownTags) {\n // const tag = markdownTags[type as MarkdownType];\n // const closest = node.closest(tag.match + ', [contenteditable=\"true\"]');\n // if(closest !== this.appImManager.chat.input.messageInput) {\n // currentMarkups.add(this.buttons[type as MarkdownType]);\n // }\n // }\n // });\n\n const types = Object.keys(this.buttons) as MarkdownType[];\n const markup = hasMarkupInSelection(types);\n types.forEach((type) => {\n if(markup[type]) {\n currentMarkups.add(this.buttons[type as MarkdownType]);\n }\n });\n\n return [...currentMarkups];\n }\n\n public setActiveMarkupButton() {\n const activeButtons = this.getActiveMarkupButton();\n\n for(const i in this.buttons) {\n // @ts-ignore\n const button = this.buttons[i];\n button.classList.toggle('active', activeButtons.includes(button));\n }\n }\n\n private setTooltipPosition(isLinkToggle = false) {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n\n const bodyRect = document.body.getBoundingClientRect();\n const selectionRect = range.getBoundingClientRect();\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\n\n this.container.style.maxWidth = inputRect.width + 'px';\n\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\n\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\n\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\n\n const sizesRect = currentTools.getBoundingClientRect();\n const top = selectionTop - sizesRect.height - 8;\n\n const minX = inputRect.left;\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\n let left: number;\n if(isLinkToggle) {\n const containerRect = this.container.getBoundingClientRect();\n left = clamp(containerRect.left, minX, maxX);\n } else {\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\n left = clamp(x, minX, maxX);\n }\n\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\n\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\n\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\n }\n\n public show() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n if(isSelectionEmpty()) {\n this.hide();\n return;\n }\n\n if(this.hideTimeout !== undefined) {\n clearTimeout(this.hideTimeout);\n }\n\n if(this.container.classList.contains('is-visible')) {\n return;\n }\n\n this.setActiveMarkupButton();\n\n this.container.classList.remove('is-link');\n const isFirstShow = this.container.classList.contains('hide');\n if(isFirstShow) {\n this.container.classList.remove('hide');\n this.container.classList.add('no-transition');\n }\n\n this.setTooltipPosition();\n\n if(isFirstShow) {\n void this.container.offsetLeft; // reflow\n this.container.classList.remove('no-transition');\n }\n\n this.container.classList.add('is-visible');\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'markup',\n onPop: () => {\n this.hide();\n }\n });\n }\n\n // this.log('selection', selectionRect, activeButton);\n }\n\n /* private onMouseUp = (e: Event) => {\n this.log('onMouseUp');\n if(findUpClassName(e.target, 'markup-tooltip')) return;\n\n this.hide();\n //document.removeEventListener('mouseup', this.onMouseUp);\n }; */\n\n private onMouseUpSingle = (e?: Event) => {\n // this.log('onMouseUpSingle');\n this.waitingForMouseUp = false;\n\n if(IS_TOUCH_SUPPORTED) {\n e && cancelEvent(e);\n if(this.mouseUpCounter++ === 0) {\n this.resetSelection(this.savedRange);\n } else {\n this.hide();\n return;\n }\n }\n\n this.show();\n\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\n };\n\n public setMouseUpEvent() {\n if(this.waitingForMouseUp) return;\n this.waitingForMouseUp = true;\n\n // this.log('setMouseUpEvent');\n\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\n }\n\n public cancelClosening() {\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n document.addEventListener('mouseup', (e) => {\n cancelEvent(e);\n this.mouseUpCounter = 1;\n this.waitingForMouseUp = false;\n this.setMouseUpEvent();\n }, {once: true});\n }\n }\n\n public handleSelection() {\n if(this.addedListener) return;\n this.addedListener = true;\n document.addEventListener('selectionchange', (e) => {\n // this.log('selectionchange');\n\n if(document.activeElement === this.linkInput) {\n return;\n }\n\n const messageInput = this.appImManager.chat.input.messageInput;\n if(document.activeElement !== messageInput) {\n this.hide();\n return;\n }\n\n const selection = document.getSelection();\n if(isSelectionEmpty(selection)) {\n this.hide();\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n if(IS_APPLE) {\n this.show();\n this.setTooltipPosition(); // * because can skip this in .show();\n } else {\n if(this.mouseUpCounter === 2) {\n this.mouseUpCounter = 0;\n return;\n }\n\n this.savedRange = selection.getRangeAt(0);\n this.setMouseUpEvent();\n /* document.addEventListener('touchend', (e) => {\n cancelEvent(e);\n this.resetSelection(range);\n this.show();\n }, {once: true, passive: false}); */\n }\n } else if(this.container && this.container.classList.contains('is-visible')) {\n this.setTooltipPosition();\n } else if(messageInput.matches(':active')) {\n this.setMouseUpEvent();\n } else {\n this.show();\n }\n });\n\n document.addEventListener('beforeinput', (e) => {\n if(e.inputType === 'historyRedo' || e.inputType === 'historyUndo') {\n e.target.addEventListener('input', () => this.setActiveMarkupButton(), {once: 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 generatePathData from '../../helpers/generatePathData';\nimport {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\n\nexport default class ChatDragAndDrop {\n container: HTMLDivElement;\n svg: SVGSVGElement;\n outlineWrapper: HTMLDivElement;\n path: SVGPathElement;\n\n constructor(appendTo: HTMLElement, private options: {\n icon?: string,\n header: LangPackKey,\n headerArgs?: FormatterArguments,\n subtitle?: LangPackKey,\n onDrop: (e: DragEvent) => void\n }) {\n this.container = document.createElement('div');\n this.container.classList.add('drop', 'z-depth-1');\n\n this.outlineWrapper = document.createElement('div');\n this.outlineWrapper.classList.add('drop-outline-wrapper');\n\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.classList.add('drop-outline');\n\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n this.path.classList.add('drop-outline-path');\n\n let dropIcon: HTMLElement;\n if(options.icon) {\n dropIcon = document.createElement('div');\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\n }\n\n const dropHeader = document.createElement('div');\n dropHeader.classList.add('drop-header');\n dropHeader.append(i18n(options.header, options.headerArgs));\n\n let dropSubtitle: HTMLElement;\n if(options.subtitle) {\n dropSubtitle = document.createElement('div');\n dropSubtitle.classList.add('drop-subtitle');\n dropSubtitle.append(i18n(options.subtitle));\n }\n\n this.svg.append(this.path);\n this.outlineWrapper.append(this.svg);\n\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\n appendTo.append(this.container);\n\n this.container.addEventListener('dragover', this.onDragOver);\n this.container.addEventListener('dragleave', this.onDragLeave);\n this.container.addEventListener('drop', this.onDrop);\n }\n\n onDragOver = (e: DragEvent) => {\n this.container.classList.add('is-dragover');\n // SetTransition(this.container, 'is-dragover', true, 500);\n };\n\n onDragLeave = (e: DragEvent) => {\n this.container.classList.remove('is-dragover');\n // SetTransition(this.container, 'is-dragover', false, 500);\n };\n\n onDrop = (e: DragEvent) => {\n this.options.onDrop(e);\n };\n\n destroy() {\n delete this.options;\n this.container.remove();\n this.container.removeEventListener('dragover', this.onDragOver);\n this.container.removeEventListener('dragleave', this.onDragLeave);\n this.container.removeEventListener('drop', this.onDrop);\n }\n\n setPath() {\n const rect = this.outlineWrapper.getBoundingClientRect();\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\n\n const radius = 10;\n // const strokeWidth = 2;\n const sizeX = rect.width - radius;\n const sizeY = rect.height - radius;\n const pos = radius / 2;\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\n this.path.setAttributeNS(null, 'd', d);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../schedulers';\n\nexport default function disableTransition(elements: HTMLElement[]) {\n elements.forEach((el) => el.classList.add('no-transition'));\n\n doubleRaf().then(() => {\n elements.forEach((el) => el.classList.remove('no-transition'));\n });\n}\n","/*\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 noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport rootScope from '../rootScope';\nimport lottieLoader, {LottieAssetName} from './lottieLoader';\nimport type RLottiePlayer from './rlottiePlayer';\nimport {RLottieColor} from './rlottiePlayer';\n\nexport type RLottieIconOptions = {\n width: number,\n height: number,\n container?: HTMLElement,\n skipAnimation?: boolean\n};\n\nexport type RLottieIconItemPartOptions = {\n startFrame: number,\n endFrame: number,\n name?: string\n};\n\nexport type RLottieIconItemOptions = {\n name: LottieAssetName,\n parts: RLottieIconItemPartOptions[],\n initFrame?: number,\n player?: RLottiePlayer,\n autoplay?: boolean,\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n};\n\nexport class RLottieIconItemPart implements RLottieIconItemPartOptions {\n public startFrame: number;\n public endFrame: number;\n public name?: string;\n\n constructor(public item: RLottieIconItem, options: RLottieIconItemPartOptions) {\n safeAssign(this, options);\n }\n\n public play(callback?: () => void) {\n return this.item.playPart(this, callback);\n }\n}\n\n// export type RLottieIconItemPart = RLottieIconItemPartOptions;\n\nexport class RLottieIconItem implements RLottieIconItemOptions {\n public name: LottieAssetName;\n public parts: RLottieIconItemPart[];\n public player: RLottiePlayer;\n public initFrame: number;\n public autoplay: boolean;\n public color: RLottieColor;\n public inverseColor: RLottieColor;\n public loadPromise: Promise;\n public onLoadForPart: () => void;\n public onLoadForColor: () => void;\n\n constructor(public icon: RLottieIcon, options: RLottieIconItemOptions) {\n this.autoplay = false;\n\n safeAssign(this, options);\n\n this.parts = this.parts.map((options) => this.createPart(options));\n }\n\n public load() {\n let loadPromise = this.loadPromise;\n if(loadPromise) {\n return loadPromise;\n }\n\n const {container, canvas, width, height} = this.icon;\n loadPromise = lottieLoader.loadAnimationAsAsset({\n container,\n canvas,\n width,\n height,\n group: 'none',\n loop: false,\n autoplay: this.autoplay ?? false,\n initFrame: this.initFrame,\n skipFirstFrameRendering: this.initFrame === undefined,\n color: this.color,\n inverseColor: this.inverseColor\n }, this.name).then((player) => {\n return lottieLoader.waitForFirstFrame(player);\n }).then((player) => {\n this.player = player;\n\n if(this.onLoadForColor) {\n this.onLoadForColor();\n this.onLoadForColor = undefined;\n }\n\n if(this.onLoadForPart) {\n this.onLoadForPart();\n this.onLoadForPart = undefined;\n }\n });\n\n this.loadPromise = loadPromise;\n this.icon.loadPromises.set(this.name, loadPromise);\n return loadPromise;\n }\n\n public createPart(options: RLottieIconItemPartOptions) {\n return new RLottieIconItemPart(this, options);\n }\n\n public getPart(index: string | number | RLottieIconItemPart) {\n if(index instanceof RLottieIconItemPart) return index;\n else if(typeof(index) === 'string') return this.parts.find((part) => part.name === index);\n else return this.parts[index];\n }\n\n public playPart(part: RLottieIconItemPart, callback?: () => void) {\n return this.icon.playPart(this, part, callback);\n }\n}\n\nexport default class RLottieIcon {\n public container: HTMLElement;\n public canvas: HTMLCanvasElement;\n public width: number;\n public height: number;\n\n protected items: Map;\n public loadPromises: Map>;\n\n protected skipAnimation: boolean;\n\n constructor(options: RLottieIconOptions) {\n safeAssign(this, options);\n\n if(!this.container) this.container = document.createElement('div');\n this.container.classList.add('rlottie-icon');\n\n const {width, height} = this;\n this.container.style.width = width + 'px';\n this.container.style.height = height + 'px';\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = width;\n canvas.height = height;\n\n this.items = new Map();\n this.loadPromises = new Map();\n }\n\n public get loadPromise() {\n return Promise.all([...this.loadPromises.values()]).then(noop);\n }\n\n public getItem(name?: LottieAssetName): RLottieIconItem {\n return !name && this.items.size === 1 ? this.items.values().next().value : this.items.get(name);\n }\n\n public add(options: Omit) {\n const item = new RLottieIconItem(this, options);\n this.items.set(options.name, item);\n\n return item;\n }\n\n public playPart(item: RLottieIconItem, index: Parameters[0], callback?: () => void) {\n if(!item.player) {\n item.onLoadForPart = () => {\n this.playPart(item, index, callback);\n };\n\n return;\n }\n\n const part = item.getPart(index);\n item.player.playPart({\n from: rootScope.settings.animationsEnabled && !this.skipAnimation ? part.startFrame : part.endFrame,\n to: part.endFrame,\n callback\n });\n }\n\n /* public playToPart(item: RLottieIconItem, index: Parameters[0], toEnd: boolean) {\n if(!item.player) return;\n const part = item.getPart(index);\n const toFrame = toEnd ? part.endFrame : part.startFrame;\n item.player.playToFrame({\n frame: toFrame\n });\n } */\n\n public static generateEqualParts(length: number, frameCount: number): RLottieIconItemPartOptions[] {\n return new Array(length).fill(0).map((_, idx) => {\n const startFrame = idx * frameCount;\n return {startFrame, endFrame: startFrame + frameCount - 1};\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../helpers/noop';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {LottieAssetName} from '../lib/rlottie/lottieLoader';\nimport RLottieIcon, {RLottieIconItemPartOptions, RLottieIconItemPart} from '../lib/rlottie/rlottieIcon';\nimport {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};\nexport type SuperRLottieIconGetInfoResult = RLottieIconItemPart;\nexport class SuperRLottieIcon extends RLottieIcon {\n protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;\n protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;\n\n protected partState: Options['PartState'];\n protected colorState: Options['ColorState'];\n protected loaded: boolean;\n\n constructor(options: {\n width: number,\n height: number,\n skipAnimation?: boolean,\n getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,\n getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,\n }) {\n super({\n width: options.width,\n height: options.height\n });\n\n safeAssign(this, options);\n\n // hook the first call\n /* const originalFunction = this.setState.bind(this);\n this.setState = (partState, colorState) => {\n this.setState = originalFunction;\n this.load(partState, colorState);\n return originalFunction(partState, colorState);\n }; */\n }\n\n public load(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(this.loaded) {\n return this.loadPromise;\n }\n\n this.loaded = true;\n this.partState = partState;\n this.colorState = colorState;\n\n const part = this.getPart(partState);\n const color = colorState !== undefined && this.getColor && this.getColor(colorState);\n\n const item = part.item;\n item.initFrame = part.endFrame;\n item.color = color;\n\n const promises = [...this.items.values()].map((item) => item.load());\n return Promise.all(promises).then(noop);\n }\n\n /**\n * Will redirect setting color state to part callback to synchronize the rendering\n */\n public setState(partState: Options['PartState'], colorState?: Options['ColorState'], partCallback?: () => void) {\n if(!this.loaded) this.load(partState, colorState);\n\n let changedPartState = false, changedColorState = false;\n if(partState !== undefined) changedPartState = this.setPartState(partState, colorState, partCallback);\n else if(colorState !== undefined) changedColorState = this.setColorState(colorState);\n\n return changedPartState || changedColorState;\n }\n\n public setPartState(state: Options['PartState'], colorState?: Options['ColorState'], callback?: () => void) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return colorState !== undefined ? this.setColorState(colorState) : false;\n }\n\n if(colorState !== undefined) {\n this.setColorState(colorState, false);\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play(callback);\n\n return true;\n }\n\n public setColorState(state: Options['ColorState'], renderIfPaused = true) {\n const {colorState: prevState} = this;\n if(prevState === state || !this.getColor) {\n return false;\n }\n\n this.colorState = state;\n\n const item = this.getItem();\n const color = this.getColor(state, prevState);\n const invoke = () => {\n item.player.setColor(color, renderIfPaused);\n };\n\n if(item.player) {\n invoke();\n } else {\n item.onLoadForColor = invoke;\n }\n\n return true;\n }\n\n public destroy() {\n this.items.forEach((item) => {\n item.loadPromise.then(() => {\n item.player.remove();\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {RLottieIconItemPartOptions} from '../../lib/rlottie/rlottieIcon';\nimport {GROUP_CALL_MICROPHONE_BUTTON_STATE} from '.';\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallMicrophoneIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_MICROPHONE_BUTTON_STATE\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n let partName: string;\n switch(state) {\n case states.HAND:\n partName = prevState === states.MUTED ? 'muted-to-hand' : 'unmuted-to-hand';\n break;\n case states.MUTED:\n partName = prevState === states.HAND ? 'hand-to-muted' : 'mute';\n break;\n case states.UNMUTED:\n partName = 'unmute';\n break;\n }\n\n return this.getItem().getPart(partName);\n }\n });\n\n const className = 'group-call-microphone-icon';\n this.container.classList.add(className + '-container');\n\n const parts: RLottieIconItemPartOptions[] = [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 172,\n name: 'unmuted-to-hand'\n }, {\n startFrame: 173,\n endFrame: 201,\n name: 'scheduled-crossing'\n }, {\n startFrame: 202,\n endFrame: 236,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 237,\n endFrame: 273,\n name: 'scheduled-to-hand'\n }, {\n startFrame: 274,\n endFrame: 310,\n name: 'scheduled-crossed-to-hand'\n }, {\n startFrame: 311,\n endFrame: 343,\n name: 'scheduled-uncrossing'\n }, {\n startFrame: 344,\n endFrame: 375,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 376,\n endFrame: 403,\n name: 'play-to-muted'\n }];\n\n this.add({\n name: 'voip_filled',\n parts\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RLottieIcon from '../../lib/rlottie/rlottieIcon';\nimport {GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, GROUP_CALL_PARTICIPANT_MUTED_STATE, getColorByMutedState, clearMutedStateModifier} from '.';\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallParticipantMutedIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE,\n ColorState: GROUP_CALL_PARTICIPANT_MUTED_STATE\n}> {\n constructor(private colored: boolean) {\n super({\n width: 32,\n height: 32,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n\n let index: number;\n switch(state) {\n case states.HAND:\n index = 3;\n break;\n case states.MUTED:\n index = prevState === states.HAND ? 0 : 2;\n break;\n case states.UNMUTED:\n index = 1;\n break;\n }\n\n return this.getItem().getPart(index);\n },\n getColor: colored ? (state, prevState) => {\n return getColorByMutedState(state);\n } : undefined\n });\n\n const className = 'group-call-participant-muted-icon';\n this.container.classList.add(className + '-container');\n\n const parts = RLottieIcon.generateEqualParts(4, 21);\n this.add({\n name: 'voice_outlined2',\n parts\n });\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n return super.setState(clearMutedStateModifier(state), state);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '../popups';\nimport {hexToRgb} from '../../helpers/color';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport customProperties from '../../helpers/dom/customProperties';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport type {AppChatsManager} from '../../lib/appManagers/appChatsManager';\nimport type {AppGroupCallsManager} from '../../lib/appManagers/appGroupCallsManager';\nimport type {AppPeersManager} from '../../lib/appManagers/appPeersManager';\nimport GROUP_CALL_STATE from '../../lib/calls/groupCallState';\nimport {RLottieColor} from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIcon from './microphoneIcon';\nimport GroupCallParticipantsElement from './participants';\nimport GroupCallParticipantsVideoElement from './participantVideos';\nimport PopupPeer from '../popups/peer';\nimport GroupCallDescriptionElement from './description';\nimport GroupCallTitleElement from './title';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../../helpers/dom/fullScreen';\nimport Scrollable from '../scrollable';\nimport {MovableState} from '../movableElement';\nimport animationIntersector from '../animationIntersector';\nimport {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport throttle from '../../helpers/schedulers/throttle';\nimport IS_SCREEN_SHARING_SUPPORTED from '../../environment/screenSharingSupport';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport makeButton from '../call/button';\nimport MovablePanel from '../../helpers/movablePanel';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport groupCallsController from '../../lib/calls/groupCallsController';\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let 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 const color: RLottieColor = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nconst className = 'group-call';\n\nexport default class PopupGroupCall extends PopupElement {\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movablePanel: MovablePanel;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n private btnVideo: HTMLDivElement;\n private btnScreen: HTMLDivElement;\n\n constructor() {\n super('popup-group-call', {\n body: true,\n withoutOverlay: true,\n closable: true,\n title: true\n });\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = groupCallsController.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen ' + className + '-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n\n attachClickEvent(btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(btnFullScreen2, this.onFullScreenClick, {listenerSetter});\n\n attachClickEvent(btnExitFullScreen, () => {\n cancelFullScreen();\n }, {listenerSetter});\n\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n }\n\n const btnInvite = this.btnInvite = ButtonIcon('adduser');\n const btnShowColumn = this.btnShowColumn = ButtonIcon('rightpanel ' + className + '-only-big');\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add(className + '-header-info');\n\n this.title.classList.add(className + '-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add(className + '-header');\n this.header.append(...[this.btnExitFullScreen, headerInfo/* , btnInvite */, this.btnFullScreen, btnShowColumn].filter(Boolean));\n\n const newHeader = this.header.cloneNode(false) as HTMLElement;\n const newHeaderInfo = headerInfo.cloneNode(false) as HTMLElement;\n const newHeaderTitle = this.title.cloneNode(false) as HTMLElement;\n\n newHeaderInfo.append(newHeaderTitle);\n\n const btnHideColumn = ButtonIcon('rightpanel');\n newHeader.append(...[btnHideColumn, newHeaderInfo, this.btnFullScreen2].filter(Boolean));\n\n attachClickEvent(btnHideColumn, this.toggleRightColumn, {listenerSetter});\n\n this.body.prepend(newHeader);\n\n const videosScrollable = new Scrollable(undefined);\n videosScrollable.container.classList.add('group-call-big-video-container');\n this.container.append(videosScrollable.container);\n\n this.groupCallTitle = new GroupCallTitleElement(this.title);\n this.groupCallDescription = new GroupCallDescriptionElement(subtitle);\n this.groupCallBodyHeaderDescription = new GroupCallDescriptionElement(newHeaderTitle);\n this.constructButtons();\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n managers: this.managers\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n managers: this.managers\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: 400,\n minHeight: 480,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'chatlist') ||\n findUpClassName(target, 'group-call-button') ||\n findUpClassName(target, 'btn-icon') ||\n findUpClassName(target, 'group-call-participants-video-container') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n onResize: () => this.toggleBigLayout(),\n previousState\n });\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n if(this.instance?.id === groupCall.id) {\n this.updateInstance();\n }\n });\n\n listenerSetter.add(instance)('pinned', () => {\n this.setHasPinned();\n });\n\n listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', this.onToggleControls);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n private constructButtons() {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n const _makeButton = makeButton.bind(null, className, this.listenerSetter);\n\n const btnVideo = this.btnVideo = _makeButton({\n // text: 'VoiceChat.Video.Stream.Video',\n callback: this.onVideoClick,\n icon: 'videocamera_filled'\n });\n\n const btnScreen = this.btnScreen = _makeButton({\n // text: 'VoiceChat.Video.Stream.Screencast',\n callback: this.onScreenClick,\n icon: 'sharescreen_filled'\n });\n\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnMute = _makeButton({\n noRipple: true,\n callback: throttle(this.onMuteClick, 600, true)\n });\n btnMute.classList.add(className + '-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const btnMore = _makeButton({\n // text: 'VoiceChat.Video.Stream.More'\n icon: 'settings_filled'\n });\n\n btnMore.classList.add('btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = _makeButton({\n // text: 'VoiceChat.Leave',\n isDanger: true,\n callback: this.onLeaveClick,\n icon: 'close'\n });\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onToggleControls = (show: boolean) => {\n this.container.classList.toggle('show-controls', show);\n this.buttonsContainer.classList.toggle('show-controls', show);\n };\n\n private toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n private onVideoClick = () => {\n const toggle = this.toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = this.toggleDisability([this.btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n };\n\n private onMuteClick = () => {\n const participant = this.instance.participant;\n if(!participant.pFlags.can_self_unmute) {\n if(participant.raise_hand_rating === undefined) {\n this.instance.changeRaiseHand(true);\n }\n } else {\n this.instance.toggleMuted();\n }\n };\n\n private onLeaveClick = async() => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(await this.managers.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true\n }]\n }).show();\n } else {\n hangUp(false);\n }\n };\n\n public getContainer() {\n return this.container;\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations2(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const movable = this.movablePanel?.movable;\n const isBig = (isFull || !!(movable && movable.width >= 680)) && !!this.videosCount;\n\n /* if(!isBig && isFull) {\n cancelFullScreen();\n return;\n } */\n\n const wasBig = this.container.classList.contains('is-big-layout');\n let buttons: HTMLElement[];\n if(isBig && !wasBig) { // fix buttons transition to 0 opacity\n buttons = Array.from(this.buttonsContainer.children) as HTMLElement[];\n buttons.forEach((element) => {\n element.style.opacity = '0';\n });\n\n void this.buttonsContainer.offsetLeft;\n }\n\n this.container.classList.toggle('is-big-layout', isBig);\n this.btnInvite.classList.toggle('hide', isBig);\n this.btnShowColumn.classList.toggle('hide', !isBig);\n\n if(buttons) {\n // window.requestAnimationFrame(() => {\n buttons.forEach((element) => {\n element.style.opacity = '';\n });\n // });\n }\n };\n\n private toggleRightColumn = () => {\n this.container.classList.toggle('is-right-column-shown');\n };\n\n private setHasPinned() {\n this.container.classList.toggle('has-pinned', !!this.instance.pinnedSource);\n }\n\n private updateInstance() {\n if(this.instance.state === GROUP_CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.hide();\n return;\n }\n\n const {participant, groupCall} = this.instance;\n if(!participant) {\n return;\n }\n\n this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(groupCall as any, participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {GroupCallParticipant} from '../../layer';\nimport {i18n} from '../../lib/langPack';\nimport {GROUP_CALL_PARTICIPANT_MUTED_STATE} from '.';\nimport {GroupCallParticipantVideoType} from './participantVideo';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter((type) => !!participant[type]).map((type) => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n\n replaceContent(this.container, span);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {fastRaf} from '../../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport appDialogsManager, {DialogDom, AppDialogsManager, DialogElementSize} from '../../lib/appManagers/appDialogsManager';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport type GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: async(element) => (await this.instance.getParticipantByPeerId(element.id)).date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: async(element) => {\n const participant = await this.instance.getParticipantByPeerId(element.id);\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n /* instance.getParticipantByPeerId(base.id).then((participant) => {\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n }); */\n\n (base as SortedParticipant).dom = dom;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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', {alpha: false});\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCallParticipant} from '../../layer';\nimport type {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {i18n} from '../../lib/langPack';\nimport PeerTitle from '../peerTitle';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport callVideoCanvasBlur from '../call/videoCanvasBlur';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private managers: AppManagers, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n\n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n\n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n\n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n\n this.container.append(this.header);\n // }\n\n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n video.classList.add(className, 'call-video');\n\n if(video.paused) {\n video.play();\n }\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(className + '-blur');\n\n this.container.prepend(canvas, video);\n\n this.updateParticipant(participant);\n }\n\n public updateParticipant(participant: GroupCallParticipant) {\n const state = getGroupCallParticipantMutedState(participant);\n\n this.groupCallParticipantMutedIcon.setState(state);\n this.groupCallParticipantStatus.setState(state, participant);\n }\n\n public destroy() {\n this.groupCallParticipantMutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ControlsHover from '../../helpers/dom/controlsHover';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipant} from '../../layer';\nimport {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport GroupCallParticipantVideoElement, {GroupCallParticipantVideoType} from './participantVideo';\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange'],\n managers: AppManagers\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(this.instance)('pinned', (source) => {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return;\n }\n\n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some((type) => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach((type) => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.managers, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n\n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n\n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n (await instance.participants).forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupGroupCall from '.';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {addFullScreenListener, isFullScreen} from '../../helpers/dom/fullScreen';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport positionMenu from '../../helpers/positionMenu';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport {GroupCallParticipant} from '../../layer';\nimport type {AppChatsManager} from '../../lib/appManagers/appChatsManager';\nimport type {AppGroupCallsManager} from '../../lib/appManagers/appGroupCallsManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport type {AppPeersManager} from '../../lib/appManagers/appPeersManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport confirmationPopup from '../confirmationPopup';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport Scrollable from '../scrollable';\nimport GroupCallParticipantsList from './participantsList';\nimport GroupCallParticipantsVideoElement from './participantVideos';\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean | Promise})[];\n private element: HTMLElement;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n private managers: AppManagers;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n managers: AppManagers,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.managers.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: async() => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: await this.managers.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.managers.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.managers = options.managers;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n\n this.element = ButtonMenuSync({buttons: this.buttons, listenerSetter});\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener(options.onContextElement, async(e) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n cancelEvent(e);\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = await this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = await this.managers.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n await filterAsync(this.buttons, async(button) => {\n const good = await button.verify(peerId);\n button.element.classList.toggle('hide', !good);\n return good;\n });\n\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n contextMenuController.openBtnMenu(this.element);\n }, listenerSetter);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n contextMenuController.close();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? PopupElement.getPopups(PopupGroupCall)[0].getContainer(): document.body;\n\n if(!isFull) {\n contextMenuController.close();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopups(PopupGroupCall)[0];\n if(popup) {\n popup.hide();\n }\n\n appImManager.setInnerPeer({peerId: this.targetPeerId});\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.instance.editParticipant(this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n\n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n\n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n const participants = await instance.participants;\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCall} from '../../layer';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport GROUP_CALL_STATE from '../../lib/calls/groupCallState';\nimport I18n, {LangPackKey, FormatterArguments} from '../../lib/langPack';\n\nexport default class GroupCallDescriptionElement {\n private descriptionIntl: I18n.IntlElement;\n\n constructor(private appendTo: HTMLElement) {\n this.descriptionIntl = new I18n.IntlElement({\n key: 'VoiceChat.Status.Connecting'\n });\n\n this.descriptionIntl.element.classList.add('group-call-description');\n }\n\n public detach() {\n this.descriptionIntl.element.remove();\n }\n\n public update(instance: GroupCallInstance) {\n const {state} = instance;\n\n let key: LangPackKey, args: FormatterArguments;\n if(state === GROUP_CALL_STATE.CONNECTING) {\n key = 'VoiceChat.Status.Connecting';\n } else {\n key = 'VoiceChat.Status.Members';\n args = [(instance.groupCall as GroupCall.groupCall).participants_count];\n }\n\n const {descriptionIntl} = this;\n descriptionIntl.compareAndUpdate({\n key,\n args\n });\n\n if(!this.descriptionIntl.element.parentElement) {\n this.appendTo.append(this.descriptionIntl.element);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {GroupCall} from '../../layer';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport PeerTitle from '../peerTitle';\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.options.peerId !== peerId) {\n peerTitle.options.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport ripple from '../ripple';\n\nexport default function makeButton(className: string, listenerSetter: ListenerSetter, options: {\n text?: LangPackKey | HTMLElement,\n isDanger?: boolean,\n noRipple?: boolean,\n callback?: () => void,\n icon?: string,\n isConfirm?: boolean,\n}) {\n const _className = className + '-button';\n const buttonDiv = document.createElement('div');\n buttonDiv.classList.add(_className, 'call-button', 'rp-overflow');\n\n if(options.icon) {\n buttonDiv.classList.add('tgico-' + options.icon);\n }\n\n if(!options.noRipple) {\n ripple(buttonDiv);\n }\n\n if(options.isDanger) {\n buttonDiv.classList.add(_className + '-red');\n }\n\n if(options.isConfirm) {\n buttonDiv.classList.add(_className + '-green');\n }\n\n if(options.callback) {\n attachClickEvent(buttonDiv, options.callback, {listenerSetter});\n }\n\n let ret = buttonDiv;\n if(options.text) {\n const div = document.createElement('div');\n div.classList.add(_className + '-container', 'call-button-container');\n\n const textEl = typeof(options.text) === 'string' ? i18n(options.text) : options.text;\n textEl.classList.add(_className + '-text', 'call-button-text');\n\n div.append(buttonDiv, textEl);\n\n ret = div;\n }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\nimport windowSize from '../helpers/windowSize';\nimport SwipeHandler from './swipeHandler';\n\ntype ResizeSide = 'n' | 'e' | 's' | 'w' | 'ne' | 'se' | 'sw' | 'nw';\nexport type MovableState = {\n top?: number;\n left?: number;\n width: number;\n height: number;\n};\n\nconst className = 'movable-element';\nconst resizeHandlerClassName = className + '-resize-handler';\n\nexport type MovableElementOptions = {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element'],\n verifyTouchTarget?: MovableElement['verifyTouchTarget']\n};\n\nexport default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\n private verifyTouchTarget: (e: TouchEvent | MouseEvent) => boolean;\n\n private top: number;\n private left: number;\n private _width: number;\n private _height: number;\n\n private swipeHandler: SwipeHandler;\n private handlers: HTMLElement[];\n\n constructor(options: MovableElementOptions) {\n super(true);\n safeAssign(this, options);\n\n this.top = this.left = this.width = this.height = 0;\n this.element.classList.add(className);\n\n this.addResizeHandlers();\n this.setSwipeHandler();\n\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private onResize = () => {\n this.fixDimensions();\n this.fixPosition();\n this.setPosition();\n };\n\n public destroyElements() {\n this.element.classList.remove(className);\n\n if(this.handlers) {\n this.handlers.forEach((handler) => {\n handler.remove();\n });\n }\n }\n\n public destroy() {\n mediaSizes.removeEventListener('resize', this.onResize);\n this.swipeHandler.removeListeners();\n }\n\n private addResizeHandlers() {\n const sides: ResizeSide[] = ['n', 'e', 's', 'w', 'ne', 'se', 'sw', 'nw'];\n this.handlers = sides.map((side) => {\n const div = document.createElement('div');\n div.dataset.side = side;\n div.classList.add(resizeHandlerClassName, resizeHandlerClassName + '-side-' + side);\n this.element.append(div);\n return div;\n });\n }\n\n private setSwipeHandler() {\n let startTop: number, startLeft: number, startWidth: number, startHeight: number, resizingSide: ResizeSide;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.element,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1; // to right will be positive\n yDiff *= -1; // to bottom will be positive\n // console.log(xDiff, yDiff, e);\n\n if(resizingSide) {\n if(resizingSide.includes('e') || resizingSide.includes('w')) {\n const isEnlarging = resizingSide.includes('e') && xDiff > 0 || resizingSide.includes('w') && xDiff < 0;\n const resizeDiff = Math.abs(xDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('e') ? windowSize.width - startLeft : startWidth + startLeft;\n this.width = Math.min(maxPossible, startWidth + resizeDiff);\n }\n\n if(resizingSide.includes('n') || resizingSide.includes('s')) {\n const isEnlarging = resizingSide.includes('s') && yDiff > 0 || resizingSide.includes('n') && yDiff < 0;\n const resizeDiff = Math.abs(yDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('s') ? windowSize.height - startTop : startHeight + startTop;\n this.height = Math.min(maxPossible, startHeight + resizeDiff);\n }\n\n this.fixDimensions();\n\n if(resizingSide.includes('w')) {\n this.left = Math.min(startLeft + startWidth - this.minWidth, startLeft + xDiff);\n }\n\n if(resizingSide.includes('n')) {\n this.top = Math.min(startTop + startHeight - this.minHeight, startTop + yDiff);\n }\n } else {\n this.top = startTop + yDiff;\n this.left = startLeft + xDiff;\n }\n\n this.fixPosition();\n this.setPosition();\n },\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(this.verifyTouchTarget && !this.verifyTouchTarget(e)) {\n return false;\n }\n\n const resizeHandler = findUpClassName(target, resizeHandlerClassName);\n if(resizeHandler) {\n resizingSide = resizeHandler.dataset.side as ResizeSide;\n swipeHandler.setCursor('');\n } else {\n resizingSide = undefined;\n swipeHandler.setCursor('grabbing');\n }\n\n return true;\n },\n onFirstSwipe: () => {\n startTop = this.top;\n startLeft = this.left;\n startWidth = this.width;\n startHeight = this.height;\n }\n });\n }\n\n public setPositionToCenter() {\n this.top = (windowSize.height / 2) - (this.height / 2);\n this.left = (windowSize.width / 2) - (this.width / 2);\n this.setPosition();\n }\n\n private fixDimensions() {\n this.width = clamp(this.width, this.minWidth, windowSize.width);\n this.height = clamp(this.height, this.minHeight, windowSize.height);\n }\n\n private fixPosition() {\n this.top = clamp(this.top, 0, windowSize.height - this.height);\n this.left = clamp(this.left, 0, windowSize.width - this.width);\n }\n\n private setPosition() {\n this.element.style.top = this.top + 'px';\n this.element.style.left = this.left + 'px';\n this.element.style.right = 'auto';\n this.element.style.bottom = 'auto';\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n this.dispatchEvent('resize');\n }\n\n public get width() {\n return this._width;\n }\n\n public get height() {\n return this._height;\n }\n\n private set width(value: number) {\n this._width = value;\n }\n\n private set height(value: number) {\n this._height = value;\n }\n\n public get state(): MovableState {\n const {top, left, width, height} = this;\n return {\n top,\n left,\n width,\n height\n };\n }\n\n public set state(state: MovableState) {\n const {top, left, width, height} = state;\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n this.onResize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MovableElement, {MovableElementOptions, MovableState} from '../components/movableElement';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport ListenerSetter from './listenerSetter';\nimport mediaSizes, {ScreenSize} from './mediaSizes';\nimport safeAssign from './object/safeAssign';\n\nexport default class MovablePanel {\n #movable: MovableElement;\n private listenerSetter: ListenerSetter;\n private previousState: MovableState;\n private onResize: () => void;\n private movableOptions: MovableElementOptions;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n previousState: MovableState,\n onResize?: () => void,\n movableOptions: MovableElementOptions\n }) {\n safeAssign(this, options);\n\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n this.listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n }\n\n public destroy() {\n const movable = this.movable;\n if(movable) {\n movable.destroy();\n }\n }\n\n public get movable() {\n return this.#movable;\n }\n\n public get state() {\n return this.movable ? this.movable.state : this.previousState;\n }\n\n public set state(state: MovableState) {\n this.previousState = state;\n }\n\n private toggleMovable(enabled: boolean) {\n let {movable} = this;\n if(enabled) {\n if(movable) {\n return;\n }\n\n movable = this.#movable = new MovableElement(this.movableOptions);\n\n movable.state = this.previousState;\n if(this.previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n\n if(this.onResize) {\n this.listenerSetter.add(movable)('resize', this.onResize);\n }\n } else {\n if(!movable) {\n return;\n }\n\n this.previousState = movable.state;\n movable.destroyElements();\n movable.destroy();\n this.#movable = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function toggleClassName(className: string, elements: HTMLElement[], disable: boolean) {\n elements.forEach((element) => {\n element.classList.toggle(className, disable);\n });\n\n return () => toggleClassName(className, elements, !disable);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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 replaceContent from '../../helpers/dom/replaceContent';\nimport MovablePanel from '../../helpers/movablePanel';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport themeController from '../../helpers/themeController';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport CallInstance from '../../lib/calls/callInstance';\nimport CALL_STATE from '../../lib/calls/callState';\nimport I18n, {i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport animationIntersector from '../animationIntersector';\nimport AvatarElement from '../avatar';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIconMini from '../groupCall/microphoneIconMini';\nimport {MovableState} from '../movableElement';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport SetTransition from '../singleTransition';\nimport makeButton from './button';\nimport CallDescriptionElement from './description';\nimport callVideoCanvasBlur from './videoCanvasBlur';\n\nconst className = 'call';\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 580;\n\nconst INIT_STATE: MovableState = {\n width: MIN_WIDTH,\n height: MIN_HEIGHT\n};\n\nlet previousState: MovableState = {...INIT_STATE};\n\nexport default class PopupCall extends PopupElement {\n private peerId: PeerId;\n\n private description: CallDescriptionElement;\n private emojisSubtitle: HTMLElement;\n\n private partyStates: HTMLElement;\n private partyMutedState: HTMLElement;\n\n private firstButtonsRow: HTMLElement;\n private secondButtonsRow: HTMLElement;\n\n private declineI18nElement: I18n.IntlElement;\n\n private makeButton: (options: Parameters[2]) => HTMLElement;\n private btnAccept: HTMLElement;\n private btnDecline: HTMLElement;\n private btnVideo: HTMLElement;\n private btnScreen: HTMLElement;\n private btnMute: HTMLElement;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n\n private movablePanel: MovablePanel;\n private microphoneIcon: GroupCallMicrophoneIconMini;\n private muteI18nElement: I18n.IntlElement;\n\n private videoContainers: {\n input?: HTMLElement,\n output?: HTMLElement\n };\n\n private controlsHover: ControlsHover;\n\n constructor(private instance: CallInstance) {\n super('popup-call', {\n withoutOverlay: true,\n closable: true\n });\n\n this.videoContainers = {};\n\n const {container, listenerSetter} = this;\n container.classList.add(className, 'night');\n\n const avatarContainer = document.createElement('div');\n avatarContainer.classList.add(className + '-avatar');\n\n const peerId = this.peerId = this.instance.interlocutorUserId.toPeerId();\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-full');\n avatar.updateWithOptions({\n isBig: true,\n peerId: peerId\n });\n avatarContainer.append(avatar);\n\n const title = new PeerTitle({\n peerId\n }).element;\n\n title.classList.add(className + '-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-subtitle');\n\n const description = this.description = new CallDescriptionElement(subtitle);\n\n const emojisSubtitle = this.emojisSubtitle = document.createElement('div');\n emojisSubtitle.classList.add(className + '-emojis');\n\n container.append(avatarContainer, title, subtitle);\n\n if(!IS_MOBILE) {\n this.btnFullScreen = ButtonIcon('fullscreen');\n this.btnExitFullScreen = ButtonIcon('smallscreen hide');\n attachClickEvent(this.btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(this.btnExitFullScreen, () => cancelFullScreen(), {listenerSetter});\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n this.header.prepend(this.btnExitFullScreen);\n this.header.append(this.btnFullScreen);\n\n container.append(emojisSubtitle);\n } else {\n this.header.append(emojisSubtitle);\n }\n\n this.partyStates = document.createElement('div');\n this.partyStates.classList.add(className + '-party-states');\n\n this.partyMutedState = document.createElement('div');\n this.partyMutedState.classList.add(className + '-party-state');\n const stateText = i18n('VoipUserMicrophoneIsOff', [new PeerTitle({peerId, onlyFirstName: true, limitSymbols: 18}).element]);\n stateText.classList.add(className + '-party-state-text');\n const mutedIcon = new GroupCallMicrophoneIconMini(false, true);\n mutedIcon.setState(false, false);\n this.partyMutedState.append(\n mutedIcon.container,\n stateText\n );\n\n this.partyStates.append(this.partyMutedState);\n this.container.append(this.partyStates);\n\n this.makeButton = makeButton.bind(null, className, this.listenerSetter);\n this.constructFirstButtons();\n this.constructSecondButtons();\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(instance)('mediaState', () => {\n this.updateInstance();\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: MIN_WIDTH,\n minHeight: MIN_HEIGHT,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'call-button') ||\n findUpClassName(target, 'btn-icon') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n // onResize: () => this.toggleBigLayout(),\n previousState: !this.instance.wasTryingToJoin && !this.instance.isOutgoing ? {...INIT_STATE} : previousState\n });\n\n const movableElement = this.movablePanel.movable;\n if(movableElement) {\n this.listenerSetter.add(movableElement)('resize', () => {\n this.resizeVideoContainers();\n });\n }\n\n const controlsHover = this.controlsHover = new ControlsHover();\n controlsHover.setup({\n element: this.container,\n listenerSetter: this.listenerSetter,\n showOnLeaveToClassName: 'call-buttons'\n });\n controlsHover.showControls(false);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.microphoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.updateInstance();\n }\n\n public getCallInstance() {\n return this.instance;\n }\n\n private constructFirstButtons() {\n const buttons = this.firstButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-first');\n\n const toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n const btnVideo = this.btnVideo = this.makeButton({\n text: 'Call.Camera',\n icon: 'videocamera_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleVideoSharing().finally(toggle);\n }\n });\n\n const btnScreen = this.btnScreen = this.makeButton({\n text: 'Call.Screen',\n icon: 'sharescreen_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleScreenSharing().finally(toggle);\n }\n });\n\n if(!IS_SCREEN_SHARING_SUPPORTED) {\n btnScreen.classList.add('hide');\n this.container.classList.add('no-screen');\n }\n\n this.muteI18nElement = new I18n.IntlElement({\n key: 'Call.Mute'\n });\n const btnMute = this.btnMute = this.makeButton({\n text: this.muteI18nElement.element,\n callback: () => {\n this.instance.toggleMuted();\n }\n });\n\n const microphoneIcon = this.microphoneIcon = new GroupCallMicrophoneIconMini(true, true);\n btnMute.firstElementChild.append(microphoneIcon.container);\n\n // btnVideo.classList.add('disabled');\n // btnScreen.classList.add('disabled');\n\n buttons.append(btnVideo, btnScreen, btnMute);\n this.container.append(buttons);\n }\n\n private constructSecondButtons() {\n const buttons = this.secondButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-second');\n\n this.declineI18nElement = new I18n.IntlElement({\n key: 'Call.Decline'\n });\n const btnDecline = this.btnDecline = this.makeButton({\n text: this.declineI18nElement.element,\n icon: 'endcall_filled',\n callback: () => {\n this.instance.hangUp('phoneCallDiscardReasonHangup');\n },\n isDanger: true\n });\n\n const btnAccept = this.btnAccept = this.makeButton({\n text: 'Call.Accept',\n icon: 'phone_filled',\n callback: () => {\n this.instance.acceptCall();\n },\n isConfirm: true\n });\n\n buttons.append(btnDecline, btnAccept);\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onFullScreenChange = () => {\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n\n this.resizeVideoContainers();\n }\n };\n\n private createVideoContainer(video: HTMLVideoElement) {\n const _className = className + '-video';\n const container = document.createElement('div');\n container.classList.add(_className + '-container');\n\n video.classList.add(_className);\n if(video.paused) {\n video.play();\n }\n\n attachClickEvent(container, () => {\n if(!container.classList.contains('small')) {\n return;\n }\n\n const big = Object.values(this.videoContainers).find((container) => !container.classList.contains('small'));\n big.classList.add('small');\n big.style.cssText = container.style.cssText;\n container.classList.remove('small');\n container.style.cssText = '';\n\n this.resizeVideoContainers();\n });\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(_className + '-blur');\n\n container.append(canvas, video);\n\n return container;\n }\n\n private updateInstance() {\n const {instance} = this;\n const {connectionState} = instance;\n if(connectionState === CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.btnVideo.classList.add('disabled');\n\n this.hide();\n return;\n }\n\n const isPendingIncoming = !instance.isOutgoing && connectionState === CALL_STATE.PENDING;\n this.declineI18nElement.compareAndUpdate({\n key: connectionState === CALL_STATE.PENDING ? 'Call.Decline' : 'Call.End'\n });\n this.btnAccept.classList.toggle('disable', !isPendingIncoming);\n this.btnAccept.classList.toggle('hide-me', !isPendingIncoming);\n this.container.classList.toggle('two-button-rows', isPendingIncoming);\n\n const isMuted = instance.isMuted;\n const onFrame = () => {\n this.btnMute.firstElementChild.classList.toggle('active', isMuted);\n };\n\n const player = this.microphoneIcon.getItem().player;\n this.microphoneIcon.setState(!isMuted, !isMuted, onFrame);\n if(!player) {\n onFrame();\n }\n\n this.muteI18nElement.compareAndUpdate({\n key: isMuted ? 'VoipUnmute' : 'Call.Mute'\n });\n\n const isSharingVideo = instance.isSharingVideo;\n this.btnVideo.firstElementChild.classList.toggle('active', isSharingVideo);\n\n const isSharingScreen = instance.isSharingScreen;\n this.btnScreen.firstElementChild.classList.toggle('active', isSharingScreen);\n\n const outputState = instance.getMediaState('output');\n\n SetTransition({\n element: this.partyMutedState,\n className: 'is-visible',\n forwards: !!outputState?.muted,\n duration: 300\n });\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 replaceContent(this.emojisSubtitle, 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 cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport rootScope from '../lib/rootScope';\nimport ButtonIcon from './buttonIcon';\nimport TopbarWeave from './topbarWeave';\nimport SetTransition from './singleTransition';\nimport PopupGroupCall from './groupCall';\nimport GroupCallDescriptionElement from './groupCall/description';\nimport GroupCallTitleElement from './groupCall/title';\nimport PopupElement from './popups';\nimport throttle from '../helpers/schedulers/throttle';\nimport GroupCallInstance from '../lib/calls/groupCallInstance';\nimport CALL_STATE from '../lib/calls/callState';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport PeerTitle from './peerTitle';\nimport CallDescriptionElement from './call/description';\nimport PopupCall from './call';\nimport GroupCallMicrophoneIconMini from './groupCall/microphoneIconMini';\nimport CallInstance from '../lib/calls/callInstance';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport groupCallsController from '../lib/calls/groupCallsController';\nimport StreamManager from '../lib/calls/streamManager';\nimport callsController from '../lib/calls/callsController';\n\nfunction convertCallStateToGroupState(state: CALL_STATE, isMuted: boolean) {\n switch(state) {\n case CALL_STATE.CLOSING:\n case CALL_STATE.CLOSED:\n return GROUP_CALL_STATE.CLOSED;\n case CALL_STATE.CONNECTED:\n return isMuted ? GROUP_CALL_STATE.MUTED : GROUP_CALL_STATE.UNMUTED;\n default:\n return GROUP_CALL_STATE.CONNECTING;\n }\n}\n\nconst CLASS_NAME = 'topbar-call';\n\nexport default class TopbarCall {\n public container: HTMLElement;\n private listenerSetter: ListenerSetter;\n private weave: TopbarWeave;\n private center: HTMLDivElement;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallMicrophoneIconMini: GroupCallMicrophoneIconMini;\n private callDescription: CallDescriptionElement;\n\n private currentDescription: GroupCallDescriptionElement | CallDescriptionElement;\n\n private instance: GroupCallInstance | any/* CallInstance */;\n private instanceListenerSetter: ListenerSetter;\n\n constructor(\n private managers: AppManagers\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(callsController)('instance', ({instance}) => {\n if(!this.instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(callsController)('accepting', (instance) => {\n if(this.instance !== instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(groupCallsController)('instance', (instance) => {\n this.updateInstance(instance);\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = groupCallsController.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(StreamManager.ANALYSER_LISTENER)('amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private onState = () => {\n this.updateInstance(this.instance);\n };\n\n private clearCurrentInstance() {\n if(!this.instance) return;\n this.center.textContent = '';\n\n if(this.currentDescription) {\n this.currentDescription.detach();\n this.currentDescription = undefined;\n }\n\n this.instance = undefined;\n this.instanceListenerSetter.removeAll();\n }\n\n private updateInstance(instance: TopbarCall['instance']) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n const isChangingInstance = this.instance !== instance;\n if(isChangingInstance) {\n this.clearCurrentInstance();\n\n this.instance = instance;\n this.instanceListenerSetter = new ListenerSetter();\n\n this.instanceListenerSetter.add(instance as GroupCallInstance)('state', this.onState);\n\n if(instance instanceof GroupCallInstance) {\n this.currentDescription = this.groupCallDescription;\n } else {\n this.currentDescription = this.callDescription;\n this.instanceListenerSetter.add(instance)('muted', this.onState);\n }\n\n this.container.classList.toggle('is-call', !(instance instanceof GroupCallInstance));\n }\n\n const isMuted = this.instance.isMuted;\n const 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({\n element: document.body,\n className: 'is-calling',\n forwards: !isClosed,\n duration: 250,\n onTransitionEnd: isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n } : undefined\n });\n }\n\n if(isClosed) {\n return;\n }\n\n weave.setCurrentState(state, true);\n // if(state === GROUP_CALL_STATE.CONNECTING) {\n // weave.setCurrentState(state, true);\n // } else {\n // /* var a = 0;\n // animate(() => {\n // a += 0.1;\n // if(a > 1) a = 0;\n // weave.setAmplitude(a);\n // return true;\n // });\n // weave.setAmplitude(1); */\n // weave.setCurrentState(state, true);\n // }\n\n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(!isMuted);\n }\n\n private setDescription(instance: TopbarCall['instance']) {\n return this.currentDescription.update(instance as any);\n }\n\n private setTitle(instance: TopbarCall['instance']) {\n if(instance instanceof GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n } else {\n replaceContent(this.center, new PeerTitle({peerId: instance.interlocutorUserId.toPeerId()}).element);\n }\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', CLASS_NAME + '-container');\n\n const left = document.createElement('div');\n left.classList.add(CLASS_NAME + '-left');\n\n const groupCallMicrophoneIconMini = this.groupCallMicrophoneIconMini = new GroupCallMicrophoneIconMini();\n\n const mute = ButtonIcon();\n mute.append(groupCallMicrophoneIconMini.container);\n left.append(mute);\n\n const throttledMuteClick = throttle(() => {\n this.instance.toggleMuted();\n }, 600, true);\n\n attachClickEvent(mute, (e) => {\n cancelEvent(e);\n throttledMuteClick();\n }, {listenerSetter});\n\n const center = this.center = document.createElement('div');\n center.classList.add(CLASS_NAME + '-center');\n\n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n\n this.callDescription = new CallDescriptionElement(left);\n\n const right = document.createElement('div');\n right.classList.add(CLASS_NAME + '-right');\n\n const end = ButtonIcon('endcall_filled');\n right.append(end);\n\n attachClickEvent(end, (e) => {\n cancelEvent(e);\n\n const {instance} = this;\n if(!instance) {\n return;\n }\n\n if(instance instanceof GroupCallInstance) {\n instance.hangUp();\n } else {\n instance.hangUp('phoneCallDiscardReasonHangup');\n }\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(this.instance instanceof GroupCallInstance) {\n if(PopupElement.getPopups(PopupGroupCall).length) {\n return;\n }\n\n new PopupGroupCall().show();\n } else if(this.instance instanceof CallInstance) {\n const popups = PopupElement.getPopups(PopupCall);\n if(popups.find((popup) => popup.getCallInstance() === this.instance)) {\n return;\n }\n\n new PopupCall(this.instance).show();\n }\n }, {listenerSetter});\n\n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render(CLASS_NAME + '-weave');\n container.prepend(weaveContainer);\n\n document.getElementById('column-center').prepend(container);\n weave.componentDidMount();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getPeerTitle from '../../components/wrappers/getPeerTitle';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {FontFamily} from '../../config/font';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport idleController from '../../helpers/idleController';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport tsNow from '../../helpers/tsNow';\nimport {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport I18n, {FormatterArguments, LangPackKey} from '../langPack';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport singleInstance from '../mtproto/singleInstance';\nimport webPushApiManager, {PushSubscriptionNotify} from '../mtproto/webPushApiManager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport rootScope from '../rootScope';\nimport appImManager from './appImManager';\nimport appRuntimeManager from './appRuntimeManager';\nimport {AppManagers} from './managers';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport getPeerId from './utils/peers/getPeerId';\n\ntype MyNotification = Notification & {\n hidden?: boolean,\n show?: () => void,\n};\n\nexport type NotifyOptions = Partial<{\n tag: string;\n image: string;\n key: string;\n title: string;\n message: string;\n silent: boolean;\n onclick: () => void;\n noIncrement: boolean;\n}>;\n\nexport type NotificationSettings = {\n nodesktop: boolean,\n volume: number,\n novibrate: boolean,\n nopreview: boolean,\n nopush: boolean,\n nosound: boolean\n};\n\nexport class UiNotificationsManager {\n private notificationsUiSupport: boolean;\n private notificationsShown: {[key: string]: MyNotification | true} = {};\n private notificationIndex = 0;\n private notificationsCount = 0;\n private soundsPlayed: {[tag: string]: number} = {};\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\n private nextSoundAt: number;\n private prevSoundVolume: number;\n\n private faviconElements = Array.from(document.head.querySelectorAll('link[rel=\"icon\"], link[rel=\"alternate icon\"]'));\n\n private titleBackup = document.title;\n private titleChanged = false;\n private titleInterval: number;\n private prevFavicon: string;\n\n private notifySoundEl: HTMLElement;\n\n private stopped = false;\n\n private topMessagesDeferred: CancellablePromise;\n\n private settings: NotificationSettings = {} as any;\n\n private registeredDevice: any;\n private pushInited = false;\n\n private managers: AppManagers;\n private setAppBadge: (contents?: any) => Promise;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n navigator.vibrate = navigator.vibrate || (navigator as any).mozVibrate || (navigator as any).webkitVibrate;\n this.setAppBadge = (navigator as any).setAppBadge && (navigator as any).setAppBadge.bind(navigator);\n this.setAppBadge && this.setAppBadge(0);\n\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\n\n this.notifySoundEl = document.createElement('div');\n this.notifySoundEl.id = 'notify-sound';\n document.body.append(this.notifySoundEl);\n\n this.topMessagesDeferred = deferredPromise();\n\n singleInstance.addEventListener('deactivated', () => {\n this.stop();\n });\n\n singleInstance.addEventListener('activated', () => {\n if(this.stopped) {\n this.start();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n if(this.stopped) {\n return;\n }\n\n if(!idle) {\n this.clear();\n }\n\n this.toggleToggler();\n });\n\n rootScope.addEventListener('notification_reset', (peerString) => {\n this.soundReset(peerString);\n });\n\n rootScope.addEventListener('notification_cancel', (str) => {\n this.cancel(str);\n });\n\n if(this.setAppBadge) {\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 0) {\n this.setAppBadge(folder.unreadUnmutedPeerIds.size);\n }\n });\n }\n\n webPushApiManager.addEventListener('push_init', (tokenData) => {\n this.pushInited = true;\n if(!this.settings.nodesktop && !this.settings.nopush) {\n if(tokenData) {\n this.registerDevice(tokenData);\n } else {\n webPushApiManager.subscribe();\n }\n } else {\n this.unregisterDevice(tokenData);\n }\n });\n webPushApiManager.addEventListener('push_subscribe', (tokenData) => {\n this.registerDevice(tokenData);\n });\n webPushApiManager.addEventListener('push_unsubscribe', (tokenData) => {\n this.unregisterDevice(tokenData);\n });\n\n rootScope.addEventListener('dialogs_multiupdate', () => {\n // unregisterTopMsgs()\n this.topMessagesDeferred.resolve();\n }, {once: true});\n\n webPushApiManager.addEventListener('push_notification_click', (notificationData) => {\n if(notificationData.action === 'push_settings') {\n /* this.topMessagesDeferred.then(() => {\n $modal.open({\n templateUrl: templateUrl('settings_modal'),\n controller: 'SettingsModalController',\n windowClass: 'settings_modal_window mobile_modal',\n backdrop: 'single'\n })\n }); */\n return;\n }\n\n if(notificationData.action === 'mute1d') {\n this.managers.apiManager.invokeApi('account.updateDeviceLocked', {\n period: 86400\n }).then(() => {\n // var toastData = toaster.pop({\n // type: 'info',\n // body: _('push_action_mute1d_success'),\n // bodyOutputType: 'trustedHtml',\n // clickHandler: () => {\n // toaster.clear(toastData)\n // },\n // showCloseButton: false\n // })\n });\n\n return;\n }\n\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\n console.log('click', notificationData, peerId);\n if(peerId) {\n this.topMessagesDeferred.then(async() => {\n if(notificationData.custom.channel_id &&\n !(await this.managers.appChatsManager.hasChat(notificationData.custom.channel_id))) {\n return;\n }\n\n if(peerId.isUser() && !(await this.managers.appUsersManager.hasUser(peerId))) {\n return;\n }\n\n appImManager.setInnerPeer({\n peerId,\n lastMsgId: generateMessageId(+notificationData.custom.msg_id)\n });\n });\n }\n });\n }\n\n public async buildNotification({\n message,\n fwdCount,\n peerReaction,\n peerTypeNotifySettings\n }: {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n }) {\n const peerId = message.peerId;\n const isAnyChat = peerId.isAnyChat();\n const notification: NotifyOptions = {};\n const [peerString, isForum = false] = await Promise.all([\n this.managers.appPeersManager.getPeerString(peerId),\n isAnyChat && this.managers.appPeersManager.isForum(peerId)\n ]);\n let notificationMessage: string;\n let wrappedMessage = false;\n\n if(peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && fwdCount > 1) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [fwdCount]);\n } else {\n notificationMessage = await wrapMessageForReply({message, plain: true});\n\n const reaction = peerReaction?.reaction;\n if(reaction?._ === 'reactionEmoji') {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n fixEmoji(reaction.emoticon), // 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 } else {\n wrappedMessage = true;\n }\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n if(peerReaction) {\n notification.noIncrement = true;\n notification.silent = true;\n }\n\n const threadId = isForum ? getMessageThreadId(message, isForum) : undefined;\n const notificationFromPeerId = peerReaction ? getPeerId(peerReaction.peer_id) : message.fromId;\n notification.title = await getPeerTitle({peerId, plainText: true, managers: this.managers, threadId: threadId});\n if(isForum) {\n const peerTitle = await getPeerTitle({peerId, plainText: true, managers: this.managers});\n notification.title += ` (${peerTitle})`;\n\n if(wrappedMessage && notificationFromPeerId !== message.peerId) {\n notificationMessage = await getPeerTitle({peerId: notificationFromPeerId, plainText: true, managers: this.managers}) +\n ': ' + notificationMessage;\n }\n } else if(isAnyChat && notificationFromPeerId !== message.peerId) {\n notification.title = await getPeerTitle({peerId: notificationFromPeerId, plainText: true, managers: this.managers}) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = wrapPlainText(notification.title);\n\n notification.onclick = () => {\n appImManager.setInnerPeer({peerId, lastMsgId: message.mid, threadId});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;// message.pFlags.silent || false;\n\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').then((url) => {\n // ! WARNING, message can be already read\n if(message.pFlags.unread || peerReaction) {\n notification.image = url;\n this.notify(notification);\n }\n });\n } else {\n this.notify(notification);\n }\n }\n\n private toggleToggler(enable = idleController.isIdle) {\n if(IS_MOBILE) return;\n\n const resetTitle = (isBlink?: boolean) => {\n this.titleChanged = false;\n document.title = this.titleBackup;\n this.setFavicon();\n };\n\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n\n if(!enable) {\n resetTitle();\n } else {\n this.titleInterval = window.setInterval(() => {\n const count = this.notificationsCount;\n if(!count) {\n this.toggleToggler(false);\n } else if(this.titleChanged) {\n resetTitle(true);\n } else {\n this.titleChanged = true;\n document.title = I18n.format('Notifications.Count', true, [count]);\n // this.setFavicon('assets/img/favicon_unread.ico');\n\n // fetch('assets/img/favicon.ico')\n // .then((res) => res.blob())\n // .then((blob) => {\n // const img = document.createElement('img');\n // img.src = URL.createObjectURL(blob);\n\n const canvas = document.createElement('canvas');\n canvas.width = 32 * window.devicePixelRatio;\n canvas.height = canvas.width;\n\n const ctx = canvas.getContext('2d');\n ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\n ctx.fillStyle = '#3390ec';\n ctx.fill();\n\n let fontSize = 24;\n let str = '' + count;\n if(count < 10) {\n fontSize = 22;\n } else if(count < 100) {\n fontSize = 20;\n } else {\n str = '99+';\n fontSize = 16;\n }\n\n fontSize *= window.devicePixelRatio;\n\n ctx.font = `700 ${fontSize}px ${FontFamily}`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = 'white';\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\n\n /* const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\n\n this.setFavicon(canvas.toDataURL());\n // });\n }\n }, 1000);\n }\n }\n\n private setFavicon(href?: string) {\n if(this.prevFavicon === href) {\n return;\n }\n\n this.prevFavicon = href;\n this.faviconElements.forEach((element, idx, arr) => {\n const link = element.cloneNode() as HTMLLinkElement;\n\n if(!link.dataset.href) {\n link.dataset.href = link.href;\n }\n\n href ??= link.dataset.href;\n link.href = href;\n element.replaceWith(arr[idx] = link);\n });\n }\n\n public notify(data: NotifyOptions) {\n // console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\n\n if(this.stopped) {\n return;\n }\n\n // FFOS Notification blob src bug workaround\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\n data.image = 'https://telegram.org/img/t_logo.png'\n }\n else if (data.image && !angular.isString(data.image)) {\n if (Config.Navigator.ffos2p) {\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\n data.image = url\n notify(data)\n })\n return false\n } else {\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\n }\n }\n else */ if(!data.image) {\n data.image = 'assets/img/logo_filled_rounded.png';\n }\n // console.log('notify image', data.image)\n\n if(!data.noIncrement) {\n ++this.notificationsCount;\n }\n\n if(!this.titleInterval) {\n this.toggleToggler();\n }\n\n const idx = ++this.notificationIndex;\n const key = data.key || 'k' + idx;\n this.notificationsShown[key] = true;\n\n const now = tsNow();\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\n (\n !data.tag ||\n !this.soundsPlayed[data.tag] ||\n now > this.soundsPlayed[data.tag] + 60000\n ) */\n ) {\n this.testSound(this.settings.volume);\n this.soundsPlayed[data.tag] = now;\n }\n\n if(!this.notificationsUiSupport ||\n 'Notification' in window && Notification.permission !== 'granted') {\n return false;\n }\n\n if(this.settings.nodesktop) {\n if(this.vibrateSupport && !this.settings.novibrate) {\n navigator.vibrate([200, 100, 200]);\n return;\n }\n\n return;\n }\n\n let notification: MyNotification;\n\n if('Notification' in window) {\n try {\n if(data.tag) {\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\n notification.hidden = true;\n }\n }\n }\n\n notification = new Notification(data.title, {\n icon: data.image || '',\n body: data.message || '',\n tag: data.tag || '',\n silent: data.silent || false\n });\n\n // console.log('notify constructed notification');\n } catch(e) {\n this.notificationsUiSupport = false;\n webPushApiManager.setLocalNotificationsDisabled();\n return;\n }\n } /* else if('mozNotification' in navigator) {\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\n } else if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\n window.external.msSiteModeActivate()\n notification = {\n index: idx\n }\n } */ else {\n return;\n }\n\n notification.onclick = () => {\n notification.close();\n appRuntimeManager.focus();\n this.clear();\n if(data.onclick) {\n data.onclick();\n }\n };\n\n notification.onclose = () => {\n if(!notification.hidden) {\n delete this.notificationsShown[key];\n this.clear();\n }\n };\n\n if(notification.show) {\n notification.show();\n }\n this.notificationsShown[key] = notification;\n\n if(!IS_MOBILE) {\n setTimeout(() => {\n this.hide(key);\n }, 8000);\n }\n }\n\n public updateLocalSettings = () => {\n const keys = ['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'];\n const promises = keys.map(() => undefined);\n // const promises = keys.map((k) => stateStorage.get(k as any));\n Promise.all(promises)\n .then((updSettings) => {\n this.settings.nodesktop = updSettings[0];\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\n this.settings.novibrate = updSettings[2];\n this.settings.nopreview = updSettings[3];\n this.settings.nopush = updSettings[4];\n\n if(this.pushInited) {\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\n const hasPush = this.registeredDevice !== false;\n if(needPush !== hasPush) {\n if(needPush) {\n webPushApiManager.subscribe();\n } else {\n webPushApiManager.unsubscribe();\n }\n }\n }\n\n webPushApiManager.setSettings(this.settings);\n });\n\n apiManagerProxy.getState().then((state) => {\n this.settings.nosound = !state.settings.notifications.sound;\n });\n }\n\n public getLocalSettings() {\n return this.settings;\n }\n\n private hide(key: string) {\n const notification = this.notificationsShown[key];\n if(notification && typeof(notification) !== 'boolean') {\n try {\n if(notification.close) {\n notification.hidden = true;\n notification.close();\n }\n } catch(e) {}\n }\n }\n\n public soundReset(tag: string) {\n delete this.soundsPlayed[tag];\n }\n\n private requestPermission = () => {\n Notification.requestPermission();\n window.removeEventListener('click', this.requestPermission);\n };\n\n public testSound(volume: number) {\n const now = tsNow();\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\n return;\n }\n\n this.nextSoundAt = now + 1000;\n this.prevSoundVolume = volume;\n const filename = 'assets/audio/notification.mp3';\n const audio = document.createElement('audio');\n audio.autoplay = true;\n audio.setAttribute('mozaudiochannel', 'notification');\n audio.volume = volume;\n audio.innerHTML = `\n \n \n `;\n this.notifySoundEl.append(audio);\n\n audio.addEventListener('ended', () => {\n audio.remove();\n }, {once: true});\n }\n\n public cancel(key: string) {\n const notification = this.notificationsShown[key];\n if(notification) {\n if(this.notificationsCount > 0) {\n --this.notificationsCount;\n }\n\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.hidden = true;\n notification.close();\n }/* else if(notificationsMsSiteMode &&\n notification.index === notificationIndex) {\n window.external.msSiteModeClearIconOverlay()\n } */\n } catch(e) {}\n\n delete this.notificationsShown[key];\n }\n }\n\n public clear() {\n /* if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n } else { */\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.close();\n }\n } catch(e) {}\n }\n /* } */\n this.notificationsShown = {};\n this.notificationsCount = 0;\n\n webPushApiManager.hidePushNotifications();\n }\n\n public start() {\n this.updateLocalSettings();\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\n webPushApiManager.start();\n\n if(!this.notificationsUiSupport) {\n return false;\n }\n\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\n window.addEventListener('click', this.requestPermission);\n }\n\n try {\n if('onbeforeunload' in window) {\n window.addEventListener('beforeunload', this.clear);\n }\n } catch(e) {}\n }\n\n private stop() {\n this.clear();\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n this.setFavicon();\n this.stopped = true;\n }\n\n private registerDevice(tokenData: PushSubscriptionNotify) {\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.registerDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: [],\n app_sandbox: false,\n secret: new Uint8Array()\n }).then(() => {\n this.registeredDevice = tokenData;\n }, (error) => {\n error.handled = true;\n });\n }\n\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\n if(!this.registeredDevice) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.unregisterDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: []\n }).then(() => {\n this.registeredDevice = false;\n }, (error) => {\n error.handled = true;\n });\n }\n}\n\nconst uiNotificationsManager = new UiNotificationsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.uiNotificationsManager = uiNotificationsManager);\nexport default uiNotificationsManager;\n","export default async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\n const files: any[] = [];\n\n const scanFiles = async(entry: any, item: DataTransferItem) => {\n if(entry.isDirectory) {\n const directoryReader = entry.createReader();\n await new Promise((resolve, reject) => {\n directoryReader.readEntries(async(entries: any) => {\n for(const entry of entries) {\n await scanFiles(entry, item);\n }\n\n resolve();\n });\n });\n } else if(entry) {\n if(onlyTypes) {\n files.push(entry.type);\n } else {\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\n const file = entry instanceof File ?\n entry :\n (\n entry instanceof DataTransferItem ?\n entry.getAsFile() :\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\n );\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got file', item, file);\n } */\n\n if(!file) return;\n files.push(file);\n }\n }\n };\n\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\n const file = e.dataTransfer.files[i];\n files.push(onlyTypes ? file.type : file);\n }\n } else {\n // @ts-ignore\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\n\n const promises: Promise[] = [];\n for(let i = 0; i < items.length; ++i) {\n const item: DataTransferItem = items[i];\n if(item.kind === 'file') {\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\n promises.push(scanFiles(entry, item));\n }\n }\n\n await Promise.all(promises);\n }\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got files:', e, files);\n } */\n\n return files;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from './dom/cancelEvent';\nimport parseUriParams from './string/parseUriParams';\n\nexport default function addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join' | 'invoice' |\n 'addemoji',\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 let href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n const u = new URL(href);\n const match = u.host.match(/(.+?)\\.t(?:elegram)?\\.me/);\n if(match) {\n u.pathname = match[1] + (u.pathname === '/' ? '' : u.pathname);\n href = u.toString();\n }\n\n if(!options.noPathnameParams) pathnameParams = new URL(href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n}\n","/*\n * 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 {GroupCallId, MyGroupCall} from './appGroupCallsManager';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport appSidebarLeft, {LEFT_COLUMN_ACTIVE_CLASSNAME} from '../../components/sidebarLeft';\nimport appSidebarRight, {RIGHT_COLUMN_ACTIVE_CLASSNAME} from '../../components/sidebarRight';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport Chat, {ChatType} from '../../components/chat/chat';\nimport PopupNewMedia, {getCurrentNewMediaPopup} from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport {doubleRaf} from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport stateStorage from '../stateStorage';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, {i18n, join, LangPackKey} from '../langPack';\nimport {ChatFull, ChatInvite, ChatParticipant, ChatParticipants, Message, MessageAction, MessageMedia, SendMessageAction, User, Chat as MTChat} from '../../layer';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer from '../../components/popups/peer';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport PopupElement from '../../components/popups';\nimport singleInstance, {InstanceDeactivateReason, SingleInstance} from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport {toast, toastNew} from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport pause from '../../helpers/schedulers/pause';\nimport {InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE} from './internalLink';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {ONE_DAY} from '../../helpers/date';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport {CallType} from '../calls/types';\nimport {Modify, SendMessageEmojiInteractionData} from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport ChatBackgroundPatternRenderer from '../../components/chat/patternRenderer';\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport compareVersion from '../../helpers/compareVersion';\nimport {AppManagers} from './managers';\nimport uiNotificationsManager from './uiNotificationsManager';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport {PHONE_NUMBER_REG_EXP} from '../richTextProcessor';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapRichText, {CustomEmojiRendererElement, renderEmojis} from '../richTextProcessor/wrapRichText';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getUserStatusString from '../../components/wrappers/getUserStatusString';\nimport getChatMembersString from '../../components/wrappers/getChatMembersString';\nimport {STATE_INIT} from '../../config/state';\nimport CacheStorageController from '../files/cacheStorage';\nimport themeController from '../../helpers/themeController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport appDialogsManager from './appDialogsManager';\nimport idleController from '../../helpers/idleController';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport getFilesFromEvent from '../../helpers/files/getFilesFromEvent';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport appRuntimeManager from './appRuntimeManager';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport PopupPayment from '../../components/popups/payment';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport NBSP from '../../helpers/string/nbsp';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {MiddleEllipsisElement} from '../../components/middleEllipsis';\nimport addAnchorListener from '../../helpers/addAnchorListener';\nimport parseUriParams from '../../helpers/string/parseUriParams';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\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 stack?: number,\n commentId?: number,\n type?: ChatType\n};\n\nexport type ChatSetInnerPeerOptions = Modify;\n\nexport class AppImManager extends EventListenerBase<{\n chat_changing: (details: {from: Chat, to: Chat}) => void,\n peer_changed: (chat: Chat) => void,\n peer_changing: (chat: Chat) => void,\n}> {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n public tabId = -1;\n\n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n\n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise};\n\n private topbarCall: TopbarCall;\n public emojiAnimationContainer: HTMLDivElement;\n\n private lastBackgroundUrl: string;\n\n public managers: AppManagers;\n\n public cacheStorage = new CacheStorageController('cachedFiles');\n public customEmojiSize: MediaSize;\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n\n const {\n apiUpdatesManager\n } = managers;\n apiUpdatesManager.attach(I18n.lastRequestedLangCode);\n\n appMediaPlaybackController.construct(managers);\n uiNotificationsManager.construct(managers);\n uiNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.backgroundPromises = {};\n STATE_INIT.settings.themes.forEach((theme) => {\n if(theme.background.slug) {\n const url = 'assets/img/' + theme.background.slug + '.svg' + (IS_FIREFOX ? '?1' : '');\n this.backgroundPromises[theme.background.slug] = Promise.resolve(url);\n }\n });\n\n this.selectTab(0);\n\n idleController.addEventListener('change', (idle) => {\n this.offline = idle;\n this.updateStatus();\n if(idle) {\n clearInterval(this.updateStatusInterval);\n } else {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n }\n });\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.emojiAnimationContainer = document.createElement('div');\n this.emojiAnimationContainer.classList.add('emoji-animation-container');\n this.appendEmojiAnimationContainer(mediaSizes.activeScreen);\n\n this.columnEl.append(this.chatsContainer);\n\n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n // window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n const onPremiumToggle = (isPremium: boolean) => {\n document.body.classList.toggle('is-premium', isPremium);\n };\n rootScope.addEventListener('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n this.managers.rootScope.getPremium().then(onPremiumToggle);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations2(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup();\n animationIntersector.checkAnimations2(false);\n });\n\n if(IS_FIREFOX && apiManagerProxy.oldVersion && compareVersion(apiManagerProxy.oldVersion, '1.4.3') === -1) {\n this.deleteFilesIterative((response) => {\n return response.headers.get('Content-Type') === 'image/svg+xml';\n }).then(() => {\n this.applyCurrentTheme();\n });\n } else {\n this.applyCurrentTheme();\n }\n\n // * fix simultaneous opened both sidebars, can happen when floating sidebar is opened with left sidebar\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME) &&\n document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\n appSidebarRight.toggleSidebar(false);\n }\n\n this.appendEmojiAnimationContainer(to);\n });\n\n mediaSizes.addEventListener('resize', () => {\n // const perf = performance.now();\n const rect = this.chatsContainer.getBoundingClientRect();\n ChatBackgroundPatternRenderer.resizeInstances(rect.width, rect.height).then(() => {\n // this.log.warn('resize bg time:', performance.now() - perf);\n // for(const chat of this.chats) {\n // if(chat.renderDarkPattern) {\n // chat.renderDarkPattern();\n // }\n // }\n });\n });\n\n this.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('peer_title_edit', ({peerId, threadId}) => {\n if(this.chat?.peerId === peerId && !threadId && this.tabId !== -1) {\n this.overrideHash(peerId);\n }\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat ||\n chat.peerId !== peerId ||\n overlayCounter.isOverlayActive || (\n mediaSizes.activeScreen === ScreenSize.mobile &&\n this.tabId !== 1\n )\n ) {\n return;\n }\n\n const typing = typings.find((typing) => typing.action._ === 'sendMessageEmojiInteraction');\n if(typing?.action?._ === 'sendMessageEmojiInteraction') {\n const action = typing.action;\n const bubble = chat.bubbles.bubbles[generateMessageId(typing.action.msg_id)];\n if(bubble && bubble.classList.contains('emoji-big') && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)');\n\n const data: SendMessageEmojiInteractionData = JSON.parse(action.interaction.data);\n data.a.forEach((a) => {\n setTimeout(() => {\n simulateClickEvent(stickerWrapper);\n }, a.t * 1000);\n });\n\n this.managers.appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n const onInstanceDeactivated = (reason: InstanceDeactivateReason) => {\n const isUpdated = reason === 'version';\n const popup = new PopupElement('popup-instance-deactivated', {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n(isUpdated ? 'Deactivated.Version.Title' : 'Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n(isUpdated ? 'Deactivated.Version.Subtitle' : 'Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n const onClose = isUpdated ? () => {\n appRuntimeManager.reload();\n } : () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n };\n\n popup.addEventListener('close', onClose);\n popup.show();\n };\n\n singleInstance.addEventListener('deactivated', onInstanceDeactivated);\n if(singleInstance.deactivatedReason) {\n onInstanceDeactivated(singleInstance.deactivatedReason);\n }\n\n // remove scroll listener when setting chat to tray\n this.addEventListener('chat_changing', ({to}) => {\n this.toggleChatGradientAnimation(to);\n });\n\n rootScope.addEventListener('service_notification', (update) => {\n confirmationPopup({\n button: {langKey: 'OK', isCancel: true},\n description: wrapRichText(update.message)\n });\n });\n\n rootScope.addEventListener('payment_sent', async({peerId, mid, receiptMessage}) => {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n if(!message) {\n return;\n }\n\n const action = receiptMessage.action as MessageAction.messageActionPaymentSent;\n toastNew({\n langPackKey: 'PaymentInfoHint',\n langPackArguments: [\n paymentsWrapCurrencyAmount(action.total_amount, action.currency),\n wrapEmojiText(((message as Message.message).media as MessageMedia.messageMediaInvoice).title)\n ]\n });\n });\n\n (window as any).onSpoilerClick = (e: MouseEvent) => {\n const spoiler = findUpClassName(e.target, 'spoiler');\n const parentElement = findUpClassName(spoiler, 'spoilers-container') || spoiler.parentElement;\n\n const className = 'is-spoiler-visible';\n const isVisible = parentElement.classList.contains(className);\n if(!isVisible) {\n cancelEvent(e);\n\n if(CLICK_EVENT_NAME !== 'click') {\n window.addEventListener('click', cancelEvent, {capture: true, once: true});\n }\n }\n\n const duration = 400 / 2;\n const showDuration = 5000;\n const useRafs = !isVisible ? 2 : 0;\n if(useRafs) {\n parentElement.classList.add('will-change');\n }\n\n const spoilerTimeout = parentElement.dataset.spoilerTimeout;\n if(spoilerTimeout !== null) {\n clearTimeout(+spoilerTimeout);\n delete parentElement.dataset.spoilerTimeout;\n }\n\n SetTransition({\n element: parentElement,\n className,\n forwards: true,\n duration,\n onTransitionEnd: () => {\n parentElement.dataset.spoilerTimeout = '' + window.setTimeout(() => {\n SetTransition({\n element: parentElement,\n className,\n forwards: false,\n duration,\n onTransitionEnd: () => {\n parentElement.classList.remove('will-change');\n delete parentElement.dataset.spoilerTimeout;\n }\n });\n }, showDuration);\n },\n useRafs\n });\n };\n\n rootScope.addEventListener('sticker_updated', ({type, faved}) => {\n if(type === 'faved') {\n toastNew({\n langPackKey: faved ? 'AddedToFavorites' : 'RemovedFromFavorites'\n });\n } else if(!faved) {\n toastNew({\n langPackKey: 'RemovedFromRecent'\n });\n }\n });\n\n apiManagerProxy.addEventListener('notificationBuild', async(options) => {\n const isForum = await this.managers.appPeersManager.isForum(options.message.peerId);\n const threadId = getMessageThreadId(options.message, isForum);\n if(this.chat.peerId === options.message.peerId && this.chat.threadId === threadId && !idleController.isIdle) {\n return;\n }\n\n uiNotificationsManager.buildNotification(options);\n });\n\n this.addEventListener('peer_changed', async({peerId}) => {\n document.body.classList.toggle('has-chat', !!peerId);\n\n this.emojiAnimationContainer.textContent = '';\n\n this.overrideHash(peerId);\n\n apiManagerProxy.updateTabState('chatPeerIds', this.chats.map((chat) => chat.peerId).filter(Boolean));\n });\n\n // stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', /* c || */{});\n // });\n\n if(IS_CALL_SUPPORTED || IS_GROUP_CALL_SUPPORTED) {\n this.topbarCall = new TopbarCall(managers);\n }\n\n if(IS_CALL_SUPPORTED) {\n callsController.addEventListener('instance', ({instance/* , hasCurrent */}) => {\n // if(hasCurrent) {\n // return;\n // }\n\n const popup = new PopupCall(instance);\n\n instance.addEventListener('acceptCallOverride', () => {\n return this.discardCurrentCall(instance.interlocutorUserId.toPeerId(), undefined, instance)\n .then(() => {\n callsController.dispatchEvent('accepting', instance);\n return true;\n })\n .catch(() => false);\n });\n\n popup.addEventListener('close', () => {\n const currentCall = callsController.currentCall;\n if(currentCall && currentCall !== instance && !instance.wasTryingToJoin) {\n instance.hangUp('phoneCallDiscardReasonBusy');\n }\n }, {once: true});\n\n popup.show();\n });\n\n callsController.addEventListener('incompatible', async(userId) => {\n toastNew({\n langPackKey: 'VoipPeerIncompatible',\n langPackArguments: [\n await wrapPeerTitle({peerId: userId.toPeerId()})\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 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 addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand',\n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then((peerId) => {\n this.managers.appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n this.managers.appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n // console.log(command, bot);\n }\n });\n\n 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 ([\n ['addstickers', INTERNAL_LINK_TYPE.STICKER_SET],\n ['addemoji', INTERNAL_LINK_TYPE.EMOJI_SET]\n ] as [\n 'addstickers' | 'addemoji',\n INTERNAL_LINK_TYPE.STICKER_SET | INTERNAL_LINK_TYPE.EMOJI_SET\n ][]).forEach(([name, type]) => {\n addAnchorListener<{pathnameParams: [typeof name, string]}>({\n name,\n callback: ({pathnameParams}) => {\n if(!pathnameParams[1]) {\n return;\n }\n\n const link: InternalLink = {\n _: type,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(type, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n // * t.me/invoice/asdasdad\n // * t.me/$asdasdad\n addAnchorListener<{pathnameParams: ['invoice', string] | string}>({\n name: 'invoice',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: pathnameParams.length > 1 ? pathnameParams[1] : pathnameParams[0].slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n 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 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 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}, element) => {\n let link: InternalLink;\n if(PHONE_NUMBER_REG_EXP.test(pathnameParams[0])) {\n link = {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: pathnameParams[0].slice(1)\n };\n } else if(pathnameParams[0] === 'c') {\n pathnameParams.shift();\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n stack: this.getStackFromElement(element)\n };\n } else {\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined,\n stack: this.getStackFromElement(element)\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n 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}, element) => {\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, {\n ...uriParams,\n stack: this.getStackFromElement(element)\n });\n }\n\n this.processInternalLink(link);\n }\n });\n\n 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 addAnchorListener<{\n uriParams: {\n slug: string\n }\n }>({\n name: 'invoice',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.INVOICE, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach((name) => {\n addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.JOIN_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n this.onHashChange(true);\n this.attachKeydownListener();\n }\n\n private getStackFromElement(element: HTMLElement) {\n const possibleBubble = findUpClassName(element, 'bubble');\n return possibleBubble ? +possibleBubble.dataset.mid : undefined;\n }\n\n private deleteFilesIterative(callback: (response: Response) => boolean) {\n return this.cacheStorage.timeoutOperation((cache) => {\n const perf = performance.now();\n return cache.keys().then((requests) => {\n const promises = requests.map((request) => {\n return cache.match(request).then((response) => {\n return callback(response);\n });\n });\n\n return Promise.all(promises).then((values) => {\n values.map((isBad, idx) => {\n if(!isBad) {\n return;\n }\n\n const request = requests[idx];\n return cache.delete(request);\n });\n\n return Promise.all(values.filter(Boolean));\n });\n }).then(() => {\n this.log('deleted files', performance.now() - perf);\n });\n });\n }\n\n private toggleChatGradientAnimation(activatingChat: Chat) {\n this.chats.forEach((chat) => {\n if(chat.gradientRenderer) {\n chat.gradientRenderer.scrollAnimate(rootScope.settings.animationsEnabled && chat === activatingChat);\n }\n });\n }\n\n private appendEmojiAnimationContainer(screen: ScreenSize) {\n const appendTo = screen === ScreenSize.mobile ? this.columnEl : document.body;\n if(this.emojiAnimationContainer.parentElement !== appendTo) {\n appendTo.append(this.emojiAnimationContainer)\n }\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n const isSelectionCollapsed = document.getSelection().isCollapsed;\n if(overlayCounter.isOverlayActive || IGNORE_KEYS.has(key)) return;\n\n const target = e.target as HTMLElement;\n\n // if(target.tagName === 'INPUT') return;\n\n // this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if((key.startsWith('Arrow') || (e.shiftKey && key === 'Shift')) && !isSelectionCollapsed) {\n return;\n } else if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n cancelEvent(e);\n this.managers.dialogsStorage.getNextDialog(this.chat.peerId, key === 'ArrowDown', appDialogsManager.filterId).then((dialog) => {\n if(dialog) {\n this.setPeer({peerId: dialog.peerId});\n }\n });\n } else if(key === 'ArrowUp' && this.chat.type !== 'scheduled') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n this.managers.appMessagesManager.getFirstMessageToEdit(chat.peerId, chat.threadId).then((message) => {\n if(message) {\n chat.input.initMessageEditing(message.mid);\n cancelEvent(e); // * prevent from scrolling\n }\n });\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n\n if(\n chat?.input?.messageInput &&\n e.target !== chat.input.messageInput &&\n target.tagName !== 'INPUT' &&\n !target.isContentEditable &&\n !IS_TOUCH_SUPPORTED &&\n (!mediaSizes.isMobile || this.tabId === 1) &&\n !chat.selection.isSelecting &&\n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n\n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? generateMessageId(+link.comment) : undefined;\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.openUsername({\n userName: link.domain,\n lastMsgId: postId,\n commentId,\n startParam: link.start,\n stack: link.stack,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(!chat) {\n try {\n await this.managers.appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = generateMessageId(+link.post);\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.op({\n peer: chat,\n lastMsgId: postId,\n threadId,\n stack: link.stack\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.EMOJI_SET:\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}, link._ === INTERNAL_LINK_TYPE.EMOJI_SET).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n this.managers.appChatsManager.checkChatInvite(link.invite).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.managers.appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer({\n peerId: chatInvite.chat.id.toPeerId(true)\n });\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite);\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.USER_PHONE_NUMBER: {\n this.managers.appUsersManager.resolvePhone(link.phone).then((user) => {\n this.setInnerPeer({\n peerId: user.id.toPeerId(false)\n });\n }).catch((err) => {\n if(err.type === 'PHONE_NOT_OCCUPIED') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.INVOICE: {\n this.managers.appPaymentsManager.getInputInvoiceBySlug(link.slug).then((inputInvoice) => {\n this.managers.appPaymentsManager.getPaymentForm(inputInvoice).then((paymentForm) => {\n // const message: Message.message = {\n // _: 'message',\n // date: 0,\n // id: 0,\n // peerId: 0,\n // peer_id: undefined,\n // message: '',\n // media: {\n // _: 'messageMediaInvoice',\n // currency: paymentForm.invoice.currency,\n // description: paymentForm.description,\n\n // }\n // };\n new PopupPayment(undefined, inputInvoice, paymentForm);\n });\n });\n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n public openUrl(url: string) {\n const {url: wrappedUrl, onclick} = wrapUrl(url);\n if(!onclick) {\n return;\n }\n\n const a = document.createElement('a');\n a.href = wrappedUrl;\n (window as any)[onclick](a);\n }\n\n private onHashChange = (saveState?: boolean) => {\n try {\n this.onHashChangeUnsafe(saveState);\n } catch(err) {\n this.log.error('hash change error', err);\n }\n };\n\n private onHashChangeUnsafe = (saveState?: boolean) => {\n const hash = location.hash;\n if(!saveState) {\n appNavigationController.replaceState();\n }\n\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n this.log('hashchange', hash, splitted[0], params);\n if(!hash) {\n return;\n }\n\n if(params.tgaddr) {\n this.openUrl(params.tgaddr);\n return;\n }\n\n switch(splitted[0]) {\n default: {\n params.p = splitted[0].slice(1);\n }\n\n case '#/im': {\n if(!Object.keys(params).length) {\n break;\n }\n\n const p: string = params.p;\n const postId = params.post !== undefined ? generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername({\n userName: p,\n lastMsgId: postId\n });\n break;\n }\n\n default: { // peerId\n this.setInnerPeer({\n peerId: postId ? p.toPeerId(true) : p.toPeerId(),\n lastMsgId: postId\n });\n break;\n }\n }\n }\n }\n\n // appNavigationController.replaceState();\n // location.hash = '';\n };\n\n private async op(options: {\n peer: User.user | MTChat\n } & Omit) {\n let {peer, commentId, threadId, lastMsgId} = options;\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n const isForum = peer._ === 'channel' && peer.pFlags.forum;\n // open forum tab\n if(!commentId && !threadId && !lastMsgId && isForum) {\n appDialogsManager.toggleForumTabByPeerId(peerId, true);\n return;\n }\n\n // handle t.me/username/thread or t.me/username/messageId\n if(isForum && lastMsgId && !threadId) {\n const message = await this.managers.appMessagesManager.reloadMessages(peerId, lastMsgId);\n if(message) {\n threadId = options.threadId = getMessageThreadId(message, isForum);\n } else {\n threadId = options.threadId = lastMsgId;\n lastMsgId = options.lastMsgId = undefined;\n }\n }\n\n if(threadId) {\n return this.openThread({\n ...(options as any as Parameters[0]),\n peerId\n });\n } else if(commentId) {\n return this.openComment({\n peerId,\n msgId: lastMsgId,\n commentId\n });\n }\n\n return this.setInnerPeer({\n ...options,\n peerId\n });\n }\n\n public openUsername(options: {\n userName: string\n } & Omit) {\n const {userName} = options;\n return this.managers.appUsersManager.resolveUsername(userName).then((peer) => {\n return this.op({\n peer,\n ...options\n });\n }, (err: ApiError) => {\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 async openThread(options: {\n peerId: PeerId,\n lastMsgId: number,\n threadId: number,\n stack?: number\n }) {\n if(await this.managers.appChatsManager.isForum(options.peerId.toChatId())) {\n await this.managers.dialogsStorage.getForumTopicOrReload(options.peerId, options.threadId);\n return this.setInnerPeer(options);\n }\n\n return this.managers.appMessagesManager.reloadMessages(options.peerId, options.threadId).then((message) => {\n if(!message) {\n options.lastMsgId = undefined;\n } else {\n this.managers.appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n ...options,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(options: {\n peerId: PeerId,\n msgId: number,\n commentId: number\n }) {\n return this.managers.appMessagesManager.getDiscussionMessage(options.peerId, options.msgId).then((message) => {\n return this.openThread({\n peerId: message.peerId,\n lastMsgId: options.commentId,\n threadId: message.mid\n });\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n const call = callsController.getCallByUserId(userId);\n if(call) {\n return;\n }\n\n const userFull = await this.managers.appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n wrapPeerTitle({peerId: userId.toPeerId()}).then((element) => {\n return confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n callsController.startCallInternal(userId, type === 'video');\n }\n\n private discardCurrentCall(toPeerId: PeerId, ignoreGroupCall?: GroupCallInstance, ignoreCall?: CallInstance) {\n if(groupCallsController.groupCall && groupCallsController.groupCall !== ignoreGroupCall) return this.discardGroupCallConfirmation(toPeerId);\n else if(callsController.currentCall && callsController.currentCall !== ignoreCall) return this.discardCallConfirmation(toPeerId);\n else return Promise.resolve();\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n const currentCall = callsController.currentCall;\n if(currentCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return 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: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(!currentCall.isClosing) {\n await currentCall.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = groupCallsController.groupCall;\n if(currentGroupCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return 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: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(groupCallsController.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = this.managers.appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await this.managers.appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n\n call = await this.managers.appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = chatFull.call;\n }\n\n groupCallsController.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n // await this.discardCurrentCall(peerId);\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false): ReturnType {\n const theme = themeController.getTheme();\n\n if(theme.background.slug) {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur &&\n // theme.background.slug === defaultTheme.background.slug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * reset background\n return this.setCurrentBackground(true);\n });\n // }\n }\n\n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = this.cacheStorage.getFile('backgrounds/' + slug).then((blob) => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n this.lastBackgroundUrl = url;\n const promises = this.chats.map((chat) => chat.setBackground(url));\n return promises[promises.length - 1].then(() => {\n if(broadcastEvent) {\n rootScope.dispatchEvent('background_change');\n }\n });\n }\n\n public saveChatPosition(chat: Chat) {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n // const bubble = chat.bubbles.getBubbleByPoint('top');\n // if(bubble) {\n // const top = bubble.getBoundingClientRect().top;\n const chatBubbles = chat.bubbles;\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && chatBubbles.getRenderedLength()) {\n chatBubbles.sliceViewport(true);\n const top = chatBubbles.scrollable.scrollTop;\n\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc').filter((mid) => mid > 0 && !chatBubbles.skippedMids.has(mid)),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n // }\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n\n themeController.setTheme();\n\n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n const {messagesTextSize} = rootScope.settings;\n\n this.customEmojiSize = makeMediaSize(messagesTextSize + 4, messagesTextSize + 4);\n document.documentElement.style.setProperty('--messages-text-size', messagesTextSize + 'px');\n\n const firstTime = !this.customEmojiSize;\n if(!firstTime) {\n const ellipsisElements = document.querySelectorAll('middle-ellipsis-element');\n ellipsisElements.forEach((element) => {\n element.disconnectedCallback();\n element.dataset.fontSize = '' + messagesTextSize;\n if(element.title) element.textContent = element.title;\n element.connectedCallback();\n });\n\n const renderers = document.querySelectorAll('.chat custom-emoji-renderer-element');\n renderers.forEach((renderer) => {\n renderer.forceRenderAfterSize = true;\n });\n }\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 topbar.pinnedMessage?.setCorrectIndex(0); // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations2(false);\n\n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n\n I18n.setTimeFormat(rootScope.settings.timeFormat);\n\n this.toggleChatGradientAnimation(this.chat);\n };\n\n // * не могу использовать тут TransitionSlider, так как мне нужен отрисованный блок рядом\n // * (или под текущим чатом) чтобы правильно отрендерить чат (напр. scrollTop)\n private chatsSelectTab(tab: HTMLElement, animate?: boolean) {\n if(this.prevTab === tab) {\n return;\n }\n\n if(animate === false && this.prevTab) { // * will be used for Safari iOS history swipe\n disableTransition([tab, this.prevTab].filter(Boolean));\n }\n\n if(this.prevTab) {\n this.prevTab.classList.remove('active');\n this.chatsSelectTabDebounced();\n\n // ! нужно переделать на animation, так как при лаге анимация будет длиться не 250мс\n if(rootScope.settings.animationsEnabled && animate !== false) {\n dispatchHeavyAnimationEvent(pause(250 + 150), 250 + 150);\n }\n\n const prevIdx = whichChild(this.prevTab);\n const idx = whichChild(tab);\n if(idx > prevIdx) {\n appNavigationController.pushItem({\n type: 'chat',\n onPop: (canAnimate) => {\n this.setPeer({}, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n // if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n // }\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n const types: string[] = await getFilesFromEvent(e, true);\n if(!isFiles || (!(await this.canDrag()) && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n\n const foundMedia = types.filter((t) => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n\n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n\n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n // if(!mount) return;\n\n SetTransition({\n element: _dropsContainer,\n className: 'is-visible',\n forwards: mount,\n duration: 200,\n onTransitionEnd: () => {\n if(!mount) {\n _drops.forEach((drop) => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n }\n });\n\n if(mount) {\n _drops.forEach((drop) => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n // this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n // this.log('dragleave', e, counter);\n // if((e.pageX <= 0 || e.pageX >= this.managers.appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= this.managers.appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) {\n // if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private async canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || overlayCounter.isOverlayActive || !(await chat.canSend('send_media')));\n }\n\n private onDocumentPaste = async(e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n\n // console.log('document paste');\n // console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n\n const files = await getFilesFromEvent(e);\n if(!(await this.canDrag()) && !newMediaPopup) return;\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n\n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n PopupElement.createPopup(PopupNewMedia, this.chat, files, chatInput.willAttachType);\n }\n };\n\n private async overrideHash(peerId?: PeerId) {\n let str: string;\n if(peerId) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n str = username ? '@' + username : '' + peerId;\n }\n\n appNavigationController.overrideHash(str);\n }\n\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 if(prevTabId !== -1) {\n this.overrideHash(id > 0 ? this.chat?.peerId : undefined);\n }\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(\n prevTabId !== -1 &&\n prevTabId !== id &&\n rootScope.settings.animationsEnabled &&\n animate !== false/* &&\n mediaSizes.activeScreen !== ScreenSize.large */\n ) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im',\n onPop: (canAnimate) => {\n // this.selectTab(prevTabId, !isSafari);\n this.setPeer({}, canAnimate);\n }\n });\n }\n }\n\n const onImTabChange = (window as any).onImTabChange;\n onImTabChange && onImTabChange(id);\n\n // this._selectTab(id, mediaSizes.isMobile);\n // document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n\n public updateStatus() {\n return this.managers.appUsersManager.updateMyOnlineStatus(this.offline);\n }\n\n private createNewChat() {\n const chat = new Chat(\n this,\n this.managers\n );\n\n if(this.chats.length) {\n chat.setBackground(this.lastBackgroundUrl, true);\n }\n\n this.chats.push(chat);\n\n return chat;\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n const chatFrom = this.chat;\n if(this.chats.length > 1 && justReturn) {\n this.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n const chatTo = this.chat;\n this.dispatchEvent('chat_changing', {from: chatFrom, to: chatTo});\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach((chat) => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(chatTo.container, animate);\n\n if(justReturn) {\n this.dispatchEvent('peer_changed', chatTo);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n appSidebarRight.replaceSharedMediaTab(chatTo.sharedMediaTab);\n }\n\n spliced.forEach((chat) => {\n chat.beforeDestroy();\n });\n\n setTimeout(() => {\n // chat.setPeer(0);\n spliced.forEach((chat) => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public async setPeer(options: Partial = {}, animate?: boolean): Promise {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId, threadId} = 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 && !this.isSamePeer(chat, options as any)) {\n // const firstChat = this.chats[0];\n // if(firstChat.peerId !== chat.peerId) {\n /* // * slice idx > 0, set background and slice first, so new one will be the first\n const spliced = this.chats.splice(1, this.chats.length - 1);\n this.createNewChat();\n this.chats.splice(0, 1); */\n const spliced = this.chats.splice(1, this.chats.length - 1);\n if(this.chat.peerId === peerId) {\n this.spliceChats(0, true, true, spliced);\n return;\n } else {\n const ret = this.setPeer(options);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n // return ret;\n }\n\n // * don't reset peer if returning\n if(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = await chat.setPeer(options as any as Parameters[0]);\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 async setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n if(!options.type) {\n if(options.threadId && !(await this.managers.appPeersManager.isForum(options.peerId))) {\n options.type = 'discussion';\n }\n\n options.type ??= 'chat';\n }\n\n // * prevent opening already opened peer\n const existingIndex = this.chats.findIndex((chat) => this.isSamePeer(chat, options));\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 this.dispatchEvent('chat_changing', {from: oldChat, to: chat});\n\n // this.chatsSelectTab(chat.container);\n\n return this.setPeer(options);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer({\n peerId,\n type: 'scheduled'\n });\n }\n\n private getTypingElement(action: SendMessageAction) {\n const el = document.createElement('span');\n let c = 'peer-typing';\n el.classList.add(c);\n el.dataset.action = action._;\n switch(action._) {\n case 'sendMessageTypingAction': {\n // default: {\n c += '-text';\n for(let i = 0; i < 3; ++i) {\n const dot = document.createElement('span');\n dot.className = c + '-dot';\n el.append(dot);\n }\n break;\n }\n\n case 'sendMessageUploadAudioAction':\n case 'sendMessageUploadDocumentAction':\n case 'sendMessageUploadRoundAction':\n case 'sendMessageUploadVideoAction':\n case 'sendMessageUploadPhotoAction': {\n c += '-upload';\n /* const trail = document.createElement('span');\n trail.className = c + '-trail';\n el.append(trail); */\n break;\n }\n\n case 'sendMessageRecordAudioAction':\n case 'sendMessageRecordRoundAction':\n case 'sendMessageRecordVideoAction': {\n c += '-record';\n break;\n }\n\n case 'sendMessageEmojiInteractionSeen':\n case 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public async getPeerTyping(peerId: PeerId, container?: HTMLElement, threadId?: number) {\n // const log = this.log.bindPrefix('getPeerTyping-' + peerId);\n // log('getting peer typing');\n\n const isUser = peerId.isUser();\n if(isUser && await this.managers.appUsersManager.isBot(peerId)) {\n // log('a bot');\n return;\n }\n\n const typings = await this.managers.appProfileManager.getPeerTypings(peerId, threadId);\n if(!typings?.length) {\n // log('have no typing');\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.User.EnjoyingAnimations'\n },\n chat: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.Chat.EnjoyingAnimations'\n },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = isUser ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach((typing) => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n // log('no langPackKey');\n return;\n }\n\n let peerTitlePromise: Promise;\n let args: any[];\n if(peerId.isAnyChat()) {\n const peerTitle = new PeerTitle();\n peerTitlePromise = peerTitle.update({peerId: typing.userId.toPeerId(false), onlyFirstName: true});\n args = [\n peerTitle.element,\n typings.length - 1\n ];\n\n await peerTitlePromise;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n container.classList.toggle('peer-typing-flex', action._ === 'sendMessageChooseStickerAction' || action._ === 'sendMessageEmojiInteractionSeen');\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(wrapEmojiText(action.emoticon));\n args.push(span);\n }\n\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n\n // log('returning typing');\n return container;\n }\n\n private async getChatStatus(chatId: ChatId, noTyping?: boolean): Promise> {\n const typingEl = noTyping ? undefined : await this.getPeerTyping(chatId.toPeerId(true));\n if(typingEl) {\n return {cached: true, result: Promise.resolve(typingEl)};\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getChatFull(chatId);\n const dooo = async(chatInfo: ChatFull) => {\n // this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = (chatInfo as ChatFull.channelFull).participants_count ||\n ((chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants)?.participants?.length ||\n 1;\n // if(participants_count) {\n let subtitle = await getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await this.managers.appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n\n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n\n return subtitle;\n // }\n };\n\n const promise = Promise.resolve(result.result).then(dooo);\n return {\n cached: result.cached,\n result: promise\n };\n }\n\n private async getUserStatus(userId: UserId, ignoreSelf?: boolean) {\n const result: AckedResult = {\n cached: true,\n result: Promise.resolve(undefined as HTMLElement)\n };\n\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user || (user.pFlags.self && !ignoreSelf)) {\n return result;\n }\n\n const subtitle = getUserStatusString(user);\n\n if(!user.pFlags.bot && !user.pFlags.support) {\n let typingEl = await this.getPeerTyping(userId.toPeerId());\n if(!typingEl && user.status?._ === 'userStatusOnline') {\n typingEl = document.createElement('span');\n typingEl.classList.add('online');\n typingEl.append(subtitle);\n }\n\n if(typingEl) {\n result.result = Promise.resolve(typingEl);\n return result;\n }\n }\n\n result.result = Promise.resolve(subtitle);\n return result;\n }\n\n private async getPeerStatus(peerId: PeerId, ignoreSelf?: boolean, noTyping?: boolean) {\n if(!peerId) return;\n let promise: Promise>;\n if(peerId.isAnyChat()) {\n promise = this.getChatStatus(peerId.toChatId(), noTyping);\n } else {\n promise = this.getUserStatus(peerId.toUserId(), ignoreSelf);\n }\n\n return promise;\n }\n\n public async setPeerStatus(options: {\n peerId: PeerId,\n element: HTMLElement,\n needClear: boolean,\n useWhitespace: boolean,\n middleware: () => boolean,\n ignoreSelf?: boolean,\n noTyping?: boolean\n }) {\n // const log = this.log.bindPrefix('status-' + peerId);\n // log('setting status', element);\n\n const {peerId, element, needClear, useWhitespace, middleware, ignoreSelf, noTyping} = options;\n\n if(!needClear) {\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && await this.getPeerTyping(peerId, typingContainer)) {\n // log('already have a status');\n return;\n }\n }\n\n const result = await this.getPeerStatus(peerId, ignoreSelf, noTyping);\n // log('getPeerStatus result', result);\n if(!middleware()) {\n // log.warn('middleware');\n return;\n }\n\n const set = async() => {\n const subtitle = result && await result.result;\n if(!middleware()) {\n return;\n }\n\n return () => replaceContent(element, subtitle || placeholder);\n };\n\n const placeholder = useWhitespace ? NBSP : ''; // ! HERE U CAN FIND WHITESPACE\n if(!result || result.cached || needClear === undefined) {\n return await set();\n } else if(needClear) {\n return () => {\n element.textContent = placeholder;\n return set().then((callback) => callback?.());\n };\n }\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'}, undefined, this.chat.threadId);\n }\n\n public isSamePeer(options1: {peerId: PeerId, threadId?: number, type?: ChatType}, options2: typeof options1) {\n return options1.peerId === options2.peerId &&\n options1.threadId === options2.threadId &&\n (typeof(options1.type) !== typeof(options2.type) || options1.type === options2.type);\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","import {Message, MessageMedia} from '../../../../layer';\n\nexport default function canSaveMessageMedia(message: Message.message | Message.messageService) {\n return message &&\n !message.pFlags.is_outgoing &&\n !(message as Message.message).pFlags.noforwards &&\n !((message as Message.message).media as MessageMedia.messageMediaInvoice)?.extended_media\n}\n","import {Document, Message, MessageAction, MessageExtendedMedia, MessageMedia, Photo, WebPage} from '../../../../layer';\n\nexport default function getMediaFromMessage(message: Message) {\n if(!message) return;\n\n let media: any;\n if((message as Message.messageService).action) {\n media = ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo;\n } else if((message as Message.message).media) {\n let messageMedia = (message as Message.message).media;\n if((messageMedia as MessageMedia.messageMediaWebPage).webpage) {\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as any as MessageMedia;\n } else if((messageMedia as MessageMedia.messageMediaInvoice).extended_media?._ === 'messageExtendedMedia') {\n messageMedia = ((messageMedia as MessageMedia.messageMediaInvoice).extended_media as MessageExtendedMedia.messageExtendedMedia).media;\n }\n\n media = (messageMedia as MessageMedia.messageMediaDocument).document ||\n (messageMedia as MessageMedia.messageMediaPhoto).photo;\n }\n\n return media as Photo.photo | Document.document;\n}\n","import {Message} from '../../../../layer';\nimport type {MyMessage} from '../../appMessagesManager';\n\nexport default function getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n}\n","import {isRestricted} from '../../../../helpers/restrictions';\nimport {Message} from '../../../../layer';\n\nexport default function isMessageRestricted(message: Message.message) {\n return !!(message.restriction_reason && isRestricted(message.restriction_reason));\n}\n","// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\n/*\n HTML-color IRC-color Description\n #c03d33 4 red\n #4fad2d 3 green\n #d09306 7 yellow\n #168acd 10 blue\n #8544d6 6 purple\n #cd4073 13 pink\n #2996ad 11 sea\n #ce671b 5 orange\n*/\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\n\nexport default function getPeerColorById(peerId: PeerId, pic = true) {\n if(!peerId) return '';\n\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\n return color;\n}\n","import {Chat, User} from '../../../../layer';\n\nexport default function getPeerEditableUsername(peer: User.user | Chat.channel) {\n if(peer.username) {\n return peer.username;\n }\n\n const usernames = peer.usernames;\n const username = usernames?.find((username) => username.pFlags.editable);\n return username?.username;\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\nimport type {PhotoSize, VideoSize, WebDocument} from '../../../../layer';\nimport calcImageInBox from '../../../../helpers/calcImageInBox';\nimport {THUMB_TYPE_FULL} from '../../../mtproto/mtproto_config';\n\nexport default function choosePhotoSize(\n photo: MyPhoto | MyDocument | WebDocument,\n boxWidth = 0,\n boxHeight = 0,\n useBytes = false,\n pushDocumentSize = false\n) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n\n /*\n s box 100x100\n m box 320x320\n x box 800x800\n y box 1280x1280\n w box 2560x2560\n a crop 160x160\n b crop 320x320\n c crop 640x640\n d crop 1280x1280 */\n\n let sizes: PhotoSize[] = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n let bestPhotoSize: typeof sizes[0] = {_: 'photoSizeEmpty', type: THUMB_TYPE_FULL};\n if(pushDocumentSize && sizes && photo._ !== 'photo') {\n sizes = sizes.concat({\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\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 * 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 const promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Logger, logger} from '../../logger';\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Logger, logger} from '../../logger';\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport bufferConcats from '../../../helpers/bytes/bufferConcats';\nimport subtle from '../../crypto/subtle';\nimport sha256 from '../../crypto/utils/sha256';\n\nconst kMaxIncomingPacketSize = 128 * 1024 * 1024;\n\nexport default class P2PEncryptor {\n private type: 'Signaling';\n private counter: number;\n private seqMap: Map;\n\n constructor(private isOutgoing: boolean, private p2pKey: Uint8Array) {\n this.type = 'Signaling';\n this.counter = 0;\n this.seqMap = new Map();\n }\n\n private concatSHA256(parts: Uint8Array[]) {\n return sha256(bufferConcats(...parts));\n }\n\n private async encryptPrepared(buffer: Uint8Array) {\n const result = {\n counter: 0, // this.counterFromSeq(this.readSeq(buffer)),\n bytes: new Uint8Array(16 + buffer.length)\n };\n\n const x = (this.isOutgoing ? 0 : 8) + (this.type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKeyLarge = await this.concatSHA256([key.subarray(x + 88, x + 88 + 32), buffer]);\n const msgKey = result.bytes;\n for(let i = 0; i < 16; ++i) {\n msgKey[i] = msgKeyLarge[i + 8];\n }\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const bytes = await this.aesProcessCtr(buffer, buffer.length, aesKeyIv, true);\n\n result.bytes = new Uint8Array([...result.bytes.subarray(0, 16), ...bytes]);\n\n return result;\n }\n\n public encryptRawPacket(buffer: Uint8Array) {\n const seq = ++this.counter;\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, seq >>> 0, false); // byteOffset = 0; litteEndian = false\n\n const result = new Uint8Array([...new Uint8Array(arr), ...buffer]);\n\n return this.encryptPrepared(result);\n }\n\n private async prepareAesKeyIv(key: Uint8Array, msgKey: Uint8Array, x: number) {\n const [sha256a, sha256b] = await Promise.all([\n this.concatSHA256([\n msgKey.subarray(0, 16),\n key.subarray(x, x + 36)\n ]),\n\n this.concatSHA256([\n key.subarray(40 + x, 40 + x + 36),\n msgKey.subarray(0, 16)\n ])\n ]);\n\n return {\n key: new Uint8Array([\n ...sha256a.subarray(0, 8),\n ...sha256b.subarray(8, 8 + 16),\n ...sha256a.subarray(24, 24 + 8)\n ]),\n iv: new Uint8Array([\n ...sha256b.subarray(0, 4),\n ...sha256a.subarray(8, 8 + 8),\n ...sha256b.subarray(24, 24 + 4)\n ])\n };\n }\n\n private async aesProcessCtr(encryptedData: Uint8Array, dataSize: number, aesKeyIv: {key: Uint8Array, iv: Uint8Array}, encrypt = true) {\n const cryptoKey = await subtle.importKey(\n 'raw',\n aesKeyIv.key,\n {name: 'AES-CTR'},\n false,\n [encrypt ? 'encrypt' : 'decrypt']\n );\n\n const buffer: ArrayBuffer = await subtle[encrypt ? 'encrypt' : 'decrypt']({\n name: 'AES-CTR',\n counter: aesKeyIv.iv,\n length: aesKeyIv.iv.length * 8\n },\n cryptoKey,\n encryptedData\n );\n\n return new Uint8Array(buffer);\n }\n\n private constTimeIsDifferent(a: Uint8Array, b: Uint8Array, count: number) {\n let msgKeyEquals = true;\n for(let i = 0; i < count; ++i) {\n if(a[i] !== b[i]) {\n msgKeyEquals = false;\n }\n }\n\n return !msgKeyEquals;\n }\n\n public async decryptRawPacket(buffer: Uint8Array) {\n if(buffer.length < 21 || buffer.length > kMaxIncomingPacketSize) {\n return;\n }\n\n const {isOutgoing, type} = this;\n\n const x = (isOutgoing ? 8 : 0) + (type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKey = buffer.subarray(0, 16);\n const encryptedData = buffer.subarray(16);\n const encryptedDataSize = buffer.length - 16;\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const decryptionBuffer = await this.aesProcessCtr(encryptedData, encryptedDataSize, aesKeyIv, false);\n\n const msgKeyLarge = await this.concatSHA256([\n key.subarray(88 + x, 88 + x + 32),\n decryptionBuffer\n ]);\n\n if(this.constTimeIsDifferent(msgKeyLarge.subarray(8), msgKey, 16)) {\n return;\n }\n\n const dataView = new DataView(decryptionBuffer.buffer);\n const seq = dataView.getUint32(0);\n if(this.seqMap.has(seq)) {\n return;\n }\n this.seqMap.set(seq, seq);\n\n return decryptionBuffer.slice(4);\n }\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n // console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n\n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport StringFromLineBuilder from '../stringFromLineBuilder';\nimport {addDataChannel, addExtmap, addPayloadTypes, addSsrc} from './p2PSdpBuilder';\n\nexport default class ChromeP2PSdpBuilder {\n static generateOffer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n\n static generateAnswer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n}\n","/*\n* Copyright (c) 2018-present, Evgeny Nadymov\n*\n* This source code is licensed under the GPL v.3.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport ChromeP2PSdpBuilder from './chromeP2PSdpBuilder';\nimport { FirefoxP2PSdpBuilder } from './firefoxP2PSdpBuilder';\nimport { SafariP2PSdpBuilder } from './safariP2PSdpBuilder';\n// import { TG_CALLS_SDP_STRING } from '../../Stores/CallStore';\n\nexport function p2pParseCandidate(candidate) {\n if(!candidate || !candidate.startsWith('candidate:')) {\n return;\n }\n \n const sdpString = candidate;\n candidate = candidate.substr('candidate:'.length);\n \n const [foundation, component, protocol, priority, ip, port, ...other] = candidate.split(' ');\n const c = {\n sdpString,\n foundation,\n component,\n protocol,\n priority,\n address: { ip, port }\n };\n \n for(let i = 0; i < other.length; i += 2) {\n switch(other[i]) {\n case 'typ': {\n c.type = other[i + 1];\n break;\n }\n case 'raddr': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.ip = other[i + 1];\n break;\n }\n case 'rport': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.port = other[i + 1];\n break;\n }\n case 'generation': {\n c.generation = other[i + 1];\n break;\n }\n case 'tcptype': {\n c.tcpType = other[i + 1];\n break;\n }\n case 'network-id': {\n c.networkId = other[i + 1];\n break;\n }\n case 'network-cost': {\n c.networkCost = other[i + 1];\n break;\n }\n case 'ufrag': {\n c.username = other[i + 1];\n break;\n }\n }\n }\n \n return c;\n}\n\nexport function p2pParseSdp(sdp) {\n const lines = sdp.split('\\r\\n');\n const lookup = (prefix, force = true, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return line.substr(prefix.length);\n }\n }\n \n if (force) {\n console.error(\"Can't find prefix\", prefix);\n }\n \n return null;\n };\n const findIndex = (prefix, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return i;\n }\n }\n \n return -1;\n };\n \n const pwdIndex = findIndex('a=ice-pwd:');\n const ufragIndex = findIndex('a=ice-ufrag:');\n if (pwdIndex === -1 && ufragIndex === -1) {\n return {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n }\n \n const info = {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n \n let mediaIndex = findIndex('m=');\n const fingerprint = lookup('a=fingerprint:', false);\n const setup = lookup('a=setup:', false);\n if (fingerprint && setup) {\n info.fingerprints.push({\n hash: fingerprint.split(' ')[0],\n fingerprint: fingerprint.split(' ')[1],\n setup\n });\n }\n \n const ufrag = lookup('a=ice-ufrag:', false);\n const pwd = lookup('a=ice-pwd:', false);\n if (ufrag && pwd) {\n info.ufrag = ufrag;\n info.pwd = pwd;\n }\n \n while (mediaIndex !== -1) {\n let nextMediaIndex = findIndex('m=', mediaIndex + 1);\n \n const extmap = [];\n const types = [];\n const mediaType = lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0];\n const media = {\n // type: lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0],\n // mid: lookup('a=mid:', true, mediaIndex, nextMediaIndex),\n // dir: findDirection(mediaIndex, nextMediaIndex),\n rtpExtensions: extmap,\n payloadTypes: types\n }\n \n const lineTo = nextMediaIndex === -1 ? lines.length : nextMediaIndex;\n const fmtp = new Map();\n const rtcpFb = new Map();\n for (let i = mediaIndex; i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith('a=extmap:')) {\n const [ id, uri ] = line.substr('a=extmap:'.length).split(' ');\n extmap.push({ id: parseInt(id), uri });\n } else if (line.startsWith('a=fmtp:')) {\n const [ id, str ] = line.substr('a=fmtp:'.length).split(' ');\n const obj = { };\n const arr = str.split(';').map(x => {\n const [ key, value ] = x.split('=');\n obj[key] = value;\n return { [key]: value };\n });\n fmtp.set(parseInt(id), obj);\n } else if (line.startsWith('a=rtcp-fb:')) {\n const [ id, type = '', subtype = '' ] = line.substr('a=rtcp-fb:'.length).split(' ');\n if (rtcpFb.has(parseInt(id))) {\n rtcpFb.get(parseInt(id)).push({ type, subtype });\n } else {\n rtcpFb.set(parseInt(id), [{ type, subtype }])\n }\n } else if (line.startsWith('a=rtpmap')) {\n const [ id, str ] = line.substr('a=rtpmap:'.length).split(' ');\n const [ name, clockrate, channels = '0' ] = str.split('/');\n const obj = { id: parseInt(id), name, clockrate: parseInt(clockrate), channels: parseInt(channels) };\n \n types.push(obj);\n }\n }\n \n for (let i = 0; i < types.length; i++) {\n const { id } = types[i];\n if (rtcpFb.has(id)) {\n types[i].feedbackTypes = rtcpFb.get(id);\n }\n if (fmtp.has(id)) {\n types[i].parameters = fmtp.get(id);\n }\n }\n \n const ssrc = lookup('a=ssrc:', false, mediaIndex, nextMediaIndex);\n if (ssrc) {\n media.ssrc = ssrc.split(' ')[0];\n }\n \n const ssrcGroup = lookup('a=ssrc-group:', false, mediaIndex, nextMediaIndex);\n if (ssrcGroup) {\n const [ semantics, ...ssrcs ] = ssrcGroup.split(' ');\n media.ssrcGroups = [{\n semantics,\n ssrcs\n }]\n }\n \n switch (mediaType) {\n case 'audio': {\n info.audio = media;\n break;\n }\n case 'video': {\n info.video = media;\n break;\n }\n }\n \n mediaIndex = nextMediaIndex;\n }\n\n if(!info.video.ssrcGroups) {\n info.video.ssrcGroups = [];\n }\n\n info['@type'] = 'InitialSetup';\n \n // console.log('[p2pParseSdp]', sdp, info);\n return info;\n}\n\nexport function isFirefox() {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome') === -1;\n}\n\nexport function addExtmap(extmap) {\n let sdp = [];\n // return sdp;\n for (let j = 0; j < extmap.length; j++) {\n const ext = extmap[j];\n const { id, uri } = ext;\n // if (isFirefox() && uri.indexOf(''))\n console.log('[extmap] add', id, uri);\n sdp.push(`a=extmap:${id} ${uri}`);\n }\n \n return sdp.join('\\n');\n}\n\nexport function addPayloadTypes(types) {\n let sdp = [];\n console.log('[SDP] addPayloadTypes', types);\n for (let i = 0; i < types.length; i++) {\n const type = types[i];\n const { id, name, clockrate, channels, feedbackTypes, parameters } = type;\n sdp.push(`a=rtpmap:${id} ${name}/${clockrate}${channels ? '/' + channels : ''}`);\n if (feedbackTypes) {\n feedbackTypes.forEach(x => {\n const { type, subtype } = x;\n sdp.push(`a=rtcp-fb:${id} ${[type, subtype].join(' ')}`);\n });\n }\n if (parameters) {\n const fmtp = [];\n Object.getOwnPropertyNames(parameters).forEach(pName => {\n fmtp.push(`${pName}=${parameters[pName]}`);\n });\n \n sdp.push(`a=fmtp:${id} ${fmtp.join(';')}`);\n }\n }\n \n return sdp.join('\\n');\n}\n\nexport function addSsrc(type, ssrc, ssrcGroups, streamName) {\n let sdp = [];\n \n if (ssrcGroups && ssrcGroups.length > 0) {\n ssrcGroups.forEach(ssrcGroup => {\n if (ssrcGroup && ssrcGroup.ssrcs.length > 0) {\n sdp.push(`a=ssrc-group:${ssrcGroup.semantics} ${ssrcGroup.ssrcs.join(' ')}`);\n ssrcGroup.ssrcs.forEach(ssrc => {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n });\n }\n });\n } else if (ssrc) {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n }\n \n return sdp.join('\\n');\n}\n\nexport function addDataChannel(mid) {\n return `m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144`;\n}\n\nexport class P2PSdpBuilder {\n static generateCandidate(info) {\n if (!info) return null;\n \n const { sdpString, sdpMLineIndex, sdpMid, foundation, component, protocol, priority, address, type, relAddress, generation, tcpType, networkId, networkCost, username } = info;\n if (/* TG_CALLS_SDP_STRING */true) {\n if (sdpString) {\n return {\n candidate: sdpString,\n sdpMLineIndex,\n sdpMid\n };\n }\n }\n throw 'no sdpString';\n \n let candidate = `candidate:${foundation} ${component} ${protocol} ${priority} ${address.ip} ${address.port}`;\n const attrs = []\n if (type) {\n attrs.push(`typ ${type}`);\n }\n if (relAddress) {\n attrs.push(`raddr ${relAddress.ip}`);\n attrs.push(`rport ${relAddress.port}`);\n }\n if (tcpType) {\n attrs.push(`tcptype ${tcpType}`);\n }\n if (generation) {\n attrs.push(`generation ${generation}`);\n }\n if (username) {\n attrs.push(`ufrag ${username}`);\n }\n if (networkId) {\n attrs.push(`network-id ${networkId}`);\n }\n if (networkCost) {\n attrs.push(`network-cost ${networkCost}`);\n }\n if (attrs.length > 0) {\n candidate += ` ${attrs.join(' ')}`;\n }\n \n return { candidate, sdpMid, sdpMLineIndex };\n }\n \n static generateOffer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateOffer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateOffer(info);\n }\n \n return ChromeP2PSdpBuilder.generateOffer(info);\n }\n \n static generateAnswer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateAnswer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateAnswer(info);\n }\n \n return ChromeP2PSdpBuilder.generateAnswer(info);\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class FirefoxP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, mid, ssrc, ssrcGroups, payloadTypes, dir, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class SafariP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../../environment/ctx';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {GroupCallParticipantVideoSourceGroup, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, Update} from '../../layer';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport type {CallId} from '../appManagers/appCallsManager';\nimport type {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport CallConnectionInstance from './callConnectionInstance';\nimport CallInstanceBase from './callInstanceBase';\nimport callsController from './callsController';\nimport CALL_STATE from './callState';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from './constants';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription, {ConferenceEntry, generateSsrc} from './localConferenceDescription';\nimport getCallProtocol from './p2P/getCallProtocol';\nimport getRtcConfiguration from './p2P/getRtcConfiguration';\nimport P2PEncryptor from './p2P/p2PEncryptor';\nimport {p2pParseCandidate, P2PSdpBuilder} from './p2P/p2PSdpBuilder';\nimport {parseSdp} from './sdp/utils';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {AudioCodec, CallMediaState, CallSignalingData, DiffieHellmanInfo, P2PAudioCodec, P2PVideoCodec, VideoCodec} from './types';\n\nexport default class CallInstance extends CallInstanceBase<{\n state: (state: CALL_STATE) => void,\n id: (id: CallId, prevId: CallId) => void,\n muted: (muted: boolean) => void,\n mediaState: (mediaState: CallMediaState) => void,\n acceptCallOverride: () => Promise,\n}> {\n public dh: Partial;\n public id: CallId;\n public call: PhoneCall;\n public interlocutorUserId: UserId;\n public protocol: PhoneCallProtocol;\n public isOutgoing: boolean;\n public encryptionKey: Uint8Array;\n public connectionInstance: CallConnectionInstance;\n public encryptor: P2PEncryptor;\n public decryptor: P2PEncryptor;\n public candidates: RTCIceCandidate[];\n\n public offerReceived: boolean;\n public offerSent: boolean;\n\n public createdParticipantEntries: boolean;\n public release: () => Promise;\n public _connectionState: CALL_STATE;\n\n public createdAt: number;\n public connectedAt: number;\n public discardReason: string;\n\n private managers: AppManagers;\n\n private hangUpTimeout: number;\n\n private mediaStates: {\n input: CallMediaState,\n output?: CallMediaState\n };\n\n private sendMediaState: () => Promise;\n\n private decryptQueue: Uint8Array[];\n\n private getEmojisFingerprintPromise: Promise;\n private emojisFingerprint: [string, string, string, string];\n\n private wasStartingScreen: boolean;\n private wasStartingVideo: boolean;\n public wasTryingToJoin: boolean;\n\n public streamManager: StreamManager;\n\n constructor(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n managers: CallInstance['managers'],\n protocol?: PhoneCallProtocol\n }) {\n super();\n\n this.log = logger('CALL');\n\n if(!this.protocol) {\n this.protocol = getCallProtocol();\n }\n\n safeAssign(this, options);\n\n this.createdAt = Date.now();\n this.offerReceived = false;\n this.offerSent = false;\n this.decryptQueue = [];\n this.candidates = [];\n\n this.addEventListener('state', (state) => {\n this.log('state', CALL_STATE[state]);\n\n if(state === CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n\n const streamManager = this.streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n streamManager.direction = 'sendrecv';\n streamManager.types.push('screencast');\n if(!this.isOutgoing) {\n streamManager.locked = true;\n streamManager.canCreateConferenceEntry = false;\n }\n\n let mediaState: CallMediaState = {\n '@type': 'MediaState',\n 'type': 'input',\n 'lowBattery': false,\n 'muted': true,\n 'screencastState': 'inactive',\n 'videoRotation': 0,\n 'videoState': 'inactive'\n };\n\n const self = this;\n mediaState = new Proxy(mediaState, {\n set: function(target, key, value) {\n // @ts-ignore\n target[key] = value;\n self.setMediaState(mediaState);\n self.sendMediaState();\n return true;\n }\n });\n\n this.mediaStates = {\n input: mediaState\n };\n\n this.sendMediaState = debounce(this._sendMediaState.bind(this), 0, false, true);\n }\n\n get connectionState() {\n const {_connectionState, connectionInstance} = this;\n if(_connectionState !== undefined) {\n return _connectionState;\n } else if(!connectionInstance) {\n return CALL_STATE.CONNECTING;\n } else {\n const {iceConnectionState} = connectionInstance.connection;\n if(iceConnectionState === 'closed') {\n return CALL_STATE.CLOSED;\n } else if(iceConnectionState !== 'connected' && (!IS_SAFARI || iceConnectionState !== 'completed')) {\n return CALL_STATE.CONNECTING;\n } else {\n return CALL_STATE.CONNECTED;\n }\n }\n }\n\n get sortIndex() {\n const connectionState = this.connectionState;\n const state = CALL_STATE.CLOSED - connectionState + 1;\n let index = state * 10000000000000;\n index += 2147483647000 - (connectionState === CALL_STATE.PENDING && this.isOutgoing ? 0 : this.createdAt);\n return index;\n }\n\n public getVideoElement(type: CallMediaState['type']) {\n if(type === 'input') return this.elements.get('main');\n else {\n const mediaState = this.getMediaState('output');\n if(!mediaState) {\n return;\n }\n\n const type: WebRTCLineType = mediaState.videoState === 'active' ? 'video' : (mediaState.screencastState === 'active' ? 'screencast' : undefined);\n if(!type) {\n return;\n }\n\n const entry = this.description.findEntry((entry) => entry.type === type);\n if(!entry) {\n return;\n }\n\n return this.elements.get('' + entry.recvEntry.source);\n }\n }\n\n public async startScreenSharingInternal() {\n try {\n this.wasStartingScreen = true;\n this.wasStartingVideo = false;\n this.streamManager.types = ['audio', 'screencast'];\n await this.requestScreen();\n } catch(err) {\n this.log.error('startScreenSharing error', err);\n }\n }\n\n public async toggleScreenSharing() {\n if(this.isSharingVideo) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingScreen) {\n return this.stopVideoSharing();\n } else {\n return this.startScreenSharingInternal();\n }\n }\n\n public async startVideoSharingInternal() {\n try {\n this.wasStartingScreen = false;\n this.wasStartingVideo = true;\n this.streamManager.types = ['audio', 'video'];\n await this.requestInputSource(false, true, false);\n } catch(err) {\n this.log.error('startVideoSharing error', err);\n }\n }\n\n public async stopVideoSharing() {\n const mediaState = this.getMediaState('input');\n mediaState.videoState = mediaState.screencastState = 'inactive';\n\n const {streamManager, description} = this;\n const track = streamManager.inputStream.getVideoTracks()[0];\n if(track) {\n stopTrack(track);\n streamManager.appendToConference(description); // clear sender track\n }\n }\n\n public async toggleVideoSharing() {\n if(this.isSharingScreen) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharingInternal();\n }\n }\n\n public getMediaState(type: CallMediaState['type']) {\n return this.mediaStates[type];\n }\n\n public setMediaState(mediaState: CallMediaState) {\n this.mediaStates[mediaState.type] = mediaState;\n this.dispatchEvent('mediaState', mediaState);\n }\n\n public isSharingVideoType(type: 'video' | 'screencast') {\n try {\n const hasVideoTrack = super.isSharingVideo;\n return hasVideoTrack && !!((this.wasStartingScreen && type === 'screencast') || (this.wasStartingVideo && type === 'video'));\n\n // ! it will be used before the track appears\n // return !!this.description.entries.find((entry) => entry.type === type && entry.transceiver.sender.track.enabled);\n } catch(err) {\n return false;\n }\n }\n\n public get isSharingVideo() {\n return this.isSharingVideoType('video');\n }\n\n public get isSharingScreen() {\n return this.isSharingVideoType('screencast');\n }\n\n public get isMuted() {\n const audioTrack = this.streamManager.inputStream.getAudioTracks()[0];\n return !audioTrack?.enabled;\n }\n\n public get isClosing() {\n const {connectionState} = this;\n return connectionState === CALL_STATE.CLOSING || connectionState === CALL_STATE.CLOSED;\n }\n\n public get description(): localConferenceDescription {\n return this.connectionInstance?.description;\n }\n\n public setHangUpTimeout(timeout: number, reason: PhoneCallDiscardReason['_']) {\n this.clearHangUpTimeout();\n this.hangUpTimeout = ctx.setTimeout(() => {\n this.hangUpTimeout = undefined;\n this.hangUp(reason);\n }, timeout);\n }\n\n public clearHangUpTimeout() {\n if(this.hangUpTimeout !== undefined) {\n clearTimeout(this.hangUpTimeout);\n this.hangUpTimeout = undefined;\n }\n }\n\n public setPhoneCall(phoneCall: PhoneCall) {\n this.call = phoneCall;\n\n const {id} = phoneCall;\n if(this.id !== id) {\n const prevId = this.id;\n this.id = id;\n this.dispatchEvent('id', id, prevId);\n }\n }\n\n public async acceptCall() {\n const canAccept = (await Promise.all(this.dispatchResultableEvent('acceptCallOverride')))[0] ?? true;\n if(this.isClosing || !canAccept) {\n return;\n }\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n\n const call = this.call as PhoneCall.phoneCallRequested;\n this.requestInputSource(true, !!call.pFlags.video, false);\n\n const g_a_hash = call.g_a_hash;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n this.dh = { // ! it is correct\n g_a_hash,\n b: dh.a,\n g_b: dh.g_a,\n g_b_hash: dh.g_a_hash,\n p: dh.p\n };\n\n return this.managers.apiManager.invokeApi('phone.acceptCall', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n protocol: this.protocol,\n g_b: this.dh.g_b\n });\n }).then(async(phonePhoneCall) => {\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n }).catch((err) => {\n this.log.error('accept call error', err);\n // if(err.type === 'CALL_PROTOCOL_COMPAT_LAYER_INVALID') {\n\n // }\n\n this.hangUp('phoneCallDiscardReasonHangup');\n });\n }\n\n public joinCall() {\n this.log('joinCall');\n\n this.getEmojisFingerprint();\n\n this.overrideConnectionState();\n\n const {isOutgoing, encryptionKey, streamManager} = this;\n\n const configuration = getRtcConfiguration(this.call as PhoneCall.phoneCall);\n this.log('joinCall configuration', configuration);\n if(!configuration) return;\n\n const connectionInstance = this.connectionInstance = new CallConnectionInstance({\n call: this,\n streamManager,\n log: this.log.bindPrefix('connection')\n });\n\n const connection = connectionInstance.createPeerConnection(configuration);\n connection.addEventListener('iceconnectionstatechange', () => {\n const state = this.connectionState;\n if(this.connectedAt === undefined && state === CALL_STATE.CONNECTED) {\n this.connectedAt = Date.now();\n }\n\n this.dispatchEvent('state', state);\n });\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n connection.addEventListener('icecandidate', (event) => {\n const {candidate} = event;\n connection.log('onicecandidate', candidate);\n if(candidate?.candidate) {\n this.sendIceCandidate(candidate);\n }\n });\n connection.addEventListener('track', (event) => {\n const {track} = event;\n connection.log('ontrack', track);\n this.onTrack(event);\n });\n\n const description = connectionInstance.createDescription();\n\n this.encryptor = new P2PEncryptor(isOutgoing, encryptionKey);\n this.decryptor = new P2PEncryptor(!isOutgoing, encryptionKey);\n\n this.log('currentCall', this);\n\n if(isOutgoing) {\n connectionInstance.appendStreamToConference();\n }\n\n this.createDataChannel();\n\n this.processDecryptQueue();\n }\n\n private createDataChannelEntry() {\n const dataChannelEntry = this.description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n dataChannelEntry.sendEntry = dataChannelEntry.recvEntry = dataChannelEntry;\n }\n\n private createDataChannel() {\n if(this.connectionInstance.dataChannel) {\n return;\n }\n\n const channel = this.connectionInstance.createDataChannel({\n id: 0,\n negotiated: true\n });\n channel.addEventListener('message', (e) => {\n this.applyDataChannelData(JSON.parse(e.data));\n });\n channel.addEventListener('open', () => {\n this.sendMediaState();\n });\n }\n\n private applyDataChannelData(data: CallMediaState) {\n switch(data['@type']) {\n case 'MediaState': {\n data.type = 'output';\n this.log('got output media state', data);\n this.setMediaState(data);\n break;\n }\n\n default:\n this.log.error('unknown data channel data:', data);\n break;\n }\n }\n\n private _sendMediaState() {\n const {connectionInstance} = this;\n if(!connectionInstance) return;\n\n const mediaState = {...this.getMediaState('input')};\n // mediaState.videoRotation = 90;\n delete mediaState.type;\n this.log('sendMediaState', mediaState);\n\n connectionInstance.sendDataChannelData(mediaState);\n }\n\n public async sendCallSignalingData(data: CallSignalingData) {\n /* if(data['@type'] === 'InitialSetup') {\n this.filterNotVP8(data);\n } */\n\n const json = JSON.stringify(data);\n const arr = new TextEncoder().encode(json);\n const {bytes} = await this.encryptor.encryptRawPacket(arr);\n\n this.log('sendCallSignalingData', this.id, json);\n await this.managers.apiManager.invokeApi('phone.sendSignalingData', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n data: bytes\n });\n }\n\n public sendIceCandidate(iceCandidate: RTCIceCandidate) {\n this.log('sendIceCandidate', iceCandidate);\n const {candidate, sdpMLineIndex} = iceCandidate;\n if(sdpMLineIndex !== 0) {\n return;\n }\n\n const parsed = p2pParseCandidate(candidate);\n // const parsed = {sdpString: candidate};\n /* if(parsed.address.ip !== '') {\n return;\n } */\n\n this.sendCallSignalingData({\n '@type': 'Candidates',\n 'candidates': [parsed]\n });\n }\n\n public async confirmCall() {\n const {protocol, id, call} = this;\n const dh = this.dh as DiffieHellmanInfo.a;\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey((call as PhoneCall.phoneCallAccepted).g_b, dh.a, dh.p);\n\n const phonePhoneCall = await this.managers.apiManager.invokeApi('phone.confirmCall', {\n peer: await this.managers.appCallsManager.getCallInput(id),\n protocol: protocol,\n g_a: dh.g_a,\n key_fingerprint: key_fingerprint\n });\n\n this.encryptionKey = key;\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n this.joinCall();\n }\n\n public getEmojisFingerprint() {\n if(this.emojisFingerprint) return this.emojisFingerprint;\n if(this.getEmojisFingerprintPromise) return this.getEmojisFingerprintPromise;\n return this.getEmojisFingerprintPromise = apiManagerProxy.invokeCrypto('get-emojis-fingerprint', this.encryptionKey, this.dh.g_a).then((codePoints) => {\n this.getEmojisFingerprintPromise = undefined;\n return this.emojisFingerprint = codePoints.map((codePoints) => emojiFromCodePoints(codePoints)) as [string, string, string, string];\n });\n }\n\n private unlockStreamManager() {\n this.connectionInstance.streamManager.locked = false;\n this.connectionInstance.appendStreamToConference();\n }\n\n private async doTheMagic() {\n this.connectionInstance.appendStreamToConference();\n\n const connection = this.connectionInstance.connection;\n\n let answer = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n connection.getTransceivers().filter((transceiver) => transceiver.direction === 'recvonly').forEach((transceiver) => {\n const entry = this.connectionInstance.description.getEntryByMid(transceiver.mid);\n entry.transceiver = entry.recvEntry.transceiver = transceiver;\n transceiver.direction = 'sendrecv';\n });\n\n const isAnswer = false;\n\n const description = this.description;\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n await connection.setRemoteDescription(sdpDescription);\n\n answer = await connection.createAnswer();\n\n await connection.setLocalDescription(answer);\n\n const initialSetup = parseSignalingData(parseSdp(answer.sdp));\n this.log('[InitialSetup] send 1');\n this.sendCallSignalingData(initialSetup);\n\n this.unlockStreamManager();\n }\n\n public overrideConnectionState(state?: CALL_STATE) {\n this._connectionState = state;\n this.dispatchEvent('state', this.connectionState);\n }\n\n public get duration() {\n return this.connectedAt !== undefined ? (Date.now() - this.connectedAt) / 1000 | 0 : 0;\n }\n\n protected onInputStream(stream: MediaStream): void {\n super.onInputStream(stream);\n\n const videoTrack = stream.getVideoTracks()[0];\n if(videoTrack) {\n const state = this.getMediaState('input');\n\n // handle starting camera\n if(!this.wasStartingScreen && !this.wasStartingVideo) {\n this.wasStartingVideo = true;\n }\n\n if(this.isSharingVideo) {\n state.videoState = 'active';\n } else if(this.isSharingScreen) {\n state.screencastState = 'active';\n }\n\n videoTrack.addEventListener('ended', () => {\n this.stopVideoSharing();\n }, {once: true});\n }\n\n if(stream.getAudioTracks().length) {\n this.onMutedChange();\n }\n }\n\n private onMutedChange() {\n const isMuted = this.isMuted;\n this.dispatchEvent('muted', isMuted);\n\n const state = this.getMediaState('input');\n state.muted = isMuted;\n }\n\n public toggleMuted(): Promise {\n return this.requestAudioSource(true).then(() => {\n this.setMuted();\n this.onMutedChange();\n });\n }\n\n public async hangUp(discardReason?: PhoneCallDiscardReason['_'], discardedByOtherParty?: boolean) {\n if(this.isClosing) {\n return;\n }\n\n this.discardReason = discardReason;\n this.log('hangUp', discardReason);\n this.overrideConnectionState(CALL_STATE.CLOSED);\n\n if(this.connectionInstance) {\n this.connectionInstance.closeConnectionAndStream(true);\n }\n\n if(discardReason && !discardedByOtherParty) {\n let hasVideo = false;\n for(const type in this.mediaStates) {\n const mediaState = this.mediaStates[type as 'input' | 'output'];\n hasVideo = mediaState.videoState === 'active' || mediaState.screencastState === 'active' || hasVideo;\n }\n\n await this.managers.appCallsManager.discardCall(this.id, this.duration, discardReason, hasVideo);\n }\n }\n\n private performCodec(_codec: P2PAudioCodec | P2PVideoCodec) {\n const payloadTypes: AudioCodec['payload-types'] = _codec.payloadTypes.map((payloadType) => {\n return {\n ...payloadType,\n 'rtcp-fbs': payloadType.feedbackTypes\n }\n });\n\n const codec: AudioCodec = {\n 'rtp-hdrexts': _codec.rtpExtensions,\n 'payload-types': payloadTypes\n };\n\n return codec;\n }\n\n private setDataToDescription(data: CallSignalingData.initialSetup) {\n this.description.setData({\n transport: {\n 'pwd': data.pwd,\n 'ufrag': data.ufrag,\n 'fingerprints': data.fingerprints,\n 'rtcp-mux': true\n },\n audio: this.performCodec(data.audio),\n video: data.video ? this.performCodec(data.video) as VideoCodec : undefined,\n screencast: data.screencast ? this.performCodec(data.screencast) as VideoCodec : undefined\n });\n }\n\n private filterNotVP8(initialSetup: CallSignalingData.initialSetup) {\n if(!this.isOutgoing) { // only VP8 works now\n [initialSetup.video, initialSetup.screencast].filter(Boolean).forEach((codec) => {\n const payloadTypes = codec.payloadTypes;\n const idx = payloadTypes.findIndex((payloadType) => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex((payloadType) => +payloadType.parameters?.apt === vp8PayloadType.id);\n codec.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n });\n }\n }\n\n public async applyCallSignalingData(data: CallSignalingData) {\n this.log('applyCallSignalingData', this, data);\n\n const {connection, description} = this.connectionInstance;\n\n switch(data['@type']) {\n case 'InitialSetup': {\n this.log('[sdp] InitialSetup', data);\n\n this.filterNotVP8(data);\n this.setDataToDescription(data);\n\n const performSsrcGroups = (ssrcGroups: P2PVideoCodec['ssrcGroups']): GroupCallParticipantVideoSourceGroup[] => {\n return ssrcGroups.map((ssrcGroup) => {\n return {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics: ssrcGroup.semantics,\n sources: ssrcGroup.ssrcs.map((source) => +source)\n };\n });\n };\n\n const ssrcs = [\n generateSsrc('audio', +data.audio.ssrc),\n data.video ? generateSsrc('video', performSsrcGroups(data.video.ssrcGroups)) : undefined,\n data.screencast ? generateSsrc('screencast', performSsrcGroups(data.screencast.ssrcGroups)) : undefined\n ].filter(Boolean);\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n return;\n }\n\n const sendRecvEntry = description.findFreeSendRecvEntry(ssrc.type, false);\n entry = new ConferenceEntry(sendRecvEntry.mid, ssrc.type);\n entry.setDirection('sendrecv');\n sendRecvEntry.recvEntry = entry;\n\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n });\n\n this.createDataChannelEntry();\n\n const isAnswer = this.offerSent;\n this.offerSent = false;\n\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n this.log('[sdp] remote', sdpDescription.sdp);\n\n await connection.setRemoteDescription(sdpDescription);\n\n await this.tryToReleaseCandidates();\n\n if(!isAnswer) {\n await this.doTheMagic();\n }\n\n break;\n }\n\n case 'Candidates': {\n for(const candidate of data.candidates) {\n const init: RTCIceCandidateInit = P2PSdpBuilder.generateCandidate(candidate);\n init.sdpMLineIndex = 0;\n const iceCandidate = new RTCIceCandidate(init);\n this.candidates.push(iceCandidate);\n }\n\n await this.tryToReleaseCandidates();\n break;\n }\n\n default: {\n this.log.error('unrecognized signaling data', data);\n }\n }\n }\n\n public async tryToReleaseCandidates() {\n const {connectionInstance} = this;\n if(!connectionInstance) {\n return;\n }\n\n const {connection} = connectionInstance;\n if(connection.remoteDescription) {\n const promises: Promise[] = this.candidates.map((candidate) => this.addIceCandidate(connection, candidate));\n this.candidates.length = 0;\n\n await Promise.all(promises);\n } else {\n this.log('[candidates] postpone');\n }\n }\n\n private async addIceCandidate(connection: RTCPeerConnection, candidate: RTCIceCandidate) {\n this.log('[candidate] start', candidate);\n try {\n // if(!candidate.address) return;\n await connection.addIceCandidate(candidate);\n this.log('[candidate] add', candidate);\n } catch(e) {\n this.log.error('[candidate] error', candidate, e);\n }\n }\n\n private async processDecryptQueue() {\n const {encryptor} = this;\n if(!encryptor) {\n this.log.warn('got encrypted signaling data before the encryption key');\n return;\n }\n\n const length = this.decryptQueue.length;\n if(!length) {\n return;\n }\n\n const queue = this.decryptQueue.slice();\n this.decryptQueue.length = 0;\n\n for(const data of queue) {\n const decryptedData = await encryptor.decryptRawPacket(data);\n if(!decryptedData) {\n continue;\n }\n\n // this.log('[update] updateNewCallSignalingData', update, decryptedData);\n\n const str = new TextDecoder().decode(decryptedData);\n try {\n const signalingData: CallSignalingData = JSON.parse(str);\n this.log('[update] updateNewCallSignalingData', signalingData);\n this.applyCallSignalingData(signalingData);\n } catch(err) {\n this.log.error('wrong signaling data', str);\n this.hangUp('phoneCallDiscardReasonDisconnect');\n callsController.dispatchEvent('incompatible', this.interlocutorUserId);\n }\n }\n }\n\n public onUpdatePhoneCallSignalingData(data: Uint8Array) {\n this.decryptQueue.push(data);\n this.processDecryptQueue();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {PhoneCallProtocol} from '../../../layer';\n\nexport default function getCallProtocol(): PhoneCallProtocol {\n return {\n _: 'phoneCallProtocol',\n pFlags: {\n udp_p2p: true,\n udp_reflector: true\n },\n min_layer: 92,\n max_layer: 92,\n library_versions: ['4.0.0']\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {PhoneCall} from '../../../layer';\n\nexport default function getRtcConfiguration(call: PhoneCall.phoneCall): RTCConfiguration {\n const iceServers: RTCIceServer[] = [];\n call.connections.forEach((connection) => {\n switch(connection._) {\n /* case 'callServerTypeTelegramReflector': {\n break;\n } */\n case 'phoneConnectionWebrtc': {\n const {ip, ipv6, port, username, password} = connection;\n const urls: string[] = [];\n if(connection.pFlags.turn) {\n if(ip) {\n urls.push(`turn:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`turn:[${ipv6}]:${port}`);\n }\n } else if(connection.pFlags.stun) {\n if(ip) {\n urls.push(`stun:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`stun:[${ipv6}]:${port}`);\n }\n }\n\n if(urls.length > 0) {\n iceServers.push({\n urls,\n username,\n credential: password\n });\n }\n break;\n }\n }\n });\n\n return {\n iceServers,\n iceTransportPolicy: call.pFlags.p2p_allowed ? 'all' : 'relay'\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\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 AudioAssetPlayer from '../../helpers/audioAssetPlayer';\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\nlet audioAsset: AudioAssetPlayer;\nexport default function getCallAudioAsset() {\n return 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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getCallAudioAsset, {CallAudioAssetName} from '../../components/call/getAudioAsset';\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 EventListenerBase from '../../helpers/eventListenerBase';\nimport tsNow from '../../helpers/tsNow';\nimport {PhoneCallProtocol} from '../../layer';\nimport {CallId} from '../appManagers/appCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstance from './callInstance';\nimport CALL_STATE from './callState';\n\nconst CALL_REQUEST_TIMEOUT = 45e3;\n\nexport class CallsController extends EventListenerBase<{\n instance: (details: {hasCurrent: boolean, instance: CallInstance}) => void,\n accepting: (instance: CallInstance) => void, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n incompatible: (userId: UserId) => void,\n}> {\n private log: ReturnType;\n private managers: AppManagers;\n private audioAsset: AudioAssetPlayer;\n private instances: Map;\n private sortedInstances: Array;\n private tempId: number;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.log = logger('CC');\n\n if(!IS_CALL_SUPPORTED) {\n return;\n }\n\n this.audioAsset = getCallAudioAsset();\n this.tempId = 0;\n this.instances = new Map();\n this.sortedInstances = [];\n\n rootScope.addEventListener('call_update', async(call) => {\n let instance = this.instances.get(call.id);\n\n if(instance) {\n instance.setPhoneCall(call);\n }\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 apiManagerProxy.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.managers.appCallsManager.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, g_a, dh);\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n break;\n }\n\n instance.encryptionKey = key;\n instance.joinCall();\n\n break;\n }\n }\n });\n\n rootScope.addEventListener('call_signaling', ({callId, data}) => {\n const instance = this.instances.get(callId);\n if(instance?.id !== callId) {\n return;\n }\n\n instance.onUpdatePhoneCallSignalingData(data);\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 private createCallInstance(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n protocol?: PhoneCallProtocol\n }) {\n const call = new CallInstance({\n managers: this.managers,\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 this.dispatchEvent('instance', {instance: call, hasCurrent: hasCurrent});\n }\n });\n\n return call;\n }\n\n public async startCallInternal(userId: UserId, isVideo: boolean) {\n this.log('p2pStartCallInternal', userId, isVideo);\n\n const fullInfo = await this.managers.appProfileManager.getProfile(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.managers.appCallsManager.generateDh().then(async(dh) => {\n call.dh = dh;\n\n return this.managers.appCallsManager.requestCall(userId, call.protocol, call.dh.g_a_hash, isVideo && video_calls_available);\n }).then((phoneCall) => {\n call.overrideConnectionState(CALL_STATE.PENDING);\n call.setPhoneCall(phoneCall);\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\n });\n }\n}\n\nconst callsController = new CallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.callsController = callsController);\nexport default callsController;\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCallConnectionType, JoinGroupCallJsonPayload} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport rootScope from '../rootScope';\nimport CallConnectionInstanceBase, {CallConnectionInstanceOptions} from './callConnectionInstanceBase';\nimport GroupCallInstance from './groupCallInstance';\nimport filterServerCodecs from './helpers/filterServerCodecs';\nimport fixLocalOffer from './helpers/fixLocalOffer';\nimport processMediaSection from './helpers/processMediaSection';\nimport {ConferenceEntry} from './localConferenceDescription';\nimport SDP from './sdp';\nimport SDPMediaSection from './sdp/mediaSection';\nimport {WebRTCLineType} from './sdpBuilder';\nimport {UpdateGroupCallConnectionData} from './types';\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract,\n isMuted?: boolean,\n joinVideo?: boolean,\n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n private managers: AppManagers;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n managers: AppManagers\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({\n iceServers: [],\n iceTransportPolicy: 'all',\n bundlePolicy: 'max-bundle',\n rtcpMuxPolicy: 'require',\n iceCandidatePoolSize: 0\n // sdpSemantics: \"unified-plan\",\n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach((type) => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map((section) => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n\n return processed;\n });\n\n const audioChannel = processedChannels.find((channel) => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find((channel) => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach((entry) => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n\n const update = await this.managers.appGroupCallsManager.joinGroupCall(groupCallId, params, options);\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n\n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer,\n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter((media) => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n\n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find((section) => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle,\n entries,\n isAnswer\n })\n };\n\n entriesToDelete.forEach((entry) => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n if(this.options.type === 'presentation') {\n promise.then(() => {\n this.connection.getTransceivers().find((transceiver) => {\n if(transceiver.sender?.track?.kind === 'video') {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n }\n });\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n\n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n\n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DataJSON} from '../../../layer';\nimport {JoinGroupCallJsonPayload} from '../../appManagers/appGroupCallsManager';\nimport SDP from '../sdp';\nimport {Ssrc} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n 'fingerprints': [sectionInfo.fingerprint],\n 'pwd': sectionInfo.pwd,\n 'ssrc': sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n 'ufrag': sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params,\n source: sectionInfo.source,\n media,\n sourceGroups: sectionInfo.sourceGroups,\n entry\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport SDPMediaSection from '../sdp/mediaSection';\nimport {UpdateGroupCallConnectionData, Codec} from '../types';\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map((data) => {\n return */['audio' as const, 'video' as const].filter((type) => data[type]).map((type) => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find((line) => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec['rtp-hdrexts'], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport copy from '../../../helpers/object/copy';\nimport {ConferenceEntry} from '../localConferenceDescription';\nimport {parseSdp, addSimulcast} from '../sdp/utils';\nimport {generateMediaFirstLine, SDPBuilder} from '../sdpBuilder';\nimport {UpdateGroupCallConnectionData} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit,\n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find((line) => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map((payload) => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n\n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n const newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {GroupCallConnectionType, GroupCallId, GroupCallOutputSource} from '../appManagers/appGroupCallsManager';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstanceBase, {TryAddTrackOptions} from './callInstanceBase';\nimport GroupCallConnectionInstance from './groupCallConnectionInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport getScreenConstraints from './helpers/getScreenConstraints';\nimport getScreenStream from './helpers/getScreenStream';\nimport getStream from './helpers/getStream';\nimport getVideoConstraints from './helpers/getVideoConstraints';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\nimport getPeerId from '../appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../appManagers/managers';\nimport {generateSelfVideo, makeSsrcFromParticipant, makeSsrcsFromParticipant} from './groupCallsController';\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n\n // will be set with negotiation\n public joined: boolean;\n\n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n private startScreenSharingPromise: Promise;\n\n private managers: AppManagers;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections'],\n managers: AppManagers\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return this.managers.appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public async getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : (await this.participants).get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => this.changeUserMuted(NULL_PEER_ID));\n }\n\n public async changeUserMuted(peerId: PeerId, muted?: boolean) {\n const participant = await this.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(participant, {muted});\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n managers: this.managers,\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return this.editParticipant(this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n\n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n\n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise ??= this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n });\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n this.managers.appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id);\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await this.editParticipant(this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise ??= this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n });\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await this.editParticipant(this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n\n if(!rejoin) {\n const d = discard || (this.joined ? this.connections.main.sources.audio.source : undefined);\n this.managers.appGroupCallsManager.hangUp(this.id, d);\n }\n }\n\n public tryAddTrack(options: Omit) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n\n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n this.getParticipantByPeerId(entry.peerId).then((participant) => {\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n });\n }\n\n return source;\n }\n\n public async editParticipant(participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n // let processUpdate = true;\n if(participant) {\n // const {currentGroupCall} = this;\n // const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isCurrentCall = true;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !this.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = generateSelfVideo(this.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n this.setMuted(false);\n }\n\n this.dispatchEvent('state', this.state);\n }\n\n // rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n return this.managers.appGroupCallsManager.editParticipant(this.id, participant, options);\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach((oldSsrc) => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find((ssrc) => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\n","/*\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 AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type GroupCallAudioAssetName = 'group_call_connect.mp3' | 'group_call_end.mp3' | 'group_call_start.mp3' | 'voip_onallowtalk.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getGroupCallAudioAsset() {\n return 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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getGroupCallAudioAsset from '../../components/groupCall/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {GroupCallId, GroupCallConnectionType} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport GroupCallInstance from './groupCallInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport createMainStreamManager from './helpers/createMainStreamManager';\nimport {generateSsrc} from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\n\nconst IS_MUTED = true;\n\nexport function makeSsrcsFromParticipant(participant: GroupCallParticipant) {\n return [\n makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n};\n\nexport function makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n}\n\nexport function 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\nexport class GroupCallsController extends EventListenerBase<{\n instance: (instance: GroupCallInstance) => void\n}> {\n private audioAsset: ReturnType;\n private log: ReturnType;\n private currentGroupCall: GroupCallInstance;\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.audioAsset = getGroupCallAudioAsset();\n this.log = logger('GCC');\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.groupCall = groupCall;\n\n if(groupCall._ === 'groupCallDiscarded') {\n currentGroupCall.hangUp(false, false, true);\n }\n }\n });\n\n rootScope.addEventListener('group_call_participant', ({groupCallId, participant}) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCallId) {\n currentGroupCall.onParticipantUpdate(participant/* , this.doNotDispatchParticipantUpdate */);\n }\n });\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n this.dispatchEvent('instance', groupCall);\n }\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 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 .then(() => {\n // have to refresh participants because of the new connection\n const {currentGroupCall} = this;\n currentGroupCall.participants.then((participants) => {\n if(this.currentGroupCall !== currentGroupCall || currentGroupCall.state === GROUP_CALL_STATE.CLOSED) {\n return;\n }\n\n participants.forEach((participant) => {\n if(!participant.pFlags.self) {\n currentGroupCall.onParticipantUpdate(participant);\n }\n });\n });\n });\n }\n\n private 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 managers: this.managers\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.managers.appGroupCallsManager.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 this.managers.appGroupCallsManager.getGroupCallParticipants(groupCallId);\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\nconst groupCallsController = new GroupCallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.groupCallController = groupCallsController);\nexport default groupCallsController;\n","/*\n * 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","import constraintSupported, {MyMediaTrackSupportedConstraints} from '../../../environment/constraintSupport';\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach((constraint) => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean,\n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n","export default function getScreenConstraints(skipAudio?: boolean) {\n const constraints: DisplayMediaStreamConstraints = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n }\n };\n\n if(!skipAudio) {\n constraints.audio = true;\n }\n\n return constraints;\n}\n","export default async function getScreenStream(constraints: DisplayMediaStreamConstraints) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n const track = screenStream.getVideoTracks()[0];\n track.contentHint = 'text';\n return screenStream;\n}\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n stream.getTracks().forEach((x) => {\n x.enabled = !muted;\n });\n\n // console.log('getStream result', stream);\n return 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","/*\n * 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","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 indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {fixMediaLineType, SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT} from './sdpBuilder';\nimport {AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec} from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n\n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(fixMediaLineType(this.type), init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n return {\n endpoint,\n type,\n source,\n sourceGroups\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n public readonly screencast?: VideoCodec;\n\n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map;\n private entriesBySource: Map;\n private entriesByPeerId: Map>;\n\n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n\n public findEntry(verify: Parameters[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find((entry) => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n\n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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, lines: SDPLine[] = [];\n const mediaSections: SDPMediaSection[] = [];\n str.split(/\\r?\\n/).forEach((lineStr) => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach((ssrc) => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport LocalConferenceDescription, {ConferenceEntry} from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport {GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData} from './types';\nimport {fromTelegramSource} from './utils';\n\n// screencast is for Peer-to-Peer only\nexport type WebRTCLineTypeTrue = 'video' | 'audio' | 'application';\nexport type WebRTCLineType = WebRTCLineTypeTrue | 'screencast';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function fixMediaLineType(mediaType: WebRTCLineType) {\n return mediaType === 'screencast' ? 'video' : mediaType;\n}\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n // return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n return mediaType === 'application' ? 'DTLS/SCTP' : 'UDP/TLS/RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${fixMediaLineType(mediaType)} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData | LocalConferenceDescription;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n\n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n // 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n\n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach((ssrcGroup) => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n\n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n\n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${fixMediaLineType(type)} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n\n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map((type) => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n\n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach((hdrext) => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n\n payloadTypes.forEach((type) => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n\n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n\n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach((fb) => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n\n public addConference(options: {\n conference: LocalConferenceDescription,\n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean,\n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n\n public static fromConference(options: Parameters[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX} from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport {fixMediaLineType, WebRTCLineType} from './sdpBuilder';\nimport {getAmplitude, toTelegramSource} from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: 'input' | 'output';\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n\n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n\n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n public static ANALYSER_LISTENER = new EventListenerBase<{amplitude: (details: {amplitudes: StreamAmplitude[], type: 'all' | 'input'}) => void}>();\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public locked: boolean;\n public types: WebRTCLineType[];\n\n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n this.types = ['audio', 'video'];\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach((track) => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n\n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n\n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n\n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find((item) => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n\n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n\n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n\n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n\n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n\n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n\n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n\n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n\n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n\n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter((x) => x.type === 'input');\n const audioItems = filteredItems.filter((x) => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n\n StreamManager.ANALYSER_LISTENER.dispatchEvent('amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach((track) => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.locked) {\n return;\n }\n\n const {inputStream, direction, canCreateConferenceEntry} = this;\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types = this.types.map((type) => {\n return [\n type,\n /* type === 'video' || type === 'screencast' ?\n {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} : */\n transceiverInit\n ] as const;\n });\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry((entry) => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find((transceiver) => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n\n /* if(this.isScreenSharingManager) {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n } */\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const mediaTrackType = fixMediaLineType(type);\n const trackIdx = tracks.findIndex((track) => track.kind === mediaTrackType);\n const track = trackIdx !== -1 ? tracks.splice(trackIdx, 1)[0] : undefined;\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch((err) => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach((track) => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[];\n private newLine: string[];\n\n constructor(private joiner = '\\r\\n') {\n this.lines = [];\n this.newLine = [];\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n\n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n// unsign => sign\nexport function toTelegramSource(source: number) {\n return 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 return source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n if(!array) return 0;\n\n const {length} = array;\n let total = 0;\n for(let i = 0; i < length; ++i) {\n total += array[i] * array[i];\n }\n const rms = Math.sqrt(total / length) / 255;\n\n return Math.min(1, rms * scale);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport emojiRegExp from '../../vendor/emoji/regex';\n\nconst EMOJI_REG_EXP = new RegExp(`(^${emojiRegExp})`);\n\nexport default function getAbbreviation(str: string, onlyFirst = false): {\n text: string,\n entities: MessageEntity[]\n} {\n const splitted = (str || '').trim().split(' ');\n if(!splitted[0]) return {text: '', entities: []};\n\n const entities: MessageEntity.messageEntityEmoji[] = [];\n\n const firstEmojiMatch = splitted[0].match(EMOJI_REG_EXP);\n const first = firstEmojiMatch?.[0] || splitted[0][0];\n if(firstEmojiMatch) {\n entities.push(getEmojiEntityFromEmoji(first));\n }\n\n const length = splitted.length;\n if(onlyFirst || length === 1) return {text: first, entities};\n\n const lastEmojiMatch = splitted[length - 1].match(EMOJI_REG_EXP);\n const last = lastEmojiMatch?.[0] || splitted[length - 1][0];\n if(lastEmojiMatch) {\n entities.push({\n ...getEmojiEntityFromEmoji(last),\n offset: first.length\n });\n }\n\n return {text: first + last, entities};\n}\n","import {MessageEntity} from '../../layer';\nimport {toCodePoints} from '../../vendor/emoji';\n\nexport default function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n}\n","import {EMAIL_REG_EXP} from '.';\n\nexport default function matchEmail(text: string) {\n return !text ? null : text.match(EMAIL_REG_EXP);\n}\n","export default function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport wrapEmojiText from './wrapEmojiText';\nimport getAbbreviation from './getAbbreviation';\n\nexport default function wrapAbbreviation(str: string, onlyFirst?: boolean) {\n const {text, entities} = getAbbreviation(str, onlyFirst);\n return wrapEmojiText(text, undefined, entities);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../rootScope';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapDraftText(text: string, options: Partial<{\n wrappingForPeerId: PeerId\n}> & Parameters[1] = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n let entities = options.entities;\n if(entities && !rootScope.premium && options.wrappingForPeerId !== rootScope.myId) {\n entities = entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n const fragment = wrapRichText(text, {\n ...options,\n entities,\n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n\n return fragment;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport parseEntities from './parseEntities';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapEmojiText(text: string, isDraft = false, entities?: MessageEntity[]) {\n if(!text) return wrapRichText('');\n\n entities ??= parseEntities(text).filter((e) => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n}\n","import IS_EMOJI_SUPPORTED from './emojiSupport';\n\nexport type EMOJI_VERSION = '' | '14';\n\nconst EMOJI_VERSIONS_SUPPORTED: {\n [v in EMOJI_VERSION]: boolean\n} = {} as any;\n\n// Thanks to WebZ for the detect\nfunction isEmojiSupported(emoji: string) {\n const ALLOWABLE_CALCULATION_ERROR_SIZE = 5;\n const inlineEl = document.createElement('span');\n inlineEl.classList.add('emoji');\n document.body.appendChild(inlineEl);\n\n inlineEl.innerText = emoji; // Emoji from 14.0 version\n const newEmojiWidth = inlineEl.offsetWidth;\n inlineEl.innerText = '❤️'; // Emoji from 1.0 version\n const legacyEmojiWidth = inlineEl.offsetWidth;\n\n document.body.removeChild(inlineEl);\n\n return Math.abs(newEmojiWidth - legacyEmojiWidth) < ALLOWABLE_CALCULATION_ERROR_SIZE;\n}\n\nif(IS_EMOJI_SUPPORTED) {\n EMOJI_VERSIONS_SUPPORTED[''] = true;\n\n const a: [keyof typeof EMOJI_VERSIONS_SUPPORTED, string][] = [\n ['14', '🫱🏻']\n ];\n\n a.forEach(([version, emoji]) => {\n EMOJI_VERSIONS_SUPPORTED[version] = isEmojiSupported(emoji);\n });\n}\n\nexport default EMOJI_VERSIONS_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../../environment/emojiVersionsSupport';\nimport {SITE_HASHTAGS} from '.';\nimport {EmojiVersions} from '../../config/emoji';\nimport IS_EMOJI_SUPPORTED from '../../environment/emojiSupport';\nimport buildURLHash from '../../helpers/buildURLHash';\nimport copy from '../../helpers/object/copy';\nimport encodeEntities from '../../helpers/string/encodeEntities';\nimport {MessageEntity} from '../../layer';\nimport encodeSpoiler from './encodeSpoiler';\nimport parseEntities from './parseEntities';\nimport setBlankToAnchor from './setBlankToAnchor';\nimport wrapUrl from './wrapUrl';\nimport EMOJI_VERSIONS_SUPPORTED from '../../environment/emojiVersionsSupport';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport IS_CUSTOM_EMOJI_SUPPORTED from '../../environment/customEmojiSupport';\nimport rootScope from '../rootScope';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport wrapSticker, {videosCache} from '../../components/wrappers/sticker';\nimport RLottiePlayer, {getLottiePixelRatio} from '../rlottie/rlottiePlayer';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport LazyLoadQueue from '../../components/lazyLoadQueue';\nimport {Awaited} from '../../types';\nimport {MediaSize} from '../../helpers/mediaSize';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport {getMiddleware, Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport BOM from '../../helpers/string/bom';\nimport framesCache from '../../helpers/framesCache';\nimport wrapTelegramUrlToAnchor from './wrapTelegramUrlToAnchor';\n\nconst resizeObserver = new ResizeObserver((entries) => {\n for(const entry of entries) {\n const renderer = entry.target.parentElement as CustomEmojiRendererElement;\n renderer.setDimensionsFromRect(entry.contentRect);\n }\n});\n\nconst globalLazyLoadQueue = new LazyLoadQueue();\n\nexport class CustomEmojiElement extends HTMLElement {\n public elements: CustomEmojiElements;\n public renderer: CustomEmojiRendererElement;\n public player: RLottiePlayer | HTMLVideoElement;\n public paused: boolean;\n public syncedPlayer: SyncedPlayer;\n public clean: boolean;\n public lastChildWas: Node;\n // public docId: DocId;\n public placeholder: HTMLImageElement;\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.paused = true;\n this.classList.add('custom-emoji');\n }\n\n public get docId() {\n return this.dataset.docId;\n }\n\n public static create(docId: DocId) {\n const element = new CustomEmojiElement();\n // element.docId = docId;\n element.dataset.docId = '' + docId;\n return element;\n }\n\n public get isConnected() {\n return this.placeholder?.isConnected ?? super.isConnected;\n }\n\n public connectedCallback() {\n // if(this.isConnected) {\n // return;\n // }\n\n if(this.player) {\n animationIntersector.addAnimation(this, this.renderer.animationGroup, undefined, true);\n }\n\n // this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.renderer?.isSelectable) { // prepend on sibling can invoke disconnectedCallback\n return;\n }\n\n this.clear();\n }\n\n public destroy() {\n this.clear();\n }\n\n public clear(replaceChildren = true) {\n if(this.clean) {\n return;\n }\n\n // if(this.docId === '5399836826758290421') {\n // console.log('clear', this, this.isConnected);\n // }\n\n this.clean = true;\n this.pause();\n\n const {syncedPlayer} = this;\n if(syncedPlayer) {\n syncedPlayer.pausedElements.delete(this);\n }\n\n this.middlewareHelper?.clean();\n\n if(this.renderer) {\n const elements = this.renderer.customEmojis.get(this.docId);\n if(elements?.delete(this) && !elements.size) {\n this.renderer.customEmojis.delete(this.docId);\n this.renderer.playersSynced.delete(elements);\n }\n\n if(replaceChildren) {\n if(this.renderer.isSelectable) {\n this.replaceChildren(createCustomFiller(true));\n } else {\n // otherwise https://bugs.chromium.org/p/chromium/issues/detail?id=1144736#c27 will happen\n this.replaceChildren();\n }\n }\n }\n\n if(this.player) {\n animationIntersector.removeAnimationByPlayer(this);\n }\n\n if(globalLazyLoadQueue) {\n globalLazyLoadQueue.delete({div: this});\n }\n\n /* this.disconnectedCallback = */this.elements =\n this.renderer =\n this.player =\n this.syncedPlayer =\n undefined;\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n\n if(this.player instanceof HTMLVideoElement && !this.syncedPlayer) {\n this.renderer.lastPausedVideo = this.player;\n this.player.pause();\n }\n\n if(this.syncedPlayer && !this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.add(this);\n\n if(this.syncedPlayer.player && this.syncedPlayer.pausedElements.size === this.syncedPlayer.middlewares.size) {\n this.syncedPlayer.player.pause();\n }\n }\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n\n if(this.player instanceof HTMLVideoElement) {\n this.player.currentTime = this.renderer.lastPausedVideo?.currentTime || this.player.currentTime;\n this.player.play().catch(noop);\n }\n\n if(this.syncedPlayer && this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.delete(this);\n\n if(this.syncedPlayer.pausedElements.size !== this.syncedPlayer.middlewares.size) {\n this.player.play();\n }\n }\n }\n\n public remove() {\n this.clear();\n // this.elements = this.renderer = this.player = undefined;\n }\n\n public get autoplay() {\n return true;\n }\n}\n\ntype CustomEmojiElements = Set;\n\nexport class CustomEmojiRendererElement extends HTMLElement {\n public canvas: HTMLCanvasElement;\n public context: CanvasRenderingContext2D;\n\n public playersSynced: Map;\n public clearedElements: WeakSet;\n public customEmojis: Parameters[1]['customEmojis'];\n public lastPausedVideo: HTMLVideoElement;\n\n public lastRect: DOMRect;\n public isDimensionsSet: boolean;\n\n public animationGroup: AnimationItemGroup;\n public size: MediaSize;\n\n public isSelectable: boolean;\n public isCanvasClean: boolean;\n\n public ignoreSettingDimensions: boolean;\n\n public forceRenderAfterSize: boolean;\n\n public middlewareHelper: MiddlewareHelper;\n\n public auto: boolean;\n\n constructor() {\n super();\n\n this.classList.add('custom-emoji-renderer');\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('custom-emoji-canvas');\n this.context = this.canvas.getContext('2d');\n this.append(this.canvas);\n\n this.playersSynced = new Map();\n this.clearedElements = new WeakSet();\n this.customEmojis = new Map();\n\n this.animationGroup = 'EMOJI';\n this.isCanvasClean = false;\n }\n\n public connectedCallback() {\n if(emojiRenderers.has(this)) {\n return;\n }\n\n // this.setDimensions();\n // animationIntersector.addAnimation(this, this.animationGroup);\n resizeObserver.observe(this.canvas);\n emojiRenderers.add(this);\n\n this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.auto) {\n return;\n }\n\n this.destroy();\n\n this.disconnectedCallback = undefined;\n }\n\n public destroy() {\n // if(this.isConnected) {\n // return;\n // }\n\n resizeObserver.unobserve(this.canvas);\n\n this.customEmojis.forEach((elements) => {\n elements.forEach((element) => {\n element.clear();\n });\n });\n\n emojiRenderers.delete(this);\n this.playersSynced.clear();\n this.middlewareHelper?.clean();\n this.customEmojis.clear();\n\n this.destroy =\n this.lastPausedVideo =\n undefined;\n }\n\n public getOffsets(offsetsMap: Map = new Map()) {\n if(!this.playersSynced.size) {\n return offsetsMap;\n }\n\n const overflowElement = findUpClassName(this, 'scrollable') || this.offsetParent as HTMLElement;\n if(!overflowElement) {\n return offsetsMap;\n }\n\n const overflowRect = overflowElement.getBoundingClientRect();\n const rect = this.getBoundingClientRect();\n\n for(const elements of this.playersSynced.keys()) {\n const elementsArr = Array.from(elements);\n const placeholders = this.isSelectable ? elementsArr.map((element) => element.placeholder) : elementsArr;\n const {visible} = getViewportSlice({\n overflowElement,\n overflowRect,\n elements: placeholders,\n extraSize: this.size.height * 2.5 // let's add some margin\n });\n\n const offsets = visible.map(({rect: elementRect}) => {\n const top = elementRect.top - rect.top;\n const left = elementRect.left - rect.left;\n return {top, left, width: elementRect.width};\n });\n\n if(offsets.length) {\n offsetsMap.set(elements, offsets);\n }\n }\n\n // const rect = this.getBoundingClientRect();\n // const visibleRect = getVisibleRect(this, overflowElement, undefined, rect);\n // const minTop = visibleRect ? visibleRect.rect.top - this.size.height : 0;\n // const maxTop = Infinity;\n // for(const elements of this.playersSynced.keys()) {\n // const offsets = elements.map((element) => {\n // const elementRect = element.getBoundingClientRect();\n // const top = elementRect.top - rect.top;\n // const left = elementRect.left - rect.left;\n // return top >= minTop && (top + elementRect.height) <= maxTop ? {top, left} : undefined;\n // }).filter(Boolean);\n\n // if(offsets.length) {\n // offsetsMap.set(elements, offsets);\n // }\n // }\n\n return offsetsMap;\n }\n\n public clearCanvas() {\n if(this.isCanvasClean) {\n return;\n }\n\n const {context, canvas} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n this.isCanvasClean = true;\n }\n\n public render(offsetsMap: ReturnType) {\n const {context, canvas, isDimensionsSet} = this;\n if(!isDimensionsSet) {\n this.setDimensionsFromRect(undefined, false);\n }\n\n this.isCanvasClean = false;\n\n const {width, height, dpr} = canvas;\n for(const [elements, offsets] of offsetsMap) {\n const player = this.playersSynced.get(elements);\n const frame = syncedPlayersFrames.get(player) || (player instanceof HTMLVideoElement ? player : undefined);\n if(!frame) {\n continue;\n }\n\n const isImageData = frame instanceof ImageData;\n let frameWidth: number, frameHeight: number;\n if(player instanceof HTMLVideoElement) {\n frameWidth = this.size.width * dpr;\n frameHeight = this.size.height * dpr;\n } else {\n frameWidth = frame.width;\n frameHeight = frame.height;\n }\n\n // ! check performance of scaling\n const elementWidth = Math.round(offsets[0].width * dpr);\n if(elementWidth !== frameWidth) {\n // if(this.size.width === 36) {\n // console.warn('different width', elementWidth, frameWidth, this);\n // }\n\n frameWidth = elementWidth;\n frameHeight = elementWidth;\n }\n\n const maxTop = height - frameHeight;\n const maxLeft = width - frameWidth;\n\n if(!this.clearedElements.has(elements) && !this.isSelectable) {\n if(this.isSelectable/* && false */) {\n elements.forEach((element) => {\n element.lastChildWas ??= element.lastChild;\n replaceContent(element, element.firstChild);\n });\n } else {\n elements.forEach((element) => {\n element.replaceChildren();\n });\n }\n\n this.clearedElements.add(elements);\n }\n\n offsets.forEach(({top, left}) => {\n top = Math.round(top * dpr), left = Math.round(left * dpr);\n if(left < 0 ||/* top > maxTop || */left > maxLeft) {\n return;\n }\n\n if(isImageData) {\n context.putImageData(frame, left, top);\n } else {\n // context.clearRect(left, top, width, height);\n context.drawImage(frame, left, top, frameWidth, frameHeight);\n }\n });\n }\n }\n\n public checkForAnyFrame() {\n for(const player of this.playersSynced.values()) {\n if(syncedPlayersFrames.has(player) || player instanceof HTMLVideoElement) {\n return true;\n }\n }\n\n return false;\n }\n\n public remove() {\n super.remove();\n // this.canvas.remove();\n }\n\n // public setDimensions() {\n // const {canvas} = this;\n // sequentialDom.mutateElement(canvas, () => {\n // const rect = canvas.getBoundingClientRect();\n // this.setDimensionsFromRect(rect);\n // });\n // }\n\n public setDimensionsFromRect(rect: DOMRect = this.lastRect, forceRenderAfter = true) {\n const {canvas} = this;\n const {dpr} = canvas;\n\n if(this.lastRect !== rect) {\n this.lastRect = rect;\n }\n\n if(!rect || !dpr || this.ignoreSettingDimensions) {\n return;\n }\n\n const {width, height} = rect;\n // if(this.isSelectable) {\n // height = this.parentElement.scrollHeight || height;\n\n // this.style.width = width + 'px';\n // this.style.height = height + 'px';\n // }\n\n const newWidth = Math.floor(Math.round(width * dpr));\n const newHeight = Math.floor(Math.round(height * dpr));\n if(canvas.width === newWidth && canvas.height === newHeight) {\n return;\n }\n\n canvas.width = newWidth;\n canvas.height = newHeight;\n this.isDimensionsSet = true;\n this.isCanvasClean = true;\n\n if(this.forceRenderAfterSize || (this.isSelectable && forceRenderAfter)) {\n this.forceRenderAfterSize = undefined;\n this.forceRender();\n }\n }\n\n public forceRender() {\n if(!this.isDimensionsSet) {\n return;\n }\n\n if(!renderEmojis(new Set([this]))) {\n this.clearCanvas();\n }\n }\n\n public add(\n addCustomEmojis: Parameters[1]['customEmojis'],\n lazyLoadQueue?: LazyLoadQueue | false,\n onlyThumb?: boolean,\n withThumb?: boolean\n ) {\n const renderer = this;\n\n addCustomEmojis.forEach((addElements, docId) => { // prevent adding old elements\n let elements = this.customEmojis.get(docId);\n if(!elements) this.customEmojis.set(docId, elements = new Set());\n else this.clearedElements.delete(elements);\n\n for(const el of addElements) {\n if(elements.has(el)) {\n addElements.delete(el);\n } else {\n el.clean = false;\n el.renderer = renderer;\n el.elements = elements;\n el.middlewareHelper = this.middlewareHelper.get().create();\n elements.add(el);\n\n if(el.lastChildWas && !el.lastChildWas.parentNode) {\n el.append(el.lastChildWas);\n }\n }\n }\n\n if(!addElements.size) {\n addCustomEmojis.delete(docId);\n }\n });\n\n if(!addCustomEmojis.size) {\n return;\n }\n\n const usingOwnQueue = !!(!lazyLoadQueue && lazyLoadQueue !== false && globalLazyLoadQueue);\n\n const docIds = Array.from(addCustomEmojis.keys());\n\n const managers = rootScope.managers;\n const middleware = this.middlewareHelper.get();\n const size = this.size;\n\n const loadPromise = managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then((docs) => {\n if(middleware && !middleware()) return;\n\n const loadPromises: Promise[] = [];\n const wrap = (doc: MyDocument, _loadPromises?: Promise[]) => {\n const docId = doc.id;\n const newElements = addCustomEmojis.get(docId);\n const customEmojis = renderer.customEmojis.get(docId);\n const isLottie = doc.sticker === 2;\n const isStatic = doc.mime_type === 'video/webm' && !IS_WEBM_SUPPORTED;\n const willHaveSyncedPlayer = (isLottie || (doc.sticker === 3 && this.isSelectable)) && !onlyThumb && !isStatic;\n\n const loadPromises: Promise[] = [];\n const newElementsArray = Array.from(newElements);\n const promise = wrapSticker({\n div: newElementsArray,\n doc,\n width: size.width,\n height: size.height,\n loop: true,\n play: CUSTOM_EMOJI_INSTANT_PLAY,\n managers,\n isCustomEmoji: true,\n group: 'none',\n loadPromises,\n middleware,\n exportLoad: usingOwnQueue || lazyLoadQueue === false ? 2 : 1, // 2 - export load always, 1 - do not export load if cached static\n needFadeIn: false,\n loadStickerMiddleware: willHaveSyncedPlayer && middleware ? middleware.create().get(() => {\n // if(syncedPlayers.get(key) !== syncedPlayer) {\n // return false;\n // }\n\n // let good = false;\n // for(const middleware of syncedPlayer.middlewares) {\n // if(middleware()) {\n // good = true;\n // break;\n // }\n // }\n\n // return good;\n return !!syncedPlayer.middlewares.size;\n }) : undefined,\n static: isStatic,\n onlyThumb,\n withThumb: withThumb ?? (renderer.clearedElements.has(customEmojis) ? false : undefined),\n syncedVideo: this.isSelectable\n });\n\n if(_loadPromises) {\n promise.then(() => _loadPromises.push(...loadPromises));\n }\n\n const addition: {\n onRender?: (_p: Awaited['render']>) => Promise,\n elements: typeof newElements\n } = {\n elements: newElements\n };\n\n if(doc.sticker === 1 || onlyThumb || isStatic) {\n if(this.isSelectable) {\n addition.onRender = () => Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n newElementsArray.forEach((element) => {\n const {placeholder} = element;\n placeholder.src = (element.firstElementChild as HTMLImageElement).src;\n });\n });\n }\n\n return promise.then((res) => ({...res, ...addition}));\n }\n\n // eslint-disable-next-line prefer-const\n addition.onRender = (_p) => Promise.all(loadPromises).then(() => {\n if((middleware && !middleware()) || !doc.animated) {\n return;\n }\n\n const players = Array.isArray(_p) ? _p as HTMLVideoElement[] : [_p as RLottiePlayer];\n const player = Array.isArray(players) ? players[0] : players;\n assumeType(player);\n newElementsArray.forEach((element, idx) => {\n const player = players[idx] || players[0];\n element.player = player;\n\n if(syncedPlayer) {\n element.syncedPlayer = syncedPlayer;\n if(element.paused) {\n element.syncedPlayer.pausedElements.add(element);\n } else if(player.paused) {\n player.play();\n }\n }\n\n if(element.isConnected) {\n animationIntersector.addAnimation(element, element.renderer.animationGroup, undefined, true);\n }\n });\n\n if(player instanceof RLottiePlayer || (player instanceof HTMLVideoElement && this.isSelectable)) {\n syncedPlayer.player = player;\n renderer.playersSynced.set(customEmojis, player);\n }\n\n if(player instanceof RLottiePlayer) {\n player.group = renderer.animationGroup;\n\n player.overrideRender ??= (frame) => {\n syncedPlayersFrames.set(player, frame);\n // frames.set(containers, frame);\n };\n } else if(player instanceof HTMLVideoElement) {\n // player.play();\n\n // const cache = framesCache.getCache(key);\n // let {width, height} = renderer.size;\n // width *= dpr;\n // height *= dpr;\n\n // const onFrame = (frame: ImageBitmap | HTMLCanvasElement) => {\n // topFrames.set(player, frame);\n // player.requestVideoFrameCallback(callback);\n // };\n\n // let frameNo = -1, lastTime = 0;\n // const callback: VideoFrameRequestCallback = (now, metadata) => {\n // const time = player.currentTime;\n // if(lastTime > time) {\n // frameNo = -1;\n // }\n\n // const _frameNo = ++frameNo;\n // lastTime = time;\n // // const frameNo = Math.floor(player.currentTime * 1000 / CUSTOM_EMOJI_FRAME_INTERVAL);\n // // const frameNo = metadata.presentedFrames;\n // const imageBitmap = cache.framesNew.get(_frameNo);\n\n // if(imageBitmap) {\n // onFrame(imageBitmap);\n // } else if(IS_IMAGE_BITMAP_SUPPORTED) {\n // createImageBitmap(player, {resizeWidth: width, resizeHeight: height}).then((imageBitmap) => {\n // cache.framesNew.set(_frameNo, imageBitmap);\n // if(frameNo === _frameNo) onFrame(imageBitmap);\n // });\n // } else {\n // const canvas = document.createElement('canvas');\n // const context = canvas.getContext('2d');\n // canvas.width = width;\n // canvas.height = height;\n // context.drawImage(player, 0, 0);\n // cache.framesNew.set(_frameNo, canvas);\n // onFrame(canvas);\n // }\n // };\n\n // // player.requestVideoFrameCallback(callback);\n // // setInterval(callback, CUSTOM_EMOJI_FRAME_INTERVAL);\n }\n\n if(willHaveSyncedPlayer) {\n const dpr = getLottiePixelRatio(this.size.width, this.size.height);\n renderer.canvas.dpr = dpr;\n setRenderInterval();\n }\n });\n\n let syncedPlayer: SyncedPlayer;\n const key = [docId, size.width, size.height].join('-');\n if(willHaveSyncedPlayer) {\n syncedPlayer = syncedPlayers.get(key);\n if(!syncedPlayer) {\n syncedPlayer = {\n player: undefined,\n middlewares: new Set(),\n pausedElements: new Set(),\n key\n };\n\n syncedPlayers.set(key, syncedPlayer);\n }\n\n for(const element of newElements) {\n const middleware = element.middlewareHelper.get();\n syncedPlayer.middlewares.add(middleware);\n middleware.onClean(() => {\n syncedPlayer.middlewares.delete(middleware);\n\n if(!syncedPlayer.middlewares.size) {\n if(syncedPlayer.player) {\n const frame = syncedPlayersFrames.get(syncedPlayer.player);\n if(frame) {\n (frame as ImageBitmap).close?.();\n syncedPlayersFrames.delete(syncedPlayer.player);\n }\n\n syncedPlayersFrames.delete(syncedPlayer.player);\n if(syncedPlayer.player instanceof RLottiePlayer) {\n syncedPlayer.player.overrideRender = noop;\n syncedPlayer.player.remove();\n } else if(syncedPlayer.player instanceof HTMLVideoElement) {\n const cacheName = framesCache.generateName('' + element.docId, 0, 0, undefined, undefined);\n delete videosCache[cacheName];\n }\n\n syncedPlayer.player = undefined;\n }\n\n if(syncedPlayers.get(syncedPlayer.key) === syncedPlayer && syncedPlayers.delete(syncedPlayer.key) && !syncedPlayers.size) {\n clearRenderInterval();\n }\n }\n });\n }\n }\n\n return promise.then((res) => ({...res, ...addition}));\n };\n\n const missing: DocId[] = [];\n const cachedPromises = docs.map((doc, idx) => {\n if(!doc) {\n missing.push(docIds[idx]);\n return;\n }\n\n return wrap(doc, loadPromises);\n }).filter(Boolean);\n\n const uncachedPromisesPromise = !missing.length ?\n Promise.resolve([] as typeof cachedPromises) :\n managers.appEmojiManager.getCustomEmojiDocuments(missing).then((docs) => {\n if(middleware && !middleware()) return [];\n return docs.filter(Boolean).map((doc) => wrap(doc));\n });\n\n const loadFromPromises = (promises: typeof cachedPromises) => {\n return Promise.all(promises).then((arr) => {\n const promises = arr.map(({load, onRender, elements}) => {\n if(!load) {\n return;\n }\n\n const l = () => load().then(onRender);\n\n if(usingOwnQueue) {\n elements.forEach((element) => {\n globalLazyLoadQueue.push({\n div: element,\n load: () => {\n elements.forEach((element) => {\n globalLazyLoadQueue.delete({div: element});\n });\n\n return l();\n }\n });\n });\n } else {\n return l();\n }\n });\n\n return Promise.all(promises);\n });\n };\n\n const load = () => {\n if(middleware && !middleware()) return;\n const cached = loadFromPromises(cachedPromises);\n const uncached = uncachedPromisesPromise.then((promises) => loadFromPromises(promises));\n return Promise.all([cached, uncached]);\n };\n\n if(lazyLoadQueue) {\n lazyLoadQueue.push({\n div: renderer.canvas,\n load\n });\n } else {\n load();\n }\n\n return Promise.all(cachedPromises).then(() => Promise.all(loadPromises)).then(() => {});\n });\n\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n\n return loadPromise;\n }\n\n public static create(options: CustomEmojiRendererElementOptions) {\n const renderer = new CustomEmojiRendererElement();\n renderer.animationGroup = options.animationGroup;\n renderer.size = options.customEmojiSize || mediaSizes.active.customEmoji;\n renderer.isSelectable = options.isSelectable;\n if(options.wrappingDraft) {\n renderer.contentEditable = 'false';\n renderer.style.height = 'inherit';\n }\n // const middleware = () => !!renderer.disconnectedCallback && (!options.middleware || options.middleware());\n let middleware = options.middleware;\n if(middleware) {\n renderer.middlewareHelper = middleware.create();\n middleware = renderer.middlewareHelper.get();\n middleware.onDestroy(() => {\n renderer.destroy?.();\n });\n } else {\n // console.error('no middleware', this, options);\n renderer.auto = true;\n renderer.middlewareHelper = getMiddleware();\n }\n\n return renderer;\n }\n}\n\ntype CustomEmojiRenderer = CustomEmojiRendererElement;\ntype SyncedPlayer = {\n player: RLottiePlayer | HTMLVideoElement,\n middlewares: Set,\n pausedElements: Set,\n key: string\n};\ntype CustomEmojiFrame = Parameters[0] | HTMLVideoElement;\n\nconst CUSTOM_EMOJI_INSTANT_PLAY = true; // do not wait for animationIntersector\nlet emojiRenderInterval: number;\nconst emojiRenderers: Set = new Set();\nconst syncedPlayers: Map = new Map();\nconst syncedPlayersFrames: Map = new Map();\nexport const renderEmojis = (renderers = emojiRenderers) => {\n const r = Array.from(renderers);\n const t = r.filter((r) => r.isConnected && r.checkForAnyFrame() && !r.ignoreSettingDimensions);\n if(!t.length) {\n return false;\n }\n\n const o = t.map((renderer) => {\n const paused = [...renderer.playersSynced.values()].reduce((acc, v) => acc + +!!v.paused, 0);\n if(renderer.playersSynced.size === paused) {\n return;\n }\n\n const offsets = renderer.getOffsets();\n if(offsets.size) {\n return [renderer, offsets] as const;\n }\n }).filter(Boolean);\n\n for(const [renderer] of o) {\n renderer.clearCanvas();\n }\n\n for(const [renderer, offsets] of o) {\n renderer.render(offsets);\n }\n\n return true;\n};\nconst CUSTOM_EMOJI_FPS = 60;\nconst CUSTOM_EMOJI_FRAME_INTERVAL = 1000 / CUSTOM_EMOJI_FPS;\nconst setRenderInterval = () => {\n if(emojiRenderInterval) {\n return;\n }\n\n emojiRenderInterval = window.setInterval(renderEmojis, CUSTOM_EMOJI_FRAME_INTERVAL);\n renderEmojis();\n};\nconst clearRenderInterval = () => {\n if(!emojiRenderInterval) {\n return;\n }\n\n clearInterval(emojiRenderInterval);\n emojiRenderInterval = undefined;\n};\n\n(window as any).syncedPlayers = syncedPlayers;\n(window as any).emojiRenderers = emojiRenderers;\n\ncustomElements.define('custom-emoji-element', CustomEmojiElement);\ncustomElements.define('custom-emoji-renderer-element', CustomEmojiRendererElement);\n\ntype CustomEmojiRendererElementOptions = Partial<{\n loadPromises: Promise[],\n customEmojiRenderer: CustomEmojiRendererElement,\n\n isSelectable: boolean,\n wrappingDraft: boolean\n}> & WrapSomethingOptions;\n\n/**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\nexport default function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n // mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n isSelectable: boolean,\n\n contextHashtag?: string,\n\n // ! recursive, do not provide\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean,\n customEmojis?: Map,\n customWraps?: Set,\n}> & CustomEmojiRendererElementOptions = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const wrapSomething = (wrapElement: HTMLElement, noFiller?: boolean) => {\n const element = document.createElement('span');\n // element.append(BOM, a, BOM);\n if(options.wrappingDraft) {\n element.contentEditable = 'false';\n }\n // element.style.display = 'inline-block';\n element.classList.add('input-something');\n element.append(/* BOM, */wrapElement);\n\n (lastElement || fragment).append(element);\n\n wrapElement.classList.add('input-selectable');\n // if(wrapElement instanceof HTMLImageElement) {\n // element.prepend(f());\n // } else {\n !noFiller && wrapElement.append(createCustomFiller(true));\n // }\n\n customWraps.add(element);\n\n return element;\n };\n\n options.isSelectable ||= options.wrappingDraft;\n\n const customEmojis = options.customEmojis ??= new Map() as Map;\n const customWraps = options.customWraps ??= new Set();\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n // entity.length = entity.offset + entity.length - textLength;\n entity.length = textLength - entity.offset;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement,\n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontWeight = 'bold';\n element.style.fontFamily = 'markup-bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontStyle = 'italic';\n element.style.fontFamily = 'markup-italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: line-through;`;\n element.style.fontFamily = 'markup-strikethrough';\n } else/* if(!options.noTextFormat) */ {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: underline;`;\n element.style.fontFamily = 'markup-underline';\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n\n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n element.style.fontFamily = 'markup-monospace';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n\n break;\n }\n\n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n\n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityCustomEmoji': {\n if(!IS_CUSTOM_EMOJI_SUPPORTED) {\n break;\n }\n\n while(nextEntity?._ === 'messageEntityEmoji' && nextEntity.offset < endOffset) {\n ++nasty.i;\n nasty.lastEntity = nextEntity;\n nasty.usedLength += nextEntity.length;\n nextEntity = entities[nasty.i + 1];\n }\n\n const customEmojiElement = element = CustomEmojiElement.create(entity.document_id);\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) customEmojis.set(docId, set = new Set());\n set.add(customEmojiElement);\n customEmojiElement.dataset.stickerEmoji = fullEntityText;\n\n if(options.wrappingDraft) {\n element = document.createElement('img');\n (element as HTMLImageElement).alt = fullEntityText;\n for(const i in customEmojiElement.dataset) {\n element.dataset[i] = customEmojiElement.dataset[i];\n }\n (element as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = element as HTMLImageElement;\n element.classList.add('custom-emoji-placeholder');\n (element as HTMLImageElement).src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC';\n property = 'alt';\n break;\n }\n\n if(options.isSelectable) {\n // const s = document.createElement('span');\n // s.append(fullEntityText);\n // element.append(s);\n // element.textContent = fullEntityText;\n // element.textContent = 'a';\n // element.contentEditable = 'false';\n\n // const x = f();\n // x.style.display = 'inline-block';\n // x.contentEditable = 'false';\n // (lastElement || fragment).append(BOM);\n // (lastElement || fragment).append(x);\n\n element = wrapSomething(element, !!options.customEmojiRenderer);\n\n // const a = element;\n // element = document.createElement('span');\n // element.append(BOM, a, BOM);\n // element.contentEditable = 'false';\n }\n\n property = 'alt';\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 as EMOJI_VERSION];\n if(emojiData.hasOwnProperty(entity.unicode) && !EMOJI_VERSIONS_SUPPORTED[version as EMOJI_VERSION]) {\n isSupported = false;\n break;\n }\n }\n }\n }\n\n // if(!(options.wrappingDraft && isSupported)) { // * fix safari emoji\n if(!isSupported) { // no wrapping needed\n // if(isSupported) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n element = document.createElement('img');\n (element as HTMLImageElement).src = `assets/img/emoji/${entity.unicode}.png`;\n property = 'alt';\n element.className = 'emoji';\n\n // if(options.isSelectable) {\n // usedText = true;\n // (element as HTMLImageElement).alt = partText;\n // element = wrapSomething(element);\n // }\n\n // const a = element;\n // a.contentEditable = 'false';\n // element = document.createElement('span');\n // element.append(a);\n // element.contentEditable = 'false';\n // }\n // } else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n element = document.createElement('span');\n element.className = 'emoji';\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!isSupported) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n\n case 'messageEntityCaret': {\n element = document.createElement('span');\n element.className = 'composer-sel';\n break;\n }\n\n // case 'messageEntityLinebreak': {\n // if(options.noLinebreaks) {\n // insertPart(entity, ' ');\n // } else {\n // insertPart(entity, '
');\n // }\n\n // break;\n // }\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || fullEntityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n if(nextEntity?._ === 'messageEntityUrl' &&\n nextEntity.length === entity.length &&\n nextEntity.offset === entity.offset) {\n nasty.lastEntity = nextEntity;\n ++nasty.i;\n }\n\n if(url !== fullEntityText) {\n masked = true;\n }\n } else {\n // inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') ?\n url :\n `javascript:electronHelpers.openExternal('${url}');`;\n\n element = document.createElement('a');\n element.className = 'anchor-url';\n (element as HTMLAnchorElement).href = href;\n\n if(!(currentContext || typeof electronHelpers !== 'undefined')) {\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n if(onclick) {\n element.setAttribute('onclick', onclick + '(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('mailto:' + fullEntityText);\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n break;\n }\n\n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && SITE_HASHTAGS[contextSite];\n if(contextUrl) {\n const hashtag = fullEntityText.slice(1);\n element = document.createElement('a');\n element.className = 'anchor-hashtag';\n (element as HTMLAnchorElement).href = contextUrl.replace('{1}', encodeURIComponent(hashtag));\n if(contextExternal) {\n setBlankToAnchor(element as HTMLAnchorElement);\n } else {\n element.setAttribute('onclick', 'searchByHashtag(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = buildURLHash('' + entity.user_id);\n element.className = 'follow';\n element.dataset.follow = '' + entity.user_id;\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const username = fullEntityText.slice(1);\n\n element = wrapTelegramUrlToAnchor('t.me/' + username);\n element.className = 'mention';\n\n // insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const encoded = encodeSpoiler(nasty.text, entity);\n nasty.text = encoded.text;\n partText = encoded.entityText;\n if(endPartOffset !== endOffset) {\n nasty.usedLength += endOffset - endPartOffset;\n }\n let n: MessageEntity;\n for(; n = entities[nasty.i + 1], n && n.offset < endOffset;) {\n // nasty.usedLength += n.length;\n ++nasty.i;\n nasty.lastEntity = n;\n nextEntity = entities[nasty.i + 1];\n }\n } else if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'spoiler';\n element.style.fontFamily = 'markup-spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n\n container[`on${CLICK_EVENT_NAME}`] = (window as any).onSpoilerClick;\n }\n\n break;\n }\n }\n\n if(!usedText && partText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentNode) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < endOffset) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentNode) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(nasty.usedLength <= endOffset) {\n if(nasty.usedLength < endOffset) {\n (element || fragment).append(nasty.text.slice(nasty.usedLength, endOffset));\n nasty.usedLength = endOffset;\n }\n\n lastElement = fragment;\n nasty.lastEntity = undefined;\n } else if(entity.length > partText.length && element) {\n lastElement = element;\n } else {\n lastElement = fragment;\n }\n\n if(options.voodoo) {\n return fragment;\n }\n }\n\n if(nasty.lastEntity) {\n nasty.usedLength = nasty.lastEntity.offset + nasty.lastEntity.length;\n }\n\n if(nasty.usedLength < textLength) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength));\n }\n\n if((!options.wrappingDraft || options.customEmojiRenderer) && customEmojis.size) {\n let renderer = options.customEmojiRenderer;\n if(!renderer) {\n renderer = CustomEmojiRendererElement.create(options);\n fragment.prepend(renderer);\n }\n\n const loadPromise = renderer.add(customEmojis, options.lazyLoadQueue, options.wrappingDraft);\n options.loadPromises?.push(loadPromise);\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n }\n\n if(customWraps.size) {\n insertCustomFillers(customWraps);\n }\n\n return fragment;\n}\n\nexport const createCustomFiller = (notFiller?: boolean) => {\n const x = document.createElement('span');\n x.classList.add(notFiller ? 'input-filler2' : 'input-filler');\n x.textContent = BOM;\n return x;\n};\n\nexport function isCustomFillerNeededBySiblingNode(node: ChildNode) {\n if(\n // !node?.textContent ||\n // node.textContent.endsWith('\\n') ||\n node?.textContent !== BOM ||\n (node as HTMLElement)?.getAttribute?.('contenteditable') === 'false'\n ) {\n // if(!node || (node as HTMLElement).firstElementChild || node.textContent.endsWith('\\n')) {\n if(!node || node.textContent !== BOM || (node as HTMLElement).firstElementChild) {\n return 2;\n } else if(node.nodeType === node.ELEMENT_NODE) {\n return 1;\n }/* else if(node.nodeType === node.TEXT_NODE && !node.nodeValue) {\n (node as CharacterData).insertData(0, BOM);\n } */\n }\n\n return 0;\n}\n\nexport function insertCustomFillers(elements: Iterable) {\n const check = (element: HTMLElement, node: ChildNode, method: 'before' | 'after') => {\n const needed = isCustomFillerNeededBySiblingNode(node);\n if(needed === 2) {\n element[method](createCustomFiller());\n } else if(needed === 1) {\n node.appendChild(document.createTextNode(BOM));\n }\n };\n\n for(const element of elements) {\n const {previousSibling, nextSibling} = element;\n check(element, previousSibling, 'before');\n check(element, nextSibling, 'after');\n }\n}\n\n(window as any).wrapRichText = wrapRichText;\n","// just for the future\nexport default function buildURLHash(str: string) {\n return '#' + encodeURIComponent(str);\n}\n","import wrapUrl from './wrapUrl';\n\nexport default function wrapTelegramUrlToAnchor(url1: string) {\n const {url, onclick} = wrapUrl(url1);\n const element = document.createElement('a');\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n return element;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n\n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.postMessage({\n queryMethod: args.shift(),\n queryMethodArguments: args\n }, CAN_USE_TRANSFERABLES ? transfer: undefined);\n }\n}\n","const IS_WEB_ASSEMBLY_SUPPORTED = typeof(WebAssembly) !== 'undefined';\n\nexport default IS_WEB_ASSEMBLY_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 animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport pause from '../../helpers/schedulers/pause';\nimport {logger, LogTypes} from '../logger';\nimport RLottiePlayer, {RLottieOptions} from './rlottiePlayer';\nimport QueryableWorker from './queryableWorker';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport IS_WEB_ASSEMBLY_SUPPORTED from '../../environment/webAssemblySupport';\nimport makeError from '../../helpers/makeError';\nimport App from '../../config/app';\n\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' |\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' |\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' |\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' |\n 'voice_outlined2' | 'voip_filled' | 'voice_mini' | 'jolly_roger';\n\nexport class LottieLoader {\n private loadPromise: Promise = !IS_WEB_ASSEMBLY_SUPPORTED ? Promise.reject() : undefined;\n private loaded = false;\n\n private workersLimit = App.threads;\n private players: {[reqId: number]: RLottiePlayer} = {};\n private playersByCacheName: {[cacheName: string]: Set} = {};\n\n private workers: QueryableWorker[] = [];\n private curWorkerNum = 0;\n\n private log = logger('LOTTIE', LogTypes.Error);\n\n public getAnimation(element: HTMLElement) {\n for(const i in this.players) {\n if(this.players[i].el.includes(element)) {\n return this.players[i];\n }\n }\n\n return null;\n }\n\n public setLoop(loop: boolean) {\n for(const i in this.players) {\n const player = this.players[i];\n player.loop = loop;\n player.autoplay = player._autoplay;\n }\n }\n\n public loadLottieWorkers() {\n if(this.loadPromise) {\n return this.loadPromise;\n }\n\n return this.loadPromise = new Promise((resolve, reject) => {\n let remain = this.workersLimit;\n for(let i = 0; i < this.workersLimit; ++i) {\n const worker = new Worker(new URL('./rlottie.worker.ts', import.meta.url));\n const queryableWorker = this.workers[i] = new QueryableWorker(worker);\n\n queryableWorker.addEventListener('ready', () => {\n this.log('worker #' + i + ' ready');\n\n queryableWorker.addEventListener('frame', this.onFrame);\n queryableWorker.addEventListener('loaded', this.onPlayerLoaded);\n queryableWorker.addEventListener('error', this.onPlayerError);\n\n --remain;\n if(!remain) {\n this.log('workers ready');\n resolve();\n this.loaded = true;\n }\n }, {once: true});\n\n queryableWorker.addEventListener('workerError', (error) => {\n reject('rlottie load error: ' + error.message);\n this.loaded = false;\n }, {once: true});\n }\n });\n }\n\n private makeAssetUrl(name: LottieAssetName) {\n return 'assets/tgs/' + name + '.json';\n }\n\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\n // (params as RLottieOptions).name = name;\n return this.loadAnimationFromURL(params, this.makeAssetUrl(name));\n }\n\n public loadAnimationDataFromURL(url: string): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n this.loadLottieWorkers();\n\n return fetch(url)\n .then((res) => {\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\n return res.arrayBuffer()\n .then((data) => apiManagerProxy.invokeCrypto('gzipUncompress', data))\n .then((arr) => blobConstruct(arr as Uint8Array, ''));\n } else {\n return res.blob();\n }\n });\n /* .then((str) => {\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\n }) */\n }\n\n public loadAnimationFromURLManually(name: LottieAssetName) {\n const url = this.makeAssetUrl(name);\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return (params: Omit) => this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURL(params: Omit, url: string) {\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURLNext(blob: Blob, params: Omit, url: string) {\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\n newParams.name ||= url;\n return this.loadAnimationWorker(newParams);\n }\n\n public waitForFirstFrame(player: RLottiePlayer) {\n return Promise.race([\n /* new Promise((resolve) => {\n player.addEventListener('firstFrame', () => {\n setTimeout(() => resolve(), 1500);\n }, true);\n }) */\n new Promise((resolve) => {\n player.addEventListener('firstFrame', resolve, {once: true});\n }),\n pause(2500)\n ]).then(() => player);\n }\n\n public async loadAnimationWorker(\n params: RLottieOptions,\n group: AnimationItemGroup = params.group || '',\n middleware?: () => boolean\n ): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n if(!this.loaded) {\n await this.loadLottieWorkers();\n }\n\n if(middleware && !middleware()) {\n throw makeError('MIDDLEWARE');\n }\n\n if(params.sync) {\n const cacheName = RLottiePlayer.CACHE.generateName(params.name, params.width, params.height, params.color, params.toneIndex);\n const players = this.playersByCacheName[cacheName];\n if(players?.size) {\n return Promise.resolve(players.entries().next().value[0]);\n }\n }\n\n const containers = Array.isArray(params.container) ? params.container : [params.container];\n if(!params.width || !params.height) {\n params.width = parseInt(containers[0].style.width);\n params.height = parseInt(containers[0].style.height);\n }\n\n if(!params.width || !params.height) {\n throw new Error('No size for sticker!');\n }\n\n params.group = group;\n\n const player = this.initPlayer(containers, params);\n\n animationIntersector.addAnimation(player, group);\n\n return player;\n }\n\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\n return;\n }\n\n this.log.debug('onPlayerLoaded');\n player.onLoad(frameCount, fps);\n };\n\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\n return;\n }\n\n if(player.clamped !== undefined && frame instanceof Uint8ClampedArray) {\n player.clamped = frame;\n }\n\n player.renderFrame(frame, frameNo);\n };\n\n private onPlayerError = (reqId: number, error: Error) => {\n const player = this.players[reqId];\n if(!player) {\n return;\n }\n\n // ! will need refactoring later, this is not the best way to remove the animation\n const animations = animationIntersector.getAnimations(player.el[0]);\n animations.forEach((animation) => {\n animationIntersector.removeAnimation(animation);\n });\n };\n\n public onDestroy(reqId: number) {\n delete this.players[reqId];\n }\n\n public destroyWorkers() {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return;\n }\n\n this.workers.forEach((worker, idx) => {\n worker.terminate();\n this.log('worker #' + idx + ' terminated');\n });\n\n this.log('workers destroyed');\n this.workers.length = 0;\n this.curWorkerNum = 0;\n this.loaded = false;\n this.loadPromise = undefined;\n }\n\n private initPlayer(el: RLottiePlayer['el'], options: RLottieOptions) {\n const player = new RLottiePlayer({\n el,\n worker: this.workers[this.curWorkerNum++],\n options\n });\n\n const {reqId, cacheName} = player;\n this.players[reqId] = player;\n\n const playersByCacheName = cacheName ? this.playersByCacheName[cacheName] ??= new Set() : undefined;\n if(cacheName) {\n playersByCacheName.add(player);\n }\n\n if(this.curWorkerNum >= this.workers.length) {\n this.curWorkerNum = 0;\n }\n\n player.addEventListener('destroy', () => {\n this.onDestroy(reqId);\n if(playersByCacheName.delete(player) && !playersByCacheName.size) {\n delete this.playersByCacheName[cacheName];\n }\n });\n\n player.loadFromData(options.animationData);\n\n return player;\n }\n}\n\nconst lottieLoader = new LottieLoader();\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\nexport default lottieLoader;\n","/*\n * 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 {AnimationItemGroup, AnimationItemWrapper} from '../../components/animationIntersector';\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_APPLE_MX from '../../environment/appleMx';\nimport {IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI} from '../../environment/userAgent';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport clamp from '../../helpers/number/clamp';\nimport QueryableWorker from './queryableWorker';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport framesCache, {FramesCache, FramesCacheItem} from '../../helpers/framesCache';\n\nexport type RLottieOptions = {\n container: HTMLElement | HTMLElement[],\n canvas?: HTMLCanvasElement,\n autoplay?: boolean,\n animationData: Blob,\n loop?: RLottiePlayer['loop'],\n width?: number,\n height?: number,\n group?: AnimationItemGroup,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number,\n sync?: boolean\n};\n\nexport type RLottieColor = [number, number, number];\n\nexport function getLottiePixelRatio(width: number, height: number, needUpscale?: boolean) {\n let pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1 && !needUpscale) {\n if(width > 90 && height > 90) {\n if(!IS_APPLE && mediaSizes.isMobile) {\n pixelRatio = 1;\n }\n } else if((width > 60 && height > 60) || IS_ANDROID) {\n pixelRatio = Math.max(1.5, pixelRatio - 1.5);\n }\n }\n\n return pixelRatio;\n}\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void,\n destroy: () => void\n}> implements AnimationItemWrapper {\n public static CACHE = framesCache;\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n public name: string;\n public cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n\n private width = 0;\n private height = 0;\n\n public el: HTMLElement[];\n public canvas: HTMLCanvasElement[];\n private contexts: CanvasRenderingContext2D[];\n\n public paused = true;\n // public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop: number | boolean = true;\n private _loop: RLottiePlayer['loop']; // ! will be used to store original value for settings.stickers.loop\n public group: AnimationItemGroup = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n // private caching = false;\n // private removed = false;\n\n private cache: FramesCacheItem;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n public overrideRender: (frame: ImageData | HTMLCanvasElement | ImageBitmap) => void;\n private renderedFirstFrame: boolean;\n\n private raw: boolean;\n\n constructor({el, worker, options}: {\n el: RLottiePlayer['el'],\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(const i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n this.raw = this.color !== undefined;\n\n if(this.name) {\n this.cacheName = RLottiePlayer.CACHE.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n }\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI && !IS_APPLE_MX)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n // options.needUpscale = true;\n\n // * Pixel ratio\n const pixelRatio = getLottiePixelRatio(this.width, this.height, options.needUpscale);\n\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n\n // options.noCache = true;\n\n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; // 2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n\n // this.cachingDelta = Infinity;\n // this.cachingDelta = 0;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n if(!this.canvas) {\n this.canvas = this.el.map(() => {\n const canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = this.width;\n canvas.height = this.height;\n canvas.dpr = pixelRatio;\n return canvas;\n });\n }\n\n this.contexts = this.canvas.map((canvas) => canvas.getContext('2d'));\n\n if(!IS_IMAGE_BITMAP_SUPPORTED || this.raw) {\n this.imageData = new ImageData(this.width, this.height);\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n }\n\n if(this.name) {\n this.cache = RLottiePlayer.CACHE.getCache(this.cacheName);\n } else {\n this.cache = FramesCache.createCache();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n\n if(this.cacheName && this.cache.counter > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n\n this.cache.clearCache();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.sendQuery([args.shift(), this.reqId, ...args], transfer);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery(['loadFromData', data, this.width, this.height, this.toneIndex, this.color !== undefined/* , this.canvas.transferControlToOffscreen() */]);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n this.rafId = undefined;\n }\n // window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n // this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n this.pause();\n this.sendQuery(['destroy']);\n if(this.cacheName) RLottiePlayer.CACHE.releaseCache(this.cacheName);\n this.dispatchEvent('destroy');\n this.cleanup();\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray | HTMLCanvasElement | ImageBitmap, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(frame instanceof Uint8ClampedArray) {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n }\n\n // this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n this.contexts.forEach((context, idx) => {\n let cachedSource: HTMLCanvasElement | ImageBitmap = this.cache.framesNew.get(frameNo);\n if(!(frame instanceof Uint8ClampedArray)) {\n cachedSource = frame;\n } else if(idx > 0) {\n cachedSource = this.canvas[0];\n }\n\n if(!cachedSource) {\n // console.log('drawing from data');\n const c = document.createElement('canvas');\n c.width = context.canvas.width;\n c.height = context.canvas.height;\n c.getContext('2d').putImageData(this.imageData, 0, 0);\n this.cache.framesNew.set(frameNo, c);\n cachedSource = c;\n }\n\n if(this.overrideRender && this.renderedFirstFrame) {\n this.overrideRender(cachedSource || this.imageData);\n } else if(cachedSource) {\n // console.log('drawing from canvas');\n context.clearRect(0, 0, cachedSource.width, cachedSource.height);\n context.drawImage(cachedSource, 0, 0);\n } else {\n context.putImageData(this.imageData, 0, 0);\n }\n\n if(!this.renderedFirstFrame) {\n this.renderedFirstFrame = true;\n }\n });\n\n this.dispatchEvent('enterFrame', frameNo);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n }\n }\n\n public renderFrame(frame: Parameters[0], frameNo: number) {\n const canCacheFrame = this.cachingDelta && (frameNo % this.cachingDelta || !frameNo);\n if(canCacheFrame) {\n if(frame instanceof Uint8ClampedArray && !this.cache.frames.has(frameNo)) {\n this.cache.frames.set(frameNo, new Uint8ClampedArray(frame));// frame;\n } else if(IS_IMAGE_BITMAP_SUPPORTED && frame instanceof ImageBitmap && !this.cache.framesNew.has(frameNo)) {\n this.cache.framesNew.set(frameNo, frame);\n }\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n\n if(delta < 0) {\n const timeout = this.frInterval > -delta ? -delta % this.frInterval : this.frInterval;\n if(this.rafId) clearTimeout(this.rafId);\n this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, timeout);\n // await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n return;\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.cache.frames.get(frameNo);\n const frameNew = this.cache.framesNew.get(frameNo);\n if(frameNew) {\n this.renderFrame(frameNew, frameNo);\n } else if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.sendQuery(['renderFrame', frameNo], this.clamped ? [this.clamped.buffer] : undefined);\n }\n }\n\n private onLap() {\n if(++this.playedTimes === this.loop) {\n this.loop = false;\n }\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n // window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n this.rafId = undefined;\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n // console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n // this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n // setTimeout(() => {\n // this.addListener('enterFrame', this.frameListener);\n // }, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n\n // this.mainLoop(method);\n // this.r(method);\n // method();\n }\n\n public playPart(options: {\n from: number,\n to: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number,\n speed?: number,\n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n\n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n // this.sendQuery('renderFrame', 0);\n\n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс,\n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс.\n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n\n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n });\n }\n }\n\n console.timeEnd('cache' + this.reqId); */\n // console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas[0].parentNode && this.el && !this.overrideRender) {\n this.el.forEach((container, idx) => container.append(this.canvas[idx]));\n }\n\n // console.log('enterFrame firstFrame');\n\n // let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused || !this.currentMethod) {\n return;\n }\n\n const time = Date.now();\n // console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n // lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n // setInterval(this.frameListener, this.frInterval);\n\n // ! fix autoplaying since there will be no animationIntersector for it\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Page from './page';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport {horizontalMenu} from '../components/horizontalMenu';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport whichChild from '../helpers/dom/whichChild';\n\nclass PagesManager {\n private pageId = -1;\n private page: Page;\n\n private selectTab: ReturnType;\n public pagesDiv: HTMLDivElement;\n public scrollableDiv: HTMLElement;\n\n constructor() {\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\n if(this.page?.onShown) {\n this.page.onShown();\n }\n });\n }\n\n public setPage(page: Page) {\n if(page.isAuthPage) {\n this.pagesDiv.style.display = '';\n\n const id = whichChild(page.pageEl);\n if(this.pageId === id) return;\n\n this.selectTab(id);\n\n if(this.pageId !== -1 && id > 1) {\n lottieLoader.loadLottieWorkers();\n }\n\n\n this.pageId = id;\n\n if(this.scrollableDiv) {\n fastSmoothScroll({\n container: this.scrollableDiv,\n element: this.scrollableDiv.firstElementChild as HTMLElement,\n position: 'start'\n });\n }\n } else {\n this.pagesDiv.style.display = 'none';\n page.pageEl.style.display = '';\n\n this.pageId = -1;\n }\n\n this.page = page;\n }\n}\n\nconst pagesManager = new PagesManager();\nMOUNT_CLASS_TO.pagesManager = pagesManager;\nexport default pagesManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pagesManager from './pagesManager';\n\nexport default class Page {\n public pageEl: HTMLDivElement;\n private installed = false;\n\n constructor(\n className: string,\n public isAuthPage: boolean,\n private onFirstMount?: (...args: any[]) => Promise | void,\n private onMount?: (...args: any[]) => Promise | void,\n public onShown?: () => void\n ) {\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\n }\n\n public async mount(...args: any[]) {\n // this.pageEl.style.display = '';\n\n if(this.onMount) {\n const res = this.onMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(!this.installed) {\n if(this.onFirstMount) {\n try {\n const res = this.onFirstMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n } catch(err) {\n console.error('PAGE MOUNT ERROR:', err);\n }\n }\n\n this.installed = true;\n }\n\n pagesManager.setPage(this);\n }\n}\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '🏴‍☠']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\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}])}));","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n"],"names":["animationIntersector","constructor","this","observer","IntersectionObserver","entries","entry","target","group","byGroups","intersectionLockedGroups","animation","find","p","el","isIntersecting","visible","add","checkAnimation","delete","_animation","clearCache","Set","overrideIdleGroups","byPlayer","Map","lockedGroups","onlyOnePlayableGroup","videosLocked","doc","type","checkAnimations2","idle","setOverrideIdleGroup","override","getAnimations","element","found","player","push","removeAnimation","remove","HTMLVideoElement","IS_SAFARI","setTimeout","src","load","length","unobserve","removeAnimationByPlayer","item","get","addAnimation","observeElement","controlled","has","canvas","placeholder","HTMLElement","loop","observe","set","checkAnimations","blurred","destroy","imitateIntersection","undefined","groups","Object","keys","animations","paused","pause","autoplay","play","getOnlyOnePlayableGroup","setOnlyOnePlayableGroup","lockGroup","unlockGroup","refreshGroup","forEach","lockIntersectionGroup","unlockIntersectionGroup","toggleIntersectionGroup","lock","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","err","AppMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","Math","max","seekOffset","seekForward","min","duration","seekTo","seekTime","onMediaDocumentLoad","managers","appDocsManager","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","thumbsStorage","getCacheContext","url","playbackRate","id","size","onPlay","e","peerId","mid","pip","message","getMessageByMedia","stop","setMedia","verify","listLoader","current","getCurrent","jumpLength","withOtherSide","previous","getPrevious","idx","findIndex","getNext","go","setTargets","dispatchEvent","getPlayingDetails","pauseMediaInOtherTabs","onPause","onEnded","isTrusted","lockedSwitchers","round","next","toggle","clean","s","isScheduled","storage","playingMediaType","playItem","searchContext","getMedia","resolveWaitingForLoadMedia","dispatchJump","goRound","browserPlay","bindBrowserCallback","browserPause","browserStop","browserSeekBackward","browserSeekForward","browserSeekTo","browserNext","browserPrevious","seekToStart","construct","container","document","createElement","style","cssText","body","append","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","action","setActionHandler","console","warn","skipMediaPlayEvent","properties","key","_key","value","dispatchPlaybackParams","defineProperties","getPlaybackParams","volume","muted","setPlaybackParams","params","_volume","_muted","_playbackRate","_loop","_round","addMedia","autoload","pFlags","is_scheduled","setAttribute","addEventListener","media_unread","fromId","appMessagesManager","readMessages","once","deferred","resolve","w","waitingStorage","then","promise","isSafariBuffering","safariBuffering","setSafariBuffering","setNewMediadata","pictureInPictureElement","artwork","isVoice","title","artist","thumbs","bytes","sizes","h","thumb","appPeersManager","getPeerPhoto","plainText","onlyFirstName","attribute","attributes","_","file_name","performer","IS_APPLE","metadata","MediaMetadata","setCurrentMediadata","playbackParams","cb","willBePlayed","willBePlayedMedia","setSearchContext","context","getSearchContext","prev","reset","loadCount","loadWhenLeft","processItem","onJump","older","onEmptied","reverse","folderId","getPlaybackMediaTypeFromMessage","mediaType","setSingleMedia","wasPlaying","toggleSwitchers","playPaused","removeEventListener","enabled","setPictureInPicture","listenerSetter","removeAll","appMediaPlaybackController","AppMediaViewer","captionTimeout","super","isForDocument","inputFilter","isMediaCompatibleForDocumentViewer","onPrevClick","openMedia","getMessageByPeer","onNextClick","onDeleteClick","content","close","onForwardClick","onAuthorClick","Number","MAX_SAFE_INTEGER","threadId","tab","lastMsgId","onDownloadClick","queueId","caption","classList","setCaptionTimeout","clearTimeout","window","onAdditionalScroll","wholeDiv","buttons","btnMenuForward","icon","text","onClick","btnMenuDownload","btnMenuDelete","setBtnMenuToggle","setListeners","forward","author","onCaptionClick","a","spoiler","HTMLAnchorElement","contains","onclick","getAttribute","includes","capture","click","getScheduledMessageByPeer","setCaption","html","entities","totalEntities","firstElementChild","fromRight","prevTargets","nextTargets","setMoverPromise","fwd_from","from_name","noForwards","isServiceMessage","cantForwardMessage","canForward","cantDownloadMessage","download","canDeleteMessage","hide","button","_openMedia","date","static","mime_type","VideoPlayer","streamable","onPlaybackRackMenuToggle","onPip","onPipClose","wrapper","setup","canHideControls","playbackRateButton","showOnLeaveToClassName","ignoreClickClassName","parentNode","insertBefore","appendChild","skin","stylePlayer","controls","querySelector","progress","prepend","catch","name","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","pipButton","querySelectorAll","fullScreenButton","timeElapsed","textContent","toHHMMSS","volumeSelector","leftControls","btn","parentElement","Array","from","togglePlay","requestPictureInPicture","visibility","debounceTime","debouncedPip","debounce","listener","timeout","overlayCounter","code","good","toggleFullScreen","altKey","nextIdx","PLAYBACK_RATES","indexOf","cancelEvent","onFullScreen","bind","hideControls","showControls","setPlaybackRateIcon","onMediaLoad","IS_MOBILE","pictureInPictureEnabled","map","rate","regularText","btnMenu","onOpen","onClose","PLAYBACK_RATES_ICONS","className","IS_APPLE_MOBILE","webkitEnterFullscreen","enterFullscreen","isFull","cleanup","removeListeners","MEDIA_VIEWER_CLASSNAME","AppMediaViewerBase","topButtons","tempId","preloader","preloaderStreamable","isFirstOpen","pageEl","getElementById","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","transform","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","tagName","highlightSwitchersTimeout","isZooming","mover","classNames","findUpClassName","onKeyDown","ctrlKeyDown","changeZoom","ctrlKey","metaKey","onKeyUp","onWheel","scrollingUp","deltaY","rootScope","log","logger","cancelable","lazyLoadQueue","overlaysDiv","mainDiv","topbar","topbarLeft","onlyMobile","authorRight","avatarEl","nameEl","buttonsDiv","concat","noRipple","zoom","step","withTransition","setHandlers","onScrub","onMouseUp","main","innerHTML","onLoadedMore","setNewMover","moveLength","onSwipe","xDiff","yDiff","abs","windowSize","verifyTouchTarget","evt","enable","isVisible","mousedown","zoomValue","setProgress","videoPlayer","lockControls","zoomSwipeHandler","lastDiffX","lastDiffY","multiplier","onFirstSwipe","onReset","cursor","addProgress","btnMenuToggle","buttonOptions","direction","Promise","reject","navigationItem","appNavigationController","clear","setMoverToTarget","onAnimationEnd","appMediaViewer","removeGlobalListeners","toggleOverlay","active","toggleGlobalListeners","setGlobalListeners","passive","closing","removeCenterFromMover","wasActive","delay","realParent","rect","getBoundingClientRect","SVGImageElement","SVGForeignObjectElement","left","needOpacity","overflowElement","visibleRect","getVisibleRect","overflow","vertical","horizontal","containerRect","top","aspecter","width","HTMLImageElement","setFullAspect","offsetLeft","height","scaleX","scaleY","borderRadius","getComputedStyle","getPropertyValue","brSplitted","str","splitted","split","i","fillPropertyValue","r","parseInt","join","willBeLeft","willBeTop","path","opacity","isOut","ret","isFulfilled","isRejected","SVGSVGElement","sizeTailPath","toggleWholeActive","mediaElement","selector","queryFrom","matches","elements","pop","getContext","naturalWidth","naturalHeight","videoWidth","videoHeight","HTMLCanvasElement","drawImage","image","Image","createVideo","clipId","dataset","newClipId","newSvg","createElementNS","setAttributeNS","outerHTML","replace","lastElementChild","defs","use","SVGUseElement","d","getAttributeNS","x","y","sX","sY","br","v","generatePathData","foreignObject","renderImageFromUrl","display","proportion","upscale","start","Date","now","diff","_br","moveTheMover","toLeft","windowW","newTransform","p1","newMover","updateMediaSource","toLowerCase","setAuthorInfo","timestamp","isPeerId","wrapTitlePromise","dialog","wrapEmojiText","oldAvatar","newAvatar","cloneNode","all","updateWithOptions","peerTitle","replaceContent","replaceWith","setAuthorPromise","isDocument","isVideo","useContainerAsTarget","IS_MOBILE_SAFARI","onPop","canAnimate","maxWidth","padding","windowH","mediaSizes","maxHeight","thumbPromise","setAttachmentSize","photoSize","img","downloaded","gotThumb","getStrippedThumbIfNeeded","loadPromise","useController","div","moverVideo","canPlayThrough","createPlayer","ckin","overlay","open","otherMediaViewer","releaseSingleMedia","show","readyState","HAVE_FUTURE_DATA","attach","attachCanPlay","detach","loading","networkState","NETWORK_LOADING","isntEnoughData","unshift","appDownloadManager","error","cancellablePromise","attachPromise","imgs","haveImage","setManual","onPopState","hash","location","state","debug","isPossibleSwipe","currentHash","overriddenHash","overrideHash","onHashChange","pushState","navigations","manual","handleItem","onEscape","back","onTouchStart","touches","options","history","scrollRestoration","replaceState","pushItem","noBlurOnPop","findItemByType","index","backByItem","splice","onItemAdded","noHistory","unshiftItem","spliceItems","items","origin","pathname","search","removeItem","removeByType","single","SearchGroup","clearable","clickable","autonomous","onFound","noIcons","list","setActive","childElementCount","AppSearch","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","scrollable","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","beginSearch","inputField","input","focus","maxId","limit","res","count","shift","searchGroup","avatarSize","meAsSaved","SearchContextMenu","attachTo","searchSuper","onGotoClick","appImManager","selection","isSelecting","selectionForwardBtn","onSelectClick","toggleByElement","onClearSelectionClick","cancelSelection","selectionDeleteBtn","attachContextMenuListener","init","MouseEvent","preventDefault","cancelBubble","toPeerId","isSelected","isMidSelected","withSelection","positionMenu","contextMenuController","AppSearchSuper","tabs","prevTabId","middleware","historyStorage","usedFromHistory","loadMutex","nextRates","loadPromises","loaded","loadedChats","firstLoad","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","showSender","onTransitionStart","onTransitionEnd","safeAssign","searchContextMenu","navScrollableContainer","navScrollable","nav","tabsMenu","mediaTab","mediaTabs","menuTab","span","ripple","unlockScroll","tabsContainer","swipeHandler","handleTabSwipe","prevId","selectTab","children","onTouchMove","lockers","lockTouchScroll","contentTab","searchGroupMedia","canLoadMediaTab","horizontalMenu","tabContent","animate","skipScroll","scrollIntoViewNew","position","startCallback","scrollStartCallback","newMediaTab","onChangeTab","fromMediaTab","offsetTop","scrollTop","scroll","scrollHeight","rect2","onScroll","onMediaClick","targetClassName","targets","containerEl","copySearchContext","slice","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","unlockAndRefresh","filterMessagesByType","filterMessagesByInputFilter","processEmptyFilter","dialogElement","appDialogsManager","setLastMessagePromise","lastMessage","highlightWord","noop","processPhotoVideoFilter","promises","getMediaFromMessage","wrapped","choosePhotoSize","boxWidth","boxHeight","onlyPreview","withoutPreloader","noPlayButton","photo","noBlur","images","full","filter","Boolean","processDocumentFilter","withTime","fontWeight","voiceAsMusic","autoDownloadSize","processUrlFilter","webPage","webpage","entity","display_url","sliced","offset","matchUrl","same","URL","hostname","description","previewDiv","setInnerHTML","wrapAbbreviation","subtitleFragment","htmlToDocumentFragment","wrapRichText","innerText","decodeURIComponent","href","firstChild","wrapPlainText","row","titleRight","subtitle","havePadding","applyMediaElement","performSearchResult","elemsToAppend","sharedMediaDiv","processCallback","results","awaited","method","monthContainer","getMonthContainerByTimestamp","toggleElementCheckbox","afterPerforming","parent","child","loadChats","renderedPeerIds","inputMessagesFilterEmpty","setResults","showMembersCount","dom","peer","getPeer","participants_count","participants","regExp","RegExp","escapeRegExp","cleanSearchText","titleSpan","lastMessageSpan","getChatMembersString","toChatId","username","getPeerUsername","user","appUsersManager","getUser","phone","formatPhoneNumber","formatted","onLoad","arg","getContactsPeerIds","contacts","searchContacts","my_results","globalContacts","showMore","intlElement","isShort","update","dialogsStorage","getDialogs","offsetIndex","filterId","dialogs","minDate","renderRecentSearch","recent","replaceChildren","recentSearch","isUser","getUserStatusString","toUserId","getTopPeers","peers","people","subtitleEl","loadMembers","renderParticipants","membersList","rippleEnabled","li","findUpTag","DIALOG_LIST_ELEMENT_TAG","participant","getParticipantPeerId","isAnyChat","deleted","appChatsManager","isChannel","LOAD_COUNT","appProfileManager","getChannelParticipants","getChatFull","chatFull","loadType","justLoad","used","slicedLength","ids","notFilteredMessages","m","checkForTriggers","getSearch","nextRate","next_rate","loadFirstTime","filters","counters","canViewMembers","getSearchCounters","firstMediaTab","counter","c","membersTab","loadFirstTimePromise","toLoad","t","findAndSplice","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","haveTimestamps","getObjectKeysAndSort","positionElementByIndex","chatId","isBroadcast","hasRights","isForum","cleanScrollPositions","cleanupHTML","goFirst","putPreloader","empty","newInputFilter","copy","setQuery","maxDate","AppSelectPeers","chatsContainer","selected","freezed","loadedWhat","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","design","onInput","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","peerIds","splitUp","notRendered","filterPeerTypeBy","section","innerContainer","topContainer","selectedContainer","selectedScrollable","sectionNameLangPackKey","noShadow","checkbox","checked","debouncedInput","appendTo","getResultsPromise","onFirstRender","renderSaved","testSelfSearch","getTempId","getMoreDialogs","archived","pageCount","skipMigrated","newOffsetIndex","chatRightsAction","filterByRights","isEnd","getMoreContacts","isGlobalSearch","searchResult","resultPeerIds","arr","getMoreChannelParticipants","channelParticipants","q","getMoreSomething","call","isNonContactUser","checkboxField","label","isDialog","insertAdjacentElement","offsetWidth","getSelected","addInitial","values","requestAnimationFrame","forceDirection","constructDownloadPreloader","tryAgainOnFail","circle","totalLength","mids","attr","elem","findMediaTargets","anchor","anchorMid","isBubbles","justAudioSelector","selectors","prefix","mediaItems","AudioElement","render","isRealVoice","isOutgoing","is_outgoing","uploadingFileName","durationStr","downloadDiv","onTypeLoad","audioEl","out","waveform","Uint8Array","valueCount","result","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","minW","maxW","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","onTimeUpdate","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","scrub","offsetX","targetTouches","pageX","scrubTime","wrapVoiceMessage","descriptionEl","audioAttribute","parts","titleEl","middleEllipsisEl","fontSize","sizeType","subtitleDiv","launched","progressLine","lastChild","wrapAudio","audioTimeDiv","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","hadSearchContext","useSearch","autoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","playListener","setDownloadFunction","disconnectedCallback","isConnected","customElements","define","AvatarListLoader","loadMore","photoId","appPhotosManager","getUserPhotos","photos","loadedAllUp","AppMediaViewerAvatar","getPhoto","onAvatarUpdate","openAvatarViewer","getTarget","hadMessage","isObject","data","believeMe","seen","getAvatarQueueKey","AvatarElement","addedToQueue","middlewareHelper","attachClickEvent","updateOptions","wasPeerId","wasThreadId","newPeerId","wrapOptions","create","onlyThumb","putPhoto","isBig","AvatarEdit","clearRect","Button","asLink","asDiv","rippleSquare","disabled","ButtonMenuItem","separator","iconDoc","noCheckboxClickListener","textElement","textArgs","iconElement","noFadeIn","processUrl","fetch","response","color","DOMParser","parseFromString","stroke","strokeWidth","keepOpen","menu","multiline","ButtonMenuSync","b","ButtonMenu","ButtonMenuToggleHandler","openedMenu","ButtonMenuToggle","attachListenerSetter","onOpenBefore","onCloseAfter","closeTimeout","filteredButtons","_element","ChatBackgroundGradientRenderer","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","_animatingToNextPosition","_scrollDelta","_onWheelRAF","drawOnWheel","floor","ceil","changeTailAndDraw","drawNextPositionAnimated","getProgress","transitionValue","nextPositionTail","_nextPositionTail","_nextPositionTails","_nextPositionLeft","frames","_frames","drawImageData","_incrementalCurve","hexToRgb","hex","g","getPositions","positions","getNextPositions","phase","curveMax","curve","pos","distances","nextPos","distance","curPosition","tail","changeTail","_tail","_phase","curPos","drawGradient","getGradientImageData","_hctx","createImageData","pixels","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","sqrt","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","cancelAnimationFrame","colors","alpha","_canvas","fillStyle","fillRect","toNextPosition","tails","nextPhaseOnIdx","inc","toFixed","curves","last","scrollAnimate","createCanvas","gradientRenderer","accumulateMapSet","reduce","acc","AppSelection","selectedMids","onMouseDown","targetLookupClassName","verifyTarget","selecting","firstTarget","processElement","checkBetween","isInDOM","seenSet","seenLength","findUpAsChild","elementsBetween","getElementsBetween","toggleByMid","canceledSelection","onMouseMove","getElementFromTarget","verifyMouseMoveTarget","removeManual","listenElement","documentListenerOptions","first","firstRect","lastRect","isHigher","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","doNotAnimate","onCancelSelection","toggleSelection","navigationType","random","attachListeners","selectedText","getSelection","toString","createRange","verifyTouchLongPress","isElementShouldBeSelected","appendCheckbox","hasCheckbox","getCheckboxInputFromElement","forwards","updateContainer","forceSelection","cantForward","cantDelete","cantSend","storageKey","cantForwardDeleteMids","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","toggleResult","onToggleSelection","updateElementSelection","toggleMid","unselect","deleteSelectedMids","SearchSelection","selectionCountEl","selectionGotoBtn","selectionContainer","BASE_CLASS","btnCancel","attachClickOptions","obj","fromPeerId","sort","isPrivate","transitionElement","ChatSelection","chat","bubbles","recording","bubble","canSelectBubble","isGroupedBubbleSelected","getMidsFromGroupContainer","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","right","inputContainer","toggleAttribute","skippedMids","isGrouped","groupedCheckboxInput","CheckboxField","restriction","toggleDisability","stateKey","stateValues","stateValue","setValueSilently","box","checkSvg","bg","border","withRipple","withHover","event","Event","disable","CodeInputField","assign","autocomplete","lastLength","setLabel","onFill","confirmationPopup","callback","cancelButton","isCancel","checkboxes","countries","setCountries","country","hidden","default_name","localeCompare","VIRTUAL_COUNTRIES","CountryInputField","hidePicker","hideTimeout","selectWrapper","selectCountryByTarget","defaultName","phoneCodeEl","phoneCode","countryCode","simulateInputEvent","lastCountrySelected","lastCountryCodeSelected","country_codes","_countryCode","country_code","onCountryChange","liMap","arrowDown","selectList","initSelect","noPhoneCodes","iso2","emoji","liArr","Infinity","spanEmoji","select","margin","mouseDownHandlerAttached","onKeyPress","_value","names","abbr","word","test","blur","selectCountryByIso2","countryName","EditPeer","_disabled","isChanged","uploadAvatar","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","nextBtn","withoutAvatar","avatarElem","doNotEditAvatar","avatarEdit","_upload","popupOptions","lockWithPromise","unlockOnSuccess","GifsTab","gifsContainer","EmoticonsDropdown","masonry","EMOTICONSSTICKERGROUP","getGifs","docs","processInvisibleDiv","ANIMATIONGROUP","AppGifsTab","nextOffset","loadedAll","onGifsClick","fileId","inputSearch","gifsDiv","onCloseAfterTimeout","newSearch","gifBotPeerId","resolveUsername","appInlineBotsManager","getInlineResults","next_offset","AppStickersTab","setsDiv","listenTo","sticker","stickerSet","access_hash","appStickersManager","getStickerSet","toggleStickerSet","changed","installed_date","removeAttribute","renderFeatured","renderSet","header","countDiv","stickersDiv","stickerDiv","documents","withLock","getFeaturedStickers","coveredSets","filterRendered","forEachReverse","covered","searchStickerSets","scrollOptions","forceDuration","transitionFunction","ignoreOutClickClassName","tabId","onSelectTabClick","searchButton","emojiTab","deleteBtn","scrollTo","checkRights","tabsEl","tabsElements","canSendStickers","canSendGifs","canSendToPeer","stickersTab","gifsTab","whichChild","savedRange","getGoodRange","onOpened","unlock","refresh","onClosed","range","getSavedRange","setStartAfter","newRange","cloneRange","collapsed","node","endContainer","endOffset","newStartNode","previousSibling","nodeType","TEXT_NODE","nodeValue","ELEMENT_NODE","isContentEditable","selectNode","newOffset","setStart","deleteContents","HIDE_EMOJI_TAB","INIT_TAB_ID","lastMouseMoveEvent","mouseMoveEventAttached","isActive","onMouseOut","getElement","axis","clearDraft","silent","emoticonsDropdown","forceClose","addLazyLoadQueueRepeat","divs","intersector","getVisible","clearVisible","sel","rangeCount","activeElement","getRangeAt","menuOnClick","emoticons","menuScroll","prevTab","jumpedTo","getElementPosition","elementPosition","scrollToTab","scrollingToContent","stickyIntersector","stuck","getCategoryByContainer","which","getCategoryByMenuTab","additionalOffset","setActiveStatic","local","scrollLeft","clientWidth","sendDocId","loadedURLs","appendEmoji","unify","kek","getEmojiEntityFromEmoji","wrapSingleEmoji","fixEmoji","getEmojiFromElement","superEmoji","stickerEmoji","EMOJI_RECENT_ID","EMOJI_RECENT_CATEGORY","CUSTOM_EMOJI_RECENT_CATEGORY","EMOJI_CATEGORIES","sorted","prepare","category","order","EMOJI_ELEMENT_SIZE","EmojiTab","onCategoryVisibility","categoriesMap","renderer","newChildren","customEmojis","customEmojiElement","clearCanvas","onContentClick","isStandalone","userName","toast","langPackKey","langPackArguments","activeElements","menuInnerScroll","intersectionOptions","root","categoriesIntersector","menuOnClickResult","innerScrollWrapper","preparedMap","noRegularEmoji","emojis","titleLangPackKey","createLocalCategory","unified","addEmojiToCategory","batch","appEmojiManager","getRecentEmojis","stickerSetId","getLocalStickerSet","getCustomEmojis","recentCustom","mainSet","sets","recentCategory","categories","recentCustomCategory","CUSTOM_EMOJI_RECENT_ID","createRendererForCategory","paddingTop","toggleLocalCategory","resizeCategories","after","renderStickerSet","toggleCustomCategory","postponedEvent","positionCategory","toggleRenderers","ignore","ignoreSettingDimensions","setDimensionsFromRect","deleteCategory","isCategoryVisible","forceRender","closeScrollTop","createCategory","menuTabPadding","stickerEmojiRaw","setCategoryItemsHeight","getCustomCategory","hasPremium","canSeeCustomCategory","animationGroup","customEmojiSize","activeEmoji","spliceExceed","onLocalCategoryUpdate","LazyLoadQueueRepeat","parallelLimit","onVisibilityChange","elementsMap","queueItem","wasSeen","queue","indexOfAndSplice","setProcessQueueTimeout","SuperStickerRenderer","regularLazyLoadQueue","animated","checkAnimationContainer","processVisible","processInvisible","renderSticker","observeAnimated","unobserveAnimated","StickersTabCategory","noMenuTab","getContainerSize","getElementMediaSize","gapX","gapY","containerWidth","elementSize","itemsPerRow","rows","minHeight","EmoticonsTabC","categoryItemsClassName","args","postponedEvents","categoriesByMenuTabMap","localCategories","menuWrapper","isLocal","observeStickyHeaderChanges","posItems","foundMenuScroll","posMenu","notMountedItems","notMountedMenus","itemsIdx","menuIdx","disconnect","StickersTab","setTyping","setFavedLimit","categoryAppendStickers","superStickerRenderer","clearCategoryItems","onCategoryStickers","stickers","deleteSticker","unshiftSticker","favedCategory","clearButton","titleLangKey","descriptionLangKey","langKey","clearRecentStickers","premiumCategory","apiManager","getLimit","getFavedStickersStickers","getRecentStickersStickers","getAllStickers","getPremiumStickers","isPremium","race","rendererLazyLoadQueue","faved","createStickersContextMenu","verifyRecent","unshiftRecentSticker","saveRecentSticker","deleteRecentSticker","generateDelimiter","delimiter","generateFakeIcon","isScam","LazyLoadQueueRepeat2","spliced","findAndSpliceAll","GifsMasonry","scrollPromise","processVisibleDiv","noInfo","noPreview","transitionTime","scrollableX","proxy","Proxy","apply","that","selectTarget","result1","canChange","mutateCallback","useStripe","indicator","currentIndicator","shiftLeft","scaleFactor","insertRichTextAsHTML","wrappingForPeerId","some","createCustomEmojiRendererForInput","fragment","wrapDraftText","customEmojiRenderer","contentEditable","richInputHandler","customEmojiElements","ces","documentFragmentToHTML","pre","getCaretPosNew","createTextNode","collapse","removeAllRanges","addRange","onBeforeInput","inputType","execCommand","removeExtraBOMs","findUpAttribute","noLinebreaks","originalEvent","clipboardData","getData","usePlainText","filterEntity","curChild","nextSibling","richValue","getRichValueWithCaret","lines","textLength","line","correctedText","entities2","parseEntities","mergeEntities","InputState","wrappingDraft","isSelectable","processCustomEmojisInInput","hasSet","connectedCallback","InputField","validate","maxLength","showLengthOn","canBeEdited","labelText","onInputCallbacks","isCollapsed","centerX","focusOnNext","clientX","isInputEmpty","inputMode","labelEl","showingLength","wasError","inputLength","isError","withLinebreaks","selectNodeContents","selectElementContents","labelOptions","fromSet","originalValue","isValidToChange","setDraftValue","setOriginalValue","setState","Valid","setError","InputSearch","prevValue","onClearClick","onClear","searchIcon","clearBtn","LazyLoadQueue","ignoreHeavyAnimation","getItem","addElement","LazyLoadQueueIntersector","inProcess","loadItem","intersectorTimeout","processQueue","MediaProgressLine","useTransform","progressRAF","onLoadedData","seek","setLoadProgress","onProgress","filledLoad","setSeekMax","buf","buffered","numRanges","nearestStart","end","percents","testQueue","pendingTest","setTestQueue","testElement","getElementWidth","mapped","firstTime","font","textWidth","elementWidth","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","substr","half2","MiddleEllipsisElement","PasswordMonkey","passwordInputField","needFrame","noCache","currentFrame","setSpeed","helpers","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","TrackingMonkey","playAnimation","frame","idleAnimation","PasswordInputHelpers","onVisibilityClick","toggleVisible","stealthy","tabIndex","PasswordInputField","PeerProfileAvatars","avatar","avatars","draggable","loadCallback","intersectionObserver","loadCallbacks","addTab","gradient","info","arrowPrevious","arrowNext","checkScrollTop","SWITCH_ZONE","freeze","_e","clickX","toRight","cancelNextClick","minX","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","loadNearestToTarget","setPeer","backLimit","filterChatPhotosMessages","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","setText","PeerProfile","noDelimiter","bio","contextMenu","subtitleLangKey","isAnonymous","getUserPhone","link","notifications","togglePeerMute","appNotificationsManager","isPeerLocalMuted","respectType","setPeerStatus","setMoreDetails","n","fillUsername","userId","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","needClear","callbacks","useWhitespace","ignoreSelf","clearSetMoreDetailsTimeout","canBeDetailed","createAvatar","_setAvatar","isTopic","oldAvatars","getUsernamesAlso","usernames","also","anchorCopy","getPeerActiveUsernames","formatUserPhone","fillNotifications","notificationsRow","fillName","withIcons","fillRows","fillProfileElements","cleaned","onClean","_setMoreDetails","peerFull","getMiddlewarePromise","getServerMessageId","about","getChat","exportedInvite","exported_invite","address","setMoreDetailsTimeout","isPeerRestricted","acknowledged","getProfileByPeerId","setPromise","cached","middlewarePromise","makeError","clearInterval","generateTitleIcons","noVerifiedIcon","noFakeIcon","noPremiumIcon","verified","use2","generateVerifiedIcon","fake","scam","premium","emojiStatus","emoji_status","generatePremiumIcon","weakMap","WeakMap","PeerTitle","setOptions","setHasInner","hasInner","fromName","limitSymbols","topic","forumTopic","getTopicIconPromise","icons","topicIcon","getPeerTitle","withPremiumIcon","inner","createDocumentFragment","PopupAvatar","closable","withConfirm","cropper","crop","removeHandlers","h6","btnClose","cropContainer","file","files","readBlobAsDataURL","contents","onload","originalImage","cropComponent","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","overlayColor","CROPWIDTH","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","startMoving","resizing","keyHandler","imgZoom","PI","bottom","newWidth","newHeight","clientHeight","String","fromCharCode","charCode","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","currentTouch","complete","btnConfirm","toBlob","blob","darkenCanvas","onCrop","postCanvas","ctx","PopupDeleteDialog","onSelect","peerTitleElement","getDialogType","callbackLeave","flush","leave","flushHistory","callbackDelete","titleArgs","descriptionArgs","isDanger","titleLangArgs","descriptionLangArgs","PopupDeleteMessages","onConfirm","revoke","deleteScheduledMessages","deleteMessages","isMegagroup","_hasRights","canRevoke","PopupForward","peerIdMids","overrideOnSelect","peerTypes","DEFAULT_APPEND_TO","appendPopupTo","onFullScreenChange","PopupElement","reAppend","titleRaw","MANAGERS","confirmShortcutIsSendShortcut","withoutOverlay","overlayClosable","attachScrollableListeners","btnConfirmOnEnter","buttonsEl","buttonsElements","langArgs","POPUPS","setClassOn","attachBorderListeners","onContentUpdate","popup","popupConstructor","ctor","addCancelButton","times","ONE_HOUR","PopupMute","time","mutePeer","muteUntil","radioForm","PopupPeer","noTitle","o","original","nextElementSibling","PopupPickUser","PopupSendNow","sendScheduledMessages","ANIMATION_GROUP","PopupStickers","stickerSetInput","isEmojis","onStickersClick","updateAdded","stickersFooter","onStickerSetUpdate","_set","updateButton","loadStickerSet","createStickerSetElements","headerRow","buttonRight","added","itemsContainer","setsPromises","isArray","firstSet","isStickerPack","onSend","containersPromises","docIds","toggleStickerSets","isAdd","buttonAppend","installed","ProgressivePreloader","detached","isUpload","attachMethod","loadFunc","constructContainer","bold","constructDownloadIcon","downloadSvg","cancelSvg","previousElementSibling","func","startTime","onEnd","notify","elapsedTime","TRANSITION_TIME","addNotifyListener","useRafs","getTotalLength","strokeDasharray","putAvatar","renderThumbPromise","thumbImage","isFullLoaded","loadThumbPromise","stripped_thumb","getPreviewURLFromBytes","sequentialDom","renderPromise","myId","getForumTopic","setProperty","getPeerColorById","forum","avatarAvailable","avatarRendered","appAvatarsManager","isAvatarCached","first_name","last_name","getPeerInitials","returnDiv","setButtonLoader","RadioField","alignRight","RadioForm","radios","form","RangeSelector","events","setFilled","filled","stepStr","decimals","_removeListeners","rectMax","offsetAxisValue","rippleClickId","attachListenerTo","handler","drawRipple","clickId","_handler","touchStartFired","clickY","isRippleUnneeded","touchEnd","setContent","Row","checkboxFieldOptions","radioField","noWrap","subtitleRight","subtitleRow","createRow","subtitleLangArgs","isToggle","withCheckboxSubtitle","titleRightContent","titleRightSecondary","titleRow","createTitle","navigationTab","buttonRightLangKey","_subtitle","createSubtitle","midtitle","_midtitle","createMidtitle","createMedia","disableWithPromise","CreateRowFromCheckboxField","RadioFormFromRows","RadioFormFromValues","checkedRadioField","SCROLL_THROTTLE","IS_ANDROID","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","cancelMeasure","onScrolledTop","scrollPosition","scrollProperty","addScrollListener","addedScrollListener","removeScrollListener","removeHeavyAnimationListener","Scrollable","onScrollOffset","withPaddingContainer","maxScrollTop","isScrolledDown","getDistanceToEnd","setScrollTopSilently","ignoreNextScrollEvent","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","SettingSection","fakeGradientDelimiter","hr","generateContentElement","nameArgs","captionOld","captionArgs","generateSection","AppNewGroupTab","isGeoChat","setTitle","inputWrapper","groupNameInputField","groupLocationInputField","valueCheck","userLocationCoords","userLocationAddress","createChannel","geo_point","megagroup","inputFile","editPhoto","inviteToChannel","createChat","chatsSection","new","startLocating","geolocation","getCurrentPosition","lat","coords","latitude","long","longitude","uri","json","display_name","GeolocationPositionError","PrivacyType","getPrivacyRulesDetails","rules","types","allowPeers","users","chats","disallowPeers","rule","PrivacySection","onRadioChange","captions","captionElement","radioSection","exceptions","radioRows","skipTypes","noExceptions","exceptionTexts","exception","_peerIds","slider","createTab","skippable","takeOut","newPeerIds","generateStr","splitPeersByType","selectedPeerIds","appPrivacyManager","getPrivacy","inputKey","setRadio","k","eventListener","chatKey","usersKey","getUserInput","setPrivacy","AppPrivacyPhoneNumberTab","getSelf","captionEl","mePath","phoneSection","sCaption","AppTwoStepVerificationSetTab","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","AppSettingsTab","canFocus","isFirstInput","AppTwoStepVerificationEmailConfirmationTab","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","cancelPasswordEmail","AppTwoStepVerificationEmailTab","resendPasswordEmail","onOpenAfterTimeout","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","hint","currentPassword","plainPassword","newPassword","symbols","AppTwoStepVerificationHintTab","onSkipClick","saveHint","AppTwoStepVerificationReEnterPasswordTab","monkey","verifyInput","AppTwoStepVerificationEnterPasswordTab","isNew","has_password","textEl","getStateInterval","getState","_state","check","auth","AppTwoStepVerificationTab","removeTabFromHistory","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","AppPrivacyLastSeenTab","AppPrivacyProfilePhotoTab","AppPrivacyForwardMessagesTab","AppPrivacyAddToGroupsTab","AppPrivacyCallsTab","AppActiveSessionsTab","Session","app_name","app_version","ip","date_active","date_created","device_model","system_version","platform","authorizations","session","btnTerminate","invokeApi","otherSection","onError","onTerminateClick","menuElement","AppBlockedUsersTab","btnAdd","toggleBlock","bot","blocked","getBlocked","convertKeyToInputKey","toUpperCase","AppPrivacyVoicesTab","AppPrivacyAndSecurityTab","fromTab","appConfig","getAppConfig","globalPrivacy","getGlobalPrivacySettings","contentSettings","SUBTITLE","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRowOptions","email_unconfirmed_pattern","twoFactorRow","activeSessionsRow","updateActiveSessions","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","voicesRow","updatePrivacyRow","disallowLength","allowLength","destroyed","setGlobalPrivacySettings","archive_and_mute_new_noncontact_peers","settings","onPremiumToggle","autoarchive_setting_available","_enabled","sensitive_enabled","sensitive_can_change","payment","appPaymentsManager","clearSavedInfo","deleteButton","appDraftsManager","clearAllDrafts","auths","averageColorFromCanvas","pixel","fill","getImageData","pixelsLength","outPixel","Uint8ClampedArray","highlightningColor","rgba","l","ColorPicker","hue","saturation","lightness","onGrabStart","documentElement","boxDragger","onGrabEnd","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","attachGrabListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","getCurrentColor","rgbaArray","hexa","hsl","hsla","clamp","maxX","maxY","posX","posY","lightnessX","lightnessY","AppBackgroundColorTab","_applyColor","updateColorPicker","colorPicker","background","theme","intensity","slug","appStateManager","pushToState","onColorChange","applyColor","themeController","gridSection","grid","backgroundColor","throttle","isColored","AppBackgroundTab","clicked","wallPapersByElement","elementsByKey","onUploadClick","accept","requestFile","endsWith","createObjectURL","mimeType","scaleMediaElement","File","wallPaper","prepareWallPaperUpload","uploadPromise","uploadWallPaper","uploadDeferred","newKey","getWallPaperKey","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","blurCheckboxField","onGridClick","wallpaper","saveToCache","_tempId","onReady","getPixelPromise","getColorsFromWallPaper","imageUrl","imageSource","ratio","averageColorFromImageSource","averageColor","toDataURL","getWallPaperKeyFromTheme","uploadButton","colorButton","resetButton","pattern","getWallPapers","wallPapers","gridContainer","background_color","second_background_color","third_background_color","fourth_background_color","hasFile","isDark","dark","webkitMaskImage","AppQuickReactionTab","appReactionsManager","getQuickReaction","getAvailableReactions","quickReaction","availableReactions","reaction","inactive","availableReaction","static_icon","setDefaultReaction","emoticon","RangeSettingSelector","initialValue","minValue","writeValue","nameDiv","valueDiv","valueContainer","AppGeneralSettingsTab","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","format","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","eachMinute","toLocaleTimeString","hour","minute","suggestCheckboxField","bigCheckboxField","reactionsRow","renderQuickReaction","getCustomEmojiDocument","document_id","loopCheckboxField","stickerSets","stickersContent","allStickers","assumeType","AppNotificationsTab","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","isMuted","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","notify_settings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","AppLanguageTab","languages1","lang_pack","languages2","rendered","webLangCodes","language","lang_code","native_name","langPack","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","AppAutoDownloadPhotoTab","AppAutoDownloadFileTab","debouncedSave","sizeMax","setByKey","MIN","MAX_RANGE","MAX","upTo","formatBytes","compareAndUpdate","AppAutoDownloadVideoTab","AUTO_DOWNLOAD_FOR_KEYS","private","channels","AppDataAndStorageTab","autoCheckboxField","autoDownloadNew","autoRow","deepEqual","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","file_size_max","openTab","tabConstructor","onDisabledChange","peerKeys","enabledKeys","isAll","logOut","edit","profile","fillPromise","changeAvatarBtn","upload","uploadProfilePhoto","updateChangeAvatarBtn","getInitArgs","languageArgs","devicesRow","languageRow","buttonsSection","getEditProfileArgs","editProfileArgs","lottieLoader","getAuthorizations","overwrite","getAuthorizationsPromise","AppNewChannelTab","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","channelId","PopupCreateContact","importContact","nameInputField","lastNameInputField","telInputField","editPeer","AppContactsTab","openContacts","isContact","sortedUserList","createList","renderPage","AppArchivedTab","wasFilterId","ul","localId","AppPeopleNearbyTab","isLocationWatched","parseDistance","startWatching","latestLocationSaved","getLocated","accuracy","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","stopWatching","lat1","long1","lat2","long2","asin","LEFT_COLUMN_ACTIVE_CLASSNAME","AppSidebarLeft","sidebarEl","sidebarHeader","onContactsClick","backBtn","btnArchive","getFolderDialogs","isDialogsLoaded","themeCheckboxField","sessionStorage","kz_version","toolsBtn","btnMenuFooter","rel","archivedCount","newBtnMenu","updateBtn","reload","initSearch","folder","unreadPeerIds","formatNumber","checkUpdateInterval","cache","status","ok","hasUpdate","onResize","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","pushRecentSearch","peopleContainer","hideNewBtnMenuTimeout","transition","activeClassName","onFocus","clearRecentSearchBtn","clearRecentSearch","appSidebarLeft","AppAddMembersTab","attachToPromise","isPrivacy","removeLoader","AppChatFoldersTab","filtersRendered","renderFolder","dialogFilter","non_contacts","broadcasts","bots","isAnyGroup","filtersStorage","getFilter","createFolderBtn","foldersSection","suggestedSection","canCreateFolder","onFiltersContainerUpdate","getDialogFilters","toggleAllChats","getSuggestedFilters","loadAnimationPromise","getSuggestedDialogsFilters","suggestedFilters","includePeerIds","excludePeerIds","pinnedPeerIds","createDialogFilter","bool","AppIncludedChatsTab","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","editFolderTab","originalFilter","cmp","pinned_peers","other","otherLegacy","getInputPeerById","setFilter","onAppConfig","dialog_filters_chats_limit_premium","dialog_filters_chats_limit_default","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","selectedPeers","addedInitial","_add","flag","hasOwnProperty","AppEditFolderTab","flags","deleteFolderButton","updateDialogFilter","menuBtn","inputSection","generateList","h2Text","to","includedFlagsContainer","excludedFlagsContainer","include","include_peers","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","onCreateOpen","onEditOpen","ignoreClick","hasPeer","getDialogOnly","filtered","filterAsync","renderMore","_length","exclude_peers","purchaseUsernameCaption","purchaseText","setUsername","AppEditProfileTab","bioMaxLength","userFull","firstNameInputField","bioInputField","usernameInputField","isPurchase","availableText","takenText","invalidText","profilePromise","updateProfile","updateUsername","RIGHT_COLUMN_ACTIVE_CLASSNAME","AppSidebarRight","canHideFirst","isColumnProportionSet","toggleSidebar","setColumnProportion","createSharedMediaTab","replaceSharedMediaTab","previousTab","sharedMediaTab","historyTabIds","_selectTab","getFrom","setFrom","onCloseTab","isNavigation","willChange","animationPromise","appSidebarRight","AppEditContactTab","privacy","notificationsCheckboxField","profileNameDiv","profileSubtitleDiv","phoneRow","privacyRule","sharePhoneCheckboxField","btnDelete","deleteContacts","addContact","mediaSize","AppEditTopicTab","colorIndex","isGeneral","originalTopic","iconDiv","icon_emoji_id","setIcon","editForumTopic","topicId","iconEmojiId","createForumTopic","iconColor","onDestroy","emojiElement","icon_color","force","isMainIcon","newTopic","oldTopic","oldEl","applyFadeAnimation","fadeIn","iterations","easing","AppChatTypeTab","privateRow","publicRow","privateSection","publicContainer","linkRow","btnRevoke","getChatInviteLink","publicSection","linkInputField","applyBtn","getValue","head","usernamesSection","getPeerEditableUsername","wasUsername","migrateChat","makeChannelPrivate","toggleNoForwards","onChatUpdate","noforwards","AppUserPermissionsTab","destroyListener","ChatPermissions","rights","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","kickFromChannel","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","defaultRights","combineParticipantBannedRights","restrictionText","mainFlag","until_date","AppGroupPermissionsTab","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","setSubtitle","bannedRights","cantWhat","getPeerId","setLength","exceptionsCount","loader","setLoader","getPromise","migrateFrom","migrateTo","AppChatReactionsTab","getActiveAvailableReactions","_chatReactions","available_reactions","chatReactions","reactions","makeReactionFromEmoticons","getCaptionLangPackKey","toggleSection","reactionsSection","toggleCheckboxFieldsByEmoticons","checkboxFieldsByEmoticon","toggleCheckboxField","toggleRow","save","checkboxFields","every","saveReactionsDebounced","allow_custom","saveReactions","setChatAvailableReactions","isDebounced","AppEditChatTab","_init","canChangeType","canChangePermissions","canManageTopics","chatUpdateListeners","basic","addChatUpdateListener","getCachedFullChat","chatNameInputField","descriptionInputField","chatTypeRow","setChatTypeSubtitle","availableReactionsLength","setReactionsLength","chatAvailableReactions","permissionsRow","setPermissionsLength","forum_upgrade_participants_min","topicsRow","setTopics","toggleForum","editTitle","editAbout","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","historiesStorage","AppSharedMediaTab","newCloseBtn","closeBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","titleI18n","editBtn","transitionLastItem","secondTitle","setIsSharedMedia","isSharedMedia","isHeavy","onCloseBtnClick","toggleEditBtn","renderNewMessage","msgs","deleteDeletedMessages","btnAddMembers","showConfirmation","addChatUser","_renderNewMessage","getMessageThreadId","_deleteDeletedMessages","setLoadMutex","peerChanged","changeTitleKey","loadSidebarMedia","destroyable","SetTransition","raf","afterTimeout","SidebarSlider","closeTab","closingId","getMiddleware","onOpenTab","preserveTab","getTab","getHistory","isTabExists","deleteTab","doNotAppend","SliderSuperTab","_constructor","SliderSuperTabEventable","dispatchResultableEvent","SortedUserList","getIndex","getUserStatusForSort","onDelete","listEl","onListLengthChange","onUpdate","onSort","willChangeLength","onElementCreate","base","updateElementWith","updateListWith","createChatListOptions","doTimeout","updateList","SORT_INTERVAL","hasViewer","attachStickerViewerListeners","findTarget","originalFindTarget","checkForParent","closest","mediaContainer","previousGroup","_middleware","previousTransformer","doThatSticker","lockGroups","isSwitching","effectThumb","mediaRect","boxSize","fitted","aspectFitted","transformer","transformX","transformY","needFadeIn","withThumb","relativeEffect","loopEffect","firstFramePromise","prevPlayer","ready","onMousePreMove","newMediaContainer","_previousTransformer","StickyIntersector","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","elementsObserver","addSentinel","sentinel","headerSentinel","getEvent","attachGlobalListenerTo","RESET_GLOBAL","TOUCH_MOVE_OPTIONS","SwipeHandler","listenerOptions","hadMove","xDown","yDown","handleMove","setCursorTo","handleStart","xUp","yUp","onSwipeResult","withDelay","setCursor","TelInputField","pasted","lastValue","telEl","HTMLInputElement","pixelRatio","devicePixelRatio","letterSpacing","originalFunc","formattedPhoneNumber","leftPattern","shiftKey","toastEl","hideToast","toastNew","transitions","navigation","prevTabContent","animateFirst","withAnimationListener","animationFunction","_animateFirst","onTransitionEndCallbacks","animationDeferred","listenerName","onEndEvent","overrideFrom","onTransitionEndCallback","transitionTimeout","_from","isUsernameValid","UsernameInputField","checkUsernameDebounced","checkUsername","checkUsernamePromise","checkPromise","available","UsernamesSection","_usernames","sortedList","editable","CLASS_NAME","sortIcon","changeActive","applyUsernames","getAll","_peerId","cancelClick","newActive","toggleUsername","getSortableTarget","elementRect","minY","siblings","lastSiblings","property","sibling","move","newIdx","reorderUsernames","VisibilityIntersector","locked","change","refreshVisible","VolumeSelector","onMuteClick","setVolume","iconIndex","ICONS","wrapCustomEmoji","repeat","wrapCustomEmojiAwaited","wrapDocument","noAutoDownload","uploadFileName","audioElement","extSplitted","ext","docDiv","icoDiv","icoTextEl","hadContext","hasThumb","performance","fileName","bytesContainer","descriptionParts","bytesMaxEl","sizeDiv","_downloadDiv","addByteProgress","sizeContainer","_bytesContainer","_d","canOpenAfter","downloadFileName","downloadId","apiFileManager","isDownloading","support","was_online","today","getDate","dateEl","timeEl","wrapMessageActionTextNew","plain","hadColors","wrapJoinVoiceChatAnchor","wrapUrl","wrapLinkToMessage","savedFrom","dir","wrapSomeText","htmlToSpan","wrapTopicIcon","ns","contentSpan","gradientId","strokeColor","clone","topicAvatar","wrapMessageActionTopicIcon","wrapMessageActionTopicIconAndName","wrapMessageActionTextNewUnsafe","unsafeMessage","getNameDivHTML","formatCallDuration","post","schedule_date","daysToStart","tomorrowDate","_args","day","pinnedMessage","reply_to_mid","fetchMessageReplyTo","user_id","joined","anchorHTML","domain","isRecurringInit","recurring_init","isRecurringUsed","recurring_used","paymentsWrapCurrencyAmount","total_amount","currency","invoiceMessage","reply_to","reply_to_peer_id","period","titleElement","authorElement","isMe","isIconChanged","isIconRemoved","isTitleChanged","isHiddenChanged","closed","waited","wrapMessageForReply","usingMids","withoutMediaType","hasAlbumKey","addPart","part","isRestricted","usingFullAlbum","grouped_id","getMidsByMessage","albumText","getAlbumText","poll","question","game","extended_media","actionWrapped","restriction_reason","exec","messageWrapped","noLinks","noTextFormat","wrapPeerTitle","wrapPhoto","withTail","noThumb","blurAfter","isImageFromDocument","startsWith","isWebDoc","isFit","renderOnLoad","canAttachPreloader","haveToDownload","onlyCache","getDownloadPromise","wrapSenderToPeer","senderTitle","fromMe","wrapSentTime","STICKER_EFFECT_MULTIPLIER","locksUrls","videosCache","wrapSticker","loadStickerMiddleware","exportLoad","needUpscale","skipRatio","asStatic","fullThumb","noPremium","isCustomEmoji","syncedVideo","stickerType","emojiSticker","animatedSticker","staticSticker","isAnimated","getStickerEffectThumb","willHaveLock","lockUrl","toneIndex","isThumbNeededForType","lottieCachedThumb","getLottieCachedThumb","haveThumbCached","afterRender","num","getPathFromBytes","getPreviewURLFromThumb","stickerThumbConverted","webpWorkerController","saveWebPConvertedStrippedThumb","getImageFromStrippedThumb","middlewareError","animationData","sync","setLockColor","dpr","skipx","skipy","imageData","sr","sg","sb","sa","outCanvas","outContext","computeLockColor","saveLottiePreview","onFirstFrame","preloadAnimatedEmojiStickerAnimation","isSingleVideo","cacheName","framesCache","cachePromise","previousTime","playedTimes","onTimeupdate","mediaLength","lastPromise","_media","preloadSticker","playing","animationDiv","stickerPromise","side","attachStickerEffectHandler","onEmojiStickerClick","getAnimatedEmojiSoundDocument","restart","getAnimatedEmojiSticker","emojiData","sendInteractionThrottled","msg_id","interaction","JSON","stringify","withRandomOffset","wrapStickerAnimation","unmountAnimation","frameNo","maxFrame","vibrate","generateRandomSigned","randomOffsetX","randomOffsetY","setPosition","factor","stableOffsetX","stableOffsetY","rectX","rectY","addOffsetX","addOffsetY","wrapStickerEmoji","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","videos","getDocPromise","thumb_document_id","wrapStickerToRow","previousMedia","_size","wrapTopicNameButton","roundVideoCircumference","wrapVideo","videoSize","noAutoplayAttribute","isAlbumItem","canAutoplay","spanTime","spanPlay","needPlayButton","photoRes","divRound","halfSize","radius","strokeDashoffset","globalVideo","onPaused","onFrame","renderDeferred","loadPhotoThumbFunc","wrapWebPageDescription","shortDescriptionText","wrapWebPageTitle","shortTitle","site_name","EmojiVersions","Emoji","version","FontFamily","FontSize","FontWeight","instances","getAnimationInstance","cancelAnimationByKey","instance","isCancelled","animateSingle","tick","createAnimationInstance","array","AudioAssetPlayer","assets","playSound","assetName","createAudio","playSoundIfDifferent","Audio","stopSound","cancelDelayedPlay","playSoundWithTimeout","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","possiblePromise","process","realResult","timedChunk","requireBlurPromise","fastBlurFunc","processBlurNext","default","dataUri","JPEG_HEADER","bytesFromHex","JPEG_TAIL","isSticker","btoa","bytesToDataURL","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","getTextWidth","measureText","quality","badCharsRe","trimRe","C2L","clearBadCharsAndTrim","latinize","processSearchText","clearBadChars","ignoreCase","hasTag","includeTag","charAt","originalText","ch","latinizeCh","latinizeString","fixCyrillic","fallbackCopyTextToClipboard","textArea","removeChild","copyTextToClipboard","clipboard","writeText","ContextMenuController","diffX","diffY","isOpened","openBtnMenu","months","days","ONE_DAY","getWeekNumber","UTC","getMonth","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","formatDateAccordingToTodayNew","weekday","formatFullSentTimeRaw","formatTime","capitalize","textTransform","formatFullSentTime","getFullDate","joiner","monthAsNumber","getHours","getMinutes","noSeconds","leadingZero","noTime","minYear","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","setFullYear","dayOfWeek","formatWeekLong","getDay","getDayOfWeek","setTime","g1","g2","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","T_ME","copyWhat","copyText","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","onCancel","onStart","onMove","isTouch","onTouchEnd","CLICK_EVENT_NAME","touchMouseDown","detachClickEvent","simulateClickEvent","ControlsHover","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","toggleControls","relatedTarget","createContextMenu","findElement","filterButtons","onBeforeOpen","initResult","verifyFavoriteSticker","toAdd","favedStickers","_doc","disablePictureInPicture","computedStyle","getProperty","simulateEvent","childNodes","tag","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getCaretPosF","childNodesLength","alt","markdownTags","entityName","underline","italic","monospace","strikethrough","mentionName","BLOCK_TAGS","BOM_REG_EXP","checkNodeForEntity","follow","getRichElementValue","selNode","selOffset","isBlock","isTableCell","wasEntitiesLength","wasLength","field","withEntities","withCaret","DocumentFragment","startOffset","startContainer","possibleChildrenFocusOffset","getCaretPos","caretPos","getViewportSlice","overflowRect","extraSize","invisibleTop","invisibleBottom","foundVisible","lookForSticky","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","windowWidth","windowHeight","handleHorizontalSwipe","cancelY","template","isSendShortcutPressed","isComposing","secondaryKey","isSwipingBackSafari","TouchEvent","placeCaretAtEnd","ignoreTouchCheck","selectionStart","selectionEnd","prevPos","backgroundImage","useCache","isImage","renderImageFromUrlPromise","renderMediaWithFadeIn","compareNodes","node1","node1Offset","node2","node2Offset","parents","commonAncestorContainer","NOT_ONLY_BOMS_REG_EXP","USING_BOMS","RichInputHandler","saveSelectionOnChange","saveRangeForElement","onFocusOut","lastNode","lastOffset","onSelectionChange","setSelectionClassName","caret","getCaretPosN","superMove","modify","getFiller","addInputCallback","processEmptiedFillers","fixInsertedLineBreaks","moveFirst","setEnd","isBOM","deleteData","processFilledFillers","removeEmptyTextNodes","fixBuggedCaret","savedRanges","IS_FIREFOX","inputCaptureCallbacks","anchorNode","findPreviousSmthIndex","something","fromSelectionChange","smthIndex","moved","idxidx","rangeString","onlyBOMs","restoreSavedRange","makeFocused","newCallback","needed","treeWalker","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","textNode","nextNode","removePossibleBOMSiblings","removePossibleBOMSiblingsByNode","cleanSiblings","insertData","bomNode","intersectsNode","focusNode","focusNodeBefore","focusOffset","focusOffsetBefore","collapseToStart","collapseToEnd","focusNodeAfter","focusOffsetAfter","prepareApplyingMarkdown","fillers","smths","INSTANCE","countNonElements","DropdownHover","onClickOut","ignoreButtons","ignoreMouseOut","toElement","willBeActive","inited","timeouts","attachButtonListener","setIgnoreMouseOut","onmouseout","onmouseover","FocusDirection","fastSmoothScroll","maxDistance","Static","scrollWithJs","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","elementScrollSizeKey","scrollPositionKey","possibleElementPosition","containerSize","scrollSize","fallbackToElementStartWhenCentering","remainingPath","absPath","startAt","shortTransition","longTransition","currentPath","distanceToEnd","FILENAME_JOINER","getFileNameByLocation","thumb_size","big","stickerset","short_name","thumb_version","volume_id","local_id","strictDecimals","_decimals","dm","fixed","pow","parseFloat","CALL_DURATION_LANG_KEYS","mm","showLast","dd","formatDuration","strings","prefixes","maxPrefixLength","setPrefix","originalStr","prefixCountry","patterns","searchForPattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","FramesCache","framesNew","framesURLs","getCache","createCache","releaseCache","getCacheCounter","generateName","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","tl","tr","bl","useBlur","ignoreCache","ListLoader","loadedAllDown","setLoaded","unsetCurrent","toPrevious","goUnsafe","leftLength","down","loadPromiseDown","loadPromiseUp","processedArr","processed","ListenerSetter","listeners","addManual","onceCallback","onceFired","_listener","MediaSize","aspect","aspectCovered","makeMediaSize","ScreenSize","CUSTOM_EMOJI_SIZE","ESG_CUSTOM_EMOJI_SIZE","EMOJI_STATUS_SIZE","MediaSizes","screenSizes","mobile","medium","large","handhelds","regular","album","esgSticker","documentName","invoice","extendedInvoice","customEmoji","esgCustomEmoji","popupSticker","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","throwWhat","numberThousandSplitter","HAVE_METADATA","useCanplayOnIos","loadEventName","errorEventName","OverlayClickHandler","withOverlay","amount","skipSymbol","isNegative","currencyData","amountExp","exp","number","dec_point","thousands_sep","isFinite","prec","sep","dec","toFixedFix","number_format","decimal_sep","space_between","symbol_left","splitter","additionalPadding","getScrollWidthFromElement","menuWidth","menuHeight","paddingRight","paddingBottom","paddingLeft","verticalSide","maxTop","maxLeft","minLeft","sides","intermediateX","intermediateY","possibleSides","platforms","getRestrictionReason","reasons","reason","savingLottiePreview","isSavingLottiePreview","saving","throttleWithRaf","fn","schedulerFn","waiting","throttleWith","ScrollableLoader","SearchListLoader","messageId","generateMessageId","filterMids","onHistoryDelete","shouldBeDeleted","onHistoryMultiappend","onMessageSent","isInner","otherSideLoader","filterMessagesByInputFilterFromStorage","goToOtherEnd","do","kind","scheduleFlush","measure","mutate","mutateElement","read","write","pushDocumentSize","_isWebDocument","replies","comments","channel_id","BatchProcessor","bindPrefix","queuePromise","addToQueue","setQueue","possibleError","perf","renderedQueue","SortedList","batchProcessor","_updateList","canUpdate","createPromise","noScheduler","encodeEntities","charCodeAt","limitFrom","leadZero","sec_num","hours","minutes","seconds","textToSvgURL","Blob","reader","FileReader","readAsDataURL","visualViewport","innerHeight","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","_heavyAnimationPromise","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","DialogsContextMenu","onArchiveClick","editPeerFolders","folder_id","hideTopic","toggleTopic","onPinClick","toggleDialogPin","config","getConfig","pinned_dialogs_count_max","onUnmuteClick","onUnreadClick","unread_count","readHistory","top_message","markDialogUnread","onContextMenu","getDialogOrTopic","getDeleteButtonText","isDialogUnread","pinned","ConnectionStatusComponent","hadConnect","connecting","timedOut","updating","setConnectionStatus","overrideStatus","baseDcId","connectionStatus","setFirstConnectionTimeout","online","apiUpdatesManager","forceGetDifference","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","singleInstance","CHANGE_STATE_DELAY","getA","networkerFactory","forceReconnect","timerSpan","interval","forceReconnectTimeout","setStateTimeout","statusContainer","SENDING_STATUS","easeInOutSine","easeInOutSineApply","roundRect","defaultRadius","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","DPR","SIZE","MARGIN","WIDTH","RADIUS","Shimmer","currTime","diffTime","spread","pausedTime","pauseInterval","lightSource","lightSpread","currentAnimationIndex","keepTime","cycleAnimation","currentAnimation","animateGlow","animateSlide","smartInc","lightLeft","lightRight","lightCenter","createLinearGradient","customProperties","shimmerColor","addColorStop","dict","on","fillText","DialogsPlaceholder","onThemeChange","stopAnimation","startAnimation","updateCanvasSize","shimmer","generatedValues","marginVertical","totalHeight","lineHeight","lineBorderRadius","lineMarginVertical","statusWidth","getRectFrom","onRemove","blockScrollable","overflowY","availableLength","detachTime","renderDetachAnimationFrame","globalCompositeOperation","completed","elapsedRowTime","dialogHeight","renderFrame","createPattern","patternCanvas","patternContext","drawChat","firstLineWidth","secondLineWidth","marginLeft","arc","drawCircle","drawCircleFromStart","shake","keyframes","setPromiseMiddleware","oldPromise","SortedDialogList","getDialogIndex","forumPeerId","indexKey","addListDialog","isBatch","isMainList","DialogElement","bigger","abitbigger","small","captionDiv","titleSpanContainer","peerTitlePromise","statusSpan","lastTimeSpan","rightSpan","dialogDom","setDialogActive","forumTab","createUnreadBadge","unreadBadge","badge","createUnreadAvatarBadge","unreadAvatarBadge","createMentionsBadge","mentionsBadge","toggleBadgeByKey","hasBadge","justCreated","ForumTab","init2","isFloating","toggleForumTab","createChatList","setListClickListener","xd","Some3","bindScrollable","getOptionsForMessages","fullReset","subscribeToChannelUpdates","unsubscribeFromChannelUpdates","setStatusPromise","noTyping","onChatsScroll","loadResult","setStatus","NOT_IMPLEMENTED_ERROR","Some","onChatsRegularScroll","sliceTimeout","processContact","scrollTopWas","rectContainer","rectTarget","firstY","lastY","firstElement","elementFromPoint","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialogByKey","getDialogKeyFromElement","setOffsets","offsets","getOffsetIndex","isDialogMustBeInViewport","topOffset","bottomOffset","setIndexKey","deleteDialog","getDialogKey","updateDialog","loadedDialogsAtLeastOnce","getDialogElement","setLastMessageN","setUnread","onChatsScrollTop","loadDialogs","createPlaceholder","placeholderOptions","getRectFromForPlaceholder","loadDialogsPromise","loadDialogsRenderPromise","cachedInfoPromise","chatList","getConversationsResult","loadDialogsInner","needPlaceholderAtFirstTime","isTopEnd","offsetDialog","firstDialog","lastDialog","getDialogFromElement","getDialogDom","oldTypingElement","newTypingElement","unsetTyping","paddingX","typings","topics","setUnreadMessagesN","drop","sidebarRect","currentOffsetIndex","needIndex","Some2","getUserStatus","setOnlineStatus","processDialogForCallStatus","validateDialogForFilter","getCachedDialogs","validateListForFilter","folders","doNotRenderChatList","hasClassName","generateScrollable","getDialogIndexKey","sortedDialogList","testDialogForFilter","migratedTo","setCallStatus","callIcon","START_X","wasMounted","itemProgress","groupCallActiveIcon","call_active","call_not_empty","loadContacts","toggleAvatarUnreadBadges","sortedDialog","reuseClassNames","unreadContent","isUnreadAvatarBadgeMounted","unreadAvatarBadgeClassList","unreadBadgeClassList","AppDialogsManager","Log","menuScrollContainer","lastActiveElements","initedListeners","xds","onTabChange","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","dialogSize","verifyPeerIdForContacts","getProxiedManagers","stateMiddlewareHelper","bottomPart","forumsTabs","forumsSlider","allChatsIntlElement","isFilterIdAvailable","clearCurrent","showFiltersPromise","onStateLoaded","setFilterId","addFilter","foldersScrollable","_id","filtersNavigationItem","setFilterIdAndChangeTab","changeFiltersAllChatsKey","groupCallsController","callsController","initListeners","setFiltersUnreadCount","setFilterUnreadCount","elementThreadId","elementPeerId","onFiltersLengthChange","containerToAppend","getDialogIndexKeyByFilterId","renderedFilter","filtersArr","haveFilters","addFilters","addFiltersPromise","getNotifyPeerTypeSettings","fillConversations","unreadSpan","unread","unreadUnmutedCount","unreadCount","getFolderUnreadCount","wasShowing","generateEmptyPlaceholder","classNameType","subtitleArgs","placeholderContainer","needPlaceholder","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","newTab","hideTab","forumNavigationItem","toggleForumTabByPeerId","lastTab","isSameTab","withContext","openInner","lastActiveListElement","setPeerFunc","sameElement","setLastMessage","draftMessage","draft","topMessage","isMessageRestricted","willPrepend","videoTypes","playIcon","replyTo","forum_topic","setUnreadMessages","isDialogPinned","getForumUnreadCount","isPinned","unreadTopicsCount","wasMuted","setStatusMessage","read_inbox_max_id","hasUnreadBadge","hasUnreadAvatarBadge","transitionDuration","disableAnimationIfRippleFound","iconClassName","setSendingStatus","isUnreadBadgeMounted","hasMentionsBadge","unread_mentions_count","isMentionsBadgeMounted","isBadgeMounted","unreadBadgeText","isUnread","isMention","notVisited","getDialog","originalDialog","getOutputPeer","addDialogNew","addDialogAndSetLastMessage","getMessageSenderPeerIdOrName","downloads","getNewDeferred","cancelDownload","clearDownload","getNewDeferredForUpload","getUpload","getDownload","getUploadPromise","getDownloadFileNameFromOptions","downloadMedia","promiseBefore","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","getFileNameForUpload","downloadToDisc","justAttach","pingPromise","iframe","hadProgress","getDocumentDownloadOptions","getPhotoDownloadOptions","clickEvent","createEvent","initMouseEvent","createDownloadAnchor","revokeObjectURL","BubbleGroup","avatarLoadPromise","avatarContainer","fwdFrom","fwdFromId","isForwardFromChannel","from_id","currentPeerId","firstTimestamp","firstItem","firstMid","lastTimestamp","lastItem","lastMid","updateClassNames","insertItem","insertInDescendSortedArray","sortGroupItemsKey","insertGroup","mount","onItemUnmount","mountItem","onItemMount","unmountItem","dateContainer","getDateContainerByTimestamp","dateGroups","_group","dateGroupsLength","unmountedLength","STICKY_OFFSET","deleteEmptyDateGroups","BubbleGroups","itemsArr","itemsMap","newGroupDiff","sortItemsKey","sortGroupsKey","removeItemFromCache","removeAndUnmountBubble","getItemByBubble","getSiblingsAtIndex","modifiedGroups","canItemsBeGrouped","groupUngrouped","mountUnmountGroups","toMount","toUnmount","bad","partition","getLastGroup","changeBubbleMid","insertItemToArray","changeItemBubble","changeBubbleByBubble","item1","item2","isAllMessagesForum","itemIndex","findGroupSiblingByItem","findGroupSiblingInItems","previousItem","siblingGroupedItem","nextItem","addItemToGroup","addItemToCache","getMessageFromId","viaBotId","createItem","SERVICE_AS_REGULAR","getDateForDateContainer","groupMid","splitSiblingsOnGrouping","prepareForGrouping","hadGroup","foundItem","splittedGroups","PopupDatePicker","initDate","onPick","noButtons","selectedDate","selectedMonth","minMonth","prevBtn","maxMonth","onDateClick","selectedEl","setTimeTitle","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","setMinutes","popupCenterer","timeOptions","sendDate","dateOptions","renderElement","firstDate","weekStartDate","dayIndex","clonedDate","showOverflowMonths","remainder","DivAndCaption","MEDIA_SIZE","wrapReplyDivAndCaption","mediaEl","messageMedia","isRound","mediaChildren","video_thumbs","ReplyContainer","isMediaSet","wrapReply","setColorPeerId","replyContainer","StackedAvatars","AVATAR_CLASS_NAME","RepliesElement","updated","postKey","leftPart","recent_repliers","stackedAvatars","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","chatType","editedSpan","sponsoredSpan","isSponsored","sponsored","isMessage","views","postAuthor","post_author","postViewsSpan","channelViews","edit_date","edit_hide","timeSpan","clonedArgs","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","replyToPeerId","originalMessage","originalPeerTitle","titlePeerId","originalMessageFwdFromId","needUpdate","replyMid","getElementByPoint","horizontalSide","reflowScrollableElement","SEND_WHEN_ONLINE_TIMESTAMP","INTERNAL_LINK_TYPE","PopupJoinChatInvite","chatInvite","request_needed","importChatInvite","savePhoto","peopleCount","ReactionElement","reactionCount","_reactionCount","setCanRenderAvatars","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","callbackify","center_icon","renderDoc","wrapPromise","wrapStickerPromise","renderCounter","displayOn","renderAvatars","recentReactions","peer_id","setIsChosen","isChosen","chosen_order","fireAroundAnimation","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","removeOnFrame","REACTIONS_ELEMENTS","ReactionsElement","middlewareHelpers","onConnectCallback","getReactionCount","reactionElement","getMessage","isPlaceholder","changeMessage","changedResults","hasReactions","counts","reactionsEqual","totalReactions","can_see_list","recent_reactions","handleChangedResults","ScrollSaver","getSaved","findElements","replaceSaved","findAndSetElements","_save","scrollHeightMinusTop","onRestore","useReflow","setScrollTop","newScrollTop","restore","_restore","previousScrollHeightMinusTop","SuperIntersectionObserver","observing","observingQueue","freezedObservingNew","toggleObservingNew","isMentionUnread","mentioned","accumulate","stringResults","numberResults","replaceNonNumber","CARD_BRAND_REGEXP","visa","mastercard","amex","discover","diners","diners14","jcb","unionpay","elo","mir","CARD_BRANDS","minLength","cvcMaxLength","cvcMinLength","unknown","detectCardBrand","card","sanitizedCard","brand","detectUnifiedCardBrand","createArray","delta","buggedRegExp","getDistanceFromBuggedToNormal","char","fixBuggedNumbers","makeOptionalCharacter","consumed","makeRequiredCharacter","partial","wrapCharacterRegExpFactory","optional","_regExp","source","makeCharacter","makeMonthDigitPatternCharacter","digit","capitalCharacter","cleanedResult","formattingCharacter","str1","makeFormattingCharacter","optionalPattern","spaceCharacter","yearOptionalPattern","sixteenPattern","fifteenPattern","requiredPostcodes","generateFourPattern","cardFormattingPatterns","cardNumber","cardExpiry","cardCvc","cardCvcFromBrand","postalCodeFromCountry","optionalDigits","accumulateLengths","strs","nbspRegExp","makeValidationError","validateCardNumber","sanitized","getCardInfoByNumber","ignoreIncomplete","validateCompleteCardNumber","makeCardNumberError","validateCardExpiry","monthStr","yearStr","_year","nextMonth","isNaN","validateExpiry","parse","TelegramWebView","sandbox","onTelegramWebViewEvent","eventType","eventData","onMount","contentWindow","createVerificationIframe","allow","PopupPaymentVerification","openPathAfter","telegramWebView","path_full","InputFieldCorrected","lastKeyDown","deleting","lastTransformed","getPattern","pushRest","autocorrectComplete","character","getCharacter","meta","formatInputValueByPattern","formatMethod","transformedValue","validateNew","onBlur","justReturn","validateMethod","validateAnyIncomplete","errorKeys","handleInputFieldsOnChange","_onChange","createCountryZipFields","zip","countryInputField","postcodeInputField","SUPPORTED_NATIVE_PROVIDERS","PopupPaymentCard","paymentForm","savedCard","native_provider","cardOut","token","credentials","can_save_credentials","cardSection","nativeParams","native_params","lastBrand","lastBrandImg","brandIconTempId","cardInputField","invalid","incomplete","transformed","getPaymentBrandIconPath","setBrandIcon","cvcInputField","need_cardholder_name","expireInputField","switchFocusOrder","previousInputField","nextInputField","inputFieldsRow","billingSection","need_country","need_zip","canSave","saveCheckboxField","saveRow","payButton","PaymentButton","expiryFull","expiryMonth","expiryYear","cvc","cardholderName","nativeProvider","URLSearchParams","headers","publishable_key","expiration_month","expiration_year","security_code","public_token","PopupPaymentCardConfirmation","inputCheckPassword","getInputCheckPassword","tmpPassword","password","handled","PopupPaymentShipping","inputInvoice","savedInfo","saved_info","addressSection","address1InputField","address2InputField","cityInputField","stateInputField","receiverSection","emailInputField","shipping_address_requested","name_requested","email_requested","phone_requested","validateEmail","validatePhone","selectedCountry","shipping_address","street_line1","street_line2","city","country_iso2","post_code","requestedInfo","validateRequestedInfo","shippingAddress","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_CITY_INVALID","ADDRESS_STATE_INVALID","ADDRESS_POSTCODE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_EMAIL_INVALID","REQ_INFO_PHONE_INVALID","focusField","PopupPaymentShippingMethods","shippingOption","shipping_options","prices","lastShippingId","option","PopupPayment","isReceipt","tipButtonsMap","confirmed","onConfirmed","popupPaymentVerification","mediaInvoice","receipt_msg_id","isTest","itemEl","detailsClassName","photoEl","linesClassName","linesEl","botName","preloaderContainer","getPaymentReceipt","getPaymentForm","savedCredentials","saved_credentials","lastRequestedInfo","providerPeerTitle","provider_id","bot_id","wrapAmount","isRecurring","recurring","peerTitle2","makeLabel","pricesClassName","makePricesElements","price","_label","wrappedAmount","pricesElements","getTipsAmount","shippingAmount","setTotal","totalAmount","totalLabel","payI18n","canTip","max_tip_amount","tip_amount","tipsClassName","getInputValue","setInputWidth","setInputValue","unsetActiveTip","tipEl","tipsLabel","haveToIgnoreEvents","ignoreNextSelectionChange","tipsEl","tipClassName","tipButtons","suggested_tip_amounts","tipAmount","prevTipEl","setRowIcon","setRowTitle","setCardSubtitle","methodRow","onMethodClick","previousCardDetails","previousToken","credentials_title","providerRow","providerAvatar","shippingAddressRow","shippingNameRow","shippingEmailRow","shippingPhoneRow","shippingMethodRow","lastShippingOption","onShippingAddressClick","onShippingMethodClick","setShippingTitle","postAddress","setShippingInfo","setShippingOption","scrollSaver","lastShippingPricesElements","shipping","acceptTermsCheckboxField","recurring_terms_url","acceptTermsRow","recurringElements","lastTmpPasword","missingInfo","tmp_password","paymentResult","sendPaymentForm","form_id","_passwordState","valid_until","tsNow","Layouter","minWidth","spacing","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","ComplexLayouter","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","RectPart","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","cropRatios","attempts","multiHeight","sum","pushAttempt","lineCounts","heights","second","third","fourth","optimalAttempt","optimalDiff","attempt","lineCount","minLineHeight","bad1","bad2","optimalCounts","optimalHeights","rowCount","colCount","col","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","DotRenderer","dots","generateDot","adding","Path2D","mOpacity","draw","dot","addOpacity","easedOpacity","globalAlpha","renderFirstFrame","dotRenderer","wrapMediaSpoiler","wrapAlbum","attachmentDiv","uploading","containerHeight","hasSpoiler","itemWidth","itemHeight","AppPollResultsTab","resultsDiv","appPollsManager","getPoll","quiz","voters","total_voters","roundPercents","answer","answers","answerEl","answerTitle","answerPercents","getVotes","votesList","votes","vote","lineTotalLength","minIndex","minRemainder","maxRemainder","pollElement","isClosed","performResults","chosenIndexes","PollElement","setMaxLength","resizePolls","hideQuizHint","onHide","prevQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","isListenerSet","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","circumference","closeTime","quizInterval","timeLeft","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","initQuizHint","solution","solution_entities","toggleHint","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","getPercentValue","iterate","fullTime","votersCount","justRtlDirCheck","IGNORE_ACTIONS","TEST_SCROLL_TIMES","TEST_SCROLL","PEER_CHANGED_ERROR","BIG_EMOJI_SIZES","BIG_EMOJI_SIZES_LENGTH","getMainMidForGrouped","ChatBubbles","unreadOut","bubblesNewByGroupedId","bubblesNew","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","messagesQueueOnRenderAdditional","firstUnreadBubble","followStack","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","renderingMessages","bubblesToEject","bubblesToReplace","setPeerTempId","renderNewPromises","extendedMediaMessages","unreadedObserverCallback","onUnreadedInViewport","viewsObserverCallback","sendViewCountersDebounced","sponsoredMessage","randomId","random_id","viewSponsoredMessage","stickerEffectObserverCallback","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getGroupsFirstMessage","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","setInnerPeer","chatInner","onDatePick","mediaSpoiler","contactDiv","callDiv","callUser","getInputInvoiceByPeerId","reactionsElement","stickerEmojiEl","bubbleMid","reply_to_top_id","saved_from_msg_id","openThread","message1","getMessageWithReplies","getDiscussionMessage","via","setDraft","peerIdStr","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","hasAspecter","albumItem","isReplyClick","replyToMid","reply_to_msg_id","scrollDimensions","forceDown","sliceViewportDebounced","setCorrectIndexThrottled","setStickyDateManually","setPeerPromise","processBatch","loadQueue","filterQueue","avatarPromises","groupBubbles","updatePosition","timePromises","groupCollapsed","groupEnd","setUnreadDelimiter","restoreScroll","prepareToSaveScroll","ejectBubbles","oldBubble","bubbleGroups","updatePlaceholderPosition","requestHistory","setMessageId","constructBubbles","sequential","messagesStorageKey","messagesQueuePromise","newItem","_items","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","_bubble","groupedId","getMessagesByAlbum","reactionsElements","repliesElement","newDiv","safeRenderMessage","scrollToBubbleIfLast","deletedMids","wasMainMid","mainMid","createScrollSaver","appendReactionsElementToBubble","dateMessage","dateBubble","previousStickyDate","sliceViewport","setScroll","attachContainerListeners","highlightBubble","replyAfter","shouldReply","canSend","_target","initMessageReply","constructPeerHelpers","updateGradient","setUnreadCount","updateUnreadByDialog","finishPeerChange","reloadMessages","toDelete","postViewsElements","different","postViews","incrementMessageViews","getScheduledMessagesStorage","createResizeObserver","resizeObserver","wasHeight","skip","scrolled","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","destroyResizeObserver","setReactionsHoverListeners","getRenderedLength","readUnreaded","readPromise","idleController","bubblesMaxId","getHistoryMaxId","readContents","onGoDownClick","getBubbleByPoint","getGroupedBubble","groupId","getMidsByAlbum","findNextMountedBubbleByMsgId","filterCallback","_mid","foundMid","loadMoreHistory","getHistoryTopPromise","getHistoryBottomPromise","getHistory1","destroyScrollable","getHistoryStorage","readMaxId","readOutboxMaxId","msgId","destroyBubble","permanent","ignoreOnScroll","pollExtendedMediaMessages","getExtendedMedia","setExtendedMediaMessagesPollInterval","pollExtendedMediaMessagesPromise","setTopPadding","setPaddingTo","isPaddingNeeded","unsetPadding","newMessage","getLastBubble","performHistoryResult","scrollToBubbleEnd","scrollToBubble","isChangingHeight","messageInput","dimensions","datasetKey","createDateBubble","bubbleContent","serviceMsg","fakeBubble","bubblesToo","cleanupPlaceholders","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","attachPlaceholderOnRender","emptyPlaceholderBubble","samePeer","stack","startParam","onChangePeer","getPinnedMessagesMaxId","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","foundSlice","findSliceOffset","isJump","isStartButtonNeeded","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","oldChatInner","oldPlaceholderBubble","haveToScrollToBubble","fromUp","scrollFromDown","scrollFromUp","willScrollOnLoad","setPeerOptions","waitPromise","setPeerCached","mountedByLastMsgId","isPinnedMessagesNeeded","setCorrectIndex","lastBubble","onRenderScrollSet","afterSetPromise","setFetchReactionsInterval","setFetchHistoryInterval","onScrolledAllDown","isForumTopic","unread_mark","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","historyMaxId","canWrite","renderMessagesQueue","isAvatarNeeded","additionalCallback","processResult","newBubble","originalPromise","renderMessage","albumMids","reactionsMessage","albumMessages","albumMustBeRenderedFull","our","isOurMessage","contentWrapper","isInUnread","ignoreAction","chat_id","is_single","messageMessage","needToSetHTML","bigEmojis","emojiEntities","strLength","curr","richText","canHaveTail","isStandaloneMedia","haveRTLChar","topicNameButtonContainer","replyMarkup","reply_markup","replyMarkupRows","containerDiv","rowDiv","buttonEl","botId","same_peer","checkSwitchReturn","switchInlineQuery","haveButtons","column","callbackButtonClick","callbackAnswer","messageWithReplies","getMessageWithCommentReplies","withReplies","isOutMessage","nameContainer","canHideNameIfMedia","isMessageEmpty","viewButton","processingWebPage","telegram_channel","telegram_megagroup","makeViewButton","quote","previewResizer","preview","quoteTextDiv","strong","titleDiv","textDiv","isSquare","isEmoji","nopremium","newNameContainer","richTextFragment","getMidsByMid","wrapGroupedDocuments","lastContainer","contact","contactDetails","contactNameDiv","contactNumberDiv","phone_number","wrapPoll","extendedMedia","isAlreadyPaid","isNotPaid","innerMedia","wrappedPrice","priceEl","video_duration","videoTime","dc_id","file_reference","before","needName","titleVia","mustHaveName","isHidden","isForward","goto","generateTail","documentContainer","documentMessageDiv","viewportSlice","deleteViewportSlice","historyResult","needReflowScroll","setLoadedPromises","firstSlice","lastSlice","both","processLocalMessageRender","ackedResult","getScheduledMessages","animateAsLadder","additionMsgIds","isAdditionRender","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","lastMsDelay","elementsToAnimate","transitionDelay","topRes","middleRes","bottomRes","delays","renderEmptyPlaceholder","listElements","getRestrictionReasonText","getGreetingSticker","channel_post","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","isWaitingForAnimation","noTransition","setOn","generateLocalMessageId","addOffset","generateLocalFirstMessage","service","saveMessages","ignoreScrollSaving","invisible","checkPlaceholders","toggleSponsoredMessage","renderBotPlaceholder","checkIfEmptyPlaceholderNeeded","getSponsoredMessage","sponsoredMessages","messagePromise","_log","getProfile","processPromise","bot_info","botInfo","description_document","description_photo","isBackLimit","resultPromise","isFirstMessageRender","serviceStartMessageId","getThreadServiceMessageId","sup","_promise","mustBeCount","PopupPinMessage","unpin","canUnpin","canPinMessage","oneSide","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","getPinnedMessagesCount","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","preloadAnimatedEmojiSticker","PopupReportMessagesConfirm","reportMessages","STICKER_EMOJI","PopupReportMessages","preloadStickerPromise","marginTop","PopupSponsored","PopupReactedList","canViewReadParticipants","canViewMessageReadParticipants","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTION_CLASS_NAME","REACTIONS_CLASS_NAME","CAN_USE_TRANSFORM","ChatReactionsMenu","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","renderReaction","setVisible","canUseAnimations","scaleContainer","appearWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","ChatContextMenu","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","viewerPeerId","canOpenReactedList","linkToMessage","getUrlToMessage","selectedMessagesText","getSelectedMessagesText","menuPadding","reactionsMenu","reactionsMenuPosition","isReactionsMenuVisible","offsetSize","nextVisiblePart","MIN_NEXT_VISIBLE_PART","minSize","onSendScheduledClick","onReplyClick","onFaveStickerClick","unfave","faveSticker","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","setButtons","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","getMessageFromStorage","canSaveMessageMedia","isGoodType","hasTarget","localName","emojiInputsPromise","getUniqueCustomEmojisFromMessage","filterUnique","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","AVATAR_SIZE","MAX_AVATARS","PADDING_PER_AVATAR","reactionsCount","fakeElem","readParticipants","totalSize","emojisButton","setPadding","inputsPromise","getCachedCustomEmojiDocuments","getCustomEmojiDocuments","threadMessage","SendMenu","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","setPeerId","PopupCreatePoll","onSubmitClick","send","radioLabel","isEmpty","questions","appendMoreField","correctAnswers","optionInputFields","questionInputField","sendSilent","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","getFilledAnswers","quizSolution","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","sendOther","getMessageSendingParams","helperType","clearHelper","questionField","createPosterFromMedia","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","PopupNewMedia","willAttachType","attachFile","willAttach","shouldCompress","itemDiv","attachMedia","attachDocument","sendFileDetails","captionLengthMax","caption_length_max","wasInputValue","messageInputField","attachFiles","appendDrops","appendGroupCheckboxField","groupCheckboxField","mediaCheckboxField","appendMediaCheckboxField","addFiles","toPush","_file","lastModified","isMedia","sendingParams","sendText","sendAlbum","replyToMsgId","objectURL","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onseeked","onerror","createPosterFromVideo","isPhoto","isAudio","finish","onRender","foundPhotos","foundVideos","foundFiles","appendMediaToContainer","firstType","albumContainer","HANDLE_EVENT","ACTIVE_CLASS_NAME","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","hadTarget","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","AutocompleteHelper","onVisible","listType","attachNavigation","controller","addHelper","toggleListNavigation","fromController","skipAnimation","hideOtherHelpers","StickersHelper","onChangeScreen","checkEmoticon","getStickersByEmoticon","getMinDate","getMaxDate","PopupSchedule","canSendWhenOnline","btnSendWhenOnline","EmojiHelper","chatInput","onEmojiSelected","checkQuery","firstChar","getBothEmojiKeywords","searchEmojis","AutocompletePeerHelper","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","commands","command","indexObject","CommandsHelper","getReadyToSend","sendMessage","AutocompleteHelperController","preserveHelper","MentionsHelper","insertAtCaret","topMsgId","trimmed","getMentions","ReplyKeyboard","onBodyTouchStart","btnHover","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","getHistoryStorageTransferable","InlineHelper","queryId","queryAndResultIds","generateQId","resultId","sendInlineResult","_checkQuery","botResults","query_id","gifsMasonry","isGallery","gallery","noCommands","dcId","dataURL","switch_pm","btnSwitchToPM","switchToPM","ChatBotCommands","setUserId","modifyAckedResult","acked","modifyAckedPromise","ChatSendAs","sendAsButtons","previousAvatar","onSendAsMenuToggle","updateButtons","sendAsPeerId","changeSendAsPeerId","executeButtonsUpdate","sendAsPeerIds","saveDefaultSendAs","updateAvatar","getDefaultSendAs","getChannelFull","channelFull","default_send_as","updateManual","updatingPromise","wasSkippingAnimation","auto","getSendAs","sendAsPeers","sendAsPeer","premium_required","addedListener","USELESS_REG_EXP","InputFieldAnimated","updateInnerHTML","onFakeInput","inputFake","setHeight","currentHeight","hasMarkupInSelection","commonAncestor","SHOW_ELEMENT","POSTING_MEDIA_NOT_ALLOWED","ChatInput","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","onMessageInput","markdownEntities","parseMarkdown","urlEntities","getWebPagePromise","appWebPagesManager","getWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","resetCurrentFontFormatting","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","onBtnSendClick","forwarding","restricted","voice_messages_forbidden","releaseMediaPlayback","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","ms","recordTimeEl","needReturn","getCurrentInputAsDraft","no_webpage","draftsAreEqual","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","canToggleHideAuthor","onHideCaptionClick","forwardButtons","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","attachMenuButtons","fileInput","attachMenu","attachMenuBots","appAttachMenuBotsManager","getAttachMenuBots","attachMenuBotsButtons","attachMenuBot","getAttachMenuBotIcon","requestWebView","webViewResultUrl","SANDBOX_ATTRIBUTES","P","verifyMap","attachMenuPeerTypeSameBotPM","attachMenuPeerTypeBotPM","attachMenuPeerTypePM","attachMenuPeerTypeChat","attachMenuPeerTypeBroadcast","peer_types","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","onstop","ondataavailable","typedArray","dataBlob","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","startBot","pinnedControlBtn","originalChat","pinnedMessageContainer","_center","neededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","getNeededFakeContainer","hasMentions","syncDraft","helperToo","clearInput","fromUpdate","getDraft","wrappedDraft","myEntities","apiEntities","wrapDraft","currentDraft","createSendAs","firstChange","sendAs","updateOffset","getPlaceholderKey","updateMessageInputPlaceholder","previousSendAs","ackedPeerFull","ackedScheduledMids","setSendAsCallback","filteredAttachMenuButtons","filterAttachMenuButtons","placeholderKey","hasBotCommands","updateBotCommands","updateMessageInput","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","readAllHistory","commandsMap","canCombine","hasMarkup","executed","resetCurrentFormatting","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","foundHelper","checkInlineAutocomplete","setPreloaderShow","btnPreloader","inlineMatch","bot_inline_placeholder","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","getValueAndEntities","clearReply","unicode","pushRecentEmoji","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","sendMessageWithDocument","hideCaptionCheckboxField","replyFragment","initMessagesForward","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","newReply","intl","peerTitleEl","_message","callerFunc","replyParent","oldReply","haveReply","CLASSNAME_BASE","PinnedContainer","floating","divAndCaption","wrapperUtils","attachOnCloseEvent","needClose","setFloating","setUtilsWidth","BAR_HEIGHTS","ChatAudio","onPlaybackParams","fasterEl","repeatEl","toggleEl","onStop","onMediaPlay","isMusic","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","mark","AnimatedSuper","getRow","clearRow","clearRows","currentIndex","DURATION","setNewRow","reflow","previousIndex","fromTop","ignorePrevious","previousRow","AnimatedCounter","previousNumber","getDecimal","animatedSuper","decimal","hideLeft","previousDecimalNumber","EMPTY_INDEX","setCount","previousByDecimal","decimalNumber","ChatPinnedMessage","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","setScrollDownListener","isDown","handleScrollSideEvent","refreshPosition","handleFollowingPinnedMessage","followPinnedMessage","isLast","writeTo","writeMediaTo","ChatTopbar","verifyButtons","isMenuOpen","btnMore","buttonsToVerify","menuButtons","verifyVideoChatButton","currentGroupCall","groupCall","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","resize","setUtilsRAF","chatUtils","chatAudio","setPeerStatusManual","btnBack","chatInfoContainer","chatInfo","person","avatarElement","deleteButtonText","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","onBtnBackClick","isFirstChat","constructUtils","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","getAttachMenuBot","has_settings","constructAvatar","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","setTitleCallback","setStatusCallback","setTitleManual","canHaveSomeButtons","wasAlreadyUsed","newPinnedMessage","AppPrivateSearchTab","appSearch","btnPickDate","ChatSearch","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","ChatBackgroundPatternRenderer","canvases","INSTANCES","renderToCanvas","fillCanvas","crossOrigin","createImageBitmap","resizeWidth","resizeHeight","imageBitmap","objectUrl","imageWidth","imageHeight","patternHeight","mask","centerY","topY","endY","bottomY","setCanvasDimensions","originalHeight","Chat","backgroundEl","backgroundTempId","sharedMediaTabs","setBackground","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","isDarkPattern","getInstance","_gradientRenderer","setBackgroundPromise","setType","beforeDestroy","cleanupBackground","destroySharedMediaTab","searchTab","_isAnyGroup","setAutoDownloadMedia","getForumTopicOrReload","isSamePeer","bubblesSetPeerPromise","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","callbacksPromise","ignoreThreadId","historyStorageTransferable","historySerialized","MarkupTooltip","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","getActiveMarkupButton","currentMarkups","markup","activeButtons","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","isFirstShow","setMouseUpEvent","handleSelection","ChatDragAndDrop","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","setPath","sizeX","sizeY","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","generateNextBlob","amplitude","speedScale","paint","pinnedTop","progressToPinned","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","WeavingState","stateId","createGradient","shader","getGradientFromType","x0","y0","dt","TopbarWeave","handleDevicePixelRatioChanged","setSize","forceUpdate","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","setCurrentState","states","componentDidMount","matchMedia","setAmplitude","componentWillUnmount","setCanvasSize","RLottieIconItemPart","playPart","RLottieIconItem","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","RLottieIcon","startFrame","endFrame","frameCount","SuperRLottieIcon","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","invoke","GroupCallMicrophoneIcon","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","MUTED","UNMUTED","GroupCallParticipantMutedIcon","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","MUTED_BY_ADMIN","propertyValue","getColorByMutedState","generateEqualParts","clearMutedStateModifier","GroupCallParticipantStatusElement","element2","actionClassName","GroupCallParticipantsList","getParticipantByPeerId","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","callVideoCanvasBlur","GroupCallParticipantVideoElement","setPinned","setParticipant","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","GroupCallParticipantsVideoElement","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","shouldDisplayElement","displayPinned","shouldDisplay","hasAnyVideo","participantElements","participantVideo","getVideoElementFromParticipantByType","_onLengthChange","GroupCallParticipantContextMenu","onOpenProfileClick","PopupGroupCall","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getContainer","GroupCallParticipantsElement","groupCallParticipantsVideo","appGroupCallsManager","getGroupCallParticipants","GroupCallDescriptionElement","descriptionIntl","GroupCallTitleElement","makeButton","_className","buttonDiv","isConfirm","resizeHandlerClassName","MovableElement","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","destroyElements","handlers","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setPositionToCenter","MovablePanel","toggleMovable","movable","movableOptions","toggleClassName","raise_hand_rating","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","movablePanel","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CallDescriptionElement","connectionState","connectedAt","GroupCallMicrophoneIconMini","INIT_STATE","PopupCall","resizeVideoContainers","videoContainers","interlocutorUserId","emojisSubtitle","partyStates","partyMutedState","stateText","constructFirstButtons","constructSecondButtons","wasTryingToJoin","movableElement","controlsHover","getCallInstance","firstButtonsRow","muteI18nElement","secondButtonsRow","declineI18nElement","btnDecline","btnAccept","acceptCall","createVideoContainer","isPendingIncoming","isSharingVideo","isSharingScreen","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","isVertical","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","TopbarCall","onState","amplitudes","weave","clearCurrentInstance","currentDescription","instanceListenerSetter","isChangingInstance","callDescription","convertCallStateToGroupState","groupCallMicrophoneIconMini","throttledMuteClick","weaveContainer","uiNotificationsManager","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","faviconElements","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","webPushApiManager","registeredDevice","nosound","requestPermission","Notification","mozVibrate","webkitVibrate","setAppBadge","notificationsUiSupport","notifySoundEl","topMessagesDeferred","toggleToggler","peerString","soundReset","unreadUnmutedPeerIds","tokenData","unregisterDevice","registerDevice","notificationData","custom","hasChat","hasUser","buildNotification","fwdCount","peerReaction","peerTypeNotifySettings","notification","getPeerString","notificationMessage","wrappedMessage","noIncrement","notificationFromPeerId","peerPhoto","loadAvatar","resetTitle","isBlink","setFavicon","titleInterval","textBaseline","textAlign","prevFavicon","testSound","permission","appRuntimeManager","onclose","getLocalSettings","nextSoundAt","prevSoundVolume","filename","token_type","tokenType","tokenValue","other_uids","app_sandbox","secret","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","webkitGetAsEntry","addAnchorListener","protocol","pathnameParams","uriParams","u","host","noPathnameParams","noUriParams","parseUriParams","AppImManager","columnEl","offline","updateStatusInterval","cacheStorage","saveState","onHashChangeUnsafe","tgaddr","openUrl","postId","openUsername","setSettings","messagesTextSize","forceRenderAfterSize","chatsSelectTabDebounced","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","_types","canDrag","backgroundPromises","updateStatus","emojiAnimationContainer","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","getPremium","compareVersion","deleteFilesIterative","applyCurrentTheme","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typing","onInstanceDeactivated","isUpdated","receiptMessage","onSpoilerClick","spoilerTimeout","stateStorage","topbarCall","discardCurrentCall","currentCall","setAuthorized","telegramMeWebManager","hashtag","STICKER_SET","EMOJI_SET","makeLink","INVOICE","VOICE_CHAT","USER_PHONE_NUMBER","thread","PRIVATE_POST","channel","comment","getStackFromElement","MESSAGE","attachKeydownListener","possibleBubble","timeoutOperation","requests","request","isBad","activatingChat","screen","IGNORE_KEYS","isSelectionCollapsed","getFirstMessageToEdit","getNextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","op","checkChatInvite","saveApiChat","resolvePhone","getInputInvoiceBySlug","wrappedUrl","openComment","generateThreadServiceStartMessage","phone_calls_private","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","title1","title2","isClosing","getGroupCallFull","createGroupCall","setCurrentBackground","broadcastEvent","getBackground","getFile","lastBackgroundUrl","chatBubbles","chatPositions","backgroundUrl","prevIdx","attachDragAndDropListeners","drops","mediaDrops","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","onImTabChange","updateMyOnlineStatus","spliceChats","fromIndex","chatFrom","chatTo","chatIndex","existingIndex","oldChat","getTypingElement","eye","getPeerTyping","getPeerTypings","langPackKeys","multi","mapa","typingElement","descriptionElement","getChatStatus","typingEl","onlines","getOnlines","getPeerStatus","typingContainer","options1","options2","DialogColorsFg","DialogColors","DialogColorsMap","pic","peerParams","useBytes","bestPhotoSize","CallConnectionInstanceBase","connection","sources","createPeerConnection","RTCPeerConnection","signalingState","iceConnectionState","createDataChannel","dataChannel","createDescription","appendStreamToConference","streamManager","appendToConference","closeConnection","closeConnectionAndStream","stopStream","negotiate","negotiating","negotiateInternal","sendDataChannelData","parseSignalingData","sdp","parseMediaSectionInfo","fingerprint","ufrag","pwd","convertNumber","isSending","codec","ssrc","sourceGroups","ssrcGroups","sourceGroup","semantics","ssrcs","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","clockrate","feedbackTypes","subtype","parameters","payloadTypes","CallConnectionInstance","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","setLocalDescription","offer","createOffer","offerSent","initialSetup","sendCallSignalingData","crypto","subtle","P2PEncryptor","p2pKey","seqMap","concatSHA256","bufferConcats","convertToUint8Array","encryptPrepared","msgKeyLarge","subarray","msgKey","aesKeyIv","prepareAesKeyIv","aesProcessCtr","encryptRawPacket","seq","ArrayBuffer","setUint32","sha256a","sha256b","iv","encryptedData","dataSize","encrypt","cryptoKey","constTimeIsDifferent","msgKeyEquals","decryptRawPacket","encryptedDataSize","decryptionBuffer","getUint32","ChromeP2PSdpBuilder","fingerprints","stringBuilder","streamName","addExtmap","addPayloadTypes","addSsrc","finalize","FirefoxP2PSdpBuilder","SafariP2PSdpBuilder","isFirefox","isSafari","extmap","j","fmtp","getOwnPropertyNames","pName","ssrcGroup","P2PSdpBuilder","sdpString","sdpMLineIndex","sdpMid","foundation","component","priority","relAddress","generation","tcpType","networkId","networkCost","candidate","generateOffer","generateAnswer","CallInstance","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","candidates","canCreateConferenceEntry","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","connectionInstance","sortIndex","findEntry","recvEntry","startScreenSharingInternal","wasStartingScreen","wasStartingVideo","requestScreen","stopVideoSharing","startVideoSharingInternal","requestInputSource","track","inputStream","getVideoTracks","stopTrack","isSharingVideoType","audioTrack","getAudioTracks","setHangUpTimeout","clearHangUpTimeout","hangUpTimeout","setPhoneCall","phoneCall","canAccept","overrideConnectionState","g_a_hash","appCallsManager","generateDh","dh","g_b","g_a","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","joinCall","encryptionKey","configuration","iceServers","connections","ipv6","port","urls","turn","stun","credential","iceTransportPolicy","p2p_allowed","getRtcConfiguration","sendIceCandidate","onTrack","encryptor","decryptor","processDecryptQueue","createDataChannelEntry","dataChannelEntry","createEntry","sendEntry","negotiated","applyDataChannelData","TextEncoder","encode","iceCandidate","parsed","p2pParseCandidate","confirmCall","key_fingerprint","computeKey","emojisFingerprint","getEmojisFingerprintPromise","codePoints","unlockStreamManager","doTheMagic","getTransceivers","transceiver","getEntryByMid","bundle","sdpDescription","generateSdp","isAnswer","setRemoteDescription","onInputStream","stream","videoTrack","onMutedChange","requestAudioSource","setMuted","discardReason","discardedByOtherParty","hasVideo","discardCall","performCodec","_codec","setDataToDescription","setData","transport","screencast","filterNotVP8","vp8PayloadType","rtxIdx","apt","applyCallSignalingData","performSsrcGroups","getEntryBySource","sendRecvEntry","findFreeSendRecvEntry","setEntrySource","tryToReleaseCandidates","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","TextDecoder","decode","signalingData","onUpdatePhoneCallSignalingData","getStreamCached","_cache","isScreen","constraints","getScreenStream","getStream","CallInstanceBase","fixSafariAudio","isSharingAudio","hasInputTrackKind","isAudioGood","isVideoGood","getAudioConstraints","getVideoConstraints","getScreenConstraints","endpoint","tryAddTrack","streams","saveInputVideoStream","isOutput","elementEndpoint","addTrack","useStream","outputStream","srcObject","sinkId","outputDeviceId","setSinkId","getTracks","addStream","CALL_STATE","audioAsset","CALL_REQUEST_TIMEOUT","CallsController","sortedInstances","createCallInstance","admin_id","g_a_or_b","bytesCmp","callId","getCallByUserId","hasConnected","hasCurrent","startCallInternal","fullInfo","participant_id","requestCall","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","GroupCallConnectionInstance","negotiateThrottled","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","invokeJoinGroupCall","localSdp","mainChannels","processedChannels","sectionInfo","payload","processMediaSection","audioChannel","videoChannel","useChannel","setEntryPeerId","performExtmap","filterServerCodecs","isNewConnection","originalOffer","iceRestart","hasMunged","skipAddingMulticast","mediaLine","mediaLineParts","localMLine","codecIds","newData","setPort","setSource","newSdp","addSsrcEntry","newChannel","mungedSdp","fixLocalOffer","entriesToDelete","shouldBeSkipped","answerDescription","deleteEntry","iceGatheringState","updateConstraints","sender","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","onStageEndpoints","addInputVideoStream","GroupCallInstance","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","getCachedParticipants","presentation","unpinSource","changeUserMuted","source_groups","createConnectionInstance","raise","raiseHand","stopScreenSharing","startScreenSharing","startScreenSharingPromise","saveApiParticipant","leaveGroupCallPresentation","videoPaused","videoStopped","startVideoSharing","startVideoSharingPromise","rejoin","isDiscarded","isUpdatingMeInCurrentCall","onParticipantUpdate","doNotDispatchParticipantUpdate","hasLeft","oldSsrcs","modifiedTypes","oldSsrc","oldSource","oldEntry","originalDirection","setEndpoint","createTransceiver","GROUP_CALL_STATE","makeSsrcsFromParticipant","makeSsrcFromParticipant","audio_source","generateSelfVideo","audioSource","GroupCallsController","setCurrentGroupCall","startConnectingSound","stopConnectingSound","joinVideo","MediaStream","createMainStreamManager","joinGroupCallInternal","handleUpdateGroupCallParticipants","updatingSdp","channelCount","constraint","mediaDevices","getSupportedConstraints","constraintSupported","skipAudio","frameRate","screenStream","getDisplayMedia","contentHint","getUserMedia","clientInfo","lookupAttributeKeys","telegramSourceGroups","sdpLines","rest","parseSourceGroups","raw","ConferenceEntry","addTransceiver","generateSsrc","LocalConferenceDescription","sessionId","maxSeenId","entriesByMid","entriesBySource","entriesByPeerId","getEntriesByPeerId","conference","SDP","mediaSections","splitStringByLimitWithRest","UniqueNumberGenerator","generate","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","SDPLine","SDPAttributeInner","missed","exists","nestedMap","makeAttributes","innerParts","SDPAttributes","fillAttributes","attributesMap","linesArray","SDPMediaSection","isReceiving","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","addSimulcast","generator","originalSsrcs","ssrcs2","ssrcsStrLines","ssrc2","WEBRTC_MEDIA_PORT","fixMediaLineType","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","connectionType","SDPBuilder","addCandidate","performCandidate","addHeader","sId","bundleMids","addTransport","skipCandidates","addSource","addMsid","isApplication","isInactive","hdrexts","hdrext","fbs","fb","addConference","AudioStreamAnalyser","streamSource","createMediaStreamSource","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","StreamManager","getAmplitude","streamAnalyser","analyse","ANALYSER_LISTENER","AudioContext","webkitAudioContext","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","substring","replaceInputAudio","oldTrack","timer","transceiverInit","tracks","mediaTrackType","trackIdx","replaceTrack","StringFromLineBuilder","newLine","addJoined","toTelegramSource","fromTelegramSource","rms","EMOJI_REG_EXP","getAbbreviation","onlyFirst","firstEmojiMatch","lastEmojiMatch","E","setBlankToAnchor","messageEntityTextUrl","messageEntityMentionName","isDraft","EMOJI_VERSIONS_SUPPORTED","inlineEl","newEmojiWidth","legacyEmojiWidth","isEmojiSupported","globalLazyLoadQueue","CustomEmojiElement","syncedPlayer","pausedElements","playersSynced","createCustomFiller","lastPausedVideo","middlewares","CustomEmojiRendererElement","clearedElements","WeakSet","isCanvasClean","emojiRenderers","getOffsets","offsetsMap","offsetParent","elementsArr","placeholders","isDimensionsSet","syncedPlayersFrames","isImageData","ImageData","frameWidth","frameHeight","lastChildWas","checkForAnyFrame","forceRenderAfter","renderEmojis","addCustomEmojis","addElements","usingOwnQueue","wrap","_loadPromises","newElements","isLottie","willHaveSyncedPlayer","newElementsArray","CUSTOM_EMOJI_INSTANT_PLAY","addition","_p","overrideRender","setRenderInterval","syncedPlayers","clearRenderInterval","missing","cachedPromises","uncachedPromisesPromise","loadFromPromises","uncached","emojiRenderInterval","renderers","nasty","usedLength","wrapSomething","wrapElement","noFiller","customWraps","contextSite","contextExternal","lastEntity","nextEntity","endPartOffset","fullEntityText","partText","usedText","fontFamily","atPos","fromBot","encodeURIComponent","isSupported","masked","currentContext","electronHelpers","contextUrl","wrapTelegramUrlToAnchor","encoded","encodeSpoiler","entityText","voodoo","insertCustomFillers","notFiller","isCustomFillerNeededBySiblingNode","url1","QueryableWorker","worker","terminate","onmessage","queryMethodListener","queryMethodArguments","postMessage","sendQuery","transfer","queryMethod","workersLimit","playersByCacheName","workers","curWorkerNum","onPlayerLoaded","reqId","fps","clamped","onPlayerError","getAnimation","setLoop","_autoplay","loadLottieWorkers","remain","Worker","queryableWorker","makeAssetUrl","loadAnimationAsAsset","loadAnimationFromURL","loadAnimationDataFromURL","blobConstruct","loadAnimationFromURLManually","loadAnimationFromURLNext","newParams","loadAnimationWorker","waitForFirstFrame","initPlayer","destroyWorkers","loadFromData","getLottiePixelRatio","RLottiePlayer","cachingDelta","CACHE","skipDelta","contexts","setMainLoop","clearPendingRAF","rafId","resetCurrentFrame","minFrame","requestFrame","applyInversing","renderFrame2","cachedSource","renderedFirstFrame","ImageBitmap","frInterval","frThen","frameNew","onLap","mainLoopForwards","mainLoopBackwards","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","bounds","setMinMax","playToFrameOnFrameCallback","setInverseColor","pagesManager","pageId","pagesDiv","scrollableDiv","page","onShown","setPage","isAuthPage","Page","onFirstMount","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","unicodeSurrogates","points","getEmojiToneIndex","VIRTUAL_COUNTRIES_EMOJIS","getCountryEmoji","emojiFromCodePoints","fromCodePoint","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","prototype","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","WebAssembly","clearStream","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","loadWorker","initWorker","streamPage","storePage","recordedPages","samplePosition","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","setTargetAtTime","onstart","destroyWorker","Function","kSampleStepSize","float32ArraySupported","Float32Array","A","aA1","aA2","B","C","calcBezier","aT","getSlope","LinearEasing","mX1","mY1","mX2","mY2","sampleValues","aX","intervalStart","currentSample","kSplineTableSize","guessForT","initialSlope","aGuessT","currentSlope","newtonRaphsonIterate","aA","aB","currentX","currentT","binarySubdivide","getTForX"],"sourceRoot":""} \ No newline at end of file diff --git a/public/570.d4798b741257c891cc8b.bundle.js b/public/570.d4798b741257c891cc8b.bundle.js deleted file mode 100644 index a277c20e..00000000 --- a/public/570.d4798b741257c891cc8b.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[570],{4159:(d,e,u)=>{var t;u.d(e,{Z:()=>s});const f="web.telegram.org",r=Math.min(4,null!==(t=navigator.hardwareConcurrency)&&void 0!==t?t:4),c={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.6.2",versionFull:"1.6.2 (272)",build:272,langPackVersion:"0.7.0",langPack:"webk",langPackCode:"en",domains:[f],baseDcId:2,isMainDomain:location.hostname===f,suffix:"K",threads:r,cryptoWorkers:r};c.isMainDomain&&(c.id=2496,c.hash="8da85b0d5bfe62527e5b244c209159c3");const s=c},3127:(d,e,u)=>{u.d(e,{Z:()=>t});const t={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},8975:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(7119);function f(d,e=""){Array.isArray(d)||(d=[d]);const u=(0,t.Z)(e);return new Blob(d,{type:u})}},7119:(d,e,u)=>{function t(d){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(d)?"application/octet-stream":d}u.d(e,{Z:()=>t})},4903:(d,e,u)=>{function t(...d){const e=d.reduce(((d,e)=>d+(e.byteLength||e.length)),0),u=new Uint8Array(e);let t=0;return d.forEach((d=>{u.set(d instanceof ArrayBuffer?new Uint8Array(d):d,t),t+=d.byteLength||d.length})),u}u.d(e,{Z:()=>t})},3725:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(319);function f(){const d={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...e)=>{d.lastNotify=e,d.listeners.forEach((d=>d(...e)))},listeners:[],addNotifyListener:e=>{d.lastNotify&&e(...d.lastNotify),d.listeners.push(e)}},e=new Promise(((u,t)=>{d.resolve=d=>{e.isFulfilled||e.isRejected||(e.isFulfilled=!0,u(d))},d.reject=(...d)=>{e.isRejected||e.isFulfilled||(e.isRejected=!0,t(...d))}}));return e.catch(t.Z).finally((()=>{e.notify=e.notifyAll=e.lastNotify=null,e.listeners.length=0,e.cancel&&(e.cancel=t.Z)})),Object.assign(e,d),e}},1352:(d,e,u)=>{u.d(e,{N5:()=>f,SU:()=>t,kC:()=>r});const t="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,f="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!t,r=f||t,c=(d,...e)=>{try{d.postMessage(...e)}catch(d){console.error("[worker] postMessage error:",d,e)}},s=(d,...e)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((u=>{u.length&&u.slice(d?0:-1).forEach((d=>{c(d,...e)}))}))};t&&s.bind(null,!1),t&&s.bind(null,!0)},319:(d,e,u)=>{function t(){}u.d(e,{Z:()=>t})},8479:(d,e,u)=>{function t(d){if(null===d||"object"!=typeof d)return d;if(d instanceof Date)return new Date(d.getTime());if(Array.isArray(d))return d.map((d=>t(d)));if(ArrayBuffer.isView(d))return d.slice();const e=new d.constructor;for(var u in d)d.hasOwnProperty(u)&&(e[u]=t(d[u]));return e}u.d(e,{Z:()=>t})},6848:(d,e,u)=>{function t(d,e){const u=Object.keys,f=typeof d;return d&&e&&"object"===f&&f===typeof e?u(d).length===u(e).length&&u(d).every((u=>t(d[u],e[u]))):d===e}u.d(e,{Z:()=>t})},5880:(d,e,u)=>{function t(d){return"object"==typeof d&&null!==d}u.d(e,{Z:()=>t})},5953:(d,e,u)=>{function t(d,e){if(e)for(const u in e)void 0!==e[u]&&(d[u]=e[u]);return d}u.d(e,{Z:()=>t})},946:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(8479),f=u(5880);function r(d,e,u,c){for(const s in d)typeof e[s]!=typeof d[s]?(e[s]=(0,t.Z)(d[s]),u&&u(c||s)):(0,f.Z)(d[s])&&r(d[s],e[s],u,c||s)}},4110:(d,e,u)=>{var t=u(7361),f=u(617);String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(d){return(+this).toPeerId(d)},String.prototype.isPeerId=function(){return/^[\d-]/.test(this.toString())},Number.prototype.toUserId=function(){return this},Number.prototype.toChatId=function(){return Math.abs(this)},Number.prototype.toPeerId=function(d){return void 0===d?this:d?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0},[["isUser",f.Z],["isAnyChat",t.Z]].forEach((d=>{const e=Array.isArray(d)?d[0]:d,u=Array.isArray(d)?d[1]:d;String.prototype[e]=function(){return u.call(null,this.toString())},Number.prototype[e]=function(){return u.call(null,this)}}))},144:(d,e,u)=>{u.d(e,{a:()=>r,d:()=>f});const t={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function f(d){const e=t[d];return crypto.getRandomValues(e),e[0]}function r(){return""+f(32)+f(32)%16777215}},5466:(d,e,u)=>{u.d(e,{$:()=>f});var t=u(5289);function f(d){return(...e)=>function(d,e,u){const f=performance.now();return(u||console).warn((0,t.Z)(),"start",e),d.then((()=>{(u||console).warn((0,t.Z)(),"end",e,performance.now()-f)})),d}(...e,d)}},5418:(d,e,u)=>{function t(d){return new Promise((e=>{setTimeout(e,d)}))}u.d(e,{Z:()=>t})},6724:(d,e,u)=>{function t(d,e,u=!0){let t,f,r=null;return(...c)=>{t=!0,f=c,r||(u&&(t=!1,d(...f)),r=setInterval((()=>{if(!t)return clearInterval(r),void(r=null);t=!1,d(...f)}),e))}}u.d(e,{Z:()=>t})},9005:(d,e,u)=>{function t(d){return d.charAt(0).toUpperCase()+d.slice(1)}u.d(e,{Z:()=>t})},8453:(d,e,u)=>{u.d(e,{Z:()=>s});var t=u(5936),f=u(3989),r=u(7487),c=u(319);function s(d,e){return Promise.all([f.Z.toggleStorage(d,e),t.Z.toggleStorage(d,e),r.Z.toggleStorage(d,e)]).then(c.Z,c.Z)}},7298:(d,e,u)=>{function t(d){const e=Date.now();return d?e/1e3|0:e}u.d(e,{Z:()=>t})},7361:(d,e,u)=>{function t(d){return+d<0}u.d(e,{Z:()=>t})},617:(d,e,u)=>{function t(d){return+d>=0}u.d(e,{Z:()=>t})},8630:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(153),f=u(410),r=u(1352);class c extends t.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:d,args:e,transfer:u}){const t={method:d,args:e},f=this.listeners.invoke;if(null==f?void 0:f.length){let d=f[0].callback(t);return r.kC||d instanceof Promise||(d=Promise.resolve(d)),d}const c="aes-encrypt"===d||"aes-decrypt"===d?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",t,void 0,this.sendPorts[c],u)}invokeCrypto(d,...e){return this.invokeCryptoNew({method:d,args:e})}}const s=new c;f.GO&&(f.GO.cryptoMessagePort=s);const n=s},5936:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(1267),f=u(8975),r=u(5753),c=u(5471),s=u(3725);class n{constructor(d){this.dbName=d,this.useStorage=!0,t.Z.test&&(this.dbName+="_test"),n.STORAGES.length&&(this.useStorage=n.STORAGES[0].useStorage),this.openDatabase(),n.STORAGES.push(this)}openDatabase(){var d;return null!==(d=this.openDbPromise)&&void 0!==d?d:this.openDbPromise=caches.open(this.dbName)}delete(d){return this.timeoutOperation((e=>e.delete("/"+d)))}deleteAll(){return caches.delete(this.dbName)}get(d){return this.timeoutOperation((e=>e.match("/"+d)))}save(d,e){return this.timeoutOperation((u=>u.put("/"+d,e)))}getFile(d,e="blob"){return this.get(d).then((d=>{if(!d)throw(0,c.Z)("NO_ENTRY_FOUND");return d[e]()}))}saveFile(d,e){e instanceof Blob||(e=(0,f.Z)(e));const u=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(d,u).then((()=>e))}timeoutOperation(d){return this.useStorage?new Promise(((e,u)=>{return t=this,f=void 0,c=function*(){let t=!1;const f=setTimeout((()=>{u(),t=!0}),15e3);try{const u=yield this.openDatabase();if(!u)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const f=yield d(u);if(t)return;e(f)}catch(d){u(d)}clearTimeout(f)},new((r=void 0)||(r=Promise))((function(d,e){function u(d){try{n(c.next(d))}catch(d){e(d)}}function s(d){try{n(c.throw(d))}catch(d){e(d)}}function n(e){var t;e.done?d(e.value):(t=e.value,t instanceof r?t:new r((function(d){d(t)}))).then(u,s)}n((c=c.apply(t,f||[])).next())}));var t,f,r,c})):Promise.reject((0,c.Z)("STORAGE_OFFLINE"))}prepareWriting(d,e,u){return{deferred:(0,s.Z)(),getWriter:()=>new r.Z(u,e,(e=>this.saveFile(d,e).catch((()=>e))))}}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,e)return d?void 0:u.deleteAll()})))}}n.STORAGES=[]},5753:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(8975);class f{constructor(d,e,u){this.mimeType=d,this.size=e,this.saveFileCallback=u,this.bytes=new Uint8Array(e)}write(d,e){return u=this,t=void 0,r=function*(){const u=e+d.byteLength;if(u>this.bytes.byteLength){const d=new Uint8Array(u);d.set(this.bytes,0),this.bytes=d}this.bytes.set(d,e)},new((f=void 0)||(f=Promise))((function(d,e){function c(d){try{n(r.next(d))}catch(d){e(d)}}function s(d){try{n(r.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(c,s)}n((r=r.apply(u,t||[])).next())}));var u,t,f,r}truncate(){this.bytes=new Uint8Array}trim(d){this.bytes=this.bytes.slice(0,d)}finalize(d=!0){const e=(0,t.Z)(this.bytes,this.mimeType);return d&&this.saveFileCallback&&this.saveFileCallback(e),e}getParts(){return this.bytes}replaceParts(d){this.bytes=d}}},5003:(d,e,u)=>{u.d(e,{kg:()=>l,v9:()=>t});var t,f=u(410),r=u(4762),c=u(1352),s=u(5289);!function(d){d[d.None=0]="None",d[d.Error=1]="Error",d[d.Warn=2]="Warn",d[d.Log=4]="Log",d[d.Debug=8]="Debug"}(t||(t={}));const n=[t.None,t.Error,t.Warn,t.Log,t.Debug],o=!(r.IS_SAFARI||r.IS_FIREFOX),i="",a="",h=[["debug",t.Debug],["info",t.Log],["warn",t.Warn],["error",t.Error],["assert",t.Error],["trace",t.Log],["group",t.Log],["groupCollapsed",t.Log],["groupEnd",t.Log]];function l(d,e=t.Log|t.Warn|t.Error,u=!1,r=""){let b;f.ZP||u||(e=t.Error),o?r||(c.SU?r=i:c.N5&&(r=a)):r="";const g=r;r=r?`%s ${r}%s`:"%s";const p=function(...u){return e&t.Log&&console.log(r,(0,s.Z)(),d,...u)};return h.forEach((([u,t])=>{p[u]=function(...f){return e&t&&console[u](r,(0,s.Z)(),d,...f)}})),p.setPrefix=function(e){b=e,d="["+e+"]"},p.setPrefix(d),p.setLevel=function(d){e=n.slice(0,d+1).reduce(((d,e)=>d|e),0)},p.bindPrefix=function(d){return l(`${b}] [${d}`,e,u,g)},p}},3206:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(410),f=u(153);class r extends f.Z{constructor(){super("MTPROTO"),r.INSTANCE=this,t.GO&&(t.GO.mtprotoMessagePort=this)}static getInstance(){return this.INSTANCE}}},690:(d,e,u)=>{var t=u(4903);Uint8Array.prototype.concat=function(...d){return(0,t.Z)(this,...d)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(d){const e=e=>Promise.resolve(d()).then(e);return this.then((d=>e((()=>d))),(d=>e((()=>Promise.reject(d)))))}},6637:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(2423);function f(d){return d?d.match(t.bu):null}},3591:(d,e,u)=>{u.d(e,{Z:()=>c});var t=u(2423),f=u(410),r=u(6637);function c(d,e){(0,r.Z)(d)||(d="https://"+d);const u={url:d};let f,c,s,n;if(f=d.match(/^(?:https?:\/\/)?(?:(.+?)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const e=new URL(d);f[1]&&(e.pathname=f[1]+("/"===e.pathname?"":e.pathname));const u=e.pathname.slice(1),r=u.split("/");if(r[0]&&"$"===r[0][0]&&r[0].length>1)n="invoice";else if(/^\W/.test(u)&&!t.kO.test(u))n="joinchat";else switch(r[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==r.length&&!f[1]){n=r[0];break}default:if(r[1]&&r[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===r.length){n="im";break}}}else(c=d.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?n="im":(s=d.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(n="tg_"+s[1]);return window[n]||(n=void 0),u.onclick=n,u}f.GO&&(f.GO.wrapUrl=c)},3655:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(153),f=u(410);class r extends t.Z{constructor(){super("SERVICE"),f.GO&&(f.GO.serviceMessagePort=this)}}},7487:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(1267),r=u(1352),c=u(3206);class s{constructor(){this.prefix="",this.cache={},this.useStorage=!0,f.Z.test&&(this.prefix="t_")}get(d,e=!0){if(this.cache.hasOwnProperty(d)&&e)return this.cache[d];if(this.useStorage){let e;try{e=localStorage.getItem(this.prefix+d)}catch(d){this.useStorage=!1}if(null!==e)try{e=JSON.parse(e)}catch(d){}else e=void 0;return e}}set(d,e=!1){for(const u in d)if(d.hasOwnProperty(u)){const t=d[u];if(this.cache[u]=t,this.useStorage&&!e)try{const d=JSON.stringify(t);localStorage.setItem(this.prefix+u,d)}catch(d){this.useStorage=!1}}}delete(d,e=!1){d=""+d,e||delete this.cache[d];try{localStorage.removeItem(this.prefix+d)}catch(d){}}clear(){const d=["dc","server_time_offset","xt_instance","user_auth","state_id","k_build"];for(let e=1;e<=5;++e)d.push(`dc${e}_server_salt`),d.push(`dc${e}_auth_key`);for(const e of d)this.delete(e,!0)}toggleStorage(d,e){if(this.useStorage=d,e)return d?this.set(this.cache):void this.clear()}}class n{constructor(){n.STORAGES.push(this),r.kC||(this.storage=new s)}proxy(d,...e){return u=this,t=void 0,s=function*(){return r.kC?c.Z.getInstance().invoke("localStorageProxy",{type:d,args:e}):(e=Array.prototype.slice.call(e),this.storage[d].apply(this.storage,e))},new((f=void 0)||(f=Promise))((function(d,e){function r(d){try{n(s.next(d))}catch(d){e(d)}}function c(d){try{n(s.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(r,c)}n((s=s.apply(u,t||[])).next())}));var u,t,f,s}get(d,e){return this.proxy("get",d,e)}set(d,e){return this.proxy("set",d,e)}delete(d,e){return this.proxy("delete",d,e)}clear(){return this.proxy("clear")}toggleStorage(d,e){return this.proxy("toggleStorage",d,e)}}n.STORAGES=[];const o=new n;t.GO.appStorage=o;const i=o},7922:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(410),f=u(3989),r=u(3127);class c extends f.Z{constructor(){super(r.Z,"session")}}const s=new c;t.GO.stateStorage=s;const n=s},3989:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(3725),r=u(1352),c=u(6724),s=u(6666),n=function(d,e,u,t){return new(u||(u=Promise))((function(f,r){function c(d){try{n(t.next(d))}catch(d){r(d)}}function s(d){try{n(t.throw(d))}catch(d){r(d)}}function n(d){var e;d.done?f(d.value):(e=d.value,e instanceof u?e:new u((function(d){d(e)}))).then(c,s)}n((t=t.apply(d,e||[])).next())}))};function o(){}class i{constructor(d,e){this.db=d,this.storeName=e,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=(0,f.Z)(),this.keysToDelete=new Set,this.deleteDeferred=(0,f.Z)(),this.storage=new s.Z(d,e),i.STORAGES.length?this.useStorage=i.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,i.STORAGES.push(this),this.saveThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.saveDeferred;this.saveDeferred=(0,f.Z)();const e=this.keysToSet;if(e.size){const d=Array.from(e.values());e.clear();const u=d.map((d=>this.cache[d]));try{yield this.storage.save(d,u)}catch(e){console.error("[AS]: set error:",e,d,u)}}d.resolve(),e.size&&this.saveThrottled()}))),16,!1),this.deleteThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.deleteDeferred;this.deleteDeferred=(0,f.Z)();const e=this.keysToDelete;if(e.size){const d=Array.from(e.values());e.clear();try{yield this.storage.delete(d)}catch(e){console.error("[AS]: delete error:",e,d)}}d.resolve(),e.size&&this.deleteThrottled()}))),16,!1),this.getThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=Array.from(this.getPromises.keys());this.storage.get(d).then((e=>{for(let u=0,t=d.length;u{new Set(["NO_ENTRY_FOUND","STORAGE_OFFLINE"]).has(u.type)||(this.useStorage=!1,console.error("[AS]: get error:",u,d,e));for(let e=0,u=d.length;e{this.getPromises.size&&this.getThrottled()}))}))),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(d){return this.cache[d]}setToCache(d,e){return this.cache[d]=e}get(d,e=!0){return n(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(d)&&e)return this.getFromCache(d);if(this.useStorage){const e=this.getPromises.get(d);if(e)return e;const u=(0,f.Z)();return this.getPromises.set(d,u),this.getThrottled(),u}}))}getAll(){return this.storage.getAll().catch((()=>[]))}set(d,e=!1){const u=this.useStorage&&!e&&!this.savingFreezed;for(const e in d)if(d.hasOwnProperty(e)){const t=d[e];this.setToCache(e,t),u&&(this.keysToSet.add(e),this.keysToDelete.delete(e),this.saveThrottled())}return u?this.saveDeferred:Promise.resolve()}delete(d,e=!1){return d=""+d,e||delete this.cache[d],this.useStorage&&(this.keysToSet.delete(d),this.keysToDelete.add(d),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(d=!1){if(!d)for(const d in this.cache)delete this.cache[d];return this.storage.clear().catch(o)}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,r.kC&&e)return d?u.set(u.cache):(u.keysToSet.clear(),u.keysToDelete.clear(),u.getPromises.forEach((d=>d.resolve(void 0))),u.getPromises.clear(),u.clear(!0))}))).catch(o)}static freezeSaving(d,e){this.STORAGES.forEach((d=>d.savingFreezed=!0));try{d()}catch(d){console.error("freezeSaving callback error:",d)}this.STORAGES.forEach((d=>d.savingFreezed=!1))}}i.STORAGES=[],t.GO&&(t.GO.AppStorage=i)},1229:(d,e,u)=>{u.d(e,{Z:()=>t});const t="((?:👨🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|🧑🏻‍❤️?‍💋‍🧑\ud83c[\udffc-\udfff]|🧑🏼‍❤️?‍💋‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏽‍❤️?‍💋‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏾‍❤️?‍💋‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏿‍❤️?‍💋‍🧑\ud83c[\udffb-\udffe]|👨🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍❤️?‍🧑\ud83c[\udffc-\udfff]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍❤️?‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍❤️?‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍❤️?‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍❤️?‍🧑\ud83c[\udffb-\udffe]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|👨‍❤️?‍💋‍👨|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|🫱🏻‍🫲\ud83c[\udffc-\udfff]|🫱🏼‍🫲\ud83c[\udffb\udffd-\udfff]|🫱🏽‍🫲\ud83c[\udffb\udffc\udffe\udfff]|🫱🏾‍🫲\ud83c[\udffb-\udffd\udfff]|🫱🏿‍🫲\ud83c[\udffb-\udffe]|👨‍❤️?‍👨|👩‍❤️?‍\ud83d[\udc68\udc69]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|💏\ud83c[\udffb-\udfff]|💑\ud83c[\udffb-\udfff]|🤝\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|🤝)|(?:\ud83d[\udc68\udc69]|🧑)(?:\ud83c[\udffb-\udfff])?‍(?:⚕️?|⚖️?|✈️?|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|⛹)(?:(?:\ud83c[\udffb-\udfff]|️?)‍[♀♂]️?)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?‍[♀♂]️?|(?:👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍👦‍👦|👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍\ud83d[\udc66\udc67]|🏳️?‍⚧️?|🏳️?‍🌈|😶‍🌫️?|❤️?‍🔥|❤️?‍🩹|🏴‍☠️?|🐕‍🦺|🐻‍❄️?|👁‍🗨|👨‍\ud83d[\udc66\udc67]|👩‍\ud83d[\udc66\udc67]|👯‍♀️?|👯‍♂️?|😮‍💨|😵‍💫|🤼‍♀️?|🤼‍♂️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|🐈‍⬛)|[#*0-9]️??⃣|(?:[©®™♟]️?)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[‼⁉ℹ↔-↙↩↪⌚⌛⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☠☢☣☦☪☮☯☸-☺♀♂♈-♓♠♣♥♦♨♻♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛏⛑⛓⛔⛩⛪⛰-⛵⛸⛺⛽✂✈✉✏✒✔✖✝✡✳✴❄❇❗❣❤➡⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙])(?:️?|(?!︎))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[☝⛷⛹✌✍])(?:️?|(?!︎))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd\udec3-\udec5\udef0-\udef6]|[✊✋]))(?:\ud83c[\udffb-\udfff])?|(?:🏴󠁧󠁢󠁥󠁮󠁧󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁷󠁬󠁳󠁿|🇦\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|🇧\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|🇨\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|🇩\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|🇪\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|🇫\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|🇬\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|🇭\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|🇮\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|🇯\ud83c[\uddea\uddf2\uddf4\uddf5]|🇰\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|🇱\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|🇲\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|🇳\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|🇴🇲|🇵\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|🇶🇦|🇷\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|🇸\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|🇹\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|🇺\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|🇻\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|🇼\ud83c[\uddeb\uddf8]|🇽🇰|🇾\ud83c[\uddea\uddf9]|🇿\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️)"}}]); -//# sourceMappingURL=570.d4798b741257c891cc8b.bundle.js.map \ No newline at end of file diff --git a/public/570.d4798b741257c891cc8b.bundle.js.map b/public/570.d4798b741257c891cc8b.bundle.js.map deleted file mode 100644 index abc22f6f..00000000 --- a/public/570.d4798b741257c891cc8b.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"570.d4798b741257c891cc8b.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/app.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/object/copy.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/helpers/object/isObject.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/helpers/object/validateInitObject.ts","webpack://tweb/./src/helpers/peerIdPolyfill.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/recordPromise.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/schedulers/throttle.ts","webpack://tweb/./src/helpers/string/capitalizeFirstLetter.ts","webpack://tweb/./src/helpers/toggleStorages.ts","webpack://tweb/./src/helpers/tsNow.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isAnyChat.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isUser.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/mtproto/mtprotoMessagePort.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrlProtocol.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/localStorage.ts","webpack://tweb/./src/lib/sessionStorage.ts","webpack://tweb/./src/lib/stateStorage.ts","webpack://tweb/./src/lib/storage.ts","webpack://tweb/./src/vendor/emoji/regex.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {DcId} from '../types';\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst threads = Math.min(4, navigator.hardwareConcurrency ?? 4);\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.7.0',\n langPack: 'webk',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K',\n threads,\n cryptoWorkers: threads\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Database} from '.';\r\nimport type {IDBIndex} from '../../lib/files/idb';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n // indexes: [\r\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\r\n // const name = `index_${idx}`;\r\n // const index: IDBIndex = {\r\n // indexName: name,\r\n // keyPath: name,\r\n // objectParameters: {}\r\n // };\r\n\r\n // return index\r\n // })\r\n // ]\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * 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 const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from './noop';\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: (reason?: any) => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport default function deferredPromise() {\r\n const 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 const deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n\r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n\r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n\r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = noop;\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/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\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\r\n\r\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\r\n try {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n } catch(err) {\r\n console.error('[worker] postMessage error:', err, args);\r\n }\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n getWindowClients().then((listeners) => {\r\n if(!listeners.length) {\r\n // console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach((listener) => {\r\n postMessage(listener, ...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","export default function noop() {}\r\n","export default function copy(obj: T): T {\n // in case of premitives\n if(obj === null || typeof(obj) !== 'object') {\n return obj;\n }\n\n // date objects should be\n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n\n // handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map((el) => copy(el)) as any as T;\n return clonedArr;\n }\n\n if(ArrayBuffer.isView(obj)) {\n // @ts-ignore\n return obj.slice();\n }\n\n // lastly, handle objects\n // @ts-ignore\n const clonedObj = new obj.constructor();\n for(var prop in obj) {\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","import copy from './copy';\nimport isObject from './isObject';\n\nexport default function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport isAnyChat from '../lib/appManagers/utils/peers/isAnyChat';\nimport isUser from '../lib/appManagers/utils/peers/isUser';\n\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\n[\n ['isUser' as const, isUser],\n ['isAnyChat' as const, isAnyChat]\n].forEach((value) => {\n const newMethod = Array.isArray(value) ? value[0] : value;\n const originMethod = Array.isArray(value) ? value[1] : value;\n // @ts-ignore\n String.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this.toString());\n };\n\n // @ts-ignore\n Number.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this);\n };\n});\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n}\n\nexport {};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import {logger} from '../lib/logger';\nimport dT from './dT';\n\nexport function recordPromise>(promise: T, description: string, log?: ReturnType | Console) {\n const perf = performance.now();\n (log || console).warn(dT(), 'start', description);\n promise.then(() => {\n (log || console).warn(dT(), 'end', description, performance.now() - perf);\n });\n return promise;\n}\n\nexport function recordPromiseBound(log: ReturnType | Console) {\n return (...args: [Parameters[0], Parameters[1]]) => {\n return recordPromise(...args, log);\n };\n}\n","export default function pause(ms: number) {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport {AnyToVoidFunction} from '../../types';\r\n\r\nexport default function throttle(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true\r\n) {\r\n let interval: number | null = null;\r\n let isPending: boolean;\r\n let args: Parameters;\r\n\r\n return (..._args: Parameters) => {\r\n isPending = true;\r\n args = _args;\r\n\r\n if(!interval) {\r\n if(shouldRunFirst) {\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n interval = setInterval(() => {\r\n if(!isPending) {\r\n clearInterval(interval!);\r\n interval = null;\r\n return;\r\n }\r\n\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }, ms) as any;\r\n }\r\n };\r\n}\r\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CacheStorageController from '../lib/files/cacheStorage';\nimport AppStorage from '../lib/storage';\nimport sessionStorage from '../lib/sessionStorage';\nimport noop from './noop';\n\nexport default function toggleStorages(enabled: boolean, clearWrite: boolean) {\n return Promise.all([\n AppStorage.toggleStorage(enabled, clearWrite),\n CacheStorageController.toggleStorage(enabled, clearWrite),\n sessionStorage.toggleStorage(enabled, clearWrite)\n ]).then(noop, noop);\n}\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","export default function isAnyChat(peerId: PeerId) {\n return +peerId < 0;\n}\n","export default function isUser(peerId: PeerId) {\n return +peerId >= 0;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {CryptoMethods} from './crypto_methods';\r\nimport SuperMessagePort from '../mtproto/superMessagePort';\r\nimport {Awaited} from '../../types';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport {IS_WORKER} from '../../helpers/context';\r\n\r\ntype CryptoEvent = {\r\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\r\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\r\n terminate: () => void\r\n};\r\n\r\nexport class CryptoMessagePort extends SuperMessagePort {\r\n private lastIndex: number;\r\n\r\n constructor() {\r\n super('CRYPTO');\r\n this.lastIndex = -1;\r\n }\r\n\r\n public invokeCryptoNew({method, args, transfer}: {\r\n method: T,\r\n args: Parameters,\r\n transfer?: Transferable[]\r\n }): Promise>> {\r\n const payload = {method, args};\r\n const listeners = this.listeners['invoke'];\r\n if(listeners?.length) { // already in worker\r\n // try {\r\n // @ts-ignore\r\n let result: any = listeners[0].callback(payload);\r\n if(!IS_WORKER && !(result instanceof Promise)) {\r\n result = Promise.resolve(result);\r\n }\r\n\r\n return result;\r\n // } catch(err) {\r\n // return Promise.reject(err);\r\n // }\r\n }\r\n\r\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\r\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\r\n 0;\r\n // @ts-ignore\r\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\r\n }\r\n\r\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\r\n return this.invokeCryptoNew({method, args});\r\n }\r\n}\r\n\r\nconst cryptoMessagePort = new CryptoMessagePort();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\r\nexport default cryptoMessagePort;\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 MemoryWriter from './memoryWriter';\r\nimport FileManager from './memoryWriter';\r\nimport FileStorage from './fileStorage';\r\nimport makeError from '../../helpers/makeError';\r\nimport deferredPromise from '../../helpers/cancellablePromise';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController implements FileStorage {\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 makeError('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(makeError('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 prepareWriting(fileName: string, fileSize: number, mimeType: string) {\r\n return {\r\n deferred: deferredPromise(),\r\n getWriter: () => {\r\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return writer;\r\n }\r\n };\r\n }\r\n\r\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return Promise.all(this.STORAGES.map((storage) => {\r\n storage.useStorage = enabled;\r\n\r\n if(!clearWrite) {\r\n return;\r\n }\r\n\r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\nimport StreamWriter from './streamWriter';\r\n\r\nexport default class MemoryWriter implements StreamWriter {\r\n private bytes: Uint8Array;\r\n\r\n constructor(\r\n private mimeType: string,\r\n private size: number,\r\n private saveFileCallback?: (blob: Blob) => Promise\r\n ) {\r\n this.bytes = new Uint8Array(size);\r\n }\r\n\r\n public async write(part: Uint8Array, offset: number) {\r\n // sometimes file size can be bigger than the prov\r\n const endOffset = offset + part.byteLength;\r\n if(endOffset > this.bytes.byteLength) {\r\n const newBytes = new Uint8Array(endOffset);\r\n newBytes.set(this.bytes, 0);\r\n this.bytes = newBytes;\r\n }\r\n\r\n this.bytes.set(part, offset);\r\n };\r\n\r\n public truncate() {\r\n this.bytes = new Uint8Array();\r\n }\r\n\r\n public trim(size: number) {\r\n this.bytes = this.bytes.slice(0, size);\r\n }\r\n\r\n public finalize(saveToStorage = true) {\r\n const blob = blobConstruct(this.bytes, this.mimeType);\r\n\r\n if(saveToStorage && this.saveFileCallback) {\r\n this.saveFileCallback(blob);\r\n }\r\n\r\n return blob;\r\n }\r\n\r\n public getParts() {\r\n return this.bytes;\r\n }\r\n\r\n public replaceParts(parts: Uint8Array) {\r\n this.bytes = parts;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport type {getEnvironment} from '../../environment/utils';\nimport type loadState from '../appManagers/utils/state/loadState';\nimport type {StoragesResults} from '../appManagers/utils/storages/loadStorages';\nimport type {LocalStorageProxyTask} from '../localStorage';\nimport type {Awaited} from '../../types';\nimport type {Mirrors, MirrorTaskPayload, NotificationBuildTaskPayload, TabState} from './mtprotoworker';\nimport type toggleStorages from '../../helpers/toggleStorages';\nimport SuperMessagePort from './superMessagePort';\n\nexport type MTProtoManagerTaskPayload = {name: string, method: string, args: any[]};\n\ntype MTProtoBroadcastEvent = {\n event: (payload: {name: string, args: any[]}, source: MessageEventSource) => void\n};\n\nexport default class MTProtoMessagePort extends SuperMessagePort<{\n environment: (environment: ReturnType) => void,\n crypto: (payload: {method: string, args: any[]}) => Promise,\n state: (payload: {userId: UserId} & Awaited> & {storagesResults?: StoragesResults}) => void,\n manager: (payload: MTProtoManagerTaskPayload) => any,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => ReturnType,\n serviceWorkerOnline: (online: boolean) => void,\n serviceWorkerPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n cryptoPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n createObjectURL: (blob: Blob) => string,\n tabState: (payload: TabState, source: MessageEventSource) => void,\n createProxyWorkerURLs: (payload: {originalUrl: string, blob: Blob}) => string[],\n} & MTProtoBroadcastEvent, {\n convertWebp: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n convertOpus: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n localStorageProxy: (payload: LocalStorageProxyTask['payload']) => Promise,\n mirror: (payload: MirrorTaskPayload) => void,\n notificationBuild: (payload: NotificationBuildTaskPayload) => void,\n // hello: () => void\n} & MTProtoBroadcastEvent, Master> {\n private static INSTANCE: MTProtoMessagePort;\n\n constructor() {\n super('MTPROTO');\n\n MTProtoMessagePort.INSTANCE = this;\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.mtprotoMessagePort = this);\n }\n\n public static getInstance() {\n return this.INSTANCE as MTProtoMessagePort;\n }\n}\n","/*\n * 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","import {URL_ANY_PROTOCOL_REG_EXP} from '.';\n\nexport default function matchUrlProtocol(text: string) {\n return !text ? null : text.match(URL_ANY_PROTOCOL_REG_EXP);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: string, onclickUrl?: string} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: string, onclickUrl: 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 u = new URL(url);\n if(tgMeMatch[1]) {\n u.pathname = tgMeMatch[1] + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !tgMeMatch[1]) {\n onclick = path[0];\n break;\n }\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 out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * 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 {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\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 Modes from '../config/modes';\r\nimport {IS_WORKER} from '../helpers/context';\r\nimport {WorkerTaskTemplate} from '../types';\r\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\r\n// import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + (key as string)) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n // console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + (key as string);\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 as string));\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach((key) => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n\r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id', 'k_build'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(const key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!clearWrite) {\r\n return;\r\n }\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n // private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n // private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n private async proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']): Promise {\r\n if(IS_WORKER) {\r\n const port = MTProtoMessagePort.getInstance();\r\n return port.invoke('localStorageProxy', {type, args});\r\n }\r\n\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n return this.storage[type].apply(this.storage, args as any);\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return this.proxy('toggleStorage', enabled, clearWrite);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {AppInstance} from './mtproto/singleInstance';\r\nimport type {UserAuth} from './mtproto/mtproto_config';\r\nimport type {DcId} from '../types';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n },\r\n k_build: number\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {ChatSavedPosition} from './appManagers/appImManager';\r\nimport type {AppDraftsManager} from './appManagers/appDraftsManager';\r\nimport type {State} from '../config/state';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport {LangPackDifference} from '../layer';\r\nimport AppStorage from './storage';\r\nimport DATABASE_STATE from '../config/databases/state';\r\n\r\nclass StateStorage extends AppStorage<{\r\n chatPositions: {\r\n [peerId_threadId: string]: ChatSavedPosition\r\n },\r\n langPack: LangPackDifference,\r\n drafts: AppDraftsManager['drafts'],\r\n user_auth: any, // support old webk format\r\n} & State, typeof DATABASE_STATE> {\r\n constructor() {\r\n super(DATABASE_STATE, 'session');\r\n }\r\n}\r\n\r\nconst stateStorage = new StateStorage();\r\nMOUNT_CLASS_TO.stateStorage = stateStorage;\r\nexport default stateStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Database} from '../config/databases';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\n// import DATABASE_SESSION from \"../config/databases/session\";\r\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport {IS_WORKER} from '../helpers/context';\r\nimport throttle from '../helpers/schedulers/throttle';\r\n// import { WorkerTaskTemplate } from \"../types\";\r\nimport IDBStorage from './files/idb';\r\n\r\nfunction noop() {}\r\n\r\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys: string[],\r\n values: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys: string[]\r\n }\r\n}; */\r\n\r\nconst THROTTLE_TIME = 16;\r\n\r\n/* Storage extends {[name: string]: any} *//* Storage extends Record */\r\nexport default class AppStorage<\r\n Storage extends Record,\r\n T extends Database\r\n> {\r\n private static STORAGES: AppStorage>[] = [];\r\n private storage: IDBStorage;// new CacheStorageController('session');\r\n\r\n // private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\r\n private cache: Partial = {};\r\n private useStorage: boolean;\r\n private savingFreezed: boolean;\r\n\r\n private getPromises: Map> = new Map();\r\n private getThrottled: () => void;\r\n\r\n private keysToSet: Set = new Set();\r\n private saveThrottled: () => void;\r\n private saveDeferred = deferredPromise();\r\n\r\n private keysToDelete: Set = new Set();\r\n private deleteThrottled: () => void;\r\n private deleteDeferred = deferredPromise();\r\n\r\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\r\n this.storage = new IDBStorage(db, storeName);\r\n\r\n if(AppStorage.STORAGES.length) {\r\n this.useStorage = AppStorage.STORAGES[0].useStorage;\r\n } else {\r\n this.useStorage = true;\r\n }\r\n\r\n this.savingFreezed = false;\r\n\r\n AppStorage.STORAGES.push(this);\r\n\r\n this.saveThrottled = throttle(async() => {\r\n const deferred = this.saveDeferred;\r\n this.saveDeferred = deferredPromise();\r\n\r\n const set = this.keysToSet;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n const values = keys.map((key) => this.cache[key]);\r\n try {\r\n // console.log('setItem: will set', key/* , value */);\r\n // await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\r\n // await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\r\n\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys,\r\n values\r\n }\r\n } as LocalStorageProxySetTask);\r\n } */\r\n\r\n await this.storage.save(keys, values);\r\n // console.log('setItem: have set', key/* , value */);\r\n } catch(e) {\r\n // this.useCS = false;\r\n console.error('[AS]: set error:', e, keys, values);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.saveThrottled();\r\n }\r\n }, THROTTLE_TIME, false);\r\n\r\n this.deleteThrottled = throttle(async() => {\r\n const deferred = this.deleteDeferred;\r\n this.deleteDeferred = deferredPromise();\r\n\r\n const set = this.keysToDelete;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys\r\n }\r\n } as LocalStorageProxyDeleteTask);\r\n } */\r\n\r\n await this.storage.delete(keys);\r\n } catch(e) {\r\n console.error('[AS]: delete error:', e, keys);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.deleteThrottled();\r\n }\r\n }, THROTTLE_TIME, false);\r\n\r\n this.getThrottled = throttle(async() => {\r\n const keys = Array.from(this.getPromises.keys());\r\n\r\n // const perf = performance.now();\r\n this.storage.get(keys as string[]).then((values) => {\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // @ts-ignore\r\n deferred.resolve(this.cache[key] = values[i]);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n\r\n // console.log('[AS]: get time', keys, performance.now() - perf);\r\n }, (error: ApiError) => {\r\n const ignoreErrors: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE']);\r\n if(!ignoreErrors.has(error.type)) {\r\n this.useStorage = false;\r\n console.error('[AS]: get error:', error, keys, storeName);\r\n }\r\n\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // deferred.reject(error);\r\n deferred.resolve(undefined);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }).finally(() => {\r\n if(this.getPromises.size) {\r\n this.getThrottled();\r\n }\r\n });\r\n }, THROTTLE_TIME, false);\r\n }\r\n\r\n public isAvailable() {\r\n return this.useStorage;\r\n }\r\n\r\n public getCache() {\r\n return this.cache;\r\n }\r\n\r\n public getFromCache(key: T) {\r\n return this.cache[key];\r\n }\r\n\r\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async get(key: T, useCache = true): Promise {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.getFromCache(key);\r\n } else if(this.useStorage) {\r\n const r = this.getPromises.get(key);\r\n if(r) return r as any;\r\n\r\n const p = deferredPromise();\r\n this.getPromises.set(key, p as any);\r\n\r\n this.getThrottled();\r\n\r\n return p;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public getAll() {\r\n return this.storage.getAll().catch(() => []);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n // console.log('storageSetValue', obj, callback, arguments);\r\n\r\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.setToCache(key, value);\r\n\r\n // let perf = /* DEBUG */false ? performance.now() : 0;\r\n // value = JSON.stringify(value);\r\n\r\n // if(perf) {\r\n // let elapsedTime = performance.now() - perf;\r\n // if(elapsedTime > 10) {\r\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\r\n // }\r\n // }\r\n\r\n /* perf = performance.now();\r\n value = stringify(value);\r\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\r\n\r\n if(canUseStorage) {\r\n this.keysToSet.add(key);\r\n this.keysToDelete.delete(key);\r\n this.saveThrottled();\r\n }\r\n }\r\n }\r\n\r\n return canUseStorage ? this.saveDeferred : Promise.resolve();\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n /* if(!this.cache.hasOwnProperty(key)) {\r\n return;\r\n } */\r\n\r\n // ! it is needed here\r\n key = '' + (key as string);\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n\r\n if(this.useStorage) {\r\n this.keysToSet.delete(key);\r\n this.keysToDelete.add(key);\r\n this.deleteThrottled();\r\n }\r\n\r\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\r\n }\r\n\r\n public clear(saveLocal = false) {\r\n if(!saveLocal) {\r\n for(const i in this.cache) {\r\n delete this.cache[i];\r\n }\r\n }\r\n\r\n return this.storage.clear().catch(noop);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return Promise.all(this.STORAGES.map((storage) => {\r\n storage.useStorage = enabled;\r\n\r\n if(!IS_WORKER || !clearWrite) {\r\n return;\r\n }\r\n\r\n if(!enabled) {\r\n storage.keysToSet.clear();\r\n storage.keysToDelete.clear();\r\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\r\n storage.getPromises.clear();\r\n return storage.clear(true);\r\n } else {\r\n return storage.set(storage.cache);\r\n }\r\n })).catch(noop);\r\n }\r\n\r\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\r\n this.STORAGES.forEach((storage) => storage.savingFreezed = true);\r\n try {\r\n callback();\r\n } catch(err) {\r\n console.error('freezeSaving callback error:', err);\r\n }\r\n this.STORAGES.forEach((storage) => storage.savingFreezed = false);\r\n }\r\n\r\n /* public deleteDatabase() {\r\n return IDBStorage.deleteDatabase().catch(noop);\r\n } */\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppStorage = AppStorage);\r\n","// Copyright Twitter Inc. Licensed under MIT\r\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\r\n\r\nconst originalString = '((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f??\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)';\r\nexport default originalString;\r\n"],"names":["MAIN_DOMAIN","threads","Math","min","navigator","hardwareConcurrency","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","location","hostname","suffix","cryptoWorkers","name","stores","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","Blob","type","blobSafeMimeType","indexOf","bufferConcats","args","length","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","forEach","b","set","ArrayBuffer","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","listeners","callback","addNotifyListener","push","deferred","Promise","resolve","reject","value","catch","finally","cancel","Object","assign","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","then","slice","bind","noop","copy","obj","Date","getTime","map","el","isView","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","keys","tx","every","key","isObject","object","safeAssign","fromObject","i","undefined","validateInitObject","initObject","currentObject","onReplace","previousKey","String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","abs","newMethod","originMethod","call","arrays","Uint16Array","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","recordPromiseBound","log","promise","description","perf","performance","now","warn","recordPromise","pause","ms","setTimeout","throttle","fn","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","capitalizeFirstLetter","string","charAt","toUpperCase","toggleStorages","enabled","clearWrite","tsNow","seconds","t","isAnyChat","peerId","isUser","CryptoMessagePort","super","lastIndex","invokeCryptoNew","method","transfer","payload","result","sendPortIndex","sendPorts","invoke","invokeCrypto","cryptoMessagePort","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","match","save","response","put","getFile","fileName","saveFile","blob","Response","headers","size","rejected","timeout","res","clearTimeout","prepareWriting","fileSize","getWriter","static","storage","MemoryWriter","saveFileCallback","bytes","write","part","offset","endOffset","newBytes","truncate","trim","finalize","saveToStorage","getParts","replaceParts","parts","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","IS_SAFARI","IS_FIREFOX","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","MTProtoMessagePort","INSTANCE","concat","toJSON","onFinally","reason","matchUrlProtocol","text","wrapUrl","url","unsafe","out","tgMeMatch","telescoPeMatch","tgMatch","onclick","u","URL","pathname","fullPath","path","split","window","ServiceMessagePort","LocalStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","clear","toggleStorage","LocalStorageController","proxy","apply","sessionStorage","StateStorage","stateStorage","AppStorage","db","storeName","getPromises","Map","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","from","values","e","deleteThrottled","getThrottled","has","isAvailable","getCache","getFromCache","setToCache","r","p","getAll","canUseStorage","add","names"],"sourceRoot":""} \ No newline at end of file diff --git a/public/61.21ea8f96aad63bd2211c.chunk.js b/public/61.b0e6e1510d2c80059b20.chunk.js similarity index 99% rename from public/61.21ea8f96aad63bd2211c.chunk.js rename to public/61.b0e6e1510d2c80059b20.chunk.js index 072ae5e7..09355519 100644 --- a/public/61.21ea8f96aad63bd2211c.chunk.js +++ b/public/61.b0e6e1510d2c80059b20.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";var t,e,n,r,a,o,f={2061:(t,e,n)=>{let r,a;const o=null;function f(t){return JSON.parse(JSON.stringify(t))}function c(t,e,n,a,o){for(r=0;r=0;--n)e=f(d(t[n],e));return e}function g(t){if(!t)throw Error("assert :P")}const P=function(){function t(t){return t==Ee||t==je||t==Ce||t==Fe}function e(t){return A(t,1)}function n(t,e){const n=1+((t.la-1)*e>>8),r=n<<8;let a=0;for(t.Z>=r?(a=1,t.la-=n,t.Z-=r):(a=0,t.la=n);t.la<128;)t.Z<<=1,t.la<<=1,8==++t.gc&&(t.gc=0,t.bc&&(t.Z+=t.qa[t.Ia++],t.bc--));return a}function P(t,e,n,r){(r-=n)>=2?(t.Z=e[n+0]<<8|e[n+1],t.qa=e,t.Ia=n+2,t.bc=r-2):(t.Z=0,t.qa=o,t.bc=0),t.la=255,t.gc=0}function A(t,e){var r=0,a=0;for(a=e-1;a>=0;a--)r|=n(t,128)<=8&&t.Q>>=8,t.T+=t.qa[t.Ia+t.Q]<<24>>>0,++t.Q,t.g-=8}function S(t){t.g>=8&&w(t),t.Q==t.ya&&32==t.g&&(t.L=1)}function T(t,e){let n=0;if(g(e>=0),!t.L&&e=32&&(t.L=1,t.g+e>32))return n;n=t.T>>t.g&fn[e],t.g+=e,t.g>=8&&t.g>=8&&w(t)}else t.fa=1;return n}function y(t){return t.Pa==t.gb}function R(t,e){return g(t!=o),0==e?0:(t.gb=2*e-1,t.Y=p(t.gb,En),t.Y==o?0:(t.Y[0].s=-1,t.Pa=1))}function V(t){t!=o&&(t.Y=o,t.Y=o,t.gb=0,t.Pa=0)}function O(t,e,n,r){for(var a=t.Y,o=0,f=+t.gb;r-- >0;){if(o>=f)return 0;if(a[o].s<0){if(y(t))return 0;const e=t,n=e.Y,r=+e.Pa;a[o].s=r-o,e.Pa+=2,n[r+0].s=-1,n[r+1].s=-1}else if(0==a[o].s)return 0;o+=a[o].s+(n>>r&1)}if(a[o].s<0)a[o].s=0;else if(0!=a[o].s)return 0;return a[o].kc=e,1}function I(t,e,n){var r=0;let a=0,f=0;for(g(t!=o),g(e!=o),r=0;r0&&(++a,f=r);if(!R(t,a))return 0;if(1==a)return f<0||f>=n?(V(t),0):O(t,f,0,0);if(a=0,f=d(n,0),f==o)return(a=a&&y(t))||V(t),a;var c=0;c=0,r=d(gn+1,0);let i=0;const u=d(gn+1,0);let b=0;for(g(e!=o),g(n>0),g(f!=o),c=0;cb&&(b=e[c]);if(b>gn)r=0;else{for(c=0;c0?u[e[c]]++:Cn;r=1}if(!r)return(a=a&&y(t))||V(t),a;for(r=0;r0&&!O(t,r,f[r],e[r]))return(a=a&&y(t))||V(t),a;return(a=y(t))||V(t),a}function _(t,e,n,r,a,o,f){var c=0;for(c=0;ct.P.v)&&(n=0==e)){t:{let e=t.Ga;var a=t.G,i=t.ub;n=t.P.l;let h=t.P.v;const p=t.Xb;var u=[o];let v=o,P=h*n;var b=o,s=o;s="WEBP_FILTER_TYPE";let A=0;u=0;var l=0;let k=0;if(g(n>0&&h>0&&r>=n),g(e!=o&&p!=o),i<=yn)n=0;else if(k=e[a+0]>>0&3,s=e[a+0]>>2&3,A=e[a+0]>>4&3,u=e[a+0]>>6&3,kVn||s>=Tr||A>On||0!=u)n=0;else{if(k==Rn)l=i>=P,u=e,v=a+yn;else{if(u=d(P,0),v=0,u==o){n=0;break t}l=a+yn,i-=yn,a=u,b=f(tn);let t=0;const r=qt();r==o?l=0:(r.l=n,r.v=h,r.N=b,st(Oe),b.put=Pe,b.Mb=ge,b.Pb=Ae,b.ka=o,b.ka=a,b.fd=0,b.width=n,b.height=h,r.a=ze,m(r.o,e,l,i),r.Wa=Ar,Jt(n,h,1,r,o)&&Yt(r,n)&&(r.Wa=Pr,t=Ht(r,r.V,r.Ha,r.l,r.v,xt)),r!=o&&Kt(r),l=t)}if(l){for(e=yr[s],e!=o?(b=d(P,0),b==o&&(l=0,k!=Rn&&(v=u=o)),e(u,v,n,h,1,n,b,s=0),P=b,k=s):(P=u,k=v),e=0;h-- >0;)c(p,e,P,k,n),k+=n,e+=r;A==On&&(l=u==o||v<=0||n<=0?0:1)}n=l}}n=!n}return n?o:0==e?t.Xb:+e*r}function U(t,e,n,r){if(r==o||t<=0||e<=0)return Ke;if(n!=o){if(n.Ua){const r=n.wc,a=n.vc,o=-2&n.t,f=-2&n.k;if(o<0||f<0||r<=0||a<=0||o+r>t||f+a>e)return Ke;t=r,e=a}if(n.I){if(n.Ba<=0||n.Aa<=0)return Ke;t=n.Ba,e=n.Aa}}return r.width=t,r.height=e,function(t){let e=t.width;const n=t.height;let r=t.J;if(e<=0||n<=0||!(r>=Ie&&r=Ie&&f=c*Rr[f],r&=t.ma!=o):(u=(t=t.c.Va).nb*parseInt((i+1)/2,10),b=t.rb*parseInt((i+1)/2,10),s=t.Fa*i,r&=t.F*i<=t.Wc,r&=u<=t.Rc,r&=b<=t.Uc,r&=s<=t.Wb,r&=t.F>=c,r&=t.nb>=parseInt((c+1)/2,10),r&=t.rb>=parseInt((c+1)/2,10),r&=t.y!=o,r&=t.c!=o,r&=t.S!=o,f==Ne&&(r&=t.Fa>=c,r&=s<=t.Wb,r&=t.p!=o)):r=0,r?ze:Ke}(r)}function M(t){return-256&t?t<0?0:255:t}function B(t,e,n,r){const a=d(16,0);let o,f;for(o=0,f=0;f<4;++f){var c=t[e+0]+t[e+8],i=t[e+0]-t[e+8],u=(t[e+4]*Br>>16)-(t[e+12]*Mr>>16),b=(t[e+4]*Mr>>16)+(t[e+12]*Br>>16);a[o+0]=c+b,a[o+1]=i+u,a[o+2]=i-u,a[o+3]=c-b,o+=4,e++}for(f=o=0;f<4;++f)c=(t=a[o+0]+4)+a[o+8],i=t-a[o+8],u=(a[o+4]*Br>>16)-(a[o+12]*Mr>>16),b=(a[o+4]*Mr>>16)+(a[o+12]*Br>>16),n[r+0+0*nr]=M(n[r+0+0*nr]+(c+b>>3)),n[r+1+0*nr]=M(n[r+1+0*nr]+(i+u>>3)),n[r+2+0*nr]=M(n[r+2+0*nr]+(i-u>>3)),n[r+3+0*nr]=M(n[r+3+0*nr]+(c-b>>3)),o++,r+=nr}function D(t,e,n,r,a){B(t,e,n,r),a&&B(t,e+16,n,r+4)}function E(t,e,n,r){Cr(t,e+0,n,r+0,1),Cr(t,e+32,n,r+4*nr,1)}function C(t,e,n,r){let a;for(t=t[e+0]+4,a=0;a<4;++a)for(e=0;e<4;++e)n[r+e+a*nr]=M(n[r+e+a*nr]+(t>>3))}function F(t,e,n,r){t[e+0]&&C(t,e+0,n,r+0),t[e+16]&&C(t,e+16,n,r+4),t[e+32]&&C(t,e+32,n,r+4*nr),t[e+48]&&C(t,e+48,n,r+4*nr+4)}function G(t,e,n){const r=e-nr,a=Wr,o=255-t[r-1];let f;for(f=0;f>2}function H(t,e,n){let r,a;for(r=0;r<8;++r)for(a=0;a<8;++a)e[n+a+r*nr]=t}function z(t,e,n){const r=t[e-n],a=t[e+0],o=3*(a-r)+Ir[1020+t[e-2*n]-t[e+n]],f=_r[112+(o+4>>3)];t[e-n]=Wr[255+r+_r[112+(o+3>>3)]],t[e+0]=Wr[255+a-f]}function q(t,e,n,r){const a=t[e+0],o=t[e+n];return Vr[255+t[e-2*n]-t[e-n]]>r||Vr[255+o-a]>r}function K(t,e,n,r,a){const o=t[e-3*n],f=t[e-2*n],c=t[e-n],i=t[e+0],u=t[e+n],b=t[e+2*n],s=t[e+3*n];return 2*Vr[255+c-i]+Or[255+f-u]>r?0:Vr[255+t[e-4*n]-o]<=a&&Vr[255+o-f]<=a&&Vr[255+f-c]<=a&&Vr[255+s-b]<=a&&Vr[255+b-u]<=a&&Vr[255+u-i]<=a}function J(t,e,n,r){let a;for(a=0;a<16;++a)2*Vr[255+t[e+a-n]-t[e+a+0]]+Or[255+t[e+a-2*n]-t[e+a+n]]<=r&&z(t,e+a,n)}function Y(t,e,n,r){let a;for(a=0;a<16;++a)2*Vr[255+t[e+a*n-1]-t[e+a*n+0]]+Or[255+t[e+a*n-2]-t[e+a*n+1]]<=r&&z(t,e+a*n,1)}function x(t,e,n,r){let a;for(a=3;a>0;--a)J(t,(e+=4*n)+0,n,r)}function Q(t,e,n,r){let a;for(a=3;a>0;--a)Y(t,(e+=4)+0,n,r)}function $(t,e,n,r,a,o,f,c){for(;a-- >0;){if(K(t,e+0,n,o,f))if(q(t,e+0,n,c))z(t,e+0,n);else{const r=t,a=e+0,o=n,f=r[a-2*o],c=r[a-o],u=r[a+0],b=r[a+o],s=r[a+2*o];var i=Ir[1020+3*(u-c)+Ir[1020+f-b]];const l=27*i+63>>7,h=18*i+63>>7;i=9*i+63>>7,r[a-3*o]=Wr[255+r[a-3*o]+i],r[a-2*o]=Wr[255+f+h],r[a-o]=Wr[255+c+l],r[a+0]=Wr[255+u-l],r[a+o]=Wr[255+b-h],r[a+2*o]=Wr[255+s-i]}e+=r}}function X(t,e,n,r,a,o,f,c){for(;a-- >0;){if(K(t,e+0,n,o,f))if(q(t,e+0,n,c))z(t,e+0,n);else{const r=t,a=e+0,o=n,f=r[a-o],c=r[a+0],u=r[a+o];var i=3*(c-f);const b=_r[112+(i+4>>3)];i=_r[112+(i+3>>3)];const s=b+1>>1;r[a-2*o]=Wr[255+r[a-2*o]+s],r[a-o]=Wr[255+f+i],r[a+0]=Wr[255+c-b],r[a+o]=Wr[255+u-s]}e+=r}}function Z(t,e,n,r,a,o){$(t,e+0,n,1,16,r,a,o)}function tt(t,e,n,r,a,o){$(t,e+0,1,n,16,r,a,o)}function et(t,e,n,r,a,o){let f;for(f=3;f>0;--f)X(t,(e+=4*n)+0,n,1,16,r,a,o)}function nt(t,e,n,r,a,o){let f;for(f=3;f>0;--f)X(t,(e+=4)+0,1,n,16,r,a,o)}function rt(t,e,n,r,a,o,f,c){$(t,e,a,1,8,o,f,c),$(n,r,a,1,8,o,f,c)}function at(t,e,n,r,a,o,f,c){$(t,e,1,a,8,o,f,c),$(n,r,1,a,8,o,f,c)}function ot(t,e,n,r,a,o,f,c){X(t,e+4*a,a,1,8,o,f,c),X(n,r+4*a,a,1,8,o,f,c)}function ft(t,e,n,r,a,o,f,c){X(t,e+4,1,a,8,o,f,c),X(n,r+4,1,a,8,o,f,c)}function ct(t,e){return e==Gn?0==t.i?0==t.d?Jn:Kn:0==t.d?qn:Gn:e}function it(t,e,n,a){for(r=0;r<4;++r)t[e+r]=n[a+r]}function ut(t,e){return t<0?0:t>e?e:t}function bt(t){t.a="VP8_STATUS_OK",t.xc="OK"}function st(t){t>>>8!=Oe>>>8&&alert("mismatch error")}function lt(t,e,n){return t.a==ze&&(t.a=e,t.xc=n,t.za=0),0}function ht(t,a){let c=[0],i=0;var u=[0],b=f(cr),s=f(ir);let l=f(rn);if(u="VP8StatusCode",b=f(nn),t==o)return alert("(dec == null)"),0;if(bt(t),a==o)return lt(t,"VP8_STATUS_INVALID_PARAM","null VP8Io passed to VP8GetHeaders()");if(b.data=a.data,b.b=a.b,b.e=a.e,b.b=[b.b],b.e=[b.e],(u=Se(b=[b]))!=ze)return lt(t,u,"Incorrect/incomplete header.");if((b=b[0]).b=b.b[0],b.e=b.e[0],b.ia)return lt(t,Je,"Unexpected lossless format encountered.");if(t.Ga==o&&(g(0==t.ub),t.Ga=b.$,t.G=b.G,t.ub=b.pa),i=b.data,c=b.b+b.offset,u=b.e-b.offset,g(b.e>=b.offset),u[0]<4)return lt(t,$e,"Truncated header.");if(l=i[c+0]|i[c+1]<<8|i[c+2]<<16,(b=t.Ac).fb=!(1&l)+0,b.Jc=l>>1&7,b.Nc=l>>4&1,b.Ra=l>>5,b.Jc>3)return lt(t,"VP8_STATUS_BITSTREAM_ERROR","Incorrect keyframe parameters.");if(!b.Nc)return lt(t,"VP8_STATUS_UNSUPPORTED_FEATURE","Frame not displayable.");if(c+=3,u-=3,s=t.P,b.fb){if(u<7)return lt(t,"VP8_STATUS_NOT_ENOUGH_DATA","cannot parse picture header");if(!(u>=3&&157==i[c+0]&&1==i[c+1]&&42==i[c+2]))return lt(t,"VP8_STATUS_BITSTREAM_ERROR","Bad code word");for(s.l=16383&(i[c+4]<<8|i[c+3]),s.gd=i[c+4]>>6,s.v=16383&(i[c+6]<<8|i[c+5]),s.hd=i[c+6]>>6,c+=7,u-=7,t.Ma=s.l+15>>4,t.hb=s.v+15>>4,a.width=s.l,a.height=s.v,a.I=0,a.Ua=0,a.k=0,a.t=0,a.Ka=a.width,a.K=a.height,a.m=a.width,a.h=a.height,l=t.R,r=0;ru)return lt(t,"VP8_STATUS_NOT_ENOUGH_DATA","bad partition length");l=t.o,P(l,i,c,c+b.Ra),c+=b.Ra,u-=b.Ra,b.fb&&(s.uc=e(l),s.$c=e(l)),s=l;var h=t.Ca;let d=t.R;if(g(s!=o),g(h!=o),h.pb=e(s),h.pb){if(h.ob=e(s),e(s)){var p;for(h.tb=e(s),p=0;p0)if(t.Ca.pb)for(d=0;du&&(w=s),P(t.ic[+m],d,p,S),d=w,p=S,h+=3}P(t.ic[+v],d,p,u),u=p0){t.yb[w]=t.yb[0];continue}S=u}const e=t.yb[w];e.sc[0]=oa[ut(S+s,127)],e.sc[1]=fa[ut(S+0,127)],e.sb[0]=2*oa[ut(S+h,127)],e.sb[1]=101581*fa[ut(S+d,127)]>>16,e.sb[1]<8&&(e.sb[1]=8),e.qc[0]=oa[ut(S+p,117)],e.qc[1]=fa[ut(S+v,127)]}if(!b.fb)return lt(t,Ye,"Not a key frame.");for(t.Zc=259,e(l),u=t.R,s=0;s0)+0],16==o||!n(t,c[0]))return o}else c=e[sa[o]][0];if(16==o)return 16}}function pt(t,e){return((16777216*t[0]+65536*t[1]+256*t[2]+1*t[3])*va&4278190080)>>e}function vt(t,e){let a,f=0;if(t==o)return 0;if(e==o)return lt(t,"VP8_STATUS_INVALID_PARAM","NULL VP8Io parameter in VP8Decode().");if(!t.za&&!ht(t,e))return 0;if(g(t.za),e.Mb&&!e.Mb(e))lt(t,Qe,"Frame setup failed"),a=t.a;else{e.Za&&(t.A=0);const n=ea[t.A];2==t.A?(t.lb=0,t.mb=0):(t.lb=e.t-n>>4,t.mb=e.k-n>>4,t.lb<0&&(t.lb=0),t.mb<0&&(t.mb=0)),t.Ya=e.K+15+n>>4,t.wb=e.Ka+15+n>>4,t.wb>t.Ma&&(t.wb=t.Ma),t.Ya>t.hb&&(t.Ya=t.hb),a=ze}if(f=a==ze){if(f){let n,r;t:{if(t.Ja=0,t.qb){const e=t.rc;if(!WebPWorkerReset(e)){n=lt(t,qe,"thread initialization failed.");break t}e.Qd=t,e.Rd=t.oa.N,e.Ud=FinishRow,t.jb=t.A>0?na:na-1}else t.jb=ra;n=1}if(!(r=!n)){let e;t:{const n=t.jb,r=t.Ma,a=4*r,f=32*r,c=r+1,i=t.A>0?r*(t.qb?2:1):0,s=rr,l=f*(16*n+parseInt(3*ea[t.A]/2,10)),h=t.Ga!=o?t.P.l*t.P.v:0,p=a+f+c+i+s+384+l+h+ta;if(p!=p)e=0;else{if(p>t.Gb){if(t.ib=0,t.Gb=0,t.ib==o){e=lt(t,"VP8_STATUS_OUT_OF_MEMORY","no memory during frame initialization.");break t}t.Gb=p}t.dc=205,t.Xc=b(205,16*r),t.Sc=b(205,8*r),t.Vc=b(205,8*r),t.M=i?u(lr,i):o,t.Sd=i?0:o,t.oa.ha=0,t.oa.M=t.M,g(0==(s&ta)),t.Ea=b(205,1*s),t.z=-12851,t.H=16*r,t.r=8*r;const f=ea[t.A],v=f*t.H,P=f/2*t.r;t.ca=d(l,205),t.da=+v,t.aa=t.ca,t.ba=t.da+16*n*t.H+P,t.ra=t.aa,t.sa=t.ba+8*n*t.r+P,t.Xb=h?d(h,0):o,t.La=u(hr,c),t.dc=b(Gn,a),e=1}}r=!e}if(r)f=0;else{if(e.width=t.P.l,e.height=t.P.v,e.w=0,e.y=t.ca,e.D=t.da,e.c=t.aa,e.B=t.ba,e.S=t.ra,e.C=t.sa,e.F=t.H,e.Da=t.r,e.p=o,e.q=o,!Ur){let t;for(t=-255;t<=255;++t)Vr[255+t]=t<0?-t:t,Or[255+t]=Vr[255+t]>>1;for(t=-1020;t<=1020;++t)Ir[1020+t]=t<-128?-128:t>127?127:t;for(t=-112;t<=112;++t)_r[112+t]=t<-16?-16:t>15?15:t;for(t=-255;t<=510;++t)Wr[255+t]=t<0?0:t>255?255:t;Ur=1}Cr=D,Fr=E,Gr=C,Nr=F,Lr=Z,Hr=tt,zr=rt,qr=at,Kr=et,Jr=nt,Yr=ot,xr=ft,Qr=J,$r=Y,Xr=x,Zr=Q,f=1}}if(f)t:{for(t.d=0;t.d0&&u.d>=u.mb&&u.d<=u.Ya)+0,t.i=0;t.i0);A=-k,W[W[W.length-1]+P]=A,h[p]=A,p++}D[v]=A}}else{for(A=n(u,156)?n(u,128)?zn:Hn:n(u,163)?Ln:Nn,e.Eb[0]=A,k=0;k<4;++k)W[k+W[W.length-1]]=A;for(k=0;k<4;++k)D[k]=A}if(e.Tc=n(u,142)?n(u,114)?n(u,183)?zn:Hn:Ln:Nn,u.Ab)s=0;else{if(g.Nb)l.X=g.X=0,e.wa||(l.ua=g.ua=0),e.ja=0,e.Oa=0;else{let t=0,n=0;var m=0,w=da;const r=e.yb[e.Lb];var S=e.z;const a=e.La[0],f=d(4,0),c=d(4,0);let u=d(4,0),s=d(4,0),l=0,h=0;var T=0;let p=0,v=0;if(S=b(0,384),e.wa)m=0,w=e.R.z[3];else{const t=d(16,0);var y=g.ua+a.ua;g.ua=a.ua=(dt(o,e.R.z[1],y,r.sb,0,t)>0)+0,m=1,w=e.R.z[0];var R=t,V=S,O=d(16,0),I=0;for(I=0;I<4;++I){var _=R[0+I]+R[12+I],U=R[4+I]+R[8+I],M=R[4+I]-R[8+I],B=R[0+I]-R[12+I];O[0+I]=_+U,O[8+I]=_-U,O[4+I]=B+M,O[12+I]=B-M}for(I=0;I<4;++I){const t=V[V.length-1],e=O[0+4*I]+3;_=e+O[3+4*I],U=O[1+4*I]+O[2+4*I],M=O[1+4*I]-O[2+4*I],B=e-O[3+4*I],V[t+0]=_+U>>3,V[t+16]=B+M>>3,V[t+32]=_-U>>3,V[t+48]=B-M>>3,V[V.length-1]+=64}S[S.length-1]=0}for(u=i(pa[15&g.X]),s=i(pa[15&a.X]),p=0;p<4;++p){var j=s[p];for(T=0;T<4;++T){y=j+u[T];var G=dt(o,w,y,r.sc,m,S);u[T]=j=(G>0)+0,c[T]=(0!=S[S[S.length-1]+0])+0,f[T]=(G>1)+0,S[S.length-1]+=16}s[p]=j,h|=pt(c,24-4*p),l|=pt(f,24-4*p)}for(t=pt(u,24),n=pt(s,24),u=i(pa[g.X>>4]),s=i(pa[a.X>>4]),v=0;v<4;v+=2){for(p=0;p<2;++p){for(j=s[v+p],T=0;T<2;++T)y=j+u[v+T],G=dt(o,e.R.z[2],y,r.qc,0,S),u[v+T]=j=(G>0)+0,c[2*p+T]=(0!=S[S[S.length-1]+0])+0,f[2*p+T]=(G>1)+0,S[S.length-1]+=16;s[v+p]=j}h|=pt(c,8-2*v),l|=pt(f,8-2*v)}t|=pt(u,20),n|=pt(s,20),g.X=t,a.X=n,e.z=S,e.Oa=l+0,e.ja=l|h,g.Nb=!e.ja+0}s=!o.Ab}if(!s){f=lt(t,"VP8_STATUS_NOT_ENOUGH_DATA",`Premature end-of-file encountered.${t.i} ${t.d}`);break t}const E=t,C=E.Ea,F=ar,J=E.Ea,Y=or,x=E.Ea,Q=fr;if(E.i>0){var N=0;for(N=-1;N<16;++N)it(C,F+N*nr-4,C,F+N*nr+12);for(N=-1;N<8;++N)it(J,Y+N*nr-4,J,Y+N*nr+4),it(x,Q+N*nr-4,x,Q+N*nr+4)}else{for(N=0;N<16;++N)C[F+N*nr-1]=129;for(N=0;N<8;++N)J[Y+N*nr-1]=129,x[Q+N*nr-1]=129;E.d>0&&(C[F-1-nr]=J[Y-1-nr]=x[Q-1-nr]=129)}const Z=E.Xc,tt=16*+E.i,et=E.Sc,nt=8*+E.i,rt=E.Vc,at=8*+E.i,ot=E.z;let ft=0;if(E.d>0)c(C,F-nr,Z,tt,16),c(J,Y-nr,et,nt,8),c(x,Q-nr,rt,at,8);else if(0==E.i){for(r=0;r<21;++r)C[F-nr-1+r]=127;for(r=0;r<9;++r)J[Y-nr-1+r]=127;for(r=0;r<9;++r)x[Q-nr-1+r]=127}if(E.wa){const t=F-nr+16;E.d>0&&(E.i>=E.Ma-1?C[t+0]=C[t+1]=C[t+2]=C[t+3]=Z[tt+15]:c(C,t+0,Z,tt+16,4));for(let e=0;e<4;++e)C[e+t+4*nr]=C[e+t+4*nr]=C[e+t+8*nr]=C[e+t+12*nr]=C[e+t+0];for(ft=0;ft<16;ft++){var L=C,H=F+aa[ft];Dr[E.Eb[ft]](L,H),E.Oa&1<0){const t=ht.M[1+ht.i],e=ht.La[1+ht.i].Nb;let n=ht.Zb[ht.Lb];ht.ga.oc&&(n+=ht.ga.Lc[0],ht.wa&&(n+=ht.ga.Gc[0])),n=n<0?0:n>63?63:n,t.zc=n,ht.ga.kb>0&&(n=ht.ga.kb>4?n>>2:n>>1,n>9-ht.ga.kb&&(n=9-ht.ga.kb)),t.yc=n<1?1:n,t.ab=(!e||ht.wa)+0}var K=0,$=8*ht.Ja*ht.r,X=ht.ca,ut=ht.da+16*ht.i+16*ht.Ja*ht.H,bt=ht.aa,st=ht.ba+8*ht.i+$,vt=ht.ra,Pt=ht.sa+8*ht.i+$;for(K=0;K<16;++K)c(X,ut+K*ht.H,ht.Ea,+ar+K*nr,16);for(K=0;K<8;++K)c(bt,st+K*ht.r,ht.Ea,+or+K*nr,8),c(vt,Pt+K*ht.r,ht.Ea,+fr+K*nr,8)}const E=t,C=e;var At=1;const F=E.oa;if(E.qb){const t=E.rc;if(At&=WebPWorkerSync(t),g(t.a==OK),At){if(F.N=C,F.ha=E.Ja,F.d=E.d,F.W=E.W,F.W){const t=F.M;F.M=E.M,E.M=t}WebPWorkerLaunch(t),++E.Ja==E.jb&&(E.Ja=0)}}else{F.d=E.d,F.W=E.W;e:{let t=1;const e=E.oa,n=ea[E.A],r=n*E.H,a=parseInt(n/2)*E.r,f=16*e.ha*E.H,i=8*e.ha*E.r,u=E.ca,b=E.da-r+f,s=E.aa,l=E.ba-a+i,h=E.ra,d=E.sa-a+i,p=0==e.d,v=(e.d>=E.hb-1)+0;var kt=16*e.d;let P=16*(e.d+1);if(e.W){const t=E;let e=0;const n=t.oa.d;for(g(t.oa.W),e=t.lb;e0&&$r(u,b,c,h+4),i.ab&&Zr(u,b,c,h),o>0&&Qr(u,b,c,h+4),i.ab&&Xr(u,b,c,h);else{const t=r.r,e=r.aa,n=r.ba+8*f.ha*t+8*a,d=r.ra,p=r.sa+8*f.ha*t+8*a,v=r.Ac.fb?s>=40?2:s>=15?1:0:s>=40?3:s>=20?2:s>=15?1:0;a>0&&(Hr(u,b,c,h+4,l,v),qr(e,n,d,p,t,h+4,l,v)),i.ab&&(Jr(u,b,c,h,l,v),xr(e,n,d,p,t,h,l,v)),o>0&&(Lr(u,b,c,h+4,l,v),zr(e,n,d,p,t,h+4,l,v)),i.ab&&(Kr(u,b,c,h,l,v),Yr(e,n,d,p,t,h,l,v))}}}if(C.put){if(p?(C.y=E.ca,C.D=E.da+f,C.c=E.aa,C.B=E.ba+i,C.S=E.ra,C.C=E.sa+i):(kt-=n,C.y=u,C.D=b,C.c=s,C.B=l,C.S=h,C.C=d),v||(P-=n),P>C.K&&(P=C.K),E.Ga!=o&&kt>1),C.C+=E.r*(t>>1),C.p!=o&&(C.q+=C.width*t)}kt>1,C.C+=C.t>>1,C.p!=o&&(C.q+=C.t),C.w=kt-C.k,C.m=C.Ka-C.t,C.h=P-kt,t=C.put(C))}e.ha+1==E.jb&&!v&&(c(E.ca,E.da-r,u,b+16*E.H,r),c(E.aa,E.ba-a,s,l+8*E.r,a),c(E.ra,E.sa-a,h,d+8*E.r,a)),At=t}}if(!At){f=lt(t,"VP8_STATUS_USER_ABORT","Output aborted.");break t}}let a;if(!(a=t.qb&&!WebPWorkerSync(t.rc))){let e;(e=t.fc>0)&&(g(t),g(t.fc>0),e=!1),a=e}f=a?0:1}const a=f;e.Pb&&e.Pb(e),f=1&a}return f?(t.za=0,f):(gt(t),0)}function gt(t){t!=o&&(t.ib&&(t.ib=0),t.ib=o,t.Gb=0,t.za=0)}function Pt(t,e){return t+(1<>e}function At(t,e,n,r,a){const o=Ga[n]+Na[e]>>ga;e=Fa[e],r[a+0]=La[t+Ca[n]-Pa],r[a+1]=La[t+o-Pa],r[a+2]=La[t+e-Pa]}function kt(t,e,n,r,a){const o=Ga[n]+Na[e]>>ga;e=Fa[e],r[a+0]=248&La[t+Ca[n]-Pa]|La[t+o-Pa]>>5,r[a+1]=La[t+o-Pa]<<3&224|La[t+e-Pa]>>3}function mt(t,e,n,r,a){r[a+0]=255,At(t,e,n,r,a+1)}function wt(t,e,n,r,a){const o=Fa[e];r[a+0]=Ha[t+Ca[n]-Pa]<<4|Ha[t+(Ga[n]+Na[e]>>ga)-Pa],r[a+1]=15|Ha[t+o-Pa]<<4}function St(t,e,n,r,a){const o=Ca[n];n=Ga[n]+Na[e]>>ga,r[a+0]=La[t+Fa[e]-Pa],r[a+1]=La[t+n-Pa],r[a+2]=La[t+o-Pa]}function Tt(t,e,n,r,a){St(t,e,n,r,a),r[a+3]=255}function yt(t,e,n,r,a){At(t,e,n,r,a),r[a+3]=255}function Rt(t,e,n){t[e]=((((4278255360&t[e])>>>0)+((4278255360&n)>>>0)&4278255360)>>>0|(16711935&t[e])+(16711935&n)&16711935)>>>0}function Vt(t,e){return((4278124286&(t^e))>>>1)+((t&e)>>>0)>>>0}function Ot(t){return t<256&&t>0?t:t<=0?0:~t>>24&255}function It(t,e){return Ot(t+parseInt((t-e)/2,10))}function _t(){return pn}function Wt(t,e){return(t&=255)>127&&(t-=256),(e&=255)>127&&(e-=256),t*e>>>5}function Ut(t,e,n,r,a,o,f){var c=0;const i=8>>t.n,u=t.U,b=t.u;if(i<8){t=(1<>8&255),o[f++]=b[e&s],e>>=i}}else for(c=e;c>8&255]}function Mt(t,e,n,r,a){for(n=e+n;e>16&255,r[a++]=n>>8&255,r[a++]=n>>0&255,r[a++]=n>>24&255}}function Bt(t,e,n,r,a){for(n=e+n;e>16&240|n>>12&15,r[a++]=n>>0&240|n>>28&15}}function Dt(t,e,n,r,a){for(n=e+n;e>24&255,r[a++]=n>>16&255,r[a++]=n>>8&255,r[a++]=n>>0&255}}function Et(t,e,n,r){return T(t,8)!=un?0:(e[0]=T(t,bn)+1,n[0]=T(t,bn)+1,r[0]=T(t,1),T(t,sn),1)}function jt(t,e){let n=0;return t<4?t+1:(n=t-2>>1,(2+(1&t)<e.ya){var n=t.Y,r=0;for(g(n!=o);0!=n[r].s;){var a=n,f=e;const t=f.T>>f.g&1;f.L?f.fa=1:(++f.g,f.g>=8&&w(f),f.Q==f.ya&&32==f.g&&(f.L=1)),r=r+a[r].s+t}return n[r].kc}for(r=0,g((n=t.Y)!=o);0!=n[r].s;)a=n,f=e.T>>e.g&1,++e.g,r=r+a[r].s+f;return n[r].kc}function Ft(t,e){if(t!=o){var n=0,r=0;for(n=0;n>t.eb)+(e>>t.eb)])0;){e=t.nc[a];let V=i;var h=b,d=l;switch(l=r,b=n,g(V<(p=u)),g(p<=e.Vb),e.Qc){case Sn:for(h=0,e=b+(p-V)*e.U;b>8&255,P=16711935&(P=(P=(16711935&p[d])>>>0)+(v<<16|v));l[b++]=((4278255360&p[d])>>>0|P)>>>0,32==V&&h++}break;case mn:var A=V;if(h=p,d=l,v=b,P=(T=e).U,0==A){var k=0;for(Rt(d,v,pn),k=1;k>T.n)*w;A>8&15],k=1;k>8&15]),e=t(d[v+k-1],d,v+k-P),Rt(d,v+k,e)}v+=P,0==(++A&m)&&(T+=w)}p!=e.Vb&&c(l,b-(e=e.U),l,b+(p-V-1)*e,e);break;case wn:for(h=e.U,d=(1<>e.n)*v;V>0&255,T.Bc=S>>8&255,T.Kc=S>>16&255),T=(S=l[b+w])>>>8,y=S>>>16,R=S,y+=Wt(m.Cc,T),y&=255,R+=Wt(m.Bc,T),R+=Wt(m.Kc,y),R&=255,l[b+w]=(4278255360&S|y<<16|R)>>>0;b+=h,++V,0==(V&d)&&(e+=v)}break;case Tn:h==l&&e.n>0?(h=(p-V)*Pt(e.U,e.n),s(l,d=b+(p-V)*e.U-h,l,b,h),Ut(e,V,p,l,d,l,b)):Ut(e,V,p,h,d,l,b)}b=r,l=n}}function Lt(t,e){var n=t.V,r=t.Ha+t.l*t.O;if(!((o=e-t.O)<=0)){Nt(t,o,n,r);var a=t.N;n=t.Xa;let l=[t.vb];r=t.O;var o=e,f=l,c=a.width;if(g(ra.K&&(o=a.K),r=o?r=0:(f[0]+=a.t,a.w=r-a.k,a.m=a.Ka-a.t,a.h=o-r,r=1),r){if(l=l[0],r=t.Ib,o=a.width,r.J0;){const t=n;let r=l,a=i;const b=f;let h=e;switch(c){case Ie:for(a=r+a;r>16&255,b[h++]=s>>8&255,b[h++]=s>>0&255}break;case _e:Mt(t,r,a,b,h);break;case Ee:Mt(t,r,a,b,h),WebPApplyAlphaMultiply(b,0,a,1,0);break;case We:for(a=r+a;r>0&255,b[h++]=s>>8&255,b[h++]=s>>16&255;break;case Ue:Dt(t,r,a,b,h);break;case je:Dt(t,r,a,b,h),WebPApplyAlphaMultiply(b,0,a,1,0);break;case Me:Dt(t,r,a,b,h);break;case Ce:Dt(t,r,a,b,h),WebPApplyAlphaMultiply(b,1,a,1,0);break;case Be:Bt(t,r,a,b,h);break;case Fe:Bt(t,r,a,b,h),WebPApplyAlphaMultiply4444(b,a,1,0);break;case De:for(a=r+a;r>16&248|s>>13&7,b[h++]=s>>5&224|s>>3&31;break;default:g(0)}l+=o,e+=u}n=a}t.xa+=n}else t.xa=a.I?EmitRescaledRowsYUVA(t,n,l,o,a.h):EmitRowsYUVA(t,n,l,o,a.m,a.h);g(t.xa<=r.height)}t.O=e,g(t.O<=t.v)}}function Ht(t,e,n,r,a,f){let c=1,i=0,u=0;const b=t.o,s=t.cb;let l=s.Db,h=n,d=n;n+=r*a;const p=(a=Pn+An)+s.xb,v=s.xb>0?s.Yb:o,P=s.Dc;let A=!1;for(g(l!=o);!b.L&&h>>0)+(A<<16)+(c<<8)+k}if(A=!1,++h,++i,i>=r&&(i=0,++u,f!=o&&u%wa==0&&f(t,u),v!=o))for(;d>>v.bb]=c}else if(wDa?k-=Da:(w=Ea[k-1],w=(w>>4)*r+(8-(15&w)),k=w>=1?w:1),w=0,w=0;w=r;)i-=r,++u,f!=o&&u%wa==0&&f(t,u);if(h>>v.bb]=c}else if(w>>v.bb]=w;w=e,k=h,g(A<=-1>>>(m=v).bb),w[k]=m.ea[A],A=!0;continue}(c=!b.fa)||End}return f!=o&&f(t,u),b.fa||!c||b.L&&h16?0:h>4?1:h>2?2:3,l[0]=Pt(c.U,v),c.n=v,l=v=Jt(h,1,0,_,c.u))if(l=h,v=0,h=1<<(8>>>(_=c).n)>>>0,(P=Array(h))==o)l=0;else{A=_.u[0];var k=_.b;for(P[0]=_.u[0][_.b+0],v=1;v>>0)+((4278255360&P[v-1])>>>0)&4278255360)>>>0|(16711935&A[k+v])+(16711935&P[v-1])&16711935)>>>0;for(;v=1&&s<=hn)){r.a=Je;break}if(c)t:{c=r;var m=t[0],w=e[0],_=(l=s,k=A=0,k=c.o,c.cb);if(v=[o],h=o,P=1,n&&T(k,1)){if(w=(m=Pt(m,A=T(k,3)+2))*(W=Pt(w,A)),!Jt(m,W,0,c,v)){c.a=Je,Ft(h,P),c=0;break t}for(v=v[0],_.eb=A,A=0;A>>8&65535,v[A]=m,m>=P&&(P=m+1)}if(k.fa)Ft(h,P),c=0;else if(g(P<=65536),(h=p(P,mr))==o)c.a=qe,Ft(h,P),c=0;else{for(A=0;A0&&(m+=1<=t){(E=E&&y(e))||V(e),U=E;break n}if(!O(e,M[j],B[j],D[j])){(E=E&&y(e))||V(e),U=E;break n}}(E=(E=1)&&y(e))||V(e),U=E}else U=0}}else{if(U=0,B=[],(M=T(W,4)+4)>Ma){m.a=Je,m=0;break e}if(D=Array(t),D==o){m.a=qe,m=0;break e}for(U=0;UB){U.a=Je,V(a),U=E;break n}}else n=B;for(e=0;eB){U.a=Je,V(a),U=E;break n}for(C=C?r:0;F-- >0;)M[e++]=C}}E=1,V(a),U=E}else U.a=Je,U=0}U&&(U=I(e,D,t))}(U=U&&!W.fa)?m=1:(m.a=Je,m=0)}if(!m){Ft(h,P),c=0;break t}}_.ac=v,_.hc=P,_.Db=h,c=1}}if(!c){r.a=Je;break}if(s>0){if(u.xb=1<0),l.ea=d(_,0),l.ea==o?s=0:(l.bb=32-s,s=1),!s){r.a=qe,c=0;break}}else u.xb=0;if(s=r,l=t[0],_=e[0],h=(v=s.cb).eb,s.l=l,s.v=_,v.Ec=Pt(l,h),v.Dc=0==h?-1:(1<>>8&255;t.O=t.xa=e}}function ut(t,e){return t<0?0:t>e?e:t}function Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,g,P){let A;const k=v-1>>1;let m=a[o+0]|f[c+0]<<16,w=i[u+0]|b[s+0]<<16;if(t){var S=3*m+w+131074>>2;g(t[e+0],255&S,S>>16,l,h)}for(n&&(S=3*w+m+131074>>2,g(n[r+0],255&S,S>>16,d,p)),A=1;A<=k;++A){const v=a[o+A]|f[c+A]<<16,k=i[u+A]|b[s+A]<<16;S=m+v+w+k+524296;const T=S+2*(v+w)>>3,y=S+2*(m+k)>>3;t&&(S=T+m>>1,m=y+v>>1,g(t[e+2*A-1],255&S,S>>16,l,h+(2*A-1)*P),g(t[e+2*A-0],255&m,m>>16,l,h+(2*A-0)*P)),n&&(S=y+w>>1,m=T+k>>1,g(n[r+2*A-1],255&S,S>>16,d,p+(2*A-1)*P),g(n[r+2*A+0],255&m,m>>16,d,p+(2*A+0)*P)),m=v,w=k}1&v||(t&&(S=3*m+w+131074>>2,g(t[e+v-1],255&S,S>>16,l,h+(v-1)*P)),n&&(S=3*w+m+131074>>2,g(n[r+v-1],255&S,S>>16,d,p+(v-1)*P)))}function $t(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,At,3)}function Xt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,St,3)}function Zt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,yt,4)}function te(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,Tt,4)}function ee(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,mt,4)}function ne(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,wt,2)}function re(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,kt,2)}function ae(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d){let p;for(p=0;p0;){var f=t,c=e+(n?1:0),i=t,u=e+(n?0:3),b=0;for(b=0;b>1)*n.nb,i=n.S,u=n.C+(t.w>>1)*n.rb,b=t.m,s=t.h,l=parseInt((b+1)/2,10),h=parseInt((s+1)/2,10);let d;for(d=0;d>4;b[s+2*h]=240&b[s+2*h]|t,l&=t}a+=e.width,s+=i.f}15!=l&&t(c)&&WebPApplyAlphaMultiply4444(b,f,o,u,i.f)}return 0}function ge(e){let n=e.ka;const r=n.j.J,a=r>1,r=e.m+2*t;let a;const f=[];for(a=0;a>ga,Na[e]=-22014*(e-128)+ja,Ga[e]=-45773*(e-128),Fa[e]=113618*(e-128)+ja>>ga;for(e=Pa;e>ga,La[e-Pa]=ut(n,255),Ha[e-Pa]=ut(n+8>>4,15);za=1}return 1}function Pe(t){const e=t.ka;let n=t.m;const r=t.h;return g(!(1&t.w)),n<=0||r<=0?0:(n=e.$a(t,e),e.ec+=n,e.zb&&e.zb(t,e),1)}function Ae(t){(t=t.ka).memory="",t.memory=o}function ke(t,e){return t[e+0]|t[e+1]<<8|t[e+2]<<16}function me(t,e){return(ke(t,e)|t[e+3]<<24)>>>0}function we(t,e,n,r,a,c,i){var u=0,b=[0],s="VP8StatusCode";const l=f(nn);if(t==o||n[0]=Wn&&!h(t,e[0],"RIFF",In)){if(h(t,e[0]+8,"WEBP",In)){s=Je;break t}if((P=me(t,e[0]+In))0,P=[0];t:if(s=_n+Un,g(t!=o),g(n!=o),g(b!=o),b[0]=0,n[0]<_n)s=$e;else{if(!h(t,e[0],"VP8X",In)){var d=0,p=0,v=0;if(me(t,e[0]+In)!=Un){s=Je;break t}if(n[0]=Bn){s=Je;break t}P!=o&&(P[0]=v),r!=o&&(r[0]=d),a!=o&&(a[0]=p),e[0]+=s,n[0]-=s,b[0]=1}s=ze}if(s!=ze)return s;if(!u&&b[0])return Je;if(c!=o&&(c[0]=!!(P[0]&Mn)),b&&i==o)return ze;if(n0&&r>b){s=Je;break t}if(v=d&&p>b-d){s=Je;break t}u[0]=p,e[0]+=_n,n[0]-=_n,P[0]=s}else P[0]=n>=1&&t[e+0]==un,u[0]=n[0];s=ze}if(l.ta=l.ta[0],l.ia=l.ia[0],s!=ze)return s;if(l.ta>Dn)return Je;if(l.ia){if(n[0]=3&&157==t[b+3+0]&&1==t[b+3+1]&&42==t[b+3+2]?(u=t[b+0]|t[b+1]<<8|t[b+2]<<16,P=16383&(t[b+7]<<8|t[b+6]),t=16383&(t[b+9]<<8|t[b+8]),!(!(1&u)+0)||(u>>1&7)>3||!(u>>4&1)||u>>5>=l.ta?t=0:(r&&(r[0]=P),a&&(a[0]=t),t=1)):t=0}return t?(c!=o&&(c[0]|=l.$!=o),i!=o&&(i[0]=l,i[0].offset=e[0]-i[0].b,g(e[0]-i[0].b0,e.Ua&&(i=t.wc,u=t.vc,f=t.t,c=t.k,nr||c+u>a))return 0;if(e.t=f,e.k=c,e.Ka=f+i,e.K=c+u,e.m=i,e.h=u,e.I=t!=o&&t.I>0,e.I){if(t.Ba<=0||t.Aa<=0)return 0;e.Ba=t.Ba,e.Aa=t.Aa}return e.Za=t&&t.Za,e.Bb=t==o||!t.ed,e.I&&(e.Za=e.Ba<3*r/4&&e.Aa<3*a/4,e.Bb=0),1}var Oe=512,Ie=0,_e=1,We=2,Ue=3,Me=4,Be=5,De=6,Ee=7,je=8,Ce=9,Fe=10,Ge=11,Ne=12,Le=13;this.WEBP_CSP_MODE=this.Cd={nd:0,od:1,kd:2,ld:3,jd:4,pd:5,qd:6,rd:7,sd:8,md:9};var He={J:"WEBP_CSP_MODE",width:0,height:0,Fc:0,c:{RGBA:{ma:0,Sa:0,f:0,size:0},Va:{y:0,c:0,S:0,p:0,D:0,B:0,C:0,q:0,F:0,nb:0,rb:0,Fa:0,Wc:0,Rc:0,Uc:0,Wb:0}},Ic:d(4,0),Jb:o,jc:0},ze=0,qe=1,Ke=2,Je=3,Ye=4,xe=5,Qe=6,$e=7;this.VP8StatusCode=this.td={xd:0,yd:1,vd:2,ud:3,Ad:4,zd:5,Bd:6,wd:7};var Xe={width:{value:0},height:{value:0},$b:{value:0},tc:0,Yd:0,rotate:0,be:0,Ic:d(3,0)};this.WebPGetFeatures=this.Md=function(t,e,n){let r="VP8StatusCode";return Oe>>>8!=Oe>>>8||n==o?t=Ke:(r=Re(t,[0],e=[e],n),t=r==$e?Je:r),t};const Ze={Za:0,ed:0,Ua:0,t:0,k:0,wc:0,vc:0,I:0,Ba:0,Aa:0,ae:0,Td:0,Xd:0,Ic:d(6,0)};this.WebPDecoderConfig=this.Kd={input:f(Xe),j:f(He),options:f(Ze)},this.WebPInitDecoderConfig=this.Nd=function(t){return Oe>>>8!=Oe>>>8||t==o?t=0:(g((t=t.input)!=o),t.tc=0,t=1),t};var tn={width:0,height:0,w:0,m:0,h:0,y:0,c:0,S:0,D:0,B:0,C:0,F:0,Da:0,ka:0,put:0,Mb:0,Pb:0,Bb:0,e:0,data:0,b:0,Za:0,Ua:0,t:0,Ka:0,k:0,K:0,I:0,Ba:0,Aa:0,p:0,q:0},en={j:f(He),Sb:0,Qb:0,lc:0,Tb:0,Rb:0,mc:0,ec:0,Qa:f(Ze),memory:0,$a:"(OutputFunc)",zb:"(OutputFunc)",ad:"(OutputRowFunc)"},nn={data:0,b:0,e:0,offset:0,$:o,G:0,pa:0,ta:0,na:0,ia:0},rn={qa:0,Ia:o,Pd:0,Ab:0,la:0,Z:0,gc:0},an={T:0,qa:0,Ia:0,ya:0,Q:0,g:0,L:0,fa:0},on=25,fn=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215],cn=10,un=47,bn=14,sn=3,ln=5,hn=11,dn=5,pn=4278190080,vn=8,gn=15,Pn=256,An=24,kn=4,mn=0,wn=1,Sn=2,Tn=3,yn=1,Rn=0,Vn=1,On=1,In=4,_n=8,Wn=12,Un=10,Mn=16,Bn=1*Math.pow(2,32),Dn=-1-_n-1>>>0,En={kc:0,s:0},jn={Y:"HuffmanTreeNode*",gb:0,Pa:0},Cn=-1;var Fn=506832829,Gn=0,Nn=Gn,Ln=2,Hn=3,zn=1,qn=4,Kn=5,Jn=6,Yn=3,xn=4,Qn=4,$n=4,Xn=4,Zn=8,tr=3,er=11,nr=32,rr=17*nr+9*nr,ar=1*nr+8,or=ar+16*nr+nr,fr=or+16,cr={fb:0,Jc:0,Nc:0,Ra:0},ir={l:0,v:0,gd:0,hd:0,uc:0,$c:0};const ur={pb:0,ob:0,tb:0,Kb:d(xn,0),Cb:d(xn,0)},br={Ta:d(Yn,0),z:v([Xn,Zn,tr,er],0)},sr={Oc:0,Fb:0,kb:0,oc:0,Lc:d(Qn,0),Gc:d(Qn,0)};var lr={zc:0,yc:0,ab:0},hr={X:0,ua:0,Nb:0};const dr=d(2,0),pr={sc:f(dr),sb:f(dr),qc:f(dr)},vr={ha:0,d:0,W:0,M:lr,N:tn};var gr={a:"VP8StatusCode",za:0,xc:0,o:f(rn),Ac:f(cr),P:f(ir),ga:f(sr),Ca:f(ur),rc:"WebPWorker",qb:0,Ja:0,jb:0,oa:vr,Ma:0,hb:0,lb:0,mb:0,wb:0,Ya:0,Hb:0,ic:p(8,rn),Zc:0,yb:p(xn,pr),R:f(br),pc:0,Pc:0,dc:0,cc:d(4,0),Xc:0,Sc:0,Vc:0,La:f(hr),M:f(lr),Ea:0,z:0,ca:0,aa:0,ra:0,da:0,ba:0,sa:0,H:0,r:0,ib:0,Gb:0,i:0,d:0,wa:0,Eb:d(16,0),Vd:0,Tc:0,Lb:0,ja:0,Oa:0,A:0,W:0,Zb:d(xn,0),Ga:o,G:0,ub:0,Xb:0,Od:0,cd:0,dd:0,Wd:0,fc:0},Pr=0,Ar=1,kr=2;var mr={va:p(dn,jn)};const wr={xb:0,Yb:f({ea:0,bb:0}),Dc:0,eb:0,Ec:0,ac:0,bd:0,hc:0,Db:"HTreeGroup"};var Sr={a:"VP8StatusCode",Wa:"VP8LDecodeState",Ob:"VP8LDecodeState",N:"VP8Io",Ib:"WebPDecBuffer",Hc:"WebPDecBuffer",V:0,Ha:0,Xa:0,vb:0,o:f(an),l:0,v:0,O:0,xa:0,cb:f(wr),Na:0,nc:p(kn,{Qc:"VP8LImageTransformType",n:0,U:0,Vb:0,u:0,b:0}),Ub:0,Mc:0,$d:0,Zd:"*WebPRescaler"},Tr=4,yr=[o,function(t,e,n,r,a,f,i,u){let b=0,s=u;for(g(t!=o),g(i!=o),g(n>0),g(r>0),g(a>0),g(f>=n*a),b=0;b0),g(r>0),g(a>0),g(f>=n*a),c(i,u,t,e,a),_(t,e+a,i,s,i,u+a,a*(n-1)),b=1;b0),g(r>0),g(a>0),g(f>=n*a),c(i,u,t,e,a),_(t,e+a,i,b,i,u+a,a*(n-1)),s=1;s255?255:n)&255}}}],Rr=[3,4,3,4,4,2,2,4,4,4,2,1,1];this.WebPFreeDecBuffer=this.Yc=function(t){t!=o&&(t.Fc||(t.Jb=""),t.jc=0,t.Jb=t.jc=o)},a=this;var Vr=d(511,0),Or=d(511,0),Ir=d(2041,0),_r=d(225,0),Wr=d(766,0),Ur=0,Mr=85627,Br=35468,Dr=[function(t,e){let n,r=4;for(n=0;n<4;++n)r+=t[e+n-nr]+t[e-1+n*nr];for(r>>=3,n=0;n<4;++n)l(t,e+n*nr,r,4)},function(t,e){G(t,e,4)},function(t,e){let n=e-nr;const r=[];for(r.push(L(t[n-1],t[n+0],t[n+1])),r.push(L(t[n+0],t[n+1],t[n+2])),r.push(L(t[n+1],t[n+2],t[n+3])),r.push(L(t[n+2],t[n+3],t[n+4])),n=0;n<4;++n)c(t,e+n*nr,r,0,4)},function(t,e){const n=t[e-1],r=t[e-1+nr],a=t[e-1+2*nr],o=t[e-1+3*nr];t[e+0+0*nr]=t[e+1+0*nr]=t[e+2+0*nr]=t[e+3+0*nr]=L(t[e-1-nr],n,r),t[e+0+1*nr]=t[e+1+1*nr]=t[e+2+1*nr]=t[e+3+1*nr]=L(n,r,a),t[e+0+2*nr]=t[e+1+2*nr]=t[e+2+2*nr]=t[e+3+2*nr]=L(r,a,o),t[e+0+3*nr]=t[e+1+3*nr]=t[e+2+3*nr]=t[e+3+3*nr]=L(a,o,o)},function(t,e){const n=t[e-1+0*nr],r=t[e-1+1*nr],a=t[e-1+2*nr],o=t[e-1-nr],f=t[e+0-nr],c=t[e+1-nr],i=t[e+2-nr],u=t[e+3-nr];t[e+0+3*nr]=L(r,a,t[e-1+3*nr]),t[e+0+2*nr]=t[e+1+3*nr]=L(n,r,a),t[e+0+1*nr]=t[e+1+2*nr]=t[e+2+3*nr]=L(o,n,r),t[e+0+0*nr]=t[e+1+1*nr]=t[e+2+2*nr]=t[e+3+3*nr]=L(f,o,n),t[e+1+0*nr]=t[e+2+1*nr]=t[e+3+2*nr]=L(c,f,o),t[e+2+0*nr]=t[e+3+1*nr]=L(i,c,f),t[e+3+0*nr]=L(u,i,c)},function(t,e){const n=t[e-1+0*nr],r=t[e-1+1*nr],a=t[e-1+2*nr],o=t[e-1-nr],f=t[e+0-nr],c=t[e+1-nr],i=t[e+2-nr],u=t[e+3-nr];t[e+0+0*nr]=t[e+1+2*nr]=o+f+1>>1,t[e+1+0*nr]=t[e+2+2*nr]=f+c+1>>1,t[e+2+0*nr]=t[e+3+2*nr]=c+i+1>>1,t[e+3+0*nr]=i+u+1>>1,t[e+0+3*nr]=L(a,r,n),t[e+0+2*nr]=L(r,n,o),t[e+0+1*nr]=t[e+1+3*nr]=L(n,o,f),t[e+1+1*nr]=t[e+2+3*nr]=L(o,f,c),t[e+2+1*nr]=t[e+3+3*nr]=L(f,c,i),t[e+3+1*nr]=L(c,i,u)},function(t,e){const n=t[e+1-nr],r=t[e+2-nr],a=t[e+3-nr],o=t[e+4-nr],f=t[e+5-nr],c=t[e+6-nr],i=t[e+7-nr];t[e+0+0*nr]=L(t[e+0-nr],n,r),t[e+1+0*nr]=t[e+0+1*nr]=L(n,r,a),t[e+2+0*nr]=t[e+1+1*nr]=t[e+0+2*nr]=L(r,a,o),t[e+3+0*nr]=t[e+2+1*nr]=t[e+1+2*nr]=t[e+0+3*nr]=L(a,o,f),t[e+3+1*nr]=t[e+2+2*nr]=t[e+1+3*nr]=L(o,f,c),t[e+3+2*nr]=t[e+2+3*nr]=L(f,c,i),t[e+3+3*nr]=L(c,i,i)},function(t,e){const n=t[e+0-nr],r=t[e+1-nr],a=t[e+2-nr],o=t[e+3-nr],f=t[e+4-nr],c=t[e+5-nr],i=t[e+6-nr],u=t[e+7-nr];t[e+0+0*nr]=n+r+1>>1,t[e+1+0*nr]=t[e+0+2*nr]=r+a+1>>1,t[e+2+0*nr]=t[e+1+2*nr]=a+o+1>>1,t[e+3+0*nr]=t[e+2+2*nr]=o+f+1>>1,t[e+0+1*nr]=L(n,r,a),t[e+1+1*nr]=t[e+0+3*nr]=L(r,a,o),t[e+2+1*nr]=t[e+1+3*nr]=L(a,o,f),t[e+3+1*nr]=t[e+2+3*nr]=L(o,f,c),t[e+3+2*nr]=L(f,c,i),t[e+3+3*nr]=L(c,i,u)},function(t,e){const n=t[e-1+0*nr],r=t[e-1+1*nr],a=t[e-1+2*nr],o=t[e-1+3*nr],f=t[e-1-nr],c=t[e+0-nr],i=t[e+1-nr],u=t[e+2-nr];t[e+0+0*nr]=t[e+2+1*nr]=n+f+1>>1,t[e+0+1*nr]=t[e+2+2*nr]=r+n+1>>1,t[e+0+2*nr]=t[e+2+3*nr]=a+r+1>>1,t[e+0+3*nr]=o+a+1>>1,t[e+3+0*nr]=L(c,i,u),t[e+2+0*nr]=L(f,c,i),t[e+1+0*nr]=t[e+3+1*nr]=L(n,f,c),t[e+1+1*nr]=t[e+3+2*nr]=L(r,n,f),t[e+1+2*nr]=t[e+3+3*nr]=L(a,r,n),t[e+1+3*nr]=L(o,a,r)},function(t,e){const n=t[e-1+0*nr],r=t[e-1+1*nr],a=t[e-1+2*nr],o=t[e-1+3*nr];t[e+0+0*nr]=n+r+1>>1,t[e+2+0*nr]=t[e+0+1*nr]=r+a+1>>1,t[e+2+1*nr]=t[e+0+2*nr]=a+o+1>>1,t[e+1+0*nr]=L(n,r,a),t[e+3+0*nr]=t[e+1+1*nr]=L(r,a,o),t[e+3+1*nr]=t[e+1+2*nr]=L(a,o,o),t[e+3+2*nr]=t[e+2+2*nr]=t[e+0+3*nr]=t[e+1+3*nr]=t[e+2+3*nr]=t[e+3+3*nr]=o}],Er=[function(t,e){let n,r=16;for(n=0;n<16;++n)r+=t[e-1+n*nr]+t[e+n-nr];N(r>>5,t,e)},function(t,e){G(t,e,16)},function(t,e){let n;for(n=0;n<16;++n)c(t,e+n*nr,t,e-nr,16)},function(t,e){let n;for(n=16;n>0;--n)l(t,e+0,t[e-1],16),e+=nr},function(t,e){let n,r=8;for(n=0;n<16;++n)r+=t[e-1+n*nr];N(r>>4,t,e)},function(t,e){let n,r=8;for(n=0;n<16;++n)r+=t[e+n-nr];N(r>>4,t,e)},function(t,e){N(128,t,e)}],jr=[function(t,e){let n,r=8;for(n=0;n<8;++n)r+=t[e+n-nr]+t[e-1+n*nr];H(1*(r>>4),t,e)},function(t,e){G(t,e,8)},function(t,e){let n;for(n=0;n<8;++n)c(t,e+n*nr,t,e-nr,8)},function(t,e){let n;for(n=0;n<8;++n)l(t,e+0,t[e-1],8),e+=nr},function(t,e){let n,r=4;for(n=0;n<8;++n)r+=t[e-1+n*nr];H(1*(r>>3),t,e)},function(t,e){let n,r=4;for(n=0;n<8;++n)r+=t[e+n-nr];H(1*(r>>3),t,e)},function(t,e){H(128,t,e)}];let Cr,Fr,Gr,Nr,Lr,Hr,zr,qr,Kr,Jr,Yr,xr,Qr,$r,Xr,Zr;var ta=31,ea=[0,2,8],na=3,ra=1,aa=[0+0*nr,4+0*nr,8+0*nr,12+0*nr,0+4*nr,4+4*nr,8+4*nr,12+4*nr,0+8*nr,4+8*nr,8+8*nr,12+8*nr,0+12*nr,4+12*nr,8+12*nr,12+12*nr],oa=[4,5,6,7,8,9,10,10,11,12,13,14,15,16,17,17,18,19,20,20,21,21,22,22,23,23,24,25,25,26,27,28,29,30,31,32,33,34,35,36,37,37,38,39,40,41,42,43,44,45,46,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,76,77,78,79,80,81,82,83,84,85,86,87,88,89,91,93,95,96,98,100,101,102,104,106,108,110,112,114,116,118,122,124,126,128,130,132,134,136,138,140,143,145,148,151,154,157],fa=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,177,181,185,189,193,197,201,205,209,213,217,221,225,229,234,239,245,249,254,259,264,269,274,279,284],ca=[-Gn,1,-1,2,-2,3,4,6,-3,5,-4,-5,-6,7,-7,8,-8,-9],ia=[[[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]],[[253,136,254,255,228,219,128,128,128,128,128],[189,129,242,255,227,213,255,219,128,128,128],[106,126,227,252,214,209,255,255,128,128,128]],[[1,98,248,255,236,226,255,255,128,128,128],[181,133,238,254,221,234,255,154,128,128,128],[78,134,202,247,198,180,255,219,128,128,128]],[[1,185,249,255,243,255,128,128,128,128,128],[184,150,247,255,236,224,128,128,128,128,128],[77,110,216,255,236,230,128,128,128,128,128]],[[1,101,251,255,241,255,128,128,128,128,128],[170,139,241,252,236,209,255,255,128,128,128],[37,116,196,243,228,255,255,255,128,128,128]],[[1,204,254,255,245,255,128,128,128,128,128],[207,160,250,255,238,128,128,128,128,128,128],[102,103,231,255,211,171,128,128,128,128,128]],[[1,152,252,255,240,255,128,128,128,128,128],[177,135,243,255,234,225,128,128,128,128,128],[80,129,211,255,194,224,128,128,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[246,1,255,128,128,128,128,128,128,128,128],[255,128,128,128,128,128,128,128,128,128,128]]],[[[198,35,237,223,193,187,162,160,145,155,62],[131,45,198,221,172,176,220,157,252,221,1],[68,47,146,208,149,167,221,162,255,223,128]],[[1,149,241,255,221,224,255,255,128,128,128],[184,141,234,253,222,220,255,199,128,128,128],[81,99,181,242,176,190,249,202,255,255,128]],[[1,129,232,253,214,197,242,196,255,255,128],[99,121,210,250,201,198,255,202,128,128,128],[23,91,163,242,170,187,247,210,255,255,128]],[[1,200,246,255,234,255,128,128,128,128,128],[109,178,241,255,231,245,255,255,128,128,128],[44,130,201,253,205,192,255,255,128,128,128]],[[1,132,239,251,219,209,255,165,128,128,128],[94,136,225,251,218,190,255,255,128,128,128],[22,100,174,245,186,161,255,199,128,128,128]],[[1,182,249,255,232,235,128,128,128,128,128],[124,143,241,255,227,234,128,128,128,128,128],[35,77,181,251,193,211,255,205,128,128,128]],[[1,157,247,255,236,231,255,255,128,128,128],[121,141,235,255,225,227,255,255,128,128,128],[45,99,188,251,195,217,255,224,128,128,128]],[[1,1,251,255,213,255,128,128,128,128,128],[203,1,248,255,255,128,128,128,128,128,128],[137,1,177,255,224,255,128,128,128,128,128]]],[[[253,9,248,251,207,208,255,192,128,128,128],[175,13,224,243,193,185,249,198,255,255,128],[73,17,171,221,161,179,236,167,255,234,128]],[[1,95,247,253,212,183,255,255,128,128,128],[239,90,244,250,211,209,255,255,128,128,128],[155,77,195,248,188,195,255,255,128,128,128]],[[1,24,239,251,218,219,255,205,128,128,128],[201,51,219,255,196,186,128,128,128,128,128],[69,46,190,239,201,218,255,228,128,128,128]],[[1,191,251,255,255,128,128,128,128,128,128],[223,165,249,255,213,255,128,128,128,128,128],[141,124,248,255,255,128,128,128,128,128,128]],[[1,16,248,255,255,128,128,128,128,128,128],[190,36,230,255,236,255,128,128,128,128,128],[149,1,255,128,128,128,128,128,128,128,128]],[[1,226,255,128,128,128,128,128,128,128,128],[247,192,255,128,128,128,128,128,128,128,128],[240,128,255,128,128,128,128,128,128,128,128]],[[1,134,252,255,255,128,128,128,128,128,128],[213,62,250,255,255,128,128,128,128,128,128],[55,93,255,128,128,128,128,128,128,128,128]],[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]]],[[[202,24,213,235,186,191,220,160,240,175,255],[126,38,182,232,169,184,228,174,255,187,128],[61,46,138,219,151,178,240,170,255,216,128]],[[1,112,230,250,199,191,247,159,255,255,128],[166,109,228,252,211,215,255,174,128,128,128],[39,77,162,232,172,180,245,178,255,255,128]],[[1,52,220,246,198,199,249,220,255,255,128],[124,74,191,243,183,193,250,221,255,255,128],[24,71,130,219,154,170,243,182,255,255,128]],[[1,182,225,249,219,240,255,224,128,128,128],[149,150,226,252,216,205,255,171,128,128,128],[28,108,170,242,183,194,254,223,255,255,128]],[[1,81,230,252,204,203,255,192,128,128,128],[123,102,209,247,188,196,255,233,128,128,128],[20,95,153,243,164,173,255,203,128,128,128]],[[1,222,248,255,216,213,128,128,128,128,128],[168,175,246,252,235,205,255,255,128,128,128],[47,116,215,255,211,212,255,255,128,128,128]],[[1,121,236,253,212,214,255,255,128,128,128],[141,84,213,252,201,202,255,219,128,128,128],[42,80,160,240,162,185,255,205,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[244,1,255,128,128,128,128,128,128,128,128],[238,1,255,128,128,128,128,128,128,128,128]]]],ua=[[[231,120,48,89,115,113,120,152,112],[152,179,64,126,170,118,46,70,95],[175,69,143,80,85,82,72,155,103],[56,58,10,171,218,189,17,13,152],[114,26,17,163,44,195,21,10,173],[121,24,80,195,26,62,44,64,85],[144,71,10,38,171,213,144,34,26],[170,46,55,19,136,160,33,206,71],[63,20,8,114,114,208,12,9,226],[81,40,11,96,182,84,29,16,36]],[[134,183,89,137,98,101,106,165,148],[72,187,100,130,157,111,32,75,80],[66,102,167,99,74,62,40,234,128],[41,53,9,178,241,141,26,8,107],[74,43,26,146,73,166,49,23,157],[65,38,105,160,51,52,31,115,128],[104,79,12,27,217,255,87,17,7],[87,68,71,44,114,51,15,186,23],[47,41,14,110,182,183,21,17,194],[66,45,25,102,197,189,23,18,22]],[[88,88,147,150,42,46,45,196,205],[43,97,183,117,85,38,35,179,61],[39,53,200,87,26,21,43,232,171],[56,34,51,104,114,102,29,93,77],[39,28,85,171,58,165,90,98,64],[34,22,116,206,23,34,43,166,73],[107,54,32,26,51,1,81,43,31],[68,25,106,22,64,171,36,225,114],[34,19,21,102,132,188,16,76,124],[62,18,78,95,85,57,50,48,51]],[[193,101,35,159,215,111,89,46,111],[60,148,31,172,219,228,21,18,111],[112,113,77,85,179,255,38,120,114],[40,42,1,196,245,209,10,25,109],[88,43,29,140,166,213,37,43,154],[61,63,30,155,67,45,68,1,209],[100,80,8,43,154,1,51,26,71],[142,78,78,16,255,128,34,197,171],[41,40,5,102,211,183,4,1,221],[51,50,17,168,209,192,23,25,82]],[[138,31,36,171,27,166,38,44,229],[67,87,58,169,82,115,26,59,179],[63,59,90,180,59,166,93,73,154],[40,40,21,116,143,209,34,39,175],[47,15,16,183,34,223,49,45,183],[46,17,33,183,6,98,15,32,183],[57,46,22,24,128,1,54,17,37],[65,32,73,115,28,128,23,128,205],[40,3,9,115,51,192,18,6,223],[87,37,9,115,59,77,64,21,47]],[[104,55,44,218,9,54,53,130,226],[64,90,70,205,40,41,23,26,57],[54,57,112,184,5,41,38,166,213],[30,34,26,133,152,116,10,32,134],[39,19,53,221,26,114,32,73,255],[31,9,65,234,2,15,1,118,73],[75,32,12,51,192,255,160,43,51],[88,31,35,67,102,85,55,186,85],[56,21,23,111,59,205,45,37,192],[55,38,70,124,73,102,1,34,98]],[[125,98,42,88,104,85,117,175,82],[95,84,53,89,128,100,113,101,45],[75,79,123,47,51,128,81,171,1],[57,17,5,71,102,57,53,41,49],[38,33,13,121,57,73,26,1,85],[41,10,67,138,77,110,90,47,114],[115,21,2,10,102,255,166,23,6],[101,29,16,10,85,128,101,196,26],[57,18,10,102,102,213,34,20,43],[117,20,15,36,163,128,68,1,26]],[[102,61,71,37,34,53,31,243,192],[69,60,71,38,73,119,28,222,37],[68,45,128,34,1,47,11,245,171],[62,17,19,70,146,85,55,62,70],[37,43,37,154,100,163,85,160,1],[63,9,92,136,28,64,32,201,85],[75,15,9,9,64,255,184,119,16],[86,6,28,5,64,255,25,248,1],[56,8,17,132,137,255,55,116,128],[58,15,20,82,135,57,26,121,40]],[[164,50,31,137,154,133,25,35,218],[51,103,44,131,131,123,31,6,158],[86,40,64,135,148,224,45,183,128],[22,26,17,131,240,154,14,1,209],[45,16,21,91,64,222,7,1,197],[56,21,39,155,60,138,23,102,213],[83,12,13,54,192,255,68,47,28],[85,26,85,85,128,128,32,146,171],[18,11,7,63,144,171,4,4,246],[35,27,10,146,174,171,12,26,128]],[[190,80,35,99,180,80,126,54,45],[85,126,47,87,176,51,41,20,32],[101,75,128,139,118,146,116,128,85],[56,41,15,176,236,85,37,9,62],[71,30,17,119,118,255,17,18,138],[101,38,60,138,55,70,43,26,142],[146,36,19,30,171,255,97,27,20],[138,45,61,62,219,1,81,188,64],[32,41,20,117,151,142,20,21,163],[112,19,12,61,195,128,48,4,24]]],ba=[[[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[176,246,255,255,255,255,255,255,255,255,255],[223,241,252,255,255,255,255,255,255,255,255],[249,253,253,255,255,255,255,255,255,255,255]],[[255,244,252,255,255,255,255,255,255,255,255],[234,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255]],[[255,246,254,255,255,255,255,255,255,255,255],[239,253,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[251,255,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[251,254,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,254,253,255,254,255,255,255,255,255,255],[250,255,254,255,254,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[217,255,255,255,255,255,255,255,255,255,255],[225,252,241,253,255,255,254,255,255,255,255],[234,250,241,250,253,255,253,254,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[223,254,254,255,255,255,255,255,255,255,255],[238,253,254,254,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[249,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,255,255,255,255,255,255,255,255,255],[247,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[252,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[186,251,250,255,255,255,255,255,255,255,255],[234,251,244,254,255,255,255,255,255,255,255],[251,251,243,253,254,255,254,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[236,253,254,255,255,255,255,255,255,255,255],[251,253,253,254,254,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[254,254,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[254,254,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[248,255,255,255,255,255,255,255,255,255,255],[250,254,252,254,255,255,255,255,255,255,255],[248,254,249,253,255,255,255,255,255,255,255]],[[255,253,253,255,255,255,255,255,255,255,255],[246,253,253,255,255,255,255,255,255,255,255],[252,254,251,254,254,255,255,255,255,255,255]],[[255,254,252,255,255,255,255,255,255,255,255],[248,254,253,255,255,255,255,255,255,255,255],[253,255,254,254,255,255,255,255,255,255,255]],[[255,251,254,255,255,255,255,255,255,255,255],[245,251,254,255,255,255,255,255,255,255,255],[253,253,254,255,255,255,255,255,255,255,255]],[[255,251,253,255,255,255,255,255,255,255,255],[252,253,254,255,255,255,255,255,255,255,255],[255,254,255,255,255,255,255,255,255,255,255]],[[255,252,255,255,255,255,255,255,255,255,255],[249,255,254,255,255,255,255,255,255,255,255],[255,255,254,255,255,255,255,255,255,255,255]],[[255,255,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]]];this.WebPGetDecoderVersion=this.Ld=function(){return 512};var sa=[0,1,2,3,6,4,5,6,6,6,6,6,6,6,6,7,0],la=[[173,148,140,0],[176,155,140,135,0],[180,157,141,134,130,0],[254,254,243,230,196,177,153,140,133,130,129,0]],ha=[0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15],da=v([tr,er],"");d(4,0);var pa=[[0,0,0,0],[1,0,0,0],[0,1,0,0],[1,1,0,0],[0,0,1,0],[1,0,1,0],[0,1,1,0],[1,1,1,0],[0,0,0,1],[1,0,0,1],[0,1,0,1],[1,1,0,1],[0,0,1,1],[1,0,1,1],[0,1,1,1],[1,1,1,1]],va=134480385,ga=16,Pa=-227,Aa=482,ka=[_t,function(t){return t},function(t,e,n){return e[n+0]},function(t,e,n){return e[n+1]},function(t,e,n){return e[n-1]},function(t,e,n){return Vt(Vt(t,e[n+1]),e[n+0])},function(t,e,n){return Vt(t,e[n-1])},function(t,e,n){return Vt(t,e[n+0])},function(t,e,n){return Vt(e[n-1],e[n+0])},function(t,e,n){return Vt(e[n+0],e[n+1])},function(t,e,n){return Vt(Vt(t,e[n-1]),Vt(e[n+0],e[n+1]))},function(t,e,n){return Math.abs((t>>24&255)-(e[n-1]>>24&255))-Math.abs((e[n+0]>>24&255)-(e[n-1]>>24&255))+(Math.abs((t>>16&255)-(e[n-1]>>16&255))-Math.abs((e[n+0]>>16&255)-(e[n-1]>>16&255)))+(Math.abs((t>>8&255)-(e[n-1]>>8&255))-Math.abs((e[n+0]>>8&255)-(e[n-1]>>8&255)))+(Math.abs((255&t)-(255&e[n-1]))-Math.abs((255&e[n+0])-(255&e[n-1])))<=0?e[n+0]:t},function(t,e,n){return(Ot((t>>24&255)+(e[n+0]>>24&255)-(e[n-1]>>24&255))<<24|Ot((t>>16&255)+(e[n+0]>>16&255)-(e[n-1]>>16&255))<<16|Ot((t>>8&255)+(e[n+0]>>8&255)-(e[n-1]>>8&255))<<8|Ot((255&t)+(255&e[n+0])-(255&e[n-1])))>>>0},function(t,e,n){const r=e[n-1];return(It((t=Vt(t,e[n+0]))>>24&255,r>>24&255)<<24|It(t>>16&255,r>>16&255)<<16|It(t>>8&255,r>>8&255)<<8|It(t>>0&255,r>>0&255))>>>0},_t,_t],ma={Cc:0,Bc:0,Kc:0},wa=16,Sa=16,Ta=16,ya=[2,3,7],Ra=[3,3,11],Va=0,Oa=1,Ia=2,_a=3,Wa=4,Ua=[Pn+An,Pn,Pn,Pn,40],Ma=19,Ba=[17,18,0,1,2,3,4,5,16,6,7,8,9,10,11,12,13,14,15],Da=120,Ea=[24,7,23,25,40,6,39,41,22,26,38,42,56,5,55,57,21,27,54,58,37,43,72,4,71,73,20,28,53,59,70,74,36,44,88,69,75,52,60,3,87,89,19,29,86,90,35,45,68,76,85,91,51,61,104,2,103,105,18,30,102,106,34,46,84,92,67,77,101,107,50,62,120,1,119,121,83,93,17,31,100,108,66,78,118,122,33,47,117,123,49,63,99,109,82,94,0,116,124,65,79,16,32,98,110,48,115,125,81,95,64,114,126,97,111,80,113,127,96,112],ja=1<{var e;e=t.data,m.push(e),S()}))}},c={};function i(t){var e=c[t];if(void 0!==e)return e.exports;var n=c[t]={exports:{}};return f[t].call(n.exports,n,n.exports,i),n.exports}i.m=f,i.x=()=>{var t=i.O(void 0,[699,866,158],(()=>i(2061)));return i.O(t)},t=[],i.O=(e,n,r,a)=>{if(!n){var o=1/0;for(b=0;b=a)&&Object.keys(i.O).every((t=>i.O[t](n[c])))?n.splice(c--,1):(f=!1,a0&&t[b-1][2]>a;b--)t[b]=t[b-1];t[b]=[n,r,a]},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.f={},i.e=t=>Promise.all(Object.keys(i.f).reduce(((e,n)=>(i.f[n](t,e),e)),[])),i.u=t=>({158:"npm.iobuffer",699:"npm.pako",866:"npm.fast-png"}[t]+"."+{158:"ae3638de6414621ea67b",699:"f16d6f756c34f3914132",866:"f6db8063094ac9670661"}[t]+".chunk.js"),i.miniCssF=t=>{},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{var t;i.g.importScripts&&(t=i.g.location+"");var e=i.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var n=e.getElementsByTagName("script");n.length&&(t=n[n.length-1].src)}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),i.p=t})(),e=i.u,n=i.e,r=new Map,a=new Map,i.u=function(t){return e(t)+(r.has(t)?"?"+r.get(t):"")},i.e=function(t){return n(t).catch((function(n){var o=a.has(t)?a.get(t):999999;if(o<1){var f=e(t);throw n.message="Loading chunk "+t+" failed after 999999 retries.\n("+f+")",n.request=f,n}return new Promise((function(e){setTimeout((function(){var n=Date.now();r.set(t,n),a.set(t,o-1),e(i.e(t))}),3e3)}))}))},(()=>{var t={61:1};i.f.i=(e,n)=>{t[e]||importScripts(i.p+i.u(e))};var e=this.webpackChunktweb=this.webpackChunktweb||[],n=e.push.bind(e);e.push=e=>{var[r,a,o]=e;for(var f in a)i.o(a,f)&&(i.m[f]=a[f]);for(o&&o(i);r.length;)t[r.pop()]=1;n(e)}})(),o=i.x,i.x=()=>Promise.all([699,866,158].map(i.e,i)).then(o),i.x()})(); -//# sourceMappingURL=61.21ea8f96aad63bd2211c.chunk.js.map \ No newline at end of file +//# sourceMappingURL=61.b0e6e1510d2c80059b20.chunk.js.map \ No newline at end of file diff --git a/public/61.21ea8f96aad63bd2211c.chunk.js.map b/public/61.b0e6e1510d2c80059b20.chunk.js.map similarity index 95% rename from public/61.21ea8f96aad63bd2211c.chunk.js.map rename to public/61.b0e6e1510d2c80059b20.chunk.js.map index e4079d51..23c14cbb 100644 --- a/public/61.21ea8f96aad63bd2211c.chunk.js.map +++ b/public/61.b0e6e1510d2c80059b20.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"61.21ea8f96aad63bd2211c.chunk.js","mappings":"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D,CAAC,IAAK,IACJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAE1C,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/vendor/libwebp-0.2.0.js","webpack://tweb/./src/lib/webp/webp.worker.ts","webpack://tweb/./src/lib/webp/webp.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,866,158].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [24, 7, 23, 25, 40, 6, 39, 41, 22, 26, 38, 42, 56, 5, 55, 57, 21, 27, 54, 58, 37, 43, 72, 4, 71, 73, 20, 28, 53, 59, 70, 74, 36, 44, 88, 69, 75, 52, 60, 3, 87, 89, 19, 29, 86, 90, 35, 45, 68, 76, 85, 91, 51, 61, 104, 2, 103, 105, 18, 30, 102, 106, 34, 46, 84, 92, 67, 77, 101, 107, 50, 62, 120, 1, 119, 121, 83, 93, 17, 31, 100, 108, 66, 78, 118, 122, 33, 47, 117, 123, 49, 63, 99, 109, 82, 94, 0, 116, 124, 65, 79, 16, 32, 98, 110, 48, 115, 125, 81, 95, 64, 114, 126, 97, 111, 80, 113, 127, 96, 112];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\n };\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {webp2png} from './webp';\r\nimport type {ConvertWebPTask} from './webpWorkerController';\r\n\r\nconst ctx = self as any as DedicatedWorkerGlobalScope;\r\nconst tasks: ConvertWebPTask[] = [];\r\n// let isProcessing = false;\r\n\r\nfunction finishTask() {\r\n // isProcessing = false;\r\n processTasks();\r\n}\r\n\r\nfunction processTasks() {\r\n // if(isProcessing) return;\r\n\r\n const task = tasks.shift();\r\n if(!task) return;\r\n\r\n // isProcessing = true;\r\n\r\n switch(task.type) {\r\n case 'convertWebp': {\r\n const {fileName, bytes} = task.payload;\r\n\r\n let convertedBytes: Uint8Array;\r\n try {\r\n convertedBytes = webp2png(bytes).bytes;\r\n } catch(err) {\r\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\r\n }\r\n\r\n ctx.postMessage({\r\n type: 'convertWebp',\r\n payload: {\r\n fileName,\r\n bytes: convertedBytes\r\n }\r\n });\r\n\r\n finishTask();\r\n\r\n break;\r\n }\r\n\r\n default:\r\n finishTask();\r\n }\r\n}\r\n\r\nfunction scheduleTask(task: ConvertWebPTask) {\r\n tasks.push(task);\r\n /* if(task.payload.fileName.indexOf('main-') === 0) {\r\n tasks.push(task);\r\n } else {\r\n tasks.unshift(task);\r\n } */\r\n\r\n processTasks();\r\n}\r\n\r\nctx.addEventListener('message', (event) => {\r\n scheduleTask(event.data);\r\n});\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {WebPDecoder} from '../../vendor/libwebp-0.2.0';\r\nimport {encode} from 'fast-png';\r\n\r\nexport function webp2png(data: Uint8Array) {\r\n const decoder = new WebPDecoder();\r\n const config: any = decoder.WebPDecoderConfig;\r\n const buffer = config.j || config.output;\r\n const bitstream = config.input;\r\n\r\n decoder.WebPInitDecoderConfig(config);\r\n decoder.WebPGetFeatures(data, data.length, bitstream);\r\n\r\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\r\n buffer.J = 1;\r\n\r\n let status;\r\n try {\r\n status = decoder.WebPDecode(data, data.length, config);\r\n } catch(e) {\r\n status = e;\r\n }\r\n\r\n if(status === 0) {\r\n const rgbaData = buffer.Jb;\r\n const pngData = encode({\r\n data: rgbaData,\r\n width: buffer.width,\r\n height: buffer.height,\r\n channels: 4,\r\n depth: 8\r\n });\r\n\r\n return {status, bytes: pngData};\r\n }\r\n\r\n return {status, bytes: data};\r\n}\r\n\r\nexport function webp2pngAsBlob(data: Uint8Array) {\r\n const {status, bytes} = webp2png(data);\r\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\r\n}\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,866,158], () => (__webpack_require__(2061)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"158\":\"npm.iobuffer\",\"699\":\"npm.pako\",\"866\":\"npm.fast-png\"}[chunkId] + \".\" + {\"158\":\"ae3638de6414621ea67b\",\"699\":\"f16d6f756c34f3914132\",\"866\":\"f6db8063094ac9670661\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t61: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","oldGetScript","oldLoadScript","queryMap","countMap","next","i","p","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","length","push","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","String","fromCharCode","U","ld","md","$","Error","WebPDecoder","a","Ob","Pb","Bb","Qb","b","c","la","d","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","s","ja","jc","k","h","n","l","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","m","f","q","r","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","o","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","t","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","this","value","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","options","WebPInitDecoderConfig","Math","pow","Eg","Fg","Gg","id","Hg","Ig","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","ctx","self","tasks","finishTask","processTasks","task","shift","type","fileName","bytes","payload","convertedBytes","decoder","config","buffer","output","bitstream","status","rgbaData","channels","depth","webp2png","err","console","error","postMessage","addEventListener","event","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","x","__webpack_exports__","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","key","splice","definition","defineProperty","enumerable","get","chunkId","Promise","all","reduce","promises","miniCssF","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","Map","has","catch","retries","realSrc","message","request","resolve","setTimeout","cacheBust","Date","now","set","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","pop","map","then"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"61.b0e6e1510d2c80059b20.chunk.js","mappings":"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D,CAAC,IAAK,IACJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAE1C,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/vendor/libwebp-0.2.0.js","webpack://tweb/./src/lib/webp/webp.worker.ts","webpack://tweb/./src/lib/webp/webp.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,866,158].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [24, 7, 23, 25, 40, 6, 39, 41, 22, 26, 38, 42, 56, 5, 55, 57, 21, 27, 54, 58, 37, 43, 72, 4, 71, 73, 20, 28, 53, 59, 70, 74, 36, 44, 88, 69, 75, 52, 60, 3, 87, 89, 19, 29, 86, 90, 35, 45, 68, 76, 85, 91, 51, 61, 104, 2, 103, 105, 18, 30, 102, 106, 34, 46, 84, 92, 67, 77, 101, 107, 50, 62, 120, 1, 119, 121, 83, 93, 17, 31, 100, 108, 66, 78, 118, 122, 33, 47, 117, 123, 49, 63, 99, 109, 82, 94, 0, 116, 124, 65, 79, 16, 32, 98, 110, 48, 115, 125, 81, 95, 64, 114, 126, 97, 111, 80, 113, 127, 96, 112];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\n };\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {webp2png} from './webp';\nimport type {ConvertWebPTask} from './webpWorkerController';\n\nconst ctx = self as any as DedicatedWorkerGlobalScope;\nconst tasks: ConvertWebPTask[] = [];\n// let isProcessing = false;\n\nfunction finishTask() {\n // isProcessing = false;\n processTasks();\n}\n\nfunction processTasks() {\n // if(isProcessing) return;\n\n const task = tasks.shift();\n if(!task) return;\n\n // isProcessing = true;\n\n switch(task.type) {\n case 'convertWebp': {\n const {fileName, bytes} = task.payload;\n\n let convertedBytes: Uint8Array;\n try {\n convertedBytes = webp2png(bytes).bytes;\n } catch(err) {\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\n }\n\n ctx.postMessage({\n type: 'convertWebp',\n payload: {\n fileName,\n bytes: convertedBytes\n }\n });\n\n finishTask();\n\n break;\n }\n\n default:\n finishTask();\n }\n}\n\nfunction scheduleTask(task: ConvertWebPTask) {\n tasks.push(task);\n /* if(task.payload.fileName.indexOf('main-') === 0) {\n tasks.push(task);\n } else {\n tasks.unshift(task);\n } */\n\n processTasks();\n}\n\nctx.addEventListener('message', (event) => {\n scheduleTask(event.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 {WebPDecoder} from '../../vendor/libwebp-0.2.0';\nimport {encode} from 'fast-png';\n\nexport function webp2png(data: Uint8Array) {\n const decoder = new WebPDecoder();\n const config: any = decoder.WebPDecoderConfig;\n const buffer = config.j || config.output;\n const bitstream = config.input;\n\n decoder.WebPInitDecoderConfig(config);\n decoder.WebPGetFeatures(data, data.length, bitstream);\n\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\n buffer.J = 1;\n\n let status;\n try {\n status = decoder.WebPDecode(data, data.length, config);\n } catch(e) {\n status = e;\n }\n\n if(status === 0) {\n const rgbaData = buffer.Jb;\n const pngData = encode({\n data: rgbaData,\n width: buffer.width,\n height: buffer.height,\n channels: 4,\n depth: 8\n });\n\n return {status, bytes: pngData};\n }\n\n return {status, bytes: data};\n}\n\nexport function webp2pngAsBlob(data: Uint8Array) {\n const {status, bytes} = webp2png(data);\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,866,158], () => (__webpack_require__(2061)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"158\":\"npm.iobuffer\",\"699\":\"npm.pako\",\"866\":\"npm.fast-png\"}[chunkId] + \".\" + {\"158\":\"ae3638de6414621ea67b\",\"699\":\"f16d6f756c34f3914132\",\"866\":\"f6db8063094ac9670661\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t61: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","oldGetScript","oldLoadScript","queryMap","countMap","next","i","p","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","length","push","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","String","fromCharCode","U","ld","md","$","Error","WebPDecoder","a","Ob","Pb","Bb","Qb","b","c","la","d","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","s","ja","jc","k","h","n","l","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","m","f","q","r","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","o","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","t","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","this","value","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","options","WebPInitDecoderConfig","Math","pow","Eg","Fg","Gg","id","Hg","Ig","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","ctx","self","tasks","finishTask","processTasks","task","shift","type","fileName","bytes","payload","convertedBytes","decoder","config","buffer","output","bitstream","status","rgbaData","channels","depth","webp2png","err","console","error","postMessage","addEventListener","event","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","x","__webpack_exports__","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","key","splice","definition","defineProperty","enumerable","get","chunkId","Promise","all","reduce","promises","miniCssF","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","Map","has","catch","retries","realSrc","message","request","resolve","setTimeout","cacheBust","Date","now","set","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","pop","map","then"],"sourceRoot":""} \ No newline at end of file diff --git a/public/63.8c6c3aa1f4320cc408dd.chunk.js b/public/63.8c6c3aa1f4320cc408dd.chunk.js new file mode 100644 index 00000000..7a6df176 --- /dev/null +++ b/public/63.8c6c3aa1f4320cc408dd.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[63,709,810,641,776],{9638:(e,t,n)=>{n.d(t,{Z:()=>g});var a=n(3910),i=n(2738),r=n(4541),o=n(2325),s=n(3512),d=n(4494),c=n(279);let l,u=!1;function g(e){u||(l||(l=s.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==o.ZP.lastRequestedLangCode?Promise.all([e,o.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const l=[];n.forEach((e=>{const t=o.ZP.strings.get(e.key);t&&(l.push(t),o.ZP.strings.set(e.key,e))}));const g="Login.ContinueOnLanguage",p=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:g});p.lastElementChild.classList.remove("i18n"),(0,r.Z)({text:[o.ZP.format(g,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(p)}))})),s.Z.addEventListener("language_change",(()=>{p.remove()}),{once:!0}),l.forEach((e=>{o.ZP.strings.set(e.key,e)})),(0,i.fc)(p,(e=>{(0,a.Z)(e),u=!0,p.disabled=!0,(0,c.y)(p),o.ZP.getLangPack(t.suggested_lang_code)}))}))}},810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>x});var a=n(279),i=n(4874),r=n(9807),o=n(4494),s=n(5432),d=n(4159),c=n(2325),l=n(1447),u=n(1405),g=n(9709),p=n(9638),h=n(3910),m=n(2738),y=n(5565),v=n(1656),f=n(7487),Z=n(2398),L=n(7922),_=n(3512),k=n(709),b=n(3855),w=n(5431);let S,E=null;const P=new i.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,i;e.classList.add("input-wrapper");const u=new w.Z({onCountryChange:(e,n)=>{t=e,i=n,n&&(x.value=x.lastValue="+"+n.country_code,setTimeout((()=>{C.focus(),(0,Z.Z)(C,!0)}),0))}}),x=new k.Z({onInput:e=>{l.Z.loadLottieWorkers();const{country:n,code:a}=e||{},r=n?n.name||n.default_name:"";r===u.value||t&&n&&a&&(t===n||i.country_code===a.country_code)||u.override(n,a,r),n||x.value.length-1>1?E.style.visibility="":E.style.visibility="hidden"}}),C=x.input;C.addEventListener("keypress",(e=>{if(!E.style.visibility&&"Enter"===e.key)return M()}));const T=new r.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});T.input.addEventListener("change",(()=>{const e=T.checked;_.Z.managers.appStateManager.pushToState("keepSigned",e),b.Z.toggleStorages(e,!0)})),b.Z.getState().then((e=>{L.Z.isAvailable()?T.checked=e.keepSigned:(T.checked=!1,T.label.classList.add("checkbox-disabled"))})),E=(0,o.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),E.style.visibility="hidden";const M=e=>{e&&(0,h.Z)(e);const t=(0,v.Z)([E,S],!0);(0,y.Z)(E,(0,c.ag)("PleaseWait")),(0,a.y)(E);const i=x.value;_.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:i,api_id:d.Z.id,api_hash:d.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:i}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(x.setError(),(0,y.Z)(x.label,(0,c.ag)("Login.PhoneLabelInvalid")),C.classList.add("error"),(0,y.Z)(E,(0,c.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),E.innerText=e.type)}))};(0,m.fc)(E,M),S=(0,o.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),S.addEventListener("click",(()=>{g.default.mount()})),e.append(u.container,x.container,T.label,E,S);const A=document.createElement("h4");A.classList.add("text-center"),(0,c.$d)(A,"Login.Title");const R=document.createElement("div");R.classList.add("subtitle","text-center"),(0,c.$d)(R,"Login.StartText"),P.pageEl.querySelector(".container").append(A,R,e),s.Z||setTimeout((()=>{C.focus()}),0),(0,p.Z)(e),_.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=L.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&c.ZP.getLangPack(n.lang_code).then((()=>{x.simulateInputEvent()}));const a=new Set([1,2,3,4,5]),i=[e.this_dc];let r;return e.nearest_dc!==e.this_dc&&(r=_.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{i.push(e.nearest_dc)}))),(r||Promise.resolve()).then((()=>{i.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,r=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield f.Z.get(a))return t();setTimeout((()=>{_.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((i=void 0)||(i=Promise))((function(e,t){function o(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(o,s)}d((r=r.apply(n,a||[])).next())}));var n,a,i,r};t()})),e})).then((e=>{u.value.length||x.value.length||u.selectCountryByIso2(e.country)}))}),(()=>{E&&((0,y.Z)(E,(0,c.ag)("Login.Next")),(0,u.Z)(E,void 0,void 0,!0),E.removeAttribute("disabled")),S&&S.removeAttribute("disabled"),_.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),x=P},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>v});var a=n(4874),i=n(4159),r=n(4494),o=n(2325),s=n(3512),d=n(279),c=n(9638),l=n(5418),u=n(9895);function g(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var p=n(8812),h=function(e,t,n,a){return new(n||(n=Promise))((function(i,r){function o(e){try{d(a.next(e))}catch(e){r(e)}}function s(e){try{d(a.throw(e))}catch(e){r(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}d((a=a.apply(e,t||[])).next())}))};let m;const y=new a.Z("page-signQR",!0,(()=>m),(()=>{m||(m=h(void 0,void 0,void 0,(function*(){const e=y.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const v=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(v),(0,c.Z)(a);const f=e.parentElement,Z=document.createElement("h4");(0,o.$d)(Z,"Login.QR.Title");const L=document.createElement("ol");L.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach((e=>{const t=document.createElement("li");t.append((0,o.ag)(e)),L.append(t)})),f.append(Z,L,a),v.addEventListener("click",(()=>{n.e(810).then(n.bind(n,810)).then((e=>e.default.mount())),k=!0}));const _=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let k=!1;s.Z.addEventListener("user_auth",(()=>{k=!0,m=null}),{once:!0});const b={ignoreErrors:!0};let w;const S=a=>h(void 0,void 0,void 0,(function*(){try{let r=yield s.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:i.Z.id,api_hash:i.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===r._&&(b.dcId||(b.dcId=r.dc_id,s.Z.managers.apiManager.setBaseDcId(r.dc_id)),r=yield s.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:r.token},b)),"auth.loginTokenSuccess"===r._){const e=r.authorization;return s.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!w||!(0,u.Z)(w,r.token)){w=r.token;const n="tg://login?token="+function(e){let t,n="";for(let a=e.length,i=0,r=0;r>>t&24),2!==t&&a-r!=1||(n+=String.fromCharCode(g(i>>>18&63),g(i>>>12&63),g(i>>>6&63),g(63&i)),i=0);return n.replace(/A(?=A$|$)/g,"=")}(r.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""),a=window.getComputedStyle(document.documentElement),i=a.getPropertyValue("--surface-color").trim(),o=a.getPropertyValue("--primary-text-color").trim(),s=a.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>(e=e.replace(/(fill:).+?(;)/,`$1${s}$2`),(0,p.Z)(e)))),c=new _({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:i},qrOptions:{errorCorrectionLevel:"L"}});let u;c.append(e),e.lastChild.classList.add("qr-canvas"),u=c._drawingPromise?c._drawingPromise:Promise.race([(0,l.Z)(1e3),new Promise((e=>{c._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){const e=Date.now()/1e3,t=r.expires-e-(yield s.Z.managers.timeManager.getServerTimeOffset());yield(0,l.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(e.handled=!0,n.e(774).then(n.bind(n,9437)).then((e=>e.default.mount())),k=!0,m=null):(console.error("pageSignQR: default error:",e),k=!0),!0}return!1}));return()=>h(void 0,void 0,void 0,(function*(){for(k=!1;!k&&!(yield S(!0)););}))}))),m.then((e=>{e()})),s.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),v=y}}]); +//# sourceMappingURL=63.8c6c3aa1f4320cc408dd.chunk.js.map \ No newline at end of file diff --git a/public/63.8c6c3aa1f4320cc408dd.chunk.js.map b/public/63.8c6c3aa1f4320cc408dd.chunk.js.map new file mode 100644 index 00000000..cdf695ac --- /dev/null +++ b/public/63.8c6c3aa1f4320cc408dd.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"63.8c6c3aa1f4320cc408dd.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/pages/pageSignIn.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {putPreloader} from '../components/putPreloader';\nimport Page from './page';\nimport CheckboxField from '../components/checkboxField';\nimport Button from '../components/button';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport App from '../config/app';\nimport I18n, {_i18n, i18n} from '../lib/langPack';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport ripple from '../components/ripple';\nimport pageSignQR from './pageSignQR';\nimport getLanguageChangeButton from '../components/languageChangeButton';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport toggleDisability from '../helpers/dom/toggleDisability';\nimport sessionStorage from '../lib/sessionStorage';\nimport {DcAuthKey} from '../types';\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport stateStorage from '../lib/stateStorage';\nimport rootScope from '../lib/rootScope';\nimport TelInputField from '../components/telInputField';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport CountryInputField from '../components/countryInputField';\n\n// import _countries from '../countries_pretty.json';\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\n\nconst onFirstMount = () => {\n /* if(Modes.test) {\n Countries.push({\n _: 'help.country',\n default_name: 'Test Country',\n country_codes: [{\n _: 'help.countryCode',\n country_code: '999 66',\n patterns: ['999 66 XXX XX']\n }],\n iso2: 'KK'\n });\n\n console.log('Added test country to list!');\n } */\n\n // const countries: Country[] = _countries.default.filter((c) => c.emoji);\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\n const countryInputField = new CountryInputField({\n onCountryChange: (country, code) => {\n lastCountrySelected = country, lastCountryCodeSelected = code;\n\n if(!code) {\n return;\n }\n\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\n setTimeout(() => {\n telEl.focus();\n placeCaretAtEnd(telEl, true);\n }, 0);\n }\n });\n\n const telInputField = new TelInputField({\n onInput: (formatted) => {\n lottieLoader.loadLottieWorkers();\n\n const {country, code} = formatted || {};\n const countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\n if(countryName !== countryInputField.value && (\n !lastCountrySelected ||\n !country ||\n !code || (\n lastCountrySelected !== country &&\n lastCountryCodeSelected.country_code !== code.country_code\n )\n )\n ) {\n countryInputField.override(country, code, countryName);\n }\n\n // if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\n if(country || (telInputField.value.length - 1) > 1) {\n btnNext.style.visibility = '';\n } else {\n btnNext.style.visibility = 'hidden';\n }\n }\n });\n\n const telEl = telInputField.input;\n\n telEl.addEventListener('keypress', (e) => {\n // console.log('keypress', this.value);\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\n return onSubmit();\n }\n });\n\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n\n const signedCheckboxField = new CheckboxField({\n text: 'Login.KeepSigned',\n name: 'keepSession',\n withRipple: true,\n checked: true\n });\n\n signedCheckboxField.input.addEventListener('change', () => {\n const keepSigned = signedCheckboxField.checked;\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\n\n apiManagerProxy.toggleStorages(keepSigned, true);\n });\n\n apiManagerProxy.getState().then((state) => {\n if(!stateStorage.isAvailable()) {\n signedCheckboxField.checked = false;\n signedCheckboxField.label.classList.add('checkbox-disabled');\n } else {\n signedCheckboxField.checked = state.keepSigned;\n }\n });\n\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\n btnNext.style.visibility = 'hidden';\n\n const onSubmit = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\n\n replaceContent(btnNext, i18n('PleaseWait'));\n putPreloader(btnNext);\n\n // return;\n\n const phone_number = telInputField.value;\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\n phone_number: phone_number,\n api_id: App.id,\n api_hash: App.hash,\n settings: {\n _: 'codeSettings' // that's how we sending Type\n }\n // lang_code: navigator.language || 'en'\n }).then((code) => {\n // console.log('got code', code);\n\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\n }).catch((err) => {\n toggle();\n\n switch(err.type) {\n case 'PHONE_NUMBER_INVALID':\n telInputField.setError();\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\n telEl.classList.add('error');\n replaceContent(btnNext, i18n('Login.Next'));\n break;\n default:\n console.error('auth.sendCode error:', err);\n btnNext.innerText = err.type;\n break;\n }\n });\n };\n\n attachClickEvent(btnNext, onSubmit);\n\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\n\n const qrMounted = false;\n btnQr.addEventListener('click', () => {\n pageSignQR.mount();\n /* const promise = import('./pageSignQR');\n btnQr.disabled = true;\n\n let preloaderDiv: HTMLElement;\n if(!qrMounted) {\n preloaderDiv = putPreloader(btnQr);\n qrMounted = true;\n }\n\n promise.then((module) => {\n module.default.mount();\n\n setTimeout(() => {\n btnQr.removeAttribute('disabled');\n if(preloaderDiv) {\n preloaderDiv.remove();\n }\n }, 200);\n }); */\n });\n\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\n\n const h4 = document.createElement('h4');\n h4.classList.add('text-center');\n _i18n(h4, 'Login.Title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle', 'text-center');\n _i18n(subtitle, 'Login.StartText');\n\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\n\n const tryAgain = () => {\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\n const langPack = stateStorage.getFromCache('langPack');\n if(langPack && !langPack.countries?.hash) {\n I18n.getLangPack(langPack.lang_code).then(() => {\n telInputField.simulateInputEvent();\n });\n }\n\n const dcs = new Set([1, 2, 3, 4, 5]);\n const done: number[] = [nearestDcResult.this_dc];\n\n let promise: Promise;\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\n done.push(nearestDcResult.nearest_dc);\n });\n }\n\n (promise || Promise.resolve()).then(() => {\n done.forEach((dcId) => {\n dcs.delete(dcId);\n });\n\n const _dcs = [...dcs];\n const g = async(): Promise => {\n const dcId = _dcs.shift();\n if(!dcId) return;\n\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\n const key = await sessionStorage.get(dbKey);\n if(key) {\n return g();\n }\n\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\n }, /* done.includes(dcId) ? 0 : */3000);\n };\n\n g();\n });\n\n return nearestDcResult;\n }).then((nearestDcResult) => {\n if(!countryInputField.value.length && !telInputField.value.length) {\n countryInputField.selectCountryByIso2(nearestDcResult.country);\n }\n\n // console.log('woohoo', nearestDcResult, country);\n })// .catch(tryAgain);\n };\n\n if(!IS_TOUCH_SUPPORTED) {\n setTimeout(() => {\n telEl.focus();\n }, 0);\n }\n\n getLanguageChangeButton(inputWrapper);\n\n tryAgain();\n};\n\nconst page = new Page('page-sign', true, onFirstMount, () => {\n if(btnNext) {\n replaceContent(btnNext, i18n('Login.Next'));\n ripple(btnNext, undefined, undefined, true);\n btnNext.removeAttribute('disabled');\n }\n\n if(btnQr) {\n btnQr.removeAttribute('disabled');\n }\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\n});\n\nexport default page;\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","/*\n * 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 {DcId} from '../types';\nimport Page from './page';\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\nimport App from '../config/app';\nimport Button from '../components/button';\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport {putPreloader} from '../components/putPreloader';\nimport getLanguageChangeButton from '../components/languageChangeButton';\nimport pause from '../helpers/schedulers/pause';\nimport fixBase64String from '../helpers/fixBase64String';\nimport bytesCmp from '../helpers/bytes/bytesCmp';\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\nimport textToSvgURL from '../helpers/textToSvgURL';\n\nconst FETCH_INTERVAL = 3;\n\nconst onFirstMount = async() => {\n const pageElement = page.pageEl;\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\n\n let preloader = putPreloader(imageDiv, true);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\n inputWrapper.append(btnBack);\n\n getLanguageChangeButton(inputWrapper);\n\n const container = imageDiv.parentElement;\n\n const h4 = document.createElement('h4');\n _i18n(h4, 'Login.QR.Title');\n\n const helpList = document.createElement('ol');\n helpList.classList.add('qr-description');\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\n const li = document.createElement('li');\n li.append(i18n(key));\n helpList.append(li);\n });\n\n container.append(h4, helpList, inputWrapper);\n\n btnBack.addEventListener('click', () => {\n import('./pageSignIn').then((m) => m.default.mount());\n stop = true;\n });\n\n const results = await Promise.all([\n import('qr-code-styling' as any)\n ]);\n const QRCodeStyling = results[0].default;\n\n let stop = false;\n rootScope.addEventListener('user_auth', () => {\n stop = true;\n cachedPromise = null;\n }, {once: true});\n\n const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\n let prevToken: Uint8Array | number[];\n\n const iterate = async(isLoop: boolean) => {\n try {\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\n api_id: App.id,\n api_hash: App.hash,\n except_ids: []\n }, {ignoreErrors: true});\n\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\n if(!options.dcId) {\n options.dcId = loginToken.dc_id as DcId;\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\n // continue;\n }\n\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\n token: loginToken.token\n }, options) as AuthLoginToken.authLoginToken;\n }\n\n if(loginToken._ === 'auth.loginTokenSuccess') {\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\n rootScope.managers.apiManager.setUser(authorization.user);\n import('./pageIm').then((m) => m.default.mount());\n return true;\n }\n\n /* // to base64\n var decoder = new TextDecoder('utf8');\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\n\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\n prevToken = loginToken.token;\n\n const encoded = bytesToBase64(loginToken.token);\n const url = 'tg://login?token=' + fixBase64String(encoded, true);\n\n const style = window.getComputedStyle(document.documentElement);\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\n const textColor = style.getPropertyValue('--primary-text-color').trim();\n const primaryColor = style.getPropertyValue('--primary-color').trim();\n\n const logoUrl = await fetch('assets/img/logo_padded.svg')\n .then((res) => res.text())\n .then((text) => {\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\n return textToSvgURL(text);\n });\n\n const qrCode = new QRCodeStyling({\n width: 240 * window.devicePixelRatio,\n height: 240 * window.devicePixelRatio,\n data: url,\n image: logoUrl,\n dotsOptions: {\n color: textColor,\n type: 'rounded'\n },\n cornersSquareOptions: {\n type: 'extra-rounded'\n },\n imageOptions: {\n imageSize: 1,\n margin: 0\n },\n backgroundOptions: {\n color: surfaceColor\n },\n qrOptions: {\n errorCorrectionLevel: 'L'\n }\n });\n\n qrCode.append(imageDiv);\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\n\n let promise: Promise;\n if(qrCode._drawingPromise) {\n promise = qrCode._drawingPromise;\n } else {\n promise = Promise.race([\n pause(1000),\n new Promise((resolve) => {\n qrCode._canvas._image.addEventListener('load', () => {\n window.requestAnimationFrame(() => resolve());\n }, {once: true});\n })\n ]);\n }\n\n // * это костыль, но библиотека не предоставляет никаких событий\n await promise.then(() => {\n if(preloader) {\n preloader.style.animation = 'hide-icon .4s forwards';\n\n const c = imageDiv.children[1] as HTMLElement;\n c.style.display = 'none';\n c.style.animation = 'grow-icon .4s forwards';\n setTimeout(() => {\n c.style.display = '';\n }, 150);\n\n setTimeout(() => {\n c.style.animation = '';\n }, 500);\n preloader = undefined;\n } else {\n Array.from(imageDiv.children).slice(0, -1).forEach((el) => {\n el.remove();\n });\n }\n });\n }\n\n if(isLoop) {\n const timestamp = Date.now() / 1000;\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\n\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\n }\n } catch(err) {\n switch((err as ApiError).type) {\n case 'SESSION_PASSWORD_NEEDED':\n (err as ApiError).handled = true;\n import('./pagePassword').then((m) => m.default.mount());\n stop = true;\n cachedPromise = null;\n break;\n default:\n console.error('pageSignQR: default error:', err);\n stop = true;\n break;\n }\n\n return true;\n }\n\n return false;\n };\n\n // await iterate(false);\n\n return async() => {\n stop = false;\n\n do {\n if(stop) {\n break;\n }\n\n const needBreak = await iterate(true);\n if(needBreak) {\n break;\n }\n } while(true);\n };\n};\n\nlet cachedPromise: Promise<() => Promise>;\nconst page = new Page('page-signQR', true, () => {\n return cachedPromise;\n}, () => {\n // console.log('onMount');\n if(!cachedPromise) cachedPromise = onFirstMount();\n cachedPromise.then((func) => {\n func();\n });\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\n});\n\nexport default page;\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","once","e","disabled","btnQr","btnNext","page","inputWrapper","document","createElement","lastCountrySelected","lastCountryCodeSelected","add","countryInputField","onCountryChange","country","code","telInputField","value","lastValue","country_code","setTimeout","telEl","focus","onInput","formatted","countryName","name","default_name","override","length","style","visibility","input","addEventListener","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","state","label","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","innerText","container","h4","subtitle","pageEl","querySelector","nearestDcResult","langPack","countries","hash","lang_code","simulateInputEvent","dcs","Set","done","this_dc","promise","nearest_dc","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined","removeAttribute","uint6ToBase64","nUint6","imageDiv","preloader","putPreloader","btnBack","parentElement","helpList","li","stop","QRCodeStyling","rootScope","options","ignoreErrors","prevToken","iterate","isLoop","loginToken","except_ids","dc_id","token","authorization","user","bytesCmp","url","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","replace","bytesToBase64","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","textToSvgURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","Array","from","slice","el","timestamp","Date","now","diff","expires","handled","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/63.f3beda66b31880abf426.chunk.js b/public/63.f3beda66b31880abf426.chunk.js deleted file mode 100644 index 4e51d11d..00000000 --- a/public/63.f3beda66b31880abf426.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[63,709,810,641,776],{9638:(e,t,n)=>{n.d(t,{Z:()=>g});var a=n(3910),i=n(2738),r=n(4541),o=n(2325),s=n(3512),d=n(4494),c=n(279);let l,u=!1;function g(e){u||(l||(l=s.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==o.ZP.lastRequestedLangCode?Promise.all([e,o.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const l=[];n.forEach((e=>{const t=o.ZP.strings.get(e.key);t&&(l.push(t),o.ZP.strings.set(e.key,e))}));const g="Login.ContinueOnLanguage",p=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:g});p.lastElementChild.classList.remove("i18n"),(0,r.Z)({text:[o.ZP.format(g,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(p)}))})),s.Z.addEventListener("language_change",(()=>{p.remove()}),{once:!0}),l.forEach((e=>{o.ZP.strings.set(e.key,e)})),(0,i.fc)(p,(e=>{(0,a.Z)(e),u=!0,p.disabled=!0,(0,c.y)(p),o.ZP.getLangPack(t.suggested_lang_code)}))}))}},810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>x});var a=n(279),i=n(4874),r=n(9807),o=n(4494),s=n(5432),d=n(4159),c=n(2325),l=n(1447),u=n(1405),g=n(9709),p=n(9638),h=n(3910),m=n(2738),y=n(5565),v=n(1656),f=n(7487),Z=n(2398),L=n(7922),_=n(3512),w=n(709),b=n(3855),k=n(5431);let S,E=null;const P=new i.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,i;e.classList.add("input-wrapper");const u=new k.Z({onCountryChange:(e,n)=>{t=e,i=n,n&&(x.value=x.lastValue="+"+n.country_code,setTimeout((()=>{C.focus(),(0,Z.Z)(C,!0)}),0))}}),x=new w.Z({onInput:e=>{l.Z.loadLottieWorkers();const{country:n,code:a}=e||{},r=n?n.name||n.default_name:"";r===u.value||t&&n&&a&&(t===n||i.country_code===a.country_code)||u.override(n,a,r),n||x.value.length-1>1?E.style.visibility="":E.style.visibility="hidden"}}),C=x.input;C.addEventListener("keypress",(e=>{if(!E.style.visibility&&"Enter"===e.key)return R()}));const T=new r.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});T.input.addEventListener("change",(()=>{const e=T.checked;_.Z.managers.appStateManager.pushToState("keepSigned",e),b.Z.toggleStorages(e,!0)})),b.Z.getState().then((e=>{L.Z.isAvailable()?T.checked=e.keepSigned:(T.checked=!1,T.label.classList.add("checkbox-disabled"))})),E=(0,o.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),E.style.visibility="hidden";const R=e=>{e&&(0,h.Z)(e);const t=(0,v.Z)([E,S],!0);(0,y.Z)(E,(0,c.ag)("PleaseWait")),(0,a.y)(E);const i=x.value;_.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:i,api_id:d.Z.id,api_hash:d.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:i}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(x.setError(),(0,y.Z)(x.label,(0,c.ag)("Login.PhoneLabelInvalid")),C.classList.add("error"),(0,y.Z)(E,(0,c.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),E.innerText=e.type)}))};(0,m.fc)(E,R),S=(0,o.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),S.addEventListener("click",(()=>{g.default.mount()})),e.append(u.container,x.container,T.label,E,S);const A=document.createElement("h4");A.classList.add("text-center"),(0,c.$d)(A,"Login.Title");const M=document.createElement("div");M.classList.add("subtitle","text-center"),(0,c.$d)(M,"Login.StartText"),P.pageEl.querySelector(".container").append(A,M,e),s.Z||setTimeout((()=>{C.focus()}),0),(0,p.Z)(e),_.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=L.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&c.ZP.getLangPack(n.lang_code).then((()=>{x.simulateInputEvent()}));const a=new Set([1,2,3,4,5]),i=[e.this_dc];let r;return e.nearest_dc!==e.this_dc&&(r=_.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{i.push(e.nearest_dc)}))),(r||Promise.resolve()).then((()=>{i.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,r=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield f.Z.get(a))return t();setTimeout((()=>{_.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((i=void 0)||(i=Promise))((function(e,t){function o(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(o,s)}d((r=r.apply(n,a||[])).next())}));var n,a,i,r};t()})),e})).then((e=>{u.value.length||x.value.length||u.selectCountryByIso2(e.country)}))}),(()=>{E&&((0,y.Z)(E,(0,c.ag)("Login.Next")),(0,u.Z)(E,void 0,void 0,!0),E.removeAttribute("disabled")),S&&S.removeAttribute("disabled"),_.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),x=P},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>y});var a=n(4874),i=n(4159),r=n(4494),o=n(2325),s=n(3512),d=n(279),c=n(9638),l=n(5418),u=n(9895);function g(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var p=function(e,t,n,a){return new(n||(n=Promise))((function(i,r){function o(e){try{d(a.next(e))}catch(e){r(e)}}function s(e){try{d(a.throw(e))}catch(e){r(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}d((a=a.apply(e,t||[])).next())}))};let h;const m=new a.Z("page-signQR",!0,(()=>h),(()=>{h||(h=p(void 0,void 0,void 0,(function*(){const e=m.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const y=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(y),(0,c.Z)(a);const v=e.parentElement,f=document.createElement("h4");(0,o.$d)(f,"Login.QR.Title");const Z=document.createElement("ol");Z.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach((e=>{const t=document.createElement("li");t.append((0,o.ag)(e)),Z.append(t)})),v.append(f,Z,a),y.addEventListener("click",(()=>{n.e(810).then(n.bind(n,810)).then((e=>e.default.mount())),_=!0}));const L=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let _=!1;s.Z.addEventListener("user_auth",(()=>{_=!0,h=null}),{once:!0});const w={ignoreErrors:!0};let b;const k=a=>p(void 0,void 0,void 0,(function*(){try{let r=yield s.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:i.Z.id,api_hash:i.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===r._&&(w.dcId||(w.dcId=r.dc_id,s.Z.managers.apiManager.setBaseDcId(r.dc_id)),r=yield s.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:r.token},w)),"auth.loginTokenSuccess"===r._){const e=r.authorization;return s.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!b||!(0,u.Z)(b,r.token)){b=r.token;const n="tg://login?token="+function(e){let t,n="";for(let a=e.length,i=0,r=0;r>>t&24),2!==t&&a-r!=1||(n+=String.fromCharCode(g(i>>>18&63),g(i>>>12&63),g(i>>>6&63),g(63&i)),i=0);return n.replace(/A(?=A$|$)/g,"=")}(r.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""),a=window.getComputedStyle(document.documentElement),i=a.getPropertyValue("--surface-color").trim(),o=a.getPropertyValue("--primary-text-color").trim(),s=a.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>{e=e.replace(/(fill:).+?(;)/,`$1${s}$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)}))})),c=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:i},qrOptions:{errorCorrectionLevel:"L"}});let u;c.append(e),e.lastChild.classList.add("qr-canvas"),u=c._drawingPromise?c._drawingPromise:Promise.race([(0,l.Z)(1e3),new Promise((e=>{c._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){const e=Date.now()/1e3,t=r.expires-e-(yield s.Z.managers.timeManager.getServerTimeOffset());yield(0,l.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(e.handled=!0,n.e(774).then(n.bind(n,9437)).then((e=>e.default.mount())),_=!0,h=null):(console.error("pageSignQR: default error:",e),_=!0),!0}return!1}));return()=>p(void 0,void 0,void 0,(function*(){for(_=!1;!_&&!(yield k(!0)););}))}))),h.then((e=>{e()})),s.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),y=m}}]); -//# sourceMappingURL=63.f3beda66b31880abf426.chunk.js.map \ No newline at end of file diff --git a/public/63.f3beda66b31880abf426.chunk.js.map b/public/63.f3beda66b31880abf426.chunk.js.map deleted file mode 100644 index 1b750903..00000000 --- a/public/63.f3beda66b31880abf426.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"63.f3beda66b31880abf426.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/pages/pageSignIn.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport Page from './page';\r\nimport CheckboxField from '../components/checkboxField';\r\nimport Button from '../components/button';\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 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 stateStorage from '../lib/stateStorage';\r\nimport rootScope from '../lib/rootScope';\r\nimport TelInputField from '../components/telInputField';\r\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\r\nimport CountryInputField from '../components/countryInputField';\r\n\r\n// import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nconst 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\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n const countryInputField = new CountryInputField({\r\n onCountryChange: (country, code) => {\r\n lastCountrySelected = country, lastCountryCodeSelected = code;\r\n\r\n if(!code) {\r\n return;\r\n }\r\n\r\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n }\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 const 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 countryInputField.override(country, code, countryName);\r\n }\r\n\r\n // if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n // console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned',\r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n\r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n // return;\r\n\r\n const phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n // lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n // console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n const 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 const tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n telInputField.simulateInputEvent();\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n\r\n g();\r\n });\r\n\r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n countryInputField.selectCountryByIso2(nearestDcResult.country);\r\n }\r\n\r\n // console.log('woohoo', nearestDcResult, country);\r\n })// .catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","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 Page from './page';\r\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nconst 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 const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n\r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\r\n // continue;\r\n }\r\n\r\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n rootScope.managers.apiManager.setUser(authorization.user);\r\n import('./pageIm').then((m) => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n const encoded = bytesToBase64(loginToken.token);\r\n const 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 const timestamp = Date.now() / 1000;\r\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\r\n\r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then((m) => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n\r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n // console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then((func) => {\r\n func();\r\n });\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","once","e","disabled","btnQr","btnNext","page","inputWrapper","document","createElement","lastCountrySelected","lastCountryCodeSelected","add","countryInputField","onCountryChange","country","code","telInputField","value","lastValue","country_code","setTimeout","telEl","focus","onInput","formatted","countryName","name","default_name","override","length","style","visibility","input","addEventListener","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","state","label","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","innerText","container","h4","subtitle","pageEl","querySelector","nearestDcResult","langPack","countries","hash","lang_code","simulateInputEvent","dcs","Set","done","this_dc","promise","nearest_dc","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined","removeAttribute","uint6ToBase64","nUint6","imageDiv","preloader","putPreloader","btnBack","parentElement","helpList","li","stop","QRCodeStyling","rootScope","options","ignoreErrors","prevToken","iterate","isLoop","loginToken","except_ids","dc_id","token","authorization","user","bytesCmp","url","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","replace","bytesToBase64","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","target","readAsDataURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","Array","from","slice","el","timestamp","Date","now","diff","expires","handled","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/641.17ddd9c6d001de1e2dff.chunk.js b/public/641.17ddd9c6d001de1e2dff.chunk.js new file mode 100644 index 00000000..0e3ec67f --- /dev/null +++ b/public/641.17ddd9c6d001de1e2dff.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[641,63,709,810,776],{9638:(e,t,n)=>{n.d(t,{Z:()=>g});var a=n(3910),i=n(2738),r=n(4541),o=n(2325),s=n(3512),d=n(4494),c=n(279);let l,u=!1;function g(e){u||(l||(l=s.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==o.ZP.lastRequestedLangCode?Promise.all([e,o.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const l=[];n.forEach((e=>{const t=o.ZP.strings.get(e.key);t&&(l.push(t),o.ZP.strings.set(e.key,e))}));const g="Login.ContinueOnLanguage",p=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:g});p.lastElementChild.classList.remove("i18n"),(0,r.Z)({text:[o.ZP.format(g,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(p)}))})),s.Z.addEventListener("language_change",(()=>{p.remove()}),{once:!0}),l.forEach((e=>{o.ZP.strings.set(e.key,e)})),(0,i.fc)(p,(e=>{(0,a.Z)(e),u=!0,p.disabled=!0,(0,c.y)(p),o.ZP.getLangPack(t.suggested_lang_code)}))}))}},810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>x});var a=n(279),i=n(4874),r=n(9807),o=n(4494),s=n(5432),d=n(4159),c=n(2325),l=n(1447),u=n(1405),g=n(9709),p=n(9638),h=n(3910),m=n(2738),y=n(5565),v=n(1656),f=n(7487),Z=n(2398),L=n(7922),_=n(3512),k=n(709),b=n(3855),w=n(5431);let S,E=null;const P=new i.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,i;e.classList.add("input-wrapper");const u=new w.Z({onCountryChange:(e,n)=>{t=e,i=n,n&&(x.value=x.lastValue="+"+n.country_code,setTimeout((()=>{C.focus(),(0,Z.Z)(C,!0)}),0))}}),x=new k.Z({onInput:e=>{l.Z.loadLottieWorkers();const{country:n,code:a}=e||{},r=n?n.name||n.default_name:"";r===u.value||t&&n&&a&&(t===n||i.country_code===a.country_code)||u.override(n,a,r),n||x.value.length-1>1?E.style.visibility="":E.style.visibility="hidden"}}),C=x.input;C.addEventListener("keypress",(e=>{if(!E.style.visibility&&"Enter"===e.key)return M()}));const T=new r.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});T.input.addEventListener("change",(()=>{const e=T.checked;_.Z.managers.appStateManager.pushToState("keepSigned",e),b.Z.toggleStorages(e,!0)})),b.Z.getState().then((e=>{L.Z.isAvailable()?T.checked=e.keepSigned:(T.checked=!1,T.label.classList.add("checkbox-disabled"))})),E=(0,o.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),E.style.visibility="hidden";const M=e=>{e&&(0,h.Z)(e);const t=(0,v.Z)([E,S],!0);(0,y.Z)(E,(0,c.ag)("PleaseWait")),(0,a.y)(E);const i=x.value;_.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:i,api_id:d.Z.id,api_hash:d.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:i}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(x.setError(),(0,y.Z)(x.label,(0,c.ag)("Login.PhoneLabelInvalid")),C.classList.add("error"),(0,y.Z)(E,(0,c.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),E.innerText=e.type)}))};(0,m.fc)(E,M),S=(0,o.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),S.addEventListener("click",(()=>{g.default.mount()})),e.append(u.container,x.container,T.label,E,S);const A=document.createElement("h4");A.classList.add("text-center"),(0,c.$d)(A,"Login.Title");const R=document.createElement("div");R.classList.add("subtitle","text-center"),(0,c.$d)(R,"Login.StartText"),P.pageEl.querySelector(".container").append(A,R,e),s.Z||setTimeout((()=>{C.focus()}),0),(0,p.Z)(e),_.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=L.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&c.ZP.getLangPack(n.lang_code).then((()=>{x.simulateInputEvent()}));const a=new Set([1,2,3,4,5]),i=[e.this_dc];let r;return e.nearest_dc!==e.this_dc&&(r=_.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{i.push(e.nearest_dc)}))),(r||Promise.resolve()).then((()=>{i.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,r=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield f.Z.get(a))return t();setTimeout((()=>{_.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((i=void 0)||(i=Promise))((function(e,t){function o(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(o,s)}d((r=r.apply(n,a||[])).next())}));var n,a,i,r};t()})),e})).then((e=>{u.value.length||x.value.length||u.selectCountryByIso2(e.country)}))}),(()=>{E&&((0,y.Z)(E,(0,c.ag)("Login.Next")),(0,u.Z)(E,void 0,void 0,!0),E.removeAttribute("disabled")),S&&S.removeAttribute("disabled"),_.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),x=P},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>v});var a=n(4874),i=n(4159),r=n(4494),o=n(2325),s=n(3512),d=n(279),c=n(9638),l=n(5418),u=n(9895);function g(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var p=n(8812),h=function(e,t,n,a){return new(n||(n=Promise))((function(i,r){function o(e){try{d(a.next(e))}catch(e){r(e)}}function s(e){try{d(a.throw(e))}catch(e){r(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}d((a=a.apply(e,t||[])).next())}))};let m;const y=new a.Z("page-signQR",!0,(()=>m),(()=>{m||(m=h(void 0,void 0,void 0,(function*(){const e=y.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const v=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(v),(0,c.Z)(a);const f=e.parentElement,Z=document.createElement("h4");(0,o.$d)(Z,"Login.QR.Title");const L=document.createElement("ol");L.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach((e=>{const t=document.createElement("li");t.append((0,o.ag)(e)),L.append(t)})),f.append(Z,L,a),v.addEventListener("click",(()=>{n.e(810).then(n.bind(n,810)).then((e=>e.default.mount())),k=!0}));const _=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let k=!1;s.Z.addEventListener("user_auth",(()=>{k=!0,m=null}),{once:!0});const b={ignoreErrors:!0};let w;const S=a=>h(void 0,void 0,void 0,(function*(){try{let r=yield s.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:i.Z.id,api_hash:i.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===r._&&(b.dcId||(b.dcId=r.dc_id,s.Z.managers.apiManager.setBaseDcId(r.dc_id)),r=yield s.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:r.token},b)),"auth.loginTokenSuccess"===r._){const e=r.authorization;return s.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!w||!(0,u.Z)(w,r.token)){w=r.token;const n="tg://login?token="+function(e){let t,n="";for(let a=e.length,i=0,r=0;r>>t&24),2!==t&&a-r!=1||(n+=String.fromCharCode(g(i>>>18&63),g(i>>>12&63),g(i>>>6&63),g(63&i)),i=0);return n.replace(/A(?=A$|$)/g,"=")}(r.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""),a=window.getComputedStyle(document.documentElement),i=a.getPropertyValue("--surface-color").trim(),o=a.getPropertyValue("--primary-text-color").trim(),s=a.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>(e=e.replace(/(fill:).+?(;)/,`$1${s}$2`),(0,p.Z)(e)))),c=new _({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:i},qrOptions:{errorCorrectionLevel:"L"}});let u;c.append(e),e.lastChild.classList.add("qr-canvas"),u=c._drawingPromise?c._drawingPromise:Promise.race([(0,l.Z)(1e3),new Promise((e=>{c._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){const e=Date.now()/1e3,t=r.expires-e-(yield s.Z.managers.timeManager.getServerTimeOffset());yield(0,l.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(e.handled=!0,n.e(774).then(n.bind(n,9437)).then((e=>e.default.mount())),k=!0,m=null):(console.error("pageSignQR: default error:",e),k=!0),!0}return!1}));return()=>h(void 0,void 0,void 0,(function*(){for(k=!1;!k&&!(yield S(!0)););}))}))),m.then((e=>{e()})),s.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),v=y}}]); +//# sourceMappingURL=641.17ddd9c6d001de1e2dff.chunk.js.map \ No newline at end of file diff --git a/public/641.17ddd9c6d001de1e2dff.chunk.js.map b/public/641.17ddd9c6d001de1e2dff.chunk.js.map new file mode 100644 index 00000000..84f20f6f --- /dev/null +++ b/public/641.17ddd9c6d001de1e2dff.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"641.17ddd9c6d001de1e2dff.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/pages/pageSignIn.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {putPreloader} from '../components/putPreloader';\nimport Page from './page';\nimport CheckboxField from '../components/checkboxField';\nimport Button from '../components/button';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport App from '../config/app';\nimport I18n, {_i18n, i18n} from '../lib/langPack';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport ripple from '../components/ripple';\nimport pageSignQR from './pageSignQR';\nimport getLanguageChangeButton from '../components/languageChangeButton';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport toggleDisability from '../helpers/dom/toggleDisability';\nimport sessionStorage from '../lib/sessionStorage';\nimport {DcAuthKey} from '../types';\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport stateStorage from '../lib/stateStorage';\nimport rootScope from '../lib/rootScope';\nimport TelInputField from '../components/telInputField';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport CountryInputField from '../components/countryInputField';\n\n// import _countries from '../countries_pretty.json';\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\n\nconst onFirstMount = () => {\n /* if(Modes.test) {\n Countries.push({\n _: 'help.country',\n default_name: 'Test Country',\n country_codes: [{\n _: 'help.countryCode',\n country_code: '999 66',\n patterns: ['999 66 XXX XX']\n }],\n iso2: 'KK'\n });\n\n console.log('Added test country to list!');\n } */\n\n // const countries: Country[] = _countries.default.filter((c) => c.emoji);\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\n const countryInputField = new CountryInputField({\n onCountryChange: (country, code) => {\n lastCountrySelected = country, lastCountryCodeSelected = code;\n\n if(!code) {\n return;\n }\n\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\n setTimeout(() => {\n telEl.focus();\n placeCaretAtEnd(telEl, true);\n }, 0);\n }\n });\n\n const telInputField = new TelInputField({\n onInput: (formatted) => {\n lottieLoader.loadLottieWorkers();\n\n const {country, code} = formatted || {};\n const countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\n if(countryName !== countryInputField.value && (\n !lastCountrySelected ||\n !country ||\n !code || (\n lastCountrySelected !== country &&\n lastCountryCodeSelected.country_code !== code.country_code\n )\n )\n ) {\n countryInputField.override(country, code, countryName);\n }\n\n // if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\n if(country || (telInputField.value.length - 1) > 1) {\n btnNext.style.visibility = '';\n } else {\n btnNext.style.visibility = 'hidden';\n }\n }\n });\n\n const telEl = telInputField.input;\n\n telEl.addEventListener('keypress', (e) => {\n // console.log('keypress', this.value);\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\n return onSubmit();\n }\n });\n\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n\n const signedCheckboxField = new CheckboxField({\n text: 'Login.KeepSigned',\n name: 'keepSession',\n withRipple: true,\n checked: true\n });\n\n signedCheckboxField.input.addEventListener('change', () => {\n const keepSigned = signedCheckboxField.checked;\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\n\n apiManagerProxy.toggleStorages(keepSigned, true);\n });\n\n apiManagerProxy.getState().then((state) => {\n if(!stateStorage.isAvailable()) {\n signedCheckboxField.checked = false;\n signedCheckboxField.label.classList.add('checkbox-disabled');\n } else {\n signedCheckboxField.checked = state.keepSigned;\n }\n });\n\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\n btnNext.style.visibility = 'hidden';\n\n const onSubmit = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\n\n replaceContent(btnNext, i18n('PleaseWait'));\n putPreloader(btnNext);\n\n // return;\n\n const phone_number = telInputField.value;\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\n phone_number: phone_number,\n api_id: App.id,\n api_hash: App.hash,\n settings: {\n _: 'codeSettings' // that's how we sending Type\n }\n // lang_code: navigator.language || 'en'\n }).then((code) => {\n // console.log('got code', code);\n\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\n }).catch((err) => {\n toggle();\n\n switch(err.type) {\n case 'PHONE_NUMBER_INVALID':\n telInputField.setError();\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\n telEl.classList.add('error');\n replaceContent(btnNext, i18n('Login.Next'));\n break;\n default:\n console.error('auth.sendCode error:', err);\n btnNext.innerText = err.type;\n break;\n }\n });\n };\n\n attachClickEvent(btnNext, onSubmit);\n\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\n\n const qrMounted = false;\n btnQr.addEventListener('click', () => {\n pageSignQR.mount();\n /* const promise = import('./pageSignQR');\n btnQr.disabled = true;\n\n let preloaderDiv: HTMLElement;\n if(!qrMounted) {\n preloaderDiv = putPreloader(btnQr);\n qrMounted = true;\n }\n\n promise.then((module) => {\n module.default.mount();\n\n setTimeout(() => {\n btnQr.removeAttribute('disabled');\n if(preloaderDiv) {\n preloaderDiv.remove();\n }\n }, 200);\n }); */\n });\n\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\n\n const h4 = document.createElement('h4');\n h4.classList.add('text-center');\n _i18n(h4, 'Login.Title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle', 'text-center');\n _i18n(subtitle, 'Login.StartText');\n\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\n\n const tryAgain = () => {\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\n const langPack = stateStorage.getFromCache('langPack');\n if(langPack && !langPack.countries?.hash) {\n I18n.getLangPack(langPack.lang_code).then(() => {\n telInputField.simulateInputEvent();\n });\n }\n\n const dcs = new Set([1, 2, 3, 4, 5]);\n const done: number[] = [nearestDcResult.this_dc];\n\n let promise: Promise;\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\n done.push(nearestDcResult.nearest_dc);\n });\n }\n\n (promise || Promise.resolve()).then(() => {\n done.forEach((dcId) => {\n dcs.delete(dcId);\n });\n\n const _dcs = [...dcs];\n const g = async(): Promise => {\n const dcId = _dcs.shift();\n if(!dcId) return;\n\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\n const key = await sessionStorage.get(dbKey);\n if(key) {\n return g();\n }\n\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\n }, /* done.includes(dcId) ? 0 : */3000);\n };\n\n g();\n });\n\n return nearestDcResult;\n }).then((nearestDcResult) => {\n if(!countryInputField.value.length && !telInputField.value.length) {\n countryInputField.selectCountryByIso2(nearestDcResult.country);\n }\n\n // console.log('woohoo', nearestDcResult, country);\n })// .catch(tryAgain);\n };\n\n if(!IS_TOUCH_SUPPORTED) {\n setTimeout(() => {\n telEl.focus();\n }, 0);\n }\n\n getLanguageChangeButton(inputWrapper);\n\n tryAgain();\n};\n\nconst page = new Page('page-sign', true, onFirstMount, () => {\n if(btnNext) {\n replaceContent(btnNext, i18n('Login.Next'));\n ripple(btnNext, undefined, undefined, true);\n btnNext.removeAttribute('disabled');\n }\n\n if(btnQr) {\n btnQr.removeAttribute('disabled');\n }\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\n});\n\nexport default page;\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","/*\n * 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 {DcId} from '../types';\nimport Page from './page';\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\nimport App from '../config/app';\nimport Button from '../components/button';\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport {putPreloader} from '../components/putPreloader';\nimport getLanguageChangeButton from '../components/languageChangeButton';\nimport pause from '../helpers/schedulers/pause';\nimport fixBase64String from '../helpers/fixBase64String';\nimport bytesCmp from '../helpers/bytes/bytesCmp';\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\nimport textToSvgURL from '../helpers/textToSvgURL';\n\nconst FETCH_INTERVAL = 3;\n\nconst onFirstMount = async() => {\n const pageElement = page.pageEl;\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\n\n let preloader = putPreloader(imageDiv, true);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\n inputWrapper.append(btnBack);\n\n getLanguageChangeButton(inputWrapper);\n\n const container = imageDiv.parentElement;\n\n const h4 = document.createElement('h4');\n _i18n(h4, 'Login.QR.Title');\n\n const helpList = document.createElement('ol');\n helpList.classList.add('qr-description');\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\n const li = document.createElement('li');\n li.append(i18n(key));\n helpList.append(li);\n });\n\n container.append(h4, helpList, inputWrapper);\n\n btnBack.addEventListener('click', () => {\n import('./pageSignIn').then((m) => m.default.mount());\n stop = true;\n });\n\n const results = await Promise.all([\n import('qr-code-styling' as any)\n ]);\n const QRCodeStyling = results[0].default;\n\n let stop = false;\n rootScope.addEventListener('user_auth', () => {\n stop = true;\n cachedPromise = null;\n }, {once: true});\n\n const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\n let prevToken: Uint8Array | number[];\n\n const iterate = async(isLoop: boolean) => {\n try {\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\n api_id: App.id,\n api_hash: App.hash,\n except_ids: []\n }, {ignoreErrors: true});\n\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\n if(!options.dcId) {\n options.dcId = loginToken.dc_id as DcId;\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\n // continue;\n }\n\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\n token: loginToken.token\n }, options) as AuthLoginToken.authLoginToken;\n }\n\n if(loginToken._ === 'auth.loginTokenSuccess') {\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\n rootScope.managers.apiManager.setUser(authorization.user);\n import('./pageIm').then((m) => m.default.mount());\n return true;\n }\n\n /* // to base64\n var decoder = new TextDecoder('utf8');\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\n\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\n prevToken = loginToken.token;\n\n const encoded = bytesToBase64(loginToken.token);\n const url = 'tg://login?token=' + fixBase64String(encoded, true);\n\n const style = window.getComputedStyle(document.documentElement);\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\n const textColor = style.getPropertyValue('--primary-text-color').trim();\n const primaryColor = style.getPropertyValue('--primary-color').trim();\n\n const logoUrl = await fetch('assets/img/logo_padded.svg')\n .then((res) => res.text())\n .then((text) => {\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\n return textToSvgURL(text);\n });\n\n const qrCode = new QRCodeStyling({\n width: 240 * window.devicePixelRatio,\n height: 240 * window.devicePixelRatio,\n data: url,\n image: logoUrl,\n dotsOptions: {\n color: textColor,\n type: 'rounded'\n },\n cornersSquareOptions: {\n type: 'extra-rounded'\n },\n imageOptions: {\n imageSize: 1,\n margin: 0\n },\n backgroundOptions: {\n color: surfaceColor\n },\n qrOptions: {\n errorCorrectionLevel: 'L'\n }\n });\n\n qrCode.append(imageDiv);\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\n\n let promise: Promise;\n if(qrCode._drawingPromise) {\n promise = qrCode._drawingPromise;\n } else {\n promise = Promise.race([\n pause(1000),\n new Promise((resolve) => {\n qrCode._canvas._image.addEventListener('load', () => {\n window.requestAnimationFrame(() => resolve());\n }, {once: true});\n })\n ]);\n }\n\n // * это костыль, но библиотека не предоставляет никаких событий\n await promise.then(() => {\n if(preloader) {\n preloader.style.animation = 'hide-icon .4s forwards';\n\n const c = imageDiv.children[1] as HTMLElement;\n c.style.display = 'none';\n c.style.animation = 'grow-icon .4s forwards';\n setTimeout(() => {\n c.style.display = '';\n }, 150);\n\n setTimeout(() => {\n c.style.animation = '';\n }, 500);\n preloader = undefined;\n } else {\n Array.from(imageDiv.children).slice(0, -1).forEach((el) => {\n el.remove();\n });\n }\n });\n }\n\n if(isLoop) {\n const timestamp = Date.now() / 1000;\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\n\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\n }\n } catch(err) {\n switch((err as ApiError).type) {\n case 'SESSION_PASSWORD_NEEDED':\n (err as ApiError).handled = true;\n import('./pagePassword').then((m) => m.default.mount());\n stop = true;\n cachedPromise = null;\n break;\n default:\n console.error('pageSignQR: default error:', err);\n stop = true;\n break;\n }\n\n return true;\n }\n\n return false;\n };\n\n // await iterate(false);\n\n return async() => {\n stop = false;\n\n do {\n if(stop) {\n break;\n }\n\n const needBreak = await iterate(true);\n if(needBreak) {\n break;\n }\n } while(true);\n };\n};\n\nlet cachedPromise: Promise<() => Promise>;\nconst page = new Page('page-signQR', true, () => {\n return cachedPromise;\n}, () => {\n // console.log('onMount');\n if(!cachedPromise) cachedPromise = onFirstMount();\n cachedPromise.then((func) => {\n func();\n });\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\n});\n\nexport default page;\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","once","e","disabled","btnQr","btnNext","page","inputWrapper","document","createElement","lastCountrySelected","lastCountryCodeSelected","add","countryInputField","onCountryChange","country","code","telInputField","value","lastValue","country_code","setTimeout","telEl","focus","onInput","formatted","countryName","name","default_name","override","length","style","visibility","input","addEventListener","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","state","label","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","innerText","container","h4","subtitle","pageEl","querySelector","nearestDcResult","langPack","countries","hash","lang_code","simulateInputEvent","dcs","Set","done","this_dc","promise","nearest_dc","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined","removeAttribute","uint6ToBase64","nUint6","imageDiv","preloader","putPreloader","btnBack","parentElement","helpList","li","stop","QRCodeStyling","rootScope","options","ignoreErrors","prevToken","iterate","isLoop","loginToken","except_ids","dc_id","token","authorization","user","bytesCmp","url","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","replace","bytesToBase64","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","textToSvgURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","Array","from","slice","el","timestamp","Date","now","diff","expires","handled","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/641.1fc33fe3e0c4c0c41a9e.chunk.js b/public/641.1fc33fe3e0c4c0c41a9e.chunk.js deleted file mode 100644 index 4f5a5540..00000000 --- a/public/641.1fc33fe3e0c4c0c41a9e.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[641,63,709,810,776],{9638:(e,t,n)=>{n.d(t,{Z:()=>g});var a=n(3910),i=n(2738),r=n(4541),o=n(2325),s=n(3512),d=n(4494),c=n(279);let l,u=!1;function g(e){u||(l||(l=s.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==o.ZP.lastRequestedLangCode?Promise.all([e,o.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const l=[];n.forEach((e=>{const t=o.ZP.strings.get(e.key);t&&(l.push(t),o.ZP.strings.set(e.key,e))}));const g="Login.ContinueOnLanguage",p=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:g});p.lastElementChild.classList.remove("i18n"),(0,r.Z)({text:[o.ZP.format(g,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(p)}))})),s.Z.addEventListener("language_change",(()=>{p.remove()}),{once:!0}),l.forEach((e=>{o.ZP.strings.set(e.key,e)})),(0,i.fc)(p,(e=>{(0,a.Z)(e),u=!0,p.disabled=!0,(0,c.y)(p),o.ZP.getLangPack(t.suggested_lang_code)}))}))}},810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>x});var a=n(279),i=n(4874),r=n(9807),o=n(4494),s=n(5432),d=n(4159),c=n(2325),l=n(1447),u=n(1405),g=n(9709),p=n(9638),h=n(3910),m=n(2738),y=n(5565),v=n(1656),f=n(7487),Z=n(2398),L=n(7922),_=n(3512),w=n(709),b=n(3855),k=n(5431);let S,E=null;const P=new i.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,i;e.classList.add("input-wrapper");const u=new k.Z({onCountryChange:(e,n)=>{t=e,i=n,n&&(x.value=x.lastValue="+"+n.country_code,setTimeout((()=>{C.focus(),(0,Z.Z)(C,!0)}),0))}}),x=new w.Z({onInput:e=>{l.Z.loadLottieWorkers();const{country:n,code:a}=e||{},r=n?n.name||n.default_name:"";r===u.value||t&&n&&a&&(t===n||i.country_code===a.country_code)||u.override(n,a,r),n||x.value.length-1>1?E.style.visibility="":E.style.visibility="hidden"}}),C=x.input;C.addEventListener("keypress",(e=>{if(!E.style.visibility&&"Enter"===e.key)return R()}));const T=new r.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});T.input.addEventListener("change",(()=>{const e=T.checked;_.Z.managers.appStateManager.pushToState("keepSigned",e),b.Z.toggleStorages(e,!0)})),b.Z.getState().then((e=>{L.Z.isAvailable()?T.checked=e.keepSigned:(T.checked=!1,T.label.classList.add("checkbox-disabled"))})),E=(0,o.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),E.style.visibility="hidden";const R=e=>{e&&(0,h.Z)(e);const t=(0,v.Z)([E,S],!0);(0,y.Z)(E,(0,c.ag)("PleaseWait")),(0,a.y)(E);const i=x.value;_.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:i,api_id:d.Z.id,api_hash:d.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:i}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(x.setError(),(0,y.Z)(x.label,(0,c.ag)("Login.PhoneLabelInvalid")),C.classList.add("error"),(0,y.Z)(E,(0,c.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),E.innerText=e.type)}))};(0,m.fc)(E,R),S=(0,o.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),S.addEventListener("click",(()=>{g.default.mount()})),e.append(u.container,x.container,T.label,E,S);const A=document.createElement("h4");A.classList.add("text-center"),(0,c.$d)(A,"Login.Title");const M=document.createElement("div");M.classList.add("subtitle","text-center"),(0,c.$d)(M,"Login.StartText"),P.pageEl.querySelector(".container").append(A,M,e),s.Z||setTimeout((()=>{C.focus()}),0),(0,p.Z)(e),_.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=L.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&c.ZP.getLangPack(n.lang_code).then((()=>{x.simulateInputEvent()}));const a=new Set([1,2,3,4,5]),i=[e.this_dc];let r;return e.nearest_dc!==e.this_dc&&(r=_.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{i.push(e.nearest_dc)}))),(r||Promise.resolve()).then((()=>{i.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,r=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield f.Z.get(a))return t();setTimeout((()=>{_.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((i=void 0)||(i=Promise))((function(e,t){function o(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(o,s)}d((r=r.apply(n,a||[])).next())}));var n,a,i,r};t()})),e})).then((e=>{u.value.length||x.value.length||u.selectCountryByIso2(e.country)}))}),(()=>{E&&((0,y.Z)(E,(0,c.ag)("Login.Next")),(0,u.Z)(E,void 0,void 0,!0),E.removeAttribute("disabled")),S&&S.removeAttribute("disabled"),_.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),x=P},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>y});var a=n(4874),i=n(4159),r=n(4494),o=n(2325),s=n(3512),d=n(279),c=n(9638),l=n(5418),u=n(9895);function g(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var p=function(e,t,n,a){return new(n||(n=Promise))((function(i,r){function o(e){try{d(a.next(e))}catch(e){r(e)}}function s(e){try{d(a.throw(e))}catch(e){r(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}d((a=a.apply(e,t||[])).next())}))};let h;const m=new a.Z("page-signQR",!0,(()=>h),(()=>{h||(h=p(void 0,void 0,void 0,(function*(){const e=m.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const y=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(y),(0,c.Z)(a);const v=e.parentElement,f=document.createElement("h4");(0,o.$d)(f,"Login.QR.Title");const Z=document.createElement("ol");Z.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach((e=>{const t=document.createElement("li");t.append((0,o.ag)(e)),Z.append(t)})),v.append(f,Z,a),y.addEventListener("click",(()=>{n.e(810).then(n.bind(n,810)).then((e=>e.default.mount())),_=!0}));const L=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let _=!1;s.Z.addEventListener("user_auth",(()=>{_=!0,h=null}),{once:!0});const w={ignoreErrors:!0};let b;const k=a=>p(void 0,void 0,void 0,(function*(){try{let r=yield s.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:i.Z.id,api_hash:i.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===r._&&(w.dcId||(w.dcId=r.dc_id,s.Z.managers.apiManager.setBaseDcId(r.dc_id)),r=yield s.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:r.token},w)),"auth.loginTokenSuccess"===r._){const e=r.authorization;return s.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!b||!(0,u.Z)(b,r.token)){b=r.token;const n="tg://login?token="+function(e){let t,n="";for(let a=e.length,i=0,r=0;r>>t&24),2!==t&&a-r!=1||(n+=String.fromCharCode(g(i>>>18&63),g(i>>>12&63),g(i>>>6&63),g(63&i)),i=0);return n.replace(/A(?=A$|$)/g,"=")}(r.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""),a=window.getComputedStyle(document.documentElement),i=a.getPropertyValue("--surface-color").trim(),o=a.getPropertyValue("--primary-text-color").trim(),s=a.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>{e=e.replace(/(fill:).+?(;)/,`$1${s}$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)}))})),c=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:i},qrOptions:{errorCorrectionLevel:"L"}});let u;c.append(e),e.lastChild.classList.add("qr-canvas"),u=c._drawingPromise?c._drawingPromise:Promise.race([(0,l.Z)(1e3),new Promise((e=>{c._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){const e=Date.now()/1e3,t=r.expires-e-(yield s.Z.managers.timeManager.getServerTimeOffset());yield(0,l.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(e.handled=!0,n.e(774).then(n.bind(n,9437)).then((e=>e.default.mount())),_=!0,h=null):(console.error("pageSignQR: default error:",e),_=!0),!0}return!1}));return()=>p(void 0,void 0,void 0,(function*(){for(_=!1;!_&&!(yield k(!0)););}))}))),h.then((e=>{e()})),s.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),y=m}}]); -//# sourceMappingURL=641.1fc33fe3e0c4c0c41a9e.chunk.js.map \ No newline at end of file diff --git a/public/641.1fc33fe3e0c4c0c41a9e.chunk.js.map b/public/641.1fc33fe3e0c4c0c41a9e.chunk.js.map deleted file mode 100644 index 5a118afa..00000000 --- a/public/641.1fc33fe3e0c4c0c41a9e.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"641.1fc33fe3e0c4c0c41a9e.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/pages/pageSignIn.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport Page from './page';\r\nimport CheckboxField from '../components/checkboxField';\r\nimport Button from '../components/button';\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 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 stateStorage from '../lib/stateStorage';\r\nimport rootScope from '../lib/rootScope';\r\nimport TelInputField from '../components/telInputField';\r\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\r\nimport CountryInputField from '../components/countryInputField';\r\n\r\n// import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nconst 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\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n const countryInputField = new CountryInputField({\r\n onCountryChange: (country, code) => {\r\n lastCountrySelected = country, lastCountryCodeSelected = code;\r\n\r\n if(!code) {\r\n return;\r\n }\r\n\r\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n }\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 const 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 countryInputField.override(country, code, countryName);\r\n }\r\n\r\n // if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n // console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned',\r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n\r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n // return;\r\n\r\n const phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n // lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n // console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n const 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 const tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n telInputField.simulateInputEvent();\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n\r\n g();\r\n });\r\n\r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n countryInputField.selectCountryByIso2(nearestDcResult.country);\r\n }\r\n\r\n // console.log('woohoo', nearestDcResult, country);\r\n })// .catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","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 Page from './page';\r\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nconst 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 const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n\r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\r\n // continue;\r\n }\r\n\r\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n rootScope.managers.apiManager.setUser(authorization.user);\r\n import('./pageIm').then((m) => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n const encoded = bytesToBase64(loginToken.token);\r\n const 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 const timestamp = Date.now() / 1000;\r\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\r\n\r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then((m) => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n\r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n // console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then((func) => {\r\n func();\r\n });\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","once","e","disabled","btnQr","btnNext","page","inputWrapper","document","createElement","lastCountrySelected","lastCountryCodeSelected","add","countryInputField","onCountryChange","country","code","telInputField","value","lastValue","country_code","setTimeout","telEl","focus","onInput","formatted","countryName","name","default_name","override","length","style","visibility","input","addEventListener","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","state","label","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","innerText","container","h4","subtitle","pageEl","querySelector","nearestDcResult","langPack","countries","hash","lang_code","simulateInputEvent","dcs","Set","done","this_dc","promise","nearest_dc","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined","removeAttribute","uint6ToBase64","nUint6","imageDiv","preloader","putPreloader","btnBack","parentElement","helpList","li","stop","QRCodeStyling","rootScope","options","ignoreErrors","prevToken","iterate","isLoop","loginToken","except_ids","dc_id","token","authorization","user","bytesCmp","url","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","replace","bytesToBase64","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","target","readAsDataURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","Array","from","slice","el","timestamp","Date","now","diff","expires","handled","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/642.d6b90b5bc53545046507.chunk.js.map b/public/642.d6b90b5bc53545046507.chunk.js.map deleted file mode 100644 index 22fe93e7..00000000 --- a/public/642.d6b90b5bc53545046507.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"642.d6b90b5bc53545046507.chunk.js","mappings":"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","sources":["webpack://tweb/./src/lib/pluralPolyfill.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nconst NumberPluralizationFormZero: Intl.LDMLPluralRule = 'zero';\r\nconst NumberPluralizationFormOne: Intl.LDMLPluralRule = 'one';\r\nconst NumberPluralizationFormTwo: Intl.LDMLPluralRule = 'two';\r\nconst NumberPluralizationFormFew: Intl.LDMLPluralRule = 'few';\r\nconst NumberPluralizationFormMany: Intl.LDMLPluralRule = 'many';\r\nconst NumberPluralizationFormOther: Intl.LDMLPluralRule = 'other';\r\n\r\nfunction numberPluralizationForm(lc: number, n: number): Intl.LDMLPluralRule {\r\n switch(lc) {\n // set1\r\n case 0x6c74: // lt\r\n if(((n % 10) == 1) && (((n % 100) < 11 || (n % 100) > 19))) // n mod 10 is 1 and n mod 100 not in 11..19\r\n return NumberPluralizationFormOne;\r\n if((((n % 10) >= 2 && (n % 10) <= 9)) && (((n % 100) < 11 || (n % 100) > 19))) // n mod 10 in 2..9 and n mod 100 not in 11..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set2\r\n case 0x6c76: // lv\r\n if(n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if(((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set3\r\n case 0x6379: // cy\r\n if(n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if(n == 3) // n is 3\r\n return NumberPluralizationFormFew;\r\n if(n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if(n == 6) // n is 6\r\n return NumberPluralizationFormMany;\r\n break;\r\n\r\n // set4\r\n case 0x6265: // be\r\n case 0x6273: // bs\r\n case 0x6872: // hr\r\n case 0x7275: // ru\r\n case 0x7368: // sh\r\n case 0x7372: // sr\r\n case 0x756b: // uk\r\n if(((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n if((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if(((n % 10) == 0) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 11 && (n % 100) <= 14))) // n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n\r\n // set5\r\n case 0x6b7368: // ksh\r\n if(n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set6\r\n case 0x736869: // shi\r\n if((n >= 2 && n <= 10)) // n in 2..10\r\n return NumberPluralizationFormFew;\r\n if((n >= 0 && n <= 1)) // n within 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set7\r\n case 0x6865: // he\r\n if(n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if((n != 0) && ((n % 10) == 0)) // n is not 0 AND n mod 10 is 0\r\n return NumberPluralizationFormMany;\r\n break;\r\n\r\n // set8\r\n case 0x6373: // cs\r\n case 0x736b: // sk\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if((n >= 2 && n <= 4)) // n in 2..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set9\r\n case 0x6272: // br\r\n if((n != 0) && ((n % 1000000) == 0)) // n is not 0 and n mod 1000000 is 0\r\n return NumberPluralizationFormMany;\r\n if(((n % 10) == 1) && (((n % 100) != 11) && ((n % 100) != 71) && ((n % 100) != 91))) // n mod 10 is 1 and n mod 100 not in 11,71,91\r\n return NumberPluralizationFormOne;\r\n if(((n % 10) == 2) && (((n % 100) != 12) && ((n % 100) != 72) && ((n % 100) != 92))) // n mod 10 is 2 and n mod 100 not in 12,72,92\r\n return NumberPluralizationFormTwo;\r\n if((((n % 10) >= 3 && (n % 10) <= 4) || ((n % 10) == 9)) && (((n % 100) < 10 || (n % 100) > 19) && ((n % 100) < 70 || (n % 100) > 79) && ((n % 100) < 90 || (n % 100) > 99))) // n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set10\r\n case 0x736c: // sl\r\n if((n % 100) == 2) // n mod 100 is 2\r\n return NumberPluralizationFormTwo;\r\n if((n % 100) == 1) // n mod 100 is 1\r\n return NumberPluralizationFormOne;\r\n if(((n % 100) >= 3 && (n % 100) <= 4)) // n mod 100 in 3..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set11\r\n case 0x6c6167: // lag\r\n if(n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if(((n >= 0 && n <= 2)) && (n != 0) && (n != 2)) // n within 0..2 and n is not 0 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set12\r\n case 0x706c: // pl\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if(((n != 1) && (((n % 10) >= 0 && (n % 10) <= 1))) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 12 && (n % 100) <= 14))) // n is not 1 and n mod 10 in 0..1 or n mod 10 in 5..9 or n mod 100 in 12..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n\r\n // set13\r\n case 0x6764: // gd\r\n if((n == 2) || (n == 12)) // n in 2,12\r\n return NumberPluralizationFormTwo;\r\n if((n == 1) || (n == 11)) // n in 1,11\r\n return NumberPluralizationFormOne;\r\n if((n >= 3 && n <= 10) || (n >= 13 && n <= 19)) // n in 3..10,13..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set14\r\n case 0x6776: // gv\r\n if((((n % 10) >= 1 && (n % 10) <= 2)) || ((n % 20) == 0)) // n mod 10 in 1..2 or n mod 20 is 0\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set15\r\n case 0x6d6b: // mk\r\n if(((n % 10) == 1) && (n != 11)) // n mod 10 is 1 and n is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set16\r\n case 0x6d74: // mt\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if(((n % 100) >= 11 && (n % 100) <= 19)) // n mod 100 in 11..19\r\n return NumberPluralizationFormMany;\r\n if((n == 0) || (((n % 100) >= 2 && (n % 100) <= 10))) // n is 0 or n mod 100 in 2..10\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set17\r\n case 0x6d6f: // mo\r\n case 0x726f: // ro\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if((n == 0) || ((n != 1) && (((n % 100) >= 1 && (n % 100) <= 19)))) // n is 0 OR n is not 1 AND n mod 100 in 1..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set18\r\n case 0x6761: // ga\r\n if(n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if((n >= 3 && n <= 6)) // n in 3..6\r\n return NumberPluralizationFormFew;\r\n if((n >= 7 && n <= 10)) // n in 7..10\r\n return NumberPluralizationFormMany;\r\n break;\r\n\r\n // set19\r\n case 0x6666: // ff\r\n case 0x6672: // fr\r\n case 0x6b6162: // kab\r\n if(((n >= 0 && n <= 2)) && (n != 2)) // n within 0..2 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set20\r\n case 0x6975: // iuw\r\n case 0x6b77: // kw\r\n case 0x7365: // se\r\n case 0x6e6171: // naq\r\n case 0x736d61: // sma\r\n case 0x736d69: // smi\r\n case 0x736d6a: // smj\r\n case 0x736d6e: // smn\r\n case 0x736d73: // sms\r\n if(n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set21\r\n case 0x616b: // ak\r\n case 0x616d: // am\r\n case 0x6268: // bh\r\n case 0x6869: // hi\r\n case 0x6c6e: // ln\r\n case 0x6d67: // mg\r\n case 0x7469: // ti\r\n case 0x746c: // tl\r\n case 0x7761: // wa\r\n case 0x66696c: // fil\r\n case 0x677577: // guw\r\n case 0x6e736f: // nso\r\n if((n >= 0 && n <= 1)) // n in 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set22\r\n case 0x747a6d: // tzm\r\n if(((n >= 0 && n <= 1)) || ((n >= 11 && n <= 99))) // n in 0..1 or n in 11..99\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set23\r\n case 0x6166: // af\r\n case 0x6267: // bg\r\n case 0x626e: // bn\r\n case 0x6361: // ca\r\n case 0x6461: // da\r\n case 0x6465: // de\r\n case 0x6476: // dv\r\n case 0x6565: // ee\r\n case 0x656c: // el\r\n case 0x656e: // en\r\n case 0x656f: // eo\r\n case 0x6573: // es\r\n case 0x6574: // et\r\n case 0x6575: // eu\r\n case 0x6669: // fi\r\n case 0x666f: // fo\r\n case 0x6679: // fy\r\n case 0x676c: // gl\r\n case 0x6775: // gu\r\n case 0x6861: // ha\r\n case 0x6973: // is\r\n case 0x6974: // it\r\n case 0x6b6b: // kk\r\n case 0x6b6c: // kl\r\n case 0x6b73: // ks\r\n case 0x6b75: // ku\r\n case 0x6b79: // ky\r\n case 0x6c62: // lb\r\n case 0x6c67: // lg\r\n case 0x6d6c: // ml\r\n case 0x6d6e: // mn\r\n case 0x6d72: // mr\r\n case 0x6e62: // nb\r\n case 0x6e64: // nd\r\n case 0x6e65: // ne\r\n case 0x6e6c: // nl\r\n case 0x6e6e: // nn\r\n case 0x6e6f: // no\r\n case 0x6e72: // nr\r\n case 0x6e79: // ny\r\n case 0x6f6d: // om\r\n case 0x6f72: // or\r\n case 0x6f73: // os\r\n case 0x7061: // pa\r\n case 0x7073: // ps\r\n case 0x7074: // pt\r\n case 0x726d: // rm\r\n case 0x736e: // sn\r\n case 0x736f: // so\r\n case 0x7371: // sq\r\n case 0x7373: // ss\r\n case 0x7374: // st\r\n case 0x7376: // sv\r\n case 0x7377: // sw\r\n case 0x7461: // ta\r\n case 0x7465: // te\r\n case 0x746b: // tk\r\n case 0x746e: // tn\r\n case 0x7473: // ts\r\n case 0x7572: // ur\r\n case 0x7665: // ve\r\n case 0x766f: // vo\r\n case 0x7868: // xh\r\n case 0x7a75: // zu\r\n case 0x617361: // asa\r\n case 0x617374: // ast\r\n case 0x62656d: // bem\r\n case 0x62657a: // bez\r\n case 0x627278: // brx\r\n case 0x636767: // cgg\r\n case 0x636872: // chr\r\n case 0x636b62: // ckb\r\n case 0x667572: // fur\r\n case 0x677377: // gsw\r\n case 0x686177: // haw\r\n case 0x6a676f: // jgo\r\n case 0x6a6d63: // jmc\r\n case 0x6b616a: // kaj\r\n case 0x6b6367: // kcg\r\n case 0x6b6b6a: // kkj\r\n case 0x6b7362: // ksb\r\n case 0x6d6173: // mas\r\n case 0x6d676f: // mgo\r\n case 0x6e6168: // nah\r\n case 0x6e6e68: // nnh\r\n case 0x6e796e: // nyn\r\n case 0x706170: // pap\r\n case 0x726f66: // rof\r\n case 0x72776b: // rwk\r\n case 0x736171: // saq\r\n case 0x736568: // seh\r\n case 0x737379: // ssy\r\n case 0x737972: // syr\r\n case 0x74656f: // teo\r\n case 0x746967: // tig\r\n case 0x76756e: // vun\r\n case 0x776165: // wae\r\n case 0x786f67: // xog\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set24\r\n case 0x6172: // ar\r\n if(n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if(n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if(((n % 100) >= 3 && (n % 100) <= 10)) // n mod 100 in 3..10\r\n return NumberPluralizationFormFew;\r\n if(((n % 100) >= 11 && (n % 100) <= 99)) // n mod 100 in 11..99\r\n return NumberPluralizationFormMany;\r\n break;\r\n }\r\n\r\n return NumberPluralizationFormOther;\r\n}\r\n\r\n\r\nfunction languageCodehash(code: string) {\r\n let lc = 0;\r\n for(let i = 0; i < code.length; ++i) { lc = (lc << 8) + code.charCodeAt(i); }\r\n return lc;\r\n}\r\n\r\nconst Intl = {\r\n PluralRules: class {\r\n public select: (n: number) => Intl.LDMLPluralRule;\r\n\r\n constructor(code: string) {\r\n this.select = numberPluralizationForm.bind(null, languageCodehash(code));\r\n }\r\n }\r\n};\r\n\r\nexport default Intl;\r\n"],"names":["NumberPluralizationFormZero","NumberPluralizationFormOne","NumberPluralizationFormTwo","NumberPluralizationFormFew","NumberPluralizationFormMany","numberPluralizationForm","lc","n","PluralRules","constructor","code","this","select","bind","i","length","charCodeAt","languageCodehash"],"sourceRoot":""} \ No newline at end of file diff --git a/public/642.d6b90b5bc53545046507.chunk.js b/public/642.e22e19b4ff8bd97e11a6.chunk.js similarity index 98% rename from public/642.d6b90b5bc53545046507.chunk.js rename to public/642.e22e19b4ff8bd97e11a6.chunk.js index bd676baf..aaba451c 100644 --- a/public/642.d6b90b5bc53545046507.chunk.js +++ b/public/642.e22e19b4ff8bd97e11a6.chunk.js @@ -1,2 +1,2 @@ "use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[642],{4642:(e,a,s)=>{s.r(a),s.d(a,{default:()=>f});const c="zero",r="one",t="two",n="few",u="many";function i(e,a){switch(e){case 27764:if(a%10==1&&(a%100<11||a%100>19))return r;if(a%10>=2&&a%10<=9&&(a%100<11||a%100>19))return n;break;case 27766:if(0==a)return c;if(a%10==1&&a%100!=11)return r;break;case 25465:if(2==a)return t;if(3==a)return n;if(0==a)return c;if(1==a)return r;if(6==a)return u;break;case 25189:case 25203:case 26738:case 29301:case 29544:case 29554:case 30059:if(a%10==1&&a%100!=11)return r;if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return n;if(a%10==0||a%10>=5&&a%10<=9||a%100>=11&&a%100<=14)return u;break;case 7041896:if(0==a)return c;if(1==a)return r;break;case 7563369:if(a>=2&&a<=10)return n;if(a>=0&&a<=1)return r;break;case 26725:if(2==a)return t;if(1==a)return r;if(0!=a&&a%10==0)return u;break;case 25459:case 29547:if(1==a)return r;if(a>=2&&a<=4)return n;break;case 25202:if(0!=a&&a%1e6==0)return u;if(a%10==1&&a%100!=11&&a%100!=71&&a%100!=91)return r;if(a%10==2&&a%100!=12&&a%100!=72&&a%100!=92)return t;if((a%10>=3&&a%10<=4||a%10==9)&&(a%100<10||a%100>19)&&(a%100<70||a%100>79)&&(a%100<90||a%100>99))return n;break;case 29548:if(a%100==2)return t;if(a%100==1)return r;if(a%100>=3&&a%100<=4)return n;break;case 7102823:if(0==a)return c;if(a>=0&&a<=2&&0!=a&&2!=a)return r;break;case 28780:if(1==a)return r;if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return n;if(1!=a&&a%10>=0&&a%10<=1||a%10>=5&&a%10<=9||a%100>=12&&a%100<=14)return u;break;case 26468:if(2==a||12==a)return t;if(1==a||11==a)return r;if(a>=3&&a<=10||a>=13&&a<=19)return n;break;case 26486:if(a%10>=1&&a%10<=2||a%20==0)return r;break;case 28011:if(a%10==1&&11!=a)return r;break;case 28020:if(1==a)return r;if(a%100>=11&&a%100<=19)return u;if(0==a||a%100>=2&&a%100<=10)return n;break;case 28015:case 29295:if(1==a)return r;if(0==a||1!=a&&a%100>=1&&a%100<=19)return n;break;case 26465:if(2==a)return t;if(1==a)return r;if(a>=3&&a<=6)return n;if(a>=7&&a<=10)return u;break;case 26214:case 26226:case 7037282:if(a>=0&&a<=2&&2!=a)return r;break;case 26997:case 27511:case 29541:case 7233905:case 7564641:case 7564649:case 7564650:case 7564654:case 7564659:if(2==a)return t;if(1==a)return r;break;case 24939:case 24941:case 25192:case 26729:case 27758:case 28007:case 29801:case 29804:case 30561:case 6711660:case 6780279:case 7238511:if(a>=0&&a<=1)return r;break;case 7633517:if(a>=0&&a<=1||a>=11&&a<=99)return r;break;case 24934:case 25191:case 25198:case 25441:case 25697:case 25701:case 25718:case 25957:case 25964:case 25966:case 25967:case 25971:case 25972:case 25973:case 26217:case 26223:case 26233:case 26476:case 26485:case 26721:case 26995:case 26996:case 27499:case 27500:case 27507:case 27509:case 27513:case 27746:case 27751:case 28012:case 28014:case 28018:case 28258:case 28260:case 28261:case 28268:case 28270:case 28271:case 28274:case 28281:case 28525:case 28530:case 28531:case 28769:case 28787:case 28788:case 29293:case 29550:case 29551:case 29553:case 29555:case 29556:case 29558:case 29559:case 29793:case 29797:case 29803:case 29806:case 29811:case 30066:case 30309:case 30319:case 30824:case 31349:case 6386529:case 6386548:case 6448493:case 6448506:case 6451832:case 6514535:case 6514802:case 6515554:case 6714738:case 6779767:case 6840695:case 6973295:case 6974819:case 7037290:case 7037799:case 7039850:case 7041890:case 7168371:case 7169903:case 7233896:case 7237224:case 7240046:case 7364976:case 7499622:case 7501675:case 7561585:case 7562600:case 7566201:case 7567730:case 7628143:case 7629159:case 7763310:case 7823717:case 7892839:if(1==a)return r;break;case 24946:if(2==a)return t;if(1==a)return r;if(0==a)return c;if(a%100>=3&&a%100<=10)return n;if(a%100>=11&&a%100<=99)return u}return"other"}const f={PluralRules:class{constructor(e){this.select=i.bind(null,function(e){let a=0;for(let s=0;s 19))) // n mod 10 is 1 and n mod 100 not in 11..19\n return NumberPluralizationFormOne;\n if((((n % 10) >= 2 && (n % 10) <= 9)) && (((n % 100) < 11 || (n % 100) > 19))) // n mod 10 in 2..9 and n mod 100 not in 11..19\n return NumberPluralizationFormFew;\n break;\n\n // set2\n case 0x6c76: // lv\n if(n == 0) // n is 0\n return NumberPluralizationFormZero;\n if(((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\n return NumberPluralizationFormOne;\n break;\n\n // set3\n case 0x6379: // cy\n if(n == 2) // n is 2\n return NumberPluralizationFormTwo;\n if(n == 3) // n is 3\n return NumberPluralizationFormFew;\n if(n == 0) // n is 0\n return NumberPluralizationFormZero;\n if(n == 1) // n is 1\n return NumberPluralizationFormOne;\n if(n == 6) // n is 6\n return NumberPluralizationFormMany;\n break;\n\n // set4\n case 0x6265: // be\n case 0x6273: // bs\n case 0x6872: // hr\n case 0x7275: // ru\n case 0x7368: // sh\n case 0x7372: // sr\n case 0x756b: // uk\n if(((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\n return NumberPluralizationFormOne;\n if((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\n return NumberPluralizationFormFew;\n if(((n % 10) == 0) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 11 && (n % 100) <= 14))) // n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14\n return NumberPluralizationFormMany;\n break;\n\n // set5\n case 0x6b7368: // ksh\n if(n == 0) // n is 0\n return NumberPluralizationFormZero;\n if(n == 1) // n is 1\n return NumberPluralizationFormOne;\n break;\n\n // set6\n case 0x736869: // shi\n if((n >= 2 && n <= 10)) // n in 2..10\n return NumberPluralizationFormFew;\n if((n >= 0 && n <= 1)) // n within 0..1\n return NumberPluralizationFormOne;\n break;\n\n // set7\n case 0x6865: // he\n if(n == 2) // n is 2\n return NumberPluralizationFormTwo;\n if(n == 1) // n is 1\n return NumberPluralizationFormOne;\n if((n != 0) && ((n % 10) == 0)) // n is not 0 AND n mod 10 is 0\n return NumberPluralizationFormMany;\n break;\n\n // set8\n case 0x6373: // cs\n case 0x736b: // sk\n if(n == 1) // n is 1\n return NumberPluralizationFormOne;\n if((n >= 2 && n <= 4)) // n in 2..4\n return NumberPluralizationFormFew;\n break;\n\n // set9\n case 0x6272: // br\n if((n != 0) && ((n % 1000000) == 0)) // n is not 0 and n mod 1000000 is 0\n return NumberPluralizationFormMany;\n if(((n % 10) == 1) && (((n % 100) != 11) && ((n % 100) != 71) && ((n % 100) != 91))) // n mod 10 is 1 and n mod 100 not in 11,71,91\n return NumberPluralizationFormOne;\n if(((n % 10) == 2) && (((n % 100) != 12) && ((n % 100) != 72) && ((n % 100) != 92))) // n mod 10 is 2 and n mod 100 not in 12,72,92\n return NumberPluralizationFormTwo;\n if((((n % 10) >= 3 && (n % 10) <= 4) || ((n % 10) == 9)) && (((n % 100) < 10 || (n % 100) > 19) && ((n % 100) < 70 || (n % 100) > 79) && ((n % 100) < 90 || (n % 100) > 99))) // n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99\n return NumberPluralizationFormFew;\n break;\n\n // set10\n case 0x736c: // sl\n if((n % 100) == 2) // n mod 100 is 2\n return NumberPluralizationFormTwo;\n if((n % 100) == 1) // n mod 100 is 1\n return NumberPluralizationFormOne;\n if(((n % 100) >= 3 && (n % 100) <= 4)) // n mod 100 in 3..4\n return NumberPluralizationFormFew;\n break;\n\n // set11\n case 0x6c6167: // lag\n if(n == 0) // n is 0\n return NumberPluralizationFormZero;\n if(((n >= 0 && n <= 2)) && (n != 0) && (n != 2)) // n within 0..2 and n is not 0 and n is not 2\n return NumberPluralizationFormOne;\n break;\n\n // set12\n case 0x706c: // pl\n if(n == 1) // n is 1\n return NumberPluralizationFormOne;\n if((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\n return NumberPluralizationFormFew;\n if(((n != 1) && (((n % 10) >= 0 && (n % 10) <= 1))) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 12 && (n % 100) <= 14))) // n is not 1 and n mod 10 in 0..1 or n mod 10 in 5..9 or n mod 100 in 12..14\n return NumberPluralizationFormMany;\n break;\n\n // set13\n case 0x6764: // gd\n if((n == 2) || (n == 12)) // n in 2,12\n return NumberPluralizationFormTwo;\n if((n == 1) || (n == 11)) // n in 1,11\n return NumberPluralizationFormOne;\n if((n >= 3 && n <= 10) || (n >= 13 && n <= 19)) // n in 3..10,13..19\n return NumberPluralizationFormFew;\n break;\n\n // set14\n case 0x6776: // gv\n if((((n % 10) >= 1 && (n % 10) <= 2)) || ((n % 20) == 0)) // n mod 10 in 1..2 or n mod 20 is 0\n return NumberPluralizationFormOne;\n break;\n\n // set15\n case 0x6d6b: // mk\n if(((n % 10) == 1) && (n != 11)) // n mod 10 is 1 and n is not 11\n return NumberPluralizationFormOne;\n break;\n\n // set16\n case 0x6d74: // mt\n if(n == 1) // n is 1\n return NumberPluralizationFormOne;\n if(((n % 100) >= 11 && (n % 100) <= 19)) // n mod 100 in 11..19\n return NumberPluralizationFormMany;\n if((n == 0) || (((n % 100) >= 2 && (n % 100) <= 10))) // n is 0 or n mod 100 in 2..10\n return NumberPluralizationFormFew;\n break;\n\n // set17\n case 0x6d6f: // mo\n case 0x726f: // ro\n if(n == 1) // n is 1\n return NumberPluralizationFormOne;\n if((n == 0) || ((n != 1) && (((n % 100) >= 1 && (n % 100) <= 19)))) // n is 0 OR n is not 1 AND n mod 100 in 1..19\n return NumberPluralizationFormFew;\n break;\n\n // set18\n case 0x6761: // ga\n if(n == 2) // n is 2\n return NumberPluralizationFormTwo;\n if(n == 1) // n is 1\n return NumberPluralizationFormOne;\n if((n >= 3 && n <= 6)) // n in 3..6\n return NumberPluralizationFormFew;\n if((n >= 7 && n <= 10)) // n in 7..10\n return NumberPluralizationFormMany;\n break;\n\n // set19\n case 0x6666: // ff\n case 0x6672: // fr\n case 0x6b6162: // kab\n if(((n >= 0 && n <= 2)) && (n != 2)) // n within 0..2 and n is not 2\n return NumberPluralizationFormOne;\n break;\n\n // set20\n case 0x6975: // iuw\n case 0x6b77: // kw\n case 0x7365: // se\n case 0x6e6171: // naq\n case 0x736d61: // sma\n case 0x736d69: // smi\n case 0x736d6a: // smj\n case 0x736d6e: // smn\n case 0x736d73: // sms\n if(n == 2) // n is 2\n return NumberPluralizationFormTwo;\n if(n == 1) // n is 1\n return NumberPluralizationFormOne;\n break;\n\n // set21\n case 0x616b: // ak\n case 0x616d: // am\n case 0x6268: // bh\n case 0x6869: // hi\n case 0x6c6e: // ln\n case 0x6d67: // mg\n case 0x7469: // ti\n case 0x746c: // tl\n case 0x7761: // wa\n case 0x66696c: // fil\n case 0x677577: // guw\n case 0x6e736f: // nso\n if((n >= 0 && n <= 1)) // n in 0..1\n return NumberPluralizationFormOne;\n break;\n\n // set22\n case 0x747a6d: // tzm\n if(((n >= 0 && n <= 1)) || ((n >= 11 && n <= 99))) // n in 0..1 or n in 11..99\n return NumberPluralizationFormOne;\n break;\n\n // set23\n case 0x6166: // af\n case 0x6267: // bg\n case 0x626e: // bn\n case 0x6361: // ca\n case 0x6461: // da\n case 0x6465: // de\n case 0x6476: // dv\n case 0x6565: // ee\n case 0x656c: // el\n case 0x656e: // en\n case 0x656f: // eo\n case 0x6573: // es\n case 0x6574: // et\n case 0x6575: // eu\n case 0x6669: // fi\n case 0x666f: // fo\n case 0x6679: // fy\n case 0x676c: // gl\n case 0x6775: // gu\n case 0x6861: // ha\n case 0x6973: // is\n case 0x6974: // it\n case 0x6b6b: // kk\n case 0x6b6c: // kl\n case 0x6b73: // ks\n case 0x6b75: // ku\n case 0x6b79: // ky\n case 0x6c62: // lb\n case 0x6c67: // lg\n case 0x6d6c: // ml\n case 0x6d6e: // mn\n case 0x6d72: // mr\n case 0x6e62: // nb\n case 0x6e64: // nd\n case 0x6e65: // ne\n case 0x6e6c: // nl\n case 0x6e6e: // nn\n case 0x6e6f: // no\n case 0x6e72: // nr\n case 0x6e79: // ny\n case 0x6f6d: // om\n case 0x6f72: // or\n case 0x6f73: // os\n case 0x7061: // pa\n case 0x7073: // ps\n case 0x7074: // pt\n case 0x726d: // rm\n case 0x736e: // sn\n case 0x736f: // so\n case 0x7371: // sq\n case 0x7373: // ss\n case 0x7374: // st\n case 0x7376: // sv\n case 0x7377: // sw\n case 0x7461: // ta\n case 0x7465: // te\n case 0x746b: // tk\n case 0x746e: // tn\n case 0x7473: // ts\n case 0x7572: // ur\n case 0x7665: // ve\n case 0x766f: // vo\n case 0x7868: // xh\n case 0x7a75: // zu\n case 0x617361: // asa\n case 0x617374: // ast\n case 0x62656d: // bem\n case 0x62657a: // bez\n case 0x627278: // brx\n case 0x636767: // cgg\n case 0x636872: // chr\n case 0x636b62: // ckb\n case 0x667572: // fur\n case 0x677377: // gsw\n case 0x686177: // haw\n case 0x6a676f: // jgo\n case 0x6a6d63: // jmc\n case 0x6b616a: // kaj\n case 0x6b6367: // kcg\n case 0x6b6b6a: // kkj\n case 0x6b7362: // ksb\n case 0x6d6173: // mas\n case 0x6d676f: // mgo\n case 0x6e6168: // nah\n case 0x6e6e68: // nnh\n case 0x6e796e: // nyn\n case 0x706170: // pap\n case 0x726f66: // rof\n case 0x72776b: // rwk\n case 0x736171: // saq\n case 0x736568: // seh\n case 0x737379: // ssy\n case 0x737972: // syr\n case 0x74656f: // teo\n case 0x746967: // tig\n case 0x76756e: // vun\n case 0x776165: // wae\n case 0x786f67: // xog\n if(n == 1) // n is 1\n return NumberPluralizationFormOne;\n break;\n\n // set24\n case 0x6172: // ar\n if(n == 2) // n is 2\n return NumberPluralizationFormTwo;\n if(n == 1) // n is 1\n return NumberPluralizationFormOne;\n if(n == 0) // n is 0\n return NumberPluralizationFormZero;\n if(((n % 100) >= 3 && (n % 100) <= 10)) // n mod 100 in 3..10\n return NumberPluralizationFormFew;\n if(((n % 100) >= 11 && (n % 100) <= 99)) // n mod 100 in 11..99\n return NumberPluralizationFormMany;\n break;\n }\n\n return NumberPluralizationFormOther;\n}\n\n\nfunction languageCodehash(code: string) {\n let lc = 0;\n for(let i = 0; i < code.length; ++i) { lc = (lc << 8) + code.charCodeAt(i); }\n return lc;\n}\n\nconst Intl = {\n PluralRules: class {\n public select: (n: number) => Intl.LDMLPluralRule;\n\n constructor(code: string) {\n this.select = numberPluralizationForm.bind(null, languageCodehash(code));\n }\n }\n};\n\nexport default Intl;\n"],"names":["NumberPluralizationFormZero","NumberPluralizationFormOne","NumberPluralizationFormTwo","NumberPluralizationFormFew","NumberPluralizationFormMany","numberPluralizationForm","lc","n","PluralRules","constructor","code","this","select","bind","i","length","charCodeAt","languageCodehash"],"sourceRoot":""} \ No newline at end of file diff --git a/public/709.03eeac190dc611bf8d97.chunk.js b/public/709.03eeac190dc611bf8d97.chunk.js deleted file mode 100644 index df8c4f6a..00000000 --- a/public/709.03eeac190dc611bf8d97.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[709,776],{9638:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(3910),r=n(2738),i=n(4541),o=n(2325),s=n(3512),d=n(4494),c=n(279);let l,g=!1;function u(e){g||(l||(l=s.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==o.ZP.lastRequestedLangCode?Promise.all([e,o.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const l=[];n.forEach((e=>{const t=o.ZP.strings.get(e.key);t&&(l.push(t),o.ZP.strings.set(e.key,e))}));const u="Login.ContinueOnLanguage",p=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:u});p.lastElementChild.classList.remove("i18n"),(0,i.Z)({text:[o.ZP.format(u,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(p)}))})),s.Z.addEventListener("language_change",(()=>{p.remove()}),{once:!0}),l.forEach((e=>{o.ZP.strings.set(e.key,e)})),(0,r.fc)(p,(e=>{(0,a.Z)(e),g=!0,p.disabled=!0,(0,c.y)(p),o.ZP.getLangPack(t.suggested_lang_code)}))}))}},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>y});var a=n(4874),r=n(4159),i=n(4494),o=n(2325),s=n(3512),d=n(279),c=n(9638),l=n(5418),g=n(9895);function u(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var p=function(e,t,n,a){return new(n||(n=Promise))((function(r,i){function o(e){try{d(a.next(e))}catch(e){i(e)}}function s(e){try{d(a.throw(e))}catch(e){i(e)}}function d(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}d((a=a.apply(e,t||[])).next())}))};let m;const h=new a.Z("page-signQR",!0,(()=>m),(()=>{m||(m=p(void 0,void 0,void 0,(function*(){const e=h.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const y=(0,i.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(y),(0,c.Z)(a);const f=e.parentElement,v=document.createElement("h4");(0,o.$d)(v,"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((0,o.ag)(e)),w.append(t)})),f.append(v,w,a),y.addEventListener("click",(()=>{n.e(810).then(n.bind(n,810)).then((e=>e.default.mount())),L=!0}));const Z=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let L=!1;s.Z.addEventListener("user_auth",(()=>{L=!0,m=null}),{once:!0});const P={ignoreErrors:!0};let _;const k=a=>p(void 0,void 0,void 0,(function*(){try{let i=yield s.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:r.Z.id,api_hash:r.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===i._&&(P.dcId||(P.dcId=i.dc_id,s.Z.managers.apiManager.setBaseDcId(i.dc_id)),i=yield s.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:i.token},P)),"auth.loginTokenSuccess"===i._){const e=i.authorization;return s.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!_||!(0,g.Z)(_,i.token)){_=i.token;const n="tg://login?token="+function(e){let t,n="";for(let a=e.length,r=0,i=0;i>>t&24),2!==t&&a-i!=1||(n+=String.fromCharCode(u(r>>>18&63),u(r>>>12&63),u(r>>>6&63),u(63&r)),r=0);return n.replace(/A(?=A$|$)/g,"=")}(i.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""),a=window.getComputedStyle(document.documentElement),r=a.getPropertyValue("--surface-color").trim(),o=a.getPropertyValue("--primary-text-color").trim(),s=a.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>{e=e.replace(/(fill:).+?(;)/,`$1${s}$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)}))})),c=new Z({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:r},qrOptions:{errorCorrectionLevel:"L"}});let g;c.append(e),e.lastChild.classList.add("qr-canvas"),g=c._drawingPromise?c._drawingPromise:Promise.race([(0,l.Z)(1e3),new Promise((e=>{c._canvas._image.addEventListener("load",(()=>{window.requestAnimationFrame((()=>e()))}),{once:!0})}))]),yield g.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){const e=Date.now()/1e3,t=i.expires-e-(yield s.Z.managers.timeManager.getServerTimeOffset());yield(0,l.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(e.handled=!0,n.e(774).then(n.bind(n,9437)).then((e=>e.default.mount())),L=!0,m=null):(console.error("pageSignQR: default error:",e),L=!0),!0}return!1}));return()=>p(void 0,void 0,void 0,(function*(){for(L=!1;!L&&!(yield k(!0)););}))}))),m.then((e=>{e()})),s.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),y=h}}]); -//# sourceMappingURL=709.03eeac190dc611bf8d97.chunk.js.map \ No newline at end of file diff --git a/public/709.03eeac190dc611bf8d97.chunk.js.map b/public/709.03eeac190dc611bf8d97.chunk.js.map deleted file mode 100644 index 6553c533..00000000 --- a/public/709.03eeac190dc611bf8d97.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"709.03eeac190dc611bf8d97.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","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 Page from './page';\r\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nconst 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 const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n\r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\r\n // continue;\r\n }\r\n\r\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n rootScope.managers.apiManager.setUser(authorization.user);\r\n import('./pageIm').then((m) => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n const encoded = bytesToBase64(loginToken.token);\r\n const 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 const timestamp = Date.now() / 1000;\r\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\r\n\r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then((m) => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n\r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n // console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then((func) => {\r\n func();\r\n });\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","once","e","disabled","uint6ToBase64","nUint6","imageDiv","pageEl","querySelector","preloader","putPreloader","inputWrapper","document","createElement","add","btnBack","container","parentElement","h4","helpList","li","addEventListener","m","default","mount","stop","QRCodeStyling","rootScope","options","ignoreErrors","prevToken","iterate","isLoop","loginToken","api_id","api_hash","except_ids","_","dcId","dc_id","token","authorization","user","bytesCmp","url","bytes","mod3","result","nLen","length","nUint24","nIdx","String","fromCharCode","replace","bytesToBase64","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","err","handled","console","error","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/709.4571511ea17ae29dc294.chunk.js b/public/709.4571511ea17ae29dc294.chunk.js new file mode 100644 index 00000000..b9820d12 --- /dev/null +++ b/public/709.4571511ea17ae29dc294.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[709,776],{9638:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(3910),i=n(2738),r=n(4541),o=n(2325),s=n(3512),d=n(4494),c=n(279);let l,g=!1;function u(e){g||(l||(l=s.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==o.ZP.lastRequestedLangCode?Promise.all([e,o.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const l=[];n.forEach((e=>{const t=o.ZP.strings.get(e.key);t&&(l.push(t),o.ZP.strings.set(e.key,e))}));const u="Login.ContinueOnLanguage",p=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:u});p.lastElementChild.classList.remove("i18n"),(0,r.Z)({text:[o.ZP.format(u,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(p)}))})),s.Z.addEventListener("language_change",(()=>{p.remove()}),{once:!0}),l.forEach((e=>{o.ZP.strings.set(e.key,e)})),(0,i.fc)(p,(e=>{(0,a.Z)(e),g=!0,p.disabled=!0,(0,c.y)(p),o.ZP.getLangPack(t.suggested_lang_code)}))}))}},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>f});var a=n(4874),i=n(4159),r=n(4494),o=n(2325),s=n(3512),d=n(279),c=n(9638),l=n(5418),g=n(9895);function u(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var p=n(8812),m=function(e,t,n,a){return new(n||(n=Promise))((function(i,r){function o(e){try{d(a.next(e))}catch(e){r(e)}}function s(e){try{d(a.throw(e))}catch(e){r(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}d((a=a.apply(e,t||[])).next())}))};let h;const y=new a.Z("page-signQR",!0,(()=>h),(()=>{h||(h=m(void 0,void 0,void 0,(function*(){const e=y.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const f=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(f),(0,c.Z)(a);const v=e.parentElement,Z=document.createElement("h4");(0,o.$d)(Z,"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((0,o.ag)(e)),w.append(t)})),v.append(Z,w,a),f.addEventListener("click",(()=>{n.e(810).then(n.bind(n,810)).then((e=>e.default.mount())),_=!0}));const L=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let _=!1;s.Z.addEventListener("user_auth",(()=>{_=!0,h=null}),{once:!0});const k={ignoreErrors:!0};let P;const E=a=>m(void 0,void 0,void 0,(function*(){try{let r=yield s.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:i.Z.id,api_hash:i.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===r._&&(k.dcId||(k.dcId=r.dc_id,s.Z.managers.apiManager.setBaseDcId(r.dc_id)),r=yield s.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:r.token},k)),"auth.loginTokenSuccess"===r._){const e=r.authorization;return s.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!P||!(0,g.Z)(P,r.token)){P=r.token;const n="tg://login?token="+function(e){let t,n="";for(let a=e.length,i=0,r=0;r>>t&24),2!==t&&a-r!=1||(n+=String.fromCharCode(u(i>>>18&63),u(i>>>12&63),u(i>>>6&63),u(63&i)),i=0);return n.replace(/A(?=A$|$)/g,"=")}(r.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""),a=window.getComputedStyle(document.documentElement),i=a.getPropertyValue("--surface-color").trim(),o=a.getPropertyValue("--primary-text-color").trim(),s=a.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>(e=e.replace(/(fill:).+?(;)/,`$1${s}$2`),(0,p.Z)(e)))),c=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:i},qrOptions:{errorCorrectionLevel:"L"}});let g;c.append(e),e.lastChild.classList.add("qr-canvas"),g=c._drawingPromise?c._drawingPromise:Promise.race([(0,l.Z)(1e3),new Promise((e=>{c._canvas._image.addEventListener("load",(()=>{window.requestAnimationFrame((()=>e()))}),{once:!0})}))]),yield g.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){const e=Date.now()/1e3,t=r.expires-e-(yield s.Z.managers.timeManager.getServerTimeOffset());yield(0,l.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(e.handled=!0,n.e(774).then(n.bind(n,9437)).then((e=>e.default.mount())),_=!0,h=null):(console.error("pageSignQR: default error:",e),_=!0),!0}return!1}));return()=>m(void 0,void 0,void 0,(function*(){for(_=!1;!_&&!(yield E(!0)););}))}))),h.then((e=>{e()})),s.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),f=y}}]); +//# sourceMappingURL=709.4571511ea17ae29dc294.chunk.js.map \ No newline at end of file diff --git a/public/709.4571511ea17ae29dc294.chunk.js.map b/public/709.4571511ea17ae29dc294.chunk.js.map new file mode 100644 index 00000000..c65b82a2 --- /dev/null +++ b/public/709.4571511ea17ae29dc294.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"709.4571511ea17ae29dc294.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","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","/*\n * 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 {DcId} from '../types';\nimport Page from './page';\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\nimport App from '../config/app';\nimport Button from '../components/button';\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport {putPreloader} from '../components/putPreloader';\nimport getLanguageChangeButton from '../components/languageChangeButton';\nimport pause from '../helpers/schedulers/pause';\nimport fixBase64String from '../helpers/fixBase64String';\nimport bytesCmp from '../helpers/bytes/bytesCmp';\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\nimport textToSvgURL from '../helpers/textToSvgURL';\n\nconst FETCH_INTERVAL = 3;\n\nconst onFirstMount = async() => {\n const pageElement = page.pageEl;\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\n\n let preloader = putPreloader(imageDiv, true);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\n inputWrapper.append(btnBack);\n\n getLanguageChangeButton(inputWrapper);\n\n const container = imageDiv.parentElement;\n\n const h4 = document.createElement('h4');\n _i18n(h4, 'Login.QR.Title');\n\n const helpList = document.createElement('ol');\n helpList.classList.add('qr-description');\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\n const li = document.createElement('li');\n li.append(i18n(key));\n helpList.append(li);\n });\n\n container.append(h4, helpList, inputWrapper);\n\n btnBack.addEventListener('click', () => {\n import('./pageSignIn').then((m) => m.default.mount());\n stop = true;\n });\n\n const results = await Promise.all([\n import('qr-code-styling' as any)\n ]);\n const QRCodeStyling = results[0].default;\n\n let stop = false;\n rootScope.addEventListener('user_auth', () => {\n stop = true;\n cachedPromise = null;\n }, {once: true});\n\n const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\n let prevToken: Uint8Array | number[];\n\n const iterate = async(isLoop: boolean) => {\n try {\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\n api_id: App.id,\n api_hash: App.hash,\n except_ids: []\n }, {ignoreErrors: true});\n\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\n if(!options.dcId) {\n options.dcId = loginToken.dc_id as DcId;\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\n // continue;\n }\n\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\n token: loginToken.token\n }, options) as AuthLoginToken.authLoginToken;\n }\n\n if(loginToken._ === 'auth.loginTokenSuccess') {\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\n rootScope.managers.apiManager.setUser(authorization.user);\n import('./pageIm').then((m) => m.default.mount());\n return true;\n }\n\n /* // to base64\n var decoder = new TextDecoder('utf8');\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\n\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\n prevToken = loginToken.token;\n\n const encoded = bytesToBase64(loginToken.token);\n const url = 'tg://login?token=' + fixBase64String(encoded, true);\n\n const style = window.getComputedStyle(document.documentElement);\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\n const textColor = style.getPropertyValue('--primary-text-color').trim();\n const primaryColor = style.getPropertyValue('--primary-color').trim();\n\n const logoUrl = await fetch('assets/img/logo_padded.svg')\n .then((res) => res.text())\n .then((text) => {\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\n return textToSvgURL(text);\n });\n\n const qrCode = new QRCodeStyling({\n width: 240 * window.devicePixelRatio,\n height: 240 * window.devicePixelRatio,\n data: url,\n image: logoUrl,\n dotsOptions: {\n color: textColor,\n type: 'rounded'\n },\n cornersSquareOptions: {\n type: 'extra-rounded'\n },\n imageOptions: {\n imageSize: 1,\n margin: 0\n },\n backgroundOptions: {\n color: surfaceColor\n },\n qrOptions: {\n errorCorrectionLevel: 'L'\n }\n });\n\n qrCode.append(imageDiv);\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\n\n let promise: Promise;\n if(qrCode._drawingPromise) {\n promise = qrCode._drawingPromise;\n } else {\n promise = Promise.race([\n pause(1000),\n new Promise((resolve) => {\n qrCode._canvas._image.addEventListener('load', () => {\n window.requestAnimationFrame(() => resolve());\n }, {once: true});\n })\n ]);\n }\n\n // * это костыль, но библиотека не предоставляет никаких событий\n await promise.then(() => {\n if(preloader) {\n preloader.style.animation = 'hide-icon .4s forwards';\n\n const c = imageDiv.children[1] as HTMLElement;\n c.style.display = 'none';\n c.style.animation = 'grow-icon .4s forwards';\n setTimeout(() => {\n c.style.display = '';\n }, 150);\n\n setTimeout(() => {\n c.style.animation = '';\n }, 500);\n preloader = undefined;\n } else {\n Array.from(imageDiv.children).slice(0, -1).forEach((el) => {\n el.remove();\n });\n }\n });\n }\n\n if(isLoop) {\n const timestamp = Date.now() / 1000;\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\n\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\n }\n } catch(err) {\n switch((err as ApiError).type) {\n case 'SESSION_PASSWORD_NEEDED':\n (err as ApiError).handled = true;\n import('./pagePassword').then((m) => m.default.mount());\n stop = true;\n cachedPromise = null;\n break;\n default:\n console.error('pageSignQR: default error:', err);\n stop = true;\n break;\n }\n\n return true;\n }\n\n return false;\n };\n\n // await iterate(false);\n\n return async() => {\n stop = false;\n\n do {\n if(stop) {\n break;\n }\n\n const needBreak = await iterate(true);\n if(needBreak) {\n break;\n }\n } while(true);\n };\n};\n\nlet cachedPromise: Promise<() => Promise>;\nconst page = new Page('page-signQR', true, () => {\n return cachedPromise;\n}, () => {\n // console.log('onMount');\n if(!cachedPromise) cachedPromise = onFirstMount();\n cachedPromise.then((func) => {\n func();\n });\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\n});\n\nexport default page;\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","once","e","disabled","uint6ToBase64","nUint6","imageDiv","pageEl","querySelector","preloader","putPreloader","inputWrapper","document","createElement","add","btnBack","container","parentElement","h4","helpList","li","addEventListener","m","default","mount","stop","QRCodeStyling","rootScope","options","ignoreErrors","prevToken","iterate","isLoop","loginToken","api_id","api_hash","except_ids","_","dcId","dc_id","token","authorization","user","bytesCmp","url","bytes","mod3","result","nLen","length","nUint24","nIdx","String","fromCharCode","replace","bytesToBase64","style","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","textToSvgURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","type","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","pause","resolve","_canvas","_image","animation","c","children","display","setTimeout","undefined","Array","from","slice","el","timestamp","Date","now","diff","expires","err","handled","console","error","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/77.808c5b447b007ee7aa9d.chunk.js b/public/77.66c57fc849b5ec07a136.chunk.js similarity index 97% rename from public/77.808c5b447b007ee7aa9d.chunk.js rename to public/77.66c57fc849b5ec07a136.chunk.js index 13254ddb..547ffe16 100644 --- a/public/77.808c5b447b007ee7aa9d.chunk.js +++ b/public/77.66c57fc849b5ec07a136.chunk.js @@ -1,2 +1,2 @@ "use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[77],{7077:(t,a,e)=>{e.r(a),e.d(a,{default:()=>o});const r=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],f=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function o(t,a,e,o,u,s,i){if(Number.isNaN(s)||s<1)return;s|=0,Number.isNaN(i)&&(i=1),(i|=0)>3&&(i=3),i<1&&(i=1);const n=t.getImageData(a,e,o,u),b=n.data;let c,N,h,k,m,p,w,d,g,l,C,D,I=o-1,j=u-1,q=s+1,v=[],x=[],y=[],z=r[s],A=f[s],B=[],E=[];for(;i-- >0;){for(D=C=0,m=0;mI?I:p)<<2),c+=b[w++],N+=b[w++],h+=b[w++];for(k=0;k0?w<<2:0),d=D+B[k],g=D+E[k],c+=b[d++]-b[g++],N+=b[d++]-b[g++],h+=b[d++]-b[g++],C++;D+=o<<2}for(k=0;kj?0:o,c+=v[l],N+=x[l],h+=y[l];for(C=k<<2,m=0;m>>A,b[C+1]=N*z>>>A,b[C+2]=h*z>>>A,0==k&&(B[m]=((w=m+q)0?w*o:0),d=k+B[m],g=k+E[m],c+=v[d]-v[g],N+=x[d]-x[g],h+=y[d]-y[g],C+=o<<2}}t.putImageData(n,a,e)}}}]); -//# sourceMappingURL=77.808c5b447b007ee7aa9d.chunk.js.map \ No newline at end of file +//# sourceMappingURL=77.66c57fc849b5ec07a136.chunk.js.map \ No newline at end of file diff --git a/public/77.66c57fc849b5ec07a136.chunk.js.map b/public/77.66c57fc849b5ec07a136.chunk.js.map new file mode 100644 index 00000000..3ca4e5a5 --- /dev/null +++ b/public/77.66c57fc849b5ec07a136.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"77.66c57fc849b5ec07a136.chunk.js","mappings":"wHAyCA,MAAMA,EAAY,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI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","sources":["webpack://tweb/./src/vendor/fastBlur.js"],"sourcesContent":["/*\nSuperfast Blur - a fast Box Blur For Canvas\n\nVersion: 0.5\nAuthor: Mario Klingemann\nContact: mario@quasimondo.com\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\nTwitter: @quasimondo\n\nIn case you find this class useful - especially in commercial projects -\nI am not totally unhappy for a small donation to my PayPal account\nmario@quasimondo.de\n\nOr support me on flattr:\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\n\nCopyright (c) 2011 Mario Klingemann\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// eslint-disable-next-line max-len\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\n// eslint-disable-next-line max-len\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\n\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\n if (Number.isNaN(radius) || radius < 1) return;\n\n radius |= 0;\n\n if (Number.isNaN(iterations)) iterations = 1;\n iterations |= 0;\n if (iterations > 3) iterations = 3;\n if (iterations < 1) iterations = 1;\n\n const imageData = context.getImageData(top_x, top_y, width, height);\n\n const pixels = imageData.data;\n\n let rsum;\n let gsum;\n let bsum;\n let x;\n let y;\n let i;\n let p;\n let p1;\n let p2;\n let yp;\n let yi;\n let yw;\n let wm = width - 1;\n let hm = height - 1;\n let rad1 = radius + 1;\n\n let r = [];\n let g = [];\n let b = [];\n\n let mul_sum = mul_table[radius];\n let shg_sum = shg_table[radius];\n\n let vmin = [];\n let vmax = [];\n\n while (iterations-- > 0) {\n yw = yi = 0;\n\n for (y = 0; y < height; y++) {\n rsum = pixels[yw] * rad1;\n gsum = pixels[yw + 1] * rad1;\n bsum = pixels[yw + 2] * rad1;\n\n for (i = 1; i <= radius; i++) {\n p = yw + (((i > wm ? wm : i)) << 2);\n rsum += pixels[p++];\n gsum += pixels[p++];\n bsum += pixels[p++];\n }\n\n for (x = 0; x < width; x++) {\n r[yi] = rsum;\n g[yi] = gsum;\n b[yi] = bsum;\n\n if (y == 0) {\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\n }\n\n p1 = yw + vmin[x];\n p2 = yw + vmax[x];\n\n rsum += pixels[p1++] - pixels[p2++];\n gsum += pixels[p1++] - pixels[p2++];\n bsum += pixels[p1++] - pixels[p2++];\n\n yi++;\n }\n yw += (width << 2);\n }\n\n for (x = 0; x < width; x++) {\n yp = x;\n rsum = r[yp] * rad1;\n gsum = g[yp] * rad1;\n bsum = b[yp] * rad1;\n\n for (i = 1; i <= radius; i++) {\n yp += (i > hm ? 0 : width);\n rsum += r[yp];\n gsum += g[yp];\n bsum += b[yp];\n }\n\n yi = x << 2;\n for (y = 0; y < height; y++) {\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\n\n if (x == 0) {\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\n }\n\n p1 = x + vmin[y];\n p2 = x + vmax[y];\n\n rsum += r[p1] - r[p2];\n gsum += g[p1] - g[p2];\n bsum += b[p1] - b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n context.putImageData(imageData, top_x, top_y);\n}\n"],"names":["mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","width","height","radius","iterations","Number","isNaN","imageData","getImageData","pixels","data","rsum","gsum","bsum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData"],"sourceRoot":""} \ No newline at end of file diff --git a/public/77.808c5b447b007ee7aa9d.chunk.js.map b/public/77.808c5b447b007ee7aa9d.chunk.js.map deleted file mode 100644 index 41f02d70..00000000 --- a/public/77.808c5b447b007ee7aa9d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"77.808c5b447b007ee7aa9d.chunk.js","mappings":"wHAyCA,MAAMA,EAAY,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI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","sources":["webpack://tweb/./src/vendor/fastBlur.js"],"sourcesContent":["/*\r\nSuperfast Blur - a fast Box Blur For Canvas\r\n\r\nVersion: 0.5\r\nAuthor: Mario Klingemann\r\nContact: mario@quasimondo.com\r\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\r\nTwitter: @quasimondo\r\n\r\nIn case you find this class useful - especially in commercial projects -\r\nI am not totally unhappy for a small donation to my PayPal account\r\nmario@quasimondo.de\r\n\r\nOr support me on flattr:\r\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\r\n\r\nCopyright (c) 2011 Mario Klingemann\r\n\r\nPermission is hereby granted, free of charge, to any person\r\nobtaining a copy of this software and associated documentation\r\nfiles (the \"Software\"), to deal in the Software without\r\nrestriction, including without limitation the rights to use,\r\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the\r\nSoftware is furnished to do so, subject to the following\r\nconditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\r\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\r\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\nOTHER DEALINGS IN THE SOFTWARE.\r\n*/\r\n\r\n// eslint-disable-next-line max-len\r\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\r\n// eslint-disable-next-line max-len\r\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\r\n\r\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\r\n if (Number.isNaN(radius) || radius < 1) return;\r\n\r\n radius |= 0;\r\n\r\n if (Number.isNaN(iterations)) iterations = 1;\r\n iterations |= 0;\r\n if (iterations > 3) iterations = 3;\r\n if (iterations < 1) iterations = 1;\r\n\r\n const imageData = context.getImageData(top_x, top_y, width, height);\r\n\r\n const pixels = imageData.data;\r\n\r\n let rsum;\r\n let gsum;\r\n let bsum;\r\n let x;\r\n let y;\r\n let i;\r\n let p;\r\n let p1;\r\n let p2;\r\n let yp;\r\n let yi;\r\n let yw;\r\n let wm = width - 1;\r\n let hm = height - 1;\r\n let rad1 = radius + 1;\r\n\r\n let r = [];\r\n let g = [];\r\n let b = [];\r\n\r\n let mul_sum = mul_table[radius];\r\n let shg_sum = shg_table[radius];\r\n\r\n let vmin = [];\r\n let vmax = [];\r\n\r\n while (iterations-- > 0) {\r\n yw = yi = 0;\r\n\r\n for (y = 0; y < height; y++) {\r\n rsum = pixels[yw] * rad1;\r\n gsum = pixels[yw + 1] * rad1;\r\n bsum = pixels[yw + 2] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n p = yw + (((i > wm ? wm : i)) << 2);\r\n rsum += pixels[p++];\r\n gsum += pixels[p++];\r\n bsum += pixels[p++];\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n r[yi] = rsum;\r\n g[yi] = gsum;\r\n b[yi] = bsum;\r\n\r\n if (y == 0) {\r\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\r\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\r\n }\r\n\r\n p1 = yw + vmin[x];\r\n p2 = yw + vmax[x];\r\n\r\n rsum += pixels[p1++] - pixels[p2++];\r\n gsum += pixels[p1++] - pixels[p2++];\r\n bsum += pixels[p1++] - pixels[p2++];\r\n\r\n yi++;\r\n }\r\n yw += (width << 2);\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n yp = x;\r\n rsum = r[yp] * rad1;\r\n gsum = g[yp] * rad1;\r\n bsum = b[yp] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n yp += (i > hm ? 0 : width);\r\n rsum += r[yp];\r\n gsum += g[yp];\r\n bsum += b[yp];\r\n }\r\n\r\n yi = x << 2;\r\n for (y = 0; y < height; y++) {\r\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\r\n\r\n if (x == 0) {\r\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\r\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\r\n }\r\n\r\n p1 = x + vmin[y];\r\n p2 = x + vmax[y];\r\n\r\n rsum += r[p1] - r[p2];\r\n gsum += g[p1] - g[p2];\r\n bsum += b[p1] - b[p2];\r\n\r\n yi += width << 2;\r\n }\r\n }\r\n }\r\n\r\n context.putImageData(imageData, top_x, top_y);\r\n}\r\n"],"names":["mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","width","height","radius","iterations","Number","isNaN","imageData","getImageData","pixels","data","rsum","gsum","bsum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData"],"sourceRoot":""} \ No newline at end of file diff --git a/public/774.be0952a2ec87ed053042.chunk.js.map b/public/774.be0952a2ec87ed053042.chunk.js.map deleted file mode 100644 index fd527500..00000000 --- a/public/774.be0952a2ec87ed053042.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"774.be0952a2ec87ed053042.chunk.js","mappings":"8HAQe,MAAMA,EAQnBC,YAAYC,GAMVC,KAAKC,QAAUC,SAASC,KAAKC,cAAc,IAAML,EAAQM,WAIzDL,KAAKM,UAAYJ,SAASK,cAAc,OACxCP,KAAKM,UAAUD,UAAY,yBAE3BL,KAAKQ,SAAWN,SAASK,cAAc,OACvCP,KAAKQ,SAASH,UAAY,aAE1BL,KAAKS,MAAQP,SAASK,cAAc,MACjCR,EAAQW,cACTV,KAAKS,MAAME,QAAO,QAAKZ,EAAQW,eAGjCV,KAAKY,SAAWV,SAASK,cAAc,KACvCP,KAAKY,SAASP,UAAY,WACvBN,EAAQc,iBACTb,KAAKY,SAASD,QAAO,QAAKZ,EAAQc,kBAGpCb,KAAKM,UAAUK,OAAOX,KAAKQ,SAAUR,KAAKS,MAAOT,KAAKY,UAEnDb,EAAQe,mBACTd,KAAKe,aAAeb,SAASK,cAAc,OAC3CP,KAAKe,aAAaV,UAAY,gBAC9BL,KAAKM,UAAUK,OAAOX,KAAKe,eAG7Bf,KAAKC,QAAQU,OAAOX,KAAKM,c,sMC3B7B,IAAIU,EAEJ,MA6HA,EARa,IAAI,IAAK,iBAAiB,GArHlB,KACnB,MAAMC,EAAO,IAAI,IAAU,CACzBZ,UAAW,gBACXS,kBAAkB,EAClBJ,aAAc,uBACdG,gBAAiB,4BAGbK,GAAU,OAAO,iCACjBC,EAAc,IAAI,iBAAiB,CAACC,IAAK,eAE/CF,EAAQP,OAAOQ,EAAYlB,SAE3B,MAAMoB,EAAqB,IAAI,IAAmB,CAChDC,MAAO,gBACPC,KAAM,aAOR,IAAIC,EAJJR,EAAgBK,EAAmBI,MAEnCR,EAAKF,aAAaJ,OAAOU,EAAmBf,UAAWY,GAIvD,MAAMQ,EAAW,KAEXF,IACFA,EAAmBG,OAAOC,YAAYF,EAAU,MAGlC,wCAA8CG,MAAMC,IAClEC,EAAQD,EAELC,EAAMC,MACP,OAAeX,EAAmBC,OAAO,QAAW,OAAcS,EAAMC,QAExEX,EAAmBY,eAKzB,IAAIF,EAEJ,MAAMG,EAAYC,IAKhB,GAJGA,IACD,OAAYA,IAGVnB,EAAcoB,MAAMC,OAEtB,YADArB,EAAcsB,UAAUC,IAAI,SAI9B,MAAMC,GAAS,OAAiB,CAACxB,EAAeE,IAAU,GACpDkB,EAAQpB,EAAcoB,MAE5BjB,EAAYsB,OAAO,CAACrB,IAAK,eACzB,MAAMsB,GAAY,OAAaxB,GAE/BG,EAAmBsB,iBAAiB,GAAKC,KAAKC,UAC9CxB,EAAmBsB,iBAAiBP,GAEpC,mCAAyCA,EAAOL,GAAOF,MAAMiB,IAIpD,uBADAA,EAASC,GAEZC,cAAcxB,GACd,8BAAmBK,MAAMoB,IACvBA,EAAEC,QAAQC,WAETC,GAAQA,EAAOC,WAGlBnC,EAAQoC,gBAAgB,YACxBnC,EAAYsB,OAAO,CAACrB,IAAK0B,EAASC,IAClCL,EAAUW,aAGbE,OAAOC,IACRhB,IACAnB,EAAmBI,MAAMa,UAAUC,IAAI,SAEhCiB,EAAIC,KAGPtC,EAAYsB,OAAO,CAACrB,IAAK,0BACzBJ,EAAc0C,SAIlBhB,EAAUW,SAEV3B,SAIJ,QAAiBR,EAASgB,GAE1BlB,EAAc2C,iBAAiB,YAAY,SAAexB,GAIxD,GAHAnC,KAAKsC,UAAUe,OAAO,SACtBlC,EAAYsB,OAAO,CAACrB,IAAK,eAEZ,UAAVe,EAAEf,IACH,OAAOc,OAIX,MAAM0B,EAAO,aAAsB,IAAM,IACnCR,EAAS,IAAI,IAAe/B,EAAoBuC,GAEtD,OADA3C,EAAKT,SAASG,OAAOyC,EAAO9C,WACrBuD,QAAQC,IAAI,CACjBV,EAAOW,OACPrC,QAIuD,MAAM,KAE/DV,EAAcgD,QAGd,yCAA+C,YAAa,CAACjB,EAAG","sources":["webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {LangPackKey, i18n} from '../lib/langPack';\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n // this.element = document.createElement('div');\r\n // this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n\r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport {AccountPassword} from '../layer';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nconst 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 const getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n const value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n rootScope.managers.passwordManager.check(value, state).then((response) => {\r\n // console.log('passwordManager response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n\r\n switch(err.type) {\r\n default:\r\n // btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n\r\n getState();\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n // if(!isAppleMobile) {\r\n passwordInput.focus();\r\n // }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["LoginPage","constructor","options","this","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","passwordInputField","label","name","getStateInterval","input","getState","window","setInterval","then","_state","state","hint","setLabel","onSubmit","e","value","length","classList","add","toggle","update","preloader","setValueSilently","Math","random","response","_","clearInterval","m","default","mount","monkey","remove","removeAttribute","catch","err","type","select","addEventListener","size","Promise","all","load","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/774.be0952a2ec87ed053042.chunk.js b/public/774.ff0771b7e79241db38a1.chunk.js similarity index 97% rename from public/774.be0952a2ec87ed053042.chunk.js rename to public/774.ff0771b7e79241db38a1.chunk.js index c543ef8a..76046328 100644 --- a/public/774.be0952a2ec87ed053042.chunk.js +++ b/public/774.ff0771b7e79241db38a1.chunk.js @@ -1,2 +1,2 @@ "use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[774,442],{2582:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(2325);class s{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,n.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,n.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,a)=>{a.r(t),a.d(t,{default:()=>v});var n=a(279),s=a(4755),i=a(4874),r=a(4494),l=a(6830),o=a(4425),p=a(2325),c=a(2582),u=a(3910),d=a(2738),h=a(2614),m=a(5565),g=a(1656),b=a(8115),w=a(3512);let y;const v=new i.Z("page-password",!0,(()=>{const e=new c.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,r.Z)("btn-primary btn-color-primary"),i=new p.ZP.IntlElement({key:"Login.Next"});t.append(i.element);const v=new l.Z({label:"LoginPassword",name:"password"});let L;y=v.input,e.inputWrapper.append(v.container,t);const Z=()=>(L||(L=window.setInterval(Z,1e4)),w.Z.managers.passwordManager.getState().then((e=>{k=e,k.hint?(0,m.Z)(v.label,(0,h.Z)((0,b.Z)(k.hint))):v.setLabel()})));let k;const S=e=>{if(e&&(0,u.Z)(e),!y.value.length)return void y.classList.add("error");const s=(0,g.Z)([y,t],!0),r=y.value;i.update({key:"PleaseWait"});const l=(0,n.y)(t);v.setValueSilently(""+Math.random()),v.setValueSilently(r),w.Z.managers.passwordManager.check(r,k).then((e=>{"auth.authorization"===e._?(clearInterval(L),a.e(781).then(a.bind(a,5436)).then((e=>{e.default.mount()})),E&&E.remove()):(t.removeAttribute("disabled"),i.update({key:e._}),l.remove())})).catch((e=>{s(),v.input.classList.add("error"),e.type,i.update({key:"PASSWORD_HASH_INVALID"}),y.select(),l.remove(),Z()}))};(0,d.fc)(t,S),y.addEventListener("keypress",(function(e){if(this.classList.remove("error"),i.update({key:"Login.Next"}),"Enter"===e.key)return S()}));const N=s.Z.isMobile?100:166,E=new o.Z(v,N);return e.imageDiv.append(E.container),Promise.all([E.load(),Z()])}),null,(()=>{y.focus(),w.Z.managers.appStateManager.pushToState("authState",{_:"authStatePassword"})}))}}]); -//# sourceMappingURL=774.be0952a2ec87ed053042.chunk.js.map \ No newline at end of file +//# sourceMappingURL=774.ff0771b7e79241db38a1.chunk.js.map \ No newline at end of file diff --git a/public/774.ff0771b7e79241db38a1.chunk.js.map b/public/774.ff0771b7e79241db38a1.chunk.js.map new file mode 100644 index 00000000..bd5c9cbf --- /dev/null +++ b/public/774.ff0771b7e79241db38a1.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"774.ff0771b7e79241db38a1.chunk.js","mappings":"8HAQe,MAAMA,EAQnBC,YAAYC,GAMVC,KAAKC,QAAUC,SAASC,KAAKC,cAAc,IAAML,EAAQM,WAIzDL,KAAKM,UAAYJ,SAASK,cAAc,OACxCP,KAAKM,UAAUD,UAAY,yBAE3BL,KAAKQ,SAAWN,SAASK,cAAc,OACvCP,KAAKQ,SAASH,UAAY,aAE1BL,KAAKS,MAAQP,SAASK,cAAc,MACjCR,EAAQW,cACTV,KAAKS,MAAME,QAAO,QAAKZ,EAAQW,eAGjCV,KAAKY,SAAWV,SAASK,cAAc,KACvCP,KAAKY,SAASP,UAAY,WACvBN,EAAQc,iBACTb,KAAKY,SAASD,QAAO,QAAKZ,EAAQc,kBAGpCb,KAAKM,UAAUK,OAAOX,KAAKQ,SAAUR,KAAKS,MAAOT,KAAKY,UAEnDb,EAAQe,mBACTd,KAAKe,aAAeb,SAASK,cAAc,OAC3CP,KAAKe,aAAaV,UAAY,gBAC9BL,KAAKM,UAAUK,OAAOX,KAAKe,eAG7Bf,KAAKC,QAAQU,OAAOX,KAAKM,c,sMC3B7B,IAAIU,EAEJ,MA6HA,EARa,IAAI,IAAK,iBAAiB,GArHlB,KACnB,MAAMC,EAAO,IAAI,IAAU,CACzBZ,UAAW,gBACXS,kBAAkB,EAClBJ,aAAc,uBACdG,gBAAiB,4BAGbK,GAAU,OAAO,iCACjBC,EAAc,IAAI,iBAAiB,CAACC,IAAK,eAE/CF,EAAQP,OAAOQ,EAAYlB,SAE3B,MAAMoB,EAAqB,IAAI,IAAmB,CAChDC,MAAO,gBACPC,KAAM,aAOR,IAAIC,EAJJR,EAAgBK,EAAmBI,MAEnCR,EAAKF,aAAaJ,OAAOU,EAAmBf,UAAWY,GAIvD,MAAMQ,EAAW,KAEXF,IACFA,EAAmBG,OAAOC,YAAYF,EAAU,MAGlC,wCAA8CG,MAAMC,IAClEC,EAAQD,EAELC,EAAMC,MACP,OAAeX,EAAmBC,OAAO,QAAW,OAAcS,EAAMC,QAExEX,EAAmBY,eAKzB,IAAIF,EAEJ,MAAMG,EAAYC,IAKhB,GAJGA,IACD,OAAYA,IAGVnB,EAAcoB,MAAMC,OAEtB,YADArB,EAAcsB,UAAUC,IAAI,SAI9B,MAAMC,GAAS,OAAiB,CAACxB,EAAeE,IAAU,GACpDkB,EAAQpB,EAAcoB,MAE5BjB,EAAYsB,OAAO,CAACrB,IAAK,eACzB,MAAMsB,GAAY,OAAaxB,GAE/BG,EAAmBsB,iBAAiB,GAAKC,KAAKC,UAC9CxB,EAAmBsB,iBAAiBP,GAEpC,mCAAyCA,EAAOL,GAAOF,MAAMiB,IAIpD,uBADAA,EAASC,GAEZC,cAAcxB,GACd,8BAAmBK,MAAMoB,IACvBA,EAAEC,QAAQC,WAETC,GAAQA,EAAOC,WAGlBnC,EAAQoC,gBAAgB,YACxBnC,EAAYsB,OAAO,CAACrB,IAAK0B,EAASC,IAClCL,EAAUW,aAGbE,OAAOC,IACRhB,IACAnB,EAAmBI,MAAMa,UAAUC,IAAI,SAEhCiB,EAAIC,KAGPtC,EAAYsB,OAAO,CAACrB,IAAK,0BACzBJ,EAAc0C,SAIlBhB,EAAUW,SAEV3B,SAIJ,QAAiBR,EAASgB,GAE1BlB,EAAc2C,iBAAiB,YAAY,SAAexB,GAIxD,GAHAnC,KAAKsC,UAAUe,OAAO,SACtBlC,EAAYsB,OAAO,CAACrB,IAAK,eAEZ,UAAVe,EAAEf,IACH,OAAOc,OAIX,MAAM0B,EAAO,aAAsB,IAAM,IACnCR,EAAS,IAAI,IAAe/B,EAAoBuC,GAEtD,OADA3C,EAAKT,SAASG,OAAOyC,EAAO9C,WACrBuD,QAAQC,IAAI,CACjBV,EAAOW,OACPrC,QAIuD,MAAM,KAE/DV,EAAcgD,QAGd,yCAA+C,YAAa,CAACjB,EAAG","sources":["webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {LangPackKey, i18n} from '../lib/langPack';\n\nexport default class LoginPage {\n public element: HTMLElement;\n public container: HTMLElement;\n public imageDiv: HTMLElement;\n public inputWrapper: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLParagraphElement;\n\n constructor(options: {\n className: string,\n withInputWrapper?: boolean,\n titleLangKey?: LangPackKey,\n subtitleLangKey?: LangPackKey,\n }) {\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\n // this.element = document.createElement('div');\n // this.element.className = 'page-' + options.className;\n\n this.container = document.createElement('div');\n this.container.className = 'container center-align';\n\n this.imageDiv = document.createElement('div');\n this.imageDiv.className = 'auth-image';\n\n this.title = document.createElement('h4');\n if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n this.subtitle = document.createElement('p');\n this.subtitle.className = 'subtitle';\n if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey));\n }\n\n this.container.append(this.imageDiv, this.title, this.subtitle);\n\n if(options.withInputWrapper) {\n this.inputWrapper = document.createElement('div');\n this.inputWrapper.className = 'input-wrapper';\n this.container.append(this.inputWrapper);\n }\n\n this.element.append(this.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 {putPreloader} from '../components/putPreloader';\nimport mediaSizes from '../helpers/mediaSizes';\nimport {AccountPassword} from '../layer';\nimport Page from './page';\nimport Button from '../components/button';\nimport PasswordInputField from '../components/passwordInputField';\nimport PasswordMonkey from '../components/monkeys/password';\nimport I18n from '../lib/langPack';\nimport LoginPage from './loginPage';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport toggleDisability from '../helpers/dom/toggleDisability';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../lib/rootScope';\n\nconst TEST = false;\nlet passwordInput: HTMLInputElement;\n\nconst onFirstMount = (): Promise => {\n const page = new LoginPage({\n className: 'page-password',\n withInputWrapper: true,\n titleLangKey: 'Login.Password.Title',\n subtitleLangKey: 'Login.Password.Subtitle'\n });\n\n const btnNext = Button('btn-primary btn-color-primary');\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\n\n btnNext.append(btnNextI18n.element);\n\n const passwordInputField = new PasswordInputField({\n label: 'LoginPassword',\n name: 'password'\n });\n\n passwordInput = passwordInputField.input as HTMLInputElement;\n\n page.inputWrapper.append(passwordInputField.container, btnNext);\n\n let getStateInterval: number;\n\n const getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\n state = _state;\n\n if(state.hint) {\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\n } else {\n passwordInputField.setLabel();\n }\n });\n };\n\n let state: AccountPassword;\n\n const onSubmit = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!passwordInput.value.length) {\n passwordInput.classList.add('error');\n return;\n }\n\n const toggle = toggleDisability([passwordInput, btnNext], true);\n const value = passwordInput.value;\n\n btnNextI18n.update({key: 'PleaseWait'});\n const preloader = putPreloader(btnNext);\n\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\n passwordInputField.setValueSilently(value); // prevent saving suggestion\n\n rootScope.managers.passwordManager.check(value, state).then((response) => {\n // console.log('passwordManager response:', response);\n\n switch(response._) {\n case 'auth.authorization':\n clearInterval(getStateInterval);\n import('./pageIm').then((m) => {\n m.default.mount();\n });\n if(monkey) monkey.remove();\n break;\n default:\n btnNext.removeAttribute('disabled');\n btnNextI18n.update({key: response._ as any});\n preloader.remove();\n break;\n }\n }).catch((err: any) => {\n toggle();\n passwordInputField.input.classList.add('error');\n\n switch(err.type) {\n default:\n // btnNext.innerText = err.type;\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\n passwordInput.select();\n break;\n }\n\n preloader.remove();\n\n getState();\n });\n };\n\n attachClickEvent(btnNext, onSubmit);\n\n passwordInput.addEventListener('keypress', function(this, e) {\n this.classList.remove('error');\n btnNextI18n.update({key: 'Login.Next'});\n\n if(e.key === 'Enter') {\n return onSubmit();\n }\n });\n\n const size = mediaSizes.isMobile ? 100 : 166;\n const monkey = new PasswordMonkey(passwordInputField, size);\n page.imageDiv.append(monkey.container);\n return Promise.all([\n monkey.load(),\n getState()\n ]);\n};\n\nconst page = new Page('page-password', true, onFirstMount, null, () => {\n // if(!isAppleMobile) {\n passwordInput.focus();\n // }\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\n});\n\nexport default page;\n"],"names":["LoginPage","constructor","options","this","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","passwordInputField","label","name","getStateInterval","input","getState","window","setInterval","then","_state","state","hint","setLabel","onSubmit","e","value","length","classList","add","toggle","update","preloader","setValueSilently","Math","random","response","_","clearInterval","m","default","mount","monkey","remove","removeAttribute","catch","err","type","select","addEventListener","size","Promise","all","load","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/776.8ab4eee78bc43703a976.chunk.js b/public/776.8ab4eee78bc43703a976.chunk.js deleted file mode 100644 index 4363d5e7..00000000 --- a/public/776.8ab4eee78bc43703a976.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[776,709],{9638:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(3910),r=n(2738),i=n(4541),o=n(2325),s=n(3512),d=n(4494),c=n(279);let l,g=!1;function u(e){g||(l||(l=s.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==o.ZP.lastRequestedLangCode?Promise.all([e,o.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const l=[];n.forEach((e=>{const t=o.ZP.strings.get(e.key);t&&(l.push(t),o.ZP.strings.set(e.key,e))}));const u="Login.ContinueOnLanguage",p=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:u});p.lastElementChild.classList.remove("i18n"),(0,i.Z)({text:[o.ZP.format(u,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(p)}))})),s.Z.addEventListener("language_change",(()=>{p.remove()}),{once:!0}),l.forEach((e=>{o.ZP.strings.set(e.key,e)})),(0,r.fc)(p,(e=>{(0,a.Z)(e),g=!0,p.disabled=!0,(0,c.y)(p),o.ZP.getLangPack(t.suggested_lang_code)}))}))}},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>y});var a=n(4874),r=n(4159),i=n(4494),o=n(2325),s=n(3512),d=n(279),c=n(9638),l=n(5418),g=n(9895);function u(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var p=function(e,t,n,a){return new(n||(n=Promise))((function(r,i){function o(e){try{d(a.next(e))}catch(e){i(e)}}function s(e){try{d(a.throw(e))}catch(e){i(e)}}function d(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}d((a=a.apply(e,t||[])).next())}))};let m;const h=new a.Z("page-signQR",!0,(()=>m),(()=>{m||(m=p(void 0,void 0,void 0,(function*(){const e=h.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const y=(0,i.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(y),(0,c.Z)(a);const f=e.parentElement,v=document.createElement("h4");(0,o.$d)(v,"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((0,o.ag)(e)),w.append(t)})),f.append(v,w,a),y.addEventListener("click",(()=>{n.e(810).then(n.bind(n,810)).then((e=>e.default.mount())),L=!0}));const Z=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let L=!1;s.Z.addEventListener("user_auth",(()=>{L=!0,m=null}),{once:!0});const P={ignoreErrors:!0};let _;const k=a=>p(void 0,void 0,void 0,(function*(){try{let i=yield s.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:r.Z.id,api_hash:r.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===i._&&(P.dcId||(P.dcId=i.dc_id,s.Z.managers.apiManager.setBaseDcId(i.dc_id)),i=yield s.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:i.token},P)),"auth.loginTokenSuccess"===i._){const e=i.authorization;return s.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!_||!(0,g.Z)(_,i.token)){_=i.token;const n="tg://login?token="+function(e){let t,n="";for(let a=e.length,r=0,i=0;i>>t&24),2!==t&&a-i!=1||(n+=String.fromCharCode(u(r>>>18&63),u(r>>>12&63),u(r>>>6&63),u(63&r)),r=0);return n.replace(/A(?=A$|$)/g,"=")}(i.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""),a=window.getComputedStyle(document.documentElement),r=a.getPropertyValue("--surface-color").trim(),o=a.getPropertyValue("--primary-text-color").trim(),s=a.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>{e=e.replace(/(fill:).+?(;)/,`$1${s}$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)}))})),c=new Z({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:r},qrOptions:{errorCorrectionLevel:"L"}});let g;c.append(e),e.lastChild.classList.add("qr-canvas"),g=c._drawingPromise?c._drawingPromise:Promise.race([(0,l.Z)(1e3),new Promise((e=>{c._canvas._image.addEventListener("load",(()=>{window.requestAnimationFrame((()=>e()))}),{once:!0})}))]),yield g.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){const e=Date.now()/1e3,t=i.expires-e-(yield s.Z.managers.timeManager.getServerTimeOffset());yield(0,l.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(e.handled=!0,n.e(774).then(n.bind(n,9437)).then((e=>e.default.mount())),L=!0,m=null):(console.error("pageSignQR: default error:",e),L=!0),!0}return!1}));return()=>p(void 0,void 0,void 0,(function*(){for(L=!1;!L&&!(yield k(!0)););}))}))),m.then((e=>{e()})),s.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),y=h}}]); -//# sourceMappingURL=776.8ab4eee78bc43703a976.chunk.js.map \ No newline at end of file diff --git a/public/776.8ab4eee78bc43703a976.chunk.js.map b/public/776.8ab4eee78bc43703a976.chunk.js.map deleted file mode 100644 index bf6f7e8a..00000000 --- a/public/776.8ab4eee78bc43703a976.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"776.8ab4eee78bc43703a976.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","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 Page from './page';\r\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nconst 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 const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n\r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\r\n // continue;\r\n }\r\n\r\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n rootScope.managers.apiManager.setUser(authorization.user);\r\n import('./pageIm').then((m) => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n const encoded = bytesToBase64(loginToken.token);\r\n const 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 const timestamp = Date.now() / 1000;\r\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\r\n\r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then((m) => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n\r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n // console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then((func) => {\r\n func();\r\n });\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","once","e","disabled","uint6ToBase64","nUint6","imageDiv","pageEl","querySelector","preloader","putPreloader","inputWrapper","document","createElement","add","btnBack","container","parentElement","h4","helpList","li","addEventListener","m","default","mount","stop","QRCodeStyling","rootScope","options","ignoreErrors","prevToken","iterate","isLoop","loginToken","api_id","api_hash","except_ids","_","dcId","dc_id","token","authorization","user","bytesCmp","url","bytes","mod3","result","nLen","length","nUint24","nIdx","String","fromCharCode","replace","bytesToBase64","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","err","handled","console","error","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/776.f3c4c9ecb5dfb45387d4.chunk.js b/public/776.f3c4c9ecb5dfb45387d4.chunk.js new file mode 100644 index 00000000..d6dfa712 --- /dev/null +++ b/public/776.f3c4c9ecb5dfb45387d4.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[776,709],{9638:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(3910),i=n(2738),r=n(4541),o=n(2325),s=n(3512),d=n(4494),c=n(279);let l,g=!1;function u(e){g||(l||(l=s.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==o.ZP.lastRequestedLangCode?Promise.all([e,o.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const l=[];n.forEach((e=>{const t=o.ZP.strings.get(e.key);t&&(l.push(t),o.ZP.strings.set(e.key,e))}));const u="Login.ContinueOnLanguage",p=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:u});p.lastElementChild.classList.remove("i18n"),(0,r.Z)({text:[o.ZP.format(u,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(p)}))})),s.Z.addEventListener("language_change",(()=>{p.remove()}),{once:!0}),l.forEach((e=>{o.ZP.strings.set(e.key,e)})),(0,i.fc)(p,(e=>{(0,a.Z)(e),g=!0,p.disabled=!0,(0,c.y)(p),o.ZP.getLangPack(t.suggested_lang_code)}))}))}},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>f});var a=n(4874),i=n(4159),r=n(4494),o=n(2325),s=n(3512),d=n(279),c=n(9638),l=n(5418),g=n(9895);function u(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var p=n(8812),m=function(e,t,n,a){return new(n||(n=Promise))((function(i,r){function o(e){try{d(a.next(e))}catch(e){r(e)}}function s(e){try{d(a.throw(e))}catch(e){r(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}d((a=a.apply(e,t||[])).next())}))};let h;const y=new a.Z("page-signQR",!0,(()=>h),(()=>{h||(h=m(void 0,void 0,void 0,(function*(){const e=y.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const f=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(f),(0,c.Z)(a);const v=e.parentElement,Z=document.createElement("h4");(0,o.$d)(Z,"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((0,o.ag)(e)),w.append(t)})),v.append(Z,w,a),f.addEventListener("click",(()=>{n.e(810).then(n.bind(n,810)).then((e=>e.default.mount())),_=!0}));const L=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let _=!1;s.Z.addEventListener("user_auth",(()=>{_=!0,h=null}),{once:!0});const k={ignoreErrors:!0};let P;const E=a=>m(void 0,void 0,void 0,(function*(){try{let r=yield s.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:i.Z.id,api_hash:i.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===r._&&(k.dcId||(k.dcId=r.dc_id,s.Z.managers.apiManager.setBaseDcId(r.dc_id)),r=yield s.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:r.token},k)),"auth.loginTokenSuccess"===r._){const e=r.authorization;return s.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!P||!(0,g.Z)(P,r.token)){P=r.token;const n="tg://login?token="+function(e){let t,n="";for(let a=e.length,i=0,r=0;r>>t&24),2!==t&&a-r!=1||(n+=String.fromCharCode(u(i>>>18&63),u(i>>>12&63),u(i>>>6&63),u(63&i)),i=0);return n.replace(/A(?=A$|$)/g,"=")}(r.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""),a=window.getComputedStyle(document.documentElement),i=a.getPropertyValue("--surface-color").trim(),o=a.getPropertyValue("--primary-text-color").trim(),s=a.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>(e=e.replace(/(fill:).+?(;)/,`$1${s}$2`),(0,p.Z)(e)))),c=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:o,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:i},qrOptions:{errorCorrectionLevel:"L"}});let g;c.append(e),e.lastChild.classList.add("qr-canvas"),g=c._drawingPromise?c._drawingPromise:Promise.race([(0,l.Z)(1e3),new Promise((e=>{c._canvas._image.addEventListener("load",(()=>{window.requestAnimationFrame((()=>e()))}),{once:!0})}))]),yield g.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){const e=Date.now()/1e3,t=r.expires-e-(yield s.Z.managers.timeManager.getServerTimeOffset());yield(0,l.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(e.handled=!0,n.e(774).then(n.bind(n,9437)).then((e=>e.default.mount())),_=!0,h=null):(console.error("pageSignQR: default error:",e),_=!0),!0}return!1}));return()=>m(void 0,void 0,void 0,(function*(){for(_=!1;!_&&!(yield E(!0)););}))}))),h.then((e=>{e()})),s.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),f=y}}]); +//# sourceMappingURL=776.f3c4c9ecb5dfb45387d4.chunk.js.map \ No newline at end of file diff --git a/public/776.f3c4c9ecb5dfb45387d4.chunk.js.map b/public/776.f3c4c9ecb5dfb45387d4.chunk.js.map new file mode 100644 index 00000000..cde76179 --- /dev/null +++ b/public/776.f3c4c9ecb5dfb45387d4.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"776.f3c4c9ecb5dfb45387d4.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","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","/*\n * 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 {DcId} from '../types';\nimport Page from './page';\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\nimport App from '../config/app';\nimport Button from '../components/button';\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport {putPreloader} from '../components/putPreloader';\nimport getLanguageChangeButton from '../components/languageChangeButton';\nimport pause from '../helpers/schedulers/pause';\nimport fixBase64String from '../helpers/fixBase64String';\nimport bytesCmp from '../helpers/bytes/bytesCmp';\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\nimport textToSvgURL from '../helpers/textToSvgURL';\n\nconst FETCH_INTERVAL = 3;\n\nconst onFirstMount = async() => {\n const pageElement = page.pageEl;\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\n\n let preloader = putPreloader(imageDiv, true);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\n inputWrapper.append(btnBack);\n\n getLanguageChangeButton(inputWrapper);\n\n const container = imageDiv.parentElement;\n\n const h4 = document.createElement('h4');\n _i18n(h4, 'Login.QR.Title');\n\n const helpList = document.createElement('ol');\n helpList.classList.add('qr-description');\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\n const li = document.createElement('li');\n li.append(i18n(key));\n helpList.append(li);\n });\n\n container.append(h4, helpList, inputWrapper);\n\n btnBack.addEventListener('click', () => {\n import('./pageSignIn').then((m) => m.default.mount());\n stop = true;\n });\n\n const results = await Promise.all([\n import('qr-code-styling' as any)\n ]);\n const QRCodeStyling = results[0].default;\n\n let stop = false;\n rootScope.addEventListener('user_auth', () => {\n stop = true;\n cachedPromise = null;\n }, {once: true});\n\n const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\n let prevToken: Uint8Array | number[];\n\n const iterate = async(isLoop: boolean) => {\n try {\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\n api_id: App.id,\n api_hash: App.hash,\n except_ids: []\n }, {ignoreErrors: true});\n\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\n if(!options.dcId) {\n options.dcId = loginToken.dc_id as DcId;\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\n // continue;\n }\n\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\n token: loginToken.token\n }, options) as AuthLoginToken.authLoginToken;\n }\n\n if(loginToken._ === 'auth.loginTokenSuccess') {\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\n rootScope.managers.apiManager.setUser(authorization.user);\n import('./pageIm').then((m) => m.default.mount());\n return true;\n }\n\n /* // to base64\n var decoder = new TextDecoder('utf8');\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\n\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\n prevToken = loginToken.token;\n\n const encoded = bytesToBase64(loginToken.token);\n const url = 'tg://login?token=' + fixBase64String(encoded, true);\n\n const style = window.getComputedStyle(document.documentElement);\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\n const textColor = style.getPropertyValue('--primary-text-color').trim();\n const primaryColor = style.getPropertyValue('--primary-color').trim();\n\n const logoUrl = await fetch('assets/img/logo_padded.svg')\n .then((res) => res.text())\n .then((text) => {\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\n return textToSvgURL(text);\n });\n\n const qrCode = new QRCodeStyling({\n width: 240 * window.devicePixelRatio,\n height: 240 * window.devicePixelRatio,\n data: url,\n image: logoUrl,\n dotsOptions: {\n color: textColor,\n type: 'rounded'\n },\n cornersSquareOptions: {\n type: 'extra-rounded'\n },\n imageOptions: {\n imageSize: 1,\n margin: 0\n },\n backgroundOptions: {\n color: surfaceColor\n },\n qrOptions: {\n errorCorrectionLevel: 'L'\n }\n });\n\n qrCode.append(imageDiv);\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\n\n let promise: Promise;\n if(qrCode._drawingPromise) {\n promise = qrCode._drawingPromise;\n } else {\n promise = Promise.race([\n pause(1000),\n new Promise((resolve) => {\n qrCode._canvas._image.addEventListener('load', () => {\n window.requestAnimationFrame(() => resolve());\n }, {once: true});\n })\n ]);\n }\n\n // * это костыль, но библиотека не предоставляет никаких событий\n await promise.then(() => {\n if(preloader) {\n preloader.style.animation = 'hide-icon .4s forwards';\n\n const c = imageDiv.children[1] as HTMLElement;\n c.style.display = 'none';\n c.style.animation = 'grow-icon .4s forwards';\n setTimeout(() => {\n c.style.display = '';\n }, 150);\n\n setTimeout(() => {\n c.style.animation = '';\n }, 500);\n preloader = undefined;\n } else {\n Array.from(imageDiv.children).slice(0, -1).forEach((el) => {\n el.remove();\n });\n }\n });\n }\n\n if(isLoop) {\n const timestamp = Date.now() / 1000;\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\n\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\n }\n } catch(err) {\n switch((err as ApiError).type) {\n case 'SESSION_PASSWORD_NEEDED':\n (err as ApiError).handled = true;\n import('./pagePassword').then((m) => m.default.mount());\n stop = true;\n cachedPromise = null;\n break;\n default:\n console.error('pageSignQR: default error:', err);\n stop = true;\n break;\n }\n\n return true;\n }\n\n return false;\n };\n\n // await iterate(false);\n\n return async() => {\n stop = false;\n\n do {\n if(stop) {\n break;\n }\n\n const needBreak = await iterate(true);\n if(needBreak) {\n break;\n }\n } while(true);\n };\n};\n\nlet cachedPromise: Promise<() => Promise>;\nconst page = new Page('page-signQR', true, () => {\n return cachedPromise;\n}, () => {\n // console.log('onMount');\n if(!cachedPromise) cachedPromise = onFirstMount();\n cachedPromise.then((func) => {\n func();\n });\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\n});\n\nexport default page;\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","once","e","disabled","uint6ToBase64","nUint6","imageDiv","pageEl","querySelector","preloader","putPreloader","inputWrapper","document","createElement","add","btnBack","container","parentElement","h4","helpList","li","addEventListener","m","default","mount","stop","QRCodeStyling","rootScope","options","ignoreErrors","prevToken","iterate","isLoop","loginToken","api_id","api_hash","except_ids","_","dcId","dc_id","token","authorization","user","bytesCmp","url","bytes","mod3","result","nLen","length","nUint24","nIdx","String","fromCharCode","replace","bytesToBase64","style","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","textToSvgURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","type","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","pause","resolve","_canvas","_image","animation","c","children","display","setTimeout","undefined","Array","from","slice","el","timestamp","Date","now","diff","expires","err","handled","console","error","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/781.5b082181115fbfebcf63.chunk.js b/public/781.0e00df9eb08b8690c5dd.chunk.js similarity index 84% rename from public/781.5b082181115fbfebcf63.chunk.js rename to public/781.0e00df9eb08b8690c5dd.chunk.js index 9a69b7a5..5a6714fe 100644 --- a/public/781.5b082181115fbfebcf63.chunk.js +++ b/public/781.0e00df9eb08b8690c5dd.chunk.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[781,436],{5436:(e,t,a)=>{a.r(t),a.d(t,{default:()=>h});var n=a(8799),s=a(4541),r=a(2325),l=a(3512);const o=new(a(4874).Z)("page-chats",!1,(()=>(l.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignedIn"}),r.ZP.requestedServerLanguage||r.ZP.getCacheLangPack().then((e=>{e.local&&r.ZP.getLangPack(e.lang_code)})),o.pageEl.style.display="",(0,n.Z)(),Promise.all([(0,s.Z)(),Promise.resolve().then(a.bind(a,9893)),"requestVideoFrameCallback"in HTMLVideoElement.prototype?Promise.resolve():a.e(783).then(a.bind(a,7482))]).then((([e,t,a])=>{t.default.start(),setTimeout((()=>{document.getElementById("auth-pages").remove()}),1e3)}))))),h=o}}]); -//# sourceMappingURL=781.5b082181115fbfebcf63.chunk.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[781,436],{5436:(e,t,a)=>{a.r(t),a.d(t,{default:()=>h});var n=a(8799),s=a(4541),r=a(2325),l=a(3512);const o=new(a(4874).Z)("page-chats",!1,(()=>(l.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignedIn"}),r.ZP.requestedServerLanguage||r.ZP.getCacheLangPack().then((e=>{e.local&&r.ZP.getLangPack(e.lang_code)})),o.pageEl.style.display="",(0,n.Z)(),Promise.all([(0,s.Z)(),Promise.resolve().then(a.bind(a,8130)),"requestVideoFrameCallback"in HTMLVideoElement.prototype?Promise.resolve():a.e(783).then(a.bind(a,7482))]).then((([e,t,a])=>{t.default.start(),setTimeout((()=>{document.getElementById("auth-pages").remove()}),1e3)}))))),h=o}}]); +//# sourceMappingURL=781.0e00df9eb08b8690c5dd.chunk.js.map \ No newline at end of file diff --git a/public/781.0e00df9eb08b8690c5dd.chunk.js.map b/public/781.0e00df9eb08b8690c5dd.chunk.js.map new file mode 100644 index 00000000..f78d9bfe --- /dev/null +++ b/public/781.0e00df9eb08b8690c5dd.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"781.0e00df9eb08b8690c5dd.chunk.js","mappings":"yKAYA,MA0CMA,EAAO,I,QAAI,GAAK,cAAc,GA1Cf,KACnB,yCAA+C,YAAa,CAACC,EAAG,sBAI5D,8BACF,wBAAwBC,MAAMC,IACzBA,EAASC,OACV,iBAAiBD,EAASE,cAKhCL,EAAKM,OAAOC,MAAMC,QAAU,IAe5B,SAEOC,QAAQC,IAAI,EACjB,SACA,uCACA,8BAA+BC,iBAAiBC,UAAYH,QAAQI,UAAY,gCAC/EX,MAAK,EAAED,EAAGa,EAAmBC,MAC9BD,EAAkBE,QAAQC,QAC1BC,YAAW,KACTC,SAASC,eAAe,cAAcC,WACrC,WAKP","sources":["webpack://tweb/./src/pages/pageIm.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport I18n from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Page from './page';\n\nconst onFirstMount = () => {\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\n // ! TOO SLOW\n /* appStateManager.saveState(); */\n\n if(!I18n.requestedServerLanguage) {\n I18n.getCacheLangPack().then((langPack) => {\n if(langPack.local) {\n I18n.getLangPack(langPack.lang_code);\n }\n });\n }\n\n page.pageEl.style.display = '';\n\n // AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\n\n /* // @ts-ignore\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\n alert('AudioContext:' + typeof(AudioContext));\n // @ts-ignore\n alert('global.navigator:' + typeof(navigator));\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\n\n // (Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach((el) => ripple(el));\n\n blurActiveElement();\n\n return Promise.all([\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\n import('../lib/appManagers/appDialogsManager'),\n 'requestVideoFrameCallback' in HTMLVideoElement.prototype ? Promise.resolve() : import('../helpers/dom/requestVideoFrameCallbackPolyfill')\n ]).then(([_, appDialogsManager, __]) => {\n appDialogsManager.default.start();\n setTimeout(() => {\n document.getElementById('auth-pages').remove();\n }, 1e3);\n });\n};\n\nconst page = new Page('page-chats', false, onFirstMount);\nexport default page;\n"],"names":["page","_","then","langPack","local","lang_code","pageEl","style","display","Promise","all","HTMLVideoElement","prototype","resolve","appDialogsManager","__","default","start","setTimeout","document","getElementById","remove"],"sourceRoot":""} \ No newline at end of file diff --git a/public/781.5b082181115fbfebcf63.chunk.js.map b/public/781.5b082181115fbfebcf63.chunk.js.map deleted file mode 100644 index 2321895e..00000000 --- a/public/781.5b082181115fbfebcf63.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"781.5b082181115fbfebcf63.chunk.js","mappings":"yKAYA,MA0CMA,EAAO,I,QAAI,GAAK,cAAc,GA1Cf,KACnB,yCAA+C,YAAa,CAACC,EAAG,sBAI5D,8BACF,wBAAwBC,MAAMC,IACzBA,EAASC,OACV,iBAAiBD,EAASE,cAKhCL,EAAKM,OAAOC,MAAMC,QAAU,IAe5B,SAEOC,QAAQC,IAAI,EACjB,SACA,uCACA,8BAA+BC,iBAAiBC,UAAYH,QAAQI,UAAY,gCAC/EX,MAAK,EAAED,EAAGa,EAAmBC,MAC9BD,EAAkBE,QAAQC,QAC1BC,YAAW,KACTC,SAASC,eAAe,cAAcC,WACrC,WAKP","sources":["webpack://tweb/./src/pages/pageIm.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport loadFonts from '../helpers/dom/loadFonts';\r\nimport I18n from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport Page from './page';\r\n\r\nconst onFirstMount = () => {\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then((langPack) => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n\r\n // AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n // (Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach((el) => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager'),\r\n 'requestVideoFrameCallback' in HTMLVideoElement.prototype ? Promise.resolve() : import('../helpers/dom/requestVideoFrameCallbackPolyfill')\r\n ]).then(([_, appDialogsManager, __]) => {\r\n appDialogsManager.default.start();\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"names":["page","_","then","langPack","local","lang_code","pageEl","style","display","Promise","all","HTMLVideoElement","prototype","resolve","appDialogsManager","__","default","start","setTimeout","document","getElementById","remove"],"sourceRoot":""} \ No newline at end of file diff --git a/public/8.0544e00385e42a07883b.chunk.js b/public/8.0544e00385e42a07883b.chunk.js deleted file mode 100644 index 1ab9602f..00000000 --- a/public/8.0544e00385e42a07883b.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[8],{9179:(X,e,o)=>{o.r(e),o.d(e,{default:()=>t});const t={_:"help.countriesList",countries:[{iso2:"AD",default_name:"Andorra",country_codes:[{country_code:"376",patterns:["XX XX XX"]}]},{iso2:"AE",default_name:"United Arab Emirates",country_codes:[{country_code:"971",patterns:["XX XXX XXXX"]}]},{iso2:"AF",default_name:"Afghanistan",country_codes:[{country_code:"93",patterns:["XXX XXX XXX"]}]},{iso2:"AG",default_name:"Antigua & Barbuda",country_codes:[{country_code:"1268",patterns:["XXX XXXX"]}]},{iso2:"AI",default_name:"Anguilla",country_codes:[{country_code:"1264",patterns:["XXX XXXX"]}]},{iso2:"AL",default_name:"Albania",country_codes:[{country_code:"355",patterns:["XX XXX XXXX"]}]},{iso2:"AM",default_name:"Armenia",country_codes:[{country_code:"374",patterns:["XX XXX XXX"]}]},{iso2:"AO",default_name:"Angola",country_codes:[{country_code:"244",patterns:["XXX XXX XXX"]}]},{iso2:"AR",default_name:"Argentina",country_codes:[{country_code:"54"}]},{iso2:"AS",default_name:"American Samoa",country_codes:[{country_code:"1684",patterns:["XXX XXXX"]}]},{iso2:"AT",default_name:"Austria",country_codes:[{country_code:"43",patterns:["X XXXXXXXX"]}]},{iso2:"AU",default_name:"Australia",country_codes:[{country_code:"61",patterns:["X XXXX XXXX"]}]},{iso2:"AW",default_name:"Aruba",country_codes:[{country_code:"297",patterns:["XXX XXXX"]}]},{iso2:"AZ",default_name:"Azerbaijan",country_codes:[{country_code:"994",patterns:["XX XXX XXXX"]}]},{iso2:"BA",default_name:"Bosnia & Herzegovina",country_codes:[{country_code:"387",patterns:["XX XXX XXX"]}]},{iso2:"BB",default_name:"Barbados",country_codes:[{country_code:"1246",patterns:["XXX XXXX"]}]},{iso2:"BD",default_name:"Bangladesh",country_codes:[{country_code:"880",patterns:["XX XXX XXX"]}]},{iso2:"BE",default_name:"Belgium",country_codes:[{country_code:"32",patterns:["XXX XX XX XX"]}]},{iso2:"BF",default_name:"Burkina Faso",country_codes:[{country_code:"226",patterns:["XX XX XX XX"]}]},{iso2:"BG",default_name:"Bulgaria",country_codes:[{country_code:"359"}]},{iso2:"BH",default_name:"Bahrain",country_codes:[{country_code:"973",patterns:["XXXX XXXX"]}]},{iso2:"BI",default_name:"Burundi",country_codes:[{country_code:"257",patterns:["XX XX XXXX"]}]},{iso2:"BJ",default_name:"Benin",country_codes:[{country_code:"229",patterns:["XX XXX XXX"]}]},{iso2:"BM",default_name:"Bermuda",country_codes:[{country_code:"1441",patterns:["XXX XXXX"]}]},{iso2:"BN",default_name:"Brunei Darussalam",country_codes:[{country_code:"673",patterns:["XXX XXXX"]}]},{iso2:"BO",default_name:"Bolivia",country_codes:[{country_code:"591",patterns:["X XXX XXXX"]}]},{iso2:"BQ",default_name:"Bonaire, Sint Eustatius & Saba",country_codes:[{country_code:"599"}]},{iso2:"BR",default_name:"Brazil",country_codes:[{country_code:"55",patterns:["XX XXXXX XXXX"]}]},{iso2:"BS",default_name:"Bahamas",country_codes:[{country_code:"1242",patterns:["XXX XXXX"]}]},{iso2:"BT",default_name:"Bhutan",country_codes:[{country_code:"975",patterns:["XX XXX XXX"]}]},{iso2:"BW",default_name:"Botswana",country_codes:[{country_code:"267",patterns:["XX XXX XXX"]}]},{iso2:"BY",default_name:"Belarus",country_codes:[{country_code:"375",patterns:["XX XXX XXXX"]}]},{iso2:"BZ",default_name:"Belize",country_codes:[{country_code:"501"}]},{iso2:"CA",default_name:"Canada",country_codes:[{country_code:"1",prefixes:["403","587","780","825","236","250","604","672","778","204","431","506","709","902","782","226","249","289","343","365","416","437","519","548","613","647","705","807","905","418","438","450","514","579","581","819","873","306","639","867"],patterns:["XXX XXX XXXX"]}]},{iso2:"CD",default_name:"Congo (Dem. Rep.)",country_codes:[{country_code:"243",patterns:["XX XXX XXXX"]}]},{iso2:"CF",default_name:"Central African Rep.",country_codes:[{country_code:"236",patterns:["XX XX XX XX"]}]},{iso2:"CG",default_name:"Congo (Rep.)",country_codes:[{country_code:"242",patterns:["XX XXX XXXX"]}]},{iso2:"CH",default_name:"Switzerland",country_codes:[{country_code:"41",patterns:["XX XXX XXXX"]}]},{iso2:"CI",default_name:"Côte d'Ivoire",country_codes:[{country_code:"225",patterns:["XX XX XX XXXX"]}]},{iso2:"CK",default_name:"Cook Islands",country_codes:[{country_code:"682"}]},{iso2:"CL",default_name:"Chile",country_codes:[{country_code:"56",patterns:["X XXXX XXXX"]}]},{iso2:"CM",default_name:"Cameroon",country_codes:[{country_code:"237",patterns:["XXXX XXXX"]}]},{iso2:"CN",default_name:"China",country_codes:[{country_code:"86",patterns:["XXX XXXX XXXX"]}]},{iso2:"CO",default_name:"Colombia",country_codes:[{country_code:"57",patterns:["XXX XXX XXXX"]}]},{iso2:"CR",default_name:"Costa Rica",country_codes:[{country_code:"506",patterns:["XXXX XXXX"]}]},{iso2:"CU",default_name:"Cuba",country_codes:[{country_code:"53",patterns:["X XXX XXXX"]}]},{iso2:"CV",default_name:"Cape Verde",country_codes:[{country_code:"238",patterns:["XXX XXXX"]}]},{iso2:"CW",default_name:"Curaçao",country_codes:[{country_code:"599",prefixes:["9"]}]},{iso2:"CY",default_name:"Cyprus",country_codes:[{country_code:"357",patterns:["XXXX XXXX"]}]},{iso2:"CZ",default_name:"Czech Republic",country_codes:[{country_code:"420",patterns:["XXX XXX XXX"]}]},{iso2:"DE",default_name:"Germany",country_codes:[{country_code:"49",patterns:["XXXX XXXXXXX","16X XXXXXXX","17X XXXXXXX","3601 4198XX"]}]},{iso2:"DJ",default_name:"Djibouti",country_codes:[{country_code:"253",patterns:["XX XX XX XX"]}]},{iso2:"DK",default_name:"Denmark",country_codes:[{country_code:"45",patterns:["XXXX XXXX"]}]},{iso2:"DM",default_name:"Dominica",country_codes:[{country_code:"1767",patterns:["XXX XXXX"]}]},{iso2:"DO",default_name:"Dominican Rep.",country_codes:[{country_code:"1809",patterns:["XXX XXXX"]},{country_code:"1829",patterns:["XXX XXXX"]},{country_code:"1849",patterns:["XXX XXXX"]}]},{iso2:"DZ",default_name:"Algeria",country_codes:[{country_code:"213",patterns:["XXX XX XX XX"]}]},{iso2:"EC",default_name:"Ecuador",country_codes:[{country_code:"593",patterns:["XX XXX XXXX"]}]},{iso2:"EE",default_name:"Estonia",country_codes:[{country_code:"372",patterns:["XXXX XXXX"]}]},{iso2:"EG",default_name:"Egypt",country_codes:[{country_code:"20",patterns:["XX XXXX XXXX"]}]},{iso2:"ER",default_name:"Eritrea",country_codes:[{country_code:"291",patterns:["X XXX XXX"]}]},{iso2:"ES",default_name:"Spain",country_codes:[{country_code:"34",patterns:["XXX XXX XXX"]}]},{iso2:"ET",default_name:"Ethiopia",country_codes:[{country_code:"251",patterns:["XX XXX XXXX"]}]},{iso2:"FI",default_name:"Finland",country_codes:[{country_code:"358"}]},{iso2:"FJ",default_name:"Fiji",country_codes:[{country_code:"679",patterns:["XXX XXXX"]}]},{iso2:"FK",default_name:"Falkland Islands",country_codes:[{country_code:"500"}]},{iso2:"FM",default_name:"Micronesia",country_codes:[{country_code:"691"}]},{iso2:"FO",default_name:"Faroe Islands",country_codes:[{country_code:"298",patterns:["XXX XXX"]}]},{iso2:"FR",default_name:"France",country_codes:[{country_code:"33",patterns:["X XX XX XX XX"]}]},{iso2:"GA",default_name:"Gabon",country_codes:[{country_code:"241",patterns:["X XX XX XX"]}]},{iso2:"GB",default_name:"United Kingdom",country_codes:[{country_code:"44",patterns:["XXXX XXXXXX"]}]},{iso2:"GD",default_name:"Grenada",country_codes:[{country_code:"1473",patterns:["XXX XXXX"]}]},{iso2:"GE",default_name:"Georgia",country_codes:[{country_code:"995",patterns:["XXX XXX XXX"]}]},{iso2:"GF",default_name:"French Guiana",country_codes:[{country_code:"594"}]},{iso2:"GH",default_name:"Ghana",country_codes:[{country_code:"233",patterns:["XX XXX XXXX"]}]},{iso2:"GI",default_name:"Gibraltar",country_codes:[{country_code:"350",patterns:["XXXX XXXX"]}]},{iso2:"GL",default_name:"Greenland",country_codes:[{country_code:"299",patterns:["XXX XXX"]}]},{iso2:"GM",default_name:"Gambia",country_codes:[{country_code:"220",patterns:["XXX XXXX"]}]},{iso2:"GN",default_name:"Guinea",country_codes:[{country_code:"224",patterns:["XXX XXX XXX"]}]},{iso2:"GP",default_name:"Guadeloupe",country_codes:[{country_code:"590",patterns:["XXX XX XX XX"]}]},{iso2:"GQ",default_name:"Equatorial Guinea",country_codes:[{country_code:"240",patterns:["XXX XXX XXX"]}]},{iso2:"GR",default_name:"Greece",country_codes:[{country_code:"30",patterns:["XXX XXX XXXX"]}]},{iso2:"GT",default_name:"Guatemala",country_codes:[{country_code:"502",patterns:["X XXX XXXX"]}]},{iso2:"GU",default_name:"Guam",country_codes:[{country_code:"1671",patterns:["XXX XXXX"]}]},{iso2:"GW",default_name:"Guinea-Bissau",country_codes:[{country_code:"245",patterns:["XXX XXXX"]}]},{iso2:"GY",default_name:"Guyana",country_codes:[{country_code:"592"}]},{iso2:"HK",default_name:"Hong Kong",country_codes:[{country_code:"852",patterns:["X XXX XXXX"]}]},{iso2:"HN",default_name:"Honduras",country_codes:[{country_code:"504",patterns:["XXXX XXXX"]}]},{iso2:"HR",default_name:"Croatia",country_codes:[{country_code:"385",patterns:["XX XXX XXX"]}]},{iso2:"HT",default_name:"Haiti",country_codes:[{country_code:"509",patterns:["XXXX XXXX"]}]},{iso2:"HU",default_name:"Hungary",country_codes:[{country_code:"36",patterns:["XXX XXX XXX"]}]},{iso2:"ID",default_name:"Indonesia",country_codes:[{country_code:"62",patterns:["XXX XXXXXX"]}]},{iso2:"IE",default_name:"Ireland",country_codes:[{country_code:"353",patterns:["XX XXX XXXX"]}]},{iso2:"IL",default_name:"Israel",country_codes:[{country_code:"972",patterns:["XX XXX XXXX"]}]},{iso2:"IN",default_name:"India",country_codes:[{country_code:"91",patterns:["XXXXX XXXXX"]}]},{iso2:"IO",default_name:"Diego Garcia",country_codes:[{country_code:"246",patterns:["XXX XXXX"]}]},{iso2:"IQ",default_name:"Iraq",country_codes:[{country_code:"964",patterns:["XXX XXX XXXX"]}]},{iso2:"IR",default_name:"Iran",country_codes:[{country_code:"98",patterns:["XXX XXX XXXX"]}]},{iso2:"IS",default_name:"Iceland",country_codes:[{country_code:"354",patterns:["XXX XXXX"]}]},{iso2:"IT",default_name:"Italy",country_codes:[{country_code:"39",patterns:["XXX XXX XXX"]}]},{iso2:"JM",default_name:"Jamaica",country_codes:[{country_code:"1876",patterns:["XXX XXXX"]}]},{iso2:"JO",default_name:"Jordan",country_codes:[{country_code:"962",patterns:["X XXXX XXXX"]}]},{iso2:"JP",default_name:"Japan",country_codes:[{country_code:"81",patterns:["XX XXXX XXXX"]}]},{iso2:"KE",default_name:"Kenya",country_codes:[{country_code:"254",patterns:["XXX XXX XXX"]}]},{iso2:"KG",default_name:"Kyrgyzstan",country_codes:[{country_code:"996",patterns:["XXX XXXXXX"]}]},{iso2:"KH",default_name:"Cambodia",country_codes:[{country_code:"855",patterns:["XX XXX XXX"]}]},{iso2:"KI",default_name:"Kiribati",country_codes:[{country_code:"686",patterns:["XXXX XXXX"]}]},{iso2:"KM",default_name:"Comoros",country_codes:[{country_code:"269",patterns:["XXX XXXX"]}]},{iso2:"KN",default_name:"Saint Kitts & Nevis",country_codes:[{country_code:"1869",patterns:["XXX XXXX"]}]},{iso2:"KP",default_name:"North Korea",country_codes:[{country_code:"850"}]},{iso2:"KR",default_name:"South Korea",country_codes:[{country_code:"82",patterns:["XX XXXX XXX"]}]},{iso2:"KW",default_name:"Kuwait",country_codes:[{country_code:"965",patterns:["XXXX XXXX"]}]},{iso2:"KY",default_name:"Cayman Islands",country_codes:[{country_code:"1345",patterns:["XXX XXXX"]}]},{iso2:"KZ",default_name:"Kazakhstan",country_codes:[{country_code:"7",prefixes:["6","7"],patterns:["XXX XXX XX XX"]}]},{iso2:"LA",default_name:"Laos",country_codes:[{country_code:"856",patterns:["XX XX XXX XXX"]}]},{iso2:"LB",default_name:"Lebanon",country_codes:[{country_code:"961",patterns:["XX XXX XXX"]}]},{iso2:"LC",default_name:"Saint Lucia",country_codes:[{country_code:"1758",patterns:["XXX XXXX"]}]},{iso2:"LI",default_name:"Liechtenstein",country_codes:[{country_code:"423",patterns:["XXX XXXX"]}]},{iso2:"LK",default_name:"Sri Lanka",country_codes:[{country_code:"94",patterns:["XX XXX XXXX"]}]},{iso2:"LR",default_name:"Liberia",country_codes:[{country_code:"231",patterns:["XX XXX XXXX"]}]},{iso2:"LS",default_name:"Lesotho",country_codes:[{country_code:"266",patterns:["XX XXX XXX"]}]},{iso2:"LT",default_name:"Lithuania",country_codes:[{country_code:"370",patterns:["XXX XXXXX"]}]},{iso2:"LU",default_name:"Luxembourg",country_codes:[{country_code:"352",patterns:["XXX XXX XXX"]}]},{iso2:"LV",default_name:"Latvia",country_codes:[{country_code:"371",patterns:["XXX XXXXX"]}]},{iso2:"LY",default_name:"Libya",country_codes:[{country_code:"218",patterns:["XX XXX XXXX"]}]},{iso2:"MA",default_name:"Morocco",country_codes:[{country_code:"212",patterns:["XX XXX XXXX"]}]},{iso2:"MC",default_name:"Monaco",country_codes:[{country_code:"377",patterns:["XXXX XXXX"]}]},{iso2:"MD",default_name:"Moldova",country_codes:[{country_code:"373",patterns:["XX XXX XXX"]}]},{iso2:"ME",default_name:"Montenegro",country_codes:[{country_code:"382"}]},{iso2:"MG",default_name:"Madagascar",country_codes:[{country_code:"261",patterns:["XX XX XXX XX"]}]},{iso2:"MH",default_name:"Marshall Islands",country_codes:[{country_code:"692"}]},{iso2:"MK",default_name:"North Macedonia",country_codes:[{country_code:"389",patterns:["XX XXX XXX"]}]},{iso2:"ML",default_name:"Mali",country_codes:[{country_code:"223",patterns:["XXXX XXXX"]}]},{iso2:"MM",default_name:"Myanmar",country_codes:[{country_code:"95"}]},{iso2:"MN",default_name:"Mongolia",country_codes:[{country_code:"976",patterns:["XX XX XXXX"]}]},{iso2:"MO",default_name:"Macau",country_codes:[{country_code:"853",patterns:["XXXX XXXX"]}]},{iso2:"MP",default_name:"Northern Mariana Islands",country_codes:[{country_code:"1670",patterns:["XXX XXXX"]}]},{iso2:"MQ",default_name:"Martinique",country_codes:[{country_code:"596"}]},{iso2:"MR",default_name:"Mauritania",country_codes:[{country_code:"222",patterns:["XXXX XXXX"]}]},{iso2:"MS",default_name:"Montserrat",country_codes:[{country_code:"1664",patterns:["XXX XXXX"]}]},{iso2:"MT",default_name:"Malta",country_codes:[{country_code:"356",patterns:["XX XX XX XX"]}]},{iso2:"MU",default_name:"Mauritius",country_codes:[{country_code:"230",patterns:["XXXX XXXX"]}]},{iso2:"MV",default_name:"Maldives",country_codes:[{country_code:"960",patterns:["XXX XXXX"]}]},{iso2:"MW",default_name:"Malawi",country_codes:[{country_code:"265",patterns:["XX XXX XXXX"]}]},{iso2:"MX",default_name:"Mexico",country_codes:[{country_code:"52"}]},{iso2:"MY",default_name:"Malaysia",country_codes:[{country_code:"60",patterns:["XX XXXX XXXX"]}]},{iso2:"MZ",default_name:"Mozambique",country_codes:[{country_code:"258",patterns:["XX XXX XXXX"]}]},{iso2:"NA",default_name:"Namibia",country_codes:[{country_code:"264",patterns:["XX XXX XXXX"]}]},{iso2:"NC",default_name:"New Caledonia",country_codes:[{country_code:"687"}]},{iso2:"NE",default_name:"Niger",country_codes:[{country_code:"227",patterns:["XX XX XX XX"]}]},{iso2:"NF",default_name:"Norfolk Island",country_codes:[{country_code:"672"}]},{iso2:"NG",default_name:"Nigeria",country_codes:[{country_code:"234",patterns:["XX XXXX XXXX"]}]},{iso2:"NI",default_name:"Nicaragua",country_codes:[{country_code:"505",patterns:["XXXX XXXX"]}]},{iso2:"NL",default_name:"Netherlands",country_codes:[{country_code:"31",patterns:["X XX XX XX XX","97 XXXX XXXXX"]}]},{iso2:"NO",default_name:"Norway",country_codes:[{country_code:"47",patterns:["XXXX XXXX"]}]},{iso2:"NP",default_name:"Nepal",country_codes:[{country_code:"977",patterns:["XX XXXX XXXX"]}]},{iso2:"NR",default_name:"Nauru",country_codes:[{country_code:"674"}]},{iso2:"NU",default_name:"Niue",country_codes:[{country_code:"683"}]},{iso2:"NZ",default_name:"New Zealand",country_codes:[{country_code:"64",patterns:["XXXX XXXX"]}]},{iso2:"OM",default_name:"Oman",country_codes:[{country_code:"968",patterns:["XXXX XXXX"]}]},{iso2:"PA",default_name:"Panama",country_codes:[{country_code:"507",patterns:["XXXX XXXX"]}]},{iso2:"PE",default_name:"Peru",country_codes:[{country_code:"51",patterns:["XXX XXX XXX"]}]},{iso2:"PF",default_name:"French Polynesia",country_codes:[{country_code:"689"}]},{iso2:"PG",default_name:"Papua New Guinea",country_codes:[{country_code:"675"}]},{iso2:"PH",default_name:"Philippines",country_codes:[{country_code:"63",patterns:["XXX XXX XXXX"]}]},{iso2:"PK",default_name:"Pakistan",country_codes:[{country_code:"92",patterns:["XXX XXX XXXX"]}]},{iso2:"PL",default_name:"Poland",country_codes:[{country_code:"48",patterns:["XXX XXX XXX"]}]},{iso2:"PM",default_name:"Saint Pierre & Miquelon",country_codes:[{country_code:"508"}]},{iso2:"PR",default_name:"Puerto Rico",country_codes:[{country_code:"1787",patterns:["XXX XXXX"]},{country_code:"1939",patterns:["XXX XXXX"]}]},{iso2:"PS",default_name:"Palestine",country_codes:[{country_code:"970",patterns:["XXX XX XXXX"]}]},{iso2:"PT",default_name:"Portugal",country_codes:[{country_code:"351",patterns:["XXX XXX XXX"]}]},{iso2:"PW",default_name:"Palau",country_codes:[{country_code:"680"}]},{iso2:"PY",default_name:"Paraguay",country_codes:[{country_code:"595",patterns:["XXX XXX XXX"]}]},{iso2:"QA",default_name:"Qatar",country_codes:[{country_code:"974",patterns:["XX XXX XXX"]}]},{iso2:"RE",default_name:"Réunion",country_codes:[{country_code:"262",patterns:["XXX XXX XXX"]}]},{iso2:"RO",default_name:"Romania",country_codes:[{country_code:"40",patterns:["XXX XXX XXX"]}]},{iso2:"RS",default_name:"Serbia",country_codes:[{country_code:"381",patterns:["XX XXX XXXX"]}]},{iso2:"RU",default_name:"Russian Federation",country_codes:[{country_code:"7",patterns:["XXX XXX XXXX"]}]},{iso2:"RW",default_name:"Rwanda",country_codes:[{country_code:"250",patterns:["XXX XXX XXX"]}]},{iso2:"SA",default_name:"Saudi Arabia",country_codes:[{country_code:"966",patterns:["XX XXX XXXX"]}]},{iso2:"SB",default_name:"Solomon Islands",country_codes:[{country_code:"677"}]},{iso2:"SC",default_name:"Seychelles",country_codes:[{country_code:"248",patterns:["X XX XX XX"]}]},{iso2:"SD",default_name:"Sudan",country_codes:[{country_code:"249",patterns:["XX XXX XXXX"]}]},{iso2:"SE",default_name:"Sweden",country_codes:[{country_code:"46",patterns:["XX XXX XXXX"]}]},{iso2:"SG",default_name:"Singapore",country_codes:[{country_code:"65",patterns:["XXXX XXXX"]}]},{iso2:"SH",default_name:"Saint Helena",country_codes:[{country_code:"247"},{country_code:"290",patterns:["XX XXX"]}]},{iso2:"SI",default_name:"Slovenia",country_codes:[{country_code:"386",patterns:["XX XXX XXX"]}]},{iso2:"SK",default_name:"Slovakia",country_codes:[{country_code:"421",patterns:["XXX XXX XXX"]}]},{iso2:"SL",default_name:"Sierra Leone",country_codes:[{country_code:"232",patterns:["XX XXX XXX"]}]},{iso2:"SM",default_name:"San Marino",country_codes:[{country_code:"378",patterns:["XXX XXX XXXX"]}]},{iso2:"SN",default_name:"Senegal",country_codes:[{country_code:"221",patterns:["XX XXX XXXX"]}]},{iso2:"SO",default_name:"Somalia",country_codes:[{country_code:"252",patterns:["XX XXX XXX"]}]},{iso2:"SR",default_name:"Suriname",country_codes:[{country_code:"597",patterns:["XXX XXXX"]}]},{iso2:"SS",default_name:"South Sudan",country_codes:[{country_code:"211",patterns:["XX XXX XXXX"]}]},{iso2:"ST",default_name:"São Tomé & Príncipe",country_codes:[{country_code:"239",patterns:["XX XXXXX"]}]},{iso2:"SV",default_name:"El Salvador",country_codes:[{country_code:"503",patterns:["XXXX XXXX"]}]},{iso2:"SX",default_name:"Sint Maarten",country_codes:[{country_code:"1721",patterns:["XXX XXXX"]}]},{iso2:"SY",default_name:"Syria",country_codes:[{country_code:"963",patterns:["XXX XXX XXX"]}]},{iso2:"SZ",default_name:"Eswatini",country_codes:[{country_code:"268",patterns:["XXXX XXXX"]}]},{iso2:"TC",default_name:"Turks & Caicos Islands",country_codes:[{country_code:"1649",patterns:["XXX XXXX"]}]},{iso2:"TD",default_name:"Chad",country_codes:[{country_code:"235",patterns:["XX XX XX XX"]}]},{iso2:"TG",default_name:"Togo",country_codes:[{country_code:"228",patterns:["XX XXX XXX"]}]},{iso2:"TH",default_name:"Thailand",country_codes:[{country_code:"66",patterns:["X XXXX XXXX"]}]},{iso2:"TJ",default_name:"Tajikistan",country_codes:[{country_code:"992",patterns:["XX XXX XXXX"]}]},{iso2:"TK",default_name:"Tokelau",country_codes:[{country_code:"690"}]},{iso2:"TL",default_name:"Timor-Leste",country_codes:[{country_code:"670"}]},{iso2:"TM",default_name:"Turkmenistan",country_codes:[{country_code:"993",patterns:["XX XXXXXX"]}]},{iso2:"TN",default_name:"Tunisia",country_codes:[{country_code:"216",patterns:["XX XXX XXX"]}]},{iso2:"TO",default_name:"Tonga",country_codes:[{country_code:"676"}]},{iso2:"TR",default_name:"Turkey",country_codes:[{country_code:"90",patterns:["XXX XXX XXXX"]}]},{iso2:"TT",default_name:"Trinidad & Tobago",country_codes:[{country_code:"1868",patterns:["XXX XXXX"]}]},{iso2:"TV",default_name:"Tuvalu",country_codes:[{country_code:"688"}]},{iso2:"TW",default_name:"Taiwan",country_codes:[{country_code:"886",patterns:["XXX XXX XXX"]}]},{iso2:"TZ",default_name:"Tanzania",country_codes:[{country_code:"255",patterns:["XX XXX XXXX"]}]},{iso2:"UA",default_name:"Ukraine",country_codes:[{country_code:"380",patterns:["XX XXX XX XX"]}]},{iso2:"UG",default_name:"Uganda",country_codes:[{country_code:"256",patterns:["XX XXX XXXX"]}]},{iso2:"US",default_name:"USA",country_codes:[{country_code:"1",patterns:["XXX XXX XXXX"]}]},{iso2:"UY",default_name:"Uruguay",country_codes:[{country_code:"598",patterns:["X XXX XXXX"]}]},{iso2:"UZ",default_name:"Uzbekistan",country_codes:[{country_code:"998",patterns:["XX XXX XX XX"]}]},{iso2:"VC",default_name:"Saint Vincent & the Grenadines",country_codes:[{country_code:"1784",patterns:["XXX XXXX"]}]},{iso2:"VE",default_name:"Venezuela",country_codes:[{country_code:"58",patterns:["XXX XXX XXXX"]}]},{iso2:"VG",default_name:"British Virgin Islands",country_codes:[{country_code:"1284",patterns:["XXX XXXX"]}]},{iso2:"VI",default_name:"US Virgin Islands",country_codes:[{country_code:"1340",patterns:["XXX XXXX"]}]},{iso2:"VN",default_name:"Vietnam",country_codes:[{country_code:"84"}]},{iso2:"VU",default_name:"Vanuatu",country_codes:[{country_code:"678"}]},{iso2:"WF",default_name:"Wallis & Futuna",country_codes:[{country_code:"681"}]},{iso2:"WS",default_name:"Samoa",country_codes:[{country_code:"685"}]},{iso2:"XK",default_name:"Kosovo",country_codes:[{country_code:"383",patterns:["XXXX XXXX"]}]},{iso2:"YE",default_name:"Yemen",country_codes:[{country_code:"967",patterns:["XXX XXX XXX"]}]},{iso2:"ZA",default_name:"South Africa",country_codes:[{country_code:"27",patterns:["XX XXX XXXX"]}]},{iso2:"ZM",default_name:"Zambia",country_codes:[{country_code:"260",patterns:["XX XXX XXXX"]}]},{iso2:"ZW",default_name:"Zimbabwe",country_codes:[{country_code:"263",patterns:["XX XXX XXXX"]}]}],hash:0}}}]); -//# sourceMappingURL=8.0544e00385e42a07883b.chunk.js.map \ No newline at end of file diff --git a/public/8.0544e00385e42a07883b.chunk.js.map b/public/8.0544e00385e42a07883b.chunk.js.map deleted file mode 100644 index c8446c4f..00000000 --- a/public/8.0544e00385e42a07883b.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"8.0544e00385e42a07883b.chunk.js","mappings":"uHAQA,MAoCA,EApCuD,CACrDA,EAAG,qBACHC,UAAW,CAAC,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,uBAAwB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,cAAe,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,oBAAqB,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,QAAS,CAAC,KAAO,KAAM,aAAe,iBAAkB,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,uBAAwB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,eAAgB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,oBAAqB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,iCAAkC,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,oBAAqB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,IAAK,SAAW,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,oBAAqB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,uBAAwB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,eAAgB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,cAAe,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,gBAAkB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,oBAAqB,CAAC,KAAO,KAAM,aAAe,eAAgB,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,oBAAqB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,OAAQ,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,QAAS,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,iBAAkB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,eAAgB,cAAe,cAAe,kBAAmB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,iBAAkB,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,aAAc,CAAC,aAAe,OAAQ,SAAW,CAAC,aAAc,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,OAAQ,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,mBAAoB,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,gBAAiB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,cAAe,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,oBAAqB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,iBAAkB,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,gBAAiB,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,cAAe,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,oBAAqB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,OAAQ,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,gBAAiB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,eAAgB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,OAAQ,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,OAAQ,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,sBAAuB,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,cAAe,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,cAAe,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,iBAAkB,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,IAAK,SAAW,CAAC,IAAK,KAAM,SAAW,CAAC,oBAAqB,CAAC,KAAO,KAAM,aAAe,OAAQ,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,oBAAqB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,cAAe,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,gBAAiB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,mBAAoB,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,kBAAmB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,OAAQ,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,QAAS,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,2BAA4B,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,QAAS,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,gBAAiB,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,iBAAkB,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,cAAe,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,gBAAiB,oBAAqB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,OAAQ,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,cAAe,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,OAAQ,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,OAAQ,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,mBAAoB,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,mBAAoB,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,cAAe,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,0BAA2B,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,cAAe,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,aAAc,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,qBAAsB,cAAgB,CAAC,CAAC,aAAe,IAAK,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,eAAgB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,kBAAmB,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,eAAgB,cAAgB,CAAC,CAAC,aAAe,OAAQ,CAAC,aAAe,MAAO,SAAW,CAAC,aAAc,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,eAAgB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,cAAe,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,sBAAuB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,cAAe,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,eAAgB,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,yBAA0B,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,OAAQ,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,OAAQ,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,cAAe,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,eAAgB,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,oBAAqB,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,MAAO,cAAgB,CAAC,CAAC,aAAe,IAAK,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,iBAAkB,CAAC,KAAO,KAAM,aAAe,aAAc,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,iCAAkC,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,YAAa,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,mBAAoB,CAAC,KAAO,KAAM,aAAe,yBAA0B,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,oBAAqB,cAAgB,CAAC,CAAC,aAAe,OAAQ,SAAW,CAAC,eAAgB,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,QAAS,CAAC,KAAO,KAAM,aAAe,UAAW,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,kBAAmB,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,SAAU,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,gBAAiB,CAAC,KAAO,KAAM,aAAe,QAAS,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,eAAgB,cAAgB,CAAC,CAAC,aAAe,KAAM,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,SAAU,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,kBAAmB,CAAC,KAAO,KAAM,aAAe,WAAY,cAAgB,CAAC,CAAC,aAAe,MAAO,SAAW,CAAC,mBAC76xBC,KAAM","sources":["webpack://tweb/./src/countries.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {HelpCountriesList} from './layer';\n\nconst Countries: HelpCountriesList.helpCountriesList = {\n _: 'help.countriesList',\n countries: [{'iso2':'AD', 'default_name':'Andorra', 'country_codes':[{'country_code':'376', 'patterns':['XX XX XX']}]}, {'iso2':'AE', 'default_name':'United Arab Emirates', 'country_codes':[{'country_code':'971', 'patterns':['XX XXX XXXX']}]}, {'iso2':'AF', 'default_name':'Afghanistan', 'country_codes':[{'country_code':'93', 'patterns':['XXX XXX XXX']}]}, {'iso2':'AG', 'default_name':'Antigua & Barbuda', 'country_codes':[{'country_code':'1268', 'patterns':['XXX XXXX']}]}, {'iso2':'AI', 'default_name':'Anguilla', 'country_codes':[{'country_code':'1264', 'patterns':['XXX XXXX']}]}, {'iso2':'AL', 'default_name':'Albania', 'country_codes':[{'country_code':'355', 'patterns':['XX XXX XXXX']}]}, {'iso2':'AM', 'default_name':'Armenia', 'country_codes':[{'country_code':'374', 'patterns':['XX XXX XXX']}]}, {'iso2':'AO', 'default_name':'Angola', 'country_codes':[{'country_code':'244', 'patterns':['XXX XXX XXX']}]}, {'iso2':'AR', 'default_name':'Argentina', 'country_codes':[{'country_code':'54'}]}, {'iso2':'AS', 'default_name':'American Samoa', 'country_codes':[{'country_code':'1684', 'patterns':['XXX XXXX']}]}, {'iso2':'AT', 'default_name':'Austria', 'country_codes':[{'country_code':'43', 'patterns':['X XXXXXXXX']}]}, {'iso2':'AU', 'default_name':'Australia', 'country_codes':[{'country_code':'61', 'patterns':['X XXXX XXXX']}]}, {'iso2':'AW', 'default_name':'Aruba', 'country_codes':[{'country_code':'297', 'patterns':['XXX XXXX']}]}, {'iso2':'AZ', 'default_name':'Azerbaijan', 'country_codes':[{'country_code':'994', 'patterns':['XX XXX XXXX']}]}, {'iso2':'BA', 'default_name':'Bosnia & Herzegovina', 'country_codes':[{'country_code':'387', 'patterns':['XX XXX XXX']}]}, {'iso2':'BB', 'default_name':'Barbados', 'country_codes':[{'country_code':'1246', 'patterns':['XXX XXXX']}]}, {'iso2':'BD', 'default_name':'Bangladesh', 'country_codes':[{'country_code':'880', 'patterns':['XX XXX XXX']}]}, {'iso2':'BE', 'default_name':'Belgium', 'country_codes':[{'country_code':'32', 'patterns':['XXX XX XX XX']}]}, {'iso2':'BF', 'default_name':'Burkina Faso', 'country_codes':[{'country_code':'226', 'patterns':['XX XX XX XX']}]}, {'iso2':'BG', 'default_name':'Bulgaria', 'country_codes':[{'country_code':'359'}]}, {'iso2':'BH', 'default_name':'Bahrain', 'country_codes':[{'country_code':'973', 'patterns':['XXXX XXXX']}]}, {'iso2':'BI', 'default_name':'Burundi', 'country_codes':[{'country_code':'257', 'patterns':['XX XX XXXX']}]}, {'iso2':'BJ', 'default_name':'Benin', 'country_codes':[{'country_code':'229', 'patterns':['XX XXX XXX']}]}, {'iso2':'BM', 'default_name':'Bermuda', 'country_codes':[{'country_code':'1441', 'patterns':['XXX XXXX']}]}, {'iso2':'BN', 'default_name':'Brunei Darussalam', 'country_codes':[{'country_code':'673', 'patterns':['XXX XXXX']}]}, {'iso2':'BO', 'default_name':'Bolivia', 'country_codes':[{'country_code':'591', 'patterns':['X XXX XXXX']}]}, {'iso2':'BQ', 'default_name':'Bonaire, Sint Eustatius & Saba', 'country_codes':[{'country_code':'599'}]}, {'iso2':'BR', 'default_name':'Brazil', 'country_codes':[{'country_code':'55', 'patterns':['XX XXXXX XXXX']}]}, {'iso2':'BS', 'default_name':'Bahamas', 'country_codes':[{'country_code':'1242', 'patterns':['XXX XXXX']}]}, {'iso2':'BT', 'default_name':'Bhutan', 'country_codes':[{'country_code':'975', 'patterns':['XX XXX XXX']}]}, {'iso2':'BW', 'default_name':'Botswana', 'country_codes':[{'country_code':'267', 'patterns':['XX XXX XXX']}]}, {'iso2':'BY', 'default_name':'Belarus', 'country_codes':[{'country_code':'375', 'patterns':['XX XXX XXXX']}]}, {'iso2':'BZ', 'default_name':'Belize', 'country_codes':[{'country_code':'501'}]}, {'iso2':'CA', 'default_name':'Canada', 'country_codes':[{'country_code':'1', 'prefixes':['403', '587', '780', '825', '236', '250', '604', '672', '778', '204', '431', '506', '709', '902', '782', '226', '249', '289', '343', '365', '416', '437', '519', '548', '613', '647', '705', '807', '905', '418', '438', '450', '514', '579', '581', '819', '873', '306', '639', '867'], 'patterns':['XXX XXX XXXX']}]}, {'iso2':'CD', 'default_name':'Congo (Dem. Rep.)', 'country_codes':[{'country_code':'243', 'patterns':['XX XXX XXXX']}]}, {'iso2':'CF', 'default_name':'Central African Rep.', 'country_codes':[{'country_code':'236', 'patterns':['XX XX XX XX']}]}, {'iso2':'CG', 'default_name':'Congo (Rep.)', 'country_codes':[{'country_code':'242', 'patterns':['XX XXX XXXX']}]}, {'iso2':'CH', 'default_name':'Switzerland', 'country_codes':[{'country_code':'41', 'patterns':['XX XXX XXXX']}]}, {'iso2':'CI', 'default_name':'Côte d\\'Ivoire', 'country_codes':[{'country_code':'225', 'patterns':['XX XX XX XXXX']}]}, {'iso2':'CK', 'default_name':'Cook Islands', 'country_codes':[{'country_code':'682'}]}, {'iso2':'CL', 'default_name':'Chile', 'country_codes':[{'country_code':'56', 'patterns':['X XXXX XXXX']}]}, {'iso2':'CM', 'default_name':'Cameroon', 'country_codes':[{'country_code':'237', 'patterns':['XXXX XXXX']}]}, {'iso2':'CN', 'default_name':'China', 'country_codes':[{'country_code':'86', 'patterns':['XXX XXXX XXXX']}]}, {'iso2':'CO', 'default_name':'Colombia', 'country_codes':[{'country_code':'57', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'CR', 'default_name':'Costa Rica', 'country_codes':[{'country_code':'506', 'patterns':['XXXX XXXX']}]}, {'iso2':'CU', 'default_name':'Cuba', 'country_codes':[{'country_code':'53', 'patterns':['X XXX XXXX']}]}, {'iso2':'CV', 'default_name':'Cape Verde', 'country_codes':[{'country_code':'238', 'patterns':['XXX XXXX']}]}, {'iso2':'CW', 'default_name':'Curaçao', 'country_codes':[{'country_code':'599', 'prefixes':['9']}]}, {'iso2':'CY', 'default_name':'Cyprus', 'country_codes':[{'country_code':'357', 'patterns':['XXXX XXXX']}]}, {'iso2':'CZ', 'default_name':'Czech Republic', 'country_codes':[{'country_code':'420', 'patterns':['XXX XXX XXX']}]}, {'iso2':'DE', 'default_name':'Germany', 'country_codes':[{'country_code':'49', 'patterns':['XXXX XXXXXXX', '16X XXXXXXX', '17X XXXXXXX', '3601 4198XX']}]}, {'iso2':'DJ', 'default_name':'Djibouti', 'country_codes':[{'country_code':'253', 'patterns':['XX XX XX XX']}]}, {'iso2':'DK', 'default_name':'Denmark', 'country_codes':[{'country_code':'45', 'patterns':['XXXX XXXX']}]}, {'iso2':'DM', 'default_name':'Dominica', 'country_codes':[{'country_code':'1767', 'patterns':['XXX XXXX']}]}, {'iso2':'DO', 'default_name':'Dominican Rep.', 'country_codes':[{'country_code':'1809', 'patterns':['XXX XXXX']}, {'country_code':'1829', 'patterns':['XXX XXXX']}, {'country_code':'1849', 'patterns':['XXX XXXX']}]}, {'iso2':'DZ', 'default_name':'Algeria', 'country_codes':[{'country_code':'213', 'patterns':['XXX XX XX XX']}]}, {'iso2':'EC', 'default_name':'Ecuador', 'country_codes':[{'country_code':'593', 'patterns':['XX XXX XXXX']}]}, {'iso2':'EE', 'default_name':'Estonia', 'country_codes':[{'country_code':'372', 'patterns':['XXXX XXXX']}]}, {'iso2':'EG', 'default_name':'Egypt', 'country_codes':[{'country_code':'20', 'patterns':['XX XXXX XXXX']}]}, {'iso2':'ER', 'default_name':'Eritrea', 'country_codes':[{'country_code':'291', 'patterns':['X XXX XXX']}]}, {'iso2':'ES', 'default_name':'Spain', 'country_codes':[{'country_code':'34', 'patterns':['XXX XXX XXX']}]}, {'iso2':'ET', 'default_name':'Ethiopia', 'country_codes':[{'country_code':'251', 'patterns':['XX XXX XXXX']}]}, {'iso2':'FI', 'default_name':'Finland', 'country_codes':[{'country_code':'358'}]}, {'iso2':'FJ', 'default_name':'Fiji', 'country_codes':[{'country_code':'679', 'patterns':['XXX XXXX']}]}, {'iso2':'FK', 'default_name':'Falkland Islands', 'country_codes':[{'country_code':'500'}]}, {'iso2':'FM', 'default_name':'Micronesia', 'country_codes':[{'country_code':'691'}]}, {'iso2':'FO', 'default_name':'Faroe Islands', 'country_codes':[{'country_code':'298', 'patterns':['XXX XXX']}]}, {'iso2':'FR', 'default_name':'France', 'country_codes':[{'country_code':'33', 'patterns':['X XX XX XX XX']}]}, {'iso2':'GA', 'default_name':'Gabon', 'country_codes':[{'country_code':'241', 'patterns':['X XX XX XX']}]}, {'iso2':'GB', 'default_name':'United Kingdom', 'country_codes':[{'country_code':'44', 'patterns':['XXXX XXXXXX']}]}, {'iso2':'GD', 'default_name':'Grenada', 'country_codes':[{'country_code':'1473', 'patterns':['XXX XXXX']}]}, {'iso2':'GE', 'default_name':'Georgia', 'country_codes':[{'country_code':'995', 'patterns':['XXX XXX XXX']}]}, {'iso2':'GF', 'default_name':'French Guiana', 'country_codes':[{'country_code':'594'}]}, {'iso2':'GH', 'default_name':'Ghana', 'country_codes':[{'country_code':'233', 'patterns':['XX XXX XXXX']}]}, {'iso2':'GI', 'default_name':'Gibraltar', 'country_codes':[{'country_code':'350', 'patterns':['XXXX XXXX']}]}, {'iso2':'GL', 'default_name':'Greenland', 'country_codes':[{'country_code':'299', 'patterns':['XXX XXX']}]}, {'iso2':'GM', 'default_name':'Gambia', 'country_codes':[{'country_code':'220', 'patterns':['XXX XXXX']}]}, {'iso2':'GN', 'default_name':'Guinea', 'country_codes':[{'country_code':'224', 'patterns':['XXX XXX XXX']}]}, {'iso2':'GP', 'default_name':'Guadeloupe', 'country_codes':[{'country_code':'590', 'patterns':['XXX XX XX XX']}]}, {'iso2':'GQ', 'default_name':'Equatorial Guinea', 'country_codes':[{'country_code':'240', 'patterns':['XXX XXX XXX']}]}, {'iso2':'GR', 'default_name':'Greece', 'country_codes':[{'country_code':'30', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'GT', 'default_name':'Guatemala', 'country_codes':[{'country_code':'502', 'patterns':['X XXX XXXX']}]}, {'iso2':'GU', 'default_name':'Guam', 'country_codes':[{'country_code':'1671', 'patterns':['XXX XXXX']}]}, {'iso2':'GW', 'default_name':'Guinea-Bissau', 'country_codes':[{'country_code':'245', 'patterns':['XXX XXXX']}]}, {'iso2':'GY', 'default_name':'Guyana', 'country_codes':[{'country_code':'592'}]}, {'iso2':'HK', 'default_name':'Hong Kong', 'country_codes':[{'country_code':'852', 'patterns':['X XXX XXXX']}]}, {'iso2':'HN', 'default_name':'Honduras', 'country_codes':[{'country_code':'504', 'patterns':['XXXX XXXX']}]}, {'iso2':'HR', 'default_name':'Croatia', 'country_codes':[{'country_code':'385', 'patterns':['XX XXX XXX']}]}, {'iso2':'HT', 'default_name':'Haiti', 'country_codes':[{'country_code':'509', 'patterns':['XXXX XXXX']}]}, {'iso2':'HU', 'default_name':'Hungary', 'country_codes':[{'country_code':'36', 'patterns':['XXX XXX XXX']}]}, {'iso2':'ID', 'default_name':'Indonesia', 'country_codes':[{'country_code':'62', 'patterns':['XXX XXXXXX']}]}, {'iso2':'IE', 'default_name':'Ireland', 'country_codes':[{'country_code':'353', 'patterns':['XX XXX XXXX']}]}, {'iso2':'IL', 'default_name':'Israel', 'country_codes':[{'country_code':'972', 'patterns':['XX XXX XXXX']}]}, {'iso2':'IN', 'default_name':'India', 'country_codes':[{'country_code':'91', 'patterns':['XXXXX XXXXX']}]}, {'iso2':'IO', 'default_name':'Diego Garcia', 'country_codes':[{'country_code':'246', 'patterns':['XXX XXXX']}]}, {'iso2':'IQ', 'default_name':'Iraq', 'country_codes':[{'country_code':'964', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'IR', 'default_name':'Iran', 'country_codes':[{'country_code':'98', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'IS', 'default_name':'Iceland', 'country_codes':[{'country_code':'354', 'patterns':['XXX XXXX']}]}, {'iso2':'IT', 'default_name':'Italy', 'country_codes':[{'country_code':'39', 'patterns':['XXX XXX XXX']}]}, {'iso2':'JM', 'default_name':'Jamaica', 'country_codes':[{'country_code':'1876', 'patterns':['XXX XXXX']}]}, {'iso2':'JO', 'default_name':'Jordan', 'country_codes':[{'country_code':'962', 'patterns':['X XXXX XXXX']}]}, {'iso2':'JP', 'default_name':'Japan', 'country_codes':[{'country_code':'81', 'patterns':['XX XXXX XXXX']}]}, {'iso2':'KE', 'default_name':'Kenya', 'country_codes':[{'country_code':'254', 'patterns':['XXX XXX XXX']}]}, {'iso2':'KG', 'default_name':'Kyrgyzstan', 'country_codes':[{'country_code':'996', 'patterns':['XXX XXXXXX']}]}, {'iso2':'KH', 'default_name':'Cambodia', 'country_codes':[{'country_code':'855', 'patterns':['XX XXX XXX']}]}, {'iso2':'KI', 'default_name':'Kiribati', 'country_codes':[{'country_code':'686', 'patterns':['XXXX XXXX']}]}, {'iso2':'KM', 'default_name':'Comoros', 'country_codes':[{'country_code':'269', 'patterns':['XXX XXXX']}]}, {'iso2':'KN', 'default_name':'Saint Kitts & Nevis', 'country_codes':[{'country_code':'1869', 'patterns':['XXX XXXX']}]}, {'iso2':'KP', 'default_name':'North Korea', 'country_codes':[{'country_code':'850'}]}, {'iso2':'KR', 'default_name':'South Korea', 'country_codes':[{'country_code':'82', 'patterns':['XX XXXX XXX']}]}, {'iso2':'KW', 'default_name':'Kuwait', 'country_codes':[{'country_code':'965', 'patterns':['XXXX XXXX']}]}, {'iso2':'KY', 'default_name':'Cayman Islands', 'country_codes':[{'country_code':'1345', 'patterns':['XXX XXXX']}]}, {'iso2':'KZ', 'default_name':'Kazakhstan', 'country_codes':[{'country_code':'7', 'prefixes':['6', '7'], 'patterns':['XXX XXX XX XX']}]}, {'iso2':'LA', 'default_name':'Laos', 'country_codes':[{'country_code':'856', 'patterns':['XX XX XXX XXX']}]}, {'iso2':'LB', 'default_name':'Lebanon', 'country_codes':[{'country_code':'961', 'patterns':['XX XXX XXX']}]}, {'iso2':'LC', 'default_name':'Saint Lucia', 'country_codes':[{'country_code':'1758', 'patterns':['XXX XXXX']}]}, {'iso2':'LI', 'default_name':'Liechtenstein', 'country_codes':[{'country_code':'423', 'patterns':['XXX XXXX']}]}, {'iso2':'LK', 'default_name':'Sri Lanka', 'country_codes':[{'country_code':'94', 'patterns':['XX XXX XXXX']}]}, {'iso2':'LR', 'default_name':'Liberia', 'country_codes':[{'country_code':'231', 'patterns':['XX XXX XXXX']}]}, {'iso2':'LS', 'default_name':'Lesotho', 'country_codes':[{'country_code':'266', 'patterns':['XX XXX XXX']}]}, {'iso2':'LT', 'default_name':'Lithuania', 'country_codes':[{'country_code':'370', 'patterns':['XXX XXXXX']}]}, {'iso2':'LU', 'default_name':'Luxembourg', 'country_codes':[{'country_code':'352', 'patterns':['XXX XXX XXX']}]}, {'iso2':'LV', 'default_name':'Latvia', 'country_codes':[{'country_code':'371', 'patterns':['XXX XXXXX']}]}, {'iso2':'LY', 'default_name':'Libya', 'country_codes':[{'country_code':'218', 'patterns':['XX XXX XXXX']}]}, {'iso2':'MA', 'default_name':'Morocco', 'country_codes':[{'country_code':'212', 'patterns':['XX XXX XXXX']}]}, {'iso2':'MC', 'default_name':'Monaco', 'country_codes':[{'country_code':'377', 'patterns':['XXXX XXXX']}]}, {'iso2':'MD', 'default_name':'Moldova', 'country_codes':[{'country_code':'373', 'patterns':['XX XXX XXX']}]}, {'iso2':'ME', 'default_name':'Montenegro', 'country_codes':[{'country_code':'382'}]}, {'iso2':'MG', 'default_name':'Madagascar', 'country_codes':[{'country_code':'261', 'patterns':['XX XX XXX XX']}]}, {'iso2':'MH', 'default_name':'Marshall Islands', 'country_codes':[{'country_code':'692'}]}, {'iso2':'MK', 'default_name':'North Macedonia', 'country_codes':[{'country_code':'389', 'patterns':['XX XXX XXX']}]}, {'iso2':'ML', 'default_name':'Mali', 'country_codes':[{'country_code':'223', 'patterns':['XXXX XXXX']}]}, {'iso2':'MM', 'default_name':'Myanmar', 'country_codes':[{'country_code':'95'}]}, {'iso2':'MN', 'default_name':'Mongolia', 'country_codes':[{'country_code':'976', 'patterns':['XX XX XXXX']}]}, {'iso2':'MO', 'default_name':'Macau', 'country_codes':[{'country_code':'853', 'patterns':['XXXX XXXX']}]}, {'iso2':'MP', 'default_name':'Northern Mariana Islands', 'country_codes':[{'country_code':'1670', 'patterns':['XXX XXXX']}]}, {'iso2':'MQ', 'default_name':'Martinique', 'country_codes':[{'country_code':'596'}]}, {'iso2':'MR', 'default_name':'Mauritania', 'country_codes':[{'country_code':'222', 'patterns':['XXXX XXXX']}]}, {'iso2':'MS', 'default_name':'Montserrat', 'country_codes':[{'country_code':'1664', 'patterns':['XXX XXXX']}]}, {'iso2':'MT', 'default_name':'Malta', 'country_codes':[{'country_code':'356', 'patterns':['XX XX XX XX']}]}, {'iso2':'MU', 'default_name':'Mauritius', 'country_codes':[{'country_code':'230', 'patterns':['XXXX XXXX']}]}, {'iso2':'MV', 'default_name':'Maldives', 'country_codes':[{'country_code':'960', 'patterns':['XXX XXXX']}]}, {'iso2':'MW', 'default_name':'Malawi', 'country_codes':[{'country_code':'265', 'patterns':['XX XXX XXXX']}]}, {'iso2':'MX', 'default_name':'Mexico', 'country_codes':[{'country_code':'52'}]}, {'iso2':'MY', 'default_name':'Malaysia', 'country_codes':[{'country_code':'60', 'patterns':['XX XXXX XXXX']}]}, {'iso2':'MZ', 'default_name':'Mozambique', 'country_codes':[{'country_code':'258', 'patterns':['XX XXX XXXX']}]}, {'iso2':'NA', 'default_name':'Namibia', 'country_codes':[{'country_code':'264', 'patterns':['XX XXX XXXX']}]}, {'iso2':'NC', 'default_name':'New Caledonia', 'country_codes':[{'country_code':'687'}]}, {'iso2':'NE', 'default_name':'Niger', 'country_codes':[{'country_code':'227', 'patterns':['XX XX XX XX']}]}, {'iso2':'NF', 'default_name':'Norfolk Island', 'country_codes':[{'country_code':'672'}]}, {'iso2':'NG', 'default_name':'Nigeria', 'country_codes':[{'country_code':'234', 'patterns':['XX XXXX XXXX']}]}, {'iso2':'NI', 'default_name':'Nicaragua', 'country_codes':[{'country_code':'505', 'patterns':['XXXX XXXX']}]}, {'iso2':'NL', 'default_name':'Netherlands', 'country_codes':[{'country_code':'31', 'patterns':['X XX XX XX XX', '97 XXXX XXXXX']}]}, {'iso2':'NO', 'default_name':'Norway', 'country_codes':[{'country_code':'47', 'patterns':['XXXX XXXX']}]}, {'iso2':'NP', 'default_name':'Nepal', 'country_codes':[{'country_code':'977', 'patterns':['XX XXXX XXXX']}]}, {'iso2':'NR', 'default_name':'Nauru', 'country_codes':[{'country_code':'674'}]}, {'iso2':'NU', 'default_name':'Niue', 'country_codes':[{'country_code':'683'}]}, {'iso2':'NZ', 'default_name':'New Zealand', 'country_codes':[{'country_code':'64', 'patterns':['XXXX XXXX']}]}, {'iso2':'OM', 'default_name':'Oman', 'country_codes':[{'country_code':'968', 'patterns':['XXXX XXXX']}]}, {'iso2':'PA', 'default_name':'Panama', 'country_codes':[{'country_code':'507', 'patterns':['XXXX XXXX']}]}, {'iso2':'PE', 'default_name':'Peru', 'country_codes':[{'country_code':'51', 'patterns':['XXX XXX XXX']}]}, {'iso2':'PF', 'default_name':'French Polynesia', 'country_codes':[{'country_code':'689'}]}, {'iso2':'PG', 'default_name':'Papua New Guinea', 'country_codes':[{'country_code':'675'}]}, {'iso2':'PH', 'default_name':'Philippines', 'country_codes':[{'country_code':'63', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'PK', 'default_name':'Pakistan', 'country_codes':[{'country_code':'92', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'PL', 'default_name':'Poland', 'country_codes':[{'country_code':'48', 'patterns':['XXX XXX XXX']}]}, {'iso2':'PM', 'default_name':'Saint Pierre & Miquelon', 'country_codes':[{'country_code':'508'}]}, {'iso2':'PR', 'default_name':'Puerto Rico', 'country_codes':[{'country_code':'1787', 'patterns':['XXX XXXX']}, {'country_code':'1939', 'patterns':['XXX XXXX']}]}, {'iso2':'PS', 'default_name':'Palestine', 'country_codes':[{'country_code':'970', 'patterns':['XXX XX XXXX']}]}, {'iso2':'PT', 'default_name':'Portugal', 'country_codes':[{'country_code':'351', 'patterns':['XXX XXX XXX']}]}, {'iso2':'PW', 'default_name':'Palau', 'country_codes':[{'country_code':'680'}]}, {'iso2':'PY', 'default_name':'Paraguay', 'country_codes':[{'country_code':'595', 'patterns':['XXX XXX XXX']}]}, {'iso2':'QA', 'default_name':'Qatar', 'country_codes':[{'country_code':'974', 'patterns':['XX XXX XXX']}]}, {'iso2':'RE', 'default_name':'Réunion', 'country_codes':[{'country_code':'262', 'patterns':['XXX XXX XXX']}]}, {'iso2':'RO', 'default_name':'Romania', 'country_codes':[{'country_code':'40', 'patterns':['XXX XXX XXX']}]}, {'iso2':'RS', 'default_name':'Serbia', 'country_codes':[{'country_code':'381', 'patterns':['XX XXX XXXX']}]}, {'iso2':'RU', 'default_name':'Russian Federation', 'country_codes':[{'country_code':'7', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'RW', 'default_name':'Rwanda', 'country_codes':[{'country_code':'250', 'patterns':['XXX XXX XXX']}]}, {'iso2':'SA', 'default_name':'Saudi Arabia', 'country_codes':[{'country_code':'966', 'patterns':['XX XXX XXXX']}]}, {'iso2':'SB', 'default_name':'Solomon Islands', 'country_codes':[{'country_code':'677'}]}, {'iso2':'SC', 'default_name':'Seychelles', 'country_codes':[{'country_code':'248', 'patterns':['X XX XX XX']}]}, {'iso2':'SD', 'default_name':'Sudan', 'country_codes':[{'country_code':'249', 'patterns':['XX XXX XXXX']}]}, {'iso2':'SE', 'default_name':'Sweden', 'country_codes':[{'country_code':'46', 'patterns':['XX XXX XXXX']}]}, {'iso2':'SG', 'default_name':'Singapore', 'country_codes':[{'country_code':'65', 'patterns':['XXXX XXXX']}]}, {'iso2':'SH', 'default_name':'Saint Helena', 'country_codes':[{'country_code':'247'}, {'country_code':'290', 'patterns':['XX XXX']}]}, {'iso2':'SI', 'default_name':'Slovenia', 'country_codes':[{'country_code':'386', 'patterns':['XX XXX XXX']}]}, {'iso2':'SK', 'default_name':'Slovakia', 'country_codes':[{'country_code':'421', 'patterns':['XXX XXX XXX']}]}, {'iso2':'SL', 'default_name':'Sierra Leone', 'country_codes':[{'country_code':'232', 'patterns':['XX XXX XXX']}]}, {'iso2':'SM', 'default_name':'San Marino', 'country_codes':[{'country_code':'378', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'SN', 'default_name':'Senegal', 'country_codes':[{'country_code':'221', 'patterns':['XX XXX XXXX']}]}, {'iso2':'SO', 'default_name':'Somalia', 'country_codes':[{'country_code':'252', 'patterns':['XX XXX XXX']}]}, {'iso2':'SR', 'default_name':'Suriname', 'country_codes':[{'country_code':'597', 'patterns':['XXX XXXX']}]}, {'iso2':'SS', 'default_name':'South Sudan', 'country_codes':[{'country_code':'211', 'patterns':['XX XXX XXXX']}]}, {'iso2':'ST', 'default_name':'São Tomé & Príncipe', 'country_codes':[{'country_code':'239', 'patterns':['XX XXXXX']}]}, {'iso2':'SV', 'default_name':'El Salvador', 'country_codes':[{'country_code':'503', 'patterns':['XXXX XXXX']}]}, {'iso2':'SX', 'default_name':'Sint Maarten', 'country_codes':[{'country_code':'1721', 'patterns':['XXX XXXX']}]}, {'iso2':'SY', 'default_name':'Syria', 'country_codes':[{'country_code':'963', 'patterns':['XXX XXX XXX']}]}, {'iso2':'SZ', 'default_name':'Eswatini', 'country_codes':[{'country_code':'268', 'patterns':['XXXX XXXX']}]}, {'iso2':'TC', 'default_name':'Turks & Caicos Islands', 'country_codes':[{'country_code':'1649', 'patterns':['XXX XXXX']}]}, {'iso2':'TD', 'default_name':'Chad', 'country_codes':[{'country_code':'235', 'patterns':['XX XX XX XX']}]}, {'iso2':'TG', 'default_name':'Togo', 'country_codes':[{'country_code':'228', 'patterns':['XX XXX XXX']}]}, {'iso2':'TH', 'default_name':'Thailand', 'country_codes':[{'country_code':'66', 'patterns':['X XXXX XXXX']}]}, {'iso2':'TJ', 'default_name':'Tajikistan', 'country_codes':[{'country_code':'992', 'patterns':['XX XXX XXXX']}]}, {'iso2':'TK', 'default_name':'Tokelau', 'country_codes':[{'country_code':'690'}]}, {'iso2':'TL', 'default_name':'Timor-Leste', 'country_codes':[{'country_code':'670'}]}, {'iso2':'TM', 'default_name':'Turkmenistan', 'country_codes':[{'country_code':'993', 'patterns':['XX XXXXXX']}]}, {'iso2':'TN', 'default_name':'Tunisia', 'country_codes':[{'country_code':'216', 'patterns':['XX XXX XXX']}]}, {'iso2':'TO', 'default_name':'Tonga', 'country_codes':[{'country_code':'676'}]}, {'iso2':'TR', 'default_name':'Turkey', 'country_codes':[{'country_code':'90', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'TT', 'default_name':'Trinidad & Tobago', 'country_codes':[{'country_code':'1868', 'patterns':['XXX XXXX']}]}, {'iso2':'TV', 'default_name':'Tuvalu', 'country_codes':[{'country_code':'688'}]}, {'iso2':'TW', 'default_name':'Taiwan', 'country_codes':[{'country_code':'886', 'patterns':['XXX XXX XXX']}]}, {'iso2':'TZ', 'default_name':'Tanzania', 'country_codes':[{'country_code':'255', 'patterns':['XX XXX XXXX']}]}, {'iso2':'UA', 'default_name':'Ukraine', 'country_codes':[{'country_code':'380', 'patterns':['XX XXX XX XX']}]}, {'iso2':'UG', 'default_name':'Uganda', 'country_codes':[{'country_code':'256', 'patterns':['XX XXX XXXX']}]}, {'iso2':'US', 'default_name':'USA', 'country_codes':[{'country_code':'1', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'UY', 'default_name':'Uruguay', 'country_codes':[{'country_code':'598', 'patterns':['X XXX XXXX']}]}, {'iso2':'UZ', 'default_name':'Uzbekistan', 'country_codes':[{'country_code':'998', 'patterns':['XX XXX XX XX']}]}, {'iso2':'VC', 'default_name':'Saint Vincent & the Grenadines', 'country_codes':[{'country_code':'1784', 'patterns':['XXX XXXX']}]}, {'iso2':'VE', 'default_name':'Venezuela', 'country_codes':[{'country_code':'58', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'VG', 'default_name':'British Virgin Islands', 'country_codes':[{'country_code':'1284', 'patterns':['XXX XXXX']}]}, {'iso2':'VI', 'default_name':'US Virgin Islands', 'country_codes':[{'country_code':'1340', 'patterns':['XXX XXXX']}]}, {'iso2':'VN', 'default_name':'Vietnam', 'country_codes':[{'country_code':'84'}]}, {'iso2':'VU', 'default_name':'Vanuatu', 'country_codes':[{'country_code':'678'}]}, {'iso2':'WF', 'default_name':'Wallis & Futuna', 'country_codes':[{'country_code':'681'}]}, {'iso2':'WS', 'default_name':'Samoa', 'country_codes':[{'country_code':'685'}]}, {'iso2':'XK', 'default_name':'Kosovo', 'country_codes':[{'country_code':'383', 'patterns':['XXXX XXXX']}]}, {'iso2':'YE', 'default_name':'Yemen', 'country_codes':[{'country_code':'967', 'patterns':['XXX XXX XXX']}]}, {'iso2':'ZA', 'default_name':'South Africa', 'country_codes':[{'country_code':'27', 'patterns':['XX XXX XXXX']}]}, {'iso2':'ZM', 'default_name':'Zambia', 'country_codes':[{'country_code':'260', 'patterns':['XX XXX XXXX']}]}, {'iso2':'ZW', 'default_name':'Zimbabwe', 'country_codes':[{'country_code':'263', 'patterns':['XX XXX XXXX']}]}] as any,\n hash: 0\n};\n\n/* const PhoneCodesMain: {[phoneCode: string]: Country} = {\n '1': Countries.find((c) => c.name === 'United States'),\n '44': Countries.find((c) => c.name === 'United Kingdom'),\n '61': Countries.find((c) => c.name === 'Australia'),\n '64': Countries.find((c) => c.name === 'New Zealand'),\n '246': Countries.find((c) => c.name === 'Diego Garcia'),\n '255': Countries.find((c) => c.name === 'Tanzania'),\n '262': Countries.find((c) => c.name === 'Reunion'),\n '500': Countries.find((c) => c.name === 'Falkland Islands'),\n '590': Countries.find((c) => c.name === 'Guadeloupe'),\n '672': Countries.find((c) => c.name === 'Norfolk Island'),\n '1 268': Countries.find((c) => c.name === 'Antigua & Barbuda'),\n}; */\n\n/*\nconst toInt = (str) => {\n return parseInt(str.replace(/ /g, ''));\n};\nvar arr = window.Countries.sort((a, b) => toInt(a.phoneCode) - toInt(b.phoneCode));\narr.forEach((el, idx) => {\n if(idx === (arr.length - 1)) {\n return;\n }\n\n if(toInt(arr[idx + 1].phoneCode) === toInt(el.phoneCode)) {\n console.log('duplicate', el, arr[idx + 1]);\n }\n});\n*/\n\nexport default Countries;\n"],"names":["_","countries","hash"],"sourceRoot":""} \ No newline at end of file diff --git a/public/8.47c82822a84234c722aa.chunk.js b/public/8.47c82822a84234c722aa.chunk.js new file mode 100644 index 00000000..1ffe719c --- /dev/null +++ b/public/8.47c82822a84234c722aa.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[8],{9179:(X,e,o)=>{o.r(e),o.d(e,{default:()=>t});const t={_:"help.countriesList",countries:[{iso2:"AD",default_name:"Andorra",country_codes:[{country_code:"376",patterns:["XX XX XX"]}]},{iso2:"AE",default_name:"United Arab Emirates",country_codes:[{country_code:"971",patterns:["XX XXX XXXX"]}]},{iso2:"AF",default_name:"Afghanistan",country_codes:[{country_code:"93",patterns:["XXX XXX XXX"]}]},{iso2:"AG",default_name:"Antigua & Barbuda",country_codes:[{country_code:"1268",patterns:["XXX XXXX"]}]},{iso2:"AI",default_name:"Anguilla",country_codes:[{country_code:"1264",patterns:["XXX XXXX"]}]},{iso2:"AL",default_name:"Albania",country_codes:[{country_code:"355",patterns:["XX XXX XXXX"]}]},{iso2:"AM",default_name:"Armenia",country_codes:[{country_code:"374",patterns:["XX XXX XXX"]}]},{iso2:"AO",default_name:"Angola",country_codes:[{country_code:"244",patterns:["XXX XXX XXX"]}]},{iso2:"AR",default_name:"Argentina",country_codes:[{_:"help.countryCode",flags:0,country_code:"54"}]},{iso2:"AS",default_name:"American Samoa",country_codes:[{country_code:"1684",patterns:["XXX XXXX"]}]},{iso2:"AT",default_name:"Austria",country_codes:[{country_code:"43",patterns:["XXX XXXXXX"]}]},{iso2:"AU",default_name:"Australia",country_codes:[{country_code:"61",patterns:["X XXXX XXXX"]}]},{iso2:"AW",default_name:"Aruba",country_codes:[{country_code:"297",patterns:["XXX XXXX"]}]},{iso2:"AZ",default_name:"Azerbaijan",country_codes:[{country_code:"994",patterns:["XX XXX XXXX"]}]},{iso2:"BA",default_name:"Bosnia & Herzegovina",country_codes:[{country_code:"387",patterns:["XX XXX XXX"]}]},{iso2:"BB",default_name:"Barbados",country_codes:[{country_code:"1246",patterns:["XXX XXXX"]}]},{iso2:"BD",default_name:"Bangladesh",country_codes:[{country_code:"880",patterns:["XX XXX XXX"]}]},{iso2:"BE",default_name:"Belgium",country_codes:[{country_code:"32",patterns:["XXX XX XX XX"]}]},{iso2:"BF",default_name:"Burkina Faso",country_codes:[{country_code:"226",patterns:["XX XX XX XX"]}]},{iso2:"BG",default_name:"Bulgaria",country_codes:[{_:"help.countryCode",flags:0,country_code:"359"}]},{iso2:"BH",default_name:"Bahrain",country_codes:[{country_code:"973",patterns:["XXXX XXXX"]}]},{iso2:"BI",default_name:"Burundi",country_codes:[{country_code:"257",patterns:["XX XX XXXX"]}]},{iso2:"BJ",default_name:"Benin",country_codes:[{country_code:"229",patterns:["XX XXX XXX"]}]},{iso2:"BM",default_name:"Bermuda",country_codes:[{country_code:"1441",patterns:["XXX XXXX"]}]},{iso2:"BN",default_name:"Brunei Darussalam",country_codes:[{country_code:"673",patterns:["XXX XXXX"]}]},{iso2:"BO",default_name:"Bolivia",country_codes:[{country_code:"591",patterns:["X XXX XXXX"]}]},{iso2:"BQ",default_name:"Bonaire, Sint Eustatius & Saba",country_codes:[{_:"help.countryCode",flags:0,country_code:"599"}]},{iso2:"BR",default_name:"Brazil",country_codes:[{country_code:"55",patterns:["XX XXXXX XXXX"]}]},{iso2:"BS",default_name:"Bahamas",country_codes:[{country_code:"1242",patterns:["XXX XXXX"]}]},{iso2:"BT",default_name:"Bhutan",country_codes:[{country_code:"975",patterns:["XX XXX XXX"]}]},{iso2:"BW",default_name:"Botswana",country_codes:[{country_code:"267",patterns:["XX XXX XXX"]}]},{iso2:"BY",default_name:"Belarus",country_codes:[{country_code:"375",patterns:["XX XXX XXXX"]}]},{iso2:"BZ",default_name:"Belize",country_codes:[{_:"help.countryCode",flags:0,country_code:"501"}]},{iso2:"CA",default_name:"Canada",country_codes:[{_:"help.countryCode",flags:3,country_code:"1",prefixes:["403","587","780","825","236","250","604","672","778","204","431","506","709","902","782","226","249","289","343","365","416","437","519","548","613","647","705","807","905","418","438","450","514","579","581","819","873","306","639","867"],patterns:["XXX XXX XXXX"]}]},{iso2:"CD",default_name:"Congo (Dem. Rep.)",country_codes:[{country_code:"243",patterns:["XX XXX XXXX"]}]},{iso2:"CF",default_name:"Central African Rep.",country_codes:[{country_code:"236",patterns:["XX XX XX XX"]}]},{iso2:"CG",default_name:"Congo (Rep.)",country_codes:[{country_code:"242",patterns:["XX XXX XXXX"]}]},{iso2:"CH",default_name:"Switzerland",country_codes:[{country_code:"41",patterns:["XX XXX XXXX"]}]},{iso2:"CI",default_name:'Côte d"Ivoire',country_codes:[{country_code:"225",patterns:["XX XX XX XXXX"]}]},{iso2:"CK",default_name:"Cook Islands",country_codes:[{_:"help.countryCode",flags:0,country_code:"682"}]},{iso2:"CL",default_name:"Chile",country_codes:[{country_code:"56",patterns:["X XXXX XXXX"]}]},{iso2:"CM",default_name:"Cameroon",country_codes:[{country_code:"237",patterns:["XXXX XXXX"]}]},{iso2:"CN",default_name:"China",country_codes:[{country_code:"86",patterns:["XXX XXXX XXXX"]}]},{iso2:"CO",default_name:"Colombia",country_codes:[{country_code:"57",patterns:["XXX XXX XXXX"]}]},{iso2:"CR",default_name:"Costa Rica",country_codes:[{country_code:"506",patterns:["XXXX XXXX"]}]},{iso2:"CU",default_name:"Cuba",country_codes:[{country_code:"53",patterns:["X XXX XXXX"]}]},{iso2:"CV",default_name:"Cape Verde",country_codes:[{country_code:"238",patterns:["XXX XXXX"]}]},{iso2:"CW",default_name:"Curaçao",country_codes:[{_:"help.countryCode",country_code:"599",prefixes:["9"]}]},{iso2:"CY",default_name:"Cyprus",country_codes:[{country_code:"357",patterns:["XXXX XXXX"]}]},{iso2:"CZ",default_name:"Czech Republic",country_codes:[{country_code:"420",patterns:["XXX XXX XXX"]}]},{iso2:"DE",default_name:"Germany",country_codes:[{_:"help.countryCode",country_code:"49",patterns:["XXXX XXXXXXX","16X XXXXXXX","17X XXXXXXX","3601 4198XX"]}]},{iso2:"DJ",default_name:"Djibouti",country_codes:[{country_code:"253",patterns:["XX XX XX XX"]}]},{iso2:"DK",default_name:"Denmark",country_codes:[{country_code:"45",patterns:["XXXX XXXX"]}]},{iso2:"DM",default_name:"Dominica",country_codes:[{country_code:"1767",patterns:["XXX XXXX"]}]},{iso2:"DO",default_name:"Dominican Rep.",country_codes:[{country_code:"1809",patterns:["XXX XXXX"]},{country_code:"1829",patterns:["XXX XXXX"]},{country_code:"1849",patterns:["XXX XXXX"]}]},{iso2:"DZ",default_name:"Algeria",country_codes:[{country_code:"213",patterns:["XXX XX XX XX"]}]},{iso2:"EC",default_name:"Ecuador",country_codes:[{country_code:"593",patterns:["XX XXX XXXX"]}]},{iso2:"EE",default_name:"Estonia",country_codes:[{country_code:"372",patterns:["XXXX XXX"]}]},{iso2:"EG",default_name:"Egypt",country_codes:[{country_code:"20",patterns:["XX XXXX XXXX"]}]},{iso2:"ER",default_name:"Eritrea",country_codes:[{country_code:"291",patterns:["X XXX XXX"]}]},{iso2:"ES",default_name:"Spain",country_codes:[{country_code:"34",patterns:["XXX XXX XXX"]}]},{iso2:"ET",default_name:"Ethiopia",country_codes:[{country_code:"251",patterns:["XX XXX XXX"]}]},{iso2:"FI",default_name:"Finland",country_codes:[{_:"help.countryCode",flags:0,country_code:"358"}]},{iso2:"FJ",default_name:"Fiji",country_codes:[{country_code:"679",patterns:["XXX XXXX"]}]},{iso2:"FK",default_name:"Falkland Islands",country_codes:[{_:"help.countryCode",flags:0,country_code:"500"}]},{iso2:"FM",default_name:"Micronesia",country_codes:[{_:"help.countryCode",flags:0,country_code:"691"}]},{iso2:"FO",default_name:"Faroe Islands",country_codes:[{country_code:"298",patterns:["XXX XXX"]}]},{iso2:"FR",default_name:"France",country_codes:[{country_code:"33",patterns:["X XX XX XX XX"]}]},{iso2:"FT",default_name:"Anonymous Numbers",country_codes:[{country_code:"888",patterns:["8 XXX","XXXX XXXX"]}]},{iso2:"GA",default_name:"Gabon",country_codes:[{country_code:"241",patterns:["X XX XX XX"]}]},{iso2:"GB",default_name:"United Kingdom",country_codes:[{country_code:"44",patterns:["XXXX XXXXXX"]}]},{iso2:"GD",default_name:"Grenada",country_codes:[{country_code:"1473",patterns:["XXX XXXX"]}]},{iso2:"GE",default_name:"Georgia",country_codes:[{country_code:"995",patterns:["XXX XXX XXX"]}]},{iso2:"GF",default_name:"French Guiana",country_codes:[{_:"help.countryCode",flags:0,country_code:"594"}]},{iso2:"GH",default_name:"Ghana",country_codes:[{country_code:"233",patterns:["XX XXX XXXX"]}]},{iso2:"GI",default_name:"Gibraltar",country_codes:[{country_code:"350",patterns:["XXXX XXXX"]}]},{iso2:"GL",default_name:"Greenland",country_codes:[{country_code:"299",patterns:["XXX XXX"]}]},{iso2:"GM",default_name:"Gambia",country_codes:[{country_code:"220",patterns:["XXX XXXX"]}]},{iso2:"GN",default_name:"Guinea",country_codes:[{country_code:"224",patterns:["XXX XXX XXX"]}]},{iso2:"GP",default_name:"Guadeloupe",country_codes:[{country_code:"590",patterns:["XXX XX XX XX"]}]},{iso2:"GQ",default_name:"Equatorial Guinea",country_codes:[{country_code:"240",patterns:["XXX XXX XXX"]}]},{iso2:"GR",default_name:"Greece",country_codes:[{country_code:"30",patterns:["XXX XXX XXXX"]}]},{iso2:"GT",default_name:"Guatemala",country_codes:[{country_code:"502",patterns:["X XXX XXXX"]}]},{iso2:"GU",default_name:"Guam",country_codes:[{country_code:"1671",patterns:["XXX XXXX"]}]},{iso2:"GW",default_name:"Guinea-Bissau",country_codes:[{country_code:"245",patterns:["XXX XXXX"]}]},{iso2:"GY",default_name:"Guyana",country_codes:[{country_code:"592",patterns:["5926XXXXXX"]}]},{iso2:"HK",default_name:"Hong Kong",country_codes:[{country_code:"852",patterns:["X XXX XXXX"]}]},{iso2:"HN",default_name:"Honduras",country_codes:[{country_code:"504",patterns:["XXXX XXXX"]}]},{iso2:"HR",default_name:"Croatia",country_codes:[{country_code:"385",patterns:["XX XXX XXX"]}]},{iso2:"HT",default_name:"Haiti",country_codes:[{country_code:"509",patterns:["XXXX XXXX"]}]},{iso2:"HU",default_name:"Hungary",country_codes:[{country_code:"36",patterns:["XXX XXX XXX"]}]},{iso2:"ID",default_name:"Indonesia",country_codes:[{country_code:"62",patterns:["XXX XXXXXX"]}]},{iso2:"IE",default_name:"Ireland",country_codes:[{country_code:"353",patterns:["XX XXX XXXX"]}]},{iso2:"IL",default_name:"Israel",country_codes:[{country_code:"972",patterns:["XX XXX XXXX"]}]},{iso2:"IN",default_name:"India",country_codes:[{country_code:"91",patterns:["XXXXX XXXXX"]}]},{iso2:"IO",default_name:"Diego Garcia",country_codes:[{country_code:"246",patterns:["XXX XXXX"]}]},{iso2:"IQ",default_name:"Iraq",country_codes:[{country_code:"964",patterns:["XXX XXX XXXX"]}]},{iso2:"IR",default_name:"Iran",country_codes:[{country_code:"98",patterns:["XXX XXX XXXX"]}]},{iso2:"IS",default_name:"Iceland",country_codes:[{country_code:"354",patterns:["XXX XXXX"]}]},{iso2:"IT",default_name:"Italy",country_codes:[{country_code:"39",patterns:["XXX XXX XXXX"]}]},{iso2:"JM",default_name:"Jamaica",country_codes:[{country_code:"1876",patterns:["XXX XXXX"]}]},{iso2:"JO",default_name:"Jordan",country_codes:[{country_code:"962",patterns:["X XXXX XXXX"]}]},{iso2:"JP",default_name:"Japan",country_codes:[{country_code:"81",patterns:["XX XXXX XXXX"]}]},{iso2:"KE",default_name:"Kenya",country_codes:[{country_code:"254",patterns:["XXX XXX XXX"]}]},{iso2:"KG",default_name:"Kyrgyzstan",country_codes:[{country_code:"996",patterns:["XXX XXXXXX"]}]},{iso2:"KH",default_name:"Cambodia",country_codes:[{country_code:"855",patterns:["XX XXX XXX"]}]},{iso2:"KI",default_name:"Kiribati",country_codes:[{country_code:"686",patterns:["XXXX XXXX"]}]},{iso2:"KM",default_name:"Comoros",country_codes:[{country_code:"269",patterns:["XXX XXXX"]}]},{iso2:"KN",default_name:"Saint Kitts & Nevis",country_codes:[{country_code:"1869",patterns:["XXX XXXX"]}]},{iso2:"KP",default_name:"North Korea",country_codes:[{_:"help.countryCode",flags:0,country_code:"850"}]},{iso2:"KR",default_name:"South Korea",country_codes:[{country_code:"82",patterns:["XX XXXX XXX"]}]},{iso2:"KW",default_name:"Kuwait",country_codes:[{country_code:"965",patterns:["XXXX XXXX"]}]},{iso2:"KY",default_name:"Cayman Islands",country_codes:[{country_code:"1345",patterns:["XXX XXXX"]}]},{iso2:"KZ",default_name:"Kazakhstan",country_codes:[{_:"help.countryCode",flags:3,country_code:"7",prefixes:["6","7"],patterns:["XXX XXX XX XX"]}]},{iso2:"LA",default_name:"Laos",country_codes:[{country_code:"856",patterns:["XX XX XXX XXX"]}]},{iso2:"LB",default_name:"Lebanon",country_codes:[{_:"help.countryCode",flags:0,country_code:"961"}]},{iso2:"LC",default_name:"Saint Lucia",country_codes:[{country_code:"1758",patterns:["XXX XXXX"]}]},{iso2:"LI",default_name:"Liechtenstein",country_codes:[{country_code:"423",patterns:["XXX XXXX"]}]},{iso2:"LK",default_name:"Sri Lanka",country_codes:[{country_code:"94",patterns:["XX XXX XXXX"]}]},{iso2:"LR",default_name:"Liberia",country_codes:[{country_code:"231",patterns:["XX XXX XXXX"]}]},{iso2:"LS",default_name:"Lesotho",country_codes:[{country_code:"266",patterns:["XX XXX XXX"]}]},{iso2:"LT",default_name:"Lithuania",country_codes:[{country_code:"370",patterns:["XXX XXXXX"]}]},{iso2:"LU",default_name:"Luxembourg",country_codes:[{country_code:"352",patterns:["XXX XXX XXX"]}]},{iso2:"LV",default_name:"Latvia",country_codes:[{country_code:"371",patterns:["XXX XXXXX"]}]},{iso2:"LY",default_name:"Libya",country_codes:[{country_code:"218",patterns:["XX XXX XXXX"]}]},{iso2:"MA",default_name:"Morocco",country_codes:[{country_code:"212",patterns:["XX XXX XXXX"]}]},{iso2:"MC",default_name:"Monaco",country_codes:[{country_code:"377",patterns:["XXXX XXXX"]}]},{iso2:"MD",default_name:"Moldova",country_codes:[{country_code:"373",patterns:["XX XXX XXX"]}]},{iso2:"ME",default_name:"Montenegro",country_codes:[{_:"help.countryCode",flags:0,country_code:"382"}]},{iso2:"MG",default_name:"Madagascar",country_codes:[{country_code:"261",patterns:["XX XX XXX XX"]}]},{iso2:"MH",default_name:"Marshall Islands",country_codes:[{_:"help.countryCode",flags:0,country_code:"692"}]},{iso2:"MK",default_name:"North Macedonia",country_codes:[{country_code:"389",patterns:["XX XXXXXX"]}]},{iso2:"ML",default_name:"Mali",country_codes:[{country_code:"223",patterns:["XXXX XXXX"]}]},{iso2:"MM",default_name:"Myanmar",country_codes:[{_:"help.countryCode",flags:0,country_code:"95"}]},{iso2:"MN",default_name:"Mongolia",country_codes:[{country_code:"976",patterns:["XX XX XXXX"]}]},{iso2:"MO",default_name:"Macau",country_codes:[{country_code:"853",patterns:["XXXX XXXX"]}]},{iso2:"MP",default_name:"Northern Mariana Islands",country_codes:[{country_code:"1670",patterns:["XXX XXXX"]}]},{iso2:"MQ",default_name:"Martinique",country_codes:[{_:"help.countryCode",flags:0,country_code:"596"}]},{iso2:"MR",default_name:"Mauritania",country_codes:[{country_code:"222",patterns:["XXXX XXXX"]}]},{iso2:"MS",default_name:"Montserrat",country_codes:[{country_code:"1664",patterns:["XXX XXXX"]}]},{iso2:"MT",default_name:"Malta",country_codes:[{country_code:"356",patterns:["XX XX XX XX"]}]},{iso2:"MU",default_name:"Mauritius",country_codes:[{country_code:"230",patterns:["XXXX XXXX"]}]},{iso2:"MV",default_name:"Maldives",country_codes:[{country_code:"960",patterns:["XXX XXXX"]}]},{iso2:"MW",default_name:"Malawi",country_codes:[{country_code:"265",patterns:["XX XXX XXXX"]}]},{iso2:"MX",default_name:"Mexico",country_codes:[{_:"help.countryCode",flags:0,country_code:"52"}]},{iso2:"MY",default_name:"Malaysia",country_codes:[{_:"help.countryCode",flags:0,country_code:"60"}]},{iso2:"MZ",default_name:"Mozambique",country_codes:[{country_code:"258",patterns:["XX XXX XXXX"]}]},{iso2:"NA",default_name:"Namibia",country_codes:[{country_code:"264",patterns:["XX XXX XXXX"]}]},{iso2:"NC",default_name:"New Caledonia",country_codes:[{_:"help.countryCode",flags:0,country_code:"687"}]},{iso2:"NE",default_name:"Niger",country_codes:[{country_code:"227",patterns:["XX XX XX XX"]}]},{iso2:"NF",default_name:"Norfolk Island",country_codes:[{_:"help.countryCode",flags:0,country_code:"672"}]},{iso2:"NG",default_name:"Nigeria",country_codes:[{country_code:"234",patterns:["XX XXXX XXXX"]}]},{iso2:"NI",default_name:"Nicaragua",country_codes:[{country_code:"505",patterns:["XXXX XXXX"]}]},{iso2:"NL",default_name:"Netherlands",country_codes:[{country_code:"31",patterns:["X XX XX XX XX"]}]},{iso2:"NO",default_name:"Norway",country_codes:[{country_code:"47",patterns:["XXX XX XXX"]}]},{iso2:"NP",default_name:"Nepal",country_codes:[{country_code:"977",patterns:["XX XXXX XXXX"]}]},{iso2:"NR",default_name:"Nauru",country_codes:[{_:"help.countryCode",flags:0,country_code:"674"}]},{iso2:"NU",default_name:"Niue",country_codes:[{_:"help.countryCode",flags:0,country_code:"683"}]},{iso2:"NZ",default_name:"New Zealand",country_codes:[{country_code:"64",patterns:["XXXX XXXX"]}]},{iso2:"OM",default_name:"Oman",country_codes:[{country_code:"968",patterns:["XXXX XXXX"]}]},{iso2:"PA",default_name:"Panama",country_codes:[{country_code:"507",patterns:["XXXX XXXX"]}]},{iso2:"PE",default_name:"Peru",country_codes:[{country_code:"51",patterns:["XXX XXX XXX"]}]},{iso2:"PF",default_name:"French Polynesia",country_codes:[{_:"help.countryCode",flags:0,country_code:"689"}]},{iso2:"PG",default_name:"Papua New Guinea",country_codes:[{_:"help.countryCode",flags:0,country_code:"675"}]},{iso2:"PH",default_name:"Philippines",country_codes:[{country_code:"63",patterns:["XXX XXX XXXX"]}]},{iso2:"PK",default_name:"Pakistan",country_codes:[{country_code:"92",patterns:["XXX XXX XXXX"]}]},{iso2:"PL",default_name:"Poland",country_codes:[{country_code:"48",patterns:["XXX XXX XXX"]}]},{iso2:"PM",default_name:"Saint Pierre & Miquelon",country_codes:[{_:"help.countryCode",flags:0,country_code:"508"}]},{iso2:"PR",default_name:"Puerto Rico",country_codes:[{country_code:"1787",patterns:["XXX XXXX"]},{country_code:"1939",patterns:["XXX XXXX"]}]},{iso2:"PS",default_name:"Palestine",country_codes:[{country_code:"970",patterns:["XXX XX XXXX"]}]},{iso2:"PT",default_name:"Portugal",country_codes:[{country_code:"351",patterns:["XXX XXX XXX"]}]},{iso2:"PW",default_name:"Palau",country_codes:[{_:"help.countryCode",flags:0,country_code:"680"}]},{iso2:"PY",default_name:"Paraguay",country_codes:[{country_code:"595",patterns:["XXX XXX XXX"]}]},{iso2:"QA",default_name:"Qatar",country_codes:[{country_code:"974",patterns:["XX XXX XXX"]}]},{iso2:"RE",default_name:"Réunion",country_codes:[{country_code:"262",patterns:["XXX XXX XXX"]}]},{iso2:"RO",default_name:"Romania",country_codes:[{country_code:"40",patterns:["XXX XXX XXX"]}]},{iso2:"RS",default_name:"Serbia",country_codes:[{country_code:"381",patterns:["XX XXX XXX"]}]},{iso2:"RU",default_name:"Russian Federation",country_codes:[{country_code:"7",patterns:["XXX XXX XXXX"]}]},{iso2:"RW",default_name:"Rwanda",country_codes:[{country_code:"250",patterns:["XXX XXX XXX"]}]},{iso2:"SA",default_name:"Saudi Arabia",country_codes:[{country_code:"966",patterns:["XX XXX XXXX"]}]},{iso2:"SB",default_name:"Solomon Islands",country_codes:[{_:"help.countryCode",flags:0,country_code:"677"}]},{iso2:"SC",default_name:"Seychelles",country_codes:[{country_code:"248",patterns:["X XX XX XX"]}]},{iso2:"SD",default_name:"Sudan",country_codes:[{country_code:"249",patterns:["XX XXX XXXX"]}]},{iso2:"SE",default_name:"Sweden",country_codes:[{country_code:"46",patterns:["XX XXX XXXX"]}]},{iso2:"SG",default_name:"Singapore",country_codes:[{country_code:"65",patterns:["XXXX XXXX"]}]},{iso2:"SH",default_name:"Saint Helena",country_codes:[{_:"help.countryCode",flags:0,country_code:"247"},{country_code:"290",patterns:["XX XXX"]}]},{iso2:"SI",default_name:"Slovenia",country_codes:[{country_code:"386",patterns:["XX XXX XXX"]}]},{iso2:"SK",default_name:"Slovakia",country_codes:[{country_code:"421",patterns:["XXX XXX XXX"]}]},{iso2:"SL",default_name:"Sierra Leone",country_codes:[{country_code:"232",patterns:["XX XXX XXX"]}]},{iso2:"SM",default_name:"San Marino",country_codes:[{_:"help.countryCode",flags:0,country_code:"378"}]},{iso2:"SN",default_name:"Senegal",country_codes:[{country_code:"221",patterns:["XX XXX XXXX"]}]},{iso2:"SO",default_name:"Somalia",country_codes:[{country_code:"252",patterns:["XX XXX XXX"]}]},{iso2:"SR",default_name:"Suriname",country_codes:[{country_code:"597",patterns:["XXX XXXX"]}]},{iso2:"SS",default_name:"South Sudan",country_codes:[{country_code:"211",patterns:["XX XXX XXXX"]}]},{iso2:"ST",default_name:"São Tomé & Príncipe",country_codes:[{country_code:"239",patterns:["XX XXXXX"]}]},{iso2:"SV",default_name:"El Salvador",country_codes:[{country_code:"503",patterns:["XXXX XXXX"]}]},{iso2:"SX",default_name:"Sint Maarten",country_codes:[{country_code:"1721",patterns:["XXX XXXX"]}]},{iso2:"SY",default_name:"Syria",country_codes:[{country_code:"963",patterns:["XXX XXX XXX"]}]},{iso2:"SZ",default_name:"Eswatini",country_codes:[{country_code:"268",patterns:["XXXX XXXX"]}]},{iso2:"TC",default_name:"Turks & Caicos Islands",country_codes:[{country_code:"1649",patterns:["XXX XXXX"]}]},{iso2:"TD",default_name:"Chad",country_codes:[{country_code:"235",patterns:["XX XX XX XX"]}]},{iso2:"TG",default_name:"Togo",country_codes:[{country_code:"228",patterns:["XX XXX XXX"]}]},{iso2:"TH",default_name:"Thailand",country_codes:[{country_code:"66",patterns:["X XXXX XXXX"]}]},{iso2:"TJ",default_name:"Tajikistan",country_codes:[{country_code:"992",patterns:["XX XXX XXXX"]}]},{iso2:"TK",default_name:"Tokelau",country_codes:[{_:"help.countryCode",flags:0,country_code:"690"}]},{iso2:"TL",default_name:"Timor-Leste",country_codes:[{_:"help.countryCode",flags:0,country_code:"670"}]},{iso2:"TM",default_name:"Turkmenistan",country_codes:[{country_code:"993",patterns:["XX XXXXXX"]}]},{iso2:"TN",default_name:"Tunisia",country_codes:[{country_code:"216",patterns:["XX XXX XXX"]}]},{iso2:"TO",default_name:"Tonga",country_codes:[{_:"help.countryCode",flags:0,country_code:"676"}]},{iso2:"TR",default_name:"Turkey",country_codes:[{country_code:"90",patterns:["XXX XXX XXXX"]}]},{iso2:"TT",default_name:"Trinidad & Tobago",country_codes:[{country_code:"1868",patterns:["XXX XXXX"]}]},{iso2:"TV",default_name:"Tuvalu",country_codes:[{_:"help.countryCode",flags:0,country_code:"688"}]},{iso2:"TW",default_name:"Taiwan",country_codes:[{country_code:"886",patterns:["XXX XXX XXX"]}]},{iso2:"TZ",default_name:"Tanzania",country_codes:[{country_code:"255",patterns:["XX XXX XXXX"]}]},{iso2:"UA",default_name:"Ukraine",country_codes:[{country_code:"380",patterns:["XX XXX XX XX"]}]},{iso2:"UG",default_name:"Uganda",country_codes:[{country_code:"256",patterns:["XX XXX XXXX"]}]},{iso2:"US",default_name:"USA",country_codes:[{country_code:"1",patterns:["XXX XXX XXXX"]}]},{iso2:"UY",default_name:"Uruguay",country_codes:[{country_code:"598",patterns:["X XXX XXXX"]}]},{iso2:"UZ",default_name:"Uzbekistan",country_codes:[{country_code:"998",patterns:["XX XXX XX XX"]}]},{iso2:"VC",default_name:"Saint Vincent & the Grenadines",country_codes:[{country_code:"1784",patterns:["XXX XXXX"]}]},{iso2:"VE",default_name:"Venezuela",country_codes:[{country_code:"58",patterns:["XXX XXX XXXX"]}]},{iso2:"VG",default_name:"British Virgin Islands",country_codes:[{country_code:"1284",patterns:["XXX XXXX"]}]},{iso2:"VI",default_name:"US Virgin Islands",country_codes:[{country_code:"1340",patterns:["XXX XXXX"]}]},{iso2:"VN",default_name:"Vietnam",country_codes:[{_:"help.countryCode",flags:0,country_code:"84"}]},{iso2:"VU",default_name:"Vanuatu",country_codes:[{_:"help.countryCode",flags:0,country_code:"678"}]},{iso2:"WF",default_name:"Wallis & Futuna",country_codes:[{_:"help.countryCode",flags:0,country_code:"681"}]},{iso2:"WS",default_name:"Samoa",country_codes:[{_:"help.countryCode",flags:0,country_code:"685"}]},{pFlags:{hidden:!0},iso2:"XG",default_name:"Global Mobile Satellite System",country_codes:[{_:"help.countryCode",flags:0,country_code:"881"}]},{iso2:"XK",default_name:"Kosovo",country_codes:[{country_code:"383",patterns:["XXXX XXXX"]}]},{pFlags:{hidden:!0},iso2:"XV",default_name:"International Networks",country_codes:[{_:"help.countryCode",flags:0,country_code:"882"},{_:"help.countryCode",flags:0,country_code:"883"}]},{iso2:"YE",default_name:"Yemen",country_codes:[{country_code:"967",patterns:["XXX XXX XXX"]}]},{pFlags:{hidden:!0},iso2:"YL",default_name:"Y-land",country_codes:[{_:"help.countryCode",country_code:"42",prefixes:["4","7"]}]},{iso2:"ZA",default_name:"South Africa",country_codes:[{country_code:"27",patterns:["XX XXX XXXX"]}]},{iso2:"ZM",default_name:"Zambia",country_codes:[{country_code:"260",patterns:["XX XXX XXXX"]}]},{iso2:"ZW",default_name:"Zimbabwe",country_codes:[{country_code:"263",patterns:["XX XXX XXXX"]}]}],hash:1451434695}}}]); +//# sourceMappingURL=8.47c82822a84234c722aa.chunk.js.map \ No newline at end of file diff --git a/public/8.47c82822a84234c722aa.chunk.js.map b/public/8.47c82822a84234c722aa.chunk.js.map new file mode 100644 index 00000000..cd6396c7 --- /dev/null +++ b/public/8.47c82822a84234c722aa.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"8.47c82822a84234c722aa.chunk.js","mappings":"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","sources":["webpack://tweb/./src/countries.ts"],"sourcesContent":["/*\n* https://github.com/morethanwords/tweb\n* Copyright (C) 2019-2021 Eduard Kuzmenko\n* https://github.com/morethanwords/tweb/blob/master/LICENSE\n*/\n\n/* eslint-disable quotes */\n/* eslint-disable comma-spacing */\n\nimport type {HelpCountriesList} from \"./layer\";\n\nconst Countries: HelpCountriesList.helpCountriesList = {\"_\":\"help.countriesList\",\"countries\":[{\"iso2\":\"AD\",\"default_name\":\"Andorra\",\"country_codes\":[{\"country_code\":\"376\",\"patterns\":[\"XX XX XX\"]}]},{\"iso2\":\"AE\",\"default_name\":\"United Arab Emirates\",\"country_codes\":[{\"country_code\":\"971\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AF\",\"default_name\":\"Afghanistan\",\"country_codes\":[{\"country_code\":\"93\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AG\",\"default_name\":\"Antigua & Barbuda\",\"country_codes\":[{\"country_code\":\"1268\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AI\",\"default_name\":\"Anguilla\",\"country_codes\":[{\"country_code\":\"1264\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AL\",\"default_name\":\"Albania\",\"country_codes\":[{\"country_code\":\"355\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AM\",\"default_name\":\"Armenia\",\"country_codes\":[{\"country_code\":\"374\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"AO\",\"default_name\":\"Angola\",\"country_codes\":[{\"country_code\":\"244\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AR\",\"default_name\":\"Argentina\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"54\"}]},{\"iso2\":\"AS\",\"default_name\":\"American Samoa\",\"country_codes\":[{\"country_code\":\"1684\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AT\",\"default_name\":\"Austria\",\"country_codes\":[{\"country_code\":\"43\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"AU\",\"default_name\":\"Australia\",\"country_codes\":[{\"country_code\":\"61\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"AW\",\"default_name\":\"Aruba\",\"country_codes\":[{\"country_code\":\"297\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AZ\",\"default_name\":\"Azerbaijan\",\"country_codes\":[{\"country_code\":\"994\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BA\",\"default_name\":\"Bosnia & Herzegovina\",\"country_codes\":[{\"country_code\":\"387\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BB\",\"default_name\":\"Barbados\",\"country_codes\":[{\"country_code\":\"1246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BD\",\"default_name\":\"Bangladesh\",\"country_codes\":[{\"country_code\":\"880\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BE\",\"default_name\":\"Belgium\",\"country_codes\":[{\"country_code\":\"32\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"BF\",\"default_name\":\"Burkina Faso\",\"country_codes\":[{\"country_code\":\"226\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"BG\",\"default_name\":\"Bulgaria\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"359\"}]},{\"iso2\":\"BH\",\"default_name\":\"Bahrain\",\"country_codes\":[{\"country_code\":\"973\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"BI\",\"default_name\":\"Burundi\",\"country_codes\":[{\"country_code\":\"257\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"BJ\",\"default_name\":\"Benin\",\"country_codes\":[{\"country_code\":\"229\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BM\",\"default_name\":\"Bermuda\",\"country_codes\":[{\"country_code\":\"1441\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BN\",\"default_name\":\"Brunei Darussalam\",\"country_codes\":[{\"country_code\":\"673\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BO\",\"default_name\":\"Bolivia\",\"country_codes\":[{\"country_code\":\"591\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"BQ\",\"default_name\":\"Bonaire, Sint Eustatius & Saba\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"599\"}]},{\"iso2\":\"BR\",\"default_name\":\"Brazil\",\"country_codes\":[{\"country_code\":\"55\",\"patterns\":[\"XX XXXXX XXXX\"]}]},{\"iso2\":\"BS\",\"default_name\":\"Bahamas\",\"country_codes\":[{\"country_code\":\"1242\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BT\",\"default_name\":\"Bhutan\",\"country_codes\":[{\"country_code\":\"975\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BW\",\"default_name\":\"Botswana\",\"country_codes\":[{\"country_code\":\"267\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BY\",\"default_name\":\"Belarus\",\"country_codes\":[{\"country_code\":\"375\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BZ\",\"default_name\":\"Belize\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"501\"}]},{\"iso2\":\"CA\",\"default_name\":\"Canada\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":3,\"country_code\":\"1\",\"prefixes\":[\"403\",\"587\",\"780\",\"825\",\"236\",\"250\",\"604\",\"672\",\"778\",\"204\",\"431\",\"506\",\"709\",\"902\",\"782\",\"226\",\"249\",\"289\",\"343\",\"365\",\"416\",\"437\",\"519\",\"548\",\"613\",\"647\",\"705\",\"807\",\"905\",\"418\",\"438\",\"450\",\"514\",\"579\",\"581\",\"819\",\"873\",\"306\",\"639\",\"867\"],\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CD\",\"default_name\":\"Congo (Dem. Rep.)\",\"country_codes\":[{\"country_code\":\"243\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CF\",\"default_name\":\"Central African Rep.\",\"country_codes\":[{\"country_code\":\"236\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"CG\",\"default_name\":\"Congo (Rep.)\",\"country_codes\":[{\"country_code\":\"242\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CH\",\"default_name\":\"Switzerland\",\"country_codes\":[{\"country_code\":\"41\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CI\",\"default_name\":\"Côte d\\\"Ivoire\",\"country_codes\":[{\"country_code\":\"225\",\"patterns\":[\"XX XX XX XXXX\"]}]},{\"iso2\":\"CK\",\"default_name\":\"Cook Islands\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"682\"}]},{\"iso2\":\"CL\",\"default_name\":\"Chile\",\"country_codes\":[{\"country_code\":\"56\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"CM\",\"default_name\":\"Cameroon\",\"country_codes\":[{\"country_code\":\"237\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CN\",\"default_name\":\"China\",\"country_codes\":[{\"country_code\":\"86\",\"patterns\":[\"XXX XXXX XXXX\"]}]},{\"iso2\":\"CO\",\"default_name\":\"Colombia\",\"country_codes\":[{\"country_code\":\"57\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CR\",\"default_name\":\"Costa Rica\",\"country_codes\":[{\"country_code\":\"506\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CU\",\"default_name\":\"Cuba\",\"country_codes\":[{\"country_code\":\"53\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"CV\",\"default_name\":\"Cape Verde\",\"country_codes\":[{\"country_code\":\"238\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"CW\",\"default_name\":\"Curaçao\",\"country_codes\":[{\"_\":\"help.countryCode\",\"country_code\":\"599\",\"prefixes\":[\"9\"]}]},{\"iso2\":\"CY\",\"default_name\":\"Cyprus\",\"country_codes\":[{\"country_code\":\"357\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CZ\",\"default_name\":\"Czech Republic\",\"country_codes\":[{\"country_code\":\"420\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"DE\",\"default_name\":\"Germany\",\"country_codes\":[{\"_\":\"help.countryCode\",\"country_code\":\"49\",\"patterns\":[\"XXXX XXXXXXX\",\"16X XXXXXXX\",\"17X XXXXXXX\",\"3601 4198XX\"]}]},{\"iso2\":\"DJ\",\"default_name\":\"Djibouti\",\"country_codes\":[{\"country_code\":\"253\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"DK\",\"default_name\":\"Denmark\",\"country_codes\":[{\"country_code\":\"45\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"DM\",\"default_name\":\"Dominica\",\"country_codes\":[{\"country_code\":\"1767\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DO\",\"default_name\":\"Dominican Rep.\",\"country_codes\":[{\"country_code\":\"1809\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1829\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1849\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DZ\",\"default_name\":\"Algeria\",\"country_codes\":[{\"country_code\":\"213\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"EC\",\"default_name\":\"Ecuador\",\"country_codes\":[{\"country_code\":\"593\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"EE\",\"default_name\":\"Estonia\",\"country_codes\":[{\"country_code\":\"372\",\"patterns\":[\"XXXX XXX\"]}]},{\"iso2\":\"EG\",\"default_name\":\"Egypt\",\"country_codes\":[{\"country_code\":\"20\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"ER\",\"default_name\":\"Eritrea\",\"country_codes\":[{\"country_code\":\"291\",\"patterns\":[\"X XXX XXX\"]}]},{\"iso2\":\"ES\",\"default_name\":\"Spain\",\"country_codes\":[{\"country_code\":\"34\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ET\",\"default_name\":\"Ethiopia\",\"country_codes\":[{\"country_code\":\"251\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"FI\",\"default_name\":\"Finland\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"358\"}]},{\"iso2\":\"FJ\",\"default_name\":\"Fiji\",\"country_codes\":[{\"country_code\":\"679\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"FK\",\"default_name\":\"Falkland Islands\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"500\"}]},{\"iso2\":\"FM\",\"default_name\":\"Micronesia\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"691\"}]},{\"iso2\":\"FO\",\"default_name\":\"Faroe Islands\",\"country_codes\":[{\"country_code\":\"298\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"FR\",\"default_name\":\"France\",\"country_codes\":[{\"country_code\":\"33\",\"patterns\":[\"X XX XX XX XX\"]}]},{\"iso2\":\"FT\",\"default_name\":\"Anonymous Numbers\",\"country_codes\":[{\"country_code\":\"888\",\"patterns\":[\"8 XXX\",\"XXXX XXXX\"]}]},{\"iso2\":\"GA\",\"default_name\":\"Gabon\",\"country_codes\":[{\"country_code\":\"241\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"GB\",\"default_name\":\"United Kingdom\",\"country_codes\":[{\"country_code\":\"44\",\"patterns\":[\"XXXX XXXXXX\"]}]},{\"iso2\":\"GD\",\"default_name\":\"Grenada\",\"country_codes\":[{\"country_code\":\"1473\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GE\",\"default_name\":\"Georgia\",\"country_codes\":[{\"country_code\":\"995\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GF\",\"default_name\":\"French Guiana\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"594\"}]},{\"iso2\":\"GH\",\"default_name\":\"Ghana\",\"country_codes\":[{\"country_code\":\"233\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"GI\",\"default_name\":\"Gibraltar\",\"country_codes\":[{\"country_code\":\"350\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"GL\",\"default_name\":\"Greenland\",\"country_codes\":[{\"country_code\":\"299\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"GM\",\"default_name\":\"Gambia\",\"country_codes\":[{\"country_code\":\"220\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GN\",\"default_name\":\"Guinea\",\"country_codes\":[{\"country_code\":\"224\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GP\",\"default_name\":\"Guadeloupe\",\"country_codes\":[{\"country_code\":\"590\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"GQ\",\"default_name\":\"Equatorial Guinea\",\"country_codes\":[{\"country_code\":\"240\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GR\",\"default_name\":\"Greece\",\"country_codes\":[{\"country_code\":\"30\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"GT\",\"default_name\":\"Guatemala\",\"country_codes\":[{\"country_code\":\"502\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"GU\",\"default_name\":\"Guam\",\"country_codes\":[{\"country_code\":\"1671\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GW\",\"default_name\":\"Guinea-Bissau\",\"country_codes\":[{\"country_code\":\"245\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GY\",\"default_name\":\"Guyana\",\"country_codes\":[{\"country_code\":\"592\",\"patterns\":[\"5926XXXXXX\"]}]},{\"iso2\":\"HK\",\"default_name\":\"Hong Kong\",\"country_codes\":[{\"country_code\":\"852\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"HN\",\"default_name\":\"Honduras\",\"country_codes\":[{\"country_code\":\"504\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HR\",\"default_name\":\"Croatia\",\"country_codes\":[{\"country_code\":\"385\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"HT\",\"default_name\":\"Haiti\",\"country_codes\":[{\"country_code\":\"509\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HU\",\"default_name\":\"Hungary\",\"country_codes\":[{\"country_code\":\"36\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ID\",\"default_name\":\"Indonesia\",\"country_codes\":[{\"country_code\":\"62\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"IE\",\"default_name\":\"Ireland\",\"country_codes\":[{\"country_code\":\"353\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IL\",\"default_name\":\"Israel\",\"country_codes\":[{\"country_code\":\"972\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IN\",\"default_name\":\"India\",\"country_codes\":[{\"country_code\":\"91\",\"patterns\":[\"XXXXX XXXXX\"]}]},{\"iso2\":\"IO\",\"default_name\":\"Diego Garcia\",\"country_codes\":[{\"country_code\":\"246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IQ\",\"default_name\":\"Iraq\",\"country_codes\":[{\"country_code\":\"964\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IR\",\"default_name\":\"Iran\",\"country_codes\":[{\"country_code\":\"98\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IS\",\"default_name\":\"Iceland\",\"country_codes\":[{\"country_code\":\"354\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IT\",\"default_name\":\"Italy\",\"country_codes\":[{\"country_code\":\"39\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"JM\",\"default_name\":\"Jamaica\",\"country_codes\":[{\"country_code\":\"1876\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"JO\",\"default_name\":\"Jordan\",\"country_codes\":[{\"country_code\":\"962\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"JP\",\"default_name\":\"Japan\",\"country_codes\":[{\"country_code\":\"81\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"KE\",\"default_name\":\"Kenya\",\"country_codes\":[{\"country_code\":\"254\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"KG\",\"default_name\":\"Kyrgyzstan\",\"country_codes\":[{\"country_code\":\"996\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"KH\",\"default_name\":\"Cambodia\",\"country_codes\":[{\"country_code\":\"855\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"KI\",\"default_name\":\"Kiribati\",\"country_codes\":[{\"country_code\":\"686\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KM\",\"default_name\":\"Comoros\",\"country_codes\":[{\"country_code\":\"269\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KN\",\"default_name\":\"Saint Kitts & Nevis\",\"country_codes\":[{\"country_code\":\"1869\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KP\",\"default_name\":\"North Korea\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"850\"}]},{\"iso2\":\"KR\",\"default_name\":\"South Korea\",\"country_codes\":[{\"country_code\":\"82\",\"patterns\":[\"XX XXXX XXX\"]}]},{\"iso2\":\"KW\",\"default_name\":\"Kuwait\",\"country_codes\":[{\"country_code\":\"965\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KY\",\"default_name\":\"Cayman Islands\",\"country_codes\":[{\"country_code\":\"1345\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KZ\",\"default_name\":\"Kazakhstan\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":3,\"country_code\":\"7\",\"prefixes\":[\"6\",\"7\"],\"patterns\":[\"XXX XXX XX XX\"]}]},{\"iso2\":\"LA\",\"default_name\":\"Laos\",\"country_codes\":[{\"country_code\":\"856\",\"patterns\":[\"XX XX XXX XXX\"]}]},{\"iso2\":\"LB\",\"default_name\":\"Lebanon\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"961\"}]},{\"iso2\":\"LC\",\"default_name\":\"Saint Lucia\",\"country_codes\":[{\"country_code\":\"1758\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LI\",\"default_name\":\"Liechtenstein\",\"country_codes\":[{\"country_code\":\"423\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LK\",\"default_name\":\"Sri Lanka\",\"country_codes\":[{\"country_code\":\"94\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LR\",\"default_name\":\"Liberia\",\"country_codes\":[{\"country_code\":\"231\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LS\",\"default_name\":\"Lesotho\",\"country_codes\":[{\"country_code\":\"266\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LT\",\"default_name\":\"Lithuania\",\"country_codes\":[{\"country_code\":\"370\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LU\",\"default_name\":\"Luxembourg\",\"country_codes\":[{\"country_code\":\"352\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"LV\",\"default_name\":\"Latvia\",\"country_codes\":[{\"country_code\":\"371\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LY\",\"default_name\":\"Libya\",\"country_codes\":[{\"country_code\":\"218\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MA\",\"default_name\":\"Morocco\",\"country_codes\":[{\"country_code\":\"212\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MC\",\"default_name\":\"Monaco\",\"country_codes\":[{\"country_code\":\"377\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MD\",\"default_name\":\"Moldova\",\"country_codes\":[{\"country_code\":\"373\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ME\",\"default_name\":\"Montenegro\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"382\"}]},{\"iso2\":\"MG\",\"default_name\":\"Madagascar\",\"country_codes\":[{\"country_code\":\"261\",\"patterns\":[\"XX XX XXX XX\"]}]},{\"iso2\":\"MH\",\"default_name\":\"Marshall Islands\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"692\"}]},{\"iso2\":\"MK\",\"default_name\":\"North Macedonia\",\"country_codes\":[{\"country_code\":\"389\",\"patterns\":[\"XX XXXXXX\"]}]},{\"iso2\":\"ML\",\"default_name\":\"Mali\",\"country_codes\":[{\"country_code\":\"223\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MM\",\"default_name\":\"Myanmar\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"95\"}]},{\"iso2\":\"MN\",\"default_name\":\"Mongolia\",\"country_codes\":[{\"country_code\":\"976\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"MO\",\"default_name\":\"Macau\",\"country_codes\":[{\"country_code\":\"853\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MP\",\"default_name\":\"Northern Mariana Islands\",\"country_codes\":[{\"country_code\":\"1670\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MQ\",\"default_name\":\"Martinique\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"596\"}]},{\"iso2\":\"MR\",\"default_name\":\"Mauritania\",\"country_codes\":[{\"country_code\":\"222\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MS\",\"default_name\":\"Montserrat\",\"country_codes\":[{\"country_code\":\"1664\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MT\",\"default_name\":\"Malta\",\"country_codes\":[{\"country_code\":\"356\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"MU\",\"default_name\":\"Mauritius\",\"country_codes\":[{\"country_code\":\"230\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MV\",\"default_name\":\"Maldives\",\"country_codes\":[{\"country_code\":\"960\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MW\",\"default_name\":\"Malawi\",\"country_codes\":[{\"country_code\":\"265\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MX\",\"default_name\":\"Mexico\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"52\"}]},{\"iso2\":\"MY\",\"default_name\":\"Malaysia\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"60\"}]},{\"iso2\":\"MZ\",\"default_name\":\"Mozambique\",\"country_codes\":[{\"country_code\":\"258\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NA\",\"default_name\":\"Namibia\",\"country_codes\":[{\"country_code\":\"264\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NC\",\"default_name\":\"New Caledonia\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"687\"}]},{\"iso2\":\"NE\",\"default_name\":\"Niger\",\"country_codes\":[{\"country_code\":\"227\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"NF\",\"default_name\":\"Norfolk Island\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"672\"}]},{\"iso2\":\"NG\",\"default_name\":\"Nigeria\",\"country_codes\":[{\"country_code\":\"234\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NI\",\"default_name\":\"Nicaragua\",\"country_codes\":[{\"country_code\":\"505\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NL\",\"default_name\":\"Netherlands\",\"country_codes\":[{\"country_code\":\"31\",\"patterns\":[\"X XX XX XX XX\"]}]},{\"iso2\":\"NO\",\"default_name\":\"Norway\",\"country_codes\":[{\"country_code\":\"47\",\"patterns\":[\"XXX XX XXX\"]}]},{\"iso2\":\"NP\",\"default_name\":\"Nepal\",\"country_codes\":[{\"country_code\":\"977\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NR\",\"default_name\":\"Nauru\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"674\"}]},{\"iso2\":\"NU\",\"default_name\":\"Niue\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"683\"}]},{\"iso2\":\"NZ\",\"default_name\":\"New Zealand\",\"country_codes\":[{\"country_code\":\"64\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"OM\",\"default_name\":\"Oman\",\"country_codes\":[{\"country_code\":\"968\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PA\",\"default_name\":\"Panama\",\"country_codes\":[{\"country_code\":\"507\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PE\",\"default_name\":\"Peru\",\"country_codes\":[{\"country_code\":\"51\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PF\",\"default_name\":\"French Polynesia\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"689\"}]},{\"iso2\":\"PG\",\"default_name\":\"Papua New Guinea\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"675\"}]},{\"iso2\":\"PH\",\"default_name\":\"Philippines\",\"country_codes\":[{\"country_code\":\"63\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PK\",\"default_name\":\"Pakistan\",\"country_codes\":[{\"country_code\":\"92\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PL\",\"default_name\":\"Poland\",\"country_codes\":[{\"country_code\":\"48\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PM\",\"default_name\":\"Saint Pierre & Miquelon\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"508\"}]},{\"iso2\":\"PR\",\"default_name\":\"Puerto Rico\",\"country_codes\":[{\"country_code\":\"1787\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1939\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"PS\",\"default_name\":\"Palestine\",\"country_codes\":[{\"country_code\":\"970\",\"patterns\":[\"XXX XX XXXX\"]}]},{\"iso2\":\"PT\",\"default_name\":\"Portugal\",\"country_codes\":[{\"country_code\":\"351\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PW\",\"default_name\":\"Palau\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"680\"}]},{\"iso2\":\"PY\",\"default_name\":\"Paraguay\",\"country_codes\":[{\"country_code\":\"595\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"QA\",\"default_name\":\"Qatar\",\"country_codes\":[{\"country_code\":\"974\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"RE\",\"default_name\":\"Réunion\",\"country_codes\":[{\"country_code\":\"262\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RO\",\"default_name\":\"Romania\",\"country_codes\":[{\"country_code\":\"40\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RS\",\"default_name\":\"Serbia\",\"country_codes\":[{\"country_code\":\"381\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"RU\",\"default_name\":\"Russian Federation\",\"country_codes\":[{\"country_code\":\"7\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"RW\",\"default_name\":\"Rwanda\",\"country_codes\":[{\"country_code\":\"250\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SA\",\"default_name\":\"Saudi Arabia\",\"country_codes\":[{\"country_code\":\"966\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SB\",\"default_name\":\"Solomon Islands\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"677\"}]},{\"iso2\":\"SC\",\"default_name\":\"Seychelles\",\"country_codes\":[{\"country_code\":\"248\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"SD\",\"default_name\":\"Sudan\",\"country_codes\":[{\"country_code\":\"249\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SE\",\"default_name\":\"Sweden\",\"country_codes\":[{\"country_code\":\"46\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SG\",\"default_name\":\"Singapore\",\"country_codes\":[{\"country_code\":\"65\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SH\",\"default_name\":\"Saint Helena\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"247\"},{\"country_code\":\"290\",\"patterns\":[\"XX XXX\"]}]},{\"iso2\":\"SI\",\"default_name\":\"Slovenia\",\"country_codes\":[{\"country_code\":\"386\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SK\",\"default_name\":\"Slovakia\",\"country_codes\":[{\"country_code\":\"421\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SL\",\"default_name\":\"Sierra Leone\",\"country_codes\":[{\"country_code\":\"232\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SM\",\"default_name\":\"San Marino\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"378\"}]},{\"iso2\":\"SN\",\"default_name\":\"Senegal\",\"country_codes\":[{\"country_code\":\"221\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SO\",\"default_name\":\"Somalia\",\"country_codes\":[{\"country_code\":\"252\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SR\",\"default_name\":\"Suriname\",\"country_codes\":[{\"country_code\":\"597\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SS\",\"default_name\":\"South Sudan\",\"country_codes\":[{\"country_code\":\"211\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ST\",\"default_name\":\"São Tomé & Príncipe\",\"country_codes\":[{\"country_code\":\"239\",\"patterns\":[\"XX XXXXX\"]}]},{\"iso2\":\"SV\",\"default_name\":\"El Salvador\",\"country_codes\":[{\"country_code\":\"503\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SX\",\"default_name\":\"Sint Maarten\",\"country_codes\":[{\"country_code\":\"1721\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SY\",\"default_name\":\"Syria\",\"country_codes\":[{\"country_code\":\"963\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SZ\",\"default_name\":\"Eswatini\",\"country_codes\":[{\"country_code\":\"268\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"TC\",\"default_name\":\"Turks & Caicos Islands\",\"country_codes\":[{\"country_code\":\"1649\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TD\",\"default_name\":\"Chad\",\"country_codes\":[{\"country_code\":\"235\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"TG\",\"default_name\":\"Togo\",\"country_codes\":[{\"country_code\":\"228\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TH\",\"default_name\":\"Thailand\",\"country_codes\":[{\"country_code\":\"66\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"TJ\",\"default_name\":\"Tajikistan\",\"country_codes\":[{\"country_code\":\"992\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"TK\",\"default_name\":\"Tokelau\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"690\"}]},{\"iso2\":\"TL\",\"default_name\":\"Timor-Leste\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"670\"}]},{\"iso2\":\"TM\",\"default_name\":\"Turkmenistan\",\"country_codes\":[{\"country_code\":\"993\",\"patterns\":[\"XX XXXXXX\"]}]},{\"iso2\":\"TN\",\"default_name\":\"Tunisia\",\"country_codes\":[{\"country_code\":\"216\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TO\",\"default_name\":\"Tonga\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"676\"}]},{\"iso2\":\"TR\",\"default_name\":\"Turkey\",\"country_codes\":[{\"country_code\":\"90\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"TT\",\"default_name\":\"Trinidad & Tobago\",\"country_codes\":[{\"country_code\":\"1868\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TV\",\"default_name\":\"Tuvalu\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"688\"}]},{\"iso2\":\"TW\",\"default_name\":\"Taiwan\",\"country_codes\":[{\"country_code\":\"886\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"TZ\",\"default_name\":\"Tanzania\",\"country_codes\":[{\"country_code\":\"255\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"UA\",\"default_name\":\"Ukraine\",\"country_codes\":[{\"country_code\":\"380\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"UG\",\"default_name\":\"Uganda\",\"country_codes\":[{\"country_code\":\"256\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"US\",\"default_name\":\"USA\",\"country_codes\":[{\"country_code\":\"1\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"UY\",\"default_name\":\"Uruguay\",\"country_codes\":[{\"country_code\":\"598\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"UZ\",\"default_name\":\"Uzbekistan\",\"country_codes\":[{\"country_code\":\"998\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"VC\",\"default_name\":\"Saint Vincent & the Grenadines\",\"country_codes\":[{\"country_code\":\"1784\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VE\",\"default_name\":\"Venezuela\",\"country_codes\":[{\"country_code\":\"58\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"VG\",\"default_name\":\"British Virgin Islands\",\"country_codes\":[{\"country_code\":\"1284\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VI\",\"default_name\":\"US Virgin Islands\",\"country_codes\":[{\"country_code\":\"1340\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VN\",\"default_name\":\"Vietnam\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"84\"}]},{\"iso2\":\"VU\",\"default_name\":\"Vanuatu\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"678\"}]},{\"iso2\":\"WF\",\"default_name\":\"Wallis & Futuna\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"681\"}]},{\"iso2\":\"WS\",\"default_name\":\"Samoa\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"685\"}]},{\"pFlags\":{\"hidden\":true},\"iso2\":\"XG\",\"default_name\":\"Global Mobile Satellite System\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"881\"}]},{\"iso2\":\"XK\",\"default_name\":\"Kosovo\",\"country_codes\":[{\"country_code\":\"383\",\"patterns\":[\"XXXX XXXX\"]}]},{\"pFlags\":{\"hidden\":true},\"iso2\":\"XV\",\"default_name\":\"International Networks\",\"country_codes\":[{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"882\"},{\"_\":\"help.countryCode\",\"flags\":0,\"country_code\":\"883\"}]},{\"iso2\":\"YE\",\"default_name\":\"Yemen\",\"country_codes\":[{\"country_code\":\"967\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"pFlags\":{\"hidden\":true},\"iso2\":\"YL\",\"default_name\":\"Y-land\",\"country_codes\":[{\"_\":\"help.countryCode\",\"country_code\":\"42\",\"prefixes\":[\"4\",\"7\"]}]},{\"iso2\":\"ZA\",\"default_name\":\"South Africa\",\"country_codes\":[{\"country_code\":\"27\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZM\",\"default_name\":\"Zambia\",\"country_codes\":[{\"country_code\":\"260\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZW\",\"default_name\":\"Zimbabwe\",\"country_codes\":[{\"country_code\":\"263\",\"patterns\":[\"XX XXX XXXX\"]}]}],\"hash\":1451434695} as HelpCountriesList.helpCountriesList;\n\n/* const PhoneCodesMain: {[phoneCode: string]: Country} = {\n \"1\": Countries.find((c) => c.name === \"United States\"),\n \"44\": Countries.find((c) => c.name === \"United Kingdom\"),\n \"61\": Countries.find((c) => c.name === \"Australia\"),\n \"64\": Countries.find((c) => c.name === \"New Zealand\"),\n \"246\": Countries.find((c) => c.name === \"Diego Garcia\"),\n \"255\": Countries.find((c) => c.name === \"Tanzania\"),\n \"262\": Countries.find((c) => c.name === \"Reunion\"),\n \"500\": Countries.find((c) => c.name === \"Falkland Islands\"),\n \"590\": Countries.find((c) => c.name === \"Guadeloupe\"),\n \"672\": Countries.find((c) => c.name === \"Norfolk Island\"),\n \"1 268\": Countries.find((c) => c.name === \"Antigua & Barbuda\"),\n}; */\n\n/*\nconst toInt = (str) => {\n return parseInt(str.replace(/ /g, \"\"));\n};\nvar arr = window.Countries.sort((a, b) => toInt(a.phoneCode) - toInt(b.phoneCode));\narr.forEach((el, idx) => {\n if(idx === (arr.length - 1)) {\n return;\n }\n\n if(toInt(arr[idx + 1].phoneCode) === toInt(el.phoneCode)) {\n console.log(\"duplicate\", el, arr[idx + 1]);\n }\n});\n*/\n\nexport default Countries;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/810.3f514515bc74111bee6d.chunk.js.map b/public/810.3f514515bc74111bee6d.chunk.js.map deleted file mode 100644 index 593d351e..00000000 --- a/public/810.3f514515bc74111bee6d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"810.3f514515bc74111bee6d.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/pageSignIn.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport Page from './page';\r\nimport CheckboxField from '../components/checkboxField';\r\nimport Button from '../components/button';\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 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 stateStorage from '../lib/stateStorage';\r\nimport rootScope from '../lib/rootScope';\r\nimport TelInputField from '../components/telInputField';\r\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\r\nimport CountryInputField from '../components/countryInputField';\r\n\r\n// import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nconst 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\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n const countryInputField = new CountryInputField({\r\n onCountryChange: (country, code) => {\r\n lastCountrySelected = country, lastCountryCodeSelected = code;\r\n\r\n if(!code) {\r\n return;\r\n }\r\n\r\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n }\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 const 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 countryInputField.override(country, code, countryName);\r\n }\r\n\r\n // if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n // console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned',\r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n\r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n // return;\r\n\r\n const phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n // lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n // console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n const 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 const tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n telInputField.simulateInputEvent();\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n\r\n g();\r\n });\r\n\r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n countryInputField.selectCountryByIso2(nearestDcResult.country);\r\n }\r\n\r\n // console.log('woohoo', nearestDcResult, country);\r\n })// .catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["btnQr","btnNext","page","inputWrapper","document","createElement","lastCountrySelected","lastCountryCodeSelected","classList","add","countryInputField","onCountryChange","country","code","telInputField","value","lastValue","country_code","setTimeout","telEl","focus","onInput","formatted","countryName","name","default_name","override","length","style","visibility","input","addEventListener","e","key","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","then","state","label","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","innerText","append","container","h4","subtitle","pageEl","querySelector","nearestDcResult","langPack","countries","hash","lang_code","simulateInputEvent","dcs","Set","done","this_dc","promise","nearest_dc","push","Promise","resolve","forEach","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined","removeAttribute"],"sourceRoot":""} \ No newline at end of file diff --git a/public/810.3f514515bc74111bee6d.chunk.js b/public/810.6e1c8118d1a5deced189.chunk.js similarity index 98% rename from public/810.3f514515bc74111bee6d.chunk.js rename to public/810.6e1c8118d1a5deced189.chunk.js index fcef8085..45310c76 100644 --- a/public/810.3f514515bc74111bee6d.chunk.js +++ b/public/810.6e1c8118d1a5deced189.chunk.js @@ -1,2 +1,2 @@ "use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[810],{810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>N});var a=n(279),i=n(4874),o=n(9807),r=n(4494),s=n(5432),c=n(4159),d=n(2325),l=n(1447),u=n(1405),h=n(9709),g=n(9638),p=n(3910),v=n(2738),y=n(5565),m=n(1656),Z=n(7487),b=n(2398),k=n(7922),L=n(3512),f=n(709),_=n(3855),S=n(5431);let w,x=null;const E=new i.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,i;e.classList.add("input-wrapper");const u=new S.Z({onCountryChange:(e,n)=>{t=e,i=n,n&&(N.value=N.lastValue="+"+n.country_code,setTimeout((()=>{C.focus(),(0,b.Z)(C,!0)}),0))}}),N=new f.Z({onInput:e=>{l.Z.loadLottieWorkers();const{country:n,code:a}=e||{},o=n?n.name||n.default_name:"";o===u.value||t&&n&&a&&(t===n||i.country_code===a.country_code)||u.override(n,a,o),n||N.value.length-1>1?x.style.visibility="":x.style.visibility="hidden"}}),C=N.input;C.addEventListener("keypress",(e=>{if(!x.style.visibility&&"Enter"===e.key)return T()}));const P=new o.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});P.input.addEventListener("change",(()=>{const e=P.checked;L.Z.managers.appStateManager.pushToState("keepSigned",e),_.Z.toggleStorages(e,!0)})),_.Z.getState().then((e=>{k.Z.isAvailable()?P.checked=e.keepSigned:(P.checked=!1,P.label.classList.add("checkbox-disabled"))})),x=(0,r.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),x.style.visibility="hidden";const T=e=>{e&&(0,p.Z)(e);const t=(0,m.Z)([x,w],!0);(0,y.Z)(x,(0,d.ag)("PleaseWait")),(0,a.y)(x);const i=N.value;L.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:i,api_id:c.Z.id,api_hash:c.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:i}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(N.setError(),(0,y.Z)(N.label,(0,d.ag)("Login.PhoneLabelInvalid")),C.classList.add("error"),(0,y.Z)(x,(0,d.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),x.innerText=e.type)}))};(0,v.fc)(x,T),w=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),w.addEventListener("click",(()=>{h.default.mount()})),e.append(u.container,N.container,P.label,x,w);const I=document.createElement("h4");I.classList.add("text-center"),(0,d.$d)(I,"Login.Title");const M=document.createElement("div");M.classList.add("subtitle","text-center"),(0,d.$d)(M,"Login.StartText"),E.pageEl.querySelector(".container").append(I,M,e),s.Z||setTimeout((()=>{C.focus()}),0),(0,g.Z)(e),L.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=k.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&d.ZP.getLangPack(n.lang_code).then((()=>{N.simulateInputEvent()}));const a=new Set([1,2,3,4,5]),i=[e.this_dc];let o;return e.nearest_dc!==e.this_dc&&(o=L.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{i.push(e.nearest_dc)}))),(o||Promise.resolve()).then((()=>{i.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,o=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield Z.Z.get(a))return t();setTimeout((()=>{L.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((i=void 0)||(i=Promise))((function(e,t){function r(e){try{c(o.next(e))}catch(e){t(e)}}function s(e){try{c(o.throw(e))}catch(e){t(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,s)}c((o=o.apply(n,a||[])).next())}));var n,a,i,o};t()})),e})).then((e=>{u.value.length||N.value.length||u.selectCountryByIso2(e.country)}))}),(()=>{x&&((0,y.Z)(x,(0,d.ag)("Login.Next")),(0,u.Z)(x,void 0,void 0,!0),x.removeAttribute("disabled")),w&&w.removeAttribute("disabled"),L.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),N=E}}]); -//# sourceMappingURL=810.3f514515bc74111bee6d.chunk.js.map \ No newline at end of file +//# sourceMappingURL=810.6e1c8118d1a5deced189.chunk.js.map \ No newline at end of file diff --git a/public/810.6e1c8118d1a5deced189.chunk.js.map b/public/810.6e1c8118d1a5deced189.chunk.js.map new file mode 100644 index 00000000..36a01e7c --- /dev/null +++ b/public/810.6e1c8118d1a5deced189.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"810.6e1c8118d1a5deced189.chunk.js","mappings":"sVAgCA,IAAuCA,EAAnCC,EAA6B,KAEjC,MA6PMC,EAAO,IAAI,IAAK,aAAa,GA7Pd,KAoBnB,MAAMC,EAAeC,SAASC,cAAc,OAG5C,IAAIC,EAAkCC,EAFtCJ,EAAaK,UAAUC,IAAI,iBAG3B,MAAMC,EAAoB,IAAI,IAAkB,CAC9CC,gBAAiB,CAACC,EAASC,KACzBP,EAAsBM,EAASL,EAA0BM,EAErDA,IAIJC,EAAcC,MAAQD,EAAcE,UAAY,IAAMH,EAAKI,aAC3DC,YAAW,KACTC,EAAMC,SACN,OAAgBD,GAAO,KACtB,OAIDL,EAAgB,IAAI,IAAc,CACtCO,QAAUC,IACR,wBAEA,MAAM,QAACV,EAAO,KAAEC,GAAQS,GAAa,GAC/BC,EAAcX,EAAUA,EAAQY,MAAQZ,EAAQa,aAAe,GAClEF,IAAgBb,EAAkBK,OAClCT,GACEM,GACAC,IACDP,IAAwBM,GACtBL,EAAwBU,eAAiBJ,EAAKI,eAIlDP,EAAkBgB,SAASd,EAASC,EAAMU,GAIzCX,GAAYE,EAAcC,MAAMY,OAAS,EAAK,EAC/C1B,EAAQ2B,MAAMC,WAAa,GAE3B5B,EAAQ2B,MAAMC,WAAa,YAK3BV,EAAQL,EAAcgB,MAE5BX,EAAMY,iBAAiB,YAAaC,IAElC,IAAI/B,EAAQ2B,MAAMC,YAAuD,UAAVG,EAAEC,IAC/D,OAAOC,OAQX,MAAMC,EAAsB,IAAI,IAAc,CAC5CC,KAAM,mBACNZ,KAAM,cACNa,YAAY,EACZC,SAAS,IAGXH,EAAoBL,MAAMC,iBAAiB,UAAU,KACnD,MAAMQ,EAAaJ,EAAoBG,QACvC,yCAA+C,aAAcC,GAE7D,mBAA+BA,GAAY,MAG7C,eAA2BC,MAAMC,IAC3B,kBAIFN,EAAoBG,QAAUG,EAAMF,YAHpCJ,EAAoBG,SAAU,EAC9BH,EAAoBO,MAAMlC,UAAUC,IAAI,yBAM5CR,GAAU,OAAO,gCAAiC,CAACmC,KAAM,eACzDnC,EAAQ2B,MAAMC,WAAa,SAE3B,MAAMK,EAAYF,IACbA,IACD,OAAYA,GAGd,MAAMW,GAAS,OAAiB,CAA4B1C,EAASD,IAAQ,IAE7E,OAAeC,GAAS,QAAK,gBAC7B,OAAaA,GAIb,MAAM2C,EAAe9B,EAAcC,MACnC,kCAAwC,gBAAiB,CACvD6B,aAAcA,EACdC,OAAQ,OACRC,SAAU,SACVC,SAAU,CACRC,EAAG,kBAGJR,MAAM3B,IAGP,8BAAyB2B,MAAMS,GAAMA,EAAEC,QAAQC,MAAMC,OAAOC,OAAOxC,EAAM,CAAC+B,aAAcA,UACvFU,OAAOC,IACRZ,IAGO,yBADAY,EAAIC,MAEP1C,EAAc2C,YACd,OAAe3C,EAAc4B,OAAO,QAAK,4BACzCvB,EAAMX,UAAUC,IAAI,UACpB,OAAeR,GAAS,QAAK,iBAG7ByD,QAAQC,MAAM,uBAAwBJ,GACtCtD,EAAQ2D,UAAYL,EAAIC,WAMhC,QAAiBvD,EAASiC,GAE1BlC,GAAQ,OAAO,4DAA6D,CAACoC,KAAM,mBAGnFpC,EAAM+B,iBAAiB,SAAS,KAC9B,qBAsBF5B,EAAa0D,OAAOnD,EAAkBoD,UAAWhD,EAAcgD,UAAW3B,EAAoBO,MAAOzC,EAASD,GAE9G,MAAM+D,EAAK3D,SAASC,cAAc,MAClC0D,EAAGvD,UAAUC,IAAI,gBACjB,QAAMsD,EAAI,eAEV,MAAMC,EAAW5D,SAASC,cAAc,OACxC2D,EAASxD,UAAUC,IAAI,WAAY,gBACnC,QAAMuD,EAAU,mBAEhB9D,EAAK+D,OAAOC,cAAc,cAAcL,OAAOE,EAAIC,EAAU7D,GAuDzD,KACFe,YAAW,KACTC,EAAMC,UACL,IAGL,OAAwBjB,GA1DtB,kCAAwC,qBAAqBqC,MAAM2B,I,MACjE,MAAMC,EAAW,iBAA0B,YACxCA,KAA+B,QAAlB,EAAAA,EAASC,iBAAS,eAAEC,OAClC,iBAAiBF,EAASG,WAAW/B,MAAK,KACxC1B,EAAc0D,wBAIlB,MAAMC,EAAM,IAAIC,IAAI,CAAC,EAAG,EAAG,EAAG,EAAG,IAC3BC,EAAiB,CAACR,EAAgBS,SAExC,IAAIC,EA+BJ,OA9BGV,EAAgBW,aAAeX,EAAgBS,UAChDC,EAAU,yCAA+CV,EAAgBW,YAAYtC,MAAK,KACxFmC,EAAKI,KAAKZ,EAAgBW,iBAI7BD,GAAWG,QAAQC,WAAWzC,MAAK,KAClCmC,EAAKO,SAASC,IACZV,EAAIW,OAAOD,MAGb,MAAME,EAAO,IAAIZ,GACXa,EAAI,KAA0B,O,OAAD,E,OAAA,E,EAAA,YACjC,MAAMH,EAAOE,EAAKE,QAClB,IAAIJ,EAAM,OAEV,MAAMK,EAAmB,KAAKL,aAE9B,SADkB,QAAmBK,GAEnC,OAAOF,IAGTpE,YAAW,KACT,yCAA+CiE,GAAkCM,QAAQH,KACxD,M,YAZF,K,+QAenCA,OAGKnB,KACN3B,MAAM2B,IACHzD,EAAkBK,MAAMY,QAAWb,EAAcC,MAAMY,QACzDjB,EAAkBgF,oBAAoBvB,EAAgBvD,eAkBP,KAClDX,KACD,OAAeA,GAAS,QAAK,gBAC7B,OAAOA,OAAS0F,OAAWA,GAAW,GACtC1F,EAAQ2F,gBAAgB,aAGvB5F,GACDA,EAAM4F,gBAAgB,YAGxB,yCAA+C,YAAa,CAAC5C,EAAG,uBAGlE","sources":["webpack://tweb/./src/pages/pageSignIn.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {putPreloader} from '../components/putPreloader';\nimport Page from './page';\nimport CheckboxField from '../components/checkboxField';\nimport Button from '../components/button';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport App from '../config/app';\nimport I18n, {_i18n, i18n} from '../lib/langPack';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport ripple from '../components/ripple';\nimport pageSignQR from './pageSignQR';\nimport getLanguageChangeButton from '../components/languageChangeButton';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport toggleDisability from '../helpers/dom/toggleDisability';\nimport sessionStorage from '../lib/sessionStorage';\nimport {DcAuthKey} from '../types';\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport stateStorage from '../lib/stateStorage';\nimport rootScope from '../lib/rootScope';\nimport TelInputField from '../components/telInputField';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport CountryInputField from '../components/countryInputField';\n\n// import _countries from '../countries_pretty.json';\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\n\nconst onFirstMount = () => {\n /* if(Modes.test) {\n Countries.push({\n _: 'help.country',\n default_name: 'Test Country',\n country_codes: [{\n _: 'help.countryCode',\n country_code: '999 66',\n patterns: ['999 66 XXX XX']\n }],\n iso2: 'KK'\n });\n\n console.log('Added test country to list!');\n } */\n\n // const countries: Country[] = _countries.default.filter((c) => c.emoji);\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\n const countryInputField = new CountryInputField({\n onCountryChange: (country, code) => {\n lastCountrySelected = country, lastCountryCodeSelected = code;\n\n if(!code) {\n return;\n }\n\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\n setTimeout(() => {\n telEl.focus();\n placeCaretAtEnd(telEl, true);\n }, 0);\n }\n });\n\n const telInputField = new TelInputField({\n onInput: (formatted) => {\n lottieLoader.loadLottieWorkers();\n\n const {country, code} = formatted || {};\n const countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\n if(countryName !== countryInputField.value && (\n !lastCountrySelected ||\n !country ||\n !code || (\n lastCountrySelected !== country &&\n lastCountryCodeSelected.country_code !== code.country_code\n )\n )\n ) {\n countryInputField.override(country, code, countryName);\n }\n\n // if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\n if(country || (telInputField.value.length - 1) > 1) {\n btnNext.style.visibility = '';\n } else {\n btnNext.style.visibility = 'hidden';\n }\n }\n });\n\n const telEl = telInputField.input;\n\n telEl.addEventListener('keypress', (e) => {\n // console.log('keypress', this.value);\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\n return onSubmit();\n }\n });\n\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n\n const signedCheckboxField = new CheckboxField({\n text: 'Login.KeepSigned',\n name: 'keepSession',\n withRipple: true,\n checked: true\n });\n\n signedCheckboxField.input.addEventListener('change', () => {\n const keepSigned = signedCheckboxField.checked;\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\n\n apiManagerProxy.toggleStorages(keepSigned, true);\n });\n\n apiManagerProxy.getState().then((state) => {\n if(!stateStorage.isAvailable()) {\n signedCheckboxField.checked = false;\n signedCheckboxField.label.classList.add('checkbox-disabled');\n } else {\n signedCheckboxField.checked = state.keepSigned;\n }\n });\n\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\n btnNext.style.visibility = 'hidden';\n\n const onSubmit = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\n\n replaceContent(btnNext, i18n('PleaseWait'));\n putPreloader(btnNext);\n\n // return;\n\n const phone_number = telInputField.value;\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\n phone_number: phone_number,\n api_id: App.id,\n api_hash: App.hash,\n settings: {\n _: 'codeSettings' // that's how we sending Type\n }\n // lang_code: navigator.language || 'en'\n }).then((code) => {\n // console.log('got code', code);\n\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\n }).catch((err) => {\n toggle();\n\n switch(err.type) {\n case 'PHONE_NUMBER_INVALID':\n telInputField.setError();\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\n telEl.classList.add('error');\n replaceContent(btnNext, i18n('Login.Next'));\n break;\n default:\n console.error('auth.sendCode error:', err);\n btnNext.innerText = err.type;\n break;\n }\n });\n };\n\n attachClickEvent(btnNext, onSubmit);\n\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\n\n const qrMounted = false;\n btnQr.addEventListener('click', () => {\n pageSignQR.mount();\n /* const promise = import('./pageSignQR');\n btnQr.disabled = true;\n\n let preloaderDiv: HTMLElement;\n if(!qrMounted) {\n preloaderDiv = putPreloader(btnQr);\n qrMounted = true;\n }\n\n promise.then((module) => {\n module.default.mount();\n\n setTimeout(() => {\n btnQr.removeAttribute('disabled');\n if(preloaderDiv) {\n preloaderDiv.remove();\n }\n }, 200);\n }); */\n });\n\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\n\n const h4 = document.createElement('h4');\n h4.classList.add('text-center');\n _i18n(h4, 'Login.Title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle', 'text-center');\n _i18n(subtitle, 'Login.StartText');\n\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\n\n const tryAgain = () => {\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\n const langPack = stateStorage.getFromCache('langPack');\n if(langPack && !langPack.countries?.hash) {\n I18n.getLangPack(langPack.lang_code).then(() => {\n telInputField.simulateInputEvent();\n });\n }\n\n const dcs = new Set([1, 2, 3, 4, 5]);\n const done: number[] = [nearestDcResult.this_dc];\n\n let promise: Promise;\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\n done.push(nearestDcResult.nearest_dc);\n });\n }\n\n (promise || Promise.resolve()).then(() => {\n done.forEach((dcId) => {\n dcs.delete(dcId);\n });\n\n const _dcs = [...dcs];\n const g = async(): Promise => {\n const dcId = _dcs.shift();\n if(!dcId) return;\n\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\n const key = await sessionStorage.get(dbKey);\n if(key) {\n return g();\n }\n\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\n }, /* done.includes(dcId) ? 0 : */3000);\n };\n\n g();\n });\n\n return nearestDcResult;\n }).then((nearestDcResult) => {\n if(!countryInputField.value.length && !telInputField.value.length) {\n countryInputField.selectCountryByIso2(nearestDcResult.country);\n }\n\n // console.log('woohoo', nearestDcResult, country);\n })// .catch(tryAgain);\n };\n\n if(!IS_TOUCH_SUPPORTED) {\n setTimeout(() => {\n telEl.focus();\n }, 0);\n }\n\n getLanguageChangeButton(inputWrapper);\n\n tryAgain();\n};\n\nconst page = new Page('page-sign', true, onFirstMount, () => {\n if(btnNext) {\n replaceContent(btnNext, i18n('Login.Next'));\n ripple(btnNext, undefined, undefined, true);\n btnNext.removeAttribute('disabled');\n }\n\n if(btnQr) {\n btnQr.removeAttribute('disabled');\n }\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\n});\n\nexport default page;\n"],"names":["btnQr","btnNext","page","inputWrapper","document","createElement","lastCountrySelected","lastCountryCodeSelected","classList","add","countryInputField","onCountryChange","country","code","telInputField","value","lastValue","country_code","setTimeout","telEl","focus","onInput","formatted","countryName","name","default_name","override","length","style","visibility","input","addEventListener","e","key","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","then","state","label","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","innerText","append","container","h4","subtitle","pageEl","querySelector","nearestDcResult","langPack","countries","hash","lang_code","simulateInputEvent","dcs","Set","done","this_dc","promise","nearest_dc","push","Promise","resolve","forEach","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined","removeAttribute"],"sourceRoot":""} \ No newline at end of file diff --git a/public/813.8ac136e59ed6ea591cfc.chunk.js b/public/813.8ac136e59ed6ea591cfc.chunk.js new file mode 100644 index 00000000..3b81a889 --- /dev/null +++ b/public/813.8ac136e59ed6ea591cfc.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[813,339],{2582:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(2325);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,n.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,n.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},8339:(e,t,a)=>{a.r(t),a.d(t,{default:()=>v});var n=a(2582),i=a(4874),s=a(8799),r=a(3512),c=a(503),u=a(1168),o=a(6765),l=a(5565),p=a(2325),m=a(8115),d=a(4494),h=a(279);let g=null;const v=new i.Z("page-signUp",!0,(()=>{return e=void 0,t=void 0,v=function*(){const e=new n.Z({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});e.imageDiv.classList.add("avatar-edit"),e.title.classList.add("fullName");const t=document.createElement("canvas");t.id="canvas-avatar",t.className="avatar-edit-canvas";const i=document.createElement("span");let v;i.className="tgico tgico-cameraadd",e.imageDiv.append(t,i),e.imageDiv.addEventListener("click",(()=>{u.Z.createPopup(o.Z).open(t,(e=>{v=e}))}));const b=t=>{const a=y.value||"",n=w.value||"",i=a||n?(a+" "+n).trim():"";i?(0,l.Z)(e.title,(0,m.Z)(i)):(0,l.Z)(e.title,(0,p.ag)("YourName"))},y=new c.ZP({label:"FirstName",maxLength:70}),w=new c.ZP({label:"LastName",maxLength:64}),L=(0,d.Z)("btn-primary btn-color-primary"),f=new p.ZP.IntlElement({key:"StartMessaging"});return L.append(f.element),e.inputWrapper.append(y.container,w.container,L),y.input.addEventListener("input",b),w.input.addEventListener("input",b),L.addEventListener("click",(function(e){if(y.input.classList.contains("error")||w.input.classList.contains("error"))return!1;if(!y.value.length)return y.input.classList.add("error"),!1;this.disabled=!0;const t=y.value.trim(),n=w.value.trim(),i={phone_number:g.phone_number,phone_code_hash:g.phone_code_hash,first_name:t,last_name:n};f.update({key:"PleaseWait"});const s=(0,h.y)(this);r.Z.managers.apiManager.invokeApi("auth.signUp",i).then((e=>{"auth.authorization"===e._?(r.Z.managers.apiManager.setUser(e.user),new Promise(((e,t)=>{if(!v)return e();v().then((a=>{r.Z.managers.appProfileManager.uploadProfilePhoto(a).then(e,t)}),t)})).finally((()=>{a.e(781).then(a.bind(a,5436)).then((e=>{e.default.mount()}))}))):(f.update({key:e._}),this.removeAttribute("disabled"),s.remove())})).catch((e=>{this.removeAttribute("disabled"),s.remove(),e.type,f.update({key:e.type})}))})),(0,s.Z)(),new Promise((e=>{window.requestAnimationFrame(e)}))},new((i=void 0)||(i=Promise))((function(a,n){function s(e){try{c(v.next(e))}catch(e){n(e)}}function r(e){try{c(v.throw(e))}catch(e){n(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(s,r)}c((v=v.apply(e,t||[])).next())}));var e,t,i,v}),(e=>{g=e,r.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignUp",authCode:e})}))}}]); +//# sourceMappingURL=813.8ac136e59ed6ea591cfc.chunk.js.map \ No newline at end of file diff --git a/public/813.8ac136e59ed6ea591cfc.chunk.js.map b/public/813.8ac136e59ed6ea591cfc.chunk.js.map new file mode 100644 index 00000000..a9cdf8af --- /dev/null +++ b/public/813.8ac136e59ed6ea591cfc.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"813.8ac136e59ed6ea591cfc.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {LangPackKey, i18n} from '../lib/langPack';\n\nexport default class LoginPage {\n public element: HTMLElement;\n public container: HTMLElement;\n public imageDiv: HTMLElement;\n public inputWrapper: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLParagraphElement;\n\n constructor(options: {\n className: string,\n withInputWrapper?: boolean,\n titleLangKey?: LangPackKey,\n subtitleLangKey?: LangPackKey,\n }) {\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\n // this.element = document.createElement('div');\n // this.element.className = 'page-' + options.className;\n\n this.container = document.createElement('div');\n this.container.className = 'container center-align';\n\n this.imageDiv = document.createElement('div');\n this.imageDiv.className = 'auth-image';\n\n this.title = document.createElement('h4');\n if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n this.subtitle = document.createElement('p');\n this.subtitle.className = 'subtitle';\n if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey));\n }\n\n this.container.append(this.imageDiv, this.title, this.subtitle);\n\n if(options.withInputWrapper) {\n this.inputWrapper = document.createElement('div');\n this.inputWrapper.className = 'input-wrapper';\n this.container.append(this.inputWrapper);\n }\n\n this.element.append(this.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 type {CancellablePromise} from '../helpers/cancellablePromise';\nimport type {InputFile} from '../layer';\nimport type {AuthState} from '../types';\nimport LoginPage from './loginPage';\nimport Page from './page';\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\nimport rootScope from '../lib/rootScope';\nimport InputField from '../components/inputField';\nimport PopupElement from '../components/popups';\nimport PopupAvatar from '../components/popups/avatar';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport I18n, {i18n} from '../lib/langPack';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../components/button';\nimport {putPreloader} from '../components/putPreloader';\n\nlet authCode: AuthState.signUp['authCode'] = null;\n\nconst onFirstMount = async() => {\n const page = new LoginPage({\n className: 'page-signUp',\n withInputWrapper: true,\n titleLangKey: 'YourName',\n subtitleLangKey: 'Login.Register.Subtitle'\n });\n\n page.imageDiv.classList.add('avatar-edit');\n\n page.title.classList.add('fullName');\n\n const avatarPreview = document.createElement('canvas');\n avatarPreview.id = 'canvas-avatar';\n avatarPreview.className = 'avatar-edit-canvas';\n\n const addIco = document.createElement('span');\n addIco.className = 'tgico tgico-cameraadd';\n\n page.imageDiv.append(avatarPreview, addIco);\n\n let uploadAvatar: () => CancellablePromise;\n page.imageDiv.addEventListener('click', () => {\n PopupElement.createPopup(PopupAvatar).open(avatarPreview, (_uploadAvatar) => {\n uploadAvatar = _uploadAvatar;\n });\n });\n\n const handleInput = (e: Event) => {\n const name = nameInputField.value || '';\n const lastName = lastNameInputField.value || '';\n\n const fullName = name || lastName ?\n (name + ' ' + lastName).trim() :\n '';\n\n if(fullName) replaceContent(page.title, wrapEmojiText(fullName));\n else replaceContent(page.title, i18n('YourName'));\n };\n\n const sendAvatar = () => new Promise((resolve, reject) => {\n if(!uploadAvatar) {\n // console.log('User has not selected avatar');\n return resolve();\n }\n\n // console.log('invoking uploadFile...');\n uploadAvatar().then((inputFile) => {\n // console.log('uploaded smthn', inputFile);\n\n rootScope.managers.appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\n }, reject);\n });\n\n const nameInputField = new InputField({\n label: 'FirstName',\n maxLength: 70\n });\n\n const lastNameInputField = new InputField({\n label: 'LastName',\n maxLength: 64\n });\n\n const btnSignUp = Button('btn-primary btn-color-primary');\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\n btnSignUp.append(btnI18n.element);\n\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\n\n nameInputField.input.addEventListener('input', handleInput);\n lastNameInputField.input.addEventListener('input', handleInput);\n\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\n return false;\n }\n\n if(!nameInputField.value.length) {\n nameInputField.input.classList.add('error');\n return false;\n }\n\n this.disabled = true;\n\n const name = nameInputField.value.trim();\n const lastName = lastNameInputField.value.trim();\n\n const params = {\n phone_number: authCode.phone_number,\n phone_code_hash: authCode.phone_code_hash,\n first_name: name,\n last_name: lastName\n };\n\n // console.log('invoking auth.signUp with params:', params);\n\n btnI18n.update({key: 'PleaseWait'});\n const preloader = putPreloader(this);\n\n rootScope.managers.apiManager.invokeApi('auth.signUp', params)\n .then((response) => {\n // console.log('auth.signUp response:', response);\n\n switch(response._) {\n case 'auth.authorization': // success\n rootScope.managers.apiManager.setUser(response.user);\n\n sendAvatar().finally(() => {\n import('./pageIm').then((m) => {\n m.default.mount();\n });\n });\n\n break;\n default:\n btnI18n.update({key: response._ as any});\n this.removeAttribute('disabled');\n preloader.remove();\n break;\n }\n\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\n pageAuthCode(Object.assign(code, {phoneNumber})); */\n }).catch((err) => {\n this.removeAttribute('disabled');\n preloader.remove();\n\n switch(err.type) {\n default:\n btnI18n.update({key: err.type});\n break;\n }\n });\n });\n\n blurActiveElement();\n return new Promise((resolve) => {\n window.requestAnimationFrame(resolve);\n });\n};\n\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\n authCode = _authCode;\n\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\n});\n\nexport default page;\n"],"names":["LoginPage","constructor","options","this","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","page","classList","add","avatarPreview","id","addIco","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","contains","length","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","then","response","_","user","Promise","resolve","reject","inputFile","finally","m","default","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode"],"sourceRoot":""} \ No newline at end of file diff --git a/public/813.e7782ee52edafa426cd5.chunk.js b/public/813.e7782ee52edafa426cd5.chunk.js deleted file mode 100644 index 643edd38..00000000 --- a/public/813.e7782ee52edafa426cd5.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[813,339],{2582:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(2325);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,n.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,n.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},8339:(e,t,a)=>{a.r(t),a.d(t,{default:()=>v});var n=a(4494),i=a(503),s=a(279),r=a(6765),p=a(2325),l=a(2582),u=a(4874),c=a(8799),o=a(5565),m=a(1168),d=a(8115),h=a(3512);let g=null;const v=new u.Z("page-signUp",!0,(()=>{const e=new l.Z({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});e.imageDiv.classList.add("avatar-edit"),e.title.classList.add("fullName");const t=document.createElement("canvas");t.id="canvas-avatar",t.className="avatar-edit-canvas";const u=document.createElement("span");let v;u.className="tgico tgico-cameraadd",e.imageDiv.append(t,u),e.imageDiv.addEventListener("click",(()=>{m.Z.createPopup(r.Z).open(t,(e=>{v=e}))}));const b=t=>{const a=L.value||"",n=y.value||"",i=a||n?(a+" "+n).trim():"";i?(0,o.Z)(e.title,(0,d.Z)(i)):(0,o.Z)(e.title,(0,p.ag)("YourName"))},L=new i.ZP({label:"FirstName",maxLength:70}),y=new i.ZP({label:"LastName",maxLength:64}),Z=(0,n.Z)("btn-primary btn-color-primary"),w=new p.ZP.IntlElement({key:"StartMessaging"});return Z.append(w.element),e.inputWrapper.append(L.container,y.container,Z),L.input.addEventListener("input",b),y.input.addEventListener("input",b),Z.addEventListener("click",(function(e){if(L.input.classList.contains("error")||y.input.classList.contains("error"))return!1;if(!L.value.length)return L.input.classList.add("error"),!1;this.disabled=!0;const t=L.value.trim(),n=y.value.trim(),i={phone_number:g.phone_number,phone_code_hash:g.phone_code_hash,first_name:t,last_name:n};w.update({key:"PleaseWait"});const r=(0,s.y)(this);h.Z.managers.apiManager.invokeApi("auth.signUp",i).then((e=>{"auth.authorization"===e._?(h.Z.managers.apiManager.setUser(e.user),new Promise(((e,t)=>{if(!v)return e();v().then((a=>{h.Z.managers.appProfileManager.uploadProfilePhoto(a).then(e,t)}),t)})).finally((()=>{a.e(781).then(a.bind(a,5436)).then((e=>{e.default.mount()}))}))):(w.update({key:e._}),this.removeAttribute("disabled"),r.remove())})).catch((e=>{this.removeAttribute("disabled"),r.remove(),e.type,w.update({key:e.type})}))})),(0,c.Z)(),new Promise((e=>{window.requestAnimationFrame(e)}))}),(e=>{g=e,h.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignUp",authCode:e})}))}}]); -//# sourceMappingURL=813.e7782ee52edafa426cd5.chunk.js.map \ No newline at end of file diff --git a/public/813.e7782ee52edafa426cd5.chunk.js.map b/public/813.e7782ee52edafa426cd5.chunk.js.map deleted file mode 100644 index 147f9e4a..00000000 --- a/public/813.e7782ee52edafa426cd5.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"813.e7782ee52edafa426cd5.chunk.js","mappings":"8HAQe,MAAMA,EAQnBC,YAAYC,GAMVC,KAAKC,QAAUC,SAASC,KAAKC,cAAc,IAAML,EAAQM,WAIzDL,KAAKM,UAAYJ,SAASK,cAAc,OACxCP,KAAKM,UAAUD,UAAY,yBAE3BL,KAAKQ,SAAWN,SAASK,cAAc,OACvCP,KAAKQ,SAASH,UAAY,aAE1BL,KAAKS,MAAQP,SAASK,cAAc,MACjCR,EAAQW,cACTV,KAAKS,MAAME,QAAO,QAAKZ,EAAQW,eAGjCV,KAAKY,SAAWV,SAASK,cAAc,KACvCP,KAAKY,SAASP,UAAY,WACvBN,EAAQc,iBACTb,KAAKY,SAASD,QAAO,QAAKZ,EAAQc,kBAGpCb,KAAKM,UAAUK,OAAOX,KAAKQ,SAAUR,KAAKS,MAAOT,KAAKY,UAEnDb,EAAQe,mBACTd,KAAKe,aAAeb,SAASK,cAAc,OAC3CP,KAAKe,aAAaV,UAAY,gBAC9BL,KAAKM,UAAUK,OAAOX,KAAKe,eAG7Bf,KAAKC,QAAQU,OAAOX,KAAKM,c,uKC7B7B,IAAIU,EAAyC,KAE7C,MAoJA,EANa,IAAI,IAAK,eAAe,GA9IhB,KACnB,MAAMC,EAAO,IAAI,IAAU,CACzBZ,UAAW,cACXS,kBAAkB,EAClBJ,aAAc,WACdG,gBAAiB,4BAGnBI,EAAKT,SAASU,UAAUC,IAAI,eAE5BF,EAAKR,MAAMS,UAAUC,IAAI,YAEzB,MAAMC,EAAgBlB,SAASK,cAAc,UAC7Ca,EAAcC,GAAK,gBACnBD,EAAcf,UAAY,qBAE1B,MAAMiB,EAASpB,SAASK,cAAc,QAKtC,IAAIgB,EAJJD,EAAOjB,UAAY,wBAEnBY,EAAKT,SAASG,OAAOS,EAAeE,GAGpCL,EAAKT,SAASgB,iBAAiB,SAAS,KACtC,gBAAyB,KAAaC,KAAKL,GAAgBM,IACzDH,EAAeG,QAInB,MAAMC,EAAeC,IACnB,MAAMC,EAAOC,EAAeC,OAAS,GAC/BC,EAAWC,EAAmBF,OAAS,GAEvCG,EAAWL,GAAQG,GACtBH,EAAO,IAAMG,GAAUG,OACxB,GAECD,GAAU,OAAejB,EAAKR,OAAO,OAAcyB,KACjD,OAAejB,EAAKR,OAAO,QAAK,cAiBjCqB,EAAiB,IAAI,KAAW,CACpCM,MAAO,YACPC,UAAW,KAGPJ,EAAqB,IAAI,KAAW,CACxCG,MAAO,WACPC,UAAW,KAGPC,GAAY,OAAO,iCACnBC,EAAU,IAAI,iBAAiB,CAACC,IAAK,mBAwE3C,OAvEAF,EAAU3B,OAAO4B,EAAQtC,SAEzBgB,EAAKF,aAAaJ,OAAOmB,EAAexB,UAAW2B,EAAmB3B,UAAWgC,GAEjFR,EAAeW,MAAMjB,iBAAiB,QAASG,GAC/CM,EAAmBQ,MAAMjB,iBAAiB,QAASG,GAEnDW,EAAUd,iBAAiB,SAAS,SAAiCI,GACnE,GAAGE,EAAeW,MAAMvB,UAAUwB,SAAS,UAAYT,EAAmBQ,MAAMvB,UAAUwB,SAAS,SACjG,OAAO,EAGT,IAAIZ,EAAeC,MAAMY,OAEvB,OADAb,EAAeW,MAAMvB,UAAUC,IAAI,UAC5B,EAGTnB,KAAK4C,UAAW,EAEhB,MAAMf,EAAOC,EAAeC,MAAMI,OAC5BH,EAAWC,EAAmBF,MAAMI,OAEpCU,EAAS,CACbC,aAAc9B,EAAS8B,aACvBC,gBAAiB/B,EAAS+B,gBAC1BC,WAAYnB,EACZoB,UAAWjB,GAKbO,EAAQW,OAAO,CAACV,IAAK,eACrB,MAAMW,GAAY,OAAanD,MAE/B,kCAAwC,cAAe6C,GACtDO,MAAMC,IAIE,uBADAA,EAASC,GAEZ,gCAAsCD,EAASE,MAlE9B,IAAIC,SAAc,CAACC,EAASC,KACnD,IAAInC,EAEF,OAAOkC,IAITlC,IAAe6B,MAAMO,IAGnB,kDAAwDA,GAAWP,KAAKK,EAASC,KAChFA,MAyDgBE,SAAQ,KACnB,8BAAmBR,MAAMS,IACvBA,EAAEC,QAAQC,gBAMdxB,EAAQW,OAAO,CAACV,IAAKa,EAASC,IAC9BtD,KAAKgE,gBAAgB,YACrBb,EAAUc,aAMbC,OAAOC,IACRnE,KAAKgE,gBAAgB,YACrBb,EAAUc,SAEHE,EAAIC,KAEP7B,EAAQW,OAAO,CAACV,IAAK2B,EAAIC,cAMjC,SACO,IAAIZ,SAASC,IAClBY,OAAOC,sBAAsBb,SAIyBc,IACxDvD,EAAWuD,EAEX,yCAA+C,YAAa,CAACjB,EAAG,kBAAmBtC,SAAUuD","sources":["webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {LangPackKey, i18n} from '../lib/langPack';\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n // this.element = document.createElement('div');\r\n // this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n\r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport type {InputFile} from '../layer';\r\nimport type {AuthState} from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport I18n, {i18n} from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport PopupElement from '../components/popups';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n PopupElement.createPopup(PopupAvatar).open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName ?\r\n (name + ' ' + lastName).trim() :\r\n '';\r\n\r\n if(fullName) replaceContent(page.title, wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n const sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n // console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n // console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n // console.log('uploaded smthn', inputFile);\r\n\r\n rootScope.managers.appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n // console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n // console.log('auth.signUp response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n });\r\n\r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch((err) => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n};\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n"],"names":["LoginPage","constructor","options","this","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","page","classList","add","avatarPreview","id","addIco","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","contains","length","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","then","response","_","user","Promise","resolve","reject","inputFile","finally","m","default","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode"],"sourceRoot":""} \ No newline at end of file diff --git a/public/946.5f3daeb8fb456e8f8e99.bundle.js b/public/946.5f3daeb8fb456e8f8e99.bundle.js new file mode 100644 index 00000000..548c8b76 --- /dev/null +++ b/public/946.5f3daeb8fb456e8f8e99.bundle.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[946],{4159:(d,e,u)=>{var t;u.d(e,{Z:()=>s});const f=["web.telegram.org","webk.telegram.org"],r=Math.min(4,null!==(t=navigator.hardwareConcurrency)&&void 0!==t?t:4),c={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.7.0",versionFull:"1.7.0 (273)",build:273,langPackVersion:"0.7.1",langPack:"webk",langPackCode:"en",domains:f,baseDcId:2,isMainDomain:f.includes(location.hostname),suffix:"K",threads:r,cryptoWorkers:r};c.isMainDomain&&(c.id=2496,c.hash="8da85b0d5bfe62527e5b244c209159c3");const s=c},3127:(d,e,u)=>{u.d(e,{Z:()=>t});const t={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},8975:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(7119);function f(d,e=""){Array.isArray(d)||(d=[d]);const u=(0,t.Z)(e);return new Blob(d,{type:u})}},7119:(d,e,u)=>{function t(d){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(d)?"application/octet-stream":d}u.d(e,{Z:()=>t})},4903:(d,e,u)=>{function t(...d){const e=d.reduce(((d,e)=>d+(e.byteLength||e.length)),0),u=new Uint8Array(e);let t=0;return d.forEach((d=>{u.set(d instanceof ArrayBuffer?new Uint8Array(d):d,t),t+=d.byteLength||d.length})),u}u.d(e,{Z:()=>t})},3725:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(319);function f(){const d={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...e)=>{d.lastNotify=e,d.listeners.forEach((d=>d(...e)))},listeners:[],addNotifyListener:e=>{d.lastNotify&&e(...d.lastNotify),d.listeners.push(e)}},e=new Promise(((u,t)=>{d.resolve=d=>{e.isFulfilled||e.isRejected||(e.isFulfilled=!0,u(d))},d.reject=(...d)=>{e.isRejected||e.isFulfilled||(e.isRejected=!0,t(...d))}}));return e.catch(t.Z).finally((()=>{e.notify=e.notifyAll=e.lastNotify=null,e.listeners.length=0,e.cancel&&(e.cancel=t.Z)})),Object.assign(e,d),e}},1352:(d,e,u)=>{u.d(e,{N5:()=>f,SU:()=>t,kC:()=>r});const t="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,f="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!t,r=f||t,c=(d,...e)=>{try{d.postMessage(...e)}catch(d){console.error("[worker] postMessage error:",d,e)}},s=(d,...e)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((u=>{u.length&&u.slice(d?0:-1).forEach((d=>{c(d,...e)}))}))};t&&s.bind(null,!1),t&&s.bind(null,!0)},319:(d,e,u)=>{function t(){}u.d(e,{Z:()=>t})},8479:(d,e,u)=>{function t(d){if(null===d||"object"!=typeof d)return d;if(d instanceof Date)return new Date(d.getTime());if(Array.isArray(d))return d.map((d=>t(d)));if(ArrayBuffer.isView(d))return d.slice();const e=new d.constructor;for(var u in d)d.hasOwnProperty(u)&&(e[u]=t(d[u]));return e}u.d(e,{Z:()=>t})},6848:(d,e,u)=>{function t(d,e){const u=Object.keys,f=typeof d;return d&&e&&"object"===f&&f===typeof e?u(d).length===u(e).length&&u(d).every((u=>t(d[u],e[u]))):d===e}u.d(e,{Z:()=>t})},5880:(d,e,u)=>{function t(d){return"object"==typeof d&&null!==d}u.d(e,{Z:()=>t})},5953:(d,e,u)=>{function t(d,e){if(e)for(const u in e)void 0!==e[u]&&(d[u]=e[u]);return d}u.d(e,{Z:()=>t})},946:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(8479),f=u(5880);function r(d,e,u,c){for(const s in d)typeof e[s]!=typeof d[s]?(e[s]=(0,t.Z)(d[s]),u&&u(c||s)):(0,f.Z)(d[s])&&r(d[s],e[s],u,c||s)}},4110:(d,e,u)=>{var t=u(7361),f=u(617);String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(d){return(+this).toPeerId(d)},String.prototype.isPeerId=function(){return/^[\d-]/.test(this.toString())},Number.prototype.toUserId=function(){return this},Number.prototype.toChatId=function(){return Math.abs(this)},Number.prototype.toPeerId=function(d){return void 0===d?this:d?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0},[["isUser",f.Z],["isAnyChat",t.Z]].forEach((d=>{const e=Array.isArray(d)?d[0]:d,u=Array.isArray(d)?d[1]:d;String.prototype[e]=function(){return u.call(null,this.toString())},Number.prototype[e]=function(){return u.call(null,this)}}))},144:(d,e,u)=>{u.d(e,{a:()=>r,d:()=>f});const t={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function f(d){const e=t[d];return crypto.getRandomValues(e),e[0]}function r(){return""+f(32)+f(32)%16777215}},5466:(d,e,u)=>{u.d(e,{$:()=>f});var t=u(5289);function f(d){return(...e)=>function(d,e,u){const f=performance.now();return(u||console).warn((0,t.Z)(),"start",e),d.then((()=>{(u||console).warn((0,t.Z)(),"end",e,performance.now()-f)})),d}(...e,d)}},5418:(d,e,u)=>{function t(d){return new Promise((e=>{setTimeout(e,d)}))}u.d(e,{Z:()=>t})},6724:(d,e,u)=>{function t(d,e,u=!0){let t,f,r=null;return(...c)=>{t=!0,f=c,r||(u&&(t=!1,d(...f)),r=setInterval((()=>{if(!t)return clearInterval(r),void(r=null);t=!1,d(...f)}),e))}}u.d(e,{Z:()=>t})},9005:(d,e,u)=>{function t(d){return d.charAt(0).toUpperCase()+d.slice(1)}u.d(e,{Z:()=>t})},8453:(d,e,u)=>{u.d(e,{Z:()=>s});var t=u(5936),f=u(3989),r=u(7487),c=u(319);function s(d,e){return Promise.all([f.Z.toggleStorage(d,e),t.Z.toggleStorage(d,e),r.Z.toggleStorage(d,e)]).then(c.Z,c.Z)}},7298:(d,e,u)=>{function t(d){const e=Date.now();return d?e/1e3|0:e}u.d(e,{Z:()=>t})},7361:(d,e,u)=>{function t(d){return+d<0}u.d(e,{Z:()=>t})},617:(d,e,u)=>{function t(d){return+d>=0}u.d(e,{Z:()=>t})},8630:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(153),f=u(410),r=u(1352);class c extends t.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:d,args:e,transfer:u}){const t={method:d,args:e},f=this.listeners.invoke;if(null==f?void 0:f.length){let d=f[0].callback(t);return r.kC||d instanceof Promise||(d=Promise.resolve(d)),d}const c="aes-encrypt"===d||"aes-decrypt"===d?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",t,void 0,this.sendPorts[c],u)}invokeCrypto(d,...e){return this.invokeCryptoNew({method:d,args:e})}}const s=new c;f.GO&&(f.GO.cryptoMessagePort=s);const n=s},5936:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(1267),f=u(8975),r=u(5753),c=u(5471),s=u(3725);class n{constructor(d){this.dbName=d,this.useStorage=!0,t.Z.test&&(this.dbName+="_test"),n.STORAGES.length&&(this.useStorage=n.STORAGES[0].useStorage),this.openDatabase(),n.STORAGES.push(this)}openDatabase(){var d;return null!==(d=this.openDbPromise)&&void 0!==d?d:this.openDbPromise=caches.open(this.dbName)}delete(d){return this.timeoutOperation((e=>e.delete("/"+d)))}deleteAll(){return caches.delete(this.dbName)}get(d){return this.timeoutOperation((e=>e.match("/"+d)))}save(d,e){return this.timeoutOperation((u=>u.put("/"+d,e)))}getFile(d,e="blob"){return this.get(d).then((d=>{if(!d)throw(0,c.Z)("NO_ENTRY_FOUND");return d[e]()}))}saveFile(d,e){e instanceof Blob||(e=(0,f.Z)(e));const u=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(d,u).then((()=>e))}timeoutOperation(d){return this.useStorage?new Promise(((e,u)=>{return t=this,f=void 0,c=function*(){let t=!1;const f=setTimeout((()=>{u(),t=!0}),15e3);try{const u=yield this.openDatabase();if(!u)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const f=yield d(u);if(t)return;e(f)}catch(d){u(d)}clearTimeout(f)},new((r=void 0)||(r=Promise))((function(d,e){function u(d){try{n(c.next(d))}catch(d){e(d)}}function s(d){try{n(c.throw(d))}catch(d){e(d)}}function n(e){var t;e.done?d(e.value):(t=e.value,t instanceof r?t:new r((function(d){d(t)}))).then(u,s)}n((c=c.apply(t,f||[])).next())}));var t,f,r,c})):Promise.reject((0,c.Z)("STORAGE_OFFLINE"))}prepareWriting(d,e,u){return{deferred:(0,s.Z)(),getWriter:()=>new r.Z(u,e,(e=>this.saveFile(d,e).catch((()=>e))))}}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,e)return d?void 0:u.deleteAll()})))}}n.STORAGES=[]},5753:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(8975);class f{constructor(d,e,u){this.mimeType=d,this.size=e,this.saveFileCallback=u,this.bytes=new Uint8Array(e)}write(d,e){return u=this,t=void 0,r=function*(){const u=e+d.byteLength;if(u>this.bytes.byteLength){const d=new Uint8Array(u);d.set(this.bytes,0),this.bytes=d}this.bytes.set(d,e)},new((f=void 0)||(f=Promise))((function(d,e){function c(d){try{n(r.next(d))}catch(d){e(d)}}function s(d){try{n(r.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(c,s)}n((r=r.apply(u,t||[])).next())}));var u,t,f,r}truncate(){this.bytes=new Uint8Array}trim(d){this.bytes=this.bytes.slice(0,d)}finalize(d=!0){const e=(0,t.Z)(this.bytes,this.mimeType);return d&&this.saveFileCallback&&this.saveFileCallback(e),e}getParts(){return this.bytes}replaceParts(d){this.bytes=d}}},5003:(d,e,u)=>{u.d(e,{kg:()=>l,v9:()=>t});var t,f=u(410),r=u(4762),c=u(1352),s=u(5289);!function(d){d[d.None=0]="None",d[d.Error=1]="Error",d[d.Warn=2]="Warn",d[d.Log=4]="Log",d[d.Debug=8]="Debug"}(t||(t={}));const n=[t.None,t.Error,t.Warn,t.Log,t.Debug],o=!(r.IS_SAFARI||r.IS_FIREFOX),i="",a="",h=[["debug",t.Debug],["info",t.Log],["warn",t.Warn],["error",t.Error],["assert",t.Error],["trace",t.Log],["group",t.Log],["groupCollapsed",t.Log],["groupEnd",t.Log]];function l(d,e=t.Log|t.Warn|t.Error,u=!1,r=""){let b;f.ZP||u||(e=t.Error),o?r||(c.SU?r=i:c.N5&&(r=a)):r="";const g=r;r=r?`%s ${r}%s`:"%s";const p=function(...u){return e&t.Log&&console.log(r,(0,s.Z)(),d,...u)};return h.forEach((([u,t])=>{p[u]=function(...f){return e&t&&console[u](r,(0,s.Z)(),d,...f)}})),p.setPrefix=function(e){b=e,d="["+e+"]"},p.setPrefix(d),p.setLevel=function(d){e=n.slice(0,d+1).reduce(((d,e)=>d|e),0)},p.bindPrefix=function(d){return l(`${b}] [${d}`,e,u,g)},p}},3206:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(410),f=u(153);class r extends f.Z{constructor(){super("MTPROTO"),r.INSTANCE=this,t.GO&&(t.GO.mtprotoMessagePort=this)}static getInstance(){return this.INSTANCE}}},690:(d,e,u)=>{var t=u(4903);Uint8Array.prototype.concat=function(...d){return(0,t.Z)(this,...d)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(d){const e=e=>Promise.resolve(d()).then(e);return this.then((d=>e((()=>d))),(d=>e((()=>Promise.reject(d)))))}},6637:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(2423);function f(d){return d?d.match(t.bu):null}},3655:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(153),f=u(410);class r extends t.Z{constructor(){super("SERVICE"),f.GO&&(f.GO.serviceMessagePort=this)}}},7487:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(1267),r=u(1352),c=u(3206);class s{constructor(){this.prefix="",this.cache={},this.useStorage=!0,f.Z.test&&(this.prefix="t_")}get(d,e=!0){if(this.cache.hasOwnProperty(d)&&e)return this.cache[d];if(this.useStorage){let e;try{e=localStorage.getItem(this.prefix+d)}catch(d){this.useStorage=!1}if(null!==e)try{e=JSON.parse(e)}catch(d){}else e=void 0;return e}}set(d,e=!1){for(const u in d)if(d.hasOwnProperty(u)){const t=d[u];if(this.cache[u]=t,this.useStorage&&!e)try{const d=JSON.stringify(t);localStorage.setItem(this.prefix+u,d)}catch(d){this.useStorage=!1}}}delete(d,e=!1){d=""+d,e||delete this.cache[d];try{localStorage.removeItem(this.prefix+d)}catch(d){}}clear(){const d=["dc","server_time_offset","xt_instance","user_auth","state_id","k_build"];for(let e=1;e<=5;++e)d.push(`dc${e}_server_salt`),d.push(`dc${e}_auth_key`);for(const e of d)this.delete(e,!0)}toggleStorage(d,e){if(this.useStorage=d,e)return d?this.set(this.cache):void this.clear()}}class n{constructor(){n.STORAGES.push(this),r.kC||(this.storage=new s)}proxy(d,...e){return u=this,t=void 0,s=function*(){return r.kC?c.Z.getInstance().invoke("localStorageProxy",{type:d,args:e}):(e=Array.prototype.slice.call(e),this.storage[d].apply(this.storage,e))},new((f=void 0)||(f=Promise))((function(d,e){function r(d){try{n(s.next(d))}catch(d){e(d)}}function c(d){try{n(s.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(r,c)}n((s=s.apply(u,t||[])).next())}));var u,t,f,s}get(d,e){return this.proxy("get",d,e)}set(d,e){return this.proxy("set",d,e)}delete(d,e){return this.proxy("delete",d,e)}clear(){return this.proxy("clear")}toggleStorage(d,e){return this.proxy("toggleStorage",d,e)}}n.STORAGES=[];const o=new n;t.GO.appStorage=o;const i=o},7922:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(410),f=u(3989),r=u(3127);class c extends f.Z{constructor(){super(r.Z,"session")}}const s=new c;t.GO.stateStorage=s;const n=s},3989:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(3725),r=u(1352),c=u(6724),s=u(6666),n=function(d,e,u,t){return new(u||(u=Promise))((function(f,r){function c(d){try{n(t.next(d))}catch(d){r(d)}}function s(d){try{n(t.throw(d))}catch(d){r(d)}}function n(d){var e;d.done?f(d.value):(e=d.value,e instanceof u?e:new u((function(d){d(e)}))).then(c,s)}n((t=t.apply(d,e||[])).next())}))};function o(){}class i{constructor(d,e){this.db=d,this.storeName=e,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=(0,f.Z)(),this.keysToDelete=new Set,this.deleteDeferred=(0,f.Z)(),this.storage=new s.Z(d,e),i.STORAGES.length?this.useStorage=i.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,i.STORAGES.push(this),this.saveThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.saveDeferred;this.saveDeferred=(0,f.Z)();const e=this.keysToSet;if(e.size){const d=Array.from(e.values());e.clear();const u=d.map((d=>this.cache[d]));try{yield this.storage.save(d,u)}catch(e){console.error("[AS]: set error:",e,d,u)}}d.resolve(),e.size&&this.saveThrottled()}))),16,!1),this.deleteThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.deleteDeferred;this.deleteDeferred=(0,f.Z)();const e=this.keysToDelete;if(e.size){const d=Array.from(e.values());e.clear();try{yield this.storage.delete(d)}catch(e){console.error("[AS]: delete error:",e,d)}}d.resolve(),e.size&&this.deleteThrottled()}))),16,!1),this.getThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=Array.from(this.getPromises.keys());this.storage.get(d).then((e=>{for(let u=0,t=d.length;u{new Set(["NO_ENTRY_FOUND","STORAGE_OFFLINE"]).has(u.type)||(this.useStorage=!1,console.error("[AS]: get error:",u,d,e));for(let e=0,u=d.length;e{this.getPromises.size&&this.getThrottled()}))}))),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(d){return this.cache[d]}setToCache(d,e){return this.cache[d]=e}get(d,e=!0){return n(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(d)&&e)return this.getFromCache(d);if(this.useStorage){const e=this.getPromises.get(d);if(e)return e;const u=(0,f.Z)();return this.getPromises.set(d,u),this.getThrottled(),u}}))}getAll(){return this.storage.getAll().catch((()=>[]))}set(d,e=!1){const u=this.useStorage&&!e&&!this.savingFreezed;for(const e in d)if(d.hasOwnProperty(e)){const t=d[e];this.setToCache(e,t),u&&(this.keysToSet.add(e),this.keysToDelete.delete(e),this.saveThrottled())}return u?this.saveDeferred:Promise.resolve()}delete(d,e=!1){return d=""+d,e||delete this.cache[d],this.useStorage&&(this.keysToSet.delete(d),this.keysToDelete.add(d),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(d=!1){if(!d)for(const d in this.cache)delete this.cache[d];return this.storage.clear().catch(o)}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,r.kC&&e)return d?u.set(u.cache):(u.keysToSet.clear(),u.keysToDelete.clear(),u.getPromises.forEach((d=>d.resolve(void 0))),u.getPromises.clear(),u.clear(!0))}))).catch(o)}static freezeSaving(d,e){this.STORAGES.forEach((d=>d.savingFreezed=!0));try{d()}catch(d){console.error("freezeSaving callback error:",d)}this.STORAGES.forEach((d=>d.savingFreezed=!1))}}i.STORAGES=[],t.GO&&(t.GO.AppStorage=i)},1229:(d,e,u)=>{u.d(e,{Z:()=>t});const t="((?:👨🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|🧑🏻‍❤️?‍💋‍🧑\ud83c[\udffc-\udfff]|🧑🏼‍❤️?‍💋‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏽‍❤️?‍💋‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏾‍❤️?‍💋‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏿‍❤️?‍💋‍🧑\ud83c[\udffb-\udffe]|👨🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍❤️?‍🧑\ud83c[\udffc-\udfff]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍❤️?‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍❤️?‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍❤️?‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍❤️?‍🧑\ud83c[\udffb-\udffe]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|👨‍❤️?‍💋‍👨|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|🫱🏻‍🫲\ud83c[\udffc-\udfff]|🫱🏼‍🫲\ud83c[\udffb\udffd-\udfff]|🫱🏽‍🫲\ud83c[\udffb\udffc\udffe\udfff]|🫱🏾‍🫲\ud83c[\udffb-\udffd\udfff]|🫱🏿‍🫲\ud83c[\udffb-\udffe]|👨‍❤️?‍👨|👩‍❤️?‍\ud83d[\udc68\udc69]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|💏\ud83c[\udffb-\udfff]|💑\ud83c[\udffb-\udfff]|🤝\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|🤝)|(?:\ud83d[\udc68\udc69]|🧑)(?:\ud83c[\udffb-\udfff])?‍(?:⚕️?|⚖️?|✈️?|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|⛹)(?:(?:\ud83c[\udffb-\udfff]|️?)‍[♀♂]️?)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?‍[♀♂]️?|(?:👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍👦‍👦|👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍\ud83d[\udc66\udc67]|🏳️?‍⚧️?|🏳️?‍🌈|😶‍🌫️?|❤️?‍🔥|❤️?‍🩹|🏴‍☠️?|🐕‍🦺|🐻‍❄️?|👁‍🗨|👨‍\ud83d[\udc66\udc67]|👩‍\ud83d[\udc66\udc67]|👯‍♀️?|👯‍♂️?|😮‍💨|😵‍💫|🤼‍♀️?|🤼‍♂️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|🐈‍⬛)|[#*0-9]️??⃣|(?:[©®™♟]️?)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[‼⁉ℹ↔-↙↩↪⌚⌛⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☠☢☣☦☪☮☯☸-☺♀♂♈-♓♠♣♥♦♨♻♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛏⛑⛓⛔⛩⛪⛰-⛵⛸⛺⛽✂✈✉✏✒✔✖✝✡✳✴❄❇❗❣❤➡⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙])(?:️?|(?!︎))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[☝⛷⛹✌✍])(?:️?|(?!︎))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd\udec3-\udec5\udef0-\udef6]|[✊✋]))(?:\ud83c[\udffb-\udfff])?|(?:🏴󠁧󠁢󠁥󠁮󠁧󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁷󠁬󠁳󠁿|🇦\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|🇧\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|🇨\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|🇩\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|🇪\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|🇫\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|🇬\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|🇭\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|🇮\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|🇯\ud83c[\uddea\uddf2\uddf4\uddf5]|🇰\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|🇱\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|🇲\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|🇳\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|🇴🇲|🇵\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|🇶🇦|🇷\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|🇸\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|🇹\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|🇺\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|🇻\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|🇼\ud83c[\uddeb\uddf8]|🇽🇰|🇾\ud83c[\uddea\uddf9]|🇿\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️)"}}]); +//# sourceMappingURL=946.5f3daeb8fb456e8f8e99.bundle.js.map \ No newline at end of file diff --git a/public/946.5f3daeb8fb456e8f8e99.bundle.js.map b/public/946.5f3daeb8fb456e8f8e99.bundle.js.map new file mode 100644 index 00000000..8a55b587 --- /dev/null +++ b/public/946.5f3daeb8fb456e8f8e99.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"946.5f3daeb8fb456e8f8e99.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/app.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/object/copy.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/helpers/object/isObject.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/helpers/object/validateInitObject.ts","webpack://tweb/./src/helpers/peerIdPolyfill.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/recordPromise.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/schedulers/throttle.ts","webpack://tweb/./src/helpers/string/capitalizeFirstLetter.ts","webpack://tweb/./src/helpers/toggleStorages.ts","webpack://tweb/./src/helpers/tsNow.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isAnyChat.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isUser.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/mtproto/mtprotoMessagePort.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrlProtocol.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/localStorage.ts","webpack://tweb/./src/lib/sessionStorage.ts","webpack://tweb/./src/lib/stateStorage.ts","webpack://tweb/./src/lib/storage.ts","webpack://tweb/./src/vendor/emoji/regex.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {DcId} from '../types';\n\nexport const MAIN_DOMAINS = ['web.telegram.org', 'webk.telegram.org'];\n\nconst threads = Math.min(4, navigator.hardwareConcurrency ?? 4);\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.7.1',\n langPack: 'webk',\n langPackCode: 'en',\n domains: MAIN_DOMAINS,\n baseDcId: 2 as DcId,\n isMainDomain: MAIN_DOMAINS.includes(location.hostname),\n suffix: 'K',\n threads,\n cryptoWorkers: threads\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\n * 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 {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_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 * 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 const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\n}\n","/*\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// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function noop() {}\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 if(ArrayBuffer.isView(obj)) {\n // @ts-ignore\n return obj.slice();\n }\n\n // lastly, handle objects\n // @ts-ignore\n const clonedObj = new obj.constructor();\n for(var prop in obj) {\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","import copy from './copy';\nimport isObject from './isObject';\n\nexport default function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport isAnyChat from '../lib/appManagers/utils/peers/isAnyChat';\nimport isUser from '../lib/appManagers/utils/peers/isUser';\n\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\n[\n ['isUser' as const, isUser],\n ['isAnyChat' as const, isAnyChat]\n].forEach((value) => {\n const newMethod = Array.isArray(value) ? value[0] : value;\n const originMethod = Array.isArray(value) ? value[1] : value;\n // @ts-ignore\n String.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this.toString());\n };\n\n // @ts-ignore\n Number.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this);\n };\n});\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n}\n\nexport {};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import {logger} from '../lib/logger';\nimport dT from './dT';\n\nexport function recordPromise>(promise: T, description: string, log?: ReturnType | Console) {\n const perf = performance.now();\n (log || console).warn(dT(), 'start', description);\n promise.then(() => {\n (log || console).warn(dT(), 'end', description, performance.now() - perf);\n });\n return promise;\n}\n\nexport function recordPromiseBound(log: ReturnType | Console) {\n return (...args: [Parameters[0], Parameters[1]]) => {\n return recordPromise(...args, log);\n };\n}\n","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true\n) {\n let interval: number | null = null;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if(!interval) {\n if(shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n interval = setInterval(() => {\n if(!isPending) {\n clearInterval(interval!);\n interval = null;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms) as any;\n }\n };\n}\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CacheStorageController from '../lib/files/cacheStorage';\nimport AppStorage from '../lib/storage';\nimport sessionStorage from '../lib/sessionStorage';\nimport noop from './noop';\n\nexport default function toggleStorages(enabled: boolean, clearWrite: boolean) {\n return Promise.all([\n AppStorage.toggleStorage(enabled, clearWrite),\n CacheStorageController.toggleStorage(enabled, clearWrite),\n sessionStorage.toggleStorage(enabled, clearWrite)\n ]).then(noop, noop);\n}\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","export default function isAnyChat(peerId: PeerId) {\n return +peerId < 0;\n}\n","export default function isUser(peerId: PeerId) {\n return +peerId >= 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\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 blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport type {getEnvironment} from '../../environment/utils';\nimport type loadState from '../appManagers/utils/state/loadState';\nimport type {StoragesResults} from '../appManagers/utils/storages/loadStorages';\nimport type {LocalStorageProxyTask} from '../localStorage';\nimport type {Awaited} from '../../types';\nimport type {Mirrors, MirrorTaskPayload, NotificationBuildTaskPayload, TabState} from './mtprotoworker';\nimport type toggleStorages from '../../helpers/toggleStorages';\nimport SuperMessagePort from './superMessagePort';\n\nexport type MTProtoManagerTaskPayload = {name: string, method: string, args: any[]};\n\ntype MTProtoBroadcastEvent = {\n event: (payload: {name: string, args: any[]}, source: MessageEventSource) => void\n};\n\nexport default class MTProtoMessagePort extends SuperMessagePort<{\n environment: (environment: ReturnType) => void,\n crypto: (payload: {method: string, args: any[]}) => Promise,\n state: (payload: {userId: UserId} & Awaited> & {storagesResults?: StoragesResults}) => void,\n manager: (payload: MTProtoManagerTaskPayload) => any,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => ReturnType,\n serviceWorkerOnline: (online: boolean) => void,\n serviceWorkerPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n cryptoPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n createObjectURL: (blob: Blob) => string,\n tabState: (payload: TabState, source: MessageEventSource) => void,\n createProxyWorkerURLs: (payload: {originalUrl: string, blob: Blob}) => string[],\n} & MTProtoBroadcastEvent, {\n convertWebp: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n convertOpus: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n localStorageProxy: (payload: LocalStorageProxyTask['payload']) => Promise,\n mirror: (payload: MirrorTaskPayload) => void,\n notificationBuild: (payload: NotificationBuildTaskPayload) => void,\n // hello: () => void\n} & MTProtoBroadcastEvent, Master> {\n private static INSTANCE: MTProtoMessagePort;\n\n constructor() {\n super('MTPROTO');\n\n MTProtoMessagePort.INSTANCE = this;\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.mtprotoMessagePort = this);\n }\n\n public static getInstance() {\n return this.INSTANCE as MTProtoMessagePort;\n }\n}\n","/*\n * 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","import {URL_ANY_PROTOCOL_REG_EXP} from '.';\n\nexport default function matchUrlProtocol(text: string) {\n return !text ? null : text.match(URL_ANY_PROTOCOL_REG_EXP);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\n }\n}\n","/*\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 Modes from '../config/modes';\nimport {IS_WORKER} from '../helpers/context';\nimport {WorkerTaskTemplate} from '../types';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\n// import { stringify } from '../helpers/json';\n\nclass LocalStorage> {\n private prefix = '';\n private cache: Partial = {};\n private useStorage = true;\n\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\n if(Modes.test) {\n this.prefix = 't_';\n }\n }\n\n public get(key: T, useCache = true): Storage[T] {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.cache[key];\n } else if(this.useStorage) {\n let value: Storage[T];\n try {\n value = localStorage.getItem(this.prefix + (key as string)) as any;\n } catch(err) {\n this.useStorage = false;\n }\n\n if(value !== null) {\n try {\n value = JSON.parse(value);\n } catch(err) {\n // console.error(err);\n }\n } else {\n value = undefined;\n }\n\n return value;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public set(obj: Partial, onlyLocal = false) {\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.cache[key] = value;\n\n if(this.useStorage && !onlyLocal) {\n try {\n const stringified = JSON.stringify(value);\n localStorage.setItem(this.prefix + key, stringified);\n } catch(err) {\n this.useStorage = false;\n }\n }\n }\n }\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n // if(this.useStorage) {\n try {\n localStorage.removeItem(this.prefix + (key as string));\n } catch(err) {\n\n }\n // }\n }\n\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\n // if(this.useStorage) {\n try {\n let obj: Partial = {};\n if(preserveKeys) {\n preserveKeys.forEach((key) => {\n const value = this.get(key);\n if(value !== undefined) {\n obj[key] = value;\n }\n });\n }\n\n localStorage.clear();\n\n if(preserveKeys) {\n this.set(obj);\n }\n } catch(err) {\n\n }\n // }\n } */\n\n public clear() {\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id', 'k_build'];\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 for(const key of keys) {\n this.delete(key, true);\n }\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n this.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n this.clear();\n } else {\n return this.set(this.cache);\n }\n }\n}\n\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\n args: any[]\n }\n};\n\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: any\n};\n\nexport default class LocalStorageController> {\n private static STORAGES: LocalStorageController[] = [];\n // private log = (...args: any[]) => console.log('[SW LS]', ...args);\n // private log = (...args: any[]) => {};\n\n private storage: LocalStorage;\n\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\n LocalStorageController.STORAGES.push(this);\n\n if(!IS_WORKER) {\n this.storage = new LocalStorage(/* preserveKeys */);\n }\n }\n\n private async proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']): Promise {\n if(IS_WORKER) {\n const port = MTProtoMessagePort.getInstance();\n return port.invoke('localStorageProxy', {type, args});\n }\n\n args = Array.prototype.slice.call(args);\n\n // @ts-ignore\n return this.storage[type].apply(this.storage, args as any);\n }\n\n public get(key: T, useCache?: boolean) {\n return this.proxy('get', key, useCache);\n }\n\n public set(obj: Partial, onlyLocal?: boolean) {\n return this.proxy('set', obj, onlyLocal);\n }\n\n public delete(key: keyof Storage, saveLocal?: boolean) {\n return this.proxy('delete', key, saveLocal);\n }\n\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\n return this.proxy('clear'/* , preserveKeys */);\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n return this.proxy('toggleStorage', enabled, clearWrite);\n }\n}\n","/*\n * 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 {AppInstance} from './mtproto/singleInstance';\nimport type {UserAuth} from './mtproto/mtproto_config';\nimport type {DcId} from '../types';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport LocalStorageController from './localStorage';\n\nconst sessionStorage = new LocalStorageController<{\n dc: DcId,\n user_auth: UserAuth,\n state_id: number,\n dc1_auth_key: string,\n dc2_auth_key: string,\n dc3_auth_key: string,\n dc4_auth_key: string,\n dc5_auth_key: string,\n dc1_server_salt: string,\n dc2_server_salt: string,\n dc3_server_salt: string,\n dc4_server_salt: string,\n dc5_server_salt: string,\n server_time_offset: number,\n xt_instance: AppInstance,\n kz_version: 'K' | 'Z',\n tgme_sync: {\n canRedirect: boolean,\n ts: number\n },\n k_build: number\n}>(/* ['kz_version'] */);\nMOUNT_CLASS_TO.appStorage = sessionStorage;\nexport default sessionStorage;\n","/*\n * 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 {ChatSavedPosition} from './appManagers/appImManager';\nimport type {AppDraftsManager} from './appManagers/appDraftsManager';\nimport type {State} from '../config/state';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {LangPackDifference} from '../layer';\nimport AppStorage from './storage';\nimport DATABASE_STATE from '../config/databases/state';\n\nclass StateStorage extends AppStorage<{\n chatPositions: {\n [peerId_threadId: string]: ChatSavedPosition\n },\n langPack: LangPackDifference,\n drafts: AppDraftsManager['drafts'],\n user_auth: any, // support old webk format\n} & State, typeof DATABASE_STATE> {\n constructor() {\n super(DATABASE_STATE, 'session');\n }\n}\n\nconst stateStorage = new StateStorage();\nMOUNT_CLASS_TO.stateStorage = stateStorage;\nexport default stateStorage;\n","/*\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 {Database} from '../config/databases';\nimport {MOUNT_CLASS_TO} from '../config/debug';\n// import DATABASE_SESSION from \"../config/databases/session\";\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_WORKER} from '../helpers/context';\nimport throttle from '../helpers/schedulers/throttle';\n// import { WorkerTaskTemplate } from \"../types\";\nimport IDBStorage from './files/idb';\n\nfunction noop() {}\n\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys: string[],\n values: any[]\n }\n};\n\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys: string[]\n }\n}; */\n\nconst THROTTLE_TIME = 16;\n\n/* Storage extends {[name: string]: any} *//* Storage extends Record */\nexport default class AppStorage<\n Storage extends Record,\n T extends Database\n> {\n private static STORAGES: AppStorage>[] = [];\n private storage: IDBStorage;// new CacheStorageController('session');\n\n // private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\n private cache: Partial = {};\n private useStorage: boolean;\n private savingFreezed: boolean;\n\n private getPromises: Map> = new Map();\n private getThrottled: () => void;\n\n private keysToSet: Set = new Set();\n private saveThrottled: () => void;\n private saveDeferred = deferredPromise();\n\n private keysToDelete: Set = new Set();\n private deleteThrottled: () => void;\n private deleteDeferred = deferredPromise();\n\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\n this.storage = new IDBStorage(db, storeName);\n\n if(AppStorage.STORAGES.length) {\n this.useStorage = AppStorage.STORAGES[0].useStorage;\n } else {\n this.useStorage = true;\n }\n\n this.savingFreezed = false;\n\n AppStorage.STORAGES.push(this);\n\n this.saveThrottled = throttle(async() => {\n const deferred = this.saveDeferred;\n this.saveDeferred = deferredPromise();\n\n const set = this.keysToSet;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n const values = keys.map((key) => this.cache[key]);\n try {\n // console.log('setItem: will set', key/* , value */);\n // await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\n // await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\n\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys,\n values\n }\n } as LocalStorageProxySetTask);\n } */\n\n await this.storage.save(keys, values);\n // console.log('setItem: have set', key/* , value */);\n } catch(e) {\n // this.useCS = false;\n console.error('[AS]: set error:', e, keys, values);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.saveThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.deleteThrottled = throttle(async() => {\n const deferred = this.deleteDeferred;\n this.deleteDeferred = deferredPromise();\n\n const set = this.keysToDelete;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n try {\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys\n }\n } as LocalStorageProxyDeleteTask);\n } */\n\n await this.storage.delete(keys);\n } catch(e) {\n console.error('[AS]: delete error:', e, keys);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.deleteThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.getThrottled = throttle(async() => {\n const keys = Array.from(this.getPromises.keys());\n\n // const perf = performance.now();\n this.storage.get(keys as string[]).then((values) => {\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // @ts-ignore\n deferred.resolve(this.cache[key] = values[i]);\n this.getPromises.delete(key);\n }\n }\n\n // console.log('[AS]: get time', keys, performance.now() - perf);\n }, (error: ApiError) => {\n const ignoreErrors: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE']);\n if(!ignoreErrors.has(error.type)) {\n this.useStorage = false;\n console.error('[AS]: get error:', error, keys, storeName);\n }\n\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // deferred.reject(error);\n deferred.resolve(undefined);\n this.getPromises.delete(key);\n }\n }\n }).finally(() => {\n if(this.getPromises.size) {\n this.getThrottled();\n }\n });\n }, THROTTLE_TIME, false);\n }\n\n public isAvailable() {\n return this.useStorage;\n }\n\n public getCache() {\n return this.cache;\n }\n\n public getFromCache(key: T) {\n return this.cache[key];\n }\n\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\n return this.cache[key] = value;\n }\n\n public async get(key: T, useCache = true): Promise {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.getFromCache(key);\n } else if(this.useStorage) {\n const r = this.getPromises.get(key);\n if(r) return r as any;\n\n const p = deferredPromise();\n this.getPromises.set(key, p as any);\n\n this.getThrottled();\n\n return p;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public getAll() {\n return this.storage.getAll().catch(() => []);\n }\n\n public set(obj: Partial, onlyLocal = false) {\n // console.log('storageSetValue', obj, callback, arguments);\n\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.setToCache(key, value);\n\n // let perf = /* DEBUG */false ? performance.now() : 0;\n // value = JSON.stringify(value);\n\n // if(perf) {\n // let elapsedTime = performance.now() - perf;\n // if(elapsedTime > 10) {\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\n // }\n // }\n\n /* perf = performance.now();\n value = stringify(value);\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\n\n if(canUseStorage) {\n this.keysToSet.add(key);\n this.keysToDelete.delete(key);\n this.saveThrottled();\n }\n }\n }\n\n return canUseStorage ? this.saveDeferred : Promise.resolve();\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n /* if(!this.cache.hasOwnProperty(key)) {\n return;\n } */\n\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n if(this.useStorage) {\n this.keysToSet.delete(key);\n this.keysToDelete.add(key);\n this.deleteThrottled();\n }\n\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\n }\n\n public clear(saveLocal = false) {\n if(!saveLocal) {\n for(const i in this.cache) {\n delete this.cache[i];\n }\n }\n\n return this.storage.clear().catch(noop);\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!IS_WORKER || !clearWrite) {\n return;\n }\n\n if(!enabled) {\n storage.keysToSet.clear();\n storage.keysToDelete.clear();\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\n storage.getPromises.clear();\n return storage.clear(true);\n } else {\n return storage.set(storage.cache);\n }\n })).catch(noop);\n }\n\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\n this.STORAGES.forEach((storage) => storage.savingFreezed = true);\n try {\n callback();\n } catch(err) {\n console.error('freezeSaving callback error:', err);\n }\n this.STORAGES.forEach((storage) => storage.savingFreezed = false);\n }\n\n /* public deleteDatabase() {\n return IDBStorage.deleteDatabase().catch(noop);\n } */\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppStorage = AppStorage);\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n\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)';\nexport default originalString;\n"],"names":["MAIN_DOMAINS","threads","Math","min","navigator","hardwareConcurrency","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","includes","location","hostname","suffix","cryptoWorkers","name","stores","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","Blob","type","blobSafeMimeType","indexOf","bufferConcats","args","length","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","forEach","b","set","ArrayBuffer","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","listeners","callback","addNotifyListener","push","deferred","Promise","resolve","reject","value","catch","finally","cancel","Object","assign","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","then","slice","bind","noop","copy","obj","Date","getTime","map","el","isView","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","keys","tx","every","key","isObject","object","safeAssign","fromObject","i","undefined","validateInitObject","initObject","currentObject","onReplace","previousKey","String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","abs","newMethod","originMethod","call","arrays","Uint16Array","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","recordPromiseBound","log","promise","description","perf","performance","now","warn","recordPromise","pause","ms","setTimeout","throttle","fn","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","capitalizeFirstLetter","string","charAt","toUpperCase","toggleStorages","enabled","clearWrite","tsNow","seconds","t","isAnyChat","peerId","isUser","CryptoMessagePort","super","lastIndex","invokeCryptoNew","method","transfer","payload","result","sendPortIndex","sendPorts","invoke","invokeCrypto","cryptoMessagePort","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","match","save","response","put","getFile","fileName","saveFile","blob","Response","headers","size","rejected","timeout","res","clearTimeout","prepareWriting","fileSize","getWriter","static","storage","MemoryWriter","saveFileCallback","bytes","write","part","offset","endOffset","newBytes","truncate","trim","finalize","saveToStorage","getParts","replaceParts","parts","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","IS_SAFARI","IS_FIREFOX","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","MTProtoMessagePort","INSTANCE","concat","toJSON","onFinally","reason","matchUrlProtocol","text","ServiceMessagePort","LocalStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","clear","toggleStorage","LocalStorageController","proxy","apply","sessionStorage","StateStorage","stateStorage","AppStorage","db","storeName","getPromises","Map","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","from","values","e","deleteThrottled","getThrottled","has","isAvailable","getCache","getFromCache","setToCache","r","p","getAll","canUseStorage","add","names"],"sourceRoot":""} \ No newline at end of file diff --git a/public/changelogs/en_1.7.0.md b/public/changelogs/en_1.7.0.md new file mode 100644 index 00000000..980a6a39 --- /dev/null +++ b/public/changelogs/en_1.7.0.md @@ -0,0 +1,15 @@ +🎄 Happy New Year to everyone! [WebK](http://web.telegram.org/k) launched its first update of 2023, adding a pack of feaures you can now enjoy on Web! + +📚 [Topics 2.0](https://telegram.org/blog/ultimate-privacy-topics-2-0#topics-2-0) +Admins of **any group** can enable Topics, creating separate spaces within the group to discuss different subjects – with a sleek **two-column layout** to easily navigate chats. + +😶‍🌫️ [Hidden Media](https://telegram.org/blog/hidden-media-zero-storage-profile-pics#hidden-media) +Media hidden with a shimmering spoiler effect is properly displayed in the app – just tap or click to view the image. The next [WebK](http://web.telegram.org/k) update will allow you to send media with this spoiler effect. + +🏴‍☠️ [No-SIM Signup and Login](https://telegram.org/blog/ultimate-privacy-topics-2-0#sign-up-without-a-sim-card) +Users who have an **anonymous number** from [Fragment](https://fragment.com/numbers) can login to their existing account or create a **new account** with the number. + +🔤 [Collectible Usernames](https://telegram.org/blog/topics-in-groups-collectible-usernames#collectible-usernames) +Owners of collectible usernames can now **assign collectibles** to their personal account, groups or channels – and **manage** them within the app. + +Lastly, the app also preserves your **history stack** – if you follow a [t.me](https://t.me) link to another message in a chat, you can return to the **first message** with the 🔽 button. diff --git a/public/changelogs/ru_1.7.0.md b/public/changelogs/ru_1.7.0.md new file mode 100644 index 00000000..71730a09 --- /dev/null +++ b/public/changelogs/ru_1.7.0.md @@ -0,0 +1,15 @@ +🎄 [WebK](http://web.telegram.org/k) поздравляет Вас с праздниками! Первое обновление этого года дарит Вам возможность пользоваться уже знакомыми функциями теперь и в браузерах! + +📚 [Темы 2.0](https://telegram.org/blog/ultimate-privacy-topics-2-0/ru#temi-2-0) +Администраторы **любой группы** могут организовать обсуждения по темам. В группы с темами добавлена новая **вертикальная панель** для удобства переключения на другие чаты. + +😶‍🌫️ [Скрытые медиа](https://telegram.org/blog/hidden-media-zero-storage-profile-pics/ru#otpravka-skritih-media) +Приложение научилось отображать медиа, скрытые под искрящейся **полупрозрачной обложкой**. Кликните или коснитесь такого медиа, чтобы увидеть что спрятано внутри. В следующем обновлении [WebK](http://web.telegram.org/k) также научится отправлять подобные медиа. + +🏴‍☠ [Регистрация и вход без сим-карты](https://telegram.org/blog/ultimate-privacy-topics-2-0/ru#registratsiya-bez-sim-karti) +Обладатели **анонимных номеров** с [платформы Fragment](https://fragment.com/numbers) теперь могут **зарегистрироваться** или попасть в уже существующий аккаунт, привязанный к анонимному номеру. + +🔤 [Коллекционные публичные имена](https://telegram.org/blog/topics-in-groups-collectible-usernames/ru#kollektsionnie-publichnie-imena) +Обладатели [коллекционных публичных имен](https://fragment.com/) получили возможность управлять такими именами, включая их привязку к личным аккаунтам, группам или каналам. + +А ещё приложение научилось **возвращать Вас обратно** к исходной позиции в том же чате — если Вы перешли от одного сообщения к другому с помощью ссылки [t.me](https://t.me). Чтобы вернуться обратно, воспользуйтесь кнопкой 🔽. diff --git a/public/crypto.worker.a0cf65ddba162cb08d08.chunk.js b/public/crypto.worker.7b5d9830f9811f2a50fe.chunk.js similarity index 99% rename from public/crypto.worker.a0cf65ddba162cb08d08.chunk.js rename to public/crypto.worker.7b5d9830f9811f2a50fe.chunk.js index 13bb125a..a044ae97 100644 --- a/public/crypto.worker.a0cf65ddba162cb08d08.chunk.js +++ b/public/crypto.worker.7b5d9830f9811f2a50fe.chunk.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e,t,n,r,o,i,f={4762:(e,t,n)=>{n.d(t,{IS_FIREFOX:()=>f,IS_SAFARI:()=>i});var r=n(6761);const o=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&r.Z.MSStream,!!("safari"in r.Z)||!(!o||!(/\b(iPad|iPhone|iPod)\b/.test(o)||o.match("Safari")&&!o.match("Chrome")))),f=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},1352:(e,t,n)=>{n.d(t,{N5:()=>o,SU:()=>r,kC:()=>i});const r="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,o="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!r,i=o||r,f=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},c=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{f(e,...t)}))}))};r&&c.bind(null,!1),r&&c.bind(null,!0)},6991:(e,t,n)=>{function r(...e){const t=e.reduce(((e,t)=>e+(t.byteLength||t.length)),0),n=new Uint8Array(t);let r=0;return e.forEach((e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,r),r+=e.byteLength||e.length})),n}Uint8Array.prototype.concat=function(...e){return r(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)))))};var o=n(4736),i=n.n(o);i()(Number.MAX_SAFE_INTEGER);const f=i()(i()[2]).pow(64),c=f.divide(i()[2]);function a(e,t=256){return i().fromArray(e instanceof Uint8Array?[...e]:e,t)}function s(e){return new Uint8Array(e.toArray(256).value)}function u(e,t,n){const r=a(e),o=a(t),i=a(n);return s(r.modPow(o,i))}var h=n(745),l=n.n(h),d=n(6761),y=n(153),p=n(410),v=n(1352);class g extends y.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:e,args:t,transfer:n}){const r={method:e,args:t},o=this.listeners.invoke;if(null==o?void 0:o.length){let e=o[0].callback(r);return v.kC||e instanceof Promise||(e=Promise.resolve(e)),e}const i="aes-encrypt"===e||"aes-decrypt"===e?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",r,void 0,this.sendPorts[i],n)}invokeCrypto(e,...t){return this.invokeCryptoNew({method:e,args:t})}}const w=new g;p.GO&&(p.GO.cryptoMessagePort=w);const b=w;function m(e){const t=e.length,n=8*t;let r=i()(e[0]).and(127).shiftLeft(n-8);for(let o=1;o0&&c>7),f[i[s]^s]=s;for(;!x[c];c^=e||1)n=(n=a^a<<1^a<<2^a<<3^a<<4)>>8^255&n^99,x[c]=n,K[n]=c,o=16843009*i[t=i[e=i[c]]]^65537*t^257*e^16843008*c,r=257*i[n]^16843008*n,E[c]=r=r<<24^r>>>8,L[c]=r=r<<24^r>>>8,F[c]=r=r<<24^r>>>8,_[c]=r=r<<24^r>>>8,O[n]=o=o<<24^o>>>8,I[n]=o=o<<24^o>>>8,z[n]=o=o<<24^o>>>8,M[n]=o=o<<24^o>>>8,a=f[a]||1}();var Z=function(){function e(e){var t=N(e);if(4!==t.length&&6!==t.length&&8!==t.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*t.length+28),this.decKey=new Uint32Array(4*t.length+28),this.encKey.set(t);for(var n,r=1,o=t.length;o<4*t.length+28;o++)n=this.encKey[o-1],(o%t.length==0||8===t.length&&o%t.length==4)&&(n=x[n>>>24]<<24^x[n>>16&255]<<16^x[n>>8&255]<<8^x[255&n],o%t.length==0&&(n=n<<8^n>>>24^r<<24,r=r<<1^283*(r>>7))),this.encKey[o]=this.encKey[o-t.length]^n;for(var i=0;o;i++,o--)n=this.encKey[3&i?o:o-4],this.decKey[i]=o<=4||i<4?n:O[x[n>>>24]]^I[x[n>>16&255]]^z[x[n>>8&255]]^M[x[255&n]]}return e.prototype.encrypt=function(e){for(var t,n,r,o=N(e),i=new Uint32Array(4),f=o[0]^this.encKey[0],c=o[1]^this.encKey[1],a=o[2]^this.encKey[2],s=o[3]^this.encKey[3],u=this.encKey.length/4-2,h=4,l=0;l>>24]^L[c>>16&255]^F[a>>8&255]^_[255&s]^this.encKey[h],n=E[c>>>24]^L[a>>16&255]^F[s>>8&255]^_[255&f]^this.encKey[h+1],r=E[a>>>24]^L[s>>16&255]^F[f>>8&255]^_[255&c]^this.encKey[h+2],s=E[s>>>24]^L[f>>16&255]^F[c>>8&255]^_[255&a]^this.encKey[h+3],f=t,c=n,a=r,h+=4;for(l=0;l<4;l++)i[l]=x[f>>>24]<<24^x[c>>16&255]<<16^x[a>>8&255]<<8^x[255&s]^this.encKey[h++],t=f,f=c,c=a,a=s,s=t;return i},e.prototype.decrypt=function(e){for(var t,n,r,o=N(e),i=new Uint32Array(4),f=o[0]^this.decKey[0],c=o[3]^this.decKey[1],a=o[2]^this.decKey[2],s=o[1]^this.decKey[3],u=this.decKey.length/4-2,h=4,l=0;l>>24]^I[c>>16&255]^z[a>>8&255]^M[255&s]^this.decKey[h],n=O[c>>>24]^I[a>>16&255]^z[s>>8&255]^M[255&f]^this.decKey[h+1],r=O[a>>>24]^I[s>>16&255]^z[f>>8&255]^M[255&c]^this.decKey[h+2],s=O[s>>>24]^I[f>>16&255]^z[c>>8&255]^M[255&a]^this.decKey[h+3],f=t,c=n,a=r,h+=4;for(l=0;l<4;l++)i[3&-l]=K[f>>>24]<<24^K[c>>16&255]<<16^K[a>>8&255]<<8^K[255&s]^this.decKey[h++],t=f,f=c,c=a,a=s,s=t;return i},e}(),B=function(){function e(e,t,n){void 0===n&&(n=16),this.key=N(e),this.iv=N(t),this.cipher=new Z(e),this.blockSize=n/4}return e.prototype.encrypt=function(e,t){for(var n=N(e),r=t||new Uint32Array(n.length),o=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),f=new Uint32Array(this.blockSize),c=0;c>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}function W(e,t,n,r=!0){return function(e){const t=new Uint8Array(e.byteLength);for(let n=0,r=4*e.length;n>>2]>>>24-n%4*8&255;return t}(new B(T(t),T(n))[r?"encrypt":"decrypt"](T(e)))}!function(){function e(e,t,n){if(void 0===n&&(n=16),this.offset=0,this.key=N(e),this.counter=N(t),this.cipher=new Z(e),this.blockSize=n/4,4!==this.counter.length)throw new Error("AES-CTR mode counter must be 16 bytes length")}e.prototype.encrypt=function(e,t){for(var n=N(e),r=t||new Uint32Array(n.length),o=this.offset,i=0;i=this.blockSize&&this.incrementCounter(),o&&(i-=o,o=0)}return this.offset=(this.offset+n.length%4)%4,r},e.prototype.decrypt=function(e,t){return this.encrypt(e,t)},e.prototype.incrementCounter=function(){for(var e=this.counter.length-1;e>=0&&!(++this.counter[e]<4294967295);e--);}}();const j={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function q(e,t){return i().randBetween(e,t,(()=>function(e){const t=j[e];return crypto.getRandomValues(t),t[0]}(32)/4294967295))}function G(e){const t=i()[2];if(e.remainder(t).isZero())return t;const n=i()(1e3);let r,o,f,c,a,s,u;do{r=q(i().one,e.minus(1))}while(r.isZero()||r.eq(e.minus(t)));f=q(i().one,e.minus(1)),a=i().one,s=i().one;const h=i()("FFFFFFFFFFFFFFFF",16).minus(e).plus(1),l=n=>((n=(n=n.pow(t).mod(e)).add(r)).lesser(r)&&(n=n.add(h)),n.mod(e));do{o=f;for(let e=0;i()(e).lesser(a);++e)f=l(f);let t=i().zero;do{c=f;const r=i().min(n,a.minus(t));for(let t=0;i()(t).lesser(r);++t)f=l(f),s=s.multiply(o.greater(f)?o.minus(f):f.minus(o)).mod(e);u=i().gcd(s,e),t=t.add(n)}while(t.lesser(a)&&u.eq(i().one));a=a.shiftLeft(i().one)}while(u.eq(i().one));if(u.eq(e))do{c=l(c),u=i().gcd(o.minus(c).abs(),e)}while(u.eq(i().one));return u}const D="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var J=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,c)}a((r=r.apply(e,t||[])).next())}))};class ${constructor(e,t,n){this.mode=e,this.cryptoKey=t,this.queue=[],this.counter=a(n)}update(e){return J(this,void 0,void 0,(function*(){return new Promise((t=>{this.queue.push({data:e,resolve:t}),this.release()}))}))}release(){return J(this,void 0,void 0,(function*(){if(!this.releasing){for(this.releasing=!0;this.queue.length;){const{data:e,resolve:t}=this.queue.shift();t(yield this._update(e))}this.releasing=!1}}))}perform(e){return J(this,void 0,void 0,(function*(){return yield D[this.mode]({name:"AES-CTR",counter:S(s(this.counter),16,!0,!0,!0),length:128},this.cryptoKey,e)}))}_update(e){return J(this,void 0,void 0,(function*(){let t,n=e;if(this.leftLength){const e=this.leftLength,r=16-e,o=new Uint8Array(e).concat(n.slice(0,r)),i=yield this.perform(o);t=new Uint8Array(i.slice(e)),n=n.slice(r),this.counter=this.counter.add(1)}const r=new Uint8Array(yield this.perform(n)),o=t?t.concat(r):r;let i=n.length;const f=i%16;i-=f;const c=i/16;return this.counter=this.counter.add(c),this.leftLength=f||void 0,o}))}}var V=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,c)}a((r=r.apply(e,t||[])).next())}))};const X=new Map;let H=-1;console.log("CryptoWorker start");const Y={sha1:function(e){return D.digest("SHA-1",P(e)).then((e=>new Uint8Array(e)))},sha256:function(e){return D.digest("SHA-256",P(e)).then((e=>new Uint8Array(e)))},pbkdf2:function(e,t,n){return r=this,o=void 0,f=function*(){const r=yield D.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return D.deriveBits({name:"PBKDF2",salt:t,iterations:n,hash:{name:"SHA-512"}},r,512).then((e=>new Uint8Array(e)))},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{a(f.next(e))}catch(e){t(e)}}function c(e){try{a(f.throw(e))}catch(e){t(e)}}function a(t){var r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,c)}a((f=f.apply(r,o||[])).next())}));var r,o,i,f},"aes-encrypt":function(e,t,n){return W(S(e),t,n,!0)},"aes-decrypt":function(e,t,n){return W(e,t,n,!1)},"rsa-encrypt":function(e,t){return u(e,U(t.exponent),U(t.modulus))},factorize:function(e){let t=function(e){const t=a(e),n=[],r=[];let o=G(t);n.push(t.divide(o)),n.push(o);do{const e=n.pop();if(!e.eq(i().one))if(e.isPrime(!0)){r.push(e);for(let t=0;te.compare(t))),t.length>2&&(t=[t.splice(t.length-2,1)[0],t.reduce(((e,t)=>e.multiply(t)),i().one)]);const n=t[0],r=t[t.length-1];return(n.lesser(r)?[n,r]:[r,n]).map((e=>s(e)))},"mod-pow":u,gzipUncompress:function(e,t){return l().inflate(e,t?{to:"string"}:void 0)},computeSRP:function(e,t,n){return C(this,void 0,void 0,(function*(){const o=n?t.new_algo:t.current_algo,f=a(o.p),c=i()(o.g),u=yield function(e,t,n){return C(this,void 0,void 0,(function*(){let o=yield b.invokeCrypto("sha256",r(t,(new TextEncoder).encode(e),t));o=r(n,o,n),o=yield b.invokeCrypto("sha256",o);let i=yield b.invokeCrypto("pbkdf2",new Uint8Array(o),t,1e5);return i=r(n,i,n),o=yield b.invokeCrypto("sha256",i),o}))}(e,o.salt1,o.salt2),h=i()(function(e){const t=e.length,n=new Array(t);for(let r=0;r{const t=new Uint8Array(e.length);for(let n=0;n{const n=t.subtract(e);return!(n.isNegative()||n.bitLength().toJSNumber()<1984||e.bitLength().toJSNumber()<1984||Math.floor((e.bitLength().toJSNumber()+7)/8)>256)},{a:k,a_for_hash:U,u:x}=yield(()=>C(this,void 0,void 0,(function*(){for(;;){const e=a(y(t.secure_random)),n=c.modPow(e,f);if(A(n,f)){const t=s(n),o=a(yield b.invokeCrypto("sha256",r(t,w)));if(!o.isZero()&&!o.isNegative())return{a:e,a_for_hash:t,u:o}}}})))();let K;K=p.greater(m)?p:p.add(f),K=K.subtract(m).mod(f);const E=x.multiply(h),L=k.add(E),F=K.modPow(L,f),_=yield b.invokeCrypto("sha256",l(s(F),256));let O=yield b.invokeCrypto("sha256",v);O=function(e,t){const n=e.length,r=new Uint8Array(n);for(let o=0;o{for(;;){const t=k(new Uint8Array(e.length)),n=a(t);if(!n.greater(i().one))continue;const r=a(e);if(n.lesser(r.subtract(i().one)))return t}})(t),o=U(n.toString(16)),f=S(yield b.invokeCrypto("mod-pow",o,r,t),256,!0,!0,!0);return{a:r,g_a:f,g_a_hash:yield b.invokeCrypto("sha256",f),p:t}},new((r=void 0)||(r=Promise))((function(e,i){function f(e){try{a(o.next(e))}catch(e){i(e)}}function c(e){try{a(o.throw(e))}catch(e){i(e)}}function a(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(f,c)}a((o=o.apply(t,n||[])).next())}));var t,n,r,o},"compute-dh-key":function(e,t,n){return r=this,o=void 0,s=function*(){const r=yield b.invokeCrypto("mod-pow",e,t,n);var o;return{key:r,key_fingerprint:(o=a((yield b.invokeCrypto("sha1",r)).slice(-8).reverse()),o.greater(c)?o.minus(f):o).toString(10)}},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function f(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,f)}c((s=s.apply(r,o||[])).next())}));var r,o,i,s},"get-emojis-fingerprint":function(e,t){return n=this,r=void 0,i=function*(){const n=e.concat(t),r=yield b.invokeCrypto("sha256",n),o=[],i=A.length;for(let e=0;e!=r.length;e+=8){const t=m(r.slice(e,e+8)).mod(i).toJSNumber(),n=A[t];o.push(n)}return o},new((o=void 0)||(o=Promise))((function(e,t){function f(e){try{a(i.next(e))}catch(e){t(e)}}function c(e){try{a(i.throw(e))}catch(e){t(e)}}function a(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(f,c)}a((i=i.apply(n,r||[])).next())}));var n,r,o,i},"aes-ctr-prepare":function({encKey:e,encIv:t,decKey:n,decIv:r}){return V(this,void 0,void 0,(function*(){const o=++H,i=[["encrypt",e],["decrypt",n]].map((([e,t])=>D.importKey("raw",t,{name:"AES-CTR"},!1,[e]))),[f,c]=yield Promise.all(i),a={enc:new $("encrypt",f,t.slice()),dec:new $("decrypt",c,r.slice())};return X.set(o,a),o}))},"aes-ctr-process":function({id:e,data:t,operation:n}){return V(this,void 0,void 0,(function*(){const r=X.get(e);return yield("encrypt"===n?r.enc:r.dec).update(t)}))},"aes-ctr-destroy":function(e){X.delete(e)}};b.addMultipleEventsListeners({invoke:({method:e,args:t})=>Y[e](...t),terminate:()=>{d.Z.close()}}),"undefined"!=typeof MessageChannel&&function(e,t,n){const r=(n,r)=>{e.attachListenPort(n),r&&e.attachSendPort(r),null==t||t(n)};e.setOnPortDisconnect(void 0),"undefined"!=typeof SharedWorkerGlobalScope?d.Z.addEventListener("connect",(e=>r(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?r(d.Z,null):r(d.Z,d.Z)}(b,(e=>{const t=new MessageChannel;b.attachPort(t.port1),b.invokeVoid("port",void 0,e,[t.port2])}))},5003:(e,t,n)=>{n.d(t,{kg:()=>d});var r,o=n(410),i=n(4762),f=n(1352),c=n(5289);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(r||(r={}));const a=[r.None,r.Error,r.Warn,r.Log,r.Debug],s=!(i.IS_SAFARI||i.IS_FIREFOX),u="",h="",l=[["debug",r.Debug],["info",r.Log],["warn",r.Warn],["error",r.Error],["assert",r.Error],["trace",r.Log],["group",r.Log],["groupCollapsed",r.Log],["groupEnd",r.Log]];function d(e,t=r.Log|r.Warn|r.Error,n=!1,i=""){let y;o.ZP||n||(t=r.Error),s?i||(f.SU?i=u:f.N5&&(i=h)):i="";const p=i;i=i?`%s ${i}%s`:"%s";const v=function(...n){return t&r.Log&&console.log(i,(0,c.Z)(),e,...n)};return l.forEach((([n,r])=>{v[n]=function(...o){return t&r&&console[n](i,(0,c.Z)(),e,...o)}})),v.setPrefix=function(t){y=t,e="["+t+"]"},v.setPrefix(e),v.setLevel=function(e){t=a.slice(0,e+1).reduce(((e,t)=>e|t),0)},v.bindPrefix=function(e){return d(`${y}] [${e}`,t,n,p)},v}}},c={};function a(e){var t=c[e];if(void 0!==t)return t.exports;var n=c[e]={id:e,loaded:!1,exports:{}};return f[e].call(n.exports,n,n.exports,a),n.loaded=!0,n.exports}a.m=f,a.x=()=>{var e=a.O(void 0,[699,211,437],(()=>a(6991)));return a.O(e)},e=[],a.O=(t,n,r,o)=>{if(!n){var i=1/0;for(u=0;u=o)&&Object.keys(a.O).every((e=>a.O[e](n[c])))?n.splice(c--,1):(f=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,r,o]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>437===e?"437.77e92ccb32c21ff43a10.bundle.js":{211:"npm.big-integer",699:"npm.pako"}[e]+"."+{211:"a70c90f1bcf51a3f9932",699:"f16d6f756c34f3914132"}[e]+".chunk.js",a.miniCssF=e=>{},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),t=a.u,n=a.e,r=new Map,o=new Map,a.u=function(e){return t(e)+(r.has(e)?"?"+r.get(e):"")},a.e=function(e){return n(e).catch((function(n){var i=o.has(e)?o.get(e):999999;if(i<1){var f=t(e);throw n.message="Loading chunk "+e+" failed after 999999 retries.\n("+f+")",n.request=f,n}return new Promise((function(t){setTimeout((function(){var n=Date.now();r.set(e,n),o.set(e,i-1),t(a.e(e))}),3e3)}))}))},(()=>{var e={589:1};a.f.i=(t,n)=>{e[t]||importScripts(a.p+a.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[r,o,i]=t;for(var f in o)a.o(o,f)&&(a.m[f]=o[f]);for(i&&i(a);r.length;)e[r.pop()]=1;n(t)}})(),i=a.x,a.x=()=>Promise.all([699,211,437].map(a.e,a)).then(i),a.x()})(); -//# sourceMappingURL=crypto.worker.a0cf65ddba162cb08d08.chunk.js.map \ No newline at end of file +(()=>{"use strict";var e,t,n,r,o,i,f={4762:(e,t,n)=>{n.d(t,{IS_FIREFOX:()=>f,IS_SAFARI:()=>i});var r=n(6761);const o=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&r.Z.MSStream,!!("safari"in r.Z)||!(!o||!(/\b(iPad|iPhone|iPod)\b/.test(o)||o.match("Safari")&&!o.match("Chrome")))),f=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},1352:(e,t,n)=>{n.d(t,{N5:()=>o,SU:()=>r,kC:()=>i});const r="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,o="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!r,i=o||r,f=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},c=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{f(e,...t)}))}))};r&&c.bind(null,!1),r&&c.bind(null,!0)},6991:(e,t,n)=>{function r(...e){const t=e.reduce(((e,t)=>e+(t.byteLength||t.length)),0),n=new Uint8Array(t);let r=0;return e.forEach((e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,r),r+=e.byteLength||e.length})),n}Uint8Array.prototype.concat=function(...e){return r(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)))))};var o=n(4736),i=n.n(o);i()(Number.MAX_SAFE_INTEGER);const f=i()(i()[2]).pow(64),c=f.divide(i()[2]);function a(e,t=256){return i().fromArray(e instanceof Uint8Array?[...e]:e,t)}function s(e){return new Uint8Array(e.toArray(256).value)}function u(e,t,n){const r=a(e),o=a(t),i=a(n);return s(r.modPow(o,i))}var h=n(745),l=n.n(h),d=n(6761),y=n(153),p=n(410),v=n(1352);class g extends y.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:e,args:t,transfer:n}){const r={method:e,args:t},o=this.listeners.invoke;if(null==o?void 0:o.length){let e=o[0].callback(r);return v.kC||e instanceof Promise||(e=Promise.resolve(e)),e}const i="aes-encrypt"===e||"aes-decrypt"===e?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",r,void 0,this.sendPorts[i],n)}invokeCrypto(e,...t){return this.invokeCryptoNew({method:e,args:t})}}const w=new g;p.GO&&(p.GO.cryptoMessagePort=w);const b=w;function m(e){const t=e.length,n=8*t;let r=i()(e[0]).and(127).shiftLeft(n-8);for(let o=1;o0&&c>7),f[i[s]^s]=s;for(;!x[c];c^=e||1)n=(n=a^a<<1^a<<2^a<<3^a<<4)>>8^255&n^99,x[c]=n,K[n]=c,o=16843009*i[t=i[e=i[c]]]^65537*t^257*e^16843008*c,r=257*i[n]^16843008*n,E[c]=r=r<<24^r>>>8,L[c]=r=r<<24^r>>>8,F[c]=r=r<<24^r>>>8,_[c]=r=r<<24^r>>>8,O[n]=o=o<<24^o>>>8,I[n]=o=o<<24^o>>>8,z[n]=o=o<<24^o>>>8,M[n]=o=o<<24^o>>>8,a=f[a]||1}();var Z=function(){function e(e){var t=N(e);if(4!==t.length&&6!==t.length&&8!==t.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*t.length+28),this.decKey=new Uint32Array(4*t.length+28),this.encKey.set(t);for(var n,r=1,o=t.length;o<4*t.length+28;o++)n=this.encKey[o-1],(o%t.length==0||8===t.length&&o%t.length==4)&&(n=x[n>>>24]<<24^x[n>>16&255]<<16^x[n>>8&255]<<8^x[255&n],o%t.length==0&&(n=n<<8^n>>>24^r<<24,r=r<<1^283*(r>>7))),this.encKey[o]=this.encKey[o-t.length]^n;for(var i=0;o;i++,o--)n=this.encKey[3&i?o:o-4],this.decKey[i]=o<=4||i<4?n:O[x[n>>>24]]^I[x[n>>16&255]]^z[x[n>>8&255]]^M[x[255&n]]}return e.prototype.encrypt=function(e){for(var t,n,r,o=N(e),i=new Uint32Array(4),f=o[0]^this.encKey[0],c=o[1]^this.encKey[1],a=o[2]^this.encKey[2],s=o[3]^this.encKey[3],u=this.encKey.length/4-2,h=4,l=0;l>>24]^L[c>>16&255]^F[a>>8&255]^_[255&s]^this.encKey[h],n=E[c>>>24]^L[a>>16&255]^F[s>>8&255]^_[255&f]^this.encKey[h+1],r=E[a>>>24]^L[s>>16&255]^F[f>>8&255]^_[255&c]^this.encKey[h+2],s=E[s>>>24]^L[f>>16&255]^F[c>>8&255]^_[255&a]^this.encKey[h+3],f=t,c=n,a=r,h+=4;for(l=0;l<4;l++)i[l]=x[f>>>24]<<24^x[c>>16&255]<<16^x[a>>8&255]<<8^x[255&s]^this.encKey[h++],t=f,f=c,c=a,a=s,s=t;return i},e.prototype.decrypt=function(e){for(var t,n,r,o=N(e),i=new Uint32Array(4),f=o[0]^this.decKey[0],c=o[3]^this.decKey[1],a=o[2]^this.decKey[2],s=o[1]^this.decKey[3],u=this.decKey.length/4-2,h=4,l=0;l>>24]^I[c>>16&255]^z[a>>8&255]^M[255&s]^this.decKey[h],n=O[c>>>24]^I[a>>16&255]^z[s>>8&255]^M[255&f]^this.decKey[h+1],r=O[a>>>24]^I[s>>16&255]^z[f>>8&255]^M[255&c]^this.decKey[h+2],s=O[s>>>24]^I[f>>16&255]^z[c>>8&255]^M[255&a]^this.decKey[h+3],f=t,c=n,a=r,h+=4;for(l=0;l<4;l++)i[3&-l]=K[f>>>24]<<24^K[c>>16&255]<<16^K[a>>8&255]<<8^K[255&s]^this.decKey[h++],t=f,f=c,c=a,a=s,s=t;return i},e}(),B=function(){function e(e,t,n){void 0===n&&(n=16),this.key=N(e),this.iv=N(t),this.cipher=new Z(e),this.blockSize=n/4}return e.prototype.encrypt=function(e,t){for(var n=N(e),r=t||new Uint32Array(n.length),o=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),f=new Uint32Array(this.blockSize),c=0;c>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}function W(e,t,n,r=!0){return function(e){const t=new Uint8Array(e.byteLength);for(let n=0,r=4*e.length;n>>2]>>>24-n%4*8&255;return t}(new B(T(t),T(n))[r?"encrypt":"decrypt"](T(e)))}!function(){function e(e,t,n){if(void 0===n&&(n=16),this.offset=0,this.key=N(e),this.counter=N(t),this.cipher=new Z(e),this.blockSize=n/4,4!==this.counter.length)throw new Error("AES-CTR mode counter must be 16 bytes length")}e.prototype.encrypt=function(e,t){for(var n=N(e),r=t||new Uint32Array(n.length),o=this.offset,i=0;i=this.blockSize&&this.incrementCounter(),o&&(i-=o,o=0)}return this.offset=(this.offset+n.length%4)%4,r},e.prototype.decrypt=function(e,t){return this.encrypt(e,t)},e.prototype.incrementCounter=function(){for(var e=this.counter.length-1;e>=0&&!(++this.counter[e]<4294967295);e--);}}();const j={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function q(e,t){return i().randBetween(e,t,(()=>function(e){const t=j[e];return crypto.getRandomValues(t),t[0]}(32)/4294967295))}function G(e){const t=i()[2];if(e.remainder(t).isZero())return t;const n=i()(1e3);let r,o,f,c,a,s,u;do{r=q(i().one,e.minus(1))}while(r.isZero()||r.eq(e.minus(t)));f=q(i().one,e.minus(1)),a=i().one,s=i().one;const h=i()("FFFFFFFFFFFFFFFF",16).minus(e).plus(1),l=n=>((n=(n=n.pow(t).mod(e)).add(r)).lesser(r)&&(n=n.add(h)),n.mod(e));do{o=f;for(let e=0;i()(e).lesser(a);++e)f=l(f);let t=i().zero;do{c=f;const r=i().min(n,a.minus(t));for(let t=0;i()(t).lesser(r);++t)f=l(f),s=s.multiply(o.greater(f)?o.minus(f):f.minus(o)).mod(e);u=i().gcd(s,e),t=t.add(n)}while(t.lesser(a)&&u.eq(i().one));a=a.shiftLeft(i().one)}while(u.eq(i().one));if(u.eq(e))do{c=l(c),u=i().gcd(o.minus(c).abs(),e)}while(u.eq(i().one));return u}const D="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var J=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,c)}a((r=r.apply(e,t||[])).next())}))};class ${constructor(e,t,n){this.mode=e,this.cryptoKey=t,this.queue=[],this.counter=a(n)}update(e){return J(this,void 0,void 0,(function*(){return new Promise((t=>{this.queue.push({data:e,resolve:t}),this.release()}))}))}release(){return J(this,void 0,void 0,(function*(){if(!this.releasing){for(this.releasing=!0;this.queue.length;){const{data:e,resolve:t}=this.queue.shift();t(yield this._update(e))}this.releasing=!1}}))}perform(e){return J(this,void 0,void 0,(function*(){return yield D[this.mode]({name:"AES-CTR",counter:S(s(this.counter),16,!0,!0,!0),length:128},this.cryptoKey,e)}))}_update(e){return J(this,void 0,void 0,(function*(){let t,n=e;if(this.leftLength){const e=this.leftLength,r=16-e,o=new Uint8Array(e).concat(n.slice(0,r)),i=yield this.perform(o);t=new Uint8Array(i.slice(e)),n=n.slice(r),this.counter=this.counter.add(1)}const r=new Uint8Array(yield this.perform(n)),o=t?t.concat(r):r;let i=n.length;const f=i%16;i-=f;const c=i/16;return this.counter=this.counter.add(c),this.leftLength=f||void 0,o}))}}var V=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,c)}a((r=r.apply(e,t||[])).next())}))};const X=new Map;let H=-1;console.log("CryptoWorker start");const Y={sha1:function(e){return D.digest("SHA-1",P(e)).then((e=>new Uint8Array(e)))},sha256:function(e){return D.digest("SHA-256",P(e)).then((e=>new Uint8Array(e)))},pbkdf2:function(e,t,n){return r=this,o=void 0,f=function*(){const r=yield D.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return D.deriveBits({name:"PBKDF2",salt:t,iterations:n,hash:{name:"SHA-512"}},r,512).then((e=>new Uint8Array(e)))},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{a(f.next(e))}catch(e){t(e)}}function c(e){try{a(f.throw(e))}catch(e){t(e)}}function a(t){var r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,c)}a((f=f.apply(r,o||[])).next())}));var r,o,i,f},"aes-encrypt":function(e,t,n){return W(S(e),t,n,!0)},"aes-decrypt":function(e,t,n){return W(e,t,n,!1)},"rsa-encrypt":function(e,t){return u(e,U(t.exponent),U(t.modulus))},factorize:function(e){let t=function(e){const t=a(e),n=[],r=[];let o=G(t);n.push(t.divide(o)),n.push(o);do{const e=n.pop();if(!e.eq(i().one))if(e.isPrime(!0)){r.push(e);for(let t=0;te.compare(t))),t.length>2&&(t=[t.splice(t.length-2,1)[0],t.reduce(((e,t)=>e.multiply(t)),i().one)]);const n=t[0],r=t[t.length-1];return(n.lesser(r)?[n,r]:[r,n]).map((e=>s(e)))},"mod-pow":u,gzipUncompress:function(e,t){return l().inflate(e,t?{to:"string"}:void 0)},computeSRP:function(e,t,n){return C(this,void 0,void 0,(function*(){const o=n?t.new_algo:t.current_algo,f=a(o.p),c=i()(o.g),u=yield function(e,t,n){return C(this,void 0,void 0,(function*(){let o=yield b.invokeCrypto("sha256",r(t,(new TextEncoder).encode(e),t));o=r(n,o,n),o=yield b.invokeCrypto("sha256",o);let i=yield b.invokeCrypto("pbkdf2",new Uint8Array(o),t,1e5);return i=r(n,i,n),o=yield b.invokeCrypto("sha256",i),o}))}(e,o.salt1,o.salt2),h=i()(function(e){const t=e.length,n=new Array(t);for(let r=0;r{const t=new Uint8Array(e.length);for(let n=0;n{const n=t.subtract(e);return!(n.isNegative()||n.bitLength().toJSNumber()<1984||e.bitLength().toJSNumber()<1984||Math.floor((e.bitLength().toJSNumber()+7)/8)>256)},{a:k,a_for_hash:U,u:x}=yield(()=>C(this,void 0,void 0,(function*(){for(;;){const e=a(y(t.secure_random)),n=c.modPow(e,f);if(A(n,f)){const t=s(n),o=a(yield b.invokeCrypto("sha256",r(t,w)));if(!o.isZero()&&!o.isNegative())return{a:e,a_for_hash:t,u:o}}}})))();let K;K=p.greater(m)?p:p.add(f),K=K.subtract(m).mod(f);const E=x.multiply(h),L=k.add(E),F=K.modPow(L,f),_=yield b.invokeCrypto("sha256",l(s(F),256));let O=yield b.invokeCrypto("sha256",v);O=function(e,t){const n=e.length,r=new Uint8Array(n);for(let o=0;o{for(;;){const t=k(new Uint8Array(e.length)),n=a(t);if(!n.greater(i().one))continue;const r=a(e);if(n.lesser(r.subtract(i().one)))return t}})(t),o=U(n.toString(16)),f=S(yield b.invokeCrypto("mod-pow",o,r,t),256,!0,!0,!0);return{a:r,g_a:f,g_a_hash:yield b.invokeCrypto("sha256",f),p:t}},new((r=void 0)||(r=Promise))((function(e,i){function f(e){try{a(o.next(e))}catch(e){i(e)}}function c(e){try{a(o.throw(e))}catch(e){i(e)}}function a(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(f,c)}a((o=o.apply(t,n||[])).next())}));var t,n,r,o},"compute-dh-key":function(e,t,n){return r=this,o=void 0,s=function*(){const r=yield b.invokeCrypto("mod-pow",e,t,n);var o;return{key:r,key_fingerprint:(o=a((yield b.invokeCrypto("sha1",r)).slice(-8).reverse()),o.greater(c)?o.minus(f):o).toString(10)}},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function f(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,f)}c((s=s.apply(r,o||[])).next())}));var r,o,i,s},"get-emojis-fingerprint":function(e,t){return n=this,r=void 0,i=function*(){const n=e.concat(t),r=yield b.invokeCrypto("sha256",n),o=[],i=A.length;for(let e=0;e!=r.length;e+=8){const t=m(r.slice(e,e+8)).mod(i).toJSNumber(),n=A[t];o.push(n)}return o},new((o=void 0)||(o=Promise))((function(e,t){function f(e){try{a(i.next(e))}catch(e){t(e)}}function c(e){try{a(i.throw(e))}catch(e){t(e)}}function a(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(f,c)}a((i=i.apply(n,r||[])).next())}));var n,r,o,i},"aes-ctr-prepare":function({encKey:e,encIv:t,decKey:n,decIv:r}){return V(this,void 0,void 0,(function*(){const o=++H,i=[["encrypt",e],["decrypt",n]].map((([e,t])=>D.importKey("raw",t,{name:"AES-CTR"},!1,[e]))),[f,c]=yield Promise.all(i),a={enc:new $("encrypt",f,t.slice()),dec:new $("decrypt",c,r.slice())};return X.set(o,a),o}))},"aes-ctr-process":function({id:e,data:t,operation:n}){return V(this,void 0,void 0,(function*(){const r=X.get(e);return yield("encrypt"===n?r.enc:r.dec).update(t)}))},"aes-ctr-destroy":function(e){X.delete(e)}};b.addMultipleEventsListeners({invoke:({method:e,args:t})=>Y[e](...t),terminate:()=>{d.Z.close()}}),"undefined"!=typeof MessageChannel&&function(e,t,n){const r=(n,r)=>{e.attachListenPort(n),r&&e.attachSendPort(r),null==t||t(n)};e.setOnPortDisconnect(void 0),"undefined"!=typeof SharedWorkerGlobalScope?d.Z.addEventListener("connect",(e=>r(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?r(d.Z,null):r(d.Z,d.Z)}(b,(e=>{const t=new MessageChannel;b.attachPort(t.port1),b.invokeVoid("port",void 0,e,[t.port2])}))},5003:(e,t,n)=>{n.d(t,{kg:()=>d});var r,o=n(410),i=n(4762),f=n(1352),c=n(5289);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(r||(r={}));const a=[r.None,r.Error,r.Warn,r.Log,r.Debug],s=!(i.IS_SAFARI||i.IS_FIREFOX),u="",h="",l=[["debug",r.Debug],["info",r.Log],["warn",r.Warn],["error",r.Error],["assert",r.Error],["trace",r.Log],["group",r.Log],["groupCollapsed",r.Log],["groupEnd",r.Log]];function d(e,t=r.Log|r.Warn|r.Error,n=!1,i=""){let y;o.ZP||n||(t=r.Error),s?i||(f.SU?i=u:f.N5&&(i=h)):i="";const p=i;i=i?`%s ${i}%s`:"%s";const v=function(...n){return t&r.Log&&console.log(i,(0,c.Z)(),e,...n)};return l.forEach((([n,r])=>{v[n]=function(...o){return t&r&&console[n](i,(0,c.Z)(),e,...o)}})),v.setPrefix=function(t){y=t,e="["+t+"]"},v.setPrefix(e),v.setLevel=function(e){t=a.slice(0,e+1).reduce(((e,t)=>e|t),0)},v.bindPrefix=function(e){return d(`${y}] [${e}`,t,n,p)},v}}},c={};function a(e){var t=c[e];if(void 0!==t)return t.exports;var n=c[e]={id:e,loaded:!1,exports:{}};return f[e].call(n.exports,n,n.exports,a),n.loaded=!0,n.exports}a.m=f,a.x=()=>{var e=a.O(void 0,[699,211,437],(()=>a(6991)));return a.O(e)},e=[],a.O=(t,n,r,o)=>{if(!n){var i=1/0;for(u=0;u=o)&&Object.keys(a.O).every((e=>a.O[e](n[c])))?n.splice(c--,1):(f=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,r,o]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>437===e?"437.a80d805671a4b222696d.bundle.js":{211:"npm.big-integer",699:"npm.pako"}[e]+"."+{211:"a70c90f1bcf51a3f9932",699:"f16d6f756c34f3914132"}[e]+".chunk.js",a.miniCssF=e=>{},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),t=a.u,n=a.e,r=new Map,o=new Map,a.u=function(e){return t(e)+(r.has(e)?"?"+r.get(e):"")},a.e=function(e){return n(e).catch((function(n){var i=o.has(e)?o.get(e):999999;if(i<1){var f=t(e);throw n.message="Loading chunk "+e+" failed after 999999 retries.\n("+f+")",n.request=f,n}return new Promise((function(t){setTimeout((function(){var n=Date.now();r.set(e,n),o.set(e,i-1),t(a.e(e))}),3e3)}))}))},(()=>{var e={589:1};a.f.i=(t,n)=>{e[t]||importScripts(a.p+a.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[r,o,i]=t;for(var f in o)a.o(o,f)&&(a.m[f]=o[f]);for(i&&i(a);r.length;)e[r.pop()]=1;n(t)}})(),i=a.x,a.x=()=>Promise.all([699,211,437].map(a.e,a)).then(i),a.x()})(); +//# sourceMappingURL=crypto.worker.7b5d9830f9811f2a50fe.chunk.js.map \ No newline at end of file diff --git a/public/crypto.worker.7b5d9830f9811f2a50fe.chunk.js.map b/public/crypto.worker.7b5d9830f9811f2a50fe.chunk.js.map new file mode 100644 index 00000000..a35500e5 --- /dev/null +++ b/public/crypto.worker.7b5d9830f9811f2a50fe.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"crypto.worker.7b5d9830f9811f2a50fe.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/helpers/bytes/bytesModPow.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/calls/helpers/getEmojisFingerprint.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./node_modules/@cryptography/aes/dist/es/aes.js","webpack://tweb/./src/helpers/bytes/bytesToWordss.ts","webpack://tweb/./src/lib/crypto/utils/aesIGE.ts","webpack://tweb/./src/helpers/bytes/bytesFromWordss.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/bigInt/bigIntRandom.ts","webpack://tweb/./src/lib/crypto/utils/factorize/BrentPollard.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/crypto/utils/aesCTR.ts","webpack://tweb/./src/lib/crypto/aesCtrUtils.ts","webpack://tweb/./src/lib/crypto/crypto.worker.ts","webpack://tweb/./src/lib/crypto/utils/sha1.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/crypto/utils/pbkdf2.ts","webpack://tweb/./src/lib/crypto/utils/rsa.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/lib/crypto/srp.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/crypto/generateDh.ts","webpack://tweb/./src/lib/crypto/computeDhKey.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,437].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\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;\n","/*\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// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from '../helpers/bytes/bufferConcats';\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n // return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","import {bigIntFromBytes, bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function bytesModPow(bytes: number[] | Uint8Array, exp: number[] | Uint8Array, mod: number[] | Uint8Array) {\n const bytesBigInt = bigIntFromBytes(bytes);\n const expBigInt = bigIntFromBytes(exp);\n const modBigInt = bigIntFromBytes(mod);\n const resBigInt = bytesBigInt.modPow(expBigInt, modBigInt);\n return bigIntToBytes(resBigInt);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from '../../crypto/cryptoMessagePort';\nimport bigInt from 'big-integer';\n\nfunction readBigIntFromBytesBE(bytes: Uint8Array) {\n const length = bytes.length;\n const bits = length * 8;\n let value = bigInt(bytes[0]).and(0x7F).shiftLeft(bits - 8);\n for(let i = 1; i < length; ++i) {\n const _bits = bits - (i + 1) * 8;\n const b = bigInt(bytes[i]);\n value = value.or(_bits ? b.shiftLeft(_bits) : b);\n }\n\n return value;\n}\n\n// Emojis were taken from tdlib\nconst emojis = [\n '1f609', '1f60d', '1f61b', '1f62d', '1f631', '1f621', '1f60e',\n '1f634', '1f635', '1f608', '1f62c', '1f607', '1f60f', '1f46e',\n '1f477', '1f482', '1f476', '1f468', '1f469', '1f474', '1f475',\n '1f63b', '1f63d', '1f640', '1f47a', '1f648', '1f649', '1f64a',\n '1f480', '1f47d', '1f4a9', '1f525', '1f4a5', '1f4a4', '1f442',\n '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c',\n '1f44a', '270c', '270b', '1f450', '1f446', '1f447', '1f449',\n '1f448', '1f64f', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483',\n '1f46b', '1f46a', '1f46c', '1f46d', '1f485', '1f3a9', '1f451',\n '1f452', '1f45f', '1f45e', '1f460', '1f455', '1f457', '1f456',\n '1f459', '1f45c', '1f453', '1f380', '1f484', '1f49b', '1f499',\n '1f49c', '1f49a', '1f48d', '1f48e', '1f436', '1f43a', '1f431',\n '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b',\n '1f437', '1f42e', '1f417', '1f434', '1f411', '1f418', '1f43c',\n '1f427', '1f425', '1f414', '1f40d', '1f422', '1f41b', '1f41d',\n '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f41f', '1f42c',\n '1f40b', '1f410', '1f40a', '1f42b', '1f340', '1f339', '1f33b',\n '1f341', '1f33e', '1f344', '1f335', '1f334', '1f333', '1f31e',\n '1f31a', '1f319', '1f30e', '1f30b', '26a1', '2614', '2744', '26c4',\n '1f300', '1f308', '1f30a', '1f393', '1f386', '1f383', '1f47b',\n '1f385', '1f384', '1f381', '1f388', '1f52e', '1f3a5', '1f4f7',\n '1f4bf', '1f4bb', '260e', '1f4e1', '1f4fa', '1f4fb', '1f509',\n '1f514', '23f3', '23f0', '231a', '1f512', '1f511', '1f50e',\n '1f4a1', '1f526', '1f50c', '1f50b', '1f6bf', '1f6bd', '1f527',\n '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a',\n '1f489', '1f4b0', '1f4b5', '1f4b3', '2709', '1f4eb', '1f4e6',\n '1f4c5', '1f4c1', '2702', '1f4cc', '1f4ce', '2712', '270f',\n '1f4d0', '1f4da', '1f52c', '1f52d', '1f3a8', '1f3ac', '1f3a4',\n '1f3a7', '1f3b5', '1f3b9', '1f3bb', '1f3ba', '1f3b8', '1f47e',\n '1f3ae', '1f0cf', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd',\n '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '1f3c1', '1f3c7',\n '1f3c6', '1f3ca', '1f3c4', '2615', '1f37c', '1f37a', '1f377',\n '1f374', '1f355', '1f354', '1f35f', '1f357', '1f371', '1f35a',\n '1f35c', '1f361', '1f373', '1f35e', '1f369', '1f366', '1f382',\n '1f370', '1f36a', '1f36b', '1f36d', '1f36f', '1f34e', '1f34f',\n '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351',\n '1f34c', '1f350', '1f34d', '1f346', '1f345', '1f33d', '1f3e1',\n '1f3e5', '1f3e6', '26ea', '1f3f0', '26fa', '1f3ed', '1f5fb',\n '1f5fd', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '1f6a4',\n '2693', '1f680', '2708', '1f681', '1f682', '1f68b', '1f68e',\n '1f68c', '1f699', '1f697', '1f695', '1f69b', '1f6a8', '1f694',\n '1f692', '1f691', '1f6b2', '1f6a0', '1f69c', '1f6a6', '26a0',\n '1f6a7', '26fd', '1f3b0', '1f5ff', '1f3aa', '1f3ad',\n '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3',\n '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9',\n '1f1f7-1f1fa', '1f1ec-1f1e7', '0031-20e3', '0032-20e3', '0033-20e3',\n '0034-20e3', '0035-20e3', '0036-20e3', '0037-20e3', '0038-20e3', '0039-20e3',\n '0030-20e3', '1f51f', '2757', '2753', '2665', '2666', '1f4af', '1f517',\n '1f531', '1f534', '1f535', '1f536', '1f537'\n];\n\nexport default async function getEmojisFingerprint(key: Uint8Array, g_a: Uint8Array) {\n const arr = key.concat(g_a);\n const hash = await cryptoWorker.invokeCrypto('sha256', arr);\n\n const result: [string, string, string, string] = [] as any;\n const emojisLength = emojis.length;\n\n const kPartSize = 8;\n for(let partOffset = 0; partOffset != hash.length; partOffset += kPartSize) {\n const bytes = hash.slice(partOffset, partOffset + kPartSize);\n const value = readBigIntFromBytesBE(bytes);\n const index = value.mod(emojisLength).toJSNumber();\n\n // const emoji = emojiFromCodePoints(emojis[index]);\n const codePoints = emojis[index];\n result.push(codePoints);\n }\n\n return result;\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default function addPadding(\n bytes: T,\n blockSize: number = 16,\n zeroes?: boolean,\n blockSizeAsTotalLength = false,\n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n // //console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","import convertToUint8Array from './convertToUint8Array';\n\nexport default function bytesToWordss(input: Parameters[0]) {\n const bytes = convertToUint8Array(input);\n\n const words: number[] = [];\n for(let i = 0, len = bytes.length; i < len; ++i) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n\n return new Uint32Array(words);\n}\n","import {IGE} from '@cryptography/aes';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport bytesFromWordss from '../../../helpers/bytes/bytesFromWordss';\nimport bytesToWordss from '../../../helpers/bytes/bytesToWordss';\n\nexport default function aesSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array, encrypt = true) {\n // console.log(dT(), 'AES start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const performedBytes = cipher[encrypt ? 'encrypt' : 'decrypt'](bytesToWordss(bytes));\n // console.log(dT(), 'AES finish');\n\n return bytesFromWordss(performedBytes);\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(addPadding(bytes), keyBytes, ivBytes, true);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(bytes, keyBytes, ivBytes, false);\n}\n","export default function bytesFromWordss(input: Uint32Array) {\n const o = new Uint8Array(input.byteLength);\n for(let i = 0, length = input.length * 4; i < length; ++i) {\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n\n return o;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import bigInt from 'big-integer';\nimport {nextRandomUint} from '../random';\n\nexport default function bigIntRandom(min: bigInt.BigNumber, max: bigInt.BigNumber) {\n return bigInt.randBetween(min, max, () => {\n return nextRandomUint(32) / 0xFFFFFFFF;\n /* const bits = 32;\n const randomBytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(randomBytes);\n const r = bigIntFromBytes(randomBytes).mod(bigInt(2).pow(bits));\n return r.toJSNumber(); */\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// Thanks to https://xn--2-umb.com/09/12/brent-pollard-rho-factorisation/\n\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../../helpers/bigInt/bigIntConversion';\nimport bigIntRandom from '../../../../helpers/bigInt/bigIntRandom';\n\n// let test = 0;\nfunction BrentPollardFactor(n: bigInt.BigInteger) {\n const two = bigInt[2];\n if(n.remainder(two).isZero()) {\n return two;\n }\n\n const m = bigInt(1000);\n let a: bigInt.BigInteger,\n x: bigInt.BigInteger,\n y: bigInt.BigInteger,\n ys: bigInt.BigInteger,\n r: bigInt.BigInteger,\n q: bigInt.BigInteger,\n g: bigInt.BigInteger;\n do\n a = bigIntRandom(bigInt.one, n.minus(1));\n while(a.isZero() || a.eq(n.minus(two)));\n y = bigIntRandom(bigInt.one, n.minus(1));\n r = bigInt.one;\n q = bigInt.one;\n\n // if(!test++) {\n // a = bigInt(3);\n // y = bigInt(3);\n // }\n\n const bigIntUint64 = bigInt('FFFFFFFFFFFFFFFF', 16);\n const bigIntUint64MinusPqPlusOne = bigIntUint64.minus(n).plus(1);\n\n const performY = (y: bigInt.BigInteger) => {\n y = y.pow(two).mod(n);\n y = y.add(a);\n if(y.lesser(a)) { // it slows down the script\n y = y.add(bigIntUint64MinusPqPlusOne);\n }\n y = y.mod(n);\n return y;\n };\n\n do {\n x = y;\n for(let i = 0; bigInt(i).lesser(r); ++i) {\n y = performY(y);\n }\n\n let k = bigInt.zero;\n do {\n ys = y;\n const condition = bigInt.min(m, r.minus(k));\n for(let i = 0; bigInt(i).lesser(condition); ++i) {\n y = performY(y);\n q = q.multiply(x.greater(y) ? x.minus(y) : y.minus(x)).mod(n);\n }\n g = bigInt.gcd(q, n);\n k = k.add(m);\n } while(k.lesser(r) && g.eq(bigInt.one));\n\n r = r.shiftLeft(bigInt.one);\n } while(g.eq(bigInt.one));\n\n if(g.eq(n)) {\n do {\n ys = performY(ys);\n g = bigInt.gcd(x.minus(ys).abs(), n);\n } while(g.eq(bigInt.one));\n }\n\n return g;\n}\n\nfunction primeFactors(pqBytes: Uint8Array | number[]) {\n const n = bigIntFromBytes(pqBytes);\n\n const factors: bigInt.BigInteger[] = [];\n const primes: bigInt.BigInteger[] = [];\n\n let factor = BrentPollardFactor(n);\n factors.push(n.divide(factor));\n factors.push(factor);\n\n // return [factor];\n\n do {\n const m = factors.pop();\n\n if(m.eq(bigInt.one))\n continue;\n\n if(m.isPrime(true)) {\n primes.push(m);\n\n // Remove the prime from the other factors\n for(let i = 0; i < factors.length; ++i) {\n let k = factors[i];\n if(k.mod(m).isZero()) {\n do\n k = k.divide(m);\n while(k.mod(m).isZero());\n factors[i] = k;\n }\n }\n } else {\n // factor = m.lesser(100) ? bigInt(PollardRho(m.toJSNumber())) : this.brentPollardFactor(m);\n factor = BrentPollardFactor(m);\n factors.push(m.divide(factor));\n factors.push(factor);\n }\n } while(factors.length);\n\n return primes;\n}\n\nexport default function factorizeBrentPollardPQ(pqBytes: Uint8Array | number[]): [Uint8Array, Uint8Array] {\n let factors = primeFactors(pqBytes);\n factors.sort((a, b) => a.compare(b));\n if(factors.length > 2) {\n factors = [\n factors.splice(factors.length - 2, 1)[0],\n factors.reduce((acc, v) => acc.multiply(v), bigInt.one)\n ];\n }\n\n const p = factors[0], q = factors[factors.length - 1];\n return (p.lesser(q) ? [p, q] : [q, p]).map((b) => bigIntToBytes(b)) as any;\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {BigInteger} from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport subtle from '../subtle';\n\nconst COUNTER_LENGTH = 16;\n\nexport default class CTR {\n private cryptoKey: CryptoKey;\n // private encLeft: Uint8Array;\n private leftLength: number;\n private mode: 'encrypt' | 'decrypt';\n private counter: BigInteger;\n private queue: {data: Uint8Array, resolve: (data: Uint8Array) => void}[];\n private releasing: boolean;\n\n constructor(mode: 'encrypt' | 'decrypt', cryptoKey: CryptoKey, counter: Uint8Array) {\n this.mode = mode;\n this.cryptoKey = cryptoKey;\n this.queue = [];\n this.counter = bigIntFromBytes(counter);\n }\n\n public async update(data: Uint8Array) {\n return new Promise((resolve) => {\n this.queue.push({data, resolve});\n this.release();\n });\n }\n\n private async release() {\n if(this.releasing) {\n return;\n }\n\n this.releasing = true;\n while(this.queue.length) {\n const {data, resolve} = this.queue.shift();\n resolve(await this._update(data));\n }\n this.releasing = false;\n }\n\n private async perform(data: Uint8Array) {\n const arrayBuffer: ArrayBuffer = await subtle[this.mode]({\n name: 'AES-CTR',\n counter: addPadding(bigIntToBytes(this.counter), COUNTER_LENGTH, true, true, true),\n length: 128\n },\n this.cryptoKey,\n data\n );\n\n return arrayBuffer;\n }\n\n private async _update(data: Uint8Array) {\n let toEncrypt = data;\n let head: Uint8Array/* , tail: Uint8Array */;\n if(this.leftLength) {\n // const leftLength = this.encLeft.byteLength;\n const leftLength = this.leftLength;\n const leftLength2 = COUNTER_LENGTH - leftLength;\n // const left = this.encLeft.concat(toEncrypt.slice(0, leftLength2));\n const left = (new Uint8Array(leftLength)).concat(toEncrypt.slice(0, leftLength2));\n\n const performed = await this.perform(left);\n\n head = new Uint8Array(performed.slice(leftLength));\n\n toEncrypt = toEncrypt.slice(leftLength2);\n\n this.counter = this.counter.add(1);\n }\n\n const tail = new Uint8Array(await this.perform(toEncrypt));\n\n const result = head ? head.concat(tail) : tail;\n\n let length = toEncrypt.length;\n const leftAfter = length % COUNTER_LENGTH;\n length -= leftAfter;\n\n const a = length / COUNTER_LENGTH;\n this.counter = this.counter.add(a);\n\n this.leftLength = leftAfter || undefined;\n // this.encLeft = leftAfter ? toEncrypt.slice(-leftAfter) : undefined;\n\n return result;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CTR from './utils/aesCTR';\nimport subtle from './subtle';\n\nconst aesCTRs: Map = new Map();\nlet lastCTRId = -1;\n\ntype K = {\n enc: CTR,\n dec: CTR,\n};\n\nexport async function aesCtrPrepare({encKey, encIv, decKey, decIv}: {[k in 'encKey' | 'encIv' | 'decKey' | 'decIv']: Uint8Array}) {\n const id = ++lastCTRId;\n\n const a = [['encrypt', encKey], ['decrypt', decKey]] as ['encrypt' | 'decrypt', Uint8Array][];\n const promises = a.map(([mode, key]) => {\n return subtle.importKey(\n 'raw',\n key,\n {name: 'AES-CTR'},\n false,\n [mode]\n )\n });\n\n const [encCryptoKey, decCryptoKey] = await Promise.all(promises);\n const enc = new CTR('encrypt', encCryptoKey, encIv.slice());\n const dec = new CTR('decrypt', decCryptoKey, decIv.slice());\n\n const k: K = {\n enc,\n dec\n };\n\n aesCTRs.set(id, k);\n\n return id;\n}\n\nexport async function aesCtrProcess({id, data, operation}: {id: number, data: Uint8Array, operation: 'encrypt' | 'decrypt'}) {\n const ctrs = aesCTRs.get(id);\n const result = await (operation === 'encrypt' ? ctrs.enc : ctrs.dec).update(data);\n return result;\n}\n\nexport function aesCtrDestroy(id: number) {\n aesCTRs.delete(id);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport '../polyfill'; // just to include\n\nimport bytesModPow from '../../helpers/bytes/bytesModPow';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport getEmojisFingerprint from '../calls/helpers/getEmojisFingerprint';\nimport computeDhKey from './computeDhKey';\nimport cryptoMessagePort from './cryptoMessagePort';\nimport {CryptoMethods} from './crypto_methods';\nimport generateDh from './generateDh';\nimport computeSRP from './srp';\nimport {aesEncryptSync, aesDecryptSync} from './utils/aesIGE';\nimport factorizeBrentPollardPQ from './utils/factorize/BrentPollard';\nimport pbkdf2 from './utils/pbkdf2';\nimport rsaEncrypt from './utils/rsa';\nimport sha1 from './utils/sha1';\nimport sha256 from './utils/sha256';\nimport {aesCtrDestroy, aesCtrPrepare, aesCtrProcess} from './aesCtrUtils';\nimport ctx from '../../environment/ctx';\n\nconsole.log('CryptoWorker start');\n\nconst cryptoMethods: CryptoMethods = {\n 'sha1': sha1,\n 'sha256': sha256,\n 'pbkdf2': pbkdf2,\n 'aes-encrypt': aesEncryptSync,\n 'aes-decrypt': aesDecryptSync,\n 'rsa-encrypt': rsaEncrypt,\n 'factorize': factorizeBrentPollardPQ,\n // 'factorize-tdlib': factorizeTdlibPQ,\n // 'factorize-new-new': pqPrimeLeemonNew,\n 'mod-pow': bytesModPow,\n 'gzipUncompress': gzipUncompress,\n 'computeSRP': computeSRP,\n 'generate-dh': generateDh,\n 'compute-dh-key': computeDhKey,\n 'get-emojis-fingerprint': getEmojisFingerprint,\n 'aes-ctr-prepare': aesCtrPrepare,\n 'aes-ctr-process': aesCtrProcess,\n 'aes-ctr-destroy': aesCtrDestroy\n};\n\ncryptoMessagePort.addMultipleEventsListeners({\n invoke: ({method, args}) => {\n // @ts-ignore\n const result: any = cryptoMethods[method](...args);\n return result;\n },\n\n terminate: () => {\n ctx.close();\n }\n});\n\nif(typeof(MessageChannel) !== 'undefined') listenMessagePort(cryptoMessagePort, (source) => {\n const channel = new MessageChannel();\n cryptoMessagePort.attachPort(channel.port1);\n cryptoMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n});\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha1 from '@cryptography/sha1';\n\nexport default function sha1(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then((b) => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null,\n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n // console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n\n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","import subtle from '../subtle';\n\nexport default async function pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n\n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n const bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n 512\n );\n\n return bits.then((buffer) => new Uint8Array(buffer));\n}\n","import type {RSAPublicKeyHex} from '../../mtproto/rsaKeysManager';\nimport bytesModPow from '../../../helpers/bytes/bytesModPow';\nimport bytesFromHex from '../../../helpers/bytes/bytesFromHex';\n\nexport default function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n return bytesModPow(bytes, bytesFromHex(publicKey.exponent), bytesFromHex(publicKey.modulus));\n}\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from './cryptoMessagePort';\nimport {AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\n\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\n // ! look into crypto_methods.test.ts\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\n buffer = bufferConcats(server_salt, buffer, server_salt);\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\n\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\n hash = bufferConcats(server_salt, hash, server_salt);\n\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\n\n return buffer;\n}\n\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n\n const p = bigIntFromBytes(algo.p);\n const g = bigInt(algo.g);\n\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\n console.error('srp_B < 0')\n }\n\n if(B.compareTo(p) <= 0) {\n console.error('srp_B <= p');\n } */\n\n /* let check_prime_and_good = (bytes: any, g: number) => {\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\n\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\n return true;\n }\n\n // TO-DO check_prime_and_good_check\n }; */\n\n // check_prime_and_good(algo.p, g);\n\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\n const x = bigInt(bytesToHex(pw_hash), 16);\n\n const padArray = function(arr: number[] | Uint8Array, len: number) {\n if(!(arr instanceof Uint8Array)) {\n arr = convertToUint8Array(arr);\n }\n\n return addPadding(arr, len, true, true, true);\n };\n\n const v = g.modPow(x, p);\n\n const flipper = (arr: Uint8Array | number[]) => {\n const out = new Uint8Array(arr.length);\n for(let i = 0; i < arr.length; i += 4) {\n out[i] = arr[i + 3];\n out[i + 1] = arr[i + 2];\n out[i + 2] = arr[i + 1];\n out[i + 3] = arr[i];\n }\n\n return out;\n };\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\n if(isNew) {\n const bytes = bigIntToBytes(v);\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\n }\n\n const B = bigIntFromBytes(state.srp_B);\n\n const pForHash = padArray(bigIntToBytes(p), 256);\n const gForHash = padArray(bigIntToBytes(g), 256);\n const b_for_hash = padArray(bigIntToBytes(B), 256);\n\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\n const k = bigIntFromBytes(kHash);\n\n const k_v = k.multiply(v).mod(p);\n\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\n const diff = prime.subtract(modexp);\n const min_diff_bits_count = 2048 - 64;\n const max_mod_exp_size = 256;\n if(diff.isNegative() ||\n diff.bitLength().toJSNumber() < min_diff_bits_count ||\n modexp.bitLength().toJSNumber() < min_diff_bits_count ||\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\n return false;\n return true;\n };\n\n const generate_and_check_random = async() => {\n while(true) {\n const a = bigIntFromBytes(flipper(state.secure_random));\n // const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\n\n const A = g.modPow(a, p);\n if(is_good_mod_exp_first(A, p)) {\n const a_for_hash = bigIntToBytes(A);\n\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\n // const u = bigInt(s.hex, 16);\n const u = bigIntFromBytes(s);\n if(!u.isZero() && !u.isNegative())\n return {a, a_for_hash, u};\n }\n }\n }\n\n const {a, a_for_hash, u} = await generate_and_check_random();\n\n let g_b: bigInt.BigInteger;\n if(!B.greater(k_v)) {\n g_b = B.add(p);\n } else g_b = B;\n g_b = g_b.subtract(k_v).mod(p);\n\n const ux = u.multiply(x);\n const a_ux = a.add(ux);\n const S = g_b.modPow(a_ux, p);\n\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\n\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\n h1 = bytesXor(h1, h2);\n\n const buff = bufferConcats(\n h1,\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\n a_for_hash,\n b_for_hash,\n K\n );\n\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\n\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\n _: 'inputCheckPasswordSRP',\n srp_id: state.srp_id,\n A: new Uint8Array(a_for_hash),\n M1\n };\n\n return out;\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","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport {MessagesDhConfig} from '../../layer';\nimport CallInstance from '../calls/callInstance';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function generateDh(dhConfig: MessagesDhConfig.messagesDhConfig) {\n const {p, g} = dhConfig;\n\n const generateA = (p: Uint8Array) => {\n for(;;) {\n const a = randomize(new Uint8Array(p.length));\n // const a = new Uint8Array(4).randomize();\n\n const aBigInt = bigIntFromBytes(a); // str2bigInt(bytesToHex(a), 16);\n if(!aBigInt.greater(bigInt.one)) {\n continue;\n }\n\n const pBigInt = bigIntFromBytes(p); // str2bigInt(bytesToHex(p), 16);\n if(!aBigInt.lesser(pBigInt.subtract(bigInt.one))) {\n continue;\n }\n\n return a;\n }\n };\n\n const a = generateA(p);\n // const a = new Uint8Array([0]);\n\n const gBytes = bytesFromHex(g.toString(16));\n const g_a = addPadding(await cryptoWorker.invokeCrypto('mod-pow', gBytes, a, p), 256, true, true, true);\n const g_a_hash = await cryptoWorker.invokeCrypto('sha256', g_a);\n\n const dh: CallInstance['dh'] = {\n a: a,\n g_a: g_a,\n g_a_hash: g_a_hash,\n p\n };\n\n return dh;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {bigIntFromBytes, bigIntToSigned} from '../../helpers/bigInt/bigIntConversion';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function computeDhKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n const key = await cryptoWorker.invokeCrypto('mod-pow', g_b, a, p);\n const keySha1Hashed = await cryptoWorker.invokeCrypto('sha1', key);\n const key_fingerprint = keySha1Hashed.slice(-8).reverse();\n const key_fingerprint_long = bigIntToSigned(bigIntFromBytes(key_fingerprint)).toString(10);\n\n return {key, key_fingerprint: key_fingerprint_long};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,437], () => (__webpack_require__(6991)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 437) return \"437.a80d805671a4b222696d.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + {\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] + \".\" + {\"211\":\"a70c90f1bcf51a3f9932\",\"699\":\"f16d6f756c34f3914132\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t589: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","oldGetScript","oldLoadScript","queryMap","countMap","next","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","args","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","then","listeners","length","slice","forEach","bind","bufferConcats","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","b","set","ArrayBuffer","prototype","concat","this","toJSON","Promise","finally","fn","onFinally","callback","resolve","result","reason","reject","Number","MAX_SAFE_INTEGER","pow","longBigInt","divide","bigIntFromBytes","bytes","base","bigIntToBytes","bigInt","toArray","value","bytesModPow","exp","mod","bytesBigInt","expBigInt","modBigInt","modPow","CryptoMessagePort","constructor","super","lastIndex","invokeCryptoNew","method","transfer","payload","sendPortIndex","sendPorts","invoke","undefined","invokeCrypto","cryptoMessagePort","readBigIntFromBytesBE","bits","and","shiftLeft","i","_bits","or","emojis","randomize","arr","crypto","Error","getRandomValues","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","len","needPadding","padding","buffer","bytesFromHex","hexString","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","S","Si","T1","Uint32Array","T2","T3","T4","T5","T6","T7","T8","getWords","key","buf","pos","str","charCodeAt","xor","left","right","to","x2","x4","s","tEnc","tDec","d","t","x","xInv","computeTables","AES","_key","encKey","decKey","rcon","j","encrypt","_message","a2","b2","c2","message","out","a","c","rounds","k","decrypt","AES_IGE","iv","cipher","text","cipherText","prevX","subarray","prevY","yXOR","y","bytesToWordss","input","words","aesSync","keyBytes","ivBytes","o","bytesFromWordss","counter","offset","incrementCounter","carry","arrays","Uint16Array","bigIntRandom","min","max","array","nextRandomUint","BrentPollardFactor","n","two","remainder","isZero","m","ys","r","q","g","minus","eq","bigIntUint64MinusPqPlusOne","plus","performY","add","lesser","condition","multiply","greater","abs","window","subtle","CTR","mode","cryptoKey","queue","update","data","push","release","releasing","shift","_update","perform","name","head","toEncrypt","leftLength","leftLength2","performed","tail","leftAfter","aesCTRs","Map","lastCTRId","log","cryptoMethods","salt","iterations","importKey","hash","publicKey","exponent","modulus","pqBytes","factors","primes","factor","pop","isPrime","primeFactors","sort","compare","splice","p","map","toString","password","state","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","makePasswordHash","salt1","salt2","Array","join","bytesToHex","padArray","flipper","B","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","subtract","isNegative","bitLength","toJSNumber","floor","a_for_hash","u","secure_random","A","generate_and_check_random","g_b","ux","a_ux","K","h1","bytes1","bytes2","bytesXor","buff","M1","_","srp_id","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","key_fingerprint","reverse","emojisLength","partOffset","index","codePoints","encIv","decIv","id","promises","encCryptoKey","decCryptoKey","enc","dec","operation","ctrs","get","delete","terminate","ctx","messagePort","onConnect","onDisconnect","attachPort","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","e","source","channel","MessageChannel","port1","port2","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","call","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","getter","__esModule","definition","defineProperty","enumerable","f","chunkId","miniCssF","globalThis","Function","obj","prop","hasOwnProperty","nmd","paths","children","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","has","catch","retries","realSrc","request","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/crypto.worker.a0cf65ddba162cb08d08.chunk.js.map b/public/crypto.worker.a0cf65ddba162cb08d08.chunk.js.map deleted file mode 100644 index 3e75e6c6..00000000 --- a/public/crypto.worker.a0cf65ddba162cb08d08.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"crypto.worker.a0cf65ddba162cb08d08.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/helpers/bytes/bytesModPow.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/calls/helpers/getEmojisFingerprint.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./node_modules/@cryptography/aes/dist/es/aes.js","webpack://tweb/./src/helpers/bytes/bytesToWordss.ts","webpack://tweb/./src/lib/crypto/utils/aesIGE.ts","webpack://tweb/./src/helpers/bytes/bytesFromWordss.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/bigInt/bigIntRandom.ts","webpack://tweb/./src/lib/crypto/utils/factorize/BrentPollard.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/crypto/utils/aesCTR.ts","webpack://tweb/./src/lib/crypto/aesCtrUtils.ts","webpack://tweb/./src/lib/crypto/crypto.worker.ts","webpack://tweb/./src/lib/crypto/utils/sha1.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/crypto/utils/pbkdf2.ts","webpack://tweb/./src/lib/crypto/utils/rsa.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/lib/crypto/srp.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/crypto/generateDh.ts","webpack://tweb/./src/lib/crypto/computeDhKey.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,437].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\r\n * https://github.com/morethanwords/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\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\r\n\r\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\r\n try {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n } catch(err) {\r\n console.error('[worker] postMessage error:', err, args);\r\n }\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n getWindowClients().then((listeners) => {\r\n if(!listeners.length) {\r\n // console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach((listener) => {\r\n postMessage(listener, ...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from '../helpers/bytes/bufferConcats';\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n // return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","import {bigIntFromBytes, bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function bytesModPow(bytes: number[] | Uint8Array, exp: number[] | Uint8Array, mod: number[] | Uint8Array) {\n const bytesBigInt = bigIntFromBytes(bytes);\n const expBigInt = bigIntFromBytes(exp);\n const modBigInt = bigIntFromBytes(mod);\n const resBigInt = bytesBigInt.modPow(expBigInt, modBigInt);\n return bigIntToBytes(resBigInt);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {CryptoMethods} from './crypto_methods';\r\nimport SuperMessagePort from '../mtproto/superMessagePort';\r\nimport {Awaited} from '../../types';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport {IS_WORKER} from '../../helpers/context';\r\n\r\ntype CryptoEvent = {\r\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\r\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\r\n terminate: () => void\r\n};\r\n\r\nexport class CryptoMessagePort extends SuperMessagePort {\r\n private lastIndex: number;\r\n\r\n constructor() {\r\n super('CRYPTO');\r\n this.lastIndex = -1;\r\n }\r\n\r\n public invokeCryptoNew({method, args, transfer}: {\r\n method: T,\r\n args: Parameters,\r\n transfer?: Transferable[]\r\n }): Promise>> {\r\n const payload = {method, args};\r\n const listeners = this.listeners['invoke'];\r\n if(listeners?.length) { // already in worker\r\n // try {\r\n // @ts-ignore\r\n let result: any = listeners[0].callback(payload);\r\n if(!IS_WORKER && !(result instanceof Promise)) {\r\n result = Promise.resolve(result);\r\n }\r\n\r\n return result;\r\n // } catch(err) {\r\n // return Promise.reject(err);\r\n // }\r\n }\r\n\r\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\r\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\r\n 0;\r\n // @ts-ignore\r\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\r\n }\r\n\r\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\r\n return this.invokeCryptoNew({method, args});\r\n }\r\n}\r\n\r\nconst cryptoMessagePort = new CryptoMessagePort();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\r\nexport default cryptoMessagePort;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from '../../crypto/cryptoMessagePort';\nimport bigInt from 'big-integer';\n\nfunction readBigIntFromBytesBE(bytes: Uint8Array) {\n const length = bytes.length;\n const bits = length * 8;\n let value = bigInt(bytes[0]).and(0x7F).shiftLeft(bits - 8);\n for(let i = 1; i < length; ++i) {\n const _bits = bits - (i + 1) * 8;\n const b = bigInt(bytes[i]);\n value = value.or(_bits ? b.shiftLeft(_bits) : b);\n }\n\n return value;\n}\n\n// Emojis were taken from tdlib\nconst emojis = [\n '1f609', '1f60d', '1f61b', '1f62d', '1f631', '1f621', '1f60e',\n '1f634', '1f635', '1f608', '1f62c', '1f607', '1f60f', '1f46e',\n '1f477', '1f482', '1f476', '1f468', '1f469', '1f474', '1f475',\n '1f63b', '1f63d', '1f640', '1f47a', '1f648', '1f649', '1f64a',\n '1f480', '1f47d', '1f4a9', '1f525', '1f4a5', '1f4a4', '1f442',\n '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c',\n '1f44a', '270c', '270b', '1f450', '1f446', '1f447', '1f449',\n '1f448', '1f64f', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483',\n '1f46b', '1f46a', '1f46c', '1f46d', '1f485', '1f3a9', '1f451',\n '1f452', '1f45f', '1f45e', '1f460', '1f455', '1f457', '1f456',\n '1f459', '1f45c', '1f453', '1f380', '1f484', '1f49b', '1f499',\n '1f49c', '1f49a', '1f48d', '1f48e', '1f436', '1f43a', '1f431',\n '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b',\n '1f437', '1f42e', '1f417', '1f434', '1f411', '1f418', '1f43c',\n '1f427', '1f425', '1f414', '1f40d', '1f422', '1f41b', '1f41d',\n '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f41f', '1f42c',\n '1f40b', '1f410', '1f40a', '1f42b', '1f340', '1f339', '1f33b',\n '1f341', '1f33e', '1f344', '1f335', '1f334', '1f333', '1f31e',\n '1f31a', '1f319', '1f30e', '1f30b', '26a1', '2614', '2744', '26c4',\n '1f300', '1f308', '1f30a', '1f393', '1f386', '1f383', '1f47b',\n '1f385', '1f384', '1f381', '1f388', '1f52e', '1f3a5', '1f4f7',\n '1f4bf', '1f4bb', '260e', '1f4e1', '1f4fa', '1f4fb', '1f509',\n '1f514', '23f3', '23f0', '231a', '1f512', '1f511', '1f50e',\n '1f4a1', '1f526', '1f50c', '1f50b', '1f6bf', '1f6bd', '1f527',\n '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a',\n '1f489', '1f4b0', '1f4b5', '1f4b3', '2709', '1f4eb', '1f4e6',\n '1f4c5', '1f4c1', '2702', '1f4cc', '1f4ce', '2712', '270f',\n '1f4d0', '1f4da', '1f52c', '1f52d', '1f3a8', '1f3ac', '1f3a4',\n '1f3a7', '1f3b5', '1f3b9', '1f3bb', '1f3ba', '1f3b8', '1f47e',\n '1f3ae', '1f0cf', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd',\n '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '1f3c1', '1f3c7',\n '1f3c6', '1f3ca', '1f3c4', '2615', '1f37c', '1f37a', '1f377',\n '1f374', '1f355', '1f354', '1f35f', '1f357', '1f371', '1f35a',\n '1f35c', '1f361', '1f373', '1f35e', '1f369', '1f366', '1f382',\n '1f370', '1f36a', '1f36b', '1f36d', '1f36f', '1f34e', '1f34f',\n '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351',\n '1f34c', '1f350', '1f34d', '1f346', '1f345', '1f33d', '1f3e1',\n '1f3e5', '1f3e6', '26ea', '1f3f0', '26fa', '1f3ed', '1f5fb',\n '1f5fd', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '1f6a4',\n '2693', '1f680', '2708', '1f681', '1f682', '1f68b', '1f68e',\n '1f68c', '1f699', '1f697', '1f695', '1f69b', '1f6a8', '1f694',\n '1f692', '1f691', '1f6b2', '1f6a0', '1f69c', '1f6a6', '26a0',\n '1f6a7', '26fd', '1f3b0', '1f5ff', '1f3aa', '1f3ad',\n '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3',\n '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9',\n '1f1f7-1f1fa', '1f1ec-1f1e7', '0031-20e3', '0032-20e3', '0033-20e3',\n '0034-20e3', '0035-20e3', '0036-20e3', '0037-20e3', '0038-20e3', '0039-20e3',\n '0030-20e3', '1f51f', '2757', '2753', '2665', '2666', '1f4af', '1f517',\n '1f531', '1f534', '1f535', '1f536', '1f537'\n];\n\nexport default async function getEmojisFingerprint(key: Uint8Array, g_a: Uint8Array) {\n const arr = key.concat(g_a);\n const hash = await cryptoWorker.invokeCrypto('sha256', arr);\n\n const result: [string, string, string, string] = [] as any;\n const emojisLength = emojis.length;\n\n const kPartSize = 8;\n for(let partOffset = 0; partOffset != hash.length; partOffset += kPartSize) {\n const bytes = hash.slice(partOffset, partOffset + kPartSize);\n const value = readBigIntFromBytesBE(bytes);\n const index = value.mod(emojisLength).toJSNumber();\n\n // const emoji = emojiFromCodePoints(emojis[index]);\n const codePoints = emojis[index];\n result.push(codePoints);\n }\n\n return result;\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default function addPadding(\n bytes: T,\n blockSize: number = 16,\n zeroes?: boolean,\n blockSizeAsTotalLength = false,\n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n // //console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","import convertToUint8Array from './convertToUint8Array';\n\nexport default function bytesToWordss(input: Parameters[0]) {\n const bytes = convertToUint8Array(input);\n\n const words: number[] = [];\n for(let i = 0, len = bytes.length; i < len; ++i) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n\n return new Uint32Array(words);\n}\n","import {IGE} from '@cryptography/aes';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport bytesFromWordss from '../../../helpers/bytes/bytesFromWordss';\nimport bytesToWordss from '../../../helpers/bytes/bytesToWordss';\n\nexport default function aesSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array, encrypt = true) {\n // console.log(dT(), 'AES start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const performedBytes = cipher[encrypt ? 'encrypt' : 'decrypt'](bytesToWordss(bytes));\n // console.log(dT(), 'AES finish');\n\n return bytesFromWordss(performedBytes);\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(addPadding(bytes), keyBytes, ivBytes, true);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(bytes, keyBytes, ivBytes, false);\n}\n","export default function bytesFromWordss(input: Uint32Array) {\n const o = new Uint8Array(input.byteLength);\n for(let i = 0, length = input.length * 4; i < length; ++i) {\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n\n return o;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import bigInt from 'big-integer';\nimport {nextRandomUint} from '../random';\n\nexport default function bigIntRandom(min: bigInt.BigNumber, max: bigInt.BigNumber) {\n return bigInt.randBetween(min, max, () => {\n return nextRandomUint(32) / 0xFFFFFFFF;\n /* const bits = 32;\n const randomBytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(randomBytes);\n const r = bigIntFromBytes(randomBytes).mod(bigInt(2).pow(bits));\n return r.toJSNumber(); */\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// Thanks to https://xn--2-umb.com/09/12/brent-pollard-rho-factorisation/\n\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../../helpers/bigInt/bigIntConversion';\nimport bigIntRandom from '../../../../helpers/bigInt/bigIntRandom';\n\n// let test = 0;\nfunction BrentPollardFactor(n: bigInt.BigInteger) {\n const two = bigInt[2];\n if(n.remainder(two).isZero()) {\n return two;\n }\n\n const m = bigInt(1000);\n let a: bigInt.BigInteger,\n x: bigInt.BigInteger,\n y: bigInt.BigInteger,\n ys: bigInt.BigInteger,\n r: bigInt.BigInteger,\n q: bigInt.BigInteger,\n g: bigInt.BigInteger;\n do\n a = bigIntRandom(bigInt.one, n.minus(1));\n while(a.isZero() || a.eq(n.minus(two)));\n y = bigIntRandom(bigInt.one, n.minus(1));\n r = bigInt.one;\n q = bigInt.one;\n\n // if(!test++) {\n // a = bigInt(3);\n // y = bigInt(3);\n // }\n\n const bigIntUint64 = bigInt('FFFFFFFFFFFFFFFF', 16);\n const bigIntUint64MinusPqPlusOne = bigIntUint64.minus(n).plus(1);\n\n const performY = (y: bigInt.BigInteger) => {\n y = y.pow(two).mod(n);\n y = y.add(a);\n if(y.lesser(a)) { // it slows down the script\n y = y.add(bigIntUint64MinusPqPlusOne);\n }\n y = y.mod(n);\n return y;\n };\n\n do {\n x = y;\n for(let i = 0; bigInt(i).lesser(r); ++i) {\n y = performY(y);\n }\n\n let k = bigInt.zero;\n do {\n ys = y;\n const condition = bigInt.min(m, r.minus(k));\n for(let i = 0; bigInt(i).lesser(condition); ++i) {\n y = performY(y);\n q = q.multiply(x.greater(y) ? x.minus(y) : y.minus(x)).mod(n);\n }\n g = bigInt.gcd(q, n);\n k = k.add(m);\n } while(k.lesser(r) && g.eq(bigInt.one));\n\n r = r.shiftLeft(bigInt.one);\n } while(g.eq(bigInt.one));\n\n if(g.eq(n)) {\n do {\n ys = performY(ys);\n g = bigInt.gcd(x.minus(ys).abs(), n);\n } while(g.eq(bigInt.one));\n }\n\n return g;\n}\n\nfunction primeFactors(pqBytes: Uint8Array | number[]) {\n const n = bigIntFromBytes(pqBytes);\n\n const factors: bigInt.BigInteger[] = [];\n const primes: bigInt.BigInteger[] = [];\n\n let factor = BrentPollardFactor(n);\n factors.push(n.divide(factor));\n factors.push(factor);\n\n // return [factor];\n\n do {\n const m = factors.pop();\n\n if(m.eq(bigInt.one))\n continue;\n\n if(m.isPrime(true)) {\n primes.push(m);\n\n // Remove the prime from the other factors\n for(let i = 0; i < factors.length; ++i) {\n let k = factors[i];\n if(k.mod(m).isZero()) {\n do\n k = k.divide(m);\n while(k.mod(m).isZero());\n factors[i] = k;\n }\n }\n } else {\n // factor = m.lesser(100) ? bigInt(PollardRho(m.toJSNumber())) : this.brentPollardFactor(m);\n factor = BrentPollardFactor(m);\n factors.push(m.divide(factor));\n factors.push(factor);\n }\n } while(factors.length);\n\n return primes;\n}\n\nexport default function factorizeBrentPollardPQ(pqBytes: Uint8Array | number[]): [Uint8Array, Uint8Array] {\n let factors = primeFactors(pqBytes);\n factors.sort((a, b) => a.compare(b));\n if(factors.length > 2) {\n factors = [\n factors.splice(factors.length - 2, 1)[0],\n factors.reduce((acc, v) => acc.multiply(v), bigInt.one)\n ];\n }\n\n const p = factors[0], q = factors[factors.length - 1];\n return (p.lesser(q) ? [p, q] : [q, p]).map((b) => bigIntToBytes(b)) as any;\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {BigInteger} from 'big-integer';\r\nimport {bigIntFromBytes, bigIntToBytes} from '../../../helpers/bigInt/bigIntConversion';\r\nimport addPadding from '../../../helpers/bytes/addPadding';\r\nimport subtle from '../subtle';\r\n\r\nconst COUNTER_LENGTH = 16;\r\n\r\nexport default class CTR {\r\n private cryptoKey: CryptoKey;\r\n // private encLeft: Uint8Array;\r\n private leftLength: number;\r\n private mode: 'encrypt' | 'decrypt';\r\n private counter: BigInteger;\r\n private queue: {data: Uint8Array, resolve: (data: Uint8Array) => void}[];\r\n private releasing: boolean;\r\n\r\n constructor(mode: 'encrypt' | 'decrypt', cryptoKey: CryptoKey, counter: Uint8Array) {\r\n this.mode = mode;\r\n this.cryptoKey = cryptoKey;\r\n this.queue = [];\r\n this.counter = bigIntFromBytes(counter);\r\n }\r\n\r\n public async update(data: Uint8Array) {\r\n return new Promise((resolve) => {\r\n this.queue.push({data, resolve});\r\n this.release();\r\n });\r\n }\r\n\r\n private async release() {\r\n if(this.releasing) {\r\n return;\r\n }\r\n\r\n this.releasing = true;\r\n while(this.queue.length) {\r\n const {data, resolve} = this.queue.shift();\r\n resolve(await this._update(data));\r\n }\r\n this.releasing = false;\r\n }\r\n\r\n private async perform(data: Uint8Array) {\r\n const arrayBuffer: ArrayBuffer = await subtle[this.mode]({\r\n name: 'AES-CTR',\r\n counter: addPadding(bigIntToBytes(this.counter), COUNTER_LENGTH, true, true, true),\r\n length: 128\r\n },\r\n this.cryptoKey,\r\n data\r\n );\r\n\r\n return arrayBuffer;\r\n }\r\n\r\n private async _update(data: Uint8Array) {\r\n let toEncrypt = data;\r\n let head: Uint8Array/* , tail: Uint8Array */;\r\n if(this.leftLength) {\r\n // const leftLength = this.encLeft.byteLength;\r\n const leftLength = this.leftLength;\r\n const leftLength2 = COUNTER_LENGTH - leftLength;\r\n // const left = this.encLeft.concat(toEncrypt.slice(0, leftLength2));\r\n const left = (new Uint8Array(leftLength)).concat(toEncrypt.slice(0, leftLength2));\r\n\r\n const performed = await this.perform(left);\r\n\r\n head = new Uint8Array(performed.slice(leftLength));\r\n\r\n toEncrypt = toEncrypt.slice(leftLength2);\r\n\r\n this.counter = this.counter.add(1);\r\n }\r\n\r\n const tail = new Uint8Array(await this.perform(toEncrypt));\r\n\r\n const result = head ? head.concat(tail) : tail;\r\n\r\n let length = toEncrypt.length;\r\n const leftAfter = length % COUNTER_LENGTH;\r\n length -= leftAfter;\r\n\r\n const a = length / COUNTER_LENGTH;\r\n this.counter = this.counter.add(a);\r\n\r\n this.leftLength = leftAfter || undefined;\r\n // this.encLeft = leftAfter ? toEncrypt.slice(-leftAfter) : undefined;\r\n\r\n return result;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CTR from './utils/aesCTR';\nimport subtle from './subtle';\n\nconst aesCTRs: Map = new Map();\nlet lastCTRId = -1;\n\ntype K = {\n enc: CTR,\n dec: CTR,\n};\n\nexport async function aesCtrPrepare({encKey, encIv, decKey, decIv}: {[k in 'encKey' | 'encIv' | 'decKey' | 'decIv']: Uint8Array}) {\n const id = ++lastCTRId;\n\n const a = [['encrypt', encKey], ['decrypt', decKey]] as ['encrypt' | 'decrypt', Uint8Array][];\n const promises = a.map(([mode, key]) => {\n return subtle.importKey(\n 'raw',\n key,\n {name: 'AES-CTR'},\n false,\n [mode]\n )\n });\n\n const [encCryptoKey, decCryptoKey] = await Promise.all(promises);\n const enc = new CTR('encrypt', encCryptoKey, encIv.slice());\n const dec = new CTR('decrypt', decCryptoKey, decIv.slice());\n\n const k: K = {\n enc,\n dec\n };\n\n aesCTRs.set(id, k);\n\n return id;\n}\n\nexport async function aesCtrProcess({id, data, operation}: {id: number, data: Uint8Array, operation: 'encrypt' | 'decrypt'}) {\n const ctrs = aesCTRs.get(id);\n const result = await (operation === 'encrypt' ? ctrs.enc : ctrs.dec).update(data);\n return result;\n}\n\nexport function aesCtrDestroy(id: number) {\n aesCTRs.delete(id);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport '../polyfill'; // just to include\r\n\r\nimport bytesModPow from '../../helpers/bytes/bytesModPow';\r\nimport gzipUncompress from '../../helpers/gzipUncompress';\r\nimport listenMessagePort from '../../helpers/listenMessagePort';\r\nimport getEmojisFingerprint from '../calls/helpers/getEmojisFingerprint';\r\nimport computeDhKey from './computeDhKey';\r\nimport cryptoMessagePort from './cryptoMessagePort';\r\nimport {CryptoMethods} from './crypto_methods';\r\nimport generateDh from './generateDh';\r\nimport computeSRP from './srp';\r\nimport {aesEncryptSync, aesDecryptSync} from './utils/aesIGE';\r\nimport factorizeBrentPollardPQ from './utils/factorize/BrentPollard';\r\nimport pbkdf2 from './utils/pbkdf2';\r\nimport rsaEncrypt from './utils/rsa';\r\nimport sha1 from './utils/sha1';\r\nimport sha256 from './utils/sha256';\r\nimport {aesCtrDestroy, aesCtrPrepare, aesCtrProcess} from './aesCtrUtils';\r\nimport ctx from '../../environment/ctx';\r\n\r\nconsole.log('CryptoWorker start');\r\n\r\nconst cryptoMethods: CryptoMethods = {\r\n 'sha1': sha1,\r\n 'sha256': sha256,\r\n 'pbkdf2': pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': factorizeTdlibPQ,\r\n // 'factorize-new-new': pqPrimeLeemonNew,\r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP,\r\n 'generate-dh': generateDh,\r\n 'compute-dh-key': computeDhKey,\r\n 'get-emojis-fingerprint': getEmojisFingerprint,\r\n 'aes-ctr-prepare': aesCtrPrepare,\r\n 'aes-ctr-process': aesCtrProcess,\r\n 'aes-ctr-destroy': aesCtrDestroy\r\n};\r\n\r\ncryptoMessagePort.addMultipleEventsListeners({\r\n invoke: ({method, args}) => {\r\n // @ts-ignore\r\n const result: any = cryptoMethods[method](...args);\r\n return result;\r\n },\r\n\r\n terminate: () => {\r\n ctx.close();\r\n }\r\n});\r\n\r\nif(typeof(MessageChannel) !== 'undefined') listenMessagePort(cryptoMessagePort, (source) => {\r\n const channel = new MessageChannel();\r\n cryptoMessagePort.attachPort(channel.port1);\r\n cryptoMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\r\n});\r\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha1 from '@cryptography/sha1';\n\nexport default function sha1(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then((b) => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null,\n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n // console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n\n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","import subtle from '../subtle';\n\nexport default async function pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n\n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n const bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n 512\n );\n\n return bits.then((buffer) => new Uint8Array(buffer));\n}\n","import type {RSAPublicKeyHex} from '../../mtproto/rsaKeysManager';\nimport bytesModPow from '../../../helpers/bytes/bytesModPow';\nimport bytesFromHex from '../../../helpers/bytes/bytesFromHex';\n\nexport default function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n return bytesModPow(bytes, bytesFromHex(publicKey.exponent), bytesFromHex(publicKey.modulus));\n}\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cryptoWorker from './cryptoMessagePort';\r\nimport {AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\r\nimport addPadding from '../../helpers/bytes/addPadding';\r\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\r\nimport bytesXor from '../../helpers/bytes/bytesXor';\r\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\r\nimport bigInt from 'big-integer';\r\nimport {bigIntFromBytes, bigIntToBytes} from '../../helpers/bigInt/bigIntConversion';\r\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\r\n\r\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\r\n // ! look into crypto_methods.test.ts\r\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\r\n\r\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\r\n\r\n return buffer;\r\n}\r\n\r\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\r\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n\r\n const p = bigIntFromBytes(algo.p);\r\n const g = bigInt(algo.g);\r\n\r\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\r\n console.error('srp_B < 0')\r\n }\r\n\r\n if(B.compareTo(p) <= 0) {\r\n console.error('srp_B <= p');\r\n } */\r\n\r\n /* let check_prime_and_good = (bytes: any, g: number) => {\r\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\r\n\r\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\r\n return true;\r\n }\r\n\r\n // TO-DO check_prime_and_good_check\r\n }; */\r\n\r\n // check_prime_and_good(algo.p, g);\r\n\r\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\r\n const x = bigInt(bytesToHex(pw_hash), 16);\r\n\r\n const padArray = function(arr: number[] | Uint8Array, len: number) {\r\n if(!(arr instanceof Uint8Array)) {\r\n arr = convertToUint8Array(arr);\r\n }\r\n\r\n return addPadding(arr, len, true, true, true);\r\n };\r\n\r\n const v = g.modPow(x, p);\r\n\r\n const flipper = (arr: Uint8Array | number[]) => {\r\n const out = new Uint8Array(arr.length);\r\n for(let i = 0; i < arr.length; i += 4) {\r\n out[i] = arr[i + 3];\r\n out[i + 1] = arr[i + 2];\r\n out[i + 2] = arr[i + 1];\r\n out[i + 3] = arr[i];\r\n }\r\n\r\n return out;\r\n };\r\n\r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\r\n if(isNew) {\r\n const bytes = bigIntToBytes(v);\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n\r\n const B = bigIntFromBytes(state.srp_B);\r\n\r\n const pForHash = padArray(bigIntToBytes(p), 256);\r\n const gForHash = padArray(bigIntToBytes(g), 256);\r\n const b_for_hash = padArray(bigIntToBytes(B), 256);\r\n\r\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\r\n const k = bigIntFromBytes(kHash);\r\n\r\n const k_v = k.multiply(v).mod(p);\r\n\r\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\r\n const diff = prime.subtract(modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(diff.isNegative() ||\r\n diff.bitLength().toJSNumber() < min_diff_bits_count ||\r\n modexp.bitLength().toJSNumber() < min_diff_bits_count ||\r\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\r\n return false;\r\n return true;\r\n };\r\n\r\n const generate_and_check_random = async() => {\r\n while(true) {\r\n const a = bigIntFromBytes(flipper(state.secure_random));\r\n // const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n const A = g.modPow(a, p);\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bigIntToBytes(A);\r\n\r\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\r\n // const u = bigInt(s.hex, 16);\r\n const u = bigIntFromBytes(s);\r\n if(!u.isZero() && !u.isNegative())\r\n return {a, a_for_hash, u};\r\n }\r\n }\r\n }\r\n\r\n const {a, a_for_hash, u} = await generate_and_check_random();\r\n\r\n let g_b: bigInt.BigInteger;\r\n if(!B.greater(k_v)) {\r\n g_b = B.add(p);\r\n } else g_b = B;\r\n g_b = g_b.subtract(k_v).mod(p);\r\n\r\n const ux = u.multiply(x);\r\n const a_ux = a.add(ux);\r\n const S = g_b.modPow(a_ux, p);\r\n\r\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\r\n\r\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\r\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(\r\n h1,\r\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\r\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\r\n a_for_hash,\r\n b_for_hash,\r\n K\r\n );\r\n\r\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\r\n\r\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\r\n _: 'inputCheckPasswordSRP',\r\n srp_id: state.srp_id,\r\n A: new Uint8Array(a_for_hash),\r\n M1\r\n };\r\n\r\n return out;\r\n}\r\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport {MessagesDhConfig} from '../../layer';\nimport CallInstance from '../calls/callInstance';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function generateDh(dhConfig: MessagesDhConfig.messagesDhConfig) {\n const {p, g} = dhConfig;\n\n const generateA = (p: Uint8Array) => {\n for(;;) {\n const a = randomize(new Uint8Array(p.length));\n // const a = new Uint8Array(4).randomize();\n\n const aBigInt = bigIntFromBytes(a); // str2bigInt(bytesToHex(a), 16);\n if(!aBigInt.greater(bigInt.one)) {\n continue;\n }\n\n const pBigInt = bigIntFromBytes(p); // str2bigInt(bytesToHex(p), 16);\n if(!aBigInt.lesser(pBigInt.subtract(bigInt.one))) {\n continue;\n }\n\n return a;\n }\n };\n\n const a = generateA(p);\n // const a = new Uint8Array([0]);\n\n const gBytes = bytesFromHex(g.toString(16));\n const g_a = addPadding(await cryptoWorker.invokeCrypto('mod-pow', gBytes, a, p), 256, true, true, true);\n const g_a_hash = await cryptoWorker.invokeCrypto('sha256', g_a);\n\n const dh: CallInstance['dh'] = {\n a: a,\n g_a: g_a,\n g_a_hash: g_a_hash,\n p\n };\n\n return dh;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {bigIntFromBytes, bigIntToSigned} from '../../helpers/bigInt/bigIntConversion';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function computeDhKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n const key = await cryptoWorker.invokeCrypto('mod-pow', g_b, a, p);\n const keySha1Hashed = await cryptoWorker.invokeCrypto('sha1', key);\n const key_fingerprint = keySha1Hashed.slice(-8).reverse();\n const key_fingerprint_long = bigIntToSigned(bigIntFromBytes(key_fingerprint)).toString(10);\n\n return {key, key_fingerprint: key_fingerprint_long};\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\r\nimport ctx from '../environment/ctx';\r\n\r\nexport default function listenMessagePort(\r\n messagePort: SuperMessagePort,\r\n onConnect?: (source: MessageEventSource) => void,\r\n onDisconnect?: (source: MessageEventSource) => void\r\n) {\r\n const attachPort = (listenPort: any, sendPort: any) => {\r\n messagePort.attachListenPort(listenPort);\r\n sendPort && messagePort.attachSendPort(sendPort);\r\n onConnect?.(listenPort);\r\n };\r\n\r\n messagePort.setOnPortDisconnect(onDisconnect);\r\n\r\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\r\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\r\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\r\n attachPort(ctx, null);\r\n } else {\r\n attachPort(ctx, ctx);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,437], () => (__webpack_require__(6991)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 437) return \"437.77e92ccb32c21ff43a10.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + {\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] + \".\" + {\"211\":\"a70c90f1bcf51a3f9932\",\"699\":\"f16d6f756c34f3914132\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t589: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","oldGetScript","oldLoadScript","queryMap","countMap","next","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","args","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","then","listeners","length","slice","forEach","bind","bufferConcats","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","b","set","ArrayBuffer","prototype","concat","this","toJSON","Promise","finally","fn","onFinally","callback","resolve","result","reason","reject","Number","MAX_SAFE_INTEGER","pow","longBigInt","divide","bigIntFromBytes","bytes","base","bigIntToBytes","bigInt","toArray","value","bytesModPow","exp","mod","bytesBigInt","expBigInt","modBigInt","modPow","CryptoMessagePort","constructor","super","lastIndex","invokeCryptoNew","method","transfer","payload","sendPortIndex","sendPorts","invoke","undefined","invokeCrypto","cryptoMessagePort","readBigIntFromBytesBE","bits","and","shiftLeft","i","_bits","or","emojis","randomize","arr","crypto","Error","getRandomValues","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","len","needPadding","padding","buffer","bytesFromHex","hexString","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","S","Si","T1","Uint32Array","T2","T3","T4","T5","T6","T7","T8","getWords","key","buf","pos","str","charCodeAt","xor","left","right","to","x2","x4","s","tEnc","tDec","d","t","x","xInv","computeTables","AES","_key","encKey","decKey","rcon","j","encrypt","_message","a2","b2","c2","message","out","a","c","rounds","k","decrypt","AES_IGE","iv","cipher","text","cipherText","prevX","subarray","prevY","yXOR","y","bytesToWordss","input","words","aesSync","keyBytes","ivBytes","o","bytesFromWordss","counter","offset","incrementCounter","carry","arrays","Uint16Array","bigIntRandom","min","max","array","nextRandomUint","BrentPollardFactor","n","two","remainder","isZero","m","ys","r","q","g","minus","eq","bigIntUint64MinusPqPlusOne","plus","performY","add","lesser","condition","multiply","greater","abs","window","subtle","CTR","mode","cryptoKey","queue","update","data","push","release","releasing","shift","_update","perform","name","head","toEncrypt","leftLength","leftLength2","performed","tail","leftAfter","aesCTRs","Map","lastCTRId","log","cryptoMethods","salt","iterations","importKey","hash","publicKey","exponent","modulus","pqBytes","factors","primes","factor","pop","isPrime","primeFactors","sort","compare","splice","p","map","toString","password","state","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","makePasswordHash","salt1","salt2","Array","join","bytesToHex","padArray","flipper","B","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","subtract","isNegative","bitLength","toJSNumber","floor","a_for_hash","u","secure_random","A","generate_and_check_random","g_b","ux","a_ux","K","h1","bytes1","bytes2","bytesXor","buff","M1","_","srp_id","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","key_fingerprint","reverse","emojisLength","partOffset","index","codePoints","encIv","decIv","id","promises","encCryptoKey","decCryptoKey","enc","dec","operation","ctrs","get","delete","terminate","ctx","messagePort","onConnect","onDisconnect","attachPort","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","e","source","channel","MessageChannel","port1","port2","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","call","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","getter","__esModule","definition","defineProperty","enumerable","f","chunkId","miniCssF","globalThis","Function","obj","prop","hasOwnProperty","nmd","paths","children","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","has","catch","retries","realSrc","request","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/index.html b/public/index.html index 7bad6918..6088053a 100644 --- a/public/index.html +++ b/public/index.html @@ -1,3 +1,3 @@ -Telegram Web \ No newline at end of file +Telegram Web \ No newline at end of file diff --git a/public/main.1fe88778f443685606bb.bundle.js b/public/main.1fe88778f443685606bb.bundle.js deleted file mode 100644 index 50c0618c..00000000 --- a/public/main.1fe88778f443685606bb.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,n,s,i,o,r,a,c,l={236:(e,t,n)=>{n.d(t,{h:()=>c});var s=n(4762),i=n(144),o=n(4159);const r=o.Z.version,a=o.Z.build,c={allDialogsLoaded:{},pinnedOrders:{},contactsListCachedTime:0,updates:{},filtersArr:[],maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],recentCustomEmoji:[],topPeersCache:{},recentSearch:[],version:r,build:a,authState:{_:s.IS_MOBILE?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,distanceUnit:"kilometers",sendShortcut:"enter",animationsEnabled:!0,autoDownload:{photo:{contacts:!0,private:!0,groups:!0,channels:!0},video:{contacts:!0,private:!0,groups:!0,channels:!0},file:{contacts:!0,private:!0,groups:!0,channels:!0}},autoDownloadNew:{_:"autoDownloadSettings",file_size_max:3145728,pFlags:{video_preload_large:!0,audio_preload_next:!0},photo_size_max:1048576,video_size_max:15728640,video_upload_maxbitrate:100},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[{name:"day",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:0,id:"1"}:{blur:!1,slug:"pattern",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:50,id:"1"}},{name:"night",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#0f0f0f",highlightningColor:"hsla(0, 0%, 3.82353%, 0.4)",intensity:0,id:"-1"}:{blur:!1,slug:"pattern",color:"#fec496,#dd6cb9,#962fbf,#4f5bd5",highlightningColor:"hsla(299.142857, 44.166666%, 37.470588%, .4)",intensity:-50,id:"-1"}}],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},playbackParams:{volume:1,muted:!1,playbackRate:1,playbackRates:{voice:1,video:1,audio:1},loop:!1,round:!1},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:(0,i.d)(32),notifySettings:{}}},8189:(e,t,n)=>{n.d(t,{Z:()=>i});let s=!1;try{const e=document.createElement("canvas").getContext("webgl"),t=e.getExtension("WEBGL_debug_renderer_info"),n=t&&e.getParameter(t.UNMASKED_RENDERER_WEBGL)||"";(n.match(/Apple/)&&!n.match(/Apple GPU/)||-1===e.getSupportedExtensions().indexOf("WEBGL_compressed_texture_s3tc_srgb"))&&(s=!0)}catch(e){}const i=s},993:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},7328:(e,t,n)=>{let s;if(n.d(t,{Z:()=>i}),n(4762).IS_SAFARI)try{s=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){s=!1}else s=!0;const i=s},6663:(e,t,n)=>{n.d(t,{Z:()=>s});const s="filter"in(document.createElement("canvas").getContext("2d")||{})},9976:(e,t,n)=>{n.d(t,{Z:()=>s});const s=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i)},3731:(e,t,n)=>{var s;n.d(t,{Z:()=>i});const i=!!(null===(s=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===s?void 0:s.getCurrentPosition)&&!1},6818:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},1174:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(5269);const i=new Set(["image/jpeg","image/png","image/bmp"]);s.Z&&i.add("image/webp");const o=i},2341:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(1174),i=n(554);const o=[...s.Z].concat([...i.Z]),r=new Set(o)},9030:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/quicktime")||s.IS_SAFARI||s.IS_APPLE_MOBILE},5783:(e,t,n)=>{n.d(t,{Z:()=>i});const s=document.createElement("audio"),i=!(!s.canPlayType||!s.canPlayType("audio/ogg;").replace(/no/,""))},2365:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!n(4762).IS_FIREFOX&&!1},2820:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}))},2045:(e,t,n)=>{n.d(t,{Z:()=>s});const s="undefined"!=typeof SharedWorker},5432:(e,t,n)=>{n.d(t,{Z:()=>s});const s="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},4762:(e,t,n)=>{n.r(t),n.d(t,{IS_ANDROID:()=>r,IS_APPLE:()=>o,IS_APPLE_MOBILE:()=>c,IS_CHROMIUM:()=>a,IS_FIREFOX:()=>u,IS_MOBILE:()=>h,IS_MOBILE_SAFARI:()=>d,IS_SAFARI:()=>l,USER_AGENT:()=>i});var s=n(6761);const i=navigator?navigator.userAgent:null,o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),r=-1!==navigator.userAgent.toLowerCase().indexOf("android"),a=/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),c=(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!s.Z.MSStream,l=!!("safari"in s.Z)||!(!i||!(/\b(iPad|iPhone|iPod)\b/.test(i)||i.match("Safari")&&!i.match("Chrome"))),u=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,d=l&&c,h=navigator.maxTouchPoints>0&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},2131:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate)},554:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(9030);const i=new Set(["image/gif","video/mp4","video/webm"]);s.Z&&i.add("video/quicktime");const o=i},393:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/webm")&&!s.IS_SAFARI&&!s.IS_APPLE_MOBILE},5269:(e,t,n)=>{n.d(t,{Z:()=>s});const s=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp")},4089:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!("undefined"==typeof RTCPeerConnection||s.IS_FIREFOX)},2064:(e,t,n)=>{function s(e,t,n,s=1){e/=255,t/=255,n/=255;const i=Math.max(e,t,n),o=Math.min(e,t,n);let r,a;const c=(i+o)/2;if(i===o)r=a=0;else{const s=i-o;switch(a=c>.5?s/(2-i-o):s/(i+o),i){case e:r=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e},a=n<.5?n*(1+t):n+t-n*t,c=2*n-a;i=s(c,a,e+1/3),o=s(c,a,e),r=s(c,a,e-1/3)}return[Math.round(255*i),Math.round(255*o),Math.round(255*r),Math.round(255*s)]}function o(e){const t=[],n="#"===e[0]?1:0;if(e.length===5+n&&(e=(n?"#":"")+"0"+e.slice(n)),e.length===3+n)for(let s=n;s("0"+e.toString(16)).slice(-2))).join("")}function l(e){return function(e){return c(function(e){const t=e.slice(5,-1).split(", "),n=+t.pop(),s=t.map((e=>e.endsWith("%")?+e.slice(0,-1):+e));return i(s[0],s[1],s[2],n)}(e))}(e).slice(0,-2)}n.d(t,{K5:()=>l,Pi:()=>o,Y6:()=>i,cw:()=>a,dI:()=>s,oo:()=>r,t1:()=>c})},6009:(e,t,n)=>{function s(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const n=e.split("."),s=t.split(".");for(let e=0;ei)return 1;if(ts})},8799:(e,t,n)=>{function s(){var e;return!!(null===(e=document.activeElement)||void 0===e?void 0:e.blur)&&(document.activeElement.blur(),!0)}n.d(t,{Z:()=>s})},3910:(e,t,n)=>{function s(e){if(e=e||window.event){e=e.originalEvent||e;try{e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.returnValue=!1,e.cancelBubble=!0}catch(e){}}return!1}n.d(t,{Z:()=>s})},8497:(e,t,n)=>{function s(e,t){return e.closest("."+t)}n.d(t,{Z:()=>s})},5494:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(3035);function i(e){e.style.transform="translateY(-99999px)",e.focus(),(0,s.d1)().then((()=>{e.style.transform=""}))}},8090:(e,t,n)=>{n.d(t,{T:()=>a,Z:()=>c});var s=n(5432),i=n(4762),o=n(8497),r=n(5494);const a=i.IS_SAFARI&&i.IS_MOBILE&&s.Z;if(a){const e="clientY";let t=0;const n={capture:!0,passive:!1},s=n=>{const s=n.touches[0],i=(0,o.Z)(s.target,"scrollable-y");if(i){const o=s[e],r=t-o,a=i.scrollTop,c=i.scrollHeight,l=i.clientHeight,u=a?Math.round(a+i.clientHeight+r):a+r;(c===l||u>=c||u<=0)&&n.preventDefault()}else n.preventDefault()};let i=0;document.addEventListener("focusin",(o=>{!o.target.classList.contains("is-sticky-input-bugged")||o.timeStamp-i<50||((0,r.Z)(o.target),document.addEventListener("touchmove",s,n),document.addEventListener("touchstart",(n=>{if(n.touches.length>1)return;const s=n.touches[0];t=s[e]})))}),{passive:!0}),document.addEventListener("focusout",(e=>{document.removeEventListener("touchmove",s,n),i=e.timeStamp}),{passive:!0}),document.addEventListener("visibilitychange",(()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&(0,r.Z)(document.activeElement)}),{passive:!0})}function c(e){a&&e.classList.add("is-sticky-input-bugged")}},4541:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(319),i=n(5418);const o=["b","б"],r={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function c(e={text:o,icons:void 0,monospace:o}){if(!("fonts"in document))return Promise.resolve();const t=[];for(const n in e){let s=e[n];"all"===s&&(s=o);const i=a[n],c="icons"===n?[500]:[400,500];for(const e of c){const n=(s||[void 0]).map((t=>{var n,s,o,a;const c=[e,"1rem",i].join(" ");return null!==(s=(o=null!==(n=r[c])&&void 0!==n?n:r[c]={})[a=t||""])&&void 0!==s?s:o[a]=document.fonts.load(c,t)}));t.push(...n)}}return Promise.race([Promise.all(t).catch(s.Z),(0,i.Z)(1e3)])}},2586:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3241);const o=s.Z?"touchstart":"mousemove";class r extends i.Z{constructor(){super(),this._isIdle=!0,this.focusPromise=Promise.resolve(),this.focusResolve=()=>{},window.addEventListener("blur",(()=>{this.isIdle=!0,window.addEventListener("focus",(()=>{this.isIdle=!1}),{once:!0})})),window.addEventListener(o,(()=>{this.isIdle=!1}),{once:!0,passive:!0}),this.addEventListener("change",(e=>{e?this.focusPromise=new Promise((e=>{this.focusResolve=e})):this.focusResolve()}))}getFocusPromise(){return this.focusPromise}get isIdle(){return this._isIdle}set isIdle(e){this._isIdle!==e&&(this._isIdle=e,this.dispatchEvent("change",e))}}const a=new r},3815:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(3241);class i extends s.Z{constructor(){super(...arguments),this.overlaysActive=0}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("change",this.isOverlayActive)}}const o=new i},3035:(e,t,n)=>{let s;function i(e){s?s.push(e):(s=[e],requestAnimationFrame((()=>{const e=s;s=void 0,e.forEach((e=>e()))})))}n.d(t,{AD:()=>l,T2:()=>i,TR:()=>c,d1:()=>u});let o,r,a=!1;function c(e){o?a?e():o.push(e):(o=[e],requestAnimationFrame((()=>{a=!0;for(let e=0;ei((()=>e())))),r.then((()=>{r=void 0})),r)}function u(){return new Promise((e=>{i((()=>{i(e)}))}))}},764:(e,t,n)=>{function s(e,t=e.split("?")){const n={};return t[1]?(t[1].split("&").forEach((e=>{n[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])})),n):n}n.d(t,{Z:()=>s})},6714:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3512),o=n(2064);const r=new class{constructor(){i.Z.addEventListener("theme_change",(()=>{this.setTheme()}))}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",i.Z.myId?i.Z.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}applyHighlightningColor(){let e;const t=r.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!s.Z&&e&&(r.themeColor=(0,o.K5)(e))}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor(),this.applyHighlightningColor()}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===i.Z.settings.theme?this.systemTheme:i.Z.settings.theme)){return i.Z.settings.themes.find((t=>t.name===e))}},a=r},6873:(e,t,n)=>{var s=n(4159),i=n(8799),o=n(3910),r=n(8090),a=n(4541),c=n(9976),l=n(4762),u=n(5418);!function(){const e={construct(e,t){let n=t[0]+"";return 0!==n.indexOf("blob:")&&(n+=location.search),new e(n)}};[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean).forEach((t=>{window[t.name]=new Proxy(t,e)}))}();var d=n(3512),h=n(5432),g=n(2325),m=(n(4110),n(690),n(3855)),f=n(2554),v=n(6714),p=n(3815),b=n(490),S=n(764),w=n(1267);document.addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,P=function*(){Element.prototype.toggleAttribute||(Element.prototype.toggleAttribute=function(e,t){return void 0!==t&&(t=!!t),this.hasAttribute(e)?!!t||(this.removeAttribute(e),!1):!1!==t&&(this.setAttribute(e,""),!0)}),void 0===Node.prototype.replaceChildren&&(Node.prototype.replaceChildren=function(...e){this.textContent="",e&&this.append(...e)}),d.Z.managers=(0,f.Z)(),document.getElementById("manifest").href=`site${l.IS_APPLE&&!l.IS_APPLE_MOBILE?"_apple":""}.webmanifest?v=jw3mK7G9Aq`,b.Z.start();const e=window.visualViewport||window;let t,y=!1;const P=()=>{const n=.01*(y&&!p.Z.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(h.Z&&t1&&(0,i.Z)(),t=n,document.documentElement.style.setProperty("--vh",`${n}px`))};if(window.addEventListener("resize",P),P(),r.T){const t=()=>{y=1===n&&r.T&&!p.Z.isOverlayActive,P(),e!==window&&(y?(window.removeEventListener("resize",P),e.addEventListener("resize",P)):(e.removeEventListener("resize",P),window.addEventListener("resize",P)))};let n;window.onImTabChange=e=>{const s=void 0!==n;n=e,(s||1===n)&&t()},p.Z.addEventListener("change",(()=>{t()}))}l.IS_FIREFOX&&!c.Z&&document.addEventListener("dragstart",(e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return(0,o.Z)(e),!1})),c.Z&&document.documentElement.classList.add("native-emoji"),document.addEventListener("dragstart",(e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1})),document.addEventListener("contextmenu",(e=>{"IMG"!==e.target.tagName||window.appMediaViewer||(0,o.Z)(e)})),l.IS_FIREFOX&&document.documentElement.classList.add("is-firefox","no-backdrop"),l.IS_MOBILE&&document.documentElement.classList.add("is-mobile"),l.IS_APPLE?(l.IS_SAFARI&&document.documentElement.classList.add("is-safari"),l.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):l.IS_ANDROID&&document.documentElement.classList.add("is-android"),h.Z?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");const k=performance.now(),E=g.ZP.getCacheLangPack(),[A,_]=yield Promise.all([m.Z.sendState().then((([e])=>e)),E]);function Z(e,t){e.style.opacity="0",t.then((()=>{window.requestAnimationFrame((()=>{e.style.opacity=""}))}))}g.ZP.setTimeFormat(A.state.settings.timeFormat),d.Z.managers.rootScope.getPremium().then((e=>{d.Z.premium=e})),v.Z.setThemeListener(),_.appVersion!==s.Z.langPackVersion&&g.ZP.getLangPack(_.lang_code),console.log("got state, time:",performance.now()-k);let I=A.state.authState;const C=location.hash,L=C.split("?"),T=(0,S.Z)(C,L);if(T.tgWebAuthToken&&"authStateSignedIn"!==I._){const e={token:T.tgWebAuthToken,dcId:+T.tgWebAuthDcId,userId:T.tgWebAuthUserId.toUserId(),isTest:void 0!==T.tgWebAuthTest&&!!+T.tgWebAuthTest,tgAddr:T.tgaddr};if(e.isTest!==w.Z.test){const e=new URLSearchParams(location.search);return+T.tgWebAuthTest?e.set("test","1"):e.delete("test"),void(location.search=e.toString())}d.Z.managers.appStateManager.pushToState("authState",I={_:"authStateSignImport",data:e})}if("authStateSignedIn"!==I._){console.log("Will mount auth page:",I._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,s;if(e){t=e.querySelector(".scrollable"),h.Z&&!l.IS_MOBILE_SAFARI||t.classList.add("no-scrollbar"),t.style.opacity="0";const n=document.createElement("div");n.classList.add("auth-placeholder"),t.prepend(n),t.append(n.cloneNode())}try{yield Promise.all([Promise.resolve().then(n.bind(n,2831)),Promise.resolve().then(n.bind(n,6702))]).then((([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()}))}catch(e){}switch(I._){case"authStateSignIn":s=(yield Promise.all([n.e(51),n.e(408),n.e(63)]).then(n.bind(n,810))).default.mount();break;case"authStateSignQr":s=(yield Promise.all([n.e(51),n.e(408),n.e(709)]).then(n.bind(n,9709))).default.mount();break;case"authStateAuthCode":s=(yield Promise.all([n.e(51),n.e(408),n.e(53)]).then(n.bind(n,6392))).default.mount(I.sentCode);break;case"authStatePassword":s=(yield Promise.all([n.e(51),n.e(408),n.e(442)]).then(n.bind(n,9437))).default.mount();break;case"authStateSignUp":s=(yield Promise.all([n.e(51),n.e(408),n.e(339)]).then(n.bind(n,8339))).default.mount(I.authCode);break;case"authStateSignImport":s=(yield Promise.all([n.e(51),n.e(408),n.e(231)]).then(n.bind(n,3231))).default.mount(I.data)}t&&(s&&(yield s),Z(t,"fonts"in document?Promise.race([(0,u.Z)(1e3),document.fonts.ready]):Promise.resolve()))}else console.log("Will mount IM page:",Date.now()/1e3),Z(document.getElementById("main-columns"),(0,a.Z)()),(yield Promise.all([n.e(51),n.e(408),n.e(436)]).then(n.bind(n,5436))).default.mount()},new((y=void 0)||(y=Promise))((function(n,s){function i(e){try{r(P.next(e))}catch(e){s(e)}}function o(e){try{r(P.throw(e))}catch(e){s(e)}}function r(e){var t;e.done?n(e.value):(t=e.value,t instanceof y?t:new y((function(e){e(t)}))).then(i,o)}r((P=P.apply(e,t||[])).next())}));var e,t,y,P}))},1722:(e,t,n)=>{n.d(t,{Z:()=>s});const s=new class{reload(){try{location.reload()}catch(e){}}close(){try{window.close()}catch(e){}}focus(){window.focus()}}},2554:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(3855),i=n(410);const o={};function r(e,t){return new Proxy(e,{get:(e,n,r)=>{var a;return null!==(a=e[n])&&void 0!==a?a:e[n]=function(e,t){return new Proxy({},{get:(n,r,a)=>(...n)=>{var a;const c=s.Z.invoke("manager",{name:e,method:r,args:n},t);return i.ZP&&(null===(a=o[e])||void 0===a?void 0:a.has(r))&&console.warn("manager request",e,r,n),c}})}(n,t)}})}let a;function c(){return a||(a=r({},!1),a.acknowledged=r({},!0),a)}i.ZP&&(window.DEBUG_MANAGER_REQUESTS=o)},6666:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(1267),i=n(5471),o=n(5953),r=n(5003);class a{constructor(e){(0,o.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),a.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||n.onerror((0,i.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,i)=>{n.onsuccess=t=>{s=!0;const o=n.result;let r=!1;this.log("Opened"),o.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},o.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),o.close()},o.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=o)},n.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},n.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,i=n.result;this.stores.forEach((e=>{if(i.objectStoreNames.contains(e.name)){const s=n.transaction.objectStore(e.name);t(s,e)}else((e,n)=>{const s=e.createObjectStore(n.name);t(s,n)})(i,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new a(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}a.INSTANCES=[];class c{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=a.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,s)=>n.put(t[s],e)))),"",n)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,n,s=this.storeName){let i;return n&&(i=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((o=>new Promise(((r,a)=>{const c=o.transaction([s],e),l=()=>{clearTimeout(h),a(c.error)},u=()=>{clearTimeout(h),n&&this.log(n+": end",performance.now()-i);const e=f.map((e=>e.result));r(m?e:e[0])};c.onerror=l;const d="readwrite"===e;d&&(c.oncomplete=()=>u());const h=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),g=t(c.objectStore(s)),m=Array.isArray(g),f=m?g:[].concat(g);if(d)return;const v=f.length;let p=v;const b=()=>{c.error||--p||u()};for(let e=0;ee.getAll()),"",e)}}},2325:(e,t,n)=>{n.d(t,{$d:()=>S,A1:()=>w,Hz:()=>g,XZ:()=>b,ZP:()=>v,ag:()=>p,nK:()=>m,v_:()=>y});var s=n(410),i=n(7922),o=n(4159),r=n(3512),a=n(4762),c=n(6848),l=n(5953),u=n(9005),d=n(6637),h=n(3591);const g={messageActionChatCreate:"ActionCreateGroup",messageActionChatCreateYou:"ActionYouCreateGroup",messageActionChatEditTitle:"ActionChangedTitle",messageActionChatEditPhoto:"ActionChangedPhoto",messageActionChatEditVideo:"ActionChangedVideo",messageActionChatDeletePhoto:"ActionRemovedPhoto",messageActionChatReturn:"ActionAddUserSelf",messageActionChatReturnYou:"ActionAddUserSelfYou",messageActionChatJoined:"ActionAddUserSelfMega",messageActionChatJoinedYou:"ChannelMegaJoined",messageActionChatAddUser:"ActionAddUser",messageActionChatAddUsers:"ActionAddUser",messageActionChatLeave:"ActionLeftUser",messageActionChatLeaveYou:"YouLeft",messageActionChatDeleteUser:"ActionKickUser",messageActionChatJoinedByLink:"ActionInviteUser",messageActionPinMessage:"Chat.Service.Group.UpdatedPinnedMessage",messageActionContactSignUp:"Chat.Service.PeerJoinedTelegram",messageActionChannelCreate:"ActionCreateChannel",messageActionChannelEditTitle:"Chat.Service.Channel.UpdatedTitle",messageActionChannelEditPhoto:"Chat.Service.Channel.UpdatedPhoto",messageActionChannelEditVideo:"Chat.Service.Channel.UpdatedVideo",messageActionChannelDeletePhoto:"Chat.Service.Channel.RemovedPhoto",messageActionHistoryClear:"HistoryCleared",messageActionDiscussionStarted:"DiscussionStarted",messageActionChannelMigrateFrom:"ActionMigrateFromGroup","messageActionPhoneCall.video_in_ok":"ChatList.Service.VideoCall.incoming","messageActionPhoneCall.video_out_ok":"ChatList.Service.VideoCall.outgoing","messageActionPhoneCall.video_missed":"ChatList.Service.VideoCall.Missed","messageActionPhoneCall.video_cancelled":"ChatList.Service.VideoCall.Cancelled","messageActionPhoneCall.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.cancelled":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"Chat.Service.VoiceChatStarted.Channel","messageActionGroupCall.started_by":"Chat.Service.VoiceChatStarted","messageActionGroupCall.started_byYou":"Chat.Service.VoiceChatStartedYou","messageActionGroupCall.ended":"Chat.Service.VoiceChatFinished.Channel","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"},m=a.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var f;!function(e){let t,a;function g(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function m(){if("h12"===e.timeFormat)try{const t=A({hour:"numeric",minute:"numeric",hour12:!0}),n=new Date;n.setHours(0);const s=t.format(n);e.amPmCache.am=s.split(" ")[1],n.setHours(12);const i=t.format(n);e.amPmCache.pm=i.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function f(){const e=o.Z.langPackCode;return g(e),Promise.all([n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),n.e(8).then(n.bind(n,9179))]).then((([t,n,s])=>{const i=[];return p(t.default,i),p(n.default,i),b({_:"langPackDifference",from_version:0,lang_code:e,strings:i,version:0,local:!0,countries:s.default})}))}function v(t,s){e.requestedServerLanguage=!0;const i=r.Z.managers;return Promise.all([i.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),i.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function p(e,t=[]){for(const n in e){const s=e[n];"string"==typeof s?t.push({_:"langPackString",key:n,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:n},s))}return t}function b(e){return e.appVersion=o.Z.langPackVersion,i.Z.set({langPack:e}).then((()=>(S(e),e)))}function S(n){const s=e.lastRequestedLangCode;if(n.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(n){console.error("pluralRules error",n),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(n.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(n.lang_code.split("-",1)[0])}e.strings.clear();for(const t of n.strings)e.strings.set(t.key,t);n.countries&&(e.countriesList.length=0,e.countriesList.push(...n.countries.countries),n.countries.countries.forEach((t=>{if(t.name){const n=t.default_name;e.strings.set(n,{_:"langPackString",key:n,value:t.name})}}))),e.lastAppliedLangCode!==s&&(r.Z.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,E.clear(),m()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n&&n.update()}))}}function w(e,t,n={i:0}){const s=[];let i=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,o,r,a,c,l,u)=>{if(s.push(u.slice(i,l)),o){let e;switch(o){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...w(r,t,n)),s.push(e)}else if(a)s.push(document.createElement("br"));else if(c){const e=c.lastIndexOf("]"),i=c.slice(1,e),o=c.slice(e+2,c.length-1);let r;if(o&&(0,d.Z)(o)){r=document.createElement("a");const e=(0,h.Z)(o);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[n.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...w(i,t,n)),s.push(r)}else t&&function(e,t,n){const s=t[n.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,n);return i=l+e.length,""})),i!==e.length&&s.push(e.slice(i)),s}function y(n,s=!1,i){const o=e.strings.get(n);let r;if(o)if("langPackStringPluralized"===o._&&(null==i?void 0:i.length)){let e=i[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=o[t.select(e)+"_value"]||o.other_value}else r="langPackString"===o._?o.value:n;else r=n;const a=w(r,i);return s?a.map((e=>e instanceof Node?e.textContent:e)).join(""):a}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.getCacheLangPack=function(){return a||(a=Promise.all([i.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(s.ZP,e.lastRequestedLangCode||g(t.lang_code),S(t),t):f())).finally((()=>{a=void 0})))},e.setTimeFormat=function(t,n=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,m(),n&&(E.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n instanceof _&&n.update()})))},e.loadLocalLangPack=f,e.loadLangPack=v,e.getStrings=function(e,t){return r.Z.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:o.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return g(e),v(e).then((([e,t,n,s,i,o])=>{let r=[];return[n,s].forEach((e=>{p(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=i,b(e)}))},e.saveLangPack=b,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():n.e(642).then(n.bind(n,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=S,e.superFormatter=w,e.format=y,e.weakMap=new WeakMap;class P{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class k extends P{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,l.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...y(this.key,!1,this.args));else{const e=this.element[this.property],t=y(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,c.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=k;const E=new Map;function A(t={}){const n=JSON.stringify(t);let s=E.get(n);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),E.set(n,s)),s}e.amPmCache={am:"AM",pm:"PM"};class _ extends P{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"}))}update(t){let n;if((0,l.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();n=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(n+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=A(this.options);n=(0,u.Z)(e.format(this.date))}this.element[this.property]=n}}e.IntlDateElement=_,e.i18n=function(e,t){return new k({key:e,args:t}).element},e.i18n_=function(e){return new k(e).element},e._i18n=function(e,t,n,s){return new k({element:e,key:t,args:n,property:s}).element}}(f||(f={}));const v=f,p=f.i18n,b=f.i18n_,S=f._i18n;function w(e,t){const n=e.slice(0,1);for(let s=1;s{const s=e&&t?"AutoDownloadSettings.LastDelimeter":"AutoDownloadSettings.Delimeter";return n?f.format(s,!0):p(s)}));return n?s.join(""):s}s.GO.I18n=f},1507:(e,t,n)=>{n.d(t,{DZ:()=>g,IA:()=>o,Iw:()=>l,J$:()=>d,NM:()=>s,Pt:()=>u,Zi:()=>h,gZ:()=>c,hj:()=>i,rU:()=>a,yF:()=>r});const s=0,i=1271266957,o=777,r=777e3,a=2147483647,c="",l=20971520,u="",d=0,h=1,g=new Set([d,h]);Math.max(...Array.from(g))},3855:(e,t,n)=>{n.d(t,{Z:()=>se});var s=n(3512),i=n(7730),o=n(410),r=n(7487),a=n(6702),c=n(1722),l=n(2831),u=n(5418),d=n(993),h=n(7328),g=n(6663),m=n(9976),f=n(3731),v=n(6818),p=n(1174),b=n(2341),S=n(9030),w=n(2365),y=n(2820),P=n(5432),k=n(2131),E=n(554),A=n(393),_=n(5269),Z=n(4089),I=n(4762),C=n(5783),L=n(2045),T=n(8189);const O=Object.assign({CAN_USE_TRANSFERABLES:h.Z,IS_APPLE_MX:T.Z,IS_CALL_SUPPORTED:d.Z,IS_CANVAS_FILTER_SUPPORTED:g.Z,IS_EMOJI_SUPPORTED:m.Z,IS_GEOLOCATION_SUPPORTED:f.Z,IS_GROUP_CALL_SUPPORTED:v.Z,IS_MOV_SUPPORTED:S.Z,IS_PARALLAX_SUPPORTED:w.Z,IS_SCREEN_SHARING_SUPPORTED:y.Z,IS_TOUCH_SUPPORTED:P.Z,IS_VIBRATE_SUPPORTED:k.Z,IS_OPUS_SUPPORTED:C.Z,IS_SHARED_WORKER_SUPPORTED:L.Z,IS_WEBM_SUPPORTED:A.Z,IS_WEBP_SUPPORTED:_.Z,IS_WEBRTC_SUPPORTED:Z.Z,IMAGE_MIME_TYPES_SUPPORTED:p.Z,MEDIA_MIME_TYPES_SUPPORTED:b.Z,VIDEO_MIME_TYPES_SUPPORTED:E.Z},I);var M=n(4159),W=n(236),D=n(6009),R=n(8479),x=n(946),N=n(7922),U=n(5466),F=n(5003);const j=W.h.version,B=W.h.build,V=Object.keys(W.h),G=["contactsListCachedTime","stateCreatedTime","maxSeenMsgId","filtersArr"];function z(){return e=this,t=void 0,i=function*(){const e=(0,F.kg)("STATE-LOADER"),t=performance.now(),n=(0,U.$)(e),i=V.map((e=>n(N.Z.get(e),"state "+e))).concat(n(r.Z.get("user_auth"),"auth"),n(r.Z.get("state_id"),"auth"),n(r.Z.get("k_build"),"auth")).concat(n(N.Z.get("user_auth"),"old auth")),a=yield Promise.all(i);e.warn("promises",performance.now()-t);const c=[],l=(e,t)=>{u[e]=t,c.push(e)};let u={};for(let e=0,t=V.length;eN.Z.get(e))));e.push("user_auth"),t.push("number"==typeof d||"string"==typeof d?{dcID:t[0]||M.Z.baseDcId,date:Date.now()/1e3|0,id:d.toPeerId(!1)}:d);const n={};e.forEach(((e,s)=>{n[e]=t[s]})),yield r.Z.set(n)}d&&(u.authState={_:"authStateSignedIn"},s.Z.dispatchEvent("user_auth","number"==typeof d||"string"==typeof d?{dcID:0,date:Date.now()/1e3|0,id:d.toPeerId(!1)}:d));const f=new Set;if(u.stateId!==h){if(void 0!==h){const e=new Map([["authState",void 0],["stateId",void 0]]);e.forEach(((t,n)=>{e.set(n,(0,R.Z)(u[n]))})),u=(0,R.Z)(W.h),e.forEach(((e,t)=>{u[t]=e}));const t={chats:1,dialogs:1,users:1};for(const e in t)f.add(e);v=u,c.length=0,u=v,c.push(...Object.keys(u))}yield r.Z.set({state_id:u.stateId})}var v;const p=Date.now();if(u.stateCreatedTime+864e5{l(e,(0,R.Z)(W.h[e]))}))),!u.settings.hasOwnProperty("theme")&&u.settings.hasOwnProperty("nightTheme")&&(u.settings.theme=u.settings.nightTheme?"night":"day",l("settings",u.settings)),!u.settings.hasOwnProperty("themes")&&u.settings.background){u.settings.themes=(0,R.Z)(W.h.settings.themes);const e=u.settings.themes.find((e=>e.name===u.settings.theme));e&&(e.background=u.settings.background,l("settings",u.settings))}const b=u.settings.autoDownload;if(void 0!==(null==b?void 0:b.private)){const e=["contacts","private","groups","channels"];["photo","video","file"].forEach((t=>{const n=b[t]={};e.forEach((e=>{n[e]=b[e]}))})),e.forEach((e=>{delete b[e]})),l("settings",u.settings)}let S,w;if((0,x.Z)(W.h,u,(e=>{l(e,u[e])})),u.version!==j||u.build!==B){if(u.build<217&&(u.allDialogsLoaded=(0,R.Z)(W.h.allDialogsLoaded),u.pinnedOrders=(0,R.Z)(W.h.pinnedOrders),u.filtersArr=(0,R.Z)(W.h.filtersArr),f.add("dialogs")),-1===(0,D.Z)(u.version,"1.3.0")){let e=!1;u.settings.themes.forEach(((t,n,s)=>{if("day"===t.name&&"ByxGo2lrMFAIAAAAmkJxZabh8eM"===t.background.slug&&"image"===t.background.type||"night"===t.name&&"#0f0f0f"===t.background.color&&"color"===t.background.type){const i=W.h.settings.themes.find((e=>e.name===t.name));i&&(s[n]=(0,R.Z)(i),e=!0)}})),e&&l("settings",u.settings)}0!==(0,D.Z)(u.version,j)&&(S=j,w=u.version),l("version",j),l("build",B)}return g!==B&&(!g||g{var t,n;const{name:s,key:i,value:o}=e;if(!e.hasOwnProperty("key"))return void(this.mirrors[s]=o);const r=null!==(t=(n=this.mirrors)[s])&&void 0!==t?t:n[s]={};void 0===o?delete r[i]:r[i]=o},this.mirrors={},this.tabState={chatPeerIds:[],idleStartTime:0},this.log("constructor"),this.registerWorker(),this.registerServiceWorker(),this.registerCryptoWorker(),this.addMultipleEventsListeners({convertWebp:({fileName:e,bytes:t})=>i.Z.convert(e,t),convertOpus:({fileName:e,bytes:t})=>$.Z.pushDecodeTask(t,!1).then((e=>e.bytes)),event:({name:e,args:t})=>{s.Z.dispatchEventSingle(e,...t)},localStorageProxy:e=>{const t=e;return r.Z[t.type](...t.args)},mirror:this.onMirrorTask}),s.Z.addEventListener("language_change",(e=>{s.Z.managers.networkerFactory.setLanguage(e)})),window.addEventListener("online",(()=>{s.Z.managers.networkerFactory.forceReconnectTimeout()})),s.Z.addEventListener("logging_out",(()=>{Promise.all([(0,J.Z)(!1,!0),r.Z.clear(),Promise.race([l.default.setAuthorized(!1),(0,u.Z)(3e3)]),a.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map((e=>caches.delete(e))))]).finally((()=>{c.Z.reload()}))})),X.Z.addEventListener("change",(e=>{this.updateTabStateIdle(e)})),this.updateTabStateIdle(X.Z.isIdle),this.log("Passing environment:",O),this.invoke("environment",O)}pingServiceWorkerWithIframe(){if(this.pingServiceWorkerPromise)return this.pingServiceWorkerPromise;const e=this.pingServiceWorkerPromise=(0,Q.Z)(),t=document.createElement("iframe");t.hidden=!0;const n=()=>{setTimeout((()=>{this.pingServiceWorkerPromise=void 0}),1e4),clearTimeout(s),t.remove(),t.removeEventListener("load",n),t.removeEventListener("error",n),e.resolve()};t.addEventListener("load",n),t.addEventListener("error",n),t.src="ping/"+(4294967295*Math.random()|0),document.body.append(t);const s=window.setTimeout(n,1e3);return e}attachServiceWorker(e){this.lastServiceWorker&&this.serviceMessagePort.detachPort(this.lastServiceWorker),this.serviceMessagePort.attachSendPort(this.lastServiceWorker=e),this.serviceMessagePort.invokeVoid("hello",void 0)}_registerServiceWorker(){navigator.serviceWorker.register(new URL(n.p+n.u(670),n.b),{scope:"./"}).then((e=>{if(this.log("SW registered",e),e.active&&!navigator.serviceWorker.controller)return e.unregister().then((()=>{window.location.reload()}));(e.installing||e.waiting||e.active).addEventListener("statechange",(e=>{this.log("SW statechange",e)}));const t=navigator.serviceWorker.controller||e.installing||e.waiting||e.active;this.attachServiceWorker(t)}),(e=>{this.log.error("SW registration failed!",e),this.invokeVoid("serviceWorkerOnline",!1)}))}registerServiceWorker(){if(!("serviceWorker"in navigator))return;this.serviceMessagePort=new K.Z;const e=navigator.serviceWorker;this._registerServiceWorker(),e.addEventListener("controllerchange",(()=>{this.log.warn("controllerchange");const t=e.controller;this.attachServiceWorker(t),t.addEventListener("error",(e=>{this.log.error("controller error:",e)}))})),this.serviceMessagePort.attachListenPort(e),this.serviceMessagePort.addMultipleEventsListeners({port:(e,t,n)=>{this.invokeVoid("serviceWorkerPort",void 0,void 0,[n.ports[0]])},hello:(e,t)=>{this.serviceMessagePort.resendLockTask(t)}}),e.addEventListener("messageerror",(e=>{this.log.error("SW messageerror:",e)}))}registerCryptoWorker(){return ee(this,void 0,void 0,(function*(){const e={construct:(e,t)=>({url:t[0]+location.search})},t=[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean);t.forEach((t=>window[t.name]=new Proxy(t,e)));const s=new Worker(new URL(n.p+n.u(589),n.b),{type:void 0});t.forEach((e=>window[e.name]=e));const i=s.url,o=e=>new a(e,{type:"module"}),r=e=>this.attachWorkerToPort(e,Y.Z,"crypto"),a=L.Z?SharedWorker:Worker;Y.Z.addEventListener("port",((e,t,n)=>{this.invokeVoid("cryptoPort",void 0,void 0,[n.ports[0]])})),r(o(i));const c=yield(l=i,fetch(l).then((e=>e.text())).then((e=>{const t=location.pathname.split("/");return t[t.length-1]="",e=`\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${location.origin+t.join("/")}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${e}`,new Blob([e],{type:"application/javascript"})})));var l;(yield this.invoke("createProxyWorkerURLs",{originalUrl:i,blob:c})).slice(1).map(o).forEach(r)}))}registerWorker(){let e;e=L.Z?new SharedWorker(new URL(n.p+n.u(678),n.b),{type:void 0}):new Worker(new URL(n.p+n.u(678),n.b),{type:void 0}),this.onWorkerFirstMessage(e)}attachWorkerToPort(e,t,n){const s=e.port||e;t.attachPort(s),e.addEventListener("error",(e=>{this.log.error(n,"worker error",e)}))}onWorkerFirstMessage(e){this.log("set webWorker"),this.attachWorkerToPort(e,this,"mtproto")}loadState(){return Promise.all([(null!=q?q:q=z()).then((e=>(this.newVersion=e.newVersion,this.oldVersion=e.oldVersion,this.mirrors.state=e.state,e)))])}sendState(){return this.loadState().then((e=>{const[t]=e;return this.invoke("state",Object.assign(Object.assign({},t),{userId:s.Z.myId.toUserId()})),e}))}invokeCrypto(e,...t){return Y.Z.invokeCrypto(e,...t)}toggleStorages(e,t){return ee(this,void 0,void 0,(function*(){yield(0,J.Z)(e,t),this.invoke("toggleStorages",{enabled:e,clearWrite:t}),this.serviceMessagePort.invokeVoid("toggleStorages",{enabled:e,clearWrite:t})}))}getMirror(e){return ee(this,void 0,void 0,(function*(){return this.mirrors[e]}))}getState(){return this.getMirror("state")}updateTabState(e,t){this.tabState[e]=t,this.invokeVoid("tabState",this.tabState)}updateTabStateIdle(e){this.updateTabState("idleStartTime",e?Date.now():0)}}const ne=new te;o.GO.apiManagerProxy=ne;const se=ne},490:(e,t,n)=>{n.d(t,{Z:()=>v});var s=n(4159),i=n(410),o=n(2219),r=n(2045),a=n(3241),c=n(2586),l=n(5003),u=n(3512),d=n(7487),h=n(3855);const g=r.Z;class m extends a.Z{constructor(){super(!1),this.log=(0,l.kg)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),d.Z.delete("xt_instance"))},this.checkInstance=(e=c.Z.isIdle)=>{return t=this,n=void 0,o=function*(){if(this.deactivated)return;const t=Date.now(),n={id:this.instanceId,idle:e,time:t},[i,o=s.Z.build]=yield Promise.all([d.Z.get("xt_instance",!1),d.Z.get("k_build",!1)]);if(o>s.Z.build)return this.masterInstance=!1,u.Z.managers.networkerFactory.stopAll(),this.deactivateInstance("version"),void h.Z.toggleStorages(!1,!1);g?d.Z.set({xt_instance:n}):!e||!i||i.id===this.instanceId||i.timethis.deactivateInstance("tabs")),3e4)))},new((i=void 0)||(i=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function a(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,a)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o},this.log=(0,l.kg)("INSTANCE"),this.instanceId=o.Z}get deactivatedReason(){return this.deactivated}start(){if(this.reset(),!this.started){this.started=!0,c.Z.addEventListener("change",this.checkInstance),setInterval(this.checkInstance,5e3),this.checkInstance();try{document.documentElement.addEventListener("beforeunload",this.clearInstance)}catch(e){}}}reset(){this.masterInstance=!1,this.clearDeactivateTimeout(),this.deactivated=void 0}activateInstance(){this.deactivated&&(this.reset(),this.checkInstance(!1),this.dispatchEvent("activated"))}deactivateInstance(e){this.masterInstance||this.deactivated||(this.log.warn("deactivate",e),this.clearDeactivateTimeout(),this.deactivated=e,this.dispatchEvent("deactivated",e))}clearDeactivateTimeout(){this.deactivateTimeout&&(clearTimeout(this.deactivateTimeout),this.deactivateTimeout=0)}}const f=new m;i.GO&&(i.GO.singleInstance=f);const v=f},2831:(e,t,n)=>{n.r(t),n.d(t,{TelegramMeWebManager:()=>c,default:()=>u});var s=n(4159),i=n(410),o=n(1267),r=n(7298),a=n(7487);class c{constructor(){this.disabled=o.Z.test||-1===s.Z.domains.indexOf(location.hostname)}setAuthorized(e){if(!this.disabled)return a.Z.get("tgme_sync").then((t=>{const n=(0,r.Z)(!0);if(e&&(null==t?void 0:t.canRedirect)===e&&t.ts+86400>n)return;a.Z.set({tgme_sync:{canRedirect:e,ts:n}});const i=`_websync_?authed=${e?"1":"0"}&version=${encodeURIComponent(s.Z.version+" "+s.Z.suffix)}`,o=["//telegram.me/"+i,"//t.me/"+i].map((e=>function(e){const t=document.createElement("script"),n=new Promise((e=>{t.onload=t.onerror=()=>{e(t)}}));return t.src=e,document.body.appendChild(t),n}(e).then((e=>{e.remove()}))));return Promise.all(o)}))}}const l=new c;i.GO&&(i.GO.telegramMeWebManager=l);const u=l},6702:(e,t,n)=>{n.r(t),n.d(t,{WebPushApiManager:()=>h,default:()=>m});var s=n(410),i=n(5003),o=n(3855),r=n(2325),a=n(4762),c=n(1722),l=n(8479),u=n(490),d=n(3241);class h extends d.Z{constructor(){super(!1),this.isAvailable=!0,this.isPushEnabled=!1,this.localNotificationsAvailable=!0,this.started=!1,this.settings={},this.isFirefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,this.userVisibleOnly=!this.isFirefox,this.log=(0,i.kg)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then((e=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",e)})).catch((e=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",e),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))}))}))},this.isAliveNotify=()=>{if(!this.isAvailable||u.Z.deactivatedReason)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"");const e={},t={push_action_mute1d:a.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:a.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const n in t)e[n]=r.ZP.format(t[n],!0);o.Z.serviceMessagePort.invokeVoid("pushPing",{localNotifications:this.localNotificationsAvailable,lang:e,settings:this.settings}),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!!e,this.pushSubscriptionNotify("init",e)})).catch((e=>{this.log.error("Error during getSubscription()",e)}))}))}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!1,e&&(this.pushSubscriptionNotify("unsubscribe",e),setTimeout((()=>{e.unsubscribe().then((e=>{this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))}),3e3))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.log.warn("force unsubscribe",e),e&&e.unsubscribe().then((e=>{this.log.warn("force unsubscribe successful",e),this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}setSettings(e){this.settings=(0,l.Z)(e),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){this.isAvailable&&o.Z.serviceMessagePort.invokeVoid("notificationsClear",void 0)}setUpServiceWorkerChannel(){this.isAvailable&&(o.Z.serviceMessagePort.addEventListener("pushClick",(e=>{u.Z.deactivatedReason?c.Z.reload():this.dispatchEvent("push_notification_click",e)})),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(e,t){if(t){const n=t.toJSON();if(!(n&&n.endpoint&&n.keys&&n.keys.p256dh&&n.keys.auth))return this.log.warn("Invalid push subscription",n),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(e);this.log.warn("Push",e,n),this.dispatchEvent("push_"+e,{tokenType:10,tokenValue:JSON.stringify(n)})}else this.log.warn("Push",e,!1),this.dispatchEvent("push_"+e,!1)}}const g=new h;s.GO&&(s.GO.webPushApiManager=g);const m=g},9043:(e,t,n)=>{n.d(t,{Z:()=>u});var s=n(410),i=n(5783),o=n(4762),r=n(5003),a=n(3855),c=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function r(e){try{c(s.next(e))}catch(e){o(e)}}function a(e){try{c(s.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((s=s.apply(e,t||[])).next())}))};const l=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=(0,r.kg)("OPUS",r.v9.Error)}isPlaySupported(){return i.Z}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",(e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}})))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",(e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},o.IS_SAFARI?void 0:t.map((e=>e.buffer)))})))}setKeepAlive(e){this.keepAlive=e,this.keepAlive?(this.loadWorker(),this.loadWavWorker()):this.tasks.length||this.terminateWorkers()}onTaskEnd(e,t){t?(clearTimeout(e.timeout),e.callback.resolve({bytes:t,waveform:e.waveform})):e.callback.reject("timeout"),this.tasks.length&&this.executeNewTask(this.tasks[0]),this.terminateWorkers()}terminateWorkers(e=!1){(!this.keepAlive&&!this.tasks.length||e)&&(this.worker&&(this.worker.terminate(),this.worker=null),this.wavWorker&&(this.wavWorker.terminate(),this.wavWorker=null))}executeNewTask(e){this.worker.postMessage({command:"init",decoderSampleRate:this.sampleRate,outputBufferSampleRate:this.sampleRate}),this.wavWorker.postMessage({command:"init",wavBitDepth:16,wavSampleRate:this.sampleRate}),this.log("[DECODER] send decode"),this.worker.postMessage({command:"decode",pages:e.pages,waveform:e.withWaveform},o.IS_SAFARI?void 0:[e.pages.buffer]),e.timeout=window.setTimeout((()=>{this.log.error("decode timeout"),this.terminateWorkers(!0),this.tasks.length&&(this.loadWorker(),this.loadWavWorker()),this.onTaskEnd(this.tasks.shift())}),1e4)}pushDecodeTask(e,t){return new Promise(((n,s)=>{const i={pages:e,withWaveform:t,callback:{resolve:n,reject:s},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(i)&&this.executeNewTask(i)}))}decode(e,t=!1){return c(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then((e=>c(this,void 0,void 0,(function*(){const t=new Blob([e.bytes],{type:"audio/wav"});return{url:yield a.Z.invoke("createObjectURL",t),waveform:e.waveform}}))))}))}};s.GO.opusDecodeController=l;const u=l},2423:(e,t,n)=>{n.d(t,{$2:()=>l,E:()=>u,Hk:()=>h,QB:()=>d,SC:()=>g,bu:()=>c,it:()=>a,kO:()=>f,tY:()=>m});var s=n(1229);const i="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",o="["+i+"0-9]",r="((?:https?|ftp)://|mailto:)?",a=r+"(?:"+o+"{1,64}(?::"+o+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+o+"["+i+"·0-9-]{0,64}(?:\\."+o+"["+i+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+i+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",c=(new RegExp("^"+r.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),l=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+a+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#[0-9_a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),u=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,d=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,h={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},g={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},m=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in g)m.add(g[e]);const f=/^\+\d+$/},3512:(e,t,n)=>{n.d(t,{Z:()=>u});var s=n(1507),i=n(3241),o=n(410),r=n(3206),a=n(1352);class c extends i.Z{constructor(){super(),this.myId=s.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle",(e=>{this.premium=e})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),r.Z.getInstance().invokeVoid("event",{name:e,args:t})},a.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const l=new c;o.GO.rootScope=l;const u=l},7730:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(410),i=n(3725);const o=new class{constructor(){this.convertPromises={}}init(){this.worker=new Worker(new URL(n.p+n.u(61),n.b)),this.worker.addEventListener("message",(e=>{const t=e.data.payload,n=this.convertPromises[t.fileName];n&&(t.bytes?n.resolve(t.bytes):n.reject(),delete this.convertPromises[t.fileName])}))}postMessage(e){this.init&&(this.init(),this.init=null),this.worker.postMessage(e)}convert(e,t){if(this.convertPromises.hasOwnProperty(e))return this.convertPromises[e];const n=(0,i.Z)();return this.postMessage({type:"convertWebp",payload:{fileName:e,bytes:t}}),this.convertPromises[e]=n}};s.GO.webpWorkerController=o;const r=o}},u={};function d(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return l[e].call(n.exports,n,n.exports,d),n.exports}d.m=l,e=[],d.O=(t,n,s,i)=>{if(!n){var o=1/0;for(l=0;l=i)&&Object.keys(d.O).every((e=>d.O[e](n[a])))?n.splice(a--,1):(r=!1,i0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[n,s,i]},d.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return d.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,d.t=function(e,s){if(1&s&&(e=this(e)),8&s)return e;if("object"==typeof e&&e){if(4&s&&e.__esModule)return e;if(16&s&&"function"==typeof e.then)return e}var i=Object.create(null);d.r(i);var o={};t=t||[null,n({}),n([]),n(n)];for(var r=2&s&&e;"object"==typeof r&&!~t.indexOf(r);r=n(r))Object.getOwnPropertyNames(r).forEach((t=>o[t]=()=>e[t]));return o.default=()=>e,d.d(i,o),i},d.d=(e,t)=>{for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.f={},d.e=e=>Promise.all(Object.keys(d.f).reduce(((t,n)=>(d.f[n](e,t),t)),[])),d.u=e=>(({589:"crypto.worker",630:"npm.qr-code-styling",670:"sw",678:"mtproto.worker"}[e]||e)+"."+{8:"0544e00385e42a07883b",51:"015549e15aab2a59d3a0",53:"3829958682207da0768c",61:"21ea8f96aad63bd2211c",63:"f3beda66b31880abf426",77:"808c5b447b007ee7aa9d",104:"d9383d4cf03fc631a3a9",231:"071dbf1017e65586295d",301:"a3f22008d452affb1ae4",339:"764b22e455094abfa43f",392:"eb2cde6a1063177ee3ad",408:"03880fedecb1e421da3b",436:"a3c8c35b715fcb7c4d9f",442:"aee5aa5c25ff95c14b4d",508:"648a1c3659fa38d09b83",589:"a0cf65ddba162cb08d08",630:"5c8af6e9c411419a66e1",641:"1fc33fe3e0c4c0c41a9e",642:"d6b90b5bc53545046507",670:"c12b91543b047629a922",678:"b6bdf87282369207cefc",709:"03eeac190dc611bf8d97",774:"be0952a2ec87ed053042",776:"8ab4eee78bc43703a976",781:"5b082181115fbfebcf63",783:"a5ff7c878494d8a1624d",810:"3f514515bc74111bee6d",813:"e7782ee52edafa426cd5"}[e]+".chunk.js"),d.miniCssF=e=>{},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s={},i="tweb:",d.l=(e,t,n,o)=>{if(s[e])s[e].push(t);else{var r,a;if(void 0!==n)for(var c=document.getElementsByTagName("script"),l=0;l{r.onerror=r.onload=null,clearTimeout(g);var i=s[e];if(delete s[e],r.parentNode&&r.parentNode.removeChild(r),i&&i.forEach((e=>e(n))),t)return t(n)},g=setTimeout(h.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=h.bind(null,r.onerror),r.onload=h.bind(null,r.onload),a&&document.head.appendChild(r)}},d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;d.g.importScripts&&(e=d.g.location+"");var t=d.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),d.p=e})(),o=d.u,r=d.e,a=new Map,c=new Map,d.u=function(e){return o(e)+(a.has(e)?"?"+a.get(e):"")},d.e=function(e){return r(e).catch((function(t){var n=c.has(e)?c.get(e):999999;if(n<1){var s=o(e);throw t.message="Loading chunk "+e+" failed after 999999 retries.\n("+s+")",t.request=s,t}return new Promise((function(t){setTimeout((function(){var s=Date.now();a.set(e,s),c.set(e,n-1),t(d.e(e))}),3e3)}))}))},(()=>{d.b=document.baseURI||self.location.href;var e={179:0};d.f.j=(t,n)=>{var s=d.o(e,t)?e[t]:void 0;if(0!==s)if(s)n.push(s[2]);else{var i=new Promise(((n,i)=>s=e[t]=[n,i]));n.push(s[2]=i);var o=d.p+d.u(t),r=new Error;d.l(o,(n=>{if(d.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var i=n&&("load"===n.type?"missing":n.type),o=n&&n.target&&n.target.src;r.message="Loading chunk "+t+" failed.\n("+i+": "+o+")",r.name="ChunkLoadError",r.type=i,r.request=o,s[1](r)}}),"chunk-"+t,t)}},d.O.j=t=>0===e[t];var t=(t,n)=>{var s,i,[o,r,a]=n,c=0;if(o.some((t=>0!==e[t]))){for(s in r)d.o(r,s)&&(d.m[s]=r[s]);if(a)var l=a(d)}for(t&&t(n);cd(6873)));h=d.O(h)})(); -//# sourceMappingURL=main.1fe88778f443685606bb.bundle.js.map \ No newline at end of file diff --git a/public/main.1fe88778f443685606bb.bundle.js.map b/public/main.1fe88778f443685606bb.bundle.js.map deleted file mode 100644 index 6d18bfe1..00000000 --- a/public/main.1fe88778f443685606bb.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.1fe88778f443685606bb.bundle.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/config/state.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/environment/appleMx.ts","webpack://tweb/./src/environment/callSupport.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/canvasFilterSupport.ts","webpack://tweb/./src/environment/emojiSupport.ts","webpack://tweb/./src/environment/geolocationSupport.ts","webpack://tweb/./src/environment/groupCallSupport.ts","webpack://tweb/./src/environment/imageMimeTypesSupport.ts","webpack://tweb/./src/environment/mediaMimeTypesSupport.ts","webpack://tweb/./src/environment/movSupport.ts","webpack://tweb/./src/environment/opusSupport.ts","webpack://tweb/./src/environment/parallaxSupport.ts","webpack://tweb/./src/environment/screenSharingSupport.ts","webpack://tweb/./src/environment/sharedWorkerSupport.ts","webpack://tweb/./src/environment/touchSupport.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/vibrateSupport.ts","webpack://tweb/./src/environment/videoMimeTypesSupport.ts","webpack://tweb/./src/environment/webmSupport.ts","webpack://tweb/./src/environment/webpSupport.ts","webpack://tweb/./src/environment/webrtcSupport.ts","webpack://tweb/./src/helpers/color.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/helpers/dom/blurActiveElement.ts","webpack://tweb/./src/helpers/dom/cancelEvent.ts","webpack://tweb/./src/helpers/dom/findUpClassName.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInput.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack://tweb/./src/helpers/dom/loadFonts.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/string/parseUriParams.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.ts","webpack://tweb/./src/index.ts","webpack://tweb/./src/helpers/dom/toggleAttributePolyfill.ts","webpack://tweb/./src/lib/appManagers/appRuntimeManager.ts","webpack://tweb/./src/lib/appManagers/getProxiedManagers.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/environment/index.ts","webpack://tweb/./src/lib/appManagers/utils/state/loadState.ts","webpack://tweb/./src/lib/mtproto/mtprotoworker.ts","webpack://tweb/./src/lib/mtproto/singleInstance.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/helpers/dom/loadScript.ts","webpack://tweb/./src/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/webp/webpWorkerController.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/jsonp chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tweb:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppMediaPlaybackController} from '../components/appMediaPlaybackController';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport getTimeFormat from '../helpers/getTimeFormat';\nimport {nextRandomUint} from '../helpers/random';\nimport {AutoDownloadSettings, NotifyPeer, PeerNotifySettings} from '../layer';\nimport {TopPeerType, MyTopPeer} from '../lib/appManagers/appUsersManager';\nimport DialogsStorage from '../lib/storages/dialogs';\nimport FiltersStorage from '../lib/storages/filters';\nimport {AuthState} from '../types';\nimport App from './app';\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n contactsListCachedTime: number,\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n // filters?: FiltersStorage['filters'], // ! DEPRECATED\n filtersArr?: FiltersStorage['filtersArr'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n recentCustomEmoji: DocId[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\nconst BACKGROUND_DAY_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n};\n\nconst BACKGROUND_DAY_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 0,\n id: '1'\n};\n\nconst BACKGROUND_NIGHT_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n};\n\nconst BACKGROUND_NIGHT_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n intensity: 0,\n id: '-1'\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filtersArr: [],\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n recentCustomEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: IS_MOBILE ? BACKGROUND_DAY_MOBILE : BACKGROUND_DAY_DESKTOP\n }, {\n name: 'night',\n background: IS_MOBILE ? BACKGROUND_NIGHT_MOBILE : BACKGROUND_NIGHT_DESKTOP\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","let IS_APPLE_MX = false;\n\ntry {\n // Awesome detect from https://stackoverflow.com/a/65412357\n const ctx = document.createElement('canvas').getContext('webgl');\n const extension = ctx.getExtension('WEBGL_debug_renderer_info');\n const renderer: string = extension && ctx.getParameter(extension.UNMASKED_RENDERER_WEBGL) || '';\n if((renderer.match(/Apple/) && !renderer.match(/Apple GPU/)) ||\n ctx.getSupportedExtensions().indexOf('WEBGL_compressed_texture_s3tc_srgb') === -1) {\n IS_APPLE_MX = true;\n }\n} catch(err) {\n\n}\n\nexport default IS_APPLE_MX;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport default IS_CANVAS_FILTER_SUPPORTED;\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","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","import IS_WEBP_SUPPORTED from './webpSupport';\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","import IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","const audio = document.createElement('audio');\nconst IS_OPUS_SUPPORTED = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\n\nexport default IS_OPUS_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","const IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined'/* && false */;\n\nexport default IS_SHARED_WORKER_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// @ts-ignore\r\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\r\nexport default IS_TOUCH_SUPPORTED;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import IS_MOV_SUPPORTED from './movSupport';\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\nexport default IS_WEBM_SUPPORTED;\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type ColorHsla = {\r\n h: number,\r\n s: number,\r\n l: number,\r\n a: number\r\n};\r\n\r\nexport type ColorRgba = [number, number, number, number];\r\nexport type ColorRgb = [number, number, number];\r\n\r\n/**\r\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\r\n */\r\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\r\n r /= 255, g /= 255, b /= 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n let h: number, s: number;\r\n const l = (max + min) / 2;\r\n\r\n if(max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n const d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch(max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return {\r\n h: h * 360,\r\n s: s * 100,\r\n l: l * 100,\r\n a\r\n };\r\n}\r\n\r\n// * https://stackoverflow.com/a/9493060/6758968\r\n/**\r\n * Converts an HSL color value to RGB. Conversion formula\r\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\r\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\r\n * returns r, g, and b in the set [0, 255].\r\n *\r\n * @param {number} h The hue\r\n * @param {number} s The saturation\r\n * @param {number} l The lightness\r\n * @return {Array} The RGB representation\r\n */\r\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\r\n h /= 360, s /= 100, l /= 100;\r\n let r: number, g: number, b: number;\r\n\r\n if(s === 0) {\r\n r = g = b = l; // achromatic\r\n } else {\r\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\r\n if(t < 0) t += 1;\r\n if(t > 1) t -= 1;\r\n if(t < 1/6) return p + (q - p) * 6 * t;\r\n if(t < 1/2) return q;\r\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n }\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1/3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1/3);\r\n }\r\n\r\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\r\n}\r\n\r\nexport function hslaStringToRgba(hsla: string) {\r\n const splitted = hsla.slice(5, -1).split(', ');\r\n const alpha = +splitted.pop();\r\n const arr = splitted.map((val) => {\r\n if(val.endsWith('%')) {\r\n return +val.slice(0, -1);\r\n }\r\n\r\n return +val;\r\n });\r\n\r\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\r\n}\r\n\r\nexport function hexaToRgba(hexa: string) {\r\n const arr: ColorRgba = [] as any;\r\n const offset = hexa[0] === '#' ? 1 : 0;\r\n if(hexa.length === (5 + offset)) {\r\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\r\n }\r\n\r\n if(hexa.length === (3 + offset)) {\r\n for(let i = offset; i < hexa.length; ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n } else if(hexa.length === (4 + offset)) {\r\n for(let i = offset; i < (hexa.length - 1); ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n\r\n arr.push(parseInt(hexa[hexa.length - 1], 16));\r\n } else {\r\n for(let i = offset; i < hexa.length; i += 2) {\r\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nexport function hexToRgb(hex: string) {\r\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\r\n}\r\n\r\nexport function hexaToHsla(hexa: string) {\r\n const rgba = hexaToRgba(hexa);\r\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\r\n}\r\n\r\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\r\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\r\n}\r\n\r\nexport function hslaStringToHexa(hsla: string) {\r\n return rgbaToHexa(hslaStringToRgba(hsla));\r\n}\r\n\r\nexport function hslaStringToHex(hsla: string) {\r\n return hslaStringToHexa(hsla).slice(0, -2);\r\n}\r\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function blurActiveElement() {\r\n if((document.activeElement as HTMLInputElement)?.blur) {\r\n (document.activeElement as HTMLInputElement).blur();\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelEvent(event: Event) {\r\n event = event || window.event;\r\n if(event) {\r\n // @ts-ignore\r\n event = event.originalEvent || event;\r\n\r\n try {\r\n if(event.stopPropagation) event.stopPropagation();\r\n if(event.preventDefault) event.preventDefault();\r\n event.returnValue = false;\r\n event.cancelBubble = true;\r\n } catch(err) {}\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// export function findUpClassName(el: any, className: string): T;\r\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\r\n return (el as any).closest('.' + className);\r\n /* if(el.classList.contains(className)) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.classList.contains(className))\r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {doubleRaf} from '../schedulers';\r\n\r\nexport default function fixSafariStickyInput(input: HTMLElement) {\r\n input.style.transform = 'translateY(-99999px)';\r\n /* input.style.position = 'fixed';\r\n input.style.top = '-99999px';\r\n input.style.left = '0'; */\r\n input.focus();\r\n\r\n // setTimeout(() => {\r\n doubleRaf().then(() => {\r\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n /* input.style.position = '';\r\n input.style.top = ''; */\r\n input.style.transform = '';\r\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n\r\n /* setTimeout(() => {\r\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\r\n }, 50); */\r\n });\r\n // }, 0);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport findUpClassName from './findUpClassName';\nimport fixSafariStickyInput from './fixSafariStickyInput';\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n const 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 noop from '../noop';\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).catch(noop),\r\n pause(1000)\r\n ]);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport EventListenerBase from './eventListenerBase';\n\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\nconst DO_NOT_IDLE = false;\n\nexport class IdleController extends EventListenerBase<{\n change: (idle: boolean) => void\n}> {\n private _isIdle: boolean;\n\n private focusPromise: Promise;\n private focusResolve: () => void;\n\n constructor() {\n super();\n\n this._isIdle = true;\n this.focusPromise = Promise.resolve();\n this.focusResolve = () => {};\n\n window.addEventListener('blur', () => {\n this.isIdle = true;\n\n window.addEventListener('focus', () => {\n this.isIdle = false;\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.isIdle = false;\n }, {once: true, passive: true});\n\n this.addEventListener('change', (idle) => {\n if(idle) {\n this.focusPromise = new Promise((resolve) => {\n this.focusResolve = resolve;\n });\n } else {\n this.focusResolve();\n }\n });\n }\n\n public getFocusPromise() {\n return this.focusPromise;\n }\n\n public get isIdle() {\n return this._isIdle;\n }\n\n public set isIdle(value: boolean) {\n if(this._isIdle === value) {\n return;\n }\n\n if(DO_NOT_IDLE && value) {\n return;\n }\n\n this._isIdle = value;\n this.dispatchEvent('change', value);\n }\n}\n\nconst idleController = new IdleController();\nexport default idleController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from './eventListenerBase';\n\nexport class OverlayCounter extends EventListenerBase<{\n change: (isActive: boolean) => void\n}> {\n public overlaysActive = 0;\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('change', this.isOverlayActive);\n }\n}\n\nconst overlayCounter = new OverlayCounter();\nexport default overlayCounter;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's schedulers\r\nimport {NoneToVoidFunction} from '../types';\r\n\r\n/*\r\nexport function throttleWithTickEnd(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\r\nexport function fastRafConventional(callback: NoneToVoidFunction) {\r\n if(!fastRafConventionalCallbacks) {\r\n fastRafConventionalCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n processing = true;\r\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\r\n fastRafConventionalCallbacks[i]();\r\n }\r\n\r\n fastRafConventionalCallbacks = undefined;\r\n processing = false;\r\n });\r\n } else if(processing) {\r\n callback();\r\n } else {\r\n fastRafConventionalCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet rafPromise: Promise;\r\nexport function fastRafPromise() {\r\n if(rafPromise) return rafPromise;\r\n\r\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function 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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Theme} from '../config/state';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport {hslaStringToHex} from './color';\n\nexport class ThemeController {\n private themeColor: string;\n private _themeColorElem: Element;\n private systemTheme: Theme['name'];\n\n constructor() {\n rootScope.addEventListener('theme_change', () => {\n this.setTheme();\n });\n\n // rootScope.addEventListener('settings_updated', ())\n }\n\n private get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n // const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n // const newTheme = this.getTheme();\n\n if(rootScope.myId) {\n rootScope.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = themeController.getTheme();\n if(theme.background.highlightningColor) {\n hsla = theme.background.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n themeController.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n\n this.applyHighlightningColor();\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = rootScope.settings.theme === 'system' ? this.systemTheme : rootScope.settings.theme) {\n return rootScope.settings.themes.find((t) => t.name === name);\n }\n}\n\nconst themeController = new ThemeController();\nexport default themeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setWorkerProxy() {\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n let url = args[0] + '';\n if(url.indexOf('blob:') !== 0) {\n url += location.search;\n }\n\n return new target(url);\n }\n };\n\n [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean).forEach((w) => {\n window[w.name as any] = new Proxy(w, workerHandler);\n });\n}\n\nsetWorkerProxy();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport cancelEvent from './helpers/dom/cancelEvent';\nimport {IS_STICKY_INPUT_BUGGED} from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport {IS_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport pause from './helpers/schedulers/pause';\nimport setWorkerProxy from './helpers/setWorkerProxy';\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\nimport rootScope from './lib/rootScope';\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\nimport apiManagerProxy from './lib/mtproto/mtprotoworker';\nimport getProxiedManagers from './lib/appManagers/getProxiedManagers';\nimport themeController from './helpers/themeController';\nimport overlayCounter from './helpers/overlayCounter';\nimport singleInstance from './lib/mtproto/singleInstance';\nimport parseUriParams from './helpers/string/parseUriParams';\nimport Modes from './config/modes';\nimport {AuthState} from './types';\n// import appNavigationController from './components/appNavigationController';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\n\n // polyfill for replaceChildren\n if((Node as any).prototype.replaceChildren === undefined) {\n (Node as any).prototype.replaceChildren = function(...nodes: any[]) {\n this.textContent = '';\n // while(this.lastChild) {\n // this.removeChild(this.lastChild);\n // }\n if(nodes) {\n this.append(...nodes);\n }\n }\n }\n\n rootScope.managers = getProxiedManagers();\n\n const manifest = document.getElementById('manifest') as HTMLLinkElement;\n manifest.href = `site${IS_APPLE && !IS_APPLE_MOBILE ? '_apple' : ''}.webmanifest?v=jw3mK7G9Aq`;\n\n singleInstance.start();\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n const vh = (setViewportVH && !overlayCounter.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n // const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n // console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n setWorkerProxy;\n\n // const [_, touchSupport, userAgent, _rootScope, _appStateManager, _I18n, __/* , ___ */] = await Promise.all([\n // import('./lib/polyfill'),\n // import('./environment/touchSupport'),\n // import('./environment/userAgent'),\n // import('./lib/rootScope'),\n // import('./lib/appManagers/appStateManager'),\n // import('./lib/langPack'),\n // import('./helpers/peerIdPolyfill'),\n // // import('./helpers/cacheFunctionPolyfill')\n // ]);\n\n /* const {IS_TOUCH_SUPPORTED} = touchSupport;\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\n const rootScope = _rootScope.default;\n const appStateManager = _appStateManager.default;\n const I18n = _I18n.default; */\n\n window.addEventListener('resize', setVH);\n setVH();\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !overlayCounter.isOverlayActive;\n setVH();\n\n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n\n let tabId: number;\n (window as any).onImTabChange = (id: number) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n };\n\n overlayCounter.addEventListener('change', () => {\n toggleResizeMode();\n });\n }\n\n if(IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n if(IS_EMOJI_SUPPORTED) {\n document.documentElement.classList.add('native-emoji');\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === 'IMG') {\n e.preventDefault();\n return false;\n }\n });\n\n // restrict contextmenu on images (e.g. webp stickers)\n document.addEventListener('contextmenu', (e) => {\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\n cancelEvent(e);\n }\n });\n\n if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\n }\n\n if(IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(IS_APPLE) {\n if(IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n\n // document.documentElement.classList.add('emoji-supported');\n\n if(IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n const perf = performance.now();\n\n // await pause(1000000);\n\n const langPromise = I18n.getCacheLangPack();\n\n const [stateResult, langPack] = await Promise.all([\n // loadState(),\n apiManagerProxy.sendState().then(([stateResult]) => stateResult),\n langPromise\n ]);\n I18n.setTimeFormat(stateResult.state.settings.timeFormat);\n\n rootScope.managers.rootScope.getPremium().then((isPremium) => {\n rootScope.premium = isPremium;\n });\n\n themeController.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n let authState = stateResult.state.authState;\n\n const hash = location.hash;\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n if(params.tgWebAuthToken && authState._ !== 'authStateSignedIn') {\n const data: AuthState.signImport['data'] = {\n token: params.tgWebAuthToken,\n dcId: +params.tgWebAuthDcId,\n userId: params.tgWebAuthUserId.toUserId(),\n isTest: params.tgWebAuthTest !== undefined && !!+params.tgWebAuthTest,\n tgAddr: params.tgaddr\n };\n\n if(data.isTest !== Modes.test) {\n const urlSearchParams = new URLSearchParams(location.search);\n if(+params.tgWebAuthTest) {\n urlSearchParams.set('test', '1');\n } else {\n urlSearchParams.delete('test');\n }\n\n location.search = urlSearchParams.toString();\n return;\n }\n\n rootScope.managers.appStateManager.pushToState('authState', authState = {_: 'authStateSignImport', data});\n\n // appNavigationController.overrideHash('?tgaddr=' + encodeURIComponent(params.tgaddr));\n }\n\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 case 'authStateSignImport':\n pagePromise = (await import('./pages/pageSignImport')).default.mount(authState.data);\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\": \"\",\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\": \"\",\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n }\n});\n","export default function toggleAttributePolyfill() {\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n\n if(this.hasAttribute(name)) {\n if(force) return true;\n\n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n\n this.setAttribute(name, '');\n return true;\n };\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport class AppRuntimeManager {\r\n public reload() {\r\n try {\r\n location.reload();\r\n } catch(e) {};\r\n\r\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\r\n // chrome.runtime.reload();\r\n // }\r\n }\r\n\r\n public close() {\r\n try {\r\n window.close();\r\n } catch(e) {}\r\n }\r\n\r\n /**\r\n * Better to call from event\r\n */\r\n public focus() {\r\n // // @ts-ignore\r\n // if(window.navigator.mozApps && document.hidden) {\r\n // // Get app instance and launch it to bring app to foreground\r\n // // @ts-ignore\r\n // window.navigator.mozApps.getSelf().onsuccess = function() {\r\n // this.result.launch();\r\n // };\r\n // } else {\r\n // // @ts-ignore\r\n // if(window.chrome && chrome.app && chrome.app.window) {\r\n // // @ts-ignore\r\n // chrome.app.window.current().focus();\r\n // }\r\n\r\n window.focus();\r\n // }\r\n }\r\n}\r\n\r\nconst appRuntimeManager = new AppRuntimeManager();\r\nexport default appRuntimeManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type createManagers from './createManagers';\nimport {ModifyFunctionsToAsync} from '../../types';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport noop from '../../helpers/noop';\nimport dT from '../../helpers/dT';\nimport DEBUG from '../../config/debug';\n\n// let stats: {\n// [manager: string]: {\n// [method: string]: {\n// times: number[],\n// byArgs: {\n// [args: string]: number[]\n// }\n// }\n// }\n// } = {};\n\n// let sentCount = 0;\n// let sentMethods: {[key: string]: number} = {};\n// let sentMethods2: {[key: string]: number} = {};\n// function collectStats(manager: string, method: string, args: any[], promise: Promise) {\n// ++sentCount;\n\n// const key = [manager, method].join('-');\n// if(!sentMethods[key]) sentMethods[key] = 0;\n// ++sentMethods[key];\n\n// const key2 = [('00000' + sentCount).slice(-5), key].join('-');\n\n// let byManager = stats[manager] ??= {};\n// let byMethod = byManager[method] ??= {times: [], byArgs: {}};\n\n// const perf = performance.now();\n// promise.catch(noop).finally(() => {\n// const time = performance.now() - perf;\n// byMethod.times.push(time);\n\n// sentMethods2[key2] = time;\n\n// try {\n// const argsString = JSON.stringify(args);\n// byMethod.byArgs[argsString].push(time);\n// } catch(err) {}\n// });\n// }\n\n// setInterval(() => {\n// // console.log(dT(), '[PROXY] stats', stats, sentCount, sentMethods, sentMethods2);\n// sentCount = 0;\n// sentMethods = {};\n// sentMethods2 = {};\n// }, 2000);\n\nconst DEBUG_MANAGER_REQUESTS: {[managerName: string]: Set} = {};\nif(DEBUG) {\n (window as any).DEBUG_MANAGER_REQUESTS = DEBUG_MANAGER_REQUESTS;\n}\n\nfunction createProxy(/* source: T, */name: string, ack?: boolean) {\n const proxy = new Proxy({}, {\n get: (target, p, receiver) => {\n // console.log('get', target, p, receiver);\n // @ts-ignore\n // const value = source[p];\n // if(typeof(value) !== 'function') {\n // return value;\n // }\n\n return (...args: any[]) => {\n const promise = apiManagerProxy.invoke('manager', {\n name,\n method: p as string,\n args\n }, ack as any);\n\n if(DEBUG) {\n if(DEBUG_MANAGER_REQUESTS[name]?.has(p as any)) {\n console.warn('manager request', name, p, args);\n }\n }\n\n // collectStats(name, p as string, args, promise);\n\n return promise;\n\n // @ts-ignore\n // return Promise.resolve(value.call(source, ...args));\n };\n }\n });\n\n return proxy;\n}\n\ntype AA = {\n [key in keyof T]: T[key] extends (...args: infer A) => infer R ? (...args: A) => Promise>> : never\n};\n\ntype T = Awaited>;\ntype ProxiedManagers = {\n [name in keyof T]?: ModifyFunctionsToAsync;\n} & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n};\n\nfunction createProxyProxy(proxied: any, ack?: boolean) {\n return new Proxy(proxied, {\n get: (target, p, receiver) => {\n // @ts-ignore\n return target[p] ??= createProxy(p as string, ack);\n }\n });\n}\n\nlet proxied: ProxiedManagers;\nexport default function getProxiedManagers() {\n if(proxied) {\n return proxied;\n }\n\n proxied = createProxyProxy({}, false);\n proxied.acknowledged = createProxyProxy({}, true);\n return proxied;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Database} from '../../config/databases';\r\nimport Modes from '../../config/modes';\r\nimport makeError from '../../helpers/makeError';\r\nimport safeAssign from '../../helpers/object/safeAssign';\r\nimport {logger} from '../logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string,\r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n\r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n\r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n\r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n\r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n\r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n\r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n // return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n\r\n reader.onerror = reject;\r\n });\r\n\r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n\r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n // return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode,\r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\r\n log?: string,\r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n\r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n\r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n '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 export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\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\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\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 }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\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 const 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 return 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 const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDialogFilter} from '../storages/filters';\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\nexport type REAL_FOLDER_ID = 0 | 1;\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\r\nexport const THUMB_TYPE_FULL = '';\r\n\r\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\r\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\r\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\r\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\r\n","import IS_CALL_SUPPORTED from './callSupport';\nimport CAN_USE_TRANSFERABLES from './canUseTransferables';\nimport IS_CANVAS_FILTER_SUPPORTED from './canvasFilterSupport';\nimport IS_EMOJI_SUPPORTED from './emojiSupport';\nimport IS_GEOLOCATION_SUPPORTED from './geolocationSupport';\nimport IS_GROUP_CALL_SUPPORTED from './groupCallSupport';\nimport IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport MEDIA_MIME_TYPES_SUPPORTED from './mediaMimeTypesSupport';\nimport IS_MOV_SUPPORTED from './movSupport';\nimport IS_PARALLAX_SUPPORTED from './parallaxSupport';\nimport IS_SCREEN_SHARING_SUPPORTED from './screenSharingSupport';\nimport IS_TOUCH_SUPPORTED from './touchSupport';\nimport IS_VIBRATE_SUPPORTED from './vibrateSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\nimport IS_WEBM_SUPPORTED from './webmSupport';\nimport IS_WEBP_SUPPORTED from './webpSupport';\nimport IS_WEBRTC_SUPPORTED from './webrtcSupport';\nimport * as userAgent from './userAgent';\nimport IS_OPUS_SUPPORTED from './opusSupport';\nimport IS_SHARED_WORKER_SUPPORTED from './sharedWorkerSupport';\nimport IS_APPLE_MX from './appleMx';\n\nconst ENVIRONMENT = {\n CAN_USE_TRANSFERABLES,\n IS_APPLE_MX,\n IS_CALL_SUPPORTED,\n IS_CANVAS_FILTER_SUPPORTED,\n IS_EMOJI_SUPPORTED,\n IS_GEOLOCATION_SUPPORTED,\n IS_GROUP_CALL_SUPPORTED,\n IS_MOV_SUPPORTED,\n IS_PARALLAX_SUPPORTED,\n IS_SCREEN_SHARING_SUPPORTED,\n IS_TOUCH_SUPPORTED,\n IS_VIBRATE_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_SHARED_WORKER_SUPPORTED,\n IS_WEBM_SUPPORTED,\n IS_WEBP_SUPPORTED,\n IS_WEBRTC_SUPPORTED,\n IMAGE_MIME_TYPES_SUPPORTED,\n MEDIA_MIME_TYPES_SUPPORTED,\n VIDEO_MIME_TYPES_SUPPORTED,\n ...userAgent\n};\n\nexport default ENVIRONMENT;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../../config/app';\nimport DEBUG from '../../../../config/debug';\nimport {AutoDownloadPeerTypeSettings, State, STATE_INIT} from '../../../../config/state';\nimport compareVersion from '../../../../helpers/compareVersion';\nimport copy from '../../../../helpers/object/copy';\nimport validateInitObject from '../../../../helpers/object/validateInitObject';\nimport {UserAuth} from '../../../mtproto/mtproto_config';\nimport rootScope from '../../../rootScope';\nimport stateStorage from '../../../stateStorage';\nimport sessionStorage from '../../../sessionStorage';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\n// import RESET_STORAGES_PROMISE from \"../storages/resetStoragesPromise\";\nimport {StoragesResults} from '../storages/loadStorages';\nimport {logger} from '../../../logger';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n// const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\n\nconst STATE_VERSION = STATE_INIT.version;\nconst BUILD = STATE_INIT.build;\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS: Array = [\n 'contactsListCachedTime',\n 'stateCreatedTime',\n 'maxSeenMsgId',\n 'filtersArr'\n];\n\n// const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nasync function loadStateInner() {\n const log = logger('STATE-LOADER');\n\n const totalPerf = performance.now();\n const recordPromise = recordPromiseBound(log);\n\n const promises = ALL_KEYS.map((key) => recordPromise(stateStorage.get(key), 'state ' + key))\n .concat(\n recordPromise(sessionStorage.get('user_auth'), 'auth'),\n recordPromise(sessionStorage.get('state_id'), 'auth'),\n recordPromise(sessionStorage.get('k_build'), 'auth')\n )\n .concat(recordPromise(stateStorage.get('user_auth'), 'old auth')); // support old webk format\n\n const arr = await Promise.all(promises);\n log.warn('promises', performance.now() - totalPerf);\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n\n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n\n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n // const pushed: {key: keyof State, value: State[keyof State]}[] = [];\n const pushedKeys: (keyof State)[] = [];\n const pushToState = (key: T, value: State[T]) => {\n // appStateManager.pushToState(key, value);\n state[key] = value;\n // pushed.push({key, value});\n pushedKeys.push(key);\n };\n\n const replaceState = (_state: State) => {\n // pushed.length = 0;\n pushedKeys.length = 0;\n state = _state;\n pushedKeys.push(...Object.keys(state) as any as typeof pushedKeys);\n // state = appStateManager.setState(_state);\n // appStateManager.storage.set(state);\n };\n\n // let state: State = appStateManager.setState({} as any);\n let state: State = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const sessionBuild = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map((key) => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n const obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n\n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ?\n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} :\n auth); // * support old version\n }\n\n const resetStorages: Set = new Set();\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n\n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n\n state = copy(STATE_INIT);\n\n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n const r: {[k in keyof StoragesResults]: number} = {\n chats: 1,\n dialogs: 1,\n users: 1\n };\n for(const key in r) {\n resetStorages.add(key as keyof StoragesResults);\n // this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n replaceState(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach((key) => {\n pushToState(key, copy(STATE_INIT[key]));\n\n // const s = appStateManager.storagesResults[key as keyof AppStateManager['storagesResults']];\n // if(s?.length) {\n // appStateManager.resetStorages.add(key as keyof AppStateManager['storagesResults']);\n // s.length = 0;\n // }\n });\n };\n\n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n\n // state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find((t) => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n pushToState('settings', state.settings);\n }\n }\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const,\n 'private' as const,\n 'groups' as const,\n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n });\n\n let newVersion: string, oldVersion: string;\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(/* compareVersion(state.version, '0.8.7') === -1 || state.build < 179 || */state.build < 217) {\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n state.pinnedOrders = copy(STATE_INIT.pinnedOrders);\n state.filtersArr = copy(STATE_INIT.filtersArr);\n\n resetStorages.add('dialogs');\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' &&\n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' &&\n theme.background.type === 'image'\n ) || (\n theme.name === 'night' &&\n theme.background.color === '#0f0f0f' &&\n theme.background.type === 'color'\n )) {\n const newTheme = STATE_INIT.settings.themes.find((newTheme) => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n pushToState('settings', state.settings);\n }\n }\n\n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n newVersion = STATE_VERSION;\n oldVersion = state.version;\n }\n\n pushToState('version', STATE_VERSION);\n pushToState('build', BUILD);\n }\n\n if(sessionBuild !== BUILD && (!sessionBuild || sessionBuild < BUILD)) {\n sessionStorage.set({k_build: BUILD});\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n log('state res', state, copy(state));\n }\n\n // return resolve();\n\n log.warn('total', performance.now() - totalPerf);\n\n // RESET_STORAGES_PROMISE.resolve(appStateManager.resetStorages);\n\n return {state, resetStorages, newVersion, oldVersion, pushedKeys};\n}\n\nlet promise: ReturnType;\nexport default function loadState() {\n return promise ??= loadStateInner();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Awaited} from '../../types';\nimport type {CacheStorageDbName} from '../files/cacheStorage';\nimport type {State} from '../../config/state';\nimport type {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport {CryptoMethods} from '../crypto/crypto_methods';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport pause from '../../helpers/schedulers/pause';\nimport ENVIRONMENT from '../../environment';\nimport loadState from '../appManagers/utils/state/loadState';\nimport opusDecodeController from '../opusDecodeController';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport SuperMessagePort from './superMessagePort';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport idleController from '../../helpers/idleController';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport App from '../../config/app';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\n\nexport type Mirrors = {\n state: State\n};\n\nexport type MirrorTaskPayload = {\n name: T,\n key?: K,\n value: any\n};\n\nexport type NotificationBuildTaskPayload = {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n};\n\nexport type TabState = {\n chatPeerIds: PeerId[],\n idleStartTime: number,\n};\n\nclass ApiManagerProxy extends MTProtoMessagePort {\n // private worker: /* Window */Worker;\n // private sockets: Map = new Map();\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n public serviceMessagePort: ServiceMessagePort;\n private lastServiceWorker: ServiceWorker;\n\n private pingServiceWorkerPromise: CancellablePromise;\n\n constructor() {\n super();\n\n this.mirrors = {} as any;\n this.tabState = {\n chatPeerIds: [],\n idleStartTime: 0\n };\n\n this.log('constructor');\n\n \n this.registerWorker();\n \n\n this.registerServiceWorker();\n this.registerCryptoWorker();\n\n // const perf = performance.now();\n this.addMultipleEventsListeners({\n convertWebp: ({fileName, bytes}) => {\n return webpWorkerController.convert(fileName, bytes);\n },\n\n convertOpus: ({fileName, bytes}) => {\n return opusDecodeController.pushDecodeTask(bytes, false).then((result) => result.bytes);\n },\n\n event: ({name, args}) => {\n // @ts-ignore\n rootScope.dispatchEventSingle(name, ...args);\n },\n\n localStorageProxy: (payload) => {\n const storageTask = payload;\n return (sessionStorage[storageTask.type] as any)(...storageTask.args);\n },\n\n mirror: this.onMirrorTask\n\n // hello: () => {\n // this.log.error('time hello', performance.now() - perf);\n // }\n });\n\n // this.addTaskListener('socketProxy', (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n // //console.log('socketProxy', socketTask, id);\n\n // if(socketTask.type === 'send') {\n // const socket = this.sockets.get(id);\n // socket.send(socketTask.payload);\n // } else if(socketTask.type === 'close') { // will remove from map in onClose\n // const socket = this.sockets.get(id);\n // socket.close();\n // } else if(socketTask.type === 'setup') {\n // const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n\n // const onOpen = () => {\n // //console.log('socketProxy onOpen');\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'open',\n // id\n // }\n // });\n // };\n // const onClose = () => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'close',\n // id\n // }\n // });\n\n // socket.removeEventListener('open', onOpen);\n // socket.removeEventListener('close', onClose);\n // socket.removeEventListener('message', onMessage);\n // this.sockets.delete(id);\n // };\n // const onMessage = (buffer: ArrayBuffer) => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'message',\n // id,\n // payload: buffer\n // }\n // });\n // };\n\n // socket.addEventListener('open', onOpen);\n // socket.addEventListener('close', onClose);\n // socket.addEventListener('message', onMessage);\n // this.sockets.set(id, socket);\n // }\n // });\n\n rootScope.addEventListener('language_change', (language) => {\n rootScope.managers.networkerFactory.setLanguage(language);\n });\n\n window.addEventListener('online', () => {\n rootScope.managers.networkerFactory.forceReconnectTimeout();\n });\n\n rootScope.addEventListener('logging_out', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n toggleStorages(false, true),\n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map((cacheName) => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n idleController.addEventListener('change', (idle) => {\n this.updateTabStateIdle(idle);\n });\n this.updateTabStateIdle(idleController.isIdle);\n\n this.log('Passing environment:', ENVIRONMENT);\n this.invoke('environment', ENVIRONMENT);\n // this.sendState();\n }\n\n public pingServiceWorkerWithIframe() {\n if(this.pingServiceWorkerPromise) {\n return this.pingServiceWorkerPromise;\n }\n\n const promise = this.pingServiceWorkerPromise = deferredPromise();\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n const onLoad = () => {\n setTimeout(() => { // ping once in 10 seconds\n this.pingServiceWorkerPromise = undefined;\n }, 10e3);\n\n clearTimeout(timeout);\n iframe.remove();\n iframe.removeEventListener('load', onLoad);\n iframe.removeEventListener('error', onLoad);\n promise.resolve();\n };\n iframe.addEventListener('load', onLoad);\n iframe.addEventListener('error', onLoad);\n iframe.src = 'ping/' + (Math.random() * 0xFFFFFFFF | 0);\n document.body.append(iframe);\n\n const timeout = window.setTimeout(onLoad, 1e3);\n return promise;\n }\n\n private attachServiceWorker(serviceWorker: ServiceWorker) {\n this.lastServiceWorker && this.serviceMessagePort.detachPort(this.lastServiceWorker);\n this.serviceMessagePort.attachSendPort(this.lastServiceWorker = serviceWorker);\n this.serviceMessagePort.invokeVoid('hello', undefined);\n }\n\n private _registerServiceWorker() {\n navigator.serviceWorker.register(\n /* webpackChunkName: \"sw\" */\n new URL('../serviceWorker/index.service', import.meta.url),\n {scope: './'}\n ).then((registration) => {\n this.log('SW registered', registration);\n\n // ! doubtful fix for hard refresh\n if(registration.active && !navigator.serviceWorker.controller) {\n return registration.unregister().then(() => {\n window.location.reload();\n });\n }\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n const controller = navigator.serviceWorker.controller || registration.installing || registration.waiting || registration.active;\n this.attachServiceWorker(controller);\n\n \n \n \n }, (err) => {\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n\n this.serviceMessagePort = new ServiceMessagePort();\n\n // this.addMultipleEventsListeners({\n // hello: () => {\n // // this.serviceMessagePort.invokeVoid('port', undefined);\n // }\n // });\n\n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWorker will do it.\n const worker = navigator.serviceWorker;\n this._registerServiceWorker();\n\n // worker.startMessages();\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n const controller = worker.controller;\n this.attachServiceWorker(controller);\n\n controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n this.serviceMessagePort.attachListenPort(worker);\n this.serviceMessagePort.addMultipleEventsListeners({\n port: (payload, source, event) => {\n this.invokeVoid('serviceWorkerPort', undefined, undefined, [event.ports[0]]);\n },\n\n hello: (payload, source) => {\n this.serviceMessagePort.resendLockTask(source);\n }\n });\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private async registerCryptoWorker() {\n const get = (url: string) => {\n return fetch(url).then((response) => response.text()).then((text) => {\n const pathnameSplitted = location.pathname.split('/');\n pathnameSplitted[pathnameSplitted.length - 1] = '';\n const pre = location.origin + pathnameSplitted.join('/');\n text = `\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${pre}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${text}`;\n const blob = new Blob([text], {type: 'application/javascript'});\n return blob;\n });\n };\n\n const workerHandler = {\n construct(target: any, args: any): any {\n const url = args[0] + location.search;\n return {url};\n }\n };\n\n const originals = [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean);\n originals.forEach((w) => window[w.name as any] = new Proxy(w, workerHandler));\n\n const worker: SharedWorker | Worker = new Worker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n\n originals.forEach((w) => window[w.name as any] = w as any);\n\n const originalUrl = (worker as any).url;\n\n const createWorker = (url: string) => new constructor(url, {type: 'module'});\n const attachWorkerToPort = (worker: SharedWorker | Worker) => this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n const constructor = IS_SHARED_WORKER_SUPPORTED ? SharedWorker : Worker;\n\n // let cryptoWorkers = workers.length;\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n // .then((attached) => {\n // if(!attached && cryptoWorkers-- > 1) {\n // this.log.error('terminating unneeded crypto worker');\n\n // cryptoMessagePort.invokeVoid('terminate', undefined, source);\n // const worker = workers.find((worker) => (worker as SharedWorker).port === source || (worker as any) === source);\n // if((worker as SharedWorker).port) (worker as SharedWorker).port.close();\n // else (worker as Worker).terminate();\n // cryptoMessagePort.detachPort(source);\n // }\n // });\n });\n\n const firstWorker = createWorker(originalUrl);\n attachWorkerToPort(firstWorker);\n\n const blob = await get(originalUrl);\n const urlsPromise = await this.invoke('createProxyWorkerURLs', {originalUrl, blob});\n const workers = urlsPromise.slice(1).map(createWorker);\n workers.forEach(attachWorkerToPort);\n }\n\n \n private registerWorker() {\n // return;\n\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n }\n\n this.onWorkerFirstMessage(worker);\n }\n \n\n private attachWorkerToPort(worker: SharedWorker | Worker, messagePort: SuperMessagePort, type: string) {\n const port: MessagePort = (worker as SharedWorker).port || worker as any;\n messagePort.attachPort(port);\n\n worker.addEventListener('error', (err) => {\n this.log.error(type, 'worker error', err);\n });\n }\n\n private onWorkerFirstMessage(worker: any) {\n this.log('set webWorker');\n\n // this.worker = worker;\n \n \n \n this.attachWorkerToPort(worker, this, 'mtproto');\n \n }\n\n private loadState() {\n return Promise.all([\n loadState().then((stateResult) => {\n this.newVersion = stateResult.newVersion;\n this.oldVersion = stateResult.oldVersion;\n this.mirrors['state'] = stateResult.state;\n return stateResult;\n })\n // loadStorages(createStorages()),\n ]);\n }\n\n public sendState() {\n return this.loadState().then((result) => {\n const [stateResult] = result;\n this.invoke('state', {...stateResult, userId: rootScope.myId.toUserId()});\n return result;\n });\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return cryptoMessagePort.invokeCrypto(method, ...args);\n }\n \n\n public async toggleStorages(enabled: boolean, clearWrite: boolean) {\n await toggleStorages(enabled, clearWrite);\n this.invoke('toggleStorages', {enabled, clearWrite});\n this.serviceMessagePort.invokeVoid('toggleStorages', {enabled, clearWrite});\n }\n\n public async getMirror(name: T) {\n const mirror = this.mirrors[name];\n return mirror;\n }\n\n public getState() {\n return this.getMirror('state');\n }\n\n public updateTabState(key: T, value: TabState[T]) {\n this.tabState[key] = value;\n this.invokeVoid('tabState', this.tabState);\n }\n\n public updateTabStateIdle(idle: boolean) {\n this.updateTabState('idleStartTime', idle ? Date.now() : 0);\n }\n\n private onMirrorTask = (payload: MirrorTaskPayload) => {\n const {name, key, value} = payload;\n if(!payload.hasOwnProperty('key')) {\n this.mirrors[name] = value;\n return;\n }\n\n const mirror = this.mirrors[name] ??= {} as any;\n if(value === undefined) {\n delete mirror[key];\n } else {\n mirror[key] = value;\n }\n };\n}\n\ninterface ApiManagerProxy extends MTProtoMessagePort {}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport tabId from '../../config/tabId';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport idleController from '../../helpers/idleController';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport apiManagerProxy from './mtprotoworker';\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nexport type InstanceDeactivateReason = 'version' | 'tabs';\n\nconst CHECK_INSTANCE_INTERVAL = 5000;\nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\nconst IS_MULTIPLE_TABS_SUPPORTED = IS_SHARED_WORKER_SUPPORTED;\n\nexport class SingleInstance extends EventListenerBase<{\n activated: () => void,\n deactivated: (reason: InstanceDeactivateReason) => void\n}> {\n private instanceId: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: InstanceDeactivateReason;\n private log = logger('INSTANCE');\n\n constructor() {\n super(false);\n\n this.log = logger('INSTANCE');\n this.instanceId = tabId;\n }\n\n public get deactivatedReason() {\n return this.deactivated;\n }\n\n public start() {\n this.reset();\n\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n idleController.addEventListener('change', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n private reset() {\n this.masterInstance = false;\n this.clearDeactivateTimeout();\n this.deactivated = undefined;\n }\n\n private clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n this.dispatchEvent('activated');\n }\n }\n\n private deactivateInstance(reason: InstanceDeactivateReason) {\n if(this.masterInstance || this.deactivated) {\n return;\n }\n\n this.log.warn('deactivate', reason);\n this.clearDeactivateTimeout();\n this.deactivated = reason;\n\n this.dispatchEvent('deactivated', reason);\n }\n\n private clearDeactivateTimeout() {\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n }\n\n private checkInstance = async(idle = idleController.isIdle) => {\n if(this.deactivated) {\n return;\n }\n\n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceId,\n idle,\n time\n };\n\n const [curInstance, build = App.build] = await Promise.all([\n sessionStorage.get('xt_instance', false),\n sessionStorage.get('k_build', false)\n ]);\n\n if(build > App.build) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.deactivateInstance('version');\n apiManagerProxy.toggleStorages(false, false);\n return;\n } else if(IS_MULTIPLE_TABS_SUPPORTED) {\n sessionStorage.set({xt_instance: newInstance});\n return;\n }\n\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceId ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n this.masterInstance = true;\n rootScope.managers.networkerFactory.startAll();\n this.log.warn('now master instance', newInstance);\n }\n\n this.clearDeactivateTimeout();\n } else if(this.masterInstance) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.log.warn('now idle instance', newInstance);\n this.deactivateTimeout ||= window.setTimeout(() => this.deactivateInstance('tabs'), DEACTIVATE_TIMEOUT);\n }\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from '../../config/app';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport Modes from '../../config/modes';\r\nimport loadScript from '../../helpers/dom/loadScript';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(\r\n canRedirect &&\r\n curValue?.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts\r\n ) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect,\r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map((url) => {\r\n return loadScript(url).then((script) => {\r\n script.remove();\r\n });\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","/*\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 loadScript(url: string) {\n const script = document.createElement('script');\n const promise = new Promise((resolve) => {\n script.onload = script.onerror = () => {\n resolve(script);\n };\n });\n script.src = url;\n document.body.appendChild(script);\n return promise;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * 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 {PushNotificationObject} from '../serviceWorker/push';\r\nimport type {ServicePushPingTaskPayload} from '../serviceWorker/serviceMessagePort';\r\nimport type {NotificationSettings} from '../appManagers/uiNotificationsManager';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport {logger} from '../logger';\r\nimport apiManagerProxy from './mtprotoworker';\r\nimport I18n, {LangPackKey} from '../langPack';\r\nimport {IS_MOBILE} from '../../environment/userAgent';\r\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\r\nimport copy from '../../helpers/object/copy';\r\nimport singleInstance from './singleInstance';\r\nimport EventListenerBase from '../../helpers/eventListenerBase';\r\n\r\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\r\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\r\n\r\nexport type PushSubscriptionNotify = {\r\n tokenType: number,\r\n tokenValue: string\r\n};\r\n\r\nexport class WebPushApiManager extends EventListenerBase<{\r\n push_notification_click: (n: PushNotificationObject) => void,\r\n push_init: (n: PushSubscriptionNotify) => void,\r\n push_subscribe: (n: PushSubscriptionNotify) => void,\r\n push_unsubscribe: (n: PushSubscriptionNotify) => void\r\n}> {\r\n public isAvailable = true;\r\n private isPushEnabled = false;\r\n private localNotificationsAvailable = true;\r\n private started = false;\r\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\r\n private isAliveTO: any;\r\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n private userVisibleOnly = this.isFirefox ? false : true;\r\n private log = logger('PM');\r\n\r\n constructor() {\r\n super(false);\r\n\r\n if(!('PushManager' in window) ||\r\n !('Notification' in window) ||\r\n !('serviceWorker' in navigator)) {\r\n this.log.warn('Push messaging is not supported.');\r\n this.isAvailable = false;\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n if(this.isAvailable && Notification.permission === 'denied') {\r\n this.log.warn('The user has blocked notifications.');\r\n }\r\n }\r\n\r\n public start() {\r\n if(!this.started) {\r\n this.started = true;\r\n this.getSubscription();\r\n this.setUpServiceWorkerChannel();\r\n }\r\n }\r\n\r\n public setLocalNotificationsDisabled() {\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n public getSubscription() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = !!subscription;\r\n this.pushSubscriptionNotify('init', subscription);\r\n }).catch((err) => {\r\n this.log.error('Error during getSubscription()', err);\r\n });\r\n });\r\n }\r\n\r\n public subscribe = () => {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\r\n // The subscription was successful\r\n this.isPushEnabled = true;\r\n this.pushSubscriptionNotify('subscribe', subscription);\r\n }).catch((e) => {\r\n if(Notification.permission === 'denied') {\r\n this.log('Permission for Notifications was denied');\r\n } else {\r\n this.log('Unable to subscribe to push.', e);\r\n if(!this.userVisibleOnly) {\r\n this.userVisibleOnly = true;\r\n setTimeout(this.subscribe, 0);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public unsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = false;\r\n\r\n if(subscription) {\r\n this.pushSubscriptionNotify('unsubscribe', subscription);\r\n\r\n setTimeout(() => {\r\n subscription.unsubscribe().then((successful) => {\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }, 3000);\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public forceUnsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.log.warn('force unsubscribe', subscription);\r\n if(subscription) {\r\n subscription.unsubscribe().then((successful) => {\r\n this.log.warn('force unsubscribe successful', successful);\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public isAliveNotify = () => {\r\n if(!this.isAvailable || singleInstance.deactivatedReason) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\r\n\r\n const lang: ServicePushPingTaskPayload['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 apiManagerProxy.serviceMessagePort.invokeVoid('pushPing', {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n });\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 apiManagerProxy.serviceMessagePort.invokeVoid('notificationsClear', undefined);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManagerProxy.serviceMessagePort.addEventListener('pushClick', (payload) => {\r\n if(singleInstance.deactivatedReason) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n this.dispatchEvent('push_notification_click', payload);\r\n });\r\n\r\n navigator.serviceWorker.ready.then(this.isAliveNotify);\r\n }\r\n\r\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\r\n if(subscription) {\r\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\r\n if(!subscriptionObj ||\r\n !subscriptionObj.endpoint ||\r\n !subscriptionObj.keys ||\r\n !subscriptionObj.keys.p256dh ||\r\n !subscriptionObj.keys.auth) {\r\n this.log.warn('Invalid push subscription', subscriptionObj);\r\n this.unsubscribe();\r\n this.isAvailable = false;\r\n this.pushSubscriptionNotify(event);\r\n return;\r\n }\r\n\r\n this.log.warn('Push', event, subscriptionObj);\r\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\r\n tokenType: 10,\r\n tokenValue: JSON.stringify(subscriptionObj)\r\n });\r\n } else {\r\n this.log.warn('Push', event, false);\r\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\r\n }\r\n }\r\n}\r\n\r\nconst webPushApiManager = new WebPushApiManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\r\nexport default webPushApiManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport IS_OPUS_SUPPORTED from '../environment/opusSupport';\r\nimport {IS_SAFARI} from '../environment/userAgent';\r\nimport {Modify} from '../types';\r\nimport {logger, LogTypes} from './logger';\r\nimport apiManagerProxy from './mtproto/mtprotoworker';\r\nimport type {ConvertWebPTask} from './webp/webpWorkerController';\r\n\r\ntype Result = {\r\n bytes: Uint8Array,\r\n waveform?: Uint8Array\r\n};\r\n\r\ntype Task = {\r\n pages: Uint8Array,\r\n withWaveform: boolean,\r\n waveform?: Uint8Array,\r\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\r\n timeout: number\r\n};\r\n\r\nexport interface ConvertOpusTask extends Modify {\r\n type: 'convertOpus'\r\n}\r\n\r\nexport class OpusDecodeController {\r\n private worker: Worker;\r\n private wavWorker: Worker;\r\n private sampleRate = 48000;\r\n private tasks: Array = [];\r\n private keepAlive = false;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n return IS_OPUS_SUPPORTED;\r\n }\r\n\r\n public loadWavWorker() {\r\n if(this.wavWorker) return;\r\n\r\n this.wavWorker = new Worker('waveWorker.min.js');\r\n this.wavWorker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[WAV] got message:', data);\r\n if(data && data.page) {\r\n const bytes = data.page;\r\n this.onTaskEnd(this.tasks.shift(), bytes);\r\n }\r\n });\r\n }\r\n\r\n public loadWorker() {\r\n if(this.worker) return;\r\n\r\n this.worker = new Worker('decoderWorker.min.js');\r\n this.worker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[DECODER] got message', data);\r\n if(data.type === 'done') {\r\n // this.log('[DECODER] send done to wav');\r\n this.wavWorker.postMessage({command: 'done'});\r\n\r\n if(data.waveform) {\r\n this.tasks[0].waveform = data.waveform;\r\n }\r\n } else { // e.data contains decoded buffers as float32 values\r\n // this.log('[DECODER] send encode to wav');\r\n this.wavWorker.postMessage({\r\n command: 'encode',\r\n buffers: e.data\r\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\r\n }\r\n });\r\n }\r\n\r\n public setKeepAlive(keepAlive: boolean) {\r\n this.keepAlive = keepAlive;\r\n if(this.keepAlive) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n } else if(!this.tasks.length) {\r\n this.terminateWorkers();\r\n }\r\n }\r\n\r\n public onTaskEnd(task: Task, result?: Uint8Array) {\r\n if(!result) {\r\n task.callback.reject('timeout');\r\n } else {\r\n clearTimeout(task.timeout);\r\n task.callback.resolve({bytes: result, waveform: task.waveform});\r\n }\r\n\r\n if(this.tasks.length) {\r\n this.executeNewTask(this.tasks[0]);\r\n }\r\n\r\n this.terminateWorkers();\r\n }\r\n\r\n public terminateWorkers(kill = false) {\r\n if((this.keepAlive || this.tasks.length) && !kill) return;\r\n\r\n if(this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n\r\n if(this.wavWorker) {\r\n this.wavWorker.terminate();\r\n this.wavWorker = null;\r\n }\r\n }\r\n\r\n public executeNewTask(task: Task) {\r\n this.worker.postMessage({\r\n command: 'init',\r\n decoderSampleRate: this.sampleRate,\r\n outputBufferSampleRate: this.sampleRate\r\n });\r\n\r\n this.wavWorker.postMessage({\r\n command: 'init',\r\n wavBitDepth: 16,\r\n wavSampleRate: this.sampleRate\r\n });\r\n\r\n // console.log('sending command to worker:', task);\r\n // setTimeout(() => {\r\n this.log('[DECODER] send decode');\r\n this.worker.postMessage({\r\n command: 'decode',\r\n pages: task.pages,\r\n waveform: task.withWaveform\r\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\r\n // }, 1e3);\r\n\r\n task.timeout = window.setTimeout(() => {\r\n this.log.error('decode timeout'/* , task */);\r\n\r\n this.terminateWorkers(true);\r\n if(this.tasks.length) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n }\r\n\r\n this.onTaskEnd(this.tasks.shift());\r\n }, 10e3);\r\n }\r\n\r\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\r\n return new Promise((resolve, reject) => {\r\n const task = {\r\n pages,\r\n withWaveform,\r\n callback: {resolve, reject},\r\n timeout: 0\r\n };\r\n\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n\r\n if(this.tasks.push(task) === 1) {\r\n this.executeNewTask(task);\r\n }\r\n });\r\n }\r\n\r\n public async decode(typedArray: Uint8Array, withWaveform = false) {\r\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\r\n const dataBlob = new Blob([result.bytes], {type: 'audio/wav'});\r\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\r\n });\r\n }\r\n}\r\n\r\nconst opusDecodeController = new OpusDecodeController();\r\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\r\nexport default opusDecodeController;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {AppMessagesManager, Dialog, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\nimport {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 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\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': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle', (isPremium) => {\n this.premium = isPremium;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport {WorkerTaskVoidTemplate} from '../../types';\r\n\r\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\r\n type: 'convertWebp',\r\n payload: {\r\n fileName: string,\r\n bytes: Uint8Array\r\n }\r\n};\r\n\r\nexport class WebpWorkerController {\r\n private worker: Worker;\r\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\r\n\r\n private init() {\r\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\r\n this.worker.addEventListener('message', (e) => {\r\n const task = e.data as ConvertWebPTask;\r\n const payload = task.payload;\r\n\r\n const promise = this.convertPromises[payload.fileName];\r\n if(promise) {\r\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\r\n delete this.convertPromises[payload.fileName];\r\n }\r\n });\r\n }\r\n\r\n private postMessage(data: ConvertWebPTask) {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.worker.postMessage(data);\r\n }\r\n\r\n public convert(fileName: string, bytes: Uint8Array) {\r\n if(this.convertPromises.hasOwnProperty(fileName)) {\r\n return this.convertPromises[fileName];\r\n }\r\n\r\n const convertPromise = deferredPromise();\r\n\r\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\r\n\r\n return this.convertPromises[fileName] = convertPromise;\r\n }\r\n}\r\n\r\nconst webpWorkerController = new WebpWorkerController();\r\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\r\nexport default webpWorkerController;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"589\":\"crypto.worker\",\"630\":\"npm.qr-code-styling\",\"670\":\"sw\",\"678\":\"mtproto.worker\"}[chunkId] || chunkId) + \".\" + {\"8\":\"0544e00385e42a07883b\",\"51\":\"015549e15aab2a59d3a0\",\"53\":\"3829958682207da0768c\",\"61\":\"21ea8f96aad63bd2211c\",\"63\":\"f3beda66b31880abf426\",\"77\":\"808c5b447b007ee7aa9d\",\"104\":\"d9383d4cf03fc631a3a9\",\"231\":\"071dbf1017e65586295d\",\"301\":\"a3f22008d452affb1ae4\",\"339\":\"764b22e455094abfa43f\",\"392\":\"eb2cde6a1063177ee3ad\",\"408\":\"03880fedecb1e421da3b\",\"436\":\"a3c8c35b715fcb7c4d9f\",\"442\":\"aee5aa5c25ff95c14b4d\",\"508\":\"648a1c3659fa38d09b83\",\"589\":\"a0cf65ddba162cb08d08\",\"630\":\"5c8af6e9c411419a66e1\",\"641\":\"1fc33fe3e0c4c0c41a9e\",\"642\":\"d6b90b5bc53545046507\",\"670\":\"c12b91543b047629a922\",\"678\":\"b6bdf87282369207cefc\",\"709\":\"03eeac190dc611bf8d97\",\"774\":\"be0952a2ec87ed053042\",\"776\":\"8ab4eee78bc43703a976\",\"781\":\"5b082181115fbfebcf63\",\"783\":\"a5ff7c878494d8a1624d\",\"810\":\"3f514515bc74111bee6d\",\"813\":\"e7782ee52edafa426cd5\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [437,570], () => (__webpack_require__(6873)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","oldGetScript","oldLoadScript","queryMap","countMap","STATE_VERSION","BUILD","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filtersArr","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","recentCustomEmoji","topPeersCache","recentSearch","version","build","authState","_","IS_MOBILE","hiddenPinnedMessages","settings","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","pFlags","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","name","background","blur","slug","color","highlightningColor","intensity","id","theme","notifications","sound","timeFormat","toLocaleString","match","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","IS_APPLE_MX","ctx","document","createElement","getContext","extension","getExtension","renderer","getParameter","UNMASKED_RENDERER_WEBGL","getSupportedExtensions","indexOf","err","CAN_USE_TRANSFERABLES","IS_SAFARI","navigator","userAgent","search","geolocation","getCurrentPosition","IMAGE_MIME_TYPES_SUPPORTED","Set","add","arr","concat","canPlayType","IS_APPLE_MOBILE","replace","IS_FIREFOX","mediaDevices","window","DocumentTouch","USER_AGENT","IS_APPLE","IS_ANDROID","toLowerCase","IS_CHROMIUM","test","vendor","platform","maxTouchPoints","IS_MOBILE_SAFARI","vibrate","VIDEO_MIME_TYPES_SUPPORTED","toDataURL","startsWith","rgbaToHsla","r","g","b","a","max","Math","min","h","s","l","d","hslaToRgba","hue2rgb","p","q","t","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","map","v","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","compareVersion","v1","v2","s1","s2","blurActiveElement","activeElement","cancelEvent","event","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","texts","cache","fonts","text","icons","monospace","loadFonts","types","undefined","Promise","resolve","promises","type","_texts","font","weights","weight","_promises","load","race","all","catch","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","callback","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","parseUriParams","uri","params","item","decodeURIComponent","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","themeColor","isNight","setAttribute","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","addListener","applyHighlightningColor","getTheme","documentElement","setProperty","removeProperty","colorScheme","toggle","workerHandler","construct","args","url","location","Worker","SharedWorker","filter","Boolean","w","Proxy","setWorkerProxy","Element","prototype","toggleAttribute","force","hasAttribute","removeAttribute","Node","replaceChildren","nodes","textContent","append","rootScope","getProxiedManagers","getElementById","href","singleInstance","visualViewport","lastVH","setViewportVH","setVH","vh","overlayCounter","height","innerHeight","toggleResizeMode","tabId","onImTabChange","wasTabId","tagName","appMediaViewer","perf","performance","langPromise","stateResult","langPack","fadeInWhenFontsReady","elem","promise","opacity","state","isPremium","appVersion","lang_code","console","log","hash","tgWebAuthToken","data","token","dcId","tgWebAuthDcId","userId","tgWebAuthUserId","toUserId","isTest","tgWebAuthTest","tgAddr","tgaddr","urlSearchParams","URLSearchParams","set","delete","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","default","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","DEBUG_MANAGER_REQUESTS","createProxyProxy","proxied","ack","get","receiver","method","has","warn","createProxy","acknowledged","IDB","db","storageIsAvailable","openDatabase","INSTANCES","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","createIndex","keyPath","objectParameters","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","result","calledNew","onclose","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","entryName","isArray","getObjectStore","clear","save","idx","put","mode","onError","clearTimeout","timeout","onComplete","results","requests","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","setLangCode","langCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lang","langSign","countries","strings","formatLocalStrings","saveLangPack","from_version","local","loadLangPack","web","requestedServerLanguage","managers","apiManager","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","element","weakMap","update","superFormatter","indexHolder","out","lastIndex","p1","p2","p3","p4","lastIndexOf","wrappedUrl","onclick","DocumentFragment","firstChild","arg","pushNextArgument","plain","str","select","Map","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","keys","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","_Intl","Object","assign","WeakMap","IntlElementBase","options","property","IntlElement","formatted","dataset","compareAndUpdate","json","JSON","stringify","DateTimeFormat","hours","getHours","getMinutes","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","isLast","useLast","joined","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","IS_CALL_SUPPORTED","IS_CANVAS_FILTER_SUPPORTED","IS_EMOJI_SUPPORTED","IS_GEOLOCATION_SUPPORTED","IS_GROUP_CALL_SUPPORTED","IS_MOV_SUPPORTED","IS_PARALLAX_SUPPORTED","IS_SCREEN_SHARING_SUPPORTED","IS_TOUCH_SUPPORTED","IS_VIBRATE_SUPPORTED","IS_OPUS_SUPPORTED","IS_SHARED_WORKER_SUPPORTED","IS_WEBM_SUPPORTED","IS_WEBP_SUPPORTED","IS_WEBRTC_SUPPORTED","MEDIA_MIME_TYPES_SUPPORTED","ALL_KEYS","REFRESH_KEYS","loadStateInner","logger","totalPerf","recordPromise","stateStorage","sessionStorage","pushedKeys","pushToState","copy","splice","auth","shift","sessionBuild","shiftedWebKAuth","values","dcID","toPeerId","obj","resetStorages","chats","dialogs","users","_state","state_id","time","hasOwnProperty","nightTheme","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","validateInitObject","missingKey","migrated","newTheme","k_build","ApiManagerProxy","onMirrorTask","payload","mirrors","mirror","tabState","chatPeerIds","idleStartTime","registerWorker","registerServiceWorker","registerCryptoWorker","addMultipleEventsListeners","convertWebp","fileName","bytes","webpWorkerController","convertOpus","opusDecodeController","localStorageProxy","storageTask","language","toggleStorages","telegramMeWebManager","webPushApiManager","cacheName","caches","appRuntimeManager","idleController","updateTabStateIdle","invoke","pingServiceWorkerWithIframe","pingServiceWorkerPromise","iframe","hidden","onLoad","remove","src","random","body","attachServiceWorker","serviceWorker","lastServiceWorker","serviceMessagePort","detachPort","attachSendPort","invokeVoid","_registerServiceWorker","register","URL","scope","registration","active","controller","unregister","installing","waiting","worker","attachListenPort","port","source","ports","hello","resendLockTask","originals","originalUrl","createWorker","attachWorkerToPort","cryptoMessagePort","blob","fetch","response","pathnameSplitted","pathname","origin","Blob","onWorkerFirstMessage","messagePort","attachPort","loadState","sendState","invokeCrypto","enabled","clearWrite","getMirror","getState","updateTabState","apiManagerProxy","IS_MULTIPLE_TABS_SUPPORTED","SingleInstance","clearInstance","masterInstance","deactivated","checkInstance","newInstance","instanceId","curInstance","deactivateInstance","xt_instance","clearDeactivateTimeout","deactivateTimeout","deactivatedReason","start","reset","started","setInterval","activateInstance","reason","TelegramMeWebManager","disabled","hostname","canRedirect","curValue","ts","tsNow","tgme_sync","path","encodeURIComponent","script","onload","appendChild","loadScript","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","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","setLocalNotificationsDisabled","unsubscribe","successful","setSettings","newSettings","hidePushNotifications","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","sampleRate","tasks","keepAlive","isPlaySupported","loadWavWorker","wavWorker","page","onTaskEnd","loadWorker","postMessage","command","waveform","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","task","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","ALPHA_CHARS_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","RootScope","myId","connectionStatus","premium","status","getConnectionStatus","getPremium","dispatchEventSingle","convertPromises","init","convert","convertPromise","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","n","getter","__esModule","getPrototypeOf","ns","def","current","getOwnPropertyNames","definition","defineProperty","enumerable","f","chunkId","reduce","u","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","onScriptComplete","prev","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","retries","realSrc","cacheBust","baseURI","self","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.2eade49b43eb3f2960e2.css b/public/main.2eade49b43eb3f2960e2.css new file mode 100644 index 00000000..14e3241c --- /dev/null +++ b/public/main.2eade49b43eb3f2960e2.css @@ -0,0 +1,4 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{left:50%;position:absolute!important;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:-moz-plaintext;unicode-bidi:plaintext}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap} +:root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--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:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:"Roboto Mono",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-saved-top:#69bffa;--peer-avatar-saved-bottom:#3d9de0;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#2086ea;--primary-color-rgb:51,144,236;--primary-text-color:#000;--primary-text-color-rgb:0,0,0;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--light-filled-secondary-text-color:#f4f4f4;--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--dark-danger-color:#d22324;--avatar-online-color:#0ac630;--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);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--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-error-color:var(--danger-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-color-rgb:135,116,225;--primary-text-color:#fff;--primary-text-color-rgb:255,255,255;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--light-filled-secondary-text-color:#2c2c2c;--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--dark-danger-color:#ff3031;--avatar-online-color:#0ac630;--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?vqhlcw) format("truetype"),url(assets/fonts/tgico.woff?vqhlcw) format("woff"),url(assets/fonts/tgico.svg?vqhlcw#tgico) format("svg")}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:tgico!important;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add:before{content:""}.tgico-add_reaction:before{content:""}.tgico-addmember_filled:before{content:""}.tgico-adduser:before{content:""}.tgico-admin:before{content:""}.tgico-animals:before{content:""}.tgico-animations:before{content:""}.tgico-archive:before{content:""}.tgico-arrow_down:before{content:""}.tgico-arrow_next:before{content:""}.tgico-attach:before{content:""}.tgico-audio_repeat:before{content:""}.tgico-audio_repeat_single:before{content:""}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-binfilled: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-card:before{content:""}.tgico-card_outline: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-limit_chat:before{content:""}.tgico-limit_chats:before{content:""}.tgico-limit_file:before{content:""}.tgico-limit_folders:before{content:""}.tgico-limit_link:before{content:""}.tgico-limit_pin: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-premium_addone:before{content:""}.tgico-premium_double:before{content:""}.tgico-premium_lock:before{content:""}.tgico-premium_unlock: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-shipping:before{content:""}.tgico-shuffle:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-spoiler:before{content:""}.tgico-sport:before{content:""}.tgico-star:before{content:""}.tgico-stickers:before{content:""}.tgico-stickers_face:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-topics:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera:before{content:""}.tgico-videocamera_crossed_filled:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videochat:before{content:""}.tgico-volume_down:before{content:""}.tgico-volume_mute:before{content:""}.tgico-volume_off:before{content:""}.tgico-volume_up:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""}.tgico-phone_filled:before{content:"";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:" ";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;left:1rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:2}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.input-search{margin-left:1rem}}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);max-height:var(--height)!important;min-height:var(--height)!important;padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:24px;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{height:24px;left:.8125rem;pointer-events:none;width:24px}.input-search>.tgico-close{height:42px;right:0;width:42px;z-index:1}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{max-height:var(--height);padding-right:2.5rem}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);box-shadow:none!important;color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;padding:0!important;position:absolute!important;right:var(--offset);text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:#2086ea;background-color:var(--dark-primary-color)}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;max-width:16.25rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transform:scale(.8)!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:#fff;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0;transform:none!important}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;transform:scaleX(1)!important;visibility:visible}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right{bottom:100%;left:0;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:#000;color:var(--primary-text-color);cursor:pointer!important;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin:0 .3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);pointer-events:all!important;position:relative;text-align:left;text-transform:none;transform:scale(1);white-space:nowrap}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:#000;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);margin-left:calc(var(--add)/-2);margin-right:calc(var(--icon-margin) - var(--add)/2);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));margin-left:var(--margin-left);max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{font-size:.875rem}.btn-menu-item-header,.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{font-weight:500;font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute;right:.5rem}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:calc(100% - .625rem);width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important;margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}.btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-left:var(--other-side-offset);margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-left:var(--menu-offset);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:" ";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#2086ea;background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto;right:15px}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;padding:0 1.5rem 0 .75rem;width:auto}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}@media only screen and (max-width:600px){.btn-transparent:before{margin-right:1.5rem}}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important;position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);padding:0 2rem!important;right:auto;width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:"";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:"";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s ease-in-out forwards;animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{-webkit-animation:none!important;animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;text-align:left;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:" ";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative;text-align:left}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);left:var(--offset-left);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);padding-left:3.375rem;pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative;text-align:left}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{color:inherit;padding-left:3.5rem;position:relative}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:"";display:block;height:var(--size);left:var(--offset-left);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;left:calc(var(--offset-left) + .3125rem);transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:" ";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{--background:unset;-webkit-user-drag:none;background:var(--background)!important}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:"";flex:0 0 auto;font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}.chatlist-chat .row-title .topic-icon{--size:1.375rem;margin-right:.25rem}.chatlist-chat .topic-name .topic-icon{display:inline;line-height:1!important}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}.chatlist-chat.menu-open{--background:var(--light-secondary-text-color)}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.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 .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:#c4c9cc;color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;margin-left:.5rem;padding:1px 0 0}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid #fff;border:2px solid var(--background,var(--surface-color));line-height:23px!important;margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;margin-right:.375rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:" ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);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 .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s 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 .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-right:.125rem;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;padding:0}html.is-mac .chatlist .mention{line-height:1.25rem!important}.chatlist .mention-badge{margin-right:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist .not-visited{--size:.5rem;--padding:0;background-color:#c4c9cc!important;background-color:var(--secondary-color)!important}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:""!important}.chat-input .btn-record-cancel{opacity:0;padding:0;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal)*-1 - .5rem));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:#df3f40;color:var(--danger-color)}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:"";height:.5rem;position:absolute;right:5px;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s ease-in-out forwards!important;animation:hide-icon .4s ease-in-out forwards!important}.chat-input .float{align-self:center;display:none!important;margin:0 .75rem 0 0!important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){.chat-input .float{margin-right:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute;right:var(--padding-horizontal)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important;z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:#2086ea!important;background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:" ";display:inline-block;height:10px;margin:0 9px;width:10px}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper,.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{bottom:0;left:0;position:fixed!important;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{align-items:center;display:flex!important;flex-direction:column;transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{bottom:0;left:0;position:absolute!important;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:" ";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button:before{margin-right:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;margin:0 5px 0 6px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}.rows-wrapper{border-bottom-right-radius:0;transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;right:-8.4px;transform:scaleX(-1);width:11px}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin:0 .625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);left:3.125rem;top:auto;transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0 var(--icon-margin) 0 0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width:600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;margin-left:var(--commands-margin-left);width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);margin-left:var(--send-as-margin-left);width:var(--send-as-size)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;left:calc(var(--padding-horizontal)*-1 - .25rem)!important;max-height:20rem;max-width:20rem;right:auto;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:" ";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;line-height:1!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));margin-right:var(--translateX);transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner:after{content:" ";height:.125rem}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down,.bubbles-go-mention{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{--translateY:0;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important;visibility:visible}.chat-secondary-button{align-items:center;background-color:#fff!important;background-color:var(--surface-color)!important;border-radius:50%;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;right:var(--chat-input-padding);z-index:2}.bubbles-corner-button .badge{position:absolute;right:-.25rem;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){.bubbles-corner-button .badge{right:.1875rem;top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:" ";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden;padding-left:49px}@media only screen and (max-width:600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;margin-right:.5rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden;padding-left:1.125rem}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not([data-type=chat]) .topbar .content{padding-left:16px}.topbar-call-container{color:#fff;cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;left:1px;min-height:auto!important;position:absolute;right:0;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;position:-webkit-sticky!important;position:sticky!important;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:" ";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:"Unread messages";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:500;font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:-webkit-sticky;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);transform:translateX(0);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{align-items:center;border:1px solid #3390ec;border:1px solid var(--message-primary-color);border-radius:6px;color:#3390ec;color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;text-decoration:none!important;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:#3390ec;background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important;min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size);border-radius:0!important}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);max-height:-webkit-fit-content!important;max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.bubble.just-media .bubble-content{background:none!important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto;position:relative!important;right:0!important}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;flex-direction:column;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important;font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;margin-top:.75rem!important;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:" ";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:16px;font-size:var(--messages-text-size)}.bubble .document-size{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:1.3125;line-height:var(--line-height);padding:.375rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;max-width:none!important;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important;width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important;width:280px}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:#fff;background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{-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{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:" ";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(12px + .375rem);height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;font-size:var(--messages-time-text-size);height:12px;height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;display:flex;height:12px;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:12px;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:"";font-size:1.25rem;padding:0 1px 0 3px}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:14px;font-size:var(--messages-secondary-text-size);font-weight:500!important;font-weight:var(--font-weight-bold)!important;line-height:calc(14px + .25rem);line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:#eff6fd;fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:14px;font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubble .media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.bubble .media-spoiler-container.is-revealing{opacity:1}.bubble .media-spoiler-container.is-revealing:not(.backwards){opacity:0}.bubble .media-spoiler-container.is-revealing.animating{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:15px;font-size:var(--messages-service-text-size);justify-content:center;line-height:20px;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.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!important}.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 .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0!important}.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 .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e!important;background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e!important;color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;font-size:calc(var(--messages-text-size) + 3px);line-height:12px;line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:""}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:""}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:""}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:#df3f40;color:var(--message-error-color);content:""}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:.375rem;color:#fff!important;cursor:pointer;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:""}.reply-markup-button.is-switch-inline:before{content:""}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.bubble-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:" ";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:calc(32px + .25rem);height:calc(var(--font-size)*2 + .25rem);min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-type=discussion] .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:" ";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important;height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:72px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{height:50px;padding:.25rem 0!important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:" ";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(72px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{left:0;position:absolute!important;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}.bot-commands,body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;-webkit-animation:none!important;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;max-height:207px!important;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{align-items:flex-start;border-radius:0!important;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);padding-left:1.5rem}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{flex:0 0 auto;height:2.5rem;overflow:inherit!important;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:" ";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;left:1.5rem;pointer-events:none;position:absolute}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}.profile-change-avatar{--size:3.375rem;position:absolute!important;right:1.25rem;top:calc(var(--size)/-2);transform:none;transition:none!important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:20px;font-size:var(--font-size-20);font-weight:500;font-weight:var(--font-weight-bold);line-height:26px;line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:" ";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:" ";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center;transition:none!important}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:18rem}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:" ";display:block;height:100vh;position:absolute;right:-1px;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}#column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:#fff;background-color:var(--surface-color)}#column-left .item-main .input-search .selector-user{height:30px;left:6px;line-height:1.875rem;margin-left:0;position:absolute!important;top:6px;z-index:1}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width:600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative!important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:" ";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{align-items:center;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;padding:0!important;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:400!important;font-weight:var(--font-weight-normal)!important}#column-left .search-group-people .dialog-avatar{left:auto!important;top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;padding-left:4.5rem;text-align:left;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}#column-left .connection-status-button .preloader-container{height:1.5rem;left:1rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{display:flex;top:var(--offset-top)!important}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-left:23px;margin-top:14px;padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{box-shadow:none;padding-top:0!important}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{opacity:.25;pointer-events:none!important}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem!important}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width:600px){.shared-media-container .btn-corner{bottom:14px;height:54px;position:fixed!important;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:none!important;position:-webkit-sticky!important;position:sticky!important;top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:" ";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important;min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{padding:0;position:absolute!important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:1}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{margin:0;position:absolute!important;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:" ";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important;margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.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!important}.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!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;position:fixed!important;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;position:absolute!important;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:23.875rem!important;z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{left:0;margin-left:.5rem!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important;position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:" ";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;border-radius:.25rem!important;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(0,0,0,.8)!important;color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important;transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important;width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(0,0,0,.42);color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:"";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color .3s cubic-bezier(.4,0,.2,1),border-bottom-color .3s cubic-bezier(.4,0,.2,1);transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:#dfe1e5;border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:#dfe1e5;border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@-webkit-keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding:0 1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;margin-left:-.25rem;margin-right:.75rem;max-width:11.25rem;overflow:hidden;padding:0 17px 0 0;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{border-radius:50%!important;float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:"";font-size:23px;height:100%;left:0;line-height:32px!important;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;pointer-events:none;position:absolute!important;top:50%;transform:translateY(-50%);z-index:1}.selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}.selector .checkbox-field-round{--size:1.25rem;right:1.125rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}.selector-square .checkbox-field{left:1.25rem!important}.selector-square .chatlist-chat{padding-left:7.5rem!important}.selector-square .dialog-avatar{margin-left:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite!important;animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:"";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}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(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:" ";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;-o-object-fit:cover;object-fit:cover;width:100%!important}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:#fff;border-right-color:var(--message-background-color);border-style:solid;border-top-color:#fff;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:"";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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,.2);border-radius:.375rem}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:" • "}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;text-align:left;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:dotMiddle;animation-name:dotMiddle;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@-webkit-keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@-webkit-keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@-webkit-keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;text-align:right;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:"";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important;color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{-webkit-animation:none;animation:none;display:flex!important;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{-webkit-animation-fill-mode:forwards!important;animation-fill-mode:forwards!important;height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}.row-big{min-height:4.5rem;padding:.5625rem .75rem .5625rem 1rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-subtitle-right,.row-title-right{flex:0 0 auto!important;margin-left:1rem}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:14px;font-size:var(--font-size-14);margin-top:.125rem;order:1}.row-with-padding{padding-left:4.5rem}@media only screen and (max-width:600px){.row-with-padding{padding-left:4rem}}.row-with-padding.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;left:1rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}.row-sortable .row-subtitle,.row-sortable .row-title{padding-right:2.5rem}.row-sortable-icon{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;pointer-events:none;position:absolute;right:.75rem;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:#fff!important;background-color:var(--surface-color)!important;z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:#f4f4f4!important;background-color:var(--light-filled-secondary-text-color)!important}body.animation-level-2 .is-reordering .row-sortable{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.row .checkbox-field,.row .radio-field-main{margin-left:-3.375rem;padding-left:3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .checkbox-field,.row .radio-field{margin-bottom:0;margin-top:0}.row .checkbox-field{height:auto;margin-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;padding-left:0;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin:0 .125rem;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:14px!important;font-size:var(--font-size-14)!important;line-height:18px;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}.row-media{align-items:center;display:flex;height:2.25rem!important;justify-content:center;left:.75rem;margin:0!important;pointer-events:none;position:absolute!important;width:2.25rem!important}.row-media-small{height:2rem!important;left:.75rem!important;width:2rem!important}.row-media-abitbigger{height:2.625rem!important;left:.75rem!important;width:2.625rem!important}.row-media-big{height:3rem!important;left:.5rem!important;width:3rem!important}.row-media-bigger{height:3.375rem!important;left:.5625rem!important;width:3.375rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding:0 .75rem;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;color:#3390ec;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:380px}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:flex!important;flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;padding:0!important;position:absolute!important;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;padding:.625rem!important;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#3d9de0;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:waves-animation 3s infinite;animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:waves-animation 5s infinite;animation:waves-animation 5s infinite;-webkit-animation-delay:2s;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important;order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform .2s cubic-bezier(.12,1.1,.56,1.2),opacity .2s cubic-bezier(.12,1.1,.56,1.2)!important;transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{display:inline;height:1.25rem!important;height:var(--custom-emoji-size)!important;min-height:1.25rem!important;min-height:var(--custom-emoji-size)!important;min-width:1.25rem!important;min-width:var(--custom-emoji-size)!important;position:relative;width:1.25rem!important;width:var(--custom-emoji-size)!important}.custom-emoji:before{content:" ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;margin:0;max-height:inherit!important;max-width:inherit!important;pointer-events:none;text-indent:-9999px;width:inherit!important}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:20px;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:20px;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:""}.usernames-username.active .usernames-username-status{color:#3390ec!important;color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:#3390ec;background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{--offset:0;--width:100%;background-color:#fff!important;background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);bottom:0;overflow:visible!important;overflow:initial!important;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16);margin-bottom:.125rem;padding-left:0!important}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{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)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative;text-decoration:none!important}.topic-name-button-container{align-items:flex-start;display:flex!important;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;line-height:1.875!important;position:relative;vertical-align:middle}.topic-icon-general{fill:#c4c9cc;fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{height:100%;padding:0!important}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;position:fixed!important;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0;padding:0 1rem 0 1.5rem}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.popup-buttons .btn+.btn{margin-right:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem;text-align:left}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem}.popup-peer .popup-container{max-width:min(400px,100%);min-width:17.5rem;padding:.75rem .5rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:15rem;overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.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 .sticker-set-footer{color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important;font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important;pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:20px;font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1em -.5rem .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:" ";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:16px;font-size:var(--font-size-16);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important;right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;font-size:1.25rem!important;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:14px;font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:#707579;color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:#707579;color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:#000;color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;display:inline;font-weight:inherit!important}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:22.5rem}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:500;font-weight:var(--font-weight-bold);justify-content:center}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");content:" ";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:#3390ec;background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important;max-width:300px}.page-chats{display:flex;max-width:1682px!important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.primary-text{color:#000!important;color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%);background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important;cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:500;font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(#69bffa,#3d9de0);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem;text-align:left}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;margin-left:.4rem;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html:not(.is-safari) span.emoji{margin-right:5px!important}html:not(.is-safari) avatar-element span.emoji{margin-right:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{-webkit-text-decoration-line:underline;text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{-webkit-text-decoration-line:underline line-through;text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:Roboto Mono,monospace!important;font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity .2s ease-out .01s,transform .2s ease-out .01s;transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,72px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;font-size:24px;padding-left:16px;padding-right:32px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}::-moz-selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after,::selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after{bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@-webkit-keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important;padding:0 .375rem}.media-round .video-time:after,.media-round .video-time:before{margin-left:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:" ";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:"";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;grid-column-gap:.25rem;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin:0 .0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important;font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:#df3f40;color:var(--danger-color)}.sending-status-icon{line-height:1!important;position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:#3390ec;fill:var(--primary-color)}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;margin-left:.125rem;width:1.25rem}.emoji-status{height:1.125rem;margin-left:.25rem;position:relative;width:1.125rem}.premium-icon{color:#3390ec;color:var(--primary-color);margin-top:-.0625rem}.badge-fake{border:1px solid #df3f40;border:1px solid var(--danger-color);border-radius:.185rem;color:#df3f40;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1!important;margin:0 .25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}.chatlist-chat.row-with-padding{padding-left:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:16px!important;font-size:var(--font-size-16)!important;line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:12px!important;font-size:var(--font-size-12)!important;line-height:16px!important;line-height:var(--line-height-12)!important;margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:16px!important;font-size:var(--font-size-16)!important;line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.username-purchase-help b{color:#df3f40!important;color:var(--danger-color)!important;font-weight:400!important;font-weight:var(--font-weight-normal)!important} + +/*# sourceMappingURL=main.2eade49b43eb3f2960e2.css.map*/ \ No newline at end of file diff --git a/public/main.2eade49b43eb3f2960e2.css.map b/public/main.2eade49b43eb3f2960e2.css.map new file mode 100644 index 00000000..a1a43112 --- /dev/null +++ b/public/main.2eade49b43eb3f2960e2.css.map @@ -0,0 +1 @@ +{"version":3,"file":"main.2eade49b43eb3f2960e2.css","mappings":"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","sources":["webpack://tweb/./src/materialize.scss","webpack://tweb/./src/scss/style.scss"],"sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{left:50%;position:absolute!important;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:-moz-plaintext;unicode-bidi:plaintext}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}",":root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--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:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:\"Roboto Mono\",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-saved-top:#69bffa;--peer-avatar-saved-bottom:#3d9de0;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#2086ea;--primary-color-rgb:51,144,236;--primary-text-color:#000;--primary-text-color-rgb:0,0,0;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--light-filled-secondary-text-color:#f4f4f4;--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--dark-danger-color:#d22324;--avatar-online-color:#0ac630;--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);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--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-error-color:var(--danger-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-color-rgb:135,116,225;--primary-text-color:#fff;--primary-text-color-rgb:255,255,255;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--light-filled-secondary-text-color:#2c2c2c;--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--dark-danger-color:#ff3031;--avatar-online-color:#0ac630;--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?vqhlcw) format(\"truetype\"),url(assets/fonts/tgico.woff?vqhlcw) format(\"woff\"),url(assets/fonts/tgico.svg?vqhlcw#tgico) format(\"svg\")}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:tgico!important;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-add_reaction:before{content:\"\"}.tgico-addmember_filled:before{content:\"\"}.tgico-adduser:before{content:\"\"}.tgico-admin:before{content:\"\"}.tgico-animals:before{content:\"\"}.tgico-animations:before{content:\"\"}.tgico-archive:before{content:\"\"}.tgico-arrow_down:before{content:\"\"}.tgico-arrow_next:before{content:\"\"}.tgico-attach:before{content:\"\"}.tgico-audio_repeat:before{content:\"\"}.tgico-audio_repeat_single:before{content:\"\"}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-binfilled: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-card:before{content:\"\"}.tgico-card_outline: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-limit_chat:before{content:\"\"}.tgico-limit_chats:before{content:\"\"}.tgico-limit_file:before{content:\"\"}.tgico-limit_folders:before{content:\"\"}.tgico-limit_link:before{content:\"\"}.tgico-limit_pin: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-premium_addone:before{content:\"\"}.tgico-premium_double:before{content:\"\"}.tgico-premium_lock:before{content:\"\"}.tgico-premium_unlock: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-shipping:before{content:\"\"}.tgico-shuffle:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-spoiler:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-star:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stickers_face:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-topics:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videocamera_crossed_filled:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-volume_down:before{content:\"\"}.tgico-volume_mute:before{content:\"\"}.tgico-volume_off:before{content:\"\"}.tgico-volume_up:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}.tgico-phone_filled:before{content:\"\";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:\" \";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;left:1rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:2}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.input-search{margin-left:1rem}}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);max-height:var(--height)!important;min-height:var(--height)!important;padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:24px;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{height:24px;left:.8125rem;pointer-events:none;width:24px}.input-search>.tgico-close{height:42px;right:0;width:42px;z-index:1}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{max-height:var(--height);padding-right:2.5rem}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);box-shadow:none!important;color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;padding:0!important;position:absolute!important;right:var(--offset);text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:#2086ea;background-color:var(--dark-primary-color)}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;max-width:16.25rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transform:scale(.8)!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:#fff;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0;transform:none!important}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;transform:scaleX(1)!important;visibility:visible}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right{bottom:100%;left:0;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:#000;color:var(--primary-text-color);cursor:pointer!important;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin:0 .3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);pointer-events:all!important;position:relative;text-align:left;text-transform:none;transform:scale(1);white-space:nowrap}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:#000;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);margin-left:calc(var(--add)/-2);margin-right:calc(var(--icon-margin) - var(--add)/2);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));margin-left:var(--margin-left);max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{font-size:.875rem}.btn-menu-item-header,.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{font-weight:500;font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute;right:.5rem}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:calc(100% - .625rem);width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important;margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}.btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-left:var(--other-side-offset);margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-left:var(--menu-offset);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:\" \";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#2086ea;background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto;right:15px}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;padding:0 1.5rem 0 .75rem;width:auto}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}@media only screen and (max-width:600px){.btn-transparent:before{margin-right:1.5rem}}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important;position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);padding:0 2rem!important;right:auto;width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:\"\";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:\"\";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s ease-in-out forwards;animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{-webkit-animation:none!important;animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;text-align:left;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:\" \";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative;text-align:left}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);left:var(--offset-left);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);padding-left:3.375rem;pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative;text-align:left}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{color:inherit;padding-left:3.5rem;position:relative}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:\"\";display:block;height:var(--size);left:var(--offset-left);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;left:calc(var(--offset-left) + .3125rem);transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:\" \";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{--background:unset;-webkit-user-drag:none;background:var(--background)!important}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:\"\";flex:0 0 auto;font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}.chatlist-chat .row-title .topic-icon{--size:1.375rem;margin-right:.25rem}.chatlist-chat .topic-name .topic-icon{display:inline;line-height:1!important}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}.chatlist-chat.menu-open{--background:var(--light-secondary-text-color)}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.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 .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:#c4c9cc;color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;margin-left:.5rem;padding:1px 0 0}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid #fff;border:2px solid var(--background,var(--surface-color));line-height:23px!important;margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;margin-right:.375rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:\" \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);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 .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s 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 .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-right:.125rem;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;padding:0}html.is-mac .chatlist .mention{line-height:1.25rem!important}.chatlist .mention-badge{margin-right:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist .not-visited{--size:.5rem;--padding:0;background-color:#c4c9cc!important;background-color:var(--secondary-color)!important}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\"!important}.chat-input .btn-record-cancel{opacity:0;padding:0;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal)*-1 - .5rem));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:#df3f40;color:var(--danger-color)}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:\"\";height:.5rem;position:absolute;right:5px;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s ease-in-out forwards!important;animation:hide-icon .4s ease-in-out forwards!important}.chat-input .float{align-self:center;display:none!important;margin:0 .75rem 0 0!important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){.chat-input .float{margin-right:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute;right:var(--padding-horizontal)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important;z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:#2086ea!important;background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:\" \";display:inline-block;height:10px;margin:0 9px;width:10px}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper,.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{bottom:0;left:0;position:fixed!important;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{align-items:center;display:flex!important;flex-direction:column;transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{bottom:0;left:0;position:absolute!important;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:\" \";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button:before{margin-right:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;margin:0 5px 0 6px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}.rows-wrapper{border-bottom-right-radius:0;transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;right:-8.4px;transform:scaleX(-1);width:11px}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin:0 .625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);left:3.125rem;top:auto;transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0 var(--icon-margin) 0 0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width:600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;margin-left:var(--commands-margin-left);width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);margin-left:var(--send-as-margin-left);width:var(--send-as-size)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;left:calc(var(--padding-horizontal)*-1 - .25rem)!important;max-height:20rem;max-width:20rem;right:auto;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:\" \";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;line-height:1!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));margin-right:var(--translateX);transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner:after{content:\" \";height:.125rem}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down,.bubbles-go-mention{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{--translateY:0;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important;visibility:visible}.chat-secondary-button{align-items:center;background-color:#fff!important;background-color:var(--surface-color)!important;border-radius:50%;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;right:var(--chat-input-padding);z-index:2}.bubbles-corner-button .badge{position:absolute;right:-.25rem;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){.bubbles-corner-button .badge{right:.1875rem;top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:\" \";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden;padding-left:49px}@media only screen and (max-width:600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;margin-right:.5rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden;padding-left:1.125rem}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not([data-type=chat]) .topbar .content{padding-left:16px}.topbar-call-container{color:#fff;cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;left:1px;min-height:auto!important;position:absolute;right:0;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;position:-webkit-sticky!important;position:sticky!important;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:\" \";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:\"Unread messages\";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:500;font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:-webkit-sticky;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);transform:translateX(0);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{align-items:center;border:1px solid #3390ec;border:1px solid var(--message-primary-color);border-radius:6px;color:#3390ec;color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;text-decoration:none!important;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:#3390ec;background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important;min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size);border-radius:0!important}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);max-height:-webkit-fit-content!important;max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.bubble.just-media .bubble-content{background:none!important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto;position:relative!important;right:0!important}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;flex-direction:column;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important;font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;margin-top:.75rem!important;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:\" \";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:16px;font-size:var(--messages-text-size)}.bubble .document-size{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:1.3125;line-height:var(--line-height);padding:.375rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;max-width:none!important;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important;width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important;width:280px}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"\";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:#fff;background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{-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{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:\" \";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(12px + .375rem);height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;font-size:var(--messages-time-text-size);height:12px;height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;display:flex;height:12px;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:12px;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:\"\";font-size:1.25rem;padding:0 1px 0 3px}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:14px;font-size:var(--messages-secondary-text-size);font-weight:500!important;font-weight:var(--font-weight-bold)!important;line-height:calc(14px + .25rem);line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:#eff6fd;fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:14px;font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubble .media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.bubble .media-spoiler-container.is-revealing{opacity:1}.bubble .media-spoiler-container.is-revealing:not(.backwards){opacity:0}.bubble .media-spoiler-container.is-revealing.animating{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:15px;font-size:var(--messages-service-text-size);justify-content:center;line-height:20px;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.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!important}.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 .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0!important}.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 .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e!important;background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e!important;color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;font-size:calc(var(--messages-text-size) + 3px);line-height:12px;line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:\"\"}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:\"\"}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:\"\"}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:#df3f40;color:var(--message-error-color);content:\"\"}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:.375rem;color:#fff!important;cursor:pointer;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:\"\"}.reply-markup-button.is-switch-inline:before{content:\"\"}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.bubble-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:\" \";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:calc(32px + .25rem);height:calc(var(--font-size)*2 + .25rem);min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-type=discussion] .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:\" \";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important;height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:72px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{height:50px;padding:.25rem 0!important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:\" \";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(72px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{left:0;position:absolute!important;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}.bot-commands,body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;-webkit-animation:none!important;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;max-height:207px!important;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{align-items:flex-start;border-radius:0!important;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);padding-left:1.5rem}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{flex:0 0 auto;height:2.5rem;overflow:inherit!important;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:\" \";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;left:1.5rem;pointer-events:none;position:absolute}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}.profile-change-avatar{--size:3.375rem;position:absolute!important;right:1.25rem;top:calc(var(--size)/-2);transform:none;transition:none!important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:20px;font-size:var(--font-size-20);font-weight:500;font-weight:var(--font-weight-bold);line-height:26px;line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:\" \";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:\" \";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center;transition:none!important}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:18rem}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:\" \";display:block;height:100vh;position:absolute;right:-1px;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}#column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:#fff;background-color:var(--surface-color)}#column-left .item-main .input-search .selector-user{height:30px;left:6px;line-height:1.875rem;margin-left:0;position:absolute!important;top:6px;z-index:1}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width:600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative!important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:\" \";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{align-items:center;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;padding:0!important;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:400!important;font-weight:var(--font-weight-normal)!important}#column-left .search-group-people .dialog-avatar{left:auto!important;top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;padding-left:4.5rem;text-align:left;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}#column-left .connection-status-button .preloader-container{height:1.5rem;left:1rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{display:flex;top:var(--offset-top)!important}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-left:23px;margin-top:14px;padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{box-shadow:none;padding-top:0!important}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{opacity:.25;pointer-events:none!important}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem!important}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width:600px){.shared-media-container .btn-corner{bottom:14px;height:54px;position:fixed!important;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:none!important;position:-webkit-sticky!important;position:sticky!important;top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:\" \";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important;min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{padding:0;position:absolute!important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:1}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{margin:0;position:absolute!important;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:\" \";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important;margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.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!important}.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!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;position:fixed!important;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;position:absolute!important;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:23.875rem!important;z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{left:0;margin-left:.5rem!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important;position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:\" \";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;border-radius:.25rem!important;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(0,0,0,.8)!important;color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important;transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important;width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(0,0,0,.42);color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:\"\";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color .3s cubic-bezier(.4,0,.2,1),border-bottom-color .3s cubic-bezier(.4,0,.2,1);transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:#dfe1e5;border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:#dfe1e5;border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@-webkit-keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding:0 1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;margin-left:-.25rem;margin-right:.75rem;max-width:11.25rem;overflow:hidden;padding:0 17px 0 0;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{border-radius:50%!important;float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:\"\";font-size:23px;height:100%;left:0;line-height:32px!important;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;pointer-events:none;position:absolute!important;top:50%;transform:translateY(-50%);z-index:1}.selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}.selector .checkbox-field-round{--size:1.25rem;right:1.125rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}.selector-square .checkbox-field{left:1.25rem!important}.selector-square .chatlist-chat{padding-left:7.5rem!important}.selector-square .dialog-avatar{margin-left:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite!important;animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:\"\";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}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(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:\" \";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;-o-object-fit:cover;object-fit:cover;width:100%!important}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:#fff;border-right-color:var(--message-background-color);border-style:solid;border-top-color:#fff;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:\"\";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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,.2);border-radius:.375rem}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:\" • \"}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;text-align:left;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:dotMiddle;animation-name:dotMiddle;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@-webkit-keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@-webkit-keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@-webkit-keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;text-align:right;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:\"\";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important;color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{-webkit-animation:none;animation:none;display:flex!important;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{-webkit-animation-fill-mode:forwards!important;animation-fill-mode:forwards!important;height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}.row-big{min-height:4.5rem;padding:.5625rem .75rem .5625rem 1rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-subtitle-right,.row-title-right{flex:0 0 auto!important;margin-left:1rem}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:14px;font-size:var(--font-size-14);margin-top:.125rem;order:1}.row-with-padding{padding-left:4.5rem}@media only screen and (max-width:600px){.row-with-padding{padding-left:4rem}}.row-with-padding.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;left:1rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}.row-sortable .row-subtitle,.row-sortable .row-title{padding-right:2.5rem}.row-sortable-icon{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;pointer-events:none;position:absolute;right:.75rem;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:#fff!important;background-color:var(--surface-color)!important;z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:#f4f4f4!important;background-color:var(--light-filled-secondary-text-color)!important}body.animation-level-2 .is-reordering .row-sortable{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.row .checkbox-field,.row .radio-field-main{margin-left:-3.375rem;padding-left:3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .checkbox-field,.row .radio-field{margin-bottom:0;margin-top:0}.row .checkbox-field{height:auto;margin-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;padding-left:0;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin:0 .125rem;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:14px!important;font-size:var(--font-size-14)!important;line-height:18px;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}.row-media{align-items:center;display:flex;height:2.25rem!important;justify-content:center;left:.75rem;margin:0!important;pointer-events:none;position:absolute!important;width:2.25rem!important}.row-media-small{height:2rem!important;left:.75rem!important;width:2rem!important}.row-media-abitbigger{height:2.625rem!important;left:.75rem!important;width:2.625rem!important}.row-media-big{height:3rem!important;left:.5rem!important;width:3rem!important}.row-media-bigger{height:3.375rem!important;left:.5625rem!important;width:3.375rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding:0 .75rem;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;color:#3390ec;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:380px}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:flex!important;flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;padding:0!important;position:absolute!important;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;padding:.625rem!important;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#3d9de0;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:waves-animation 3s infinite;animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:waves-animation 5s infinite;animation:waves-animation 5s infinite;-webkit-animation-delay:2s;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important;order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform .2s cubic-bezier(.12,1.1,.56,1.2),opacity .2s cubic-bezier(.12,1.1,.56,1.2)!important;transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{display:inline;height:1.25rem!important;height:var(--custom-emoji-size)!important;min-height:1.25rem!important;min-height:var(--custom-emoji-size)!important;min-width:1.25rem!important;min-width:var(--custom-emoji-size)!important;position:relative;width:1.25rem!important;width:var(--custom-emoji-size)!important}.custom-emoji:before{content:\" \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;margin:0;max-height:inherit!important;max-width:inherit!important;pointer-events:none;text-indent:-9999px;width:inherit!important}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:20px;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:20px;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:\"\"}.usernames-username.active .usernames-username-status{color:#3390ec!important;color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:#3390ec;background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{--offset:0;--width:100%;background-color:#fff!important;background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);bottom:0;overflow:visible!important;overflow:initial!important;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16);margin-bottom:.125rem;padding-left:0!important}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{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)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative;text-decoration:none!important}.topic-name-button-container{align-items:flex-start;display:flex!important;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;line-height:1.875!important;position:relative;vertical-align:middle}.topic-icon-general{fill:#c4c9cc;fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{height:100%;padding:0!important}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;position:fixed!important;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0;padding:0 1rem 0 1.5rem}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.popup-buttons .btn+.btn{margin-right:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem;text-align:left}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem}.popup-peer .popup-container{max-width:min(400px,100%);min-width:17.5rem;padding:.75rem .5rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:15rem;overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.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 .sticker-set-footer{color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important;font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important;pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:20px;font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1em -.5rem .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:\" \";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:16px;font-size:var(--font-size-16);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important;right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;font-size:1.25rem!important;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:14px;font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:#707579;color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:#707579;color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:#000;color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;display:inline;font-weight:inherit!important}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:22.5rem}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:500;font-weight:var(--font-weight-bold);justify-content:center}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");content:\" \";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:#3390ec;background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important;max-width:300px}.page-chats{display:flex;max-width:1682px!important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.primary-text{color:#000!important;color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%);background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important;cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:500;font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(#69bffa,#3d9de0);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem;text-align:left}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;margin-left:.4rem;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html:not(.is-safari) span.emoji{margin-right:5px!important}html:not(.is-safari) avatar-element span.emoji{margin-right:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{-webkit-text-decoration-line:underline;text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{-webkit-text-decoration-line:underline line-through;text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:Roboto Mono,monospace!important;font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity .2s ease-out .01s,transform .2s ease-out .01s;transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,72px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;font-size:24px;padding-left:16px;padding-right:32px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}::-moz-selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after,::selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after{bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@-webkit-keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important;padding:0 .375rem}.media-round .video-time:after,.media-round .video-time:before{margin-left:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:\" \";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:\"\";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;grid-column-gap:.25rem;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin:0 .0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important;font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:#df3f40;color:var(--danger-color)}.sending-status-icon{line-height:1!important;position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:#3390ec;fill:var(--primary-color)}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;margin-left:.125rem;width:1.25rem}.emoji-status{height:1.125rem;margin-left:.25rem;position:relative;width:1.125rem}.premium-icon{color:#3390ec;color:var(--primary-color);margin-top:-.0625rem}.badge-fake{border:1px solid #df3f40;border:1px solid var(--danger-color);border-radius:.185rem;color:#df3f40;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1!important;margin:0 .25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}.chatlist-chat.row-with-padding{padding-left:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:16px!important;font-size:var(--font-size-16)!important;line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:12px!important;font-size:var(--font-size-12)!important;line-height:16px!important;line-height:var(--line-height-12)!important;margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:16px!important;font-size:var(--font-size-16)!important;line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.username-purchase-help b{color:#df3f40!important;color:var(--danger-color)!important;font-weight:400!important;font-weight:var(--font-weight-normal)!important}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.6d6505bae2a8ce439316.bundle.js b/public/main.6d6505bae2a8ce439316.bundle.js new file mode 100644 index 00000000..9bac07ac --- /dev/null +++ b/public/main.6d6505bae2a8ce439316.bundle.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,n,s,i,o,r,a,c,l={236:(e,t,n)=>{n.d(t,{h:()=>c});var s=n(4762),i=n(144),o=n(4159);const r=o.Z.version,a=o.Z.build,c={allDialogsLoaded:{},pinnedOrders:{},contactsListCachedTime:0,updates:{},filtersArr:[],maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],recentCustomEmoji:[],topPeersCache:{},recentSearch:[],version:r,build:a,authState:{_:s.IS_MOBILE?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,distanceUnit:"kilometers",sendShortcut:"enter",animationsEnabled:!0,autoDownload:{photo:{contacts:!0,private:!0,groups:!0,channels:!0},video:{contacts:!0,private:!0,groups:!0,channels:!0},file:{contacts:!0,private:!0,groups:!0,channels:!0}},autoDownloadNew:{_:"autoDownloadSettings",file_size_max:3145728,pFlags:{video_preload_large:!0,audio_preload_next:!0},photo_size_max:1048576,video_size_max:15728640,video_upload_maxbitrate:100},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[{name:"day",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:0,id:"1"}:{blur:!1,slug:"pattern",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:50,id:"1"}},{name:"night",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#0f0f0f",highlightningColor:"hsla(0, 0%, 3.82353%, 0.4)",intensity:0,id:"-1"}:{blur:!1,slug:"pattern",color:"#fec496,#dd6cb9,#962fbf,#4f5bd5",highlightningColor:"hsla(299.142857, 44.166666%, 37.470588%, .4)",intensity:-50,id:"-1"}}],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},playbackParams:{volume:1,muted:!1,playbackRate:1,playbackRates:{voice:1,video:1,audio:1},loop:!1,round:!1},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:(0,i.d)(32),notifySettings:{}}},8189:(e,t,n)=>{n.d(t,{Z:()=>i});let s=!1;try{const e=document.createElement("canvas").getContext("webgl"),t=e.getExtension("WEBGL_debug_renderer_info"),n=t&&e.getParameter(t.UNMASKED_RENDERER_WEBGL)||"";(n.match(/Apple/)&&!n.match(/Apple GPU/)||-1===e.getSupportedExtensions().indexOf("WEBGL_compressed_texture_s3tc_srgb"))&&(s=!0)}catch(e){}const i=s},993:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},7328:(e,t,n)=>{let s;if(n.d(t,{Z:()=>i}),n(4762).IS_SAFARI)try{s=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){s=!1}else s=!0;const i=s},6663:(e,t,n)=>{n.d(t,{Z:()=>s});const s="filter"in(document.createElement("canvas").getContext("2d")||{})},9976:(e,t,n)=>{n.d(t,{Z:()=>s});const s=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i)},3731:(e,t,n)=>{var s;n.d(t,{Z:()=>i});const i=!!(null===(s=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===s?void 0:s.getCurrentPosition)&&!1},6818:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},1174:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(5269);const i=new Set(["image/jpeg","image/png","image/bmp"]);s.Z&&i.add("image/webp");const o=i},2341:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(1174),i=n(554);const o=[...s.Z].concat([...i.Z]),r=new Set(o)},9030:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/quicktime")||s.IS_SAFARI||s.IS_APPLE_MOBILE},5783:(e,t,n)=>{n.d(t,{Z:()=>i});const s=document.createElement("audio"),i=!(!s.canPlayType||!s.canPlayType("audio/ogg;").replace(/no/,""))},2365:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!n(4762).IS_FIREFOX&&!1},2820:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}))},2045:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(1267);const i="undefined"!=typeof SharedWorker&&!s.Z.noSharedWorker},5432:(e,t,n)=>{n.d(t,{Z:()=>s});const s="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},4762:(e,t,n)=>{n.r(t),n.d(t,{IS_ANDROID:()=>r,IS_APPLE:()=>o,IS_APPLE_MOBILE:()=>c,IS_CHROMIUM:()=>a,IS_FIREFOX:()=>d,IS_MOBILE:()=>h,IS_MOBILE_SAFARI:()=>u,IS_SAFARI:()=>l,USER_AGENT:()=>i});var s=n(6761);const i=navigator?navigator.userAgent:null,o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),r=-1!==navigator.userAgent.toLowerCase().indexOf("android"),a=/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),c=(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!s.Z.MSStream,l=!!("safari"in s.Z)||!(!i||!(/\b(iPad|iPhone|iPod)\b/.test(i)||i.match("Safari")&&!i.match("Chrome"))),d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,u=l&&c,h=navigator.maxTouchPoints>0&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},2131:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate)},554:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(9030);const i=new Set(["image/gif","video/mp4","video/webm"]);s.Z&&i.add("video/quicktime");const o=i},393:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/webm")&&!s.IS_SAFARI&&!s.IS_APPLE_MOBILE},5269:(e,t,n)=>{n.d(t,{Z:()=>s});const s=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp")},4089:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!("undefined"==typeof RTCPeerConnection||s.IS_FIREFOX)},2064:(e,t,n)=>{function s(e,t,n,s=1){e/=255,t/=255,n/=255;const i=Math.max(e,t,n),o=Math.min(e,t,n);let r,a;const c=(i+o)/2;if(i===o)r=a=0;else{const s=i-o;switch(a=c>.5?s/(2-i-o):s/(i+o),i){case e:r=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e},a=n<.5?n*(1+t):n+t-n*t,c=2*n-a;i=s(c,a,e+1/3),o=s(c,a,e),r=s(c,a,e-1/3)}return[Math.round(255*i),Math.round(255*o),Math.round(255*r),Math.round(255*s)]}function o(e){const t=[],n="#"===e[0]?1:0;if(e.length===5+n&&(e=(n?"#":"")+"0"+e.slice(n)),e.length===3+n)for(let s=n;s("0"+e.toString(16)).slice(-2))).join("")}function l(e){return function(e){return c(function(e){const t=e.slice(5,-1).split(", "),n=+t.pop(),s=t.map((e=>e.endsWith("%")?+e.slice(0,-1):+e));return i(s[0],s[1],s[2],n)}(e))}(e).slice(0,-2)}n.d(t,{K5:()=>l,Pi:()=>o,Y6:()=>i,cw:()=>a,dI:()=>s,oo:()=>r,t1:()=>c})},6009:(e,t,n)=>{function s(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const n=e.split("."),s=t.split(".");for(let e=0;ei)return 1;if(ts})},8799:(e,t,n)=>{function s(){var e;return!!(null===(e=document.activeElement)||void 0===e?void 0:e.blur)&&(document.activeElement.blur(),!0)}n.d(t,{Z:()=>s})},3910:(e,t,n)=>{function s(e){if(e=e||window.event){e=e.originalEvent||e;try{e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.returnValue=!1,e.cancelBubble=!0}catch(e){}}return!1}n.d(t,{Z:()=>s})},8497:(e,t,n)=>{function s(e,t){return e.closest("."+t)}n.d(t,{Z:()=>s})},5494:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(3035);function i(e){e.style.transform="translateY(-99999px)",e.focus(),(0,s.d1)().then((()=>{e.style.transform=""}))}},8090:(e,t,n)=>{n.d(t,{T:()=>a,Z:()=>c});var s=n(5432),i=n(4762),o=n(8497),r=n(5494);const a=i.IS_SAFARI&&i.IS_MOBILE&&s.Z;if(a){const e="clientY";let t=0;const n={capture:!0,passive:!1},s=n=>{const s=n.touches[0],i=(0,o.Z)(s.target,"scrollable-y");if(i){const o=s[e],r=t-o,a=i.scrollTop,c=i.scrollHeight,l=i.clientHeight,d=a?Math.round(a+i.clientHeight+r):a+r;(c===l||d>=c||d<=0)&&n.preventDefault()}else n.preventDefault()};let i=0;document.addEventListener("focusin",(o=>{!o.target.classList.contains("is-sticky-input-bugged")||o.timeStamp-i<50||((0,r.Z)(o.target),document.addEventListener("touchmove",s,n),document.addEventListener("touchstart",(n=>{if(n.touches.length>1)return;const s=n.touches[0];t=s[e]})))}),{passive:!0}),document.addEventListener("focusout",(e=>{document.removeEventListener("touchmove",s,n),i=e.timeStamp}),{passive:!0}),document.addEventListener("visibilitychange",(()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&(0,r.Z)(document.activeElement)}),{passive:!0})}function c(e){a&&e.classList.add("is-sticky-input-bugged")}},4541:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(319),i=n(5418);const o=["b","б"],r={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function c(e={text:o,icons:void 0,monospace:o}){if(!("fonts"in document))return Promise.resolve();const t=[];for(const n in e){let s=e[n];"all"===s&&(s=o);const i=a[n],c="icons"===n?[500]:[400,500];for(const e of c){const n=(s||[void 0]).map((t=>{var n,s,o,a;const c=[e,"1rem",i].join(" ");return null!==(s=(o=null!==(n=r[c])&&void 0!==n?n:r[c]={})[a=t||""])&&void 0!==s?s:o[a]=document.fonts.load(c,t)}));t.push(...n)}}return Promise.race([Promise.all(t).catch(s.Z),(0,i.Z)(1e3)])}},2586:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3241);const o=s.Z?"touchstart":"mousemove";class r extends i.Z{constructor(){super(),this._isIdle=!0,this.focusPromise=Promise.resolve(),this.focusResolve=()=>{},window.addEventListener("blur",(()=>{this.isIdle=!0,window.addEventListener("focus",(()=>{this.isIdle=!1}),{once:!0})})),window.addEventListener(o,(()=>{this.isIdle=!1}),{once:!0,passive:!0}),this.addEventListener("change",(e=>{e?this.focusPromise=new Promise((e=>{this.focusResolve=e})):this.focusResolve()}))}getFocusPromise(){return this.focusPromise}get isIdle(){return this._isIdle}set isIdle(e){this._isIdle!==e&&(this._isIdle=e,this.dispatchEvent("change",e))}}const a=new r},3815:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(3241);class i extends s.Z{constructor(){super(...arguments),this.overlaysActive=0}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("change",this.isOverlayActive)}}const o=new i},3035:(e,t,n)=>{let s;function i(e){s?s.push(e):(s=[e],requestAnimationFrame((()=>{const e=s;s=void 0,e.forEach((e=>e()))})))}n.d(t,{AD:()=>l,T2:()=>i,TR:()=>c,d1:()=>d});let o,r,a=!1;function c(e){o?a?e():o.push(e):(o=[e],requestAnimationFrame((()=>{a=!0;for(let e=0;ei((()=>e())))),r.then((()=>{r=void 0})),r)}function d(){return new Promise((e=>{i((()=>{i(e)}))}))}},764:(e,t,n)=>{function s(e,t=e.split("?")){const n={};return t[1]?(t[1].split("&").forEach((e=>{n[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])})),n):n}n.d(t,{Z:()=>s})},6714:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3512),o=n(2064);const r=new class{constructor(){i.Z.addEventListener("theme_change",(()=>{this.setTheme()}))}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",i.Z.myId?i.Z.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}applyHighlightningColor(){let e;const t=r.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!s.Z&&e&&(r.themeColor=(0,o.K5)(e))}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor(),this.applyHighlightningColor()}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===i.Z.settings.theme?this.systemTheme:i.Z.settings.theme)){return i.Z.settings.themes.find((t=>t.name===e))}},a=r},6873:(e,t,n)=>{var s=n(4159),i=n(8799),o=n(3910),r=n(8090),a=n(4541),c=n(9976),l=n(4762),d=n(5418);!function(){const e={construct(e,t){let n=t[0]+"";return 0!==n.indexOf("blob:")&&(n+=location.search),new e(n)}};[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean).forEach((t=>{window[t.name]=new Proxy(t,e)}))}();var u=n(3512),h=n(5432),g=n(2325),m=(n(4110),n(690),n(3855)),f=n(2554),p=n(6714),v=n(3815),b=n(490),S=n(764),w=n(1267);document.addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,P=function*(){Element.prototype.toggleAttribute||(Element.prototype.toggleAttribute=function(e,t){return void 0!==t&&(t=!!t),this.hasAttribute(e)?!!t||(this.removeAttribute(e),!1):!1!==t&&(this.setAttribute(e,""),!0)}),void 0===Node.prototype.replaceChildren&&(Node.prototype.replaceChildren=function(...e){this.textContent="",e&&this.append(...e)}),u.Z.managers=(0,f.Z)(),document.getElementById("manifest").href=`site${l.IS_APPLE&&!l.IS_APPLE_MOBILE?"_apple":""}.webmanifest?v=jw3mK7G9Aq`,b.Z.start();const e=window.visualViewport||window;let t,y=!1;const P=()=>{const n=.01*(y&&!v.Z.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(h.Z&&t1&&(0,i.Z)(),t=n,document.documentElement.style.setProperty("--vh",`${n}px`))};if(window.addEventListener("resize",P),P(),r.T){const t=()=>{y=1===n&&r.T&&!v.Z.isOverlayActive,P(),e!==window&&(y?(window.removeEventListener("resize",P),e.addEventListener("resize",P)):(e.removeEventListener("resize",P),window.addEventListener("resize",P)))};let n;window.onImTabChange=e=>{const s=void 0!==n;n=e,(s||1===n)&&t()},v.Z.addEventListener("change",(()=>{t()}))}l.IS_FIREFOX&&!c.Z&&document.addEventListener("dragstart",(e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return(0,o.Z)(e),!1})),c.Z&&document.documentElement.classList.add("native-emoji"),document.addEventListener("dragstart",(e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1})),document.addEventListener("contextmenu",(e=>{"IMG"!==e.target.tagName||window.appMediaViewer||(0,o.Z)(e)})),l.IS_FIREFOX&&document.documentElement.classList.add("is-firefox","no-backdrop"),l.IS_MOBILE&&document.documentElement.classList.add("is-mobile"),l.IS_APPLE?(l.IS_SAFARI&&document.documentElement.classList.add("is-safari"),l.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):l.IS_ANDROID&&document.documentElement.classList.add("is-android"),h.Z?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");const k=performance.now(),E=g.ZP.getCacheLangPack(),[A,_]=yield Promise.all([m.Z.sendState().then((([e])=>e)),E]);function Z(e,t){e.style.opacity="0",t.then((()=>{window.requestAnimationFrame((()=>{e.style.opacity=""}))}))}g.ZP.setTimeFormat(A.state.settings.timeFormat),u.Z.managers.rootScope.getPremium().then((e=>{u.Z.premium=e})),p.Z.setThemeListener(),_.appVersion!==s.Z.langPackVersion&&g.ZP.getLangPack(_.lang_code),console.log("got state, time:",performance.now()-k);let I=A.state.authState;const C=location.hash,L=C.split("?"),T=(0,S.Z)(C,L);if(T.tgWebAuthToken&&"authStateSignedIn"!==I._){const e={token:T.tgWebAuthToken,dcId:+T.tgWebAuthDcId,userId:T.tgWebAuthUserId.toUserId(),isTest:void 0!==T.tgWebAuthTest&&!!+T.tgWebAuthTest,tgAddr:T.tgaddr};if(e.isTest!==w.Z.test){const e=new URLSearchParams(location.search);return+T.tgWebAuthTest?e.set("test","1"):e.delete("test"),void(location.search=e.toString())}u.Z.managers.appStateManager.pushToState("authState",I={_:"authStateSignImport",data:e})}if("authStateSignedIn"!==I._){console.log("Will mount auth page:",I._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,s;if(e){t=e.querySelector(".scrollable"),h.Z&&!l.IS_MOBILE_SAFARI||t.classList.add("no-scrollbar"),t.style.opacity="0";const n=document.createElement("div");n.classList.add("auth-placeholder"),t.prepend(n),t.append(n.cloneNode())}try{yield Promise.all([Promise.resolve().then(n.bind(n,2831)),Promise.resolve().then(n.bind(n,6702))]).then((([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()}))}catch(e){}switch(I._){case"authStateSignIn":s=(yield Promise.all([n.e(333),n.e(567),n.e(63)]).then(n.bind(n,810))).default.mount();break;case"authStateSignQr":s=(yield Promise.all([n.e(333),n.e(567),n.e(709)]).then(n.bind(n,9709))).default.mount();break;case"authStateAuthCode":s=(yield Promise.all([n.e(333),n.e(567),n.e(53)]).then(n.bind(n,6392))).default.mount(I.sentCode);break;case"authStatePassword":s=(yield Promise.all([n.e(333),n.e(567),n.e(442)]).then(n.bind(n,9437))).default.mount();break;case"authStateSignUp":s=(yield Promise.all([n.e(333),n.e(567),n.e(339)]).then(n.bind(n,8339))).default.mount(I.authCode);break;case"authStateSignImport":s=(yield Promise.all([n.e(333),n.e(567),n.e(231)]).then(n.bind(n,3231))).default.mount(I.data)}t&&(s&&(yield s),Z(t,"fonts"in document?Promise.race([(0,d.Z)(1e3),document.fonts.ready]):Promise.resolve()))}else console.log("Will mount IM page:",Date.now()/1e3),Z(document.getElementById("main-columns"),(0,a.Z)()),(yield Promise.all([n.e(333),n.e(567),n.e(436)]).then(n.bind(n,5436))).default.mount()},new((y=void 0)||(y=Promise))((function(n,s){function i(e){try{r(P.next(e))}catch(e){s(e)}}function o(e){try{r(P.throw(e))}catch(e){s(e)}}function r(e){var t;e.done?n(e.value):(t=e.value,t instanceof y?t:new y((function(e){e(t)}))).then(i,o)}r((P=P.apply(e,t||[])).next())}));var e,t,y,P}))},1722:(e,t,n)=>{n.d(t,{Z:()=>s});const s=new class{reload(){try{location.reload()}catch(e){}}close(){try{window.close()}catch(e){}}focus(){window.focus()}}},2554:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(3855),i=n(410);const o={};function r(e,t){return new Proxy(e,{get:(e,n,r)=>{var a;return null!==(a=e[n])&&void 0!==a?a:e[n]=function(e,t){return new Proxy({},{get:(n,r,a)=>(...n)=>{var a;const c=s.Z.invoke("manager",{name:e,method:r,args:n},t);return i.ZP&&(null===(a=o[e])||void 0===a?void 0:a.has(r))&&console.warn("manager request",e,r,n),c}})}(n,t)}})}let a;function c(){return a||(a=r({},!1),a.acknowledged=r({},!0),a)}i.ZP&&(window.DEBUG_MANAGER_REQUESTS=o)},6666:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(1267),i=n(5471),o=n(5953),r=n(5003);class a{constructor(e){(0,o.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),a.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||n.onerror((0,i.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,i)=>{n.onsuccess=t=>{s=!0;const o=n.result;let r=!1;this.log("Opened"),o.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},o.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),o.close()},o.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=o)},n.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},n.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,i=n.result;this.stores.forEach((e=>{if(i.objectStoreNames.contains(e.name)){const s=n.transaction.objectStore(e.name);t(s,e)}else((e,n)=>{const s=e.createObjectStore(n.name);t(s,n)})(i,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new a(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}a.INSTANCES=[];class c{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=a.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,s)=>n.put(t[s],e)))),"",n)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,n,s=this.storeName){let i;return n&&(i=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((o=>new Promise(((r,a)=>{const c=o.transaction([s],e),l=()=>{clearTimeout(h),a(c.error)},d=()=>{clearTimeout(h),n&&this.log(n+": end",performance.now()-i);const e=f.map((e=>e.result));r(m?e:e[0])};c.onerror=l;const u="readwrite"===e;u&&(c.oncomplete=()=>d());const h=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),g=t(c.objectStore(s)),m=Array.isArray(g),f=m?g:[].concat(g);if(u)return;const p=f.length;let v=p;const b=()=>{c.error||--v||d()};for(let e=0;ee.getAll()),"",e)}}},2325:(e,t,n)=>{n.d(t,{$d:()=>S,A1:()=>w,Hz:()=>g,XZ:()=>b,ZP:()=>p,ag:()=>v,nK:()=>m,v_:()=>y});var s=n(410),i=n(7922),o=n(4159),r=n(3512),a=n(4762),c=n(6848),l=n(5953),d=n(9005),u=n(6637),h=n(3591);const g={messageActionChatCreate:"ActionCreateGroup",messageActionChatCreateYou:"ActionYouCreateGroup",messageActionChatEditTitle:"ActionChangedTitle",messageActionChatEditPhoto:"ActionChangedPhoto",messageActionChatEditVideo:"ActionChangedVideo",messageActionChatDeletePhoto:"ActionRemovedPhoto",messageActionChatReturn:"ActionAddUserSelf",messageActionChatReturnYou:"ActionAddUserSelfYou",messageActionChatJoined:"ActionAddUserSelfMega",messageActionChatJoinedYou:"ChannelMegaJoined",messageActionChatAddUser:"ActionAddUser",messageActionChatAddUsers:"ActionAddUser",messageActionChatLeave:"ActionLeftUser",messageActionChatLeaveYou:"YouLeft",messageActionChatDeleteUser:"ActionKickUser",messageActionChatJoinedByLink:"ActionInviteUser",messageActionPinMessage:"Chat.Service.Group.UpdatedPinnedMessage",messageActionContactSignUp:"Chat.Service.PeerJoinedTelegram",messageActionChannelCreate:"ActionCreateChannel",messageActionChannelEditTitle:"Chat.Service.Channel.UpdatedTitle",messageActionChannelEditPhoto:"Chat.Service.Channel.UpdatedPhoto",messageActionChannelEditVideo:"Chat.Service.Channel.UpdatedVideo",messageActionChannelDeletePhoto:"Chat.Service.Channel.RemovedPhoto",messageActionHistoryClear:"HistoryCleared",messageActionDiscussionStarted:"DiscussionStarted",messageActionChannelMigrateFrom:"ActionMigrateFromGroup","messageActionPhoneCall.video_in_ok":"ChatList.Service.VideoCall.incoming","messageActionPhoneCall.video_out_ok":"ChatList.Service.VideoCall.outgoing","messageActionPhoneCall.video_missed":"ChatList.Service.VideoCall.Missed","messageActionPhoneCall.video_cancelled":"ChatList.Service.VideoCall.Cancelled","messageActionPhoneCall.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.cancelled":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"Chat.Service.VoiceChatStarted.Channel","messageActionGroupCall.started_by":"Chat.Service.VoiceChatStarted","messageActionGroupCall.started_byYou":"Chat.Service.VoiceChatStartedYou","messageActionGroupCall.ended":"Chat.Service.VoiceChatFinished.Channel","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"},m=a.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var f;!function(e){let t,a;function g(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function m(){if("h12"===e.timeFormat)try{const t=A({hour:"numeric",minute:"numeric",hour12:!0}),n=new Date;n.setHours(0);const s=t.format(n);e.amPmCache.am=s.split(" ")[1],n.setHours(12);const i=t.format(n);e.amPmCache.pm=i.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function f(){const e=o.Z.langPackCode;return g(e),Promise.all([n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),n.e(8).then(n.bind(n,9179))]).then((([t,n,s])=>{const i=[];return v(t.default,i),v(n.default,i),b({_:"langPackDifference",from_version:0,lang_code:e,strings:i,version:0,local:!0,countries:s.default})}))}function p(t,s){e.requestedServerLanguage=!0;const i=r.Z.managers;return Promise.all([i.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),i.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function v(e,t=[]){for(const n in e){const s=e[n];"string"==typeof s?t.push({_:"langPackString",key:n,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:n},s))}return t}function b(e){return e.appVersion=o.Z.langPackVersion,i.Z.set({langPack:e}).then((()=>(S(e),e)))}function S(n){const s=e.lastRequestedLangCode;if(n.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(n){console.error("pluralRules error",n),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(n.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(n.lang_code.split("-",1)[0])}e.strings.clear();for(const t of n.strings)e.strings.set(t.key,t);n.countries&&(e.countriesList.length=0,e.countriesList.push(...n.countries.countries),n.countries.countries.forEach((t=>{if(t.name){const n=t.default_name;e.strings.set(n,{_:"langPackString",key:n,value:t.name})}}))),e.lastAppliedLangCode!==s&&(r.Z.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,E.clear(),m()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n&&n.update()}))}}function w(e,t,n={i:0}){const s=[];let i=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,o,r,a,c,l,d)=>{if(s.push(d.slice(i,l)),o){let e;switch(o){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...w(r,t,n)),s.push(e)}else if(a)s.push(document.createElement("br"));else if(c){const e=c.lastIndexOf("]"),i=c.slice(1,e),o=c.slice(e+2,c.length-1);let r;if(o&&(0,u.Z)(o)){r=document.createElement("a");const e=(0,h.Z)(o);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[n.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...w(i,t,n)),s.push(r)}else t&&function(e,t,n){const s=t[n.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,n);return i=l+e.length,""})),i!==e.length&&s.push(e.slice(i)),s}function y(n,s=!1,i){const o=e.strings.get(n);let r;if(o)if("langPackStringPluralized"===o._&&(null==i?void 0:i.length)){let e=i[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=o[t.select(e)+"_value"]||o.other_value}else r="langPackString"===o._?o.value:n;else r=n;const a=w(r,i);return s?a.map((e=>e instanceof Node?e.textContent:e)).join(""):a}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.getCacheLangPack=function(){return a||(a=Promise.all([i.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(s.ZP,e.lastRequestedLangCode||g(t.lang_code),S(t),t):f())).finally((()=>{a=void 0})))},e.setTimeFormat=function(t,n=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,m(),n&&(E.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n instanceof _&&n.update()})))},e.loadLocalLangPack=f,e.loadLangPack=p,e.getStrings=function(e,t){return r.Z.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:o.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=v,e.getLangPack=function(e,t){return g(e),p(e).then((([e,t,n,s,i,o])=>{let r=[];return[n,s].forEach((e=>{v(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=i,b(e)}))},e.saveLangPack=b,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():n.e(642).then(n.bind(n,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=S,e.superFormatter=w,e.format=y,e.weakMap=new WeakMap;class P{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class k extends P{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,l.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...y(this.key,!1,this.args));else{const e=this.element[this.property],t=y(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,c.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=k;const E=new Map;function A(t={}){const n=JSON.stringify(t);let s=E.get(n);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),E.set(n,s)),s}e.amPmCache={am:"AM",pm:"PM"};class _ extends P{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"}))}update(t){let n;if((0,l.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();n=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(n+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=A(this.options);n=(0,d.Z)(e.format(this.date))}this.element[this.property]=n}}e.IntlDateElement=_,e.i18n=function(e,t){return new k({key:e,args:t}).element},e.i18n_=function(e){return new k(e).element},e._i18n=function(e,t,n,s){return new k({element:e,key:t,args:n,property:s}).element}}(f||(f={}));const p=f,v=f.i18n,b=f.i18n_,S=f._i18n;function w(e,t){const n=e.slice(0,1);for(let s=1;s{const s=e&&t?"AutoDownloadSettings.LastDelimeter":"AutoDownloadSettings.Delimeter";return n?f.format(s,!0):v(s)}));return n?s.join(""):s}s.GO.I18n=f},1507:(e,t,n)=>{n.d(t,{BP:()=>h,DZ:()=>p,IA:()=>o,Iw:()=>l,J$:()=>m,NM:()=>s,OS:()=>u,Ox:()=>g,Pt:()=>d,Zi:()=>f,gZ:()=>c,hj:()=>i,rU:()=>a,yF:()=>r});const s=0,i=1271266957,o=777,r=777e3,a=2147483647,c="",l=20971520,d="",u=[7322096,16766590,13338331,9367192,16749490,16478047],h="default_static",g=4295032831,m=0,f=1,p=new Set([m,f]);Math.max(...Array.from(p))},3855:(e,t,n)=>{n.d(t,{Z:()=>se});var s=n(3512),i=n(7730),o=n(410),r=n(7487),a=n(6702),c=n(1722),l=n(2831),d=n(5418),u=n(993),h=n(7328),g=n(6663),m=n(9976),f=n(3731),p=n(6818),v=n(1174),b=n(2341),S=n(9030),w=n(2365),y=n(2820),P=n(5432),k=n(2131),E=n(554),A=n(393),_=n(5269),Z=n(4089),I=n(4762),C=n(5783),L=n(2045),T=n(8189);const O=Object.assign({CAN_USE_TRANSFERABLES:h.Z,IS_APPLE_MX:T.Z,IS_CALL_SUPPORTED:u.Z,IS_CANVAS_FILTER_SUPPORTED:g.Z,IS_EMOJI_SUPPORTED:m.Z,IS_GEOLOCATION_SUPPORTED:f.Z,IS_GROUP_CALL_SUPPORTED:p.Z,IS_MOV_SUPPORTED:S.Z,IS_PARALLAX_SUPPORTED:w.Z,IS_SCREEN_SHARING_SUPPORTED:y.Z,IS_TOUCH_SUPPORTED:P.Z,IS_VIBRATE_SUPPORTED:k.Z,IS_OPUS_SUPPORTED:C.Z,IS_SHARED_WORKER_SUPPORTED:L.Z,IS_WEBM_SUPPORTED:A.Z,IS_WEBP_SUPPORTED:_.Z,IS_WEBRTC_SUPPORTED:Z.Z,IMAGE_MIME_TYPES_SUPPORTED:v.Z,MEDIA_MIME_TYPES_SUPPORTED:b.Z,VIDEO_MIME_TYPES_SUPPORTED:E.Z},I);var M=n(4159),W=n(236),D=n(6009),R=n(8479),x=n(946),N=n(7922),U=n(5466),j=n(5003);const F=W.h.version,B=W.h.build,V=Object.keys(W.h),G=["contactsListCachedTime","stateCreatedTime","maxSeenMsgId","filtersArr"];function z(){return e=this,t=void 0,i=function*(){const e=(0,j.kg)("STATE-LOADER"),t=performance.now(),n=(0,U.$)(e),i=V.map((e=>n(N.Z.get(e),"state "+e))).concat(n(r.Z.get("user_auth"),"auth"),n(r.Z.get("state_id"),"auth"),n(r.Z.get("k_build"),"auth")).concat(n(N.Z.get("user_auth"),"old auth")),a=yield Promise.all(i);e.warn("promises",performance.now()-t);const c=[],l=(e,t)=>{d[e]=t,c.push(e)};let d={};for(let e=0,t=V.length;eN.Z.get(e))));e.push("user_auth"),t.push("number"==typeof u||"string"==typeof u?{dcID:t[0]||M.Z.baseDcId,date:Date.now()/1e3|0,id:u.toPeerId(!1)}:u);const n={};e.forEach(((e,s)=>{n[e]=t[s]})),yield r.Z.set(n)}u&&(d.authState={_:"authStateSignedIn"},s.Z.dispatchEvent("user_auth","number"==typeof u||"string"==typeof u?{dcID:0,date:Date.now()/1e3|0,id:u.toPeerId(!1)}:u));const f=new Set;if(d.stateId!==h){if(void 0!==h){const e=new Map([["authState",void 0],["stateId",void 0]]);e.forEach(((t,n)=>{e.set(n,(0,R.Z)(d[n]))})),d=(0,R.Z)(W.h),e.forEach(((e,t)=>{d[t]=e}));const t={chats:1,dialogs:1,users:1};for(const e in t)f.add(e);p=d,c.length=0,d=p,c.push(...Object.keys(d))}yield r.Z.set({state_id:d.stateId})}var p;const v=Date.now();if(d.stateCreatedTime+864e5{l(e,(0,R.Z)(W.h[e]))}))),!d.settings.hasOwnProperty("theme")&&d.settings.hasOwnProperty("nightTheme")&&(d.settings.theme=d.settings.nightTheme?"night":"day",l("settings",d.settings)),!d.settings.hasOwnProperty("themes")&&d.settings.background){d.settings.themes=(0,R.Z)(W.h.settings.themes);const e=d.settings.themes.find((e=>e.name===d.settings.theme));e&&(e.background=d.settings.background,l("settings",d.settings))}const b=d.settings.autoDownload;if(void 0!==(null==b?void 0:b.private)){const e=["contacts","private","groups","channels"];["photo","video","file"].forEach((t=>{const n=b[t]={};e.forEach((e=>{n[e]=b[e]}))})),e.forEach((e=>{delete b[e]})),l("settings",d.settings)}let S,w;if((0,x.Z)(W.h,d,(e=>{l(e,d[e])})),d.version!==F||d.build!==B){if(d.build<217&&(d.allDialogsLoaded=(0,R.Z)(W.h.allDialogsLoaded),d.pinnedOrders=(0,R.Z)(W.h.pinnedOrders),d.filtersArr=(0,R.Z)(W.h.filtersArr),f.add("dialogs")),-1===(0,D.Z)(d.version,"1.3.0")){let e=!1;d.settings.themes.forEach(((t,n,s)=>{if("day"===t.name&&"ByxGo2lrMFAIAAAAmkJxZabh8eM"===t.background.slug&&"image"===t.background.type||"night"===t.name&&"#0f0f0f"===t.background.color&&"color"===t.background.type){const i=W.h.settings.themes.find((e=>e.name===t.name));i&&(s[n]=(0,R.Z)(i),e=!0)}})),e&&l("settings",d.settings)}0!==(0,D.Z)(d.version,F)&&(S=F,w=d.version),l("version",F),l("build",B)}return g!==B&&(!g||g{var t,n;const{name:s,key:i,value:o}=e;if(!e.hasOwnProperty("key"))return void(this.mirrors[s]=o);const r=null!==(t=(n=this.mirrors)[s])&&void 0!==t?t:n[s]={};void 0===o?delete r[i]:r[i]=o},this.mirrors={},this.tabState={chatPeerIds:[],idleStartTime:0},this.log("constructor"),this.registerWorker(),this.registerServiceWorker(),this.registerCryptoWorker(),this.addMultipleEventsListeners({convertWebp:({fileName:e,bytes:t})=>i.Z.convert(e,t),convertOpus:({fileName:e,bytes:t})=>q.Z.pushDecodeTask(t,!1).then((e=>e.bytes)),event:({name:e,args:t})=>{s.Z.dispatchEventSingle(e,...t)},localStorageProxy:e=>{const t=e;return r.Z[t.type](...t.args)},mirror:this.onMirrorTask}),s.Z.addEventListener("language_change",(e=>{s.Z.managers.networkerFactory.setLanguage(e)})),window.addEventListener("online",(()=>{s.Z.managers.networkerFactory.forceReconnectTimeout()})),s.Z.addEventListener("logging_out",(()=>{Promise.all([(0,J.Z)(!1,!0),r.Z.clear(),Promise.race([l.default.setAuthorized(!1),(0,d.Z)(3e3)]),a.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map((e=>caches.delete(e))))]).finally((()=>{c.Z.reload()}))})),X.Z.addEventListener("change",(e=>{this.updateTabStateIdle(e)})),this.updateTabStateIdle(X.Z.isIdle),this.log("Passing environment:",O),this.invoke("environment",O)}pingServiceWorkerWithIframe(){if(this.pingServiceWorkerPromise)return this.pingServiceWorkerPromise;const e=this.pingServiceWorkerPromise=(0,Q.Z)(),t=document.createElement("iframe");t.hidden=!0;const n=()=>{setTimeout((()=>{this.pingServiceWorkerPromise=void 0}),1e4),clearTimeout(s),t.remove(),t.removeEventListener("load",n),t.removeEventListener("error",n),e.resolve()};t.addEventListener("load",n),t.addEventListener("error",n),t.src="ping/"+(4294967295*Math.random()|0),document.body.append(t);const s=window.setTimeout(n,1e3);return e}attachServiceWorker(e){this.lastServiceWorker&&this.serviceMessagePort.detachPort(this.lastServiceWorker),this.serviceMessagePort.attachSendPort(this.lastServiceWorker=e),this.serviceMessagePort.invokeVoid("hello",void 0)}_registerServiceWorker(){navigator.serviceWorker.register(new URL(n.p+n.u(670),n.b),{scope:"./"}).then((e=>{if(this.log("SW registered",e),e.active&&!navigator.serviceWorker.controller)return e.unregister().then((()=>{window.location.reload()}));(e.installing||e.waiting||e.active).addEventListener("statechange",(e=>{this.log("SW statechange",e)}));const t=navigator.serviceWorker.controller||e.installing||e.waiting||e.active;this.attachServiceWorker(t)}),(e=>{this.log.error("SW registration failed!",e),this.invokeVoid("serviceWorkerOnline",!1)}))}registerServiceWorker(){if(!("serviceWorker"in navigator))return;this.serviceMessagePort=new K.Z;const e=navigator.serviceWorker;this._registerServiceWorker(),e.addEventListener("controllerchange",(()=>{this.log.warn("controllerchange");const t=e.controller;this.attachServiceWorker(t),t.addEventListener("error",(e=>{this.log.error("controller error:",e)}))})),this.serviceMessagePort.attachListenPort(e),this.serviceMessagePort.addMultipleEventsListeners({port:(e,t,n)=>{this.invokeVoid("serviceWorkerPort",void 0,void 0,[n.ports[0]])},hello:(e,t)=>{this.serviceMessagePort.resendLockTask(t)}}),e.addEventListener("messageerror",(e=>{this.log.error("SW messageerror:",e)}))}registerCryptoWorker(){return ee(this,void 0,void 0,(function*(){const e={construct:(e,t)=>({url:t[0]+location.search})},t=[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean);t.forEach((t=>window[t.name]=new Proxy(t,e)));const s=new Worker(new URL(n.p+n.u(589),n.b),{type:void 0});t.forEach((e=>window[e.name]=e));const i=s.url,o=e=>new a(e,{type:"module"}),r=e=>this.attachWorkerToPort(e,Y.Z,"crypto"),a=L.Z?SharedWorker:Worker;Y.Z.addEventListener("port",((e,t,n)=>{this.invokeVoid("cryptoPort",void 0,void 0,[n.ports[0]])})),r(o(i));const c=yield(l=i,fetch(l).then((e=>e.text())).then((e=>{const t=location.pathname.split("/");return t[t.length-1]="",e=`\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${location.origin+t.join("/")}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${e}`,new Blob([e],{type:"application/javascript"})})));var l;(yield this.invoke("createProxyWorkerURLs",{originalUrl:i,blob:c})).slice(1).map(o).forEach(r)}))}registerWorker(){let e;e=L.Z?new SharedWorker(new URL(n.p+n.u(678),n.b),{type:void 0}):new Worker(new URL(n.p+n.u(678),n.b),{type:void 0}),this.onWorkerFirstMessage(e)}attachWorkerToPort(e,t,n){const s=e.port||e;t.attachPort(s),e.addEventListener("error",(e=>{this.log.error(n,"worker error",e)}))}onWorkerFirstMessage(e){this.log("set webWorker"),this.attachWorkerToPort(e,this,"mtproto")}loadState(){return Promise.all([(null!=$?$:$=z()).then((e=>(this.newVersion=e.newVersion,this.oldVersion=e.oldVersion,this.mirrors.state=e.state,e)))])}sendState(){return this.loadState().then((e=>{const[t]=e;return this.invoke("state",Object.assign(Object.assign({},t),{userId:s.Z.myId.toUserId()})),e}))}invokeCrypto(e,...t){return Y.Z.invokeCrypto(e,...t)}toggleStorages(e,t){return ee(this,void 0,void 0,(function*(){yield(0,J.Z)(e,t),this.invoke("toggleStorages",{enabled:e,clearWrite:t}),this.serviceMessagePort.invokeVoid("toggleStorages",{enabled:e,clearWrite:t})}))}getMirror(e){return ee(this,void 0,void 0,(function*(){return this.mirrors[e]}))}getState(){return this.getMirror("state")}updateTabState(e,t){this.tabState[e]=t,this.invokeVoid("tabState",this.tabState)}updateTabStateIdle(e){this.updateTabState("idleStartTime",e?Date.now():0)}}const ne=new te;o.GO.apiManagerProxy=ne;const se=ne},490:(e,t,n)=>{n.d(t,{Z:()=>p});var s=n(4159),i=n(410),o=n(2219),r=n(2045),a=n(3241),c=n(2586),l=n(5003),d=n(3512),u=n(7487),h=n(3855);const g=r.Z;class m extends a.Z{constructor(){super(!1),this.log=(0,l.kg)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),u.Z.delete("xt_instance"))},this.checkInstance=(e=c.Z.isIdle)=>{return t=this,n=void 0,o=function*(){if(this.deactivated)return;const t=Date.now(),n={id:this.instanceId,idle:e,time:t},[i,o=s.Z.build]=yield Promise.all([u.Z.get("xt_instance",!1),u.Z.get("k_build",!1)]);if(o>s.Z.build)return this.masterInstance=!1,d.Z.managers.networkerFactory.stopAll(),this.deactivateInstance("version"),void h.Z.toggleStorages(!1,!1);g?u.Z.set({xt_instance:n}):!e||!i||i.id===this.instanceId||i.timethis.deactivateInstance("tabs")),3e4)))},new((i=void 0)||(i=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function a(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,a)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o},this.log=(0,l.kg)("INSTANCE"),this.instanceId=o.Z}get deactivatedReason(){return this.deactivated}start(){if(this.reset(),!this.started){this.started=!0,c.Z.addEventListener("change",this.checkInstance),setInterval(this.checkInstance,5e3),this.checkInstance();try{document.documentElement.addEventListener("beforeunload",this.clearInstance)}catch(e){}}}reset(){this.masterInstance=!1,this.clearDeactivateTimeout(),this.deactivated=void 0}activateInstance(){this.deactivated&&(this.reset(),this.checkInstance(!1),this.dispatchEvent("activated"))}deactivateInstance(e){this.masterInstance||this.deactivated||(this.log.warn("deactivate",e),this.clearDeactivateTimeout(),this.deactivated=e,this.dispatchEvent("deactivated",e))}clearDeactivateTimeout(){this.deactivateTimeout&&(clearTimeout(this.deactivateTimeout),this.deactivateTimeout=0)}}const f=new m;i.GO&&(i.GO.singleInstance=f);const p=f},2831:(e,t,n)=>{n.r(t),n.d(t,{TelegramMeWebManager:()=>c,default:()=>d});var s=n(4159),i=n(410),o=n(1267),r=n(7298),a=n(7487);class c{constructor(){this.disabled=o.Z.test||!s.Z.domains.includes(location.hostname)}setAuthorized(e){if(!this.disabled)return a.Z.get("tgme_sync").then((t=>{const n=(0,r.Z)(!0);if(e&&(null==t?void 0:t.canRedirect)===e&&t.ts+86400>n)return;a.Z.set({tgme_sync:{canRedirect:e,ts:n}});const i=`_websync_?authed=${e?"1":"0"}&version=${encodeURIComponent(s.Z.version+" "+s.Z.suffix)}`,o=["//telegram.me/"+i,"//t.me/"+i].map((e=>function(e){const t=document.createElement("script"),n=new Promise((e=>{t.onload=t.onerror=()=>{e(t)}}));return t.src=e,document.body.appendChild(t),n}(e).then((e=>{e.remove()}))));return Promise.all(o)}))}}const l=new c;i.GO&&(i.GO.telegramMeWebManager=l);const d=l},6702:(e,t,n)=>{n.r(t),n.d(t,{WebPushApiManager:()=>h,default:()=>m});var s=n(410),i=n(5003),o=n(3855),r=n(2325),a=n(4762),c=n(1722),l=n(8479),d=n(490),u=n(3241);class h extends u.Z{constructor(){super(!1),this.isAvailable=!0,this.isPushEnabled=!1,this.localNotificationsAvailable=!0,this.started=!1,this.settings={},this.isFirefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,this.userVisibleOnly=!this.isFirefox,this.log=(0,i.kg)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then((e=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",e)})).catch((e=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",e),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))}))}))},this.isAliveNotify=()=>{if(!this.isAvailable||d.Z.deactivatedReason)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"");const e={},t={push_action_mute1d:a.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:a.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const n in t)e[n]=r.ZP.format(t[n],!0);o.Z.serviceMessagePort.invokeVoid("pushPing",{localNotifications:this.localNotificationsAvailable,lang:e,settings:this.settings}),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!!e,this.pushSubscriptionNotify("init",e)})).catch((e=>{this.log.error("Error during getSubscription()",e)}))}))}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!1,e&&(this.pushSubscriptionNotify("unsubscribe",e),setTimeout((()=>{e.unsubscribe().then((e=>{this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))}),3e3))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.log.warn("force unsubscribe",e),e&&e.unsubscribe().then((e=>{this.log.warn("force unsubscribe successful",e),this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}setSettings(e){this.settings=(0,l.Z)(e),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){this.isAvailable&&o.Z.serviceMessagePort.invokeVoid("notificationsClear",void 0)}setUpServiceWorkerChannel(){this.isAvailable&&(o.Z.serviceMessagePort.addEventListener("pushClick",(e=>{d.Z.deactivatedReason?c.Z.reload():this.dispatchEvent("push_notification_click",e)})),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(e,t){if(t){const n=t.toJSON();if(!(n&&n.endpoint&&n.keys&&n.keys.p256dh&&n.keys.auth))return this.log.warn("Invalid push subscription",n),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(e);this.log.warn("Push",e,n),this.dispatchEvent("push_"+e,{tokenType:10,tokenValue:JSON.stringify(n)})}else this.log.warn("Push",e,!1),this.dispatchEvent("push_"+e,!1)}}const g=new h;s.GO&&(s.GO.webPushApiManager=g);const m=g},9043:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(410),i=n(5783),o=n(4762),r=n(5003),a=n(3855),c=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function r(e){try{c(s.next(e))}catch(e){o(e)}}function a(e){try{c(s.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((s=s.apply(e,t||[])).next())}))};const l=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=(0,r.kg)("OPUS",r.v9.Error)}isPlaySupported(){return i.Z}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",(e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}})))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",(e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},o.IS_SAFARI?void 0:t.map((e=>e.buffer)))})))}setKeepAlive(e){this.keepAlive=e,this.keepAlive?(this.loadWorker(),this.loadWavWorker()):this.tasks.length||this.terminateWorkers()}onTaskEnd(e,t){t?(clearTimeout(e.timeout),e.callback.resolve({bytes:t,waveform:e.waveform})):e.callback.reject("timeout"),this.tasks.length&&this.executeNewTask(this.tasks[0]),this.terminateWorkers()}terminateWorkers(e=!1){(!this.keepAlive&&!this.tasks.length||e)&&(this.worker&&(this.worker.terminate(),this.worker=null),this.wavWorker&&(this.wavWorker.terminate(),this.wavWorker=null))}executeNewTask(e){this.worker.postMessage({command:"init",decoderSampleRate:this.sampleRate,outputBufferSampleRate:this.sampleRate}),this.wavWorker.postMessage({command:"init",wavBitDepth:16,wavSampleRate:this.sampleRate}),this.log("[DECODER] send decode"),this.worker.postMessage({command:"decode",pages:e.pages,waveform:e.withWaveform},o.IS_SAFARI?void 0:[e.pages.buffer]),e.timeout=window.setTimeout((()=>{this.log.error("decode timeout"),this.terminateWorkers(!0),this.tasks.length&&(this.loadWorker(),this.loadWavWorker()),this.onTaskEnd(this.tasks.shift())}),1e4)}pushDecodeTask(e,t){return new Promise(((n,s)=>{const i={pages:e,withWaveform:t,callback:{resolve:n,reject:s},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(i)&&this.executeNewTask(i)}))}decode(e,t=!1){return c(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then((e=>c(this,void 0,void 0,(function*(){const t=new Blob([e.bytes],{type:"audio/wav"});return{url:yield a.Z.invoke("createObjectURL",t),waveform:e.waveform}}))))}))}};s.GO.opusDecodeController=l;const d=l},2423:(e,t,n)=>{n.d(t,{$2:()=>l,E:()=>d,Hk:()=>h,QB:()=>u,SC:()=>g,bu:()=>c,it:()=>a,kO:()=>f,tY:()=>m});var s=n(1229);const i="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",o="["+i+"0-9]",r="((?:https?|ftp)://|mailto:)?",a=r+"(?:"+o+"{1,64}(?::"+o+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+o+"["+i+"·0-9-]{0,64}(?:\\."+o+"["+i+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+i+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",c=(new RegExp("^"+r.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),l=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+a+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#[0-9_a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),d=/^(([^<>()[\]\\.,;:\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,}))$/,u=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,h={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},g={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},m=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in g)m.add(g[e]);const f=/^\+\d+$/},3591:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(2423),i=n(410),o=n(6637);function r(e,t){(0,o.Z)(e)||(e="https://"+e);const n={url:e};let i,r,a,c;if(i=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);i[1]&&(t.pathname=i[1]+("/"===t.pathname?"":t.pathname));const n=t.pathname.slice(1),o=n.split("/");if(o[0]&&"$"===o[0][0]&&o[0].length>1)c="invoice";else if(/^\W/.test(n)&&!s.kO.test(n))c="joinchat";else switch(o[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==o.length&&!i[1]){c=o[0];break}default:if(o[1]&&o[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===o.length){c="im";break}}}else(r=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?c="im":(a=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(c="tg_"+a[1]);return window[c]||(c=void 0),n.onclick=c,n}i.GO&&(i.GO.wrapUrl=r)},3512:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(1507),i=n(3241),o=n(410),r=n(3206),a=n(1352);class c extends i.Z{constructor(){super(),this.myId=s.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),r.Z.getInstance().invokeVoid("event",{name:e,args:t})},a.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const l=new c;o.GO.rootScope=l;const d=l},7730:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(410),i=n(3725);const o=new class{constructor(){this.convertPromises={}}init(){this.worker=new Worker(new URL(n.p+n.u(61),n.b)),this.worker.addEventListener("message",(e=>{const t=e.data.payload,n=this.convertPromises[t.fileName];n&&(t.bytes?n.resolve(t.bytes):n.reject(),delete this.convertPromises[t.fileName])}))}postMessage(e){this.init&&(this.init(),this.init=null),this.worker.postMessage(e)}convert(e,t){if(this.convertPromises.hasOwnProperty(e))return this.convertPromises[e];const n=(0,i.Z)();return this.postMessage({type:"convertWebp",payload:{fileName:e,bytes:t}}),this.convertPromises[e]=n}};s.GO.webpWorkerController=o;const r=o}},d={};function u(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}};return l[e].call(n.exports,n,n.exports,u),n.exports}u.m=l,e=[],u.O=(t,n,s,i)=>{if(!n){var o=1/0;for(l=0;l=i)&&Object.keys(u.O).every((e=>u.O[e](n[a])))?n.splice(a--,1):(r=!1,i0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[n,s,i]},u.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return u.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,u.t=function(e,s){if(1&s&&(e=this(e)),8&s)return e;if("object"==typeof e&&e){if(4&s&&e.__esModule)return e;if(16&s&&"function"==typeof e.then)return e}var i=Object.create(null);u.r(i);var o={};t=t||[null,n({}),n([]),n(n)];for(var r=2&s&&e;"object"==typeof r&&!~t.indexOf(r);r=n(r))Object.getOwnPropertyNames(r).forEach((t=>o[t]=()=>e[t]));return o.default=()=>e,u.d(i,o),i},u.d=(e,t)=>{for(var n in t)u.o(t,n)&&!u.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},u.f={},u.e=e=>Promise.all(Object.keys(u.f).reduce(((t,n)=>(u.f[n](e,t),t)),[])),u.u=e=>(({589:"crypto.worker",630:"npm.qr-code-styling",670:"sw",678:"mtproto.worker"}[e]||e)+"."+{8:"47c82822a84234c722aa",53:"1619c547150ac620cdca",61:"b0e6e1510d2c80059b20",63:"8c6c3aa1f4320cc408dd",77:"66c57fc849b5ec07a136",104:"3793e2da2f88ac72ffd9",231:"2cf58745476f33d0c32c",301:"dc3c5a315285fe24ebd3",333:"d7addf177783fe16e44c",339:"0bedc53e7de2dd388b2b",392:"e76a95678644d519b180",436:"4f0c85770e373a7fe5e5",442:"7c9b38d200f56e7d3245",508:"c1aa5baee5227e17c016",567:"2a93821ac1dd3216f099",589:"7b5d9830f9811f2a50fe",630:"5c8af6e9c411419a66e1",641:"17ddd9c6d001de1e2dff",642:"e22e19b4ff8bd97e11a6",670:"241e2211cf9f9c1af243",678:"57e2ed0eb86ffb097616",709:"4571511ea17ae29dc294",774:"ff0771b7e79241db38a1",776:"f3c4c9ecb5dfb45387d4",781:"0e00df9eb08b8690c5dd",783:"a5ff7c878494d8a1624d",810:"6e1c8118d1a5deced189",813:"8ac136e59ed6ea591cfc"}[e]+".chunk.js"),u.miniCssF=e=>{},u.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),u.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s={},i="tweb:",u.l=(e,t,n,o)=>{if(s[e])s[e].push(t);else{var r,a;if(void 0!==n)for(var c=document.getElementsByTagName("script"),l=0;l{r.onerror=r.onload=null,clearTimeout(g);var i=s[e];if(delete s[e],r.parentNode&&r.parentNode.removeChild(r),i&&i.forEach((e=>e(n))),t)return t(n)},g=setTimeout(h.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=h.bind(null,r.onerror),r.onload=h.bind(null,r.onload),a&&document.head.appendChild(r)}},u.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;u.g.importScripts&&(e=u.g.location+"");var t=u.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),u.p=e})(),o=u.u,r=u.e,a=new Map,c=new Map,u.u=function(e){return o(e)+(a.has(e)?"?"+a.get(e):"")},u.e=function(e){return r(e).catch((function(t){var n=c.has(e)?c.get(e):999999;if(n<1){var s=o(e);throw t.message="Loading chunk "+e+" failed after 999999 retries.\n("+s+")",t.request=s,t}return new Promise((function(t){setTimeout((function(){var s=Date.now();a.set(e,s),c.set(e,n-1),t(u.e(e))}),3e3)}))}))},(()=>{u.b=document.baseURI||self.location.href;var e={179:0};u.f.j=(t,n)=>{var s=u.o(e,t)?e[t]:void 0;if(0!==s)if(s)n.push(s[2]);else{var i=new Promise(((n,i)=>s=e[t]=[n,i]));n.push(s[2]=i);var o=u.p+u.u(t),r=new Error;u.l(o,(n=>{if(u.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var i=n&&("load"===n.type?"missing":n.type),o=n&&n.target&&n.target.src;r.message="Loading chunk "+t+" failed.\n("+i+": "+o+")",r.name="ChunkLoadError",r.type=i,r.request=o,s[1](r)}}),"chunk-"+t,t)}},u.O.j=t=>0===e[t];var t=(t,n)=>{var s,i,[o,r,a]=n,c=0;if(o.some((t=>0!==e[t]))){for(s in r)u.o(r,s)&&(u.m[s]=r[s]);if(a)var l=a(u)}for(t&&t(n);cu(6873)));h=u.O(h)})(); +//# sourceMappingURL=main.6d6505bae2a8ce439316.bundle.js.map \ No newline at end of file diff --git a/public/main.6d6505bae2a8ce439316.bundle.js.map b/public/main.6d6505bae2a8ce439316.bundle.js.map new file mode 100644 index 00000000..37d6e7f5 --- /dev/null +++ b/public/main.6d6505bae2a8ce439316.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.6d6505bae2a8ce439316.bundle.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/config/state.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/environment/appleMx.ts","webpack://tweb/./src/environment/callSupport.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/canvasFilterSupport.ts","webpack://tweb/./src/environment/emojiSupport.ts","webpack://tweb/./src/environment/geolocationSupport.ts","webpack://tweb/./src/environment/groupCallSupport.ts","webpack://tweb/./src/environment/imageMimeTypesSupport.ts","webpack://tweb/./src/environment/mediaMimeTypesSupport.ts","webpack://tweb/./src/environment/movSupport.ts","webpack://tweb/./src/environment/opusSupport.ts","webpack://tweb/./src/environment/parallaxSupport.ts","webpack://tweb/./src/environment/screenSharingSupport.ts","webpack://tweb/./src/environment/sharedWorkerSupport.ts","webpack://tweb/./src/environment/touchSupport.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/vibrateSupport.ts","webpack://tweb/./src/environment/videoMimeTypesSupport.ts","webpack://tweb/./src/environment/webmSupport.ts","webpack://tweb/./src/environment/webpSupport.ts","webpack://tweb/./src/environment/webrtcSupport.ts","webpack://tweb/./src/helpers/color.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/helpers/dom/blurActiveElement.ts","webpack://tweb/./src/helpers/dom/cancelEvent.ts","webpack://tweb/./src/helpers/dom/findUpClassName.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInput.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack://tweb/./src/helpers/dom/loadFonts.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/string/parseUriParams.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.ts","webpack://tweb/./src/index.ts","webpack://tweb/./src/helpers/dom/toggleAttributePolyfill.ts","webpack://tweb/./src/lib/appManagers/appRuntimeManager.ts","webpack://tweb/./src/lib/appManagers/getProxiedManagers.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/environment/index.ts","webpack://tweb/./src/lib/appManagers/utils/state/loadState.ts","webpack://tweb/./src/lib/mtproto/mtprotoworker.ts","webpack://tweb/./src/lib/mtproto/singleInstance.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/helpers/dom/loadScript.ts","webpack://tweb/./src/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/webp/webpWorkerController.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/jsonp chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tweb:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppMediaPlaybackController} from '../components/appMediaPlaybackController';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport getTimeFormat from '../helpers/getTimeFormat';\nimport {nextRandomUint} from '../helpers/random';\nimport {AutoDownloadSettings, NotifyPeer, PeerNotifySettings} from '../layer';\nimport {TopPeerType, MyTopPeer} from '../lib/appManagers/appUsersManager';\nimport DialogsStorage from '../lib/storages/dialogs';\nimport FiltersStorage from '../lib/storages/filters';\nimport {AuthState} from '../types';\nimport App from './app';\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n contactsListCachedTime: number,\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n // filters?: FiltersStorage['filters'], // ! DEPRECATED\n filtersArr?: FiltersStorage['filtersArr'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n recentCustomEmoji: DocId[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\nconst BACKGROUND_DAY_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n};\n\nconst BACKGROUND_DAY_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 0,\n id: '1'\n};\n\nconst BACKGROUND_NIGHT_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n};\n\nconst BACKGROUND_NIGHT_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n intensity: 0,\n id: '-1'\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filtersArr: [],\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n recentCustomEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: IS_MOBILE ? BACKGROUND_DAY_MOBILE : BACKGROUND_DAY_DESKTOP\n }, {\n name: 'night',\n background: IS_MOBILE ? BACKGROUND_NIGHT_MOBILE : BACKGROUND_NIGHT_DESKTOP\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","let IS_APPLE_MX = false;\n\ntry {\n // Awesome detect from https://stackoverflow.com/a/65412357\n const ctx = document.createElement('canvas').getContext('webgl');\n const extension = ctx.getExtension('WEBGL_debug_renderer_info');\n const renderer: string = extension && ctx.getParameter(extension.UNMASKED_RENDERER_WEBGL) || '';\n if((renderer.match(/Apple/) && !renderer.match(/Apple GPU/)) ||\n ctx.getSupportedExtensions().indexOf('WEBGL_compressed_texture_s3tc_srgb') === -1) {\n IS_APPLE_MX = true;\n }\n} catch(err) {\n\n}\n\nexport default IS_APPLE_MX;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport default IS_CANVAS_FILTER_SUPPORTED;\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\n\nexport default IS_EMOJI_SUPPORTED;\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","import IS_WEBP_SUPPORTED from './webpSupport';\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","import IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","const audio = document.createElement('audio');\nconst IS_OPUS_SUPPORTED = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\n\nexport default IS_OPUS_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","import Modes from '../config/modes';\n\nconst IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined' && !Modes.noSharedWorker/* && false */;\n\nexport default IS_SHARED_WORKER_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\n// @ts-ignore\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\nexport default IS_TOUCH_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 ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\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;\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import IS_MOV_SUPPORTED from './movSupport';\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\nexport default IS_WEBM_SUPPORTED;\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","/*\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 ColorHsla = {\n h: number,\n s: number,\n l: number,\n a: number\n};\n\nexport type ColorRgba = [number, number, number, number];\nexport type ColorRgb = [number, number, number];\n\n/**\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\n */\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\n r /= 255, g /= 255, b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h: number, s: number;\n const l = (max + min) / 2;\n\n if(max === min) {\n h = s = 0; // achromatic\n } else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch(max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return {\n h: h * 360,\n s: s * 100,\n l: l * 100,\n a\n };\n}\n\n// * https://stackoverflow.com/a/9493060/6758968\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * @param {number} h The hue\n * @param {number} s The saturation\n * @param {number} l The lightness\n * @return {Array} The RGB representation\n */\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\n h /= 360, s /= 100, l /= 100;\n let r: number, g: number, b: number;\n\n if(s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q - p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\n}\n\nexport function hslaStringToRgba(hsla: string) {\n const splitted = hsla.slice(5, -1).split(', ');\n const alpha = +splitted.pop();\n const arr = splitted.map((val) => {\n if(val.endsWith('%')) {\n return +val.slice(0, -1);\n }\n\n return +val;\n });\n\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\n}\n\nexport function hexaToRgba(hexa: string) {\n const arr: ColorRgba = [] as any;\n const offset = hexa[0] === '#' ? 1 : 0;\n if(hexa.length === (5 + offset)) {\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\n }\n\n if(hexa.length === (3 + offset)) {\n for(let i = offset; i < hexa.length; ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n } else if(hexa.length === (4 + offset)) {\n for(let i = offset; i < (hexa.length - 1); ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n\n arr.push(parseInt(hexa[hexa.length - 1], 16));\n } else {\n for(let i = offset; i < hexa.length; i += 2) {\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\n }\n }\n\n return arr;\n}\n\nexport function hexToRgb(hex: string) {\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\n}\n\nexport function hexaToHsla(hexa: string) {\n const rgba = hexaToRgba(hexa);\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\n}\n\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\n}\n\nexport function hslaStringToHexa(hsla: string) {\n return rgbaToHexa(hslaStringToRgba(hsla));\n}\n\nexport function hslaStringToHex(hsla: string) {\n return hslaStringToHexa(hsla).slice(0, -2);\n}\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 default function blurActiveElement() {\n if((document.activeElement as HTMLInputElement)?.blur) {\n (document.activeElement as HTMLInputElement).blur();\n return true;\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function cancelEvent(event: Event) {\n event = event || window.event;\n if(event) {\n // @ts-ignore\n event = event.originalEvent || event;\n\n try {\n if(event.stopPropagation) event.stopPropagation();\n if(event.preventDefault) event.preventDefault();\n event.returnValue = false;\n event.cancelBubble = true;\n } catch(err) {}\n }\n\n return false;\n}\n","/*\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// export function findUpClassName(el: any, className: string): T;\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\n return (el as any).closest('.' + className);\n /* if(el.classList.contains(className)) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.classList.contains(className))\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../schedulers';\n\nexport default function fixSafariStickyInput(input: HTMLElement) {\n input.style.transform = 'translateY(-99999px)';\n /* input.style.position = 'fixed';\n input.style.top = '-99999px';\n input.style.left = '0'; */\n input.focus();\n\n // setTimeout(() => {\n doubleRaf().then(() => {\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n /* input.style.position = '';\n input.style.top = ''; */\n input.style.transform = '';\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n\n /* setTimeout(() => {\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\n }, 50); */\n });\n // }, 0);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 const 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","/*\n * 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 '../noop';\nimport pause from '../schedulers/pause';\n\nconst texts = ['b', 'б'];\ntype FontType = 'text' | 'icons' | 'monospace';\n\nconst cache: {\n [key: string]: {\n [text: string]: Promise\n }\n} = {};\n\nconst fonts: {[type in FontType]: string} = {\n text: 'Roboto',\n icons: 'tgico',\n monospace: 'Roboto Mono'\n};\n\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\n text: texts,\n icons: undefined,\n monospace: texts\n}): Promise {\n if(!('fonts' in document)) {\n return Promise.resolve();\n }\n\n const promises: Promise[] = [];\n for(const type in types) {\n let _texts = types[type as FontType];\n if(_texts === 'all') {\n _texts = texts;\n }\n\n const font = fonts[type as FontType];\n const weights = type === 'icons' ? [500] : [400, 500];\n for(const weight of weights) {\n const _promises = (_texts || [undefined]).map((text) => {\n const key = [weight, '1rem', font].join(' ');\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\n return promise;\n });\n promises.push(..._promises);\n }\n }\n\n return Promise.race([\n Promise.all(promises).catch(noop),\n pause(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 IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport EventListenerBase from './eventListenerBase';\n\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\nconst DO_NOT_IDLE = false;\n\nexport class IdleController extends EventListenerBase<{\n change: (idle: boolean) => void\n}> {\n private _isIdle: boolean;\n\n private focusPromise: Promise;\n private focusResolve: () => void;\n\n constructor() {\n super();\n\n this._isIdle = true;\n this.focusPromise = Promise.resolve();\n this.focusResolve = () => {};\n\n window.addEventListener('blur', () => {\n this.isIdle = true;\n\n window.addEventListener('focus', () => {\n this.isIdle = false;\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.isIdle = false;\n }, {once: true, passive: true});\n\n this.addEventListener('change', (idle) => {\n if(idle) {\n this.focusPromise = new Promise((resolve) => {\n this.focusResolve = resolve;\n });\n } else {\n this.focusResolve();\n }\n });\n }\n\n public getFocusPromise() {\n return this.focusPromise;\n }\n\n public get isIdle() {\n return this._isIdle;\n }\n\n public set isIdle(value: boolean) {\n if(this._isIdle === value) {\n return;\n }\n\n if(DO_NOT_IDLE && value) {\n return;\n }\n\n this._isIdle = value;\n this.dispatchEvent('change', value);\n }\n}\n\nconst idleController = new IdleController();\nexport default idleController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from './eventListenerBase';\n\nexport class OverlayCounter extends EventListenerBase<{\n change: (isActive: boolean) => void\n}> {\n public overlaysActive = 0;\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('change', this.isOverlayActive);\n }\n}\n\nconst overlayCounter = new OverlayCounter();\nexport default overlayCounter;\n","/*\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// * Jolly Cobra's schedulers\nimport {NoneToVoidFunction} from '../types';\n\n/*\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n} */\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nexport function fastRaf(callback: NoneToVoidFunction) {\n if(!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\nexport function fastRafConventional(callback: NoneToVoidFunction) {\n if(!fastRafConventionalCallbacks) {\n fastRafConventionalCallbacks = [callback];\n\n requestAnimationFrame(() => {\n processing = true;\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\n fastRafConventionalCallbacks[i]();\n }\n\n fastRafConventionalCallbacks = undefined;\n processing = false;\n });\n } else if(processing) {\n callback();\n } else {\n fastRafConventionalCallbacks.push(callback);\n }\n}\n\nlet rafPromise: Promise;\nexport function fastRafPromise() {\n if(rafPromise) return rafPromise;\n\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\n rafPromise.then(() => {\n rafPromise = undefined;\n });\n\n return rafPromise;\n}\n\nexport function doubleRaf() {\n return new Promise((resolve) => {\n fastRaf(() => {\n fastRaf(resolve);\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 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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Theme} from '../config/state';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport {hslaStringToHex} from './color';\n\nexport class ThemeController {\n private themeColor: string;\n private _themeColorElem: Element;\n private systemTheme: Theme['name'];\n\n constructor() {\n rootScope.addEventListener('theme_change', () => {\n this.setTheme();\n });\n\n // rootScope.addEventListener('settings_updated', ())\n }\n\n private get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n // const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n // const newTheme = this.getTheme();\n\n if(rootScope.myId) {\n rootScope.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = themeController.getTheme();\n if(theme.background.highlightningColor) {\n hsla = theme.background.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n themeController.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n\n this.applyHighlightningColor();\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = rootScope.settings.theme === 'system' ? this.systemTheme : rootScope.settings.theme) {\n return rootScope.settings.themes.find((t) => t.name === name);\n }\n}\n\nconst themeController = new ThemeController();\nexport default themeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setWorkerProxy() {\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n let url = args[0] + '';\n if(url.indexOf('blob:') !== 0) {\n url += location.search;\n }\n\n return new target(url);\n }\n };\n\n [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean).forEach((w) => {\n window[w.name as any] = new Proxy(w, workerHandler);\n });\n}\n\nsetWorkerProxy();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport cancelEvent from './helpers/dom/cancelEvent';\nimport {IS_STICKY_INPUT_BUGGED} from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport {IS_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport pause from './helpers/schedulers/pause';\nimport setWorkerProxy from './helpers/setWorkerProxy';\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\nimport rootScope from './lib/rootScope';\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\nimport apiManagerProxy from './lib/mtproto/mtprotoworker';\nimport getProxiedManagers from './lib/appManagers/getProxiedManagers';\nimport themeController from './helpers/themeController';\nimport overlayCounter from './helpers/overlayCounter';\nimport singleInstance from './lib/mtproto/singleInstance';\nimport parseUriParams from './helpers/string/parseUriParams';\nimport Modes from './config/modes';\nimport {AuthState} from './types';\n// import appNavigationController from './components/appNavigationController';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\n\n // polyfill for replaceChildren\n if((Node as any).prototype.replaceChildren === undefined) {\n (Node as any).prototype.replaceChildren = function(...nodes: any[]) {\n this.textContent = '';\n // while(this.lastChild) {\n // this.removeChild(this.lastChild);\n // }\n if(nodes) {\n this.append(...nodes);\n }\n }\n }\n\n rootScope.managers = getProxiedManagers();\n\n const manifest = document.getElementById('manifest') as HTMLLinkElement;\n manifest.href = `site${IS_APPLE && !IS_APPLE_MOBILE ? '_apple' : ''}.webmanifest?v=jw3mK7G9Aq`;\n\n singleInstance.start();\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n const vh = (setViewportVH && !overlayCounter.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n // const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n // console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n setWorkerProxy;\n\n // const [_, touchSupport, userAgent, _rootScope, _appStateManager, _I18n, __/* , ___ */] = await Promise.all([\n // import('./lib/polyfill'),\n // import('./environment/touchSupport'),\n // import('./environment/userAgent'),\n // import('./lib/rootScope'),\n // import('./lib/appManagers/appStateManager'),\n // import('./lib/langPack'),\n // import('./helpers/peerIdPolyfill'),\n // // import('./helpers/cacheFunctionPolyfill')\n // ]);\n\n /* const {IS_TOUCH_SUPPORTED} = touchSupport;\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\n const rootScope = _rootScope.default;\n const appStateManager = _appStateManager.default;\n const I18n = _I18n.default; */\n\n window.addEventListener('resize', setVH);\n setVH();\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !overlayCounter.isOverlayActive;\n setVH();\n\n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n\n let tabId: number;\n (window as any).onImTabChange = (id: number) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n };\n\n overlayCounter.addEventListener('change', () => {\n toggleResizeMode();\n });\n }\n\n if(IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n if(IS_EMOJI_SUPPORTED) {\n document.documentElement.classList.add('native-emoji');\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === 'IMG') {\n e.preventDefault();\n return false;\n }\n });\n\n // restrict contextmenu on images (e.g. webp stickers)\n document.addEventListener('contextmenu', (e) => {\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\n cancelEvent(e);\n }\n });\n\n if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\n }\n\n if(IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(IS_APPLE) {\n if(IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n\n // document.documentElement.classList.add('emoji-supported');\n\n if(IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n const perf = performance.now();\n\n // await pause(1000000);\n\n const langPromise = I18n.getCacheLangPack();\n\n const [stateResult, langPack] = await Promise.all([\n // loadState(),\n apiManagerProxy.sendState().then(([stateResult]) => stateResult),\n langPromise\n ]);\n I18n.setTimeFormat(stateResult.state.settings.timeFormat);\n\n rootScope.managers.rootScope.getPremium().then((isPremium) => {\n rootScope.premium = isPremium;\n });\n\n themeController.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n let authState = stateResult.state.authState;\n\n const hash = location.hash;\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n if(params.tgWebAuthToken && authState._ !== 'authStateSignedIn') {\n const data: AuthState.signImport['data'] = {\n token: params.tgWebAuthToken,\n dcId: +params.tgWebAuthDcId,\n userId: params.tgWebAuthUserId.toUserId(),\n isTest: params.tgWebAuthTest !== undefined && !!+params.tgWebAuthTest,\n tgAddr: params.tgaddr\n };\n\n if(data.isTest !== Modes.test) {\n const urlSearchParams = new URLSearchParams(location.search);\n if(+params.tgWebAuthTest) {\n urlSearchParams.set('test', '1');\n } else {\n urlSearchParams.delete('test');\n }\n\n location.search = urlSearchParams.toString();\n return;\n }\n\n rootScope.managers.appStateManager.pushToState('authState', authState = {_: 'authStateSignImport', data});\n\n // appNavigationController.overrideHash('?tgaddr=' + encodeURIComponent(params.tgaddr));\n }\n\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 case 'authStateSignImport':\n pagePromise = (await import('./pages/pageSignImport')).default.mount(authState.data);\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\": \"\",\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\": \"\",\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport class AppRuntimeManager {\n public reload() {\n try {\n location.reload();\n } catch(e) {};\n\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\n // chrome.runtime.reload();\n // }\n }\n\n public close() {\n try {\n window.close();\n } catch(e) {}\n }\n\n /**\n * Better to call from event\n */\n public focus() {\n // // @ts-ignore\n // if(window.navigator.mozApps && document.hidden) {\n // // Get app instance and launch it to bring app to foreground\n // // @ts-ignore\n // window.navigator.mozApps.getSelf().onsuccess = function() {\n // this.result.launch();\n // };\n // } else {\n // // @ts-ignore\n // if(window.chrome && chrome.app && chrome.app.window) {\n // // @ts-ignore\n // chrome.app.window.current().focus();\n // }\n\n window.focus();\n // }\n }\n}\n\nconst appRuntimeManager = new AppRuntimeManager();\nexport default appRuntimeManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type createManagers from './createManagers';\nimport {ModifyFunctionsToAsync} from '../../types';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport noop from '../../helpers/noop';\nimport dT from '../../helpers/dT';\nimport DEBUG from '../../config/debug';\n\n// let stats: {\n// [manager: string]: {\n// [method: string]: {\n// times: number[],\n// byArgs: {\n// [args: string]: number[]\n// }\n// }\n// }\n// } = {};\n\n// let sentCount = 0;\n// let sentMethods: {[key: string]: number} = {};\n// let sentMethods2: {[key: string]: number} = {};\n// function collectStats(manager: string, method: string, args: any[], promise: Promise) {\n// ++sentCount;\n\n// const key = [manager, method].join('-');\n// if(!sentMethods[key]) sentMethods[key] = 0;\n// ++sentMethods[key];\n\n// const key2 = [('00000' + sentCount).slice(-5), key].join('-');\n\n// let byManager = stats[manager] ??= {};\n// let byMethod = byManager[method] ??= {times: [], byArgs: {}};\n\n// const perf = performance.now();\n// promise.catch(noop).finally(() => {\n// const time = performance.now() - perf;\n// byMethod.times.push(time);\n\n// sentMethods2[key2] = time;\n\n// try {\n// const argsString = JSON.stringify(args);\n// byMethod.byArgs[argsString].push(time);\n// } catch(err) {}\n// });\n// }\n\n// setInterval(() => {\n// // console.log(dT(), '[PROXY] stats', stats, sentCount, sentMethods, sentMethods2);\n// sentCount = 0;\n// sentMethods = {};\n// sentMethods2 = {};\n// }, 2000);\n\nconst DEBUG_MANAGER_REQUESTS: {[managerName: string]: Set} = {};\nif(DEBUG) {\n (window as any).DEBUG_MANAGER_REQUESTS = DEBUG_MANAGER_REQUESTS;\n}\n\nfunction createProxy(/* source: T, */name: string, ack?: boolean) {\n const proxy = new Proxy({}, {\n get: (target, p, receiver) => {\n // console.log('get', target, p, receiver);\n // @ts-ignore\n // const value = source[p];\n // if(typeof(value) !== 'function') {\n // return value;\n // }\n\n return (...args: any[]) => {\n const promise = apiManagerProxy.invoke('manager', {\n name,\n method: p as string,\n args\n }, ack as any);\n\n if(DEBUG) {\n if(DEBUG_MANAGER_REQUESTS[name]?.has(p as any)) {\n console.warn('manager request', name, p, args);\n }\n }\n\n // collectStats(name, p as string, args, promise);\n\n return promise;\n\n // @ts-ignore\n // return Promise.resolve(value.call(source, ...args));\n };\n }\n });\n\n return proxy;\n}\n\ntype AA = {\n [key in keyof T]: T[key] extends (...args: infer A) => infer R ? (...args: A) => Promise>> : never\n};\n\ntype T = Awaited>;\ntype ProxiedManagers = {\n [name in keyof T]?: ModifyFunctionsToAsync;\n} & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n};\n\nfunction createProxyProxy(proxied: any, ack?: boolean) {\n return new Proxy(proxied, {\n get: (target, p, receiver) => {\n // @ts-ignore\n return target[p] ??= createProxy(p as string, ack);\n }\n });\n}\n\nlet proxied: ProxiedManagers;\nexport default function getProxiedManagers() {\n if(proxied) {\n return proxied;\n }\n\n proxied = createProxyProxy({}, false);\n proxied.acknowledged = createProxyProxy({}, true);\n return proxied;\n}\n","/*\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 {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n '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 export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\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\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\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 }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\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 const 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 return 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 const 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","import IS_CALL_SUPPORTED from './callSupport';\nimport CAN_USE_TRANSFERABLES from './canUseTransferables';\nimport IS_CANVAS_FILTER_SUPPORTED from './canvasFilterSupport';\nimport IS_EMOJI_SUPPORTED from './emojiSupport';\nimport IS_GEOLOCATION_SUPPORTED from './geolocationSupport';\nimport IS_GROUP_CALL_SUPPORTED from './groupCallSupport';\nimport IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport MEDIA_MIME_TYPES_SUPPORTED from './mediaMimeTypesSupport';\nimport IS_MOV_SUPPORTED from './movSupport';\nimport IS_PARALLAX_SUPPORTED from './parallaxSupport';\nimport IS_SCREEN_SHARING_SUPPORTED from './screenSharingSupport';\nimport IS_TOUCH_SUPPORTED from './touchSupport';\nimport IS_VIBRATE_SUPPORTED from './vibrateSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\nimport IS_WEBM_SUPPORTED from './webmSupport';\nimport IS_WEBP_SUPPORTED from './webpSupport';\nimport IS_WEBRTC_SUPPORTED from './webrtcSupport';\nimport * as userAgent from './userAgent';\nimport IS_OPUS_SUPPORTED from './opusSupport';\nimport IS_SHARED_WORKER_SUPPORTED from './sharedWorkerSupport';\nimport IS_APPLE_MX from './appleMx';\n\nconst ENVIRONMENT = {\n CAN_USE_TRANSFERABLES,\n IS_APPLE_MX,\n IS_CALL_SUPPORTED,\n IS_CANVAS_FILTER_SUPPORTED,\n IS_EMOJI_SUPPORTED,\n IS_GEOLOCATION_SUPPORTED,\n IS_GROUP_CALL_SUPPORTED,\n IS_MOV_SUPPORTED,\n IS_PARALLAX_SUPPORTED,\n IS_SCREEN_SHARING_SUPPORTED,\n IS_TOUCH_SUPPORTED,\n IS_VIBRATE_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_SHARED_WORKER_SUPPORTED,\n IS_WEBM_SUPPORTED,\n IS_WEBP_SUPPORTED,\n IS_WEBRTC_SUPPORTED,\n IMAGE_MIME_TYPES_SUPPORTED,\n MEDIA_MIME_TYPES_SUPPORTED,\n VIDEO_MIME_TYPES_SUPPORTED,\n ...userAgent\n};\n\nexport default ENVIRONMENT;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../../config/app';\nimport DEBUG from '../../../../config/debug';\nimport {AutoDownloadPeerTypeSettings, State, STATE_INIT} from '../../../../config/state';\nimport compareVersion from '../../../../helpers/compareVersion';\nimport copy from '../../../../helpers/object/copy';\nimport validateInitObject from '../../../../helpers/object/validateInitObject';\nimport {UserAuth} from '../../../mtproto/mtproto_config';\nimport rootScope from '../../../rootScope';\nimport stateStorage from '../../../stateStorage';\nimport sessionStorage from '../../../sessionStorage';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\n// import RESET_STORAGES_PROMISE from \"../storages/resetStoragesPromise\";\nimport {StoragesResults} from '../storages/loadStorages';\nimport {logger} from '../../../logger';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n// const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\n\nconst STATE_VERSION = STATE_INIT.version;\nconst BUILD = STATE_INIT.build;\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS: Array = [\n 'contactsListCachedTime',\n 'stateCreatedTime',\n 'maxSeenMsgId',\n 'filtersArr'\n];\n\n// const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nasync function loadStateInner() {\n const log = logger('STATE-LOADER');\n\n const totalPerf = performance.now();\n const recordPromise = recordPromiseBound(log);\n\n const promises = ALL_KEYS.map((key) => recordPromise(stateStorage.get(key), 'state ' + key))\n .concat(\n recordPromise(sessionStorage.get('user_auth'), 'auth'),\n recordPromise(sessionStorage.get('state_id'), 'auth'),\n recordPromise(sessionStorage.get('k_build'), 'auth')\n )\n .concat(recordPromise(stateStorage.get('user_auth'), 'old auth')); // support old webk format\n\n const arr = await Promise.all(promises);\n log.warn('promises', performance.now() - totalPerf);\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n\n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n\n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n // const pushed: {key: keyof State, value: State[keyof State]}[] = [];\n const pushedKeys: (keyof State)[] = [];\n const pushToState = (key: T, value: State[T]) => {\n // appStateManager.pushToState(key, value);\n state[key] = value;\n // pushed.push({key, value});\n pushedKeys.push(key);\n };\n\n const replaceState = (_state: State) => {\n // pushed.length = 0;\n pushedKeys.length = 0;\n state = _state;\n pushedKeys.push(...Object.keys(state) as any as typeof pushedKeys);\n // state = appStateManager.setState(_state);\n // appStateManager.storage.set(state);\n };\n\n // let state: State = appStateManager.setState({} as any);\n let state: State = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const sessionBuild = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map((key) => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n const obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n\n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ?\n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} :\n auth); // * support old version\n }\n\n const resetStorages: Set = new Set();\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n\n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n\n state = copy(STATE_INIT);\n\n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n const r: {[k in keyof StoragesResults]: number} = {\n chats: 1,\n dialogs: 1,\n users: 1\n };\n for(const key in r) {\n resetStorages.add(key as keyof StoragesResults);\n // this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n replaceState(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach((key) => {\n pushToState(key, copy(STATE_INIT[key]));\n\n // const s = appStateManager.storagesResults[key as keyof AppStateManager['storagesResults']];\n // if(s?.length) {\n // appStateManager.resetStorages.add(key as keyof AppStateManager['storagesResults']);\n // s.length = 0;\n // }\n });\n };\n\n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n\n // state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find((t) => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n pushToState('settings', state.settings);\n }\n }\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const,\n 'private' as const,\n 'groups' as const,\n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n });\n\n let newVersion: string, oldVersion: string;\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(/* compareVersion(state.version, '0.8.7') === -1 || state.build < 179 || */state.build < 217) {\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n state.pinnedOrders = copy(STATE_INIT.pinnedOrders);\n state.filtersArr = copy(STATE_INIT.filtersArr);\n\n resetStorages.add('dialogs');\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' &&\n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' &&\n theme.background.type === 'image'\n ) || (\n theme.name === 'night' &&\n theme.background.color === '#0f0f0f' &&\n theme.background.type === 'color'\n )) {\n const newTheme = STATE_INIT.settings.themes.find((newTheme) => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n pushToState('settings', state.settings);\n }\n }\n\n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n newVersion = STATE_VERSION;\n oldVersion = state.version;\n }\n\n pushToState('version', STATE_VERSION);\n pushToState('build', BUILD);\n }\n\n if(sessionBuild !== BUILD && (!sessionBuild || sessionBuild < BUILD)) {\n sessionStorage.set({k_build: BUILD});\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n log('state res', state, copy(state));\n }\n\n // return resolve();\n\n log.warn('total', performance.now() - totalPerf);\n\n // RESET_STORAGES_PROMISE.resolve(appStateManager.resetStorages);\n\n return {state, resetStorages, newVersion, oldVersion, pushedKeys};\n}\n\nlet promise: ReturnType;\nexport default function loadState() {\n return promise ??= loadStateInner();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Awaited} from '../../types';\nimport type {CacheStorageDbName} from '../files/cacheStorage';\nimport type {State} from '../../config/state';\nimport type {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport {CryptoMethods} from '../crypto/crypto_methods';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport pause from '../../helpers/schedulers/pause';\nimport ENVIRONMENT from '../../environment';\nimport loadState from '../appManagers/utils/state/loadState';\nimport opusDecodeController from '../opusDecodeController';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport SuperMessagePort from './superMessagePort';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport idleController from '../../helpers/idleController';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport App from '../../config/app';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\n\nexport type Mirrors = {\n state: State\n};\n\nexport type MirrorTaskPayload = {\n name: T,\n key?: K,\n value: any\n};\n\nexport type NotificationBuildTaskPayload = {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n};\n\nexport type TabState = {\n chatPeerIds: PeerId[],\n idleStartTime: number,\n};\n\nclass ApiManagerProxy extends MTProtoMessagePort {\n // private worker: /* Window */Worker;\n // private sockets: Map = new Map();\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n public serviceMessagePort: ServiceMessagePort;\n private lastServiceWorker: ServiceWorker;\n\n private pingServiceWorkerPromise: CancellablePromise;\n\n constructor() {\n super();\n\n this.mirrors = {} as any;\n this.tabState = {\n chatPeerIds: [],\n idleStartTime: 0\n };\n\n this.log('constructor');\n\n \n this.registerWorker();\n \n\n this.registerServiceWorker();\n this.registerCryptoWorker();\n\n // const perf = performance.now();\n this.addMultipleEventsListeners({\n convertWebp: ({fileName, bytes}) => {\n return webpWorkerController.convert(fileName, bytes);\n },\n\n convertOpus: ({fileName, bytes}) => {\n return opusDecodeController.pushDecodeTask(bytes, false).then((result) => result.bytes);\n },\n\n event: ({name, args}) => {\n // @ts-ignore\n rootScope.dispatchEventSingle(name, ...args);\n },\n\n localStorageProxy: (payload) => {\n const storageTask = payload;\n return (sessionStorage[storageTask.type] as any)(...storageTask.args);\n },\n\n mirror: this.onMirrorTask\n\n // hello: () => {\n // this.log.error('time hello', performance.now() - perf);\n // }\n });\n\n // this.addTaskListener('socketProxy', (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n // //console.log('socketProxy', socketTask, id);\n\n // if(socketTask.type === 'send') {\n // const socket = this.sockets.get(id);\n // socket.send(socketTask.payload);\n // } else if(socketTask.type === 'close') { // will remove from map in onClose\n // const socket = this.sockets.get(id);\n // socket.close();\n // } else if(socketTask.type === 'setup') {\n // const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n\n // const onOpen = () => {\n // //console.log('socketProxy onOpen');\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'open',\n // id\n // }\n // });\n // };\n // const onClose = () => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'close',\n // id\n // }\n // });\n\n // socket.removeEventListener('open', onOpen);\n // socket.removeEventListener('close', onClose);\n // socket.removeEventListener('message', onMessage);\n // this.sockets.delete(id);\n // };\n // const onMessage = (buffer: ArrayBuffer) => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'message',\n // id,\n // payload: buffer\n // }\n // });\n // };\n\n // socket.addEventListener('open', onOpen);\n // socket.addEventListener('close', onClose);\n // socket.addEventListener('message', onMessage);\n // this.sockets.set(id, socket);\n // }\n // });\n\n rootScope.addEventListener('language_change', (language) => {\n rootScope.managers.networkerFactory.setLanguage(language);\n });\n\n window.addEventListener('online', () => {\n rootScope.managers.networkerFactory.forceReconnectTimeout();\n });\n\n rootScope.addEventListener('logging_out', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n toggleStorages(false, true),\n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map((cacheName) => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n idleController.addEventListener('change', (idle) => {\n this.updateTabStateIdle(idle);\n });\n this.updateTabStateIdle(idleController.isIdle);\n\n this.log('Passing environment:', ENVIRONMENT);\n this.invoke('environment', ENVIRONMENT);\n // this.sendState();\n }\n\n public pingServiceWorkerWithIframe() {\n if(this.pingServiceWorkerPromise) {\n return this.pingServiceWorkerPromise;\n }\n\n const promise = this.pingServiceWorkerPromise = deferredPromise();\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n const onLoad = () => {\n setTimeout(() => { // ping once in 10 seconds\n this.pingServiceWorkerPromise = undefined;\n }, 10e3);\n\n clearTimeout(timeout);\n iframe.remove();\n iframe.removeEventListener('load', onLoad);\n iframe.removeEventListener('error', onLoad);\n promise.resolve();\n };\n iframe.addEventListener('load', onLoad);\n iframe.addEventListener('error', onLoad);\n iframe.src = 'ping/' + (Math.random() * 0xFFFFFFFF | 0);\n document.body.append(iframe);\n\n const timeout = window.setTimeout(onLoad, 1e3);\n return promise;\n }\n\n private attachServiceWorker(serviceWorker: ServiceWorker) {\n this.lastServiceWorker && this.serviceMessagePort.detachPort(this.lastServiceWorker);\n this.serviceMessagePort.attachSendPort(this.lastServiceWorker = serviceWorker);\n this.serviceMessagePort.invokeVoid('hello', undefined);\n }\n\n private _registerServiceWorker() {\n navigator.serviceWorker.register(\n /* webpackChunkName: \"sw\" */\n new URL('../serviceWorker/index.service', import.meta.url),\n {scope: './'}\n ).then((registration) => {\n this.log('SW registered', registration);\n\n // ! doubtful fix for hard refresh\n if(registration.active && !navigator.serviceWorker.controller) {\n return registration.unregister().then(() => {\n window.location.reload();\n });\n }\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n const controller = navigator.serviceWorker.controller || registration.installing || registration.waiting || registration.active;\n this.attachServiceWorker(controller);\n\n \n \n \n }, (err) => {\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n\n this.serviceMessagePort = new ServiceMessagePort();\n\n // this.addMultipleEventsListeners({\n // hello: () => {\n // // this.serviceMessagePort.invokeVoid('port', undefined);\n // }\n // });\n\n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWorker will do it.\n const worker = navigator.serviceWorker;\n this._registerServiceWorker();\n\n // worker.startMessages();\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n const controller = worker.controller;\n this.attachServiceWorker(controller);\n\n controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n this.serviceMessagePort.attachListenPort(worker);\n this.serviceMessagePort.addMultipleEventsListeners({\n port: (payload, source, event) => {\n this.invokeVoid('serviceWorkerPort', undefined, undefined, [event.ports[0]]);\n },\n\n hello: (payload, source) => {\n this.serviceMessagePort.resendLockTask(source);\n }\n });\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private async registerCryptoWorker() {\n const get = (url: string) => {\n return fetch(url).then((response) => response.text()).then((text) => {\n const pathnameSplitted = location.pathname.split('/');\n pathnameSplitted[pathnameSplitted.length - 1] = '';\n const pre = location.origin + pathnameSplitted.join('/');\n text = `\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${pre}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${text}`;\n const blob = new Blob([text], {type: 'application/javascript'});\n return blob;\n });\n };\n\n const workerHandler = {\n construct(target: any, args: any): any {\n const url = args[0] + location.search;\n return {url};\n }\n };\n\n const originals = [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean);\n originals.forEach((w) => window[w.name as any] = new Proxy(w, workerHandler));\n\n const worker: SharedWorker | Worker = new Worker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n\n originals.forEach((w) => window[w.name as any] = w as any);\n\n const originalUrl = (worker as any).url;\n\n const createWorker = (url: string) => new constructor(url, {type: 'module'});\n const attachWorkerToPort = (worker: SharedWorker | Worker) => this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n const constructor = IS_SHARED_WORKER_SUPPORTED ? SharedWorker : Worker;\n\n // let cryptoWorkers = workers.length;\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n // .then((attached) => {\n // if(!attached && cryptoWorkers-- > 1) {\n // this.log.error('terminating unneeded crypto worker');\n\n // cryptoMessagePort.invokeVoid('terminate', undefined, source);\n // const worker = workers.find((worker) => (worker as SharedWorker).port === source || (worker as any) === source);\n // if((worker as SharedWorker).port) (worker as SharedWorker).port.close();\n // else (worker as Worker).terminate();\n // cryptoMessagePort.detachPort(source);\n // }\n // });\n });\n\n const firstWorker = createWorker(originalUrl);\n attachWorkerToPort(firstWorker);\n\n const blob = await get(originalUrl);\n const urlsPromise = await this.invoke('createProxyWorkerURLs', {originalUrl, blob});\n const workers = urlsPromise.slice(1).map(createWorker);\n workers.forEach(attachWorkerToPort);\n }\n\n \n private registerWorker() {\n // return;\n\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n }\n\n this.onWorkerFirstMessage(worker);\n }\n \n\n private attachWorkerToPort(worker: SharedWorker | Worker, messagePort: SuperMessagePort, type: string) {\n const port: MessagePort = (worker as SharedWorker).port || worker as any;\n messagePort.attachPort(port);\n\n worker.addEventListener('error', (err) => {\n this.log.error(type, 'worker error', err);\n });\n }\n\n private onWorkerFirstMessage(worker: any) {\n this.log('set webWorker');\n\n // this.worker = worker;\n \n \n \n this.attachWorkerToPort(worker, this, 'mtproto');\n \n }\n\n private loadState() {\n return Promise.all([\n loadState().then((stateResult) => {\n this.newVersion = stateResult.newVersion;\n this.oldVersion = stateResult.oldVersion;\n this.mirrors['state'] = stateResult.state;\n return stateResult;\n })\n // loadStorages(createStorages()),\n ]);\n }\n\n public sendState() {\n return this.loadState().then((result) => {\n const [stateResult] = result;\n this.invoke('state', {...stateResult, userId: rootScope.myId.toUserId()});\n return result;\n });\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return cryptoMessagePort.invokeCrypto(method, ...args);\n }\n \n\n public async toggleStorages(enabled: boolean, clearWrite: boolean) {\n await toggleStorages(enabled, clearWrite);\n this.invoke('toggleStorages', {enabled, clearWrite});\n this.serviceMessagePort.invokeVoid('toggleStorages', {enabled, clearWrite});\n }\n\n public async getMirror(name: T) {\n const mirror = this.mirrors[name];\n return mirror;\n }\n\n public getState() {\n return this.getMirror('state');\n }\n\n public updateTabState(key: T, value: TabState[T]) {\n this.tabState[key] = value;\n this.invokeVoid('tabState', this.tabState);\n }\n\n public updateTabStateIdle(idle: boolean) {\n this.updateTabState('idleStartTime', idle ? Date.now() : 0);\n }\n\n private onMirrorTask = (payload: MirrorTaskPayload) => {\n const {name, key, value} = payload;\n if(!payload.hasOwnProperty('key')) {\n this.mirrors[name] = value;\n return;\n }\n\n const mirror = this.mirrors[name] ??= {} as any;\n if(value === undefined) {\n delete mirror[key];\n } else {\n mirror[key] = value;\n }\n };\n}\n\ninterface ApiManagerProxy extends MTProtoMessagePort {}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport tabId from '../../config/tabId';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport idleController from '../../helpers/idleController';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport apiManagerProxy from './mtprotoworker';\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nexport type InstanceDeactivateReason = 'version' | 'tabs';\n\nconst CHECK_INSTANCE_INTERVAL = 5000;\nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\nconst IS_MULTIPLE_TABS_SUPPORTED = IS_SHARED_WORKER_SUPPORTED;\n\nexport class SingleInstance extends EventListenerBase<{\n activated: () => void,\n deactivated: (reason: InstanceDeactivateReason) => void\n}> {\n private instanceId: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: InstanceDeactivateReason;\n private log = logger('INSTANCE');\n\n constructor() {\n super(false);\n\n this.log = logger('INSTANCE');\n this.instanceId = tabId;\n }\n\n public get deactivatedReason() {\n return this.deactivated;\n }\n\n public start() {\n this.reset();\n\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n idleController.addEventListener('change', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n private reset() {\n this.masterInstance = false;\n this.clearDeactivateTimeout();\n this.deactivated = undefined;\n }\n\n private clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n this.dispatchEvent('activated');\n }\n }\n\n private deactivateInstance(reason: InstanceDeactivateReason) {\n if(this.masterInstance || this.deactivated) {\n return;\n }\n\n this.log.warn('deactivate', reason);\n this.clearDeactivateTimeout();\n this.deactivated = reason;\n\n this.dispatchEvent('deactivated', reason);\n }\n\n private clearDeactivateTimeout() {\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n }\n\n private checkInstance = async(idle = idleController.isIdle) => {\n if(this.deactivated) {\n return;\n }\n\n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceId,\n idle,\n time\n };\n\n const [curInstance, build = App.build] = await Promise.all([\n sessionStorage.get('xt_instance', false),\n sessionStorage.get('k_build', false)\n ]);\n\n if(build > App.build) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.deactivateInstance('version');\n apiManagerProxy.toggleStorages(false, false);\n return;\n } else if(IS_MULTIPLE_TABS_SUPPORTED) {\n sessionStorage.set({xt_instance: newInstance});\n return;\n }\n\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceId ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n this.masterInstance = true;\n rootScope.managers.networkerFactory.startAll();\n this.log.warn('now master instance', newInstance);\n }\n\n this.clearDeactivateTimeout();\n } else if(this.masterInstance) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.log.warn('now idle instance', newInstance);\n this.deactivateTimeout ||= window.setTimeout(() => this.deactivateInstance('tabs'), DEACTIVATE_TIMEOUT);\n }\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport Modes from '../../config/modes';\nimport loadScript from '../../helpers/dom/loadScript';\nimport tsNow from '../../helpers/tsNow';\nimport sessionStorage from '../sessionStorage';\n\nexport class TelegramMeWebManager {\n private disabled = /* false && */(Modes.test || !App.domains.includes(location.hostname));\n\n public setAuthorized(canRedirect: boolean) {\n if(this.disabled) {\n return;\n }\n\n return sessionStorage.get('tgme_sync').then((curValue) => {\n const ts = tsNow(true);\n if(\n canRedirect &&\n curValue?.canRedirect === canRedirect &&\n (curValue.ts + 86400) > ts\n ) {\n return;\n }\n\n sessionStorage.set({\n tgme_sync: {\n canRedirect,\n ts\n }\n });\n\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\n const urls = [\n '//telegram.me/' + path,\n '//t.me/' + path\n ];\n\n const promises = urls.map((url) => {\n return loadScript(url).then((script) => {\n script.remove();\n });\n });\n\n return Promise.all(promises);\n });\n }\n}\n\nconst telegramMeWebManager = new TelegramMeWebManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\nexport default telegramMeWebManager;\n","/*\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 loadScript(url: string) {\n const script = document.createElement('script');\n const promise = new Promise((resolve) => {\n script.onload = script.onerror = () => {\n resolve(script);\n };\n });\n script.src = url;\n document.body.appendChild(script);\n return promise;\n}\n","/*\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 {PushNotificationObject} from '../serviceWorker/push';\nimport type {ServicePushPingTaskPayload} from '../serviceWorker/serviceMessagePort';\nimport type {NotificationSettings} from '../appManagers/uiNotificationsManager';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {logger} from '../logger';\nimport apiManagerProxy from './mtprotoworker';\nimport I18n, {LangPackKey} from '../langPack';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport copy from '../../helpers/object/copy';\nimport singleInstance from './singleInstance';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\n\nexport type PushSubscriptionNotify = {\n tokenType: number,\n tokenValue: string\n};\n\nexport class WebPushApiManager extends EventListenerBase<{\n push_notification_click: (n: PushNotificationObject) => void,\n push_init: (n: PushSubscriptionNotify) => void,\n push_subscribe: (n: PushSubscriptionNotify) => void,\n push_unsubscribe: (n: PushSubscriptionNotify) => void\n}> {\n public isAvailable = true;\n private isPushEnabled = false;\n private localNotificationsAvailable = true;\n private started = false;\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\n private isAliveTO: any;\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n private userVisibleOnly = this.isFirefox ? false : true;\n private log = logger('PM');\n\n constructor() {\n super(false);\n\n if(!('PushManager' in window) ||\n !('Notification' in window) ||\n !('serviceWorker' in navigator)) {\n this.log.warn('Push messaging is not supported.');\n this.isAvailable = false;\n this.localNotificationsAvailable = false;\n }\n\n if(this.isAvailable && Notification.permission === 'denied') {\n this.log.warn('The user has blocked notifications.');\n }\n }\n\n public start() {\n if(!this.started) {\n this.started = true;\n this.getSubscription();\n this.setUpServiceWorkerChannel();\n }\n }\n\n public setLocalNotificationsDisabled() {\n this.localNotificationsAvailable = false;\n }\n\n public getSubscription() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = !!subscription;\n this.pushSubscriptionNotify('init', subscription);\n }).catch((err) => {\n this.log.error('Error during getSubscription()', err);\n });\n });\n }\n\n public subscribe = () => {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\n // The subscription was successful\n this.isPushEnabled = true;\n this.pushSubscriptionNotify('subscribe', subscription);\n }).catch((e) => {\n if(Notification.permission === 'denied') {\n this.log('Permission for Notifications was denied');\n } else {\n this.log('Unable to subscribe to push.', e);\n if(!this.userVisibleOnly) {\n this.userVisibleOnly = true;\n setTimeout(this.subscribe, 0);\n }\n }\n });\n });\n }\n\n public unsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = false;\n\n if(subscription) {\n this.pushSubscriptionNotify('unsubscribe', subscription);\n\n setTimeout(() => {\n subscription.unsubscribe().then((successful) => {\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }, 3000);\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public forceUnsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.log.warn('force unsubscribe', subscription);\n if(subscription) {\n subscription.unsubscribe().then((successful) => {\n this.log.warn('force unsubscribe successful', successful);\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public isAliveNotify = () => {\n if(!this.isAvailable || singleInstance.deactivatedReason) {\n return;\n }\n\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\n\n const lang: ServicePushPingTaskPayload['lang'] = {} as any;\n const ACTIONS_LANG_MAP: Record = {\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\n push_message_nopreview: 'PushNotification.Message.NoPreview'\n };\n\n for(const action in ACTIONS_LANG_MAP) {\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('pushPing', {\n localNotifications: this.localNotificationsAvailable,\n lang: lang,\n settings: this.settings\n });\n\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\n }\n\n public setSettings(newSettings: WebPushApiManager['settings']) {\n this.settings = copy(newSettings);\n clearTimeout(this.isAliveTO);\n this.isAliveNotify();\n }\n\n public hidePushNotifications() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('notificationsClear', undefined);\n }\n\n public setUpServiceWorkerChannel() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.addEventListener('pushClick', (payload) => {\n if(singleInstance.deactivatedReason) {\n appRuntimeManager.reload();\n return;\n }\n\n this.dispatchEvent('push_notification_click', payload);\n });\n\n navigator.serviceWorker.ready.then(this.isAliveNotify);\n }\n\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\n if(subscription) {\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\n if(!subscriptionObj ||\n !subscriptionObj.endpoint ||\n !subscriptionObj.keys ||\n !subscriptionObj.keys.p256dh ||\n !subscriptionObj.keys.auth) {\n this.log.warn('Invalid push subscription', subscriptionObj);\n this.unsubscribe();\n this.isAvailable = false;\n this.pushSubscriptionNotify(event);\n return;\n }\n\n this.log.warn('Push', event, subscriptionObj);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\n tokenType: 10,\n tokenValue: JSON.stringify(subscriptionObj)\n });\n } else {\n this.log.warn('Push', event, false);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\n }\n }\n}\n\nconst webPushApiManager = new WebPushApiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\nexport default webPushApiManager;\n","/*\n * 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 IS_OPUS_SUPPORTED from '../environment/opusSupport';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {Modify} from '../types';\nimport {logger, LogTypes} from './logger';\nimport apiManagerProxy from './mtproto/mtprotoworker';\nimport type {ConvertWebPTask} from './webp/webpWorkerController';\n\ntype Result = {\n bytes: Uint8Array,\n waveform?: Uint8Array\n};\n\ntype Task = {\n pages: Uint8Array,\n withWaveform: boolean,\n waveform?: Uint8Array,\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\n timeout: number\n};\n\nexport interface ConvertOpusTask extends Modify {\n type: 'convertOpus'\n}\n\nexport class OpusDecodeController {\n private worker: Worker;\n private wavWorker: Worker;\n private sampleRate = 48000;\n private tasks: Array = [];\n private keepAlive = false;\n private log = logger('OPUS', LogTypes.Error);\n\n public isPlaySupported() {\n return IS_OPUS_SUPPORTED;\n }\n\n public loadWavWorker() {\n if(this.wavWorker) return;\n\n this.wavWorker = new Worker('waveWorker.min.js');\n this.wavWorker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[WAV] got message:', data);\n if(data && data.page) {\n const bytes = data.page;\n this.onTaskEnd(this.tasks.shift(), bytes);\n }\n });\n }\n\n public loadWorker() {\n if(this.worker) return;\n\n this.worker = new Worker('decoderWorker.min.js');\n this.worker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[DECODER] got message', data);\n if(data.type === 'done') {\n // this.log('[DECODER] send done to wav');\n this.wavWorker.postMessage({command: 'done'});\n\n if(data.waveform) {\n this.tasks[0].waveform = data.waveform;\n }\n } else { // e.data contains decoded buffers as float32 values\n // this.log('[DECODER] send encode to wav');\n this.wavWorker.postMessage({\n command: 'encode',\n buffers: e.data\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\n }\n });\n }\n\n public setKeepAlive(keepAlive: boolean) {\n this.keepAlive = keepAlive;\n if(this.keepAlive) {\n this.loadWorker();\n this.loadWavWorker();\n } else if(!this.tasks.length) {\n this.terminateWorkers();\n }\n }\n\n public onTaskEnd(task: Task, result?: Uint8Array) {\n if(!result) {\n task.callback.reject('timeout');\n } else {\n clearTimeout(task.timeout);\n task.callback.resolve({bytes: result, waveform: task.waveform});\n }\n\n if(this.tasks.length) {\n this.executeNewTask(this.tasks[0]);\n }\n\n this.terminateWorkers();\n }\n\n public terminateWorkers(kill = false) {\n if((this.keepAlive || this.tasks.length) && !kill) return;\n\n if(this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n\n if(this.wavWorker) {\n this.wavWorker.terminate();\n this.wavWorker = null;\n }\n }\n\n public executeNewTask(task: Task) {\n this.worker.postMessage({\n command: 'init',\n decoderSampleRate: this.sampleRate,\n outputBufferSampleRate: this.sampleRate\n });\n\n this.wavWorker.postMessage({\n command: 'init',\n wavBitDepth: 16,\n wavSampleRate: this.sampleRate\n });\n\n // console.log('sending command to worker:', task);\n // setTimeout(() => {\n this.log('[DECODER] send decode');\n this.worker.postMessage({\n command: 'decode',\n pages: task.pages,\n waveform: task.withWaveform\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\n // }, 1e3);\n\n task.timeout = window.setTimeout(() => {\n this.log.error('decode timeout'/* , task */);\n\n this.terminateWorkers(true);\n if(this.tasks.length) {\n this.loadWorker();\n this.loadWavWorker();\n }\n\n this.onTaskEnd(this.tasks.shift());\n }, 10e3);\n }\n\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\n return new Promise((resolve, reject) => {\n const task = {\n pages,\n withWaveform,\n callback: {resolve, reject},\n timeout: 0\n };\n\n this.loadWorker();\n this.loadWavWorker();\n\n if(this.tasks.push(task) === 1) {\n this.executeNewTask(task);\n }\n });\n }\n\n public async decode(typedArray: Uint8Array, withWaveform = false) {\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\n const dataBlob = new Blob([result.bytes], {type: 'audio/wav'});\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\n });\n }\n}\n\nconst opusDecodeController = new OpusDecodeController();\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\nexport default opusDecodeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n if(tgMeMatch[1]) {\n u.pathname = tgMeMatch[1] + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !tgMeMatch[1]) {\n onclick = path[0];\n break;\n }\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] as any;\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 out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\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': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {WorkerTaskVoidTemplate} from '../../types';\n\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\n type: 'convertWebp',\n payload: {\n fileName: string,\n bytes: Uint8Array\n }\n};\n\nexport class WebpWorkerController {\n private worker: Worker;\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\n\n private init() {\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\n this.worker.addEventListener('message', (e) => {\n const task = e.data as ConvertWebPTask;\n const payload = task.payload;\n\n const promise = this.convertPromises[payload.fileName];\n if(promise) {\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\n delete this.convertPromises[payload.fileName];\n }\n });\n }\n\n private postMessage(data: ConvertWebPTask) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.worker.postMessage(data);\n }\n\n public convert(fileName: string, bytes: Uint8Array) {\n if(this.convertPromises.hasOwnProperty(fileName)) {\n return this.convertPromises[fileName];\n }\n\n const convertPromise = deferredPromise();\n\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\n\n return this.convertPromises[fileName] = convertPromise;\n }\n}\n\nconst webpWorkerController = new WebpWorkerController();\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\nexport default webpWorkerController;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"589\":\"crypto.worker\",\"630\":\"npm.qr-code-styling\",\"670\":\"sw\",\"678\":\"mtproto.worker\"}[chunkId] || chunkId) + \".\" + {\"8\":\"47c82822a84234c722aa\",\"53\":\"1619c547150ac620cdca\",\"61\":\"b0e6e1510d2c80059b20\",\"63\":\"8c6c3aa1f4320cc408dd\",\"77\":\"66c57fc849b5ec07a136\",\"104\":\"3793e2da2f88ac72ffd9\",\"231\":\"2cf58745476f33d0c32c\",\"301\":\"dc3c5a315285fe24ebd3\",\"333\":\"d7addf177783fe16e44c\",\"339\":\"0bedc53e7de2dd388b2b\",\"392\":\"e76a95678644d519b180\",\"436\":\"4f0c85770e373a7fe5e5\",\"442\":\"7c9b38d200f56e7d3245\",\"508\":\"c1aa5baee5227e17c016\",\"567\":\"2a93821ac1dd3216f099\",\"589\":\"7b5d9830f9811f2a50fe\",\"630\":\"5c8af6e9c411419a66e1\",\"641\":\"17ddd9c6d001de1e2dff\",\"642\":\"e22e19b4ff8bd97e11a6\",\"670\":\"241e2211cf9f9c1af243\",\"678\":\"57e2ed0eb86ffb097616\",\"709\":\"4571511ea17ae29dc294\",\"774\":\"ff0771b7e79241db38a1\",\"776\":\"f3c4c9ecb5dfb45387d4\",\"781\":\"0e00df9eb08b8690c5dd\",\"783\":\"a5ff7c878494d8a1624d\",\"810\":\"6e1c8118d1a5deced189\",\"813\":\"8ac136e59ed6ea591cfc\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [437,946], () => (__webpack_require__(6873)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","oldGetScript","oldLoadScript","queryMap","countMap","STATE_VERSION","BUILD","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filtersArr","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","recentCustomEmoji","topPeersCache","recentSearch","version","build","authState","_","IS_MOBILE","hiddenPinnedMessages","settings","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","pFlags","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","name","background","blur","slug","color","highlightningColor","intensity","id","theme","notifications","sound","timeFormat","toLocaleString","match","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","IS_APPLE_MX","ctx","document","createElement","getContext","extension","getExtension","renderer","getParameter","UNMASKED_RENDERER_WEBGL","getSupportedExtensions","indexOf","err","CAN_USE_TRANSFERABLES","IS_SAFARI","navigator","userAgent","search","geolocation","getCurrentPosition","IMAGE_MIME_TYPES_SUPPORTED","Set","add","arr","concat","canPlayType","IS_APPLE_MOBILE","replace","IS_FIREFOX","mediaDevices","window","DocumentTouch","USER_AGENT","IS_APPLE","IS_ANDROID","toLowerCase","IS_CHROMIUM","test","vendor","platform","maxTouchPoints","IS_MOBILE_SAFARI","vibrate","VIDEO_MIME_TYPES_SUPPORTED","toDataURL","startsWith","rgbaToHsla","r","g","b","a","max","Math","min","h","s","l","d","hslaToRgba","hue2rgb","p","q","t","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","map","v","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","compareVersion","v1","v2","s1","s2","blurActiveElement","activeElement","cancelEvent","event","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","texts","cache","fonts","text","icons","monospace","loadFonts","types","undefined","Promise","resolve","promises","type","_texts","font","weights","weight","_promises","load","race","all","catch","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","callback","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","parseUriParams","uri","params","item","decodeURIComponent","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","themeColor","isNight","setAttribute","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","addListener","applyHighlightningColor","getTheme","documentElement","setProperty","removeProperty","colorScheme","toggle","workerHandler","construct","args","url","location","Worker","SharedWorker","filter","Boolean","w","Proxy","setWorkerProxy","Element","prototype","toggleAttribute","force","hasAttribute","removeAttribute","Node","replaceChildren","nodes","textContent","append","rootScope","getProxiedManagers","getElementById","href","singleInstance","visualViewport","lastVH","setViewportVH","setVH","vh","overlayCounter","height","innerHeight","toggleResizeMode","tabId","onImTabChange","wasTabId","tagName","appMediaViewer","perf","performance","langPromise","stateResult","langPack","fadeInWhenFontsReady","elem","promise","opacity","state","isPremium","appVersion","lang_code","console","log","hash","tgWebAuthToken","data","token","dcId","tgWebAuthDcId","userId","tgWebAuthUserId","toUserId","isTest","tgWebAuthTest","tgAddr","tgaddr","urlSearchParams","URLSearchParams","set","delete","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","default","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","DEBUG_MANAGER_REQUESTS","createProxyProxy","proxied","ack","get","receiver","method","has","warn","createProxy","acknowledged","IDB","db","storageIsAvailable","openDatabase","INSTANCES","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","createIndex","keyPath","objectParameters","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","result","calledNew","onclose","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","entryName","isArray","getObjectStore","clear","save","idx","put","mode","onError","clearTimeout","timeout","onComplete","results","requests","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","setLangCode","langCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lang","langSign","countries","strings","formatLocalStrings","saveLangPack","from_version","local","loadLangPack","web","requestedServerLanguage","managers","apiManager","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","element","weakMap","update","superFormatter","indexHolder","out","lastIndex","p1","p2","p3","p4","lastIndexOf","wrappedUrl","onclick","DocumentFragment","firstChild","arg","pushNextArgument","plain","str","select","Map","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","keys","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","_Intl","Object","assign","WeakMap","IntlElementBase","options","property","IntlElement","formatted","dataset","compareAndUpdate","json","JSON","stringify","DateTimeFormat","hours","getHours","getMinutes","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","isLast","useLast","joined","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","TOPIC_COLORS","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","IS_CALL_SUPPORTED","IS_CANVAS_FILTER_SUPPORTED","IS_EMOJI_SUPPORTED","IS_GEOLOCATION_SUPPORTED","IS_GROUP_CALL_SUPPORTED","IS_MOV_SUPPORTED","IS_PARALLAX_SUPPORTED","IS_SCREEN_SHARING_SUPPORTED","IS_TOUCH_SUPPORTED","IS_VIBRATE_SUPPORTED","IS_OPUS_SUPPORTED","IS_SHARED_WORKER_SUPPORTED","IS_WEBM_SUPPORTED","IS_WEBP_SUPPORTED","IS_WEBRTC_SUPPORTED","MEDIA_MIME_TYPES_SUPPORTED","ALL_KEYS","REFRESH_KEYS","loadStateInner","logger","totalPerf","recordPromise","stateStorage","sessionStorage","pushedKeys","pushToState","copy","splice","auth","shift","sessionBuild","shiftedWebKAuth","values","dcID","toPeerId","obj","resetStorages","chats","dialogs","users","_state","state_id","time","hasOwnProperty","nightTheme","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","validateInitObject","missingKey","migrated","newTheme","k_build","ApiManagerProxy","onMirrorTask","payload","mirrors","mirror","tabState","chatPeerIds","idleStartTime","registerWorker","registerServiceWorker","registerCryptoWorker","addMultipleEventsListeners","convertWebp","fileName","bytes","webpWorkerController","convertOpus","opusDecodeController","localStorageProxy","storageTask","language","toggleStorages","telegramMeWebManager","webPushApiManager","cacheName","caches","appRuntimeManager","idleController","updateTabStateIdle","invoke","pingServiceWorkerWithIframe","pingServiceWorkerPromise","iframe","hidden","onLoad","remove","src","random","body","attachServiceWorker","serviceWorker","lastServiceWorker","serviceMessagePort","detachPort","attachSendPort","invokeVoid","_registerServiceWorker","register","URL","scope","registration","active","controller","unregister","installing","waiting","worker","attachListenPort","port","source","ports","hello","resendLockTask","originals","originalUrl","createWorker","attachWorkerToPort","cryptoMessagePort","blob","fetch","response","pathnameSplitted","pathname","origin","Blob","onWorkerFirstMessage","messagePort","attachPort","loadState","sendState","invokeCrypto","enabled","clearWrite","getMirror","getState","updateTabState","apiManagerProxy","IS_MULTIPLE_TABS_SUPPORTED","SingleInstance","clearInstance","masterInstance","deactivated","checkInstance","newInstance","instanceId","curInstance","deactivateInstance","xt_instance","clearDeactivateTimeout","deactivateTimeout","deactivatedReason","start","reset","started","setInterval","activateInstance","reason","TelegramMeWebManager","disabled","hostname","canRedirect","curValue","ts","tsNow","tgme_sync","path","encodeURIComponent","script","onload","appendChild","loadScript","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","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","setLocalNotificationsDisabled","unsubscribe","successful","setSettings","newSettings","hidePushNotifications","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","sampleRate","tasks","keepAlive","isPlaySupported","loadWavWorker","wavWorker","page","onTaskEnd","loadWorker","postMessage","command","waveform","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","task","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","ALPHA_CHARS_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","wrapUrl","unsafe","tgMeMatch","telescoPeMatch","tgMatch","u","fullPath","RootScope","myId","connectionStatus","premium","isNew","dispatchEventSingle","status","getConnectionStatus","getPremium","convertPromises","init","convert","convertPromise","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","n","getter","__esModule","getPrototypeOf","ns","def","current","getOwnPropertyNames","definition","defineProperty","enumerable","f","chunkId","reduce","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","onScriptComplete","prev","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","retries","realSrc","cacheBust","baseURI","self","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.d2eea81d523acd96fbec.css b/public/main.d2eea81d523acd96fbec.css deleted file mode 100644 index fc47b1c0..00000000 --- a/public/main.d2eea81d523acd96fbec.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{left:50%;position:absolute!important;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:-moz-plaintext;unicode-bidi:plaintext}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap} -:root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out:.2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:"Roboto Mono",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-saved-top:#69bffa;--peer-avatar-saved-bottom:#3d9de0;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#2086ea;--primary-color-rgb:51,144,236;--primary-text-color:#000;--primary-text-color-rgb:0,0,0;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--dark-danger-color:#d22324;--avatar-online-color:#0ac630;--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);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--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-error-color:var(--danger-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-color-rgb:135,116,225;--primary-text-color:#fff;--primary-text-color-rgb:255,255,255;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--dark-danger-color:#ff3031;--avatar-online-color:#0ac630;--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?6k8p6j) format("truetype"),url(assets/fonts/tgico.woff?6k8p6j) format("woff"),url(assets/fonts/tgico.svg?6k8p6j#tgico) format("svg")}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:tgico!important;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add:before{content:""}.tgico-add_reaction:before{content:""}.tgico-addmember_filled:before{content:""}.tgico-adduser:before{content:""}.tgico-admin:before{content:""}.tgico-animals:before{content:""}.tgico-animations:before{content:""}.tgico-archive:before{content:""}.tgico-arrow_down:before{content:""}.tgico-arrow_next:before{content:""}.tgico-attach:before{content:""}.tgico-audio_repeat:before{content:""}.tgico-audio_repeat_single:before{content:""}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-binfilled: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-card:before{content:""}.tgico-card_outline: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-limit_chat:before{content:""}.tgico-limit_chats:before{content:""}.tgico-limit_file:before{content:""}.tgico-limit_folders:before{content:""}.tgico-limit_link:before{content:""}.tgico-limit_pin: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-premium_addone:before{content:""}.tgico-premium_double:before{content:""}.tgico-premium_lock:before{content:""}.tgico-premium_unlock: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-shipping:before{content:""}.tgico-shuffle:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-spoiler:before{content:""}.tgico-sport:before{content:""}.tgico-star:before{content:""}.tgico-stickers:before{content:""}.tgico-stickers_face:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera:before{content:""}.tgico-videocamera_crossed_filled:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videochat:before{content:""}.tgico-volume_down:before{content:""}.tgico-volume_mute:before{content:""}.tgico-volume_off:before{content:""}.tgico-volume_up:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""}.tgico-phone_filled:before{content:"";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:" ";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;left:1rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:2}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.input-search{margin-left:1rem}}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);max-height:var(--height)!important;min-height:var(--height)!important;padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:24px;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{height:24px;left:.8125rem;pointer-events:none;width:24px}.input-search>.tgico-close{height:42px;right:0;width:42px;z-index:1}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{max-height:var(--height);padding-right:2.5rem}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);box-shadow:none!important;color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;padding:0!important;position:absolute!important;right:var(--offset);text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:#2086ea;background-color:var(--dark-primary-color)}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transform:scale(.8)!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:#fff;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0;transform:none!important}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;transform:scaleX(1)!important;visibility:visible}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right{bottom:100%;left:0;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:#000;color:var(--primary-text-color);cursor:pointer!important;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin:0 .3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);pointer-events:all!important;position:relative;text-align:left;text-transform:none;transform:scale(1);white-space:nowrap}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#000;color:var(--primary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));margin-left:var(--margin-left);max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{font-size:.875rem}.btn-menu-item-header,.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{font-weight:500;font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute;right:.5rem}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:calc(100% - .625rem);width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important;margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}.btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-left:var(--other-side-offset);margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-left:var(--menu-offset);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:" ";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#2086ea;background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto;right:15px}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;padding:0 1.5rem 0 .75rem;width:auto}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}@media only screen and (max-width:600px){.btn-transparent:before{margin-right:1.5rem}}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important;position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);padding:0 2rem!important;right:auto;width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:"";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:"";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s ease-in-out forwards;animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{-webkit-animation:none!important;animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{--size:1.375rem;--padding:.4375rem;border-radius:.75rem;color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;text-align:left;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:" ";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative;text-align:left}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);left:var(--offset-left);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);padding-left:3.375rem;pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative;text-align:left}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{color:inherit;padding-left:3.5rem;position:relative}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:"";display:block;height:var(--size);left:var(--offset-left);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;left:calc(var(--offset-left) + .3125rem);transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:" ";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{--background:unset;-webkit-user-drag:none;background:var(--background)!important}html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:"";flex:0 0 auto;font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat.menu-open{--background:var(--light-secondary-text-color)}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.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 .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;margin-left:.5rem;padding:1px 0 0}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;margin-right:.375rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:" ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-right:.125rem;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;padding:0}html.is-mac .chatlist .mention{line-height:1.25rem!important}.chatlist .mention-badge{margin-right:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:""!important}.chat-input .btn-record-cancel{opacity:0;padding:0;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal)*-1 - .5rem));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:#df3f40;color:var(--danger-color)}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:"";height:.5rem;position:absolute;right:5px;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s ease-in-out forwards!important;animation:hide-icon .4s ease-in-out forwards!important}.chat-input .float{align-self:center;display:none!important;margin:0 .75rem 0 0!important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){.chat-input .float{margin-right:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute;right:var(--padding-horizontal)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important;z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:#2086ea!important;background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:" ";display:inline-block;height:10px;margin:0 9px;width:10px}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper,.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{bottom:0;left:0;position:fixed!important;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{align-items:center;display:flex!important;flex-direction:column;transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{bottom:0;left:0;position:absolute!important;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:" ";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button:before{margin-right:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;margin:0 5px 0 6px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}.rows-wrapper{border-bottom-right-radius:0;transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;right:-8.4px;transform:scaleX(-1);width:11px}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin:0 .625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);left:3.125rem;top:auto;transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0 var(--icon-margin) 0 0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width:600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;margin-left:var(--commands-margin-left);width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);margin-left:var(--send-as-margin-left);width:var(--send-as-size)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;left:calc(var(--padding-horizontal)*-1 - .25rem)!important;max-height:20rem;max-width:20rem;right:auto;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:50%;bottom:var(--offset);content:" ";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;line-height:1!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));margin-right:var(--translateX);transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner:after{content:" ";height:.125rem}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner:not(.is-channel) .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down,.bubbles-go-mention{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{--translateY:0;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important;visibility:visible}.chat-secondary-button{align-items:center;background-color:#fff!important;background-color:var(--surface-color)!important;border-radius:50%;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;right:var(--chat-input-padding);z-index:2}.bubbles-corner-button .badge{position:absolute;right:-.25rem;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){.bubbles-corner-button .badge{right:.1875rem;top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:" ";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden;padding-left:49px}@media only screen and (max-width:600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;margin-right:.5rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden;padding-left:1.125rem}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{color:#fff;cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;left:1px;min-height:auto!important;position:absolute;right:0;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;position:-webkit-sticky!important;position:sticky!important;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:" ";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:"Unread messages";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:500;font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:-webkit-sticky;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);transform:translateX(0);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{border:1px solid #3390ec;border:1px solid var(--primary-color);border-radius:6px;height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important;min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size);border-radius:0!important}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);max-height:-webkit-fit-content!important;max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.bubble.just-media .bubble-content{background:none!important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto;position:relative!important;right:0!important}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;flex-direction:column;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important;font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;margin-top:.75rem!important;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:" ";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:16px;font-size:var(--messages-text-size)}.bubble .document-size{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin-bottom:0;max-width:15rem;padding:.3125rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:1.3125;line-height:var(--line-height);padding:.3125rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;max-width:none!important;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{--custom-emoji-size:var(--messages-custom-emoji-size);color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important;width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important;width:280px}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:#fff;background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{-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{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:" ";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(12px + .375rem);height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;font-size:var(--messages-time-text-size);height:12px;height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;display:flex;height:12px;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:12px;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:"";font-size:1.25rem;padding:0 1px 0 3px}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:14px;font-size:var(--messages-secondary-text-size);font-weight:500!important;font-weight:var(--font-weight-bold)!important;line-height:calc(14px + .25rem);line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.3125rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:#eff6fd;fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:15px;font-size:var(--messages-service-text-size);justify-content:center;line-height:20px;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.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!important}.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 .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0!important}.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 .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e!important;background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e!important;color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;font-size:calc(var(--messages-text-size) + 3px);line-height:12px;line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:""}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:""}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:""}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:#df3f40;color:var(--message-error-color);content:""}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:.375rem;color:#fff!important;cursor:pointer;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:""}.reply-markup-button.is-switch-inline:before{content:""}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.bubble-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:" ";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:calc(32px + .25rem);height:calc(var(--font-size)*2 + .25rem);min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:" ";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important;height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:72px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{height:50px;padding:.25rem 0!important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:" ";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(72px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{left:0;position:absolute!important;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}.bot-commands,body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;-webkit-animation:none!important;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;max-height:207px!important;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{align-items:flex-start;border-radius:0!important;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);padding-left:1.5rem}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{height:2.5rem;overflow:inherit!important;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:" ";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;left:1.5rem;pointer-events:none;position:absolute}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}.profile-change-avatar{--size:3.375rem;position:absolute!important;right:1.25rem;top:calc(var(--size)/-2);transform:none;transition:none!important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:20px;font-size:var(--font-size-20);font-weight:500;font-weight:var(--font-weight-bold);line-height:26px;line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:" ";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:" ";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center;transition:none!important}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:18rem}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:" ";display:block;height:100vh;position:absolute;right:-1px;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .menu-horizontal-scrollable{background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:#fff;background-color:var(--surface-color)}#column-left .item-main .input-search .selector-user{height:30px;left:6px;line-height:1.875rem;margin-left:0;position:absolute!important;top:6px;z-index:1}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width:600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative!important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:2}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:" ";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{align-items:center;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;padding:0!important;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:400!important;font-weight:var(--font-weight-normal)!important}#column-left .search-group-people .dialog-avatar{left:auto!important;top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;padding-left:4.5rem;text-align:left;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}#column-left .connection-status-button .preloader-container{height:1.5rem;left:1rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{display:flex;top:var(--offset-top)!important}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-left:23px;margin-top:14px;padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{box-shadow:none;padding-top:0!important}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{opacity:.25;pointer-events:none!important}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem!important}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{max-width:100%;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width:600px){.shared-media-container .btn-corner{bottom:14px;height:54px;position:fixed!important;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:none!important;position:-webkit-sticky!important;position:sticky!important;top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:" ";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important;min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{padding:0;position:absolute!important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:1}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{margin:0;position:absolute!important;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:" ";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important;margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem;padding:0 .75rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;position:fixed!important;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{--menu-height:3.0625rem;background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;position:absolute!important;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:23.875rem!important;z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-container .menu-wrapper{background-color:transparent;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);height:var(--menu-height);max-width:100%;padding:0;position:relative}.emoji-dropdown .emoji-container .menu-horizontal-div{background-color:transparent;z-index:4}.emoji-dropdown .emoji-container .menu-horizontal-div:after{content:" ";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoji-dropdown .emoji-container .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .emoji-container .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoji-dropdown .emoji-container .menu-horizontal-div-item.active:not(.tgico){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs-search{left:0;margin-left:.5rem!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important;position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .category-title{color:rgba(0,0,0,.42);color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoji-dropdown .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{height:1px;top:0}.emoji-dropdown .tabs-container .tabs-tab{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative}.emoji-dropdown .emoji-padding .super-emojis{padding:0 .5rem}.emoji-dropdown .emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:"";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-dropdown .emoji-category{position:relative}.emoji-dropdown .menu-horizontal-div{--item-size:1.875rem;align-items:center;height:var(--menu-height);min-height:var(--menu-height);padding:0 .3125rem;width:100%}.emoji-dropdown .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoji-dropdown .menu-horizontal-div-item.not-local{--item-size:2.375rem;border-radius:.25rem!important;padding:.25rem}.emoji-dropdown .menu-horizontal-div-item.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoji-dropdown .menu-horizontal-div-item.active,html.no-touch .emoji-dropdown .menu-horizontal-div-item:active,html.no-touch .emoji-dropdown .menu-horizontal-div-item:hover{color:rgba(0,0,0,.8)!important;color:rgba(var(--primary-text-color-rgb),.8)!important}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoji-dropdown .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoji-dropdown .menu-horizontal-inner{transition:width .2s ease-in-out}.emoji-dropdown .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoji-dropdown .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important;transform:scale(1)}body.animation-level-2 .emoji-dropdown .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoji-dropdown .menu-horizontal-inner.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important;width:8.5rem}.emoji-dropdown .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoji-dropdown .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoji-dropdown .menu-horizontal-inner:not(.active){cursor:pointer}.emoji-dropdown .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoji-dropdown .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color .3s cubic-bezier(.4,0,.2,1),border-bottom-color .3s cubic-bezier(.4,0,.2,1);transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:#dfe1e5;border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:#dfe1e5;border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@-webkit-keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding:0 1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;margin-left:-.25rem;margin-right:.75rem;max-width:11.25rem;overflow:hidden;padding:0 17px 0 0;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:"";font-size:23px;height:100%;left:0;line-height:32px!important;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;pointer-events:none;position:absolute!important;top:50%;transform:translateY(-50%);z-index:1}.selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}.selector .checkbox-field-round{--size:1.25rem;right:1.125rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}.selector-square .checkbox-field{left:1.25rem!important}.selector-square .chatlist-chat{padding-left:7.5rem!important}.selector-square .dialog-avatar{margin-left:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite!important;animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:"";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}avatar-element{--size:54px;--multiplier:1;--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:var(--size)}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:" ";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;-o-object-fit:cover;object-fit:cover;width:100%!important}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:#fff;border-right-color:var(--message-background-color);border-style:solid;border-top-color:#fff;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:"";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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,.2);border-radius:.375rem}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:" • "}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;text-align:left;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:dotMiddle;animation-name:dotMiddle;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@-webkit-keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@-webkit-keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@-webkit-keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;text-align:right;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:"";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important;color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{-webkit-animation:none;animation:none;display:flex!important;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{-webkit-animation-fill-mode:forwards!important;animation-fill-mode:forwards!important;height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}.row-big{min-height:4.5rem;padding:.5625rem .75rem .5625rem 1rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-subtitle-right,.row-title-right{flex:0 0 auto!important;margin-left:1rem}.row-midtitle{font-size:14px;font-size:var(--font-size-14);order:1}.row-with-padding{padding-left:4.5rem}@media only screen and (max-width:600px){.row-with-padding{padding-left:4rem}}.row-with-padding .row-title.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;left:1rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}.row .checkbox-field,.row .radio-field-main{margin-left:-3.375rem;padding-left:3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .checkbox-field,.row .radio-field{margin-bottom:0;margin-top:0}.row .checkbox-field{height:auto;margin-right:0}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0 .125rem;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:14px!important;font-size:var(--font-size-14)!important;line-height:18px;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}.row-media{align-items:center;display:flex;height:2.25rem!important;justify-content:center;left:.625rem;margin:0!important;pointer-events:none;position:absolute!important;width:2.25rem!important}.row-media-small{height:2rem!important;left:.75rem!important;width:2rem!important}.row-media-abitbigger{height:2.625rem!important;left:.75rem!important;width:2.625rem!important}.row-media-big{height:3rem!important;left:.5rem!important;width:3rem!important}.row-media-bigger{height:3.375rem!important;left:.5625rem!important;width:3.375rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding:0 .75rem;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;color:#3390ec;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:380px}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:block!important;max-height:26.25rem;max-width:100%;opacity:0;padding:.625rem!important;position:absolute!important;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#3d9de0;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:waves-animation 3s infinite;animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:waves-animation 5s infinite;animation:waves-animation 5s infinite;-webkit-animation-delay:2s;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important;order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform .2s cubic-bezier(.12,1.1,.56,1.2),opacity .2s cubic-bezier(.12,1.1,.56,1.2)!important;transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{display:inline;height:1.25rem!important;height:var(--custom-emoji-size)!important;min-height:1.25rem!important;min-height:var(--custom-emoji-size)!important;min-width:1.25rem!important;min-width:var(--custom-emoji-size)!important;position:relative;width:1.25rem!important;width:var(--custom-emoji-size)!important}.custom-emoji:before{content:" ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;margin:0;max-height:inherit!important;max-width:inherit!important;pointer-events:none;text-indent:-9999px;width:inherit!important}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:20px;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:20px;width:var(--messages-custom-emoji-size)}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;position:fixed!important;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0;padding:0 1rem 0 1.5rem}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.popup-buttons .btn+.btn{margin-right:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem;text-align:left}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem}.popup-peer .popup-container{max-width:min(400px,100%);min-width:17.5rem;padding:.75rem .5rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:15rem;overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.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 .sticker-set-footer{color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important;font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important;pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:20px;font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1em -.5rem .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:" ";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:16px;font-size:var(--font-size-16);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important;right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;font-size:1.25rem!important;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:14px;font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:#707579;color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:#707579;color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:#000;color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;display:inline;font-weight:inherit!important}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:22.5rem}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:500;font-weight:var(--font-weight-bold);justify-content:center}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");content:" ";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:#3390ec;background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:1682px!important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.primary-text{color:#000!important;color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%);background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important;cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{color:#000;color:var(--primary-text-color);font-weight:500;font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit-canvas{background:linear-gradient(#69bffa,#3d9de0);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:48px;left:50%;line-height:48px;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem;text-align:left}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}.phone-edit{cursor:pointer;display:inline-block;font-size:1.5rem;height:24px;margin-left:.4rem;opacity:.5;transition:opacity .2s;width:24px}@media only screen and (max-width:600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html:not(.is-safari) span.emoji{margin-right:5px!important}html:not(.is-safari) avatar-element span.emoji{margin-right:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{-webkit-text-decoration-line:underline;text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{-webkit-text-decoration-line:underline line-through;text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:Roboto Mono,monospace!important;font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity .2s ease-out .01s,transform .2s ease-out .01s;transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,72px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;font-size:24px;padding-left:16px;padding-right:32px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}::-moz-selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after,::selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after{bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@-webkit-keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important;padding:0 .375rem}.media-round .video-time:after,.media-round .video-time:before{margin-left:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:" ";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:"";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.sidebar-header.with-border{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);min-height:3.5625rem}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;grid-column-gap:.25rem;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin:0 .0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important;font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:#df3f40;color:var(--danger-color)}.sending-status-icon{line-height:1!important;position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:#3390ec;fill:var(--primary-color)}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;margin-left:.125rem;width:1.25rem}.emoji-status{height:1.125rem;margin-left:.25rem;position:relative;width:1.125rem}.premium-icon{color:#3390ec;color:var(--primary-color);margin-top:-.0625rem}.badge-fake{border:1px solid #df3f40;border:1px solid var(--danger-color);border-radius:.185rem;color:#df3f40;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1!important;margin:0 .25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}.chatlist-chat{padding-left:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:16px!important;font-size:var(--font-size-16)!important;line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:12px!important;font-size:var(--font-size-12)!important;line-height:16px!important;line-height:var(--line-height-12)!important;margin-top:-.4375rem}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:16px!important;font-size:var(--font-size-16)!important;line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:500;font-weight:var(--font-weight-bold)} - -/*# sourceMappingURL=main.d2eea81d523acd96fbec.css.map*/ \ No newline at end of file diff --git a/public/main.d2eea81d523acd96fbec.css.map b/public/main.d2eea81d523acd96fbec.css.map deleted file mode 100644 index 62664300..00000000 --- a/public/main.d2eea81d523acd96fbec.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.d2eea81d523acd96fbec.css","mappings":"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","sources":["webpack://tweb/./src/materialize.scss","webpack://tweb/./src/scss/style.scss"],"sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{left:50%;position:absolute!important;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:-moz-plaintext;unicode-bidi:plaintext}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}",":root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out:.2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:\"Roboto Mono\",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-saved-top:#69bffa;--peer-avatar-saved-bottom:#3d9de0;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#2086ea;--primary-color-rgb:51,144,236;--primary-text-color:#000;--primary-text-color-rgb:0,0,0;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--dark-danger-color:#d22324;--avatar-online-color:#0ac630;--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);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--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-error-color:var(--danger-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-color-rgb:135,116,225;--primary-text-color:#fff;--primary-text-color-rgb:255,255,255;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--dark-danger-color:#ff3031;--avatar-online-color:#0ac630;--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?6k8p6j) format(\"truetype\"),url(assets/fonts/tgico.woff?6k8p6j) format(\"woff\"),url(assets/fonts/tgico.svg?6k8p6j#tgico) format(\"svg\")}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:tgico!important;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-add_reaction:before{content:\"\"}.tgico-addmember_filled:before{content:\"\"}.tgico-adduser:before{content:\"\"}.tgico-admin:before{content:\"\"}.tgico-animals:before{content:\"\"}.tgico-animations:before{content:\"\"}.tgico-archive:before{content:\"\"}.tgico-arrow_down:before{content:\"\"}.tgico-arrow_next:before{content:\"\"}.tgico-attach:before{content:\"\"}.tgico-audio_repeat:before{content:\"\"}.tgico-audio_repeat_single:before{content:\"\"}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-binfilled: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-card:before{content:\"\"}.tgico-card_outline: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-limit_chat:before{content:\"\"}.tgico-limit_chats:before{content:\"\"}.tgico-limit_file:before{content:\"\"}.tgico-limit_folders:before{content:\"\"}.tgico-limit_link:before{content:\"\"}.tgico-limit_pin: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-premium_addone:before{content:\"\"}.tgico-premium_double:before{content:\"\"}.tgico-premium_lock:before{content:\"\"}.tgico-premium_unlock: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-shipping:before{content:\"\"}.tgico-shuffle:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-spoiler:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-star:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stickers_face:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videocamera_crossed_filled:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-volume_down:before{content:\"\"}.tgico-volume_mute:before{content:\"\"}.tgico-volume_off:before{content:\"\"}.tgico-volume_up:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}.tgico-phone_filled:before{content:\"\";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:\" \";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;left:1rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:2}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.input-search{margin-left:1rem}}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);max-height:var(--height)!important;min-height:var(--height)!important;padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:24px;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{height:24px;left:.8125rem;pointer-events:none;width:24px}.input-search>.tgico-close{height:42px;right:0;width:42px;z-index:1}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{max-height:var(--height);padding-right:2.5rem}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);box-shadow:none!important;color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;padding:0!important;position:absolute!important;right:var(--offset);text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:#2086ea;background-color:var(--dark-primary-color)}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transform:scale(.8)!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:#fff;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0;transform:none!important}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;transform:scaleX(1)!important;visibility:visible}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right{bottom:100%;left:0;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:#000;color:var(--primary-text-color);cursor:pointer!important;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin:0 .3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);pointer-events:all!important;position:relative;text-align:left;text-transform:none;transform:scale(1);white-space:nowrap}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#000;color:var(--primary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));margin-left:var(--margin-left);max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{font-size:.875rem}.btn-menu-item-header,.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{font-weight:500;font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute;right:.5rem}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:calc(100% - .625rem);width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important;margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}.btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-left:var(--other-side-offset);margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-left:var(--menu-offset);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:\" \";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#2086ea;background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto;right:15px}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;padding:0 1.5rem 0 .75rem;width:auto}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}@media only screen and (max-width:600px){.btn-transparent:before{margin-right:1.5rem}}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important;position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);padding:0 2rem!important;right:auto;width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:\"\";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:\"\";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s ease-in-out forwards;animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{-webkit-animation:none!important;animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{--size:1.375rem;--padding:.4375rem;border-radius:.75rem;color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;text-align:left;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:\" \";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative;text-align:left}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);left:var(--offset-left);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);padding-left:3.375rem;pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative;text-align:left}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{color:inherit;padding-left:3.5rem;position:relative}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:\"\";display:block;height:var(--size);left:var(--offset-left);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;left:calc(var(--offset-left) + .3125rem);transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:\" \";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{--background:unset;-webkit-user-drag:none;background:var(--background)!important}html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:\"\";flex:0 0 auto;font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat.menu-open{--background:var(--light-secondary-text-color)}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.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 .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;margin-left:.5rem;padding:1px 0 0}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;margin-right:.375rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:\" \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-right:.125rem;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;padding:0}html.is-mac .chatlist .mention{line-height:1.25rem!important}.chatlist .mention-badge{margin-right:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\"!important}.chat-input .btn-record-cancel{opacity:0;padding:0;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal)*-1 - .5rem));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:#df3f40;color:var(--danger-color)}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:\"\";height:.5rem;position:absolute;right:5px;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s ease-in-out forwards!important;animation:hide-icon .4s ease-in-out forwards!important}.chat-input .float{align-self:center;display:none!important;margin:0 .75rem 0 0!important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){.chat-input .float{margin-right:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute;right:var(--padding-horizontal)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important;z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:#2086ea!important;background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:\" \";display:inline-block;height:10px;margin:0 9px;width:10px}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper,.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{bottom:0;left:0;position:fixed!important;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{align-items:center;display:flex!important;flex-direction:column;transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{bottom:0;left:0;position:absolute!important;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:\" \";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button:before{margin-right:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;margin:0 5px 0 6px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}.rows-wrapper{border-bottom-right-radius:0;transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;right:-8.4px;transform:scaleX(-1);width:11px}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin:0 .625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);left:3.125rem;top:auto;transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0 var(--icon-margin) 0 0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width:600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;margin-left:var(--commands-margin-left);width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);margin-left:var(--send-as-margin-left);width:var(--send-as-size)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;left:calc(var(--padding-horizontal)*-1 - .25rem)!important;max-height:20rem;max-width:20rem;right:auto;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:50%;bottom:var(--offset);content:\" \";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;line-height:1!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));margin-right:var(--translateX);transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner:after{content:\" \";height:.125rem}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner:not(.is-channel) .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down,.bubbles-go-mention{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{--translateY:0;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important;visibility:visible}.chat-secondary-button{align-items:center;background-color:#fff!important;background-color:var(--surface-color)!important;border-radius:50%;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;right:var(--chat-input-padding);z-index:2}.bubbles-corner-button .badge{position:absolute;right:-.25rem;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){.bubbles-corner-button .badge{right:.1875rem;top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:\" \";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden;padding-left:49px}@media only screen and (max-width:600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;margin-right:.5rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden;padding-left:1.125rem}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{color:#fff;cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;left:1px;min-height:auto!important;position:absolute;right:0;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;position:-webkit-sticky!important;position:sticky!important;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:\" \";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:\"Unread messages\";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:500;font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:-webkit-sticky;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);transform:translateX(0);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{border:1px solid #3390ec;border:1px solid var(--primary-color);border-radius:6px;height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important;min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size);border-radius:0!important}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);max-height:-webkit-fit-content!important;max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.bubble.just-media .bubble-content{background:none!important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto;position:relative!important;right:0!important}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;flex-direction:column;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important;font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;margin-top:.75rem!important;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:\" \";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:16px;font-size:var(--messages-text-size)}.bubble .document-size{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin-bottom:0;max-width:15rem;padding:.3125rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:1.3125;line-height:var(--line-height);padding:.3125rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;max-width:none!important;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{--custom-emoji-size:var(--messages-custom-emoji-size);color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important;width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important;width:280px}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"\";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:#fff;background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{-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{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:\" \";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(12px + .375rem);height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;font-size:var(--messages-time-text-size);height:12px;height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;display:flex;height:12px;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:12px;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:\"\";font-size:1.25rem;padding:0 1px 0 3px}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:14px;font-size:var(--messages-secondary-text-size);font-weight:500!important;font-weight:var(--font-weight-bold)!important;line-height:calc(14px + .25rem);line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.3125rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:#eff6fd;fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:15px;font-size:var(--messages-service-text-size);justify-content:center;line-height:20px;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.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!important}.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 .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0!important}.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 .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e!important;background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e!important;color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;font-size:calc(var(--messages-text-size) + 3px);line-height:12px;line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:\"\"}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:\"\"}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:\"\"}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:#df3f40;color:var(--message-error-color);content:\"\"}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:.375rem;color:#fff!important;cursor:pointer;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:\"\"}.reply-markup-button.is-switch-inline:before{content:\"\"}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.bubble-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:\" \";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:calc(32px + .25rem);height:calc(var(--font-size)*2 + .25rem);min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:\" \";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important;height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:72px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{height:50px;padding:.25rem 0!important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:\" \";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(72px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{left:0;position:absolute!important;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}.bot-commands,body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;-webkit-animation:none!important;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;max-height:207px!important;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{align-items:flex-start;border-radius:0!important;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);padding-left:1.5rem}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{height:2.5rem;overflow:inherit!important;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:\" \";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;left:1.5rem;pointer-events:none;position:absolute}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}.profile-change-avatar{--size:3.375rem;position:absolute!important;right:1.25rem;top:calc(var(--size)/-2);transform:none;transition:none!important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:20px;font-size:var(--font-size-20);font-weight:500;font-weight:var(--font-weight-bold);line-height:26px;line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:\" \";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:\" \";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center;transition:none!important}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:18rem}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:\" \";display:block;height:100vh;position:absolute;right:-1px;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .menu-horizontal-scrollable{background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:#fff;background-color:var(--surface-color)}#column-left .item-main .input-search .selector-user{height:30px;left:6px;line-height:1.875rem;margin-left:0;position:absolute!important;top:6px;z-index:1}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width:600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative!important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:2}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:\" \";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{align-items:center;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;padding:0!important;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:400!important;font-weight:var(--font-weight-normal)!important}#column-left .search-group-people .dialog-avatar{left:auto!important;top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;padding-left:4.5rem;text-align:left;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}#column-left .connection-status-button .preloader-container{height:1.5rem;left:1rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{display:flex;top:var(--offset-top)!important}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-left:23px;margin-top:14px;padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{box-shadow:none;padding-top:0!important}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{opacity:.25;pointer-events:none!important}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem!important}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{max-width:100%;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width:600px){.shared-media-container .btn-corner{bottom:14px;height:54px;position:fixed!important;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:none!important;position:-webkit-sticky!important;position:sticky!important;top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:\" \";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important;min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{padding:0;position:absolute!important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:1}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{margin:0;position:absolute!important;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:\" \";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important;margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem;padding:0 .75rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;position:fixed!important;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{--menu-height:3.0625rem;background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;position:absolute!important;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:23.875rem!important;z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-container .menu-wrapper{background-color:transparent;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);height:var(--menu-height);max-width:100%;padding:0;position:relative}.emoji-dropdown .emoji-container .menu-horizontal-div{background-color:transparent;z-index:4}.emoji-dropdown .emoji-container .menu-horizontal-div:after{content:\" \";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoji-dropdown .emoji-container .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .emoji-container .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoji-dropdown .emoji-container .menu-horizontal-div-item.active:not(.tgico){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs-search{left:0;margin-left:.5rem!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important;position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .category-title{color:rgba(0,0,0,.42);color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoji-dropdown .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{height:1px;top:0}.emoji-dropdown .tabs-container .tabs-tab{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative}.emoji-dropdown .emoji-padding .super-emojis{padding:0 .5rem}.emoji-dropdown .emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:\"\";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-dropdown .emoji-category{position:relative}.emoji-dropdown .menu-horizontal-div{--item-size:1.875rem;align-items:center;height:var(--menu-height);min-height:var(--menu-height);padding:0 .3125rem;width:100%}.emoji-dropdown .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoji-dropdown .menu-horizontal-div-item.not-local{--item-size:2.375rem;border-radius:.25rem!important;padding:.25rem}.emoji-dropdown .menu-horizontal-div-item.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoji-dropdown .menu-horizontal-div-item.active,html.no-touch .emoji-dropdown .menu-horizontal-div-item:active,html.no-touch .emoji-dropdown .menu-horizontal-div-item:hover{color:rgba(0,0,0,.8)!important;color:rgba(var(--primary-text-color-rgb),.8)!important}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoji-dropdown .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoji-dropdown .menu-horizontal-inner{transition:width .2s ease-in-out}.emoji-dropdown .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoji-dropdown .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important;transform:scale(1)}body.animation-level-2 .emoji-dropdown .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoji-dropdown .menu-horizontal-inner.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important;width:8.5rem}.emoji-dropdown .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoji-dropdown .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoji-dropdown .menu-horizontal-inner:not(.active){cursor:pointer}.emoji-dropdown .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoji-dropdown .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color .3s cubic-bezier(.4,0,.2,1),border-bottom-color .3s cubic-bezier(.4,0,.2,1);transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:#dfe1e5;border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:#dfe1e5;border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@-webkit-keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding:0 1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;margin-left:-.25rem;margin-right:.75rem;max-width:11.25rem;overflow:hidden;padding:0 17px 0 0;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:\"\";font-size:23px;height:100%;left:0;line-height:32px!important;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;pointer-events:none;position:absolute!important;top:50%;transform:translateY(-50%);z-index:1}.selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}.selector .checkbox-field-round{--size:1.25rem;right:1.125rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}.selector-square .checkbox-field{left:1.25rem!important}.selector-square .chatlist-chat{padding-left:7.5rem!important}.selector-square .dialog-avatar{margin-left:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite!important;animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:\"\";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}avatar-element{--size:54px;--multiplier:1;--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:var(--size)}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:\" \";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;-o-object-fit:cover;object-fit:cover;width:100%!important}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:#fff;border-right-color:var(--message-background-color);border-style:solid;border-top-color:#fff;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:\"\";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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,.2);border-radius:.375rem}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:\" • \"}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;text-align:left;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:dotMiddle;animation-name:dotMiddle;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@-webkit-keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@-webkit-keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@-webkit-keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;text-align:right;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:\"\";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important;color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{-webkit-animation:none;animation:none;display:flex!important;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{-webkit-animation-fill-mode:forwards!important;animation-fill-mode:forwards!important;height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}.row-big{min-height:4.5rem;padding:.5625rem .75rem .5625rem 1rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-subtitle-right,.row-title-right{flex:0 0 auto!important;margin-left:1rem}.row-midtitle{font-size:14px;font-size:var(--font-size-14);order:1}.row-with-padding{padding-left:4.5rem}@media only screen and (max-width:600px){.row-with-padding{padding-left:4rem}}.row-with-padding .row-title.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;left:1rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}.row .checkbox-field,.row .radio-field-main{margin-left:-3.375rem;padding-left:3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .checkbox-field,.row .radio-field{margin-bottom:0;margin-top:0}.row .checkbox-field{height:auto;margin-right:0}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0 .125rem;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:14px!important;font-size:var(--font-size-14)!important;line-height:18px;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}.row-media{align-items:center;display:flex;height:2.25rem!important;justify-content:center;left:.625rem;margin:0!important;pointer-events:none;position:absolute!important;width:2.25rem!important}.row-media-small{height:2rem!important;left:.75rem!important;width:2rem!important}.row-media-abitbigger{height:2.625rem!important;left:.75rem!important;width:2.625rem!important}.row-media-big{height:3rem!important;left:.5rem!important;width:3rem!important}.row-media-bigger{height:3.375rem!important;left:.5625rem!important;width:3.375rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding:0 .75rem;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;color:#3390ec;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:380px}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:block!important;max-height:26.25rem;max-width:100%;opacity:0;padding:.625rem!important;position:absolute!important;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#3d9de0;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:waves-animation 3s infinite;animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:waves-animation 5s infinite;animation:waves-animation 5s infinite;-webkit-animation-delay:2s;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important;order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform .2s cubic-bezier(.12,1.1,.56,1.2),opacity .2s cubic-bezier(.12,1.1,.56,1.2)!important;transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{display:inline;height:1.25rem!important;height:var(--custom-emoji-size)!important;min-height:1.25rem!important;min-height:var(--custom-emoji-size)!important;min-width:1.25rem!important;min-width:var(--custom-emoji-size)!important;position:relative;width:1.25rem!important;width:var(--custom-emoji-size)!important}.custom-emoji:before{content:\" \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;margin:0;max-height:inherit!important;max-width:inherit!important;pointer-events:none;text-indent:-9999px;width:inherit!important}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:20px;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:20px;width:var(--messages-custom-emoji-size)}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;position:fixed!important;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0;padding:0 1rem 0 1.5rem}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.popup-buttons .btn+.btn{margin-right:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem;text-align:left}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem}.popup-peer .popup-container{max-width:min(400px,100%);min-width:17.5rem;padding:.75rem .5rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:15rem;overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.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 .sticker-set-footer{color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important;font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important;pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:20px;font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1em -.5rem .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:\" \";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:16px;font-size:var(--font-size-16);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important;right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;font-size:1.25rem!important;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:14px;font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:#707579;color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:#707579;color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:#000;color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;display:inline;font-weight:inherit!important}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:22.5rem}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:500;font-weight:var(--font-weight-bold);justify-content:center}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");content:\" \";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:#3390ec;background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:1682px!important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.primary-text{color:#000!important;color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%);background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important;cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{color:#000;color:var(--primary-text-color);font-weight:500;font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit-canvas{background:linear-gradient(#69bffa,#3d9de0);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:48px;left:50%;line-height:48px;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem;text-align:left}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}.phone-edit{cursor:pointer;display:inline-block;font-size:1.5rem;height:24px;margin-left:.4rem;opacity:.5;transition:opacity .2s;width:24px}@media only screen and (max-width:600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html:not(.is-safari) span.emoji{margin-right:5px!important}html:not(.is-safari) avatar-element span.emoji{margin-right:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{-webkit-text-decoration-line:underline;text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{-webkit-text-decoration-line:underline line-through;text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:Roboto Mono,monospace!important;font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity .2s ease-out .01s,transform .2s ease-out .01s;transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,72px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;font-size:24px;padding-left:16px;padding-right:32px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}::-moz-selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after,::selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after{bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@-webkit-keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important;padding:0 .375rem}.media-round .video-time:after,.media-round .video-time:before{margin-left:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:\" \";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:\"\";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.sidebar-header.with-border{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);min-height:3.5625rem}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;grid-column-gap:.25rem;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin:0 .0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important;font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:#df3f40;color:var(--danger-color)}.sending-status-icon{line-height:1!important;position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:#3390ec;fill:var(--primary-color)}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;margin-left:.125rem;width:1.25rem}.emoji-status{height:1.125rem;margin-left:.25rem;position:relative;width:1.125rem}.premium-icon{color:#3390ec;color:var(--primary-color);margin-top:-.0625rem}.badge-fake{border:1px solid #df3f40;border:1px solid var(--danger-color);border-radius:.185rem;color:#df3f40;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1!important;margin:0 .25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}.chatlist-chat{padding-left:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:16px!important;font-size:var(--font-size-16)!important;line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:12px!important;font-size:var(--font-size-12)!important;line-height:16px!important;line-height:var(--line-height-12)!important;margin-top:-.4375rem}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:16px!important;font-size:var(--font-size-16)!important;line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.57e2ed0eb86ffb097616.chunk.js b/public/mtproto.worker.57e2ed0eb86ffb097616.chunk.js new file mode 100644 index 00000000..99cf436c --- /dev/null +++ b/public/mtproto.worker.57e2ed0eb86ffb097616.chunk.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,a,s,n,i,r={3447:(e,t,a)=>{a.d(t,{Z:()=>i});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const i=n},4762:(e,t,a)=>{a.d(t,{IS_FIREFOX:()=>r,IS_SAFARI:()=>i});var s=a(6761);const n=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&s.Z.MSStream,!!("safari"in s.Z)||!(!n||!(/\b(iPad|iPhone|iPod)\b/.test(n)||n.match("Safari")&&!n.match("Chrome")))),r=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},467:(e,t,a)=>{a.d(t,{ZP:()=>o,gV:()=>p});var s=a(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,i=/^\s+|\s$/g,r={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function o(e,t=!0){return p(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function p(e,t={}){const a=t.includeTag&&"%"===e.charAt(0),o=e;return t.clearBadChars&&(e=function(e){return e.replace(n,"").replace(i,"")}(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),a&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=r[e];return null!=t?t:e}))}(o)),e}},8801:(e,t,a)=>{a.d(t,{P:()=>n,q:()=>i});const s="_";function n(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(a?"."+a:a)}function i(e,t){return e+"/"+encodeURIComponent(JSON.stringify(t))}},677:(e,t,a)=>{a.d(t,{Ki:()=>o,RP:()=>i,X:()=>r});const s=new Set(["all","web","webk"]),n=new Set;function i(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function r(e){return!!i(e)}function o(e){n.clear(),e.forEach((e=>{n.add(e)}))}},2946:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(5880),n=a(1507);function i(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const a=e.channel_id||e.chat_id;return void 0!==a?a.toPeerId(!0):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),a=e.substr(1).split("_");return t?a[0].toPeerId():(a[0]||"").toPeerId(!0)}},6666:(e,t,a)=>{a.d(t,{C:()=>o,Z:()=>p});var s=a(1267),n=a(5471),i=a(5953),r=a(5003);class o{constructor(e){(0,i.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),o.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var a;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const a of t.indexes)e.indexNames.contains(a.indexName)||e.createIndex(a.indexName,a.keyPath,a.objectParameters)};try{var a=indexedDB.open(this.name,this.version);if(!a)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||a.onerror((0,n.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,n)=>{a.onsuccess=t=>{s=!0;const i=a.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},a.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},a.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const a=e.target,n=a.result;this.stores.forEach((e=>{if(n.objectStoreNames.contains(e.name)){const s=a.transaction.objectStore(e.name);t(s,e)}else((e,a)=>{const s=e.createObjectStore(a.name);t(s,a)})(n,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new o(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())}))}}o.INSTANCES=[];class p{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=o.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,a){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(a=>e.map(((e,s)=>a.put(t[s],e)))),"",a)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,a,s=this.storeName){let n;return a&&(n=performance.now(),this.log(a+": start")),this.idb.openDatabase().then((i=>new Promise(((r,o)=>{const p=i.transaction([s],e),d=()=>{clearTimeout(l),o(p.error)},f=()=>{clearTimeout(l),a&&this.log(a+": end",performance.now()-n);const e=h.map((e=>e.result));r(g?e:e[0])};p.onerror=d;const c="readwrite"===e;c&&(p.oncomplete=()=>f());const l=setTimeout((()=>{this.log.error("transaction not finished",p,a)}),1e4),m=t(p.objectStore(s)),g=Array.isArray(m),h=g?m:[].concat(m);if(c)return;const u=h.length;let y=u;const _=()=>{p.error||--y||f()};for(let e=0;ee.getAll()),"",e)}}},5218:(e,t,a)=>{a.d(t,{r:()=>Gs,H:()=>qs}),a(690),a(4110);var s=a(8630);let n;function i(){return n}function r(e){return n=e}var o=a(1507),p=a(3241),d=a(410),f=a(3206),c=a(1352);class l extends p.Z{constructor(){super(),this.myId=o.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),f.Z.getInstance().invokeVoid("event",{name:e,args:t})},c.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const m=new l;d.GO.rootScope=m;const g=m;var h=a(7922),u=a(9750);const y=new class{constructor(){this.state={},this.storage=h.Z}getState(){return Promise.resolve(this.state)}setByKey(e,t){!function(e,t,a){const s=t.split(".");(0,u.Z)(e,s.slice(0,-1).join("."))[s.pop()]=a}(this.state,e,t);const a=e.split(".")[0];"settings"===a&&g.dispatchEvent("settings_updated",{key:e,value:t,settings:this.state.settings}),this.pushToState(a,this.state[a])}pushToState(e,t,a=!0,s){a&&(this.state[e]=t),this.setKeyValueToStorage(e,t,s)}setKeyValueToStorage(e,t=this.state[e],a){f.Z.getInstance().invokeVoid("mirror",{name:"state",key:e,value:t}),this.storage.set({[e]:t},a)}};var _=a(4159),v=a(3725),P=a(5418),b=a(1267),M=a(1655),I=a(5003);class S{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=b.Z.debug&&!1;let s=I.v9.Error|I.v9.Log;this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`HTTP-${e}`+a,s),this.log("constructor"),this.connected=!1}_send(e,t){const a=e.length;return this.debug&&this.log.debug("-> body length to send:",a),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,Z.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach((e=>e.reject())),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise(((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})}));return this.releasePending(),t}}releasePending(){return e=this,t=void 0,s=function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=e=>{this.log("closed",e),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let s=I.v9.Error|I.v9.Log;return this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`WS-${e}`+a,s),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}function w(e){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(e),e}var k=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class A{constructor(){this._process=(e,t)=>s.Z.invokeCryptoNew({method:"aes-ctr-process",args:[{id:this.id,data:e,operation:t}],transfer:[e.buffer]})}init(e){return k(this,void 0,void 0,(function*(){void 0!==this.idPromise&&this.release();const t=new Uint8Array(64);for(w(t);;){const e=t[3]<<24|t[2]<<16|t[1]<<8|t[0],a=t[7]<<24|t[6]<<16|t[5]<<8|t[4];if(239!==t[0]&&1145128264!==e&&1414745936!==e&&542393671!==e&&1230262351!==e&&4008636142!==e&&3722304989!==e&&0!==a)break;w(t)}const a=t.slice().reverse(),n=t.slice(8,40),i=t.slice(40,56),r=a.slice(8,40),o=a.slice(40,56),p=this.idPromise=s.Z.invokeCrypto("aes-ctr-prepare",{encKey:n,encIv:i,decKey:r,decIv:o});this.process=(e,t)=>k(this,void 0,void 0,(function*(){return yield p,this._process(e,t)})),this.id=yield p,this.process=this._process,t.set(e.obfuscateTag,56);const d=yield this.encode(t.slice());return t.set(d.slice(56,64),56),t}))}encode(e){return this.process(e,"encrypt")}decode(e){return this.process(e,"decrypt")}release(){return k(this,void 0,void 0,(function*(){const e=this.idPromise;if(void 0===e)return;this.id=void 0,this.idPromise=void 0;const t=yield e;s.Z.invokeCrypto("aes-ctr-destroy",t)}))}destroy(){this.release()}}const D=new class{constructor(){this.tag=239,this.obfuscateTag=new Uint8Array([this.tag,this.tag,this.tag,this.tag])}encodePacket(e){const t=e.byteLength>>2;let a;return a=t<127?new Uint8Array([t]):new Uint8Array([127,255&t,t>>8&255,t>>16&255]),a.concat(e)}readPacket(e){let t=e[0];return t>=127?(t=e[1]|e[2]<<8|e[3]<<16,e.slice(4,t<<3)):e.slice(1,t<<3)}};var U=a(9174);function T(e){const t=e.length,a=new Array(t);for(let s=0;sF(this,void 0,void 0,(function*(){this.connected=!0,Z.setTransportOpened("websocket");const e=yield this.obfuscation.init(this.codec);this.connected&&(this.connection.send(e),this.networker&&(this.pending.length=0,this.networker.setConnectionStatus(U.Q.Connected),this.networker.cleanupSent(),this.networker.resend()),setTimeout((()=>{this.releasePending()}),0))})),this.onMessage=e=>F(this,void 0,void 0,(function*(){let t=yield this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then((e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}})).catch((e=>{this.log.error("handleMessage networker parseResponse error",e)}));const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",T(t))})),this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),s=a-this.lastCloseTime;e=!isNaN(s)&&s{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(U.Q.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=I.v9.Error|I.v9.Log;this.debug&&(i|=I.v9.Debug),this.log=(0,I.kg)(`TCP-${t}`+s,i),this.log("constructor"),this.connect()}clear(){this.connected&&Z.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.obfuscation&&this.obfuscation.destroy(),this.pending.forEach((e=>{e.reject&&e.reject()})),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",(()=>{e.removeEventListener("message",this.onMessage)}),{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}changeUrl(e){this.url!==e&&(this.url=e,this.forceReconnect())}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=void 0;if(!this.networker){const a=new Promise(((a,s)=>{this.pending.push({resolve:a,reject:s,body:e,encoded:t})}));return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){var e;return F(this,void 0,void 0,(function*(){if(!this.connected||this.releasingPending)return;this.releasingPending=!0;let t=this.pending.length,a=!1;for(let s=0;s body length to send:",i.length);const r=null!==(e=n.encoded)&&void 0!==e?e:n.encoded=yield this.encodeBody(i);if(!this.connected)break;this.connection.send(r),n.resolve?n.bodySent=!0:(this.pending.splice(s--,1),t--),a=!0}}this.releasingPending=void 0,this.pending.length&&a&&this.releasePending()}))}}const x=b.Z.test?"_test":"";function B(e){return"client"===e?"":"-1"}function V(e,t,a){const s=B(t),n="client"!==t?"apiws"+x+(a?"_premium":""):"apiws"+x;return`wss://${_.Z.suffix.toLowerCase()}ws${e}${s}.web.telegram.org/${n}`}class L{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=b.Z.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const s=V(e,t,a);let n;return n=C,new R(n,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let s;if(b.Z.ssl||!b.Z.http){const a=B(t);s="https://"+(this.sslSubdomains[e-1]+a)+".web.telegram.org/"+(b.Z.test?"apiw_test1":"apiw1")}else for(const t of this.dcOptions)if(t.id===e){s="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new S(e,s,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=b.Z.transport,s=!0,n){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const i=this.chosenServers[a][t];e in i||(i[e]=[]);const r=i[e];if(!r.length||!s){let i;return i=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,n),i?(s&&r.push(i),i):(console.error("No chosenServer!",e),null)}return r[0]}static removeTransport(e,t){for(const a in e)for(const s in e[a])for(const n in e[a][s]){const i=e[a][s][n];(0,M.Z)(i,t)}}}var O=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class N extends p.Z{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",(e=>{e.get("websocket")||this.waitForWebSocket()}))}pingTransports(){var e;return O(this,void 0,void 0,(function*(){const t=null!==(e=this.dcConfigurator)&&void 0!==e?e:this.dcConfigurator=new L,a=this.transports={https:t.chooseServer(_.Z.baseDcId,"client","https",!1),websocket:t.chooseServer(_.Z.baseDcId,"client","websocket",!1)},s=(0,v.Z)();this.transports.https._send(new Uint8Array,"no-cors").then((()=>s.resolve(!0)),(()=>s.resolve(!1))),setTimeout((()=>s.resolve(!1)),2e3);const n=(0,v.Z)(),i=a.websocket;i.setAutoReconnect(!1),i.connection.addEventListener("close",(()=>n.resolve(!1)),{once:!0}),i.connection.addEventListener("open",(()=>n.resolve(!0)),{once:!0}),setTimeout((()=>{n.isFulfilled||n.isRejected||(i.connection&&i.connection.close(),n.resolve(!1))}),2e3);const[r,o]=yield Promise.all([s,n]);for(const e in a)a[e].destroy();return{https:r||this.opened.get("https")>0,websocket:o||this.opened.get("websocket")>0}}))}waitForWebSocket(){return O(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield(0,P.Z)(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}}const Z=new N,j=(0,v.Z)();var q=a(6654);class G{setManagers(e){Object.assign(this,e)}}var H=a(3127),W=a(3989),K=a(5466);let z;function J(e){return null!=z?z:z=function(e){return t=this,a=void 0,n=function*(){const t=(0,K.$)((0,I.kg)("STORAGES-LOADER")),a=Object.keys(e),s=a.map((a=>{const s=e[a].getAll();return t(s,"storage "+a)})),n={},i=yield Promise.all(s);for(let e=0,t=a.length;e({storage:this.storages[e],results:t[e]})))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}class Q extends G{getState(){return this.apiManager.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let a,s;const n={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};a=e.currentPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const i=t.new_algo,r=new Uint8Array(i.salt1.length+32);return w(r),r.set(i.salt1,0),i.salt1=r,s=e.newPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([a,s]).then((e=>(n.password=e[0],n.new_settings.new_algo=i,n.new_settings.new_password_hash=e[1],this.apiManager.invokeApi("account.updatePasswordSettings",n))))}))}getInputCheckPassword(e,t){return this.cryptoWorker.invokeCrypto("computeSRP",e,t,!1)}check(e,t,a={}){return this.getInputCheckPassword(e,t).then((e=>this.apiManager.invokeApi("auth.checkPassword",{password:e},a).then((e=>("auth.authorization"===e._&&this.apiManager.setUser(e.user),e)))))}confirmPasswordEmail(e){return this.apiManager.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return this.apiManager.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return this.apiManager.invokeApi("account.cancelPasswordEmail")}}var Y=a(6848),X=a(5471);class ee extends G{constructor(){super(...arguments),this.contexts=new Map,this.links={},this.log=(0,I.kg)("RD",void 0,!0)}saveContext(e,t,a){[a,e]=this.getContexts(e),a||(a=new Set,this.contexts.set(e,a)),this.links[T(e)]=e;for(const e of a)if((0,Y.Z)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[T(e)]}getContexts(e){return[this.contexts.get(e)||(e=this.getReferenceByLink(e)||e,this.contexts.get(e)),e]}getContext(e){const t=this.getContexts(e);return t[0]?[t[0].values().next().value,t[1]]:void 0}deleteContext(e,t,a){if([a,e]=this.getContexts(e),a)for(const s of a)if((0,Y.Z)(s,t))return a.delete(s),a.size||(this.contexts.delete(e),delete this.links[T(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const a=this.getContext(e);if(!a)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=a}let a;switch(null==t?void 0:t.type){case"message":a=this.appMessagesManager.reloadMessages(t.peerId,t.messageId,!0);break;case"emojiesSounds":a=this.refreshEmojiesSoundsPromise||this.appStickersManager.getAnimatedEmojiSounds(!0).then((()=>{this.refreshEmojiesSoundsPromise=void 0}));break;case"userFull":a=Promise.resolve(this.appProfileManager.getProfile(t.userId,!0));break;case"customEmoji":a=this.appEmojiManager.getCustomEmojiDocuments([t.docId]);break;case"attachMenuBotIcon":a=this.appAttachMenuBotsManager.getAttachMenuBot(t.botId,!0);break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const s=T(e);return this.log("refreshReference: refreshing reference:",s),a.then((()=>{const a=T(e);if(this.log("refreshReference: refreshed, reference before:",s,"after:",a),s!==a)return e;this.deleteContext(e,t);const n=this.getContext(e);if(n)return this.refreshReference(e,n[0]);throw this.log.error("refreshReference: no new context, reference before:",s,"after:",a,t),(0,X.Z)("NO_NEW_CONTEXT")}))}}var te=a(7298),ae=a(7381),se=a(252),ne=a(7625),ie=a(6519);function re(e,t){if(!e)return t;for(var a in e)t.hasOwnProperty(a)||delete e[a];for(var a in t)e[a]=t[a];return e}var oe=a(2790),pe=a(3781),de=a(3385),fe=a(5880),ce=a(8050),le=a(2946);function me(e){var t,a;const s=[e.fromId,e.viaBotId,e.fwdFromId],n=e.media;if(n){const e=n.user_id;void 0!==e&&s.push(e.toPeerId());const t=n.results,a=null==t?void 0:t.recent_voters;(null==a?void 0:a.length)&&s.push(...a.map((e=>e.toPeerId())))}const i=null===(t=e.reactions)||void 0===t?void 0:t.recent_reactions;(null==i?void 0:i.length)&&s.push(...i.map((e=>(0,le.Z)(e.peer_id))));const r=e.action;if(r){const e=[...r.users||[],r.user_id,r.inviter_id];s.push(...e.filter(Boolean).map((e=>e.toPeerId())));const t=[r.channel_id,r.chat_id];s.push(...t.filter(Boolean).map((e=>e.toPeerId(!0))))}const o=null===(a=e.replies)||void 0===a?void 0:a.recent_repliers;return(null==o?void 0:o.length)&&s.push(...o.map((e=>(0,le.Z)(e)))),new Set(s.filter(Boolean))}function ge(e,t){const a={writable:!0,configurable:!0},s={};t.forEach((t=>{e.hasOwnProperty(t)||(s[t]=a)})),Object.defineProperties(e,s)}function he(e,t,a){return e[t]=a}var ue=a(8938);const ye=void 0;class _e extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e){this.allDialogsLoaded={},this.pinnedOrders={};for(const e of o.DZ)this.pinnedOrders[e]=[]}else{this.storage.clear(),this.allDialogsLoaded={},this.saveAllDialogsLoaded(),this.pinnedOrders=Object.assign({},this.pinnedOrders);for(const e of o.DZ)this.resetPinnedOrder(e);this.savePinnedOrders()}this.forumTopics=new Map,this.folders={},this.dialogsOffsetDate={},this.dialogsNum=0,this.dialogsIndex=new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0}),this.cachedResults={query:"",count:0,dialogs:[],folderId:0}},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach((e=>{var t;const{folder_id:a,peer:s}=e,n=this.appPeersManager.getPeerId(s),i=this.dropDialog(n)[0];i&&((null===(t=i.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(i,a),i.folder_id=a,this.generateIndexForDialog(i),this.pushDialog({dialog:i})),this.appMessagesManager.scheduleHandleNewDialogs(n,i)}))},this.onUpdateDialogPinned=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$,s=this.appPeersManager.getPeerId(e.peer.peer),n=this.getDialogOnly(s);this.handleDialogTogglePinned(n,e.pFlags.pinned,a)},this.onUpdateChannelPinnedTopic=e=>{const t=e.channel_id.toPeerId(!0),a=(0,pe.Z)(e.topic_id),s=this.getForumTopic(t,a);s&&this.handleDialogTogglePinned(s,e.pFlags.pinned,this.getFilterIdForForum(s))},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$;e.order?this.handleDialogsPinned(a,e.order.map((e=>this.appPeersManager.getPeerId(e.peer)))):this.apiManager.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then((e=>{this.applyDialogs(e),this.handleDialogsPinned(a,e.dialogs.map((e=>e.peerId)))}))},this.onUpdateChannelPinnedTopics=e=>{return t=this,a=void 0,n=function*(){const t=e.channel_id.toPeerId(!0);if(!this.forumTopics.get(t))return;const a=t;if(e.order){const t=e.order.map((e=>(0,pe.Z)(e)));this.handleDialogsPinned(a,t)}else{const e=yield this.apiManager.getLimit("topicPin",!0),s=this.apiManager.invokeApi("channels.getForumTopics",{channel:this.appChatsManager.getChannelInput(t.toChatId()),limit:e,offset_date:0,offset_id:0,offset_topic:0}),n=(yield this.processTopics(t,s)).topics.filter((e=>e.pFlags.pinned));this.handleDialogsPinned(a,n.map((e=>e.id)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}after(){this.clear(!0),this.rootScope.addEventListener("language_change",(()=>{const e=this.appUsersManager.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=this.appPeersManager.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}}));const e=e=>{const t=this.getCachedDialogs(!1);for(let a=0;a{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),a=this.getDialogIndexKeyByFilterId(e.id);for(let e=0;e{this.processDialogForFilters(e),this.prepareDialogUnreadCountModifying(e)()})),this.rootScope.addEventListener("chat_update",(e=>{const t=this.appChatsManager.getChat(e),a=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(a)&&this.dropDialogOnDeletion(a)})),this.apiUpdatesManager.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updateChannelPinnedTopic:this.onUpdateChannelPinnedTopic,updatePinnedDialogs:this.onUpdatePinnedDialogs,updateChannelPinnedTopics:this.onUpdateChannelPinnedTopics}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("dialogs")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.dialogs=this.storage.getCache();for(const t of o.DZ){const a=e.pinnedOrders[t];if(!a)continue;const s=this.getPinnedOrders(t);s.splice(0,s.length,...a)}t.length&&W.Z.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{},t.length&&this.appDraftsManager.addMissedDialogs()}))}setDialogsFromState(e){for(let t=0,a=e.length;tthis.allDialogsLoaded[e]))&&(this.allDialogsLoaded[void 0]=!0),this.saveAllDialogsLoaded())}saveAllDialogsLoaded(){this.appStateManager.pushToState("allDialogsLoaded",this.allDialogsLoaded)}handleDialogUnpinning(e,t){delete e.pFlags.pinned,(0,M.Z)(this.getPinnedOrders(t),this.isFilterIdForForum(t)?e.id:e.peerId),this.savePinnedOrders()}savePinnedOrders(){this.appStateManager.pushToState("pinnedOrders",this.pinnedOrders)}resetPinnedOrder(e){this.getPinnedOrders(e).length=0}getPinnedOrders(e){let t=this.pinnedOrders[e];return!t&&this.isFilterIdForForum(e)&&(ge(this.pinnedOrders,[e]),t=this.pinnedOrders[e]=[]),t}isDialogPinned(e,t){const a=this.filtersStorage.getFilter(t);let s;return s=a?-1!==a.pinnedPeerIds.indexOf(e):!!this.getDialogOnly(e).pFlags.pinned,s}getOffsetDate(e){const t=this.dialogsOffsetDate[e]||0;return e!==ye||t?t:Math.min(...Array.from(o.DZ).sort(((e,t)=>e-t)))}generateFolder(e){const t={dialogs:[],id:e,unreadMessagesCount:0,unreadPeerIds:new Set,unreadUnmutedPeerIds:new Set};return ge(t,["dispatchUnreadTimeout"]),t}getFolder(e){var t,a;return null!==(t=(a=this.folders)[e])&&void 0!==t?t:a[e]=this.generateFolder(e)}isFilterIdForForum(e){return e&&e<0}getFilterIdForForum(e){return e.peerId}getDialogKey(e){return this.isTopic(e)?e.id:e.peerId}getFolderDialogs(e,t=!0){if(e===ye)return this.getCachedDialogs(t);const a=this.getFolder(e);return this.isFilterIdForForum(e)?t?a.dialogs.filter((e=>!e.pFlags.hidden)):a.dialogs:t?a.dialogs.filter((e=>void 0===e.migratedTo)):a.dialogs}getNextDialog(e,t,a){const s=this.getFolderDialogs(a,!0);let n;if(e){const a=s.findIndex((t=>t.peerId===e));-1!==a&&(n=s[t?a+1:a-1])}else t&&(n=s[0]);return n}getDialogIndexKeyByFilterId(e){if(this.isFilterIdForForum(e))return(0,de.Z)();if(o.DZ.has(e))return(0,de.Z)(e);const t=this.filtersStorage.getFilter(e);return(0,de.Z)(t.localId)}isDialogUnmuted(e){return!this.appNotificationsManager.isPeerLocalMuted({peerId:e.peerId,respectType:!0,threadId:this.isTopic(e)?e.id:void 0})}getFolderUnreadCount(e){const t=this.getFolder(e);return{unreadUnmutedCount:t.unreadUnmutedPeerIds.size,unreadCount:t.unreadPeerIds.size}}getCachedDialogs(e){const t=Array.from(o.DZ).map((t=>this.getFolderDialogs(t,e)));return[].concat(...t)}setDialogIndexInFilter(e,t,a){var s,n;let i;const r=this.isTopic(e),p=r||o.DZ.has(a.id);if(this.filtersStorage.testDialogForFilter(e,a)){const t=r?this.getPinnedOrders(this.getFilterIdForForum(e)):a.pinnedPeerIds,o=this.getDialogKey(e),d=t.indexOf(o);i=-1!==d?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(t.length-1-d),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)||p?this.generateIndexForDialog(e,!0,void 0,!p):null!==(n=(0,ce.Z)(e))&&void 0!==n?n:this.generateIndexForDialog(e,!0)}return he(e,t,i)}getDialog(e,t,a,s=!0){const n=[];a&&(t=e),void 0===t?n.push(...Array.from(o.DZ).map((e=>this.getFolder(e).dialogs))):n.push(this.getFolderDialogs(t,!1));const i=a?e=>e.id===a:t=>t.peerId===e;for(const e of n){let t=0,a=0;for(let n=e.length;tt.id===e.id:t=>t.peerId===e.peerId,d=r.findIndex(p),f=r[d],c=this.getDialogIndex(f,i);a&&n>o.Zi&&(a=void 0);const l=a?void 0:this.setDialogIndexInFilter(e,i,t);return c!==l&&((!c&&l||d&&!l)&&this.prepareFolderUnreadCountModifyingByDialog(n,e,!!l),-1!==d&&r.splice(d,1),l&&(0,ie.Z)(r,e,(e=>this.getDialogIndex(e,i)),-1),!0)}prepareDialogUnreadCountModifying(e){const t=this.isTopic(e),a=[],s=t?this.getFilterIdForForum(e):e.folder_id;if(a.push(this.prepareFolderUnreadCountModifyingByDialog(s,e)),!t){const t=this.filtersStorage.getFilters();for(const s in t){const n=t[s];this.filtersStorage.testDialogForFilter(e,n)&&a.push(this.prepareFolderUnreadCountModifyingByDialog(n.id,e))}}return()=>a.forEach((e=>e()))}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t),i=a-s;this.modifyFolderUnreadCount(e,i,!!a,a&&n,t)};{const i=a?s:-s;this.modifyFolderUnreadCount(e,i,!!s,s&&n,t)}}modifyFolderUnreadCount(e,t,a,s,n){var i;const r=this.getFolder(e);t&&(r.unreadMessagesCount=Math.max(0,r.unreadMessagesCount+t));const o=this.getDialogKey(n);a?r.unreadPeerIds.add(o):r.unreadPeerIds.delete(o),s?r.unreadUnmutedPeerIds.add(o):r.unreadUnmutedPeerIds.delete(o),null!==(i=r.dispatchUnreadTimeout)&&void 0!==i||(r.dispatchUnreadTimeout=E.Z.setTimeout((()=>{r.dispatchUnreadTimeout=void 0;const e=Object.assign({},r);delete e.dialogs,this.rootScope.dispatchEvent("folder_unread",e)}),0))}generateIndexForDialog(e,t,a,s){var n;if(!t)return;const i=this.isTopic(e);let r,o=0;if(e.pFlags.hidden)o=this.generateDialogPinnedDateByIndex(4095),r=!0;else if(e.pFlags.pinned&&!s)o=this.generateDialogPinnedDate(e),r=!0;else{if(a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),o=(null==a?void 0:a.date)||o,!i){const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!o||e.date&&e.date>o)&&(o=e.date)}}"draftMessage"===(null===(n=e.draft)||void 0===n?void 0:n._)&&e.draft.date>o&&(o=e.draft.date)}o||(o=(0,te.Z)(!0));const p=this.generateDialogIndex(o,r);if(t)return p;he(e,(0,de.Z)(e.folder_id),p)}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.isTopic(e),a=this.getPinnedOrders(t?this.getFilterIdForForum(e):e.folder_id),s=this.getDialogKey(e);let n=a.indexOf(s);return-1===n&&(a.unshift(s),n=0,t||this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(a.length-1-n)}setDialogToState(e){if(this.isTopic(e))return;const{peerId:t,pts:a}=e,s=this.appMessagesManager.getHistoryStorage(t),n=this.appMessagesManager.getHistoryMessagesStorage(t),i=s.history.slice;let r;for(let e=0,a=i.length;e{"dialogFolder"===t._&&e.dialogs.splice(a,1)})),(0,ue.Z)(s),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const n=new Map;s.forEach((e=>{var t,s;const i=this.appPeersManager.getPeerId(e.peer);let r=e.top_message;const o=this.appMessagesManager.pendingTopMsgs[i];if(o){const t=this.appMessagesManager.getMessageByPeer(i,o),a=this.appMessagesManager.getMessageByPeer(i,r);(!r||t&&(!a||(null==t?void 0:t.date)>(null==a?void 0:a.date)))&&(e.top_message=r=o,this.appMessagesManager.getHistoryStorage(i).maxId=o)}if(r||"draftMessage"===(null===(t=e.draft)||void 0===t?void 0:t._)){if(this.saveDialog({dialog:e})){const t=(e=>{let t=n.get(e);return t||n.set(e,t={}),t})(i);a?(null!==(s=t.topics)&&void 0!==s?s:t.topics=new Map).set(e.id,e):t.dialog=e}}else this.dropDialogWithEvent(i,a?this.getDialogKey(e):void 0);const p=this.appMessagesManager.getUpdateAfterReloadKey(i,a?this.getDialogKey(e):void 0),d=this.appMessagesManager.newUpdatesAfterReloadToHandle[p];if(void 0!==d){for(const e of d)d.delete(e),this.apiUpdatesManager.saveUpdate(e);d.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[p]}})),n.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",n)}getDialogOffsetDate(e){const t=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);return(null==t?void 0:t.date)||0}canSaveDialogByPeerId(e){if(e.isAnyChat()){const t=this.appChatsManager.getChat(e.toChatId());if("channelForbidden"===t._||t.pFlags.left)return!1}return!0}saveDialog({dialog:e,folderId:t,ignoreOffsetDate:a,saveGlobalOffset:s}){var n,i;const r=this.isTopic(e),p=!r,d=r?e.id=(0,pe.Z)(e.id):void 0;r||null!=t||(t=null!==(n=e.folder_id)&&void 0!==n?n:o.J$);const f=this.appPeersManager.getPeerId(e.peer);if(!f)return console.error("saveConversation no peerId???",e,t),!1;if(r||"dialog"===e._||console.error("saveConversation not regular dialog",e,Object.assign({},e)),p&&!this.canSaveDialogByPeerId(f))return!1;const c=this.appPeersManager.isChannel(f)?f.toChatId():o.NM;if(p){const e=this.appPeersManager.getPeerSearchText(f);this.dialogsIndex.indexObject(f,e)}const l=this.getDialogOrTopic(f,d);let m,g;if(e.top_message){m=(0,pe.Z)(e.top_message);const t=(null==l?void 0:l.top_message)&&this.appMessagesManager.getMessageByPeer(f,l.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&l.top_message>=m&&(m=l.top_message),g=this.appMessagesManager.getMessageByPeer(f,m)}else m=this.appMessagesManager.generateTempMessageId(f),g={_:"message",id:m,mid:m,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(f),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([g],{isOutgoing:!0});if((null==g?void 0:g.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,g),p&&!c&&f.isAnyChat()){const t=this.appChatsManager.getChat(f.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[f]=a,this.appMessagesManager.migratedToFrom[a]=f,e.migratedTo=a}}if(e.top_message=m,e.read_inbox_max_id=(0,pe.Z)(l&&!e.read_inbox_max_id?l.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=(0,pe.Z)(l&&!e.read_outbox_max_id?l.read_outbox_max_id:e.read_outbox_max_id),p&&void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=l?l.folder_id:t),e.draft=this.appDraftsManager.saveDraft({peerId:f,threadId:d,draft:e.draft}),e.peerId=f,g&&g.pFlags.is_outgoing){const t=g.pFlags.out;m>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(g.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete g.pFlags.unread}const h=this.appMessagesManager.getHistoryStorage(f,d),u=h.history.slice;if(u.length?u.isEnd(se.D.Bottom)||(h.history.insertSlice([m]).setEnd(se.D.Bottom),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})):(h.history.unshift(m),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})),h.maxId=m,h.readMaxId=e.read_inbox_max_id,h.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:f,threadId:r?e.id:void 0,settings:e.notify_settings}),p&&c&&e.pts&&this.apiUpdatesManager.addChannelState(c,e.pts),this.generateIndexForDialog(e),l){const t=this.dialogsStorage.prepareDialogUnreadCountModifying(l);re(l,e),t()}return this.pushDialog({dialog:e,offsetDate:null==g?void 0:g.date,ignoreOffsetDate:a,saveGlobalOffset:s}),r&&this.processTopicUpdate(e,l),!0}processTopicUpdate(e,t){if(!t)return;const{peerId:a,id:s}=e,n=e.icon_emoji_id!==t.icon_emoji_id,i=e.title!==t.title,r=n||i;n&&this.rootScope.dispatchEvent("avatar_update",{peerId:a,threadId:s}),r&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:a,threadId:s})}getDialogs(e){const{query:t="",offsetIndex:a,limit:s=20,filterId:n=o.J$,skipMigrated:i=!1}=e,r=this.isFilterIdForForum(n);if(!r&&!o.DZ.has(n)){const t=[],a=this.appUsersManager.fillContacts();a.cached||t.push(a.promise);const s=this.filtersStorage.reloadMissingPeerIds(n);if(s&&t.push(s),t.length)return Promise.all(t).then((()=>this.getDialogs(e)))}const p=o.DZ.has(n)&&!this.getOffsetDate(n)||r?n:ye;let d=this.getFolderDialogs(n,i);const f=this.getDialogIndexKeyByFilterId(n);if(t&&!r){if(!s||this.cachedResults.query!==t||this.cachedResults.folderId!==n){this.cachedResults.query=t,this.cachedResults.folderId=n;const e=this.dialogsIndex.search(t),a=[];for(const t in this.dialogs){const s=this.dialogs[t];e.has(s.peerId)&&s.folder_id===n&&a.push(s)}a.sort(((e,t)=>this.getDialogIndex(t,f)-this.getDialogIndex(e,f))),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}d=this.cachedResults.dialogs}else this.cachedResults.query="";let c=0;if(a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const l=this.isDialogsLoaded(p),m=d.length>=c+s;if(t||l||m){const e=d.slice(c,c+s);return{dialogs:e,count:l?d.length:null,isTopEnd:d.length&&(e[0]&&e[0]===d[0]||this.getDialogIndex(d[0],f)=d.length}}return this.appMessagesManager.getTopMessages({limit:s,folderId:p}).then((e=>{if(i&&(d=this.getFolderDialogs(n,i)),c=0,a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const t=d.slice(c,c+s);return{dialogs:t,count:void 0===e.count?d.length:e.count,isTopEnd:d.length&&(t[0]&&t[0]===d[0]||this.getDialogIndex(d[0],f){const t={},a=[];for(const[e,n]of s.getTopicPromises)t[e]=n,a.push((0,oe.Z)(e));s.getTopicPromises.clear();const n=()=>{for(const e in t)t[e].resolve(void 0),s.deletedTopics.add(+e)};if(this.getForumTopicsCache(e)===s)return this.apiManager.invokeApi("channels.getForumTopicsByID",{channel:this.appChatsManager.getChannelInput(e.toChatId()),topics:a}).then((a=>{if(this.getForumTopicsCache(e)===s)return this.applyDialogs(a,e),a.topics.forEach((a=>{"forumTopic"===a._&&(t[a.id].resolve(a),delete t[e])})),a}),(()=>{})).then((()=>{n(),s.getTopicsPromise=void 0,s.getTopicPromises.size&&this.getForumTopicById(e)}));n()}))),n||s.getTopicsPromise}getForumTopic(e,t){var a;const s=this.forumTopics.get(e);return null===(a=null==s?void 0:s.topics)||void 0===a?void 0:a.get(t)}getForumTopicOrReload(e,t){var a;const s=this.getForumTopic(e,t);if(s)return s;const n=this.getForumTopicsCache(e);return(null===(a=null==n?void 0:n.deletedTopics)||void 0===a?void 0:a.has(t))?void 0:this.getForumTopicById(e,t)}processTopics(e,t){return(0,q.Z)(t,(t=>{"pts"in t&&this.apiUpdatesManager.addChannelState(e.toChatId(),t.pts);const a=this.appPeersManager.getOutputPeer(e);return t.topics=t.topics.map((e=>{if("forumTopicDeleted"!==e._)return e.peer=a,e.id=(0,pe.Z)(e.id),e})).filter(Boolean),t}))}processTopicsPromise(e,t){return t.then((t=>(this.processTopics(e,t),t)))}getForumUnreadCount(e){if(!this.appPeersManager.isForum(e))return;const t=this.getFolder(e),a=t.dialogs.length>=20||this.isDialogsLoaded(e)?t.dialogs.slice(0,20):(0,q.Z)(this.getDialogs({filterId:e,limit:20}),(e=>e.dialogs));return(0,q.Z)(a,(e=>e.reduce(((e,t)=>e+ +!!t.unread_count),0)))}handleDialogTogglePinned(e,t,a){e&&(t?e.pFlags.pinned=!0:this.handleDialogUnpinning(e,a),this.generateIndexForDialog(e)),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e)}handleDialogsPinned(e,t){const a=this.isFilterIdForForum(e);this.resetPinnedOrder(e),this.getPinnedOrders(e).push(...t),this.savePinnedOrders(),t.reverse();const s={};t.forEach((t=>{s[t]=!0;const n=a?e:t,i=a?t:void 0,r=this.getDialogOrTopic(n,i);this.appMessagesManager.scheduleHandleNewDialogs(n,r),r&&(r.pFlags.pinned=!0,this.generateIndexForDialog(r))}));const n=this.getFolderDialogs(e,!1);for(const e of n){if(!e.pFlags.pinned)break;s[this.getDialogKey(e)]||(delete e.pFlags.pinned,this.generateIndexForDialog(e),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e))}}}var ve=a(8479),Pe=a(4064),be=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Me=[["pinned_peers","pinnedPeerIds"],["exclude_peers","excludePeerIds"],["include_peers","includePeerIds"]],Ie=o.DZ.size,Se={_:"dialogFilter",pFlags:{},flags:0,id:0,title:"",exclude_peers:[],include_peers:[],pinned_peers:[],excludePeerIds:[],includePeerIds:[],pinnedPeerIds:[]};class Ce extends G{constructor(){super(...arguments),this.clear=e=>{if(e){this.filters={},this.filtersArr=[],this.reloadedPeerIds=new Set,this.localFilters={};for(const e of o.DZ)this.localFilters[e]=this.generateLocalFilter(e)}else this.reloadedPeerIds.clear(),this.clearFilters();this.localId=o.Gu},this.onUpdateDialogFilter=e=>{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id],(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id))),this.pushToState()},this.onUpdateDialogFilters=e=>{const t=(0,ve.Z)(this.filters);this.getDialogFilters(!0).then((e=>{for(const a in t){const t=+a;e.find((e=>e.id===t))||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map((e=>e.id))})}))},this.onUpdateDialogFilterOrder=e=>{const t=e.order.slice();t.includes(o.Zi)||t.splice(t[0]===o.J$?1:0,0,o.Zi),this.localId=o.Gu,t.forEach((e=>{const t=this.filters[e];delete t.localId,this.setLocalId(t)})),this.rootScope.dispatchEvent("filter_order",t),this.pushToState()}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:this.onUpdateDialogFilters,updateDialogFilterOrder:this.onUpdateDialogFilterOrder}),this.rootScope.addEventListener("premium_toggle",(()=>{this.onUpdateDialogFilters({_:"updateDialogFilters"})})),this.appStateManager.getState().then((e=>{this.prependFilters(e.filtersArr).map((e=>{this.saveDialogFilter(e,!1,!0)}))}))}prependFilters(e){e=e.slice();const t=this.localFilters[o.J$],a=this.localFilters[o.Zi],s=e.findIndex((e=>"dialogFilterDefault"===e._||e.id===o.J$));return-1!==s?e[s]=t:e.unshift(t),(0,Pe.Z)(e,(e=>e.id===o.Zi)),e.splice(e[0]===t?1:0,0,a),this.localId=o.Gu,e.forEach((e=>{delete e.localId})),e}generateLocalFilter(e){const t=Object.assign(Object.assign({},(0,ve.Z)(Se)),{id:e});return e===o.J$?t.pFlags.exclude_archived=!0:e===o.Zi&&(t.pFlags.exclude_unarchived=!0),o.DZ.has(e)&&(t.pinnedPeerIds=this.dialogsStorage.getPinnedOrders(e)),t}pushToState(){this.appStateManager.pushToState("filtersArr",this.filtersArr)}testDialogForFilter(e,t){if(!t)return!0;if(o.DZ.has(t.id))return e.folder_id===t.id&&this.dialogsStorage.canSaveDialogByPeerId(e.peerId);const a=e.peerId;if(!this.appMessagesManager.getDialogOnly(a))return!1;if(t.excludePeerIds.includes(a))return!1;if(t.includePeerIds.includes(a))return!0;const s=t.pFlags;if(s.exclude_archived&&e.folder_id===o.Zi)return!1;if(s.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(s.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted({peerId:a})&&(!e.unread_mentions_count||!e.unread_count))return!1;if(this.appPeersManager.isAnyChat(a)){if(s.broadcasts&&this.appPeersManager.isBroadcast(a))return!0;if(s.groups&&this.appPeersManager.isAnyGroup(a))return!0}else{const e=a.toUserId();if(this.appUsersManager.isBot(e))return!!s.bots;if(s.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(s.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}getFilters(){return this.filters}clearFilters(){const e=this.getFilters();for(const t in e)o.DZ.has(+t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:+t})}toggleDialogPin(e,t){return be(this,void 0,void 0,(function*(){const a=this.filters[t],s=a.pinnedPeerIds.indexOf(e),n=-1!==s;if(n&&(a.pinned_peers.splice(s,1),a.pinnedPeerIds.splice(s,1)),!n){if(a.pinned_peers.length>=(yield this.apiManager.getConfig()).pinned_infolder_count_max)return Promise.reject((0,X.Z)("PINNED_DIALOGS_TOO_MUCH"));a.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),a.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(a)}))}createDialogFilter(e,t){const a=Math.max(1,...Object.keys(this.filters).map((e=>+e)));return(e=(0,ve.Z)(e)).id=a+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,a=!1){const s=t?0:1;return this.apiManager.invokeApi("messages.updateDialogFilter",{flags:s,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then((s=>{if(s&&(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),a)){const t=[];for(const e in this.filters){const a=this.filters[e];++a.localId,t.push(a)}e.localId=o.Gu;const a=t.sort(((e,t)=>e.localId-t.localId)).map((e=>e.id));this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:a})}return s}))}getOutputDialogFilter(e){const t=(0,ve.Z)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){(0,ne.Z)(e.includePeerIds,((t,a)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(a,1),e.includePeerIds.splice(a,1))}))}reloadMissingPeerIds(e,t="pinned_peers"){const a=this.getFilter(e),s=null==a?void 0:a[t];if(!(null==s?void 0:s.length))return;const n=s.filter((e=>{const t=this.appPeersManager.getPeerId(e),a=this.reloadedPeerIds.has(t),s=this.appMessagesManager.getDialogOnly(t);return!a&&!s}));if(!n.length)return;const i=n.map((e=>{const t=this.appPeersManager.getPeerId(e);return this.appMessagesManager.reloadConversation(e).then((e=>(this.reloadedPeerIds.add(t),e?void 0:t)))}));return Promise.all(i).then((e=>{(e=e.filter(Boolean)).length}))}getDialogFilters(e=!1){return be(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length>Ie&&!e)return t.map((e=>this.filters[e])).sort(((e,t)=>e.localId-t.localId));const a=yield this.apiManager.invokeApiSingle("messages.getDialogFilters");return this.prependFilters(a).map((t=>this.saveDialogFilter(t,e))).filter(Boolean)}))}getSuggestedDialogsFilters(){return this.apiManager.invokeApi("messages.getSuggestedDialogFilters")}saveDialogFilter(e,t=!0,a){"dialogFilterDefault"===e._&&(e=this.localFilters[o.J$]),(0,ue.Z)(e),o.DZ.has(e.id)||(Me.forEach((([t,a])=>{(0,ue.Z)(e),e[a]=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];return s?Object.assign(s,e):this.filters[e.id]=e,this.setLocalId(e),a||(t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)),e}setLocalId(e){void 0!==e.localId?e.localId>=this.localId&&(this.localId=e.localId+1):(e.localId=this.localId++,(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id)),this.filtersArr.push(e),this.pushToState())}isFilterIdAvailable(e){return be(this,void 0,void 0,(function*(){if(o.DZ.has(e))return!0;const t=yield this.apiManager.getLimit("folders");return this.filtersArr.filter((e=>!o.DZ.has(e.id))).slice(0,t).some((t=>t.id===e))}))}}var we=a(6690),ke=a(2821);function Ae(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((a=>{const s=Object.getOwnPropertyDescriptor(t.prototype,a)||Object.create(null);"constructor"!==a&&Object.defineProperty(e.prototype,a,s)}))}))}class De{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=(0,I.kg)("UPDATES",I.v9.Error|I.v9.Warn|I.v9.Log),this.debug=d.ZP,this.subscriptions={},this.processUpdateMessage=(e,t={})=>{const a={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,a);break;case"updateShortMessage":case"updateShortChatMessage":{(0,ue.Z)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,s=e.from_id||(t?this.appPeersManager.peerId:e.user_id),n=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||this.appPeersManager.peerId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:this.appPeersManager.getOutputPeer(s.toPeerId()),peer_id:this.appPeersManager.getOutputPeer(n),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},a);break}case"updatesCombined":case"updates":this.appUsersManager.saveApiUsers(e.users,t.override),this.appChatsManager.saveApiChats(e.chats,t.override),e.updates.forEach((e=>{this.processUpdate(e,a)}));break;default:this.log.warn("Unknown update message",e)}},this._constructor(!1)}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,a,s){return t[a]=s,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;this.appStateManager.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){var e;const t=this.updatesState,a=t.seq+1,s=t.pendingSeqUpdates[a];if(!s)return!1;const n=s.updates;for(let e=0,t=n.length;e=t.syncPending.seqAwaiting&&(t.syncPending.ptsAwaiting?delete t.syncPending.seqAwaiting:this.clearStatePendingSync(t)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort(((e,t)=>e.pts-t.pts));let a=t.pts,s=0,n=0;for(let e=0,i=t.pendingPtsUpdates.length;e=i.pts&&(s=i.pts,n=e)}if(!s)return!1;this.debug&&this.log.debug("pop pending pts updates",s,t.pendingPtsUpdates.slice(0,n+1)),t.pts=s;for(let e=0;e<=n;++e){const a=t.pendingPtsUpdates[e];this.saveUpdate(a)}return t.pendingPtsUpdates.splice(0,n+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:this.clearStatePendingSync(t)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState,a=t.syncLoading;a||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.apiManager.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then((a=>{if(this.debug&&this.log.debug("Get diff result",a),"updates.differenceEmpty"===a._)return this.debug&&this.log.debug("apply empty diff",a.seq),t.date=a.date,void(t.seq=a.seq);if(e&&this.rootScope.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==a._){this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.other_updates.forEach((e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)})),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})}));const e="updates.difference"===a._?a.state:a.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=a.pts,t.date=(Date.now()/1e3|0)+this.timeManager.getServerTimeOffset(),delete t.seq,this.channelStates={},this.log.warn("getDifference:",a._),this.onDifferenceTooLong();if("updates.differenceSlice"===a._)return this.getDifference();this.debug&&this.log.debug("finished get diff")}));return a||this.justAName(t,s),s}clearStatePendingSync(e){e.syncPending&&(clearTimeout(e.syncPending.timeout),e.syncPending=null)}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.debug?this.log.bindPrefix("getChannelDifference-"+e):void 0,n=this.apiManager.invokeApi("updates.getChannelDifference",{channel:this.appChatsManager.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:1e3},{timeout:2147483647}).then((a=>{if(null==s||s.debug("diff result",a),t.pts="pts"in a?a.pts:void 0,t.lastDifferenceTime=Date.now(),"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),null==s||s.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach((e=>{this.saveUpdate(e)})),null==s||s.debug("applying",a.new_messages.length,"channel new messages"),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})})),null==s||s.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);null==s||s.debug("finished channel get diff")}}));return a||this.justAName(t,n,e),n}onDifferenceTooLong(){this.appUsersManager.clear(),this.appChatsManager.clear(),this.appMessagesManager.clear(),this.rootScope.dispatchEvent("state_cleared")}justAName(e,t,a){e.syncLoading=t,this.rootScope.dispatchEvent("state_synchronizing",a),t.then((()=>{e.syncLoading=null,this.rootScope.dispatchEvent("state_synchronized",a)}),(()=>{e.syncLoading=null}))}addChannelState(e,t){var a,s;if(!t)throw new Error("Add channel state without pts "+e);return null!==(a=(s=this.channelStates)[e])&&void 0!==a?a:s[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null}}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a,s,n,i;let r;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":r=this.appPeersManager.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(r=e.channel_id,!(r in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(r=e.channel_id)}const{pts:o,pts_count:p}=e,d=r?this.getChannelState(r,o):this.updatesState;if(d.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!d.lastPtsUpdateTime||d.lastPtsUpdateTime{d.syncPending=null,d.syncLoading||(r?this.getChannelDifference(r):this.getDifference())}),6)}),d.syncPending.ptsAwaiting=!0,!1;if(o>d.pts)d.pts=o,f=!0,d.lastPtsUpdateTime=Date.now();else if(p)return!1;r&&t.date&&this.updatesState.date0){const a=t.seq,r=t.seqStart||a;if(r!==d.seq+1&&r>d.seq)return this.debug&&this.log.warn("Seq hole",d,null===(s=d.syncPending)||void 0===s?void 0:s.seqAwaiting),null!==(n=(i=d.pendingSeqUpdates)[r])&&void 0!==n||(i[r]={seq:a,date:t.date,updates:[]}),d.pendingSeqUpdates[r].updates.push(e),d.syncPending||(d.syncPending={timeout:E.Z.setTimeout((()=>{d.syncPending=null,d.syncLoading||this.getDifference()}),6)}),(!d.syncPending.seqAwaiting||d.syncPending.seqAwaiting{const t=this.getChannelState(e);t.syncLoading||t.lastDifferenceTime&&!(Date.now()-t.lastDifferenceTime>2500)||this.getChannelDifference(e)};null!==(a=n.interval)&&void 0!==a||(n.interval=E.Z.setInterval(i,3e3)),i()}unsubscribeFromChannelUpdates(e,t){const a=this.subscriptions[e];!(null==a?void 0:a.interval)||--a.count&&!t||(clearInterval(a.interval),a.interval=void 0,delete this.subscriptions[e])}attach(e){this.attached||(this.log("attach"),this.attached=!0,this.appStateManager.getState().then((({updates:t})=>{const a=this.appStateManager.newVersion;t&&t.pts&&t.date?(Object.assign(this.updatesState,t),this.log("will get difference",Object.assign({},t)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise((e=>{this.apiManager.invokeApi("updates.getState",{},{noErrorBox:!0}).then((t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()}))}))),this.apiManager.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),a&&this.updatesState.syncLoading.then((()=>{return t=this,s=void 0,i=function*(){const t={en:"was updated to version",ru:"обновлён до версии"},s=e=>{fetch(`changelogs/${e}_${a.split(" ")[0]}.md`).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((s=>{const n=t[e]||t.en;s=`**Telegram Web${_.Z.suffix} ${n} ${a}**\n\n`+s;const i=[],r={_:"updateServiceNotification",entities:i,message:(0,ke.Z)(s,i),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(r)}))},n=(0,we.Z)([e,"en"]);for(const e of n)try{yield s(e);break}catch(e){}},new((n=void 0)||(n=Promise))((function(e,a){function r(e){try{p(i.next(e))}catch(e){a(e)}}function o(e){try{p(i.throw(e))}catch(e){a(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(t,s||[])).next())}));var t,s,n,i}))})))}}Ae(De,[p.Z,G]);class Ue extends G{constructor(){super(...arguments),this.savedAvatarURLs={}}after(){this.rootScope.addEventListener("avatar_update",(({peerId:e,threadId:t})=>{t||this.removeFromAvatarsCache(e)}))}isAvatarCached(e,t){const a=this.savedAvatarURLs[e];return void 0===t?!!a:!(!a||!a[t]||a[t]instanceof Promise)}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,a){var s,n;const i=null!==(s=(n=this.savedAvatarURLs)[e])&&void 0!==s?s:n[e]={};if(i[a])return i[a];{const s={_:"inputPeerPhotoFileLocation",pFlags:{},peer:this.appPeersManager.getInputPeerById(e),photo_id:t.photo_id},n={dcId:t.dc_id,location:s};"photo_big"===a&&(s.pFlags.big=!0,n.limitPart=524288);const r=this.apiFileManager.download(n);return i[a]=r.then((e=>i[a]=URL.createObjectURL(e)))}}}var Te=a(144),Ee=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Fe extends G{after(){this.calls=new Map,i().IS_CALL_SUPPORTED&&this.apiUpdatesManager.addMultipleEventsListeners({updatePhoneCall:e=>{this.saveCall(e.phone_call)},updatePhoneCallSignalingData:e=>{this.rootScope.dispatchEvent("call_signaling",{callId:e.phone_call_id,data:e.data})}})}computeKey(e,t,a){return this.cryptoWorker.invokeCrypto("compute-dh-key",e,t,a)}saveCall(e){const t="phoneCallDiscarded"===e._,a=this.calls.get(e.id);return a?(re(a,e),t&&this.calls.delete(e.id),e=a):t||this.calls.set(e.id,e),this.rootScope.dispatchEvent("call_update",e),e}getCall(e){return this.calls.get(e)}getCallInput(e){const t=this.getCall(e);return{_:"inputPhoneCall",id:t.id,access_hash:t.access_hash}}savePhonePhoneCall(e){return this.appUsersManager.saveApiUsers(e.users),this.saveCall(e.phone_call)}generateDh(){return this.apiManager.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then((e=>this.cryptoWorker.invokeCrypto("generate-dh",e)))}requestCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){const n=yield this.apiManager.invokeApi("phone.requestCall",{user_id:this.appUsersManager.getUserInput(e),protocol:t,video:s,random_id:(0,Te.d)(32),g_a_hash:a});return this.savePhonePhoneCall(n)}))}discardCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){if(!this.getCall(e))return;const n=yield this.apiManager.invokeApi("phone.discardCall",{video:s,peer:this.getCallInput(e),duration:t,reason:{_:a},connection_id:"0"});this.apiUpdatesManager.processUpdateMessage(n)}))}}var Re=a(7120),xe=a(2566);class Be extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.chats={};else for(const e in this.chats)if(e&&!this.peersStorage.isPeerNeeded(e.toPeerId(!0))){const t=this.chats[e];this.appUsersManager.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.chats[e]}},this.onChatUpdated=(e,t)=>{var a;this.apiUpdatesManager.processUpdateMessage(t),(null===(a=null==t?void 0:t.updates)||void 0===a?void 0:a.length)&&this.isChannel(e)&&this.rootScope.dispatchEvent("invalidate_participants",e)}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateChannelParticipant:e=>{this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e.channel_id))},updateChatDefaultBannedRights:e=>{const t=this.appPeersManager.getPeerId(e.peer).toChatId(),a=this.chats[t];a&&(a.default_banned_rights=e.default_banned_rights,this.rootScope.dispatchEvent("chat_update",t))}}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("chats")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiChats(t),this.peersStorage.addEventListener("peerNeeded",(e=>{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())}))}))}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiChat(e,t))))}saveApiChat(e,t){var a,s,n,i,r;if(!e||"chatEmpty"===e._)return;const o=this.chats[e.id];if(null!==(a=(r=e).pFlags)&&void 0!==a||(r.pFlags={}),e.pFlags.min&&void 0!==o)return;"channel"===e._&&void 0===e.participants_count&&void 0!==o&&o.participants_count&&(e.participants_count=o.participants_count),"chatPhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo;const p=this.appUsersManager.setUsernameToCache(e,o),d=e.id.toPeerId(!0);if(void 0===o)this.chats[e.id]=e;else{const t=(null===(n=o.photo)||void 0===n?void 0:n.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id)||o.pFlags.forum!==e.pFlags.forum,a=o.title!==e.title||p,s=o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake;re(o,e),this.rootScope.dispatchEvent("chat_update",e.id),t&&this.rootScope.dispatchEvent("avatar_update",{peerId:d}),(a||s)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:d})}this.peersStorage.isPeerNeeded(d)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]}hasRights(e,t,a,s){return(0,Re.Z)(this.getChat(e),t,a,s)}editChatDefaultBannedRights(e,t){const a=this.getChat(e);return a.default_banned_rights&&a.default_banned_rights.until_date===t.until_date&&(0,Y.Z)(a.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():this.apiManager.invokeApi("messages.editChatDefaultBannedRights",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.megagroup)}isForum(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.forum)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return(!a||"channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return t&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getInputPeer(e){return this.isChannel(e)?this.getChannelInputPeer(e):this.getChatInputPeer(e)}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const a=this.chats[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e){return this.apiManager.invokeApi("channels.createChannel",e).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}inviteToChannel(e,t){const a=this.getChannelInput(e),s=t.map((e=>this.appUsersManager.getUserInput(e)));return this.apiManager.invokeApi("channels.inviteToChannel",{channel:a,users:s}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return this.apiManager.invokeApi("messages.createChat",{users:t.map((e=>this.appUsersManager.getUserInput(e))),title:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}leaveChannel(e){return this.apiManager.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return this.apiManager.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,a=100){return this.apiManager.invokeApi("messages.addChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t),fwd_limit:a}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return this.apiManager.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,this.appUsersManager.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return this.apiManager.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return this.apiManager.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):this.apiManager.invokeApi("messages.migrateChat",{chat_id:e}).then((t=>(this.onChatUpdated(e,t),t.updates.find((e=>"updateChannel"===e._)).channel_id)))}updateUsername(e,t,a){const s=this.apiManager.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t});return this.refreshChatAfterRequest(e,s,a)}editPhoto(e,t){const a={_:"inputChatUploadedPhoto",file:t};let s;return s=this.isChannel(e)?this.apiManager.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:a}):this.apiManager.invokeApi("messages.editChatPhoto",{chat_id:e,photo:a}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}editTitle(e,t){let a;return a=this.isChannel(e)?this.apiManager.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):this.apiManager.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),a.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}editAbout(e,t){const a=e.toPeerId(!0);return this.apiManager.invokeApi("messages.editChatAbout",{peer:this.appPeersManager.getInputPeerById(a),about:t}).then((e=>(e&&this.rootScope.dispatchEvent("peer_bio_edit",a),e)))}editBanned(e,t,a){const s="object"!=typeof t?t:(0,xe.Z)(t);return this.apiManager.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(s),banned_rights:a}).then((n=>{if(this.onChatUpdated(e,n),"object"==typeof t){const n=Date.now()/1e3|0;this.apiUpdatesManager.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:n,actor_id:void 0,qts:void 0,user_id:s,prev_participant:t,new_participant:Object.keys(a.pFlags).length?{_:"channelParticipantBanned",date:n,banned_rights:a,kicked_by:this.appUsersManager.getSelf().id,peer:this.appPeersManager.getOutputPeer(s),pFlags:{}}:void 0})}}))}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return this.apiManager.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then((e=>{this.saveApiChats(e.chats)}))}togglePreHistoryHidden(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}toggleSignatures(e,t){return this.apiManager.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}toggleNoForwards(e,t){return this.apiManager.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}setChatAvailableReactions(e,t){const a=this.appProfileManager.getCachedFullChat(e);return a&&(a.available_reactions=t,this.rootScope.dispatchEvent("chat_full_update",e)),this.apiManager.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getSendAs(e){return this.apiManager.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),this.saveApiChats(e.chats),e.peers)})}importChatInvite(e){return this.apiManager.invokeApi("messages.importChatInvite",{hash:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}checkUsername(e,t){return this.apiManager.invokeApi("channels.checkUsername",{channel:this.getChannelInput(e),username:t})}getSponsoredMessage(e){return this.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.getChannelInput(e)},{cacheSeconds:300}).then((e=>{if("messages.sponsoredMessages"===e._){this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=e.messages.shift();e.messages.push(t)}return e}))}viewSponsoredMessage(e,t){return this.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.getChannelInput(e),random_id:t})}checkChatInvite(e){return this.apiManager.invokeApi("messages.checkChatInvite",{hash:e}).then((e=>(e.chat&&this.saveApiChat(e.chat,!0),e)))}toggleUsername(e,t,a){const s=this.apiManager.invokeApi("channels.toggleUsername",{channel:this.getChannelInput(e),username:t,active:a});return this.refreshChatAfterRequest(e,s)}reorderUsernames(e,t){const a=this.apiManager.invokeApi("channels.reorderUsernames",{channel:this.getChannelInput(e),order:t});return this.refreshChatAfterRequest(e,a)}deactivateAllUsernames(e,t){const a=this.apiManager.invokeApi("channels.deactivateAllUsernames",{channel:this.getChannelInput(e)});return this.refreshChatAfterRequest(e,a,t)}makeChannelPrivate(e){const t=[this.updateUsername(e,"",!0),this.deactivateAllUsernames(e,!0)],a=Promise.all(t).then((()=>!0));return this.refreshChatAfterRequest(e,a)}refreshChatAfterRequest(e,t,a){return a?t:t.then((t=>this.getChannels([e]).then((()=>t))))}getChannels(e){return this.apiManager.invokeApi("channels.getChannels",{id:e.map((e=>this.getChannelInput(e)))}).then((e=>{this.saveApiChats(e.chats)}))}toggleForum(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.toggleForum",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}editForumTopic(e){const{chatId:t,topicId:a,title:s,iconEmojiId:n,closed:i,hidden:r}=e;return this.apiManager.invokeApi("channels.editForumTopic",{channel:this.getChannelInput(t),topic_id:(0,oe.Z)(a),title:s,icon_emoji_id:n,closed:i,hidden:r}).then(this.onChatUpdated.bind(this,t))}createForumTopic(e){return t=this,a=void 0,n=function*(){const{chatId:t,title:a,iconColor:s,iconEmojiId:n}=e,i=yield this.appProfileManager.getChannelFull(t),r=i.default_send_as&&this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(i.default_send_as));return this.apiManager.invokeApi("channels.createForumTopic",{channel:this.getChannelInput(t),title:a,icon_color:s,icon_emoji_id:n,random_id:(0,Te.a)(),send_as:r}).then((e=>{this.onChatUpdated(t,e);const a=e.updates.find((e=>"updateNewChannelMessage"===e._));return(0,pe.Z)(a.message.id)}))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}updatePinnedForumTopic(e,t,a){return this.apiManager.invokeApi("channels.updatePinnedForumTopic",{channel:this.getChannelInput(e),topic_id:(0,oe.Z)(t),pinned:a}).then(this.onChatUpdated.bind(this,e))}}a(4762);var Ve,Le=a(5953),Oe=a(9005),Ne=a(6637),Ze=a(2423);function je(e,t){(0,Ne.Z)(e)||(e="https://"+e);const a={url:e};let s,n,i,r;if(s=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);s[1]&&(t.pathname=s[1]+("/"===t.pathname?"":t.pathname));const a=t.pathname.slice(1),n=a.split("/");if(n[0]&&"$"===n[0][0]&&n[0].length>1)r="invoice";else if(/^\W/.test(a)&&!Ze.kO.test(a))r="joinchat";else switch(n[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==n.length&&!s[1]){r=n[0];break}default:if(n[1]&&n[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===n.length){r="im";break}}}else(n=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?r="im":(i=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(r="tg_"+i[1]);return window[r]||(r=void 0),a.onclick=r,a}d.GO&&(d.GO.wrapUrl=je),function(e){let t,s;function n(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function i(){if("h12"===e.timeFormat)try{const t=P({hour:"numeric",minute:"numeric",hour12:!0}),a=new Date;a.setHours(0);const s=t.format(a);e.amPmCache.am=s.split(" ")[1],a.setHours(12);const n=t.format(a);e.amPmCache.pm=n.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function r(){const e=_.Z.langPackCode;return n(e),Promise.all([a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),a.e(8).then(a.bind(a,9179))]).then((([t,a,s])=>{const n=[];return p(t.default,n),p(a.default,n),f({_:"langPackDifference",from_version:0,lang_code:e,strings:n,version:0,local:!0,countries:s.default})}))}function o(t,s){e.requestedServerLanguage=!0;const n=g.managers;return Promise.all([n.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),n.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function p(e,t=[]){for(const a in e){const s=e[a];"string"==typeof s?t.push({_:"langPackString",key:a,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:a},s))}return t}function f(e){return e.appVersion=_.Z.langPackVersion,h.Z.set({langPack:e}).then((()=>(c(e),e)))}function c(a){const s=e.lastRequestedLangCode;if(a.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(a){console.error("pluralRules error",a),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(a.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(a.lang_code.split("-",1)[0])}e.strings.clear();for(const t of a.strings)e.strings.set(t.key,t);a.countries&&(e.countriesList.length=0,e.countriesList.push(...a.countries.countries),a.countries.countries.forEach((t=>{if(t.name){const a=t.default_name;e.strings.set(a,{_:"langPackString",key:a,value:t.name})}}))),e.lastAppliedLangCode!==s&&(g.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,v.clear(),i()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a&&a.update()}))}}function l(e,t,a={i:0}){const s=[];let n=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,i,r,o,p,d,f)=>{if(s.push(f.slice(n,d)),i){let e;switch(i){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...l(r,t,a)),s.push(e)}else if(o)s.push(document.createElement("br"));else if(p){const e=p.lastIndexOf("]"),n=p.slice(1,e),i=p.slice(e+2,p.length-1);let r;if(i&&(0,Ne.Z)(i)){r=document.createElement("a");const e=je(i);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[a.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...l(n,t,a)),s.push(r)}else t&&function(e,t,a){const s=t[a.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,a);return n=d+e.length,""})),n!==e.length&&s.push(e.slice(n)),s}function m(a,s=!1,n){const i=e.strings.get(a);let r;if(i)if("langPackStringPluralized"===i._&&(null==n?void 0:n.length)){let e=n[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=i[t.select(e)+"_value"]||i.other_value}else r="langPackString"===i._?i.value:a;else r=a;const o=l(r,n);return s?o.map((e=>e instanceof Node?e.textContent:e)).join(""):o}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.getCacheLangPack=function(){return s||(s=Promise.all([h.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(d.ZP,e.lastRequestedLangCode||n(t.lang_code),c(t),t):r())).finally((()=>{s=void 0})))},e.setTimeFormat=function(t,a=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,i(),a&&(v.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a instanceof b&&a.update()})))},e.loadLocalLangPack=r,e.loadLangPack=o,e.getStrings=function(e,t){return g.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:_.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return n(e),o(e).then((([e,t,a,s,n,i])=>{let r=[];return[a,s].forEach((e=>{p(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=n,f(e)}))},e.saveLangPack=f,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():a.e(642).then(a.bind(a,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=c,e.superFormatter=l,e.format=m,e.weakMap=new WeakMap;class u{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class y extends u{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,Le.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...m(this.key,!1,this.args));else{const e=this.element[this.property],t=m(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,Y.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=y;const v=new Map;function P(t={}){const a=JSON.stringify(t);let s=v.get(a);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),v.set(a,s)),s}e.amPmCache={am:"AM",pm:"PM"};class b extends u{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"}))}update(t){let a;if((0,Le.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();a=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(a+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=P(this.options);a=(0,Oe.Z)(e.format(this.date))}this.element[this.property]=a}}e.IntlDateElement=b,e.i18n=function(e,t){return new y({key:e,args:t}).element},e.i18n_=function(e){return new y(e).element},e._i18n=function(e,t,a,s){return new y({element:e,key:t,args:a,property:s}).element}}(Ve||(Ve={}));const qe=Ve;Ve.i18n,Ve.i18n_,Ve._i18n,d.GO.I18n=Ve;const Ge=["January","February","March","April","May","June","July","August","September","October","November","December"],He=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],We=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),a=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-a);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/86400+1)/7)};d.GO&&(d.GO.formatDateAccordingToTodayNew=function(e){const t=new Date,a=t.getTime()/1e3|0,s=e.getTime()/1e3|0,n={};return a-s<86400&&t.getDate()===e.getDate()?n.hour=n.minute="2-digit":t.getFullYear()!==e.getFullYear()?(n.year=n.day="numeric",n.month="2-digit"):a-s<604800&&We(t)===We(e)?n.weekday="short":(n.month="short",n.day="numeric"),new qe.IntlDateElement({date:e,options:n}).element});const Ke=2013,ze=new RegExp("20[0-9]{1,2}"),Je=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),$e=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),Qe=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),Ye=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),Xe=[31,29,31,30,31,30,31,31,30,31,30,31];function et(e,t,a){const s=(new Date).getFullYear(),n=Date.now();if(a>=Ke&&a<=s){const s=new Date;s.setFullYear(a,t,1),s.setHours(0,0,0);const i=s.getTime();if(i>n)return;s.setMonth(s.getMonth()+1);const r=s.getTime()-1;e.push({title:at(i),minDate:i,maxDate:r})}}function tt(e,t,a){if(rt(t,a)){const n=(new Date).getFullYear(),i=Date.now();for(let r=n;r>=Ke;r--){if(1===a&&28===t&&((s=r)%4!=0||s%100==0)&&s%400!=0)continue;const o=new Date;o.setFullYear(r,a,t+1),o.setHours(0,0,0);const p=o.getTime();if(p>i)continue;o.setFullYear(r,a,t+2),o.setHours(0,0,0);const d=o.getTime()-1;r===n?e.push({title:st(p),minDate:p,maxDate:d}):e.push({title:nt(p),minDate:p,maxDate:d})}}var s}function at(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function st(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getDate()}function nt(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function it(e){const t=new Date(e);return He[t.getDay()]}function rt(e,t){return t>=0&&t<12&&e>=0&&e{t[e][s]=a})),a[e]=t[e])}d.GO.fillTipDates=function(e,t){const a=e.trim().toLowerCase();if(a.length<3)return;if(0==="today".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-1;return void t.push({title:"Today",minDate:i,maxDate:r})}if(0==="yesterday".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime()-864e5;e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:i,maxDate:r})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let a=0;a<7;a++)if(t.setDate(t.getDate()+1),0===it(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(a);if(s>=0){const e=new Date,a=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>a&&e.setTime(e.getTime()-6048e5);const i=e.getFullYear(),r=e.getMonth(),o=e.getDate();e.setFullYear(i,r,o),e.setHours(0,0,0);const p=e.getTime();e.setFullYear(i,r,o+1),e.setHours(0,0,0);const d=e.getTime()-1;return void t.push({title:it(p),minDate:p,maxDate:d})}let n;if(null===(n=Qe.exec(a)))if(null===(n=Ye.exec(a)))if(null===(n=ze.exec(a))){if(null!==(n=Je.exec(a))){const e=n[1],a=n[2],s=ot(e);if(s>=0){const e=+a;if(e>0&&e<=31)return void tt(t,e-1,s);if(e>=Ke)return void et(t,s,e)}}if(null!==(n=$e.exec(a))){const e=n[1],a=ot(n[2]);if(a>=0){const s=+e;if(s>0&&s<=31)return void tt(t,s-1,a);s>=Ke&&et(t,a,s)}}}else{let e=+a;const s=(new Date).getFullYear();if(e=e;a--){const e=new Date;e.setFullYear(a,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(a+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+a,minDate:s,maxDate:n})}}else if(e<=s){const a=new Date;a.setFullYear(e,0,1),a.setHours(0,0,0);const s=a.getTime();a.setFullYear(e+1,0,1),a.setHours(0,0,0);const n=a.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],a=n[3],s=n[5];if(!n[2]===n[4])return;const i=parseInt(e),r=parseInt(a)-1;let o=parseInt(s);o>=10&&o<=99&&(o+=2e3);const p=(new Date).getFullYear();if(rt(i-1,r)&&o>=Ke&&o<=p){const e=new Date;e.setFullYear(o,r,i),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(o,r,i+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:nt(a),minDate:a,maxDate:s})}}else{const e=n[1],a=n[3],s=parseInt(e),i=parseInt(a);if(s>0&&s<=31){if(i>=Ke&&s<=12)return void et(t,s-1,i);i<=12&&tt(t,s-1,i-1)}else s>=Ke&&i<=12&&et(t,i-1,s)}};var dt=a(2491),ft=a(7072),ct=a(8801),lt=a(6658);const mt={pdf:"application/pdf",tgv:"application/x-tgwallpattern",tgs:"application/x-tgsticker",json:"application/json",wav:"audio/wav",mp3:"audio/mpeg",ogg:"audio/ogg",jpeg:"image/jpeg",jpg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",mp4:"video/mp4",webm:"video/webm",mov:"video/quicktime",svg:"image/svg+xml"},gt={};for(const e in mt)gt[mt[e]]=e;let ht=0;class ut extends G{constructor(){super(...arguments),this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];t.supportsStreaming&&(delete t.supportsStreaming,this.thumbsStorage.deleteCacheContext(t))}}}after(){this.docs={},this.stickerCachedThumbs={},this.uploadingWallPapers={},f.Z.getInstance().addEventListener("serviceWorkerOnline",(e=>{e||this.onServiceWorkerFail()}))}saveDoc(e,t){if(!e||"documentEmpty"===e._)return;const a=this.docs[e.id];e.file_reference&&(pt("file_reference",a,e),this.referenceDatabase.saveContext(e.file_reference,t)),a||(this.docs[e.id]=e);for(let t=0,a=e.attributes.length;t"documentAttributeFilename"===e._)),a=t&&t.file_name.split(".").pop(),s=((e,t={})=>{const a=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+a+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):Ge[e.getMonth()])+a+e.getFullYear()+(t.noTime?"":", "+s)})(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_");e.file_name=`${e.type}_${s}${a?"."+a:""}`}return qs()&&("gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type)&&(e.supportsStreaming=!0,this.thumbsStorage.getCacheContext(e).url||this.thumbsStorage.setCacheContextURL(e,void 0,function(e,t=!1,a){let s;return s=t?"download":a?"thumb":e.supportsStreaming?"stream":"document",(0,ct.q)(s,(0,lt.Z)(e,a))}(e),0)),e.file_name||(e.file_name=""),"application/x-tgsticker"===e.mime_type&&"AnimatedSticker.tgs"===e.file_name&&(e.type="sticker",e.animated=!0,e.sticker=2),a?Object.assign(a,e):e}getDoc(e){return(0,fe.Z)(e)?e:this.docs[e]}downloadDoc(e,t,a){return this.apiFileManager.downloadMedia({media:e,queueId:t,onlyCache:a})}getLottieCachedThumb(e,t){const a=this.stickerCachedThumbs[e];return a&&a[t]}saveLottiePreview(e,t,a,s,n){var i,r,o;const p=this.getDoc(e);if(!p)return;const d=null!==(i=(r=this.stickerCachedThumbs)[o=p.id])&&void 0!==i?i:r[o]={},f=d[n];f&&f.w>=a&&f.h>=s||(d[n]={url:URL.createObjectURL(t),w:a,h:s})}saveWebPConvertedStrippedThumb(e,t){const a=this.getDoc(e);if(!a)return;const s=a.thumbs&&a.thumbs.find((e=>"photoStrippedSize"===e._));s&&(a.pFlags.stickerThumbConverted=!0,s.bytes=t)}getWallPapers(){return this.apiManager.invokeApiHashable({method:"account.getWallPapers"}).then((e=>{const t=e.wallpapers;return t.forEach((e=>{e.document=this.saveDoc(e.document)})),t}))}prepareWallPaperUpload(e){const t="wallpaper-upload-"+ ++ht,a={_:"photoSize",h:0,w:0,location:{},size:e.size,type:o.Pt};let s={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[a],file_name:e.name};s=this.saveDoc(s);const n=this.thumbsStorage.setCacheContextURL(s,void 0,URL.createObjectURL(e),e.size),i={_:"wallPaper",access_hash:"",document:s,id:t,slug:t,pFlags:{}};return this.uploadingWallPapers[t]={cacheContext:n,file:e},i}uploadWallPaper(e){const{cacheContext:t,file:a}=this.uploadingWallPapers[e];return delete this.uploadingWallPapers[e],this.apiFileManager.upload({file:a,fileName:a.name}).then((e=>this.apiManager.invokeApi("account.uploadWallPaper",{file:e,mime_type:a.type,settings:{_:"wallPaperSettings"}}).then((e=>((0,ue.Z)(e),e.document=this.saveDoc(e.document),this.thumbsStorage.setCacheContextURL(e.document,void 0,t.url,t.downloaded),e)))))}getGifs(){return this.apiManager.invokeApiHashable({method:"messages.getSavedGifs",processResult:e=>((0,ue.Z)(e),e.gifs.map((e=>this.saveDoc(e))))})}requestDocPart(e,t,a,s){const n=this.getDoc(e);return n?this.apiFileManager.requestFilePart(t,(0,ft.Z)(n),a,s):Promise.reject((0,X.Z)("NO_DOC"))}}var yt=a(6034);class _t extends G{constructor(){super(...arguments),this.drafts={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateDraftMessage:e=>{const t=this.appPeersManager.getPeerId(e.peer);this.saveDraft({peerId:t,threadId:e.threadId,draft:e.draft,notify:!0})}}),h.Z.get("drafts").then((e=>{this.drafts=e||{}}))}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then((()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();this.appMessagesManager.getDialogOnly(t)||this.appMessagesManager.reloadConversation(t)}}))}getAllDrafts(){var e;return null!==(e=this.getAllDraftPromise)&&void 0!==e?e:this.getAllDraftPromise=this.apiManager.invokeApi("messages.getAllDrafts").then((e=>{(this.apiUpdatesManager.updatesState.syncLoading||Promise.resolve()).then((()=>{this.apiUpdatesManager.processUpdateMessage(e)}))}))}saveDraft({peerId:e,threadId:t,draft:a,notify:s,force:n}){const i=this.processApiDraft(a),r=this.getKey(e,t);return i?this.drafts[r]=i:delete this.drafts[r],h.Z.set({drafts:this.drafts}),s&&this.rootScope.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:i,force:n}),i}isEmptyDraft(e){return"draftMessage"!==(null==e?void 0:e._)||!(void 0!==e.reply_to_msg_id&&e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(e&&"draftMessage"===e._)return e.reply_to_msg_id&&(e.reply_to_msg_id=(0,pe.Z)(e.reply_to_msg_id)),e}syncDraft(e,t,a,s=!0,n=!1){const i=this.getDraft(e,t);if((0,yt.Z)(i,a))return!0;const r={peer:this.appPeersManager.getInputPeerById(e),message:""};let o;if(this.isEmptyDraft(a))o={_:"draftMessageEmpty"};else{(0,ue.Z)(a);const e=a.message,t=a.entities;a.reply_to_msg_id&&(r.reply_to_msg_id=(0,oe.Z)(a.reply_to_msg_id)),(null==t?void 0:t.length)&&(r.entities=this.appMessagesManager.getInputEntities(t)),a.pFlags.no_webpage&&(r.no_webpage=a.pFlags.no_webpage),r.message=e}t&&(r.top_msg_id=(0,oe.Z)(t));const p=o||a;return p.date=(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),this.saveDraft({peerId:e,threadId:t,draft:p,notify:!0,force:n}),!s||this.apiManager.invokeApi("messages.saveDraft",r)}clearAllDrafts(){return this.apiManager.invokeApi("messages.clearAllDrafts").then((e=>{if(e)for(const e in this.drafts){const[t,a]=e.split("_");this.rootScope.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:a?+a:void 0,draft:void 0})}}))}clearDraft(e,t){const a={_:"draftMessageEmpty"};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft({peerId:e,threadId:t,draft:a,notify:!0,force:!0})}setDraft(e,t,a,s){const n={_:"draftMessage",date:Date.now()/1e3|0,message:a,pFlags:{},entities:s};t?this.syncDraft(e,t,n,!1,!0):this.saveDraft({peerId:e,threadId:t,draft:n,notify:!0,force:!0})}}var vt=a(946),Pt=a(7746);const bt={keywords:{},version:0,langCode:_.Z.langPackCode};class Mt extends G{constructor(){super(...arguments),this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={},this.recent={},this.getRecentEmojisPromises={},this.getCustomEmojiDocumentPromises=new Map}getEmojiKeywords(e=_.Z.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const a="emojiKeywords_"+e;return this.getKeywordsPromises[e]=h.Z.get(a).then((t=>((0,fe.Z)(t)||(t={}),(0,vt.Z)(bt,t),t.langCode=e,this.keywordLangPacks[e]=t,this.apiManager.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then((e=>{t.version=e.version;const s=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return this.networkerFactory.language!==_.Z.langPackCode&&e.push(this.getEmojiKeywords(this.networkerFactory.language)),this.recent.native||e.push(this.getRecentEmojis("native")),Promise.all(e)}indexEmojis(){this.index||(this.index=new ae.Z(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const a=t[e];this.index.indexObject(a,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const a=this.index.search(e);t=Array.from(a).reduce(((e,t)=>e.concat(t)),[])}else t=this.recent.native.concat(Mt.POPULAR_EMOJI).slice(0,32);return t=Array.from(new Set(t)),t}getRecentEmojis(e){var t;const a=this.getRecentEmojisPromises;return null!==(t=a[e])&&void 0!==t?t:a[e]=this.appStateManager.getState().then((t=>{let a=[];if("native"===e){const{recentEmoji:e}=t;a=Array.isArray(e)&&e.length?e:Mt.POPULAR_EMOJI}else{const{recentCustomEmoji:e}=t;a=Array.isArray(e)&&e.length?e:[]}return this.recent[e]=a}))}pushRecentEmoji(e){const t=e.docId?"custom":"native";e.emoji=(0,Pt.Z)(e.emoji),this.getRecentEmojis(t).then((a=>{const s=e.docId||e.emoji;(0,M.Z)(a,s),a.unshift(s),a.splice(32,a.length-32),this.appStateManager.pushToState("custom"===t?"recentCustomEmoji":"recentEmoji",a),this.rootScope.dispatchEvent("emoji_recent",e)}))}getCustomEmojiDocuments(e){return e.length?this.apiManager.invokeApi("messages.getCustomEmojiDocuments",{document_id:e}).then((e=>e.map((e=>this.appDocsManager.saveDoc(e,{type:"customEmoji",docId:e.id}))))):Promise.resolve([])}getCachedCustomEmojiDocuments(e){return e.map((e=>this.appDocsManager.getDoc(e)))}setDebouncedGetCustomEmojiDocuments(){!this.getCustomEmojiDocumentsPromise&&this.getCustomEmojiDocumentPromises.size&&(this.getCustomEmojiDocumentsPromise=(0,P.Z)(0).then((()=>{const e=[...this.getCustomEmojiDocumentPromises.keys()],t=[];do{const a=e.splice(0,100),s=this.getCustomEmojiDocuments(a).then((e=>{e.forEach(((e,t)=>{const s=a[t],n=this.getCustomEmojiDocumentPromises.get(s);this.getCustomEmojiDocumentPromises.delete(s),n.resolve(e)}))}));t.push(s)}while(e.length);return Promise.all(t)})).finally((()=>{this.getCustomEmojiDocumentsPromise=void 0,this.setDebouncedGetCustomEmojiDocuments()})))}getCustomEmojiDocument(e){let t=this.getCustomEmojiDocumentPromises.get(e);if(t)return t;return this.appDocsManager.getDoc(e)||(t=(0,v.Z)(),this.getCustomEmojiDocumentPromises.set(e,t),this.setDebouncedGetCustomEmojiDocuments(),t)}getCustomEmojis(){return this.appStickersManager.getEmojiStickers()}}Mt.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];var It=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class St extends G{after(){this.log=(0,I.kg)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,this.apiUpdatesManager.addMultipleEventsListeners({updateGroupCall:e=>{this.saveGroupCall(e.call,e.chat_id)},updateGroupCallParticipants:e=>{this.saveGroupCall(e.call);const t=e.call.id;this.saveApiParticipants(t,e.participants)}}),this.rootScope.addEventListener("group_call_update",(e=>{"groupCallDiscarded"===e._&&this.participants.delete(e.id)}))}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,a=t.get(e);return{nextOffset:a,setNextOffset:s=>{t.get(e)===a&&t.set(e,s)}}}saveApiParticipant(e,t,a){const s=this.getCachedParticipants(e),n=(0,le.Z)(t.peer),i=s.get(n),r=t.pFlags.left;if(!i&&r)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0),i?(re(i,t),t=i):s.set(n,t);const o=this.getGroupCall(e);if("groupCall"===(null==o?void 0:o._)){let e=!1;r?(--o.participants_count,e=!0):!t.pFlags.just_joined||i||t.pFlags.self||(++o.participants_count,e=!0),e&&this.rootScope.dispatchEvent("group_call_update",o)}r&&s.delete(n),this.rootScope.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,a){t.saved||(t.saved=!0,t.forEach((t=>this.saveApiParticipant(e,t,a))))}editParticipant(e,t,a){return It(this,void 0,void 0,(function*(){this.saveApiParticipant(e,t);const s=t.pFlags.self?o.NM:(0,le.Z)(t.peer),n=yield this.apiManager.invokeApiSingle("phone.editGroupCallParticipant",{call:this.getGroupCallInput(e),participant:s===o.NM?this.appPeersManager.getInputPeerSelf():this.appPeersManager.getInputPeerById(s),muted:a.muted,volume:a.volume,raise_hand:a.raiseHand,video_paused:a.videoPaused,video_stopped:a.videoStopped,presentation_paused:a.presentationPaused});this.apiUpdatesManager.processUpdateMessage(n)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return It(this,void 0,void 0,(function*(){const a=this.getGroupCall(e);if(a&&"inputGroupCall"!==a._&&!t)return a;const s=this.getCachedParticipants(e).size?0:100;return this.apiManager.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:s},processResult:t=>{this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const a=this.saveGroupCall(t.call);return s&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),a}})}))}saveGroupCall(e,t){const a=this.groupCalls.get(e.id),s="inputGroupCall"!==e._&&(!a||"groupCallDiscarded"!==a._);return a?(s&&re(a,e),e=a):this.groupCalls.set(e.id,e),s&&this.rootScope.dispatchEvent("group_call_update",e),e}createGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=yield this.apiManager.invokeApi("phone.createGroupCall",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),random_id:(0,Te.d)(32),schedule_date:t,title:a});return this.apiUpdatesManager.processUpdateMessage(s),s.updates.find((e=>"updateGroupCall"===e._)).call}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}getGroupCallParticipants(e){return It(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:a}=this.prepareToSavingNextOffset(e);return""!==t&&(yield this.apiManager.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const s=t.count===t.participants.length?"":t.next_offset;this.appChatsManager.saveApiChats(t.chats),this.appUsersManager.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),a(s)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t){const a=this.getGroupCallInput(e);let s;return s="boolean"==typeof t&&t?this.apiManager.invokeApi("phone.discardGroupCall",{call:a}):"number"==typeof t?this.apiManager.invokeApi("phone.leaveGroupCall",{call:a,source:t}):this.apiManager.invokeApi("phone.joinGroupCall",{call:a,join_as:this.appPeersManager.getInputPeerSelf(),muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}joinGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=this.getGroupCallInput(e);let n;if("main"===a.type){const i={call:s,join_as:this.appPeersManager.getInputPeerSelf(),params:t,muted:a.isMuted,video_stopped:!a.joinVideo};n=this.apiManager.invokeApi("phone.joinGroupCall",i),this.log(`[api] joinGroupCall id=${e}`,i)}else{const a={call:s,params:t};n=this.apiManager.invokeApi("phone.joinGroupCallPresentation",a),this.log(`[api] joinGroupCallPresentation id=${e}`,a)}const i=yield n;return this.apiUpdatesManager.processUpdateMessage(i),i.updates.find((e=>"updateGroupCallConnection"===e._))}))}leaveGroupCallPresentation(e){return this.apiManager.invokeApi("phone.leaveGroupCallPresentation",{call:this.getGroupCallInput(e)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}}function Ct(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}function wt(e){return{_:"inputMediaPhoto",id:Ct(e),ttl_seconds:0}}var kt=a(515);function At(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}class Dt extends G{constructor(){super(...arguments),this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,a="",s="",n){return this.apiManager.invokeApi("messages.getInlineBotResults",{bot:this.appUsersManager.getUserInput(t),peer:this.appPeersManager.getInputPeerById(e),query:a,geo_point:n?this.getGeoInput(n):void 0,offset:s},{stopTime:-1,noErrorBox:!0}).then((e=>{const t=e.query_id;return e.results.forEach((e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=this.appDocsManager.saveDoc(e.document)),e.photo&&(e.photo=this.appPhotosManager.savePhoto(e.photo))),this.inlineResults[(0,kt.Z)(t,e.id)]=e})),e}))}pushPopularBot(e){this.appUsersManager.getTopPeers("bots_inline").then((t=>{const a=e.toPeerId(),s=t.findIndex((e=>e.id===a));let n;n=-1!==s?t[s]:{id:a,rating:0},++n.rating,(0,ie.Z)(t,n,"rating"),this.appStateManager.setKeyValueToStorage("topPeersCache")}))}switchToPM(e,t,a){return this.setHash[t]={peerId:e,time:Date.now()},this.appMessagesManager.startBot(t,void 0,a)}checkSwitchReturn(e){return t=this,a=void 0,n=function*(){const t=this.appUsersManager.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const a=this.setHash[e];return a&&(delete this.setHash[e],Date.now()-a.time<36e5)?a.peerId:void 0},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}switchInlineQuery(e,t,a,s){this.appDraftsManager.setDraft(e,t,"@"+this.appPeersManager.getPeerUsername(a.toPeerId())+" "+s)}callbackButtonClick(e,t,a){return this.apiManager.invokeApi("messages.getBotCallbackAnswer",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t),data:a.data},{stopTime:-1,noErrorBox:!0})}sendInlineResult(e,t,a,s={}){const n=this.inlineResults[a];if(!n)return;this.pushPopularBot(t);const i=a.split("_"),r=i.shift(),o=i.join("_");if(s.viaBotId=t,s.queryId=r,s.resultId=o,n.send_message.reply_markup&&(s.replyMarkup=n.send_message.reply_markup),"botInlineMessageText"===n.send_message._)s.entities=n.send_message.entities,this.appMessagesManager.sendText(e,n.send_message.message,s);else{let t,a,i="";const r=n.send_message;switch(r._){case"botInlineMessageMediaAuto":if(i=r.message,"botInlineMediaResult"===n._){const{document:e,photo:a}=n;t=e?At(e):wt(a)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(r.geo)},s.geoPoint=r.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(r.geo),title:r.title,address:r.address,provider:r.provider,venue_id:r.venue_id,venue_type:r.venue_type},s.geoPoint=r.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:r.phone_number,first_name:r.first_name,last_name:r.last_name,vcard:r.vcard};break;case"botInlineMessageMediaInvoice":a={_:"messageMediaInvoice",title:r.title,description:r.description,photo:r.photo,currency:r.currency,total_amount:r.total_amount,pFlags:{shipping_address_requested:r.pFlags.shipping_address_requested,test:r.pFlags.test},start_param:void 0}}!t&&a&&(t={_:"messageMediaPending",messageMedia:a}),this.appMessagesManager.sendOther(e,t,s)}}}var Ut=a(7082);class Tt{constructor(){this.tempNum=0}generateTempMessageId(e){const t=++this.tempNum;return(0,pe.Z)(e)+(t&Ut.o-1)}}var Et=a(4421),Ft=a(3624),Rt=a(7401);function xt(e,t){if(e.length{let o=e.slice(s,r);const p=n++;o.length>t&&(xt(o.slice(t),t).forEach((e=>{i[n++]=e})),o=o.slice(0,t)),s=r,a=0,i[p]=(i[p]||"")+o};let o=0;for(;;){let s=e.indexOf(" ",o);if(-1===s){o!==e.length-1&&r();break}s+=" ".length;const n=s-o;a+n>t&&r(a),o=s,a+=n}return i}var Bt=a(5701),Vt=a(7667),Lt=a(6241),Ot=a(6535),Nt=a(6566),Zt=a(2202),jt=a(319);const qt=new class{constructor(){this.tabs=new Map}start(){f.Z.getInstance().addEventListener("tabState",((e,t)=>{this.tabs.get(t).state=e}))}getTabs(){return[...this.tabs.values()].filter((e=>!!e.state))}addTab(e){const t={source:e,state:void 0};this.tabs.set(e,t)}deleteTab(e){this.tabs.delete(e)}};d.GO&&(d.GO.appTabsManager=qt);const Gt=qt;var Ht=a(2381),Wt=a(13);function Kt(e){return{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}var zt=a(5285),Jt=a(5102);function $t(e,t,a){a?e[t]=!0:delete e[t]}var Qt=a(4993),Yt=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Xt=e=>{e()},ea=!0;class ta extends G{constructor(){super(...arguments),this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new Et.Z(10),this.needSingleMessages=new Map,this.extendedMedia=new Map,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newDialogsToHandle=new Map,this.newUpdatesAfterReloadToHandle={},this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=(0,I.kg)("MESSAGES",I.v9.Error|I.v9.Debug|I.v9.Log|I.v9.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.batchUpdates={},this.clear=e=>{this.middleware?this.middleware.clean():(this.middleware=(0,Ft.k)(),this.uploadFilePromises={}),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(e),this.filtersStorage&&this.filtersStorage.clear(e)},this.handleNewDialogs=()=>{let e=0;const t=new Map,a=a=>{var s;const{peerId:n}=a;this.dialogsStorage.pushDialog({dialog:a}),this.appPeersManager.isChannel(n)||(e=Math.max(e,a.top_message||0));let i=t.get(n);i||t.set(n,i={}),"forumTopic"===a._?(null!==(s=i.topics)&&void 0!==s?s:i.topics=new Map).set(a.id,a):i.dialog=a};for(const[e,t]of this.newDialogsToHandle){const s="dialog"in t,{dialog:n,topics:i}=t;s&&(n?this.dialogsStorage.getDialogOnly(e)&&a(n):this.reloadConversation(e.toPeerId())),i&&(null==i||i.forEach(((t,s)=>{t?this.dialogsStorage.getForumTopic(e,s)&&a(t):this.dialogsStorage.getForumTopicById(e,s)})))}0!==e&&this.incrementMaxSeenId(e),this.rootScope.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle.clear()},this.handleNotifications=()=>{E.Z.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=void 0;for(const e in this.notificationsToHandle){const[t,a]=e.split("_"),s=this.notificationsToHandle[e];this.getNotifyPeerSettings(t.toPeerId(),a?+a:void 0).then((({muted:e,peerTypeNotifySettings:t})=>{const a=s.topMessage;e&&!a.pFlags.mentioned||!a.pFlags.unread||a.pFlags.unread&&this.notifyAboutMessage(a,{fwdCount:s.fwdCount,peerTypeNotifySettings:t})}))}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id;if(!this.pendingByRandomId[t])return;const a=(0,pe.Z)(e.id);this.pendingByMessageId[a]=t},this.onUpdateNewMessage=e=>{var t,a,s,n;const i=e.message,r=this.getMessagePeer(i),p=this.getHistoryMessagesStorage(r),d="updateNewDiscussionMessage"===e._;this.saveMessages([i],{storage:this.createMessageStorage(r,"history")});const f=this.appPeersManager.isForum(r),c=this.getThreadKey(i),l=c?+c.split("_")[1]:void 0,m=this.dialogsStorage.getDialogOrTopic(r,d?l:void 0);if((!m||this.reloadConversationsPeers.has(r))&&!d){let t=!0;if(r.isAnyChat()&&(t=this.appChatsManager.isInChat(r.toChatId())),t)return void this.handleNewUpdateAfterReload(r,e)}if(l&&!d){const e=null===(t=this.threadsStorage[r])||void 0===t?void 0:t[l],a={_:"updateNewDiscussionMessage",message:i};this.appChatsManager.isForum(r.toChatId())&&!this.dialogsStorage.getForumTopic(r,l)?this.handleNewUpdateAfterReload(r,a,l):e&&this.onUpdateNewMessage(a)}if("messageService"===i._){const{action:e}=i;if("messageActionPaymentSent"===e._&&i.reply_to&&this.rootScope.dispatchEvent("payment_sent",{peerId:i.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):i.peerId,mid:i.reply_to_mid,receiptMessage:i}),"messageActionTopicEdit"===e._&&!d){const t=this.dialogsStorage.getForumTopic(r,l);if(t){const a=(0,ve.Z)(t);void 0!==e.title&&(t.title=e.title),void 0!==e.closed&&$t(t.pFlags,"closed",e.closed),void 0!==e.hidden&&$t(t.pFlags,"hidden",e.hidden),void 0!==e.icon_emoji_id&&(t.icon_emoji_id=e.icon_emoji_id),this.scheduleHandleNewDialogs(r,t),this.dialogsStorage.processTopicUpdate(t,a)}else this.dialogsStorage.getForumTopicById(r,l)}}this.saveMessages([i],{storage:p}),this.checkPendingMessage(i);const g=this.getHistoryStorage(r,d?l:void 0);d||this.updateMessageRepliesIfNeeded(i);const h=e.ignoreExisting;if(g.history.findSlice(i.mid)){if(!h)return!1}else{const e=g.history.first;if(e.isEnd(se.D.Bottom)){let t=0;for(const a=e.length;te[t]);++t);e.splice(t,0,i.mid)}else g.history.unshift(i.mid);null!==g.count&&++g.count}(!g.maxId||i.mid>g.maxId)&&(g.maxId=i.mid),this.mergeReplyKeyboard(g,i)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r});const u=i.fromId;if(u.isUser()&&!i.pFlags.out&&i.from_id){this.appUsersManager.forceUserOnline(u,i.date);const e={_:"sendMessageCancelAction"};let t;t=r.isUser()?{_:"updateUserTyping",action:e,user_id:u}:this.appPeersManager.isChannel(r)?{_:"updateChannelUserTyping",action:e,channel_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u),top_msg_id:l?(0,oe.Z)(l):void 0}:{_:"updateChatUserTyping",action:e,chat_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u)},this.apiUpdatesManager.processLocalUpdate(t)}this.handleNewMessage(i);const y="forumTopic"===(null==m?void 0:m._);if(d&&!y||!m)return;const _=!i.pFlags.out&&i.pFlags.unread;if(_&&i.mid>m.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(m);++m.unread_count,i.pFlags.mentioned&&(++m.unread_mentions_count,this.modifyCachedMentions(r,i.mid,!0,y?l:void 0)),e()}if(i.mid>=m.top_message&&this.setDialogTopMessage(i,m),(!d&&!f||y)&&_){const e=c||r,t=null!==(a=(n=this.notificationsToHandle)[e])&&void 0!==a?a:n[e]={fwdCount:0,fromId:o.NM};t.fromId!==u&&(t.fromId=u,t.fwdCount=0),i.fwd_from&&++t.fwdCount,t.topMessage=i,null!==(s=this.notificationsHandlePromise)&&void 0!==s||(this.notificationsHandlePromise=E.Z.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{const{peer:t,msg_id:a,reactions:s}=e,n=(0,pe.Z)(a),i=this.appPeersManager.getPeerId(t),r=this.getMessageByPeer(i,n);if("message"!==(null==r?void 0:r._))return;const o=null==s?void 0:s.recent_reactions;if((null==o?void 0:o.length)&&r.pFlags.out){const e=o[o.length-1],t=r.reactions,a=null==t?void 0:t.recent_reactions;this.appPeersManager.getPeerId(e.peer_id)===this.appPeersManager.peerId||a&&!(a.length<=o.length)||a&&(0,Y.Z)(e,a[a.length-1])||this.getNotifyPeerSettings(i).then((({muted:t,peerTypeNotifySettings:a})=>{a.show_previews&&this.notifyAboutMessage(r,{peerReaction:e,peerTypeNotifySettings:a})}))}const p=r.peerId+"_"+r.mid;this.pushBatchUpdate("messages_reactions",this.batchUpdateReactions,p,(()=>(0,ve.Z)(r.reactions))),r.reactions=s,e.local||this.setDialogToStateIfMessageIsTop(r)},this.onUpdateDialogUnreadMark=e=>{const t=this.appPeersManager.getPeerId(e.peer.peer),a=this.getDialogOnly(t);if(a){const s=this.dialogsStorage.prepareDialogUnreadCountModifying(a);e.pFlags.unread?a.pFlags.unread_mark=!0:delete a.pFlags.unread_mark,s(),this.dialogsStorage.setDialogToState(a),this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:a}]]))}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{var t,a;const s=e.message,n=this.getMessagePeer(s),i=(0,pe.Z)(s.id),r=this.getHistoryMessagesStorage(n);if(!r.has(i))return;const o=this.getMessageFromStorage(r,i);this.saveMessages([s],{storage:r});const p=this.getMessageFromStorage(r,i);this.handleEditedMessage(o,p,r);const d=this.getDialogOnly(n),f=(null==d?void 0:d.top_message)===i;if(s.clear_history)f&&this.rootScope.dispatchEvent("dialog_flush",{peerId:n,dialog:d});else{let e=!0;if("message"===(null==o?void 0:o._)&&!(0,Y.Z)(o.reactions,p.reactions)){const t=p.reactions;p.reactions=o.reactions,this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:this.appPeersManager.getOutputPeer(n),msg_id:s.id,reactions:t}),e=!1}e&&this.rootScope.dispatchEvent("message_edit",{storageKey:r.key,peerId:n,mid:i,message:s}),f&&this.dialogsStorage.setDialogToState(d);const c=new Map,l=()=>{let e=c.get(n);return e||c.set(n,e={}),e};(f||s.grouped_id)&&d&&(l().dialog=d);const m=this.getThreadKey(s);if(m){const e=+m.split("_")[1],s=this.dialogsStorage.getForumTopic(n,e);s&&(null!==(t=(a=l()).topics)&&void 0!==t?t:a.topics=new Map).set(e,s)}c.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",c)}},this.onUpdateReadHistory=e=>{const t=e.channel_id,a=(0,pe.Z)(e.max_id||e.read_max_id),s=(0,pe.Z)(e.top_msg_id),n=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),i="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=!!t&&this.appChatsManager.isForum(t),o=this.getHistoryMessagesStorage(n),p=(0,Rt.Z)(o,"desc"),d=s&&r?this.dialogsStorage.getForumTopic(n,s):this.getDialogOnly(n),f=e.still_unread_count;let c=0,l=0,m=!1;const g=this.getHistoryStorage(n,s);if(n.isUser()&&i&&this.appUsersManager.forceUserOnline(n.toUserId()),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const h=d&&this.dialogsStorage.prepareDialogUnreadCountModifying(d),u=this.getReadMaxIdIfUnread(n,s);for(let e=0,t=p.length;ea)continue;const g=o.get(t);if(g.pFlags.out!==i)continue;const h=(0,Qt.Z)(g,r);if(!s||h===s){if(!(g.pFlags.unread||u&&u=d.top_message||!u?e=0:c&&d.top_message>a&&(e=c),void 0!==e&&(d.unread_count=e),(l<0||!d.unread_count)&&(d.unread_mentions_count=0)}null==h||h(),this.dialogsStorage.processDialogForFilters(d),this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:d}),this.dialogsStorage.setDialogToState(d),m||void 0!==f||i||!d.unread_count||("forumTopic"===d._?this.dialogsStorage.getForumTopicById(n,s):this.reloadConversation(n))}if(m&&this.rootScope.dispatchEvent("messages_read"),!s&&t){const e=n+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,a]=this.threadsToReplies[t].split("_");this.rootScope.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+a))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,a=e.top_msg_id,s=a?(0,pe.Z)(a):void 0,n=e.messages.map((e=>(0,pe.Z)(e))),i=t?t.toPeerId(!0):this.findPeerIdByMids(n);for(let e=0,t=n.length;e{const t=e.channel_id.toPeerId(!0),a=this.getHistoryStorage(t).history.slice,s=(0,pe.Z)(e.available_min_id),n=a.filter((e=>e<=s));e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{var t;const a=e.channel_id,s=e.messages.map((e=>(0,pe.Z)(e))),n=a?a.toPeerId(!0):this.findPeerIdByMids(s);if(!n)return;this.apiManager.clearCache("messages.getSearchCounters",(e=>this.appPeersManager.getPeerId(e.peer)===n));const i=new Set,r=new Map;for(const e of s){const a=this.getMessageByPeer(n,e),s=this.getThreadKey(a);if(!s)continue;const o=+s.split("_")[1];if((null===(t=this.threadsStorage[n])||void 0===t?void 0:t[o])&&(i.add(s),!r.has(o))){const e=this.dialogsStorage.getForumTopic(n,o);e&&r.set(o,e)}}const o=this.handleDeletedMessages(n,this.getHistoryMessagesStorage(n),s),p=Array.from(i).map((e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)}));[this.getHistoryStorage(n),...p].forEach((e=>{for(const t of o.msgs)e.history.delete(t);o.count&&e.count&&(e.count=Math.max(0,e.count-o.count))})),this.rootScope.dispatchEvent("history_delete",{peerId:n,msgs:o.msgs});const d=[...r.values()],f=this.getDialogOnly(n);f&&d.unshift(f),d.forEach((e=>{const t="forumTopic"===e._,a=o.unreadMentions||o.unread,s=a&&this.dialogsStorage.prepareDialogUnreadCountModifying(e);if(o.unread&&(e.unread_count=Math.max(0,e.unread_count-o.unread)),o.unreadMentions&&(e.unread_mentions_count=e.unread_count?Math.max(0,e.unread_mentions_count-o.unreadMentions):0),a&&(s(),t||this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:e})),o.msgs.has(e.top_message)){const a=this.getHistoryStorage(e.peerId,t?e.id:void 0).history.first;if(a.isEnd(se.D.Bottom)&&a.length){const t=a[0],s=this.getMessageByPeer(n,t);this.setDialogTopMessage(s,e)}else t?this.dialogsStorage.getForumTopicById(n,e.id):this.reloadConversation(n)}}))},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=this.appChatsManager.getChat(t),n=this.appChatsManager.isInChat(t);(!!(0,Jt.Z)(s)[0]||!s.pFlags.left)!=(void 0!==this.historiesStorage[a])&&(delete this.historiesStorage[a],this.rootScope.dispatchEvent("history_forbidden",a)),!!this.getDialogOnly(a)!==n&&(n?this.reloadConversation(a):this.dialogsStorage.dropDialogOnDeletion(a)),this.rootScope.dispatchEvent("channel_update",t)},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.flushStoragesByPeerId(t),Promise.all([this.reloadConversation(t)]).then((()=>{this.rootScope.dispatchEvent("history_reload",t)}))},this.onUpdateChannelMessageViews=e=>{var t;const a=e.views,s=null!==(t=e.peerId)&&void 0!==t?t:e.channel_id.toPeerId(!0),n=(0,pe.Z)(e.id),i=this.getMessageByPeer(s,n);void 0!==(null==i?void 0:i.views)&&i.views{var t;if(null===(t=e.pFlags)||void 0===t?void 0:t.popup)return void this.rootScope.dispatchEvent("service_notification",e);const a=o.yF,s=a,n=this.generateTempMessageId(s),i={_:"message",id:n,from_id:this.appPeersManager.getOutputPeer(a),peer_id:this.appPeersManager.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||(0,te.Z)(!0))+this.timeManager.getServerTimeOffset(),message:e.message,media:e.media,entities:e.entities};this.appUsersManager.hasUser(a)||this.appUsersManager.saveApiUsers([{_:"user",id:a,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([i],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=n,this.onUpdateNewMessage({_:"updateNewMessage",message:i,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,a=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),s=e.messages.map((e=>(0,pe.Z)(e))),n=this.getHistoryMessagesStorage(a),i=s.filter((e=>!n.has(e)));(i.length?Promise.all(i.map((e=>this.reloadMessages(a,e)))):Promise.resolve()).finally((()=>{var t;const i=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(i)for(const e of s)n.get(e).pFlags.pinned=!0;else for(const e of s)delete n.get(e).pFlags.pinned;delete this.pinnedMessages[this.getPinnedMessagesKey(a)],this.appStateManager.getState().then((e=>{delete e.hiddenPinnedMessages[a],this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:a,mids:s,pinned:i})}))}))},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:a}=e,s="notifyForumTopic"===t._;if("notifyPeer"!==t._&&!s)return;const n=this.appPeersManager.getPeerId(t.peer),i=this.dialogsStorage.getDialogOrTopic(n,s?(0,pe.Z)(t.top_msg_id):void 0);i&&(i.notify_settings=a,this.rootScope.dispatchEvent("dialog_notify_settings",i),this.dialogsStorage.setDialogToState(i))},this.onUpdateNewScheduledMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=this.scheduledMessagesStorage[a];if(!s)return;const n=(0,pe.Z)(t.id),i=this.getMessageFromStorage(s,n);this.saveMessages([t],{storage:s,isScheduled:!0});const r=this.getMessageFromStorage(s,n);i?(this.handleEditedMessage(i,r,s),this.rootScope.dispatchEvent("message_edit",{storageKey:s.key,peerId:a,mid:t.mid,message:t})):this.checkPendingMessage(t)||this.rootScope.dispatchEvent("scheduled_new",t)},this.onUpdateDeleteScheduledMessages=e=>{const t=this.appPeersManager.getPeerId(e.peer),a=this.scheduledMessagesStorage[t];if(a){const s=e.messages.map((e=>(0,pe.Z)(e)));this.handleDeletedMessages(t,a,s),this.rootScope.dispatchEvent("scheduled_delete",{peerId:t,mids:s})}},this.onUpdateMessageExtendedMedia=e=>{var t;const a=this.appPeersManager.getPeerId(e.peer),s=(0,pe.Z)(e.msg_id),n=this.getHistoryMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s),r=i.media;"messageExtendedMedia"!==(null===(t=r.extended_media)||void 0===t?void 0:t._)&&(r.extended_media=e.extended_media,this.onUpdateEditMessage({_:"updateEditMessage",message:i,pts:0,pts_count:0}))},this.batchUpdateViews=e=>{const t=[],a=this.getMessagesFromMap(e);for(const[e]of a)t.push({peerId:e.peerId,mid:e.mid,views:e.views});return t},this.batchUpdateReactions=e=>{var t,a,s;const n=[],i=this.getMessagesFromMap(e);for(const[e,r]of i){const i=null!==(a=null===(t=e.reactions)||void 0===t?void 0:t.results)&&void 0!==a?a:[],o=null!==(s=null==r?void 0:r.results)&&void 0!==s?s:[],p=i.filter((t=>{const a=o.find((e=>(0,zt.Z)(e.reaction,t.reaction)));return e.pFlags.out&&(!a||t.count>a.count)||void 0!==t.chosen_order&&(!a||void 0===a.chosen_order)}));n.push({message:e,changedResults:p})}return n}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateMessageReactions:this.onUpdateMessageReactions,updateReadChannelDiscussionInbox:this.onUpdateReadHistory,updateReadChannelDiscussionOutbox:this.onUpdateReadHistory,updateReadHistoryInbox:this.onUpdateReadHistory,updateReadHistoryOutbox:this.onUpdateReadHistory,updateReadChannelInbox:this.onUpdateReadHistory,updateReadChannelOutbox:this.onUpdateReadHistory,updateChannelReadMessagesContents:this.onUpdateReadMessagesContents,updateReadMessagesContents:this.onUpdateReadMessagesContents,updateChannelAvailableMessages:this.onUpdateChannelAvailableMessages,updateDeleteMessages:this.onUpdateDeleteMessages,updateDeleteChannelMessages:this.onUpdateDeleteMessages,updateChannel:this.onUpdateChannel,updateChannelReload:this.onUpdateChannelReload,updateChannelMessageViews:this.onUpdateChannelMessageViews,updateServiceNotification:this.onUpdateServiceNotification,updatePinnedMessages:this.onUpdatePinnedMessages,updatePinnedChannelMessages:this.onUpdatePinnedMessages,updateNotifySettings:this.onUpdateNotifySettings,updateNewScheduledMessage:this.onUpdateNewScheduledMessage,updateDeleteScheduledMessages:this.onUpdateDeleteScheduledMessages,updateMessageExtendedMedia:this.onUpdateMessageExtendedMedia}),this.rootScope.addEventListener("notify_peer_type_settings",(({key:e,settings:t})=>{let a;a="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>this.appPeersManager.isBroadcast(e.peerId):e=>this.appPeersManager.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(a).forEach((e=>{this.rootScope.dispatchEvent("dialog_notify_settings",e)}))})),this.rootScope.addEventListener("webpage_updated",(({id:e,msgs:t})=>{t.forEach((({peerId:t,mid:a,isScheduled:s})=>{const n=s?this.getScheduledMessagesStorage(t):this.getHistoryMessagesStorage(t),i=this.getMessageFromStorage(n,a);i&&(i.media={_:"messageMediaWebPage",webpage:this.appWebPagesManager.getCachedWebPage(e)},this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:t,mid:a,message:i}))}))})),this.rootScope.addEventListener("draft_updated",(({peerId:e,threadId:t,draft:a})=>{const s=this.dialogsStorage.getDialogOrTopic(e,t);if(s){s.draft=a;let t=!1;a||(0,oe.Z)(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog({dialog:s})):(this.dialogsStorage.dropDialog(e),t=!0),this.rootScope.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a})}else if(t){const a=this.appChatsManager.getChat(e.toChatId());a?a.pFlags.forum&&this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}else this.reloadConversation(e)})),this.rootScope.addEventListener("poll_update",(({poll:e})=>{const t=this.appPollsManager.pollToMessages[e.id];if(t)for(const e of t){const[t,a]=e.split("_"),s=this.getMessageByPeer(t.toPeerId(),+a);s&&this.setDialogToStateIfMessageIsTop(s)}})),this.batchUpdatesDebounced=(0,Bt.Z)((()=>{for(const e in this.batchUpdates){const t=this.batchUpdates[e];delete this.batchUpdates[e];const a=t.callback(t.batch);!a||a instanceof Array&&!a.length||rootScope.dispatchEvent(e,a)}}),33,!1,!0),this.appStateManager.getState().then((e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)}))}getInputEntities(e){const t=(0,ve.Z)(e);return t.forEach((e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=this.appUsersManager.getUserInput(e.user_id))})),t}invokeAfterMessageIsSent(e,t,a){var s,n,i;const r=null!==(s=(i=this.tempFinalizeCallbacks)[e])&&void 0!==s?s:i[e]={},o=null!==(n=r[t])&&void 0!==n?n:r[t]={deferred:(0,v.Z)()};return o.callback=a,o.deferred}editMessage(e,t,a={}){const{mid:s,peerId:n}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(s,"edit",(e=>this.editMessage(e,t,a)));const i=a.entities||[];t&&(t=(0,ke.Z)(t,i));const r=a.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return this.apiManager.invokeApi("messages.editMessage",{peer:this.appPeersManager.getInputPeerById(n),id:e.id,message:t,media:a.newMedia,entities:i.length?this.getInputEntities(i):void 0,no_webpage:a.noWebPage,schedule_date:r}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0}))}sendText(e,t,a={}){var s,n;return Yt(this,void 0,void 0,(function*(){if(!t.trim())return;null!==(s=a.entities)&&void 0!==s||(a.entities=[]),a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId);const i=(yield this.apiManager.getConfig()).message_length_max,r=xt(t,i);t=r[0],r.length>1&&("webPage"!==(null===(n=a.webPage)||void 0===n?void 0:n._)||t.includes(a.webPage.url)||delete a.webPage),e=this.appPeersManager.getPeerMigratedTo(e)||e;const o=a.entities;a.viaBotId||(t=(0,ke.Z)(t,o));let p=this.getInputEntities(o);p.length||(p=void 0);const d=this.generateOutgoingMessage(e,a);d.entities=o,d.message=t;const f=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0,c=this.appPeersManager.isChannel(e);a.webPage&&(d.media={_:"messageMediaWebPage",webpage:a.webPage});const l=e=>{this.onMessagesSendError([d],e),this.rootScope.dispatchEvent("messages_pending")};d.send=()=>{l();const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const n=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let i;return i=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:d.random_id,reply_to_msg_id:f||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,send_as:n},s):this.apiManager.invokeApiAfter("messages.sendMessage",{no_webpage:a.noWebPage,peer:this.appPeersManager.getInputPeerById(e),message:t,random_id:d.random_id,reply_to_msg_id:f||void 0,entities:p,clear_draft:a.clearDraft,schedule_date:a.scheduleDate||void 0,silent:a.silent,send_as:n,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,i.then((e=>{if("updateShortSentMessage"===e._){const t=d.promise;delete d.promise;const s=(0,ve.Z)(d);ge(d,["promise"]),d.promise=t,s.date=e.date,s.id=e.id,s.media=e.media,s.entities=e.entities,this.wrapMessageEntities(s),e.pFlags.out&&(s.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:d.random_id,id:s.id},{_:a.scheduleDate?"updateNewScheduledMessage":c?"updateNewChannelMessage":"updateNewMessage",message:s,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)}));this.apiUpdatesManager.processUpdateMessage(e),d.promise.resolve()}),(e=>{throw l(e),d.promise.reject(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(d,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0});const m=[d.promise];for(let t=1;t=0){r="audio",p="audio."+("ogg"===d.split("/")[1]?"ogg":"mp3"),_="sendMessageUploadAudioAction",a.isVoiceMessage&&(r="voice",s.pFlags.media_unread=!0);const e={_:"documentAttributeAudio",pFlags:{voice:a.isVoiceMessage},waveform:a.waveform,duration:a.duration||0};g.push(e)}else if(a.isMedia)if(h){r="photo",p="photo."+d.split("/")[1],_="sendMessageUploadPhotoAction";const e={_:"photoSize",w:a.width,h:a.height,type:o.Pt,location:null,size:t.size};u={_:"photo",id:""+s.id,sizes:[e],w:a.width,h:a.height};const n=this.thumbsStorage.getCacheContext(u,e.type);n.downloaded=t.size,n.url=a.objectURL||"",u=this.appPhotosManager.savePhoto(u)}else if(i().VIDEO_MIME_TYPES_SUPPORTED.has(d)){r="video",p="video.mp4",_="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:a.isRoundMessage,supports_streaming:!0},duration:a.duration,w:a.width,h:a.height};g.push(e),a.noSound&&t.size>10240&&t.size<10485760&&g.push({_:"documentAttributeAnimated"})}else r="document",p="document."+d.split("/")[1],_="sendMessageUploadDocumentAction";else r="document",p="document."+d.split("/")[1],_="sendMessageUploadDocumentAction";if(g.push({_:"documentAttributeFilename",file_name:f||p}),-1!==["document","video","audio","voice"].indexOf(r)&&!c){const e=[];if(y={_:"document",id:""+s.id,duration:a.duration,attributes:g,w:a.width,h:a.height,thumbs:e,mime_type:d,size:t.size},a.objectURL){const e=this.thumbsStorage.getCacheContext(y);e.downloaded=t.size,e.url=a.objectURL}let n;if(h)g.push({_:"documentAttributeImageSize",w:a.width,h:a.height}),n={_:"photoSize",w:a.width,h:a.height,type:o.Pt,size:t.size};else if("video"===r&&a.thumb){n={_:"photoSize",w:a.thumb.size.width,h:a.thumb.size.height,type:"local-thumb",size:a.thumb.blob.size};const e=this.thumbsStorage.getCacheContext(y,n.type);e.downloaded=n.size,e.url=a.thumb.url}n&&e.push(n),y=this.appDocsManager.saveDoc(y)}this.log("sendFile",r,p,t.type,a);const P=(0,v.Z)(),b=c?void 0:{_:u?"messageMediaPhoto":"messageMediaDocument",pFlags:{},photo:u,document:y};b&&(ge(b,["promise"]),b.promise=P),s.entities=m,s.message=l,s.media=c?{_:"messageMediaDocument",pFlags:{},document:t}:b;const M=c?void 0:(0,Zt.Z)(t);s.uploadingFileName=M,M&&(this.uploadFilePromises[M]=P);const I=e=>{this.onMessagesSendError([s],e),this.rootScope.dispatchEvent("messages_pending")};let S=!1,C=null;s.send=()=>{if(c){const e={_:"inputMediaDocument",id:Kt(t)};P.resolve(e)}else if(t instanceof File||t instanceof Blob){const n=()=>{var n;let i;return S&&!s.error||(S=!1,C=this.apiFileManager.upload({file:t,fileName:M}),C.catch((t=>{S||(this.log("cancelling upload",b),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"},void 0,a.threadId),P.reject(t))})),C.addNotifyListener((t=>{const s=Math.max(1,Math.floor(100*t.done/t.total));_&&this.setTyping(e,{_,progress:0|s},void 0,a.threadId),P.notifyAll(t)})),P.notifyAll({done:0,total:t.size})),"video"===r&&a.objectURL&&(null===(n=a.thumb)||void 0===n?void 0:n.blob)&&(i=this.apiFileManager.upload({file:a.thumb.blob})),C&&C.then((e=>Yt(this,void 0,void 0,(function*(){let t;if(e.name=p,S=!0,t="photo"===r?{_:"inputMediaUploadedPhoto",file:e}:{_:"inputMediaUploadedDocument",file:e,mime_type:d,pFlags:{force_file:"sendMessageUploadDocumentAction"===_||void 0},attributes:g},i)try{const e=yield i;t.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}P.resolve(t)}))),(e=>{throw I(e),e})),P};a.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return P},this.beforeMessageSending(s,{isGroupedItem:a.isGroupedItem,isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,processAfter:a.processAfter}),a.isGroupedItem||(P.then((t=>(this.setTyping(e,{_:"sendMessageCancelAction"},void 0,a.threadId),this.apiManager.invokeApi("messages.sendMedia",{background:a.background,peer:this.appPeersManager.getInputPeerById(e),media:t,message:l,random_id:s.random_id,reply_to_msg_id:n,schedule_date:a.scheduleDate,silent:a.silent,entities:m,clear_draft:a.clearDraft,send_as:a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if("photo"===r&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,r="document",void s.send();throw I(e),e}))))),P.then(s.promise.resolve,s.promise.reject));const w={message:s};return ge(w,["promise"]),w.promise=P,w}sendAlbum(e,t,a={}){return Yt(this,void 0,void 0,(function*(){if(a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId),1===t.length)return this.sendFile(e,t[0],Object.assign(Object.assign({},a),a.sendFileDetails[0]));e=this.appPeersManager.getPeerMigratedTo(e)||e;const s=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0;let n=a.caption||"",i=a.entities||[];n&&(n=(0,ke.Z)(n,i)),this.log("sendAlbum",t,a);const r=""+ ++this.groupedTempId,o=[],p=e=>{o.push(e)},d=t.map(((t,o)=>{const d=a.sendFileDetails[o],f=Object.assign({isGroupedItem:!0,isMedia:a.isMedia,scheduleDate:a.scheduleDate,silent:a.silent,replyToMsgId:s,threadId:a.threadId,sendAsPeerId:a.sendAsPeerId,groupId:r,processAfter:p},d);return 0===o&&(f.caption=n,f.entities=i),this.sendFile(e,t,f).message}));a.clearDraft&&o.push((()=>{this.appDraftsManager.clearDraft(e,a.threadId)})),o.forEach((e=>{e()}));const f=(e,t)=>{this.onMessagesSendError([e],t),this.rootScope.dispatchEvent("messages_pending")},c=this.appPeersManager.getInputPeerById(e),l=t=>{this.setTyping(e,{_:"sendMessageCancelAction"},void 0,a.threadId);const n=(0,v.Z)();return this.sendSmthLazyLoadQueue.push({load:()=>this.apiManager.invokeApi("messages.sendMultiMedia",{peer:c,multi_media:t,reply_to_msg_id:s,schedule_date:a.scheduleDate,silent:a.silent,clear_draft:a.clearDraft,send_as:a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0,update_stickersets_order:ea}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),n.resolve()}),(e=>{d.forEach((t=>f(t,e))),n.reject(e)}))}),n},m=d.map((e=>e.send().then((e=>this.apiManager.invokeApi("messages.uploadMedia",{peer:c,media:e}))).then((t=>{let a;"messageMediaPhoto"===t._?a=wt(this.appPhotosManager.savePhoto(t.photo)):"messageMediaDocument"===t._&&(a=At(this.appDocsManager.saveDoc(t.document)));const s={_:"inputSingleMedia",media:a,random_id:e.random_id,message:n,entities:i};return n&&(n="",i=[]),s})).catch((t=>{throw this.log.error("sendAlbum upload item error:",t,e),f(e,t),t}))));return Promise.all(m).then((e=>l(e.filter(Boolean))))}))}sendContact(e,t){return this.sendOther(e,this.appUsersManager.getContactMediaInput(t))}sendOther(e,t,a={}){var s;e=this.appPeersManager.getPeerMigratedTo(e)||e;const n=this.generateOutgoingMessage(e,a),i=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+n.id;t.poll.id=e,this.appPollsManager.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:a,results:s}=this.appPollsManager.getPoll(e);r={_:"messageMediaPoll",poll:a,results:s};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:this.appPhotosManager.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:this.appDocsManager.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(s=t.user_id)&&void 0!==s?s:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:a.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:a.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t.messageMedia}n.media=r;const o=e=>{this.onMessagesSendError([n],e),this.rootScope.dispatchEvent("messages_pending")};return n.send=()=>{const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const r=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let p;return p=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:n.random_id,reply_to_msg_id:i||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r},s):this.apiManager.invokeApiAfter("messages.sendMedia",{peer:this.appPeersManager.getInputPeerById(e),media:t,random_id:n.random_id,reply_to_msg_id:i||void 0,message:"",clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,p.then((e=>{e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)})),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw o(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(n,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0}),n.promise}beforeMessageSending(e,t={}){const a=e.id,s=this.getMessagePeer(e),n=t.isScheduled?this.getScheduledMessagesStorage(s):this.getHistoryMessagesStorage(s);e.storageKey=n.key;const i=[];if(t.isScheduled)this.saveMessages([e],{storage:n,isScheduled:!0,isOutgoing:!0}),i.push((()=>{this.rootScope.dispatchEvent("scheduled_new",e)}));else{const r=[this.getHistoryStorage(s),t.threadId?this.getHistoryStorage(s,t.threadId):void 0];for(const e of r)e&&e.history.unshift(a);if(this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),t.threadId){const a=this.dialogsStorage.getForumTopic(s,t.threadId);a&&this.setDialogTopMessage(e,a)}i.push((()=>{this.rootScope.dispatchEvent("history_append",{storageKey:n.key,message:e})}))}const r=this.pendingByRandomId[e.random_id]={peerId:s,tempId:a,threadId:t.threadId,storage:n,sequential:t.sequential};return this.pendingTopMsgs[s]=a,!t.isGroupedItem&&e.send&&i.push((()=>{t.clearDraft&&this.appDraftsManager.clearDraft(s,t.threadId),e.send()})),i.length&&(t.processAfter||Xt)((()=>{for(const e of i)e()})),r}generateOutgoingMessage(e,t){let a;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const s=this.appPeersManager.isBroadcast(e);if(s&&this.appPeersManager.getPeer(e).pFlags.signatures){const e=this.appUsersManager.getSelf();a=e.first_name+(e.last_name?" "+e.last_name:"")}const n={_:"message",id:this.generateTempMessageId(e),from_id:t.sendAsPeerId?this.appPeersManager.getOutputPeer(t.sendAsPeerId):this.generateFromId(e),peer_id:this.appPeersManager.getOutputPeer(e),post_author:a,pFlags:this.generateFlags(e),date:t.scheduleDate||(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),message:"",grouped_id:t.groupId,random_id:(0,Te.a)(),reply_to:this.generateReplyHeader(e,t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0};return ge(n,["send","promise"]),void 0===t.groupId&&(n.promise=(0,v.Z)()),n}generateReplyHeader(e,t,a){const s={_:"messageReplyHeader",reply_to_msg_id:t||a,pFlags:{}};return a&&this.appPeersManager.isForum(e)&&o.Ox!==a&&(s.pFlags.forum_topic=!0),a&&s.reply_to_msg_id!==a&&(s.reply_to_top_id=a),s}generateReplies(e){let t;if(this.appPeersManager.isBroadcast(e)){const a=this.appProfileManager.getCachedFullChat(e.toChatId());(null==a?void 0:a.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:a.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return this.appPeersManager.isAnyChat(e)&&(this.appPeersManager.isBroadcast(e)||this.isAnonymousSending(e))?void 0:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==this.appUsersManager.getSelf().id&&(t.out=!0,this.appPeersManager.isChannel(e)||this.appUsersManager.isBot(e)||(t.unread=!0)),this.appPeersManager.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const a=this.appUsersManager.getSelf().id.toPeerId(),s=t.fromId;if(s===a&&t.peerId===a&&!t.fwd_from)return;const n={_:"messageFwdHeader",flags:0,date:t.date};let i=!1;if(t.fwd_from)n.from_id=t.fwd_from.from_id,n.from_name=t.fwd_from.from_name,n.post_author=t.fwd_from.post_author;else{if(n.post_author=t.post_author,s.isUser()){const e=this.appProfileManager.getCachedFullUser(s.toUserId());(null==e?void 0:e.private_forward_name)&&(n.from_name=e.private_forward_name,i=!0)}i||(n.from_id=this.appPeersManager.getOutputPeer(s))}return this.appPeersManager.isBroadcast(t.peerId)&&(t.post_author&&(n.post_author=t.post_author),n.channel_post=t.id),e!==a||i||(n.saved_from_msg_id=t.id,n.saved_from_peer=this.appPeersManager.getOutputPeer(t.peerId)),n}generateFakeAvatarMessage(e,t){const a=Number.MAX_SAFE_INTEGER,s={_:"messageService",pFlags:{},action:{_:"messageActionChannelEditPhoto",photo:t},id:a,peer_id:this.appPeersManager.getOutputPeer(e),mid:a,peerId:e,date:t.date,fromId:e};return this.getHistoryMessagesStorage(e).set(a,s),s}getUploadPromise(e){return this.uploadFilePromises[e]}isAnonymousSending(e){var t,a;return!!e.isAnyChat()&&(null===(a=null===(t=this.appPeersManager.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===a?void 0:a.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){t&&(t.top_message=e.mid,this.getHistoryStorage(e.peerId,"forumTopic"===t._?t.id:void 0).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t))}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:a,tempId:s,storage:n}=t,i=this.getHistoryStorage(a);return this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:[s],pts:void 0,pts_count:void 0}),i.history.delete(s),delete this.pendingByRandomId[e],n.delete(s),!0}return!1}fillConversations(){return Yt(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(ye);){const t=yield this.getTopMessages({limit:100,folderId:ye});if(!e()||t.isEnd)break}}))}getReadMaxIdIfUnread(e,t){var a,s,n;const i=this.getHistoryStorage(e,t);if(t&&!this.appChatsManager.isForum(e.toChatId())){const t=this.getHistoryStorage(e),n=Math.max(null!==(a=t.readMaxId)&&void 0!==a?a:0,i.readMaxId),r=this.getMessageByPeer(e,i.maxId);return!(null===(s=null==r?void 0:r.pFlags)||void 0===s?void 0:s.out)&&n{if(!n()||"messages.dialogsNotModified"===r._)return null;d.ZP&&this.log("messages.getDialogs result:",r),i||s||t===ye||this.dialogsStorage.resetPinnedOrder(t),i||s||this.appDraftsManager.addMissedDialogs(),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages);let f=!!s,c=!1;const l=new Map,m=t===ye?o.J$:t,g=!!i||t===ye,h=r.dialogs||r.topics;if((0,ne.Z)(h,(e=>{var t,s;e&&(i||null!==(t=(s=e).folder_id)&&void 0!==t||(s.folder_id=m),this.dialogsStorage.saveDialog({dialog:e,ignoreOffsetDate:!0,saveGlobalOffset:g}),void 0!==e.peerId&&(f||this.appPeersManager.isChannel(e.peerId||this.appPeersManager.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),f=!0),a&&(0,ce.Z)(e)>a&&(this.scheduleHandleNewDialogs(e.peerId,e),c=!0),i||(0,oe.Z)(e.read_inbox_max_id)||(0,oe.Z)(e.read_outbox_max_id)||(l.set(e.peerId,{dialog:e}),this.log.error("noIdsDialogs",e,p))))})),l.size){const e=[...l.keys()],t=e.map((e=>this.reloadConversation(e)));Promise.all(t).then((()=>{this.rootScope.dispatchEvent("dialogs_multiupdate",l);for(let t=0;t=u||!h.length;v&&this.dialogsStorage.setDialogsLoaded(t,!0),c?this.scheduleHandleNewDialogs():this.rootScope.dispatchEvent("dialogs_multiupdate",new Map);const P=h,b=100===e?P:P.slice(0,e);return{isEnd:v&&b[b.length-1]===P[P.length-1],count:u,dialogs:b}}))}forwardMessages(e,t,a,s={}){return Yt(this,void 0,void 0,(function*(){delete s.replyToMsgId,delete s.threadId,e=this.appPeersManager.getPeerMigratedTo(e)||e;for(let n=0,i=(a=a.slice().sort(((e,t)=>e-t))).length;n{var i,p,d,f,c;const l=this.getMessageByPeer(t,n),m=this.generateOutgoingMessage(e,s);o.push(m.id);const g=["entities","media"];s.dropAuthor||(m.fwd_from=this.generateForwardHeader(e,l),g.push("views","forwards"),(null===(i=m.fwd_from)||void 0===i?void 0:i.from_name)&&e===this.appPeersManager.peerId&&delete m.from_id),s.dropCaptions&&l.media||g.push("message");const h=null===(p=l.reply_to)||void 0===p?void 0:p.reply_to_msg_id,u=a.indexOf(h);if(h&&-1!==u){const e=o[u];m.reply_to={_:"messageReplyHeader",reply_to_msg_id:e}}g.forEach((e=>{m[e]=(0,ve.Z)(l[e])}));const y=null===(d=m.media)||void 0===d?void 0:d.document;return y&&(["round","voice"].includes(y.type)&&(m.pFlags.media_unread=!0),y.sticker&&!this.rootScope.premium&&(0,Wt.Z)(y)&&(m.media.pFlags.nopremium=!0)),l.grouped_id&&(null!==(f=r[c=l.grouped_id])&&void 0!==f?f:r[c]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(m),m}));for(const e in r){const t=r[e];t.messages.length>1&&t.messages.forEach((e=>{e.grouped_id=t.tempId}))}p.forEach((e=>{this.beforeMessageSending(e,{isScheduled:!!s.scheduleDate||void 0,sequential:!0})}));const d={};this.pendingAfterMsgs[e]&&(d.afterMessageId=this.pendingAfterMsgs[e].messageId);const f=this.apiManager.invokeApiAfter("messages.forwardMessages",{from_peer:this.appPeersManager.getInputPeerById(t),id:a.map((e=>(0,oe.Z)(e))),random_id:p.map((e=>e.random_id)),to_peer:this.appPeersManager.getInputPeerById(e),with_my_score:s.withMyScore,silent:s.silent,schedule_date:s.scheduleDate,drop_author:s.dropAuthor,drop_media_captions:s.dropCaptions,send_as:s.sendAsPeerId?this.appPeersManager.getInputPeerById(s.sendAsPeerId):void 0},d).then((e=>{this.log("forwardMessages updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw this.onMessagesSendError(p,e),e})).finally((()=>{this.pendingAfterMsgs[e]===d&&delete this.pendingAfterMsgs[e]}));this.pendingAfterMsgs[e]=d;const c=[f];return i.length&&c.push(this.forwardMessages(e,t,i,s)),Promise.all(c).then(jt.Z)}))}generateEmptyMessage(e){}onMessagesSendError(e,t){e.forEach((e=>{if(e.error!==t)if(t){e.error=t,this.rootScope.dispatchEvent("message_error",{storageKey:e.storageKey,tempId:e.mid,error:t});const a=this.getDialogOnly(e.peerId);a&&this.rootScope.dispatchEvent("dialog_unread",{peerId:e.peerId,dialog:a})}else delete e.error}))}getMessagesStorageByKey(e){const t=e.split("_"),a=+t[0];return"scheduled"===t[1]?this.getScheduledMessagesStorage(a):this.getHistoryMessagesStorage(a)}getMessageFromStorage(e,t){return"string"==typeof e&&(e=this.getMessagesStorageByKey(e)),e&&e.get(t)}createMessageStorage(e,t){const a=new Map;return a.peerId=e,a.type=t,a.key=`${e}_${t}`,a}getHistoryMessagesStorage(e){var t,a;return null!==(t=(a=this.messagesStorageByPeerId)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"history")}getMessagesStorage(e){return"object"==typeof e?e:this.getMessagesStorageByKey(e)}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(this.appPeersManager.isChannel(t.toPeerId()))continue;const a=this.messagesStorageByPeerId[t].get(e);if(a)return a}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getHistoryMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&this.appPeersManager.getPeerId(e.peer_id)||o.NM}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}cantForwardDeleteMids(e,t){const a=this.getMessagesStorage(e);let s=!t.length,n=!t.length;for(const e of t){const t=this.getMessageFromStorage(a,e);if(s||(s=!this.canForward(t)),n||(n=!this.canDeleteMessage(t)),s&&n)break}return{cantForward:s,cantDelete:n}}reloadConversationOrTopic(e,t){t?this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}reloadConversation(e){let t;if(void 0!==e){const a=this.appPeersManager.getPeerId(e);this.log.warn("reloadConversation",a);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=(0,v.Z)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:this.appPeersManager.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=(0,P.Z)(0).then((()=>{const e=[],t={};for(const[a,{inputDialogPeer:s,promise:n}]of this.reloadConversationsPeers)e.push(s),t[a]=n;const a=()=>{for(const e in t)this.reloadConversationsPeers.delete(+e),t[e].resolve(void 0)};return(()=>Yt(this,void 0,void 0,(function*(){for(;;){const t=yield this.apiManager.invokeApi("messages.getPeerDialogs",{peers:e}),a=this.apiUpdatesManager.updatesState,{state:s}=t;if(!a.pts||a.pts===s.pts)return t;yield(0,P.Z)(500)}})))().then((e=>{for(const e in t)this.reloadConversationsPeers.delete(+e);this.dialogsStorage.applyDialogs(e),e.dialogs.forEach((e=>{const a=e.peerId;a&&(t[a].resolve(e),delete t[a])}))}),jt.Z).then((()=>{a(),this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()}))}))),t||this.reloadConversationsPromise}doFlushHistory(e,t,a,s){let n;const i=n=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:n.pts,pts_count:n.pts_count}}),!n.offset||this.doFlushHistory(e,t,a,s));return n=s?this.apiManager.invokeApiSingleProcess({method:"channels.deleteTopicHistory",params:{channel:this.appChatsManager.getChannelInput(e.toChatId()),top_msg_id:(0,oe.Z)(s)},processResult:i}):this.apiManager.invokeApiSingleProcess({method:"messages.deleteHistory",params:{just_clear:t,revoke:a,peer:this.appPeersManager.getInputPeerById(e),max_id:0},processResult:i}),n}flushHistory(e,t,a,s){return Yt(this,void 0,void 0,(function*(){if(this.appPeersManager.isChannel(e)&&!s){const t=this.getHistory(e,0,1),a=yield t,s=e.toChatId(),n=a.history[0]||0;return this.apiManager.invokeApiSingle("channels.deleteHistory",{channel:this.appChatsManager.getChannelInput(s),max_id:(0,oe.Z)(n)}).then((e=>(e&&this.apiUpdatesManager.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e)))}return this.doFlushHistory(e,t,a,s).then((()=>{if(s||this.flushStoragesByPeerId(e),t)this.rootScope.dispatchEvent("dialog_flush",{peerId:e,dialog:this.getDialogOnly(e)});else{const t=this.getTypingKey(e,s);if(delete this.notificationsToHandle[t],delete this.typings[t],!s){const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0))}this.dialogsStorage.dropDialogOnDeletion(e,s)}}))}))}flushStoragesByPeerId(e){[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pendingAfterMsgs,this.pendingTopMsgs].forEach((t=>{delete t[e]}));for(const t in this.pinnedMessages)(+t===e||t.startsWith(e+"_"))&&delete this.pinnedMessages[t];const t=this.needSingleMessages.get(e);if(t){for(const[e,a]of t)a.resolve(this.generateEmptyMessage(e));t.clear()}[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach((t=>{const a=t[e];a&&a.clear()})),this.dialogsStorage.flushForumTopicsCache(e)}hidePinnedMessages(e){return Promise.all([this.appStateManager.getState(),this.getPinnedMessage(e)]).then((([t,a])=>{t.hiddenPinnedMessages[e]=a.maxId,this.rootScope.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:a.maxId})}))}getPinnedMessagesKey(e,t){return e+(t?"_"+t:"")}getPinnedMessage(e,t){var a,s,n;const i=null!==(a=(s=this.pinnedMessages)[n=this.getPinnedMessagesKey(e,t)])&&void 0!==a?a:s[n]={};return i.promise?i.promise:i.maxId?Promise.resolve(i):i.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1,threadId:t}).then((e=>{var t;return i.count=e.count,i.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,i})).finally((()=>{delete i.promise}))}getPinnedMessagesCount(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.count}getPinnedMessagesMaxId(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.maxId}updatePinnedMessage(e,t,a,s,n){return this.apiManager.invokeApi("messages.updatePinnedMessage",{peer:this.appPeersManager.getInputPeerById(e),unpin:a,silent:s,pm_oneside:n,id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}unpinAllMessages(e){return this.apiManager.invokeApiSingle("messages.unpinAllMessages",{peer:this.appPeersManager.getInputPeerById(e)}).then((t=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),t.offset?this.unpinAllMessages(e):(this.getHistoryMessagesStorage(e).forEach((e=>{e.pFlags.pinned&&delete e.pFlags.pinned})),this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[this.getPinnedMessagesKey(e)],!0))))}getAlbumText(e){const t=this.groupedMessagesStorage[e];return(0,Ht.Z)(Array.from(t.values()))}getGroupsFirstMessage(e){if(!(null==e?void 0:e.grouped_id))return e;const t=this.groupedMessagesStorage[e.grouped_id];let a=Number.MAX_SAFE_INTEGER;for(const[e,s]of t)s.midthis.getMessageFromStorage(a,e)))}getMidsByMessage(e){return e?e.grouped_id?this.getMidsByAlbum(e.grouped_id):[e.mid]:[]}filterMessages(e,t){const a=[];if(e.grouped_id){const s=this.groupedMessagesStorage[e.grouped_id];for(const[e,n]of s)t(n)&&a.push(n)}else t(e)&&a.push(e);return a}generateTempMessageId(e){const t=this.getDialogOnly(e);return this.appMessagesIdsManager.generateTempMessageId((null==t?void 0:t.top_message)||0)}saveMessage(e,t={}){var a,s,n,i,r;if(!e||"messageEmpty"===e._)return;null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={});const p=this.getMessagePeer(e),d=t.storage||this.getHistoryMessagesStorage(p),f="peerChannel"===e.peer_id._,c=f&&this.appChatsManager.isBroadcast(p.toChatId()),l="message"===e._;t.isOutgoing&&(e.pFlags.is_outgoing=!0);const m=(0,pe.Z)(e.id);e.mid=m,l&&(t.isScheduled&&(e.pFlags.is_scheduled=!0),e.grouped_id&&(null!==(s=(i=this.groupedMessagesStorage)[r=e.grouped_id])&&void 0!==s?s:i[r]=this.createMessageStorage(p,"grouped")).set(m,e),e.via_bot_id&&(e.viaBotId=e.via_bot_id));const g=this.getDialogOnly(p);g&&m&&m>g[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0);const h=e.reply_to;h&&(h.reply_to_msg_id&&(h.reply_to_msg_id=e.reply_to_mid=(0,pe.Z)(h.reply_to_msg_id)),h.reply_to_top_id&&(h.reply_to_top_id=(0,pe.Z)(h.reply_to_top_id)));const u=l&&e.replies;u&&(u.max_id&&(u.max_id=(0,pe.Z)(u.max_id)),u.read_max_id&&(u.read_max_id=(0,pe.Z)(u.read_max_id)));const y=!!p;y||(e.date-=this.timeManager.getServerTimeOffset());const _=this.appPeersManager.peerId,v=l&&e.fwd_from;if(e.peerId=p,e.fromId=p===_?v?v.from_id?this.appPeersManager.getPeerId(v.from_id):o.NM:_:e.pFlags.post||!e.from_id?p:this.appPeersManager.getPeerId(e.from_id),v){v.saved_from_msg_id&&(v.saved_from_msg_id=(0,pe.Z)(v.saved_from_msg_id)),v.channel_post&&(v.channel_post=(0,pe.Z)(v.channel_post));const t=v.saved_from_peer||v.from_id,a=v.saved_from_msg_id||v.channel_post;if(t&&a){const s=this.appPeersManager.getPeerId(t),n=(0,pe.Z)(a);e.savedFrom=s+"_"+n}e.fwdFromId=this.appPeersManager.getPeerId(v.from_id),y||(v.date-=this.timeManager.getServerTimeOffset())}const P={type:"message",peerId:p,messageId:m};let b=!1;const M=l&&e.media;if(M)switch(M._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":M.ttl_seconds?b=!0:M.photo=this.appPhotosManager.savePhoto(M.photo,P),M.photo||delete e.media;break;case"messageMediaPoll":{const t=this.appPollsManager.savePoll(M.poll,M.results,e);M.poll=t.poll,M.results=t.results;break}case"messageMediaDocument":if(M.ttl_seconds)b=!0;else{const e=M.document;M.document=this.appDocsManager.saveDoc(e,P),M.document||"documentEmpty"===e._||(b=!0)}break;case"messageMediaWebPage":{const a=this.appWebPagesManager.getMessageKeyForPendingWebPage(p,m,t.isScheduled);M.webpage=this.appWebPagesManager.saveWebPage(M.webpage,a,P),M.webpage||delete e.media;break}case"messageMediaInvoice":{M.photo=this.appWebDocsManager.saveWebDocument(M.photo);const e=M.extended_media;if("messageExtendedMedia"===(null==e?void 0:e._)){const t=e.media;t.photo=this.appPhotosManager.savePhoto(t.photo,P),t.document=this.appDocsManager.saveDoc(t.document,P)}break}case"messageMediaUnsupported":b=!0}if(l&&b&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities),!l&&e.action){const t=e.action,a=e.fromId===this.appUsersManager.getSelf().id?"You":"";let s,i;switch(t.photo&&(t.photo=this.appPhotosManager.savePhoto(t.photo,P)),t.document&&(t.document=this.appDocsManager.saveDoc(t.photo,P)),t._){case"messageActionChatEditPhoto":(null===(n=t.photo)||void 0===n?void 0:n.video_sizes)?t._=c?"messageActionChannelEditVideo":"messageActionChatEditVideo":c&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;this.appGroupCallsManager.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",c||(e+="_by"+a),t.type=e;break}case"messageActionChatEditTitle":c&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":c&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=f?"messageActionChatJoined"+a:"messageActionChatReturn"+a)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+a);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),i=p;break;case"messageActionChatMigrateTo":s=p,i=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(t.pFlags.video?"video_":"")+(void 0!==t.duration?e.pFlags.out?"out_":"in_":"")+(void 0!==t.duration?"ok":"phoneCallDiscardReasonMissed"===t.reason._?"missed":"cancelled")}s&&i&&!this.migratedFromTo[s]&&!this.migratedToFrom[i]&&this.migrateChecks(s,i)}return l&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),d.set(m,e),e}saveMessages(e,t={}){return e.saved||(e.saved=!0,e.forEach(((e,a,s)=>{s[a]=this.saveMessage(e,t)}))),e}getFirstMessageToEdit(e,t){return Yt(this,void 0,void 0,(function*(){const a=this.getHistoryStorage(e,t).history.slice;if(a.isEnd(se.D.Bottom)&&a.length){let t;const s=this.appPeersManager.peerId;for(const n of a){const a=this.getMessageByPeer(e,n);if((s===e?a.fromId===s:a.pFlags.out)&&(yield this.canEditMessage(a,"text"))){t=a;break}}return t}}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=(0,Pt.Z)(e.message,t);const a=(0,Ot.Z)(e.message);e.totalEntities=(0,Lt.Z)(t,a)}reportMessages(e,t,a,s){return this.apiManager.invokeApiSingle("messages.report",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e))),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=(0,Te.a)();return this.apiManager.invokeApi("messages.startBot",{bot:this.appUsersManager.getUserInput(e),peer:this.appPeersManager.getInputPeerById(s),random_id:t,start_param:a}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}const n="/start";if(t){let a;return a=this.appChatsManager.isChannel(t)?this.appChatsManager.inviteToChannel(t,[e]):this.appChatsManager.addChatUser(t,e,0),a.catch((e=>{if("USER_ALREADY_PARTICIPANT"!=(null==e?void 0:e.type))throw e;e.handled=!0})).then((()=>this.sendText(s,n+"@"+this.appPeersManager.getPeerUsername(e.toPeerId()))))}return this.sendText(s,n)}editPeerFolders(e,t){this.apiManager.invokeApi("folders.editPeerFolders",{folder_peers:e.map((e=>({_:"inputFolderPeer",peer:this.appPeersManager.getInputPeerById(e),folder_id:t})))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getFilter(e){return this.filtersStorage.getFilter(e)}toggleDialogPin(e){var t;return Yt(this,void 0,void 0,(function*(){const{peerId:a,topicId:s,filterId:n=(s?a:void 0)}=e;if(void 0===n)throw new Error("No filterId");if(n>1)return this.filtersStorage.toggleDialogPin(a,n);const i=this.dialogsStorage.getDialogOrTopic(a,s);if(!i)throw void 0;const r=!(null===(t=i.pFlags)||void 0===t?void 0:t.pinned)||void 0;if(r){const e=yield this.apiManager.getLimit(s?"topicPin":1===n?"folderPin":"pin");if(this.dialogsStorage.getPinnedOrders(n).length>=e)throw(0,X.Z)(s?"PINNED_TOO_MUCH":"PINNED_DIALOGS_TOO_MUCH")}return s?this.appChatsManager.updatePinnedForumTopic(a.toChatId(),s,r):this.apiManager.invokeApi("messages.toggleDialogPin",{peer:this.appPeersManager.getInputDialogPeerById(a),pinned:r}).then((e=>{const t=r?{pinned:r}:{};this.apiUpdatesManager.saveUpdate({_:"updateDialogPinned",peer:this.appPeersManager.getDialogPeer(a),folder_id:n,pFlags:t})}))}))}markDialogUnread(e,t){var a;const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!t&&!(null===(a=s.pFlags)||void 0===a?void 0:a.unread_mark)||void 0;return this.apiManager.invokeApi("messages.markDialogUnread",{peer:this.appPeersManager.getInputDialogPeerById(e),unread:n}).then((t=>{if(t){const t=n?{unread:n}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:this.appPeersManager.getDialogPeer(e),pFlags:t})}}))}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&this.appChatsManager.hasChat(t.toChatId())){const a=this.appChatsManager.getChat(e.toChatId());(null==a?void 0:a.migrated_to)&&a.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,this.rootScope.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){var a,s;if(null===(a=null==e?void 0:e.pFlags)||void 0===a?void 0:a.is_outgoing)return!1;const n=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&n.push("messageMediaPoll"),!(!e||"message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===n.indexOf(e.media._)||e.fromId&&this.appUsersManager.isBot(e.fromId)||"messageMediaDocument"===(null===(s=e.media)||void 0===s?void 0:s._)&&(e.media.document.sticker||"round"===e.media.document.type))}canEditMessage(e,t="text"){var a;return Yt(this,void 0,void 0,(function*(){return!(!e||!this.canMessageBeEdited(e,t)||this.getMessagePeer(e)!==this.appUsersManager.getSelf().id&&(!e.pFlags.out||"peerChannel"!==e.peer_id._&&e.date<(0,te.Z)(!0)-(yield this.apiManager.getConfig()).edit_time_limit&&"messageMediaPoll"!==(null===(a=e.media)||void 0===a?void 0:a._)))}))}canDeleteMessage(e){return e&&(e.peerId.isUser()||e.pFlags.out||"chat"===this.appChatsManager.getChat(e.peerId.toChatId())._||this.appChatsManager.hasRights(e.peerId.toChatId(),"delete_messages"))&&(!e.pFlags.is_outgoing||!!e.error)}getReplyKeyboard(e){return this.getHistoryStorage(e).replyMarkup}mergeReplyKeyboard(e,t){var a,s;if(!t)return!1;const n=t.reply_markup;if(!n&&!(null===(a=t.pFlags)||void 0===a?void 0:a.out)&&!t.action)return!1;if("replyInlineMarkup"===(null==n?void 0:n._))return!1;const i=e.replyMarkup;if(n)return!(i&&i.mid>=t.mid||n.pFlags.selective||(e.maxOutId&&t.midi.mid||t.pFlags.is_outgoing)&&t.message)return i.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return(0,ue.Z)(t),!("messageActionChatDeleteUser"!==(null===(s=t.action)||void 0===s?void 0:s._)||!(i?t.action.user_id===i.fromId:this.appUsersManager.isBot(t.action.user_id))||(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},0))}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,a=!0,s){return this.appPeersManager.isPeerRestricted(e)?Promise.resolve(t.map((e=>({_:"messages.searchCounter",pFlags:{},filter:e,count:0})))):(a?this.apiManager.invokeApiCacheable:this.apiManager.invokeApi).bind(this.apiManager)("messages.getSearchCounters",{peer:this.appPeersManager.getInputPeerById(e),filters:t,top_msg_id:s?(0,oe.Z)(s):void 0})}filterMessagesByInputFilterFromStorage(e,t,a,s){const n=this.getMessagesStorage(a);return(0,Nt.Z)(e,t.map((e=>n.get(e))),s)}getSearch({peerId:e,query:t,inputFilter:a,maxId:s,limit:n,nextRate:i,backLimit:r,threadId:o,folderId:p,minDate:f,maxDate:c}){if(this.appPeersManager.isPeerRestricted(e))return Promise.resolve({count:0,offset_id_offset:0,next_rate:void 0,history:[]});t||(t=""),a||(a={_:"inputMessagesFilterEmpty"}),void 0===n&&(n=20),i||(i=0),r||(r=0),f=f?f/1e3|0:0,c=c?c/1e3|0:0;let l=[];r&&(n+=r);let m;if(!e||r||s||t||1===n||o||(m=this.getHistoryStorage(e),l=this.filterMessagesByInputFilterFromStorage(a._,m.history.slice,this.getHistoryMessagesStorage(e),n)),l.length){if(!(l.length{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),d.ZP&&this.log("getSearch result:",a,e);const t=e.count||l.length+e.messages.length;return e.messages.forEach((e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=this.appChatsManager.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}l.push(e)})),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:l}}))}subscribeRepliesThread(e,t){const a=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===a)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const a=(0,oe.Z)(Math.max(...this.getMidsByMessage(e))),s={_:"messageService",pFlags:{is_single:!0},id:this.appMessagesIdsManager.generateTempMessageId(a),date:e.date,from_id:{_:"peerUser",user_id:o.NM},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.peerId,e.id)};this.saveMessages([s],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=s.mid}getThreadServiceMessageId(e,t){return this.threadsServiceMessagesIdsStorage[e+"_"+t]}getDiscussionMessage(e,t){return this.apiManager.invokeApiSingle("messages.getDiscussionMessage",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((a=>{var s;this.appChatsManager.saveApiChats(a.chats),this.appUsersManager.saveApiUsers(a.users),this.saveMessages(a.messages);const n=this.getMessageWithReplies(a.messages[0]),i=n.peerId+"_"+n.mid;this.generateThreadServiceStartMessage(n);const r=this.getHistoryStorage(n.peerId,n.mid),o=a.max_id=(0,pe.Z)(a.max_id)||0;a.read_inbox_max_id=r.readMaxId=(0,pe.Z)(null!==(s=a.read_inbox_max_id)&&void 0!==s?s:n.mid),a.read_outbox_max_id=r.readOutboxMaxId=(0,pe.Z)(a.read_outbox_max_id)||0;const p=r.history.first;return r.maxId&&r.maxId{this.newDialogsHandlePromise=void 0,this.handleNewDialogs()}))}deleteMessages(e,t,a){var s,n;return Yt(this,void 0,void 0,(function*(){let i;const r=yield this.apiManager.getConfig(),o=t.splice(r.forwarded_count_max,t.length-r.forwarded_count_max),p=t.map((e=>(0,oe.Z)(e)));if(e.isAnyChat()&&this.appPeersManager.isChannel(e)){const a=e.toChatId(),r=this.appChatsManager.getChat(a);if(!r.pFlags.creator&&!(null===(n=null===(s=r.admin_rights)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.delete_messages)&&!(t=t.filter((t=>!!this.getMessageByPeer(e,t).pFlags.out))).length)return;i=this.apiManager.invokeApi("channels.deleteMessages",{channel:this.appChatsManager.getChannelInput(a),id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:a,messages:t,pts:e.pts,pts_count:e.pts_count})}))}else i=this.apiManager.invokeApi("messages.deleteMessages",{revoke:a,id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})}));const d=[i];return o.length&&d.push(this.deleteMessages(e,o,a)),Promise.all(d).then(jt.Z)}))}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)){if(a&&!s){const t=this.dialogsStorage.getForumTopic(e,a);(0,oe.Z)(t.read_inbox_max_id)||(s=!0)}if(!s){const t=this.appChatsManager.isForum(e.toChatId())&&a?this.dialogsStorage.getForumTopic(e,a):this.getDialogOnly(e);t&&this.isDialogUnread(t)&&(s=!0)}if(!s)return this.log("readHistory: isn't unread"),Promise.resolve()}const n=this.getHistoryStorage(e,a);if(n.triedToReadMaxId>=t)return Promise.resolve();let i;return a?(n.readPromise||(i=this.apiManager.invokeApi("messages.readDiscussion",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(a),read_max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:a,read_max_id:t})):this.appPeersManager.isChannel(e)?(n.readPromise||(i=this.apiManager.invokeApi("channels.readHistory",{channel:this.appChatsManager.getChannelInput(e.toChatId()),max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(n.readPromise||(i=this.apiManager.invokeApi("messages.readHistory",{peer:this.appPeersManager.getInputPeerById(e),max_id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})}))),this.apiUpdatesManager.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:this.appPeersManager.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),this.rootScope.dispatchEvent("notification_reset",this.appPeersManager.getPeerString(e)),n.readPromise?n.readPromise:(n.triedToReadMaxId=t,i.finally((()=>{delete n.readPromise;const{readMaxId:s}=n;this.log("readHistory: promise finally",t,s),s>t&&this.readHistory(e,s,a,!0)})),n.readPromise=i)}readAllHistory(e,t,a=!1){const s=this.getHistoryStorage(e,t);s.maxId&&this.readHistory(e,s.maxId,t,a)}getUnreadMentionsKey(e,t){return e+(t?`_${t}`:"")}fixDialogUnreadMentionsIfNoMessage(e,t){const a=this.dialogsStorage.getDialogOrTopic(e,t);(null==a?void 0:a.unread_mentions_count)&&this.reloadConversationOrTopic(e)}modifyCachedMentions(e,t,a,s){const n=this.unreadMentions[this.getUnreadMentionsKey(e,s)];n&&(a?n.first.isEnd(se.D.Top)&&n.insertSlice([t]):n.delete(t))}fixUnreadMentionsCountIfNeeded(e,t,a){const s=this.dialogsStorage.getDialogOrTopic(e,a);!t.length&&(null==s?void 0:s.unread_mentions_count)&&this.reloadConversationOrTopic(e)}goToNextMention(e,t){var a,s;const n=this.getUnreadMentionsKey(e,t),i=this.goToNextMentionPromises[n];if(i)return i;const r=null!==(a=(s=this.unreadMentions)[e])&&void 0!==a?a:s[e]=new se.Z,o=r.length,p=r.first.isEnd(se.D.Top);if(!o&&p)return this.fixUnreadMentionsCountIfNeeded(e,r,t),Promise.resolve();let d=Promise.resolve();return!p&&o<25&&(d=this.loadNextMentions(e,t)),this.goToNextMentionPromises[n]=d.then((()=>{const a=r.last,s=a&&a[a.length-1];if(s)return r.delete(s),s;this.fixUnreadMentionsCountIfNeeded(e,r,t)})).finally((()=>{delete this.goToNextMentionPromises[n]}))}loadNextMentions(e,t){const a=this.unreadMentions[e],s=a.first[0]||1;return this.getUnreadMentions(e,s,-50,50,void 0,void 0,t).then((e=>{this.mergeHistoryResult(a,e,1===s?0:s,50,-50)}))}getUnreadMentions(e,t,a,s,n=0,i=0,r){return this.apiManager.invokeApiSingleProcess({method:"messages.getUnreadMentions",params:{peer:this.appPeersManager.getInputPeerById(e),offset_id:(0,oe.Z)(t),add_offset:a,limit:s,max_id:(0,oe.Z)(n),min_id:(0,oe.Z)(i),top_msg_id:r?(0,oe.Z)(r):void 0},processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),e)})}readMessages(e,t){if(!t.length)return Promise.resolve();let a,s;if(t=t.map((e=>(0,oe.Z)(e))),e.isAnyChat()&&this.appPeersManager.isChannel(e)){const n=e.toChatId();s={_:"updateChannelReadMessagesContents",channel_id:n,messages:t},a=this.apiManager.invokeApi("channels.readMessageContents",{channel:this.appChatsManager.getChannelInput(n),id:t})}else s={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},a=this.apiManager.invokeApi("messages.readMessageContents",{id:t}).then((e=>{s.pts=e.pts,s.pts_count=e.pts_count,this.apiUpdatesManager.processLocalUpdate(s)}));return this.apiUpdatesManager.processLocalUpdate(s),a}getHistoryStorage(e,t){var a,s,n,i,r,o;return t?null!==(s=(r=null!==(a=(i=this.threadsStorage)[e])&&void 0!==a?a:i[e]={})[t])&&void 0!==s?s:r[t]={count:null,history:new se.Z}:null!==(n=(o=this.historiesStorage)[e])&&void 0!==n?n:o[e]={count:null,history:new se.Z}}getHistoryStorageTransferable(e,t){const a=this.getHistoryStorage(e,t),{count:s,history:n,maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}=a;return{count:s,history:void 0,historySerialized:n.toJSON(),maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}}getNotifyPeerSettings(e,t){const a=this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:t});return Promise.all([this.appNotificationsManager.getNotifyPeerTypeSettings(),this.appNotificationsManager.getNotifySettings(a)]).then((([a,s])=>({muted:this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!0,threadId:t}),peerTypeNotifySettings:s})))}getUpdateAfterReloadKey(e,t){return e+(t?"_"+t:"")}handleNewUpdateAfterReload(e,t,a){var s,n,i;const r=null!==(s=(n=this.newUpdatesAfterReloadToHandle)[i=this.getUpdateAfterReloadKey(e,a)])&&void 0!==s?s:n[i]=new Set;r.has(t)?this.log.error("here we go again",e):(t.ignoreExisting=!0,r.add(t),this.scheduleHandleNewDialogs(e,a))}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let a="";if(null===(t=null==e?void 0:e.peerId)||void 0===t?void 0:t.isAnyChat()){const t=(0,Qt.Z)(e,this.appChatsManager.isForum(e.peerId.toChatId()));t&&(a=e.peerId+"_"+t)}return a}updateMessage(e,t,a){return this.reloadMessages(e,t,!0).then((()=>{const s=this.getMessageByPeer(e,t);if(s)return a&&this.rootScope.dispatchEvent(a,s),s}))}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let a;if(t){const s=this.pendingByRandomId[t];(a=this.finalizePendingMessage(t,e))&&this.rootScope.dispatchEvent("history_update",{storageKey:s.storage.key,message:e,sequential:s.sequential}),delete this.pendingByMessageId[e.mid]}return a}mutePeer(e){if(!(e=this.appNotificationsManager.validatePeerSettings(e)))return;const{peerId:t,muteUntil:a,threadId:s}=e,n={_:"inputPeerNotifySettings"};n.mute_until=a;const i=this.appPeersManager.getInputPeerById(t);return this.appNotificationsManager.updateNotifySettings(s?{_:"inputNotifyForumTopic",peer:i,top_msg_id:(0,oe.Z)(s)}:{_:"inputNotifyPeer",peer:i},n)}togglePeerMute({peerId:e,mute:t,threadId:a}){return void 0===t&&(t=!this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:a})),this.mutePeer({peerId:e,muteUntil:t?o.rU:0,threadId:a})}findPeerIdByMids(e){for(let t=e.length-1;t>=0;--t){const a=e[t],s=this.getMessageById(a);if(s)return s.peerId}}canSendToPeer(e,t,a="send_messages"){var s;if(this.appPeersManager.isPeerRestricted(e))return!1;if(e.isAnyChat()){const n=e.toChatId();if(t){const a=this.dialogsStorage.getForumTopic(e,t);if((null===(s=null==a?void 0:a.pFlags)||void 0===s?void 0:s.closed)&&!this.appChatsManager.hasRights(n,"manage_topics"))return!1}const i=this.appChatsManager.getChat(n);return this.appChatsManager.hasRights(n,a,void 0,!!t)&&(!i.pFlags.left||!!t)}return this.appUsersManager.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(!a)return;const{peerId:s,tempId:n,threadId:i,storage:r}=a;[this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)}));const o=this.getMessageFromStorage(r,n);return o&&(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),this.rootScope.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,n,t),o}finalizePendingMessageCallbacks(e,t,a){const s=this.tempFinalizeCallbacks[t];if(void 0!==s){for(const e in s){const{deferred:t,callback:n}=s[e];n(a).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(a.media){(0,ue.Z)(a);const{photo:e,document:s}=a.media;if(e){const a=this.appPhotosManager.getPhoto(""+t);if(a){const t=e.sizes[e.sizes.length-1],s=this.thumbsStorage.getCacheContext(e,t.type),n=this.thumbsStorage.getCacheContext(a,o.Pt);Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=(0,Vt.Z)(e,i);(0,ct.P)(r.location)}}else if(s){const e=this.appDocsManager.getDoc(""+t);if(e){const t=this.thumbsStorage.getCacheContext(e);if(e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type&&t.url){const e=this.thumbsStorage.getCacheContext(s);Object.assign(e,t),n=s,(0,ct.P)((0,ft.Z)(n,undefined),{fileName:n.file_name})}}}else a.media.poll&&(delete this.appPollsManager.polls[t],delete this.appPollsManager.results[t])}var n;const i=this.getMessageFromStorage(e,t);e.delete(t),!i.reply_markup&&a.reply_markup&&setTimeout((()=>{this.getMessageFromStorage(e,a.mid)&&this.rootScope.dispatchEvent("message_edit",{storageKey:e.key,peerId:a.peerId,mid:a.mid,message:a})}),0),this.handleReleasingMessage(i,e),this.rootScope.dispatchEvent("message_sent",{storageKey:e.key,tempId:t,tempMessage:i,mid:a.mid,message:a})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,this.appStateManager.pushToState("maxSeenMsgId",e),this.apiManager.invokeApi("messages.receivedMessages",{max_id:(0,oe.Z)(e)})}getMessageReactionsListAndReadParticipants(e,t,a,s,n,i){var r,o;return Yt(this,void 0,void 0,(function*(){const p={reactions:[],count:0,next_offset:void 0},d=yield this.canViewMessageReadParticipants(e);return d&&void 0===t?t=100:void 0===t&&(t=50),Promise.all([!d||a||n?[]:this.getMessageReadParticipants(e.peerId,e.mid).catch((()=>[])),(null===(o=null===(r=e.reactions)||void 0===r?void 0:r.recent_reactions)||void 0===o?void 0:o.length)&&!i?this.appReactionsManager.getMessageReactionsList(e.peerId,e.mid,t,a,s).catch((e=>p)):p]).then((([e,t])=>{const a=e.map((e=>e.toPeerId())),s=a.slice();(0,ne.Z)(s,((e,a,s)=>{t.reactions.some((t=>this.appPeersManager.getPeerId(t.peer_id)===e))&&s.splice(a,1)}));let n=t.reactions.map((e=>({peerId:this.appPeersManager.getPeerId(e.peer_id),reaction:e.reaction})));return n=n.concat(s.map((e=>({peerId:e})))),{reactions:t.reactions,reactionsCount:t.count,readParticipants:a,combined:n,nextOffset:t.next_offset}}))}))}getMessageReadParticipants(e,t){return this.apiManager.invokeApiSingle("messages.getMessageReadParticipants",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>e.map((e=>e.toUserId()))))}canViewMessageReadParticipants(e){return Yt(this,void 0,void 0,(function*(){if("message"!==(null==e?void 0:e._)||e.pFlags.is_outgoing||!e.pFlags.out||!this.appPeersManager.isAnyGroup(e.peerId))return!1;const t=this.appChatsManager.getChat(e.peerId.toChatId()),a=yield this.apiManager.getAppConfig();return t.participants_count<=a.chat_read_mark_size_threshold&&(0,te.Z)(!0)-e.date(0,oe.Z)(e))),increment:!0}).then((a=>{const s=new Array(t.length);for(let n=0,i=t.length;n{const{chatPeerIds:t}=e.state;return t[t.length-1]===a}));n||(s.sort(((e,t)=>e.state.idleStartTime-t.state.idleStartTime)),n=s[0].state.idleStartTime?s[s.length-1]:s[0]),f.Z.getInstance().invokeVoid("notificationBuild",Object.assign({message:e},t),n.source)}getScheduledMessagesStorage(e){var t,a;return null!==(t=(a=this.scheduledMessagesStorage)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"scheduled")}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return;const t=this.getScheduledMessagesStorage(e);return t.size?[...t.keys()]:this.apiManager.invokeApiSingle("messages.getScheduledHistory",{peer:this.appPeersManager.getInputPeerById(e),hash:""}).then((t=>{if("messages.messagesNotModified"!==t._){this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats);const a=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:a,isScheduled:!0}),[...a.keys()]}return[]}))}sendScheduledMessages(e,t){return this.apiManager.invokeApi("messages.sendScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}deleteScheduledMessages(e,t){return this.apiManager.invokeApi("messages.deleteScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getMessageWithReplies(e){return this.filterMessages(e,(e=>!!e.replies))[0]}getMessageWithCommentReplies(e){if(e.peerId!==o.hj){const t=null==(e=this.getMessageWithReplies(e))?void 0:e.replies;if(!t||!t.pFlags.comments||t.channel_id.toChatId()===o.IA)return}return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&(!this.appChatsManager.isInChat(e.toChatId())||this.appChatsManager.isForum(e.toChatId()))}getNewHistory(e,t){var a;return Yt(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const s=this.getHistoryStorage(e,t),n=s.history.slice;if(!n.isEnd(se.D.Bottom))return;delete s.maxId,n.unsetEnd(se.D.Bottom);const i=yield this.getHistory(e,null!==(a=n[0])&&void 0!==a?a:1,0,50,t);for(let t=0,a=i.history.length;t{const e=i.history.sliceMe(t,r,a),s=(null==e?void 0:e.slice)||i.history.constructSlice();return{count:i.count,history:Array.from(s),isEnd:s.getEnds(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||i.count}})):{count:i.count,history:Array.from(o.slice),isEnd:o.slice.getEnds(),offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,a){const{offset_id_offset:s,messages:n}=e,i=e.count||n.length,r=s||0,o=a<0?t+a:t;return{count:i,offsetIdOffset:r,isTopEnd:r>=i-o||ie.mid));if(a&&(0,oe.Z)(a)&&!c.includes(a)&&pc[e]);++e);c.splice(e,0,a)}const l=e.insertSlice(c)||e.slice;return d&&l.setEnd(se.D.Top),f&&l.setEnd(se.D.Bottom),Object.assign({slice:l,mids:c,messages:i},r)}fillHistoryStorage(e,t,a,s,n,i){const r=n.maxId;return this.requestHistory(e,t,a,s,void 0,i).then((i=>{const{count:o,isBottomEnd:p,slice:d,messages:f}=this.mergeHistoryResult(n.history,i,t,a,s);n.count=o;for(let t=0,a=f.length;t{d.ZP&&this.log("requestHistory result:",e,r,t,a,s),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages),"pts"in r&&this.apiUpdatesManager.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,p=r.count;o&&!r.messages[o-1]&&(r.messages.splice(o-1,1),o--,p--);const f=this.getHistoryStorage(e,i),c=r.messages[o-1];if(o&&c.grouped_id){const t=f.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr))}return r}),(t=>{if("CHANNEL_PRIVATE"===t.type){let t=this.appChatsManager.getChat(e.toChatId());"channel"===t._&&(t={_:"channelForbidden",id:e.toChatId(),access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}),this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t}))}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=(0,P.Z)(0).then((()=>{const e=[];for(const[t,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map((e=>({_:"inputMessageID",id:(0,oe.Z)(e)})));let i;i=t.isAnyChat()&&this.appPeersManager.isChannel(t)?this.apiManager.invokeApiSingle("channels.getMessages",{channel:this.appChatsManager.getChannelInput(t.toChatId()),id:n}):this.apiManager.invokeApiSingle("messages.getMessages",{id:n});const r=i.then((e=>{(0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=this.saveMessages(e.messages);for(let e=0;e{this.rootScope.dispatchEvent("messages_downloaded",{peerId:t,mids:s})}));e.push(r)}return this.needSingleMessages.clear(),Promise.all(e).then(jt.Z,jt.Z).then((()=>{this.fetchSingleMessagesPromise=void 0,this.needSingleMessages.size&&this.fetchSingleMessages()}))}))}reloadMessages(e,t,a){if(Array.isArray(t))return Promise.all(t.map((t=>this.reloadMessages(e,t,a))));const s=this.getMessageByPeer(e,t);if(s&&!a)return this.rootScope.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(s);{let a=this.needSingleMessages.get(e);a||this.needSingleMessages.set(e,a=new Map);let s=a.get(t);return s||(s=(0,v.Z)(),a.set(t,s),this.fetchSingleMessages(),s)}}getExtendedMedia(e,t){let a=this.extendedMedia.get(e);a||this.extendedMedia.set(e,a=new Map);const s=(0,v.Z)(),n=[],i=t.map((t=>{let i=a.get(t);return i||(a.set(t,i=s),n.push(t),i.then((()=>{a.delete(t),a.size||this.extendedMedia.get(e)!==a||this.extendedMedia.delete(e)}))),i}));return n.length?this.apiManager.invokeApi("messages.getExtendedMedia",{peer:this.appPeersManager.getInputPeerById(e),id:n.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),s.resolve()})):s.resolve(),Promise.all(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.reloadMessages(t,e.reply_to_mid).then((t=>{if(t||delete(e=this.getMessageByPeer(e.peerId,e.mid)).reply_to_mid,"messageService"===e._){const t=e.peerId;this.rootScope.dispatchEvent("message_edit",{storageKey:`${t}_history`,peerId:t,mid:e.mid,message:e}),this.isMessageIsTopMessage(e)&&this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:this.getDialogOnly(t)}]]))}return t}))}getTypingKey(e,t){return t?`${e}_${t}`:e}setTyping(e,t,a,s){var n;s&&!this.appPeersManager.isForum(e)&&(s=void 0);const i=this.getTypingKey(e,s);let r=this.typings[i];return e&&this.canSendToPeer(e)&&e!==this.appPeersManager.peerId&&(a||(null===(n=null==r?void 0:r.action)||void 0===n?void 0:n._)!==t._)?((null==r?void 0:r.timeout)&&clearTimeout(r.timeout),r=this.typings[i]={action:t},this.apiManager.invokeApi("messages.setTyping",{peer:this.appPeersManager.getInputPeerById(e),action:t,top_msg_id:s?(0,oe.Z)(s):void 0}).finally((()=>{r===this.typings[i]&&(r.timeout=E.Z.setTimeout((()=>{delete this.typings[i]}),6e3))}))):Promise.resolve(!1)}handleReleasingMessage(e,t){const a=e.media;if(a){const s=a.webpage||a,n=s.photo||s.document;if((null==n?void 0:n.file_reference)&&this.referenceDatabase.deleteContext(n.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in a&&a.webpage){const s=this.getScheduledMessagesStorage(e.peerId)===t,n=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,s);this.appWebPagesManager.deleteWebPageFromPending(a.webpage,n)}a.poll&&this.appPollsManager.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,a){const s={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const n of a){const a=this.getMessageFromStorage(t,n);if(!a){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(a,t),this.updateMessageRepliesIfNeeded(a),a.pFlags.out||a.pFlags.is_outgoing||!a.pFlags.unread||(++s.unread,this.rootScope.dispatchEvent("notification_cancel","msg"+n),a.pFlags.mentioned&&(++s.unreadMentions,this.modifyCachedMentions(e,n,!1))),++s.count,s.msgs.add(n),a.deleted=!0;const i=a.grouped_id;if(i){const e=this.groupedMessagesStorage[i];e&&(e.delete(n),s.albums||(s.albums={}),(s.albums[i]||(s.albums[i]=new Set)).add(n),e.size||(delete s.albums,delete this.groupedMessagesStorage[i]))}t.delete(n)}if(s.albums)for(const e in s.albums)this.dispatchAlbumEdit(e,t,[...s.albums[e]]);return s}handleEditedMessage(e,t,a){var s;if("message"===e._){if(null===(s=e.media)||void 0===s?void 0:s.webpage){const t=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);this.appWebPagesManager.deleteWebPageFromPending(e.media.webpage,t)}const t=e.grouped_id;t&&this.dispatchAlbumEdit(t,a,[])}}dispatchAlbumEdit(e,t,a){const s=this.getMidsByAlbum(e).map((e=>this.getMessageFromStorage(t,e)));this.rootScope.dispatchEvent("album_edit",{peerId:s[0].peerId,groupId:e,deletedMids:a||[],messages:s})}getDialogUnreadCount(e){return e.unread_count||+!!e.pFlags.unread_mark}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return"message"===(null==e?void 0:e._)&&!e.pFlags.noforwards&&!this.appPeersManager.noForwards(e.peerId)}pushBatchUpdate(e,t,a,s){let n=this.batchUpdates[e];n||(n=this.batchUpdates[e]={callback:t,batch:new Map}),n.batch.has(a)||(n.batch.set(a,s?s():void 0),this.batchUpdatesDebounced())}getMessagesFromMap(e){const t=new Map;for(const[a,s]of e){const[e,n]=a.split("_"),i=this.getMessageByPeer(e.toPeerId(),+n);i&&t.set(i,s)}return t}saveDefaultSendAs(e,t){return this.appProfileManager.getCachedFullChat(e.toChatId()).default_send_as=this.appPeersManager.getOutputPeer(t),this.apiManager.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(e),send_as:this.appPeersManager.getInputPeerById(t)})}}var aa=a(6724);function sa(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}class na extends G{constructor(){super(...arguments),this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null,notifyForumTopic:{}},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=(0,te.Z)(!0);let t=o.rU;const a=a=>{if(a instanceof Promise)return!1;const s=a.mute_until;return!!s&&(s<=e?(a.mute_until=0,!0):(s{for(const t in this.peerSettings[e]){const s=this.peerSettings[e][t];if(a(s)){const[e,a]=t.split("_"),n=this.appPeersManager.getOutputPeer(e.toPeerId());this.apiUpdatesManager.saveUpdate({_:"updateNotifySettings",peer:a?{_:"notifyForumTopic",peer:n,top_msg_id:+a}:{_:"notifyPeer",peer:n},notify_settings:s})}}}));const s=Math.min(18e5,1e3*(t-e));this.checkMuteUntilTimeout=E.Z.setTimeout(this.checkMuteUntil,s)}}after(){return this.checkMuteUntilThrottled=(0,aa.Z)(this.checkMuteUntil,1e3,!1),this.apiUpdatesManager.addMultipleEventsListeners({updateNotifySettings:e=>{const{peer:t}=e,a="notifyForumTopic"===t._,s="notifyPeer"===t._||a,n=s&&this.appPeersManager.getPeerId(t.peer),i=s?void 0:t._;this.savePeerSettings({key:i,peerId:n,threadId:a?(0,pe.Z)(t.top_msg_id):void 0,settings:e.notify_settings}),this.rootScope.dispatchEvent("notify_settings",e)}}),this.appStateManager.getState().then((e=>{if(e.notifySettings)for(const t in e.notifySettings)(0,ue.Z)(t),this.savePeerSettings({key:t,settings:e.notifySettings[t]})}))}getNotifySettings(e){let t,a=sa(e._),s=this.peerSettings[a];return"inputNotifyPeer"===e._&&(t=a=this.appPeersManager.getPeerId(e.peer),s=s[a]),s||((s||this.peerSettings)[a]=this.apiManager.invokeApi("account.getNotifySettings",{peer:e}).then((e=>(this.savePeerSettings({key:a,peerId:t,settings:e}),e))))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map((e=>this.getNotifySettings({_:e})));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return this.apiManager.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then((a=>{a&&this.apiUpdatesManager.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:sa(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})}))}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=this.apiManager.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){this.apiManager.invokeApi("account.setContactSignUpNotification",{silent:e}).then((t=>{this.notifyContactsSignUp=Promise.resolve(!e)}))}getPeerKey(e,t){return e+(t?"_"+t:"")}savePeerSettings({key:e,peerId:t,threadId:a,settings:s}){let n;t&&(e=this.getPeerKey(t,a),n=this.peerSettings[a?"notifyForumTopic":"notifyPeer"]),(n||this.peerSettings)[e]=s,t?this.checkMuteUntilThrottled():(this.rootScope.dispatchEvent("notify_peer_type_settings",{key:e,settings:s}),this.appStateManager.getState().then((t=>{const a=t.notifySettings;a[e]=s,this.appStateManager.pushToState("notifySettings",a)})))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>(0,te.Z)())}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then((e=>this.isMuted(e)))}getPeerLocalSettings({peerId:e,respectType:t=!0,threadId:a}){const s={_:"peerNotifySettings"},n=this.getPeerKey(e,a),i=this.peerSettings[a?"notifyForumTopic":"notifyPeer"][n];if(!i||i instanceof Promise||Object.assign(s,i),t){const t=sa(this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:a})._),n=this.peerSettings[t];if(n&&!(n instanceof Promise))for(const e in n)void 0===s[e]&&(s[e]=n[e])}return s}validatePeerSettings(e){if(e.peerId!==this.appPeersManager.peerId)return e.threadId&&!this.appPeersManager.isForum(e.peerId)&&(e.threadId=void 0),e}isPeerLocalMuted(e){if(!(e=this.validatePeerSettings(e)))return!1;const t=this.getPeerLocalSettings(e);return this.isMuted(t)}}var ia=a(677),ra=a(617),oa=a(7361),pa=a(7419),da=a(7256);class fa extends G{get peerId(){return this.appUsersManager.userId.toPeerId()}canPinMessage(e){return e.isUser()||this.appChatsManager.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){const t=this.getPeer(e);return(0,da.Z)(t)}getPeerMigratedTo(e){if(e.isUser())return!1;const t=this.appChatsManager.getChat(e.toChatId()),a=null==t?void 0:t.migrated_to;return!(!a||!t.pFlags.deactivated)&&(0,le.Z)(a)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return this.appChatsManager.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?this.appUsersManager.getUserString(e.toUserId()):this.appChatsManager.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeerActiveUsernames(e)[0]||""}getPeerActiveUsernames(e){const t=this.getPeer(e);return(0,Jt.Z)(t)}getPeer(e){return e.isUser()?this.appUsersManager.getUser(e.toUserId()):this.appChatsManager.getChat(e.toChatId())}getPeerId(e){return(0,le.Z)(e)||(0,fe.Z)(e)&&"inputPeerSelf"===e._&&this.peerId||o.NM}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&this.appChatsManager.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&this.appChatsManager.isMegagroup(e.toChatId())}isForum(e){return!e.isUser()&&this.appChatsManager.isForum(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!this.appChatsManager.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&this.appUsersManager.isBot(e.toUserId())}isContact(e){return e.isUser()&&this.appUsersManager.isContact(e.toUserId())}isUser(e){return(0,ra.Z)(e)}isAnyChat(e){return(0,oa.Z)(e)}isPeerRestricted(e){return(0,pa.Z)(this.getPeer(e))}getRestrictionReasonText(e){const t=this.getPeer(e),a=t.restriction_reason?(0,ia.RP)(t.restriction_reason):void 0;return a?a.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById({peerId:e,ignorePeerId:t,threadId:a}){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:a?{_:"inputNotifyForumTopic",peer:this.getInputPeerById(e),top_msg_id:(0,oe.Z)(a)}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return this.appChatsManager.getInputPeer(t)}const t=e.toUserId();return this.appUsersManager.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:(0,fe.Z)(e)?e:this.getInputPeerById(e)}}getPeerSearchText(e){let t;return t=this.isUser(e)?"%pu "+this.appUsersManager.getUserSearchText(e.toUserId()):"%pg "+(this.appChatsManager.getChat(e.toChatId()).title||""),t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===this.peerId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;return!e.isUser()&&!!(null===(t=this.appChatsManager.getChat(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}}class ca extends G{constructor(){super(...arguments),this.photos={}}savePhoto(e,t){var a;if(!e||"photoEmpty"===e._)return;const s=this.photos[e.id];if(e.file_reference&&(pt("file_reference",s,e),this.referenceDatabase.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){e.sizes.sort(((e,t)=>(e.size||(e.sizes?1/0:0))-(t.size||(t.sizes?1/0:0))));const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return s?Object.assign(s,e):this.photos[e.id]=e}getUserPhotos(e,t="0",a=20){const s=this.appUsersManager.getUserInput(e);return this.apiManager.invokeApiCacheable("photos.getUserPhotos",{user_id:s,offset:0,limit:a,max_id:t},{cacheSeconds:60}).then((a=>{this.appUsersManager.saveApiUsers(a.users);const s=a.photos.map(((t,s)=>(a.photos[s]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id)));if("0"!==t&&t){const e=s.indexOf(t);-1!==e&&s.splice(e,1)}return{count:a.count||s.length,photos:s}}))}getPhoto(e){return(0,fe.Z)(e)?e:this.photos[e]}}class la extends G{constructor(){super(...arguments),this.polls={},this.results={},this.pollToMessages={},this.log=(0,I.kg)("POLLS",I.v9.Error)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let a=e.results;const s=this.savePoll(t,a);t=s.poll,a=s.results,this.rootScope.dispatchEvent("poll_update",{poll:t,results:a})}})}savePoll(e,t,a){a&&this.updatePollToMessage(a,!0);const s=e.id;return this.polls[s]?(e=Object.assign(this.polls[s],e),t=this.saveResults(e,t)):(this.polls[s]=e,e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var a;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(a=null==t?void 0:t.results)||void 0===a?void 0:a.length)&&t.results.forEach(((t,a)=>{var s;(null===(s=t.pFlags)||void 0===s?void 0:s.chosen)&&e.chosenIndexes.push(a)}))),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,a,s){return a?(s||(s=[]),a=(0,ke.Z)(a,s)):a=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:a,solution_entities:a?s:void 0}}updatePollToMessage(e,t){const{id:a}=e.media.poll;let s=this.pollToMessages[a];if(!t&&!s)return;s||(s=this.pollToMessages[a]=new Set);const n=e.peerId+"_"+e.mid;t?s.add(n):s.delete(n),t||s.size||(delete this.polls[a],delete this.results[a],delete this.pollToMessages[a])}sendVote(e,t){const a=e.media.poll,s=t.map((e=>a.answers[e].option)),n=e.mid,i=e.peerId,r=this.appPeersManager.getInputPeerById(i);return e.pFlags.is_outgoing?this.appMessagesManager.invokeAfterMessageIsSent(n,"sendVote",(e=>(this.log("invoke sendVote callback"),this.sendVote(e,t)))):this.apiManager.invokeApi("messages.sendVote",{peer:r,msg_id:(0,oe.Z)(e.mid),options:s}).then((e=>{this.log("sendVote updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}))}getResults(e){const t=this.appPeersManager.getInputPeerById(e.peerId);return this.apiManager.invokeApi("messages.getPollResults",{peer:t,msg_id:(0,oe.Z)(e.mid)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),this.log("getResults updates:",e)}))}getVotes(e,t,a,s=20){return this.apiManager.invokeApi("messages.getPollVotes",{peer:this.appPeersManager.getInputPeerById(e.peerId),id:(0,oe.Z)(e.mid),option:t,offset:a,limit:s}).then((e=>(this.log("getPollVotes messages:",e),this.appUsersManager.saveApiUsers(e.users),e)))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const a=(0,ve.Z)(t);return a.pFlags.closed=!0,this.appMessagesManager.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(a)}).then((()=>{}),(e=>{this.log.error("stopPoll error:",e)}))}}class ma extends G{constructor(){super(...arguments),this.privacy={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,this.rootScope.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return this.apiManager.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then((a=>(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),this.apiUpdatesManager.processLocalUpdate({_:"updatePrivacy",key:{_:sa(e)},rules:t.map((e=>{const t={};return Object.assign(t,e),t._=sa(t._),t}))}),a.rules)))}getPrivacy(e){const t=sa(e),a=this.privacy[t];return a?Promise.resolve(a):this.privacy[t]=this.apiManager.invokeApi("account.getPrivacy",{key:{_:e}}).then((e=>(this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.privacy[t]=e.rules)))}getGlobalPrivacySettings(){return this.apiManager.invokeApi("account.getGlobalPrivacySettings")}setGlobalPrivacySettings(e){return this.apiManager.invokeApi("account.setGlobalPrivacySettings",{settings:e})}}var ga=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const ha=18e4;class ua extends G{constructor(){super(...arguments),this.usersFull={},this.chatsFull={},this.fullExpiration={},this.onUpdateUserTyping=e=>{var t,a;const s=e.user_id?e.user_id.toPeerId():this.appPeersManager.getPeerId(e.from_id);if(this.appPeersManager.peerId===s||"speakingInGroupCallAction"===e.action._)return;const n=e.top_msg_id,i=n?(0,pe.Z)(n):void 0,r=this.appPeersManager.getPeerId(e),o=this.getTypingsKey(r,i),p=null!==(t=(a=this.typingsInPeer)[o])&&void 0!==t?t:a[o]=[];let d=p.find((e=>e.userId===s));const f=()=>{delete d.timeout;const e=p.indexOf(d);-1!==e&&p.splice(e,1),this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p}),p.length||delete this.typingsInPeer[o]};if(void 0!==(null==d?void 0:d.timeout)&&clearTimeout(d.timeout),"sendMessageCancelAction"===e.action._){if(!d)return;return void f()}d||(d={userId:s},p.push(d)),d.action=e.action;const c=this.appUsersManager.hasUser(s);c?this.appUsersManager.forceUserOnline(s):"updateChatUserTyping"===e._&&e.chat_id&&this.appChatsManager.hasChat(e.chat_id)&&!this.appChatsManager.isChannel(e.chat_id)&&Promise.resolve(this.getChatFull(e.chat_id)).then((()=>{void 0!==d.timeout&&this.appUsersManager.hasUser(s)&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})})),d.timeout=E.Z.setTimeout(f,6e3),c&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})},this.onUpdatePeerBlocked=e=>{const t=this.appPeersManager.getPeerId(e.peer_id);if(this.appPeersManager.isUser(t)){const a=t.toUserId(),s=this.usersFull[a];s&&(e.blocked?s.pFlags.blocked=!0:delete s.pFlags.blocked),this.rootScope.dispatchEvent("user_full_update",a)}this.rootScope.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,a=this.chatsFull[e];void 0!==a&&(a.participants=t,this.rootScope.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,a=s.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,n=s.length;t{var t,a;const s=this.chatsFull[e],n=this.appChatsManager.getChat(e);if(!s||!n)return;let i=!1;!!s.call!=!!(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)&&(i=!0);const{photo:r}=n;if(r){const e="chatPhotoEmpty"!==r._;(e!==!(!s.chat_photo||"photoEmpty"===s.chat_photo._)||e&&r.photo_id!==(null===(a=s.chat_photo)||void 0===a?void 0:a.id))&&(i=!0)}i&&this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("channel_update",(e=>{this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("chat_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!0))})),this.rootScope.addEventListener("user_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!1))})),this.rootScope.addEventListener("invalidate_participants",(e=>{this.invalidateChannelParticipants(e)})),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_user,s=e.toPeerId(!1);a.profile_photo&&(a.profile_photo=this.appPhotosManager.savePhoto(a.profile_photo,{type:"profilePhoto",peerId:s}));const n=a.bot_info;if(n){const t={type:"userFull",userId:e};n.description_document=this.appDocsManager.saveDoc(n.description_document,t),n.description_photo=this.appPhotosManager.savePhoto(n.description_photo,t)}return this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.usersFull[e]=a,this.fullExpiration[s]=Date.now()+ha,this.rootScope.dispatchEvent("user_full_update",e),a}})}getProfileByPeerId(e,t){return this.appPeersManager.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return ga(this,void 0,void 0,(function*(){const t=yield this.getProfileByPeerId(e);switch(t._){case"userFull":return t.profile_photo;case"channelFull":case"chatFull":return t.chat_photo}}))}getChatFull(e,t){if(this.appChatsManager.isChannel(e))return this.getChannelFull(e,t);const a=e.toPeerId(!0),s=this.chatsFull[e];if(s&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s}})}getChatInviteLink(e,t){return ga(this,void 0,void 0,(function*(){const a=yield this.getChatFull(e);return!t&&a.exported_invite&&"chatInviteExported"==a.exported_invite._?a.exported_invite.link:this.apiManager.invokeApi("messages.exportChatInvite",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0))}).then((t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link)))}))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},a=200,s=0){if("channelParticipantsRecent"===t._){const t=this.appChatsManager.getChat(e);if((null==t?void 0:t.pFlags)&&t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights)return Promise.reject()}return this.apiManager.invokeApiCacheable("channels.getParticipants",{channel:this.appChatsManager.getChannelInput(e),filter:t,offset:s,limit:a,hash:"0"},{cacheSeconds:60}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getChannelParticipant(e,t){return this.apiManager.invokeApiSingle("channels.getParticipant",{channel:this.appChatsManager.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e.participant)))}getChannelFull(e,t){const a=e.toPeerId(!0);return void 0!==this.chatsFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s},processError:t=>{if("CHANNEL_PRIVATE"===t.type){const t=this.appChatsManager.getChat(e);this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:["channelForbidden"===t._?t:{_:"channelForbidden",id:e,access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}],users:[]})}throw t}})}getMentions(e,t,a){const s=e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new ae.Z({ignoreCase:!0}),s=new Map;e.forEach((e=>{a.indexObject(e.id,this.appUsersManager.getUserSearchText(e.id)),s.set(e.id,e.rating)}));const n=Array.from(a.search(t));return n.sort(((e,t)=>s.get(t)-s.get(e))),n};let n;return n=this.appChatsManager.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:(0,oe.Z)(a)},50,0).then((e=>e.participants.map((e=>(0,xe.Z)(e))))):e?Promise.resolve(this.getChatFull(e)).then((e=>e.participants.participants.map((e=>e.user_id.toPeerId())))):Promise.resolve([]),Promise.all([this.appUsersManager.getTopPeers("bots_inline").catch((()=>[])),n]).then((e=>{const t=e[0].concat(e[1].map((e=>({id:e,rating:0}))));return s(t)}))}invalidateChannelParticipants(e){this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e)),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){if(e.isUser()){const t=e.toUserId();delete this.usersFull[t],this.rootScope.dispatchEvent("user_full_update",t)}else{const t=e.toChatId();delete this.chatsFull[t],this.rootScope.dispatchEvent("chat_full_update",t)}}updateProfile(e,t,a){return this.apiManager.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:a}).then((e=>{if(this.appUsersManager.saveApiUser(e),void 0!==a){const t=e.id.toPeerId(),s=this.usersFull[e.id];s&&(s.about=a),this.rootScope.dispatchEvent("peer_bio_edit",t)}return this.getProfile(e.id,!0)}))}uploadProfilePhoto(e){return this.apiManager.invokeApi("photos.uploadProfilePhoto",{file:e}).then((e=>{const t=e.photo;if(!e.users.length){const a=t.sizes.find((e=>"photoStrippedSize"===e._));e.users.push(Object.assign(Object.assign({},this.appUsersManager.getSelf()),{photo:{_:"userProfilePhoto",dc_id:t.dc_id,photo_id:t.id,stripped_thumb:null==a?void 0:a.bytes,pFlags:{}}}))}this.appUsersManager.saveApiUsers(e.users);const a=this.appPeersManager.peerId;this.appPhotosManager.savePhoto(e.photo,{type:"profilePhoto",peerId:a});const s=a.toUserId();this.apiUpdatesManager.processLocalUpdate({_:"updateUser",user_id:s})}))}deletePhotos(e){return this.apiManager.invokeApiSingle("photos.deletePhotos",{id:e.map((e=>Ct(this.appPhotosManager.getPhoto(e))))}).then((e=>{}))}verifyParticipantForOnlineCount(e){const t=this.appUsersManager.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce(((e,t)=>e+ +this.verifyParticipantForOnlineCount(t)),0)}getOnlines(e){var t;return ga(this,void 0,void 0,(function*(){if(this.appChatsManager.isBroadcast(e))return 1;const a=yield this.getChatFull(e);if(this.appChatsManager.isMegagroup(e)){if(a.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const s=yield this.apiManager.invokeApiCacheable("messages.getOnlines",{peer:this.appChatsManager.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=s.onlines)&&void 0!==t?t:1}const s=a.participants;return(null==s?void 0:s.participants)?this.reduceParticipantsForOnlineCount(s.participants):1}))}getTypingsKey(e,t){return e+(t?`_${t}`:"")}getPeerTypings(e,t){return this.typingsInPeer[this.getTypingsKey(e,t)]}}function ya(e,t){return e.some((e=>e instanceof Promise))?Promise.all(e).then(t):t(e)}var _a=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const va=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],Pa={type:"reactions"};class ba extends G{after(){this.rootScope.addEventListener("language_change",(()=>{this.availableReactions=void 0,this.getAvailableReactions()})),this.sendReactionPromises=new Map,this.lastSendingTimes=new Map,this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{Promise.resolve(this.getAvailableReactions()).then((e=>_a(this,void 0,void 0,(function*(){for(const t of e)yield Promise.all([t.around_animation&&this.apiFileManager.downloadMedia({media:t.around_animation}),t.static_icon&&this.apiFileManager.downloadMedia({media:t.static_icon}),t.appear_animation&&this.apiFileManager.downloadMedia({media:t.appear_animation}),t.center_icon&&this.apiFileManager.downloadMedia({media:t.center_icon})]),yield(0,P.Z)(1e3)}))))}),7500)}))}getAvailableReactions(){return this.availableReactions?this.availableReactions:this.apiManager.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{(0,ue.Z)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of va)e[t]&&(e[t]=this.appDocsManager.saveDoc(e[t],Pa));return t},params:{hash:0}})}getActiveAvailableReactions(){return(0,q.Z)(this.getAvailableReactions(),(e=>e.filter((e=>!e.pFlags.inactive))))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();return e.isUser()?this.unshiftQuickReaction(t):ya([t,this.appProfileManager.getChatFull(e.toChatId()),this.getQuickReaction()],(([e,t,a])=>{var s;const n=null!==(s=t.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};let i=[];return"chatReactionsAll"===n._?i=e:"chatReactionsSome"===n._&&(i=n.reactions.map((t=>e.find((e=>e.reaction===t.emoticon)))).filter(Boolean)),this.unshiftQuickReactionInner(i,a)}))}unshiftQuickReactionInner(e,t){if(t&&"reactionEmoji"!==t._&&"availableReaction"!==t._)return e;const a=t.emoticon||t.reaction,s=(0,Pe.Z)(e,(e=>e.reaction===a));return s&&e.unshift(s),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return ya([e,t],(([e,t])=>this.unshiftQuickReactionInner(e,t)))}getAvailableReactionsByMessage(e){var t;if(!e)return[];const a=(null===(t=e.fwd_from)||void 0===t?void 0:t.channel_post)&&this.appPeersManager.isMegagroup(e.peerId)&&e.fwdFromId||e.peerId;return this.getAvailableReactionsForPeer(a)}isReactionActive(e){return!!this.availableReactions&&!!this.availableReactions.find((t=>t.reaction===e))}getQuickReaction(){return ya([this.apiManager.getConfig(),this.getAvailableReactions()],(([e,t])=>{const a=e.reactions_default;return"reactionEmoji"===(null==a?void 0:a._)?t.find((e=>e.reaction===a.emoticon)):a}))}getReactionCached(e){return this.availableReactions.find((t=>t.reaction===e))}getReaction(e){return(0,q.Z)(this.getAvailableReactions(),(()=>this.getReactionCached(e)))}getMessagesReactions(e,t){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map((e=>(0,oe.Z)(e))),peer:this.appPeersManager.getInputPeerById(e)},processResult:e=>{this.apiUpdatesManager.processUpdateMessage(e)}})}getMessageReactionsList(e,t,a,s,n){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessageReactionsList",params:{peer:this.appPeersManager.getInputPeerById(e),id:(0,oe.Z)(t),limit:a,reaction:s,offset:n},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),e)})}setDefaultReaction(e){return this.apiManager.invokeApi("messages.setDefaultReaction",{reaction:e}).then((t=>_a(this,void 0,void 0,(function*(){if(t){const t=yield this.apiManager.getConfig();t&&(t.reactions_default=e),this.rootScope.dispatchEvent("quick_reaction",e)}return t}))))}sendReaction(e,t,a){var s,n;return _a(this,void 0,void 0,(function*(){"availableReaction"===t._&&(t={_:"reactionEmoji",emoticon:t.reaction});const i=yield this.apiManager.getLimit("reactions"),r=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(r))return;this.lastSendingTimes.set(r,Date.now()),setTimeout((()=>{this.lastSendingTimes.delete(r)}),333);const{peerId:o,mid:p}=e,d=this.appPeersManager.peerId,f=e=>{--e.count,delete e.chosen_order,(0,zt.Z)(t,e.reaction)&&(t=void 0),e.count||(0,M.Z)(l.results,e),l.recent_reactions&&(0,Pe.Z)(l.recent_reactions,(t=>(0,zt.Z)(t.reaction,e.reaction)&&this.appPeersManager.getPeerId(t.peer_id)===d)),l.results.length||(l=void 0)},c=(null===(n=null===(s=e.reactions)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.can_see_list)||!this.appPeersManager.isBroadcast(e.peerId)||e.peerId.isUser();e.reactions||(e.reactions={_:"messageReactions",results:[],recent_reactions:c?[]:void 0,pFlags:{can_see_list:c||void 0}});let l=a?e.reactions:(0,ve.Z)(e.reactions);const m=l.results.filter((e=>void 0!==e.chosen_order));m.sort(((e,t)=>t.chosen_order-e.chosen_order));const g=[],h=m.findIndex((e=>(0,zt.Z)(e.reaction,t)));-1!==h&&g.push(...m.splice(h,1)),g.push(...m.splice(i-+(-1===h))),g.forEach((e=>{m.forEach((t=>{t.chosen_order>e.chosen_order&&--t.chosen_order})),f(e)}));const u=m.length;if(m.forEach(((e,t)=>{e.chosen_order=u-1-t})),t){l||(l={_:"messageReactions",results:[],pFlags:{}},c&&(l.pFlags.can_see_list=!0));let e=l.results.findIndex((e=>(0,zt.Z)(e.reaction,t))),a=-1!==e&&l.results[e];if(a||(a={_:"reactionCount",count:0,reaction:t},e=l.results.push(a)-1),++a.count,a.chosen_order=m.length?m[0].chosen_order+1:0,m.unshift(a),!l.recent_reactions&&c&&(l.recent_reactions=[]),l.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:this.appPeersManager.getOutputPeer(d)};this.appPeersManager.isMegagroup(o),l.recent_reactions.unshift(e),l.recent_reactions=l.recent_reactions.slice(0,3)}}const y=this.availableReactions;if(l&&(null==y?void 0:y.length)){const e=new Map;y.forEach(((t,a)=>{e.set(t.reaction,a)})),l.results.sort(((t,a)=>{var s,n;const i=t.reaction.document_id||t.reaction.emoticon,r=a.reaction.document_id||a.reaction.emoticon;return a.count-t.count||(null!==(s=e.get(i))&&void 0!==s?s:0)-(null!==(n=e.get(r))&&void 0!==n?n:0)}))}if(a)return e.reactions=l,this.rootScope.dispatchEvent("messages_reactions",[{message:e,changedResults:[]}]),Promise.resolve();this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:l,local:!0});const _=[o,p].join("-"),v=(0,oe.Z)(p),P=this.apiManager.invokeApi("messages.sendReaction",{peer:this.appPeersManager.getInputPeerById(o),msg_id:v,reaction:m.map((e=>e.reaction))}).then((e=>{(0,ue.Z)(e);const t=e.updates.findIndex((e=>"updateEditMessage"===e._||"updateEditChannelMessage"===e._));if(-1!==t){const a=e.updates[t];e.updates[t]={_:"updateMessageReactions",msg_id:v,peer:this.appPeersManager.getOutputPeer(o),reactions:a.message.reactions,pts:a.pts,pts_count:a.pts_count}}this.apiUpdatesManager.processUpdateMessage(e)})).catch((t=>{var a;"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(_)===P&&this.sendReaction(e,null===(a=m[0])||void 0===a?void 0:a.reaction,!0)})).finally((()=>{this.sendReactionPromises.get(_)===P&&this.sendReactionPromises.delete(_)}));return this.sendReactionPromises.set(_,P),P}))}}var Ma=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Ia={EMOJI:"inputStickerSetAnimatedEmoji",EMOJI_ANIMATIONS:"inputStickerSetAnimatedEmojiAnimations",PREMIUM_GIFTS:"inputStickerSetPremiumGifts",GENERIC_ANIMATIONS:"inputStickerSetEmojiGenericAnimations",DEFAULT_STATUSES:"inputStickerSetEmojiDefaultStatuses",DEFAULT_TOPIC_ICONS:"inputStickerSetEmojiDefaultTopicIcons"},Sa=new Set(Object.values(Ia));class Ca extends G{constructor(){super(...arguments),this.storage=new W.Z(H.Z,"stickerSets"),this.processAllStickersResult=e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e)}after(){this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.names={},this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{this.getAnimatedEmojiStickerSet()}),1e3),this.getGreetingStickersPromise||void 0!==this.getGreetingStickersTimeout||(this.getGreetingStickersTimeout=E.Z.setTimeout((()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)}),5e3))})),this.rootScope.addEventListener("app_config",(()=>this.onStickersUpdated("faved",!0))),this.apiUpdatesManager.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),this.rootScope.dispatchEvent("stickers_installed",t.set)},updateRecentStickers:()=>this.onStickersUpdated("recent",!0),updateFavedStickers:()=>this.onStickersUpdated("faved",!0),updateMoveStickerSetToTop:e=>{this.rootScope.dispatchEvent("stickers_top",e.stickerset)}})}onStickersUpdated(e,t){return Ma(this,void 0,void 0,(function*(){const a=yield"faved"===e?this.getFavedStickersStickers(t):this.getRecentStickersStickers(t);this.rootScope.dispatchEvent("stickers_updated",{type:e,stickers:a})}))}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then((e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort(((e,t)=>Math.random()-Math.random()))}))),this.getGreetingStickersPromise.then((()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),this.apiFileManager.downloadMedia({media:this.greetingStickers[0]}),t}))}saveStickers(e){(0,ne.Z)(e,((t,a)=>{(t=this.appDocsManager.saveDoc(t))?e[a]=t:e.splice(a,1)}))}canUseStickerSetCache(e,t){var a;return e&&(null===(a=e.documents)||void 0===a?void 0:a.length)&&(Date.now()-e.refreshTime<36e5||t)}getStickerSet(e,t={}){let{id:a}=e;if(e.access_hash||(e=this.names[a]||e,a=e.id),this.getStickerSetPromises[a])return this.getStickerSetPromises[a];if(!t.overwrite){const e=this.storage.getFromCache(a);if(this.canUseStickerSetCache(e,t.useCache))return e}const s=this.getStickerSetPromises[a]=new Promise((n=>Ma(this,void 0,void 0,(function*(){if(!t.overwrite){const e=yield this.storage.get(a);if(this.canUseStickerSetCache(e,t.useCache))return this.saveStickers(e.documents),n(e),void(this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a])}try{const s=yield this.apiManager.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),i=t.saveById?a:s.set.id;this.saveStickerSet(s,i),n(s)}catch(e){n(null)}this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a]}))));return s}getLocalStickerSet(e){return this.getStickerSet({id:e},{saveById:!0})}getAnimatedEmojiStickerSet(){return Promise.all([this.getLocalStickerSet(Ia.EMOJI),this.getLocalStickerSet(Ia.EMOJI_ANIMATIONS),this.getAnimatedEmojiSounds()]).then((([e,t])=>({emoji:e,animations:t})))}getAnimatedEmojiSounds(e){if(this.getAnimatedEmojiSoundsPromise&&!e)return this.getAnimatedEmojiSoundsPromise;const t=this.getAnimatedEmojiSoundsPromise=Promise.all([this.apiManager.getAppConfig(e),this.apiManager.getConfig()]).then((([e,a])=>{if(this.getAnimatedEmojiSoundsPromise===t)for(const t in e.emojies_sounds){const s=e.emojies_sounds[t],n=atob(s.file_reference_base64.replace(/-/g,"+").replace(/_/g,"/")),i=new Uint8Array(n.length);for(let e=0,t=i.length;e((0,ue.Z)(e),this.recentStickers=e.stickers,this.saveStickers(e.stickers),e),overwrite:e})}))}getRecentStickersStickers(e){if(e)this.recentStickers=void 0;else if(this.recentStickers)return this.recentStickers;return this.getRecentStickers(e).then((()=>this.recentStickers))}saveRecentSticker(e,t,a){const s=this.appDocsManager.getDoc(e);if((0,Pe.Z)(this.recentStickers,(t=>t.id===e)),!t){this.recentStickers.unshift(s);const e=(0,Pt.Z)(s.stickerEmojiRaw);for(const t in this.getStickersByEmoticonsPromises)this.getStickersByEmoticonsPromises[t].then((a=>{const n=(0,Pe.Z)(a,(e=>e.id===s.id));n?a.unshift(n):t.includes(e)&&a.unshift(s)}))}return this.rootScope.dispatchEvent("sticker_updated",{type:"recent",faved:!t,document:s}),t&&this.onStickersUpdated("recent",!1),this.apiManager.invokeApi("messages.saveRecentSticker",{id:Kt(s),unsave:t,attached:a})}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const a=t?Ia.EMOJI_ANIMATIONS:Ia.EMOJI,s=this.storage.getFromCache(a);if(!(null==s?void 0:s.documents))return;t&&["🧡","💛","💚","💙","💜","🖤","🤍","🤎"].includes(e)&&(e="❤️"),e=this.cleanEmoji(e);const n=s.packs.find((t=>t.emoticon===e));return n?this.appDocsManager.getDoc(n.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e){const t=this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e)));return Promise.all([t,this.preloadAnimatedEmojiStickerAnimation(e)]).then((([e,t])=>({doc:e,animation:null==t?void 0:t.doc,sound:null==t?void 0:t.sound})))}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e,!0))).then((t=>{if(!t)return;const a=this.getAnimatedEmojiSoundDocument(e);return Promise.all([this.preloadSticker(t.id),a?this.preloadSticker(a.id):void 0]).then((()=>({doc:t,sound:a})))}))}preloadSticker(e,t){var a;const s=this.appDocsManager.getDoc(e);return this.apiFileManager.downloadMedia({media:s,thumb:t?null===(a=s.video_thumbs)||void 0===a?void 0:a[0]:void 0})}saveStickerSet(e,t){const a={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents,keywords:e.keywords};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),s.set.short_name&&(this.names[s.set.short_name]=this.getStickerSetInput(a.set)),this.saveStickers(e.documents);const n=s.set.installed_date||Sa.has(t);s.refreshTime=Date.now(),this.storage.set({[t]:s},!n)}getStickerSetThumbDownloadOptions(e){var t;const a=e.thumbs.find((e=>"photoSize"===e._)),s=e.thumb_dc_id,n=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:s,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:a.size,mimeType:n?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return Sa.has(e.id)?{_:e.id}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return Ma(this,void 0,void 0,(function*(){return(yield this.apiManager.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)})).sets}))}getPromoPremiumStickers(){return this.getStickersByEmoticon("⭐️⭐️",!1)}getPremiumStickers(){return this.getStickersByEmoticon("📂⭐️",!1)}getFavedStickers(e){return this.apiManager.invokeApiHashable({method:"messages.getFavedStickers",processResult:e=>((0,ue.Z)(e),this.saveStickers(e.stickers),this.favedStickers=e.stickers,e),overwrite:e})}getFavedStickersStickers(e){if(e)this.favedStickers=void 0;else if(this.favedStickers)return this.favedStickers;return this.getFavedStickers(e).then((()=>this.favedStickers))}getFavedStickersLimit(){return this.apiManager.getLimit("favedStickers")}faveSticker(e,t){return Ma(this,void 0,void 0,(function*(){this.favedStickers||(yield this.getFavedStickersStickers());const a=yield this.getFavedStickersLimit(),s=this.appDocsManager.getDoc(e);return(0,Pe.Z)(this.favedStickers,(e=>e.id===s.id)),t||(this.favedStickers.unshift(s),this.favedStickers.splice(a,this.favedStickers.length-a)),this.rootScope.dispatchEvent("sticker_updated",{type:"faved",faved:!t,document:s}),this.apiManager.invokeApi("messages.faveSticker",{id:Kt(s),unfave:t}).then((()=>{t&&this.onStickersUpdated("faved",!0)}))}))}toggleStickerSet(e){return Ma(this,void 0,void 0,(function*(){if((e=this.storage.getFromCache(e.id).set).installed_date){if(yield this.apiManager.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,this.rootScope.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else if(yield this.apiManager.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,this.rootScope.dispatchEvent("stickers_installed",e),!0;return!1}))}toggleStickerSets(e){return Promise.all(e.map((e=>this.toggleStickerSet(e))))}searchStickerSets(e,t=!0){return Ma(this,void 0,void 0,(function*(){const a=t?1:0,s=yield this.apiManager.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:a,exclude_featured:t||void 0,q:e},processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)}),n=[],r=this.storage.getCache();for(const t in r){const{set:a}=r[t];a.title.toLowerCase().includes(e.toLowerCase())&&!s.sets.find((e=>e.set.id===a.id))&&n.push({_:"stickerSetCovered",set:a,cover:null})}return s.sets.concat(n)}))}getAllStickers(){return this.apiManager.invokeApiHashable({method:"messages.getAllStickers",processResult:this.processAllStickersResult})}getEmojiStickers(){return this.apiManager.invokeApiHashable({method:"messages.getEmojiStickers",processResult:this.processAllStickersResult})}preloadStickerSets(){return this.getAllStickers().then((e=>Promise.all(e.sets.map((e=>this.getStickerSet(e,{useCache:!0}))))))}getStickersByEmoticon(e,t=!0){return e=(0,Pt.Z)(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([this.apiManager.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e},processResult:e=>e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then((([t,a,s])=>{const n=t.stickers.map((e=>this.appDocsManager.saveDoc(e))),r=[],o=[],p=t=>{for(const a of t)if((0,Pt.Z)(a.emoticon).includes(e))for(const e of a.documents){const t=this.appDocsManager.getDoc(e);(t.animated?r:o).push(t)}};if(s){p(s.packs);const e=s.stickers;[r,o].forEach((t=>{t.sort(((t,a)=>e.indexOf(t)-e.indexOf(a)))}))}for(const e of a)p(e.packs);const d=[...new Set(r.concat(o,n))];return(0,ne.Z)(d,((e,t,a)=>{(3===e.sticker&&!i().IS_WEBM_SUPPORTED||!this.rootScope.premium&&(0,Wt.Z)(e))&&a.splice(t,1)})),d}))}clearRecentStickers(){return this.recentStickers&&(this.recentStickers.length=0,this.onStickersUpdated("recent",!1)),this.apiManager.invokeApi("messages.clearRecentStickers")}}var wa=a(467),ka=a(8493);class Aa extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.users={},this.usernames={};else for(const e in this.users){if(!e)continue;const t=e.toPeerId();if(!this.peersStorage.isPeerNeeded(t)){const t=this.users[e];this.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.users[e]}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1},this.updateUsersStatuses=()=>{const e=(0,te.Z)(!0);for(const t in this.users){const a=this.users[t];this.updateUserStatus(a,e)}}}after(){return this.clear(!0),setInterval(this.updateUsersStatuses,6e4),this.rootScope.addEventListener("state_synchronized",this.updateUsersStatuses),this.apiUpdatesManager.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,a=this.users[t];a&&(a.status=e.status,a.status&&("expires"in a.status&&(a.status.expires-=this.timeManager.getServerTimeOffset()),"was_online"in a.status&&(a.status.was_online-=this.timeManager.getServerTimeOffset())),this.rootScope.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(a))},updateUserName:e=>{const t=e.user_id,a=this.users[t];a&&(this.forceUserOnline(t),this.saveApiUser(Object.assign(Object.assign({},a),{first_name:e.first_name,last_name:e.last_name,username:void 0,usernames:e.usernames}),!0))}}),this.rootScope.addEventListener("language_change",(e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))})),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("users")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiUsers(t);for(let a=0,s=t.length;a{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)}))}))}get userId(){return this.rootScope.myId.toUserId()}onContactsModified(e){e&&this.appStateManager.pushToState("contactsListCachedTime",(0,te.Z)(!0))}pushRecentSearch(e){return this.appStateManager.getState().then((t=>{const a=t.recentSearch||[];if(a[0]!==e){(0,M.Z)(a,e),a.unshift(e),a.length>20&&(a.length=20),this.appStateManager.pushToState("recentSearch",a);for(const e of a)this.peersStorage.requestPeer(e,"recentSearch")}}))}clearRecentSearch(){return this.appStateManager.getState().then((e=>{const t=e.recentSearch||[];for(const e of t)this.peersStorage.releasePeer(e,"recentSearch");t.length=0,this.appStateManager.pushToState("recentSearch",t)}))}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=(0,v.Z)();return this.apiManager.invokeApi("contacts.getContacts").then((e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach((e=>{this.pushContact(e.user_id)})),this.onContactsModified(!0),this.contactsFillPromise=t),t.resolve(this.contactsList)}),(()=>{this.updatedContactsList=!1})),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase();const t=this.usernames[e];return t?this.appPeersManager.getPeer(t):this.apiManager.invokeApiSingleProcess({method:"contacts.resolveUsername",params:{username:e},processResult:e=>this.processResolvedPeer(e)})}processResolvedPeer(e){return this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appPeersManager.getPeer((0,le.Z)(e.peer))}resolvePhone(e){return this.apiManager.invokeApi("contacts.resolvePhone",{phone:e}).then((e=>this.processResolvedPeer(e)))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),this.peersStorage.requestPeer(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),this.peersStorage.releasePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];return t?[t.first_name,t.last_name,t.phone,...(0,Jt.Z)(t),t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" "):""}getContacts(e,t=!1,a="name"){return this.fillContacts().promise.then((s=>{let n=[...s];if(e){const t=this.contactsIndex.search(e);n=[...n].filter((e=>t.has(e)))}"name"===a?n.sort(((e,t)=>{const a=(this.users[e]||{}).sortName||"",s=(this.users[t]||{}).sortName||"";return a.localeCompare(s)})):"online"===a&&n.sort(((e,t)=>{const a=this.getUserStatusForSort(this.getUser(e).status);return this.getUserStatusForSort(this.getUser(t).status)-a}));const i=this.userId;return(0,M.Z)(n,i),t&&this.testSelfSearch(e)&&n.unshift(i),n}))}getContactsPeerIds(e,t,a,s){return this.getContacts(e,t,a).then((e=>{const t=e.map((e=>e.toPeerId(!1)));return s?t.slice(0,s):t}))}toggleBlock(e,t){return this.apiManager.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:this.appPeersManager.getInputPeerById(e)}).then((a=>(a&&this.apiUpdatesManager.processLocalUpdate({_:"updatePeerBlocked",peer_id:this.appPeersManager.getOutputPeer(e),blocked:t}),a)))}testSelfSearch(e){const t=this.getSelf(),a=this.createSearchIndex();return a.indexObject(t.id,this.getUserSearchText(t.id)),a.search(e).has(t.id)}createSearchIndex(){return new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiUser(e,t))))}modifyUsernamesCache(e,t){const a=(0,Jt.Z)(e);if(!a.length)return;const s=a.map((e=>function(e){return e&&e.toLowerCase()||""}(e)));t?s.forEach((t=>{this.usernames[t]=e.id.toPeerId("user"!==e._)})):s.forEach((e=>{delete this.usernames[e]}))}setUsernameToCache(e,t){return!(t&&t.username===e.username&&(0,Y.Z)(t.usernames,e.usernames)||(this.modifyUsernamesCache(t,!1),this.modifyUsernamesCache(e,!0),0))}saveApiUser(e,t){var a,s,n,i;if(!e||"userEmpty"===e._)return;const r=e.id,o=this.users[r];if(null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={}),e.pFlags.min&&void 0!==o)return;const p=this.setUsernameToCache(e,o);if(o&&void 0!==o.sortName&&o.first_name===e.first_name&&o.last_name===e.last_name)e.sortName=o.sortName;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":(0,wa.ZP)(t,!1)}if(e.status&&(e.status.expires&&(e.status.expires-=this.timeManager.getServerTimeOffset()),e.status.was_online&&(e.status.was_online-=this.timeManager.getServerTimeOffset())),"userProfilePhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo,void 0===o)this.users[r]=e;else{const t=e.first_name!==o.first_name||e.last_name!==o.last_name||p,a=(null===(n=o.photo)||void 0===n?void 0:n.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id),s=o.pFlags.premium!==e.pFlags.premium||o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake,d=!!o.pFlags.contact,f=!!e.pFlags.contact;re(o,e),this.rootScope.dispatchEvent("user_update",r),d!==f&&this.onContactUpdated(r,f,d),a&&this.rootScope.dispatchEvent("avatar_update",{peerId:e.id.toPeerId()}),(t||s)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:e.id.toPeerId()})}this.checkPremium(e,o),this.setUserToStateIfNeeded(e)}checkPremium(e,t){if(e.pFlags.self){const a=!!e.pFlags.premium;this.rootScope.premium!==a&&this.rootScope.dispatchEvent("premium_toggle_private",{isNew:!t,isPremium:a})}}setUserToStateIfNeeded(e){this.peersStorage.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e){const t=this.getUser(e);e=null==t?void 0:t.status}if(e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return(0,fe.Z)(e)?e:this.users[e]}getUserStatus(e){return this.isRegularUser(e)&&!this.users[e].pFlags.self&&this.users[e].status}getUserPhone(e){return t=this,a=void 0,n=function*(){const t=this.getUser(e);if(!(null==t?void 0:t.phone))return;const a=yield this.apiManager.getAppConfig();return{phone:t.phone,isAnonymous:a.fragment_prefixes.some((e=>t.phone.startsWith(e)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}getSelf(){return this.getUser(this.userId)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isAttachMenuBot(e){return this.isBot(e)&&!!this.users[e].pFlags.bot_attach_menu}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e!==this.userId}hasUser(e,t){const a=this.users[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}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){return{_:"inputPeerUser",user_id:e,access_hash:this.getUser(e).access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=(0,te.Z)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(this.apiUpdatesManager.updatesState.syncLoading)return;const s=this.getUser(e);!(null==s?void 0:s.status)||"userStatusOnline"===s.status._||"userStatusEmpty"===s.status._||s.pFlags.support||s.pFlags.deleted||(s.status={_:"userStatusOnline",expires:a+60},this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s))}importContact(e,t,a){return this.importContacts([{first_name:e,last_name:t,phones:[a]}]).then((e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]}))}importContacts(e){const t=[];for(let a=0;a(this.saveApiUsers(e.users),e.imported.map((e=>(this.onContactUpdated(e.user_id,!0),e.user_id))))))}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=this.appStateManager.getState().then((t=>{const a=t.topPeersCache[e];return a&&a.cachedTime+864e5>Date.now()&&a.peers?a.peers:this.apiManager.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then((a=>{let s=[];return"contacts.topPeers"===a._&&(this.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.categories.length&&(s=a.categories[0].peers.map((e=>{const t=(0,le.Z)(e.peer);return this.peersStorage.requestPeer(t,"topPeer"),{id:t,rating:e.rating}})))),t.topPeersCache[e]={peers:s,cachedTime:Date.now()},this.appStateManager.pushToState("topPeersCache",t.topPeersCache),s}))}))}getBlocked(e=0,t=0){return this.apiManager.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map((e=>e.id.toPeerId())).concat(e.chats.map((e=>e.id.toPeerId(!0))))})))}getLocated(e,t,a,s=!1,n=0){const i={_:"inputGeoPoint",lat:e,long:t,accuracy_radius:a};return this.apiManager.invokeApi("contacts.getLocated",{geo_point:i,background:s}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e)))}searchContacts(e,t=20){const a=(0,Ot.Z)(e);if(a.length&&a[0].length===e.trim().length&&"messageEntityUrl"===a[0]._)try{const t=new URL(je(e).url).pathname.slice(1);t&&(e=t)}catch(e){}return this.apiManager.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{my_results:(0,we.Z)(e.my_results.map((e=>(0,le.Z)(e)))),results:e.results.map((e=>(0,le.Z)(e)))})))}onContactUpdated(e,t,a=this.isContact(e)){t!==a&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),this.rootScope.dispatchEvent("contacts_update",e))}updateUsername(e){return this.apiManager.invokeApi("account.updateUsername",{username:e}).then((e=>{this.saveApiUser(e)}))}setUserStatus(e,t){if(this.isBot(e))return;const a=this.users[e];if(a){const s=t?{_:"userStatusOffline",was_online:(0,te.Z)(!0)}:{_:"userStatusOnline",expires:(0,te.Z)(!0)+50};a.status=s,this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(a)}}updateMyOnlineStatus(e){return this.setUserStatus(this.getSelf().id,e),this.apiManager.invokeApiSingle("account.updateStatus",{offline:e})}addContact(e,t,a,s,n){return this.apiManager.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:a,phone:s,add_phone_privacy_exception:n}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)}))}deleteContacts(e){return this.apiManager.invokeApi("contacts.deleteContacts",{id:e.map((e=>this.getUserInput(e)))}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),e.forEach((e=>{this.onContactUpdated(e,!1)}))}))}checkUsername(e){return this.apiManager.invokeApi("account.checkUsername",{username:e})}toggleUsername(e,t){return this.apiManager.invokeApi("account.toggleUsername",{username:e,active:t})}reorderUsernames(e){return this.apiManager.invokeApi("account.reorderUsernames",{order:e})}canSendToUser(e){return(0,ka.Z)(this.getUser(e))}}const Da=new Set(["photo","video","gif","document"]);class Ua extends G{constructor(){super(...arguments),this.webpages={},this.pendingWebPages={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,a){var s,n;if("webPageNotModified"===e._||"webPageEmpty"===e._)return;const{id:i}=e,r=this.webpages[i],o=r&&r._===e._&&r.hash==r.hash;if("webPage"===e._){"photo"===(null===(s=e.photo)||void 0===s?void 0:s._)?e.photo=this.appPhotosManager.savePhoto(e.photo,a):delete e.photo,"document"===(null===(n=e.document)||void 0===n?void 0:n._)?e.document=this.appDocsManager.saveDoc(e.document,a):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name,i=e.title||e.author||t||"";t&&i===t&&delete e.site_name,Da.has(e.type)||e.description||!e.photo||(e.type="photo")}let p=this.pendingWebPages[i];if(t&&(p||(p=this.pendingWebPages[i]=new Set),p.add(t)),void 0===r?this.webpages[i]=e:re(r,e),!t&&void 0!==p&&o){const e=[];p.forEach((t=>{const[a,s,n]=t.split("_");e.push({peerId:a.toPeerId(),mid:+s,isScheduled:!!n})})),this.rootScope.dispatchEvent("webpage_updated",{id:i,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,a){return e+"_"+t+(a?"_s":"")}deleteWebPageFromPending(e,t){const a=e.id;if(!a)return;const s=this.pendingWebPages[a];s&&s.has(t)&&(s.delete(t),s.size||delete this.pendingWebPages[a])}getCachedWebPage(e){return this.webpages[e]}getWebPage(e){return this.apiManager.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.saveWebPage(e),params:{url:e}})}}var Ta=a(5936),Ea=a(3019);function Fa(e){return(0,Ea.Z)(e,"readAsArrayBuffer")}var Ra=a(1243),xa=a(7086);function Ba(e){return encodeURIComponent(e).replace(/['()]/g,escape).replace(/\*/g,"%2A")}class Va{constructor(e,t){this.serviceMessagePort=e,this.downloadId=t,this.serviceMessagePort=Gs()}write(e,t){return a=this,s=void 0,i=function*(){return this.serviceMessagePort.invoke("downloadChunk",{id:this.downloadId,chunk:e})},new((n=void 0)||(n=Promise))((function(e,t){function r(e){try{p(i.next(e))}catch(e){t(e)}}function o(e){try{p(i.throw(e))}catch(e){t(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(a,s||[])).next())}));var a,s,n,i}finalize(e){return this.serviceMessagePort.invoke("downloadFinalize",this.downloadId).then((()=>{}))}}class La{getFile(e){return Promise.reject((0,X.Z)("NO_ENTRY_FOUND"))}prepareWriting({fileName:e,downloadId:t,size:a}){const s=Object.assign({"Content-Type":"application/octet-stream; charset=utf-8","Content-Disposition":"attachment; filename*=UTF-8''"+Ba(e)},a?{"Content-Length":a}:{}),n=Gs(),i=n.invoke("download",{headers:s,id:t}),r=(0,v.Z)();return r.cancel=()=>{r.reject((0,X.Z)("DOWNLOAD_CANCELED"))},r.catch((()=>{Gs().invoke("downloadCancel",t)})),i.then(r.resolve,r.reject),{deferred:r,getWriter:()=>new Va(n,t)}}}var Oa=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Na=131072,Za=new Set(["DOWNLOAD_CANCELED","UPLOAD_CANCELED","UNKNOWN","NO_NEW_CONTEXT"]);class ja extends G{constructor(){super(...arguments),this.cacheStorage=new Ta.Z("cachedFiles"),this.downloadStorage=new La,this.downloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.refreshReferencePromises={},this.log=(0,I.kg)("AFM",I.v9.Error|I.v9.Log),this.tempId=0,this.queueId=0,this.debug=b.Z.debug,this.maxUploadParts=4e3,this.maxDownloadParts=8e3,this.uncompressTGS=(e,t)=>this.cryptoWorker.invokeCrypto("gzipUncompress",e.slice().buffer,!1),this.uncompressTGV=(e,t)=>{const a=e.slice().buffer;return i().IS_FIREFOX?this.cryptoWorker.invokeCrypto("gzipUncompress",a,!0).then((e=>function(e){const t=e.indexOf("/,` width="${n}" height="${i}">`).replace(/[^\x00-\x7F]/g,"")}(e))).then((e=>(new TextEncoder).encode(e))):this.cryptoWorker.invokeCrypto("gzipUncompress",a,!1)},this.convertWebp=(e,t)=>f.Z.getInstance().invoke("convertWebp",{fileName:t,bytes:e}),this.convertOpus=(e,t)=>f.Z.getInstance().invoke("convertOpus",{fileName:t,bytes:e})}after(){setInterval((()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}}),18e5),this.rootScope.addEventListener("config",(e=>{this.webFileDcId=e.webfile_dc_id})),this.rootScope.addEventListener("app_config",(e=>{this.maxUploadParts=this.rootScope.premium?e.upload_max_fileparts_premium:e.upload_max_fileparts_default,this.maxDownloadParts=e.upload_max_fileparts_premium}))}downloadRequest(e,t,a,s,n=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise(((e,r)=>{i.push({id:t,queueId:n,cb:a,deferred:{resolve:e,reject:r},activeDelta:s})}));return setTimeout((()=>{this.downloadCheck(e)}),0),r}downloadCheck(e){const t=this.downloadPulls[e],a=this.rootScope.premium?224:36;if(this.downloadActives[e]>=a||!(null==t?void 0:t.length))return!1;const s=(0,Pe.Z)(t,(e=>0===e.queueId))||(0,Pe.Z)(t,(e=>e.queueId===this.queueId))||t.shift(),n=s.activeDelta||1;this.downloadActives[e]+=n;const i=s.cb();i.then((()=>{this.downloadActives[e]-=n,this.downloadCheck(e)}),(t=>{(null==t?void 0:t.type)&&Za.has(t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=n,this.downloadCheck(e)})).finally((()=>{i.then(s.deferred.resolve,s.deferred.reject)}))}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=[this.downloadPromises[e],this.uploadPromises[e]].filter(Boolean);let a=!1;for(let e=0,s=t.length;eOa(this,void 0,void 0,(function*(){return null==r||r(),this.apiManager.invokeApi("upload.getWebFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0})}))),this.getDelta(s),i)}requestFilePart(e,t,a,s,n=0,i=0,r){return this.downloadRequest(e,n,(()=>Oa(this,void 0,void 0,(function*(){null==r||r();const n=()=>Oa(this,void 0,void 0,(function*(){var i;null==r||r();const o=null===(i=t.file_reference)||void 0===i?void 0:i.slice();return this.apiManager.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch((e=>{if(null==r||r(),"FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t,o).then(n);throw e}))}));(0,ue.Z)(t);const i=t.file_reference;if(i&&!t.checkedReference){t.checkedReference=!0;const e=T(i);if(this.refreshReferencePromises[e])return this.refreshReference(t,i).then(n)}return n()}))),this.getDelta(s),i)}getDelta(e){return e/Na}getLimitPart(e,t){if(!e)return 524288;let a=Na;const s=t?this.maxUploadParts:this.maxDownloadParts,n=t?524288:1048576;for(;e/a>s&&a{a===T(t)&&e.reject((0,X.Z)("REFERENCE_IS_NOT_REFRESHED")),e.resolve(t)}),e.reject)}return s.deferred.then((t=>{e.file_reference=t}))}isDownloading(e){return!!this.downloadPromises[e]}getDownload(e){return this.downloadPromises[e]}getUpload(e){return this.uploadPromises[e]}getConvertMethod(e){let t;return"application/x-tgwallpattern"===e?(t=this.uncompressTGV,e="image/svg+xml"):"image/webp"!==e||i().IS_WEBP_SUPPORTED?"application/x-tgsticker"===e?(t=this.uncompressTGS,e="application/json"):"audio/ogg"!==e||i().IS_OPUS_SUPPORTED||(t=this.convertOpus,e="audio/wav"):(t=this.convertWebp,e="image/png"),{mimeType:e,process:t}}allocateDeferredPromises(e,t,a){const s=[];let n,i=e,r=Promise.resolve();do{n=(0,v.Z)(),s.push({offset:i,writePromise:r,writeDeferred:n}),r=n,i+=a}while(i{if(!(null==e?void 0:e.error))for(const a of M)e&&e!==a||(a.error=t,a.deferred.reject(t))},y=this.tempId++,_=e.limitPart||this.getLimitPart(s,!1);let v,P,b=m.getFile.bind(m);const M=[],I=s||_,S=(e,t)=>{const{deferred:a}=e,s=u.bind(null,e);a.cancel=()=>a.reject((0,X.Z)("DOWNLOAD_CANCELED")),a.catch((t=>{var a,n;s(t),null===(n=null===(a=e.writer)||void 0===a?void 0:a.truncate)||void 0===n||n.call(a)})).finally((()=>{this.downloadPromises[t]===a&&delete this.downloadPromises[t],delete e.writer})),this.downloadPromises[t]=a,M.push(e)};if(m&&(!g||I<=o.Iw)&&(v=m.prepareWriting(l,I,e.mimeType),S(v,l)),g){let t=e.fileName;if(!t){t=l;const a=gt[e.mimeType];a&&(t+="."+a)}P=g.prepareWriting({fileName:t,downloadId:r,size:I}),S(P,c),v&&P.deferred.catch((e=>v.deferred.reject(e)))}h=null!==(a=null==P?void 0:P.deferred)&&void 0!==a?a:v.deferred,g&&f&&(b=g.getFile.bind(g)),b(l).then((e=>Oa(this,void 0,void 0,(function*(){if(C(),P){const t=P.writer=P.getWriter();C();const a=yield function(e){return Fa(e).then((e=>new Uint8Array(e)))}(e);C(),yield t.write(a),C(),P.deferred.resolve(yield t.finalize())}v&&v.deferred.resolve(e)})))).catch((t=>Oa(this,void 0,void 0,(function*(){if(e.onlyCache)return void u(null,t);M.forEach((e=>{e.writer=e.getWriter()}));const a="inputWebFileLocation"===i._,r=(a?this.requestWebFilePart:this.requestFilePart).bind(this);a&&void 0===this.webFileDcId&&(yield this.apiManager.getConfig(),C());const p=this.allocateDeferredPromises(0,s,_),d={done:0,offset:0,total:s,fileName:c},m=()=>{try{C(),d.done=h,this.rootScope.dispatchEvent("download_progress",d)}catch(e){}},g=(0,aa.Z)(m,50,!0);let h=0;const v=()=>Oa(this,void 0,void 0,(function*(){const{offset:t,writePromise:a,writeDeferred:d}=p.shift();try{C();performance.now();const u=yield r(n,i,t,_,y,e.queueId,C),P=(performance.now(),u.bytes);p.length&&v();const b=P.byteLength;this.debug&&this.log("downloadFile requestFilePart result:",c,u);const I=t+_>=s||!b;if(b){h+=b,I?m():g();performance.now();yield a,C(),performance.now(),performance.now(),yield Promise.all(M.map((({writer:e})=>null==e?void 0:e.write(P,t)))),C()}if(I&&(!s||h{var t;return null===(t=null==e?void 0:e.trim)||void 0===t?void 0:t.call(e,h)})),I&&f){const e=M.filter((({writer:e})=>(null==e?void 0:e.getParts)&&e.replaceParts)).map((({writer:e})=>Oa(this,void 0,void 0,(function*(){const t=e.getParts(),a=yield f(t,l);e.replaceParts(a)}))));yield Promise.all(e),C()}if(d.resolve(),I){const e=h<=o.Iw;M.forEach((t=>{const{deferred:a,writer:s}=t;if(a.isFulfilled||a.isRejected||!s)return;const n=s.finalize(e);a.resolve(n)}))}}catch(e){u(null,e)}}));for(let e=0,t=Math.min(1/0,p.length);e{if(M.reduce(((e,t)=>e+ +!!t.error),0)===M.length)throw M[0].error};return h}downloadMedia(e){let{media:t,thumb:a}=e;const s="photo"===t._;if(s&&!a)return Promise.reject("preloadPhoto photoEmpty!");const n="document"===t._;n?t=this.appDocsManager.getDoc(t.id):s&&(t=this.appPhotosManager.getPhoto(t.id));const{fileName:i,downloadOptions:r}=(0,Ra.Z)(e);let o=this.getDownload(i);return o||(o=this.download(r),n&&!a&&(this.rootScope.dispatchEvent("document_downloading",t.id),o.catch(jt.Z).finally((()=>{this.rootScope.dispatchEvent("document_downloaded",t.id)})))),o}downloadMediaURL(e){const{media:t,thumb:a}=e;let s=this.thumbsStorage.getCacheContext(t,null==a?void 0:a.type);return(!a||s.downloaded>=("size"in a?a.size:0))&&s.url?Promise.resolve(s.url):this.downloadMedia(e).then((e=>{if(!s.downloaded||s.downloaded=10485760,n=this.getLimitPart(a,!0),i=this.getDelta(n),r=Math.ceil(a/n),o=(0,Te.a)(),p={_:s?"inputFileBig":"inputFile",id:o,parts:r,name:t,md5_checksum:""},d=(0,v.Z)();if(r>this.maxUploadParts)return d.reject((0,X.Z)("FILE_TOO_BIG")),d;let f=!1,c=!1,l=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),d.reject(e),f=!0,l=jt.Z};const m=s?"upload.saveBigFilePart":"upload.saveFilePart",g=this.tempId++,h=this,u=function*(){let u=0,y=0;for(let v=0;vOa(this,void 0,void 0,(function*(){_();const i=e.slice(v,v+n),g=yield Fa(i);return _(),h.debug&&h.log("Upload file part, isBig:",s,P,g.byteLength,new Uint8Array(g).length,new Uint8Array(g).slice().length),h.apiManager.invokeApi(m,{file_id:o,file_part:P,file_total_parts:r,bytes:g},{fileUpload:!0}).then((()=>{if(f)return;++y;const e={done:y*n,offset:v,total:a,fileName:t};d.notify(e),y>=r&&(d.resolve(p),c=!0)}),l)}))),i).catch(l)}}(),y=()=>{if(f)return;const e=u.next();e.done||f||e.value.then(y)};for(let e=0,t=Math.min(1/0,r);e{if(f)throw(0,X.Z)("UPLOAD_CANCELED")};return d.cancel=()=>{f||c||(f=!0,l((0,X.Z)("UPLOAD_CANCELED")))},d.notify=e=>{this.rootScope.dispatchEvent("download_progress",e)},d.finally((()=>{this.uploadPromises[t]===d&&delete this.uploadPromises[t]})),this.uploadPromises[t]=d}}var qa=a(7487),Ga=a(6666),Ha=a(3306);class Wa extends G{constructor(){super(),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.afterMessageIdTemp=0}setUser(e){return this.setUserAuth(e.id)}invokeApiAfter(e,t={},a={}){let s=a;return s.prepareTempMessageId=""+ ++this.afterMessageIdTemp,s=Object.assign({},a),a.messageId=s.prepareTempMessageId,this.invokeApi(e,t,s)}invokeApiHashable(e){var t,a;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{params:s,options:n,method:i,overwrite:r}=e,o=JSON.stringify(s);let p;return this.hashes[i]&&(p=this.hashes[i][o],p&&(r?(delete this.hashes[i][o],p=void 0):s.hash=p.hash)),this.invokeApiSingleProcess({method:i,processResult:t=>{if(t._.includes("NotModified"))return p.result;if(t.hash){const e=t.hash;this.hashes[i]||(this.hashes[i]={}),p=this.hashes[i][o]={hash:e,result:t}}if(e.processResult){const a=e.processResult(t);return p?p.result=a:a}return t},params:s,options:n})}invokeApiSingle(e,t={},a={}){const s=e+"-"+JSON.stringify(t),n=this.apiPromisesSingle;return n[s]?n[s]:n[s]=this.invokeApi(e,t,a).finally((()=>{delete n[s]}))}invokeApiSingleProcess(e){var t,a,s;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{method:n,processResult:i,processError:r,params:o,options:p}=e,d=this.apiPromisesSingleProcess,f=p.cacheKey||JSON.stringify(o),c=null!==(s=d[n])&&void 0!==s?s:d[n]=new Map,l=c.get(f);if(l)return l;const m=()=>{const e=c.get(f);return e===h?void 0:e},g=this.invokeApi(n,o,p).then((e=>m()||i(e)),(e=>{const t=m();if(t)return t;if(!r)throw e;return r(e)})),h=g.finally((()=>{c.get(f)===h&&(c.delete(f),c.size||delete d[n])}));return c.set(f,h),h}invokeApiCacheable(e,t={},a={}){var s;const n=null!==(s=this.apiPromisesCacheable[e])&&void 0!==s?s:this.apiPromisesCacheable[e]={},i=JSON.stringify(t),r=n[i];if(r&&(!a.override||!r.fulfilled))return r.promise;let o;a.override&&(r&&r.timeout&&(clearTimeout(r.timeout),delete r.timeout),delete a.override),a.cacheSeconds&&(o=E.Z.setTimeout((()=>{delete n[i]}),1e3*a.cacheSeconds),delete a.cacheSeconds);const p=this.invokeApi(e,t,a);return n[i]={timestamp:Date.now(),fulfilled:!1,timeout:o,promise:p,params:t},p}clearCache(e,t){const a=this.apiPromisesCacheable[e];if(a)for(const e in a){const s=a[e];try{t(s.params)&&(s.timeout&&clearTimeout(s.timeout),delete a[e])}catch(e){}}}getConfig(e){return this.config&&!e?this.config:this.invokeApiSingleProcess({method:"help.getConfig",params:{},processResult:e=>(this.config=e,this.rootScope.dispatchEvent("config",e),e),options:{overwrite:e}})}getAppConfig(e){return this.appConfig&&!e?this.appConfig:this.invokeApiSingleProcess({method:"help.getAppConfig",params:{},processResult:e=>{var t;return this.appConfig=e,(0,ia.Ki)(null!==(t=e.ignore_restriction_reasons)&&void 0!==t?t:[]),this.rootScope.dispatchEvent("app_config",e),e},options:{overwrite:e}})}getLimit(e,t){return(0,q.Z)(this.getAppConfig(),(a=>{null!=t||(t=this.rootScope.premium);const s={pin:["dialogs_pinned_limit_default","dialogs_pinned_limit_premium"],folderPin:["dialogs_folder_pinned_limit_default","dialogs_folder_pinned_limit_premium"],folders:["dialog_filters_limit_default","dialog_filters_limit_premium"],favedStickers:["stickers_faved_limit_default","stickers_faved_limit_premium"],reactions:["reactions_user_max_default","reactions_user_max_premium"],bio:["about_length_limit_default","about_length_limit_premium"],topicPin:"topics_pinned_limit"}[e];return a[Array.isArray(s)?s[t?1:0]:s]}))}}var Ka=a(8453),za=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Ja extends Wa{constructor(){super(),this.log=(0,I.kg)("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=b.Z.transport,Z.addEventListener("transport",(e=>{this.changeTransportType(e)}))}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateConfig:()=>{this.getConfig(!0),this.getAppConfig(!0)}}),this.rootScope.addEventListener("user_auth",(()=>{this.config&&this.apiUpdatesManager.processLocalUpdate({_:"updateConfig"})})),this.rootScope.addEventListener("premium_toggle",(e=>{this.iterateNetworkers((({networker:t,connectionType:a,dcId:s,transportType:n})=>{if("client"===a||"websocket"!==n)return;const i=t.transport;if(i){if(i.connection){const t=V(s,a,e);i.changeUrl(t)}}else this.log.error("wow what, no transport?",t)}))}))}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const s in a){const n=a[s];for(const a in n)n[a].forEach(((n,i,r)=>{e({networker:n,dcId:+a,connectionType:s,transportType:t,index:i,array:r})}))}}}chooseServer(e,t,a){return this.dcConfigurator.chooseServer(e,t,a,"client"===t,this.rootScope.premium)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],s=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=s,this.transportType=e;for(const a in this.gettingNetworkers){const s=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const n=a.replace(t,e);this.gettingNetworkers[n]=s,this.log("changed networker getKey from",a,"to",n)}this.iterateNetworkers((e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);this.changeNetworkerTransport(e.networker,a)}))}getBaseDcId(){return za(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield qa.Z.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(_.Z.baseDcId)),this.baseDcId}))}setUserAuth(e){return za(this,void 0,void 0,(function*(){if("string"!=typeof e&&"number"!=typeof e||(e={dcID:0,date:Date.now()/1e3|0,id:e.toPeerId(!1)}),this.rootScope.dispatchEvent("user_auth",e),!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}qa.Z.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then((e=>{this.setOnDrainIfNeeded(e)})),this.baseDcId=e,qa.Z.set({dc:this.baseDcId})}logOut(){return za(this,void 0,void 0,(function*(){if(this.loggingOut)return;this.loggingOut=!0;const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map((e=>qa.Z.get(e)))),a=[];for(let e=0;eza(this,void 0,void 0,(function*(){this.baseDcId=void 0,yield(0,Ka.Z)(!1,!0),Ga.C.closeDatabases(),this.rootScope.dispatchEvent("logging_out")}));return setTimeout(s,1e3),Promise.all(a).catch((e=>{e.handled=!0})).finally(s)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",n=this.getTransportType(a);this.cachedNetworkers[n]||(this.cachedNetworkers[n]={client:{},download:{},upload:{}});const i=this.cachedNetworkers[n][a];e in i||(i[e]=[]);const r=i[e],o="client"===a||"https"===n?1:this.rootScope.premium?6:3;if(r.length>=o){let e=o-1,t=!1;for(;e>=0;--e)if(r[e].isOnline){t=!0;break}const a=r.splice(t?e:o-1,1)[0];return r.unshift(a),Promise.resolve(a)}let p=this.generateNetworkerGetKey(e,n,a);if(this.gettingNetworkers[p])return this.gettingNetworkers[p];const d=`dc${e}_auth_key`,f=`dc${e}_server_salt`;let c=this.chooseServer(e,a,n);return this.gettingNetworkers[p]=Promise.all([d,f].map((e=>qa.Z.get(e)))).then((([i,o])=>za(this,void 0,void 0,(function*(){let l,m;if(i&&512===i.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=(0,Ha.Z)(i),n=(yield s.Z.invokeCrypto("sha1",a)).slice(-8),r=(0,Ha.Z)(o);l=this.networkerFactory.getNetworker(e,a,n,r,t)}else try{const a=yield this.authorizer.auth(e);qa.Z.set({[d]:T(a.authKey),[f]:T(a.serverSalt)}),l=this.networkerFactory.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){m=e}const g=this.getTransportType(a);if(g!==n&&(p=this.generateNetworkerGetKey(e,g,a),c.destroy(),L.removeTransport(this.dcConfigurator.chosenServers,c),l&&(c=this.chooseServer(e,a,g)),this.log("transport has been changed during authorization from",n,"to",g)),delete this.gettingNetworkers[p],m)throw this.log("get networker error",m,m.stack),m;return this.changeNetworkerTransport(l,c),r.unshift(l),this.setOnDrainIfNeeded(l),l}))))}getNetworkerVoid(e){return this.getNetworker(e).then(jt.Z,jt.Z)}changeNetworkerTransport(e,t){const a=e.transport;a&&L.removeTransport(this.dcConfigurator.chosenServers,a),e.changeTransport(t)}onNetworkerDrain(e){this.log("networker drain",e.dcId),e.onDrain=void 0,this.changeNetworkerTransport(e),e.destroy(),this.networkerFactory.removeNetworker(e),L.removeTransport(this.cachedNetworkers,e)}setOnDrainIfNeeded(e){e.onDrain||(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then((t=>e.dcId!==t))).then((t=>{e.onDrain||t&&(e.onDrain=()=>this.onNetworkerDrain(e),e.setDrainTimeout())}))}setUpdatesProcessor(e){this.updatesProcessor=e,this.networkerFactory.setUpdatesProcessor(e)}invokeApi(e,t={},a={}){const s=(0,v.Z)();let n,i,{afterMessageId:r,prepareTempMessageId:o}=a;if(o&&s.then((()=>{delete this.afterMessageTempIds[o]})),d.GO){const n=Date.now(),r=E.Z.setInterval((()=>{i&&i.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-n)/1e3)}),5e3);s.catch(jt.Z).finally((()=>{clearInterval(r)}))}const p=(new Error).stack||"empty stack",f=()=>{if(r){const e=this.afterMessageTempIds[r];e&&(a.afterMessageId=e.messageId)}const p=i.wrapApiCall(e,t,a);return o&&(this.afterMessageTempIds[o]={messageId:a.messageId,promise:s}),p.catch((s=>{var i;if("FILE_REFERENCE_EXPIRED"!==s.type&&this.log.error("Error",s.code,s.type,this.baseDcId,n,e,t),401===s.code&&this.baseDcId===n)throw"SESSION_PASSWORD_NEEDED"!==s.type&&(qa.Z.delete("dc"),qa.Z.delete("user_auth")),s;if(401===s.code&&this.baseDcId&&n!==this.baseDcId){if(void 0===this.cachedExportPromise[n]){const e=new Promise(((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:n},{noErrorBox:!0}).then((a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:n,noErrorBox:!0}).then(e,t)}),t)}));this.cachedExportPromise[n]=e}return this.cachedExportPromise[n].then((()=>f()))}if(303!==s.code){if(400===s.code&&0===s.type.indexOf("FILE_MIGRATE")){const i=+s.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId=i,this.invokeApi(e,t,a);throw s}if(400===s.code&&"CONNECTION_NOT_INITED"===s.type)return this.networkerFactory.unsetConnectionInited(),f();if(a.rawError||420!==s.code){if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(s.type)){const e=this.afterMessageTempIds[r];return r=void 0,delete a.afterMessageId,e?e.promise.then((()=>f())):f()}if(a.rawError||500!==s.code){if("UNKNOWN"===s.type||"MTPROTO_CLUSTER_INVALID"===s.type)return(0,P.Z)(1e3).then((()=>f()));throw s}{const e=Date.now();if(a.stopTime&&e>=a.stopTime)throw s;return a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,(0,P.Z)(1e3*a.waitTime).then((()=>f()))}}{const e=+s.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(null!==(i=a.floodMaxTimeout)&&void 0!==i?i:60)&&!a.prepareTempMessageId)throw s;return(0,P.Z)(1e3*e).then((()=>f()))}}{const i=+s.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId?a.dcId=i:this.setBaseDcId(i),this.invokeApi(e,t,a)}}))};let c;return c=(n=a.dcId||this.baseDcId)?this.getNetworker(n,a):this.getBaseDcId().then((e=>this.getNetworker(n=e,a))),c.then((e=>{i=e;const t=f();return i.attachPromise(s,a),t})).then(s.resolve).catch((t=>za(this,void 0,void 0,(function*(){if(t?(0,fe.Z)(t)||(t={message:t}):t={type:"ERROR_EMPTY"},(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors)throw t;throw 406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=p||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout((()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)}),100)),t})))).catch(s.reject),s}}class $a{constructor(){this.neededPeers=new Map,this.singlePeerMap=new Map,this._constructor(!1)}after(){this.rootScope.addEventListener("user_auth",(()=>{this.requestPeer(this.appPeersManager.peerId,"self")}))}requestPeer(e,t){let a=this.neededPeers.get(e);a&&a.has(t)||(a||(a=new Set,this.neededPeers.set(e,a)),a.add(t),this.dispatchEvent("peerNeeded",e))}releasePeer(e,t){const a=this.neededPeers.get(e);a&&(a.delete(t),a.size||(this.neededPeers.delete(e),this.dispatchEvent("peerUnneeded",e)))}requestPeersForKey(e,t){Array.isArray(e)&&(e=new Set(e));let a=this.singlePeerMap.get(t);if(a){for(const s of a)e.has(s)||(this.releasePeer(s,t),a.delete(s));if(!a.size&&!e.size)return void this.singlePeerMap.delete(t)}if(e.size){a||(a=new Set,this.singlePeerMap.set(t,a));for(const s of e)a.has(s)||(this.requestPeer(s,t),a.add(s))}}isPeerNeeded(e){return this.neededPeers.has(e)}}Ae($a,[p.Z,G]);const Qa=$a,Ya=o.Pt;class Xa{constructor(){this.thumbsCache={}}getKey(e){var t;return e._+(null!==(t=e.id)&&void 0!==t?t:e.url)}getCacheContext(e,t=Ya){var a,s,n,i;const r=null!==(a=(n=this.thumbsCache)[i=this.getKey(e)])&&void 0!==a?a:n[i]={};return null!==(s=r[t])&&void 0!==s?s:r[t]={downloaded:0,url:"",type:t}}setCacheContextURL(e,t=Ya,a,s=0){const n=this.getCacheContext(e,t);return n.url=a,n.downloaded=s,n}deleteCacheContext(e,t=Ya){const a=this.thumbsCache[this.getKey(e)];a&&delete a[t]}}const es={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:"spoiler",type:"flags.2?true"},{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:"spoiler",type:"flags.1?true"},{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:"personal",type:"flags.2?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:-908914376,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?ChatReactions"}],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:"spoiler",type:"flags.3?true"},{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:-712374074,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"},{name:"ttl_period",type:"flags.5?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:-120378643,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:"voice_messages_forbidden",type:"flags.20?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"personal_photo",type:"flags.21?Photo"},{name:"profile_photo",type:"flags.2?Photo"},{name:"fallback_photo",type:"flags.22?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"},{name:"premium_gifts",type:"flags.19?Vector"}],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:-1484486364,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"usernames",type:"Vector"}],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:"this_port_only",type:"flags.5?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:589653676,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:"force_try_ipv6",type:"flags.14?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"},{name:"reactions_default",type:"flags.15?Reaction"}],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:-1476358952,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{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:"spoiler",type:"flags.5?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:"spoiler",type:"flags.2?true"},{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:"nopremium",type:"flags.3?true"},{name:"spoiler",type:"flags.4?true"},{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:-1881881384,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:"long"},{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:-1787080453,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"},{name:"login_email_pattern",type:"flags.6?string"}],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:768691932,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:"emojis",type:"flags.7?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:"thumb_document_id",type:"flags.8?long"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:1846886166,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-1885878744,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:"premium",type:"flags.28?true"},{name:"attach_menu_enabled",type:"flags.29?true"},{name:"flags2",type:"#"},{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"},{name:"emoji_status",type:"flags.30?EmojiStatus"},{name:"usernames",type:"flags2.0?Vector"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:-1892676777,predicate:"botInfo",params:[{name:"flags",type:"#"},{name:"user_id",type:"flags.0?long"},{name:"description",type:"flags.1?string"},{name:"description_photo",type:"flags.4?Photo"},{name:"description_document",type:"flags.5?Document"},{name:"commands",type:"flags.2?Vector"},{name:"menu_button",type:"flags.3?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:"persistent",type:"flags.4?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:-2094689180,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:"forum",type:"flags.30?true"},{name:"flags2",type:"#"},{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"},{name:"usernames",type:"flags2.0?Vector"}],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:-231385849,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:"antispam",type:"flags2.1?true"},{name:"participants_hidden",type:"flags2.2?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?ChatReactions"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:-948520370,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:"topics",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:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Update"},{id:834816008,predicate:"updateStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"}],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:457829485,predicate:"updateDraftMessage",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"top_msg_id",type:"flags.0?int"},{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:-1103615738,predicate:"messages.featuredStickers",params:[{name:"flags",type:"#"},{name:"premium",type:"flags.0?true"},{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:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{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:1048946971,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:"recurring",type:"flags.9?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"},{name:"recurring_terms_url",type:"flags.9?string"}],type:"Invoice"},{id:-1900697899,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"},{name:"extended_media",type:"flags.2?InputMedia"}],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:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{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:-156940077,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"},{name:"extended_media",type:"flags.4?MessageExtendedMedia"}],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:-1776926890,predicate:"messageActionPaymentSent",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"invoice_slug",type:"flags.0?string"}],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:-1610250415,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:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.5?WebDocument"},{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:"additional_methods",type:"flags.6?Vector"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?Vector"},{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:-1665063993,predicate:"phoneConnection",params:[{name:"flags",type:"#"},{name:"tcp",type:"flags.0?true"},{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"},{name:"forums",type:"flags.17?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:-366410403,predicate:"updateChannelReadMessagesContents",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{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:-207944868,predicate:"fileHash",params:[{name:"offset",type:"long"},{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:2097791614,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{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"},{name:"manage_topics",type:"flags.13?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:"manage_topics",type:"flags.18?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:-1896171181,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:"long"},{name:"file_size_max",type:"long"},{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:"forum_topic",type:"flags.3?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:1007897979,predicate:"messageActionSetMessagesTTL",params:[{name:"flags",type:"#"},{name:"period",type:"int"},{name:"auto_setting_from",type:"flags.0?long"}],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:"recommended",type:"flags.5?true"},{name:"show_peer_photo",type:"flags.6?true"},{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:-907141753,predicate:"messages.sponsoredMessages",params:[{name:"flags",type:"#"},{name:"posts_between",type:"flags.0?int"},{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:-191450938,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:1578843320,predicate:"updateMessageReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"top_msg_id",type:"flags.0?int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:-1546531968,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen_order",type:"flags.0?int"},{name:"reaction",type:"Reaction"},{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:"premium",type:"flags.2?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:-1102180616,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"ChatReactions"},{name:"new_value",type:"ChatReactions"}],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:-1319698788,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:"Reaction"}],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:-928371502,predicate:"attachMenuBot",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"has_settings",type:"flags.1?true"},{name:"request_write_access",type:"flags.2?true"},{name:"bot_id",type:"long"},{name:"short_name",type:"string"},{name:"peer_types",type:"Vector"},{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"},{id:2104224014,predicate:"attachMenuPeerTypeSameBotPM",params:[],type:"AttachMenuPeerType"},{id:-1020528102,predicate:"attachMenuPeerTypeBotPM",params:[],type:"AttachMenuPeerType"},{id:-247016673,predicate:"attachMenuPeerTypePM",params:[],type:"AttachMenuPeerType"},{id:84480319,predicate:"attachMenuPeerTypeChat",params:[],type:"AttachMenuPeerType"},{id:2080104188,predicate:"attachMenuPeerTypeBroadcast",params:[],type:"AttachMenuPeerType"},{id:-317687113,predicate:"chatInvitePublicJoinRequests",params:[],type:"ExportedChatInvite"},{id:-977967015,predicate:"inputInvoiceMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"InputInvoice"},{id:-1020867857,predicate:"inputInvoiceSlug",params:[{name:"slug",type:"string"}],type:"InputInvoice"},{id:-1362048039,predicate:"payments.exportedInvoice",params:[{name:"url",type:"string"}],type:"payments.ExportedInvoice"},{id:8703322,predicate:"updateTranscribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"Update"},{id:-1821037486,predicate:"messages.transcribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"messages.TranscribedAudio"},{id:909284270,predicate:"dialogFilterDefault",params:[],type:"DialogFilter"},{id:1395946908,predicate:"help.premiumPromo",params:[{name:"status_text",type:"string"},{name:"status_entities",type:"Vector"},{name:"video_sections",type:"Vector"},{name:"videos",type:"Vector"},{name:"period_options",type:"Vector"},{name:"users",type:"Vector"}],type:"help.PremiumPromo"},{id:-925956616,predicate:"messageEntityCustomEmoji",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"document_id",type:"long"}],type:"MessageEntity"},{id:-48981863,predicate:"documentAttributeCustomEmoji",params:[{name:"flags",type:"#"},{name:"free",type:"flags.0?true"},{name:"text_color",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"}],type:"DocumentAttribute"},{id:1087454222,predicate:"stickerSetFullCovered",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"StickerSetCovered"},{id:-1502273946,predicate:"inputStorePaymentPremiumSubscription",params:[{name:"flags",type:"#"},{name:"restore",type:"flags.0?true"}],type:"InputStorePaymentPurpose"},{id:1634697192,predicate:"inputStorePaymentGiftPremium",params:[{name:"user_id",type:"InputUser"},{name:"currency",type:"string"},{name:"amount",type:"long"}],type:"InputStorePaymentPurpose"},{id:-1415514682,predicate:"messageActionGiftPremium",params:[{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"months",type:"int"}],type:"MessageAction"},{id:1958953753,predicate:"premiumGiftOption",params:[{name:"flags",type:"#"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumGiftOption"},{id:-930399486,predicate:"inputStickerSetPremiumGifts",params:[],type:"InputStickerSet"},{id:-78886548,predicate:"updateReadFeaturedEmojiStickers",params:[],type:"Update"},{id:-1360618136,predicate:"inputPrivacyKeyVoiceMessages",params:[],type:"InputPrivacyKey"},{id:110621716,predicate:"privacyKeyVoiceMessages",params:[],type:"PrivacyKey"},{id:-1996951013,predicate:"paymentFormMethod",params:[{name:"url",type:"string"},{name:"title",type:"string"}],type:"PaymentFormMethod"},{id:-193992412,predicate:"inputWebFileAudioAlbumThumbLocation",params:[{name:"flags",type:"#"},{name:"small",type:"flags.2?true"},{name:"document",type:"flags.0?InputDocument"},{name:"title",type:"flags.1?string"},{name:"performer",type:"flags.1?string"}],type:"InputWebFileLocation"},{id:769727150,predicate:"emojiStatusEmpty",params:[],type:"EmojiStatus"},{id:-1835310691,predicate:"emojiStatus",params:[{name:"document_id",type:"long"}],type:"EmojiStatus"},{id:-97474361,predicate:"emojiStatusUntil",params:[{name:"document_id",type:"long"},{name:"until",type:"int"}],type:"EmojiStatus"},{id:674706841,predicate:"updateUserEmojiStatus",params:[{name:"user_id",type:"long"},{name:"emoji_status",type:"EmojiStatus"}],type:"Update"},{id:821314523,predicate:"updateRecentEmojiStatuses",params:[],type:"Update"},{id:-796072379,predicate:"account.emojiStatusesNotModified",params:[],type:"account.EmojiStatuses"},{id:-1866176559,predicate:"account.emojiStatuses",params:[{name:"hash",type:"long"},{name:"statuses",type:"Vector"}],type:"account.EmojiStatuses"},{id:2046153753,predicate:"reactionEmpty",params:[],type:"Reaction"},{id:455247544,predicate:"reactionEmoji",params:[{name:"emoticon",type:"string"}],type:"Reaction"},{id:-1992950669,predicate:"reactionCustomEmoji",params:[{name:"document_id",type:"long"}],type:"Reaction"},{id:-352570692,predicate:"chatReactionsNone",params:[],type:"ChatReactions"},{id:1385335754,predicate:"chatReactionsAll",params:[{name:"flags",type:"#"},{name:"allow_custom",type:"flags.0?true"}],type:"ChatReactions"},{id:1713193015,predicate:"chatReactionsSome",params:[{name:"reactions",type:"Vector"}],type:"ChatReactions"},{id:-1334846497,predicate:"messages.reactionsNotModified",params:[],type:"messages.Reactions"},{id:-352454890,predicate:"messages.reactions",params:[{name:"hash",type:"long"},{name:"reactions",type:"Vector"}],type:"messages.Reactions"},{id:1870160884,predicate:"updateRecentReactions",params:[],type:"Update"},{id:-2030252155,predicate:"updateMoveStickerSetToTop",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"stickerset",type:"long"}],type:"Update"},{id:1511364673,predicate:"auth.sentCodeTypeEmailCode",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"},{name:"email_pattern",type:"string"},{name:"length",type:"int"},{name:"next_phone_login_date",type:"flags.2?int"}],type:"auth.SentCodeType"},{id:-1521934870,predicate:"auth.sentCodeTypeSetUpEmailRequired",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"}],type:"auth.SentCodeType"},{id:1128644211,predicate:"emailVerifyPurposeLoginSetup",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"EmailVerifyPurpose"},{id:1383932651,predicate:"emailVerifyPurposeLoginChange",params:[],type:"EmailVerifyPurpose"},{id:-1141565819,predicate:"emailVerifyPurposePassport",params:[],type:"EmailVerifyPurpose"},{id:-1842457175,predicate:"emailVerificationCode",params:[{name:"code",type:"string"}],type:"EmailVerification"},{id:-611279166,predicate:"emailVerificationGoogle",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:-1764723459,predicate:"emailVerificationApple",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:731303195,predicate:"account.emailVerified",params:[{name:"email",type:"string"}],type:"account.EmailVerified"},{id:-507835039,predicate:"account.emailVerifiedLogin",params:[{name:"email",type:"string"},{name:"sent_code",type:"auth.SentCode"}],type:"account.EmailVerified"},{id:-1225711938,predicate:"premiumSubscriptionOption",params:[{name:"flags",type:"#"},{name:"current",type:"flags.1?true"},{name:"can_purchase_upgrade",type:"flags.2?true"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumSubscriptionOption"},{id:80008398,predicate:"inputStickerSetEmojiGenericAnimations",params:[],type:"InputStickerSet"},{id:701560302,predicate:"inputStickerSetEmojiDefaultStatuses",params:[],type:"InputStickerSet"},{id:-1206095820,predicate:"sendAsPeer",params:[{name:"flags",type:"#"},{name:"premium_required",type:"flags.0?true"},{name:"peer",type:"Peer"}],type:"SendAsPeer"},{id:-1386050360,predicate:"messageExtendedMediaPreview",params:[{name:"flags",type:"#"},{name:"w",type:"flags.0?int"},{name:"h",type:"flags.0?int"},{name:"thumb",type:"flags.1?PhotoSize"},{name:"video_duration",type:"flags.2?int"}],type:"MessageExtendedMedia"},{id:-297296796,predicate:"messageExtendedMedia",params:[{name:"media",type:"MessageMedia"}],type:"MessageExtendedMedia"},{id:1517529484,predicate:"updateMessageExtendedMedia",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"extended_media",type:"MessageExtendedMedia"}],type:"Update"},{id:-50416996,predicate:"stickerKeyword",params:[{name:"document_id",type:"long"},{name:"keyword",type:"Vector"}],type:"StickerKeyword"},{id:-1274595769,predicate:"username",params:[{name:"flags",type:"#"},{name:"editable",type:"flags.0?true"},{name:"active",type:"flags.1?true"},{name:"username",type:"string"}],type:"Username"},{id:-263212119,predicate:"channelAdminLogEventActionChangeUsernames",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:46949251,predicate:"channelAdminLogEventActionToggleForum",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1483767080,predicate:"channelAdminLogEventActionCreateTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-261103096,predicate:"channelAdminLogEventActionEditTopic",params:[{name:"prev_topic",type:"ForumTopic"},{name:"new_topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-1374254839,predicate:"channelAdminLogEventActionDeleteTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:1569535291,predicate:"channelAdminLogEventActionPinTopic",params:[{name:"flags",type:"#"},{name:"prev_topic",type:"flags.0?ForumTopic"},{name:"new_topic",type:"flags.1?ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:37687451,predicate:"forumTopicDeleted",params:[{name:"id",type:"int"}],type:"ForumTopic"},{id:1903173033,predicate:"forumTopic",params:[{name:"flags",type:"#"},{name:"my",type:"flags.1?true"},{name:"closed",type:"flags.2?true"},{name:"pinned",type:"flags.3?true"},{name:"short",type:"flags.5?true"},{name:"hidden",type:"flags.6?true"},{name:"id",type:"int"},{name:"date",type:"int"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"},{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:"from_id",type:"Peer"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"draft",type:"flags.4?DraftMessage"}],type:"ForumTopic"},{id:913709011,predicate:"messages.forumTopics",params:[{name:"flags",type:"#"},{name:"order_by_create_date",type:"flags.0?true"},{name:"count",type:"int"},{name:"topics",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"pts",type:"int"}],type:"messages.ForumTopics"},{id:228168278,predicate:"messageActionTopicCreate",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"}],type:"MessageAction"},{id:-1064024032,predicate:"messageActionTopicEdit",params:[{name:"flags",type:"#"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"MessageAction"},{id:422509539,predicate:"updateChannelPinnedTopic",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"topic_id",type:"int"}],type:"Update"},{id:1548122514,predicate:"inputNotifyForumTopic",params:[{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"int"}],type:"InputNotifyPeer"},{id:577659656,predicate:"notifyForumTopic",params:[{name:"peer",type:"Peer"},{name:"top_msg_id",type:"int"}],type:"NotifyPeer"},{id:1153562857,predicate:"inputStickerSetEmojiDefaultTopicIcons",params:[],type:"InputStickerSet"},{id:406407439,predicate:"messages.sponsoredMessagesEmpty",params:[],type:"messages.SponsoredMessages"},{id:-31881726,predicate:"updateChannelPinnedTopics",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:1135897376,predicate:"defaultHistoryTTL",params:[{name:"period",type:"int"}],type:"DefaultHistoryTTL"},{id:116234636,predicate:"auth.codeTypeFragmentSms",params:[],type:"auth.CodeType"},{id:-648651719,predicate:"auth.sentCodeTypeFragmentSms",params:[{name:"url",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1103040667,predicate:"exportedContactToken",params:[{name:"url",type:"string"},{name:"expires",type:"int"}],type:"ExportedContactToken"},{id:1693675004,predicate:"channelAdminLogEventActionToggleAntiSpam",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1474192222,predicate:"messageActionSuggestProfilePhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-404267113,predicate:"messageActionAttachMenuBotAllowed",params:[],type:"MessageAction"},{id:2008112412,predicate:"stickerSetNoCovered",params:[{name:"set",type:"StickerSet"}],type:"StickerSetCovered"},{id:542282808,predicate:"updateUser",params:[{name:"user_id",type:"long"}],type:"Update"}],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:-1923962543,method:"auth.signIn",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"flags.0?string"},{name:"email_verification",type:"flags.1?EmailVerification"}],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:482476935,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:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?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:1967638886,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:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?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:-966673468,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:"top_msg_id",type:"flags.9?int"},{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:3450904,method:"messages.createChat",params:[{name:"flags",type:"#"},{name:"users",type:"Vector"},{name:"title",type:"string"},{name:"ttl_period",type:"flags.0?int"}],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:473782614,method:"photos.updateProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.0?true"},{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.3?true"},{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:-1101843010,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:"long"},{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:-1564422284,method:"account.deleteAccount",params:[{name:"flags",type:"#"},{name:"reason",type:"string"},{name:"password",type:"flags.0?InputCheckPasswordSRP"}],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:-1862244601,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"},{name:"ttl_period",type:"flags.4?int"}],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:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:-1309538785,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"long"},{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:-738468661,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:"top_msg_id",type:"flags.9?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:-1271718337,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.2?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:"emojis",type:"flags.1?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:924093883,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"invoice",type:"InputInvoice"},{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:-1228345045,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"invoice",type:"InputInvoice"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:755192367,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"invoice",type:"InputInvoice"},{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:962554330,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"},{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:-1847836879,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"}],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:-251140208,method:"messages.getUnreadMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?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"}],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:921026381,method:"messages.readMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],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:-1225713124,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:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?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:-1856595926,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"long"}],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:-1730136133,method:"account.sendVerifyEmailCode",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:53322959,method:"account.verifyEmail",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"verification",type:"EmailVerification"}],type:"account.EmailVerified"},{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:-1896617296,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?long"}],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:11435201,method:"messages.getSearchCounters",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{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:978872812,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"}],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:-299714136,method:"messages.unpinAllMessages",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],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:-754091820,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"add_to_recent",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?Vector"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1176190792,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?Reaction"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:-21928079,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"ChatReactions"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:1330094102,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"Reaction"}],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:841173339,method:"messages.getUnreadReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?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"}],type:"messages.Messages"},{id:1420459918,method:"messages.readReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],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:1777704297,method:"messages.toggleBotInAttachMenu",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"bot",type:"InputUser"},{name:"enabled",type:"Bool"}],type:"Bool"},{id:395003915,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:"platform",type:"string"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"WebViewResult"},{id:2146648841,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"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Bool"},{id:698084494,method:"messages.requestSimpleWebView",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"url",type:"string"},{name:"theme_params",type:"flags.0?DataJSON"},{name:"platform",type:"string"}],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"},{id:1092913030,method:"phone.saveCallLog",params:[{name:"peer",type:"InputPhoneCall"},{name:"file",type:"InputFile"}],type:"Bool"},{id:-456419968,method:"channels.toggleJoinToSend",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1277789622,method:"channels.toggleJoinRequest",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:261206117,method:"payments.exportInvoice",params:[{name:"invoice_media",type:"InputMedia"}],type:"payments.ExportedInvoice"},{id:647928393,method:"messages.transcribeAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.TranscribedAudio"},{id:2132608815,method:"messages.rateTranscribedAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"good",type:"Bool"}],type:"Bool"},{id:-2131921795,method:"payments.assignAppStoreTransaction",params:[{name:"receipt",type:"bytes"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-537046829,method:"payments.assignPlayMarketTransaction",params:[{name:"receipt",type:"DataJSON"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-1614700874,method:"payments.canPurchasePremium",params:[{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Bool"},{id:-1206152236,method:"help.getPremiumPromo",params:[],type:"help.PremiumPromo"},{id:-643100844,method:"messages.getCustomEmojiDocuments",params:[{name:"document_id",type:"Vector"}],type:"Vector"},{id:-67329649,method:"messages.getEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:248473398,method:"messages.getFeaturedEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-70001045,method:"account.updateEmojiStatus",params:[{name:"emoji_status",type:"EmojiStatus"}],type:"Bool"},{id:-696962170,method:"account.getDefaultEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:257392901,method:"account.getRecentEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:404757166,method:"account.clearRecentEmojiStatuses",params:[],type:"Bool"},{id:1063567478,method:"messages.reportReaction",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction_peer",type:"InputPeer"}],type:"Bool"},{id:-1149164102,method:"messages.getTopReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:960896434,method:"messages.getRecentReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:-1644236876,method:"messages.clearRecentReactions",params:[],type:"Bool"},{id:-2064119788,method:"messages.getExtendedMedia",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:767062953,method:"auth.importWebTokenAuthorization",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"web_auth_token",type:"string"}],type:"auth.Authorization"},{id:-279966037,method:"account.reorderUsernames",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:1490465654,method:"account.toggleUsername",params:[{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:-1268978403,method:"channels.reorderUsernames",params:[{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Bool"},{id:1358053637,method:"channels.toggleUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:170155475,method:"channels.deactivateAllUsernames",params:[{name:"channel",type:"InputChannel"}],type:"Bool"},{id:-1540781271,method:"channels.toggleForum",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-200539612,method:"channels.createForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"title",type:"string"},{name:"icon_color",type:"flags.0?int"},{name:"icon_emoji_id",type:"flags.3?long"},{name:"random_id",type:"long"},{name:"send_as",type:"flags.2?InputPeer"}],type:"Updates"},{id:233136337,method:"channels.getForumTopics",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"flags.0?string"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_topic",type:"int"},{name:"limit",type:"int"}],type:"messages.ForumTopics"},{id:-1333584199,method:"channels.getForumTopicsByID",params:[{name:"channel",type:"InputChannel"},{name:"topics",type:"Vector"}],type:"messages.ForumTopics"},{id:-186670715,method:"channels.editForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"Updates"},{id:1814925350,method:"channels.updatePinnedForumTopic",params:[{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"pinned",type:"Bool"}],type:"Updates"},{id:876830509,method:"channels.deleteTopicHistory",params:[{name:"channel",type:"InputChannel"},{name:"top_msg_id",type:"int"}],type:"messages.AffectedHistory"},{id:693150095,method:"channels.reorderPinnedForumTopics",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Updates"},{id:1760814315,method:"channels.toggleAntiSpam",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-1471109485,method:"channels.reportAntiSpamFalsePositive",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"Bool"},{id:-1632299963,method:"messages.setDefaultHistoryTTL",params:[{name:"period",type:"int"}],type:"Bool"},{id:1703637384,method:"messages.getDefaultHistoryTTL",params:[],type:"DefaultHistoryTTL"},{id:-127582169,method:"contacts.exportContactToken",params:[],type:"ExportedContactToken"},{id:318789512,method:"contacts.importContactToken",params:[{name:"token",type:"string"}],type:"User"},{id:-1189444673,method:"photos.uploadContactProfilePhoto",params:[{name:"flags",type:"#"},{name:"suggest",type:"flags.3?true"},{name:"save",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:1785624660,method:"channels.toggleParticipantsHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"}]},layer:151};var ts=a(745),as=a.n(ts),ss=a(4736),ns=a.n(ss);function is(e){return e>>>0}function rs(e,t){return e=is(e),t=is(t),ns()(e).shiftLeft(32).add(ns()(t))}const os=ns()(Number.MAX_SAFE_INTEGER),ps=ns()(ns()[2]).pow(64),ds=ps.divide(ns()[2]);function fs(e,t=256){return ns().fromArray(e instanceof Uint8Array?[...e]:e,t)}const cs=+es.API.constructors.find((e=>"boolFalse"===e.predicate)).id,ls=+es.API.constructors.find((e=>"boolTrue"===e.predicate)).id,ms=+es.API.constructors.find((e=>"vector"===e.predicate)).id,gs=+es.MTProto.constructors.find((e=>"gzip_packed"===e.predicate)).id;class hs{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(ls,(t||"")+":bool"):this.writeInt(cs,(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);const a=(s=ns()(e)).isNegative()?ps.add(s):s;var s;const{quotient:n,remainder:i}=a.divmod(4294967296),r=n.toJSNumber(),o=i.toJSNumber();this.writeInt(o,(t||"")+":long[low]"),this.writeInt(r,(t||"")+":long[high]")}storeDouble(e,t){const a=new ArrayBuffer(8),s=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(s[0],(t||"")+":double[low]"),this.writeInt(s[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const s=a.length;s<=253?this.byteView[this.offset++]=s:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&s,this.byteView[this.offset++]=(65280&s)>>8,this.byteView[this.offset++]=(16711680&s)>>16);for(let e=0;e>>",T(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const s=e.length;if(t%32||8*s!==t){const n=new Error("Invalid bits: "+t+", "+s);throw console.error(n,e,a),n}this.debug&&console.log(">>>",T(e),(a||"")+":int"+t),this.checkLength(s),this.byteView.set(e,this.offset),this.offset+=s}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",T(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?es.MTProto:es.API).methods.find((t=>t.method===e));if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const s=t.pFlags||t,n={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),n=e[0].split(".");if(!(t[n[0]]&1<<+n[1])){if(!("true"===e[1]?s[i.name]:void 0!==t[i.name]))continue;t[n[0]]|=1<<+n[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,n[i.name]=r)}for(const e in n)this.intView[n[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(ms,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const s=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===n));if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+n+" found");n===t&&(i=!0),i||this.writeInt(r.id,a+"["+n+"][id]");const o=e.pFlags,p={};for(const t of r.params){let s=t.type;if(-1!==s.indexOf("?")){const a=s.split("?"),n=a[0].split(".");if(!(e[n[0]]&1<<+n[1])){if(!("true"===a[1]?o&&o[t.name]:void 0!==e[t.name]))continue;e[n[0]]|=1<<+n[1]}s=a[1]}const i=this.storeObject(e[t.name],s,a+"["+n+"]["+t.name+"]");"#"===s&&(e[t.name]=e[t.name]||0,p[t.name]=i)}for(const t in p)this.intView[p[t]]=e[t];return r.type}}class us{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),T(this.byteView.slice(this.offset-16,this.offset+16))),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),s=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),s[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]");let a=rs(this.readInt((e||"")+":long[high]"),t);var s;return this.mtproto||(a=(s=a).greater(ds)?s.minus(ps):s),!this.mtproto&&os.greaterOrEquals(a.abs())?a.toJSNumber():a.toString(10)}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===ls||t!==cs&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,s="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView.slice(this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const n=e.substr(7,e.length-8);for(let e=0;ee.type===t)),!s)throw new Error("Constructor not found for type: "+e)}else{const r=this.readInt(t+"[id]");if(r===gs){const a=(i=this.fetchBytes(t+"[packed_string]"),as().inflate(i,void 0));return new us(a).fetchObject(e,t)}if(r===ms)return this.fetchVector(e,t);let o=a.constructorsIndex;if(!o){a.constructorsIndex=o={};for(let e=0,t=a.constructors.length;e0&&r{var e;if(this.pingDelayDisconnectDeferred||!this.transport||!this.transport.connected)return;const t=this.pingDelayDisconnectDeferred=(0,v.Z)(),a=this.delays,s=this.delays.pingMaxTime,n=Math.min(null!==(e=this.lastPingTime)&&void 0!==e?e:0,s),i=Math.round(a.disconnectDelayMin+n/s*(a.disconnectDelayMax-a.disconnectDelayMin)),r=1e3*i,o=this.lastPingStartTime=Date.now(),p=this.lastPingDelayDisconnectId=(0,Te.a)(),d={notContentRelated:!0};this.wrapMtpCall("ping_delay_disconnect",{ping_id:p,disconnect_delay:i},d);const f=this.log.bindPrefix("sendPingDelayDisconnect");this.debug&&f.debug(`ping, timeout=${r}, lastPingTime=${this.lastPingTime}, msgId=${d.messageId}, pingId=${p}`);const c=E.Z.setTimeout(t.reject,r);t.then((e=>{clearTimeout(c);const t=Date.now()-o;if(this.lastPingTime=t/1e3,this.debug&&f.debug(`pong, reason='${e}', time=${n}, msgId=${d.messageId}`),t>r)throw void 0;return(0,P.Z)(Math.max(0,this.delays.pingInterval-t))})).catch((()=>{clearTimeout(c);const e=this.transport;this.pingDelayDisconnectDeferred===t&&(null==e?void 0:e.connection)&&(f.error("catch, closing connection",this.lastPingTime,d.messageId),e.connection.close())})).finally((()=>{this.pingDelayDisconnectDeferred===t&&(this.pingDelayDisconnectDeferred=void 0,this.sendPingDelayDisconnect())}))},this.checkLongPoll=()=>{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()}))},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new hs({mtproto:!0}),a=(0,Te.a)();t.storeMethod("ping",{ping_id:a});const s={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(U.Q.Connecting),this.sendEncryptedRequest(s).then((()=>{this.toggleOffline(!1)}),(()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from failed checkConnection request")),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)}))},this.authKeyUint8=(0,Ps.Z)(this.authKey),this.serverSalt=(0,Ps.Z)(i),this.isFileUpload=!!r.fileUpload,this.isFileDownload=!!r.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload,this.delays=this.isFileNetworker?Ms.file:Ms.client;const o=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+a+o,this.log=(0,I.kg)(this.name+(o?"":"-C")+"-"+Cs++,I.v9.Log|I.v9.Error|I.v9.Warn),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=w(new Uint8Array(8))}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&(0,ne.Z)(t.inner,((e,a)=>{const s=this.updateSentMessage(e);s?t.inner[a]=s.msg_id:t.inner.splice(a,1)})),t.msg_id=this.timeManager.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const s=new hs({mtproto:!0});s.storeMethod(e,t);const n=this.timeManager.generateId(),i=this.generateSeqNo(),r={msg_id:n,seq_no:i,body:s.getBytes(!0)};return b.Z.debug&&this.log("MT call",e,t,n,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new hs({mtproto:!0});a.storeObject(e,"Object");const s=this.timeManager.generateId(),n=this.generateSeqNo(t.notContentRelated),i={msg_id:s,seq_no:n,body:a.getBytes(!0)};return b.Z.debug&&this.log("MT message",e,s,n),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const s=new hs(a);if(!this.connectionInited){const e=es.API.methods.find((e=>"invokeWithLayer"===e.method));if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(es.layer,"layer");const t=es.API.methods.find((e=>"initConnection"===e.method));if(!t)throw new Error("no initConnection!");s.storeInt(+t.id,"initConnection"),s.storeInt(0,"flags"),s.storeInt(_.Z.id,"api_id"),s.storeString(i().USER_AGENT||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(_.Z.version+(_.Z.isMainDomain?" "+_.Z.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(_.Z.langPack,"lang_pack"),s.storeString(this.networkerFactory.language,"lang_code")}if(a.afterMessageId){if(void 0===Ss){const e=es.API.methods.find((e=>"invokeAfterMsg"===e.method));Ss=e?+e.id:0}Ss?(s.storeInt(Ss,"invokeAfterMsg"),s.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=s.storeMethod(e,t);const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:s.getBytes(!0),isAPI:!0};return b.Z.debug?this.log("Api call",e,n,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(n,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),this.connectionInited=!1,void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.log("change transport",e,t),this.clearPingDelayDisconnect(),this.transport=e,e&&(e.networker=this,e instanceof S&&(this.longPollInterval=E.Z.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connection&&e.connected&&this.setConnectionStatus(U.Q.Connected),this.resend())}destroy(){this.log("destroy")}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}clearPingDelayDisconnect(){const e=this.pingDelayDisconnectDeferred;this.pingDelayDisconnectDeferred=void 0,this.lastPingDelayDisconnectId=void 0,e&&e.reject()}sendLongPoll(){this.sendingLongPoll||(this.sendingLongPoll=!0,this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then((()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)}),(e=>{this.log("Long-poll failed",e)})).finally((()=>{this.sendingLongPoll=void 0})))}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(U.Q.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from toggleOfline")),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(U.Q.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?U.Q.Closed:U.Q.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then((e=>(this.toggleOffline(!1),this.parseResponse(e).then((e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))))),(e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1))).then((e=>{const t=this.sentMessages;a.forEach((a=>{const s=t[a];if(s){const n=s.deferred;delete t[a],delete this.pendingMessages[a],e?n.resolve():n.reject()}}))}))}pushMessage(e,t){let a;return t.notContentRelated&&!t.noResponse||(a=(0,v.Z)()),this.sentMessages[e.msg_id]=Object.assign(e,t,a?{deferred:a}:void 0),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),(0,fe.Z)(t)&&(t.messageId=e.msg_id),a}attachPromise(e,t){const a=setTimeout((()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime{clearTimeout(a),this.setConnectionStatus(U.Q.Connected),--this.activeRequests,this.setDrainTimeout()})),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=E.Z.setTimeout((()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()}),1e4))}setConnectionStatus(e,t){var a;const s=e===U.Q.Connected,n=this.status!==e;this.isOnline=s,this.status=e,n&&(this.networkerFactory.onConnectionStatusChange&&this.networkerFactory.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest(),(null===(a=this.transport)||void 0===a?void 0:a.connection)&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect()))}pushResend(e,t=100){const a=t?Date.now()+t:0,s=this.sentMessages[e];if(s.container)for(const e of s.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;s.acked&&this.log.error("pushResend: acked message?",s),this.debug&&this.log.debug("pushResend:",e,s,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return bs(this,void 0,void 0,(function*(){const a=t?0:8,n=(0,ys.Z)(this.authKeyUint8.subarray(88+a,88+a+32),e),i=yield s.Z.invokeCrypto("sha256",n);return new Uint8Array(i).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),i=new Uint8Array(52),r=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),r.push(s.Z.invokeCrypto("sha256",n)),i.set(this.authKeyUint8.subarray(40+a,40+a+36),0),i.set(e,36),r.push(s.Z.invokeCrypto("sha256",i)),Promise.all(r).then((e=>{const t=new Uint8Array(32),a=new Uint8Array(32),s=new Uint8Array(e[0]),n=new Uint8Array(e[1]);return t.set(s.subarray(0,8)),t.set(n.subarray(8,24),8),t.set(s.subarray(24,32),24),a.set(n.subarray(0,8)),a.set(s.subarray(8,24),8),a.set(n.subarray(24,32),24),[t,a]}))}isStopped(){return this.networkerFactory.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}const e=this.pendingResendReq.length;if(e){const t=Object.assign({},Is),a=this.pendingResendReq.splice(0,e);this.wrapMtpMessage({_:"msg_resend_req",msg_ids:a},t),this.log("resend: resending requests",t.messageId,a)}let t;const a=[];let s=0,n=!1,i=!1,r=!1;const o=Object.keys(this.pendingMessages).map((e=>ns()(e))).sort(((e,t)=>e.compare(t))).map((e=>e.toString(10)));for(const e of o){const o=this.sentMessages[e];if(o&&o.body){const e=o.body.length+32;if(s+e>655360&&(this.log.warn("lengthOverflow",o,a),r=!0,t))break;a.push(o),s+=e,o.isAPI?n=!0:o.longPoll&&(i=!0),t=o}delete this.pendingMessages[e]}if(this.transport instanceof S&&n&&!i){const e=new hs({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),a.push({msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!a.length)return;const p=a.filter((e=>e.noResponse)).map((e=>e.msg_id));if(a.length>1){const e=this.generateContainerMessage(s,a);t=e.messageWithBody,this.sentMessages[t.msg_id]=e.message}else this.sentMessages[t.msg_id]=t;this.pendingAcks=[];const d=this.sendEncryptedRequest(t);this.transport instanceof S&&this.handleSentEncryptedRequestHTTP(d,t,p),this.transport instanceof S||this.cleanupSent(),r&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new hs({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const s=[];t.forEach(((e,t)=>{s.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")}));const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:s};return b.Z.debug&&this.log.warn("Container",s,n.msg_id,n.seq_no),{message:n,messageWithBody:Object.assign({body:a.getBytes(!0)},n)}}getEncryptedMessage(e){return bs(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield s.Z.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then((e=>s.Z.invokeCrypto("aes-decrypt",t,e[0],e[1])))}getEncryptedOutput(e){const t=new hs({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),s=16-t.getOffset()%16+16*(1+(0,Te.d)(8)%5),n=w(new Uint8Array(s)),i=(0,ys.Z)(a,n);return this.getEncryptedMessage(i).then((e=>{const t=new hs({startMaxLength:e.bytes.length+256});return t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data"),t.getBytes(!0)}))}sendEncryptedRequest(e){return bs(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 S))return a;const s={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then((e=>{if(!(null==e?void 0:e.byteLength))throw s;return e}),(e=>{throw e.message||e.type||(e=Object.assign(s,{type:"NETWORK_BAD_REQUEST",originalError:e})),e}))}))}parseResponse(e){this.lastResponseTime=Date.now();const t=new us(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!(0,vs.Z)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+T(a));const s=t.fetchIntBytes(128,!0,"msg_key"),n=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,n).then((e=>this.getMsgKey(e,!1).then((t=>{if(!(0,vs.Z)(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new us(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!((0,vs.Z)(n,this.sessionId)||this.prevSessionId&&(0,vs.Z)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+T(n));const r=a.fetchInt("seq_no"),o=e.byteLength,p=a.fetchInt("message_data[length]");let d=a.getOffset();if(p%4||p>o-d)throw new Error("[MT] Invalid body length: "+p);const f=a.fetchRawBytes(p,!0,"message_data");d=a.getOffset();const c=o-d;if(c<12||c>1024)throw new Error("[MT] Invalid padding length: "+c);return a=new us(f,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const s=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==s+e.bytes&&a.setOffset(s+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const s=this.sentMessages[e.req_msg_id],n=s&&s.resultType||"Object";e.req_msg_id&&!s||(e.result=a.fetchObject(n,t+"[result]"))}}}),{response:a.fetchObject("","INPUT"),messageId:i,sessionId:n,seqNo:r}}))))}applyServerSalt(e){const t=(a=e,_s((s=ns()(a),new Uint8Array(s.toArray(256).value)).reverse(),8,!0,!1,!1));var a,s;qa.Z.set({["dc"+this.dcId+"_server_salt"]:T(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof S&&(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 S&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=E.Z.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof S&&(t=3e4),this.scheduleRequest(t)}reqResend(e){this.debug&&this.log.debug("Req resend",e),this.pendingResendReq.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;const t=this.sentMessages;return Object.keys(t).forEach((a=>{const s=t[a];if(s.notContentRelated&&void 0===this.pendingMessages[a])delete t[a];else if(s.container){for(const a of s.inner)if(void 0!==t[a])return void(e=!0);delete t[a]}else e=!0})),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){const e=this.sentMessages;for(const t in e){const a=e[t];(a.body||a.container)&&this.pushResend(t)}this.transport.connection&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect())}applyServerTime(e){const t=ns()(e).shiftRight(32).toJSNumber();return this.log("applying server time",t),this.timeManager.applyServerTime(t)}processMessage(e,t,a){if("messageEmpty"!==e._)if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(this.debug&&this.log.debug("process message",e,t),this.pingDelayDisconnectDeferred&&this.pingDelayDisconnectDeferred.resolve("any message"),e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=this.applyServerTime(t);(17===e.error_code||a)&&(this.log("Update session"),this.updateSession());const s=this.updateSentMessage(e.bad_msg_id);s&&this.pushResend(s.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),qa.Z.get("dc").then((t=>{t===this.dcId&&!this.isFileNetworker&&this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}));break;case"msgs_ack":this.debug&&this.log("got acks",e.msg_ids);for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(-1!==this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResend(e.answer_msg_id);break;case"msgs_state_info":{this.ackMessage(e.answer_msg_id);const t=[[this.lastResendReq,this.pendingResendReq]];for(const[a,s]of t)if((null==a?void 0:a.reqMsgId)===e.req_msg_id&&s.length)for(const e of a.msgIds){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}break}case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,s=this.sentMessages[a];if(this.debug&&this.log("Rpc response",e.result,s),this.processMessageAck(a),s){const t=s.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),s.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.ping_id;if(this.lastPingDelayDisconnectId===t){const e=this.pingDelayDisconnectDeferred;e?e.resolve("pong"):this.log("ping deferred deleted",t)}break}default:this.ackMessage(t),null!==this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}else this.log.warn("processMessage: messageEmpty",e,t)}}class ks extends G{constructor(){super(...arguments),this.networkers=[],this.language=navigator.language||_.Z.langPackCode,this.updatesProcessor=null,this.akStopped=!1}onConnectionStatusChange(e){this.rootScope.dispatchEvent("connection_status_change",e)}removeNetworker(e){(0,M.Z)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new ws(this,this.timeManager,e,t,a,s,n);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter((e=>e.isStopped()));this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}unsetConnectionInited(){for(const e of this.networkers)e.connectionInited=!1}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}}const As=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,b.Z.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map((e=>{const t=new hs;t.storeBytes((0,Ha.Z)(e.modulus),"n"),t.storeBytes((0,Ha.Z)(e.exponent),"e");const a=t.getBuffer();return s.Z.invokeCrypto("sha1",a).then((t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[T(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}}))}))).then((()=>{this.prepared=!0,this.preparePromise=null}))}select(e){return t=this,a=void 0,n=function*(){yield this.prepare();for(let t=0;t{if(d.ZP&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw o;try{const t=new us(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const s=t.fetchLong("msg_id");"0"===s&&this.log.error("msg_id === 0",s);const n=t.fetchInt("msg_len");return n||this.log.error("no msg_len",n),t}catch(e){throw this.log.error("mtpSendPlainRequest: deserialization went bad",e),Object.assign(o,{originalError:e})}}),(e=>{throw e.message||e.type||(e=Object.assign(o,{originalError:e})),e}))}sendReqPQ(e){return Us(this,void 0,void 0,(function*(){const t=new hs({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),d.ZP&&this.log("Send req_pq",T(e.nonce));try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));As.prepare(),a=yield s}catch(e){throw this.log.error("req_pq error",e.message),e}const n=a.fetchObject("ResPQ");if("resPQ"!==n._)throw new Error("[MT] resPQ response invalid: "+n._);if(!(0,vs.Z)(e.nonce,n.nonce))throw this.log.error(e.nonce,n.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=n.server_nonce,e.pq=n.pq,e.fingerprints=n.server_public_key_fingerprints,d.ZP&&this.log("Got ResPQ",T(e.serverNonce),T(e.pq),e.fingerprints);const i=yield As.select(e.fingerprints);if(!i)throw new Error("[MT] No public key found");e.publicKey=i,d.ZP&&this.log("PQ factorization start",e.pq);try{var r=yield s.Z.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=r[0],e.q=r[1],d.ZP&&this.log("PQ factorization done",r),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Us(this,void 0,void 0,(function*(){e.newNonce=w(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 hs({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const n=a.getBytes(!0);if(n.length>144)throw"DH_params: data is more than 144 bytes!";const i=_s(n,192,!1,!0,!1),r=i.slice().reverse(),o=yield(()=>Us(this,void 0,void 0,(function*(){for(;;){const t=w(new Uint8Array(32)),a=r.concat(yield s.Z.invokeCrypto("sha256",t.concat(i)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const n=yield s.Z.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),o=Ds(t,yield s.Z.invokeCrypto("sha256",n)).concat(n),p=fs(o),d=ns()(e.publicKey.modulus,16);if(-1===p.compare(d))return o}})))(),p=_s(yield s.Z.invokeCrypto("rsa-encrypt",o,e.publicKey),256,!0,!0,!0),f={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:p},c=new hs({mtproto:!0});c.storeMethod("req_DH_params",f);const l=c.getBytes(!0);let m;d.ZP&&this.log("Send req_DH_params",f);try{m=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const g=m.fetchObject("Server_DH_Params","RESPONSE");if(d.ZP&&this.log("Sent req_DH_params, response:",g),"server_DH_params_fail"!==g._&&"server_DH_params_ok"!==g._)throw new Error("[MT] Server_DH_Params response invalid: "+g._);if(!(0,vs.Z)(e.nonce,g.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!(0,vs.Z)(e.serverNonce,g.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===g._){const t=(yield s.Z.invokeCrypto("sha1",e.newNonce)).slice(-16);if(!(0,vs.Z)(t,g.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,g.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Us(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.serverNonce))).concat((yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield s.Z.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),i=a.slice(20),r=new us(i,{mtproto:!0}),o=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==o._)throw new Error("[MT] server_DH_inner_data response invalid: "+o);if(!(0,vs.Z)(e.nonce,o.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!(0,vs.Z)(e.serverNonce,o.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");d.ZP&&this.log("Done decrypting answer"),e.g=o.g,e.dhPrime=o.dh_prime,e.gA=o.g_a,e.serverTime=o.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const p=r.getOffset();if(!(0,vs.Z)(n,yield s.Z.invokeCrypto("sha1",i.slice(0,p))))throw new Error("[MT] server_DH_inner_data SHA1 mismatch");this.timeManager.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){d.ZP&&this.log("Verifying DH params",e,t,a);const s=T(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");d.ZP&&this.log("dhPrime cmp OK");const n=fs(a),i=ns()(s,16);if(n.compare(ns().one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(n.compare(i.subtract(ns().one))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");d.ZP&&this.log("1 < gA < dhPrime-1 OK");const r=ns()(2).pow(1984);if(n.compare(r)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(n.compare(i.subtract(r))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return d.ZP&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Us(this,void 0,void 0,(function*(){const t=(0,Ha.Z)(e.g.toString(16));e.b=w(new Uint8Array(256));try{var a=yield s.Z.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new hs({mtproto:!0});n.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const i=(yield s.Z.invokeCrypto("sha1",n.getBuffer())).concat(n.getBytes(!0)),r=yield s.Z.invokeCrypto("aes-encrypt",i,e.tmpAesKey,e.tmpAesIv),o=new hs({mtproto:!0});let p;o.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:r}),d.ZP&&this.log("Send set_client_DH_params");try{p=yield this.sendPlainRequest(e.dcId,o.getBytes(!0))}catch(e){throw e}const f=p.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==f._&&"dh_gen_retry"!==f._&&"dh_gen_fail"!==f._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+f._);if(!(0,vs.Z)(e.nonce,f.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!(0,vs.Z)(e.serverNonce,f.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield s.Z.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield s.Z.invokeCrypto("sha1",c),m=l.slice(0,8),g=l.slice(-8);switch(d.ZP&&this.log("Got Set_client_DH_params_answer",f._,c),f._){case"dh_gen_ok":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([1],m))).slice(-16);if(!(0,vs.Z)(t,f.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,f),new Error("new_nonce_hash1 mismatch");const a=Ds(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return d.ZP&&this.log("Auth successfull!",g,c,a),e.authKeyId=g,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([2],m))).slice(-16);if(!(0,vs.Z)(t,f.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e)}case"dh_gen_fail":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([3],m))).slice(-16);if(!(0,vs.Z)(t,f.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=Z.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)=>Us(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:w(new Uint8Array(16))},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)})))),this.cached[e]=t)}}class Es extends G{after(){this.lastMessageId=[0,0],this.timeOffset=0,qa.Z.get("server_time_offset").then((e=>{e&&(this.timeOffset=e)}))}getServerTimeOffset(){return this.timeOffset}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|(0,Te.d)(16)<<3|4];return(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t,rs(t[0],t[1]).toString(10)}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),s=Math.abs(this.timeOffset-a)>10;return this.lastMessageId=[0,0],this.timeOffset!==a&&(qa.Z.set({server_time_offset:a}),this.timeOffset=a),s}}class Fs{saveWebDocument(e){if(!e)return;const t=e.attributes.find((e=>"documentAttributeImageSize"===e._));return t&&(e.w=t.w,e.h=t.h),e}}class Rs extends G{getInputInvoiceBySlug(e){return{_:"inputInvoiceSlug",slug:e}}getInputInvoiceByPeerId(e,t){return{_:"inputInvoiceMessage",peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}}getPaymentForm(e){return this.apiManager.invokeApi("payments.getPaymentForm",{invoice:e}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getPaymentReceipt(e,t){return this.apiManager.invokeApi("payments.getPaymentReceipt",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}validateRequestedInfo(e,t,a){return this.apiManager.invokeApi("payments.validateRequestedInfo",{save:a,invoice:e,info:t})}sendPaymentForm(e,t,a,s,n,i){return this.apiManager.invokeApi("payments.sendPaymentForm",{form_id:t,invoice:e,requested_info_id:a,shipping_option_id:s,credentials:n,tip_amount:i||void 0}).then((e=>("payments.paymentResult"===e._&&this.apiUpdatesManager.processUpdateMessage(e.updates),e)))}clearSavedInfo(e,t){return this.apiManager.invokeApi("payments.clearSavedInfo",{info:e,credentials:t})}}var xs=a(8794);class Bs extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{e?this.attachMenuBots=new Map:(this.attachMenuBots.clear(),this.attachMenuBotsArr=void 0)},this.onUpdateAttachMenuBots=e=>{this.clear(),this.getAttachMenuBots()}}after(){this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateAttachMenuBots:this.onUpdateAttachMenuBots})}saveAttachMenuBot(e){this.attachMenuBots.set(e.bot_id,e);const t=(0,xs.Z)(e);return t.icon=this.appDocsManager.saveDoc(t.icon,{type:"attachMenuBotIcon",botId:e.bot_id}),e}saveAttachMenuBots(e){e.saved||(e.saved=!0,e.forEach((e=>this.saveAttachMenuBot(e))))}getAttachMenuBots(){var e;return null!==(e=this.attachMenuBotsArr)&&void 0!==e?e:this.apiManager.invokeApiSingleProcess({method:"messages.getAttachMenuBots",processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.saveAttachMenuBots(e.bots),this.attachMenuBotsArr=e.bots.slice(0,0))})}getAttachMenuBotCached(e){return this.attachMenuBots.get(e)}getAttachMenuBot(e,t){throw this.appUsersManager.isAttachMenuBot(e),(0,X.Z)("BOT_INVALID")}requestWebView(e){const{botId:t,peerId:a,url:s,fromBotMenu:n,themeParams:i,replyToMsgId:r,silent:o,sendAsPeerId:p,startParam:d,threadId:f}=e;return this.apiManager.invokeApiSingleProcess({method:"messages.requestWebView",params:{peer:this.appPeersManager.getInputPeerById(a),bot:this.appUsersManager.getUserInput(t),silent:o,platform:"web",url:s,reply_to_msg_id:r?(0,oe.Z)(r):void 0,from_bot_menu:n,theme_params:i,send_as:p?this.appPeersManager.getInputPeerById(p):void 0,start_param:d,top_msg_id:f?(0,oe.Z)(f):void 0},processResult:e=>(console.log(e),e)})}prolongWebView(e){return this.apiManager.invokeApiSingleProcess({method:"messages.prolongWebView",params:{peer:this.appPeersManager.getInputPeerById(e.peerId),bot:this.appUsersManager.getUserInput(e.botId),query_id:e.queryId,silent:e.silent,reply_to_msg_id:e.replyToMsgId?(0,oe.Z)(e.replyToMsgId):void 0,send_as:e.sendAsPeerId?this.appPeersManager.getInputPeerById(e.sendAsPeerId):void 0,top_msg_id:e.threadId?(0,oe.Z)(e.threadId):void 0},processResult:e=>{console.log(e)}})}}const Vs=new class{constructor(){this.cryptoWorkersURLs=[],this.cryptoPortsAttached=0,this.cryptoPortPromise=(0,v.Z)(),this.cryptoPortPromise.then((()=>{this.cryptoPortPromise=void 0}))}start(){const e=f.Z.getInstance();e.addEventListener("manager",(({name:e,method:t,args:a})=>(0,q.Z)(this.getManagers(),(s=>{const n=s[e];return n[t].apply(n,a)})))),e.addEventListener("cryptoPort",((e,t,a)=>{var n;const i=a.ports[0];this.cryptoPortsAttached>=this.cryptoWorkersURLs.length?i.close():(++this.cryptoPortsAttached,s.Z.attachPort(i),null===(n=this.cryptoPortPromise)||void 0===n||n.resolve())})),e.addEventListener("createProxyWorkerURLs",(({originalUrl:e,blob:t})=>{let a=this.cryptoWorkersURLs.length;a||(this.cryptoWorkersURLs.push(e),++a);const s=_.Z.cryptoWorkers;if(a===s)return this.cryptoWorkersURLs;const n=new Array(s-a).fill(void 0).map((()=>URL.createObjectURL(t)));return this.cryptoWorkersURLs.push(...n),this.cryptoWorkersURLs}))}createManagers(){return e=this,t=void 0,n=function*(){const e=new $;yield Promise.all([e.loadStorages(),this.cryptoPortPromise]);const t=yield function(e,t){const a={appPeersManager:new fa,appChatsManager:new Be,appDocsManager:new ut,appPhotosManager:new ca,appPollsManager:new la,appUsersManager:new Aa,appWebPagesManager:new Ua,appDraftsManager:new _t,appProfileManager:new ua,appNotificationsManager:new na,apiUpdatesManager:new De,appAvatarsManager:new Ue,appGroupCallsManager:new St,appCallsManager:new Fe,appReactionsManager:new ba,appMessagesManager:new ta,appMessagesIdsManager:new Tt,appPrivacyManager:new ma,appInlineBotsManager:new Dt,appStickersManager:new Ca,referenceDatabase:new ee,appEmojiManager:new Mt,filtersStorage:new Ce,dialogsStorage:new _e,apiManager:new Ja,cryptoWorker:s.Z,passwordManager:new Q,apiFileManager:new ja,peersStorage:new Qa,thumbsStorage:new Xa,networkerFactory:new ks,rootScope:new l,authorizer:new Ts,dcConfigurator:new L,timeManager:new Es,appStoragesManager:e,appStateManager:y,appWebDocsManager:new Fs,appPaymentsManager:new Rs,appAttachMenuBotsManager:new Bs};for(const e in a){const t=a[e];t&&(t.setManagers&&(t.setManagers(a),delete t.setManagers),E.Z[e]=t)}const n=[];let i=Object.keys(a);i.unshift("appUsersManager","appChatsManager","appNotificationsManager","appMessagesManager","dialogsStorage"),i=(0,we.Z)(i);for(const e of i){const t=a[e];if(null==t?void 0:t.after){const e=t.after();n.push(e)}}return t&&a.apiManager.setUserAuth(t),Promise.all(n).then((()=>a))}(e,y.userId);return this.managers=t},new((a=void 0)||(a=Promise))((function(s,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((n=n.apply(e,t||[])).next())}));var e,t,a,n}getManagers(){var e;return null!==(e=this.managers)&&void 0!==e?e:this.managers=this.createManagers()}};d.GO&&(d.GO.appManagersManager=Vs);const Ls=Vs;var Os=a(3655);let Ns,Zs,js=!0;function qs(){return js}function Gs(){return js?Ns:void 0}const Hs=(0,I.kg)("MTPROTO"),Ws=new f.Z;Ws.addMultipleEventsListeners({environment:e=>{r(e),Z.waitForWebSocket()},crypto:({method:e,args:t})=>s.Z.invokeCrypto(e,...t),state:({state:e,resetStorages:t,pushedKeys:a,newVersion:s,oldVersion:n,userId:i})=>{Hs("got state",e,a),y.userId=i,y.newVersion=s,y.oldVersion=n,Object.keys(e).forEach((t=>{y.pushToState(t,e[t],!0,!a.includes(t))})),j.resolve(t)},toggleStorages:({enabled:e,clearWrite:t})=>(0,Ka.Z)(e,t),event:(e,t)=>{Hs("will redirect event",e,t),Ws.invokeExceptSource("event",e,t)},serviceWorkerOnline:e=>{js=e},serviceWorkerPort:(e,t,a)=>{Ns?(Ns.detachPort(Zs),Zs=void 0):(Ns=new Os.Z,Ns.addMultipleEventsListeners({requestFilePart:e=>(0,q.Z)(Ls.getManagers(),(t=>{const{docId:a,dcId:s,offset:n,limit:i}=e;return t.appDocsManager.requestDocPart(a,s,n,i)}))})),(Zs=a.ports[0])&&Ns.attachPort(Zs)},createObjectURL:e=>URL.createObjectURL(e)}),Hs("MTProto start"),Ls.start(),Ls.getManagers(),Gt.start(),function(e,t,a){const s=(a,s)=>{e.attachListenPort(a),s&&e.attachSendPort(s),null==t||t(a)};e.setOnPortDisconnect((e=>{Gt.deleteTab(e)})),"undefined"!=typeof SharedWorkerGlobalScope?E.Z.addEventListener("connect",(e=>s(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?s(E.Z,null):s(E.Z,E.Z)}(Ws,(e=>{Gt.addTab(e)}))},1507:(e,t,a)=>{a.d(t,{BP:()=>f,DZ:()=>g,Gu:()=>h,IA:()=>i,Iw:()=>p,J$:()=>l,NM:()=>s,Ox:()=>c,Pt:()=>d,Zi:()=>m,hj:()=>n,rU:()=>o,yF:()=>r});const s=0,n=1271266957,i=777,r=777e3,o=2147483647,p=20971520,d="",f="default_static",c=4295032831,l=0,m=1,g=new Set([l,m]),h=Math.max(...Array.from(g))+1},2423:(e,t,a)=>{a.d(t,{$2:()=>d,E:()=>f,QB:()=>c,SC:()=>l,bu:()=>p,it:()=>o,kO:()=>g,tY:()=>m});var s=a(1229);const n="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",i="["+n+"0-9]",r="((?:https?|ftp)://|mailto:)?",o=r+"(?:"+i+"{1,64}(?::"+i+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+i+"["+n+"·0-9-]{0,64}(?:\\."+i+"["+n+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+n+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",p=(new RegExp("^"+r.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),d=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+o+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#[0-9_a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),f=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,c=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,l={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},m=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in l)m.add(l[e]);const g=/^\+\d+$/},671:(e,t,a)=>{function s(e){return function(e){const t=[];let a=0,s=0,n=0;for(;n55296&&a<=56319?s=a:t.push(a.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}(r(e)).join("-")}a.d(t,{N0:()=>s});const n=/\uFE0F/g,i=String.fromCharCode(8205),r=e=>e.indexOf(i)<0?e.replace(n,""):e;new Map([["FT","🏴‍☠"]])}},o={};function p(e){var t=o[e];if(void 0!==t)return t.exports;var a=o[e]={id:e,loaded:!1,exports:{}};return r[e].call(a.exports,a,a.exports,p),a.loaded=!0,a.exports}p.m=r,p.x=()=>{var e=p.O(void 0,[699,211,333,437,946],(()=>p(5218)));return p.O(e)},e=[],p.O=(t,a,s,n)=>{if(!a){var i=1/0;for(f=0;f=n)&&Object.keys(p.O).every((e=>p.O[e](a[o])))?a.splice(o--,1):(r=!1,n0&&e[f-1][2]>n;f--)e[f]=e[f-1];e[f]=[a,s,n]},p.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return p.d(t,{a:t}),t},p.d=(e,t)=>{for(var a in t)p.o(t,a)&&!p.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},p.f={},p.e=e=>Promise.all(Object.keys(p.f).reduce(((t,a)=>(p.f[a](e,t),t)),[])),p.u=e=>437===e?"437.a80d805671a4b222696d.bundle.js":946===e?"946.5f3daeb8fb456e8f8e99.bundle.js":({211:"npm.big-integer",699:"npm.pako"}[e]||e)+"."+{8:"47c82822a84234c722aa",104:"3793e2da2f88ac72ffd9",211:"a70c90f1bcf51a3f9932",301:"dc3c5a315285fe24ebd3",333:"d7addf177783fe16e44c",642:"e22e19b4ff8bd97e11a6",699:"f16d6f756c34f3914132"}[e]+".chunk.js",p.miniCssF=e=>{},p.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),p.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),p.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},p.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;p.g.importScripts&&(e=p.g.location+"");var t=p.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var a=t.getElementsByTagName("script");a.length&&(e=a[a.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),p.p=e})(),t=p.u,a=p.e,s=new Map,n=new Map,p.u=function(e){return t(e)+(s.has(e)?"?"+s.get(e):"")},p.e=function(e){return a(e).catch((function(a){var i=n.has(e)?n.get(e):999999;if(i<1){var r=t(e);throw a.message="Loading chunk "+e+" failed after 999999 retries.\n("+r+")",a.request=r,a}return new Promise((function(t){setTimeout((function(){var a=Date.now();s.set(e,a),n.set(e,i-1),t(p.e(e))}),3e3)}))}))},(()=>{var e={678:1};p.f.i=(t,a)=>{e[t]||importScripts(p.p+p.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],a=t.push.bind(t);t.push=t=>{var[s,n,i]=t;for(var r in n)p.o(n,r)&&(p.m[r]=n[r]);for(i&&i(p);s.length;)e[s.pop()]=1;a(t)}})(),i=p.x,p.x=()=>Promise.all([699,211,333,437,946].map(p.e,p)).then(i),p.x()})(); +//# sourceMappingURL=mtproto.worker.57e2ed0eb86ffb097616.chunk.js.map \ No newline at end of file diff --git a/public/mtproto.worker.57e2ed0eb86ffb097616.chunk.js.map b/public/mtproto.worker.57e2ed0eb86ffb097616.chunk.js.map new file mode 100644 index 00000000..8ca8e0c7 --- /dev/null +++ b/public/mtproto.worker.57e2ed0eb86ffb097616.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mtproto.worker.57e2ed0eb86ffb097616.chunk.js","mappings":"uBAAIA,ECEIC,EACAC,EACAC,EACAC,ECLJC,E,mCCQG,MAAMC,EAAyE,CAAC,GAAK,CAAC,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,GAAI,GAAG,CAAC,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,IAAK,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,OAAO,MAAO,OAAO,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/environment/utils.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/appManagers/appStateManager.ts","webpack://tweb/./src/helpers/object/setDeepProperty.ts","webpack://tweb/./src/lib/mtproto/transports/http.ts","webpack://tweb/./src/lib/mtproto/transports/websocket.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/lib/mtproto/transports/obfuscation.ts","webpack://tweb/./src/lib/mtproto/transports/abridged.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/lib/mtproto/transports/tcpObfuscated.ts","webpack://tweb/./src/lib/mtproto/dcConfigurator.ts","webpack://tweb/./src/lib/mtproto/transports/controller.ts","webpack://tweb/./src/lib/appManagers/utils/storages/resetStoragesPromise.ts","webpack://tweb/./src/lib/appManagers/manager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/loadStorages.ts","webpack://tweb/./src/lib/appManagers/appStoragesManager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/createStorages.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/lib/mtproto/referenceDatabase.ts","webpack://tweb/./src/helpers/object/safeReplaceObject.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getPeerIdsFromMessage.ts","webpack://tweb/./src/helpers/object/defineNotNumerableProperties.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/setDialogIndex.ts","webpack://tweb/./src/lib/storages/dialogs.ts","webpack://tweb/./src/lib/storages/filters.ts","webpack://tweb/./src/helpers/applyMixins.ts","webpack://tweb/./src/lib/appManagers/apiUpdatesManager.ts","webpack://tweb/./src/lib/appManagers/appAvatarsManager.ts","webpack://tweb/./src/lib/appManagers/appCallsManager.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.ts","webpack://tweb/./src/environment/mimeTypeMap.ts","webpack://tweb/./src/lib/appManagers/appDocsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentURL.ts","webpack://tweb/./src/lib/appManagers/appDraftsManager.ts","webpack://tweb/./src/lib/appManagers/appEmojiManager.ts","webpack://tweb/./src/lib/appManagers/appGroupCallsManager.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoInput.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoMediaInput.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentMediaInput.ts","webpack://tweb/./src/lib/appManagers/appInlineBotsManager.ts","webpack://tweb/./src/lib/appManagers/appMessagesIdsManager.ts","webpack://tweb/./src/helpers/string/splitStringByLength.ts","webpack://tweb/./src/lib/appManagers/appTabsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInput.ts","webpack://tweb/./src/helpers/object/setBooleanFlag.ts","webpack://tweb/./src/lib/appManagers/appMessagesManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileName.ts","webpack://tweb/./src/helpers/string/convertInputKeyToKey.ts","webpack://tweb/./src/lib/appManagers/appNotificationsManager.ts","webpack://tweb/./src/lib/appManagers/appPeersManager.ts","webpack://tweb/./src/lib/appManagers/appPhotosManager.ts","webpack://tweb/./src/lib/appManagers/appPollsManager.ts","webpack://tweb/./src/lib/appManagers/appPrivacyManager.ts","webpack://tweb/./src/lib/appManagers/appProfileManager.ts","webpack://tweb/./src/helpers/callbackifyAll.ts","webpack://tweb/./src/lib/appManagers/appReactionsManager.ts","webpack://tweb/./src/lib/appManagers/appStickersManager.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/string/fileNameRFC.ts","webpack://tweb/./src/lib/files/downloadWriter.ts","webpack://tweb/./src/lib/files/downloadStorage.ts","webpack://tweb/./src/lib/mtproto/apiFileManager.ts","webpack://tweb/./src/helpers/fixFirefoxSvg.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/lib/mtproto/api_methods.ts","webpack://tweb/./src/lib/mtproto/apiManager.ts","webpack://tweb/./src/lib/storages/peers.ts","webpack://tweb/./src/lib/storages/thumbs.ts","webpack://tweb/./src/lib/mtproto/schema.ts","webpack://tweb/./src/helpers/number/intToUint.ts","webpack://tweb/./src/helpers/long/ulongFromInts.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/lib/mtproto/tl_utils.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/lib/mtproto/networker.ts","webpack://tweb/./src/helpers/long/sortLongsArray.ts","webpack://tweb/./src/helpers/long/longToBytes.ts","webpack://tweb/./src/lib/mtproto/networkerFactory.ts","webpack://tweb/./src/lib/mtproto/rsaKeysManager.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/mtproto/authorizer.ts","webpack://tweb/./src/lib/mtproto/timeManager.ts","webpack://tweb/./src/lib/appManagers/appWebDocsManager.ts","webpack://tweb/./src/lib/appManagers/appPaymentsManager.ts","webpack://tweb/./src/lib/appManagers/appAttachMenuBotsManager.ts","webpack://tweb/./src/lib/appManagers/appManagersManager.ts","webpack://tweb/./src/lib/appManagers/createManagers.ts","webpack://tweb/./src/lib/mtproto/mtproto.worker.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,333,437,946].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[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 as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\n * 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 './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\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;\n","/*\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","/*\n * 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 {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = location.volume_id + '_' + location.local_id;\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\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","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * 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 {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","import type ENVIRONMENT from '.';\n\nlet environment: typeof ENVIRONMENT;\nexport function getEnvironment() {\n return environment;\n}\n\nexport function setEnvironment(env: typeof environment) {\n return environment = env;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\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': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {State} from '../../config/state';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\nexport class AppStateManager {\n private state: State = {} as any;\n private storage = stateStorage;\n\n // ! for mtproto worker use only\n public newVersion: string;\n public oldVersion: string;\n public userId: UserId;\n\n public getState() {\n return Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n\n const first = key.split('.')[0] as keyof State;\n if(first === 'settings') {\n rootScope.dispatchEvent('settings_updated', {key, value, settings: this.state.settings});\n }\n\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true, onlyLocal?: boolean) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value, onlyLocal);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key], onlyLocal?: boolean) {\n MTProtoMessagePort.getInstance().invokeVoid('mirror', {name: 'state', key, value});\n\n this.storage.set({\n [key]: value\n }, onlyLocal);\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\nconst appStateManager = new AppStateManager();\nexport default appStateManager;\n","import getDeepProperty from './getDeepProperty';\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../../helpers/schedulers/pause';\nimport {DcId} from '../../../types';\nimport {logger, LogTypes} from '../../logger';\nimport type MTPNetworker from '../networker';\nimport MTTransport from './transport';\nimport Modes from '../../../config/modes';\n\n \nimport transportController from './controller';\n// import networkStats from '../networkStats';\n \n\nexport default class HTTP implements MTTransport {\n public networker: MTPNetworker;\n private log: ReturnType;\n\n private pending: Array<{\n resolve: (body: Uint8Array) => void,\n reject: any,\n body: Uint8Array\n }> = [];\n private releasing: boolean;\n\n public connected: boolean;\n private destroyed: boolean;\n private debug: boolean;\n\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\n this.debug = Modes.debug && false;\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connected = false;\n }\n\n public _send(body: Uint8Array, mode?: RequestMode) {\n const length = body.length;\n this.debug && this.log.debug('-> body length to send:', length);\n\n // networkStats.addSent(this.dcId, length);\n return fetch(this.url, {method: 'POST', body, mode}).then((response) => {\n if(response.status !== 200 && !mode) {\n response.arrayBuffer().then((buffer) => {\n this.log.error('not 200',\n new TextDecoder('utf-8').decode(new Uint8Array(buffer)));\n });\n\n throw response;\n }\n\n this.setConnected(true);\n\n // * test resending by dropping random request\n // if(Math.random() > .5) {\n // throw 'asd';\n // }\n\n return response.arrayBuffer().then((buffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n return new Uint8Array(buffer);\n });\n }, (err) => {\n this.setConnected(false);\n throw err;\n });\n }\n\n private setConnected(connected: boolean) {\n if(this.connected === connected || this.destroyed) {\n return;\n }\n\n this.connected = connected;\n\n \n transportController.setTransportValue('https', connected);\n \n }\n\n public destroy() {\n this.setConnected(false);\n this.destroyed = true;\n this.pending.forEach((pending) => pending.reject());\n this.pending.length = 0;\n }\n\n public send(body: Uint8Array) {\n if(this.networker) {\n return this._send(body);\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending() {\n if(this.releasing) return;\n\n this.releasing = true;\n // this.log('-> messages to send:', this.pending.length);\n for(let i = 0; i < this.pending.length; ++i) {\n const pending = this.pending[i];\n const {body, resolve} = pending;\n\n try {\n const result = await this._send(body);\n resolve(result);\n this.pending.splice(i, 1);\n } catch(err) {\n this.log.error('Send plain request error:', err);\n await pause(5000);\n }\n\n --i;\n }\n\n this.releasing = false;\n }\n}\n","/*\n * 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, LogTypes} from '../../logger';\nimport Modes from '../../../config/modes';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport {MTConnection} from './transport';\n\n// let closeSocketBefore = Date.now() + 30e3;\n// let closeSocketAfter = Date.now() + 10e3;\n\nexport default class Socket extends EventListenerBase<{\n open: () => void,\n message: (buffer: ArrayBuffer) => any,\n close: () => void,\n}> implements MTConnection {\n private ws: WebSocket;\n private log: ReturnType;\n private debug = Modes.debug && false;\n\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\n super();\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n this.connect();\n\n return this;\n }\n\n private removeListeners() {\n if(!this.ws) {\n return;\n }\n\n this.ws.removeEventListener('open', this.handleOpen);\n this.ws.removeEventListener('close', this.handleClose);\n this.ws.removeEventListener('error', this.handleError);\n this.ws.removeEventListener('message', this.handleMessage);\n this.ws = undefined;\n }\n\n private connect() {\n this.ws = new WebSocket(this.url, 'binary');\n this.ws.binaryType = 'arraybuffer';\n this.ws.addEventListener('open', this.handleOpen);\n this.ws.addEventListener('close', this.handleClose);\n this.ws.addEventListener('error', this.handleError);\n this.ws.addEventListener('message', this.handleMessage);\n\n // if(Date.now() < closeSocketBefore) {\n // if(Date.now() >= closeSocketAfter) {\n // this.ws.close();\n // }\n }\n\n public close() {\n if(!this.ws) {\n return;\n }\n\n this.log('close execution');\n\n try {\n this.ws.close();\n } catch(err) {\n\n }\n this.handleClose();\n }\n\n private handleOpen = () => {\n this.log('opened');\n\n this.debug && this.log.debug('sending init packet');\n this.dispatchEvent('open');\n };\n\n private handleError = (e: Event) => {\n this.log.error('handleError', e);\n this.close();\n };\n\n private handleClose = (e?: CloseEvent) => {\n this.log('closed', e/* , this.pending, this.ws.bufferedAmount */);\n\n this.removeListeners();\n this.dispatchEvent('close');\n };\n\n private handleMessage = (event: MessageEvent) => {\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\n\n this.dispatchEvent('message', event.data as ArrayBuffer);\n };\n\n public send = (body: Uint8Array) => {\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n this.ws.send(body);\n };\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","/*\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 aesjs from 'aes-js';\nimport randomize from '../../../helpers/array/randomize';\nimport cryptoMessagePort from '../../crypto/cryptoMessagePort';\nimport {Codec} from './codec';\n\n/*\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\n*/\nexport default class Obfuscation {\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\n\n private id: number;\n private idPromise: Promise;\n private process: (data: Uint8Array, operation: 'encrypt' | 'decrypt') => ReturnType;\n\n // private cryptoEncKey: CryptoKey;\n // private cryptoDecKey: CryptoKey;\n // private cryptoKey: CryptoKey;\n\n // private encIv: Uint8Array;\n // private decIv: Uint8Array;\n\n // private decIvCounter: Counter;\n\n public async init(codec: Codec) {\n if(this.idPromise !== undefined) {\n this.release();\n }\n\n const initPayload = new Uint8Array(64);\n randomize(initPayload);\n\n while(true) {\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\n if(initPayload[0] !== 0xef &&\n val !== 0x44414548 &&\n val !== 0x54534f50 &&\n val !== 0x20544547 &&\n val !== 0x4954504f &&\n val !== 0xeeeeeeee &&\n val !== 0xdddddddd &&\n val2 !== 0x00000000) {\n // initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\n break;\n }\n randomize(initPayload);\n }\n\n // //////////////////////initPayload.subarray(60, 62).hex = dcId;\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\n console.log('initPayload', initPayload); */\n\n const reversedPayload = initPayload.slice().reverse();\n\n const encKey = initPayload.slice(8, 40);\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\n const decKey = reversedPayload.slice(8, 40);\n const decIv = /* this.decIv = */reversedPayload.slice(40, 56);\n\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\n\n // console.log('encKey', encKey.hex, encIv.hex);\n // console.log('decKey', decKey.hex, decIv.hex);\n\n const idPromise = this.idPromise = cryptoMessagePort.invokeCrypto('aes-ctr-prepare', {\n encKey,\n encIv,\n decKey,\n decIv\n });\n\n this.process = async(data, operation) => {\n await idPromise;\n return this._process(data, operation);\n };\n\n this.id = await idPromise;\n\n this.process = this._process;\n\n // this.decIvCounter = new Counter(this.decIv);\n /* const key = this.cryptoEncKey = await subtle.importKey(\n 'raw',\n encKey,\n {name: 'AES-CTR'},\n false,\n ['encrypt']\n ); */\n\n // this.cryptoDecKey = await subtle.importKey(\n // 'raw',\n // decKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt']\n // );\n\n // this.cryptoKey = await subtle.importKey(\n // 'raw',\n // encKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt', 'decrypt']\n // );\n\n initPayload.set(codec.obfuscateTag, 56);\n const encrypted = await this.encode(initPayload.slice());\n\n // console.log('encrypted', encrypted);\n\n initPayload.set(encrypted.slice(56, 64), 56);\n\n return initPayload;\n }\n\n /* public encode(payload: Uint8Array) {\n let startTime = performance.now();\n let res = this.enc.encrypt(payload);\n let time = performance.now() - startTime;\n\n try {\n startTime = performance.now();\n let arr = this.encNew.encrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n let time2 = performance.now() - startTime;\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n }\n\n public decode(payload: Uint8Array) {\n let res = this.dec.encrypt(payload);\n\n try {\n let arr = this.decNew.decrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n } */\n\n private _process = (data: Uint8Array, operation: 'encrypt' | 'decrypt') => {\n return cryptoMessagePort.invokeCryptoNew({\n method: 'aes-ctr-process',\n args: [{id: this.id, data, operation}],\n transfer: [data.buffer]\n }) as Promise;\n };\n\n public encode(payload: Uint8Array) {\n /* return subtle.encrypt({\n name: 'AES-CTR',\n counter: this.encIv,\n length: 64\n },\n this.cryptoEncKey,\n payload\n ); */\n return this.process(payload, 'encrypt');\n }\n\n public decode(payload: Uint8Array) {\n return this.process(payload, 'decrypt');\n }\n\n public async release() {\n const idPromise = this.idPromise;\n if(idPromise === undefined) {\n return;\n }\n\n this.id = undefined;\n this.idPromise = undefined;\n\n const id = await idPromise;\n cryptoMessagePort.invokeCrypto('aes-ctr-destroy', id);\n }\n\n public destroy() {\n this.release();\n }\n\n // public encode(payload: Uint8Array) {\n // let res = this.encNew.encrypt(payload);\n // let bytes = new Uint8Array(bytesFromWordss(res));\n\n // return bytes;\n // }\n\n // public async decode(payload: Uint8Array) {\n // const counter = this.decIvCounter.counter.slice();\n // this.decIvCounter.increment();\n\n // const n: ArrayBuffer = await subtle.encrypt({\n // name: 'AES-CTR',\n // counter: counter,\n // length: 64\n // },\n // this.cryptoDecKey,\n // payload\n // );\n\n // const decoded = this.decNew.update(payload);\n\n // console.log('decode', bytesToHex(decoded), 'new', n, bytesToHex(new Uint8Array(n)));\n\n // return decoded;\n // }\n}\n","/*\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 { bytesFromHex, addPadding } from \"../../bin_utils\";\nimport {Codec} from './codec';\n\nclass AbridgedPacketCodec implements Codec {\n public tag = 0xef;\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\n\n public encodePacket(data: Uint8Array) {\n const len = data.byteLength >> 2;\n let header: Uint8Array;\n if(len < 127) {\n header = new Uint8Array([len]);\n } else { // Length: payload length, divided by four, and encoded as 3 length bytes (little endian)\n // header = new Uint8Array([0x7f, ...addPadding(bytesFromHex(len.toString(16)).reverse(), 3, true)/* .reverse() */]);\n header = new Uint8Array([0x7f, len & 0xFF, (len >> 8) & 0xFF, (len >> 16) & 0xFF]);\n // console.log('got nobody cause im braindead', header, len);\n }\n\n return header.concat(data);\n // return new Uint8Array([...header, ...data]);\n }\n\n public readPacket(data: Uint8Array) {\n let length = data[0];\n if(length >= 127) { // 0x7f\n length = data[1] | (data[2] << 8) | (data[3] << 16);\n\n return data.slice(4, length << 2 + 1); // need +1\n }\n\n return data.slice(1, length << 2 + 1); // need +1\n }\n}\n\nexport default new AbridgedPacketCodec();\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../../config/modes';\nimport {logger, LogTypes} from '../../logger';\nimport MTPNetworker from '../networker';\nimport Obfuscation from './obfuscation';\nimport MTTransport, {MTConnection, MTConnectionConstructable} from './transport';\n// import intermediatePacketCodec from './intermediate';\nimport abridgedPacketCodec from './abridged';\n// import paddedIntermediatePacketCodec from './padded';\nimport {ConnectionStatus} from '../connectionStatus';\n\n \nimport transportController from './controller';\nimport bytesToHex from '../../../helpers/bytes/bytesToHex';\n// import networkStats from '../networkStats';\nimport ctx from '../../../environment/ctx';\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = abridgedPacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n private releasingPending: boolean;\n\n // private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(\n private Connection: MTConnectionConstructable,\n private dcId: number,\n private url: string,\n private logSuffix: string,\n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connect();\n }\n\n private onOpen = async() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = await this.obfuscation.init(this.codec);\n if(!this.connected) {\n return;\n }\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n }/* else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n } */\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = async(buffer: ArrayBuffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n\n let data = await this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n // this.pending = this.pending.filter((p) => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then((response) => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n // this.releasePending();\n }).catch((err) => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n // this.dd();\n return;\n }\n\n // console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', bytesToHex(data));\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n\n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n\n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = ctx.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n\n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n if(this.obfuscation) {\n this.obfuscation.destroy();\n }\n\n this.pending.forEach((pending) => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n public changeUrl(url: string) {\n if(this.url === url) {\n return;\n }\n\n this.url = url;\n this.forceReconnect();\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n // this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n // this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = /* this.connected ? this.encodeBody(body) : */undefined;\n\n // return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending(/* tt = false */) {\n if(!this.connected || this.releasingPending) {\n // this.connect();\n return;\n }\n\n this.releasingPending = true;\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n // this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n let sent = false;\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n if(!pending) {\n break;\n }\n\n const {body, bodySent} = pending;\n if(body && !bodySent) {\n // this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n // if(!encoded) {\n // encoded = pending.encoded = this.encodeBody(body);\n // }\n\n const encoded = pending.encoded ??= await this.encodeBody(body);\n if(!this.connected) {\n break;\n }\n\n // networkStats.addSent(this.dcId, encoded.byteLength);\n this.connection.send(encoded);\n\n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n sent = true;\n // delete pending.body;\n }\n }\n\n this.releasingPending = undefined;\n\n if(this.pending.length && sent) {\n this.releasePending();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport MTTransport, {MTConnectionConstructable} from './transports/transport';\nimport Modes from '../../config/modes';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\n\n \nimport HTTP from './transports/http';\n \n\n \nimport Socket from './transports/websocket';\nimport TcpObfuscated from './transports/tcpObfuscated';\nimport {IS_WEB_WORKER} from '../../helpers/context';\nimport {DcId} from '../../types';\nimport {getEnvironment} from '../../environment/utils';\n\n \n \n \n\n \n\nexport type TransportType = 'websocket' | 'https' | 'http';\nexport type ConnectionType = 'client' | 'download' | 'upload';\ntype Servers = {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTTransport[]\n }\n }\n};\n\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\nconst PREMIUM_SUFFIX = '_premium';\n\nexport function getTelegramConnectionSuffix(connectionType: ConnectionType) {\n return connectionType === 'client' ? '' : '-1';\n}\n\n \nexport function constructTelegramWebSocketUrl(dcId: DcId, connectionType: ConnectionType, premium?: boolean) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const path = connectionType !== 'client' ? 'apiws' + TEST_SUFFIX + (premium ? PREMIUM_SUFFIX : '') : ('apiws' + TEST_SUFFIX);\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\n\n return chosenServer;\n}\n \n\nexport class DcConfigurator {\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n\n private dcOptions = Modes.test ?\n [\n {id: 1, host: '149.154.175.10', port: 80},\n {id: 2, host: '149.154.167.40', port: 80},\n {id: 3, host: '149.154.175.117', port: 80}\n ] :\n [\n {id: 1, host: '149.154.175.50', port: 80},\n {id: 2, host: '149.154.167.50', port: 80},\n {id: 3, host: '149.154.175.100', port: 80},\n {id: 4, host: '149.154.167.91', port: 80},\n {id: 5, host: '149.154.171.5', port: 80}\n ];\n\n public chosenServers: Servers = {} as any;\n\n \n private transportSocket = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n const chosenServer = constructTelegramWebSocketUrl(dcId, connectionType, premium);\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\n\n let oooohLetMeLive: MTConnectionConstructable;\n \n oooohLetMeLive = Socket;\n \n \n \n\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\n };\n \n\n \n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n let chosenServer: string;\n if(Modes.ssl || !Modes.http) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const subdomain = this.sslSubdomains[dcId - 1] + suffix;\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n } else {\n for(const dcOption of this.dcOptions) {\n if(dcOption.id === dcId) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n }\n\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n return new HTTP(dcId, chosenServer, logSuffix);\n };\n \n\n public chooseServer(\n dcId: DcId,\n connectionType: ConnectionType = 'client',\n transportType: TransportType = Modes.transport,\n reuse = true,\n premium?: boolean\n ) {\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\n connectionType = 'client';\n } */\n\n if(!this.chosenServers.hasOwnProperty(transportType)) {\n this.chosenServers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const servers = this.chosenServers[transportType][connectionType];\n\n if(!(dcId in servers)) {\n servers[dcId] = [];\n }\n\n const transports = servers[dcId];\n\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\n let transport: MTTransport;\n\n \n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, premium);\n \n \n \n \n \n\n if(!transport) {\n console.error('No chosenServer!', dcId);\n return null;\n }\n\n if(reuse) {\n transports.push(transport);\n }\n\n return transport;\n }\n\n return transports[0];\n }\n\n public static removeTransport(obj: any, transport: T) {\n for(const transportType in obj) {\n // @ts-ignore\n for(const connectionType in obj[transportType]) {\n // @ts-ignore\n for(const dcId in obj[transportType][connectionType]) {\n // @ts-ignore\n const transports: T[] = obj[transportType][connectionType][dcId];\n indexOfAndSplice(transports, transport);\n }\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../config/app';\nimport deferredPromise from '../../../helpers/cancellablePromise';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport pause from '../../../helpers/schedulers/pause';\nimport {TransportType, DcConfigurator} from '../dcConfigurator';\nimport type HTTP from './http';\nimport type TcpObfuscated from './tcpObfuscated';\nimport MTTransport from './transport';\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n private dcConfigurator: DcConfigurator;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n // setTimeout(() => {\n // this.waitForWebSocket();\n // }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const dcConfigurator = this.dcConfigurator ??= new DcConfigurator();\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => {\n if(websocketPromise.isFulfilled || websocketPromise.isRejected) {\n return;\n }\n\n if(socket.connection) {\n socket.connection.close();\n }\n\n websocketPromise.resolve(false);\n }, timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n\n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\n * 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, {CancellablePromise} from '../../../../helpers/cancellablePromise';\nimport type {StoragesResults} from './loadStorages';\n\nconst RESET_STORAGES_PROMISE: CancellablePromise> = deferredPromise();\nexport default RESET_STORAGES_PROMISE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {CryptoMessagePort} from '../crypto/cryptoMessagePort';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport type {ApiManager} from '../mtproto/apiManager';\nimport type {Authorizer} from '../mtproto/authorizer';\nimport type {DcConfigurator} from '../mtproto/dcConfigurator';\nimport type {NetworkerFactory} from '../mtproto/networkerFactory';\nimport type {PasswordManager} from '../mtproto/passwordManager';\nimport type {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport type {TimeManager} from '../mtproto/timeManager';\nimport type {RootScope} from '../rootScope';\nimport type DialogsStorage from '../storages/dialogs';\nimport type FiltersStorage from '../storages/filters';\nimport type PeersStorage from '../storages/peers';\nimport type ThumbsStorage from '../storages/thumbs';\nimport type {ApiUpdatesManager} from './apiUpdatesManager';\nimport type {AppAvatarsManager} from './appAvatarsManager';\nimport type {AppCallsManager} from './appCallsManager';\nimport type {AppChatsManager} from './appChatsManager';\nimport type {AppDocsManager} from './appDocsManager';\nimport type {AppDraftsManager} from './appDraftsManager';\nimport type {AppEmojiManager} from './appEmojiManager';\nimport type {AppGroupCallsManager} from './appGroupCallsManager';\nimport type {AppInlineBotsManager} from './appInlineBotsManager';\nimport type {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {AppNotificationsManager} from './appNotificationsManager';\nimport type AppPaymentsManager from './appPaymentsManager';\nimport type {AppPeersManager} from './appPeersManager';\nimport type {AppPhotosManager} from './appPhotosManager';\nimport type {AppPollsManager} from './appPollsManager';\nimport type {AppPrivacyManager} from './appPrivacyManager';\nimport type {AppProfileManager} from './appProfileManager';\nimport type {AppReactionsManager} from './appReactionsManager';\nimport type {AppStateManager} from './appStateManager';\nimport type {AppStickersManager} from './appStickersManager';\nimport type {AppStoragesManager} from './appStoragesManager';\nimport type {AppUsersManager} from './appUsersManager';\nimport type AppWebDocsManager from './appWebDocsManager';\nimport type {AppWebPagesManager} from './appWebPagesManager';\nimport type AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport type {AppManagers} from './managers';\n\nexport class AppManager {\n protected appPeersManager: AppPeersManager;\n protected appChatsManager: AppChatsManager;\n protected appDocsManager: AppDocsManager;\n protected appPhotosManager: AppPhotosManager;\n protected appPollsManager: AppPollsManager;\n protected appUsersManager: AppUsersManager;\n protected appWebPagesManager: AppWebPagesManager;\n protected appDraftsManager: AppDraftsManager;\n protected appProfileManager: AppProfileManager;\n protected appNotificationsManager: AppNotificationsManager;\n protected apiUpdatesManager: ApiUpdatesManager;\n protected appAvatarsManager: AppAvatarsManager;\n protected appGroupCallsManager: AppGroupCallsManager;\n protected appCallsManager: AppCallsManager;\n protected appReactionsManager: AppReactionsManager;\n protected appMessagesManager: AppMessagesManager;\n protected appMessagesIdsManager: AppMessagesIdsManager;\n protected appPrivacyManager: AppPrivacyManager;\n protected appInlineBotsManager: AppInlineBotsManager;\n protected appStickersManager: AppStickersManager;\n protected referenceDatabase: ReferenceDatabase;\n protected appEmojiManager: AppEmojiManager;\n protected dialogsStorage: DialogsStorage;\n protected filtersStorage: FiltersStorage;\n protected apiManager: ApiManager;\n // protected apiManager: ApiManagerProxy;\n protected passwordManager: PasswordManager;\n protected cryptoWorker: CryptoMessagePort;\n protected apiFileManager: ApiFileManager;\n protected peersStorage: PeersStorage;\n protected thumbsStorage: ThumbsStorage;\n protected networkerFactory: NetworkerFactory;\n protected rootScope: RootScope;\n protected authorizer: Authorizer;\n protected dcConfigurator: DcConfigurator;\n protected timeManager: TimeManager;\n protected appStoragesManager: AppStoragesManager;\n protected appStateManager: AppStateManager;\n protected appWebDocsManager: AppWebDocsManager;\n protected appPaymentsManager: AppPaymentsManager;\n protected appAttachMenuBotsManager: AppAttachMenuBotsManager;\n\n public clear: (init?: boolean) => void;\n\n public setManagers(managers: AppManagers) {\n Object.assign(this, managers);\n // this.after();\n }\n}\n","/*\n * 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 '../../../../layer';\nimport type{Dialog} from '../../appMessagesManager';\nimport type{User} from '../../appUsersManager';\nimport type {StoragesStorages} from './createStorages';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\nimport {Awaited} from '../../../../types';\nimport {logger} from '../../../logger';\nimport RESET_STORAGES_PROMISE from './resetStoragesPromise';\n\nexport type StoragesResults = Awaited>;\n\nasync function loadStoragesInner(storages: StoragesStorages) {\n const recordPromise = recordPromiseBound(logger('STORAGES-LOADER'));\n const storagesKeys = Object.keys(storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map((key) => {\n const promise = storages[key].getAll();\n return recordPromise(promise, 'storage ' + (key as any as string));\n });\n\n const storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n const arr = await Promise.all(storagesPromises);\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n const resetStorages = await RESET_STORAGES_PROMISE;\n if(resetStorages.size) {\n for(const key of resetStorages) {\n storagesResults[key].length = 0;\n }\n\n resetStorages.clear();\n }\n\n return storagesResults;\n}\n\nlet promise: ReturnType;\nexport default function loadStorages(storages: StoragesStorages) {\n return promise ??= loadStoragesInner(storages);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger} from '../logger';\nimport {AppManager} from './manager';\nimport createStorages from './utils/storages/createStorages';\nimport loadStorages from './utils/storages/loadStorages';\n\nexport class AppStoragesManager extends AppManager {\n private storages: ReturnType;\n\n // private loadPromise: CancellablePromise;\n\n private log: ReturnType;\n\n constructor() {\n super();\n\n this.log = logger('STORAGES');\n this.storages = createStorages();\n // this.loadPromise = deferredPromise();\n }\n\n public loadStorages() {\n return loadStorages(this.storages);\n // loadStorages(this.storages).then((storagesResults) => {\n // this.loadPromise.resolve(storagesResults);\n // });\n\n // return this.loadPromise;\n }\n\n // public setStoragesResults(storagesResults: StoragesResults) {\n // this.loadPromise.resolve(storagesResults);\n // }\n\n public async loadStorage(name: T) {\n return this.loadStorages().then((storagesResults) => {\n return {\n storage: this.storages[name],\n results: storagesResults[name]\n };\n });\n }\n}\n","/*\n * 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 '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type {User} from '../../appUsersManager';\nimport DATABASE_STATE from '../../../../config/databases/state';\nimport AppStorage from '../../../storage';\n\nexport type StoragesStorages = {\n users: AppStorage, typeof DATABASE_STATE>,\n chats: AppStorage, typeof DATABASE_STATE>,\n dialogs: AppStorage, typeof DATABASE_STATE>\n};\n\nexport default function createStorages() {\n const names: (keyof StoragesStorages)[] = ['users', 'chats', 'dialogs'];\n const storages: StoragesStorages = {} as any;\n for(const name of names) {\n // @ts-ignore\n storages[name] = new AppStorage(DATABASE_STATE, name);\n }\n\n return storages;\n}\n","/*\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 {AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\nexport class PasswordManager extends AppManager {\n public getState(): Promise {\n return this.apiManager.invokeApi('account.getPassword').then((result) => {\n return result;\n });\n }\n\n public updateSettings(settings: {\n hint?: string,\n email?: string,\n newPassword?: string,\n currentPassword?: string\n } = {}) {\n // state = Object.assign({}, state);\n // state.new_algo = Object.assign({}, state.new_algo);\n\n return this.getState().then((state) => {\n let currentHashPromise: Promise;\n let newHashPromise: Promise;\n const params: AccountUpdatePasswordSettings = {\n password: null,\n new_settings: {\n _: 'account.passwordInputSettings',\n hint: settings.hint,\n email: settings.email\n }\n };\n\n if(settings.currentPassword) {\n currentHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\n } else {\n currentHashPromise = Promise.resolve({\n _: 'inputCheckPasswordEmpty'\n });\n }\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\n randomize(salt1);\n salt1.set(newAlgo.salt1, 0);\n newAlgo.salt1 = salt1;\n\n if(settings.newPassword) {\n newHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\n } else {\n newHashPromise = Promise.resolve(new Uint8Array());\n }\n\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.password = hashes[0];\n params.new_settings.new_algo = newAlgo;\n params.new_settings.new_password_hash = hashes[1];\n\n return this.apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n });\n }\n\n public getInputCheckPassword(password: string, state: AccountPassword) {\n return this.cryptoWorker.invokeCrypto('computeSRP', password, state, false) as Promise;\n }\n\n public check(password: string, state: AccountPassword, options: any = {}) {\n return this.getInputCheckPassword(password, state).then((inputCheckPassword) => {\n // console.log('SRP', inputCheckPassword);\n return this.apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\n }, options).then((auth) => {\n if(auth._ === 'auth.authorization') {\n this.apiManager.setUser(auth.user);\n }\n\n return auth;\n });\n });\n }\n\n public confirmPasswordEmail(code: string) {\n return this.apiManager.invokeApi('account.confirmPasswordEmail', {code});\n }\n\n public resendPasswordEmail() {\n return this.apiManager.invokeApi('account.resendPasswordEmail');\n }\n\n public cancelPasswordEmail() {\n return this.apiManager.invokeApi('account.cancelPasswordEmail');\n }\n\n /* public requestRecovery(options: any = {}) {\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n }\n\n public recover(code: any, options: any = {}) {\n return apiManager.invokeApi('auth.recoverPassword', {\n code\n }, options);\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Photo} from '../../layer';\nimport {logger} from '../logger';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {AppManager} from '../appManagers/manager';\nimport makeError from '../../helpers/makeError';\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions | ReferenceContext.referenceContextUserFull | ReferenceContext.referenceContextCustomEmoji | ReferenceContext.referenceContextAttachMenuBotIcon;\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 export type referenceContextUserFull = {\n type: 'userFull',\n userId: UserId\n };\n\n export type referenceContextCustomEmoji = {\n type: 'customEmoji',\n docId: DocId\n };\n\n export type referenceContextAttachMenuBotIcon = {\n type: 'attachMenuBotIcon',\n botId: BotId\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n// type ReferenceBytes = Uint8Array;\n\nexport class ReferenceDatabase extends AppManager {\n private contexts: Map = new Map();\n // private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise;\n\n // constructor() {\n // super();\n\n // apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n // const originalPayload = task.payload;\n\n // assumeType(task);\n // task.originalPayload = originalPayload;\n\n // this.refreshReference(originalPayload).then((bytes) => {\n // task.payload = bytes;\n // }, (err) => {\n // task.error = err;\n // }).then(() => apiManager.postMessage(task));\n // });\n // }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n\n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = this.appMessagesManager.reloadMessages(context.peerId, context.messageId, true);\n break;\n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || this.appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n case 'userFull': {\n promise = Promise.resolve(this.appProfileManager.getProfile(context.userId, true));\n break;\n }\n\n case 'customEmoji': {\n promise = this.appEmojiManager.getCustomEmojiDocuments([context.docId]);\n break;\n }\n\n case 'attachMenuBotIcon': {\n promise = this.appAttachMenuBotsManager.getAttachMenuBot(context.botId, true) as any;\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 makeError('NO_NEW_CONTEXT');\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n","export default function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key)) {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n // if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n // }\n }\n\n return wasObject;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageAction, MessageMedia} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getPeerIdsFromMessage(message: Message.message | Message.messageService) {\n const peerIds: number[] = [\n message.fromId,\n message.viaBotId,\n (message as Message.message).fwdFromId\n ];\n\n const media = (message as Message.message).media;\n if(media) {\n const contactUserId = (media as MessageMedia.messageMediaContact).user_id;\n if(contactUserId !== undefined) {\n peerIds.push(contactUserId.toPeerId());\n }\n\n const results = (media as MessageMedia.messageMediaPoll).results;\n const recentVoters = results?.recent_voters;\n if(recentVoters?.length) {\n peerIds.push(...recentVoters.map((userId) => userId.toPeerId()));\n }\n }\n\n const recentReactions = ((message as Message.message).reactions)?.recent_reactions;\n if(recentReactions?.length) {\n peerIds.push(...recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n const action = (message as Message.messageService).action;\n if(action) {\n const userIds: UserId[] = [\n ...((action as MessageAction.messageActionChatAddUser).users || []),\n (action as MessageAction.messageActionChatDeleteUser).user_id,\n (action as MessageAction.messageActionChatJoinedByLink).inviter_id\n ];\n peerIds.push(...userIds.filter(Boolean).map((userId) => userId.toPeerId()));\n\n const chatIds: ChatId[] = [\n (action as MessageAction.messageActionChatMigrateTo).channel_id,\n (action as MessageAction.messageActionChannelMigrateFrom).chat_id\n ];\n peerIds.push(...chatIds.filter(Boolean).map((chatId) => chatId.toPeerId(true)));\n }\n\n const recentRepliers = ((message as Message.message).replies)?.recent_repliers;\n if(recentRepliers?.length) {\n peerIds.push(...recentRepliers.map((reply) => getPeerId(reply)));\n }\n\n return new Set(peerIds.filter(Boolean));\n}\n","export default function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\n // const perf = performance.now();\n const props = {writable: true, configurable: true};\n const out: {[name in keyof T]?: typeof props} = {};\n names.forEach((name) => {\n if(!obj.hasOwnProperty(name)) {\n out[name] = props;\n }\n });\n Object.defineProperties(obj, out);\n // console.log('defineNotNumerableProperties time:', performance.now() - perf);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ForumTopic} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type getDialogIndexKey from './getDialogIndexKey';\n\nexport default function setDialogIndex(\n dialog: Dialog | ForumTopic.forumTopic,\n indexKey: ReturnType,\n index: number\n) {\n return (dialog as Dialog)[indexKey] = index;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {Chat, ForumTopic as MTForumTopic, DialogPeer, Message, MessageAction, MessageMedia, MessagesForumTopics, MessagesPeerDialogs, Update} from '../../layer';\nimport type {Dialog, ForumTopic, MyMessage} from '../appManagers/appMessagesManager';\nimport tsNow from '../../helpers/tsNow';\nimport SearchIndex from '../searchIndex';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport {MyDialogFilter} from './filters';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport {MaybePromise, NoneToVoidFunction} from '../../types';\nimport ctx from '../../environment/ctx';\nimport AppStorage from '../storage';\nimport type DATABASE_STATE from '../../config/databases/state';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../appManagers/utils/messageId/generateMessageId';\nimport {AppManager} from '../appManagers/manager';\nimport getDialogIndexKey from '../appManagers/utils/dialogs/getDialogIndexKey';\nimport isObject from '../../helpers/object/isObject';\nimport getDialogIndex from '../appManagers/utils/dialogs/getDialogIndex';\nimport getPeerIdsFromMessage from '../appManagers/utils/messages/getPeerIdsFromMessage';\nimport {AppStoragesManager} from '../appManagers/appStoragesManager';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport setDialogIndex from '../appManagers/utils/dialogs/setDialogIndex';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {BroadcastEvents} from '../rootScope';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport callbackify from '../../helpers/callbackify';\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: (Dialog | ForumTopic)[],\n id: number,\n unreadMessagesCount: number,\n unreadPeerIds: Set,\n unreadUnmutedPeerIds: Set,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: REAL_FOLDER_ID = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage extends AppManager {\n private storage: AppStoragesManager['storages']['dialogs'];\n\n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n private forumTopics: Map,\n deletedTopics: Set,\n getTopicPromises: Map>,\n getTopicsPromise?: Promise\n }>;\n\n protected after() {\n this.clear(true);\n\n this.rootScope.addEventListener('language_change', () => {\n const peerId = this.appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n this.rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n // const indexKeys: ReturnType[] = [];\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n\n // indexKeys.push(this.getDialogIndexKey(+filterId));\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n // for(const indexKey of indexKeys) {\n // delete dialog[indexKey];\n // }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n this.rootScope.addEventListener('filter_update', onFilterUpdate);\n this.rootScope.addEventListener('filter_new', onFilterUpdate);\n\n this.rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n this.rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.processDialogForFilters(dialog);\n this.prepareDialogUnreadCountModifying(dialog)();\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if((chat as Chat.chat).pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updateChannelPinnedTopic: this.onUpdateChannelPinnedTopic,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n\n updateChannelPinnedTopics: this.onUpdateChannelPinnedTopics\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('dialogs')\n ]).then(([state, {results: dialogs, storage}]) => {\n this.storage = storage;\n this.dialogs = this.storage.getCache();\n\n for(const folderId of REAL_FOLDERS) {\n const order = state.pinnedOrders[folderId];\n if(!order) {\n continue;\n }\n\n const _order = this.getPinnedOrders(folderId);\n _order.splice(0, _order.length, ...order);\n }\n\n if(dialogs.length) {\n AppStorage.freezeSaving(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n\n if(dialogs.length) {\n this.appDraftsManager.addMissedDialogs();\n }\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(!dialog) {\n continue;\n }\n\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 21; ++i) {\n const indexKey: ReturnType = `index_${i}` as any;\n delete dialog[indexKey];\n }\n // delete dialog.indexes;\n\n this.saveDialog({\n dialog,\n ignoreOffsetDate: true\n });\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!message) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n const isForum = this.isFilterIdForForum(folderId);\n\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[FOLDER_ID_ALL] = loaded;\n this.allDialogsLoaded[FOLDER_ID_ARCHIVE] = loaded;\n } else {\n if(isForum) {\n defineNotNumerableProperties(this.allDialogsLoaded, [folderId]);\n }\n\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(isForum) {\n return;\n }\n\n if(Array.from(REAL_FOLDERS).every((folderId) => this.allDialogsLoaded[folderId])) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.saveAllDialogsLoaded();\n }\n\n private saveAllDialogsLoaded() {\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.storage.clear();\n\n this.allDialogsLoaded = {};\n this.saveAllDialogsLoaded();\n\n // * clear not numerable properties\n this.pinnedOrders = Object.assign({}, this.pinnedOrders);\n for(const folderId of REAL_FOLDERS) {\n this.resetPinnedOrder(folderId);\n }\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n this.pinnedOrders = {};\n for(const folderId of REAL_FOLDERS) {\n this.pinnedOrders[folderId] = [];\n }\n }\n\n this.forumTopics = new Map();\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 | ForumTopic, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.getPinnedOrders(folderId), this.isFilterIdForForum(folderId) ? (dialog as ForumTopic).id : 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.getPinnedOrders(folderId).length = 0;\n }\n\n public getPinnedOrders(folderId: number) {\n let orders = this.pinnedOrders[folderId];\n if(!orders && this.isFilterIdForForum(folderId)) {\n defineNotNumerableProperties(this.pinnedOrders, [folderId]);\n orders = this.pinnedOrders[folderId] = [];\n }\n\n return orders;\n }\n\n public isDialogPinned(peerId: PeerId, folderId: number) {\n const filter = this.filtersStorage.getFilter(folderId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(peerId) !== -1;\n } else {\n isPinned = !!this.getDialogOnly(peerId).pFlags.pinned;\n }\n\n return isPinned;\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(...Array.from(REAL_FOLDERS).sort((a, b) => a - b));\n }\n\n return offsetDate;\n }\n\n private generateFolder(id: number) {\n const folder: Folder = {\n dialogs: [],\n id,\n unreadMessagesCount: 0,\n unreadPeerIds: new Set(),\n unreadUnmutedPeerIds: new Set()\n };\n\n defineNotNumerableProperties(folder, ['dispatchUnreadTimeout']);\n\n return folder;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ??= this.generateFolder(id);\n }\n\n public isFilterIdForForum(filterId: number) {\n return filterId && filterId < 0;\n }\n\n public getFilterIdForForum(forumTopic: ForumTopic) {\n return forumTopic.peerId;\n }\n\n public getDialogKey(dialog: Dialog | ForumTopic) {\n return this.isTopic(dialog) ? dialog.id : dialog.peerId;\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Folder['dialogs'] {\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 if(this.isFilterIdForForum(id)) {\n return skipMigrated ? folder.dialogs.filter((forumTopic) => !(forumTopic as ForumTopic).pFlags.hidden) : folder.dialogs;\n }\n\n return skipMigrated ? folder.dialogs.filter((dialog) => (dialog as Dialog).migratedTo === undefined) : folder.dialogs;\n }\n\n public getNextDialog(currentPeerId: PeerId, next: boolean, filterId: number) {\n const folder = this.getFolderDialogs(filterId, true);\n let dialog: Folder['dialogs'][0];\n if(!currentPeerId) {\n if(next) {\n dialog = folder[0];\n }\n } else {\n const idx = folder.findIndex((dialog) => dialog.peerId === currentPeerId);\n if(idx !== -1) {\n const nextIndex = next ? idx + 1 : idx - 1;\n dialog = folder[nextIndex];\n }\n }\n\n return dialog;\n }\n\n public getDialogIndexKeyByFilterId(filterId: number) {\n if(this.isFilterIdForForum(filterId)) return getDialogIndexKey();\n if(REAL_FOLDERS.has(filterId)) return getDialogIndexKey(filterId as REAL_FOLDER_ID);\n const filter = this.filtersStorage.getFilter(filterId);\n return getDialogIndexKey(filter.localId);\n }\n\n private isDialogUnmuted(dialog: Dialog | ForumTopic) {\n return !this.appNotificationsManager.isPeerLocalMuted({peerId: dialog.peerId, respectType: true, threadId: this.isTopic(dialog) ? (dialog as ForumTopic).id : undefined});\n }\n\n public getFolderUnreadCount(filterId: number) {\n const folder = this.getFolder(filterId);\n return {unreadUnmutedCount: folder.unreadUnmutedPeerIds.size, unreadCount: folder.unreadPeerIds.size};\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n const arrays = Array.from(REAL_FOLDERS).map((folderId) => this.getFolderDialogs(folderId, skipMigrated));\n return [].concat(...arrays) as Dialog[];\n }\n\n private setDialogIndexInFilter(\n dialog: Dialog | ForumTopic,\n indexKey: ReturnType,\n filter?: MyDialogFilter\n ) {\n // if(this.isTopic(dialog)) {\n // return dialog['index_0'];\n // }\n\n let index: number;\n\n const isTopic = this.isTopic(dialog);\n const isRealFolder = isTopic || REAL_FOLDERS.has(filter.id);\n /* if(isRealFolder) {\n // index = getDialogIndex(dialog, indexKey);\n index = this.generateIndexForDialog(dialog, true);\n } else */if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIds = isTopic ?\n this.getPinnedOrders(this.getFilterIdForForum(dialog)) :\n filter.pinnedPeerIds;\n\n const pinnedKey = this.getDialogKey(dialog);\n const pinnedIndex = pinnedIds.indexOf(pinnedKey);\n\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(pinnedIds.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned || isRealFolder) {\n index = this.generateIndexForDialog(dialog, true, undefined, !isRealFolder);\n } else {\n index = getDialogIndex(dialog) ?? this.generateIndexForDialog(dialog, true);\n }\n }\n\n // if(!dialog.hasOwnProperty(indexKey)) {\n // defineNotNumerableProperties(dialog, [indexKey]);\n // }\n\n return setDialogIndex(dialog, indexKey, index);\n }\n\n public getDialog(peerId: PeerId, folderId?: number, topicId?: number, skipMigrated = true): [Folder['dialogs'][0], number] | [] {\n const folders: Folder['dialogs'][] = [];\n\n if(topicId) {\n folderId = peerId;\n // skipMigrated = false;\n }\n\n if(folderId === undefined) {\n folders.push(...Array.from(REAL_FOLDERS).map((folderId) => this.getFolder(folderId).dialogs as Dialog[]));\n } else {\n folders.push(this.getFolderDialogs(folderId, false) as Dialog[]);\n }\n\n const verify: (d: Folder['dialogs'][0]) => boolean = topicId ?\n (d) => (d as ForumTopic).id === topicId :\n (d) => (d as Dialog).peerId === peerId;\n for(const 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(verify(dialog)) {\n return [dialog, i - skipped];\n } else if(skipMigrated && ((dialog as ForumTopic).pFlags.hidden || (dialog as Dialog).migratedTo !== undefined)) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n public getDialogOrTopic(peerId: PeerId, topicId?: number) {\n return topicId ? this.getForumTopic(peerId, topicId) : this.dialogs[peerId];\n }\n\n public getDialogIndex(\n peerId: PeerId | Parameters[0],\n indexKey: ReturnType,\n topicId?: number\n ) {\n const dialog = isObject(peerId) ? peerId : this.getDialogOrTopic(peerId, topicId);\n return getDialogIndex(dialog, indexKey);\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n date ??= tsNow(true) + this.timeManager.getServerTimeOffset();\n return (date * 0x10000) + (isPinned ? 0 : (++this.dialogsNum & 0xFFFF));\n }\n\n // public makeFilterForTopics(id: number): MyDialogFilter {\n // return {\n // _: 'dialogFilter',\n // id,\n\n // };\n // }\n\n public isTopic(dialog: Dialog | ForumTopic): dialog is ForumTopic {\n return 'id' in dialog;\n }\n\n public processDialogForFilters(dialog: Dialog | ForumTopic, noIndex?: boolean) {\n // let perf = performance.now();\n if(this.isTopic(dialog)) {\n this.processDialogForFilter(dialog, undefined, noIndex);\n return;\n }\n\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter, noIndex);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(\n dialog: Dialog | ForumTopic,\n filter?: MyDialogFilter,\n noIndex?: boolean\n ) {\n const isTopic = this.isTopic(dialog);\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : filter.id;\n\n const indexKey = isTopic ? 'index_0' : this.getDialogIndexKeyByFilterId(folderId);\n const folder = this.getFolder(folderId);\n const dialogs = folder.dialogs;\n\n const cmp: (d: typeof dialog) => boolean = isTopic ?\n ((d: ForumTopic) => d.id === dialog.id) as any :\n ((d: Dialog) => d.peerId === dialog.peerId) as any;\n const wasIndex = dialogs.findIndex(cmp);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = this.getDialogIndex(wasDialog, indexKey);\n\n if(noIndex && folderId > FOLDER_ID_ARCHIVE) {\n noIndex = undefined;\n }\n\n const newDialogIndex = noIndex ? undefined : this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return false;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, (dialog) => this.getDialogIndex(dialog, indexKey), -1);\n }\n\n return true;\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog | ForumTopic) {\n const isTopic = this.isTopic(dialog);\n const callbacks: NoneToVoidFunction[] = [];\n\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id;\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog));\n\n if(!isTopic) {\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog));\n }\n }\n }\n\n return () => callbacks.forEach((callback) => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog | ForumTopic, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const wasUnmuted = this.isDialogUnmuted(dialog);\n\n if(toggle !== undefined) {\n const addMessagesCount = toggle ? wasUnreadCount : -wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!wasUnreadCount, wasUnreadCount && wasUnmuted, dialog);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const newUnmuted = this.isDialogUnmuted(dialog);\n\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!newUnreadCount, newUnreadCount && newUnmuted, dialog);\n };\n }\n\n public modifyFolderUnreadCount(\n folderId: number,\n addMessagesCount: number,\n toggleDialog: boolean,\n toggleUnmuted: boolean,\n dialog: Dialog | ForumTopic\n ) {\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n\n const key = this.getDialogKey(dialog);\n if(toggleDialog) {\n folder.unreadPeerIds.add(key);\n } else {\n folder.unreadPeerIds.delete(key);\n }\n\n if(toggleUnmuted) {\n folder.unreadUnmutedPeerIds.add(key);\n } else {\n folder.unreadUnmutedPeerIds.delete(key);\n }\n\n // if(this.isTopic(dialog)) {\n // return;\n // }\n\n folder.dispatchUnreadTimeout ??= ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n const _folder = {...folder};\n delete _folder.dialogs;\n this.rootScope.dispatchEvent('folder_unread', _folder);\n }, 0);\n }\n\n public generateIndexForDialog(\n dialog: Dialog | ForumTopic,\n justReturn?: boolean,\n message?: MyMessage,\n noPinnedOrderUpdate?: boolean\n ) {\n if(!justReturn/* && !isTopic */) {\n return;\n }\n\n const isTopic = this.isTopic(dialog);\n let topDate = 0, isPinned: boolean;\n if((dialog as ForumTopic).pFlags.hidden) { // general topic must be first\n topDate = this.generateDialogPinnedDateByIndex(0xFFF);\n isPinned = true;\n } else if(dialog.pFlags.pinned && !noPinnedOrderUpdate) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n message ||= this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n\n topDate = (message as Message.message)?.date || topDate;\n\n if(!isTopic) {\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n }\n\n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n topDate ||= tsNow(true);\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n const indexKey = getDialogIndexKey((dialog as Dialog).folder_id);\n setDialogIndex(dialog, indexKey, index);\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog | ForumTopic) {\n const isTopic = this.isTopic(dialog);\n const order = this.getPinnedOrders(isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id);\n\n const dialogKey = this.getDialogKey(dialog);\n let pinnedIndex = order.indexOf(dialogKey);\n if(pinnedIndex === -1) {\n order.unshift(dialogKey);\n pinnedIndex = 0;\n\n if(!isTopic) {\n this.savePinnedOrders();\n }\n }\n\n return this.generateDialogPinnedDateByIndex(order.length - 1 - 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 | ForumTopic) {\n if(this.isTopic(dialog)) {\n return;\n }\n\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getHistoryMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(message && !message.pFlags.is_outgoing/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n\n const peerIds = getPeerIdsFromMessage(message);\n this.peersStorage.requestPeersForKey(peerIds, `topMessage_${peerId}`);\n\n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.peersStorage.requestPeer(peerId, 'dialog');\n\n /* for(let id in this.filtersStorage.filters) {\n const filter = this.filtersStorage.filters[id];\n\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n\n }\n } */\n }\n\n public pushDialog({dialog, offsetDate, ignoreOffsetDate, saveGlobalOffset}: {\n dialog: Dialog | ForumTopic,\n offsetDate?: number,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const {folder_id, peerId} = dialog as Dialog;\n\n if(isTopic) {\n const forumTopics = this.getForumTopicsCache(peerId);\n forumTopics.topics.set(dialog.id, dialog);\n } else {\n this.dialogs[peerId] = dialog;\n }\n\n offsetDate ??= this.getDialogOffsetDate(dialog);\n\n // if(!isTopic) {\n this.processDialogForFilters(dialog);\n // }\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(!isTopic && 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 folderId = isTopic ? this.getFilterIdForForum(dialog) : folder_id;\n const savedOffsetDate = this.dialogsOffsetDate[folderId];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folderId)) {\n this.dropDialog(peerId, isTopic ? this.getDialogKey(dialog) : undefined, true);\n return;\n }\n\n this.dialogsOffsetDate[folderId] = offsetDate;\n }\n }\n\n this.setDialogToState(dialog);\n\n // if(pos === -1) {\n // this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n // }\n\n // const indexKey = getDialogIndexKey(folder_id);\n // /* const newPos = */insertInDescendSortedArray(dialogs, dialog, (dialog) => getDialogIndex(dialog, indexKey), -1);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialogFromFolders(peerId: PeerId, topicId?: number) {\n const foundDialog = this.getDialog(peerId, undefined, topicId, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n const filterId = topicId ?\n this.getFilterIdForForum(dialog as ForumTopic) :\n (dialog as Dialog).folder_id;\n\n // const folder = this.getFolder(filterId);\n // folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.getPinnedOrders(filterId), this.getDialogKey(dialog)) !== undefined;\n\n this.processDialogForFilters(dialog, true);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n }\n\n return foundDialog;\n }\n\n public dropDialog(peerId: PeerId, topicId?: number, keepLocal?: boolean) {\n const dialog = this.getDialogOrTopic(peerId, topicId);\n const foundDialog = this.dropDialogFromFolders(peerId, topicId);\n if(dialog) {\n if(!keepLocal) {\n if(topicId) {\n this.getForumTopicsCache(peerId).topics.delete(topicId);\n } else {\n delete this.dialogs[peerId];\n }\n }\n\n this.clearDialogFromState(dialog, keepLocal);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog | ForumTopic, keepLocal: boolean) {\n if(dialog._ === 'forumTopic') {\n return;\n }\n\n const {peerId} = dialog;\n this.peersStorage.requestPeersForKey([], `topMessage_${peerId}`);\n this.peersStorage.releasePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId, topicId?: number) {\n const dropped = this.dropDialog(peerId, topicId);\n if(dropped.length) {\n this.rootScope.dispatchEvent('dialog_drop', dropped[0]);\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId, topicId?: number) {\n this.dropDialogWithEvent(peerId, topicId);\n this.rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(result: MessagesPeerDialogs | MessagesForumTopics, peerId?: PeerId) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n const isForum = result._ === 'messages.forumTopics';\n const items = (result as MessagesPeerDialogs).dialogs || (result as MessagesForumTopics).topics;\n if(!isForum) {\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(result.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n result.dialogs.splice(idx, 1);\n }\n });\n } else {\n this.processTopics(peerId, result);\n }\n\n assumeType(items);\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.appMessagesManager.saveMessages(result.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = (peerId: PeerId) => {\n let cache = updatedDialogs.get(peerId);\n if(!cache) {\n updatedDialogs.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n items.forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMid = dialog.top_message;\n\n const topPendingMid = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMid) {\n const topPendingMessage = this.appMessagesManager.getMessageByPeer(peerId, topPendingMid) as MyMessage;\n const topMessage = this.appMessagesManager.getMessageByPeer(peerId, topMid) as MyMessage;\n if(!topMid || (topPendingMessage && (!topMessage || topPendingMessage?.date > topMessage?.date))) {\n dialog.top_message = topMid = topPendingMid;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMid;\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(topMid || dialog.draft?._ === 'draftMessage') {\n if(this.saveDialog({dialog})) {\n const cache = getUpdateCache(peerId);\n\n if(isForum) {\n (cache.topics ??= new Map()).set(\n (dialog as ForumTopic).id,\n dialog as ForumTopic\n );\n } else {\n cache.dialog = dialog as Dialog;\n }\n }\n } else {\n this.dropDialogWithEvent(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n }\n\n const key = this.appMessagesManager.getUpdateAfterReloadKey(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[key];\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[key];\n }\n }\n });\n\n if(updatedDialogs.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n private getDialogOffsetDate(dialog: Dialog | ForumTopic) {\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n return message?.date || 0;\n }\n\n public canSaveDialogByPeerId(peerId: PeerId) {\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(\n chat._ === 'channelForbidden' ||\n // || chat._ === 'chatForbidden'\n (chat as Chat.chat).pFlags.left\n // || (chat as any).pFlags.kicked\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog({\n dialog,\n folderId,\n ignoreOffsetDate,\n saveGlobalOffset\n }: {\n dialog: Dialog | ForumTopic,\n folderId?: REAL_FOLDER_ID,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const isDialog = !isTopic;\n\n const topicId = isTopic ? dialog.id = generateMessageId(dialog.id) : undefined;\n if(!isTopic) {\n folderId ??= dialog.folder_id ?? FOLDER_ID_ALL;\n }\n\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return false;\n }\n\n if(!isTopic && dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n\n if(isDialog && !this.canSaveDialogByPeerId(peerId)) {\n return false;\n }\n\n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(isDialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n\n const wasDialogBefore = this.getDialogOrTopic(peerId, topicId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = generateMessageId(dialog.top_message);// dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(isDialog && !channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\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 === getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(isDialog && dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? (wasDialogBefore as typeof dialog).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, threadId: topicId, draft: dialog.draft});\n dialog.peerId = peerId;\n // dialog.indexes ??= {} as any;\n\n // if(dialog.peerId === -) {\n // debugger;\n // }\n\n // Because we saved message without dialog present\n if(message && message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, topicId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n threadId: isTopic ? dialog.id : undefined,\n settings: dialog.notify_settings\n });\n\n if(isDialog && channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n if(wasDialogBefore) {\n // fix unread count\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(wasDialogBefore);\n safeReplaceObject(wasDialogBefore, dialog);\n releaseUnreadCount();\n }\n\n this.pushDialog({\n dialog,\n offsetDate: message?.date,\n ignoreOffsetDate,\n saveGlobalOffset\n });\n\n if(isTopic) {\n this.processTopicUpdate(dialog, wasDialogBefore as ForumTopic);\n }\n\n return true;\n }\n\n public processTopicUpdate(topic: ForumTopic, oldTopic?: ForumTopic) {\n if(!oldTopic) {\n return;\n }\n\n const {peerId, id: threadId} = topic;\n const isIconChanged = topic.icon_emoji_id !== (oldTopic as ForumTopic).icon_emoji_id;\n const isTitleChanged = topic.title !== (oldTopic as ForumTopic).title;\n const isChanged = isIconChanged || isTitleChanged;\n\n if(isIconChanged) {\n this.rootScope.dispatchEvent('avatar_update', {peerId, threadId});\n }\n\n if(isChanged) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId, threadId});\n }\n }\n\n public getDialogs(options: {\n query?: string,\n offsetIndex?: number,\n limit?: number,\n filterId?: number,\n skipMigrated?: boolean\n }): MaybePromise<{\n dialogs: Folder['dialogs'],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }> {\n const {\n query = '',\n offsetIndex,\n limit = 20,\n filterId = FOLDER_ID_ALL,\n skipMigrated = false\n } = options;\n\n const isForum = this.isFilterIdForForum(filterId);\n if(!isForum && !REAL_FOLDERS.has(filterId)) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.filtersStorage.reloadMissingPeerIds(filterId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n return Promise.all(promises).then(() => {\n return this.getDialogs(options);\n });\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId/* : REAL_FOLDER_ID */ =\n (!REAL_FOLDERS.has(filterId) || this.getOffsetDate(filterId)) && !isForum ?\n GLOBAL_FOLDER_ID :\n filterId/* as REAL_FOLDER_ID */;\n let curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filterId);\n\n if(query && !isForum) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== filterId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = filterId;\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 === filterId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => this.getDialogIndex(d2, indexKey) - this.getDialogIndex(d1, indexKey));\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n };\n }\n\n return this.appMessagesManager.getTopMessages({limit, folderId: realFolderId}).then((result) => {\n // const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n // this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n }\n\n // * FORUMS SECTION\n\n public flushForumTopicsCache(peerId: PeerId) {\n const cache = this.forumTopics.get(peerId);\n if(!cache) {\n return;\n }\n\n const folder = this.folders[peerId];\n if(folder) {\n if(folder.dispatchUnreadTimeout) {\n clearTimeout(folder.dispatchUnreadTimeout);\n }\n\n delete this.allDialogsLoaded[peerId];\n delete this.pinnedOrders[peerId];\n delete this.dialogsOffsetDate[peerId];\n delete this.folders[peerId];\n }\n\n cache.topics.clear();\n\n // for permanent delete\n // this.forumTopics.delete(peerId);\n }\n\n public getForumTopicsCache(peerId: PeerId) {\n let forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n forumTopics = {\n topics: new Map(),\n deletedTopics: new Set(),\n getTopicPromises: new Map()\n };\n\n this.forumTopics.set(peerId, forumTopics);\n }\n\n return forumTopics;\n }\n\n public getForumTopicById(peerId: PeerId, topicId?: number): Promise {\n if(!this.appPeersManager.isForum(peerId)) {\n return Promise.reject(makeError('CHANNEL_FORUM_MISSING'));\n }\n\n const cache = this.getForumTopicsCache(peerId);\n let promise: CancellablePromise;\n if(topicId) {\n promise = cache.getTopicPromises.get(topicId);\n if(promise) {\n return promise;\n }\n\n if(cache.deletedTopics.has(topicId)) {\n return Promise.resolve(undefined);\n }\n\n cache.getTopicPromises.set(topicId, promise = deferredPromise());\n }\n\n cache.getTopicsPromise ??= pause(0).then(() => {\n const promises: {[topicId: number]: typeof promise} = {};\n const ids: number[] = [];\n for(const [topicId, promise] of cache.getTopicPromises) {\n promises[topicId] = promise;\n ids.push(getServerMessageId(topicId));\n }\n\n cache.getTopicPromises.clear();\n\n const fullfillLeft = () => {\n for(const topicId in promises) {\n promises[topicId].resolve(undefined);\n cache.deletedTopics.add(+topicId);\n }\n };\n\n if(this.getForumTopicsCache(peerId) !== cache) {\n fullfillLeft();\n return;\n }\n\n return this.apiManager.invokeApi('channels.getForumTopicsByID', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n topics: ids\n }).then((messagesForumTopics) => {\n if(this.getForumTopicsCache(peerId) !== cache) {\n return;\n }\n\n this.applyDialogs(messagesForumTopics, peerId);\n\n messagesForumTopics.topics.forEach((forumTopic) => {\n if(forumTopic._ === 'forumTopic') {\n promises[forumTopic.id].resolve(forumTopic);\n delete promises[peerId];\n }\n });\n\n return messagesForumTopics;\n }, () => {}).then(() => {\n fullfillLeft();\n\n cache.getTopicsPromise = undefined;\n if(cache.getTopicPromises.size) {\n this.getForumTopicById(peerId);\n }\n });\n });\n\n return promise || cache.getTopicsPromise;\n }\n\n // public getForumTopicById(peerId: PeerId, topicId: number) {\n // return this.getForumTopicsByID(peerId, topicId).then((result) => result.topics[0]);\n // }\n\n public getForumTopic(peerId: PeerId, topicId: number) {\n const forumTopics = this.forumTopics.get(peerId);\n return forumTopics?.topics?.get(topicId);\n }\n\n public getForumTopicOrReload(peerId: PeerId, topicId: number) {\n const forumTopic = this.getForumTopic(peerId, topicId);\n if(forumTopic) {\n return forumTopic;\n }\n\n const cache = this.getForumTopicsCache(peerId);\n return cache?.deletedTopics?.has(topicId) ? undefined : this.getForumTopicById(peerId, topicId);\n }\n\n public processTopics>(peerId: PeerId, result: T) {\n return callbackify(result, (result) => {\n if('pts' in result) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), result.pts);\n }\n\n const peer = this.appPeersManager.getOutputPeer(peerId);\n result.topics = result.topics.map((topic) => {\n if(topic._ === 'forumTopicDeleted') {\n return;\n }\n\n (topic as ForumTopic).peer = peer;\n topic.id = generateMessageId(topic.id);\n return topic;\n }).filter(Boolean);\n\n return result;\n });\n }\n\n public processTopicsPromise[1]>>(peerId: PeerId, promise: T): T {\n return promise.then((result) => {\n this.processTopics(peerId, result);\n return result;\n }) as any;\n }\n\n public getForumUnreadCount(peerId: PeerId) {\n if(!this.appPeersManager.isForum(peerId)) {\n return;\n }\n\n const folder = this.getFolder(peerId);\n\n const f = folder.dialogs.length >= 20 || this.isDialogsLoaded(peerId) ?\n folder.dialogs.slice(0, 20) :\n callbackify(this.getDialogs({filterId: peerId, limit: 20}), (result) => {\n return result.dialogs;\n });\n\n return callbackify(f, (dialogs) => {\n return dialogs.reduce((acc, v) => acc + +!!v.unread_count, 0);\n });\n }\n\n // * FORUMS SECTION END\n\n private handleDialogTogglePinned(dialog: Dialog | ForumTopic, pinned: boolean, folderId: number) {\n if(dialog) {\n if(!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(dialog.peerId, dialog);\n }\n\n private handleDialogsPinned(folderId: number, order: (Dialog['peerId'] | ForumTopic['id'])[]) {\n const isForum = this.isFilterIdForForum(folderId);\n this.resetPinnedOrder(folderId);\n this.getPinnedOrders(folderId).push(...order);\n this.savePinnedOrders();\n order.reverse(); // index must be higher\n const newPinned: {[id: typeof order[0]]: true} = {};\n order.forEach((id) => {\n newPinned[id] = true;\n\n const peerId = isForum ? folderId : id;\n const topicId = isForum ? id : undefined;\n\n const dialog = this.getDialogOrTopic(peerId, topicId);\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 if(!newPinned[this.getDialogKey(dialog)]) {\n delete dialog.pFlags.pinned;\n this.generateIndexForDialog(dialog);\n this.appMessagesManager.scheduleHandleNewDialogs(dialog.peerId, dialog);\n }\n }\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n // this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = 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 as Dialog).folder_id = folder_id as REAL_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 ?? FOLDER_ID_ALL;\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 this.handleDialogTogglePinned(dialog, update.pFlags.pinned, folderId);\n };\n\n private onUpdateChannelPinnedTopic = (update: Update.updateChannelPinnedTopic) => {\n const peerId = update.channel_id.toPeerId(true);\n const topicId = generateMessageId(update.topic_id);\n const topic = this.getForumTopic(peerId, topicId);\n if(!topic) {\n return;\n }\n\n this.handleDialogTogglePinned(topic, update.pFlags.pinned, this.getFilterIdForForum(topic));\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\n\n if(update.order) {\n this.handleDialogsPinned(folderId, update.order.map((peer) => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n } else {\n this.apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n this.handleDialogsPinned(folderId, dialogsResult.dialogs.map((d) => d.peerId));\n });\n }\n };\n\n private onUpdateChannelPinnedTopics = async(update: Update.updateChannelPinnedTopics) => {\n const peerId = update.channel_id.toPeerId(true);\n const forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n return;\n }\n\n const filterId = peerId;\n if(update.order) {\n const order = update.order.map((topicId) => generateMessageId(topicId));\n this.handleDialogsPinned(filterId, order);\n } else {\n const limit = await this.apiManager.getLimit('topicPin', true);\n\n const promise = this.apiManager.invokeApi('channels.getForumTopics', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit,\n offset_date: 0,\n offset_id: 0,\n offset_topic: 0\n });\n\n const result = await this.processTopics(peerId, promise);\n\n const topics = result.topics as ForumTopic[];\n const pinned = topics.filter((topic) => topic.pFlags.pinned);\n this.handleDialogsPinned(filterId, pinned.map((topic) => topic.id));\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 {DialogFilter, ForumTopic, Update} from '../../layer';\nimport type {Dialog} from '../appManagers/appMessagesManager';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport copy from '../../helpers/object/copy';\nimport {AppManager} from '../appManagers/manager';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS, REAL_FOLDER_ID, START_LOCAL_ID} from '../mtproto/mtproto_config';\nimport makeError from '../../helpers/makeError';\n\nexport type MyDialogFilter = DialogFilter.dialogFilter;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'],\n ['exclude_peers', 'excludePeerIds'],\n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\nconst PREPENDED_FILTERS = REAL_FOLDERS.size;\n\nconst LOCAL_FILTER: MyDialogFilter = {\n _: 'dialogFilter',\n pFlags: {},\n flags: 0,\n id: 0,\n title: '',\n exclude_peers: [],\n include_peers: [],\n pinned_peers: [],\n excludePeerIds: [],\n includePeerIds: [],\n pinnedPeerIds: []\n};\n\nexport default class FiltersStorage extends AppManager {\n private filters: {[filterId: string]: MyDialogFilter};\n private filtersArr: Array;\n private localFilters: {[filterId: string]: MyDialogFilter};\n private localId: number;\n private reloadedPeerIds: Set;\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: this.onUpdateDialogFilters,\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach((arr) => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n\n this.rootScope.addEventListener('premium_toggle', () => {\n this.onUpdateDialogFilters({_: 'updateDialogFilters'});\n });\n\n return this.appStateManager.getState().then((state) => {\n const filtersArr = this.prependFilters(state.filtersArr);\n filtersArr.map((filter) => {\n this.saveDialogFilter(filter, false, true);\n });\n });\n }\n\n /**\n * ! use it only with saving\n */\n private prependFilters(filters: DialogFilter[]) {\n filters = filters.slice();\n\n const allChatsFilter = this.localFilters[FOLDER_ID_ALL];\n const archiveFilter = this.localFilters[FOLDER_ID_ARCHIVE];\n\n const allChatsFilterIndex = filters.findIndex((filter) => filter._ === 'dialogFilterDefault' || filter.id === FOLDER_ID_ALL);\n if(allChatsFilterIndex !== -1) filters[allChatsFilterIndex] = allChatsFilter;\n else filters.unshift(allChatsFilter);\n\n findAndSplice(filters, (filter) => (filter as MyDialogFilter).id === FOLDER_ID_ARCHIVE);\n filters.splice(/* 1 */filters[0] === allChatsFilter ? 1 : 0, 0, archiveFilter);\n\n this.localId = START_LOCAL_ID;\n filters.forEach((filter) => {\n delete filter.localId;\n });\n\n return filters;\n }\n\n private generateLocalFilter(id: REAL_FOLDER_ID) {\n const filter: MyDialogFilter = {...copy(LOCAL_FILTER), id};\n if(id === FOLDER_ID_ALL) {\n filter.pFlags.exclude_archived = true;\n } else if(id === FOLDER_ID_ARCHIVE) {\n filter.pFlags.exclude_unarchived = true;\n }\n\n if(REAL_FOLDERS.has(id)) {\n filter.pinnedPeerIds = this.dialogsStorage.getPinnedOrders(id);\n }\n\n return filter;\n }\n\n // private getLocalFilter(id: number) {\n // return this.filters[id] ??= this.generateLocalFilter(id);\n // }\n\n public clear = (init?: boolean) => {\n if(!init) {\n // safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n this.clearFilters();\n } else {\n this.filters = {};\n this.filtersArr = [];\n this.reloadedPeerIds = new Set();\n\n this.localFilters = {};\n for(const filterId of REAL_FOLDERS) {\n this.localFilters[filterId] = this.generateLocalFilter(filterId as REAL_FOLDER_ID);\n }\n }\n\n this.localId = START_LOCAL_ID;\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 findAndSplice(this.filtersArr, (filter) => (filter as DialogFilter.dialogFilter).id === update.id);\n }\n\n this.pushToState();\n };\n\n private onUpdateDialogFilters = (update: Update.updateDialogFilters) => {\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 private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n // console.log('updateDialogFilterOrder', update);\n\n const order = update.order.slice();\n if(!order.includes(FOLDER_ID_ARCHIVE)) {\n order.splice(order[0] === FOLDER_ID_ALL ? 1 : 0, 0, FOLDER_ID_ARCHIVE);\n }\n\n this.localId = START_LOCAL_ID;\n order.forEach((filterId) => {\n const filter = this.filters[filterId];\n delete filter.localId;\n this.setLocalId(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', order);\n\n this.pushToState();\n };\n\n private pushToState() {\n this.appStateManager.pushToState('filtersArr', this.filtersArr);\n }\n\n public testDialogForFilter(dialog: Dialog | ForumTopic.forumTopic, filter?: MyDialogFilter) {\n if(!filter) {\n return true;\n }\n\n if(REAL_FOLDERS.has(filter.id)) {\n return (dialog as Dialog).folder_id === filter.id && this.dialogsStorage.canSaveDialogByPeerId(dialog.peerId);\n }\n\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && (dialog as Dialog).folder_id === FOLDER_ID_ARCHIVE) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted({peerId}) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n\n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n\n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public getFilters() {\n return this.filters;\n }\n\n public clearFilters() {\n const filters = this.getFilters();\n for(const filterId in filters) { // delete filters\n if(REAL_FOLDERS.has(+filterId)) {\n continue;\n }\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: +filterId\n });\n }\n }\n\n public async toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n\n if(!wasPinned) {\n if(filter.pinned_peers.length >= (await this.apiManager.getConfig()).pinned_infolder_count_max) {\n return Promise.reject(makeError('PINNED_DIALOGS_TOO_MUCH'));\n }\n\n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n\n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map((i) => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return this.apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n // console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.localId;\n f.push(filter);\n }\n\n filter.localId = START_LOCAL_ID;\n\n const order = f.sort((a, b) => a.localId - b.localId).map((filter) => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n // private spliceMissingPeerIds(filterId: number, type: ArgumentTypes[1], missingPeerIds: PeerId[]) {\n // const filter = this.getFilter(filterId);\n // const peers = filter && filter[type];\n // if(!peers?.length) {\n // return;\n // }\n\n // let spliced = false;\n // missingPeerIds.forEach((peerId) => {\n // const inputPeer = findAndSplice(peers, (inputPeer) => getPeerId(inputPeer) === peerId);\n // if(inputPeer) {\n // spliced = true;\n // }\n // });\n\n // if(spliced) {\n // this.onUpdateDialogFilter({\n // _: 'updateDialogFilter',\n // id: filterId,\n // filter\n // });\n // }\n // }\n\n public reloadMissingPeerIds(\n filterId: number,\n type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers'\n ) {\n const filter = this.getFilter(filterId);\n const peers = filter?.[type];\n if(!peers?.length) {\n return;\n }\n\n // const missingPeerIds: PeerId[] = [];\n const reloadDialogs = peers.filter((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const isAlreadyReloaded = this.reloadedPeerIds.has(peerId);\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n // if(isAlreadyReloaded && !dialog) {\n // missingPeerIds.push(peerId);\n // }\n\n const reload = !isAlreadyReloaded && !dialog;\n return reload;\n });\n\n if(!reloadDialogs.length) {\n // if(missingPeerIds.length) {\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n // }\n\n return;\n }\n\n const reloadPromises = reloadDialogs.map((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer)\n .then((dialog) => {\n this.reloadedPeerIds.add(peerId);\n\n return dialog ? undefined : peerId;\n });\n\n return promise;\n });\n\n const reloadPromise = Promise.all(reloadPromises).then((missingPeerIds) => {\n missingPeerIds = missingPeerIds.filter(Boolean);\n if(!missingPeerIds.length) {\n return;\n }\n\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n });\n\n return reloadPromise;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length > PREPENDED_FILTERS && !overwrite) {\n return keys.map((filterId) => this.filters[filterId]).sort((a, b) => a.localId - b.localId);\n }\n\n const filters = await this.apiManager.invokeApiSingle('messages.getDialogFilters');\n const prepended = this.prependFilters(filters);\n return prepended.map((filter) => this.saveDialogFilter(filter, overwrite)).filter(Boolean);\n }\n\n public getSuggestedDialogsFilters() {\n return this.apiManager.invokeApi('messages.getSuggestedDialogFilters');\n }\n\n public saveDialogFilter(filter: DialogFilter, update = true, silent?: boolean) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n if(filter._ === 'dialogFilterDefault') {\n filter = this.localFilters[FOLDER_ID_ALL];\n }\n\n assumeType(filter);\n if(!REAL_FOLDERS.has(filter.id)) {\n convertment.forEach(([from, to]) => {\n assumeType(filter);\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\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.setLocalId(filter);\n\n if(!silent) {\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 return filter;\n }\n\n private setLocalId(filter: MyDialogFilter) {\n if(filter.localId !== undefined) {\n if(filter.localId >= this.localId) {\n this.localId = filter.localId + 1;\n }\n } else {\n filter.localId = this.localId++ as MyDialogFilter['localId'];\n findAndSplice(this.filtersArr, (_filter) => _filter.id === filter.id);\n this.filtersArr.push(filter);\n this.pushToState();\n }\n }\n\n public async isFilterIdAvailable(filterId: number) {\n if(REAL_FOLDERS.has(filterId)) {\n return true;\n }\n\n const limit = await this.apiManager.getLimit('folders');\n const isFolderAvailable = this.filtersArr.filter((filter) => !REAL_FOLDERS.has(filter.id)).slice(0, limit).some((filter) => filter.id === filterId);\n\n return isFolderAvailable;\n }\n}\n","/*\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 applyMixins(derivedCtor: any, constructors: any[]) {\n // const callbacks: Array<(...args: any[]) => any> = [];\n\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n const value: PropertyDescriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null);\n /* if(name === '_constructor') {\n callbacks.push(value.value);\n return;\n } else */if(name === 'constructor') {\n return;\n }\n\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n value\n );\n });\n });\n\n // if(callbacks.length) {\n // function c(...args: any[]): any {\n // callbacks.forEach((cb, idx) => {\n // // @ts-ignore\n // cb.apply(this, args[idx] || []);\n // });\n // };\n\n // Object.defineProperty(derivedCtor.prototype, 'superConstructor', {\n // configurable: true,\n // enumerable: true,\n // value: c,\n // writable: 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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport DEBUG from '../../config/debug';\nimport {ConstructorDeclMap, Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport App from '../../config/app';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport {AppManager} from './manager';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport ctx from '../../environment/ctx';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport applyMixins from '../../helpers/applyMixins';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: boolean,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number,\n lastDifferenceTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nclass ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private subscriptions: {[channelId: ChatId]: {count: number, interval?: number}} = {};\n\n constructor() {\n this._constructor(false);\n }\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n this.appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n\n if(!this.popPendingSeqUpdate() &&\n state.syncPending?.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n this.clearStatePendingSync(state);\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 this.clearStatePendingSync(curState);\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n\n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start\n // ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n\n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n\n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n\n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? this.appPeersManager.peerId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id ?\n (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true) :\n ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || this.appPeersManager.peerId);\n\n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: this.appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: this.appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n\n case 'updatesCombined':\n case 'updates':\n this.appUsersManager.saveApiUsers(updateMessage.users, options.override);\n this.appChatsManager.saveApiChats(updateMessage.chats, options.override);\n\n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n\n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n\n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n const wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n\n this.clearStatePendingSync(updatesState);\n\n const promise = this.apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts,\n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date,\n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n this.rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n\n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n\n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + this.timeManager.getServerTimeOffset();\n delete updatesState.seq;\n\n this.channelStates = {};\n\n this.log.warn('getDifference:', differenceResult._);\n this.onDifferenceTooLong();\n }\n\n // this.log('apply diff', updatesState.seq, updatesState.pts)\n\n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n\n return promise;\n }\n\n private clearStatePendingSync(state: UpdatesState) {\n if(state.syncPending) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n }\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 this.clearStatePendingSync(channelState);\n\n const log = this.debug ? this.log.bindPrefix('getChannelDifference-' + channelId) : undefined;\n // this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = this.apiManager.invokeApi('updates.getChannelDifference', {\n channel: this.appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 1000\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n log?.debug('diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n channelState.lastDifferenceTime = Date.now();\n\n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n // log?.debug('apply channel empty diff', differenceResult);\n return;\n }\n\n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n // log?.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n log?.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n\n 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 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 log?.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private onDifferenceTooLong() {\n this.appUsersManager.clear();\n this.appChatsManager.clear();\n this.appMessagesManager.clear();\n\n this.rootScope.dispatchEvent('state_cleared');\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n this.rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n this.rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n\n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n return this.channelStates[channelId] ??= {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\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 = this.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 = this.appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !this.appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !this.appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !this.appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && this.appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !this.appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n\n let popPts: boolean;\n let popSeq: boolean;\n\n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && this.appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n\n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n\n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending?.seqAwaiting);\n\n curState.pendingSeqUpdates[seqStart] ??= {seq, date: options.date, updates: []};\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n\n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n\n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n\n this.saveUpdate(update);\n\n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n // this.debug && this.log('saveUpdate', update);\n this.dispatchEvent(update._, update as any);\n }\n\n public subscribeToChannelUpdates(channelId: ChatId) {\n const subscription = this.subscriptions[channelId] ??= {count: 0};\n ++subscription.count;\n\n const cb = () => {\n const state = this.getChannelState(channelId);\n if(!state.syncLoading && (!state.lastDifferenceTime || (Date.now() - state.lastDifferenceTime) > 2500)) {\n this.getChannelDifference(channelId);\n }\n };\n\n subscription.interval ??= ctx.setInterval(cb, 3000);\n cb();\n }\n\n public unsubscribeFromChannelUpdates(channelId: ChatId, force?: boolean) {\n const subscription = this.subscriptions[channelId];\n if(!subscription?.interval || (--subscription.count && !force)) {\n return;\n }\n\n clearInterval(subscription.interval);\n subscription.interval = undefined;\n delete this.subscriptions[channelId];\n }\n\n public attach(langCode?: string) {\n if(this.attached) return;\n\n // return;\n\n this.log('attach');\n\n this.attached = true;\n\n this.appStateManager.getState().then(({updates: state}) => {\n const newVersion = this.appStateManager.newVersion/* || '1.6.0' */;\n\n // rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n this.apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n // setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n // rootScope.broadcast('state_synchronized');\n // }, 1000);\n\n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n // state.date = 1628623682;\n // state.pts = 2007500;\n // state.seq = 503;\n\n Object.assign(this.updatesState, state);\n\n this.log('will get difference', Object.assign({}, state));\n\n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n this.apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(async() => {\n const strs: Record = {\n en: 'was updated to version',\n ru: 'обновлён до версии'\n };\n\n const getChangelog = (lang: string) => {\n fetch(`changelogs/${lang}_${newVersion.split(' ')[0]}.md`)\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n const langStr = strs[lang] || strs.en;\n const pre = `**Telegram Web${App.suffix} ${langStr} ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n\n this.processLocalUpdate(update);\n });\n };\n\n const languages = filterUnique([langCode, 'en']);\n for(const language of languages) {\n try {\n await getChangelog(language);\n break;\n } catch(err) {\n\n }\n }\n });\n }\n });\n }\n}\n\ninterface ApiUpdatesManager extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n}>, AppManager {}\napplyMixins(ApiUpdatesManager, [EventListenerBase, AppManager]);\n\nexport {ApiUpdatesManager};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {UserProfilePhoto, ChatPhoto, InputFileLocation} from '../../layer';\nimport {DownloadOptions} from '../mtproto/apiFileManager';\nimport {AppManager} from './manager';\n\nexport type PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager extends AppManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n protected after() {\n this.rootScope.addEventListener('avatar_update', ({peerId, threadId}) => {\n if(threadId) {\n return;\n }\n\n this.removeFromAvatarsCache(peerId);\n });\n }\n\n public isAvatarCached(peerId: PeerId, size?: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId];\n if(size === undefined) {\n return !!saved;\n }\n\n return !!(saved && saved[size] && !(saved[size] instanceof Promise));\n }\n\n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId] ??= {};\n if(!saved[size]) {\n // console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation',\n pFlags: {},\n peer: this.appPeersManager.getInputPeerById(peerId),\n photo_id: photo.photo_id\n };\n\n const downloadOptions: DownloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n downloadOptions.limitPart = 512 * 1024;\n }\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = this.apiFileManager.download(downloadOptions);\n return saved[size] = promise.then((blob) => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else {\n return saved[size];\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getEnvironment} from '../../environment/utils';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall} from '../../layer';\nimport {AppManager} from './manager';\n\nexport type CallId = PhoneCall['id'];\n\nexport type MyPhoneCall = Exclude;\n\nexport class AppCallsManager extends AppManager {\n private calls: Map;\n\n protected after() {\n this.calls = new Map();\n\n if(!getEnvironment().IS_CALL_SUPPORTED) {\n return;\n }\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePhoneCall: (update) => {\n this.saveCall(update.phone_call);\n },\n\n updatePhoneCallSignalingData: (update) => {\n this.rootScope.dispatchEvent('call_signaling', {callId: update.phone_call_id, data: update.data});\n }\n });\n }\n\n public computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n return this.cryptoWorker.invokeCrypto('compute-dh-key', g_b, a, p);\n }\n\n public saveCall(call: PhoneCall) {\n const isDiscarded = call._ === 'phoneCallDiscarded';\n const oldCall = this.calls.get(call.id);\n if(oldCall) {\n // if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n // }\n\n if(isDiscarded) {\n this.calls.delete(call.id);\n }\n\n call = oldCall;\n } else if(!isDiscarded) {\n this.calls.set(call.id, call as any);\n }\n\n this.rootScope.dispatchEvent('call_update', call);\n\n return call;\n }\n\n public getCall(callId: CallId) {\n return this.calls.get(callId);\n }\n\n public getCallInput(id: CallId): InputPhoneCall {\n const call = this.getCall(id);\n return {\n _: 'inputPhoneCall',\n id: call.id,\n access_hash: call.access_hash\n };\n }\n\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\n this.appUsersManager.saveApiUsers(phonePhoneCall.users);\n return this.saveCall(phonePhoneCall.phone_call);\n }\n\n public generateDh() {\n return this.apiManager.invokeApi('messages.getDhConfig', {\n version: 0,\n random_length: 256\n }).then((dhConfig) => {\n return this.cryptoWorker.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\n });\n }\n\n // private verifyProtocolCompatibility(protocol: PhoneCallProtocol) {\n // const my = getCallProtocol();\n // const myVersion = my.library_versions[0];\n // return !protocol.library_versions.find((version) => {\n // return compareVersion(myVersion, version) > 0;\n // });\n // }\n\n public async requestCall(userId: UserId, protocol: PhoneCallProtocol, g_a_hash: Uint8Array, video?: boolean) {\n const phonePhoneCall = await this.apiManager.invokeApi('phone.requestCall', {\n user_id: this.appUsersManager.getUserInput(userId),\n protocol: protocol,\n video: video,\n random_id: nextRandomUint(32),\n g_a_hash: g_a_hash\n });\n\n return this.savePhonePhoneCall(phonePhoneCall);\n }\n\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\n if(!this.getCall(callId)) {\n return;\n }\n\n const updates = await this.apiManager.invokeApi('phone.discardCall', {\n video,\n peer: this.getCallInput(callId),\n duration,\n reason: {\n _: reason\n },\n connection_id: '0'\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport deepEqual from '../../helpers/object/deepEqual';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatInvite, ChatPhoto, ChatReactions, InputChannel, InputChatPhoto, InputFile, InputPeer, MessagesSponsoredMessages, SponsoredMessage, Update, Updates} from '../../layer';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {AppManager} from './manager';\nimport hasRights from './utils/chats/hasRights';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport {AppStoragesManager} from './appStoragesManager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport {randomLong} from '../../helpers/random';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager extends AppManager {\n private storage: AppStoragesManager['storages']['chats'];\n\n private chats: {[id: ChatId]: Exclude};\n // private usernames: any;\n // private channelAccess: any;\n // private megagroups: {[id: number]: true};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n this.apiManager.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = this.appPeersManager.getPeerId(update.peer).toChatId();\n const chat = this.chats[chatId] as Chat.chat;\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n this.rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('chats')\n ]).then(([state, {results: chats, storage}]) => {\n this.storage = storage;\n\n this.saveApiChats(chats);\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!this.peersStorage.isPeerNeeded(chatId.toPeerId(true))) {\n const chat = this.chats[chatId];\n this.appUsersManager.modifyUsernamesCache(chat, false);\n\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n };\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach((chat) => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(!chat || 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 = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n (chat as Chat.chat).pFlags ??= {};\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n if((chat as Chat.channel).photo?._ === 'chatPhotoEmpty') {\n delete (chat as Chat.channel).photo;\n }\n\n const changedUsername = this.appUsersManager.setUsernameToCache(chat, oldChat);\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n const peerId = chat.id.toPeerId(true);\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 const changedPhoto = oldPhotoId !== newPhotoId ||\n (oldChat as Chat.channel).pFlags.forum !== (chat as Chat.channel).pFlags.forum;\n\n const changedTitle = oldChat.title !== chat.title || changedUsername;\n\n const changedAnyBadge = (oldChat as Chat.channel).pFlags.verified !== (chat as Chat.channel).pFlags.verified ||\n (oldChat as Chat.channel).pFlags.scam !== (chat as Chat.channel).pFlags.scam ||\n (oldChat as Chat.channel).pFlags.fake !== (chat as Chat.channel).pFlags.fake;\n\n safeReplaceObject(oldChat, chat);\n this.rootScope.dispatchEvent('chat_update', chat.id);\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId});\n }\n }\n\n if(this.peersStorage.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id];\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id\n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread\n * @returns\n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n return hasRights(this.getChat(id), action, rights, isThread);\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat = this.getChat(id) as Chat.chat;\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n\n return this.apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.megagroup;\n }\n\n public isForum(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.forum;\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 ||\n chat._ === 'channelForbidden' ||\n chat._ === 'chatForbidden' ||\n (chat as any as Chat.chatEmpty)._ === 'chatEmpty' ||\n (chat as Chat.chat).pFlags.left ||\n // || (chat as any).pFlags.kicked\n (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(!chat || !(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) as Chat.channel).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 as Chat.channel).pFlags.min);\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 as Chat.channel).access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise {\n return this.apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map((u) => this.appUsersManager.getUserInput(u));\n\n return this.apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return this.apiManager.invokeApi('messages.createChat', {\n users: userIds.map((u) => this.appUsersManager.getUserInput(u)),\n title\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: Updates) => {\n // console.log('onChatUpdated', chatId, updates);\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n if((updates as Updates.updates)?.updates?.length && this.isChannel(chatId)) {\n this.rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return this.apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return this.apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, this.appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n // return this.leaveChat(id).then(() => {\n return this.apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n // });\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return this.apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find((u) => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n });\n\n return this.refreshChatAfterRequest(id, promise, doNotRefresh);\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then((updates: any) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then((updates: any) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return this.apiManager.invokeApi('messages.editChatAbout', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n about\n }).then((bool) => {\n if(bool) {\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : getParticipantPeerId(participant);\n return this.apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: this.appUsersManager.getSelf().id,\n peer: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n\n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return this.apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then((channelId) => {\n return this.apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: ChatReactions) {\n const chatFull = this.appProfileManager.getCachedFullChat(id);\n if(chatFull) {\n chatFull.available_reactions = reactions;\n this.rootScope.dispatchEvent('chat_full_update', id);\n }\n\n return this.apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getSendAs(channelId: ChatId) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getSendAs',\n params: {\n peer: this.getChannelInputPeer(channelId)\n },\n processResult: (sendAsPeers) => {\n this.appUsersManager.saveApiUsers(sendAsPeers.users);\n this.saveApiChats(sendAsPeers.chats);\n\n return sendAsPeers.peers;\n }\n });\n }\n\n public importChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.importChatInvite', {hash})\n .then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n const chat = (updates as Updates.updates).chats[0];\n return chat.id;\n });\n }\n\n public checkUsername(chatId: ChatId, username: string) {\n return this.apiManager.invokeApi('channels.checkUsername', {\n channel: this.getChannelInput(chatId),\n username\n });\n }\n\n public getSponsoredMessage(chatId: ChatId) {\n // const s: MessagesSponsoredMessages.messagesSponsoredMessages = {\n // '_': 'messages.sponsoredMessages',\n // 'messages': [\n // {\n // '_': 'sponsoredMessage',\n // 'pFlags': {},\n // 'flags': 9,\n // 'random_id': new Uint8Array([\n // 80,\n // 5,\n // 249,\n // 174,\n // 44,\n // 73,\n // 173,\n // 14,\n // 246,\n // 81,\n // 187,\n // 182,\n // 223,\n // 5,\n // 4,\n // 128\n // ]),\n // 'from_id': {\n // '_': 'peerUser',\n // 'user_id': 983000232\n // },\n // 'start_param': 'GreatMinds',\n // 'message': 'This is a long sponsored message. In fact, it has the maximum length allowed on the platform – 160 characters 😬😬. It\\'s promoting a bot with a start parameter.' + chatId\n // }\n // ],\n // 'chats': [],\n // 'users': [\n // {\n // '_': 'user',\n // 'pFlags': {\n // 'bot': true,\n // 'verified': true,\n // 'apply_min_photo': true\n // },\n // 'flags': 34226219,\n // 'id': 983000232,\n // 'access_hash': '-294959558742535650',\n // 'first_name': 'Quiz Bot',\n // 'username': 'QuizBot',\n // 'photo': {\n // '_': 'userProfilePhoto',\n // 'pFlags': {},\n // 'flags': 2,\n // 'photo_id': '4221953848856651689',\n // 'stripped_thumb': new Uint8Array([\n // 1,\n // 8,\n // 8,\n // 155,\n // 247,\n // 95,\n // 103,\n // 255,\n // 0,\n // 110,\n // 138,\n // 40,\n // 174,\n // 132,\n // 142,\n // 6,\n // 238,\n // 127\n // ]),\n // 'dc_id': 2\n // },\n // 'bot_info_version': 11,\n // 'bot_inline_placeholder': 'Search a quiz...',\n // 'sortName': 'quiz bot'\n // }\n // ]\n // };\n\n // const promise = Promise.resolve(s);\n const promise = this.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\n channel: this.getChannelInput(chatId)\n }, {cacheSeconds: 300});\n\n return promise.then((sponsoredMessages) => {\n if(sponsoredMessages._ === 'messages.sponsoredMessages') {\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\n\n const sponsoredMessage = sponsoredMessages.messages.shift();\n sponsoredMessages.messages.push(sponsoredMessage);\n }\n\n return sponsoredMessages;\n });\n }\n\n public viewSponsoredMessage(chatId: ChatId, randomId: SponsoredMessage['random_id']) {\n return this.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\n channel: this.getChannelInput(chatId),\n random_id: randomId\n });\n }\n\n public checkChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.checkChatInvite', {\n hash: hash\n }).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n return chatInvite;\n });\n }\n\n public toggleUsername(chatId: ChatId, username: string, active: boolean) {\n const promise = this.apiManager.invokeApi('channels.toggleUsername', {\n channel: this.getChannelInput(chatId),\n username,\n active\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public reorderUsernames(chatId: ChatId, order: string[]) {\n const promise = this.apiManager.invokeApi('channels.reorderUsernames', {\n channel: this.getChannelInput(chatId),\n order\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public deactivateAllUsernames(chatId: ChatId, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.deactivateAllUsernames', {\n channel: this.getChannelInput(chatId)\n });\n\n return this.refreshChatAfterRequest(chatId, promise, doNotRefresh);\n }\n\n public makeChannelPrivate(chatId: ChatId) {\n const promises: Promise[] = [\n this.updateUsername(chatId, '', true),\n this.deactivateAllUsernames(chatId, true)\n ];\n\n const promise = Promise.all(promises).then(() => true);\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public refreshChatAfterRequest>(chatId: ChatId, promise: T, doNotRefresh?: boolean): T {\n if(doNotRefresh) {\n return promise;\n }\n\n return promise.then((value) => {\n return this.getChannels([chatId]).then(() => value);\n }) as T;\n }\n\n public getChannels(chatIds: ChatId[]) {\n return this.apiManager.invokeApi('channels.getChannels', {\n id: chatIds.map((chatId) => this.getChannelInput(chatId))\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public toggleForum(chatId: ChatId, enabled: boolean) {\n return this.migrateChat(chatId).then((channelId) => {\n return this.apiManager.invokeApi('channels.toggleForum', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public editForumTopic(options: {\n chatId: ChatId,\n topicId: number,\n title?: string,\n iconEmojiId?: DocId,\n closed?: boolean,\n hidden?: boolean\n }) {\n const {chatId, topicId, title, iconEmojiId, closed, hidden} = options;\n return this.apiManager.invokeApi('channels.editForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n title,\n icon_emoji_id: iconEmojiId,\n closed,\n hidden\n }).then(this.onChatUpdated.bind(this, chatId));\n }\n\n public async createForumTopic(options: {\n chatId: ChatId,\n title: string,\n iconColor: number,\n iconEmojiId: DocId\n }) {\n const {chatId, title, iconColor, iconEmojiId} = options;\n\n const channelFull = await this.appProfileManager.getChannelFull(chatId);\n const sendAsInputPeer = channelFull.default_send_as && this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(channelFull.default_send_as));\n\n return this.apiManager.invokeApi('channels.createForumTopic', {\n channel: this.getChannelInput(chatId),\n title,\n icon_color: iconColor,\n icon_emoji_id: iconEmojiId,\n random_id: randomLong(),\n send_as: sendAsInputPeer\n }).then((updates) => {\n this.onChatUpdated(chatId, updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateNewChannelMessage') as Update.updateNewChannelMessage;\n return generateMessageId(update.message.id);\n });\n }\n\n public updatePinnedForumTopic(chatId: ChatId, topicId: number, pinned: boolean) {\n return this.apiManager.invokeApi('channels.updatePinnedForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n pinned\n }).then(this.onChatUpdated.bind(this, chatId));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n '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 export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\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\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\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 }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\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 const 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 return 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 const 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","/*\n * 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 addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n if(tgMeMatch[1]) {\n u.pathname = tgMeMatch[1] + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !tgMeMatch[1]) {\n onclick = path[0];\n break;\n }\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] as any;\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 out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * 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 I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key\n * @param wasObject\n * @param newObject\n */\nexport 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","export const EXTENSION_MIME_TYPE_MAP: {[ext in MTFileExtension]: MTMimeType} = {\n pdf: 'application/pdf',\n tgv: 'application/x-tgwallpattern',\n tgs: 'application/x-tgsticker',\n json: 'application/json',\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n ogg: 'audio/ogg',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n svg: 'image/svg+xml'\n};\n\nexport const MIME_TYPE_EXTENSION_MAP: {[mimeType in MTMimeType]?: MTFileExtension} = {};\n\nfor(const ext in EXTENSION_MIME_TYPE_MAP) {\n MIME_TYPE_EXTENSION_MAP[EXTENSION_MIME_TYPE_MAP[ext as MTFileExtension]] = ext as MTFileExtension;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {AccountWallPapers, Document, DocumentAttribute, MessagesSavedGifs, PhotoSize, WallPaper} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {getFullDate} from '../../helpers/date';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport assumeType from '../../helpers/assumeType';\nimport {getEnvironment} from '../../environment/utils';\nimport {isServiceWorkerOnline} from '../mtproto/mtproto.worker';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getDocumentInputFileLocation from './utils/docs/getDocumentInputFileLocation';\nimport getDocumentURL from './utils/docs/getDocumentURL';\nimport type {ThumbCache} from '../storages/thumbs';\nimport makeError from '../../helpers/makeError';\nimport {EXTENSION_MIME_TYPE_MAP} from '../../environment/mimeTypeMap';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\ntype WallPaperId = WallPaper.wallPaper['id'];\n\nlet uploadWallPaperTempId = 0;\n\nexport class AppDocsManager extends AppManager {\n private docs: {[docId: DocId]: MyDocument};\n\n private stickerCachedThumbs: {[docId: DocId]: {[toneIndex: number]: {url: string, w: number, h: number}}};\n\n private uploadingWallPapers: {[id: WallPaperId]: {cacheContext: ThumbCache, file: File}};\n\n protected after() {\n this.docs = {};\n this.stickerCachedThumbs = {};\n this.uploadingWallPapers = {};\n\n MTProtoMessagePort.getInstance().addEventListener('serviceWorkerOnline', (online) => {\n if(!online) {\n this.onServiceWorkerFail();\n }\n });\n }\n\n private onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n this.thumbsStorage.deleteCacheContext(doc);\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(!doc || doc._ === 'documentEmpty') {\n return;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n this.referenceDatabase.saveContext(doc.file_reference, context);\n }\n\n // console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name',\n // 'file', 'duration', 'downloaded', 'url', 'audioTitle',\n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw',\n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n for(let i = 0, length = doc.attributes.length; i < length; ++i) {\n const attribute = doc.attributes[i];\n switch(attribute._) {\n case 'documentAttributeFilename':\n doc.file_name = wrapPlainText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\n\n case 'documentAttributeVideo':\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n // apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n\n case 'documentAttributeCustomEmoji':\n case 'documentAttributeSticker':\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || getEnvironment().IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n } else if(doc.mime_type === 'video/webm') {\n if(!getEnvironment().IS_WEBM_SUPPORTED) {\n break;\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 const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeFilename') as DocumentAttribute.documentAttributeFilename;\n const ext = attribute && attribute.file_name.split('.').pop();\n const date = getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n doc.file_name = `${doc.type}_${date}${ext ? '.' + ext : ''}`;\n }\n\n if(isServiceWorkerOnline()) {\n if((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n\n const cacheContext = this.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url) {\n this.thumbsStorage.setCacheContextURL(doc, undefined, getDocumentURL(doc), 0);\n }\n }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n\n if(!doc.file_name) {\n doc.file_name = '';\n }\n\n if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n\n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean) {\n return this.apiFileManager.downloadMedia({\n media: doc,\n queueId,\n onlyCache\n });\n }\n\n public getLottieCachedThumb(docId: DocId, toneIndex: number) {\n const cached = this.stickerCachedThumbs[docId];\n return cached && cached[toneIndex];\n }\n\n public saveLottiePreview(docId: DocId, blob: Blob, width: number, height: number, toneIndex: number) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const cached = this.stickerCachedThumbs[doc.id] ??= {};\n\n const thumb = cached[toneIndex];\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n cached[toneIndex] = {\n url: URL.createObjectURL(blob),\n w: width,\n h: height\n };\n }\n\n public saveWebPConvertedStrippedThumb(docId: DocId, bytes: Uint8Array) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const thumb = doc.thumbs && doc.thumbs.find((thumb) => thumb._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n doc.pFlags.stickerThumbConverted = true;\n thumb.bytes = bytes;\n }\n\n public getWallPapers() {\n return this.apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\n const wallPapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\n wallPapers.forEach((wallPaper) => {\n wallPaper.document = this.saveDoc(wallPaper.document);\n });\n\n return wallPapers;\n });\n }\n\n public prepareWallPaperUpload(file: File) {\n const id = 'wallpaper-upload-' + ++uploadWallPaperTempId;\n\n const thumb = {\n _: 'photoSize',\n h: 0,\n w: 0,\n location: {} as any,\n size: file.size,\n type: THUMB_TYPE_FULL\n } as PhotoSize.photoSize;\n let document: MyDocument = {\n _: 'document',\n access_hash: '',\n attributes: [],\n dc_id: 0,\n file_reference: [],\n id,\n mime_type: file.type as MTMimeType,\n size: file.size,\n date: Date.now() / 1000,\n pFlags: {},\n thumbs: [thumb],\n file_name: file.name\n };\n\n document = this.saveDoc(document);\n\n const cacheContext = this.thumbsStorage.setCacheContextURL(document, undefined, URL.createObjectURL(file), file.size);\n\n const wallpaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n access_hash: '',\n document: document,\n id,\n slug: id,\n pFlags: {}\n };\n\n this.uploadingWallPapers[id] = {\n cacheContext,\n file\n };\n\n return wallpaper;\n }\n\n public uploadWallPaper(id: WallPaperId) {\n const {cacheContext, file} = this.uploadingWallPapers[id];\n delete this.uploadingWallPapers[id];\n\n const upload = this.apiFileManager.upload({file, fileName: file.name});\n return upload.then((inputFile) => {\n return this.apiManager.invokeApi('account.uploadWallPaper', {\n file: inputFile,\n mime_type: file.type,\n settings: {\n _: 'wallPaperSettings'\n\n }\n }).then((wallPaper) => {\n assumeType(wallPaper);\n wallPaper.document = this.saveDoc(wallPaper.document);\n this.thumbsStorage.setCacheContextURL(wallPaper.document, undefined, cacheContext.url, cacheContext.downloaded);\n\n return wallPaper;\n });\n });\n }\n\n public getGifs() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getSavedGifs',\n processResult: (res) => {\n assumeType(res);\n return res.gifs.map((doc) => this.saveDoc(doc));\n }\n });\n }\n\n public requestDocPart(docId: DocId, dcId: number, offset: number, limit: number) {\n const doc = this.getDoc(docId);\n if(!doc) return Promise.reject(makeError('NO_DOC'));\n return this.apiFileManager.requestFilePart(dcId, getDocumentInputFileLocation(doc), offset, limit);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {FileURLType, getFileURL} from '../../../../helpers/fileName';\nimport {Document, PhotoSize} from '../../../../layer';\nimport getDocumentDownloadOptions from './getDocumentDownloadOptions';\n\nexport default function getDocumentURL(doc: Document.document, 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, getDocumentDownloadOptions(doc, thumb));\n}\n","/*\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 {MessageEntity, DraftMessage, MessagesSaveDraft} from '../../layer';\nimport tsNow from '../../helpers/tsNow';\nimport stateStorage from '../stateStorage';\nimport assumeType from '../../helpers/assumeType';\nimport {AppManager} from './manager';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport draftsAreEqual from './utils/drafts/draftsAreEqual';\n\nexport type MyDraftMessage = DraftMessage.draftMessage;\n\nexport class AppDraftsManager extends AppManager {\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\n private getAllDraftPromise: Promise;\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDraftMessage: (update) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n this.saveDraft({\n peerId,\n threadId: update.threadId,\n draft: update.draft,\n notify: true\n });\n }\n });\n\n /* return */stateStorage.get('drafts').then((drafts) => {\n this.drafts = drafts || {};\n });\n }\n\n private getKey(peerId: PeerId, threadId?: number) {\n return '' + peerId + (threadId ? '_' + threadId : '');\n }\n\n public getDraft(peerId: PeerId, threadId?: number) {\n return this.drafts[this.getKey(peerId, threadId)];\n }\n\n public addMissedDialogs() {\n return this.getAllDrafts().then(() => {\n for(const key in this.drafts) {\n if(key.indexOf('_') !== -1) { // exclude threads\n continue;\n }\n\n const peerId = key.toPeerId();\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n if(!dialog) {\n this.appMessagesManager.reloadConversation(peerId);\n /* const dialog = appMessagesManager.generateDialog(peerId);\n dialog.draft = this.drafts[key];\n appMessagesManager.saveConversation(dialog);\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\n appMessagesManager.scheduleHandleNewDialogs(); */\n }\n }\n });\n }\n\n private getAllDrafts() {\n return this.getAllDraftPromise ??= this.apiManager.invokeApi('messages.getAllDrafts')\n .then((updates) => {\n const p = this.apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\n p.then(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n });\n }\n\n public saveDraft({peerId, threadId, draft: apiDraft, notify, force}: {\n peerId: PeerId,\n threadId?: number,\n draft: DraftMessage,\n notify?: boolean,\n force?: boolean\n }) {\n const draft = this.processApiDraft(apiDraft);\n\n const key = this.getKey(peerId, threadId);\n if(draft) {\n this.drafts[key] = draft;\n } else {\n delete this.drafts[key];\n }\n\n stateStorage.set({\n drafts: this.drafts\n });\n\n if(notify) {\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\n this.rootScope.dispatchEvent('draft_updated', {\n peerId,\n threadId,\n draft,\n force\n });\n }\n\n return draft;\n }\n\n private isEmptyDraft(draft: DraftMessage) {\n if(draft?._ !== 'draftMessage') {\n return true;\n }\n\n if(draft.reply_to_msg_id !== undefined && draft.reply_to_msg_id > 0) {\n return false;\n }\n\n if(!draft.message.length) {\n return true;\n }\n\n return false;\n }\n\n private processApiDraft(draft: DraftMessage): MyDraftMessage {\n if(!draft || draft._ !== 'draftMessage') {\n return undefined;\n }\n\n if(draft.reply_to_msg_id) {\n draft.reply_to_msg_id = generateMessageId(draft.reply_to_msg_id);\n }\n\n return draft;\n }\n\n public syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\n // console.warn(dT(), 'sync draft', peerID)\n const serverDraft = this.getDraft(peerId, threadId);\n if(draftsAreEqual(serverDraft, localDraft)) {\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\n return true;\n }\n\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\n const params: MessagesSaveDraft = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: ''\n };\n\n let draftObj: DraftMessage;\n if(this.isEmptyDraft(localDraft)) {\n draftObj = {_: 'draftMessageEmpty'};\n } else {\n assumeType(localDraft);\n const message = localDraft.message;\n const entities: MessageEntity[] = localDraft.entities;\n\n if(localDraft.reply_to_msg_id) {\n params.reply_to_msg_id = getServerMessageId(localDraft.reply_to_msg_id);\n }\n\n if(entities?.length) {\n params.entities = this.appMessagesManager.getInputEntities(entities);\n }\n\n if(localDraft.pFlags.no_webpage) {\n params.no_webpage = localDraft.pFlags.no_webpage;\n }\n\n params.message = message;\n }\n\n if(threadId) {\n params.top_msg_id = getServerMessageId(threadId);\n }\n\n const saveLocalDraft = draftObj || localDraft;\n saveLocalDraft.date = tsNow(true) + this.timeManager.getServerTimeOffset();\n\n this.saveDraft({\n peerId,\n threadId,\n draft: saveLocalDraft,\n notify: true,\n force\n });\n\n if(saveOnServer) {\n return this.apiManager.invokeApi('messages.saveDraft', params);\n }\n\n return true;\n }\n\n public clearAllDrafts() {\n return this.apiManager.invokeApi('messages.clearAllDrafts').then((bool) => {\n if(!bool) {\n return;\n }\n\n for(const combined in this.drafts) {\n const [peerId, threadId] = combined.split('_');\n this.rootScope.dispatchEvent('draft_updated', {\n peerId: peerId.toPeerId(),\n threadId: threadId ? +threadId : undefined,\n draft: undefined\n });\n }\n });\n }\n\n public clearDraft(peerId: PeerId, threadId: number) {\n const emptyDraft: DraftMessage.draftMessageEmpty = {\n _: 'draftMessageEmpty'\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft: emptyDraft,\n notify: true,\n force: true\n });\n }\n }\n\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\n const draft: DraftMessage.draftMessage = {\n _: 'draftMessage',\n date: Date.now() / 1000 | 0,\n message,\n pFlags: {},\n entities\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, draft, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft,\n notify: true,\n force: 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 type {MyDocument} from './appDocsManager';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport isObject from '../../helpers/object/isObject';\nimport validateInitObject from '../../helpers/object/validateInitObject';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport SearchIndex from '../searchIndex';\nimport stateStorage from '../stateStorage';\nimport {AppManager} from './manager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\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 = 32;\n\ntype EmojiType = 'native' | 'custom';\n\nexport class AppEmojiManager extends AppManager {\n private static POPULAR_EMOJI = ['😂', '😘', '❤️', '😍', '😊', '😁', '👍', '☺️', '😔', '😄', '😭', '💋', '😒', '😳', '😜', '🙈', '😉', '😃', '😢', '😝', '😱', '😡', '😏', '😞', '😅', '😚', '🙊', '😌', '😀', '😋', '😆', '👌', '😐', '😕'];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: {native?: string[], custom?: DocId[]} = {};\n private getRecentEmojisPromises: {native?: Promise, custom?: Promise} = {};\n\n private getCustomEmojiDocumentsPromise: Promise;\n private getCustomEmojiDocumentPromises: Map> = new Map();\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then((popEmojis) => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then((recentEmojis) => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return this.apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n\n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(this.networkerFactory.language !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(this.networkerFactory.language));\n }\n\n if(!this.recent.native) {\n promises.push(this.getRecentEmojis('native'));\n }\n\n return Promise.all(promises);\n }\n\n private indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n\n // const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.native.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(type: 'custom'): Promise;\n public getRecentEmojis(type: 'native'): Promise;\n public getRecentEmojis(type: T): Promise {\n const promises = this.getRecentEmojisPromises;\n return promises[type] ??= this.appStateManager.getState().then((state) => {\n let recent: string[] | DocId[] = [];\n if(type === 'native') {\n const {recentEmoji} = state;\n recent = Array.isArray(recentEmoji) && recentEmoji.length ? recentEmoji : AppEmojiManager.POPULAR_EMOJI;\n } else {\n const {recentCustomEmoji} = state;\n recent = Array.isArray(recentCustomEmoji) && recentCustomEmoji.length ? recentCustomEmoji : [];\n }\n\n return this.recent[type] = recent as any;\n }) as any;\n }\n\n public pushRecentEmoji(emoji: AppEmoji) {\n const type: EmojiType = emoji.docId ? 'custom' : 'native';\n emoji.emoji = fixEmoji(emoji.emoji);\n // @ts-ignore\n this.getRecentEmojis(type).then((recent) => {\n const i = emoji.docId || emoji.emoji;\n indexOfAndSplice(recent, i);\n recent.unshift(i);\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n\n this.appStateManager.pushToState(type === 'custom' ? 'recentCustomEmoji' : 'recentEmoji', recent);\n this.rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n\n public getCustomEmojiDocuments(docIds: DocId[]) {\n if(!docIds.length) return Promise.resolve([] as MyDocument[]);\n return this.apiManager.invokeApi('messages.getCustomEmojiDocuments', {document_id: docIds}).then((documents) => {\n return documents.map((doc) => {\n return this.appDocsManager.saveDoc(doc, {\n type: 'customEmoji',\n docId: doc.id\n });\n });\n });\n }\n\n public getCachedCustomEmojiDocuments(docIds: DocId[]) {\n return docIds.map((docId) => this.appDocsManager.getDoc(docId));\n }\n\n private setDebouncedGetCustomEmojiDocuments() {\n if(this.getCustomEmojiDocumentsPromise || !this.getCustomEmojiDocumentPromises.size) {\n return;\n }\n\n this.getCustomEmojiDocumentsPromise = pause(0).then(() => {\n const allIds = [...this.getCustomEmojiDocumentPromises.keys()];\n const promises: Promise[] = [];\n do {\n const ids = allIds.splice(0, 100);\n const promise = this.getCustomEmojiDocuments(ids).then((docs) => {\n docs.forEach((doc, idx) => {\n const docId = ids[idx];\n const deferred = this.getCustomEmojiDocumentPromises.get(docId);\n this.getCustomEmojiDocumentPromises.delete(docId);\n deferred.resolve(doc);\n });\n });\n\n promises.push(promise);\n } while(allIds.length);\n\n return Promise.all(promises);\n }).finally(() => {\n this.getCustomEmojiDocumentsPromise = undefined;\n this.setDebouncedGetCustomEmojiDocuments();\n });\n }\n\n public getCustomEmojiDocument(id: DocId) {\n let promise = this.getCustomEmojiDocumentPromises.get(id);\n if(promise) {\n return promise;\n }\n\n const doc = this.appDocsManager.getDoc(id);\n if(doc) {\n return doc;\n }\n\n promise = deferredPromise();\n this.getCustomEmojiDocumentPromises.set(id, promise);\n\n this.setDebouncedGetCustomEmojiDocuments();\n\n return promise;\n }\n\n public getCustomEmojis() {\n return this.appStickersManager.getEmojiStickers();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport type GroupCallConnectionInstance from '../calls/groupCallConnectionInstance';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {DataJSON, GroupCall, GroupCallParticipant, GroupCallParticipantVideoSourceGroup, InputGroupCall, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport class AppGroupCallsManager extends AppManager {\n private log: ReturnType;\n\n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n\n // private doNotDispatchParticipantUpdate: PeerId;\n\n protected after() {\n this.log = logger('GROUP-CALLS');\n\n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n\n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n\n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n this.rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n this.participants.delete(groupCall.id);\n }\n });\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n\n if(modified) {\n this.rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n\n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant || true/* && this.doNotDispatchParticipantUpdate !== peerId */) {\n this.rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach((p) => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n this.saveApiParticipant(groupCallId, participant);\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : getPeerId(participant.peer);\n const updates = await this.apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: this.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? this.appPeersManager.getInputPeerSelf() : this.appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n\n // do not replace with peerId because it can be null\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = getPeerId(participant.peer);\n this.apiUpdatesManager.processUpdateMessage(updates);\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n\n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n this.appUsersManager.saveApiUsers(groupCall.users);\n this.appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n\n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n\n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n this.rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await this.apiManager.invokeApi('phone.createGroupCall', {\n peer: this.appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n\n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n // public generateSelfParticipant(): GroupCallParticipant {\n // const mainSources = this.currentGroupCall.connections.main.sources;\n // const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n // return {\n // _: 'groupCallParticipant',\n // pFlags: {\n // can_self_unmute: true,\n // self: true\n // },\n // source: mainSources.audio.source,\n // video: this.generateSelfVideo(mainSources.video),\n // presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n // date: tsNow(true),\n // peer: this.appPeersManager.getOutputPeer(rootScope.myId)\n // };\n // }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants',\n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n\n this.appChatsManager.saveApiChats(groupCallParticipants.chats);\n this.appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n\n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public hangUp(id: GroupCallId, discard?: boolean | number) {\n const groupCallInput = this.getGroupCallInput(id);\n let promise: Promise;\n if(typeof(discard) === 'boolean' && discard) {\n promise = this.apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(typeof(discard) === 'number') {\n promise = this.apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: discard\n });\n } else {\n promise = this.apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n return promise.then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public async joinGroupCall(groupCallId: GroupCallId, params: DataJSON, options: GroupCallConnectionInstance['options']) {\n const groupCallInput = this.getGroupCallInput(groupCallId);\n let promise: Promise;\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n return update;\n }\n\n public leaveGroupCallPresentation(groupCallId: GroupCallId) {\n return this.apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: this.getGroupCallInput(groupCallId)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputPhoto} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputMedia} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\nimport getPhotoInput from './getPhotoInput';\n\nexport default function getPhotoMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: getPhotoInput(photo),\n ttl_seconds: 0\n };\n}\n","/*\n * 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, InputMedia} from '../../../../layer';\n\nexport default function getMediaInput(doc: Document.document): 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 * 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 {MyDocument} from './appDocsManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyTopPeer} from './appUsersManager';\nimport type {AppMessagesManager, MessageSendingParams} from './appMessagesManager';\nimport {BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessageMedia, MessagesBotResults, ReplyMarkup} from '../../layer';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport {AppManager} from './manager';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateQId from './utils/inlineBots/generateQId';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\n\nexport class AppInlineBotsManager extends AppManager {\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\n private setHash: {\n [botId: UserId]: {\n peerId: PeerId,\n time: number\n }\n } = {};\n\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\n return geo._ === 'geoPoint' ? {\n _: 'inputGeoPoint',\n lat: geo.lat,\n long: geo.long,\n accuracy_radius: geo.accuracy_radius\n } : {\n _: 'inputGeoPointEmpty'\n };\n }\n\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\n return this.apiManager.invokeApi('messages.getInlineBotResults', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n query,\n geo_point: geo ? this.getGeoInput(geo) : undefined,\n offset\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((botResults) => {\n const queryId = botResults.query_id;\n\n /* if(botResults.switch_pm) {\n botResults.switch_pm.rText = wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\n } */\n\n botResults.results.forEach((result) => {\n if(result._ === 'botInlineMediaResult') {\n if(result.document) {\n result.document = this.appDocsManager.saveDoc(result.document);\n }\n\n if(result.photo) {\n result.photo = this.appPhotosManager.savePhoto(result.photo);\n }\n }\n\n this.inlineResults[generateQId(queryId, result.id)] = result;\n });\n\n return botResults;\n });\n }\n\n private pushPopularBot(botId: BotId) {\n this.appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\n const botPeerId = botId.toPeerId();\n const index = topPeers.findIndex((topPeer) => topPeer.id === botPeerId);\n let topPeer: MyTopPeer;\n if(index !== -1) {\n topPeer = topPeers[index];\n } else {\n topPeer = {\n id: botPeerId,\n rating: 0\n };\n }\n\n ++topPeer.rating;\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\n\n this.appStateManager.setKeyValueToStorage('topPeersCache');\n\n // rootScope.$broadcast('inline_bots_popular')\n });\n }\n\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\n return this.appMessagesManager.startBot(botId, undefined, startParam);\n }\n\n /*\n function resolveInlineMention (username) {\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\n if (peerId.isUser()) {\n var bot = AppUsersManager.getUser(peerId)\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\n var resolvedBot = {\n username: username,\n id: peerId,\n placeholder: bot.bot_inline_placeholder\n }\n if (bot.pFlags.bot_inline_geo &&\n GeoLocationManager.isAvailable()) {\n return checkGeoLocationAccess(peerId).then(function () {\n return GeoLocationManager.getPosition().then(function (coords) {\n resolvedBot.geo = coords\n return qSync.when(resolvedBot)\n })\n })['catch'](function () {\n return qSync.when(resolvedBot)\n })\n }\n return qSync.when(resolvedBot)\n }\n }\n return $q.reject()\n }, function (error) {\n error.handled = true\n return $q.reject(error)\n })\n }\n\n function regroupWrappedResults (results, rowW, rowH) {\n if (!results ||\n !results[0] ||\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\n return\n }\n var ratios = []\n angular.forEach(results, function (result) {\n var w\n var h, doc\n var photo\n if (result._ === 'botInlineMediaResult') {\n if (doc = result.document) {\n w = result.document.w\n h = result.document.h\n }\n else if (photo = result.photo) {\n var photoSize = (photo.sizes || [])[0]\n w = photoSize && photoSize.w\n h = photoSize && photoSize.h\n }\n }else {\n w = result.w\n h = result.h\n }\n if (!w || !h) {\n w = h = 1\n }\n ratios.push(w / h)\n })\n\n var rows = []\n var curCnt = 0\n var curW = 0\n angular.forEach(ratios, function (ratio) {\n var w = ratio * rowH\n curW += w\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\n curCnt++\n } else {\n rows.push(curCnt)\n curCnt = 1\n curW = w\n }\n })\n if (curCnt) {\n rows.push(curCnt)\n }\n\n var i = 0\n var thumbs = []\n var lastRowI = rows.length - 1\n angular.forEach(rows, function (rowCnt, rowI) {\n var lastRow = rowI === lastRowI\n var curRatios = ratios.slice(i, i + rowCnt)\n var sumRatios = 0\n angular.forEach(curRatios, function (ratio) {\n sumRatios += ratio\n })\n angular.forEach(curRatios, function (ratio, j) {\n var thumbH = rowH\n var thumbW = rowW * ratio / sumRatios\n var realW = thumbH * ratio\n if (lastRow && thumbW > realW) {\n thumbW = realW\n }\n var result = results[i + j]\n result.thumbW = Math.floor(thumbW) - 2\n result.thumbH = Math.floor(thumbH) - 2\n })\n\n i += rowCnt\n })\n } */\n\n public async checkSwitchReturn(botId: BotId) {\n const bot = this.appUsersManager.getUser(botId);\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\n return;\n }\n\n const peerData = this.setHash[botId];\n if(peerData) {\n delete this.setHash[botId];\n if((Date.now() - peerData.time) < 3600e3) {\n return peerData.peerId;\n }\n }\n }\n\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\n this.appDraftsManager.setDraft(peerId, threadId, '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()) + ' ' + query);\n }\n\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\n return this.apiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid),\n data: button.data\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true});\n }\n\n /* function gameButtonClick (id) {\n var message = AppMessagesManager.getMessage(id)\n var peerId = AppMessagesManager.getMessagePeer(message)\n\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: AppPeersManager.getInputPeerByID(peerId),\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\n if (typeof callbackAnswer.message === 'string' &&\n callbackAnswer.message.length) {\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\n }\n else if (typeof callbackAnswer.url === 'string') {\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\n }\n })\n } */\n\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n replyMarkup: ReplyMarkup,\n entities: MessageEntity[],\n clearDraft: true,\n geoPoint: GeoPoint\n }> = {}) {\n const inlineResult = this.inlineResults[queryAndResultIds];\n if(!inlineResult) {\n return;\n }\n\n this.pushPopularBot(botId);\n const splitted = queryAndResultIds.split('_');\n const queryID = splitted.shift();\n const resultID = splitted.join('_');\n options.viaBotId = botId;\n options.queryId = queryID;\n options.resultId = resultID;\n if(inlineResult.send_message.reply_markup) {\n options.replyMarkup = inlineResult.send_message.reply_markup;\n }\n\n if(inlineResult.send_message._ === 'botInlineMessageText') {\n options.entities = inlineResult.send_message.entities;\n this.appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\n } else {\n let caption = '';\n let inputMedia: Parameters[1], messageMedia: MessageMedia;\n const sendMessage = inlineResult.send_message;\n switch(sendMessage._) {\n case 'botInlineMessageMediaAuto': {\n caption = sendMessage.message;\n\n if(inlineResult._ === 'botInlineMediaResult') {\n const {document, photo} = inlineResult;\n if(document) {\n inputMedia = getDocumentMediaInput(document as MyDocument);\n } else {\n inputMedia = getPhotoMediaInput(photo as MyPhoto);\n }\n }\n\n break;\n }\n\n case 'botInlineMessageMediaGeo': {\n inputMedia = {\n _: 'inputMediaGeoPoint',\n geo_point: this.getGeoInput(sendMessage.geo)\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaVenue': {\n inputMedia = {\n _: 'inputMediaVenue',\n geo_point: this.getGeoInput(sendMessage.geo),\n title: sendMessage.title,\n address: sendMessage.address,\n provider: sendMessage.provider,\n venue_id: sendMessage.venue_id,\n venue_type: sendMessage.venue_type\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaContact': {\n inputMedia = {\n _: 'inputMediaContact',\n phone_number: sendMessage.phone_number,\n first_name: sendMessage.first_name,\n last_name: sendMessage.last_name,\n vcard: sendMessage.vcard\n };\n\n break;\n }\n\n case 'botInlineMessageMediaInvoice': {\n // const photo = sendMessage.photo;\n // inputMedia = {\n // _: 'inputMediaInvoice',\n // description: sendMessage.description,\n // title: sendMessage.title,\n // photo: photo && {\n // _: 'inputWebDocument',\n // attributes: photo.attributes,\n // mime_type: photo.mime_type,\n // size: photo.size,\n // url: photo.url\n // },\n // invoice: undefined,\n // payload: undefined,\n // provider: undefined,\n // provider_data: undefined,\n // start_param: undefined\n // };\n\n messageMedia = {\n _: 'messageMediaInvoice',\n title: sendMessage.title,\n description: sendMessage.description,\n photo: sendMessage.photo,\n currency: sendMessage.currency,\n total_amount: sendMessage.total_amount,\n pFlags: {\n shipping_address_requested: sendMessage.pFlags.shipping_address_requested,\n test: sendMessage.pFlags.test\n },\n start_param: undefined\n };\n\n break;\n }\n }\n\n if(!inputMedia && messageMedia) {\n inputMedia = {\n _: 'messageMediaPending',\n messageMedia\n };\n }\n\n this.appMessagesManager.sendOther(peerId, inputMedia, options);\n }\n }\n\n /* function checkGeoLocationAccess (botID) {\n var key = 'bot_access_geo' + botID\n return Storage.get(key).then(function (geoAccess) {\n if (geoAccess && geoAccess.granted) {\n return true\n }\n return ErrorService.confirm({\n type: 'BOT_ACCESS_GEO_INLINE'\n }).then(function () {\n var setHash = {}\n setHash[key] = {granted: true, time: tsNow()}\n Storage.set(setHash)\n return true\n }, function () {\n var setHash = {}\n setHash[key] = {denied: true, time: tsNow()}\n Storage.set(setHash)\n return $q.reject()\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 {MESSAGE_ID_INCREMENT} from './utils/messageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport class AppMessagesIdsManager {\n private tempNum = 0;\n\n public generateTempMessageId(messageId: number) {\n const num = ++this.tempNum;\n return generateMessageId(messageId) + (num & (MESSAGE_ID_INCREMENT - 1));\n }\n}\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 const overflowPart = part.slice(maxLength);\n const splitted = splitStringByLength(overflowPart, maxLength);\n splitted.forEach((part) => {\n out[arrayIndex++] = part;\n });\n\n part = part.slice(0, maxLength);\n }\n\n lastSliceStartIndex = end;\n length = 0;\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\n };\n\n let lastIndex = 0;\n do {\n let index = str.indexOf(delimiter, lastIndex);\n if(index === -1) {\n if(lastIndex !== (str.length - 1)) {\n cut();\n }\n\n break;\n }\n\n index += delimiter.length;\n\n const partLength = index - lastIndex;\n if((length + partLength) > maxLength) {\n cut(length);\n }\n\n lastIndex = index;\n length += partLength;\n } while(true);\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {TabState} from '../mtproto/mtprotoworker';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\ntype Tab = {\n source: MessageEventSource,\n state: TabState\n};\n\nexport class AppTabsManager {\n private tabs: Map;\n\n constructor() {\n this.tabs = new Map();\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('tabState', (state, source) => {\n const tab = this.tabs.get(source);\n tab.state = state;\n });\n }\n\n public getTabs() {\n return [...this.tabs.values()].filter((tab) => !!tab.state);\n }\n\n public addTab(source: MessageEventSource) {\n const tab: Tab = {\n source,\n state: undefined\n };\n\n this.tabs.set(source, tab);\n }\n\n public deleteTab(source: MessageEventSource) {\n this.tabs.delete(source);\n }\n}\n\nconst appTabsManager = new AppTabsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appTabsManager = appTabsManager);\nexport default appTabsManager;\n","import {InputDocument} from '../../../../layer';\nimport type {MyDocument} from '../../appDocsManager';\n\nexport default function getDocumentInput(doc: MyDocument): InputDocument {\n return {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n };\n}\n","export default function setBooleanFlag(obj: T, key: keyof T, value: boolean) {\n // @ts-ignore\n if(value) obj[key] = true;\n else delete obj[key];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LazyLoadQueueBase from '../../components/lazyLoadQueueBase';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport tsNow from '../../helpers/tsNow';\nimport {randomLong} from '../../helpers/random';\nimport {Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer, MessageReactions, Document, InputFile, Reaction, ForumTopic as MTForumTopic, MessagesForumTopics, MessagesGetReplies, MessagesGetHistory, MessagesAffectedHistory} from '../../layer';\nimport {ArgumentTypes, InvokeApiOptions} from '../../types';\nimport {logger, LogTypes} from '../logger';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport DialogsStorage, {GLOBAL_FOLDER_ID} from '../storages/dialogs';\nimport {ChatRights} from './appChatsManager';\nimport {MyDocument} from './appDocsManager';\nimport {MyPhoto} from './appPhotosManager';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport DEBUG from '../../config/debug';\nimport SlicedArray, {Slice, SliceEnd} from '../../helpers/slicedArray';\nimport {FOLDER_ID_ALL, GENERAL_TOPIC_ID, MUTE_UNTIL, NULL_PEER_ID, REAL_FOLDER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID, THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n// import telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {getMiddleware} from '../../helpers/middleware';\nimport assumeType from '../../helpers/assumeType';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport splitStringByLength from '../../helpers/string/splitStringByLength';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {AppManager} from './manager';\nimport type {MediaSize} from '../../helpers/mediaSize';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport mergeEntities from '../richTextProcessor/mergeEntities';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport filterMessagesByInputFilter from './utils/messages/filterMessagesByInputFilter';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\nimport getDocumentInputFileName from './utils/docs/getDocumentInputFileName';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport type {Progress} from './appDownloadManager';\nimport noop from '../../helpers/noop';\nimport appTabsManager from './appTabsManager';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getAlbumText from './utils/messages/getAlbumText';\nimport pause from '../../helpers/schedulers/pause';\nimport makeError from '../../helpers/makeError';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport {BroadcastEvents} from '../rootScope';\nimport setBooleanFlag from '../../helpers/object/setBooleanFlag';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\n\n// console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: number[],\n isEnd: ReturnType['getEnds']>,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\nexport type ForumTopic = MTForumTopic.forumTopic;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty'\n | 'inputMessagesFilterPhotos'\n | 'inputMessagesFilterPhotoVideo'\n | 'inputMessagesFilterVideo'\n | 'inputMessagesFilterDocument'\n | 'inputMessagesFilterVoice'\n | 'inputMessagesFilterRoundVoice'\n | 'inputMessagesFilterRoundVideo'\n | 'inputMessagesFilterMusic'\n | 'inputMessagesFilterUrl'\n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map & {peerId: PeerId, type: MessagesStorageType, key: MessagesStorageKey};\nexport type MessagesStorageType = 'scheduled' | 'history' | 'grouped';\nexport type MessagesStorageKey = `${PeerId}_${MessagesStorageType}`;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\ntype MapValueType = A extends Map ? V : never;\n\nexport type BatchUpdates = {\n 'messages_reactions': AppMessagesManager['batchUpdateReactions'],\n 'messages_views': AppMessagesManager['batchUpdateViews']\n};\n\ntype PendingMessageDetails = {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage,\n sequential?: boolean\n};\n\nconst processAfter = (cb: () => void) => {\n // setTimeout(cb, 0);\n cb();\n};\n\nconst UPDATE_STICKERSET_ORDER = true;\n\nexport type MessageSendingParams = Partial<{\n threadId: number,\n replyToMsgId: number,\n scheduleDate: number,\n silent: boolean,\n sendAsPeerId: number,\n}>;\n\nexport class AppMessagesManager extends AppManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n private groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n private pinnedMessages: {[key: string]: PinnedStorage};\n\n private threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: PendingMessageDetails\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise,\n callback: (message: MyMessage) => Promise\n }>\n }\n } = {};\n\n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise;\n private extendedMedia: Map>> = new Map();\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: Map}> = new Map();\n public newUpdatesAfterReloadToHandle: {[key: string]: Set} = {};\n\n private notificationsHandlePromise: number;\n private notificationsToHandle: {[key: string]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n private groupedTempId = 0;\n\n private typings: {[key: string]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[key: string]: SlicedArray} = {};\n private goToNextMentionPromises: {[key: string]: Promise} = {};\n\n private batchUpdates: {\n [k in keyof BatchUpdates]?: {\n callback: BatchUpdates[k],\n batch: ArgumentTypes[0]\n }\n } = {};\n private batchUpdatesDebounced: () => Promise;\n\n private uploadFilePromises: {[fileName: string]: CancellablePromise};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateMessageReactions: this.onUpdateMessageReactions,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages,\n\n updateMessageExtendedMedia: this.onUpdateMessageExtendedMedia\n });\n\n // ! Invalidate notify settings, can optimize though\n this.rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: typeof dialogs[0]) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => this.appPeersManager.isBroadcast(dialog.peerId);\n else filterFunc = (dialog) => this.appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach((dialog) => {\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n this.rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage',\n webpage: this.appWebPagesManager.getCachedWebPage(id)\n };\n\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n });\n });\n\n this.rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog({dialog});\n }\n\n this.rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft\n });\n } else if(threadId) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(!chat) {\n this.reloadConversation(peerId);\n } else if((chat as Chat.channel).pFlags.forum) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n this.rootScope.addEventListener('poll_update', ({poll}) => {\n const set = this.appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n }\n });\n\n this.batchUpdatesDebounced = debounce(() => {\n for(const event in this.batchUpdates) {\n const details = this.batchUpdates[event as keyof BatchUpdates];\n delete this.batchUpdates[event as keyof BatchUpdates];\n\n // @ts-ignore\n const result = details.callback(details.batch);\n if(result && (!(result instanceof Array) || result.length)) {\n // @ts-ignore\n rootScope.dispatchEvent(event as keyof BatchUpdates, result);\n }\n }\n }, 33, false, true);\n\n return this.appStateManager.getState().then((state) => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear = (init?: boolean) => {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n this.uploadFilePromises = {};\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear(init);\n this.filtersStorage && this.filtersStorage.clear(init);\n };\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = this.appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: MyMessage) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ??= {};\n const obj = 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 const entities = options.entities || [];\n if(text) {\n text = parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return this.apiManager.invokeApi('messages.editMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n\n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public async sendText(peerId: PeerId, text: string, options: MessageSendingParams & Partial<{\n entities: MessageEntity[],\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n }> = {}): Promise {\n if(!text.trim()) {\n return;\n }\n\n options.entities ??= [];\n\n // this.checkSendOptions(options);\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const config = await this.apiManager.getConfig();\n const MAX_LENGTH = config.message_length_max;\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n if(splitted.length > 1) {\n if(options.webPage?._ === 'webPage' && !text.includes(options.webPage.url)) {\n delete options.webPage;\n }\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n const entities = options.entities;\n if(!options.viaBotId) {\n text = parseMarkdown(text, entities);\n // entities = mergeEntities(entities, parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = this.appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError();\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent,\n send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }, sentRequestOptions);\n }\n\n /* function is(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n // this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n // this.log('sendText sent', message.mid);\n // if(is(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n // assumeType(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n defineNotNumerableProperties(message, ['promise']);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n // this.reloadConversation(peerId);\n\n // setTimeout(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n // }, 5000);\n message.promise.resolve();\n }, (error: ApiError) => {\n toggleError(error);\n message.promise.reject(error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n const promises: ReturnType[] = [message.promise];\n for(let i = 1; i < splitted.length; ++i) {\n promises.push(this.sendText(peerId, splitted[i], options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public sendFile(peerId: PeerId, file: File | Blob | MyDocument, options: MessageSendingParams & Partial<{\n isRoundMessage: true,\n isVoiceMessage: true,\n isGroupedItem: true,\n isMedia: true,\n\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: boolean,\n clearDraft: boolean,\n noSound: boolean,\n\n waveform: Uint8Array,\n\n // ! only for internal use\n processAfter?: typeof processAfter\n }> = {}) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = getEnvironment().IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n const 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: THUMB_TYPE_FULL,\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n const cacheContext = this.thumbsStorage.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n photo = this.appPhotosManager.savePhoto(photo);\n } else if(getEnvironment().VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage,\n supports_streaming: true\n },\n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound &&\n file.size > (10 * 1024) &&\n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n if(options.objectURL) {\n const cacheContext = this.thumbsStorage.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL;\n }\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: THUMB_TYPE_FULL,\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = this.thumbsStorage.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n\n document = this.appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const sentDeferred = deferredPromise();\n // sentDeferred.cancel = () => {\n // const error = new Error('Download canceled');\n // error.name = 'AbortError';\n // sentDeferred.reject(error);\n\n // if(uploadPromise?.cancel) {\n // uploadPromise.cancel();\n // }\n // };\n\n const media: MessageMedia = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n // preloader,\n photo,\n document\n };\n\n if(media) {\n defineNotNumerableProperties(media as any, ['promise']);\n (media as any).promise = sentDeferred;\n }\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file\n } as MessageMedia.messageMediaDocument : media;\n\n const uploadingFileName = !isDocument ? getFileNameForUpload(file) : undefined;\n message.uploadingFileName = uploadingFileName;\n\n if(uploadingFileName) {\n this.uploadFilePromises[uploadingFileName] = sentDeferred;\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: getDocumentInput(file)\n };\n\n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n\n uploadPromise = this.apiFileManager.upload({file, fileName: uploadingFileName});\n uploadPromise.catch((err) => {\n if(!uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n sentDeferred.reject(err);\n }\n });\n\n uploadPromise.addNotifyListener((progress: Progress) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0}, undefined, options.threadId);\n }\n sentDeferred.notifyAll(progress);\n });\n\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL && options.thumb?.blob) {\n thumbUploadPromise = this.apiFileManager.upload({file: options.thumb.blob});\n }\n\n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto',\n file: inputFile\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument',\n file: inputFile,\n mime_type: fileType,\n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : undefined\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n\n sentDeferred.resolve(inputMedia);\n }, (error: ApiError) => {\n toggleError(error);\n throw error;\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 processAfter: options.processAfter\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then((inputMedia) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n return this.apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\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(error);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n const ret: {\n message: typeof message,\n promise: typeof sentDeferred\n } = {\n message\n } as any;\n\n defineNotNumerableProperties(ret, ['promise']);\n ret.promise = sentDeferred;\n\n return ret;\n }\n\n public async sendAlbum(peerId: PeerId, files: File[], options: MessageSendingParams & Partial<{\n isMedia: true,\n entities: MessageEntity[],\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 clearDraft: true\n }> = {}) {\n // this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', files, options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const callbacks: Array<() => void> = [];\n const processAfter = (cb: () => void) => {\n callbacks.push(cb);\n };\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 processAfter,\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 callbacks.push(() => {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n });\n }\n\n callbacks.forEach((callback) => {\n callback();\n });\n\n // * test pending\n // return;\n\n const toggleError = (message: Message.message, error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return this.apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error: ApiError) => {\n messages.forEach((message) => toggleError(message, error));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return this.apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then((messageMedia) => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = this.appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = getPhotoMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = this.appDocsManager.saveDoc(messageMedia.document);\n inputMedia = getDocumentMediaInput(doc);\n }\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: ApiError) => {\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, err);\n throw err;\n });\n });\n\n return Promise.all(promises).then((inputs) => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, this.appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(\n peerId: PeerId,\n inputMedia: InputMedia | {_: 'messageMediaPending', messageMedia: MessageMedia},\n options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n geoPoint: GeoPoint\n }> = {}\n ) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n this.appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = this.appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: this.appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = this.appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n\n case 'messageMediaPending': {\n media = (inputMedia as any).messageMedia;\n break;\n }\n }\n\n message.media = media;\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia as 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 update_stickersets_order: UPDATE_STICKERSET_ORDER\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n toggleError(error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n return message.promise;\n }\n\n /* 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: Pick & Partial<{\n isGroupedItem: boolean,\n isScheduled: boolean,\n clearDraft: boolean,\n sequential: boolean,\n processAfter?: (cb: () => void) => void\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n message.storageKey = storage.key;\n const callbacks: Array<() => void> = [];\n if(options.isScheduled) {\n // if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n callbacks.push(() => {\n this.rootScope.dispatchEvent('scheduled_new', message);\n });\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 this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n\n if(options.threadId) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, options.threadId);\n if(forumTopic) {\n this.setDialogTopMessage(message, forumTopic);\n }\n }\n\n callbacks.push(() => {\n this.rootScope.dispatchEvent('history_append', {storageKey: storage.key, message});\n });\n }\n\n const pending: PendingMessageDetails = this.pendingByRandomId[message.random_id] = {\n peerId,\n tempId: messageId,\n threadId: options.threadId,\n storage,\n sequential: options.sequential\n };\n\n this.pendingTopMsgs[peerId] = messageId;\n\n if(!options.isGroupedItem && message.send) {\n callbacks.push(() => {\n if(options.clearDraft) {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n });\n }\n\n if(callbacks.length) {\n (options.processAfter || processAfter)(() => {\n for(const callback of callbacks) {\n callback();\n }\n });\n }\n\n return pending;\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = this.appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = this.appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: options.sendAsPeerId ? this.appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor,\n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + this.timeManager.getServerTimeOffset()),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(peerId, options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true\n };\n\n defineNotNumerableProperties(message, ['send', 'promise']);\n if(options.groupId === undefined) {\n message.promise = deferredPromise();\n }\n\n return message;\n }\n\n private generateReplyHeader(peerId: PeerId, replyToMsgId: number, replyToTopId?: number) {\n const header: MessageReplyHeader = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n pFlags: {}\n };\n\n if(replyToTopId && this.appPeersManager.isForum(peerId) && GENERAL_TOPIC_ID !== replyToTopId) {\n header.pFlags.forum_topic = true;\n }\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(this.appPeersManager.isBroadcast(peerId)) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(this.appPeersManager.isAnyChat(peerId) && (this.appPeersManager.isBroadcast(peerId) || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = this.appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!this.appPeersManager.isChannel(peerId) && !this.appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(this.appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = this.appUsersManager.getSelf().id.toPeerId();\n const fromId = originalMessage.fromId;\n if(fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n let isUserHidden = false;\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.post_author = originalMessage.post_author;\n\n if(fromId.isUser()) {\n const userFull = this.appProfileManager.getCachedFullUser(fromId.toUserId());\n if(userFull?.private_forward_name) {\n fwdHeader.from_name = userFull.private_forward_name;\n isUserHidden = true;\n }\n }\n\n if(!isUserHidden) {\n fwdHeader.from_id = this.appPeersManager.getOutputPeer(fromId);\n }\n }\n\n if(this.appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n\n if(peerId === myId && !isUserHidden) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = this.appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message: Message.messageService = {\n _: 'messageService',\n pFlags: {},\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n id: maxId,\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n };\n\n this.getHistoryMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public getUploadPromise(uploadFileName: string) {\n return this.uploadFilePromises[uploadFileName];\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n if(!peerId.isAnyChat()) {\n return false;\n }\n\n const chat = this.appPeersManager.getPeer(peerId);\n return (chat as Chat.channel).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(\n message: MyMessage,\n dialog: MTDialog.dialog | ForumTopic = this.getDialogOnly(message.peerId)\n ) {\n if(!dialog) {\n return;\n }\n\n dialog.top_message = message.mid;\n\n const historyStorage = this.getHistoryStorage(message.peerId, dialog._ === 'forumTopic' ? dialog.id : undefined);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n\n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = getPeerId(dialog.peer);\n const mid = generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n\n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach((dialog) => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages({limit: 100, folderId: 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 getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId && !this.appChatsManager.isForum(peerId.toChatId())) {\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 // readMaxId can be 4294967295 (0)\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId && getServerMessageId(readMaxId) ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages({limit, folderId}: {\n limit: number,\n folderId: number\n }) {\n // const dialogs = this.dialogsStorage.getFolder(folderId);\n const offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n let offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += this.timeManager.getServerTimeOffset();\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n const peerId = this.dialogsStorage.isFilterIdForForum(folderId) ? folderId : undefined;\n\n let promise: Promise, params: any;\n if(peerId) {\n const _promise = this.apiManager.invokeApi('channels.getForumTopics', params = {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit: useLimit,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_topic: 0\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n\n promise = this.dialogsStorage.processTopicsPromise(peerId, _promise);\n } else {\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n promise = this.apiManager.invokeApiSingle('messages.getDialogs', params = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return promise.then((result) => {\n if(!middleware() || result._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', result);\n }\n\n // can reset pinned order here\n if(!peerId && !offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!peerId && !offsetDate) {\n // telegramMeWebManager.setAuthorized(true);\n this.appDraftsManager.addMissedDialogs();\n }\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.saveMessages(result.messages);\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const setFolderId: REAL_FOLDER_ID = folderId === GLOBAL_FOLDER_ID ? FOLDER_ID_ALL : folderId as REAL_FOLDER_ID;\n const saveGlobalOffset = !!peerId || folderId === GLOBAL_FOLDER_ID;\n const items: Array =\n (result as MessagesDialogs.messagesDialogsSlice).dialogs as Dialog[] ||\n (result as MessagesForumTopics).topics as ForumTopic[];\n forEachReverse(items, (dialog) => {\n if(!dialog) {\n return;\n }\n\n // const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(!peerId) {\n (dialog as Dialog).folder_id ??= setFolderId;\n }\n\n this.dialogsStorage.saveDialog({\n dialog,\n ignoreOffsetDate: true,\n saveGlobalOffset\n });\n\n if(dialog.peerId === undefined) {\n return;\n }\n\n if(!maxSeenIdIncremented &&\n !this.appPeersManager.isChannel(dialog.peerId || this.appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n if(offsetIndex && getDialogIndex(dialog) > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!peerId && !getServerMessageId(dialog.read_inbox_max_id) && !getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs.set(dialog.peerId, {dialog: dialog as Dialog});\n\n this.log.error('noIdsDialogs', dialog, params);\n }\n });\n\n if(noIdsDialogs.size) {\n // setTimeout(() => { // test bad situation\n const peerIds = [...noIdsDialogs.keys()];\n const promises = peerIds.map((peerId) => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n this.rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n\n for(let i = 0; i < peerIds.length; ++i) {\n const peerId = peerIds[i];\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog: this.getDialogOnly(peerId)\n });\n }\n });\n // }, 10e3);\n }\n\n const count = (result as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n if(getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */\n !count ||\n dialogsLength >= count ||\n !items.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map());\n }\n\n const dialogs = items;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1],\n count,\n dialogs: slicedDialogs\n };\n });\n }\n\n public async forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: MessageSendingParams & Partial<{\n withMyScore: true,\n dropAuthor: boolean,\n dropCaptions: boolean\n }> = {}) {\n delete options.replyToMsgId;\n delete options.threadId;\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n --length;\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMids: number[] = [];\n const newMessages = mids.map((mid) => {\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n newMids.push(message.id);\n\n const keys: Array = [\n 'entities',\n 'media'\n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n\n if(message.fwd_from?.from_name && peerId === this.appPeersManager.peerId) {\n delete message.from_id;\n }\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n const replyToMid = originalMessage.reply_to?.reply_to_msg_id;\n const replyToMessageIdx = mids.indexOf(replyToMid);\n if(replyToMid && replyToMessageIdx !== -1) {\n const newReplyToMid = newMids[replyToMessageIdx];\n message.reply_to = {\n _: 'messageReplyHeader',\n reply_to_msg_id: newReplyToMid\n };\n\n /* this.invokeAfterMessageIsSent(newReplyToMid, 'reply', async(originalMessage) => {\n message.reply_to.reply_to_msg_id = originalMessage.mid;\n }); */\n }\n\n keys.forEach((key) => {\n // @ts-ignore\n message[key] = copy(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 if(document.sticker && !this.rootScope.premium) {\n const effectThumb = getStickerEffectThumb(document);\n if(effectThumb) {\n (message.media as MessageMedia.messageMediaDocument).pFlags.nopremium = true;\n }\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ??= {tempId: '' + ++this.groupedTempId, messages: []};\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach((message) => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach((message) => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n sequential: true\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */this.apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: this.appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n random_id: newMessages.map((message) => message.random_id),\n to_peer: this.appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n this.onMessagesSendError(newMessages, error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.forwardMessages(peerId, fromPeerId, overflowMids, options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public generateEmptyMessage(mid: number): Message.message | Message.messageService {\n return undefined;\n // return {\n // _: 'messageEmpty',\n // id: getServerMessageId(mid),\n // mid,\n // deleted: true,\n // pFlags: {}\n // };\n }\n\n private onMessagesSendError(messages: Message.message[], error?: ApiError) {\n messages.forEach((message) => {\n if(message.error === error) {\n return;\n }\n\n if(error) {\n message.error = error;\n this.rootScope.dispatchEvent('message_error', {storageKey: message.storageKey, tempId: message.mid, error});\n\n const dialog = this.getDialogOnly(message.peerId);\n if(dialog) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId: message.peerId, dialog});\n }\n } else {\n delete message.error;\n }\n });\n }\n\n public getMessagesStorageByKey(key: MessagesStorageKey) {\n const s = key.split('_');\n const peerId: PeerId = +s[0];\n const type: MessagesStorageType = s[1] as any;\n return type === 'scheduled' ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n }\n\n public getMessageFromStorage(storage: MessagesStorage | MessagesStorageKey, mid: number) {\n if(typeof(storage) === 'string') {\n storage = this.getMessagesStorageByKey(storage);\n }\n\n return storage && storage.get(mid)/* || this.generateEmptyMessage(mid) */;\n }\n\n private createMessageStorage(peerId: PeerId, type: MessagesStorageType) {\n const storage: MessagesStorage = new Map() as any;\n storage.peerId = peerId;\n storage.type = type;\n storage.key = `${peerId}_${type}`;\n\n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num,\n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getHistoryMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ??= this.createMessageStorage(peerId, 'history');\n }\n\n public getMessagesStorage(key: MessagesStorageKey | MessagesStorage): MessagesStorage {\n if(typeof(key) === 'object') {\n return key;\n } else {\n return this.getMessagesStorageByKey(key);\n }\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(this.appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getHistoryMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && this.appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public cantForwardDeleteMids(storageKey: MessagesStorageKey, mids: number[]) {\n const storage = this.getMessagesStorage(storageKey);\n let cantForward = !mids.length, cantDelete = !mids.length;\n for(const mid of mids) {\n const message = this.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.canForward(message);\n }\n\n if(!cantDelete) {\n cantDelete = !this.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n return {cantForward, cantDelete};\n }\n\n public reloadConversationOrTopic(peerId: PeerId, threadId?: number) {\n if(threadId) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\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 = this.appPeersManager.getPeerId(inputPeer);\n this.log.warn('reloadConversation', peerId);\n\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: this.appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = pause(0).then(() => {\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 const fullfillLeft = () => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n promises[peerId].resolve(undefined);\n }\n };\n\n const invoke = async() => {\n for(;;) {\n const result = await this.apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers});\n const currentState = this.apiUpdatesManager.updatesState;\n const {state} = result;\n if(currentState.pts && currentState.pts !== state.pts) {\n await pause(500);\n continue;\n }\n\n return result;\n }\n };\n\n return invoke().then((result) => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n }\n\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 }, noop).then(() => {\n fullfillLeft();\n\n this.reloadConversationsPromise = null;\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peerId: PeerId, just_clear?: boolean, revoke?: boolean, threadId?: number): Promise {\n let promise: Promise;\n const processResult = (affectedHistory: MessagesAffectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peerId, just_clear, revoke, threadId);\n };\n\n if(!threadId) {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'messages.deleteHistory',\n params: {\n just_clear,\n revoke,\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: 0\n },\n processResult\n });\n } else {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'channels.deleteTopicHistory',\n params: {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n top_msg_id: getServerMessageId(threadId)\n },\n processResult\n });\n }\n\n return promise;\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean, threadId?: number) {\n if(this.appPeersManager.isChannel(peerId) && !threadId) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = await promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return this.apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: this.appChatsManager.getChannelInput(channelId),\n max_id: getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(peerId, justClear, revoke, threadId).then(() => {\n if(!threadId) {\n this.flushStoragesByPeerId(peerId);\n }\n\n if(justClear) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog: this.getDialogOnly(peerId)});\n } else {\n const key = this.getTypingKey(peerId, threadId);\n delete this.notificationsToHandle[key];\n delete this.typings[key];\n\n if(!threadId) {\n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId, threadId);\n }\n });\n }\n\n private flushStoragesByPeerId(peerId: PeerId) {\n [\n this.historiesStorage,\n this.threadsStorage,\n this.searchesStorage,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach((s) => {\n delete s[peerId];\n });\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId || key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n\n const needSingleMessages = this.needSingleMessages.get(peerId);\n if(needSingleMessages) {\n for(const [mid, promise] of needSingleMessages) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n\n needSingleMessages.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 this.dialogsStorage.flushForumTopicsCache(peerId);\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n this.appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n this.rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessagesKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public getPinnedMessage(peerId: PeerId, threadId?: number) {\n const p = this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)] ??= {};\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 threadId\n }).then((result) => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public getPinnedMessagesCount(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.count;\n }\n\n public getPinnedMessagesMaxId(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.maxId;\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return this.apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: getServerMessageId(mid)\n }).then((updates) => {\n // this.log('pinned updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return this.apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId)\n }).then((affectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getHistoryMessagesStorage(peerId);\n storage.forEach((message) => {\n if((message as Message.message).pFlags.pinned) {\n delete (message as Message.message).pFlags.pinned;\n }\n });\n\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[this.getPinnedMessagesKey(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 return getAlbumText(Array.from(group.values()) as Message.message[]);\n }\n\n public getGroupsFirstMessage(message: Message.message) {\n if(!message?.grouped_id) return message;\n\n const storage = this.groupedMessagesStorage[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return this.getMessageFromStorage(storage, minMid) as Message.message;\n }\n\n public getMidsByAlbum(groupedId: string, sort: 'asc' | 'desc' = 'asc') {\n return getObjectKeysAndSort(this.groupedMessagesStorage[groupedId], sort);\n }\n\n public getMessagesByAlbum(groupedId: string) {\n const mids = this.getMidsByAlbum(groupedId, 'asc');\n const storage = this.groupedMessagesStorage[groupedId];\n return mids.map((mid) => this.getMessageFromStorage(storage, mid) as Message.message);\n }\n\n public getMidsByMessage(message: Message) {\n if(!message) return [];\n else if((message as Message.message).grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: MyMessage, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if((message as Message.message).grouped_id) {\n const storage = this.groupedMessagesStorage[(message as Message.message).grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return this.appMessagesIdsManager.generateTempMessageId(dialog?.top_message || 0);\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n // isNew: boolean, // * new - from update\n }> = {}) {\n if(!message || message._ === 'messageEmpty') {\n return;\n }\n\n message.pFlags ??= {};\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getHistoryMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && this.appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n\n const mid = generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ??= this.createMessageStorage(peerId, 'grouped');\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out ?\n 'read_outbox_max_id' :\n 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n const replyTo = message.reply_to;\n if(replyTo) {\n if(replyTo.reply_to_msg_id) {\n replyTo.reply_to_msg_id = message.reply_to_mid = generateMessageId(replyTo.reply_to_msg_id);\n }\n\n if(replyTo.reply_to_top_id) {\n replyTo.reply_to_top_id = generateMessageId(replyTo.reply_to_top_id);\n }\n }\n\n const replies = isMessage && message.replies;\n if(replies) {\n if(replies.max_id) replies.max_id = generateMessageId(replies.max_id);\n if(replies.read_max_id) replies.read_max_id = generateMessageId(replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= this.timeManager.getServerTimeOffset();\n }\n\n // storage.generateIndex(message);\n const myId = this.appPeersManager.peerId;\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? this.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 : this.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 = generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = this.appPeersManager.getPeerId(peer);\n const savedFromMid = generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = this.appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= this.timeManager.getServerTimeOffset();\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find((entity) => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n let unsupported = false;\n const media = isMessage && message.media;\n if(media) {\n switch(media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n media.photo = this.appPhotosManager.savePhoto(media.photo, mediaContext);\n }\n\n if(!(media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n\n break;\n }\n\n case 'messageMediaPoll': {\n const result = this.appPollsManager.savePoll(media.poll, media.results, message);\n media.poll = result.poll;\n media.results = result.results;\n break;\n }\n\n case 'messageMediaDocument': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = media.document;\n media.document = this.appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!media.document && originalDoc._ !== 'documentEmpty') {\n unsupported = true;\n }\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n media.webpage = this.appWebPagesManager.saveWebPage(media.webpage, messageKey, mediaContext);\n\n if(!media.webpage) {\n delete message.media;\n }\n\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 media.photo = this.appWebDocsManager.saveWebDocument(media.photo);\n const extendedMedia = media.extended_media;\n if(extendedMedia?._ === 'messageExtendedMedia') {\n const extendedMediaMedia = extendedMedia.media;\n (extendedMediaMedia as MessageMedia.messageMediaPhoto).photo = this.appPhotosManager.savePhoto((extendedMediaMedia as MessageMedia.messageMediaPhoto).photo, mediaContext);\n (extendedMediaMedia as MessageMedia.messageMediaDocument).document = this.appDocsManager.saveDoc((extendedMediaMedia as MessageMedia.messageMediaDocument).document, mediaContext);\n }\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n }\n\n // if(isMessage && !unsupported && message.entities) {\n // unsupported = message.entities.some((entity) => entity._ === 'messageEntityCustomEmoji');\n // }\n\n if(isMessage && unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n const suffix = message.fromId === this.appUsersManager.getSelf().id ? 'You' : '';\n let migrateFrom: PeerId, migrateTo: PeerId;\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = this.appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = this.appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n // case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n\n case 'messageActionGroupCall': {\n // assumeType(action);\n\n this.appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n // apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type =\n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed' ?\n 'missed' :\n 'cancelled'\n )\n );\n break;\n }\n\n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message);\n }\n\n storage.set(mid, message);\n\n return message;\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n // isNew: boolean, // * new - from update\n }> = {}): (Message.message | Message.messageService)[] {\n if((messages as any).saved) return messages;\n (messages as any).saved = true;\n messages.forEach((message, idx, arr) => {\n arr[idx] = this.saveMessage(message, options);\n });\n\n return messages;\n }\n\n public async getFirstMessageToEdit(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMessage: Message.message | Message.messageService;\n const myPeerId = this.appPeersManager.peerId;\n for(const mid of slice) {\n const message = this.getMessageByPeer(peerId, mid);\n const good = myPeerId === peerId ? message.fromId === myPeerId : message.pFlags.out;\n\n if(good) {\n if(await this.canEditMessage(message, 'text')) {\n goodMessage = message;\n break;\n }\n\n // * this check will allow editing only last message\n // break;\n }\n }\n\n return goodMessage;\n }\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = fixEmoji(message.message, apiEntities);\n\n const myEntities = parseEntities(message.message);\n message.totalEntities = mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return this.apiManager.invokeApiSingle('messages.report', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return this.apiManager.invokeApi('messages.startBot', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error: ApiError) => {\n if(error?.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n return this.sendText(peerId, str + '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()));\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n this.apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map((peerId) => {\n return {\n _: 'inputFolderPeer',\n peer: this.appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then((updates) => {\n // this.log('editPeerFolders updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public getFilter(filterId: number) {\n return this.filtersStorage.getFilter(filterId);\n }\n\n public async toggleDialogPin(options: {\n peerId: PeerId,\n filterId?: number,\n topicId?: number\n }) {\n const {peerId, topicId, filterId = topicId ? peerId : undefined} = options;\n if(filterId === undefined) {\n throw new Error('No filterId');\n }\n\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, topicId);\n if(!dialog) throw undefined;\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = await this.apiManager.getLimit(topicId ? 'topicPin' : (filterId === 1 ? 'folderPin' : 'pin'));\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n throw makeError(topicId ? 'PINNED_TOO_MUCH' : 'PINNED_DIALOGS_TOO_MUCH');\n }\n }\n\n if(topicId) {\n return this.appChatsManager.updatePinnedForumTopic(peerId.toChatId(), topicId, pinned);\n }\n\n return this.apiManager.invokeApi('messages.toggleDialogPin', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then((bool) => {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n this.apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: this.appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return this.apiManager.invokeApi('messages.markDialogUnread', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then((bool) => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: this.appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n this.appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = this.appChatsManager.getChat(migrateFrom.toChatId()) as Chat.chat;\n if(fromChat?.migrated_to && (fromChat.migrated_to as InputChannel.inputChannel).channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n this.rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n }\n }\n }\n\n private canMessageBeEdited(message: Message, kind: 'text' | 'poll') {\n if((message as Message.message)?.pFlags?.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(!message ||\n message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && this.appUsersManager.isBot(message.fromId)) {\n return false;\n }\n\n if(message.media?._ === 'messageMediaDocument' &&\n ((message.media.document as Document.document).sticker || (message.media.document as Document.document).type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public async canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === this.appUsersManager.getSelf().id) {\n return true;\n }\n\n if(!message.pFlags.out || (\n message.peer_id._ !== 'peerChannel' &&\n message.date < (tsNow(true) - (await this.apiManager.getConfig()).edit_time_limit) &&\n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() ||\n message.pFlags.out ||\n this.appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' ||\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && (!message.pFlags.is_outgoing || !!message.error);\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n if(!message) {\n return false;\n }\n\n const 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 = this.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 this.appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(\n peerId: PeerId,\n filters: MessagesFilter[],\n canCache = true,\n threadId?: number\n ): Promise {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return Promise.resolve(filters.map((filter) => {\n return {\n _: 'messages.searchCounter',\n pFlags: {},\n filter: filter,\n count: 0\n };\n }));\n }\n\n const func = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n return func('messages.getSearchCounters', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n filters,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n });\n }\n\n public filterMessagesByInputFilterFromStorage(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage | MessagesStorageKey, limit: number) {\n const _storage = this.getMessagesStorage(storage);\n return filterMessagesByInputFilter(inputFilter, history.map((mid) => _storage.get(mid)), limit);\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(this.appPeersManager.isPeerRestricted(peerId)/* || true */) {\n return Promise.resolve({\n count: 0,\n offset_id_offset: 0,\n next_rate: undefined,\n history: []\n });\n }\n\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n // this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n // const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ?\n this.getSearchStorage(peerId, inputFilter._) as any :\n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilterFromStorage(inputFilter._, storage.history.slice, this.getHistoryMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: getServerMessageId(threadId) || 0\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n // var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n const offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n // offsetDate = offsetMessage.date + timeManager.getServerTimeOffset();\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n this.appUsersManager.saveApiUsers(searchResult.users);\n this.appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter((mid) => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: this.appMessagesIdsManager.generateTempMessageId(maxMessageId),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.peerId, message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n }\n\n public getThreadServiceMessageId(peerId: PeerId, threadId: number) {\n return this.threadsServiceMessagesIdsStorage[peerId + '_' + threadId];\n }\n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((result) => {\n this.appChatsManager.saveApiChats(result.chats);\n this.appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.getMessageWithReplies(result.messages[0] as Message.message);\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n\n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n const newMaxId = result.max_id = generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = generateMessageId(result.read_outbox_max_id) || 0;\n\n const first = historyStorage.history.first;\n if(historyStorage.maxId && historyStorage.maxId < newMaxId && first.isEnd(SliceEnd.Bottom)) {\n first.unsetEnd(SliceEnd.Bottom);\n }\n historyStorage.maxId = newMaxId;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(message: MyMessage) {\n this.rootScope.dispatchEvent('history_multiappend', message);\n }\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const updateMap: BroadcastEvents['dialogs_multiupdate']= new Map();\n\n const processDialog = (dialog: MTDialog.dialog | ForumTopic) => {\n const {peerId} = dialog;\n this.dialogsStorage.pushDialog({dialog});\n if(!this.appPeersManager.isChannel(peerId)) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n\n let cache = updateMap.get(peerId);\n if(!cache) {\n updateMap.set(peerId, cache = {});\n }\n\n if(dialog._ === 'forumTopic') {\n (cache.topics ??= new Map()).set(dialog.id, dialog);\n } else {\n cache.dialog = dialog;\n }\n };\n\n for(const [peerId, obj] of this.newDialogsToHandle) {\n const isDialogDefined = 'dialog' in obj;\n const {dialog, topics} = obj;\n\n if(isDialogDefined) {\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n } else if(this.dialogsStorage.getDialogOnly(peerId)) { // * can be already dropped\n processDialog(dialog);\n }\n }\n\n if(topics) {\n topics?.forEach((topic, id) => {\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, id);\n } else if(this.dialogsStorage.getForumTopic(peerId, id)) { // * can be already dropped\n processDialog(topic);\n }\n });\n }\n }\n\n // this.log('after order:', this.dialogsStorage[0].map((d) => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n this.rootScope.dispatchEvent('dialogs_multiupdate', updateMap);\n this.newDialogsToHandle.clear();\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog | ForumTopic | ForumTopic['id']) {\n if(peerId !== undefined) {\n let obj = this.newDialogsToHandle.get(peerId);\n if(!obj) {\n this.newDialogsToHandle.set(peerId, obj = {});\n }\n\n const isObject = typeof(dialog) === 'object';\n if(!dialog || (isObject && dialog._ === 'dialog')) {\n obj.dialog = dialog as Dialog;\n } else {\n obj.topics ??= new Map();\n if(isObject) {\n obj.topics.set((dialog as ForumTopic).id, dialog as ForumTopic);\n } else {\n obj.topics.set(dialog as number, undefined);\n }\n }\n }\n\n return this.newDialogsHandlePromise ??= pause(0).then(() => {\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n });\n }\n\n public async deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n const localMessageIds = mids.map((mid) => getServerMessageId(mid));\n\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = this.apiManager.invokeApi('channels.deleteMessages', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = this.apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.deleteMessages(peerId, overflowMids, revoke));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\n if(!readMaxId) {\n if(threadId && !force) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!getServerMessageId(forumTopic.read_inbox_max_id)) {\n force = true;\n }\n }\n\n if(!force) {\n const dialog = this.appChatsManager.isForum(peerId.toChatId()) && threadId ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n this.getDialogOnly(peerId);\n if(dialog && this.isDialogUnread(dialog)) {\n force = true;\n }\n }\n\n if(!force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readDiscussion', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(threadId),\n read_max_id: getServerMessageId(maxId)\n });\n // apiPromise = new Promise((resolve) => resolve());\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(this.appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('channels.readHistory', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: getServerMessageId(maxId)\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: getServerMessageId(maxId)\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n this.rootScope.dispatchEvent('notification_reset', this.appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n private getUnreadMentionsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\n }\n\n private fixDialogUnreadMentionsIfNoMessage(peerId: PeerId, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n private modifyCachedMentions(peerId: PeerId, mid: number, add: boolean, threadId?: number) {\n const slicedArray = this.unreadMentions[this.getUnreadMentionsKey(peerId, threadId)];\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, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId, threadId?: number) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then((messages) => {\n console.log(messages);\n }); */\n\n const key = this.getUnreadMentionsKey(peerId, threadId);\n const promise = this.goToNextMentionPromises[key];\n if(promise) {\n return promise;\n }\n\n const slicedArray = 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, threadId);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId, threadId);\n }\n\n return this.goToNextMentionPromises[key] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n return mid;\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray, threadId);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[key];\n });\n }\n\n private loadNextMentions(peerId: PeerId, threadId?: number) {\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, undefined, undefined, threadId)\n .then((messages) => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n private getUnreadMentions(\n peerId: PeerId,\n offsetId: number,\n add_offset: number,\n limit: number,\n maxId = 0,\n minId = 0,\n threadId?: number\n ) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getUnreadMentions',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: getServerMessageId(maxId),\n min_id: getServerMessageId(minId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (messagesMessages) => {\n assumeType>(messagesMessages);\n this.appUsersManager.saveApiUsers(messagesMessages.users);\n this.appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n }\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map((mid) => getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = this.apiManager.invokeApi('channels.readMessageContents', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = this.apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n this.apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n // threadId = this.getLocalMessageId(threadId);\n return (this.threadsStorage[peerId] ??= {})[threadId] ??= {count: null, history: new SlicedArray()};\n }\n\n return this.historiesStorage[peerId] ??= {count: null, history: new SlicedArray()};\n }\n\n public getHistoryStorageTransferable(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const {\n count,\n history,\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n } = historyStorage;\n\n return {\n count,\n history: undefined as HistoryStorage,\n historySerialized: history.toJSON(),\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n };\n }\n\n private getNotifyPeerSettings(peerId: PeerId, threadId?: number) {\n const inputNotifyPeer = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n return Promise.all([\n this.appNotificationsManager.getNotifyPeerTypeSettings(),\n this.appNotificationsManager.getNotifySettings(inputNotifyPeer)\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: true, threadId}),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n ctx.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = undefined;\n\n // var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n // const timeout = 1000;\n\n for(const key in this.notificationsToHandle) {\n const [peerId, threadId] = key.split('_');\n // if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n // continue;\n // }\n\n const notifyPeerToHandle = this.notificationsToHandle[key];\n this.getNotifyPeerSettings(peerId.toPeerId(), threadId ? +threadId : undefined)\n .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 public getUpdateAfterReloadKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n private handleNewUpdateAfterReload(peerId: PeerId, update: Update, threadId?: number) {\n const set = this.newUpdatesAfterReloadToHandle[this.getUpdateAfterReloadKey(peerId, threadId)] ??= 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, threadId);\n }\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const mid = generateMessageId(update.id);\n this.pendingByMessageId[mid] = randomId;\n // const {storage} = pendingData;\n // const message = this.getMessageFromStorage(storage, mid);\n // if(message) { // if message somehow already exists\n // this.checkPendingMessage(message);\n // }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getHistoryMessagesStorage(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: this.createMessageStorage(peerId, 'history')});\n\n // * check if sent message is already in storage\n // const oldMessage = this.getMessageFromStorage(storage, message.mid);\n // if(\n // (message as Message.message).pFlags.is_outgoing &&\n // oldMessage &&\n // !(oldMessage as Message.message).pFlags.is_outgoing\n // ) {\n // this.checkPendingMessage(message);\n // return;\n // }\n\n const isForum = this.appPeersManager.isForum(peerId);\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if((!dialog || this.reloadConversationsPeers.has(peerId)) && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n this.handleNewUpdateAfterReload(peerId, update);\n return;\n }\n\n // return;\n }\n\n if(threadId && !isLocalThreadUpdate) {\n const threadStorage = this.threadsStorage[peerId]?.[threadId];\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n if(this.appChatsManager.isForum(peerId.toChatId()) && !this.dialogsStorage.getForumTopic(peerId, threadId)) {\n // this.dialogsStorage.getForumTopicById(peerId, threadId);\n this.handleNewUpdateAfterReload(peerId, update, threadId);\n } else if(threadStorage) {\n this.onUpdateNewMessage(update);\n }\n }\n\n if(message._ === 'messageService') {\n const {action} = message;\n if(action._ === 'messageActionPaymentSent' && message.reply_to) {\n this.rootScope.dispatchEvent('payment_sent', {\n peerId: message.reply_to.reply_to_peer_id ?\n this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) :\n message.peerId,\n mid: message.reply_to_mid,\n receiptMessage: message\n });\n }\n\n if(action._ === 'messageActionTopicEdit' && !isLocalThreadUpdate) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n const oldTopic = copy(topic);\n\n if(action.title !== undefined) {\n topic.title = action.title;\n }\n\n if(action.closed !== undefined) {\n setBooleanFlag(topic.pFlags, 'closed', action.closed);\n }\n\n if(action.hidden !== undefined) {\n setBooleanFlag(topic.pFlags, 'hidden', action.hidden);\n }\n\n if(action.icon_emoji_id !== undefined) {\n topic.icon_emoji_id = action.icon_emoji_id;\n }\n\n this.scheduleHandleNewDialogs(peerId, topic);\n\n this.dialogsStorage.processTopicUpdate(topic, oldTopic);\n }\n }\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 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(!historyStorage.maxId || message.mid > historyStorage.maxId) {\n historyStorage.maxId = message.mid;\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n this.appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(this.appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId)\n };\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n }\n\n // commented to render the message if it's been sent faster than history_append came to main thread\n // if(!pendingMessage) {\n this.handleNewMessage(message);\n // }\n\n const isTopic = dialog?._ === 'forumTopic';\n if((isLocalThreadUpdate && !isTopic) || !dialog) {\n return;\n }\n\n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n\n {\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, isTopic ? threadId : undefined);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(((!isLocalThreadUpdate && !isForum) || isTopic) && inboxUnread) {\n const notifyPeer = threadKey || peerId;\n const notifyPeerToHandle = this.notificationsToHandle[notifyPeer] ??= {\n fwdCount: 0,\n fromId: NULL_PEER_ID\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 this.notificationsHandlePromise ??= ctx.setTimeout(this.handleNotifications, 0);\n }\n };\n\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\n const {peer, msg_id, reactions} = update;\n const mid = generateMessageId(msg_id);\n const peerId = this.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 this.appPeersManager.getPeerId(recentReaction.peer_id) !== this.appPeersManager.peerId && (\n !previousRecentReactions ||\n previousRecentReactions.length <= recentReactions.length\n ) && (\n !previousRecentReactions ||\n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\n )\n ) {\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n if(/* muted || */!peerTypeNotifySettings.show_previews) return;\n this.notifyAboutMessage(message, {\n peerReaction: recentReaction,\n peerTypeNotifySettings\n });\n });\n }\n }\n\n const key = message.peerId + '_' + message.mid;\n this.pushBatchUpdate('messages_reactions', this.batchUpdateReactions, key, () => copy(message.reactions));\n\n message.reactions = reactions;\n\n if(!update.local) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n // this.log('updateDialogUnreadMark', update);\n const peerId = this.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 this.dialogsStorage.setDialogToState(dialog);\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {dialog}]]));\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = generateMessageId(message.id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n\n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage, storage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog?.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog});\n }\n } else {\n let dispatchEditEvent = true;\n // no sense in dispatching message_edit since only reactions have changed\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\n const newReactions = (newMessage as Message.message).reactions;\n (newMessage as Message.message).reactions = oldMessage.reactions;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: this.appPeersManager.getOutputPeer(peerId),\n msg_id: message.id,\n reactions: newReactions\n });\n\n dispatchEditEvent = false;\n }\n\n dispatchEditEvent && this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n\n if(isTopMessage) {\n this.dialogsStorage.setDialogToState(dialog);\n }\n\n const map: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = () => {\n let cache = map.get(peerId);\n if(!cache) {\n map.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n if((isTopMessage || (message as Message.message).grouped_id) && dialog) {\n getUpdateCache().dialog = dialog;\n }\n\n const threadKey = this.getThreadKey(message);\n if(threadKey) {\n const topicId = +threadKey.split('_')[1];\n const topic = this.dialogsStorage.getForumTopic(peerId, topicId);\n if(topic) {\n (getUpdateCache().topics ??= new Map()).set(topicId, topic);\n }\n }\n\n if(map.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', map);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox\n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox\n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' ||\n update._ === 'updateReadChannelOutbox' ||\n update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const isForum = channelId ? this.appChatsManager.isForum(channelId) : false;\n const storage = this.getHistoryMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = threadId && isForum ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n // this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n this.appUsersManager.forceUserOnline(peerId.toUserId());\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 = foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\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 const messageThreadId = getMessageThreadId(message, isForum);\n if(threadId && messageThreadId !== threadId) {\n continue;\n }\n\n const isUnread = message.pFlags.unread || (readMaxId && readMaxId < mid);\n\n if(!isUnread) {\n break;\n }\n\n // this.log.warn('read', messageId, isUnread, message)\n delete message.pFlags.unread;\n foundAffected ||= true;\n\n if(!message.pFlags.out && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(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(\n newUnreadCount < 0 ||\n maxId >= foundDialog.top_message ||\n !readMaxId\n ) {\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 releaseUnreadCount?.();\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n this.dialogsStorage.setDialogToState(foundDialog);\n\n if(!foundAffected && stillUnreadCount === undefined && !isOut && foundDialog.unread_count) {\n if(foundDialog._ === 'forumTopic') {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n\n if(foundAffected) {\n this.rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n this.rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid) as Message.message);\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const topMsgId = (update as Update.updateChannelReadMessagesContents).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const mids = (update as Update.updateReadMessagesContents).messages.map((id) => generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(mids);\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(message) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n\n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false, threadId);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId, threadId);\n }\n }\n\n this.rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = generateMessageId(update.available_min_id);\n const messages = history.filter((mid) => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n // const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map((id) => generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(messages);\n\n if(!peerId) {\n return;\n }\n\n this.apiManager.clearCache('messages.getSearchCounters', (params) => {\n return this.appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set(), topics: Map = new Map();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(!threadKey) {\n continue;\n }\n\n const threadId = +threadKey.split('_')[1];\n if(this.threadsStorage[peerId]?.[threadId]) {\n threadKeys.add(threadKey);\n\n if(!topics.has(threadId)) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic) {\n topics.set(threadId, topic);\n }\n }\n }\n }\n\n const historyUpdated = this.handleDeletedMessages(\n peerId,\n this.getHistoryMessagesStorage(peerId),\n messages\n );\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 historyStorages = [\n this.getHistoryStorage(peerId),\n ...threadsStorages\n ];\n historyStorages.forEach((historyStorage) => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n\n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n this.rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const dialogs: (MTDialog.dialog | ForumTopic)[] = [\n ...topics.values()\n ];\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialogs.unshift(dialog);\n }\n\n dialogs.forEach((dialog) => {\n const isTopic = dialog._ === 'forumTopic';\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(historyUpdated.unread) {\n dialog.unread_count = Math.max(0, dialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n dialog.unread_mentions_count = !dialog.unread_count ? 0 : Math.max(0, dialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n\n if(!isTopic) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog});\n }\n }\n\n if(historyUpdated.msgs.has(dialog.top_message)) {\n const historyStorage = this.getHistoryStorage(dialog.peerId, isTopic ? dialog.id : undefined);\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, dialog);\n } else if(isTopic) {\n this.dialogsStorage.getForumTopicById(peerId, dialog.id);\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 = this.appChatsManager.getChat(channelId) as Chat.channel;\n\n const needDialog = this.appChatsManager.isInChat(channelId);\n\n const canViewHistory = !!getPeerActiveUsernames(channel)[0] || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n\n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n this.rootScope.dispatchEvent('history_forbidden', peerId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n\n this.rootScope.dispatchEvent('channel_update', channelId);\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n // if(this.appPeersManager.isForum(peerId)) {\n // const cache = this.dialogsStorage.getForumTopicsCache(peerId);\n // if(cache.topics.size) {\n\n // }\n // }\n\n this.flushStoragesByPeerId(peerId);\n Promise.all([\n this.reloadConversation(peerId)\n ]).then(() => {\n this.rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n\n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.peerId ?? update.channel_id.toPeerId(true);\n const mid = generateMessageId(update.id);\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(message?.views !== undefined && message.views < views) {\n message.views = views;\n this.pushBatchUpdate('messages_views', this.batchUpdateViews, message.peerId + '_' + message.mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n // this.log('updateServiceNotification', update);\n if(update.pFlags?.popup) {\n this.rootScope.dispatchEvent('service_notification', update);\n return;\n }\n\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: this.appPeersManager.getOutputPeer(fromId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + this.timeManager.getServerTimeOffset(),\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!this.appUsersManager.hasUser(fromId)) {\n this.appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : this.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) => generateMessageId(id));\n\n const storage = this.getHistoryMessagesStorage(peerId);\n const missingMessages = messages.filter((mid) => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map((mid) => this.reloadMessages(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n // storage.history.push(mid);\n const message = storage.get(mid) as Message.message;\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n // storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n // storage.history.findAndSplice((_mid) => _mid === mid);\n const message = storage.get(mid) as Message.message;\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n\n delete this.pinnedMessages[this.getPinnedMessagesKey(peerId)];\n this.appStateManager.getState().then((state) => {\n delete state.hiddenPinnedMessages[peerId];\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n if(!isPeerType) {\n return;\n }\n\n const peerId = this.appPeersManager.getPeerId(peer.peer);\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isTopic ? generateMessageId(peer.top_msg_id) : undefined);\n if(!dialog) {\n return;\n }\n\n dialog.notify_settings = notify_settings;\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(!storage) {\n return;\n }\n\n const mid = generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(oldMessage) {\n this.handleEditedMessage(oldMessage, newMessage, storage);\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId, mid: message.mid, message});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n this.rootScope.dispatchEvent('scheduled_new', message as Message.message);\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map((id) => generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n this.rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n private onUpdateMessageExtendedMedia = (update: Update.updateMessageExtendedMedia) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n const mid = generateMessageId(update.msg_id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n const messageMedia = message.media as MessageMedia.messageMediaInvoice;\n if(messageMedia.extended_media?._ === 'messageExtendedMedia') {\n return;\n }\n\n messageMedia.extended_media = update.extended_media;\n this.onUpdateEditMessage({\n _: 'updateEditMessage',\n message,\n pts: 0,\n pts_count: 0\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()) {\n const threadId = getMessageThreadId(threadMessage, this.appChatsManager.isForum(threadMessage.peerId.toChatId()));\n if(threadId) {\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.reloadMessages(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(!message) {\n return;\n }\n\n if(broadcastEventName) {\n this.rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n\n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n this.rootScope.dispatchEvent('history_update', {\n storageKey: pendingData.storage.key,\n message,\n sequential: pendingData.sequential\n });\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(options: {peerId: PeerId, muteUntil: number, threadId?: number}) {\n if(!(options = this.appNotificationsManager.validatePeerSettings(options))) {\n return;\n }\n\n const {peerId, muteUntil, threadId} = options;\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n const peer = this.appPeersManager.getInputPeerById(peerId);\n return this.appNotificationsManager.updateNotifySettings(threadId ? {\n _: 'inputNotifyForumTopic',\n peer,\n top_msg_id: getServerMessageId(threadId)\n } : {\n _: 'inputNotifyPeer',\n peer\n }, settings);\n }\n\n public togglePeerMute({peerId, mute, threadId}: {peerId: PeerId, mute?: boolean, threadId?: number}) {\n if(mute === undefined) {\n mute = !this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId});\n }\n\n return this.mutePeer({peerId, muteUntil: mute ? MUTE_UNTIL : 0, threadId});\n }\n\n private findPeerIdByMids(mids: number[]) {\n for(let length = mids.length, i = length - 1; i >= 0; --i) {\n const mid = mids[i];\n const message = this.getMessageById(mid);\n if(message) {\n return message.peerId;\n }\n }\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return false;\n }\n\n if(peerId.isAnyChat()) {\n const chatId = peerId.toChatId();\n if(threadId) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic?.pFlags?.closed && !this.appChatsManager.hasRights(chatId, 'manage_topics')) {\n return false;\n }\n }\n\n // const isChannel = appPeersManager.isChannel(peerId);\n const chat = this.appChatsManager.getChat(chatId) as Chat.chat;\n const hasRights = /* isChannel && */this.appChatsManager.hasRights(chatId, action, undefined, !!threadId);\n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return this.appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [\n this.getHistoryStorage(peerId),\n threadId ? this.getHistoryStorage(peerId, threadId) : undefined\n ]\n .filter(Boolean)\n .forEach((storage) => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(tempMessage) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n this.rootScope.dispatchEvent('messages_pending');\n\n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n // this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n // this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = this.appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = this.thumbsStorage.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = this.thumbsStorage.getCacheContext(photo, THUMB_TYPE_FULL);\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const oldDoc = this.appDocsManager.getDoc('' + tempId);\n if(oldDoc) {\n const oldCacheContext = this.thumbsStorage.getCacheContext(oldDoc);\n if(\n /* doc._ !== 'documentEmpty' && */\n oldDoc.type &&\n oldDoc.type !== 'sticker' &&\n oldDoc.mime_type !== 'image/gif' &&\n oldCacheContext.url\n ) {\n const cacheContext = this.thumbsStorage.getCacheContext(newDoc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = getDocumentInputFileName(newDoc);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete this.appPollsManager.polls[tempId];\n delete this.appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n\n if(!(tempMessage as Message.message).reply_markup && (message as Message.message).reply_markup) {\n setTimeout(() => { // TODO: refactor it to normal buttons adding\n if(!this.getMessageFromStorage(storage, message.mid)) {\n return;\n }\n\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId: message.peerId, mid: message.mid, message});\n }, 0);\n }\n\n this.handleReleasingMessage(tempMessage, storage);\n\n this.rootScope.dispatchEvent('message_sent', {storageKey: storage.key, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n this.appStateManager.pushToState('maxSeenMsgId', maxId);\n\n this.apiManager.invokeApi('messages.receivedMessages', {\n max_id: getServerMessageId(maxId)\n });\n }\n\n public async getMessageReactionsListAndReadParticipants(\n message: Message.message,\n limit?: number,\n reaction?: Reaction,\n offset?: string,\n skipReadParticipants?: boolean,\n skipReactionsList?: boolean\n ) {\n const emptyMessageReactionsList = {\n reactions: [] as MessagePeerReaction[],\n count: 0,\n next_offset: undefined as string\n };\n\n const canViewMessageReadParticipants = await this.canViewMessageReadParticipants(message);\n if(canViewMessageReadParticipants && limit === undefined) {\n limit = 100;\n } else if(limit === undefined) {\n limit = 50;\n }\n\n return Promise.all([\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\n\n message.reactions?.recent_reactions?.length && !skipReactionsList ? this.appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch((err) => emptyMessageReactionsList) : emptyMessageReactionsList\n ]).then(([userIds, messageReactionsList]) => {\n const readParticipantsPeerIds = userIds.map((userId) => userId.toPeerId());\n\n const filteredReadParticipants = readParticipantsPeerIds.slice();\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\n if(messageReactionsList.reactions.some((reaction) => this.appPeersManager.getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: Reaction}[] = messageReactionsList.reactions.map((reaction) => ({peerId: this.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 this.apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((userIds) => { // ! convert long to number\n return userIds.map((userId) => userId.toUserId());\n });\n }\n\n public async canViewMessageReadParticipants(message: Message) {\n if(\n message?._ !== 'message' ||\n message.pFlags.is_outgoing ||\n !message.pFlags.out ||\n !this.appPeersManager.isAnyGroup(message.peerId)\n ) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(message.peerId.toChatId()) as Chat.chat | Chat.channel;\n const appConfig = await this.apiManager.getAppConfig();\n return chat.participants_count <= appConfig.chat_read_mark_size_threshold &&\n (tsNow(true) - message.date) < appConfig.chat_read_mark_expire_period;\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return this.apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n increment: true\n }).then((views) => {\n const updates: Update[] = new Array(mids.length);\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: NULL_PEER_ID,\n peerId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerReaction: MessagePeerReaction,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return;\n }\n\n const tabs = appTabsManager.getTabs();\n let tab = tabs.find((tab) => {\n const {chatPeerIds} = tab.state;\n return chatPeerIds[chatPeerIds.length - 1] === peerId;\n });\n\n if(!tab) {\n tabs.sort((a, b) => a.state.idleStartTime - b.state.idleStartTime);\n tab = !tabs[0].state.idleStartTime ? tabs[0] : tabs[tabs.length - 1];\n }\n\n const port = MTProtoMessagePort.getInstance();\n port.invokeVoid('notificationBuild', {\n message,\n ...options\n }, tab.source);\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ??= this.createMessageStorage(peerId, 'scheduled');\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId) {\n if(!this.canSendToPeer(peerId)) return;\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return [...storage.keys()];\n }\n\n return this.apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then((historyResult) => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n\n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n return this.filterMessages(message, (message) => !!(message as Message.message).replies)[0] as any;\n }\n\n public getMessageWithCommentReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.getMessageWithReplies(message);\n const replies = message?.replies;\n if(!(replies && replies.pFlags.comments && replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && (\n !this.appChatsManager.isInChat(peerId.toChatId()) ||\n this.appChatsManager.isForum(peerId.toChatId())\n );\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n const historyResult = await this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(this.getMessageByPeer(peerId, historyResult.history[i]));\n }\n\n return {isBottomEnd: historyStorage.history.slice.isEnd(SliceEnd.Bottom)};\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: false): Promise | HistoryResult;\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: true): HistoryResult;\n public getHistory(peerId: PeerId, maxId: number = 0, limit?: number, backLimit?: number, threadId?: number/* , onlyCache?: boolean */): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n const first = historyStorage.history.first;\n first.setEnd(SliceEnd.Both);\n\n const slice = first.slice(0, 0);\n slice.setEnd(SliceEnd.Both);\n\n return {\n count: 0,\n history: Array.from(slice),\n isEnd: slice.getEnds(),\n offsetIdOffset: 0\n };\n }\n\n let offset = 0;\n /*\n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map((message) => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: Array.from(haveSlice.slice),\n isEnd: haveSlice.slice.getEnds(),\n offsetIdOffset: haveSlice.offsetIdOffset\n };\n }\n\n // if(onlyCache) {\n // return;\n // }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n const f = slice?.slice || historyStorage.history.constructSlice();\n return {\n count: historyStorage.count,\n history: Array.from(f),\n isEnd: f.getEnds(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(\n slicedArray: SlicedArray,\n historyResult: Parameters[0],\n offset_id: number,\n limit: number,\n add_offset: number\n ) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually.\n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n\n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n const wasMaxId = historyStorage.maxId;\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n const newMaxId = slice[0];\n\n if(historyStorage.maxId === wasMaxId) {\n const first = historyStorage.history.first;\n if(first !== slice) {\n historyStorage.history.deleteSlice(first);\n }\n\n if(historyStorage.maxId !== newMaxId) {\n historyStorage.maxId = slice[0]; // ! WARNING\n\n this.reloadConversation(peerId); // when top_message is deleted but cached\n }\n }\n }\n\n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n // console.trace('requestHistory', peerId, maxId, limit, offset);\n\n // rootScope.broadcast('history_request');\n\n const options: MessagesGetReplies | MessagesGetHistory = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n (options as MessagesGetReplies).msg_id = getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = this.apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if('pts' in historyResult) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), historyResult.pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && !historyResult.messages[length - 1]) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = this.appChatsManager.getChat(peerId.toChatId());\n if(channel._ === 'channel') {\n channel = {\n _: 'channelForbidden',\n id: peerId.toChatId(),\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = pause(0).then(() => {\n const requestPromises: Promise[] = [];\n\n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: getServerMessageId(mid)\n };\n });\n\n let promise: Promise;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n promise = this.apiManager.invokeApiSingle('channels.getMessages', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = this.apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then((getMessagesResult) => {\n assumeType>(getMessagesResult);\n\n this.appUsersManager.saveApiUsers(getMessagesResult.users);\n this.appChatsManager.saveApiChats(getMessagesResult.chats);\n const messages = this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < messages.length; ++i) {\n const message = messages[i];\n if(!message) {\n continue;\n }\n\n const mid = generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(message);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n\n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n return Promise.all(requestPromises).then(noop, noop).then(() => {\n this.fetchSingleMessagesPromise = undefined;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n });\n });\n }\n\n public reloadMessages(peerId: PeerId, mid: number, overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number[], overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number | number[], overwrite?: boolean): Promise {\n if(Array.isArray(mid)) {\n return Promise.all(mid.map((mid) => {\n return this.reloadMessages(peerId, mid, overwrite);\n }));\n }\n\n const message = this.getMessageByPeer(peerId, mid);\n if(message && !overwrite) {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public getExtendedMedia(peerId: PeerId, mids: number[]) {\n let map = this.extendedMedia.get(peerId);\n if(!map) {\n this.extendedMedia.set(peerId, map = new Map());\n }\n\n const deferred = deferredPromise();\n const toRequest: number[] = [];\n const promises = mids.map((mid) => {\n let promise = map.get(mid);\n if(!promise) {\n map.set(mid, promise = deferred);\n toRequest.push(mid);\n\n promise.then(() => {\n map.delete(mid);\n if(!map.size && this.extendedMedia.get(peerId) === map) {\n this.extendedMedia.delete(peerId);\n }\n });\n }\n\n return promise;\n });\n\n if(!toRequest.length) {\n deferred.resolve();\n } else {\n this.apiManager.invokeApi('messages.getExtendedMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: toRequest.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n });\n }\n\n return Promise.all(promises);\n }\n\n public fetchMessageReplyTo(message: MyMessage) {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.reloadMessages(replyToPeerId, message.reply_to_mid).then((originalMessage) => {\n if(!originalMessage) { // ! break the infinite loop\n message = this.getMessageByPeer(message.peerId, message.mid); // message can come from other thread\n delete message.reply_to_mid; // ! WARNING!\n }\n\n if(message._ === 'messageService') {\n const peerId = message.peerId;\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: `${peerId}_history`,\n peerId: peerId,\n mid: message.mid,\n message\n });\n\n if(this.isMessageIsTopMessage(message)) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {dialog: this.getDialogOnly(peerId)}]]));\n }\n }\n\n return originalMessage;\n });\n }\n\n private getTypingKey(peerId: PeerId, threadId?: number) {\n return threadId ? `${peerId}_${threadId}` : peerId;\n }\n\n public setTyping(\n peerId: PeerId,\n action: SendMessageAction,\n force?: boolean,\n threadId?: number\n ): Promise {\n if(threadId && !this.appPeersManager.isForum(peerId)) {\n threadId = undefined;\n }\n\n const key = this.getTypingKey(peerId, threadId);\n let typing = this.typings[key];\n if(\n !peerId ||\n !this.canSendToPeer(peerId) ||\n peerId === this.appPeersManager.peerId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[key] = {\n action\n };\n\n return this.apiManager.invokeApi('messages.setTyping', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n action,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n }).finally(() => {\n if(typing === this.typings[key]) {\n typing.timeout = ctx.setTimeout(() => {\n delete this.typings[key];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n this.referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n this.appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n this.appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number,\n unread: number,\n unreadMentions: number,\n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0,\n unread: 0,\n unreadMentions: 0,\n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(!message) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n }\n\n if(history.albums) {\n for(const groupedId in history.albums) {\n this.dispatchAlbumEdit(groupedId, storage, [...history.albums[groupedId]]);\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n\n private handleEditedMessage(oldMessage: Message, newMessage: Message, storage: MessagesStorage) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n this.appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n\n const groupedId = oldMessage.grouped_id;\n if(groupedId) {\n this.dispatchAlbumEdit(groupedId, storage, []);\n }\n }\n }\n\n private dispatchAlbumEdit(groupedId: string, storage: MessagesStorage, deletedMids?: number[]) {\n const mids = this.getMidsByAlbum(groupedId);\n const messages = mids.map((mid) => this.getMessageFromStorage(storage, mid)) as Message.message[];\n this.rootScope.dispatchEvent('album_edit', {peerId: messages[0].peerId, groupId: groupedId, deletedMids: deletedMids || [], messages});\n }\n\n public getDialogUnreadCount(dialog: Dialog | ForumTopic) {\n return dialog.unread_count || +!!(dialog as Dialog).pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog | ForumTopic) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return message?._ === 'message' && !(message as Message.message).pFlags.noforwards && !this.appPeersManager.noForwards(message.peerId);\n }\n\n private pushBatchUpdate(\n event: E,\n callback: C,\n key: string,\n getElementCallback?: () => MapValueType[0]>\n ) {\n let details = this.batchUpdates[event];\n if(!details) {\n // @ts-ignore\n details = this.batchUpdates[event] = {\n callback,\n batch: new Map()\n };\n }\n\n if(!details.batch.has(key)) {\n // @ts-ignore\n details.batch.set(key, getElementCallback ? getElementCallback() : undefined);\n this.batchUpdatesDebounced();\n }\n }\n\n private getMessagesFromMap>(map: T) {\n const newMap: Map> = new Map();\n for(const [key, value] of map) {\n const [peerIdStr, mid] = key.split('_');\n const message = this.getMessageByPeer(peerIdStr.toPeerId(), +mid) as Message.message;\n if(!message) {\n continue;\n }\n\n newMap.set(message, value);\n }\n\n return newMap;\n }\n\n private batchUpdateViews = (batch: Map) => {\n const toDispatch: {peerId: PeerId, mid: number, views: number}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message] of map) {\n toDispatch.push({\n peerId: message.peerId,\n mid: message.mid,\n views: message.views\n })\n }\n\n return toDispatch;\n };\n\n private batchUpdateReactions = (batch: Map) => {\n const toDispatch: {message: Message.message, changedResults: ReactionCount.reactionCount[]}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message, previousReactions] of map) {\n const results = message.reactions?.results ?? [];\n const previousResults = previousReactions?.results ?? [];\n const changedResults = results.filter((reactionCount) => {\n const previousReactionCount = previousResults.find((_reactionCount) => reactionsEqual(_reactionCount.reaction, reactionCount.reaction));\n return (\n message.pFlags.out && (\n !previousReactionCount ||\n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.chosen_order !== undefined && (\n !previousReactionCount ||\n previousReactionCount.chosen_order === undefined\n )\n );\n });\n\n toDispatch.push({message, changedResults});\n }\n\n return toDispatch;\n };\n\n public saveDefaultSendAs(peerId: PeerId, sendAsPeerId: PeerId) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\n return this.apiManager.invokeApi('messages.saveDefaultSendAs', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\nimport {Document} from '../../../../layer';\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\n\nexport default function getDocumentInputFileName(doc: Document.document, thumbSize?: string) {\n return getFileNameByLocation(getDocumentInputFileLocation(doc, thumbSize), {fileName: doc.file_name});\n}\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","/*\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 tsNow from '../../helpers/tsNow';\nimport {InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update} from '../../layer';\nimport {MUTE_UNTIL} from '../mtproto/mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\nimport ctx from '../../environment/ctx';\nimport assumeType from '../../helpers/assumeType';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\ntype ImSadAboutIt = Promise | PeerNotifySettings;\ntype MyNotifyPeer = Exclude;\ntype MyInputNotifyPeer = Exclude;\nexport class AppNotificationsManager extends AppManager {\n private peerSettings = {\n notifyPeer: {} as {[peerId: string]: ImSadAboutIt},\n notifyUsers: null as ImSadAboutIt,\n notifyChats: null as ImSadAboutIt,\n notifyBroadcasts: null as ImSadAboutIt,\n notifyForumTopic: {} as {[peerId_threadId: string]: ImSadAboutIt}\n };\n // private exceptions: {[peerId: string]: PeerNotifySettings} = {};\n\n private getNotifyPeerTypePromise: Promise;\n\n private checkMuteUntilTimeout: number;\n private checkMuteUntilThrottled: () => void;\n\n private notifyContactsSignUp: Promise;\n\n protected after() {\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNotifySettings: (update) => {\n const {peer} = update;\n const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n const peerId = isPeerType && this.appPeersManager.getPeerId(peer.peer);\n const key = !isPeerType ? peer._ : undefined;\n this.savePeerSettings({\n key,\n peerId,\n threadId: isTopic ? generateMessageId(peer.top_msg_id) : undefined,\n settings: update.notify_settings\n });\n this.rootScope.dispatchEvent('notify_settings', update);\n }\n });\n\n return this.appStateManager.getState().then((state) => {\n if(state.notifySettings) {\n for(const key in state.notifySettings) {\n assumeType(key);\n this.savePeerSettings({\n key,\n settings: state.notifySettings[key]\n });\n }\n }\n });\n }\n\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\n let key: any = convertInputKeyToKey(peer._);\n let obj: any = this.peerSettings[key as MyNotifyPeer];\n\n let peerId: PeerId;\n if(peer._ === 'inputNotifyPeer') {\n peerId = key = this.appPeersManager.getPeerId(peer.peer);\n obj = obj[key];\n }\n\n if(obj) {\n return obj;\n }\n\n return (obj || this.peerSettings)[key] = this.apiManager.invokeApi('account.getNotifySettings', {peer})\n .then((settings) => {\n this.savePeerSettings({\n key,\n peerId,\n settings\n });\n\n return settings;\n });\n }\n\n public getNotifyPeerTypeSettings() {\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\n\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as MyInputNotifyPeer[])\n .map((inputKey) => {\n return this.getNotifySettings({_: inputKey});\n });\n\n return this.getNotifyPeerTypePromise = Promise.all(promises);\n }\n\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\n // this.savePeerSettings(peerId, settings);\n\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\n inputSettings._ = 'inputPeerNotifySettings'; */\n\n return this.apiManager.invokeApi('account.updateNotifySettings', {\n peer,\n settings\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateNotifySettings',\n peer: {\n ...peer as any,\n _: convertInputKeyToKey(peer._)\n },\n notify_settings: { // ! WOW, IT WORKS !\n ...settings,\n _: 'peerNotifySettings'\n }\n });\n }\n });\n }\n\n // public getNotifyExceptions() {\n // apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\n // .then((updates) => {\n // apiUpdatesManager.processUpdateMessage(updates);\n // });\n // }\n\n public getContactSignUpNotification() {\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\n return this.notifyContactsSignUp = this.apiManager.invokeApi('account.getContactSignUpNotification');\n }\n\n public setContactSignUpNotification(silent: boolean) {\n this.apiManager.invokeApi('account.setContactSignUpNotification', {silent})\n .then((value) => {\n this.notifyContactsSignUp = Promise.resolve(!silent);\n });\n }\n\n private checkMuteUntil = () => {\n if(this.checkMuteUntilTimeout !== undefined) {\n clearTimeout(this.checkMuteUntilTimeout);\n this.checkMuteUntilTimeout = undefined;\n }\n\n const timestamp = tsNow(true);\n let closestMuteUntil = MUTE_UNTIL;\n\n const p = (peerNotifySettings: ImSadAboutIt): peerNotifySettings is PeerNotifySettings => {\n if(peerNotifySettings instanceof Promise) {\n return false;\n }\n\n const muteUntil = peerNotifySettings.mute_until;\n if(!muteUntil) {\n return false;\n }\n\n if(muteUntil <= timestamp) {\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\n peerNotifySettings.mute_until = 0;\n return true;\n } else if(muteUntil < closestMuteUntil) {\n closestMuteUntil = muteUntil;\n }\n\n return false;\n };\n\n [\n 'notifyPeer' as const,\n 'notifyForumTopic' as const\n ].forEach((typeKey) => {\n for(const key in this.peerSettings[typeKey]) {\n const peerNotifySettings = this.peerSettings[typeKey][key];\n if(p(peerNotifySettings)) {\n const [peerId, topicId] = key.split('_');\n const peer = this.appPeersManager.getOutputPeer(peerId.toPeerId());\n this.apiUpdatesManager.saveUpdate({\n _: 'updateNotifySettings',\n peer: topicId ? {\n _: 'notifyForumTopic',\n peer,\n top_msg_id: +topicId\n } : {\n _: 'notifyPeer',\n peer\n },\n notify_settings: peerNotifySettings\n });\n }\n }\n });\n\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\n this.checkMuteUntilTimeout = ctx.setTimeout(this.checkMuteUntil, timeout);\n };\n\n public getPeerKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public savePeerSettings({key, peerId, threadId, settings}: {\n key?: Exclude,\n peerId?: PeerId,\n threadId?: number,\n settings: PeerNotifySettings\n }) {\n let obj: any;\n if(peerId) {\n key = this.getPeerKey(peerId, threadId) as any;\n obj = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'];\n }\n\n (obj || this.peerSettings)[key] = settings;\n\n if(!peerId) {\n this.rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\n this.appStateManager.getState().then((state) => {\n const notifySettings = state.notifySettings;\n notifySettings[key] = settings;\n this.appStateManager.pushToState('notifySettings', notifySettings);\n });\n } else {\n this.checkMuteUntilThrottled();\n }\n\n // rootScope.broadcast('notify_settings', {peerId: peerId});\n }\n\n public isMuted(peerNotifySettings: PeerNotifySettings) {\n return peerNotifySettings._ === 'peerNotifySettings' &&\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\n }\n\n private getPeerMuted(peerId: PeerId) {\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: this.appPeersManager.getInputPeerById(peerId)});\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\n }\n\n private getPeerLocalSettings({\n peerId,\n respectType = true,\n threadId\n }: {\n peerId: PeerId,\n respectType?: boolean,\n threadId?: number\n }): PeerNotifySettings {\n const n: PeerNotifySettings = {\n _: 'peerNotifySettings'\n };\n\n const peerKey = this.getPeerKey(peerId, threadId);\n const notifySettings = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'][peerKey];\n // if(!notifySettings || (notifySettings instanceof Promise)) return false;\n if(notifySettings && !(notifySettings instanceof Promise)) {\n Object.assign(n, notifySettings);\n }\n\n if(respectType) {\n const inputNotify = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n const key = convertInputKeyToKey(inputNotify._);\n const typeNotifySettings = this.peerSettings[key as MyNotifyPeer];\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\n for(const i in typeNotifySettings) {\n // @ts-ignore\n if(n[i] === undefined) {\n // @ts-ignore\n n[i] = typeNotifySettings[i];\n }\n }\n }\n }\n\n return n;\n }\n\n public validatePeerSettings[0]>(options: T): T {\n if(options.peerId === this.appPeersManager.peerId) return;\n if(options.threadId && !this.appPeersManager.isForum(options.peerId)) options.threadId = undefined;\n return options;\n }\n\n public isPeerLocalMuted(options: Parameters[0]) {\n if(!(options = this.validatePeerSettings(options))) return false;\n\n const notifySettings = this.getPeerLocalSettings(options);\n return this.isMuted(notifySettings);\n }\n}\n","/*\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, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto} from '../../layer';\nimport type {LangPackKey} from '../langPack';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport isObject from '../../helpers/object/isObject';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport isUser from './utils/peers/isUser';\nimport isAnyChat from './utils/peers/isAnyChat';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport isPeerRestricted from './utils/peers/isPeerRestricted';\nimport getPeerPhoto from './utils/peers/getPeerPhoto';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\nexport class AppPeersManager extends AppManager {\n public get peerId() {\n return this.appUsersManager.userId.toPeerId();\n }\n /* public savePeerInstance(peerId: PeerId, instance: any) {\n if(peerId < 0) appChatsManager.saveApiChat(instance);\n else appUsersManager.saveApiUser(instance);\n } */\n\n public canPinMessage(peerId: PeerId) {\n return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\n }\n\n public getPeerPhoto(peerId: PeerId) {\n const peer = this.getPeer(peerId) as User.user | Chat.channel;\n return getPeerPhoto(peer);\n }\n\n public getPeerMigratedTo(peerId: PeerId) {\n if(peerId.isUser()) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n const migratedTo = chat?.migrated_to;\n if(migratedTo && chat.pFlags.deactivated) {\n return getPeerId(migratedTo);\n }\n\n return false;\n }\n\n public getOutputPeer(peerId: PeerId): Peer {\n if(peerId.isUser()) {\n return {_: 'peerUser', user_id: peerId.toUserId()};\n }\n\n const chatId = peerId.toChatId();\n if(this.appChatsManager.isChannel(chatId)) {\n return {_: 'peerChannel', channel_id: chatId};\n }\n\n return {_: 'peerChat', chat_id: chatId};\n }\n\n public getPeerString(peerId: PeerId) {\n if(peerId.isUser()) {\n return this.appUsersManager.getUserString(peerId.toUserId());\n }\n return this.appChatsManager.getChatString(peerId.toChatId());\n }\n\n public getPeerUsername(peerId: PeerId) {\n return this.getPeerActiveUsernames(peerId)[0] || '';\n }\n\n public getPeerActiveUsernames(peerId: PeerId) {\n const peer = this.getPeer(peerId);\n return getPeerActiveUsernames(peer);\n }\n\n public getPeer(peerId: PeerId) {\n return peerId.isUser() ?\n this.appUsersManager.getUser(peerId.toUserId()) :\n this.appChatsManager.getChat(peerId.toChatId());\n }\n\n public getPeerId(peerId: Parameters[0]) {\n return getPeerId(peerId) || (isObject(peerId) && peerId._ === 'inputPeerSelf' && this.peerId) || NULL_PEER_ID;\n }\n\n public getDialogPeer(peerId: PeerId): DialogPeer {\n return {\n _: 'dialogPeer',\n peer: this.getOutputPeer(peerId)\n };\n }\n\n public isChannel(peerId: PeerId): boolean {\n return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());\n }\n\n public isMegagroup(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());\n }\n\n public isForum(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isForum(peerId.toChatId());\n }\n\n public isAnyGroup(peerId: PeerId): boolean {\n return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());\n }\n\n public isBroadcast(peerId: PeerId): boolean {\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\n }\n\n public isBot(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());\n }\n\n public isContact(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());\n }\n\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\n return isUser(peerId);\n }\n\n public isAnyChat(peerId: PeerId) {\n return isAnyChat(peerId);\n }\n\n public isPeerRestricted(peerId: PeerId) {\n return isPeerRestricted(this.getPeer(peerId));\n }\n\n public getRestrictionReasonText(peerId: PeerId) {\n const peer = this.getPeer(peerId) as Chat.channel | User.user;\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\n if(reason) {\n return reason.text;\n } else {\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\n }\n }\n\n /* public getInputPeer(peerString: string): InputPeer {\n var firstChar = peerString.charAt(0);\n var peerParams = peerString.substr(1).split('_');\n let id = +peerParams[0];\n\n if(firstChar === 'u') {\n //appUsersManager.saveUserAccess(id, peerParams[1]);\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: peerParams[1]\n };\n } else if(firstChar === 'c' || firstChar === 's') {\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\n if(firstChar === 's') {\n appChatsManager.saveIsMegagroup(id);\n }\n\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: peerParams[1] || '0'\n };\n } else {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n } */\n\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\n public getInputNotifyPeerById({peerId, ignorePeerId, threadId}: T): T['ignorePeerId'] extends true ? Exclude : (T['threadId'] extends number ? InputNotifyPeer.inputNotifyForumTopic : InputNotifyPeer.inputNotifyPeer) {\n if(ignorePeerId) {\n if(peerId.isUser()) {\n return {_: 'inputNotifyUsers'} as any;\n } else {\n if(this.isBroadcast(peerId)) {\n return {_: 'inputNotifyBroadcasts'} as any;\n } else {\n return {_: 'inputNotifyChats'} as any;\n }\n }\n } else if(threadId) {\n return {\n _: 'inputNotifyForumTopic',\n peer: this.getInputPeerById(peerId),\n top_msg_id: getServerMessageId(threadId)\n } as any;\n } else {\n return {\n _: 'inputNotifyPeer',\n peer: this.getInputPeerById(peerId)\n } as any;\n }\n }\n\n public getInputPeerById(peerId: PeerId): InputPeer {\n if(!peerId) {\n return {_: 'inputPeerEmpty'};\n }\n\n if(!peerId.isUser()) {\n const chatId = peerId.toChatId();\n return this.appChatsManager.getInputPeer(chatId);\n }\n\n const userId = peerId.toUserId();\n return this.appUsersManager.getUserInputPeer(userId);\n }\n\n /**\n * ! use it only in safe places like requests\n */\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\n return {_: 'inputPeerSelf'};\n }\n\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\n return {\n _: 'inputDialogPeer',\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\n };\n }\n\n public getPeerSearchText(peerId: PeerId) {\n let text: string;\n if(this.isUser(peerId)) {\n text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());\n } else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n text = '%pg ' + (chat.title || '');\n }\n\n return text;\n }\n\n public getDialogType(peerId: PeerId): PeerType {\n if(this.isMegagroup(peerId)) {\n return 'megagroup';\n } else if(this.isChannel(peerId)) {\n return 'channel';\n } else if(!this.isUser(peerId)) {\n return 'group';\n } else {\n return peerId === this.peerId ? 'saved' : 'chat';\n }\n }\n\n public getDeleteButtonText(peerId: PeerId): Extract {\n switch(this.getDialogType(peerId)) {\n case 'channel':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\n\n case 'megagroup':\n case 'group':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\n\n default:\n return 'ChatList.Context.DeleteChat';\n }\n }\n\n public noForwards(peerId: PeerId) {\n if(peerId.isUser()) return false;\n else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n return !!(chat as Chat.chat).pFlags?.noforwards;\n }\n }\n}\n\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Photo, PhotoSize, PhotosPhotos} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n// let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager extends AppManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(!photo || photo._ === 'photoEmpty') return;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n this.referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n // * sometimes photoStrippedSize can be the last item\n photo.sizes.sort((a, b) => {\n return ((a as PhotoSize.photoSize).size || ((a as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0)) - ((b as PhotoSize.photoSize).size || ((b as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0));\n });\n\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n\n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = this.appUsersManager.getUserInput(userId);\n return this.apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n this.appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n\n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n\n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport copy from '../../helpers/object/copy';\nimport {InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\ntype PollId = Poll['id'];\n\nexport class AppPollsManager extends AppManager {\n public polls: {[id: PollId]: Poll} = {};\n public results: {[id: PollId]: PollResults} = {};\n public pollToMessages: {[id: PollId]: Set} = {};\n\n private log = logger('POLLS', LogTypes.Error);\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessagePoll: (update) => {\n this.log('updateMessagePoll:', update);\n\n let poll: Poll = update.poll || this.polls[update.poll_id];\n if(!poll) {\n return;\n }\n\n let results = update.results;\n const ret = this.savePoll(poll, results as any);\n poll = ret.poll;\n results = ret.results;\n\n this.rootScope.dispatchEvent('poll_update', {poll, results: results as any});\n }\n });\n }\n\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\n if(message) {\n this.updatePollToMessage(message, true);\n }\n\n const id = poll.id;\n if(this.polls[id]) {\n poll = Object.assign(this.polls[id], poll);\n results = this.saveResults(poll, results);\n } else {\n this.polls[id] = poll;\n\n poll.chosenIndexes = [];\n results = this.saveResults(poll, results);\n }\n\n return {poll, results};\n }\n\n public saveResults(poll: Poll, results: PollResults) {\n if(this.results[poll.id]) {\n results = Object.assign(this.results[poll.id], results);\n } else {\n this.results[poll.id] = results;\n }\n\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\n poll.chosenIndexes.length = 0;\n if(results?.results?.length) {\n results.results.forEach((answer, idx) => {\n if(answer.pFlags?.chosen) {\n poll.chosenIndexes.push(idx);\n }\n });\n }\n }\n\n return results;\n }\n\n public getPoll(pollId: PollId): {poll: Poll, results: PollResults} {\n return {\n poll: this.polls[pollId],\n results: this.results[pollId]\n };\n }\n\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\n if(solution) {\n if(!solutionEntities) {\n solutionEntities = [];\n }\n\n solution = parseMarkdown(solution, solutionEntities);\n } else {\n solution = undefined; // can be string here\n }\n\n return {\n _: 'inputMediaPoll',\n poll,\n correct_answers: correctAnswers,\n solution,\n solution_entities: solution ? solutionEntities : undefined\n };\n }\n\n public updatePollToMessage(message: Message.message, add: boolean) {\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\n let set = this.pollToMessages[id];\n\n if(!add && !set) {\n return;\n }\n\n if(!set) {\n set = this.pollToMessages[id] = new Set();\n }\n\n const key = message.peerId + '_' + message.mid;\n if(add) set.add(key);\n else set.delete(key);\n\n if(!add && !set.size) {\n delete this.polls[id];\n delete this.results[id];\n delete this.pollToMessages[id];\n }\n }\n\n public sendVote(message: Message.message, optionIds: number[]): Promise {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n const options: Uint8Array[] = optionIds.map((index) => {\n return poll.answers[index].option;\n });\n\n const messageId = message.mid;\n const peerId = message.peerId;\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n\n if(message.pFlags.is_outgoing) {\n return this.appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\n this.log('invoke sendVote callback');\n return this.sendVote(message as Message.message, optionIds);\n });\n }\n\n return this.apiManager.invokeApi('messages.sendVote', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid),\n options\n }).then((updates) => {\n this.log('sendVote updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getResults(message: Message.message) {\n const inputPeer = this.appPeersManager.getInputPeerById(message.peerId);\n\n return this.apiManager.invokeApi('messages.getPollResults', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n this.log('getResults updates:', updates);\n });\n }\n\n public getVotes(message: Message.message, option?: Uint8Array, offset?: string, limit = 20) {\n return this.apiManager.invokeApi('messages.getPollVotes', {\n peer: this.appPeersManager.getInputPeerById(message.peerId),\n id: getServerMessageId(message.mid),\n option,\n offset,\n limit\n }).then((votesList) => {\n this.log('getPollVotes messages:', votesList);\n\n this.appUsersManager.saveApiUsers(votesList.users);\n\n return votesList;\n });\n }\n\n public stopPoll(message: Message.message) {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n if(poll.pFlags.closed) return Promise.resolve();\n\n const newPoll = copy(poll);\n newPoll.pFlags.closed = true;\n return this.appMessagesManager.editMessage(message, undefined, {\n newMedia: this.getInputMediaPoll(newPoll)\n }).then(() => {\n // console.log('stopped poll');\n }, err => {\n this.log.error('stopPoll error:', err);\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 {InputPrivacyKey, InputPrivacyRule, PrivacyRule, PrivacyKey, GlobalPrivacySettings} from '../../layer';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\n\nexport class AppPrivacyManager extends AppManager {\n private privacy: Partial<{\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\n }> = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePrivacy: (update) => {\n const key = update.key._;\n this.privacy[key] = update.rules;\n this.rootScope.dispatchEvent('privacy_update', update);\n }\n });\n }\n\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\n return this.apiManager.invokeApi('account.setPrivacy', {\n key: {\n _: inputKey\n },\n rules\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePrivacy',\n key: {\n _: convertInputKeyToKey(inputKey)\n },\n rules: rules.map((inputRule) => {\n const rule: PrivacyRule = {} as any;\n Object.assign(rule, inputRule);\n rule._ = convertInputKeyToKey(rule._) as any;\n return rule;\n })\n });\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return privacyRules.rules;\n });\n }\n\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\n const rules = this.privacy[privacyKey];\n if(rules) {\n return Promise.resolve(rules);\n }\n\n return this.privacy[privacyKey] = this.apiManager.invokeApi('account.getPrivacy', {\n key: {\n _: inputKey\n }\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return this.privacy[privacyKey] = privacyRules.rules;\n });\n }\n\n public getGlobalPrivacySettings() {\n return this.apiManager.invokeApi('account.getGlobalPrivacySettings');\n }\n\n public setGlobalPrivacySettings(settings: GlobalPrivacySettings) {\n return this.apiManager.invokeApi('account.setGlobalPrivacySettings', {settings});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {MyTopPeer} from './appUsersManager';\nimport tsNow from '../../helpers/tsNow';\nimport {ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize, Updates} from '../../layer';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport getPhotoInput from './utils/photos/getPhotoInput';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport ctx from '../../environment/ctx';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nconst PEER_FULL_TTL = 3 * 60e3;\n\nexport class AppProfileManager extends AppManager {\n // private botInfos: any = {};\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\n private chatsFull: {[id: ChatId]: ChatFull} = {};\n private fullExpiration: {[peerId: PeerId]: number} = {};\n private typingsInPeer: {[key: string]: UserTyping[]};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = this.appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = !!(fullChat.chat_photo && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\n if(\n hasChatPhoto !== hasFullChatPhoto || (\n hasChatPhoto &&\n photo.photo_id !== fullChat.chat_photo?.id\n )\n ) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n this.rootScope.addEventListener('channel_update', (chatId) => {\n this.refreshFullPeer(chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('chat_full_update', (chatId) => {\n this.rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('user_full_update', (userId) => {\n this.rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n this.rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true) {\n if(this.usersFull[id] && !override && Date.now() < this.fullExpiration[id.toPeerId()]) {\n return this.usersFull[id];\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser',\n params: {\n id: this.appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n this.appChatsManager.saveApiChats(usersUserFull.chats, true);\n this.appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = this.appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n const botInfo = userFull.bot_info;\n if(botInfo) {\n const referenceContext: ReferenceContext = {type: 'userFull', userId: id};\n botInfo.description_document = this.appDocsManager.saveDoc(botInfo.description_document, referenceContext);\n botInfo.description_photo = this.appPhotosManager.savePhoto(botInfo.description_photo, referenceContext);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n // appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n this.rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true) {\n if(this.appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public async getFullPhoto(peerId: PeerId) {\n const profile = await this.getProfileByPeerId(peerId);\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true) {\n if(this.appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const peerId = id.toPeerId(true);\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override && Date.now() < this.fullExpiration[peerId]) {\n const chat = this.appChatsManager.getChat(id) as Chat.chat;\n if(\n chat.pFlags.left ||\n chat.pFlags.deactivated ||\n chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version\n ) {\n return fullChat as ChatFull;\n }\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat',\n params: {\n chat_id: id\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const chatFull = result.full_chat as ChatFull.chatFull;\n if(chatFull && chatFull.chat_photo && chatFull.chat_photo.id) {\n chatFull.chat_photo = this.appPhotosManager.savePhoto(chatFull.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n if(chatFull.call) {\n this.appGroupCallsManager.saveGroupCall(chatFull.call, id);\n }\n\n // appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: chatFull.notify_settings\n });\n\n this.chatsFull[id] = chatFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return chatFull;\n }\n });\n }\n\n public async getChatInviteLink(id: ChatId, force?: boolean) {\n const chatFull = await this.getChatFull(id);\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n\n return this.apiManager.invokeApi('messages.exportChatInvite', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = this.appChatsManager.getChat(id);\n if(chat?.pFlags && (\n // chat.pFlags.kicked ||\n (chat as Chat.channel).pFlags.broadcast &&\n !(chat as Chat.channel).pFlags.creator &&\n !(chat as Chat.channel).admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return this.apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: this.appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then((result) => {\n this.appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex((p) => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return this.apiManager.invokeApiSingle('channels.getParticipant', {\n channel: this.appChatsManager.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId)\n }).then((channelParticipant) => {\n this.appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true) {\n const peerId = id.toPeerId(true);\n if(this.chatsFull[id] !== undefined && !override && Date.now() < this.fullExpiration[peerId]) {\n return this.chatsFull[id] as ChatFull.channelFull;\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel',\n params: {\n channel: this.appChatsManager.getChannelInput(id)\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = this.appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n // appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n\n if(fullChannel.call) {\n this.appGroupCallsManager.saveGroupCall(fullChannel.call, id);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n },\n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n const channel = this.appChatsManager.getChat(id) as Chat.channel | Chat.channelForbidden;\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [channel._ === 'channelForbidden' ? channel : {\n _: 'channelForbidden',\n id,\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n }],\n users: []\n } as Updates.updates);\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n\n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach((peer) => {\n index.indexObject(peer.id, this.appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: getServerMessageId(threadId)\n }, 50, 0).then((cP) => {\n return cP.participants.map((p) => getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = Promise.resolve(this.getChatFull(chatId)).then((chatFull) => {\n return ((chatFull as ChatFull.chatFull).participants as ChatParticipants.chatParticipants).participants.map((p) => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n this.appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]),\n promise\n ]).then((results) => {\n const peers = results[0].concat(results[1].map((peerId) => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n private invalidateChannelParticipants(id: ChatId) {\n this.apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) {\n const userId = peerId.toUserId();\n delete this.usersFull[userId];\n this.rootScope.dispatchEvent('user_full_update', userId);\n } else {\n const chatId = peerId.toChatId();\n delete this.chatsFull[chatId];\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name?: string, last_name?: string, about?: string) {\n return this.apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then((user) => {\n this.appUsersManager.saveApiUser(user);\n\n if(about !== undefined) {\n const peerId = user.id.toPeerId();\n const userFull = this.usersFull[user.id];\n if(userFull) {\n userFull.about = about;\n }\n\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return this.getProfile(user.id, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return this.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n // ! sometimes can have no user in users\n const photo = updateResult.photo as Photo.photo;\n if(!updateResult.users.length) {\n const strippedThumb = photo.sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n updateResult.users.push({\n ...this.appUsersManager.getSelf(),\n photo: {\n _: 'userProfilePhoto',\n dc_id: photo.dc_id,\n photo_id: photo.id,\n stripped_thumb: strippedThumb?.bytes,\n pFlags: {\n\n }\n }\n });\n }\n this.appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = this.appPeersManager.peerId;\n this.appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n // this.apiUpdatesManager.processLocalUpdate({\n // _: 'updateUserPhoto',\n // user_id: userId,\n // date: tsNow(true),\n // photo: this.appUsersManager.getUser(userId).photo,\n // previous: true\n // });\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateUser',\n user_id: userId\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return this.apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map((photoId) => {\n const photo = this.appPhotosManager.getPhoto(photoId);\n return getPhotoInput(photo);\n })\n }).then((deletedList) => {\n\n });\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = this.appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(this.appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n\n const chatInfo = await this.getChatFull(id);\n if(this.appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await this.apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: this.appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private getTypingsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\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 this.appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(this.appPeersManager.peerId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n\n const topMsgId = (update as Update.updateChannelUserTyping).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const peerId = this.appPeersManager.getPeerId(update);\n const key = this.getTypingsKey(peerId, threadId);\n const typings = this.typingsInPeer[key] ??= [];\n let typing = typings.find((t) => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n // typings.findAndSplice((t) => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[key];\n }\n };\n\n if(typing?.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n // console.log('updateChatUserTyping', update, typings);\n\n typing.action = update.action;\n\n const hasUser = this.appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && this.appChatsManager.hasChat(update.chat_id) && !this.appChatsManager.isChannel(update.chat_id)) {\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\n if(typing.timeout !== undefined && this.appUsersManager.hasUser(fromId)) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n });\n }\n }\n\n // return;\n } else {\n this.appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = ctx.setTimeout(cancelAction, 6000);\n if(hasUser) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = this.appPeersManager.getPeerId(update.peer_id);\n if(this.appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n this.rootScope.dispatchEvent('user_full_update', userId);\n }\n\n this.rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId, threadId?: number) {\n return this.typingsInPeer[this.getTypingsKey(peerId, threadId)];\n }\n}\n","/*\n * 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): Promise> | R {\n if(values.some((value) => value instanceof Promise)) {\n return Promise.all(values).then(callback as any);\n } else {\n return callback(values as any);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport callbackifyAll from '../../helpers/callbackifyAll';\nimport copy from '../../helpers/object/copy';\nimport pause from '../../helpers/schedulers/pause';\nimport {AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Reaction, ReactionCount, Update, Updates} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\n\nconst SAVE_DOC_KEYS = [\n 'static_icon' as const,\n 'appear_animation' as const,\n 'select_animation' as const,\n 'activate_animation' as const,\n 'effect_animation' as const,\n 'around_animation' as const,\n 'center_icon' as const\n];\n\nconst REFERENCE_CONTEXT: ReferenceContext = {\n type: 'reactions'\n};\n\nexport class AppReactionsManager extends AppManager {\n private availableReactions: AvailableReaction[];\n private sendReactionPromises: Map>;\n private lastSendingTimes: Map;\n\n protected after() {\n this.rootScope.addEventListener('language_change', () => {\n this.availableReactions = undefined;\n this.getAvailableReactions();\n });\n\n this.sendReactionPromises = new Map();\n this.lastSendingTimes = new Map();\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\n for(const availableReaction of availableReactions) {\n await Promise.all([\n availableReaction.around_animation && this.apiFileManager.downloadMedia({media: availableReaction.around_animation}),\n availableReaction.static_icon && this.apiFileManager.downloadMedia({media: availableReaction.static_icon}),\n availableReaction.appear_animation && this.apiFileManager.downloadMedia({media: availableReaction.appear_animation}),\n availableReaction.center_icon && this.apiFileManager.downloadMedia({media: availableReaction.center_icon})\n ]);\n\n await pause(1000);\n }\n });\n }, 7.5e3);\n });\n }\n\n public getAvailableReactions() {\n if(this.availableReactions) return this.availableReactions;\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAvailableReactions',\n processResult: (messagesAvailableReactions) => {\n assumeType(messagesAvailableReactions);\n\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\n for(const reaction of availableReactions) {\n for(const key of SAVE_DOC_KEYS) {\n if(!reaction[key]) {\n continue;\n }\n\n reaction[key] = this.appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\n }\n }\n\n return availableReactions;\n },\n params: {\n hash: 0\n }\n });\n }\n\n public getActiveAvailableReactions() {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive);\n });\n }\n\n public getAvailableReactionsForPeer(peerId: PeerId) {\n const activeAvailableReactions = this.getActiveAvailableReactions();\n if(peerId.isUser()) {\n return this.unshiftQuickReaction(activeAvailableReactions);\n }\n\n const chatFull = this.appProfileManager.getChatFull(peerId.toChatId());\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n\n let filteredChatAvailableReactions: AvailableReaction[] = [];\n if(chatAvailableReactions._ === 'chatReactionsAll') {\n filteredChatAvailableReactions = activeAvailableReactions;\n } else if(chatAvailableReactions._ === 'chatReactionsSome') {\n filteredChatAvailableReactions = chatAvailableReactions.reactions.map((reaction) => {\n return activeAvailableReactions.find((availableReaction) => availableReaction.reaction === (reaction as Reaction.reactionEmoji).emoticon);\n }).filter(Boolean);\n }\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction[], quickReaction: Reaction | AvailableReaction) {\n if(quickReaction && quickReaction._ !== 'reactionEmoji' && quickReaction._ !== 'availableReaction') return availableReactions;\n const emoticon = (quickReaction as Reaction.reactionEmoji).emoticon || (quickReaction as AvailableReaction).reaction;\n const availableReaction = findAndSplice(availableReactions, (availableReaction) => availableReaction.reaction === emoticon);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction[] | PromiseLike,\n quickReaction: ReturnType = this.getQuickReaction()\n ) {\n return callbackifyAll([\n availableReactions,\n quickReaction\n ], ([availableReactions, quickReaction]) => {\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\n });\n }\n\n public getAvailableReactionsByMessage(message: Message.message) {\n if(!message) return [];\n const peerId = (message.fwd_from?.channel_post && this.appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\n return this.getAvailableReactionsForPeer(peerId);\n }\n\n public isReactionActive(reaction: string) {\n if(!this.availableReactions) return false;\n return !!this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getQuickReaction() {\n return callbackifyAll([\n this.apiManager.getConfig(),\n this.getAvailableReactions()\n ], ([config, availableReactions]) => {\n const reaction = config.reactions_default;\n if(reaction?._ === 'reactionEmoji') {\n return availableReactions.find((availableReaction) => availableReaction.reaction === reaction.emoticon);\n }\n\n return reaction as Reaction.reactionCustomEmoji;\n });\n }\n\n public getReactionCached(reaction: string) {\n return this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), () => {\n return this.getReactionCached(reaction);\n });\n }\n\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessagesReactions',\n params: {\n id: mids.map((mid) => getServerMessageId(mid)),\n peer: this.appPeersManager.getInputPeerById(peerId)\n },\n processResult: (updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\n // return update.reactions;\n }\n });\n }\n\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: Reaction, offset?: string) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessageReactionsList',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: getServerMessageId(mid),\n limit,\n reaction,\n offset\n },\n processResult: (messageReactionsList) => {\n this.appUsersManager.saveApiUsers(messageReactionsList.users);\n return messageReactionsList;\n }\n });\n }\n\n public setDefaultReaction(reaction: Reaction) {\n return this.apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(async(value) => {\n if(value) {\n const appConfig = await this.apiManager.getConfig();\n if(appConfig) {\n appConfig.reactions_default = reaction;\n }/* else { // if no config or loading it - overwrite\n this.apiManager.getAppConfig(true);\n } */\n\n this.rootScope.dispatchEvent('quick_reaction', reaction);\n }\n\n return value;\n });\n }\n\n public async sendReaction(message: Message.message, reaction?: Reaction | AvailableReaction, onlyLocal?: boolean) {\n if(reaction._ === 'availableReaction') {\n reaction = {\n _: 'reactionEmoji',\n emoticon: reaction.reaction\n };\n }\n\n const limit = await this.apiManager.getLimit('reactions');\n\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\n if(lastSendingTime) {\n return;\n } else {\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\n setTimeout(() => {\n this.lastSendingTimes.delete(lastSendingTimeKey);\n }, 333);\n }\n\n const {peerId, mid} = message;\n const myPeerId = this.appPeersManager.peerId;\n\n const unsetReactionCount = (reactionCount: ReactionCount) => {\n --reactionCount.count;\n delete reactionCount.chosen_order;\n\n if(reactionsEqual(reaction as Reaction, reactionCount.reaction)) {\n reaction = undefined as Reaction;\n }\n\n if(!reactionCount.count) {\n indexOfAndSplice(reactions.results, reactionCount);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n findAndSplice(reactions.recent_reactions, (recentReaction) => reactionsEqual(recentReaction.reaction, reactionCount.reaction) && this.appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n };\n\n const canSeeList = message.reactions?.pFlags?.can_see_list || !this.appPeersManager.isBroadcast(message.peerId) || message.peerId.isUser();\n if(!message.reactions) {\n message.reactions = {\n _: 'messageReactions',\n results: [],\n recent_reactions: canSeeList ? [] : undefined,\n pFlags: {\n can_see_list: canSeeList || undefined\n }\n };\n }\n\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n const chosenReactions = reactions.results.filter((reactionCount) => reactionCount.chosen_order !== undefined);\n chosenReactions.sort((a, b) => b.chosen_order - a.chosen_order);\n const unsetReactions: ReactionCount[] = [];\n const chosenReactionIdx = chosenReactions.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n if(chosenReactionIdx !== -1) unsetReactions.push(...chosenReactions.splice(chosenReactionIdx, 1));\n unsetReactions.push(...chosenReactions.splice(limit - +(chosenReactionIdx === -1)));\n unsetReactions.forEach((reactionCount) => {\n chosenReactions.forEach((chosenReactionCount) => {\n if(chosenReactionCount.chosen_order > reactionCount.chosen_order) {\n --chosenReactionCount.chosen_order;\n }\n });\n\n unsetReactionCount(reactionCount);\n });\n\n const chosenReactionsLength = chosenReactions.length;\n chosenReactions.forEach((reactionCount, idx) => {\n reactionCount.chosen_order = chosenReactionsLength - 1 - idx;\n });\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(canSeeList) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.chosen_order = chosenReactions.length ? chosenReactions[0].chosen_order + 1 : 0;\n chosenReactions.unshift(reactionCount);\n\n if(!reactions.recent_reactions && canSeeList) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const peerReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: this.appPeersManager.getOutputPeer(myPeerId)\n };\n\n if(!this.appPeersManager.isMegagroup(peerId) && false) {\n reactions.recent_reactions.push(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(peerReaction);\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 const id1 = (a.reaction as Reaction.reactionCustomEmoji).document_id || (a.reaction as Reaction.reactionEmoji).emoticon;\n const id2 = (b.reaction as Reaction.reactionCustomEmoji).document_id || (b.reaction as Reaction.reactionEmoji).emoticon;\n return (b.count - a.count) || ((indexes.get(id1) ?? 0) - (indexes.get(id2) ?? 0));\n });\n }\n\n if(onlyLocal) {\n message.reactions = reactions;\n this.rootScope.dispatchEvent('messages_reactions', [{message, changedResults: []}]);\n return Promise.resolve();\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: message.peer_id,\n msg_id: message.id,\n reactions: reactions,\n local: true\n });\n\n const promiseKey = [peerId, mid].join('-');\n const msgId = getServerMessageId(mid);\n const promise = this.apiManager.invokeApi('messages.sendReaction', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: msgId,\n reaction: chosenReactions.map((reactionCount) => reactionCount.reaction)\n }).then((updates) => {\n assumeType(updates);\n\n const editMessageUpdateIdx = updates.updates.findIndex((update) => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\n if(editMessageUpdateIdx !== -1) {\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\n updates.updates[editMessageUpdateIdx] = {\n _: 'updateMessageReactions',\n msg_id: msgId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n reactions: (editMessageUpdate.message as Message.message).reactions,\n pts: editMessageUpdate.pts,\n pts_count: editMessageUpdate.pts_count\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }).catch((err) => {\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReaction(message, chosenReactions[0]?.reaction, true);\n }\n }).finally(() => {\n if(this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReactionPromises.delete(promiseKey);\n }\n });\n\n this.sendReactionPromises.set(promiseKey, promise);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport type {DownloadOptions} from '../mtproto/apiFileManager';\nimport {Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFavedStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered, Update} from '../../layer';\nimport {Modify} from '../../types';\nimport AppStorage from '../storage';\nimport DATABASE_STATE from '../../config/databases/state';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport {AppManager} from './manager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\n\nconst CACHE_TIME = 3600e3;\n\ntype LOCAL_STICKER_SET_ID = Extract<\n InputStickerSet['_'],\n 'inputStickerSetAnimatedEmoji' | 'inputStickerSetAnimatedEmojiAnimations' |\n 'inputStickerSetPremiumGifts' | 'inputStickerSetEmojiGenericAnimations' |\n 'inputStickerSetEmojiDefaultStatuses' | 'inputStickerSetEmojiDefaultTopicIcons'\n>;\n\ntype LOCAL_ID = 'EMOJI' | 'EMOJI_ANIMATIONS' | 'PREMIUM_GIFTS' | 'GENERIC_ANIMATIONS' | 'DEFAULT_STATUSES' | 'DEFAULT_TOPIC_ICONS';\n\nconst LOCAL_IDS: {[key in LOCAL_ID]: LOCAL_STICKER_SET_ID} = {\n EMOJI: 'inputStickerSetAnimatedEmoji',\n EMOJI_ANIMATIONS: 'inputStickerSetAnimatedEmojiAnimations',\n PREMIUM_GIFTS: 'inputStickerSetPremiumGifts',\n GENERIC_ANIMATIONS: 'inputStickerSetEmojiGenericAnimations',\n DEFAULT_STATUSES: 'inputStickerSetEmojiDefaultStatuses',\n DEFAULT_TOPIC_ICONS: 'inputStickerSetEmojiDefaultTopicIcons'\n}\n\nconst LOCAL_IDS_SET: Set = new Set(Object.values(LOCAL_IDS) as any);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager extends AppManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise};\n\n private greetingStickers: MyDocument[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n\n private favedStickers: MyDocument[];\n private recentStickers: MyDocument[];\n\n private names: Record;\n\n protected after() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {};\n this.sounds = {};\n this.names = {};\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n this.getAnimatedEmojiStickerSet();\n // this.getFavedStickersStickers();\n }, 1000);\n\n if(!this.getGreetingStickersPromise && this.getGreetingStickersTimeout === undefined) {\n this.getGreetingStickersTimeout = ctx.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n });\n\n this.rootScope.addEventListener('app_config', () => this.onStickersUpdated('faved', true));\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n this.rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n },\n\n updateRecentStickers: () => this.onStickersUpdated('recent', true),\n\n updateFavedStickers: () => this.onStickersUpdated('faved', true),\n\n updateMoveStickerSetToTop: (update) => {\n this.rootScope.dispatchEvent('stickers_top', update.stickerset);\n }\n });\n }\n\n private async onStickersUpdated(type: 'faved' | 'recent', overwrite: boolean) {\n const stickers = await (type === 'faved' ? this.getFavedStickersStickers(overwrite) : this.getRecentStickersStickers(overwrite));\n this.rootScope.dispatchEvent('stickers_updated', {\n type,\n stickers\n });\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then((docs) => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n\n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n this.apiFileManager.downloadMedia({media: this.greetingStickers[0]}); // preload next sticker\n\n return doc;\n });\n }\n\n private saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = this.appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n private canUseStickerSetCache(set: MyMessagesStickerSet, useCache?: boolean) {\n return set && set.documents?.length && ((Date.now() - set.refreshTime) < CACHE_TIME || useCache);\n }\n\n public getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise | MyMessagesStickerSet {\n let {id} = set;\n if(!set.access_hash) {\n set = this.names[id] || set;\n id = set.id;\n }\n\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n if(!params.overwrite) {\n const cachedSet = this.storage.getFromCache(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n return cachedSet;\n }\n }\n\n const promise = this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n const cachedSet = await this.storage.get(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n\n return;\n }\n }\n\n try {\n const stickerSet = await this.apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n\n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n\n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n });\n\n return promise;\n }\n\n public getLocalStickerSet(id: LOCAL_STICKER_SET_ID) {\n return this.getStickerSet({id}, {saveById: true});\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getLocalStickerSet(LOCAL_IDS.EMOJI),\n this.getLocalStickerSet(LOCAL_IDS.EMOJI_ANIMATIONS),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n const promise = this.getAnimatedEmojiSoundsPromise = Promise.all([\n this.apiManager.getAppConfig(overwrite),\n this.apiManager.getConfig()\n ]).then(([appConfig, config]) => {\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\n return;\n }\n\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n\n const doc = this.appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg'\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n\n return promise;\n }\n\n public async getRecentStickers(overwrite?: boolean): Promise> {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.recentStickers = res.stickers as MyDocument[];\n this.saveStickers(res.stickers);\n return res;\n },\n overwrite\n });\n\n return res;\n }\n\n public getRecentStickersStickers(overwrite?: boolean) {\n if(overwrite) this.recentStickers = undefined;\n else if(this.recentStickers) return this.recentStickers;\n return this.getRecentStickers(overwrite).then(() => this.recentStickers);\n }\n\n public saveRecentSticker(docId: DocId, unsave?: boolean, attached?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n\n findAndSplice(this.recentStickers, (_doc) => _doc.id === docId);\n if(!unsave) {\n this.recentStickers.unshift(doc);\n\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then((stickers) => {\n const _doc = findAndSplice(stickers, (_doc) => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'recent', faved: !unsave, document: doc});\n\n if(unsave) {\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.saveRecentSticker', {\n id: getDocumentInput(doc),\n unsave,\n attached\n });\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const id = isAnimation ? LOCAL_IDS.EMOJI_ANIMATIONS : LOCAL_IDS.EMOJI;\n const stickerSet = this.storage.getFromCache(id);\n // const stickerSet = await this.getStickerSet({id});\n if(!stickerSet?.documents) return;\n\n if(isAnimation) {\n if(['🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎'].includes(emoji)) {\n emoji = '❤️';\n }\n }\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find((p) => p.emoticon === emoji);\n return pack ? this.appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji);\n });\n\n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]).then(([doc, a]) => {\n return {\n doc: doc,\n animation: a?.doc,\n sound: a?.sound\n };\n });\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji, true);\n }).then((doc) => {\n if(!doc) {\n return;\n }\n\n const sound = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n this.preloadSticker(doc.id),\n sound ? this.preloadSticker(sound.id) : undefined\n ]).then(() => {\n return {doc, sound};\n });\n });\n }\n\n public preloadSticker(docId: DocId, isPremiumEffect?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n return this.apiFileManager.downloadMedia({media: doc, thumb: isPremiumEffect ? doc.video_thumbs?.[0] : undefined});\n }\n\n private saveStickerSet(res: Omit, id: DocId) {\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[],\n keywords: res.keywords\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 if(stickerSet.set.short_name) {\n this.names[stickerSet.set.short_name] = this.getStickerSetInput(newSet.set) as any;\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): DownloadOptions {\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(LOCAL_IDS_SET.has(set.id as any)) {\n return {\n _: set.id as any\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public getPromoPremiumStickers() {\n return this.getStickersByEmoticon('⭐️⭐️', false);\n }\n\n public getPremiumStickers() {\n return this.getStickersByEmoticon('📂⭐️', false);\n }\n\n public getFavedStickers(overwrite?: boolean) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getFavedStickers',\n processResult: (favedStickers) => {\n assumeType(favedStickers);\n this.saveStickers(favedStickers.stickers);\n this.favedStickers = favedStickers.stickers as MyDocument[];\n return favedStickers;\n },\n overwrite\n });\n }\n\n public getFavedStickersStickers(overwrite?: boolean) {\n if(overwrite) this.favedStickers = undefined;\n else if(this.favedStickers) return this.favedStickers;\n return this.getFavedStickers(overwrite).then(() => this.favedStickers);\n }\n\n public getFavedStickersLimit() {\n return this.apiManager.getLimit('favedStickers');\n }\n\n public async faveSticker(docId: DocId, unfave?: boolean) {\n if(!this.favedStickers) {\n await this.getFavedStickersStickers();\n }\n\n const limit = await this.getFavedStickersLimit();\n\n const doc = this.appDocsManager.getDoc(docId);\n findAndSplice(this.favedStickers, (_doc) => _doc.id === doc.id);\n\n if(!unfave) {\n this.favedStickers.unshift(doc);\n const spliced = this.favedStickers.splice(limit, this.favedStickers.length - limit);\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'faved', faved: !unfave, document: doc});\n\n return this.apiManager.invokeApi('messages.faveSticker', {\n id: getDocumentInput(doc),\n unfave\n }).then(() => {\n if(unfave) {\n this.onStickersUpdated('faved', true);\n }\n });\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n set = this.storage.getFromCache(set.id).set;\n\n if(set.installed_date) {\n const res = await this.apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n this.rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await this.apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n this.rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public toggleStickerSets(sets: StickerSet.stickerSet[]) {\n return Promise.all(sets.map((set) => this.toggleStickerSet(set)));\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets',\n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(const 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 private processAllStickersResult = (allStickers: MessagesAllStickers) => {\n assumeType(allStickers);\n\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\n if(stickerSet.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return allStickers;\n };\n\n public getAllStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getAllStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public getEmojiStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getEmojiStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then((allStickers) => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map((set) => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n this.apiManager.invokeApiHashable({\n method: 'messages.getStickers',\n params: {\n emoticon\n },\n processResult: (stickers) => stickers\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map((sticker) => this.appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n // console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = this.appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter((doc) => !doc.animated) */;\n\n forEachReverse(stickers, (sticker, idx, arr) => {\n if((sticker.sticker === 3 && !getEnvironment().IS_WEBM_SUPPORTED) ||\n (!this.rootScope.premium && getStickerEffectThumb(sticker))) {\n arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public clearRecentStickers() {\n if(this.recentStickers) {\n this.recentStickers.length = 0;\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.clearRecentStickers');\n }\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport filterUnique from '../../helpers/array/filterUnique';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cleanSearchText from '../../helpers/cleanSearchText';\nimport cleanUsername from '../../helpers/cleanUsername';\nimport tsNow from '../../helpers/tsNow';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {Chat, ContactsResolvedPeer, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus} from '../../layer';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport canSendToUser from './utils/users/canSendToUser';\nimport {AppStoragesManager} from './appStoragesManager';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager extends AppManager {\n private storage: AppStoragesManager['storages']['users'];\n\n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: PeerId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n\n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n protected after() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n this.rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= this.timeManager.getServerTimeOffset();\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } // ////else console.warn('No user by id:', userId);\n },\n\n // updateUserPhoto: (update) => {\n // const userId = update.user_id;\n // const user = this.users[userId];\n // if(user) {\n // if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto)?.photo_id) {\n // return;\n // }\n\n // this.forceUserOnline(userId, update.date);\n\n // if(update.photo._ === 'userProfilePhotoEmpty') {\n // delete user.photo;\n // } else {\n // user.photo = safeReplaceObject(user.photo, update.photo);\n // }\n\n // this.setUserToStateIfNeeded(user);\n\n // this.rootScope.dispatchEvent('user_update', userId);\n // this.rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n // } else console.warn('No user by id:', userId);\n // },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n\n this.saveApiUser({\n ...user,\n first_name: update.first_name,\n last_name: update.last_name,\n username: undefined,\n usernames: update.usernames\n }, true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n this.rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('users')\n ]).then(([state, {results: users, storage}]) => {\n this.storage = storage;\n\n this.saveApiUsers(users);\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(!user) {\n continue;\n }\n\n if(state.contactsListCachedTime && (user.pFlags.contact || user.pFlags.mutual_contact)) {\n this.pushContact(user.id);\n\n if(!this.contactsFillPromise) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n }\n\n // const contactsList = state.contactsList;\n // if(Array.isArray(contactsList)) {\n // contactsList.forEach((userId) => {\n // this.pushContact(userId);\n // });\n\n // if(contactsList.length) {\n // this.contactsFillPromise = deferredPromise();\n // this.contactsFillPromise.resolve(this.contactsList);\n // }\n // }\n\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n this.peersStorage.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!this.peersStorage.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n this.modifyUsernamesCache(user, false);\n\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n\n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n };\n\n public get userId() {\n return this.rootScope.myId.toUserId();\n }\n\n private onContactsModified(fromServer?: boolean) {\n // const contactsList = [...this.contactsList];\n // this.appStateManager.pushToState('contactsList', contactsList);\n\n if(fromServer) {\n this.appStateManager.pushToState('contactsListCachedTime', tsNow(true));\n }\n }\n\n public pushRecentSearch(peerId: PeerId) {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n\n this.appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n this.peersStorage.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }\n\n public clearRecentSearch() {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n this.peersStorage.releasePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n this.appStateManager.pushToState('recentSearch', recentSearch);\n });\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n this.apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n\n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified(true);\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise ||= promise\n };\n }\n\n public resolveUsername(username: string): Promise | Chat | User {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n const peerId = this.usernames[username];\n if(peerId) {\n return this.appPeersManager.getPeer(peerId);\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'contacts.resolveUsername',\n params: {username},\n processResult: (resolvedPeer) => this.processResolvedPeer(resolvedPeer)\n });\n }\n\n private processResolvedPeer(resolvedPeer: ContactsResolvedPeer.contactsResolvedPeer) {\n this.saveApiUsers(resolvedPeer.users);\n this.appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return this.appPeersManager.getPeer(getPeerId(resolvedPeer.peer)) as Chat | User;\n }\n\n public resolvePhone(phone: string) {\n return this.apiManager.invokeApi('contacts.resolvePhone', {phone}).then((resolvedPeer) => {\n return this.processResolvedPeer(resolvedPeer) as User;\n });\n }\n\n private pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n this.peersStorage.requestPeer(id.toPeerId(), 'contact');\n }\n\n private popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n this.peersStorage.releasePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n ...getPeerActiveUsernames(user),\n // user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then((_contactsList) => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter((id) => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = this.getUserStatusForSort(this.getUser(userId1).status);\n const status2 = this.getUserStatusForSort(this.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = this.userId;\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0],\n includeSaved?: Parameters[1],\n sortBy?: Parameters[2],\n limit?: number\n ) {\n return this.getContacts(query, includeSaved, sortBy).then((userIds) => {\n const peerIds = userIds.map((userId) => userId.toPeerId(false));\n if(limit) {\n return peerIds.slice(0, limit);\n }\n\n return peerIds;\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return this.apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: this.appPeersManager.getInputPeerById(peerId)\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n public modifyUsernamesCache(peer: Parameters[0], save: boolean) {\n const usernames = getPeerActiveUsernames(peer);\n if(!usernames.length) {\n return;\n }\n\n const cleanedUsernames = usernames.map((username) => cleanUsername(username));\n if(save) {\n cleanedUsernames.forEach((searchUsername) => {\n this.usernames[searchUsername] = peer.id.toPeerId(peer._ !== 'user');\n });\n } else {\n cleanedUsernames.forEach((searchUsername) => {\n delete this.usernames[searchUsername];\n });\n }\n }\n\n public setUsernameToCache(peer: Parameters[0], oldPeer?: typeof peer) {\n if(\n !oldPeer ||\n (oldPeer as MTUser.user).username !== (peer as MTUser.user).username ||\n !deepEqual((oldPeer as MTUser.user).usernames, (peer as MTUser.user).usernames)\n ) {\n this.modifyUsernamesCache(oldPeer, false);\n this.modifyUsernamesCache(peer, true);\n\n return true;\n }\n\n return false;\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(!user || 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 user.pFlags ??= {};\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 const changedUsername = this.setUsernameToCache(user, oldUser);\n\n if(!oldUser ||\n oldUser.sortName === undefined ||\n oldUser.first_name !== user.first_name ||\n oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false);\n } else {\n user.sortName = oldUser.sortName;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= this.timeManager.getServerTimeOffset();\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n if((user as User).photo?._ === 'userProfilePhotoEmpty') {\n delete (user as User).photo;\n }\n\n // user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n // if(!user.username && user.usernames) {\n // user.username = user.usernames.find((username) => username.pFlags.active).username;\n // }\n\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n const changedTitle = user.first_name !== oldUser.first_name ||\n user.last_name !== oldUser.last_name ||\n changedUsername;\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const changedPhoto = oldPhotoId !== newPhotoId;\n\n const changedAnyBadge = oldUser.pFlags.premium !== user.pFlags.premium ||\n oldUser.pFlags.verified !== user.pFlags.verified ||\n oldUser.pFlags.scam !== user.pFlags.scam ||\n oldUser.pFlags.fake !== user.pFlags.fake;\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n\n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n this.rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId: user.id.toPeerId()});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId: user.id.toPeerId()});\n }\n }\n\n this.checkPremium(user, oldUser);\n this.setUserToStateIfNeeded(user);\n }\n\n private checkPremium(user: User, oldUser: User) {\n if(user.pFlags.self) {\n const isPremium = !!user.pFlags.premium;\n if(this.rootScope.premium !== isPremium) {\n this.rootScope.dispatchEvent('premium_toggle_private', {isNew: !oldUser, isPremium});\n }\n }\n }\n\n private setUserToStateIfNeeded(user: User) {\n if(this.peersStorage.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n const user = this.getUser(status);\n status = user?.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];\n }\n\n public getUserStatus(id: UserId) {\n return this.isRegularUser(id) && !this.users[id].pFlags.self && this.users[id].status;\n }\n\n public async getUserPhone(id: UserId) {\n const user = this.getUser(id);\n if(!user?.phone) {\n return;\n }\n\n const appConfig = await this.apiManager.getAppConfig();\n return {\n phone: user.phone,\n isAnonymous: appConfig.fragment_prefixes.some((prefix) => user.phone.startsWith(prefix))\n };\n }\n\n public getSelf() {\n return this.getUser(this.userId);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isAttachMenuBot(id: UserId) {\n return this.isBot(id) && !!this.users[id].pFlags.bot_attach_menu;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n\n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id !== this.userId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public 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 // ! do not use it, there are places that don't support it. need explicit peer id\n // if(user.pFlags?.self) {\n // return {_: 'inputPeerSelf'};\n // }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n private updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n private updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n this.rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(this.apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user?.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then((userIds) => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return this.apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = this.appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return this.apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n // console.log(result);\n this.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = getPeerId(topPeer.peer);\n this.peersStorage.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n\n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n this.appStateManager.pushToState('topPeersCache', state.topPeersCache);\n\n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return this.apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then((contactsBlocked) => {\n this.saveApiUsers(contactsBlocked.users);\n this.appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map((u) => u.id.toPeerId()).concat(contactsBlocked.chats.map((c) => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number,\n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return this.apiManager.invokeApi('contacts.getLocated', {\n geo_point,\n background\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then((results) => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map((p) => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map((p) => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n // handle 't.me/username' as 'username'\n const entities = parseEntities(query);\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\n try {\n const url = new URL(wrapUrl(query).url);\n const path = url.pathname.slice(1);\n if(path) {\n query = path;\n }\n } catch(err) {}\n }\n\n return this.apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then((peers) => {\n this.saveApiUsers(peers.users);\n this.appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map((p) => getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map((p) => getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n this.rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return this.apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public updateMyOnlineStatus(offline: boolean) {\n this.setUserStatus(this.getSelf().id, offline);\n return this.apiManager.invokeApiSingle('account.updateStatus', {offline});\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, addPhonePrivacyException?: boolean) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return this.apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: addPhonePrivacyException\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return this.apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map((userId) => this.getUserInput(userId))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach((userId) => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n\n public checkUsername(username: string) {\n return this.apiManager.invokeApi('account.checkUsername', {username});\n }\n\n public toggleUsername(username: string, active: boolean) {\n return this.apiManager.invokeApi('account.toggleUsername', {username, active});\n }\n\n public reorderUsernames(usernames: string[]) {\n return this.apiManager.invokeApi('account.reorderUsernames', {order: usernames});\n }\n\n public canSendToUser(userId: UserId) {\n return canSendToUser(this.getUser(userId));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function cleanUsername(username: string) {\n return username && username.toLowerCase() || '';\n}\n","/*\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 {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {WebPage} from '../../layer';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {AppManager} from './manager';\n\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\n\ntype WebPageMessageKey = `${PeerId}_${number}`;\n\nexport class AppWebPagesManager extends AppManager {\n private webpages: {\n [webPageId: string]: WebPage\n } = {};\n private pendingWebPages: {\n [webPageId: string]: Set\n } = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateWebPage: (update) => {\n this.saveWebPage(update.webpage);\n }\n });\n }\n\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\n if(apiWebPage._ === 'webPageNotModified' || apiWebPage._ === 'webPageEmpty') return;\n const {id} = apiWebPage;\n\n const oldWebPage = this.webpages[id];\n const isUpdated = oldWebPage &&\n oldWebPage._ === apiWebPage._ &&\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\n\n if(apiWebPage._ === 'webPage') {\n if(apiWebPage.photo?._ === 'photo') {\n apiWebPage.photo = this.appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\n } else {\n delete apiWebPage.photo;\n }\n\n if(apiWebPage.document?._ === 'document') {\n apiWebPage.document = this.appDocsManager.saveDoc(apiWebPage.document, mediaContext);\n } else {\n if(apiWebPage.type === 'document') {\n delete apiWebPage.type;\n }\n\n delete apiWebPage.document;\n }\n\n const siteName = apiWebPage.site_name;\n const shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\n if(siteName && shortTitle === siteName) {\n delete apiWebPage.site_name;\n }\n\n // delete apiWebPage.description\n\n if(!photoTypeSet.has(apiWebPage.type) &&\n !apiWebPage.description &&\n apiWebPage.photo) {\n apiWebPage.type = 'photo';\n }\n }\n\n let pendingSet = this.pendingWebPages[id];\n if(messageKey) {\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\n pendingSet.add(messageKey);\n }\n\n if(oldWebPage === undefined) {\n this.webpages[id] = apiWebPage;\n } else {\n safeReplaceObject(oldWebPage, apiWebPage);\n }\n\n if(!messageKey && pendingSet !== undefined && isUpdated) {\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\n pendingSet.forEach((value) => {\n const [peerId, mid, isScheduled] = value.split('_');\n msgs.push({\n peerId: peerId.toPeerId(),\n mid: +mid,\n isScheduled: !!isScheduled\n });\n });\n\n this.rootScope.dispatchEvent('webpage_updated', {\n id,\n msgs\n });\n }\n\n return apiWebPage;\n }\n\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\n }\n\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\n const id = (webPage as WebPage.webPage).id;\n if(!id) return;\n\n const set = this.pendingWebPages[id];\n if(set && set.has(messageKey)) {\n set.delete(messageKey);\n\n if(!set.size) {\n delete this.pendingWebPages[id];\n }\n }\n }\n\n public getCachedWebPage(id: WebPage.webPage['id']) {\n return this.webpages[id];\n }\n\n public getWebPage(url: string) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getWebPage',\n processResult: (webPage) => {\n return this.saveWebPage(webPage);\n },\n params: {\n url\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 readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","export default function fileNameRFC(fileName: string) {\n // Make filename RFC5987 compatible\n return encodeURIComponent(fileName).replace(/['()]/g, escape).replace(/\\*/g, '%2A');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport StreamWriter from './streamWriter';\n\nexport default class DownloadWriter implements StreamWriter {\n constructor(\n private serviceMessagePort: ServiceMessagePort,\n private downloadId: string\n ) {\n this.serviceMessagePort = getServiceMessagePort();\n }\n\n public async write(part: Uint8Array, offset?: number) {\n return this.serviceMessagePort.invoke('downloadChunk', {\n id: this.downloadId,\n chunk: part\n });\n }\n\n public finalize(saveToStorage?: boolean): Promise {\n return this.serviceMessagePort.invoke('downloadFinalize', this.downloadId).then(() => 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 makeError from '../../helpers/makeError';\nimport fileNameRFC from '../../helpers/string/fileNameRFC';\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport DownloadWriter from './downloadWriter';\nimport FileStorage from './fileStorage';\n\nexport default class DownloadStorage implements FileStorage {\n public getFile(fileName: string): Promise {\n return Promise.reject(makeError('NO_ENTRY_FOUND'));\n }\n\n public prepareWriting({fileName, downloadId, size}: {\n fileName: string,\n downloadId: string,\n size: number\n }) {\n const headers = {\n 'Content-Type': 'application/octet-stream; charset=utf-8',\n 'Content-Disposition': 'attachment; filename*=UTF-8\\'\\'' + fileNameRFC(fileName),\n ...(size ? {'Content-Length': size} : {})\n };\n\n const serviceMessagePort = getServiceMessagePort();\n const promise = serviceMessagePort.invoke('download', {\n headers,\n id: downloadId\n });\n\n const deferred = deferredPromise();\n deferred.cancel = () => {\n deferred.reject(makeError('DOWNLOAD_CANCELED'));\n };\n\n deferred.catch(() => {\n getServiceMessagePort().invoke('downloadCancel', downloadId);\n });\n\n promise.then(deferred.resolve, deferred.reject);\n\n return {\n deferred,\n getWriter: () => {\n return new DownloadWriter(serviceMessagePort, downloadId);\n }\n };\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ReferenceBytes} from './referenceDatabase';\nimport Modes from '../../config/modes';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {randomLong} from '../../helpers/random';\nimport {Document, InputFile, InputFileLocation, InputWebFileLocation, Photo, PhotoSize, UploadFile, UploadWebFile, VideoSize, WebDocument} from '../../layer';\nimport {DcId} from '../../types';\nimport CacheStorageController from '../files/cacheStorage';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport readBlobAsArrayBuffer from '../../helpers/blob/readBlobAsArrayBuffer';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport fixFirefoxSvg from '../../helpers/fixFirefoxSvg';\nimport {AppManager} from '../appManagers/manager';\nimport {getEnvironment} from '../../environment/utils';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport type {Progress} from '../appManagers/appDownloadManager';\nimport getDownloadMediaDetails from '../appManagers/utils/download/getDownloadMediaDetails';\n// import networkStats from './networkStats';\nimport getDownloadFileNameFromOptions from '../appManagers/utils/download/getDownloadFileNameFromOptions';\nimport StreamWriter from '../files/streamWriter';\nimport FileStorage from '../files/fileStorage';\nimport {MAX_FILE_SAVE_SIZE} from './mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport makeError from '../../helpers/makeError';\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport DownloadStorage from '../files/downloadStorage';\nimport copy from '../../helpers/object/copy';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {MIME_TYPE_EXTENSION_MAP} from '../../environment/mimeTypeMap';\nimport {getServiceMessagePort} from './mtproto.worker';\n\ntype Delayed = {\n offset: number,\n writePromise: CancellablePromise,\n writeDeferred: CancellablePromise\n};\n\nexport type DownloadOptions = {\n dcId: DcId,\n location: InputFileLocation | InputWebFileLocation,\n size?: number,\n fileName?: string,\n mimeType?: MTMimeType,\n limitPart?: number,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n // getFileMethod: Parameters[1]\n};\n\nexport type DownloadMediaOptions = {\n media: Photo.photo | Document.document | WebDocument,\n thumb?: PhotoSize | VideoSize,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n};\n\ntype DownloadPromise = CancellablePromise;\n\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\n\n// export interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// };\n\n// export interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// originalPayload: ReferenceBytes\n// };\n\nconst MAX_DOWNLOAD_FILE_PART_SIZE = 1 * 1024 * 1024;\nconst MAX_UPLOAD_FILE_PART_SIZE = 512 * 1024;\nconst MIN_PART_SIZE = 128 * 1024;\nconst AVG_PART_SIZE = 512 * 1024;\n\nconst REGULAR_DOWNLOAD_DELTA = (9 * 512 * 1024) / MIN_PART_SIZE;\n// const PREMIUM_DOWNLOAD_DELTA = REGULAR_DOWNLOAD_DELTA * 2;\nconst PREMIUM_DOWNLOAD_DELTA = (56 * 512 * 1024) / MIN_PART_SIZE;\n\nconst IGNORE_ERRORS: Set = new Set([\n 'DOWNLOAD_CANCELED',\n 'UPLOAD_CANCELED',\n 'UNKNOWN',\n 'NO_NEW_CONTEXT'\n]);\n\nexport class ApiFileManager extends AppManager {\n private cacheStorage = new CacheStorageController('cachedFiles');\n private downloadStorage = new DownloadStorage();\n\n private downloadPromises: {\n [fileName: string]: DownloadPromise\n } = {};\n\n // private downloadToDiscPromises: {\n // [fileName: string]: DownloadPromise\n // } = {};\n\n private uploadPromises: {\n [fileName: string]: CancellablePromise\n } = {};\n\n private downloadPulls: {\n [dcId: string]: Array<{\n id: number,\n queueId: number,\n cb: () => Promise,\n deferred: {\n resolve: (...args: any[]) => void,\n reject: (...args: any[]) => void\n },\n activeDelta: number\n }>\n } = {};\n private downloadActives: {[dcId: string]: number} = {};\n\n public refreshReferencePromises: {\n [referenceHex: string]: {\n deferred: CancellablePromise,\n timeout?: number\n }\n } = {};\n\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\n private tempId = 0;\n private queueId = 0;\n private debug = Modes.debug;\n\n private maxUploadParts = 4000;\n private maxDownloadParts = 8000;\n private webFileDcId: DcId;\n\n protected after() {\n setInterval(() => { // clear old promises\n for(const hex in this.refreshReferencePromises) {\n const {deferred} = this.refreshReferencePromises[hex];\n if(deferred.isFulfilled || deferred.isRejected) {\n delete this.refreshReferencePromises[hex];\n }\n }\n }, 1800e3);\n\n this.rootScope.addEventListener('config', (config) => {\n this.webFileDcId = config.webfile_dc_id;\n });\n\n this.rootScope.addEventListener('app_config', (appConfig) => {\n this.maxUploadParts = this.rootScope.premium ? appConfig.upload_max_fileparts_premium : appConfig.upload_max_fileparts_default;\n this.maxDownloadParts = appConfig.upload_max_fileparts_premium;\n });\n }\n\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\n if(this.downloadPulls[dcId] === undefined) {\n this.downloadPulls[dcId] = [];\n this.downloadActives[dcId] = 0;\n }\n\n const downloadPull = this.downloadPulls[dcId];\n\n const promise = new Promise((resolve, reject) => {\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\n });\n\n setTimeout(() => {\n this.downloadCheck(dcId);\n }, 0);\n\n return promise;\n }\n\n private downloadCheck(dcId: string | number) {\n const downloadPull = this.downloadPulls[dcId];\n const downloadLimit = /* dcId === 'upload' ? 24 : */(this.rootScope.premium ? PREMIUM_DOWNLOAD_DELTA : REGULAR_DOWNLOAD_DELTA);\n // const downloadLimit = Infinity;\n\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull?.length) {\n return false;\n }\n\n // const data = downloadPull.shift();\n const data = findAndSplice(downloadPull, (d) => d.queueId === 0) || findAndSplice(downloadPull, (d) => d.queueId === this.queueId) || downloadPull.shift();\n const activeDelta = data.activeDelta || 1;\n\n this.downloadActives[dcId] += activeDelta;\n\n const promise = data.cb();\n // const networkPromise = networkStats.waitForChunk(dcId as DcId, activeDelta * MIN_PART_SIZE);\n /* Promise.race([\n promise\n // networkPromise\n ]) */promise.then(() => {\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.resolve();\n }, (error: ApiError) => {\n if(!error?.type || !IGNORE_ERRORS.has(error.type)) {\n this.log.error('downloadCheck error:', error);\n }\n\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.reject(error);\n }).finally(() => {\n promise.then(data.deferred.resolve, data.deferred.reject);\n });\n }\n\n public setQueueId(queueId: number) {\n // this.log.error('setQueueId', queueId);\n this.queueId = queueId;\n }\n\n private getFileStorage() {\n return this.cacheStorage;\n }\n\n public cancelDownload(fileName: string) {\n const promises = [this.downloadPromises[fileName], this.uploadPromises[fileName]].filter(Boolean);\n let canceled = false;\n for(let i = 0, length = promises.length; i < length; ++i) {\n const promise = promises[i];\n if(promise && !promise.isRejected && !promise.isFulfilled) {\n promise.cancel();\n canceled = true;\n }\n }\n\n return canceled;\n }\n\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n return this.apiManager.invokeApi('upload.getWebFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n });\n }, this.getDelta(limit), queueId);\n }\n\n public requestFilePart(\n dcId: DcId,\n location: InputFileLocation,\n offset: number,\n limit: number,\n id = 0,\n queueId = 0,\n checkCancel?: () => void\n ) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n const invoke = async(): Promise => {\n checkCancel?.(); // do not remove async, because checkCancel will throw an error\n\n // * IMPORTANT: reference can be changed in previous request\n const reference = (location as InputFileLocation.inputDocumentFileLocation).file_reference?.slice();\n\n const promise = // pause(offset > (100 * 1024 * 1024) ? 10000000 : 0).then(() =>\n this.apiManager.invokeApi('upload.getFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n }) as Promise/* ) */;\n\n return promise.catch((err: ApiError) => {\n checkCancel?.();\n\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\n return this.refreshReference(location as InputFileLocation.inputDocumentFileLocation, reference).then(invoke);\n }\n\n throw err;\n });\n };\n\n assumeType(location);\n const reference = location.file_reference;\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\n location.checkedReference = true;\n const hex = bytesToHex(reference);\n if(this.refreshReferencePromises[hex]) {\n return this.refreshReference(location, reference).then(invoke);\n }\n }\n\n return invoke();\n }, this.getDelta(limit), queueId);\n }\n\n /* private convertBlobToBytes(blob: Blob) {\n return blob.arrayBuffer().then((buffer) => new Uint8Array(buffer));\n } */\n\n private getDelta(bytes: number) {\n return bytes / MIN_PART_SIZE;\n }\n\n private getLimitPart(size: number, isUpload: boolean): number {\n if(!size) { // * sometimes size can be 0 (e.g. avatars, webDocuments)\n return AVG_PART_SIZE;\n }\n\n // return 1 * 1024 * 1024;\n\n let bytes = MIN_PART_SIZE;\n\n const maxParts = isUpload ? this.maxUploadParts : this.maxDownloadParts;\n const maxPartSize = isUpload ? MAX_UPLOAD_FILE_PART_SIZE : MAX_DOWNLOAD_FILE_PART_SIZE;\n // usually it will stick to 512Kb size if the file is too big\n while((size / bytes) > maxParts && bytes < maxPartSize) {\n bytes *= 2;\n }\n /* if(size < 1e6 || !size) bytes = 512;\n else if(size < 3e6) bytes = 256;\n else bytes = 128; */\n\n return bytes;\n }\n\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\n return this.cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise;\n };\n\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\n const buffer = bytes.slice().buffer;\n if(getEnvironment().IS_FIREFOX) {\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\n return fixFirefoxSvg(text as string);\n }).then((text) => {\n const textEncoder = new TextEncoder();\n return textEncoder.encode(text);\n });\n }\n\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise;\n };\n\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertWebp', {fileName, bytes});\n };\n\n private convertOpus = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertOpus', {fileName, bytes});\n };\n\n private refreshReference(\n inputFileLocation: InputFileLocation.inputDocumentFileLocation,\n reference: typeof inputFileLocation['file_reference'],\n hex = bytesToHex(reference)\n ) {\n let r = this.refreshReferencePromises[hex];\n if(!r) {\n const deferred = deferredPromise();\n\n r = this.refreshReferencePromises[hex] = {\n deferred\n\n // ! I don't remember what it was for...\n // timeout: ctx.setTimeout(() => {\n // this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\n // deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n // }, 60000)\n };\n\n // deferred.catch(noop).finally(() => {\n // clearTimeout(r.timeout);\n // });\n\n this.referenceDatabase.refreshReference(reference).then((reference) => {\n if(hex === bytesToHex(reference)) {\n deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n }\n\n deferred.resolve(reference);\n }, deferred.reject);\n }\n\n // have to replace file_reference in any way, because location can be different everytime if it's stream\n return r.deferred.then((reference) => {\n inputFileLocation.file_reference = reference;\n });\n }\n\n public isDownloading(fileName: string) {\n return !!this.downloadPromises[fileName];\n }\n\n public getDownload(fileName: string) {\n return this.downloadPromises[fileName];\n }\n\n public getUpload(fileName: string) {\n return this.uploadPromises[fileName];\n }\n\n private getConvertMethod(mimeType: MTMimeType) {\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\n if(mimeType === 'application/x-tgwallpattern') {\n process = this.uncompressTGV;\n mimeType = 'image/svg+xml';\n } else if(mimeType === 'image/webp' && !getEnvironment().IS_WEBP_SUPPORTED) {\n process = this.convertWebp;\n mimeType = 'image/png';\n } else if(mimeType === 'application/x-tgsticker') {\n process = this.uncompressTGS;\n mimeType = 'application/json';\n } else if(mimeType === 'audio/ogg' && !getEnvironment().IS_OPUS_SUPPORTED) {\n process = this.convertOpus;\n mimeType = 'audio/wav';\n }\n\n return {mimeType, process};\n }\n\n private allocateDeferredPromises(startOffset: number, size: number, limitPart: number) {\n const delayed: Delayed[] = [];\n let offset = startOffset;\n let writePromise: CancellablePromise = Promise.resolve(),\n writeDeferred: CancellablePromise;\n do {\n writeDeferred = deferredPromise();\n delayed.push({offset, writePromise, writeDeferred});\n writePromise = writeDeferred;\n offset += limitPart;\n } while(offset < size);\n\n return delayed;\n }\n\n public download(options: DownloadOptions): DownloadPromise {\n const size = options.size ?? 0;\n const {dcId, location} = options;\n let {downloadId} = options;\n if(downloadId && !getServiceMessagePort()) {\n this.log.error('download fallback to blob', options);\n downloadId = undefined;\n }\n\n const originalMimeType = options.mimeType;\n const convertMethod = this.getConvertMethod(originalMimeType);\n const {process} = convertMethod;\n options.mimeType = convertMethod.mimeType || 'image/jpeg';\n\n const fileName = getDownloadFileNameFromOptions(options);\n const cacheFileName = downloadId ? getDownloadFileNameFromOptions({...copy(options), downloadId: undefined}) : fileName;\n const cacheStorage: FileStorage = this.getFileStorage();\n const downloadStorage: FileStorage = downloadId ? this.downloadStorage : undefined;\n let deferred: DownloadPromise = downloadId ? undefined : this.downloadPromises[fileName];\n\n this.debug && this.log('downloadFile', fileName, options);\n\n if(deferred) {\n return deferred;\n }\n\n // if(deferred) {\n // if(size) {\n // return deferred.then(async(blob) => {\n // if(blob instanceof Blob && blob.size < size) {\n // this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\n\n // try {\n // await this.delete(fileName);\n // } finally {\n // return this.download(options);\n // }\n // } else {\n // return blob;\n // }\n // });\n // } else {\n // return deferred;\n // }\n // }\n\n const errorHandler = (item: typeof cachePrepared, error: ApiError) => {\n if(item?.error) {\n return;\n }\n\n for(const p of prepared) {\n if(item && item !== p) {\n continue;\n }\n\n p.error = error;\n p.deferred.reject(error);\n }\n };\n\n const id = this.tempId++;\n const limitPart = options.limitPart || this.getLimitPart(size, false);\n\n let getFile: FileStorage['getFile'] = cacheStorage.getFile.bind(cacheStorage);\n\n let cachePrepared: ReturnType & {writer?: StreamWriter, error?: ApiError},\n downloadPrepared: typeof cachePrepared;\n const prepared: (typeof cachePrepared)[] = [];\n const possibleSize = size || limitPart;\n\n const getErrorsCount = () => prepared.reduce((acc, item) => acc + +!!item.error, 0);\n\n const attach = (item: typeof cachePrepared, fileName: string) => {\n const {deferred} = item;\n const _errorHandler = errorHandler.bind(null, item);\n\n deferred.cancel = () => deferred.reject(makeError('DOWNLOAD_CANCELED'));\n deferred.catch((error) => {\n _errorHandler(error);\n item.writer?.truncate?.();\n }).finally(() => {\n if(this.downloadPromises[fileName] === deferred) {\n delete this.downloadPromises[fileName];\n }\n\n delete item.writer;\n // indexOfAndSplice(prepared, item);\n });\n\n this.downloadPromises[fileName] = deferred;\n\n prepared.push(item);\n };\n\n if(cacheStorage && (!downloadStorage || possibleSize <= MAX_FILE_SAVE_SIZE)) {\n cachePrepared = cacheStorage.prepareWriting(cacheFileName, possibleSize, options.mimeType)\n attach(cachePrepared, cacheFileName);\n }\n\n if(downloadStorage) {\n let downloadFileName = options.fileName; // it's doc file_name\n if(!downloadFileName) {\n downloadFileName = cacheFileName;\n const ext = MIME_TYPE_EXTENSION_MAP[options.mimeType];\n if(ext) {\n downloadFileName += '.' + ext;\n }\n }\n\n downloadPrepared = downloadStorage.prepareWriting({\n fileName: downloadFileName,\n downloadId,\n size: possibleSize\n });\n attach(downloadPrepared, fileName);\n\n if(cachePrepared) { // cancel cache too\n downloadPrepared.deferred.catch((err) => cachePrepared.deferred.reject(err));\n }\n\n // this.downloadToDiscPromises[cacheFileName] = deferred;\n // deferred.catch(noop).finally(() => {\n // if(this.downloadToDiscPromises[cacheFileName] === deferred) {\n // delete this.downloadToDiscPromises[cacheFileName];\n // }\n // });\n }\n\n deferred = downloadPrepared?.deferred ?? cachePrepared.deferred;\n\n if(downloadStorage && process) { // then have to load file again\n getFile = downloadStorage.getFile.bind(downloadStorage);\n }\n\n getFile(cacheFileName).then(async(blob: Blob) => {\n checkCancel();\n\n // if(blob.size < size) {\n // if(!options.onlyCache) {\n // await this.delete(cacheFileName);\n // checkCancel();\n // }\n\n // throw makeError('NO_ENTRY_FOUND');\n // }\n\n if(downloadPrepared) {\n const writer = downloadPrepared.writer = downloadPrepared.getWriter();\n checkCancel();\n\n const arr = await readBlobAsUint8Array(blob);\n checkCancel();\n await writer.write(arr);\n checkCancel();\n\n downloadPrepared.deferred.resolve(await writer.finalize());\n }\n\n if(cachePrepared) {\n cachePrepared.deferred.resolve(blob);\n }\n }).catch(async(err: ApiError) => {\n if(options.onlyCache) {\n errorHandler(null, err);\n return;\n }\n\n prepared.forEach((p) => {\n p.writer = p.getWriter();\n });\n\n const maxRequests = Infinity;\n\n const isWebFile = location._ === 'inputWebFileLocation';\n const requestPart = (isWebFile ? this.requestWebFilePart : this.requestFilePart).bind(this);\n\n if(isWebFile && this.webFileDcId === undefined) {\n await this.apiManager.getConfig();\n checkCancel();\n }\n\n const delayed = this.allocateDeferredPromises(0, size, limitPart);\n\n const progress: Progress = {done: 0, offset: 0, total: size, fileName};\n const dispatchProgress = () => {\n try {\n checkCancel();\n progress.done = done;\n this.rootScope.dispatchEvent('download_progress', progress);\n } catch(err) {}\n };\n\n const throttledDispatchProgress = throttle(dispatchProgress, 50, true);\n\n let done = 0;\n const superpuper = async() => {\n const {offset, writePromise, writeDeferred} = delayed.shift();\n try {\n checkCancel();\n\n const requestPerf = performance.now();\n const result = await requestPart(dcId, location as any, offset, limitPart, id, options.queueId, checkCancel);\n const requestTime = performance.now() - requestPerf;\n\n const bytes = result.bytes;\n\n if(delayed.length) {\n superpuper();\n }\n\n const byteLength = bytes.byteLength;\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\n const isFinal = (offset + limitPart) >= size || !byteLength;\n if(byteLength) {\n done += byteLength;\n\n if(isFinal) {\n dispatchProgress();\n } else {\n throttledDispatchProgress();\n }\n\n const writeQueuePerf = performance.now();\n await writePromise;\n checkCancel();\n const writeQueueTime = performance.now() - writeQueuePerf;\n\n const perf = performance.now();\n await Promise.all(prepared.map(({writer}) => writer?.write(bytes, offset)));\n checkCancel();\n // downloadId && this.log('write time', performance.now() - perf, 'request time', requestTime, 'queue time', writeQueueTime);\n }\n\n if(isFinal) {\n if(!size || done < size) {\n prepared.forEach(({writer}) => writer?.trim?.(done));\n }\n }\n\n if(isFinal && process) {\n const promises = prepared\n .filter(({writer}) => writer?.getParts && writer.replaceParts)\n .map(async({writer}) => {\n const bytes = writer.getParts();\n const processedResult = await process(bytes, cacheFileName);\n writer.replaceParts(processedResult);\n });\n\n await Promise.all(promises);\n checkCancel();\n }\n\n writeDeferred.resolve();\n\n if(isFinal) {\n const saveToStorage = done <= MAX_FILE_SAVE_SIZE;\n prepared.forEach((item) => {\n const {deferred, writer} = item;\n if(deferred.isFulfilled || deferred.isRejected || !writer) {\n return;\n }\n\n const result = writer.finalize(saveToStorage);\n deferred.resolve(result);\n });\n }\n } catch(err) {\n errorHandler(null, err as ApiError);\n }\n };\n\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\n superpuper();\n }\n }).catch(noop);\n\n const checkCancel = () => {\n if(getErrorsCount() === prepared.length) {\n throw prepared[0].error;\n }\n };\n\n return deferred;\n }\n\n public downloadMedia(options: DownloadMediaOptions): DownloadPromise {\n let {media, thumb} = options;\n const isPhoto = media._ === 'photo';\n if(isPhoto && !thumb) {\n return Promise.reject('preloadPhoto photoEmpty!');\n }\n\n // get original instance with correct file_reference instead of using copies\n const isDocument = media._ === 'document';\n // const isWebDocument = media._ === 'webDocument';\n if(isDocument) media = this.appDocsManager.getDoc((media as Document.document).id);\n else if(isPhoto) media = this.appPhotosManager.getPhoto((media as Photo.photo).id);\n\n const {fileName, downloadOptions} = getDownloadMediaDetails(options);\n\n let promise = this.getDownload(fileName);\n if(!promise) {\n promise = this.download(downloadOptions);\n\n if(isDocument && !thumb) {\n this.rootScope.dispatchEvent('document_downloading', (media as Document.document).id);\n promise.catch(noop).finally(() => {\n this.rootScope.dispatchEvent('document_downloaded', (media as Document.document).id);\n });\n }\n }\n\n return promise;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): Promise {\n const {media, thumb} = options;\n\n let cacheContext = this.thumbsStorage.getCacheContext(media as any, thumb?.type);\n if((thumb ? (cacheContext.downloaded >= ('size' in thumb ? thumb.size : 0)) : true) && cacheContext.url) {\n return Promise.resolve(cacheContext.url);\n }\n\n return this.downloadMedia(options).then((blob) => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext = this.thumbsStorage.setCacheContextURL(media as any, cacheContext.type, url, blob.size);\n }\n\n return cacheContext.url;\n });\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions) {\n return this.downloadMedia(options).then(noop);\n }\n\n private delete(fileName: string) {\n delete this.downloadPromises[fileName];\n return this.getFileStorage().delete(fileName);\n }\n\n public upload({file, fileName}: {file: Blob | File, fileName?: string}) {\n fileName ||= getFileNameForUpload(file);\n\n const fileSize = file.size;\n const isBigFile = fileSize >= 10485760;\n const partSize = this.getLimitPart(fileSize, true);\n const activeDelta = this.getDelta(partSize);\n const totalParts = Math.ceil(fileSize / partSize);\n const fileId = randomLong();\n const resultInputFile: InputFile = {\n _: isBigFile ? 'inputFileBig' : 'inputFile',\n id: fileId as any,\n parts: totalParts,\n name: fileName,\n md5_checksum: ''\n };\n\n const deferred = deferredPromise();\n if(totalParts > this.maxUploadParts) {\n deferred.reject(makeError('FILE_TOO_BIG'));\n return deferred;\n }\n\n let canceled = false, resolved = false;\n let errorHandler = (error: ApiError) => {\n if(error?.type !== 'UPLOAD_CANCELED') {\n this.log.error('Up Error', error);\n }\n\n deferred.reject(error);\n canceled = true;\n errorHandler = noop;\n };\n\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\n const id = this.tempId++;\n\n const self = this;\n function* generator() {\n let _part = 0, doneParts = 0;\n for(let offset = 0; offset < fileSize; offset += partSize) {\n const part = _part++; // 0, 1\n yield self.downloadRequest('upload', id, async() => {\n checkCancel();\n\n const blob = file.slice(offset, offset + partSize);\n const buffer = await readBlobAsArrayBuffer(blob);\n checkCancel();\n\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\n\n return self.apiManager.invokeApi(method, {\n file_id: fileId,\n file_part: part,\n file_total_parts: totalParts,\n bytes: buffer\n } as any, {\n fileUpload: true\n }).then(() => {\n if(canceled) {\n return;\n }\n\n ++doneParts;\n const progress: Progress = {done: doneParts * partSize, offset, total: fileSize, fileName};\n deferred.notify(progress);\n\n if(doneParts >= totalParts) {\n deferred.resolve(resultInputFile);\n resolved = true;\n }\n }, errorHandler);\n }, activeDelta).catch(errorHandler);\n }\n }\n\n const it = generator();\n const process = () => {\n if(canceled) return;\n const r = it.next();\n if(r.done || canceled) return;\n (r.value as Promise).then(process);\n };\n\n const maxRequests = Infinity;\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\n process();\n }\n\n const checkCancel = () => {\n if(canceled) {\n throw makeError('UPLOAD_CANCELED');\n }\n };\n\n deferred.cancel = () => {\n if(!canceled && !resolved) {\n canceled = true;\n errorHandler(makeError('UPLOAD_CANCELED'));\n }\n };\n\n deferred.notify = (progress: Progress) => {\n this.rootScope.dispatchEvent('download_progress', progress);\n };\n\n deferred.finally(() => {\n if(this.uploadPromises[fileName] === deferred) {\n delete this.uploadPromises[fileName];\n }\n });\n\n return this.uploadPromises[fileName] = deferred;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function fixFirefoxSvg(text: string) {\n const svgIndex = text.indexOf('/, ` width=\"${width}\" height=\"${height}\">`).replace(/[^\\x00-\\x7F]/g, '');\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../../environment/ctx';\nimport callbackify from '../../helpers/callbackify';\nimport {ignoreRestrictionReasons} from '../../helpers/restrictions';\nimport {Config, MethodDeclMap, User} from '../../layer';\nimport {InvokeApiOptions} from '../../types';\nimport {AppManager} from '../appManagers/manager';\nimport {MTAppConfig} from './appConfig';\nimport {UserAuth} from './mtproto_config';\nimport {MTMessage} from './networker';\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport type ApiLimitType = 'pin' | 'folderPin' | 'folders' |\n 'favedStickers' | 'reactions' | 'bio' | 'topicPin';\n\nexport default abstract class ApiManagerMethods extends AppManager {\n private afterMessageIdTemp: number;\n private hashes: {[method: string]: HashOptions} = {};\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n protected config: Config;\n protected appConfig: MTAppConfig;\n\n constructor() {\n super();\n this.afterMessageIdTemp = 0;\n }\n\n abstract setUserAuth(userAuth: UserAuth | UserId): Promise;\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n abstract invokeApi(method: T, params?: MethodDeclMap[T]['req'], options?: InvokeApiOptions): Promise;\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n\n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n // console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(o: {\n method: T,\n processResult?: (response: MethodDeclMap[T]['res']) => R,\n processError?: (error: ApiError) => any,\n params?: Omit,\n options?: InvokeApiOptions & {cacheKey?: string},\n overwrite?: boolean\n }) {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n // console.log('will invokeApi:', method, params, options);\n\n const {params, options, method, overwrite} = 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 if(overwrite) {\n delete this.hashes[method][queryJSON];\n cached = undefined;\n } else {\n (params as any).hash = cached.hash;\n }\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 cached = this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n const newResult = o.processResult(result);\n return cached ? cached.result = newResult : newResult;\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, overwrite?: boolean}\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 getNewPromise = () => {\n const promise = map.get(cacheKey);\n return promise === p ? undefined : promise;\n }\n\n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise> = originalPromise.then((result) => {\n return getNewPromise() || processResult(result);\n }, (error) => {\n const promise = getNewPromise();\n if(promise) {\n return promise;\n }\n\n if(!processError) {\n throw error;\n }\n\n return processError(error);\n });\n\n const p = newPromise.finally(() => {\n if(map.get(cacheKey) !== p) {\n return;\n }\n\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = ctx.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n\n delete cache[queryJSON];\n }\n } catch(err) {\n // this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n public getConfig(overwrite?: boolean) {\n if(this.config && !overwrite) {\n return this.config;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getConfig',\n params: {},\n processResult: (config) => {\n this.config = config;\n this.rootScope.dispatchEvent('config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(this.appConfig && !overwrite) {\n return this.appConfig;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getAppConfig',\n params: {},\n processResult: (config: MTAppConfig) => {\n this.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n this.rootScope.dispatchEvent('app_config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getLimit(type: ApiLimitType, isPremium?: boolean) {\n return callbackify(this.getAppConfig(), (appConfig) => {\n const map: {[type in ApiLimitType]: [keyof MTAppConfig, keyof MTAppConfig] | keyof MTAppConfig} = {\n pin: ['dialogs_pinned_limit_default', 'dialogs_pinned_limit_premium'],\n folderPin: ['dialogs_folder_pinned_limit_default', 'dialogs_folder_pinned_limit_premium'],\n folders: ['dialog_filters_limit_default', 'dialog_filters_limit_premium'],\n favedStickers: ['stickers_faved_limit_default', 'stickers_faved_limit_premium'],\n reactions: ['reactions_user_max_default', 'reactions_user_max_premium'],\n bio: ['about_length_limit_default', 'about_length_limit_premium'],\n topicPin: 'topics_pinned_limit'\n };\n\n isPremium ??= this.rootScope.premium;\n\n const a = map[type];\n const key = Array.isArray(a) ? a[isPremium ? 1 : 0] : a;\n return appConfig[key] as number;\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\n \nimport transportController from './transports/controller';\nimport MTTransport from './transports/transport';\n \n\nimport type {UserAuth} from './mtproto_config';\nimport type {DcAuthKey, DcId, DcServerSalt, InvokeApiOptions} from '../../types';\nimport type {MethodDeclMap} from '../../layer';\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport sessionStorage from '../sessionStorage';\nimport MTPNetworker, {MTMessage} from './networker';\nimport {ConnectionType, constructTelegramWebSocketUrl, DcConfigurator, TransportType} from './dcConfigurator';\nimport {logger} from '../logger';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IDB} from '../files/idb';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport ctx from '../../environment/ctx';\nimport noop from '../../helpers/noop';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport pause from '../../helpers/schedulers/pause';\nimport ApiManagerMethods from './api_methods';\nimport {getEnvironment} from '../../environment/utils';\nimport toggleStorages from '../../helpers/toggleStorages';\n\n/* class RotatableArray {\n public array: Array = [];\n private lastIndex = -1;\n\n public get() {\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\n return this.array[this.lastIndex];\n }\n} */\n\nconst PREMIUM_FILE_NETWORKERS_COUNT = 6;\nconst REGULAR_FILE_NETWORKERS_COUNT = 3;\n\nexport class ApiManager extends ApiManagerMethods {\n private cachedNetworkers: {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTPNetworker[]\n }\n }\n };\n\n private cachedExportPromise: {[x: number]: Promise};\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\n private baseDcId: DcId;\n\n // public telegramMeNotified = false;\n\n private log: ReturnType;\n\n private afterMessageTempIds: {\n [tempId: string]: {\n messageId: string,\n promise: Promise\n }\n };\n\n private transportType: TransportType;\n\n private updatesProcessor: (obj: any) => void;\n\n private loggingOut: boolean;\n\n constructor() {\n super();\n this.log = logger('API');\n\n this.cachedNetworkers = {} as any;\n this.cachedExportPromise = {};\n this.gettingNetworkers = {};\n this.baseDcId = 0;\n this.afterMessageTempIds = {};\n\n this.transportType = Modes.transport;\n\n \n transportController.addEventListener('transport', (transportType) => {\n this.changeTransportType(transportType);\n });\n \n }\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateConfig: () => {\n this.getConfig(true);\n this.getAppConfig(true);\n }\n });\n\n this.rootScope.addEventListener('user_auth', () => {\n if(this.config) { // refresh configs if had a config during authorization\n this.apiUpdatesManager.processLocalUpdate({_: 'updateConfig'});\n }\n });\n\n this.rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.iterateNetworkers(({networker, connectionType, dcId, transportType}) => {\n if(connectionType === 'client' || transportType !== 'websocket') {\n return;\n }\n\n const transport = networker.transport;\n if(!transport) {\n this.log.error('wow what, no transport?', networker);\n return;\n }\n\n if((transport as TcpObfuscated).connection) {\n const url = constructTelegramWebSocketUrl(dcId, connectionType, isPremium);\n (transport as TcpObfuscated).changeUrl(url);\n }\n });\n });\n }\n\n // private lol = false;\n\n // constructor() {\n // MtpSingleInstanceService.start();\n\n /* AppStorage.get('dc').then((dcId) => {\n if(dcId) {\n this.baseDcId = dcId;\n }\n }); */\n // }\n\n /* public telegramMeNotify(newValue: boolean) {\n if(this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n } */\n\n private getTransportType(connectionType: ConnectionType) {\n \n \n \n \n \n // @ts-ignore\n const transportType: TransportType = this.transportType;\n \n\n return transportType;\n }\n\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\n for(const transportType in this.cachedNetworkers) {\n const connections = this.cachedNetworkers[transportType as TransportType];\n for(const connectionType in connections) {\n const dcs = connections[connectionType as ConnectionType];\n for(const dcId in dcs) {\n const networkers = dcs[dcId as any as DcId];\n networkers.forEach((networker, idx, arr) => {\n callback({\n networker,\n dcId: +dcId as DcId,\n connectionType: connectionType as ConnectionType,\n transportType: transportType as TransportType,\n index: idx,\n array: arr\n });\n });\n }\n }\n }\n }\n\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\n return this.dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client', this.rootScope.premium);\n }\n\n public changeTransportType(transportType: TransportType) {\n const oldTransportType = this.transportType;\n if(oldTransportType === transportType) {\n return;\n }\n\n this.log('changing transport from', oldTransportType, 'to', transportType);\n\n const oldObject = this.cachedNetworkers[oldTransportType];\n const newObject = this.cachedNetworkers[transportType];\n this.cachedNetworkers[transportType] = oldObject;\n this.cachedNetworkers[oldTransportType] = newObject;\n\n this.transportType = transportType;\n\n for(const oldGetKey in this.gettingNetworkers) {\n const promise = this.gettingNetworkers[oldGetKey];\n delete this.gettingNetworkers[oldGetKey];\n\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\n this.gettingNetworkers[newGetKey] = promise;\n\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\n }\n\n this.iterateNetworkers((info) => {\n const transportType = this.getTransportType(info.connectionType);\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\n this.changeNetworkerTransport(info.networker, transport);\n });\n }\n\n public async getBaseDcId() {\n if(this.baseDcId) {\n return this.baseDcId;\n }\n\n const baseDcId = await sessionStorage.get('dc');\n if(!this.baseDcId) {\n if(!baseDcId) {\n this.setBaseDcId(App.baseDcId);\n } else {\n this.baseDcId = baseDcId;\n }\n }\n\n return this.baseDcId;\n }\n\n public async setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n\n this.rootScope.dispatchEvent('user_auth', userAuth);\n\n if(!userAuth.dcID) {\n const baseDcId = await this.getBaseDcId();\n userAuth.dcID = baseDcId;\n }\n\n sessionStorage.set({\n user_auth: userAuth\n });\n\n // this.telegramMeNotify(true);\n }\n\n public setBaseDcId(dcId: DcId) {\n const wasDcId = this.baseDcId;\n if(wasDcId) { // if migrated set ondrain\n this.getNetworker(wasDcId).then((networker) => {\n this.setOnDrainIfNeeded(networker);\n });\n }\n\n this.baseDcId = dcId;\n\n sessionStorage.set({\n dc: this.baseDcId\n });\n }\n\n public async logOut() {\n if(this.loggingOut) {\n return;\n }\n\n this.loggingOut = true;\n const storageKeys: Array = [];\n\n const prefix = 'dc';\n for(let dcId = 1; dcId <= 5; dcId++) {\n storageKeys.push(prefix + dcId + '_auth_key' as any);\n }\n\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\n const storageResult = await Promise.all(storageKeys.map((key) => sessionStorage.get(key)));\n\n const logoutPromises: Promise[] = [];\n for(let i = 0; i < storageResult.length; i++) {\n if(storageResult[i]) {\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\n }\n }\n\n const clear = async() => {\n this.baseDcId = undefined;\n // this.telegramMeNotify(false);\n await toggleStorages(false, true);\n IDB.closeDatabases();\n this.rootScope.dispatchEvent('logging_out');\n };\n\n setTimeout(clear, 1e3);\n\n // return;\n\n return Promise.all(logoutPromises).catch((error) => {\n error.handled = true;\n }).finally(clear)/* .then(() => {\n location.pathname = '/';\n }) */;\n }\n\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\n return [dcId, transportType, connectionType].join('-');\n }\n\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\n // const connectionType: ConnectionType = 'client';\n\n const transportType = this.getTransportType(connectionType);\n if(!this.cachedNetworkers[transportType]) {\n this.cachedNetworkers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const cache = this.cachedNetworkers[transportType][connectionType];\n if(!(dcId in cache)) {\n cache[dcId] = [];\n }\n\n const networkers = cache[dcId];\n // @ts-ignore\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (this.rootScope.premium ? PREMIUM_FILE_NETWORKERS_COUNT : REGULAR_FILE_NETWORKERS_COUNT);\n if(networkers.length >= maxNetworkers) {\n let i = maxNetworkers - 1, found = false;\n for(; i >= 0; --i) {\n if(networkers[i].isOnline) {\n found = true;\n break;\n }\n }\n\n const networker = networkers.splice(found ? i : maxNetworkers - 1, 1)[0];\n networkers.unshift(networker);\n return Promise.resolve(networker);\n }\n\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\n if(this.gettingNetworkers[getKey]) {\n return this.gettingNetworkers[getKey];\n }\n\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\n\n let transport = this.chooseServer(dcId, connectionType, transportType);\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map((key) => sessionStorage.get(key)))\n .then(async([authKeyHex, serverSaltHex]) => {\n let networker: MTPNetworker, error: any;\n if(authKeyHex && authKeyHex.length === 512) {\n if(!serverSaltHex || serverSaltHex.length !== 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n\n const authKey = bytesFromHex(authKeyHex);\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\n const serverSalt = bytesFromHex(serverSaltHex);\n\n networker = this.networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\n } else {\n try { // if no saved state\n const auth = await this.authorizer.auth(dcId);\n\n sessionStorage.set({\n [ak]: bytesToHex(auth.authKey),\n [ss]: bytesToHex(auth.serverSalt)\n });\n\n networker = this.networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\n } catch(_error) {\n error = _error;\n }\n }\n\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\n const newTransportType = this.getTransportType(connectionType);\n if(newTransportType !== transportType) {\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\n transport.destroy();\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, transport);\n\n if(networker) {\n transport = this.chooseServer(dcId, connectionType, newTransportType);\n }\n\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\n }\n\n /* networker.onConnectionStatusChange = (online) => {\n console.log('status:', online);\n }; */\n\n delete this.gettingNetworkers[getKey];\n\n if(error) {\n this.log('get networker error', error, (error as Error).stack);\n throw error;\n }\n\n this.changeNetworkerTransport(networker, transport);\n networkers.unshift(networker);\n this.setOnDrainIfNeeded(networker);\n return networker;\n });\n }\n\n public getNetworkerVoid(dcId: DcId) {\n return this.getNetworker(dcId).then(noop, noop);\n }\n\n private changeNetworkerTransport(networker: MTPNetworker, transport?: MTTransport) {\n const oldTransport = networker.transport;\n if(oldTransport) {\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, oldTransport);\n }\n\n networker.changeTransport(transport);\n }\n\n private onNetworkerDrain(networker: MTPNetworker) {\n this.log('networker drain', networker.dcId);\n networker.onDrain = undefined;\n this.changeNetworkerTransport(networker);\n networker.destroy();\n this.networkerFactory.removeNetworker(networker);\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\n }\n\n public setOnDrainIfNeeded(networker: MTPNetworker) {\n if(networker.onDrain) {\n return;\n }\n\n const checkPromise: Promise = networker.isFileNetworker ?\n Promise.resolve(true) :\n this.getBaseDcId().then((baseDcId) => networker.dcId !== baseDcId);\n checkPromise.then((canRelease) => {\n if(networker.onDrain) {\n return;\n }\n\n if(canRelease) {\n networker.onDrain = () => this.onNetworkerDrain(networker);\n networker.setDrainTimeout();\n }\n });\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n this.networkerFactory.setUpdatesProcessor(callback);\n }\n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\n // /////this.log('Invoke api', method, params, options);\n\n /* if(!this.lol) {\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\n this.lol = true;\n } */\n\n const deferred = deferredPromise();\n\n let {afterMessageId, prepareTempMessageId} = options;\n if(prepareTempMessageId) {\n deferred.then(() => {\n delete this.afterMessageTempIds[prepareTempMessageId];\n });\n }\n\n if(MOUNT_CLASS_TO) {\n const startTime = Date.now();\n const interval = ctx.setInterval(() => {\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\n }\n // this.cachedUploadNetworkers[2].requestMessageStatus();\n }, 5e3);\n\n deferred.catch(noop).finally(() => {\n clearInterval(interval);\n });\n }\n\n const rejectPromise = async(error: ApiError) => {\n if(!error) {\n error = {type: 'ERROR_EMPTY'};\n } else if(!isObject(error)) {\n error = {message: error};\n }\n\n if((error.code === 401 && error.type === 'SESSION_REVOKED') ||\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\n this.logOut();\n }\n\n if(options.ignoreErrors) {\n throw error;\n }\n\n if(error.code === 406) {\n error.handled = true;\n }\n\n if(!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(() => {\n if(!error.handled) {\n if(error.code === 401) {\n this.logOut();\n } else {\n // ErrorService.show({error: error}); // WARNING\n }\n\n error.handled = true;\n }\n }, 100);\n }\n\n throw error;\n };\n\n let dcId: DcId;\n\n let cachedNetworker: MTPNetworker;\n const stack = (new Error()).stack || 'empty stack';\n const performRequest = (): Promise => {\n if(afterMessageId) {\n const after = this.afterMessageTempIds[afterMessageId];\n if(after) {\n options.afterMessageId = after.messageId;\n }\n }\n\n const promise = cachedNetworker.wrapApiCall(method, params, options);\n\n if(prepareTempMessageId) {\n this.afterMessageTempIds[prepareTempMessageId] = {\n messageId: (options as MTMessage).messageId,\n promise: deferred\n };\n }\n\n return promise.catch((error: ApiError) => {\n // if(!options.ignoreErrors) {\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\n }\n\n if(error.code === 401 && this.baseDcId === dcId) {\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\n sessionStorage.delete('dc')\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\n // this.telegramMeNotify(false);\n }\n\n throw error;\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\n if(this.cachedExportPromise[dcId] === undefined) {\n const promise = new Promise((exportResolve, exportReject) => {\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\n this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\n }, exportReject);\n });\n\n this.cachedExportPromise[dcId] = promise;\n }\n\n return this.cachedExportPromise[dcId].then(() => performRequest());\n } else if(error.code === 303) {\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n if(options.dcId) {\n options.dcId = newDcId;\n } else {\n this.setBaseDcId(newDcId);\n }\n\n return this.invokeApi(method, params, options);\n }\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n options.dcId = newDcId;\n return this.invokeApi(method, params, options);\n } else {\n throw error;\n }\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\n this.networkerFactory.unsetConnectionInited();\n return performRequest();\n } else if(!options.rawError && error.code === 420) {\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\n\n if(waitTime > (options.floodMaxTimeout ?? 60) && !options.prepareTempMessageId) {\n throw error;\n }\n\n return pause(waitTime/* (waitTime + 5) */ * 1000).then(() => performRequest());\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\n const after = this.afterMessageTempIds[afterMessageId];\n\n afterMessageId = undefined;\n delete options.afterMessageId;\n\n if(after) return after.promise.then(() => performRequest());\n else return performRequest();\n } else if(!options.rawError && error.code === 500) {\n const now = Date.now();\n if(options.stopTime) {\n if(now >= options.stopTime) {\n throw error;\n }\n }\n\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n return pause(options.waitTime * 1000).then(() => performRequest());\n } else if(error.type === 'UNKNOWN' || error.type === 'MTPROTO_CLUSTER_INVALID') { // cluster invalid - request from regular user to premium endpoint\n return pause(1000).then(() => performRequest());\n } else {\n throw error;\n }\n });\n }\n\n let p: Promise;\n if(dcId = (options.dcId || this.baseDcId)) {\n p = this.getNetworker(dcId, options);\n } else {\n p = this.getBaseDcId().then((baseDcId) => this.getNetworker(dcId = baseDcId, options));\n }\n\n p.then((networker) => {\n cachedNetworker = networker;\n const promise = performRequest();\n cachedNetworker.attachPromise(deferred, options as MTMessage);\n return promise;\n })\n .then(deferred.resolve)\n .catch(rejectPromise)\n .catch(deferred.reject);\n\n return deferred;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport applyMixins from '../../helpers/applyMixins';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AppManager} from '../appManagers/manager';\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\ntype PeersStorageKey = `${StatePeerType}_${string | PeerId}` | StatePeerType;\n\nclass PeersStorage {\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map> = new Map();\n\n constructor() {\n this._constructor(false);\n }\n\n protected after() {\n this.rootScope.addEventListener('user_auth', () => {\n this.requestPeer(this.appPeersManager.peerId, 'self');\n });\n }\n\n public requestPeer(peerId: PeerId, key: PeersStorageKey) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(key)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(key);\n\n this.dispatchEvent('peerNeeded', peerId);\n }\n\n public releasePeer(peerId: PeerId, key: PeersStorageKey) {\n const set = this.neededPeers.get(peerId);\n if(!set) {\n return;\n }\n\n set.delete(key);\n\n if(!set.size) {\n this.neededPeers.delete(peerId);\n this.dispatchEvent('peerUnneeded', peerId);\n }\n }\n\n public requestPeersForKey(peerIds: Set | number[], key: PeersStorageKey) {\n if(Array.isArray(peerIds)) {\n peerIds = new Set(peerIds);\n }\n\n let set = this.singlePeerMap.get(key);\n if(set) {\n for(const peerId of set) {\n if(peerIds.has(peerId)) {\n continue;\n }\n\n this.releasePeer(peerId, key);\n set.delete(peerId);\n }\n\n if(!set.size && !peerIds.size) {\n this.singlePeerMap.delete(key);\n return;\n }\n }\n\n if(peerIds.size) {\n if(!set) {\n set = new Set();\n this.singlePeerMap.set(key, set);\n }\n\n for(const peerId of peerIds) {\n if(set.has(peerId)) {\n continue;\n }\n\n this.requestPeer(peerId, key);\n set.add(peerId);\n }\n }\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n}\n\ninterface PeersStorage extends EventListenerBase<{\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void,\n}>, AppManager {}\napplyMixins(PeersStorage, [EventListenerBase, AppManager]);\n\nexport default PeersStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebDocument} from '../../layer';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport type {MyPhoto} from '../appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type ThumbCache = {\n downloaded: number,\n url: string,\n type: string\n};\n\nexport type ThumbsCache = {\n [key: string]: {\n [size: string]: ThumbCache\n }\n};\n\nconst thumbFullSize = THUMB_TYPE_FULL;\n\nexport type ThumbStorageMedia = MyPhoto | MyDocument | WebDocument;\n\nexport default class ThumbsStorage {\n private thumbsCache: ThumbsCache = {};\n\n private getKey(media: ThumbStorageMedia) {\n return media._ + ((media as MyPhoto).id ?? (media as WebDocument).url);\n }\n\n public getCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize): ThumbCache {\n /* if(media._ === 'photo' && thumbSize !== 'i') {\n thumbSize = thumbFullSize;\n } */\n\n const cache = this.thumbsCache[this.getKey(media)] ??= {};\n return cache[thumbSize] ??= {downloaded: 0, url: '', type: thumbSize};\n }\n\n public setCacheContextURL(media: ThumbStorageMedia, thumbSize: string = thumbFullSize, url: string, downloaded: number = 0) {\n const cacheContext = this.getCacheContext(media, thumbSize);\n cacheContext.url = url;\n cacheContext.downloaded = downloaded;\n return cacheContext;\n }\n\n public deleteCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize) {\n const cache = this.thumbsCache[this.getKey(media)];\n if(cache) {\n delete cache[thumbSize];\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 type MTProtoConstructor = {\n id: number,\n predicate: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\nexport type MTProtoMethod = {\n id: number,\n method: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.2?true\"},{\"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\":\"spoiler\",\"type\":\"flags.1?true\"},{\"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\":\"personal\",\"type\":\"flags.2?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\":-908914376,\"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?ChatReactions\"}],\"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\":\"spoiler\",\"type\":\"flags.3?true\"},{\"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\":-712374074,\"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\"},{\"name\":\"ttl_period\",\"type\":\"flags.5?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\":-120378643,\"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\":\"voice_messages_forbidden\",\"type\":\"flags.20?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"personal_photo\",\"type\":\"flags.21?Photo\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"fallback_photo\",\"type\":\"flags.22?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\"},{\"name\":\"premium_gifts\",\"type\":\"flags.19?Vector\"}],\"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\":-1484486364,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"usernames\",\"type\":\"Vector\"}],\"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\":\"this_port_only\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":589653676,\"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\":\"force_try_ipv6\",\"type\":\"flags.14?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\"},{\"name\":\"reactions_default\",\"type\":\"flags.15?Reaction\"}],\"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\":-1476358952,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"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\":\"spoiler\",\"type\":\"flags.5?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\":\"spoiler\",\"type\":\"flags.2?true\"},{\"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\":\"nopremium\",\"type\":\"flags.3?true\"},{\"name\":\"spoiler\",\"type\":\"flags.4?true\"},{\"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\":-1881881384,\"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\":\"long\"},{\"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\":-1787080453,\"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\"},{\"name\":\"login_email_pattern\",\"type\":\"flags.6?string\"}],\"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\":768691932,\"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\":\"emojis\",\"type\":\"flags.7?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\":\"thumb_document_id\",\"type\":\"flags.8?long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":1846886166,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1885878744,\"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\":\"premium\",\"type\":\"flags.28?true\"},{\"name\":\"attach_menu_enabled\",\"type\":\"flags.29?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"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\"},{\"name\":\"emoji_status\",\"type\":\"flags.30?EmojiStatus\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":-1892676777,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"flags.0?long\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"description_photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"description_document\",\"type\":\"flags.5?Document\"},{\"name\":\"commands\",\"type\":\"flags.2?Vector\"},{\"name\":\"menu_button\",\"type\":\"flags.3?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\":\"persistent\",\"type\":\"flags.4?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\":-2094689180,\"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\":\"forum\",\"type\":\"flags.30?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"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\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"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\":-231385849,\"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\":\"antispam\",\"type\":\"flags2.1?true\"},{\"name\":\"participants_hidden\",\"type\":\"flags2.2?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?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":-948520370,\"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\":\"topics\",\"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\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":834816008,\"predicate\":\"updateStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"}],\"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\":457829485,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"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\":-1103615738,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium\",\"type\":\"flags.0?true\"},{\"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\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"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\":1048946971,\"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\":\"recurring\",\"type\":\"flags.9?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\"},{\"name\":\"recurring_terms_url\",\"type\":\"flags.9?string\"}],\"type\":\"Invoice\"},{\"id\":-1900697899,\"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\"},{\"name\":\"extended_media\",\"type\":\"flags.2?InputMedia\"}],\"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\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"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\":-156940077,\"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\"},{\"name\":\"extended_media\",\"type\":\"flags.4?MessageExtendedMedia\"}],\"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\":-1776926890,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"invoice_slug\",\"type\":\"flags.0?string\"}],\"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\":-1610250415,\"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\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.5?WebDocument\"},{\"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\":\"additional_methods\",\"type\":\"flags.6?Vector\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?Vector\"},{\"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\":-1665063993,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tcp\",\"type\":\"flags.0?true\"},{\"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\"},{\"name\":\"forums\",\"type\":\"flags.17?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\":-366410403,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"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\":-207944868,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"long\"},{\"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\":2097791614,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"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\"},{\"name\":\"manage_topics\",\"type\":\"flags.13?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\":\"manage_topics\",\"type\":\"flags.18?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\":-1896171181,\"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\":\"long\"},{\"name\":\"file_size_max\",\"type\":\"long\"},{\"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\":\"forum_topic\",\"type\":\"flags.3?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\":1007897979,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"auto_setting_from\",\"type\":\"flags.0?long\"}],\"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\":\"recommended\",\"type\":\"flags.5?true\"},{\"name\":\"show_peer_photo\",\"type\":\"flags.6?true\"},{\"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\":-907141753,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"posts_between\",\"type\":\"flags.0?int\"},{\"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\":-191450938,\"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\":1578843320,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1546531968,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen_order\",\"type\":\"flags.0?int\"},{\"name\":\"reaction\",\"type\":\"Reaction\"},{\"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\":\"premium\",\"type\":\"flags.2?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\":-1102180616,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChatReactions\"},{\"name\":\"new_value\",\"type\":\"ChatReactions\"}],\"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\":-1319698788,\"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\":\"Reaction\"}],\"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\":-928371502,\"predicate\":\"attachMenuBot\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"has_settings\",\"type\":\"flags.1?true\"},{\"name\":\"request_write_access\",\"type\":\"flags.2?true\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"peer_types\",\"type\":\"Vector\"},{\"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\"},{\"id\":2104224014,\"predicate\":\"attachMenuPeerTypeSameBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-1020528102,\"predicate\":\"attachMenuPeerTypeBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-247016673,\"predicate\":\"attachMenuPeerTypePM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":84480319,\"predicate\":\"attachMenuPeerTypeChat\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":2080104188,\"predicate\":\"attachMenuPeerTypeBroadcast\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-317687113,\"predicate\":\"chatInvitePublicJoinRequests\",\"params\":[],\"type\":\"ExportedChatInvite\"},{\"id\":-977967015,\"predicate\":\"inputInvoiceMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"InputInvoice\"},{\"id\":-1020867857,\"predicate\":\"inputInvoiceSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputInvoice\"},{\"id\":-1362048039,\"predicate\":\"payments.exportedInvoice\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":8703322,\"predicate\":\"updateTranscribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1821037486,\"predicate\":\"messages.transcribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":909284270,\"predicate\":\"dialogFilterDefault\",\"params\":[],\"type\":\"DialogFilter\"},{\"id\":1395946908,\"predicate\":\"help.premiumPromo\",\"params\":[{\"name\":\"status_text\",\"type\":\"string\"},{\"name\":\"status_entities\",\"type\":\"Vector\"},{\"name\":\"video_sections\",\"type\":\"Vector\"},{\"name\":\"videos\",\"type\":\"Vector\"},{\"name\":\"period_options\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.PremiumPromo\"},{\"id\":-925956616,\"predicate\":\"messageEntityCustomEmoji\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":-48981863,\"predicate\":\"documentAttributeCustomEmoji\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"free\",\"type\":\"flags.0?true\"},{\"name\":\"text_color\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"DocumentAttribute\"},{\"id\":1087454222,\"predicate\":\"stickerSetFullCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1502273946,\"predicate\":\"inputStorePaymentPremiumSubscription\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"restore\",\"type\":\"flags.0?true\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":1634697192,\"predicate\":\"inputStorePaymentGiftPremium\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":-1415514682,\"predicate\":\"messageActionGiftPremium\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"months\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1958953753,\"predicate\":\"premiumGiftOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumGiftOption\"},{\"id\":-930399486,\"predicate\":\"inputStickerSetPremiumGifts\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-78886548,\"predicate\":\"updateReadFeaturedEmojiStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1360618136,\"predicate\":\"inputPrivacyKeyVoiceMessages\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":110621716,\"predicate\":\"privacyKeyVoiceMessages\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1996951013,\"predicate\":\"paymentFormMethod\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentFormMethod\"},{\"id\":-193992412,\"predicate\":\"inputWebFileAudioAlbumThumbLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"small\",\"type\":\"flags.2?true\"},{\"name\":\"document\",\"type\":\"flags.0?InputDocument\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"}],\"type\":\"InputWebFileLocation\"},{\"id\":769727150,\"predicate\":\"emojiStatusEmpty\",\"params\":[],\"type\":\"EmojiStatus\"},{\"id\":-1835310691,\"predicate\":\"emojiStatus\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"EmojiStatus\"},{\"id\":-97474361,\"predicate\":\"emojiStatusUntil\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"until\",\"type\":\"int\"}],\"type\":\"EmojiStatus\"},{\"id\":674706841,\"predicate\":\"updateUserEmojiStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Update\"},{\"id\":821314523,\"predicate\":\"updateRecentEmojiStatuses\",\"params\":[],\"type\":\"Update\"},{\"id\":-796072379,\"predicate\":\"account.emojiStatusesNotModified\",\"params\":[],\"type\":\"account.EmojiStatuses\"},{\"id\":-1866176559,\"predicate\":\"account.emojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"statuses\",\"type\":\"Vector\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":2046153753,\"predicate\":\"reactionEmpty\",\"params\":[],\"type\":\"Reaction\"},{\"id\":455247544,\"predicate\":\"reactionEmoji\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Reaction\"},{\"id\":-1992950669,\"predicate\":\"reactionCustomEmoji\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Reaction\"},{\"id\":-352570692,\"predicate\":\"chatReactionsNone\",\"params\":[],\"type\":\"ChatReactions\"},{\"id\":1385335754,\"predicate\":\"chatReactionsAll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_custom\",\"type\":\"flags.0?true\"}],\"type\":\"ChatReactions\"},{\"id\":1713193015,\"predicate\":\"chatReactionsSome\",\"params\":[{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"ChatReactions\"},{\"id\":-1334846497,\"predicate\":\"messages.reactionsNotModified\",\"params\":[],\"type\":\"messages.Reactions\"},{\"id\":-352454890,\"predicate\":\"messages.reactions\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.Reactions\"},{\"id\":1870160884,\"predicate\":\"updateRecentReactions\",\"params\":[],\"type\":\"Update\"},{\"id\":-2030252155,\"predicate\":\"updateMoveStickerSetToTop\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"stickerset\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1511364673,\"predicate\":\"auth.sentCodeTypeEmailCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"},{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"next_phone_login_date\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1521934870,\"predicate\":\"auth.sentCodeTypeSetUpEmailRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1128644211,\"predicate\":\"emailVerifyPurposeLoginSetup\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"EmailVerifyPurpose\"},{\"id\":1383932651,\"predicate\":\"emailVerifyPurposeLoginChange\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1141565819,\"predicate\":\"emailVerifyPurposePassport\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1842457175,\"predicate\":\"emailVerificationCode\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-611279166,\"predicate\":\"emailVerificationGoogle\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-1764723459,\"predicate\":\"emailVerificationApple\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":731303195,\"predicate\":\"account.emailVerified\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.EmailVerified\"},{\"id\":-507835039,\"predicate\":\"account.emailVerifiedLogin\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"sent_code\",\"type\":\"auth.SentCode\"}],\"type\":\"account.EmailVerified\"},{\"id\":-1225711938,\"predicate\":\"premiumSubscriptionOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.1?true\"},{\"name\":\"can_purchase_upgrade\",\"type\":\"flags.2?true\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumSubscriptionOption\"},{\"id\":80008398,\"predicate\":\"inputStickerSetEmojiGenericAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":701560302,\"predicate\":\"inputStickerSetEmojiDefaultStatuses\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1206095820,\"predicate\":\"sendAsPeer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium_required\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"SendAsPeer\"},{\"id\":-1386050360,\"predicate\":\"messageExtendedMediaPreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"w\",\"type\":\"flags.0?int\"},{\"name\":\"h\",\"type\":\"flags.0?int\"},{\"name\":\"thumb\",\"type\":\"flags.1?PhotoSize\"},{\"name\":\"video_duration\",\"type\":\"flags.2?int\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":-297296796,\"predicate\":\"messageExtendedMedia\",\"params\":[{\"name\":\"media\",\"type\":\"MessageMedia\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":1517529484,\"predicate\":\"updateMessageExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"extended_media\",\"type\":\"MessageExtendedMedia\"}],\"type\":\"Update\"},{\"id\":-50416996,\"predicate\":\"stickerKeyword\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"keyword\",\"type\":\"Vector\"}],\"type\":\"StickerKeyword\"},{\"id\":-1274595769,\"predicate\":\"username\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"editable\",\"type\":\"flags.0?true\"},{\"name\":\"active\",\"type\":\"flags.1?true\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Username\"},{\"id\":-263212119,\"predicate\":\"channelAdminLogEventActionChangeUsernames\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":46949251,\"predicate\":\"channelAdminLogEventActionToggleForum\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1483767080,\"predicate\":\"channelAdminLogEventActionCreateTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-261103096,\"predicate\":\"channelAdminLogEventActionEditTopic\",\"params\":[{\"name\":\"prev_topic\",\"type\":\"ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1374254839,\"predicate\":\"channelAdminLogEventActionDeleteTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1569535291,\"predicate\":\"channelAdminLogEventActionPinTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"prev_topic\",\"type\":\"flags.0?ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"flags.1?ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":37687451,\"predicate\":\"forumTopicDeleted\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ForumTopic\"},{\"id\":1903173033,\"predicate\":\"forumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"my\",\"type\":\"flags.1?true\"},{\"name\":\"closed\",\"type\":\"flags.2?true\"},{\"name\":\"pinned\",\"type\":\"flags.3?true\"},{\"name\":\"short\",\"type\":\"flags.5?true\"},{\"name\":\"hidden\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"},{\"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\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"draft\",\"type\":\"flags.4?DraftMessage\"}],\"type\":\"ForumTopic\"},{\"id\":913709011,\"predicate\":\"messages.forumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"order_by_create_date\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"topics\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":228168278,\"predicate\":\"messageActionTopicCreate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"id\":-1064024032,\"predicate\":\"messageActionTopicEdit\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"MessageAction\"},{\"id\":422509539,\"predicate\":\"updateChannelPinnedTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"topic_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1548122514,\"predicate\":\"inputNotifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"InputNotifyPeer\"},{\"id\":577659656,\"predicate\":\"notifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"NotifyPeer\"},{\"id\":1153562857,\"predicate\":\"inputStickerSetEmojiDefaultTopicIcons\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":406407439,\"predicate\":\"messages.sponsoredMessagesEmpty\",\"params\":[],\"type\":\"messages.SponsoredMessages\"},{\"id\":-31881726,\"predicate\":\"updateChannelPinnedTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":1135897376,\"predicate\":\"defaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"DefaultHistoryTTL\"},{\"id\":116234636,\"predicate\":\"auth.codeTypeFragmentSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-648651719,\"predicate\":\"auth.sentCodeTypeFragmentSms\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1103040667,\"predicate\":\"exportedContactToken\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ExportedContactToken\"},{\"id\":1693675004,\"predicate\":\"channelAdminLogEventActionToggleAntiSpam\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1474192222,\"predicate\":\"messageActionSuggestProfilePhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-404267113,\"predicate\":\"messageActionAttachMenuBotAllowed\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":2008112412,\"predicate\":\"stickerSetNoCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"}],\"type\":\"StickerSetCovered\"},{\"id\":542282808,\"predicate\":\"updateUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Update\"}],\"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\":-1923962543,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"flags.0?string\"},{\"name\":\"email_verification\",\"type\":\"flags.1?EmailVerification\"}],\"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\":482476935,\"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\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?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\":1967638886,\"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\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?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\":-966673468,\"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\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"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\":3450904,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"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\":473782614,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.3?true\"},{\"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\":-1101843010,\"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\":\"long\"},{\"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\":-1564422284,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"flags.0?InputCheckPasswordSRP\"}],\"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\":-1862244601,\"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\"},{\"name\":\"ttl_period\",\"type\":\"flags.4?int\"}],\"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\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1309538785,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"long\"},{\"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\":-738468661,\"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\":\"top_msg_id\",\"type\":\"flags.9?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\":-1271718337,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.2?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\":\"emojis\",\"type\":\"flags.1?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\":924093883,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"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\":-1228345045,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":755192367,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"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\":962554330,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"},{\"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\":-1847836879,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"}],\"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\":-251140208,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?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\"}],\"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\":921026381,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"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\":-1225713124,\"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\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?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\":-1856595926,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"}],\"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\":-1730136133,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":53322959,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"verification\",\"type\":\"EmailVerification\"}],\"type\":\"account.EmailVerified\"},{\"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\":-1896617296,\"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?long\"}],\"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\":11435201,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"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\":978872812,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"}],\"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\":-299714136,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"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\":-754091820,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"add_to_recent\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Vector\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1176190792,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Reaction\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-21928079,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"ChatReactions\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":1330094102,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"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\":841173339,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?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\"}],\"type\":\"messages.Messages\"},{\"id\":1420459918,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"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\":1777704297,\"method\":\"messages.toggleBotInAttachMenu\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":395003915,\"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\":\"platform\",\"type\":\"string\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"WebViewResult\"},{\"id\":2146648841,\"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\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Bool\"},{\"id\":698084494,\"method\":\"messages.requestSimpleWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"}],\"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\"},{\"id\":1092913030,\"method\":\"phone.saveCallLog\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"Bool\"},{\"id\":-456419968,\"method\":\"channels.toggleJoinToSend\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1277789622,\"method\":\"channels.toggleJoinRequest\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":261206117,\"method\":\"payments.exportInvoice\",\"params\":[{\"name\":\"invoice_media\",\"type\":\"InputMedia\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":647928393,\"method\":\"messages.transcribeAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":2132608815,\"method\":\"messages.rateTranscribedAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"good\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-2131921795,\"method\":\"payments.assignAppStoreTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"bytes\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-537046829,\"method\":\"payments.assignPlayMarketTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"DataJSON\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-1614700874,\"method\":\"payments.canPurchasePremium\",\"params\":[{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Bool\"},{\"id\":-1206152236,\"method\":\"help.getPremiumPromo\",\"params\":[],\"type\":\"help.PremiumPromo\"},{\"id\":-643100844,\"method\":\"messages.getCustomEmojiDocuments\",\"params\":[{\"name\":\"document_id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-67329649,\"method\":\"messages.getEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":248473398,\"method\":\"messages.getFeaturedEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-70001045,\"method\":\"account.updateEmojiStatus\",\"params\":[{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Bool\"},{\"id\":-696962170,\"method\":\"account.getDefaultEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":257392901,\"method\":\"account.getRecentEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":404757166,\"method\":\"account.clearRecentEmojiStatuses\",\"params\":[],\"type\":\"Bool\"},{\"id\":1063567478,\"method\":\"messages.reportReaction\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction_peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1149164102,\"method\":\"messages.getTopReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":960896434,\"method\":\"messages.getRecentReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":-1644236876,\"method\":\"messages.clearRecentReactions\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2064119788,\"method\":\"messages.getExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":767062953,\"method\":\"auth.importWebTokenAuthorization\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"web_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-279966037,\"method\":\"account.reorderUsernames\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1490465654,\"method\":\"account.toggleUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1268978403,\"method\":\"channels.reorderUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1358053637,\"method\":\"channels.toggleUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":170155475,\"method\":\"channels.deactivateAllUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":-1540781271,\"method\":\"channels.toggleForum\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-200539612,\"method\":\"channels.createForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"flags.0?int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.3?long\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"send_as\",\"type\":\"flags.2?InputPeer\"}],\"type\":\"Updates\"},{\"id\":233136337,\"method\":\"channels.getForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_topic\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-1333584199,\"method\":\"channels.getForumTopicsByID\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topics\",\"type\":\"Vector\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-186670715,\"method\":\"channels.editForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"Updates\"},{\"id\":1814925350,\"method\":\"channels.updatePinnedForumTopic\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"pinned\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":876830509,\"method\":\"channels.deleteTopicHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":693150095,\"method\":\"channels.reorderPinnedForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1760814315,\"method\":\"channels.toggleAntiSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-1471109485,\"method\":\"channels.reportAntiSpamFalsePositive\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1632299963,\"method\":\"messages.setDefaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1703637384,\"method\":\"messages.getDefaultHistoryTTL\",\"params\":[],\"type\":\"DefaultHistoryTTL\"},{\"id\":-127582169,\"method\":\"contacts.exportContactToken\",\"params\":[],\"type\":\"ExportedContactToken\"},{\"id\":318789512,\"method\":\"contacts.importContactToken\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-1189444673,\"method\":\"photos.uploadContactProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"suggest\",\"type\":\"flags.3?true\"},{\"name\":\"save\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":1785624660,\"method\":\"channels.toggleParticipantsHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"}]},\"layer\":151} as {\n MTProto: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n API: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n layer: number,\n};\n","export default function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n","import bigInt from 'big-integer';\nimport intToUint from '../number/intToUint';\n\nexport default function ulongFromInts(high: number, low: number) {\n high = intToUint(high), low = intToUint(low);\n return bigInt(high).shiftLeft(32).add(bigInt(low));\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Schema, {MTProtoConstructor} from './schema';\nimport {JSONValue} from '../../layer';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bigInt from 'big-integer';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {safeBigInt} from '../../helpers/bigInt/bigIntConstants';\nimport {bigIntToSigned, bigIntToUnsigned} from '../../helpers/bigInt/bigIntConversion';\n\nconst boolFalse = +Schema.API.constructors.find((c) => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find((c) => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find((c) => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find((c) => c.predicate === 'gzip_packed').id;\n\n// * using slice to have a new buffer, otherwise the buffer will be copied to main thread\nconst sliceMethod: 'slice' | 'subarray' = 'slice'; // subarray\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;// Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n // let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n // console.log('perf uint8', performance.now() - perf);\n\n // perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n // console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n\n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n\n resultArray.set(this.byteView.subarray(0, this.offset));\n\n return resultArray;\n }\n\n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; ++i) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n\n // console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n // const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n\n this.createBuffer();\n\n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32),\n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n\n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n\n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n\n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n\n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n\n const _bigInt = bigIntToUnsigned(bigInt(sLong as string));\n const {quotient, remainder} = _bigInt.divmod(0x100000000);\n const high = quotient.toJSNumber();\n const low = remainder.toJSNumber();\n\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\n }\n\n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n\n doubleView[0] = f;\n\n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n\n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n\n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n\n this.checkLength(sUTF8.length + 8);\n\n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; ++i) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n\n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n\n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n\n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n\n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n\n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n\n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n\n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n\n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n\n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n\n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n\n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find((m) => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n\n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n // console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n // console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n // console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n\n // console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(const paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n\n public storeObject(obj: any, type: string, field?: string) {\n // console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n\n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if(type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; ++i) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if(type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n\n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find((c) => c.predicate === predicate);\n\n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n\n if(predicate === type) {\n isBare = true;\n }\n\n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n // console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n // console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n // console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n // console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n // console.log('storeObject', param, type);\n\n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(const paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n\n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug =\n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n // buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n // console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n /* public setMtproto(mtproto: boolean) {\n this.mtproto = mtproto;\n } */\n\n private readInt(field: string) {\n // if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n\n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n\n this.debug &&/* || field.includes('[dialog][read_outbox_max_id]') */\n console.log('<<<', i.toString(16), i, field,\n this.byteView.slice(this.offset - 16, this.offset + 16),\n bytesToHex(this.byteView.slice(this.offset - 16, this.offset + 16)));\n\n this.offset += 4;\n\n return i;\n }\n\n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n\n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n\n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n\n return doubleView[0];\n }\n\n // ! it should've been signed\n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n\n let ulong = ulongFromInts(iHigh, iLow);\n if(/* !unsigned && */!this.mtproto) { // make it signed\n ulong = bigIntToSigned(ulong);\n }\n\n if(!this.mtproto) {\n if(safeBigInt.greaterOrEquals(ulong.abs())) {\n // @ts-ignore\n return ulong.toJSNumber();\n }\n }\n\n // @ts-ignore\n return ulong.toString(10);\n }\n\n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n\n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n\n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n\n let sUTF8 = '';\n for(let i = 0; i < len; ++i) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n\n // Padding\n while(this.offset % 4) {\n ++this.offset;\n }\n\n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch(e) {\n s = sUTF8;\n }\n\n this.debug && console.log('<<<', s, (field || '') + ':string');\n\n return s;\n }\n\n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n\n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n\n const bytes = this.byteView[sliceMethod](this.offset, this.offset + len);\n this.offset += len;\n\n // Padding\n while(this.offset % 4) {\n ++this.offset;\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n\n return bytes;\n }\n\n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n\n const len = bits / 8;\n if(typed) {\n const result = this.byteView[sliceMethod](this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n\n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; ++i) {\n bytes[i] = this.byteView[this.offset++];\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n\n return bytes;\n }\n\n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n\n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView[sliceMethod](this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n\n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; ++i) {\n bytes[i] = this.byteView[this.offset++];\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n\n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n\n return result;\n }\n\n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n\n field = field || type || 'Object';\n\n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n\n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find((c) => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find((c) => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n\n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n\n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n\n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; ++i) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n\n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; ++i) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n\n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n\n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n\n const predicate = constructorData.predicate;\n\n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; ++i) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = type.indexOf('?') !== -1;\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n continue;\n }\n\n type = condType[1];\n }\n\n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n\n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n result[param.name] = value;\n }\n }\n }\n\n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n\n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n\n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport {TLDeserialization, TLSerialization};\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default function addPadding(\n bytes: T,\n blockSize: number = 16,\n zeroes?: boolean,\n blockSizeAsTotalLength = false,\n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n // //console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport {NetworkerFactory} from './networkerFactory';\nimport {logger, LogTypes} from '../logger';\nimport {InvokeApiOptions} from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\nimport {nextRandomUint, randomLong} from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport bigInt from 'big-integer';\nimport {ConnectionStatus} from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\nimport randomize from '../../helpers/array/randomize';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {getEnvironment} from '../../environment/utils';\nimport {TimeManager} from './timeManager';\n\n// console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n\n notContentRelated: true, // ACK\n noSchedule: true,\n // withResult: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: CancellablePromise,\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst DRAIN_TIMEOUT = 10000;\nconst delays: {\n [k in 'client' | 'file']: {\n disconnectDelayMin: number,\n disconnectDelayMax: number,\n pingInterval: number,\n pingMaxTime: number,\n connectionTimeout: number\n }\n} = {\n client: {\n disconnectDelayMin: 7,\n disconnectDelayMax: 20,\n pingInterval: 2000,\n pingMaxTime: 5,\n connectionTimeout: 5000\n },\n file: {\n disconnectDelayMin: 10,\n disconnectDelayMax: 24,\n pingInterval: 3000,\n pingMaxTime: 7,\n connectionTimeout: 7500\n }\n};\nconst RESEND_OPTIONS: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true\n};\nlet invokeAfterMsgConstructor: number;\nlet networkerTempId = 0;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResendReq: MTLong[] = [];\n // private pendingResendAnsReq: MTLong[] = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n\n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n reqMsgId: MTLong,\n msgIds: MTPNetworker['pendingResendReq']\n };\n // private lastResendAnsReq: MTPNetworker['lastResendReq'];\n\n private name: string;\n private log: ReturnType;\n\n public isOnline = false;\n private status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n \n private pingDelayDisconnectDeferred: CancellablePromise;\n private pingPromise: Promise;\n // private pingInterval: number;\n private lastPingTime: number;\n private lastPingStartTime: number;\n private lastPingDelayDisconnectId: string;\n \n // public onConnectionStatusChange: (online: boolean) => void;\n\n // private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n private delays: typeof delays[keyof typeof delays];\n // private getNewTimeOffset: boolean;\n\n constructor(\n private networkerFactory: NetworkerFactory,\n private timeManager: TimeManager,\n public dcId: number,\n private authKey: Uint8Array,\n private authKeyId: Uint8Array,\n serverSalt: Uint8Array,\n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n this.delays = this.isFileNetworker ? delays.file : delays.client;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n // this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name + (suffix ? '' : '-C') + '-' + networkerTempId++, LogTypes.Log/* | LogTypes.Debug */ | LogTypes.Error | LogTypes.Warn);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = randomize(new Uint8Array(8));\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n\n sentMessage.msg_id = this.timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n\n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n\n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n\n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n\n serializer.storeMethod(method, params);\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n\n if(!this.connectionInited) { // this will call once for each new session\n // /////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find((m) => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n\n const initConnection = Schema.API.methods.find((m) => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n\n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(getEnvironment().USER_AGENT || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(this.networkerFactory.language, 'lang_code');\n // serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n\n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find((m) => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n\n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n\n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n\n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n\n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n\n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.log('change transport', transport, oldTransport);\n\n \n this.clearPingDelayDisconnect();\n\n // if(this.pingInterval !== undefined) {\n // clearInterval(this.pingInterval);\n // this.pingInterval = undefined;\n // }\n\n // this.clearPing();\n \n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n \n // * handle outcoming dead socket, server will close the connection\n if((transport as TcpObfuscated).connection) {\n // this.sendPingDelayDisconnect();\n\n if(transport.connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n // this.pingInterval = ctx.setInterval(this.sendPing, PING_INTERVAL);\n // this.sendPing();\n }\n \n\n this.resend();\n }\n\n public destroy() {\n this.log('destroy');\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n /* private clearPing() {\n if(this.pingPromise) {\n this.pingPromise = undefined;\n }\n\n this.lastPingTime = undefined;\n }\n\n private sendPing = () => {\n // return;\n\n // if(!(this.transport as TcpObfuscated).connected) {\n // this.clearPing();\n // return;\n // }\n\n if(this.pingPromise) {\n return;\n }\n\n const startTime = Date.now();\n this.log('sendPing: ping', startTime);\n const promise = this.pingPromise = this.wrapMtpCall('ping', {\n ping_id: randomLong()\n }, {\n notContentRelated: true\n }).then(() => {\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.log('sendPing: pong', elapsedTime);\n\n setTimeout(() => {\n if(this.pingPromise !== promise) {\n return;\n }\n\n this.pingPromise = undefined;\n this.sendPing();\n }, Math.max(0, PING_INTERVAL - elapsedTime));\n });\n }; */\n\n private clearPingDelayDisconnect() {\n const deferred = this.pingDelayDisconnectDeferred;\n this.pingDelayDisconnectDeferred = undefined;\n this.lastPingDelayDisconnectId = undefined;\n\n if(deferred) {\n deferred.reject();\n }\n }\n\n private sendPingDelayDisconnect = () => {\n // return;\n\n if(this.pingDelayDisconnectDeferred || !this.transport || !this.transport.connected) return;\n\n /* if(!this.isOnline) {\n if((this.transport as TcpObfuscated).connected) {\n (this.transport as TcpObfuscated).connection.close();\n }\n\n return;\n } */\n\n const deferred = this.pingDelayDisconnectDeferred = deferredPromise();\n const delays = this.delays;\n const pingMaxTime = this.delays.pingMaxTime;\n const lastPingTime = Math.min(this.lastPingTime ?? 0, pingMaxTime);\n const disconnectDelay = Math.round(delays.disconnectDelayMin + lastPingTime / pingMaxTime * (delays.disconnectDelayMax - delays.disconnectDelayMin));\n const timeoutTime = disconnectDelay * 1000;\n const startTime = this.lastPingStartTime = Date.now();\n const pingId = this.lastPingDelayDisconnectId = randomLong();\n const options: MTMessageOptions = {notContentRelated: true};\n this.wrapMtpCall('ping_delay_disconnect', {\n ping_id: pingId,\n disconnect_delay: disconnectDelay\n }, options);\n\n const log = this.log.bindPrefix('sendPingDelayDisconnect');\n this.debug && log.debug(`ping, timeout=${timeoutTime}, lastPingTime=${this.lastPingTime}, msgId=${options.messageId}, pingId=${pingId}`);\n const rejectTimeout = ctx.setTimeout(deferred.reject, timeoutTime);\n\n const onResolved = (reason: string) => {\n clearTimeout(rejectTimeout);\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.debug && log.debug(`pong, reason='${reason}', time=${lastPingTime}, msgId=${options.messageId}`);\n if(elapsedTime > timeoutTime) {\n throw undefined;\n } else {\n return pause(Math.max(0, this.delays.pingInterval - elapsedTime/* timeoutTime - elapsedTime - PING_INTERVAL */));\n }\n };\n\n const onTimeout = () => {\n clearTimeout(rejectTimeout);\n const transport = this.transport as TcpObfuscated;\n if(this.pingDelayDisconnectDeferred !== deferred || !transport?.connection) {\n return;\n }\n\n log.error('catch, closing connection', this.lastPingTime, options.messageId);\n transport.connection.close();\n };\n\n const onFinally = () => {\n if(this.pingDelayDisconnectDeferred !== deferred) {\n return;\n }\n\n this.pingDelayDisconnectDeferred = undefined;\n this.sendPingDelayDisconnect();\n };\n\n deferred\n .then(onResolved)\n .catch(onTimeout)\n .finally(onFinally);\n };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n // this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n // this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n // console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n\n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n // notContentRelated: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n\n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n\n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n\n const pingMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n\n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n\n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n\n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n\n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n\n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n const sentMessages = this.sentMessages;\n noResponseMsgs.forEach((msgId) => {\n const sentMessage = sentMessages[msgId];\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n delete sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n let promise: CancellablePromise;\n if(!options.notContentRelated || options.noResponse) {\n promise = deferredPromise();\n }\n\n this.sentMessages[message.msg_id] = Object.assign(\n message,\n options,\n promise ? {deferred: promise} : undefined\n );\n\n // this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n\n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n\n return promise;\n }\n\n public attachPromise(promise: Promise, message: MTMessage) {\n const canIncrement = true;\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < this.delays.connectionTimeout) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then((bytes) => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, this.delays.connectionTimeout);\n\n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n if(canIncrement) {\n --this.activeRequests;\n this.setDrainTimeout();\n }\n });\n\n if(canIncrement) {\n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(this.networkerFactory.onConnectionStatusChange) {\n this.networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n if((this.transport as TcpObfuscated)?.connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n\n // this.getNewTimeOffset = true;\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n\n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n\n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n\n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2aText));\n\n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n\n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n\n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n\n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return this.networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n\n const pendingResendReqLength = this.pendingResendReq.length;\n if(pendingResendReqLength) {\n const options: MTMessageOptions = {...RESEND_OPTIONS};\n const msgIds = this.pendingResendReq.splice(0, pendingResendReqLength);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: msgIds\n }, options);\n\n this.log('resend: resending requests', options.messageId, msgIds);\n /* this.lastResendReq = {\n reqMsgId: options.messageId,\n msgIds: msgIds\n }; */\n\n // this.pendingResendReq.length = 0;\n }\n\n // if(this.pendingResendAnsReq.length) {\n // const options: MTMessageOptions = {...RESEND_OPTIONS};\n // const msgIds = this.pendingResendAnsReq.slice();\n // this.wrapMtpMessage({\n // _: 'msg_resend_ans_req',\n // msg_ids: msgIds\n // }, options);\n\n // this.log('resend: requesting answers', options.messageId, msgIds);\n // this.lastResendAnsReq = {\n // reqMsgId: options.messageId,\n // msgIds: msgIds\n // };\n\n // // this.pendingResendAnsReq.length = 0;\n // }\n\n let outMessage: MTMessage;\n const messages: typeof outMessage[] = [];\n\n // const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n // const value = this.pendingMessages[messageId];\n\n // if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n // }\n }\n\n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n\n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n\n \n const noResponseMsgs: Array = messages.filter((message) => message.noResponse).map((message) => message.msg_id);\n \n\n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n\n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n\n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n\n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message)\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n\n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n\n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */randomize(new Uint8Array(paddingLength))/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n // (message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n\n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private async sendEncryptedRequest(message: MTMessage) {\n const requestData = await this.getEncryptedOutput(message);\n\n if(!this.transport) {\n this.log.error('trying to send something when offline', this.transport, this);\n }\n\n this.debug && this.log.debug('sending:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport ? this.transport.send(requestData) as any : Promise.reject({});\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n\n \n \n \n\n \n if(!(this.transport instanceof HTTP)) return promise;\n \n\n const baseError: ApiError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n // @ts-ignore\n transport: this.transport\n };\n\n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n\n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n // const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n\n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + bytesToHex(authKeyId));\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n\n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n\n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n\n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n\n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n // this.updateSession();\n // this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n\n const seqNo = deserializer.fetchInt('seq_no');\n\n const totalLength = dataWithPadding.byteLength;\n\n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n\n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n\n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n\n // let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true,\n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n\n const offset = deserializer.getOffset();\n\n // self.log('mt_message!!!!!', result, field);\n\n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n\n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n\n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n\n // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n // this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n\n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n\n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой)\n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n // this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n\n // this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n\n // const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n // this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n // this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = ctx.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n\n private reqResend(msgId: MTLong/* , isAnswer?: boolean */) {\n if(this.debug) {\n this.log.debug('Req resend', msgId/* , isAnswer */);\n }\n\n // (isAnswer ? this.pendingResendAnsReq : this.pendingResendReq).push(msgId);\n this.pendingResendReq.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n const sentMessages = this.sentMessages;\n // this.log('clean start', this.dcId/*, sentMessages*/)\n Object.keys(sentMessages).forEach((msgId) => {\n const message = sentMessages[msgId];\n\n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n\n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n // delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}): ApiError {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n\n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] as any || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n const sentMessages = this.sentMessages;\n for(const id in sentMessages) {\n const msg = sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n\n if((this.transport as TcpObfuscated).connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then((res) => {\n this.log('status', res);\n });\n } */\n\n private applyServerTime(messageId: string) {\n const serverTime = bigInt(messageId).shiftRight(32).toJSNumber();\n this.log('applying server time', serverTime);\n return this.timeManager.applyServerTime(serverTime);\n }\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n if(this.debug) {\n this.log.debug('process message', message, messageId);\n }\n\n if(this.pingDelayDisconnectDeferred) {\n this.pingDelayDisconnectDeferred.resolve('any message');\n }\n\n // let changedTimeOffset: boolean;\n // if(this.getNewTimeOffset) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // this.getNewTimeOffset = undefined;\n // }\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n\n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n\n this.ackMessage(messageId);\n\n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n\n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n // if(changedTimeOffset === undefined) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // }\n\n const changedTimeOffset = this.applyServerTime(messageId);\n if(message.error_code === 17 || changedTimeOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n // this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n\n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n\n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n // this.updateSession();\n\n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && this.networkerFactory.updatesProcessor) {\n this.networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n\n case 'msgs_ack': {\n this.debug && this.log('got acks', message.msg_ids);\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n\n case 'msg_detailed_info': {\n const sentMessage = this.sentMessages[message.msg_id];\n if(!sentMessage) {\n this.ackMessage(message.answer_msg_id);\n break;\n }/* else if(sentMessage.acked) {\n this.reqResend(message.answer_msg_id, true);\n }\n\n break; */\n }\n\n case 'msg_new_detailed_info': {\n if(this.pendingAcks.indexOf(message.answer_msg_id) !== -1) {\n break;\n }\n\n this.reqResend(message.answer_msg_id);\n break;\n }\n\n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n const arr = [\n [this.lastResendReq, this.pendingResendReq] as const\n // [this.lastResendAnsReq, this.pendingResendAnsReq] as const\n ];\n\n for(const [lastResend, pendingResend] of arr) {\n if(lastResend?.reqMsgId === message.req_msg_id && pendingResend.length) {\n for(const badMsgId of lastResend.msgIds) {\n const pos = pendingResend.indexOf(badMsgId);\n if(pos !== -1) {\n pendingResend.splice(pos, 1);\n }\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n\n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(this.debug) {\n this.log('Rpc response', message.result, sentMessage);\n }\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n }\n }\n\n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n /* const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n } */\n const pingId = message.ping_id;\n if(this.lastPingDelayDisconnectId === pingId) {\n const deferred = this.pingDelayDisconnectDeferred;\n if(deferred) {\n deferred.resolve('pong');\n } else {\n this.log('ping deferred deleted', pingId);\n }\n }\n\n break;\n }\n\n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n\n if(this.networkerFactory.updatesProcessor !== null) {\n this.networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","import bigInt from 'big-integer';\n\nexport default function sortLongsArray(arr: string[]) {\n return arr.map((long) => {\n return bigInt(long);\n }).sort((a, b) => {\n return a.compare(b);\n }).map((bigInt) => {\n return bigInt.toString(10);\n });\n}\n","import addPadding from '../bytes/addPadding';\nimport bigInt from 'big-integer';\nimport {bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function longToBytes(sLong: string) {\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n // console.log('longToBytes', bytes, bigIntBytes);\n\n return bytes;\n}\n","/*\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 {ConnectionStatusChange} from './connectionStatus';\nimport MTPNetworker from './networker';\nimport {InvokeApiOptions} from '../../types';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManager} from '../appManagers/manager';\n\nexport class NetworkerFactory extends AppManager {\n private networkers: MTPNetworker[] = [];\n public language = navigator.language || App.langPackCode;\n public updatesProcessor: (obj: any) => void = null;\n // public onConnectionStatusChange: (status: ConnectionStatusChange) => void = null;\n public akStopped = false;\n\n public onConnectionStatusChange(status: ConnectionStatusChange) {\n this.rootScope.dispatchEvent('connection_status_change', status);\n // ({type: 'connectionStatusChange', payload: status});\n }\n\n public removeNetworker(networker: MTPNetworker) {\n indexOfAndSplice(this.networkers, networker);\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\n // console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\n const networker = new MTPNetworker(this, this.timeManager, dcId, authKey, authKeyId, serverSalt, options);\n this.networkers.push(networker);\n return networker;\n }\n\n public startAll() {\n if(this.akStopped) {\n const stoppedNetworkers = this.networkers.filter((networker) => networker.isStopped());\n\n this.akStopped = false;\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\n\n for(const networker of stoppedNetworkers) {\n networker.scheduleRequest();\n }\n }\n }\n\n public stopAll() {\n this.akStopped = true;\n }\n\n public setLanguage(langCode: string) {\n this.language = langCode;\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.connectionInited = false;\n }\n }\n }\n\n public unsetConnectionInited() {\n for(const networker of this.networkers) {\n networker.connectionInited = false;\n }\n }\n\n public forceReconnectTimeout() {\n for(const networker of this.networkers) {\n networker.forceReconnectTimeout();\n }\n }\n\n public forceReconnect() {\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.forceReconnect();\n break;\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLSerialization} from './tl_utils';\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bigInt from 'big-integer';\n\nexport type RSAPublicKeyHex = {\n modulus: string,\n exponent: string\n};\n\nexport class RSAKeysManager {\n /**\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\n *\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * Bytes can be got via\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\n * $ openssl rsa -pubin -in pub.pem -text -noout\n */\n\n /* private publisKeysHex = [{\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\n exponent: '010001'\n }, {\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\n exponent: '010001'\n }, {\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\n exponent: '010001'\n }, {\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\n exponent: '010001'\n }, {\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\n exponent: '010001'\n }]; */\n\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\n exponent: '010001'\n }];\n\n private publisKeysHex: RSAPublicKeyHex[] = [{\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n exponent: '010001'\n }];\n\n private publicKeysParsed: {\n [hex: string]: RSAPublicKeyHex\n } = {};\n private prepared = false;\n private preparePromise: Promise = null;\n\n constructor() {\n if(Modes.test) {\n this.publisKeysHex = this.testPublicKeysHex;\n }\n }\n\n public prepare(): Promise {\n if(this.preparePromise) return this.preparePromise;\n else if(this.prepared) {\n return Promise.resolve();\n }\n\n return this.preparePromise = Promise.all(this.publisKeysHex.map((keyParsed) => {\n const RSAPublicKey = new TLSerialization();\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\n\n const buffer = RSAPublicKey.getBuffer();\n\n return cryptoWorker.invokeCrypto('sha1', buffer).then((bytes) => {\n const fingerprintBytes = bytes.slice(-8);\n fingerprintBytes.reverse();\n\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\n modulus: keyParsed.modulus,\n exponent: keyParsed.exponent\n };\n });\n })).then(() => {\n this.prepared = true;\n\n // console.log('[MT] Prepared keys');\n this.preparePromise = null;\n });\n }\n\n public async select(fingerprints: Array) {\n await this.prepare();\n\n for(let i = 0; i < fingerprints.length; ++i) {\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\n\n if(fingerprintHex.length < 16) {\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\n }\n\n // console.log(fingerprintHex, this.publicKeysParsed);\n const foundKey = this.publicKeysParsed[fingerprintHex];\n if(foundKey) {\n return Object.assign({\n fingerprint: fingerprints[i]\n }, foundKey);\n }\n }\n }\n}\n\nexport default new RSAKeysManager();\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\n \n\nimport {TLSerialization, TLDeserialization} from './tl_utils';\nimport {TransportType} from './dcConfigurator';\nimport rsaKeysManager from './rsaKeysManager';\n\nimport CryptoWorker from '../crypto/cryptoMessagePort';\n\nimport {logger, LogTypes} from '../logger';\nimport DEBUG from '../../config/debug';\nimport {Awaited, DcId} from '../../types';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n\n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n\n // good\n p?: Uint8Array,\n q?: Uint8Array,\n\n newNonce?: Uint8Array,\n\n retry?: number,\n\n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n\n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n\n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer extends AppManager {\n private cached: {\n [dcId: DcId]: Promise\n };\n\n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n\n protected after() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n\n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n\n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(this.timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n\n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = this.dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n\n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n\n const promise = transport.send(resultArray) as any as Promise;\n return promise.then((result) => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n\n if(!result || !result.byteLength) {\n throw baseError;\n }\n\n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n\n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n\n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n\n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n\n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n\n throw error;\n });\n }\n\n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n\n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', bytesToHex(auth.nonce));\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n\n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n\n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n\n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n\n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n\n auth.publicKey = publicKey;\n\n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n\n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n\n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n\n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n\n return this.sendReqDhParams(auth);\n }\n\n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = randomize(new Uint8Array(32));\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n\n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = randomize(new Uint8Array(32));\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n\n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n\n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n\n const requestBytes = request.getBytes(true);\n\n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n\n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n\n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n\n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n\n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n\n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n\n throw new Error('[MT] server_DH_params_fail');\n }\n\n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n\n // console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n\n return this.sendSetClientDhParams(auth);\n }\n\n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n\n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n\n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n\n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n\n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n\n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n\n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n\n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n\n const offset = deserializer.getOffset();\n\n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n\n this.timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n\n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n\n const gABigInt = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n\n const twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n\n return true;\n }\n\n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n\n auth.b = randomize(new Uint8Array(256));\n // MTProto.secureRandom.nextBytes(auth.b);\n\n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n\n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n\n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n\n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n\n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n\n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n\n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n\n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n\n const authKeyHash = await CryptoWorker.invokeCrypto('sha1', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n\n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n\n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n\n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n\n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n\n return auth;\n }\n\n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n\n return this.sendSetClientDhParams(auth);\n }\n\n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n\n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n\n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId,\n nonce: randomize(new Uint8Array(16))\n };\n\n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport {nextRandomUint} from '../../helpers/random';\nimport {WorkerTaskVoidTemplate} from '../../types';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {AppManager} from '../appManagers/manager';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager extends AppManager {\n private lastMessageId: [number, number];\n private timeOffset: number;\n\n /* private midnightNoOffset: number;\n private midnightOffseted: Date;\n\n private midnightOffset: number; */\n\n /* private timeParams: {\n midnightOffset: number,\n serverTimeOffset: number\n }; */\n\n protected after() {\n this.lastMessageId = [0, 0];\n this.timeOffset = 0;\n\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n\n\n // * migrated from ServerTimeManager\n /* const timestampNow = tsNow(true);\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\n this.midnightOffseted = new Date();\n this.midnightOffseted.setHours(0, 0, 0, 0);\n\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\n\n /* this.timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n }; */\n }\n\n public getServerTimeOffset() {\n return this.timeOffset;\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = ulongFromInts(messageId[0], messageId[1]).toString(10);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n this.lastMessageId = [0, 0];\n\n if(this.timeOffset !== newTimeOffset) {\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.timeOffset = newTimeOffset;\n }\n\n // console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n return changed;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DocumentAttribute, WebDocument} from '../../layer';\n\nexport default class AppWebDocsManager {\n public saveWebDocument(webDocument: WebDocument) {\n if(!webDocument) {\n return;\n }\n\n const attribute: DocumentAttribute.documentAttributeImageSize = webDocument.attributes.find((attribute) => attribute._ === 'documentAttributeImageSize') as any;\n if(attribute) {\n webDocument.w = attribute.w;\n webDocument.h = attribute.h;\n }\n\n return webDocument;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputInvoice, InputPaymentCredentials, PaymentRequestedInfo, PaymentsPaymentForm} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppPaymentsManager extends AppManager {\n public getInputInvoiceBySlug(slug: string): InputInvoice.inputInvoiceSlug {\n return {\n _: 'inputInvoiceSlug',\n slug\n };\n }\n\n public getInputInvoiceByPeerId(peerId: PeerId, mid: number): InputInvoice.inputInvoiceMessage {\n return {\n _: 'inputInvoiceMessage',\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n };\n }\n\n public getPaymentForm(invoice: InputInvoice) {\n return this.apiManager.invokeApi('payments.getPaymentForm', {\n invoice\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public getPaymentReceipt(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApi('payments.getPaymentReceipt', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public validateRequestedInfo(invoice: InputInvoice, info: PaymentRequestedInfo, save?: boolean) {\n return this.apiManager.invokeApi('payments.validateRequestedInfo', {\n save,\n invoice,\n info\n });\n }\n\n public sendPaymentForm(\n invoice: InputInvoice,\n formId: PaymentsPaymentForm['form_id'],\n requestedInfoId: string,\n shippingOptionId: string,\n credentials: InputPaymentCredentials,\n tipAmount?: number\n ) {\n return this.apiManager.invokeApi('payments.sendPaymentForm', {\n form_id: formId,\n invoice,\n requested_info_id: requestedInfoId,\n shipping_option_id: shippingOptionId,\n credentials,\n tip_amount: tipAmount || undefined\n }).then((result) => {\n if(result._ === 'payments.paymentResult') {\n this.apiUpdatesManager.processUpdateMessage(result.updates);\n }\n\n return result;\n });\n }\n\n public clearSavedInfo(info?: boolean, credentials?: boolean) {\n return this.apiManager.invokeApi('payments.clearSavedInfo', {\n info,\n credentials\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 {MessageSendingParams} from './appMessagesManager';\nimport {AppManager} from './manager';\nimport {AttachMenuBots, AttachMenuBot, Update, DataJSON} from '../../layer';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport getAttachMenuBotIcon from './utils/attachMenuBots/getAttachMenuBotIcon';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppAttachMenuBotsManager extends AppManager {\n private attachMenuBots: Map;\n private attachMenuBotsArr: AttachMenuBot[];\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateAttachMenuBots: this.onUpdateAttachMenuBots\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.attachMenuBots.clear();\n this.attachMenuBotsArr = undefined;\n } else {\n this.attachMenuBots = new Map();\n }\n };\n\n private onUpdateAttachMenuBots = (update: Update.updateAttachMenuBots) => {\n this.clear();\n this.getAttachMenuBots();\n };\n\n public saveAttachMenuBot(attachMenuBot: AttachMenuBot) {\n this.attachMenuBots.set(attachMenuBot.bot_id, attachMenuBot);\n const icon = getAttachMenuBotIcon(attachMenuBot);\n icon.icon = this.appDocsManager.saveDoc(icon.icon, {type: 'attachMenuBotIcon', botId: attachMenuBot.bot_id});\n return attachMenuBot;\n }\n\n public saveAttachMenuBots(attachMenuBots: AttachMenuBot[]) {\n if((attachMenuBots as any).saved) return;\n (attachMenuBots as any).saved = true;\n attachMenuBots.forEach((user) => this.saveAttachMenuBot(user));\n }\n\n public getAttachMenuBots() {\n return this.attachMenuBotsArr ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBots',\n processResult: (attachMenuBots) => {\n assumeType(attachMenuBots);\n this.appUsersManager.saveApiUsers(attachMenuBots.users);\n this.saveAttachMenuBots(attachMenuBots.bots);\n // ! temporary\n return this.attachMenuBotsArr = attachMenuBots.bots.slice(0, 0);\n }\n });\n }\n\n public getAttachMenuBotCached(botId: BotId) {\n return this.attachMenuBots.get(botId);\n }\n\n public getAttachMenuBot(botId: BotId, overwrite?: boolean) {\n if(!this.appUsersManager.isAttachMenuBot(botId) || true) {\n throw makeError('BOT_INVALID');\n }\n\n return (!overwrite && this.getAttachMenuBotCached(botId)) ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBot',\n params: {\n bot: this.appUsersManager.getUserInput(botId)\n },\n processResult: (attachMenuBotsBot) => {\n this.appUsersManager.saveApiUsers(attachMenuBotsBot.users);\n const attachMenuBot = this.saveAttachMenuBot(attachMenuBotsBot.bot);\n return attachMenuBot;\n }\n });\n }\n\n public requestWebView(options: MessageSendingParams & {\n botId: BotId,\n peerId: PeerId,\n // platform: string,\n startParam?: string,\n fromBotMenu?: boolean,\n url?: string,\n themeParams?: DataJSON\n }) {\n const {\n botId,\n peerId,\n url,\n fromBotMenu,\n themeParams,\n // platform,\n replyToMsgId,\n silent,\n sendAsPeerId,\n startParam,\n threadId\n } = options;\n\n const platform = 'web';\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.requestWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n bot: this.appUsersManager.getUserInput(botId),\n silent,\n platform,\n url,\n reply_to_msg_id: replyToMsgId ? getServerMessageId(replyToMsgId) : undefined,\n from_bot_menu: fromBotMenu,\n theme_params: themeParams,\n send_as: sendAsPeerId ? this.appPeersManager.getInputPeerById(sendAsPeerId) : undefined,\n start_param: startParam,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\n return result;\n }\n });\n }\n\n public prolongWebView(options: MessageSendingParams & {\n peerId: PeerId,\n botId: BotId,\n queryId: string | number\n }) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.prolongWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(options.peerId),\n bot: this.appUsersManager.getUserInput(options.botId),\n query_id: options.queryId,\n silent: options.silent,\n reply_to_msg_id: options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n top_msg_id: options.threadId ? getServerMessageId(options.threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport callbackify from '../../helpers/callbackify';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport appStateManager from './appStateManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport createManagers from './createManagers';\n\ntype Managers = Awaited>;\n\nexport class AppManagersManager {\n private managers: Managers | Promise;\n private cryptoWorkersURLs: string[];\n private cryptoPortsAttached: number;\n private cryptoPortPromise: CancellablePromise;\n\n constructor() {\n this.cryptoWorkersURLs = [];\n this.cryptoPortsAttached = 0;\n this.cryptoPortPromise = deferredPromise();\n this.cryptoPortPromise.then(() => {\n this.cryptoPortPromise = undefined;\n });\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('manager', ({name, method, args}) => {\n return callbackify(this.getManagers(), (managers) => {\n // @ts-ignore\n const manager = managers[name];\n return manager[method].apply(manager, args);\n });\n });\n\n port.addEventListener('cryptoPort', (payload, source, event) => {\n const port = event.ports[0];\n if(this.cryptoPortsAttached >= this.cryptoWorkersURLs.length) {\n port.close();\n return;\n }\n\n ++this.cryptoPortsAttached;\n cryptoMessagePort.attachPort(port);\n this.cryptoPortPromise?.resolve();\n });\n\n port.addEventListener('createProxyWorkerURLs', ({originalUrl, blob}) => {\n let length = this.cryptoWorkersURLs.length;\n if(!length) {\n this.cryptoWorkersURLs.push(originalUrl);\n ++length;\n }\n\n const maxLength = App.cryptoWorkers;\n if(length === maxLength) {\n return this.cryptoWorkersURLs;\n }\n\n const newURLs = new Array(maxLength - length).fill(undefined).map(() => URL.createObjectURL(blob));\n this.cryptoWorkersURLs.push(...newURLs);\n return this.cryptoWorkersURLs;\n });\n }\n\n public async createManagers() {\n const appStoragesManager = new AppStoragesManager();\n\n await Promise.all([\n // new Promise(() => {}),\n appStoragesManager.loadStorages(),\n this.cryptoPortPromise\n ]);\n\n const managers = await createManagers(appStoragesManager, appStateManager.userId);\n return this.managers = managers;\n }\n\n public getManagers() {\n return this.managers ??= this.createManagers();\n }\n}\n\nconst appManagersManager = new AppManagersManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appManagersManager = appManagersManager);\nexport default appManagersManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PasswordManager} from '../mtproto/passwordManager';\nimport {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport DialogsStorage from '../storages/dialogs';\nimport FiltersStorage from '../storages/filters';\nimport {ApiUpdatesManager} from './apiUpdatesManager';\nimport {AppAvatarsManager} from './appAvatarsManager';\nimport {AppCallsManager} from './appCallsManager';\nimport {AppChatsManager} from './appChatsManager';\nimport {AppDocsManager} from './appDocsManager';\nimport {AppDraftsManager} from './appDraftsManager';\nimport {AppEmojiManager} from './appEmojiManager';\nimport {AppGroupCallsManager} from './appGroupCallsManager';\nimport {AppInlineBotsManager} from './appInlineBotsManager';\nimport {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport {AppMessagesManager} from './appMessagesManager';\nimport {AppNotificationsManager} from './appNotificationsManager';\nimport {AppPeersManager} from './appPeersManager';\nimport {AppPhotosManager} from './appPhotosManager';\nimport {AppPollsManager} from './appPollsManager';\nimport {AppPrivacyManager} from './appPrivacyManager';\nimport {AppProfileManager} from './appProfileManager';\nimport {AppReactionsManager} from './appReactionsManager';\nimport {AppStickersManager} from './appStickersManager';\nimport {AppUsersManager} from './appUsersManager';\nimport {AppWebPagesManager} from './appWebPagesManager';\nimport {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ApiManager} from '../mtproto/apiManager';\nimport ctx from '../../environment/ctx';\nimport PeersStorage from '../storages/peers';\nimport ThumbsStorage from '../storages/thumbs';\nimport {NetworkerFactory} from '../mtproto/networkerFactory';\nimport {RootScope} from '../rootScope';\nimport {Authorizer} from '../mtproto/authorizer';\nimport {DcConfigurator} from '../mtproto/dcConfigurator';\nimport {TimeManager} from '../mtproto/timeManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport appStateManager from './appStateManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport AppWebDocsManager from './appWebDocsManager';\nimport AppPaymentsManager from './appPaymentsManager';\nimport AppAttachMenuBotsManager from './appAttachMenuBotsManager';\n\nexport default function createManagers(appStoragesManager: AppStoragesManager, userId: UserId) {\n const managers = {\n appPeersManager: new AppPeersManager,\n appChatsManager: new AppChatsManager,\n appDocsManager: new AppDocsManager,\n appPhotosManager: new AppPhotosManager,\n appPollsManager: new AppPollsManager,\n appUsersManager: new AppUsersManager,\n appWebPagesManager: new AppWebPagesManager,\n appDraftsManager: new AppDraftsManager,\n appProfileManager: new AppProfileManager,\n appNotificationsManager: new AppNotificationsManager,\n apiUpdatesManager: new ApiUpdatesManager,\n appAvatarsManager: new AppAvatarsManager,\n appGroupCallsManager: new AppGroupCallsManager,\n appCallsManager: new AppCallsManager,\n appReactionsManager: new AppReactionsManager,\n appMessagesManager: new AppMessagesManager,\n appMessagesIdsManager: new AppMessagesIdsManager,\n appPrivacyManager: new AppPrivacyManager,\n appInlineBotsManager: new AppInlineBotsManager,\n appStickersManager: new AppStickersManager,\n referenceDatabase: new ReferenceDatabase,\n appEmojiManager: new AppEmojiManager,\n filtersStorage: new FiltersStorage,\n dialogsStorage: new DialogsStorage,\n apiManager: new ApiManager,\n cryptoWorker: cryptoMessagePort,\n passwordManager: new PasswordManager,\n apiFileManager: new ApiFileManager,\n peersStorage: new PeersStorage,\n thumbsStorage: new ThumbsStorage,\n networkerFactory: new NetworkerFactory,\n rootScope: new RootScope,\n authorizer: new Authorizer,\n dcConfigurator: new DcConfigurator,\n timeManager: new TimeManager,\n appStoragesManager: appStoragesManager,\n appStateManager: appStateManager,\n appWebDocsManager: new AppWebDocsManager,\n appPaymentsManager: new AppPaymentsManager,\n appAttachMenuBotsManager: new AppAttachMenuBotsManager\n };\n\n type T = typeof managers;\n\n for(const name in managers) {\n const manager = managers[name as keyof T];\n if(!manager) {\n continue;\n }\n\n if((manager as AppMessagesManager).setManagers) {\n (manager as AppMessagesManager).setManagers(managers as any);\n delete (manager as AppMessagesManager).setManagers;\n }\n\n // @ts-ignore\n ctx[name] = manager;\n }\n\n const promises: Array void) | void> | void>[] = [];\n let names = Object.keys(managers) as (keyof T)[];\n names.unshift('appUsersManager', 'appChatsManager', 'appNotificationsManager', 'appMessagesManager', 'dialogsStorage');\n names = filterUnique(names);\n for(const name of names) {\n const manager = managers[name];\n if((manager as any)?.after) {\n // console.log('injecting after', name);\n const result = (manager as any).after();\n promises.push(result);\n\n // if(result instanceof Promise) {\n // result.then(() => {\n // console.log('injected after', name);\n // });\n // }\n }\n }\n\n if(userId) {\n managers.apiManager.setUserAuth(userId);\n }\n\n return Promise.all(promises).then(() => managers);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// just to include\nimport '../polyfill';\nimport '../../helpers/peerIdPolyfill';\n\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport {setEnvironment} from '../../environment/utils';\nimport appStateManager from '../appManagers/appStateManager';\nimport transportController from './transports/controller';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport RESET_STORAGES_PROMISE from '../appManagers/utils/storages/resetStoragesPromise';\nimport appManagersManager from '../appManagers/appManagersManager';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {logger} from '../logger';\nimport {State} from '../../config/state';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport appTabsManager from '../appManagers/appTabsManager';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport callbackify from '../../helpers/callbackify';\n\nlet _isServiceWorkerOnline = true;\nexport function isServiceWorkerOnline() {\n return _isServiceWorkerOnline;\n}\n\nlet serviceMessagePort: ServiceMessagePort, _serviceMessagePort: MessagePort;\nexport function getServiceMessagePort() {\n return _isServiceWorkerOnline ? serviceMessagePort : undefined;\n}\n\nconst log = logger('MTPROTO');\n// let haveState = false;\n\nconst port = new MTProtoMessagePort();\nport.addMultipleEventsListeners({\n environment: (environment) => {\n setEnvironment(environment);\n\n transportController.waitForWebSocket();\n },\n\n crypto: ({method, args}) => {\n return cryptoWorker.invokeCrypto(method as any, ...args as any);\n },\n\n state: ({state, resetStorages, pushedKeys, newVersion, oldVersion, userId}) => {\n // if(haveState) {\n // return;\n // }\n\n log('got state', state, pushedKeys);\n\n appStateManager.userId = userId;\n appStateManager.newVersion = newVersion;\n appStateManager.oldVersion = oldVersion;\n\n (Object.keys(state) as any as (keyof State)[]).forEach((key) => {\n appStateManager.pushToState(key, state[key], true, !pushedKeys.includes(key));\n });\n\n RESET_STORAGES_PROMISE.resolve(resetStorages);\n // haveState = true;\n },\n\n toggleStorages: ({enabled, clearWrite}) => {\n return toggleStorages(enabled, clearWrite);\n },\n\n event: (payload, source) => {\n log('will redirect event', payload, source);\n port.invokeExceptSource('event', payload, source);\n },\n\n serviceWorkerOnline: (online) => {\n _isServiceWorkerOnline = online;\n },\n\n serviceWorkerPort: (payload, source, event) => {\n if(serviceMessagePort) {\n serviceMessagePort.detachPort(_serviceMessagePort);\n _serviceMessagePort = undefined;\n } else {\n serviceMessagePort = new ServiceMessagePort();\n serviceMessagePort.addMultipleEventsListeners({\n requestFilePart: (payload) => {\n return callbackify(appManagersManager.getManagers(), (managers) => {\n const {docId, dcId, offset, limit} = payload;\n return managers.appDocsManager.requestDocPart(docId, dcId, offset, limit);\n });\n }\n });\n }\n\n // * port can be undefined in the future\n if(_serviceMessagePort = event.ports[0]) {\n serviceMessagePort.attachPort(_serviceMessagePort);\n }\n },\n\n createObjectURL: (blob) => {\n return URL.createObjectURL(blob);\n }\n\n // socketProxy: (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n\n // const socketProxied = socketsProxied.get(id);\n // if(socketTask.type === 'message') {\n // socketProxied.dispatchEvent('message', socketTask.payload);\n // } else if(socketTask.type === 'open') {\n // socketProxied.dispatchEvent('open');\n // } else if(socketTask.type === 'close') {\n // socketProxied.dispatchEvent('close');\n // socketsProxied.delete(id);\n // }\n // },\n});\n\nlog('MTProto start');\n\nappManagersManager.start();\nappManagersManager.getManagers();\nappTabsManager.start();\n\n// let sentHello = false;\nlistenMessagePort(port, (source) => {\n appTabsManager.addTab(source);\n\n // port.invokeVoid('hello', undefined, source);\n // if(!sentHello) {\n // port.invokeVoid('hello', undefined, source);\n // sentHello = true;\n // }\n}, (source) => {\n appTabsManager.deleteTab(source);\n});\n","/*\n * 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 SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* 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","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '🏴‍☠']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,333,437,946], () => (__webpack_require__(5218)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 437) return \"437.a80d805671a4b222696d.bundle.js\";\n\tif (chunkId === 946) return \"946.5f3daeb8fb456e8f8e99.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + ({\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] || chunkId) + \".\" + {\"8\":\"47c82822a84234c722aa\",\"104\":\"3793e2da2f88ac72ffd9\",\"211\":\"a70c90f1bcf51a3f9932\",\"301\":\"dc3c5a315285fe24ebd3\",\"333\":\"d7addf177783fe16e44c\",\"642\":\"e22e19b4ff8bd97e11a6\",\"699\":\"f16d6f756c34f3914132\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t678: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","oldGetScript","oldLoadScript","queryMap","countMap","next","EmojiVersions","Emoji","version","Object","assign","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","badCharsRe","trimRe","C2L","cleanSearchText","text","latinize","processSearchText","clearBadChars","ignoreCase","options","hasTag","includeTag","charAt","originalText","replace","clearBadCharsAndTrim","ch","latinizeCh","latinizeString","fixCyrillic","FILENAME_JOINER","getFileNameByLocation","location","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","downloadId","getFileURL","type","encodeURIComponent","JSON","stringify","platforms","Set","ignore","getRestrictionReason","reasons","find","reason","has","isRestricted","ignoreRestrictionReasons","clear","forEach","add","getPeerId","peerId","undefined","isPeerId","userId","user_id","toPeerId","chatId","channel_id","chat_id","isUser","peerParams","substr","split","IDB","constructor","db","this","name","storageIsAvailable","log","openDatabase","INSTANCES","push","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","request","indexedDB","open","Promise","reject","message","finished","setTimeout","onerror","resolve","onsuccess","event","result","calledNew","onclose","e","onabort","transaction","target","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","concat","getObjectStore","map","save","value","idx","put","get","mode","callback","perf","performance","now","then","onError","clearTimeout","timeout","onComplete","results","requests","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","i","getAll","environment","getEnvironment","setEnvironment","env","RootScope","super","myId","connectionStatus","premium","addEventListener","isNew","isPremium","dispatchEventSingle","status","dispatchEvent","args","invokeVoid","settings","getConnectionStatus","getPremium","state","stateStorage","getState","setByKey","key","object","splitted","getDeepProperty","slice","pop","setDeepProperty","first","pushToState","direct","onlyLocal","setKeyValueToStorage","set","HTTP","dcId","logSuffix","pending","debug","logTypes","Log","logger","connected","_send","body","fetch","method","response","arrayBuffer","buffer","TextDecoder","decode","Uint8Array","setConnected","err","destroyed","destroy","send","networker","promise","releasePending","releasing","splice","pause","Socket","handleOpen","handleError","handleClose","removeListeners","handleMessage","data","byteLength","ws","connect","removeEventListener","WebSocket","binaryType","randomize","arr","crypto","Error","getRandomValues","Obfuscation","_process","operation","cryptoMessagePort","transfer","init","codec","idPromise","release","initPayload","val","val2","reversedPayload","reverse","encKey","encIv","decKey","decIv","process","obfuscateTag","encrypted","encode","payload","tag","encodePacket","len","header","readPacket","bytesToHex","bytes","toString","TcpObfuscated","Connection","retryTimeout","abridged","obfuscation","autoReconnect","onOpen","connection","setConnectionStatus","cleanupSent","resend","onMessage","parseResponse","processMessage","messageId","sessionId","catch","shift","onClose","needTimeout","retryAt","time","Date","diff","lastCloseTime","isNaN","reconnectTimeout","ctx","reconnect","bodySent","forceReconnect","setAutoReconnect","once","enable","changeUrl","encodeBody","toEncode","encoded","releasingPending","sent","TEST_SUFFIX","getTelegramConnectionSuffix","connectionType","constructTelegramWebSocketUrl","suffix","path","DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","chosenServer","oooohLetMeLive","transportHTTP","dcOption","chooseServer","transportType","reuse","hasOwnProperty","client","download","upload","servers","transports","transport","obj","indexOfAndSplice","MTTransportController","opened","Map","waitForWebSocket","pingTransports","dcConfigurator","https","websocket","httpPromise","websocketPromise","socket","isFulfilled","isRejected","isHttpAvailable","isWebSocketAvailable","all","pinging","setTransportValue","setTransportOpened","setTransportClosed","AppManager","setManagers","managers","loadStorages","storages","recordPromise","storagesKeys","keys","storagesPromises","storagesResults","resetStorages","size","loadStoragesInner","AppStoragesManager","names","createStorages","loadStorage","PasswordManager","apiManager","invokeApi","updateSettings","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","cryptoWorker","invokeCrypto","newAlgo","new_algo","salt1","newPassword","hashes","new_password_hash","getInputCheckPassword","check","inputCheckPassword","auth","setUser","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","ReferenceDatabase","contexts","links","saveContext","reference","context","getContexts","_context","deepEqual","getReferenceByLink","getContext","values","deleteContext","refreshReference","c","appMessagesManager","reloadMessages","refreshEmojiesSoundsPromise","appStickersManager","getAnimatedEmojiSounds","appProfileManager","getProfile","appEmojiManager","getCustomEmojiDocuments","docId","appAttachMenuBotsManager","getAttachMenuBot","botId","hex","newHex","newContext","makeError","safeReplaceObject","wasObject","newObject","getPeerIdsFromMessage","peerIds","fromId","viaBotId","fwdFromId","media","contactUserId","recentVoters","recent_voters","recentReactions","recent_reactions","reaction","peer_id","action","userIds","users","inviter_id","chatIds","recentRepliers","recent_repliers","reply","defineNotNumerableProperties","props","writable","configurable","out","defineProperties","setDialogIndex","dialog","indexKey","GLOBAL_FOLDER_ID","DialogsStorage","allDialogsLoaded","pinnedOrders","folderId","saveAllDialogsLoaded","resetPinnedOrder","savePinnedOrders","forumTopics","folders","dialogsOffsetDate","dialogsNum","dialogsIndex","cachedResults","query","count","dialogs","onUpdateFolderPeers","update","folder_peers","folderPeer","folder_id","peer","appPeersManager","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","getDialogOnly","handleDialogTogglePinned","onUpdateChannelPinnedTopic","topicId","generateMessageId","topic_id","topic","getForumTopic","getFilterIdForForum","onUpdatePinnedDialogs","order","handleDialogsPinned","dialogsResult","applyDialogs","d","onUpdateChannelPinnedTopics","filterId","limit","getLimit","channel","appChatsManager","getChannelInput","toChatId","offset_date","offset_id","offset_topic","processTopics","topics","after","rootScope","appUsersManager","getSelf","peerText","getPeerSearchText","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","processDialogForFilters","getDialogIndexKeyByFilterId","prepareDialogUnreadCountModifying","chat","getChat","dropDialogOnDeletion","apiUpdatesManager","addMultipleEventsListeners","updateFolderPeers","updateDialogPinned","updateChannelPinnedTopic","updatePinnedDialogs","updateChannelPinnedTopics","appStateManager","appStoragesManager","getCache","_order","getPinnedOrders","setDialogsFromState","bind","appDraftsManager","addMissedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","ignoreOffsetDate","getMessageByPeer","reloadConversation","isDialogsLoaded","setDialogsLoaded","loaded","isForum","isFilterIdForForum","every","orders","isDialogPinned","filtersStorage","getFilter","isPinned","pinnedPeerIds","getOffsetDate","offsetDate","Math","min","sort","a","b","generateFolder","folder","unreadMessagesCount","unreadPeerIds","unreadUnmutedPeerIds","getFolder","forumTopic","getDialogKey","isTopic","getFolderDialogs","skipMigrated","hidden","migratedTo","getNextDialog","currentPeerId","findIndex","getDialogIndexKey","localId","isDialogUnmuted","appNotificationsManager","isPeerLocalMuted","respectType","threadId","getFolderUnreadCount","unreadUnmutedCount","unreadCount","arrays","setDialogIndexInFilter","isRealFolder","testDialogForFilter","pinnedIds","pinnedKey","pinnedIndex","generateDialogIndex","generateDialogPinnedDateByIndex","getDialogIndex","getDialog","verify","skipped","getDialogOrTopic","isObject","date","tsNow","timeManager","getServerTimeOffset","noIndex","filters","getFilters","cmp","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","insertInDescendSortedArray","callbacks","toggle","wasUnreadCount","getDialogUnreadCount","wasUnmuted","newUnreadCount","newUnmuted","addMessagesCount","modifyFolderUnreadCount","toggleDialog","toggleUnmuted","max","dispatchUnreadTimeout","_folder","justReturn","noPinnedOrderUpdate","topDate","generateDialogPinnedDate","channelId","isChannel","draft","dialogKey","unshift","setDialogToState","pts","historyStorage","getHistoryStorage","messagesStorage","getHistoryMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","peersStorage","requestPeersForKey","isAnyChat","newPts","getChannelState","requestPeer","saveGlobalOffset","getForumTopicsCache","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","dropDialogFromFolders","foundDialog","wasPinned","keepLocal","clearDialogFromState","releasePeer","dropDialogWithEvent","dropped","items","forEachReverse","assumeType","saveApiUsers","saveApiChats","chats","messages","updatedDialogs","topMid","topPendingMid","pendingTopMsgs","topPendingMessage","maxId","cache","getUpdateCache","getUpdateAfterReloadKey","updates","newUpdatesAfterReloadToHandle","saveUpdate","canSaveDialogByPeerId","isDialog","wasDialogBefore","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","deleted","isOutgoing","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","notify_settings","addChannelState","releaseUnreadCount","dialogsStorage","processTopicUpdate","oldTopic","isIconChanged","icon_emoji_id","isTitleChanged","title","isChanged","getDialogs","offsetIndex","promises","fillContactsResult","fillContacts","cached","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","d1","d2","offset","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","flushForumTopicsCache","deletedTopics","getTopicPromises","getForumTopicById","getTopicsPromise","ids","fullfillLeft","messagesForumTopics","getForumTopicOrReload","callbackify","processTopicsPromise","getForumUnreadCount","f","reduce","acc","v","newPinned","convertment","PREPENDED_FILTERS","LOCAL_FILTER","flags","exclude_peers","include_peers","pinned_peers","excludePeerIds","includePeerIds","FiltersStorage","filtersArr","reloadedPeerIds","localFilters","generateLocalFilter","clearFilters","onUpdateDialogFilter","saveDialogFilter","findAndSplice","onUpdateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","onUpdateDialogFilterOrder","includes","setLocalId","updateDialogFilter","updateDialogFilters","updateDialogFilterOrder","prependFilters","allChatsFilter","archiveFilter","allChatsFilterIndex","exclude_archived","exclude_unarchived","exclude_read","isDialogUnread","exclude_muted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","toUserId","isBot","bots","non_contacts","isContact","contacts","testDialogForFilterId","toggleDialogPin","getConfig","pinned_infolder_count_max","getInputPeerById","createDialogFilter","prepend","remove","getOutputDialogFilter","bool","filterIncludedPinnedPeers","peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","invokeApiSingle","getSuggestedDialogsFilters","silent","to","oldFilter","_filter","isFilterIdAvailable","some","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","getOwnPropertyDescriptor","defineProperty","ApiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","subscriptions","processUpdateMessage","updateMessage","processOpts","seq","seqStart","seq_start","forceGetDifference","processUpdate","toId","fwd_from","reply_to","entities","pts_count","override","_constructor","setProxy","self","Proxy","saveUpdatesState","us","popPendingSeqUpdate","nextSeq","pendingUpdatesData","seqAwaiting","ptsAwaiting","clearStatePendingSync","popPendingPtsUpdate","curState","curPts","goodPts","goodIndex","getDifference","processLocalUpdate","wasSyncing","pts_total_limit","qts","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","onDifferenceTooLong","justAName","getChannelDifference","channelState","bindPrefix","lastDifferenceTime","final","lastPtsUpdateTime","fwdHeader","hasUser","post","hasChat","popPts","popSeq","subscribeToChannelUpdates","subscription","cb","interval","unsubscribeFromChannelUpdates","force","clearInterval","attach","langCode","noErrorBox","stateResult","setUpdatesProcessor","strs","en","ru","getChangelog","lang","res","ok","langStr","parseMarkdown","inbox_date","languages","filterUnique","language","AppAvatarsManager","savedAvatarURLs","removeFromAvatarsCache","isAvatarCached","saved","loadAvatar","photo","peerPhotoFileLocation","downloadOptions","dc_id","limitPart","apiFileManager","blob","URL","createObjectURL","AppCallsManager","calls","IS_CALL_SUPPORTED","updatePhoneCall","saveCall","phone_call","updatePhoneCallSignalingData","callId","phone_call_id","computeKey","g_b","p","call","isDiscarded","oldCall","getCall","getCallInput","access_hash","savePhonePhoneCall","phonePhoneCall","generateDh","random_length","dhConfig","requestCall","protocol","g_a_hash","video","getUserInput","random_id","discardCall","duration","connection_id","AppChatsManager","isPeerNeeded","modifyUsernamesCache","onChatUpdated","updateChannelParticipant","clearCache","updateChatDefaultBannedRights","default_banned_rights","getFromCache","apiChats","saveApiChat","oldChat","participants_count","changedUsername","setUsernameToCache","changedPhoto","forum","changedTitle","changedAnyBadge","verified","scam","fake","hasRights","rights","isThread","editChatDefaultBannedRights","banned_rights","until_date","isMegagroup","megagroup","isInChat","good","getInputPeer","getChannelInputPeer","getChatInputPeer","allowMin","getChatString","createChannel","inviteToChannel","input","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","doNotRefresh","refreshChatAfterRequest","editPhoto","inputFile","inputChatPhoto","file","editTitle","editAbout","about","editBanned","participant","getParticipantPeerId","timestamp","actor_id","prev_participant","new_participant","kicked_by","clearChannelParticipantBannedRights","kickFromChannel","view_messages","kickFromChat","resolveChannel","messagesChats","togglePreHistoryHidden","enabled","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","chatFull","getCachedFullChat","available_reactions","getSendAs","invokeApiSingleProcess","processResult","sendAsPeers","importChatInvite","hash","checkUsername","getSponsoredMessage","invokeApiCacheable","cacheSeconds","sponsoredMessages","sponsoredMessage","viewSponsoredMessage","randomId","checkChatInvite","chatInvite","toggleUsername","active","reorderUsernames","deactivateAllUsernames","makeChannelPrivate","getChannels","toggleForum","editForumTopic","iconEmojiId","closed","createForumTopic","iconColor","channelFull","getChannelFull","sendAsInputPeer","default_send_as","icon_color","send_as","updatePinnedForumTopic","wrapUrl","unsafe","matchUrlProtocol","tgMeMatch","telescoPeMatch","tgMatch","onclick","pathname","fullPath","window","I18n","pluralRules","cacheLangPackPromise","setLangCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","timeFormat","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","langSign","countries","strings","formatLocalStrings","default","saveLangPack","from_version","lang_code","local","loadLangPack","web","requestedServerLanguage","lang_pack","polyfillPromise","pushTo","langPack","appVersion","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","document","querySelectorAll","element","weakMap","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","createElement","append","lastIndexOf","wrappedUrl","href","setAttribute","DocumentFragment","firstChild","textContent","arg","pushNextArgument","plain","select","item","Node","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","_Intl","WeakMap","IntlElementBase","classList","property","IntlElement","safeAssign","formatted","dataset","compareAndUpdate","json","DateTimeFormat","hours","getHours","getMinutes","capitalizeFirstLetter","i18n","i18n_","_i18n","months","days","getWeekNumber","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","today","year","day","month","weekday","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","createForMonthYear","dates","selectedYear","currentYear","setFullYear","minDate","setMonth","maxDate","formatterMonthYear","createForDayMonth","validDateForMonth","formatterDayMonth","formatterYearMax","formatWeekLong","getDay","q","safeReplaceArrayInObject","trim","dayOfWeek","setDate","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","g3","parseInt","k1","EXTENSION_MIME_TYPE_MAP","pdf","tgv","tgs","wav","mp3","ogg","jpeg","jpg","png","gif","webp","mp4","webm","mov","svg","MIME_TYPE_EXTENSION_MAP","uploadWallPaperTempId","AppDocsManager","onServiceWorkerFail","docs","doc","supportsStreaming","thumbsStorage","deleteCacheContext","stickerCachedThumbs","uploadingWallPapers","online","saveDoc","oldDoc","file_reference","referenceDatabase","attributes","attribute","file_name","wrapPlainText","voice","mime_type","w","h","round_message","alt","stickerEmojiRaw","stickerSetInput","thumbs","IS_WEBP_SUPPORTED","sticker","IS_WEBM_SUPPORTED","animated","mappedMimeType","joiner","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","getFullDate","isServiceWorkerOnline","getCacheContext","setCacheContextURL","thumb","getDocumentDownloadOptions","getDocumentURL","getDoc","downloadDoc","queueId","onlyCache","downloadMedia","getLottieCachedThumb","toneIndex","saveLottiePreview","width","height","saveWebPConvertedStrippedThumb","stickerThumbConverted","getWallPapers","invokeApiHashable","accountWallpapers","wallPapers","wallpapers","wallPaper","prepareWallPaperUpload","cacheContext","wallpaper","slug","uploadWallPaper","fileName","downloaded","getGifs","gifs","requestDocPart","requestFilePart","getDocumentInputFileLocation","AppDraftsManager","drafts","updateDraftMessage","notify","getKey","getDraft","getAllDrafts","getAllDraftPromise","apiDraft","processApiDraft","isEmptyDraft","reply_to_msg_id","syncDraft","localDraft","saveOnServer","serverDraft","draftsAreEqual","draftObj","getInputEntities","no_webpage","top_msg_id","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","EMOJI_LANG_PACK","keywords","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","recent","getRecentEmojisPromises","getCustomEmojiDocumentPromises","getEmojiKeywords","storageKey","pack","validateInitObject","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","networkerFactory","native","getRecentEmojis","indexEmojis","searchEmojis","emojis","POPULAR_EMOJI","recentEmoji","recentCustomEmoji","pushRecentEmoji","emoji","fixEmoji","docIds","document_id","documents","appDocsManager","getCachedCustomEmojiDocuments","setDebouncedGetCustomEmojiDocuments","getCustomEmojiDocumentsPromise","allIds","getCustomEmojiDocument","getCustomEmojis","getEmojiStickers","AppGroupCallsManager","groupCalls","participants","nextOffsets","updateGroupCall","saveGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","getCachedParticipants","prepareToSavingNextOffset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","saveApiParticipant","skipCounterUpdating","oldParticipant","hasLeft","muted","can_self_unmute","getGroupCall","modified","just_joined","apiParticipants","editParticipant","getGroupCallInput","getInputPeerSelf","volume","raise_hand","raiseHand","video_paused","videoPaused","video_stopped","videoStopped","presentation_paused","presentationPaused","getGroupCallFull","participants_next_offset","shouldUpdate","createGroupCall","scheduleDate","schedule_date","getGroupCallParticipants","sources","groupCallParticipants","next_offset","hangUp","discard","groupCallInput","source","join_as","joinGroupCall","isMuted","joinVideo","leaveGroupCallPresentation","getPhotoInput","getPhotoMediaInput","ttl_seconds","getMediaInput","AppInlineBotsManager","inlineResults","setHash","getGeoInput","geo","lat","long","accuracy_radius","getInlineResults","bot","geo_point","stopTime","botResults","queryId","query_id","appPhotosManager","savePhoto","generateQId","pushPopularBot","getTopPeers","topPeers","botPeerId","topPeer","rating","switchToPM","fromPeerId","startParam","startBot","checkSwitchReturn","getUser","bot_inline_placeholder","peerData","switchInlineQuery","getPeerUsername","callbackButtonClick","button","msg_id","sendInlineResult","queryAndResultIds","inlineResult","queryID","resultID","resultId","send_message","reply_markup","replyMarkup","sendText","inputMedia","messageMedia","caption","sendMessage","geoPoint","address","provider","venue_id","venue_type","phone_number","first_name","last_name","vcard","description","currency","total_amount","shipping_address_requested","start_param","sendOther","AppMessagesIdsManager","tempNum","num","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","partLength","appTabsManager","tabs","start","getTabs","tab","addTab","deleteTab","getDocumentInput","setBooleanFlag","processAfter","UPDATE_STICKERSET_ORDER","AppMessagesManager","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","extendedMedia","maxSeenId","newDialogsToHandle","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","middleware","clean","uploadFilePromises","messagesStorageByPeerId","groupedMessagesStorage","scheduledMessagesStorage","historiesStorage","threadsStorage","searchesStorage","pinnedMessages","threadsServiceMessagesIdsStorage","threadsToReplies","handleNewDialogs","newMaxSeenId","updateMap","processDialog","isDialogDefined","incrementMaxSeenId","handleNotifications","notificationsHandlePromise","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","createMessageStorage","threadKey","getThreadKey","handleNewUpdateAfterReload","threadStorage","reply_to_peer_id","reply_to_mid","receiptMessage","checkPendingMessage","updateMessageRepliesIfNeeded","ignoreExisting","findSlice","firstSlice","forceUserOnline","handleNewMessage","inboxUnread","modifyCachedMentions","setDialogTopMessage","notifyPeer","onUpdateMessageReactions","recentReaction","previousReactions","previousRecentReactions","show_previews","peerReaction","pushBatchUpdate","batchUpdateReactions","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","dispatchEditEvent","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","getReadMaxIdIfUnread","messageThreadId","getMessageThreadId","setCount","threadKeyPart","onUpdateReadMessagesContents","topMsgId","mids","findPeerIdByMids","media_unread","fixDialogUnreadMentionsIfNoMessage","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","getPeerActiveUsernames","onUpdateChannelReload","flushStoragesByPeerId","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","phone","onUpdatePinnedMessages","missingMessages","werePinned","getPinnedMessagesKey","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","isScheduled","onUpdateDeleteScheduledMessages","onUpdateMessageExtendedMedia","extended_media","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","reactionsEqual","chosen_order","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","updateMessageExtendedMedia","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getCachedWebPage","drop","poll","appPollsManager","pollToMessages","batchUpdatesDebounced","debounce","details","maxSeenMsgId","sendEntites","entity","invokeAfterMessageIsSent","tempId","callbackName","finalize","editMessage","is_scheduled","newMedia","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","webPage","getPeerMigratedTo","generateOutgoingMessage","toggleError","onMessagesSendError","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","clear_draft","update_stickersets_order","wrapMessageEntities","beforeMessageSending","sequential","noop","sendFile","attachType","apiFileName","fileType","File","isDocument","Blob","isPhoto","IMAGE_MIME_TYPES_SUPPORTED","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","objectURL","VIDEO_MIME_TYPES_SUPPORTED","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","uploadingFileName","getFileNameForUpload","uploaded","uploadPromise","load","thumbUploadPromise","cancelPendingMessage","setTyping","addNotifyListener","progress","percents","floor","done","total","notifyAll","force_file","isGroupedItem","background","ret","sendAlbum","files","sendFileDetails","groupId","o","invoke","multiMedia","multi_media","inputSingleMedia","inputs","sendContact","contactPeerId","getContactMediaInput","pollId","savePoll","total_voters","getPoll","getPhoto","postAuthor","getPeer","signatures","generateFromId","post_author","generateFlags","generateReplyHeader","via_bot_id","replies","generateReplies","replyToTopId","forum_topic","reply_to_top_id","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","originalMessage","isUserHidden","from_name","userFull","getCachedFullUser","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","generateFakeAvatarMessage","Number","MAX_SAFE_INTEGER","getUploadPromise","uploadFileName","admin_rights","anonymous","pendingData","fillConversations","chatHistoryStorage","_promise","offset_peer","offsetPeerId","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","folderDialogs","dialogsLength","slicedDialogs","forwardMessages","config","overflowMids","forwarded_count_max","dropCaptions","dropAuthor","newMids","newMessages","replyToMid","replyToMessageIdx","newReplyToMid","getStickerEffectThumb","nopremium","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","getMessagesStorageByKey","s","getMessagesStorage","getMessageById","cantForwardDeleteMids","cantForward","cantDelete","canForward","canDeleteMessage","reloadConversationOrTopic","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","currentState","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","getTypingKey","startsWith","ss","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","getPinnedMessagesCount","getPinnedMessagesMaxId","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","getGroupsFirstMessage","minMid","getMidsByAlbum","groupedId","getMessagesByAlbum","getMidsByMessage","filterMessages","appMessagesIdsManager","saveMessage","isMessage","replyTo","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","mediaContext","unsupported","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","appWebDocsManager","saveWebDocument","extendedMediaMedia","totalEntities","migrateFrom","migrateTo","video_sizes","appGroupCallsManager","migrateChecks","getFirstMessageToEdit","goodMessage","myPeerId","canEditMessage","apiEntities","myEntities","parseEntities","mergeEntities","reportMessages","editPeerFolders","getDialogPeer","markDialogUnread","read","fromChat","canMessageBeEdited","kind","goodMedias","edit_time_limit","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","getSearchStorage","getSearchCounters","canCache","isPeerRestricted","func","filterMessagesByInputFilterFromStorage","_storage","filterMessagesByInputFilter","nextRate","backLimit","offset_id_offset","next_rate","foundMsgs","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","subscribeRepliesThread","getDiscussionMessage","generateThreadServiceStartMessage","maxMessageId","serviceStartMessage","is_single","getThreadServiceMessageId","getMessageWithReplies","newMaxId","unsetEnd","newDialogsHandlePromise","deleteMessages","localMessageIds","creator","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","getPeerString","readAllHistory","getUnreadMentionsKey","slicedArray","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","getHistoryStorageTransferable","historySerialized","toJSON","inputNotifyPeer","getInputNotifyPeerById","ignorePeerId","getNotifyPeerTypeSettings","getNotifySettings","isMessageIsTopMessage","threadMessage","broadcastEventName","pendingMessage","finalizePendingMessage","mutePeer","validatePeerSettings","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","canSendToUser","finalMessage","tempMessage","finalizePendingMessageCallbacks","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","thumbSize","polls","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","readPeerId","reactionsCount","readParticipants","appConfig","getAppConfig","chat_read_mark_size_threshold","chat_read_mark_expire_period","incrementMessageViews","increment","chatPeerIds","idleStartTime","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithCommentReplies","isFetchIntervalNeeded","getNewHistory","isBottomEnd","getEnds","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","isHistoryResultEnd","topWasMeantToLoad","wasMaxId","requestHistory","deleteSlice","oldestMessage","foundSlice","_historyResult","fetchSingleMessages","fetchSingleMessagesPromise","requestPromises","getMessagesResult","getExtendedMedia","toRequest","fetchMessageReplyTo","replyToPeerId","typing","smth","deleteWebPageFromPending","updatePollToMessage","groupedStorage","albums","dispatchAlbumEdit","deletedMids","noforwards","noForwards","getElementCallback","newMap","peerIdStr","saveDefaultSendAs","convertInputKeyToKey","inputKey","AppNotificationsManager","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","notifyForumTopic","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","typeKey","checkMuteUntilThrottled","throttle","isPeerType","notifySettings","getNotifyPeerTypePromise","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","getPeerKey","getPeerMuted","getPeerLocalSettings","n","peerKey","typeNotifySettings","AppPeersManager","canPinMessage","getPeerPhoto","getUserString","getRestrictionReasonText","restriction_reason","getUserInputPeer","getUserSearchText","getDialogType","getDeleteButtonText","AppPhotosManager","photos","oldPhoto","Infinity","getUserPhotos","inputUser","photosResult","photoIds","photoId","AppPollsManager","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","chosen","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","newPoll","AppPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","privacyRules","inputRule","rule","getPrivacy","privacyKey","getGlobalPrivacySettings","setGlobalPrivacySettings","PEER_FULL_TTL","AppProfileManager","usersFull","chatsFull","fullExpiration","onUpdateUserTyping","getTypingsKey","typingsInPeer","t","cancelAction","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","updateChatParticipantAdd","_participants","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","usersUserFull","full_user","profile_photo","botInfo","bot_info","referenceContext","description_document","description_photo","getProfileByPeerId","getCachedProfileByPeerId","getFullPhoto","profile","full_chat","getChatInviteLink","exported_invite","link","exportedInvite","getChannelParticipants","broadcast","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","processUserIds","ratingMap","cP","updateProfile","saveApiUser","uploadProfilePhoto","updateResult","strippedThumb","stripped_thumb","deletePhotos","deletedList","verifyParticipantForOnlineCount","reduceParticipantsForOnlineCount","getOnlines","chatInfo","channelParticipants","onlines","getPeerTypings","callbackifyAll","SAVE_DOC_KEYS","REFERENCE_CONTEXT","AppReactionsManager","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","getActiveAvailableReactions","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","chatAvailableReactions","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsByMessage","isReactionActive","reactions_default","getReactionCached","getReaction","getMessagesReactions","setDefaultReaction","sendReaction","lastSendingTimeKey","unsetReactionCount","canSeeList","can_see_list","chosenReactions","unsetReactions","chosenReactionIdx","chosenReactionCount","chosenReactionsLength","reactionCountIdx","id1","id2","promiseKey","editMessageUpdateIdx","editMessageUpdate","LOCAL_IDS","EMOJI","EMOJI_ANIMATIONS","PREMIUM_GIFTS","GENERIC_ANIMATIONS","DEFAULT_STATUSES","DEFAULT_TOPIC_ICONS","LOCAL_IDS_SET","AppStickersManager","processAllStickersResult","allStickers","sets","stickerSet","videos","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","getGreetingStickersPromise","getGreetingStickersTimeout","getGreetingSticker","onStickersUpdated","updateNewStickerSet","saveStickerSet","updateRecentStickers","updateFavedStickers","updateMoveStickerSetToTop","stickers","getFavedStickersStickers","getRecentStickersStickers","justPreload","getStickersByEmoticon","greetingStickers","random","saveStickers","canUseStickerSetCache","useCache","refreshTime","getStickerSet","cachedSet","getStickerSetInput","saveById","getLocalStickerSet","animations","getAnimatedEmojiSoundsPromise","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","getRecentStickers","recentStickers","saveRecentSticker","unsave","_doc","docEmoticon","faved","cleanEmoji","getAnimatedEmojiSticker","isAnimation","packs","getAnimatedEmojiSoundDocument","preloadAnimatedEmojiSticker","preloadEmojiPromise","preloadAnimatedEmojiStickerAnimation","animation","preloadSticker","isPremiumEffect","video_thumbs","newSet","setToCache","needSave","installed_date","getStickerSetThumbDownloadOptions","thumb_dc_id","isAnimated","mimeType","getFeaturedStickers","covered","getPromoPremiumStickers","getPremiumStickers","getFavedStickers","favedStickers","getFavedStickersLimit","faveSticker","unfave","toggleStickerSet","archived","toggleStickerSets","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cover","getAllStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","clearRecentStickers","AppUsersManager","usernames","getTopPeersPromises","contactsIndex","createSearchIndex","contactsFillPromise","contactsList","updatedContactsList","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","expires","was_online","setUserToStateIfNeeded","updateUserName","contactsListCachedTime","contact","mutual_contact","pushContact","recentSearch","onContactsModified","fromServer","pushRecentSearch","clearRecentSearch","resolveUsername","resolvedPeer","processResolvedPeer","resolvePhone","popContact","getContacts","includeSaved","sortBy","_contactsList","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","testSelfSearch","getContactsPeerIds","toggleBlock","block","apiUsers","cleanedUsernames","cleanUsername","searchUsername","oldPeer","oldUser","fullName","wasContact","newContact","onContactUpdated","checkPremium","isUserOnlineVisible","getUserStatus","isRegularUser","getUserPhone","isAnonymous","fragment_prefixes","prefix","isAttachMenuBot","bot_attach_menu","support","isNonContactUser","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","categories","getBlocked","contactsBlocked","getLocated","self_expires","searchContacts","my_results","curIsContact","setUserStatus","offline","updateMyOnlineStatus","addContact","addPhonePrivacyException","add_phone_privacy_exception","deleteContacts","photoTypeSet","AppWebPagesManager","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","pendingSet","getWebPage","readBlobAsArrayBuffer","readBlobAs","fileNameRFC","escape","DownloadWriter","serviceMessagePort","getServiceMessagePort","write","chunk","saveToStorage","DownloadStorage","getFile","prepareWriting","headers","cancel","getWriter","MIN_PART_SIZE","IGNORE_ERRORS","ApiFileManager","cacheStorage","downloadStorage","downloadPromises","uploadPromises","downloadPulls","downloadActives","refreshReferencePromises","maxUploadParts","maxDownloadParts","uncompressTGS","uncompressTGV","svgIndex","__","fixFirefoxSvg","TextEncoder","convertWebp","convertOpus","webFileDcId","webfile_dc_id","upload_max_fileparts_premium","upload_max_fileparts_default","downloadRequest","activeDelta","downloadPull","downloadCheck","downloadLimit","setQueueId","getFileStorage","cancelDownload","canceled","requestWebFilePart","checkCancel","fileDownload","getDelta","checkedReference","getLimitPart","isUpload","maxParts","maxPartSize","inputFileLocation","isDownloading","getDownload","getUpload","getConvertMethod","IS_OPUS_SUPPORTED","allocateDeferredPromises","startOffset","delayed","writeDeferred","writePromise","originalMimeType","convertMethod","getDownloadFileNameFromOptions","cacheFileName","errorHandler","prepared","cachePrepared","downloadPrepared","possibleSize","_errorHandler","writer","truncate","downloadFileName","readBlobAsUint8Array","isWebFile","requestPart","dispatchProgress","throttledDispatchProgress","superpuper","isFinal","getParts","replaceParts","processedResult","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","fileSize","isBigFile","partSize","totalParts","fileId","resultInputFile","parts","md5_checksum","resolved","it","_part","doneParts","file_id","file_part","file_total_parts","fileUpload","generator","ApiManagerMethods","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","afterMessageIdTemp","setUserAuth","prepareTempMessageId","queryJSON","newResult","cacheKey","oldPromise","getNewPromise","newPromise","ignore_restriction_reasons","pin","folderPin","bio","topicPin","ApiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","baseDcId","afterMessageTempIds","changeTransportType","updateConfig","iterateNetworkers","getTransportType","connections","dcs","array","oldTransportType","oldObject","oldGetKey","newGetKey","info","changeNetworkerTransport","getBaseDcId","sessionStorage","setBaseDcId","userAuth","dcID","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","dc","logOut","loggingOut","storageKeys","storageResult","logoutPromises","ignoreErrors","toggleStorages","generateNetworkerGetKey","networkers","maxNetworkers","found","isOnline","ak","authKeyHex","serverSaltHex","authKey","bytesFromHex","authKeyId","serverSalt","authorizer","_error","newTransportType","removeTransport","stack","getNetworkerVoid","oldTransport","changeTransport","onNetworkerDrain","onDrain","removeNetworker","isFileNetworker","canRelease","setDrainTimeout","updatesProcessor","cachedNetworker","startTime","isStopped","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","unsetConnectionInited","rawError","waitTime","floodMaxTimeout","attachPromise","originalError","PeersStorage","neededPeers","singlePeerMap","thumbFullSize","ThumbsStorage","thumbsCache","intToUint","ulongFromInts","high","low","shiftLeft","safeBigInt","ulongBigInt","pow","longBigInt","divide","bigIntFromBytes","base","boolFalse","predicate","boolTrue","vector","gzipPacked","TLSerialization","mtproto","startMaxLength","createBuffer","ArrayBuffer","intView","Int32Array","byteView","getArray","resultBuffer","resultInt32","subarray","getBuffer","getBytes","typed","resultArray","getOffset","checkLength","needBytes","previousBuffer","previousArray","writeInt","field","storeInt","storeBool","storeLongP","iHigh","iLow","storeLong","sLong","storeIntBytes","_bigInt","bigInt","isNegative","quotient","remainder","divmod","toJSNumber","storeDouble","Float64Array","storeString","sUTF8","unescape","storeBytes","bits","storeRawBytes","storeMethod","methodName","methodData","methods","m","flagsOffsets","param","condType","fieldBit","storeObject","paramName","itemType","schema","isBare","constructorData","TLDeserialization","readInt","fetchInt","fetchDouble","doubleView","fetchLong","ulong","greater","minus","greaterOrEquals","abs","fetchBool","fetchObject","fetchString","String","fromCharCode","decodeURIComponent","fetchBytes","fetchIntBytes","fetchRawBytes","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","setOffset","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","bufferConcats","delays","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","networkerTempId","MTPNetworker","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResendReq","nextReq","checkConnectionPeriod","lastResponseTime","activeRequests","sendPingDelayDisconnect","pingDelayDisconnectDeferred","lastPingTime","disconnectDelay","round","timeoutTime","lastPingStartTime","pingId","lastPingDelayDisconnectId","wrapMtpCall","ping_id","disconnect_delay","rejectTimeout","elapsedTime","checkLongPoll","isClean","longPollPending","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingMessage","generateId","seq_no","generateSeqNo","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","convertToUint8Array","isFileUpload","isFileDownload","updateSession","seqNo","prevSessionId","updateSentMessage","sentMessageId","sentMessage","container","inner","innerSentMessageId","innerSentMessage","pushMessage","wrapMtpMessage","connectionInited","invokeWithLayer","initConnection","resultType","isAPI","nextReqTimeout","longPollInterval","clearPingDelayDisconnect","forceReconnectTimeout","sendingLongPoll","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","handleSentEncryptedRequestHTTP","noResponseMsgs","sqrt","pushResend","shouldResolve","onDrainTimeout","willChange","onConnectionStatusChange","innerMsgId","acked","getMsgKey","dataWithPadding","x","msgKeyLargePlain","msgKeyLarge","getAesKeyIv","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","performScheduledRequest","ackMsgIds","msg_ids","pendingResendReqLength","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","compare","messageByteLength","generateContainerMessage","messageWithBody","innerMessages","getEncryptedMessage","keyIv","getDecryptedMessage","encryptedData","getEncryptedOutput","dataBuffer","paddingLength","encryptedResult","requestData","baseError","responseBuffer","deserializer","bytesCmp","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","mt_rpc_result","req_msg_id","applyServerSalt","newServerSalt","toArray","ackMessage","reqResend","notEmpty","processMessageAck","error_message","error_code","msg","applyServerTime","serverTime","shiftRight","innerMessage","new_server_salt","bad_msg_id","changedTimeOffset","badMessage","first_msg_id","server_salt","answer_msg_id","lastResendReq","lastResend","pendingResend","reqMsgId","badMsgId","pos","NetworkerFactory","startAll","stoppedNetworkers","stopAll","setLanguage","testPublicKeysHex","modulus","exponent","publisKeysHex","publicKeysParsed","preparePromise","prepare","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","fingerprintHex","fill","foundKey","fingerprint","bytesXor","bytes1","bytes2","Authorizer","sendPlainRequest","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","sendReqPQ","nonce","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","publicKey","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","newNonceHash","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","localTime","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","g","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","subtract","twoPow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","_try","TimeManager","lastMessageId","timeOffset","timeTicks","newTimeOffset","changed","server_time_offset","AppWebDocsManager","webDocument","AppPaymentsManager","getInputInvoiceBySlug","getInputInvoiceByPeerId","getPaymentForm","invoice","paymentForm","getPaymentReceipt","validateRequestedInfo","sendPaymentForm","formId","requestedInfoId","shippingOptionId","credentials","tipAmount","form_id","requested_info_id","shipping_option_id","tip_amount","clearSavedInfo","AppAttachMenuBotsManager","attachMenuBots","attachMenuBotsArr","onUpdateAttachMenuBots","getAttachMenuBots","updateAttachMenuBots","saveAttachMenuBot","attachMenuBot","bot_id","icon","getAttachMenuBotIcon","saveAttachMenuBots","getAttachMenuBotCached","requestWebView","fromBotMenu","themeParams","from_bot_menu","theme_params","prolongWebView","appManagersManager","cryptoWorkersURLs","cryptoPortsAttached","cryptoPortPromise","getManagers","manager","apply","ports","originalUrl","newURLs","createManagers","appAvatarsManager","appCallsManager","appPrivacyManager","appInlineBotsManager","passwordManager","appPaymentsManager","_serviceMessagePort","_isServiceWorkerOnline","pushedKeys","clearWrite","invokeExceptSource","serviceWorkerOnline","serviceWorkerPort","detachPort","attachPort","messagePort","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","START_LOCAL_ID","ALPHA_CHARS_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","encodeEmoji","emojiText","unicodeSurrogates","points","char","previous","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","getter","__esModule","definition","enumerable","chunkId","miniCssF","globalThis","Function","prop","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","src","scripts","getElementsByTagName","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.b6bdf87282369207cefc.chunk.js b/public/mtproto.worker.b6bdf87282369207cefc.chunk.js deleted file mode 100644 index c7817c25..00000000 --- a/public/mtproto.worker.b6bdf87282369207cefc.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,a,s,n,i,r={3447:(e,t,a)=>{a.d(t,{Z:()=>i});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const i=n},4762:(e,t,a)=>{a.d(t,{IS_FIREFOX:()=>r,IS_SAFARI:()=>i});var s=a(6761);const n=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&s.Z.MSStream,!!("safari"in s.Z)||!(!n||!(/\b(iPad|iPhone|iPod)\b/.test(n)||n.match("Safari")&&!n.match("Chrome")))),r=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},467:(e,t,a)=>{a.d(t,{ZP:()=>o,gV:()=>p});var s=a(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,i=/^\s+|\s$/g,r={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function o(e,t=!0){return p(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function p(e,t={}){const a=t.includeTag&&"%"===e.charAt(0),o=e;return t.clearBadChars&&(e=function(e){return e.replace(n,"").replace(i,"")}(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),a&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=r[e];return null!=t?t:e}))}(o)),e}},8801:(e,t,a)=>{a.d(t,{P:()=>n,q:()=>i});const s="_";function n(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(a?"."+a:a)}function i(e,t){return e+"/"+encodeURIComponent(JSON.stringify(t))}},6666:(e,t,a)=>{a.d(t,{C:()=>o,Z:()=>p});var s=a(1267),n=a(5471),i=a(5953),r=a(5003);class o{constructor(e){(0,i.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),o.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var a;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const a of t.indexes)e.indexNames.contains(a.indexName)||e.createIndex(a.indexName,a.keyPath,a.objectParameters)};try{var a=indexedDB.open(this.name,this.version);if(!a)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||a.onerror((0,n.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,n)=>{a.onsuccess=t=>{s=!0;const i=a.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},a.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},a.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const a=e.target,n=a.result;this.stores.forEach((e=>{if(n.objectStoreNames.contains(e.name)){const s=a.transaction.objectStore(e.name);t(s,e)}else((e,a)=>{const s=e.createObjectStore(a.name);t(s,a)})(n,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new o(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())}))}}o.INSTANCES=[];class p{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=o.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,a){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(a=>e.map(((e,s)=>a.put(t[s],e)))),"",a)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,a,s=this.storeName){let n;return a&&(n=performance.now(),this.log(a+": start")),this.idb.openDatabase().then((i=>new Promise(((r,o)=>{const p=i.transaction([s],e),d=()=>{clearTimeout(l),o(p.error)},f=()=>{clearTimeout(l),a&&this.log(a+": end",performance.now()-n);const e=h.map((e=>e.result));r(g?e:e[0])};p.onerror=d;const c="readwrite"===e;c&&(p.oncomplete=()=>f());const l=setTimeout((()=>{this.log.error("transaction not finished",p,a)}),1e4),m=t(p.objectStore(s)),g=Array.isArray(m),h=g?m:[].concat(m);if(c)return;const u=h.length;let y=u;const _=()=>{p.error||--y||f()};for(let e=0;ee.getAll()),"",e)}}},4098:(e,t,a)=>{a.d(t,{r:()=>qs,H:()=>Zs}),a(690),a(4110);var s=a(8630);let n;function i(){return n}function r(e){return n=e}var o=a(1507),p=a(3241),d=a(410),f=a(3206),c=a(1352);class l extends p.Z{constructor(){super(),this.myId=o.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle",(e=>{this.premium=e})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),f.Z.getInstance().invokeVoid("event",{name:e,args:t})},c.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const m=new l;d.GO.rootScope=m;const g=m;var h=a(7922),u=a(9750);const y=new class{constructor(){this.state={},this.storage=h.Z}getState(){return Promise.resolve(this.state)}setByKey(e,t){!function(e,t,a){const s=t.split(".");(0,u.Z)(e,s.slice(0,-1).join("."))[s.pop()]=a}(this.state,e,t);const a=e.split(".")[0];"settings"===a&&g.dispatchEvent("settings_updated",{key:e,value:t,settings:this.state.settings}),this.pushToState(a,this.state[a])}pushToState(e,t,a=!0,s){a&&(this.state[e]=t),this.setKeyValueToStorage(e,t,s)}setKeyValueToStorage(e,t=this.state[e],a){f.Z.getInstance().invokeVoid("mirror",{name:"state",key:e,value:t}),this.storage.set({[e]:t},a)}};var _=a(4159),v=a(3725),b=a(5418),P=a(1267),M=a(1655),S=a(5003);class I{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=P.Z.debug&&!1;let s=S.v9.Error|S.v9.Log;this.debug&&(s|=S.v9.Debug),this.log=(0,S.kg)(`HTTP-${e}`+a,s),this.log("constructor"),this.connected=!1}_send(e,t){const a=e.length;return this.debug&&this.log.debug("-> body length to send:",a),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,Z.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach((e=>e.reject())),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise(((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})}));return this.releasePending(),t}}releasePending(){return e=this,t=void 0,s=function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=e=>{this.log("closed",e),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let s=S.v9.Error|S.v9.Log;return this.debug&&(s|=S.v9.Debug),this.log=(0,S.kg)(`WS-${e}`+a,s),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}function w(e){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(e),e}var k=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class A{constructor(){this._process=(e,t)=>s.Z.invokeCryptoNew({method:"aes-ctr-process",args:[{id:this.id,data:e,operation:t}],transfer:[e.buffer]})}init(e){return k(this,void 0,void 0,(function*(){void 0!==this.idPromise&&this.release();const t=new Uint8Array(64);for(w(t);;){const e=t[3]<<24|t[2]<<16|t[1]<<8|t[0],a=t[7]<<24|t[6]<<16|t[5]<<8|t[4];if(239!==t[0]&&1145128264!==e&&1414745936!==e&&542393671!==e&&1230262351!==e&&4008636142!==e&&3722304989!==e&&0!==a)break;w(t)}const a=t.slice().reverse(),n=t.slice(8,40),i=t.slice(40,56),r=a.slice(8,40),o=a.slice(40,56),p=this.idPromise=s.Z.invokeCrypto("aes-ctr-prepare",{encKey:n,encIv:i,decKey:r,decIv:o});this.process=(e,t)=>k(this,void 0,void 0,(function*(){return yield p,this._process(e,t)})),this.id=yield p,this.process=this._process,t.set(e.obfuscateTag,56);const d=yield this.encode(t.slice());return t.set(d.slice(56,64),56),t}))}encode(e){return this.process(e,"encrypt")}decode(e){return this.process(e,"decrypt")}release(){return k(this,void 0,void 0,(function*(){const e=this.idPromise;if(void 0===e)return;this.id=void 0,this.idPromise=void 0;const t=yield e;s.Z.invokeCrypto("aes-ctr-destroy",t)}))}destroy(){this.release()}}const D=new class{constructor(){this.tag=239,this.obfuscateTag=new Uint8Array([this.tag,this.tag,this.tag,this.tag])}encodePacket(e){const t=e.byteLength>>2;let a;return a=t<127?new Uint8Array([t]):new Uint8Array([127,255&t,t>>8&255,t>>16&255]),a.concat(e)}readPacket(e){let t=e[0];return t>=127?(t=e[1]|e[2]<<8|e[3]<<16,e.slice(4,t<<3)):e.slice(1,t<<3)}};var U=a(9174);function E(e){const t=e.length,a=new Array(t);for(let s=0;sT(this,void 0,void 0,(function*(){this.connected=!0,Z.setTransportOpened("websocket");const e=yield this.obfuscation.init(this.codec);this.connected&&(this.connection.send(e),this.networker&&(this.pending.length=0,this.networker.setConnectionStatus(U.Q.Connected),this.networker.cleanupSent(),this.networker.resend()),setTimeout((()=>{this.releasePending()}),0))})),this.onMessage=e=>T(this,void 0,void 0,(function*(){let t=yield this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then((e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}})).catch((e=>{this.log.error("handleMessage networker parseResponse error",e)}));const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",E(t))})),this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),s=a-this.lastCloseTime;e=!isNaN(s)&&s{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(U.Q.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=S.v9.Error|S.v9.Log;this.debug&&(i|=S.v9.Debug),this.log=(0,S.kg)(`TCP-${t}`+s,i),this.log("constructor"),this.connect()}clear(){this.connected&&Z.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.obfuscation&&this.obfuscation.destroy(),this.pending.forEach((e=>{e.reject&&e.reject()})),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",(()=>{e.removeEventListener("message",this.onMessage)}),{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}changeUrl(e){this.url!==e&&(this.url=e,this.forceReconnect())}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=void 0;if(!this.networker){const a=new Promise(((a,s)=>{this.pending.push({resolve:a,reject:s,body:e,encoded:t})}));return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){var e;return T(this,void 0,void 0,(function*(){if(!this.connected||this.releasingPending)return;this.releasingPending=!0;let t=this.pending.length,a=!1;for(let s=0;s body length to send:",i.length);const r=null!==(e=n.encoded)&&void 0!==e?e:n.encoded=yield this.encodeBody(i);if(!this.connected)break;this.connection.send(r),n.resolve?n.bodySent=!0:(this.pending.splice(s--,1),t--),a=!0}}this.releasingPending=void 0,this.pending.length&&a&&this.releasePending()}))}}const x=P.Z.test?"_test":"";function B(e){return"client"===e?"":"-1"}function V(e,t,a){const s=B(t),n="client"!==t?"apiws"+x+(a?"_premium":""):"apiws"+x;return`wss://${_.Z.suffix.toLowerCase()}ws${e}${s}.web.telegram.org/${n}`}class L{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=P.Z.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const s=V(e,t,a);let n;return n=C,new F(n,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let s;if(P.Z.ssl||!P.Z.http){const a=B(t);s="https://"+(this.sslSubdomains[e-1]+a)+".web.telegram.org/"+(P.Z.test?"apiw_test1":"apiw1")}else for(const t of this.dcOptions)if(t.id===e){s="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new I(e,s,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=P.Z.transport,s=!0,n){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const i=this.chosenServers[a][t];e in i||(i[e]=[]);const r=i[e];if(!r.length||!s){let i;return i=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,n),i?(s&&r.push(i),i):(console.error("No chosenServer!",e),null)}return r[0]}static removeTransport(e,t){for(const a in e)for(const s in e[a])for(const n in e[a][s]){const i=e[a][s][n];(0,M.Z)(i,t)}}}var O=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class N extends p.Z{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",(e=>{e.get("websocket")||this.waitForWebSocket()}))}pingTransports(){var e;return O(this,void 0,void 0,(function*(){const t=null!==(e=this.dcConfigurator)&&void 0!==e?e:this.dcConfigurator=new L,a=this.transports={https:t.chooseServer(_.Z.baseDcId,"client","https",!1),websocket:t.chooseServer(_.Z.baseDcId,"client","websocket",!1)},s=(0,v.Z)();this.transports.https._send(new Uint8Array,"no-cors").then((()=>s.resolve(!0)),(()=>s.resolve(!1))),setTimeout((()=>s.resolve(!1)),2e3);const n=(0,v.Z)(),i=a.websocket;i.setAutoReconnect(!1),i.connection.addEventListener("close",(()=>n.resolve(!1)),{once:!0}),i.connection.addEventListener("open",(()=>n.resolve(!0)),{once:!0}),setTimeout((()=>{n.isFulfilled||n.isRejected||(i.connection&&i.connection.close(),n.resolve(!1))}),2e3);const[r,o]=yield Promise.all([s,n]);for(const e in a)a[e].destroy();return{https:r||this.opened.get("https")>0,websocket:o||this.opened.get("websocket")>0}}))}waitForWebSocket(){return O(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield(0,b.Z)(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}}const Z=new N,q=(0,v.Z)();var j=a(6654);class G{setManagers(e){Object.assign(this,e)}}var H=a(3127),W=a(3989),z=a(5466);let K;function J(e){return null!=K?K:K=function(e){return t=this,a=void 0,n=function*(){const t=(0,z.$)((0,S.kg)("STORAGES-LOADER")),a=Object.keys(e),s=a.map((a=>{const s=e[a].getAll();return t(s,"storage "+a)})),n={},i=yield Promise.all(s);for(let e=0,t=a.length;e({storage:this.storages[e],results:t[e]})))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}class $ extends G{getState(){return this.apiManager.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let a,s;const n={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};a=e.currentPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const i=t.new_algo,r=new Uint8Array(i.salt1.length+32);return w(r),r.set(i.salt1,0),i.salt1=r,s=e.newPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([a,s]).then((e=>(n.password=e[0],n.new_settings.new_algo=i,n.new_settings.new_password_hash=e[1],this.apiManager.invokeApi("account.updatePasswordSettings",n))))}))}getInputCheckPassword(e,t){return this.cryptoWorker.invokeCrypto("computeSRP",e,t,!1)}check(e,t,a={}){return this.getInputCheckPassword(e,t).then((e=>this.apiManager.invokeApi("auth.checkPassword",{password:e},a).then((e=>("auth.authorization"===e._&&this.apiManager.setUser(e.user),e)))))}confirmPasswordEmail(e){return this.apiManager.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return this.apiManager.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return this.apiManager.invokeApi("account.cancelPasswordEmail")}}var Y=a(6848),X=a(5471);class ee extends G{constructor(){super(...arguments),this.contexts=new Map,this.links={},this.log=(0,S.kg)("RD",void 0,!0)}saveContext(e,t,a){[a,e]=this.getContexts(e),a||(a=new Set,this.contexts.set(e,a)),this.links[E(e)]=e;for(const e of a)if((0,Y.Z)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[E(e)]}getContexts(e){return[this.contexts.get(e)||(e=this.getReferenceByLink(e)||e,this.contexts.get(e)),e]}getContext(e){const t=this.getContexts(e);return t[0]?[t[0].values().next().value,t[1]]:void 0}deleteContext(e,t,a){if([a,e]=this.getContexts(e),a)for(const s of a)if((0,Y.Z)(s,t))return a.delete(s),a.size||(this.contexts.delete(e),delete this.links[E(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const a=this.getContext(e);if(!a)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=a}let a;switch(null==t?void 0:t.type){case"message":a=this.appMessagesManager.reloadMessages(t.peerId,t.messageId,!0);break;case"emojiesSounds":a=this.refreshEmojiesSoundsPromise||this.appStickersManager.getAnimatedEmojiSounds(!0).then((()=>{this.refreshEmojiesSoundsPromise=void 0}));break;case"userFull":a=Promise.resolve(this.appProfileManager.getProfile(t.userId,!0));break;case"customEmoji":a=this.appEmojiManager.getCustomEmojiDocuments([t.docId]);default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const s=E(e);return this.log("refreshReference: refreshing reference:",s),a.then((()=>{const a=E(e);if(this.log("refreshReference: refreshed, reference before:",s,"after:",a),s!==a)return e;this.deleteContext(e,t);const n=this.getContext(e);if(n)return this.refreshReference(e,n[0]);throw this.log.error("refreshReference: no new context, reference before:",s,"after:",a,t),(0,X.Z)("NO_NEW_CONTEXT")}))}}var te=a(7298),ae=a(5082),se=a(252),ne=a(7625),ie=a(6519);function re(e,t){if(!e)return t;for(var a in e)t.hasOwnProperty(a)||delete e[a];for(var a in t)e[a]=t[a];return e}var oe=a(2790),pe=a(3781),de=a(3385),fe=a(5880),ce=a(8050),le=a(2946);function me(e){var t,a;const s=[e.fromId,e.viaBotId,e.fwdFromId],n=e.media;if(n){const e=n.user_id;void 0!==e&&s.push(e.toPeerId());const t=n.results,a=null==t?void 0:t.recent_voters;(null==a?void 0:a.length)&&s.push(...a.map((e=>e.toPeerId())))}const i=null===(t=e.reactions)||void 0===t?void 0:t.recent_reactions;(null==i?void 0:i.length)&&s.push(...i.map((e=>(0,le.Z)(e.peer_id))));const r=e.action;if(r){const e=[...r.users||[],r.user_id,r.inviter_id];s.push(...e.filter(Boolean).map((e=>e.toPeerId())));const t=[r.channel_id,r.chat_id];s.push(...t.filter(Boolean).map((e=>e.toPeerId(!0))))}const o=null===(a=e.replies)||void 0===a?void 0:a.recent_repliers;return(null==o?void 0:o.length)&&s.push(...o.map((e=>(0,le.Z)(e)))),new Set(s.filter(Boolean))}function ge(e,t){const a={writable:!0,configurable:!0},s={};t.forEach((t=>{e.hasOwnProperty(t)||(s[t]=a)})),Object.defineProperties(e,s)}function he(e,t,a){return e[t]=a}const ue=void 0;class ye extends G{constructor(){super(...arguments),this.folders={},this.clear=(e=!1)=>{if(e){this.allDialogsLoaded={},this.pinnedOrders={};for(const e of o.DZ)this.pinnedOrders[e]=[]}else{this.storage.clear(),this.setDialogsLoaded(o.J$,!1),this.setDialogsLoaded(o.Zi,!1),this.setDialogsLoaded(ue,!1);for(const e of o.DZ)this.resetPinnedOrder(e);this.savePinnedOrders()}this.folders={},this.dialogsOffsetDate={},this.dialogsNum=0,this.dialogsIndex=new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0}),this.cachedResults={query:"",count:0,dialogs:[],folderId:0}},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach((e=>{var t;const{folder_id:a,peer:s}=e,n=this.appPeersManager.getPeerId(s),i=this.dropDialog(n)[0];i&&((null===(t=i.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(i,a),i.folder_id=a,this.generateIndexForDialog(i),this.pushDialog(i)),this.appMessagesManager.scheduleHandleNewDialogs(n,i)}))},this.onUpdateDialogPinned=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$,s=this.appPeersManager.getPeerId(e.peer.peer),n=this.getDialogOnly(s);n&&(e.pFlags.pinned?n.pFlags.pinned=!0:this.handleDialogUnpinning(n,a),this.generateIndexForDialog(n)),this.appMessagesManager.scheduleHandleNewDialogs(s,n)},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$,s=e=>{this.resetPinnedOrder(a),this.pinnedOrders[a].push(...e),this.savePinnedOrders(),e.reverse(),e.forEach((e=>{n[e]=!0;const t=this.getDialogOnly(e);this.appMessagesManager.scheduleHandleNewDialogs(e,t),t&&(t.pFlags.pinned=!0,this.generateIndexForDialog(t))}));const t=this.getFolderDialogs(a,!1);for(const e of t){if(!e.pFlags.pinned)break;const t=e.peerId;n[t]||this.appMessagesManager.scheduleHandleNewDialogs(t)}},n={};e.order?s(e.order.map((e=>this.appPeersManager.getPeerId(e.peer)))):this.apiManager.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then((e=>{this.applyDialogs(e),s(e.dialogs.map((e=>e.peerId)))}))}}after(){this.clear(!0),this.rootScope.addEventListener("language_change",(()=>{const e=this.appUsersManager.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=this.appPeersManager.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}}));const e=e=>{const t=this.getCachedDialogs(!1);for(let a=0;a{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),a=this.getDialogIndexKeyByFilterId(e.id);for(let e=0;e{this.processDialogForFilters(e),this.prepareDialogUnreadCountModifying(e)()})),this.rootScope.addEventListener("chat_update",(e=>{const t=this.appChatsManager.getChat(e),a=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(a)&&this.dropDialogOnDeletion(a)})),this.apiUpdatesManager.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updatePinnedDialogs:this.onUpdatePinnedDialogs}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("dialogs")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.dialogs=this.storage.getCache();for(const t of o.DZ){const a=e.pinnedOrders[t];if(!a)continue;const s=this.pinnedOrders[t];s.splice(0,s.length,...a)}t.length&&W.Z.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{},t.length&&this.appDraftsManager.addMissedDialogs()}))}setDialogsFromState(e){for(let t=0,a=e.length;tthis.allDialogsLoaded[e]))&&(this.allDialogsLoaded[void 0]=!0),this.appStateManager.pushToState("allDialogsLoaded",this.allDialogsLoaded)}handleDialogUnpinning(e,t){delete e.pFlags.pinned,(0,M.Z)(this.pinnedOrders[t],e.peerId),this.savePinnedOrders()}savePinnedOrders(){this.appStateManager.pushToState("pinnedOrders",this.pinnedOrders)}resetPinnedOrder(e){this.pinnedOrders[e].length=0}getPinnedOrders(e){return this.pinnedOrders[e]}getOffsetDate(e){const t=this.dialogsOffsetDate[e]||0;return e!==ue||t?t:Math.min(...Array.from(o.DZ).sort(((e,t)=>e-t)))}generateFolder(e){const t={dialogs:[],id:e,unreadMessagesCount:0,unreadPeerIds:new Set,unreadUnmutedPeerIds:new Set};return ge(t,["dispatchUnreadTimeout"]),t}getFolder(e){var t,a;return null!==(t=(a=this.folders)[e])&&void 0!==t?t:a[e]=this.generateFolder(e)}getFolderDialogs(e,t=!0){if(e===ue)return this.getCachedDialogs(t);const a=this.getFolder(e);return t?a.dialogs.filter((e=>void 0===e.migratedTo)):a.dialogs}getNextDialog(e,t,a){const s=this.getFolderDialogs(a,!0);let n;if(e){const a=s.findIndex((t=>t.peerId===e));-1!==a&&(n=s[t?a+1:a-1])}else t&&(n=s[0]);return n}getDialogIndexKeyByFilterId(e){if(o.DZ.has(e))return(0,de.Z)(e);const t=this.filtersStorage.getFilter(e);return(0,de.Z)(t.localId)}isPeerUnmuted(e){return!this.appNotificationsManager.isPeerLocalMuted(e,!0)}getFolderUnreadCount(e){const t=this.getFolder(e);return{unreadUnmutedCount:t.unreadUnmutedPeerIds.size,unreadCount:t.unreadPeerIds.size}}getCachedDialogs(e){const t=Array.from(o.DZ).map((t=>this.getFolderDialogs(t,e)));return[].concat(...t)}setDialogIndexInFilter(e,t,a){var s,n;let i;const r=o.DZ.has(a.id);if(this.filtersStorage.testDialogForFilter(e,a)){const t=a.pinnedPeerIds.indexOf(e.peerId);i=-1!==t?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(a.pinnedPeerIds.length-1-t),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)||r?this.generateIndexForDialog(e,!0,void 0,!r):null!==(n=(0,ce.Z)(e))&&void 0!==n?n:this.generateIndexForDialog(e,!0)}return he(e,t,i)}getDialog(e,t,a=!0){const s=[];void 0===t?s.push(...Array.from(o.DZ).map((e=>this.getFolder(e).dialogs))):s.push(this.getFolderDialogs(t,!1));for(const t of s){let s=0,n=0;for(let i=t.length;st.peerId===e.peerId)),i=s[n],r=this.getDialogIndex(i,a),o=this.setDialogIndexInFilter(e,a,t);return r!==o&&((!r&&o||n&&!o)&&this.prepareFolderUnreadCountModifyingByDialog(t.id,e,!!o),-1!==n&&s.splice(n,1),o&&(0,ie.Z)(s,e,(e=>this.getDialogIndex(e,a)),-1),!0)}prepareDialogUnreadCountModifying(e){const t=[this.prepareFolderUnreadCountModifyingByDialog(e.folder_id,e)],a=this.filtersStorage.getFilters();for(const s in a){const n=a[s];this.filtersStorage.testDialogForFilter(e,n)&&t.push(this.prepareFolderUnreadCountModifyingByDialog(n.id,e))}return()=>t.forEach((e=>e()))}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t),n=this.isPeerUnmuted(t.peerId);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=this.isPeerUnmuted(t.peerId),i=a-s;this.modifyFolderUnreadCount(e,i,!!a,a&&n,t)};{const i=a?s:-s;this.modifyFolderUnreadCount(e,i,!!s,s&&n,t)}}modifyFolderUnreadCount(e,t,a,s,n){const i=this.getFolder(e);t&&(i.unreadMessagesCount=Math.max(0,i.unreadMessagesCount+t));const{peerId:r}=n;a?i.unreadPeerIds.add(r):i.unreadPeerIds.delete(r),s?i.unreadUnmutedPeerIds.add(r):i.unreadUnmutedPeerIds.delete(r),void 0===i.dispatchUnreadTimeout&&(i.dispatchUnreadTimeout=R.Z.setTimeout((()=>{i.dispatchUnreadTimeout=void 0;const e=Object.assign({},i);delete e.dialogs,this.rootScope.dispatchEvent("folder_unread",e)}),0))}generateIndexForDialog(e,t,a,s){var n;if(!t)return;let i,r=0;if(e.pFlags.pinned&&!s)r=this.generateDialogPinnedDate(e),i=!0;else{a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),r=(null==a?void 0:a.date)||r;const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!r||e.date&&e.date>r)&&(r=e.date)}"draftMessage"===(null===(n=e.draft)||void 0===n?void 0:n._)&&e.draft.date>r&&(r=e.draft.date)}r||(r=(0,te.Z)(!0));const o=this.generateDialogIndex(r,i);if(t)return o;he(e,(0,de.Z)(e.folder_id),o)}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.pinnedOrders[e.folder_id];let a=t.indexOf(e.peerId);return-1===a&&(t.unshift(e.peerId),a=0,this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(t.length-1-a)}setDialogToState(e){const{peerId:t,pts:a}=e,s=this.appMessagesManager.getHistoryStorage(t),n=this.appMessagesManager.getHistoryMessagesStorage(t),i=s.history.slice;let r;for(let e=0,a=i.length;e{"dialogFolder"===t._&&e.dialogs.splice(a,1)})),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const t=new Map;e.dialogs.forEach((e=>{var a;const s=this.appPeersManager.getPeerId(e.peer);let n=e.top_message;const i=this.appMessagesManager.pendingTopMsgs[s];if(i){const t=this.appMessagesManager.getMessageByPeer(s,i),a=this.appMessagesManager.getMessageByPeer(s,n);(!n||t&&(!a||(null==t?void 0:t.date)>(null==a?void 0:a.date)))&&(e.top_message=n=i,this.appMessagesManager.getHistoryStorage(s).maxId=i)}n||"draftMessage"===(null===(a=e.draft)||void 0===a?void 0:a._)?this.saveDialog(e)&&t.set(s,e):this.dropDialogWithEvent(s);const r=this.appMessagesManager.newUpdatesAfterReloadToHandle[s];if(void 0!==r){for(const e of r)r.delete(e),this.apiUpdatesManager.saveUpdate(e);r.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[s]}})),t.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",t)}getDialogOffsetDate(e){const t=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);return(null==t?void 0:t.date)||0}canSaveDialogByPeerId(e){if(e.isAnyChat()){const t=this.appChatsManager.getChat(e.toChatId());if("channelForbidden"===t._||t.pFlags.left)return!1}return!0}saveDialog(e,t,a,s){var n,i;void 0===t&&(t=null!==(n=e.folder_id)&&void 0!==n?n:o.J$);const r=this.appPeersManager.getPeerId(e.peer);if(!r)return console.error("saveConversation no peerId???",e,t),!1;if("dialog"!==e._&&console.error("saveConversation not regular dialog",e,Object.assign({},e)),!this.canSaveDialogByPeerId(r))return!1;const p=this.appPeersManager.isChannel(r)?r.toChatId():o.NM,d=this.appPeersManager.getPeerSearchText(r);this.dialogsIndex.indexObject(r,d);const f=this.getDialogOnly(r);let c,l;if(e.top_message){c=(0,pe.Z)(e.top_message);const t=(null==f?void 0:f.top_message)&&this.appMessagesManager.getMessageByPeer(r,f.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&f.top_message>=c&&(c=f.top_message),l=this.appMessagesManager.getMessageByPeer(r,c)}else c=this.appMessagesManager.generateTempMessageId(r),l={_:"message",id:c,mid:c,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(r),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([l],{isOutgoing:!0});if((null==l?void 0:l.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,l),!p&&r.isAnyChat()){const t=this.appChatsManager.getChat(r.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[r]=a,this.appMessagesManager.migratedToFrom[a]=r,e.migratedTo=a}}if(e.top_message=c,e.read_inbox_max_id=(0,pe.Z)(f&&!e.read_inbox_max_id?f.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=(0,pe.Z)(f&&!e.read_outbox_max_id?f.read_outbox_max_id:e.read_outbox_max_id),void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=f?f.folder_id:t),e.draft=this.appDraftsManager.saveDraft(r,0,e.draft),e.peerId=r,l&&l.pFlags.is_outgoing){const t=l.pFlags.out;c>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(l.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete l.pFlags.unread}const m=this.appMessagesManager.getHistoryStorage(r),g=m.history.slice;if(g.length?g.isEnd(se.D.Bottom)||(m.history.insertSlice([c]).setEnd(se.D.Bottom),m.count||(m.count=1),this.appMessagesManager.mergeReplyKeyboard(m,l)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r})):(m.history.unshift(c),m.count||(m.count=1),this.appMessagesManager.mergeReplyKeyboard(m,l)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r})),m.maxId=c,m.readMaxId=e.read_inbox_max_id,m.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:r,settings:e.notify_settings}),p&&e.pts&&this.apiUpdatesManager.addChannelState(p,e.pts),this.generateIndexForDialog(e),f){const t=this.dialogsStorage.prepareDialogUnreadCountModifying(f);re(f,e),t()}return this.pushDialog(e,null==l?void 0:l.date,a,s),!0}getDialogs(e="",t,a=20,s=0,n=!1){if(!o.DZ.has(s)){const i=[],r=this.appUsersManager.fillContacts();r.cached||i.push(r.promise);const o=this.filtersStorage.reloadMissingPeerIds(s);if(o&&i.push(o),i.length)return Promise.all(i).then((()=>this.getDialogs(e,t,a,s,n)))}const i=!o.DZ.has(s)||this.getOffsetDate(s)?ue:s;let r=this.getFolderDialogs(s,n);const p=this.getDialogIndexKeyByFilterId(s);if(e){if(!a||this.cachedResults.query!==e||this.cachedResults.folderId!==s){this.cachedResults.query=e,this.cachedResults.folderId=s;const t=this.dialogsIndex.search(e),a=[];for(const e in this.dialogs){const n=this.dialogs[e];t.has(n.peerId)&&n.folder_id===s&&a.push(n)}a.sort(((e,t)=>this.getDialogIndex(t,p)-this.getDialogIndex(e,p))),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}r=this.cachedResults.dialogs}else this.cachedResults.query="";let d=0;if(t>0)for(let e=r.length;dthis.getDialogIndex(r[d],p));++d);const f=this.isDialogsLoaded(i),c=r.length>=d+a;if(e||f||c){const s=r.slice(d,d+a);return{dialogs:s,count:f?r.length:null,isTopEnd:r.length&&(s[0]&&s[0]===r[0]||this.getDialogIndex(r[0],p)=r.length}}return this.appMessagesManager.getTopMessages(a,i).then((e=>{if(n&&(r=this.getFolderDialogs(s,n)),d=0,t>0)for(let e=r.length;dthis.getDialogIndex(r[d],p));++d);const i=r.slice(d,d+a);return{dialogs:i,count:void 0===e.count?r.length:e.count,isTopEnd:r.length&&(i[0]&&i[0]===r[0]||this.getDialogIndex(r[0],p){if(e){this.filters={},this.filtersArr=[],this.reloadedPeerIds=new Set,this.localFilters={};for(const e of o.DZ)this.localFilters[e]=this.generateLocalFilter(e)}else this.reloadedPeerIds.clear(),this.clearFilters();this.localId=o.Gu},this.onUpdateDialogFilter=e=>{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id],(0,ve.Z)(this.filtersArr,(t=>t.id===e.id))),this.pushToState()},this.onUpdateDialogFilters=e=>{const t=(0,_e.Z)(this.filters);this.getDialogFilters(!0).then((e=>{for(const a in t){const t=+a;e.find((e=>e.id===t))||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map((e=>e.id))})}))},this.onUpdateDialogFilterOrder=e=>{const t=e.order.slice();t.includes(o.Zi)||t.splice(t[0]===o.J$?1:0,0,o.Zi),this.localId=o.Gu,t.forEach((e=>{const t=this.filters[e];delete t.localId,this.setLocalId(t)})),this.rootScope.dispatchEvent("filter_order",t),this.pushToState()}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:this.onUpdateDialogFilters,updateDialogFilterOrder:this.onUpdateDialogFilterOrder}),this.rootScope.addEventListener("premium_toggle",(()=>{this.onUpdateDialogFilters({_:"updateDialogFilters"})})),this.appStateManager.getState().then((e=>{this.prependFilters(e.filtersArr).map((e=>{this.saveDialogFilter(e,!1,!0)}))}))}prependFilters(e){e=e.slice();const t=this.localFilters[o.J$],a=this.localFilters[o.Zi],s=e.findIndex((e=>"dialogFilterDefault"===e._||e.id===o.J$));return-1!==s?e[s]=t:e.unshift(t),(0,ve.Z)(e,(e=>e.id===o.Zi)),e.splice(e[0]===t?1:0,0,a),this.localId=o.Gu,e.forEach((e=>{delete e.localId})),e}generateLocalFilter(e){const t=Object.assign(Object.assign({},(0,_e.Z)(Ie)),{id:e});return e===o.J$?t.pFlags.exclude_archived=!0:e===o.Zi&&(t.pFlags.exclude_unarchived=!0),o.DZ.has(e)&&(t.pinnedPeerIds=this.dialogsStorage.getPinnedOrders(e)),t}pushToState(){this.appStateManager.pushToState("filtersArr",this.filtersArr)}testDialogForFilter(e,t){if(o.DZ.has(t.id))return e.folder_id===t.id&&this.dialogsStorage.canSaveDialogByPeerId(e.peerId);const a=e.peerId;if(!this.appMessagesManager.getDialogOnly(a))return!1;if(t.excludePeerIds.includes(a))return!1;if(t.includePeerIds.includes(a))return!0;const s=t.pFlags;if(s.exclude_archived&&e.folder_id===o.Zi)return!1;if(s.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(s.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted(a)&&(!e.unread_mentions_count||!e.unread_count))return!1;if(this.appPeersManager.isAnyChat(a)){if(s.broadcasts&&this.appPeersManager.isBroadcast(a))return!0;if(s.groups&&this.appPeersManager.isAnyGroup(a))return!0}else{const e=a.toUserId();if(this.appUsersManager.isBot(e))return!!s.bots;if(s.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(s.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}getFilters(){return this.filters}clearFilters(){const e=this.getFilters();for(const t in e)o.DZ.has(+t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:+t})}toggleDialogPin(e,t){return Pe(this,void 0,void 0,(function*(){const a=this.filters[t],s=a.pinnedPeerIds.indexOf(e),n=-1!==s;if(n&&(a.pinned_peers.splice(s,1),a.pinnedPeerIds.splice(s,1)),!n){if(a.pinned_peers.length>=(yield this.apiManager.getConfig()).pinned_infolder_count_max)return Promise.reject((0,X.Z)("PINNED_DIALOGS_TOO_MUCH"));a.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),a.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(a)}))}createDialogFilter(e,t){const a=Math.max(1,...Object.keys(this.filters).map((e=>+e)));return(e=(0,_e.Z)(e)).id=a+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,a=!1){const s=t?0:1;return this.apiManager.invokeApi("messages.updateDialogFilter",{flags:s,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then((s=>{if(s&&(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),a)){const t=[];for(const e in this.filters){const a=this.filters[e];++a.localId,t.push(a)}e.localId=o.Gu;const a=t.sort(((e,t)=>e.localId-t.localId)).map((e=>e.id));this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:a})}return s}))}getOutputDialogFilter(e){const t=(0,_e.Z)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){(0,ne.Z)(e.includePeerIds,((t,a)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(a,1),e.includePeerIds.splice(a,1))}))}reloadMissingPeerIds(e,t="pinned_peers"){const a=this.getFilter(e),s=a&&a[t];if(!(null==s?void 0:s.length))return;const n=s.filter((e=>{const t=this.appPeersManager.getPeerId(e),a=this.reloadedPeerIds.has(t),s=this.appMessagesManager.getDialogOnly(t);return!a&&!s}));if(!n.length)return;const i=n.map((e=>{const t=this.appPeersManager.getPeerId(e);return this.appMessagesManager.reloadConversation(e).then((e=>(this.reloadedPeerIds.add(t),e?void 0:t)))}));return Promise.all(i).then((e=>{(e=e.filter(Boolean)).length}))}getDialogFilters(e=!1){return Pe(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length>Se&&!e)return t.map((e=>this.filters[e])).sort(((e,t)=>e.localId-t.localId));const a=yield this.apiManager.invokeApiSingle("messages.getDialogFilters");return this.prependFilters(a).map((t=>this.saveDialogFilter(t,e))).filter(Boolean)}))}getSuggestedDialogsFilters(){return this.apiManager.invokeApi("messages.getSuggestedDialogFilters")}saveDialogFilter(e,t=!0,a){"dialogFilterDefault"===e._&&(e=this.localFilters[o.J$]),(0,be.Z)(e),o.DZ.has(e.id)||(Me.forEach((([t,a])=>{(0,be.Z)(e),e[a]=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];return s?Object.assign(s,e):this.filters[e.id]=e,this.setLocalId(e),a||(t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)),e}setLocalId(e){void 0!==e.localId?e.localId>=this.localId&&(this.localId=e.localId+1):(e.localId=this.localId++,(0,ve.Z)(this.filtersArr,(t=>t.id===e.id)),this.filtersArr.push(e),this.pushToState())}isFilterIdAvailable(e){return Pe(this,void 0,void 0,(function*(){if(o.DZ.has(e))return!0;const t=yield this.apiManager.getLimit("folders");return this.filtersArr.filter((e=>!o.DZ.has(e.id))).slice(0,t).some((t=>t.id===e))}))}}var we=a(6690),ke=a(2821);function Ae(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((a=>{const s=Object.getOwnPropertyDescriptor(t.prototype,a)||Object.create(null);"constructor"!==a&&Object.defineProperty(e.prototype,a,s)}))}))}class De{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=(0,S.kg)("UPDATES",S.v9.Error|S.v9.Warn|S.v9.Log),this.debug=d.ZP,this.processUpdateMessage=(e,t={})=>{const a={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,a);break;case"updateShortMessage":case"updateShortChatMessage":{(0,be.Z)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,s=e.from_id||(t?this.appPeersManager.peerId:e.user_id),n=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||this.appPeersManager.peerId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:this.appPeersManager.getOutputPeer(s.toPeerId()),peer_id:this.appPeersManager.getOutputPeer(n),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},a);break}case"updatesCombined":case"updates":this.appUsersManager.saveApiUsers(e.users,t.override),this.appChatsManager.saveApiChats(e.chats,t.override),e.updates.forEach((e=>{this.processUpdate(e,a)}));break;default:this.log.warn("Unknown update message",e)}},this._constructor(!1)}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,a,s){return t[a]=s,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;this.appStateManager.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){const e=this.updatesState,t=e.seq+1,a=e.pendingSeqUpdates[t];if(!a)return!1;const s=a.updates;for(let e=0,t=s.length;e=e.syncPending.seqAwaiting&&(e.syncPending.ptsAwaiting?delete e.syncPending.seqAwaiting:(clearTimeout(e.syncPending.timeout),e.syncPending=null)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort(((e,t)=>e.pts-t.pts));let a=t.pts,s=0,n=0;for(let e=0,i=t.pendingPtsUpdates.length;e=i.pts&&(s=i.pts,n=e)}if(!s)return!1;this.debug&&this.log.debug("pop pending pts updates",s,t.pendingPtsUpdates.slice(0,n+1)),t.pts=s;for(let e=0;e<=n;++e){const a=t.pendingPtsUpdates[e];this.saveUpdate(a)}return t.pendingPtsUpdates.splice(0,n+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:(clearTimeout(t.syncPending.timeout),t.syncPending=null)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState,a=t.syncLoading;a||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const s=this.apiManager.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then((a=>{if(this.debug&&this.log.debug("Get diff result",a),"updates.differenceEmpty"===a._)return this.debug&&this.log.debug("apply empty diff",a.seq),t.date=a.date,void(t.seq=a.seq);if(e&&this.rootScope.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==a._){this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.other_updates.forEach((e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)})),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})}));const e="updates.difference"===a._?a.state:a.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=a.pts,t.date=(Date.now()/1e3|0)+this.timeManager.getServerTimeOffset(),delete t.seq,this.channelStates={},this.log.warn("getDifference:",a._),this.onDifferenceTooLong();if("updates.differenceSlice"===a._)return this.getDifference();this.debug&&this.log.debug("finished get diff")}));return a||this.justAName(t,s),s}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const s=this.debug?this.log.bindPrefix("getChannelDifference-"+e):void 0,n=this.apiManager.invokeApi("updates.getChannelDifference",{channel:this.appChatsManager.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:30},{timeout:2147483647}).then((a=>{if(null==s||s.debug("diff result",a),t.pts="pts"in a?a.pts:void 0,"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),null==s||s.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach((e=>{this.saveUpdate(e)})),null==s||s.debug("applying",a.new_messages.length,"channel new messages"),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})})),null==s||s.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);null==s||s.debug("finished channel get diff")}}));return a||this.justAName(t,n,e),n}onDifferenceTooLong(){this.appUsersManager.clear(),this.appChatsManager.clear(),this.appMessagesManager.clear(),this.rootScope.dispatchEvent("state_cleared")}justAName(e,t,a){e.syncLoading=t,this.rootScope.dispatchEvent("state_synchronizing",a),t.then((()=>{e.syncLoading=null,this.rootScope.dispatchEvent("state_synchronized",a)}),(()=>{e.syncLoading=null}))}addChannelState(e,t){if(!t)throw new Error("Add channel state without pts "+e);return!(e in this.channelStates)&&(this.channelStates[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null},!0)}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a;let s;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":s=this.appPeersManager.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(s=e.channel_id,!(s in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(s=e.channel_id)}const{pts:n,pts_count:i}=e,r=s?this.getChannelState(s,n):this.updatesState;if(r.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!r.lastPtsUpdateTime||r.lastPtsUpdateTime{r.syncPending=null,r.syncLoading||(s?this.getChannelDifference(s):this.getDifference())}),6)}),r.syncPending.ptsAwaiting=!0,!1;if(n>r.pts)r.pts=n,o=!0,r.lastPtsUpdateTime=Date.now();else if(i)return!1;s&&t.date&&this.updatesState.date0){const a=t.seq,s=t.seqStart||a;if(s!==r.seq+1&&s>r.seq)return this.debug&&this.log.warn("Seq hole",r,r.syncPending&&r.syncPending.seqAwaiting),void 0===r.pendingSeqUpdates[s]&&(r.pendingSeqUpdates[s]={seq:a,date:t.date,updates:[]}),r.pendingSeqUpdates[s].updates.push(e),r.syncPending||(r.syncPending={timeout:R.Z.setTimeout((()=>{r.syncPending=null,r.syncLoading||this.getDifference()}),6)}),(!r.syncPending.seqAwaiting||r.syncPending.seqAwaiting{const a=this.appStateManager.newVersion;t&&t.pts&&t.date?(Object.assign(this.updatesState,t),this.log("will get difference",Object.assign({},t)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise((e=>{this.apiManager.invokeApi("updates.getState",{},{noErrorBox:!0}).then((t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()}))}))),this.apiManager.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),a&&this.updatesState.syncLoading.then((()=>{return t=this,s=void 0,i=function*(){const t={en:"was updated to version",ru:"обновлён до версии"},s=e=>{fetch(`changelogs/${e}_${a.split(" ")[0]}.md`).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((s=>{const n=t[e]||t.en;s=`**Telegram Web${_.Z.suffix} ${n} ${a}**\n\n`+s;const i=[],r={_:"updateServiceNotification",entities:i,message:(0,ke.Z)(s,i),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(r)}))},n=(0,we.Z)([e,"en"]);for(const e of n)try{yield s(e);break}catch(e){}},new((n=void 0)||(n=Promise))((function(e,a){function r(e){try{p(i.next(e))}catch(e){a(e)}}function o(e){try{p(i.throw(e))}catch(e){a(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(t,s||[])).next())}));var t,s,n,i}))})))}}Ae(De,[p.Z,G]);class Ue extends G{constructor(){super(...arguments),this.savedAvatarURLs={}}after(){this.rootScope.addEventListener("avatar_update",(e=>{this.removeFromAvatarsCache(e)}))}isAvatarCached(e,t){const a=this.savedAvatarURLs[e];return void 0===t?!!a:!(!a||!a[t]||a[t]instanceof Promise)}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,a){let s=this.savedAvatarURLs[e];if(s&&s[a])return s[a];{s||(s=this.savedAvatarURLs[e]={});const n={_:"inputPeerPhotoFileLocation",pFlags:{},peer:this.appPeersManager.getInputPeerById(e),photo_id:t.photo_id},i={dcId:t.dc_id,location:n};"photo_big"===a&&(n.pFlags.big=!0,i.limitPart=524288);const r=this.apiFileManager.download(i);return s[a]=r.then((e=>s[a]=URL.createObjectURL(e)))}}}var Ee=a(144),Re=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Te extends G{after(){this.calls=new Map,i().IS_CALL_SUPPORTED&&this.apiUpdatesManager.addMultipleEventsListeners({updatePhoneCall:e=>{this.saveCall(e.phone_call)},updatePhoneCallSignalingData:e=>{this.rootScope.dispatchEvent("call_signaling",{callId:e.phone_call_id,data:e.data})}})}computeKey(e,t,a){return this.cryptoWorker.invokeCrypto("compute-dh-key",e,t,a)}saveCall(e){const t="phoneCallDiscarded"===e._,a=this.calls.get(e.id);return a?(re(a,e),t&&this.calls.delete(e.id),e=a):t||this.calls.set(e.id,e),this.rootScope.dispatchEvent("call_update",e),e}getCall(e){return this.calls.get(e)}getCallInput(e){const t=this.getCall(e);return{_:"inputPhoneCall",id:t.id,access_hash:t.access_hash}}savePhonePhoneCall(e){return this.appUsersManager.saveApiUsers(e.users),this.saveCall(e.phone_call)}generateDh(){return this.apiManager.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then((e=>this.cryptoWorker.invokeCrypto("generate-dh",e)))}requestCall(e,t,a,s){return Re(this,void 0,void 0,(function*(){const n=yield this.apiManager.invokeApi("phone.requestCall",{user_id:this.appUsersManager.getUserInput(e),protocol:t,video:s,random_id:(0,Ee.d)(32),g_a_hash:a});return this.savePhonePhoneCall(n)}))}discardCall(e,t,a,s){return Re(this,void 0,void 0,(function*(){if(!this.getCall(e))return;const n=yield this.apiManager.invokeApi("phone.discardCall",{video:s,peer:this.getCallInput(e),duration:t,reason:{_:a},connection_id:"0"});this.apiUpdatesManager.processUpdateMessage(n)}))}}const Fe=new Set(["all","web","webk"]),xe=new Set;function Be(e){return e.find((e=>Fe.has(e.platform)&&!xe.has(e.reason)))}function Ve(e){return!!Be(e)}var Le=a(7120),Oe=a(2566);class Ne extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.chats={};else for(const e in this.chats)e&&(this.peersStorage.isPeerNeeded(e.toPeerId(!0))||(this.storage.delete(e),delete this.chats[e]))},this.onChatUpdated=(e,t)=>{var a;this.apiUpdatesManager.processUpdateMessage(t),(null===(a=null==t?void 0:t.updates)||void 0===a?void 0:a.length)&&this.isChannel(e)&&this.rootScope.dispatchEvent("invalidate_participants",e)}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateChannelParticipant:e=>{this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e.channel_id))},updateChatDefaultBannedRights:e=>{const t=this.appPeersManager.getPeerId(e.peer).toChatId(),a=this.chats[t];a&&(a.default_banned_rights=e.default_banned_rights,this.rootScope.dispatchEvent("chat_update",t))}}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("chats")]).then((([e,{results:t,storage:a}])=>{if(this.storage=a,t.length)for(let e=0,a=t.length;e{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())}))}))}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiChat(e,t))))}saveApiChat(e,t){var a,s,n,i;if("chatEmpty"===e._)return;const r=this.chats[e.id];if(null!==(a=(i=e).pFlags)&&void 0!==a||(i.pFlags={}),e.pFlags.min&&void 0!==r)return;"channel"===e._&&void 0===e.participants_count&&void 0!==r&&r.participants_count&&(e.participants_count=r.participants_count);const o=e.id.toPeerId(!0);if(void 0===r)this.chats[e.id]=e;else{const t=(null===(s=r.photo)||void 0===s?void 0:s.photo_id)!==(null===(n=e.photo)||void 0===n?void 0:n.photo_id),a=r.title!==e.title,i=r.pFlags.verified!==e.pFlags.verified||r.pFlags.scam!==e.pFlags.scam||r.pFlags.fake!==e.pFlags.fake;re(r,e),this.rootScope.dispatchEvent("chat_update",e.id),t&&this.rootScope.dispatchEvent("avatar_update",o),(a||i)&&this.rootScope.dispatchEvent("peer_title_edit",o)}this.peersStorage.isPeerNeeded(o)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]||{_:"chatEmpty",id:e,deleted:!0,access_hash:"",pFlags:{}}}getChatTyped(e){return this.getChat(e)}hasRights(e,t,a,s){return(0,Le.Z)(this.getChat(e),t,a,s)}editChatDefaultBannedRights(e,t){const a=this.getChat(e);return a.default_banned_rights&&a.default_banned_rights.until_date===t.until_date&&(0,Y.Z)(a.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():this.apiManager.invokeApi("messages.editChatDefaultBannedRights",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.megagroup)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return("channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return"chatEmpty"!==t._&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getInputPeer(e){return this.isChannel(e)?this.getChannelInputPeer(e):this.getChatInputPeer(e)}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const a=this.chats[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}getChatPhoto(e){const t=this.getChat(e);return t&&t.photo||{_:"chatPhotoEmpty"}}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e){return this.apiManager.invokeApi("channels.createChannel",e).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}inviteToChannel(e,t){const a=this.getChannelInput(e),s=t.map((e=>this.appUsersManager.getUserInput(e)));return this.apiManager.invokeApi("channels.inviteToChannel",{channel:a,users:s}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return this.apiManager.invokeApi("messages.createChat",{users:t.map((e=>this.appUsersManager.getUserInput(e))),title:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}leaveChannel(e){return this.apiManager.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return this.apiManager.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,a=100){return this.apiManager.invokeApi("messages.addChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t),fwd_limit:a}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return this.apiManager.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,this.appUsersManager.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return this.apiManager.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return this.apiManager.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):this.apiManager.invokeApi("messages.migrateChat",{chat_id:e}).then((t=>(this.onChatUpdated(e,t),t.updates.find((e=>"updateChannel"===e._)).channel_id)))}updateUsername(e,t){return this.apiManager.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t}).then((a=>(a&&(this.getChat(e).username=t),a)))}editPhoto(e,t){const a={_:"inputChatUploadedPhoto",file:t};let s;return s=this.isChannel(e)?this.apiManager.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:a}):this.apiManager.invokeApi("messages.editChatPhoto",{chat_id:e,photo:a}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}editTitle(e,t){let a;return a=this.isChannel(e)?this.apiManager.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):this.apiManager.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),a.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}editAbout(e,t){const a=e.toPeerId(!0);return this.apiManager.invokeApi("messages.editChatAbout",{peer:this.appPeersManager.getInputPeerById(a),about:t}).then((e=>(e&&this.rootScope.dispatchEvent("peer_bio_edit",a),e)))}editBanned(e,t,a){const s="object"!=typeof t?t:(0,Oe.Z)(t);return this.apiManager.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(s),banned_rights:a}).then((n=>{if(this.onChatUpdated(e,n),"object"==typeof t){const n=Date.now()/1e3|0;this.apiUpdatesManager.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:n,actor_id:void 0,qts:void 0,user_id:s,prev_participant:t,new_participant:Object.keys(a.pFlags).length?{_:"channelParticipantBanned",date:n,banned_rights:a,kicked_by:this.appUsersManager.getSelf().id,peer:this.appPeersManager.getOutputPeer(s),pFlags:{}}:void 0})}}))}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return this.apiManager.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then((e=>{this.saveApiChats(e.chats)}))}togglePreHistoryHidden(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t}))).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}toggleSignatures(e,t){return this.apiManager.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}toggleNoForwards(e,t){return this.apiManager.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}setChatAvailableReactions(e,t){const a=this.appProfileManager.getCachedFullChat(e);return a&&(a.available_reactions=t),this.apiManager.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}isRestricted(e){const t=this.getChat(e),a=t.restriction_reason;return!!(t.pFlags.restricted&&a&&Ve(a))}getSendAs(e){return this.apiManager.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),this.saveApiChats(e.chats),e.peers)})}importChatInvite(e){return this.apiManager.invokeApi("messages.importChatInvite",{hash:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}checkUsername(e,t){return this.apiManager.invokeApi("channels.checkUsername",{channel:this.getChannelInput(e),username:t})}getSponsoredMessage(e){return this.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.getChannelInput(e)},{cacheSeconds:300}).then((e=>{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=e.messages.shift();return e.messages.push(t),e}))}viewSponsoredMessage(e,t){return this.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.getChannelInput(e),random_id:t})}checkChatInvite(e){return this.apiManager.invokeApi("messages.checkChatInvite",{hash:e}).then((e=>(e.chat&&this.saveApiChat(e.chat,!0),e)))}}a(4762);var Ze,qe=a(5953),je=a(9005),Ge=a(6637),He=a(3591);!function(e){let t,s;function n(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function i(){if("h12"===e.timeFormat)try{const t=b({hour:"numeric",minute:"numeric",hour12:!0}),a=new Date;a.setHours(0);const s=t.format(a);e.amPmCache.am=s.split(" ")[1],a.setHours(12);const n=t.format(a);e.amPmCache.pm=n.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function r(){const e=_.Z.langPackCode;return n(e),Promise.all([a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),a.e(8).then(a.bind(a,9179))]).then((([t,a,s])=>{const n=[];return p(t.default,n),p(a.default,n),f({_:"langPackDifference",from_version:0,lang_code:e,strings:n,version:0,local:!0,countries:s.default})}))}function o(t,s){e.requestedServerLanguage=!0;const n=g.managers;return Promise.all([n.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),n.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function p(e,t=[]){for(const a in e){const s=e[a];"string"==typeof s?t.push({_:"langPackString",key:a,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:a},s))}return t}function f(e){return e.appVersion=_.Z.langPackVersion,h.Z.set({langPack:e}).then((()=>(c(e),e)))}function c(a){const s=e.lastRequestedLangCode;if(a.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(a){console.error("pluralRules error",a),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(a.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(a.lang_code.split("-",1)[0])}e.strings.clear();for(const t of a.strings)e.strings.set(t.key,t);a.countries&&(e.countriesList.length=0,e.countriesList.push(...a.countries.countries),a.countries.countries.forEach((t=>{if(t.name){const a=t.default_name;e.strings.set(a,{_:"langPackString",key:a,value:t.name})}}))),e.lastAppliedLangCode!==s&&(g.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,v.clear(),i()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a&&a.update()}))}}function l(e,t,a={i:0}){const s=[];let n=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,i,r,o,p,d,f)=>{if(s.push(f.slice(n,d)),i){let e;switch(i){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...l(r,t,a)),s.push(e)}else if(o)s.push(document.createElement("br"));else if(p){const e=p.lastIndexOf("]"),n=p.slice(1,e),i=p.slice(e+2,p.length-1);let r;if(i&&(0,Ge.Z)(i)){r=document.createElement("a");const e=(0,He.Z)(i);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[a.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...l(n,t,a)),s.push(r)}else t&&function(e,t,a){const s=t[a.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,a);return n=d+e.length,""})),n!==e.length&&s.push(e.slice(n)),s}function m(a,s=!1,n){const i=e.strings.get(a);let r;if(i)if("langPackStringPluralized"===i._&&(null==n?void 0:n.length)){let e=n[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=i[t.select(e)+"_value"]||i.other_value}else r="langPackString"===i._?i.value:a;else r=a;const o=l(r,n);return s?o.map((e=>e instanceof Node?e.textContent:e)).join(""):o}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.getCacheLangPack=function(){return s||(s=Promise.all([h.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(d.ZP,e.lastRequestedLangCode||n(t.lang_code),c(t),t):r())).finally((()=>{s=void 0})))},e.setTimeFormat=function(t,a=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,i(),a&&(v.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a instanceof P&&a.update()})))},e.loadLocalLangPack=r,e.loadLangPack=o,e.getStrings=function(e,t){return g.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:_.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return n(e),o(e).then((([e,t,a,s,n,i])=>{let r=[];return[a,s].forEach((e=>{p(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=n,f(e)}))},e.saveLangPack=f,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():a.e(642).then(a.bind(a,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=c,e.superFormatter=l,e.format=m,e.weakMap=new WeakMap;class u{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class y extends u{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,qe.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...m(this.key,!1,this.args));else{const e=this.element[this.property],t=m(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,Y.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=y;const v=new Map;function b(t={}){const a=JSON.stringify(t);let s=v.get(a);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),v.set(a,s)),s}e.amPmCache={am:"AM",pm:"PM"};class P extends u{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"}))}update(t){let a;if((0,qe.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();a=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(a+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=b(this.options);a=(0,je.Z)(e.format(this.date))}this.element[this.property]=a}}e.IntlDateElement=P,e.i18n=function(e,t){return new y({key:e,args:t}).element},e.i18n_=function(e){return new y(e).element},e._i18n=function(e,t,a,s){return new y({element:e,key:t,args:a,property:s}).element}}(Ze||(Ze={}));const We=Ze;Ze.i18n,Ze.i18n_,Ze._i18n,d.GO.I18n=Ze;const ze=["January","February","March","April","May","June","July","August","September","October","November","December"],Ke=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Je=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),a=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-a);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/86400+1)/7)};d.GO&&(d.GO.formatDateAccordingToTodayNew=function(e){const t=new Date,a=t.getTime()/1e3|0,s=e.getTime()/1e3|0,n={};return a-s<86400&&t.getDate()===e.getDate()?n.hour=n.minute="2-digit":t.getFullYear()!==e.getFullYear()?(n.year=n.day="numeric",n.month="2-digit"):a-s<604800&&Je(t)===Je(e)?n.weekday="short":(n.month="short",n.day="numeric"),new We.IntlDateElement({date:e,options:n}).element});const Qe=2013,$e=new RegExp("20[0-9]{1,2}"),Ye=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),Xe=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),et=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),tt=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),at=[31,29,31,30,31,30,31,31,30,31,30,31];function st(e,t,a){const s=(new Date).getFullYear(),n=Date.now();if(a>=Qe&&a<=s){const s=new Date;s.setFullYear(a,t,1),s.setHours(0,0,0);const i=s.getTime();if(i>n)return;s.setMonth(s.getMonth()+1);const r=s.getTime()-1;e.push({title:it(i),minDate:i,maxDate:r})}}function nt(e,t,a){if(dt(t,a)){const n=(new Date).getFullYear(),i=Date.now();for(let r=n;r>=Qe;r--){if(1===a&&28===t&&((s=r)%4!=0||s%100==0)&&s%400!=0)continue;const o=new Date;o.setFullYear(r,a,t+1),o.setHours(0,0,0);const p=o.getTime();if(p>i)continue;o.setFullYear(r,a,t+2),o.setHours(0,0,0);const d=o.getTime()-1;r===n?e.push({title:rt(p),minDate:p,maxDate:d}):e.push({title:ot(p),minDate:p,maxDate:d})}}var s}function it(e){const t=new Date(e);return ze[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function rt(e){const t=new Date(e);return ze[t.getMonth()].slice(0,3)+" "+t.getDate()}function ot(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function pt(e){const t=new Date(e);return Ke[t.getDay()]}function dt(e,t){return t>=0&&t<12&&e>=0&&e{t[e][s]=a})),a[e]=t[e])}d.GO.fillTipDates=function(e,t){const a=e.trim().toLowerCase();if(a.length<3)return;if(0==="today".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-1;return void t.push({title:"Today",minDate:i,maxDate:r})}if(0==="yesterday".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime()-864e5;e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:i,maxDate:r})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let a=0;a<7;a++)if(t.setDate(t.getDate()+1),0===pt(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(a);if(s>=0){const e=new Date,a=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>a&&e.setTime(e.getTime()-6048e5);const i=e.getFullYear(),r=e.getMonth(),o=e.getDate();e.setFullYear(i,r,o),e.setHours(0,0,0);const p=e.getTime();e.setFullYear(i,r,o+1),e.setHours(0,0,0);const d=e.getTime()-1;return void t.push({title:pt(p),minDate:p,maxDate:d})}let n;if(null===(n=et.exec(a)))if(null===(n=tt.exec(a)))if(null===(n=$e.exec(a))){if(null!==(n=Ye.exec(a))){const e=n[1],a=n[2],s=ft(e);if(s>=0){const e=+a;if(e>0&&e<=31)return void nt(t,e-1,s);if(e>=Qe)return void st(t,s,e)}}if(null!==(n=Xe.exec(a))){const e=n[1],a=ft(n[2]);if(a>=0){const s=+e;if(s>0&&s<=31)return void nt(t,s-1,a);s>=Qe&&st(t,a,s)}}}else{let e=+a;const s=(new Date).getFullYear();if(e=e;a--){const e=new Date;e.setFullYear(a,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(a+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+a,minDate:s,maxDate:n})}}else if(e<=s){const a=new Date;a.setFullYear(e,0,1),a.setHours(0,0,0);const s=a.getTime();a.setFullYear(e+1,0,1),a.setHours(0,0,0);const n=a.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],a=n[3],s=n[5];if(!n[2]===n[4])return;const i=parseInt(e),r=parseInt(a)-1;let o=parseInt(s);o>=10&&o<=99&&(o+=2e3);const p=(new Date).getFullYear();if(dt(i-1,r)&&o>=Qe&&o<=p){const e=new Date;e.setFullYear(o,r,i),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(o,r,i+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:ot(a),minDate:a,maxDate:s})}}else{const e=n[1],a=n[3],s=parseInt(e),i=parseInt(a);if(s>0&&s<=31){if(i>=Qe&&s<=12)return void st(t,s-1,i);i<=12&&nt(t,s-1,i-1)}else s>=Qe&&i<=12&&st(t,i-1,s)}};var lt=a(2491),mt=a(7072),gt=a(8801),ht=a(6658);const ut={pdf:"application/pdf",tgv:"application/x-tgwallpattern",tgs:"application/x-tgsticker",json:"application/json",wav:"audio/wav",mp3:"audio/mpeg",ogg:"audio/ogg",jpeg:"image/jpeg",jpg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",mp4:"video/mp4",webm:"video/webm",mov:"video/quicktime",svg:"image/svg+xml"},yt={};for(const e in ut)yt[ut[e]]=e;let _t=0;class vt extends G{constructor(){super(...arguments),this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];t.supportsStreaming&&(delete t.supportsStreaming,this.thumbsStorage.deleteCacheContext(t))}}}after(){this.docs={},this.stickerCachedThumbs={},this.uploadingWallPapers={},f.Z.getInstance().addEventListener("serviceWorkerOnline",(e=>{e||this.onServiceWorkerFail()}))}saveDoc(e,t){if(!e||"documentEmpty"===e._)return;const a=this.docs[e.id];e.file_reference&&(ct("file_reference",a,e),this.referenceDatabase.saveContext(e.file_reference,t)),a||(this.docs[e.id]=e);for(let t=0,a=e.attributes.length;t"documentAttributeFilename"===e._)),a=t&&t.file_name.split(".").pop(),s=((e,t={})=>{const a=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+a+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):ze[e.getMonth()])+a+e.getFullYear()+(t.noTime?"":", "+s)})(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_");e.file_name=`${e.type}_${s}${a?"."+a:""}`}return Zs()&&("gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type)&&(e.supportsStreaming=!0,this.thumbsStorage.getCacheContext(e).url||this.thumbsStorage.setCacheContextURL(e,void 0,function(e,t=!1,a){let s;return s=t?"download":a?"thumb":e.supportsStreaming?"stream":"document",(0,gt.q)(s,(0,ht.Z)(e,a))}(e),0)),e.file_name||(e.file_name=""),"application/x-tgsticker"===e.mime_type&&"AnimatedSticker.tgs"===e.file_name&&(e.type="sticker",e.animated=!0,e.sticker=2),a?Object.assign(a,e):e}getDoc(e){return(0,fe.Z)(e)?e:this.docs[e]}downloadDoc(e,t,a){return this.apiFileManager.downloadMedia({media:e,queueId:t,onlyCache:a})}getLottieCachedThumb(e,t){const a=this.stickerCachedThumbs[e];return a&&a[t]}saveLottiePreview(e,t,a,s,n){var i,r,o;const p=this.getDoc(e);if(!p)return;const d=null!==(i=(r=this.stickerCachedThumbs)[o=p.id])&&void 0!==i?i:r[o]={},f=d[n];f&&f.w>=a&&f.h>=s||(d[n]={url:URL.createObjectURL(t),w:a,h:s})}saveWebPConvertedStrippedThumb(e,t){const a=this.getDoc(e);if(!a)return;const s=a.thumbs&&a.thumbs.find((e=>"photoStrippedSize"===e._));s&&(a.pFlags.stickerThumbConverted=!0,s.bytes=t)}getWallPapers(){return this.apiManager.invokeApiHashable({method:"account.getWallPapers"}).then((e=>{const t=e.wallpapers;return t.forEach((e=>{e.document=this.saveDoc(e.document)})),t}))}prepareWallPaperUpload(e){const t="wallpaper-upload-"+ ++_t,a={_:"photoSize",h:0,w:0,location:{},size:e.size,type:o.Pt};let s={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[a],file_name:e.name};s=this.saveDoc(s);const n=this.thumbsStorage.setCacheContextURL(s,void 0,URL.createObjectURL(e),e.size),i={_:"wallPaper",access_hash:"",document:s,id:t,slug:t,pFlags:{}};return this.uploadingWallPapers[t]={cacheContext:n,file:e},i}uploadWallPaper(e){const{cacheContext:t,file:a}=this.uploadingWallPapers[e];return delete this.uploadingWallPapers[e],this.apiFileManager.upload({file:a,fileName:a.name}).then((e=>this.apiManager.invokeApi("account.uploadWallPaper",{file:e,mime_type:a.type,settings:{_:"wallPaperSettings"}}).then((e=>((0,be.Z)(e),e.document=this.saveDoc(e.document),this.thumbsStorage.setCacheContextURL(e.document,void 0,t.url,t.downloaded),e)))))}getGifs(){return this.apiManager.invokeApiHashable({method:"messages.getSavedGifs",processResult:e=>((0,be.Z)(e),e.gifs.map((e=>this.saveDoc(e))))})}requestDocPart(e,t,a,s){const n=this.getDoc(e);return n?this.apiFileManager.requestFilePart(t,(0,mt.Z)(n),a,s):Promise.reject((0,X.Z)("NO_DOC"))}}var bt=a(6034);class Pt extends G{constructor(){super(...arguments),this.drafts={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateDraftMessage:e=>{const t=this.appPeersManager.getPeerId(e.peer);this.saveDraft(t,e.threadId,e.draft,{notify:!0})}}),h.Z.get("drafts").then((e=>{this.drafts=e||{}}))}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then((()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();this.appMessagesManager.getDialogOnly(t)||this.appMessagesManager.reloadConversation(t)}}))}getAllDrafts(){var e;return null!==(e=this.getAllDraftPromise)&&void 0!==e?e:this.getAllDraftPromise=this.apiManager.invokeApi("messages.getAllDrafts").then((e=>{(this.apiUpdatesManager.updatesState.syncLoading||Promise.resolve()).then((()=>{this.apiUpdatesManager.processUpdateMessage(e)}))}))}saveDraft(e,t,a,s={}){const n=this.processApiDraft(a),i=this.getKey(e,t);return n?this.drafts[i]=n:delete this.drafts[i],h.Z.set({drafts:this.drafts}),s.notify&&this.rootScope.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:n,force:s.force}),n}isEmptyDraft(e){return!e||"draftMessageEmpty"===e._||!(e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(e&&"draftMessage"===e._)return e.reply_to_msg_id&&(e.reply_to_msg_id=(0,pe.Z)(e.reply_to_msg_id)),e}syncDraft(e,t,a,s=!0,n=!1){return i=this,r=void 0,p=function*(){const i=this.getDraft(e,t);if((0,bt.Z)(i,a))return!0;const r={peer:this.appPeersManager.getInputPeerById(e),message:""};let o;if(this.isEmptyDraft(a))o={_:"draftMessageEmpty"};else{(0,be.Z)(a);const e=a.message,t=a.entities;a.reply_to_msg_id&&(r.reply_to_msg_id=(0,oe.Z)(a.reply_to_msg_id)),(null==t?void 0:t.length)&&(r.entities=this.appMessagesManager.getInputEntities(t)),a.pFlags.no_webpage&&(r.no_webpage=a.pFlags.no_webpage),r.message=e}const p=o||a;return p.date=(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),this.saveDraft(e,t,p,{notify:!0,force:n}),!(s&&!t)||this.apiManager.invokeApi("messages.saveDraft",r)},new((o=void 0)||(o=Promise))((function(e,t){function a(e){try{n(p.next(e))}catch(e){t(e)}}function s(e){try{n(p.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(a,s)}n((p=p.apply(i,r||[])).next())}));var i,r,o,p}clearAllDrafts(){return this.apiManager.invokeApi("messages.clearAllDrafts").then((e=>{if(e)for(const e in this.drafts){const[t,a]=e.split("_");this.rootScope.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:a?+a:void 0,draft:void 0})}}))}clearDraft(e,t){const a={_:"draftMessageEmpty"};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft(e,t,a,{notify:!0,force:!0})}setDraft(e,t,a,s){const n={_:"draftMessage",date:Date.now()/1e3|0,message:a,pFlags:{},entities:s};t?this.syncDraft(e,t,n,!1,!0):this.saveDraft(e,t,n,{notify:!0,force:!0})}}var Mt=a(946),St=a(7746);const It={keywords:{},version:0,langCode:_.Z.langPackCode};class Ct extends G{constructor(){super(...arguments),this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={},this.recent={},this.getRecentEmojisPromises={},this.getCustomEmojiDocumentPromises=new Map}getEmojiKeywords(e=_.Z.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const a="emojiKeywords_"+e;return this.getKeywordsPromises[e]=h.Z.get(a).then((t=>((0,fe.Z)(t)||(t={}),(0,Mt.Z)(It,t),t.langCode=e,this.keywordLangPacks[e]=t,this.apiManager.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then((e=>{t.version=e.version;const s=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return this.networkerFactory.language!==_.Z.langPackCode&&e.push(this.getEmojiKeywords(this.networkerFactory.language)),this.recent.native||e.push(this.getRecentEmojis("native")),Promise.all(e)}indexEmojis(){this.index||(this.index=new ae.Z(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const a=t[e];this.index.indexObject(a,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const a=this.index.search(e);t=Array.from(a).reduce(((e,t)=>e.concat(t)),[])}else t=this.recent.native.concat(Ct.POPULAR_EMOJI).slice(0,32);return t=Array.from(new Set(t)),t}getRecentEmojis(e){var t;const a=this.getRecentEmojisPromises;return null!==(t=a[e])&&void 0!==t?t:a[e]=this.appStateManager.getState().then((t=>{let a=[];if("native"===e){const{recentEmoji:e}=t;a=Array.isArray(e)&&e.length?e:Ct.POPULAR_EMOJI}else{const{recentCustomEmoji:e}=t;a=Array.isArray(e)&&e.length?e:[]}return this.recent[e]=a}))}pushRecentEmoji(e){const t=e.docId?"custom":"native";e.emoji=(0,St.Z)(e.emoji),this.getRecentEmojis(t).then((a=>{const s=e.docId||e.emoji;(0,M.Z)(a,s),a.unshift(s),a.splice(32,a.length-32),this.appStateManager.pushToState("custom"===t?"recentCustomEmoji":"recentEmoji",a),this.rootScope.dispatchEvent("emoji_recent",e)}))}getCustomEmojiDocuments(e){return e.length?this.apiManager.invokeApi("messages.getCustomEmojiDocuments",{document_id:e}).then((e=>e.map((e=>this.appDocsManager.saveDoc(e,{type:"customEmoji",docId:e.id}))))):Promise.resolve([])}getCachedCustomEmojiDocuments(e){return e.map((e=>this.appDocsManager.getDoc(e)))}setDebouncedGetCustomEmojiDocuments(){!this.getCustomEmojiDocumentsPromise&&this.getCustomEmojiDocumentPromises.size&&(this.getCustomEmojiDocumentsPromise=(0,b.Z)(0).then((()=>{const e=[...this.getCustomEmojiDocumentPromises.keys()],t=[];do{const a=e.splice(0,100),s=this.getCustomEmojiDocuments(a).then((e=>{e.forEach(((e,t)=>{const s=a[t],n=this.getCustomEmojiDocumentPromises.get(s);this.getCustomEmojiDocumentPromises.delete(s),n.resolve(e)}))}));t.push(s)}while(e.length);return Promise.all(t)})).finally((()=>{this.getCustomEmojiDocumentsPromise=void 0,this.setDebouncedGetCustomEmojiDocuments()})))}getCustomEmojiDocument(e){let t=this.getCustomEmojiDocumentPromises.get(e);if(t)return t;return this.appDocsManager.getDoc(e)||(t=(0,v.Z)(),this.getCustomEmojiDocumentPromises.set(e,t),this.setDebouncedGetCustomEmojiDocuments(),t)}getCustomEmojis(){return this.appStickersManager.getEmojiStickers()}}Ct.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];var wt=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class kt extends G{after(){this.log=(0,S.kg)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,this.apiUpdatesManager.addMultipleEventsListeners({updateGroupCall:e=>{this.saveGroupCall(e.call,e.chat_id)},updateGroupCallParticipants:e=>{this.saveGroupCall(e.call);const t=e.call.id;this.saveApiParticipants(t,e.participants)}}),this.rootScope.addEventListener("group_call_update",(e=>{"groupCallDiscarded"===e._&&this.participants.delete(e.id)}))}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,a=t.get(e);return{nextOffset:a,setNextOffset:s=>{t.get(e)===a&&t.set(e,s)}}}saveApiParticipant(e,t,a){const s=this.getCachedParticipants(e),n=(0,le.Z)(t.peer),i=s.get(n),r=t.pFlags.left;if(!i&&r)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0),i?(re(i,t),t=i):s.set(n,t);const o=this.getGroupCall(e);if("groupCall"===(null==o?void 0:o._)){let e=!1;r?(--o.participants_count,e=!0):!t.pFlags.just_joined||i||t.pFlags.self||(++o.participants_count,e=!0),e&&this.rootScope.dispatchEvent("group_call_update",o)}r&&s.delete(n),this.rootScope.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,a){t.saved||(t.saved=!0,t.forEach((t=>this.saveApiParticipant(e,t,a))))}editParticipant(e,t,a){return wt(this,void 0,void 0,(function*(){this.saveApiParticipant(e,t);const s=t.pFlags.self?o.NM:(0,le.Z)(t.peer),n=yield this.apiManager.invokeApiSingle("phone.editGroupCallParticipant",{call:this.getGroupCallInput(e),participant:s===o.NM?this.appPeersManager.getInputPeerSelf():this.appPeersManager.getInputPeerById(s),muted:a.muted,volume:a.volume,raise_hand:a.raiseHand,video_paused:a.videoPaused,video_stopped:a.videoStopped,presentation_paused:a.presentationPaused});this.apiUpdatesManager.processUpdateMessage(n)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return wt(this,void 0,void 0,(function*(){const a=this.getGroupCall(e);if(a&&"inputGroupCall"!==a._&&!t)return a;const s=this.getCachedParticipants(e).size?0:100;return this.apiManager.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:s},processResult:t=>{this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const a=this.saveGroupCall(t.call);return s&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),a}})}))}saveGroupCall(e,t){const a=this.groupCalls.get(e.id),s="inputGroupCall"!==e._&&(!a||"groupCallDiscarded"!==a._);return a?(s&&re(a,e),e=a):this.groupCalls.set(e.id,e),s&&this.rootScope.dispatchEvent("group_call_update",e),e}createGroupCall(e,t,a){return wt(this,void 0,void 0,(function*(){const s=yield this.apiManager.invokeApi("phone.createGroupCall",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),random_id:(0,Ee.d)(32),schedule_date:t,title:a});return this.apiUpdatesManager.processUpdateMessage(s),s.updates.find((e=>"updateGroupCall"===e._)).call}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}getGroupCallParticipants(e){return wt(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:a}=this.prepareToSavingNextOffset(e);return""!==t&&(yield this.apiManager.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const s=t.count===t.participants.length?"":t.next_offset;this.appChatsManager.saveApiChats(t.chats),this.appUsersManager.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),a(s)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t){const a=this.getGroupCallInput(e);let s;return s="boolean"==typeof t&&t?this.apiManager.invokeApi("phone.discardGroupCall",{call:a}):"number"==typeof t?this.apiManager.invokeApi("phone.leaveGroupCall",{call:a,source:t}):this.apiManager.invokeApi("phone.joinGroupCall",{call:a,join_as:this.appPeersManager.getInputPeerSelf(),muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}joinGroupCall(e,t,a){return wt(this,void 0,void 0,(function*(){const s=this.getGroupCallInput(e);let n;if("main"===a.type){const i={call:s,join_as:this.appPeersManager.getInputPeerSelf(),params:t,muted:a.isMuted,video_stopped:!a.joinVideo};n=this.apiManager.invokeApi("phone.joinGroupCall",i),this.log(`[api] joinGroupCall id=${e}`,i)}else{const a={call:s,params:t};n=this.apiManager.invokeApi("phone.joinGroupCallPresentation",a),this.log(`[api] joinGroupCallPresentation id=${e}`,a)}const i=yield n;return this.apiUpdatesManager.processUpdateMessage(i),i.updates.find((e=>"updateGroupCallConnection"===e._))}))}leaveGroupCallPresentation(e){return this.apiManager.invokeApi("phone.leaveGroupCallPresentation",{call:this.getGroupCallInput(e)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}}function At(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}function Dt(e){return{_:"inputMediaPhoto",id:At(e),ttl_seconds:0}}var Ut=a(515);function Et(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}class Rt extends G{constructor(){super(...arguments),this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,a="",s="",n){return this.apiManager.invokeApi("messages.getInlineBotResults",{bot:this.appUsersManager.getUserInput(t),peer:this.appPeersManager.getInputPeerById(e),query:a,geo_point:n?this.getGeoInput(n):void 0,offset:s},{stopTime:-1,noErrorBox:!0}).then((e=>{const t=e.query_id;return e.results.forEach((e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=this.appDocsManager.saveDoc(e.document)),e.photo&&(e.photo=this.appPhotosManager.savePhoto(e.photo))),this.inlineResults[(0,Ut.Z)(t,e.id)]=e})),e}))}pushPopularBot(e){this.appUsersManager.getTopPeers("bots_inline").then((t=>{const a=e.toPeerId(),s=t.findIndex((e=>e.id===a));let n;n=-1!==s?t[s]:{id:a,rating:0},++n.rating,(0,ie.Z)(t,n,"rating"),this.appStateManager.setKeyValueToStorage("topPeersCache")}))}switchToPM(e,t,a){return this.setHash[t]={peerId:e,time:Date.now()},this.appMessagesManager.startBot(t,void 0,a)}checkSwitchReturn(e){return t=this,a=void 0,n=function*(){const t=this.appUsersManager.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const a=this.setHash[e];return a&&(delete this.setHash[e],Date.now()-a.time<36e5)?a.peerId:void 0},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}switchInlineQuery(e,t,a,s){this.appDraftsManager.setDraft(e,t,"@"+this.appUsersManager.getUser(a).username+" "+s)}callbackButtonClick(e,t,a){return this.apiManager.invokeApi("messages.getBotCallbackAnswer",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t),data:a.data},{stopTime:-1,noErrorBox:!0})}sendInlineResult(e,t,a,s={}){const n=this.inlineResults[a];if(!n)return;this.pushPopularBot(t);const i=a.split("_"),r=i.shift(),o=i.join("_");if(s.viaBotId=t,s.queryId=r,s.resultId=o,n.send_message.reply_markup&&(s.replyMarkup=n.send_message.reply_markup),"botInlineMessageText"===n.send_message._)s.entities=n.send_message.entities,this.appMessagesManager.sendText(e,n.send_message.message,s);else{let t,a,i="";const r=n.send_message;switch(r._){case"botInlineMessageMediaAuto":if(i=r.message,"botInlineMediaResult"===n._){const{document:e,photo:a}=n;t=e?Et(e):Dt(a)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(r.geo)},s.geoPoint=r.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(r.geo),title:r.title,address:r.address,provider:r.provider,venue_id:r.venue_id,venue_type:r.venue_type},s.geoPoint=r.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:r.phone_number,first_name:r.first_name,last_name:r.last_name,vcard:r.vcard};break;case"botInlineMessageMediaInvoice":a={_:"messageMediaInvoice",title:r.title,description:r.description,photo:r.photo,currency:r.currency,total_amount:r.total_amount,pFlags:{shipping_address_requested:r.pFlags.shipping_address_requested,test:r.pFlags.test},start_param:void 0}}!t&&a&&(t={_:"messageMediaPending",messageMedia:a}),this.appMessagesManager.sendOther(e,t,s)}}}var Tt=a(7082);class Ft{constructor(){this.tempNum=0}generateTempMessageId(e){const t=++this.tempNum;return(0,pe.Z)(e)+(t&Tt.o-1)}}var xt=a(4421);const Bt=(0,X.Z)("MIDDLEWARE");class Vt{constructor(){this.details={cleaned:!1,inner:[],onCleanCallbacks:[]},this.onDestroyCallbacks=[],this.onDestroy=e=>{if(this.destroyed)return e();this.onDestroyCallbacks.push(e)}}clean(){const e=this.details;e.cleaned=!0,e.inner.splice(0,e.inner.length).forEach((e=>e.destroy())),e.onCleanCallbacks.splice(0,e.onCleanCallbacks.length).forEach((e=>e())),this.details={cleaned:!1,inner:[],onCleanCallbacks:[]}}destroy(){this.destroyed=!0,this.clean(),this.onDestroyCallbacks.splice(0,this.onDestroyCallbacks.length).forEach((e=>e())),this.parent&&((0,M.Z)(this.parent.details.inner,this),this.parent=void 0)}get(e){const t=this.details,a=()=>!t.cleaned&&(!e||e());return a.create=()=>{if(!a())throw Bt;const e=new Vt;return e.parent=this,t.inner.push(e),e},a.onClean=e=>{if(!a())return e();t.onCleanCallbacks.push(e)},a.onDestroy=this.onDestroy,a}}var Lt=a(7401);function Ot(e,t){if(e.length{let o=e.slice(s,r);const p=n++;o.length>t&&(Ot(o.slice(t),t).forEach((e=>{i[n++]=e})),o=o.slice(0,t)),s=r,a=0,i[p]=(i[p]||"")+o};let o=0;for(;;){let s=e.indexOf(" ",o);if(-1===s){o!==e.length-1&&r();break}s+=" ".length;const n=s-o;a+n>t&&r(a),o=s,a+=n}return i}var Nt=a(5701),Zt=a(7667),qt=a(6241),jt=a(6535),Gt=a(6566),Ht=a(2202),Wt=a(319);const zt=new class{constructor(){this.tabs=new Map}start(){f.Z.getInstance().addEventListener("tabState",((e,t)=>{this.tabs.get(t).state=e}))}getTabs(){return[...this.tabs.values()].filter((e=>!!e.state))}addTab(e){const t={source:e,state:void 0};this.tabs.set(e,t)}deleteTab(e){this.tabs.delete(e)}};d.GO&&(d.GO.appTabsManager=zt);const Kt=zt;var Jt=a(2381),Qt=a(13);function $t(e){return{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}var Yt=a(5285),Xt=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const ea=e=>{e()},ta=!0;class aa extends G{constructor(){super(...arguments),this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new xt.Z(10),this.needSingleMessages=new Map,this.fetchSingleMessagesPromise=null,this.extendedMedia=new Map,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newDialogsToHandle=new Map,this.newUpdatesAfterReloadToHandle={},this.notificationsHandlePromise=0,this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=(0,S.kg)("MESSAGES",S.v9.Error|S.v9.Debug|S.v9.Log|S.v9.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.batchUpdates={},this.clear=e=>{this.middleware?this.middleware.clean():(this.middleware=new Vt,this.uploadFilePromises={}),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(e),this.filtersStorage&&this.filtersStorage.clear(e)},this.handleNewDialogs=()=>{let e=0;const t=this.newDialogsToHandle;for(const[a,s]of t){let n=!1;s?this.dialogsStorage.getDialogOnly(a)&&(this.dialogsStorage.pushDialog(s),this.appPeersManager.isChannel(a)||(e=Math.max(e,s.top_message||0)),n=!0):this.reloadConversation(a.toPeerId()),n||t.delete(a)}0!==e&&this.incrementMaxSeenId(e),this.rootScope.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle.clear()},this.handleNotifications=()=>{R.Z.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=0;for(const e in this.notificationsToHandle){const t=e.toPeerId(),a=this.notificationsToHandle[t];this.getNotifyPeerSettings(t).then((({muted:e,peerTypeNotifySettings:t})=>{const s=a.topMessage;e&&!s.pFlags.mentioned||!s.pFlags.unread||s.pFlags.unread&&this.notifyAboutMessage(s,{fwdCount:a.fwdCount,peerTypeNotifySettings:t})}))}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id,a=this.pendingByRandomId[t];if(a){const{peerId:s,tempId:n,threadId:i,storage:r}=a,o=(0,pe.Z)(e.id),p=this.getMessageFromStorage(r,o);p?([this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)})),this.finalizePendingMessageCallbacks(r,n,p)):this.pendingByMessageId[o]=t}},this.onUpdateNewMessage=e=>{var t;const a=e.message,s=this.getMessagePeer(a),n=this.getHistoryMessagesStorage(s),i=this.getDialogOnly(s),r="updateNewDiscussionMessage"===e._;this.saveMessages([a],{storage:this.createMessageStorage(s,"history")});const p=this.getThreadKey(a),d=p?+p.split("_")[1]:void 0;if(d&&!r&&this.threadsStorage[s]&&this.threadsStorage[s][d]){const e={_:"updateNewDiscussionMessage",message:a};this.onUpdateNewMessage(e)}if("messageService"===a._&&"messageActionPaymentSent"===a.action._&&a.reply_to&&this.rootScope.dispatchEvent("payment_sent",{peerId:a.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(a.reply_to.reply_to_peer_id):a.peerId,mid:a.reply_to_mid,receiptMessage:a}),!i&&!r){let a=!0;if(s.isAnyChat()&&(a=this.appChatsManager.isInChat(s.toChatId())),a){const a=null!==(t=this.newUpdatesAfterReloadToHandle[s])&&void 0!==t?t:this.newUpdatesAfterReloadToHandle[s]=new Set;if(a.has(e))return void this.log.error("here we go again",s);e.ignoreExisting=!0,a.add(e),this.scheduleHandleNewDialogs(s)}return}this.saveMessages([a],{storage:n}),this.checkPendingMessage(a);const f=this.getHistoryStorage(s,r?d:void 0);r||this.updateMessageRepliesIfNeeded(a);const c=e.ignoreExisting;if(f.history.findSlice(a.mid)){if(!c)return!1}else{const e=f.history.first;if(e.isEnd(se.D.Bottom)){let t=0;for(const s=e.length;te[t]);++t);e.splice(t,0,a.mid)}else f.history.unshift(a.mid);null!==f.count&&f.count++}this.mergeReplyKeyboard(f,a)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:s});const l=a.fromId;if(l.isUser()&&!a.pFlags.out&&a.from_id){this.appUsersManager.forceUserOnline(l,a.date);const e={_:"sendMessageCancelAction"};let t;t=s.isUser()?{_:"updateUserTyping",action:e,user_id:l}:this.appPeersManager.isChannel(s)?{_:"updateChannelUserTyping",action:e,channel_id:s.toChatId(),from_id:this.appPeersManager.getOutputPeer(l),top_msg_id:d?(0,oe.Z)(d):void 0}:{_:"updateChatUserTyping",action:e,chat_id:s.toChatId(),from_id:this.appPeersManager.getOutputPeer(l)},this.apiUpdatesManager.processLocalUpdate(t)}if(this.handleNewMessage(a),r)return;const m=!a.pFlags.out&&a.pFlags.unread;if(i){if(m&&a.mid>i.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(i);++i.unread_count,a.pFlags.mentioned&&(++i.unread_mentions_count,this.modifyCachedMentions(s,a.mid,!0)),e()}a.mid>=i.top_message&&this.setDialogTopMessage(a,i)}if(m){const e=s;let t=this.notificationsToHandle[e];void 0===t&&(t=this.notificationsToHandle[e]={fwdCount:0,fromId:o.NM}),t.fromId!==l&&(t.fromId=l,t.fwdCount=0),a.fwd_from&&++t.fwdCount,t.topMessage=a,this.notificationsHandlePromise||(this.notificationsHandlePromise=R.Z.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{const{peer:t,msg_id:a,reactions:s}=e,n=(0,pe.Z)(a),i=this.appPeersManager.getPeerId(t),r=this.getMessageByPeer(i,n);if("message"!==(null==r?void 0:r._))return;const o=null==s?void 0:s.recent_reactions;if((null==o?void 0:o.length)&&r.pFlags.out){const e=o[o.length-1],t=r.reactions,a=null==t?void 0:t.recent_reactions;this.appPeersManager.getPeerId(e.peer_id)===this.appPeersManager.peerId||a&&!(a.length<=o.length)||a&&(0,Y.Z)(e,a[a.length-1])||this.getNotifyPeerSettings(i).then((({muted:t,peerTypeNotifySettings:a})=>{a.show_previews&&this.notifyAboutMessage(r,{peerReaction:e,peerTypeNotifySettings:a})}))}const p=r.peerId+"_"+r.mid;this.pushBatchUpdate("messages_reactions",this.batchUpdateReactions,p,(()=>(0,_e.Z)(r.reactions))),r.reactions=s,e.local||this.setDialogToStateIfMessageIsTop(r)},this.onUpdateDialogUnreadMark=e=>{const t=this.appPeersManager.getPeerId(e.peer.peer),a=this.getDialogOnly(t);if(a){const s=this.dialogsStorage.prepareDialogUnreadCountModifying(a);e.pFlags.unread?a.pFlags.unread_mark=!0:delete a.pFlags.unread_mark,s(),this.dialogsStorage.setDialogToState(a),this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,a]]))}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=(0,pe.Z)(t.id),n=this.getHistoryMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s);this.saveMessages([t],{storage:n});const r=this.getMessageFromStorage(n,s);this.handleEditedMessage(i,r,n);const o=this.getDialogOnly(a),p=o&&o.top_message===s;if(t.clear_history)p&&this.rootScope.dispatchEvent("dialog_flush",{peerId:a,dialog:o});else{let e=!0;if("message"===(null==i?void 0:i._)&&!(0,Y.Z)(i.reactions,r.reactions)){const s=r.reactions;r.reactions=i.reactions,this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:this.appPeersManager.getOutputPeer(a),msg_id:t.id,reactions:s}),e=!1}e&&this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:a,mid:s,message:t}),p&&this.dialogsStorage.setDialogToState(o),(p||t.grouped_id)&&o&&this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[a,o]]))}},this.onUpdateReadHistory=e=>{const t=e.channel_id,a=(0,pe.Z)(e.max_id||e.read_max_id),s=(0,pe.Z)(e.top_msg_id),n=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),i="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=this.getHistoryMessagesStorage(n),o=(0,Lt.Z)(r,"desc"),p=this.getDialogOnly(n),d=e.still_unread_count;let f=0,c=0,l=!1;const m=this.getHistoryStorage(n,s);if(n.isUser()&&i&&this.appUsersManager.forceUserOnline(n),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const g=!s&&p&&this.dialogsStorage.prepareDialogUnreadCountModifying(p);for(let e=0,t=o.length;ea)continue;const m=r.get(t);if(m.pFlags.out===i){if(!m.pFlags.unread)break;if(s){const e=m.reply_to;if(!e||(e.reply_to_top_id||e.reply_to_msg_id)!==s)continue}m.pFlags.unread&&(delete m.pFlags.unread,l||(l=!0),m.pFlags.out||s||!p||(void 0===d&&(f=--p.unread_count),m.pFlags.mentioned&&(c=--p.unread_mentions_count,this.modifyCachedMentions(n,m.mid,!1))),this.rootScope.dispatchEvent("notification_cancel","msg"+t))}}if(i?m.readOutboxMaxId=a:m.readMaxId=a,!s&&p){if(i?p.read_outbox_max_id=a:p.read_inbox_max_id=a,!i){let e;void 0!==d?e=d:f<0||!this.getReadMaxIdIfUnread(n)?e=0:f&&p.top_message>a&&(e=f),void 0!==e&&(p.unread_count=e),(c<0||!p.unread_count)&&(p.unread_mentions_count=0)}g&&g(),this.dialogsStorage.processDialogForFilters(p),this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:p}),this.dialogsStorage.setDialogToState(p)}if(l&&this.rootScope.dispatchEvent("messages_read"),!s&&t){const e=n+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,a]=this.threadsToReplies[t].split("_");this.rootScope.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+a))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,a=e.messages.map((e=>(0,pe.Z)(e))),s=t?t.toPeerId(!0):this.findPeerIdByMids(a);for(let e=0,t=a.length;e{const t=e.channel_id.toPeerId(!0),a=this.getHistoryStorage(t).history.slice,s=(0,pe.Z)(e.available_min_id),n=a.filter((e=>e<=s));e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{const t=e.channel_id,a=e.messages.map((e=>(0,pe.Z)(e))),s=t?t.toPeerId(!0):this.findPeerIdByMids(a);if(!s)return;this.apiManager.clearCache("messages.getSearchCounters",(e=>this.appPeersManager.getPeerId(e.peer)===s));const n=new Set;for(const e of a){const t=this.getMessageByPeer(s,e),a=this.getThreadKey(t);a&&this.threadsStorage[s]&&this.threadsStorage[s][+a.split("_")[1]]&&n.add(a)}const i=this.handleDeletedMessages(s,this.getHistoryMessagesStorage(s),a),r=Array.from(n).map((e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)})),o=this.getHistoryStorage(s);[o].concat(r).forEach((e=>{for(const t of i.msgs)e.history.delete(t);i.count&&e.count&&(e.count=Math.max(0,e.count-i.count))})),this.rootScope.dispatchEvent("history_delete",{peerId:s,msgs:i.msgs});const p=this.getDialogOnly(s);if(p){const e=i.unreadMentions||i.unread,t=e&&this.dialogsStorage.prepareDialogUnreadCountModifying(p);if(i.unread&&(p.unread_count=Math.max(0,p.unread_count-i.unread)),i.unreadMentions&&(p.unread_mentions_count=p.unread_count?Math.max(0,p.unread_mentions_count-i.unreadMentions):0),e&&(t(),this.rootScope.dispatchEvent("dialog_unread",{peerId:s,dialog:p})),i.msgs.has(p.top_message)){const e=o.history.first;if(e.isEnd(se.D.Bottom)&&e.length){const t=e[0],a=this.getMessageByPeer(s,t);this.setDialogTopMessage(a,p)}else this.reloadConversation(s)}}},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=this.appChatsManager.getChat(t),n=this.appChatsManager.isInChat(t);(!!s.username||!s.pFlags.left)!=(void 0!==this.historiesStorage[a])&&(delete this.historiesStorage[a],this.rootScope.dispatchEvent("history_forbidden",a)),!!this.getDialogOnly(a)!==n&&(n?this.reloadConversation(a):this.dialogsStorage.dropDialogOnDeletion(a)),this.rootScope.dispatchEvent("channel_update",t)},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.flushStoragesByPeerId(t),this.reloadConversation(t).then((()=>{this.rootScope.dispatchEvent("history_reload",t)}))},this.onUpdateChannelMessageViews=e=>{const t=e.views,a=e.channel_id.toPeerId(!0),s=(0,pe.Z)(e.id),n=this.getMessageByPeer(a,s);void 0!==(null==n?void 0:n.views)&&n.views{var t;if(null===(t=e.pFlags)||void 0===t?void 0:t.popup)return void this.rootScope.dispatchEvent("service_notification",e);const a=o.yF,s=a,n=this.generateTempMessageId(s),i={_:"message",id:n,from_id:this.appPeersManager.getOutputPeer(a),peer_id:this.appPeersManager.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||(0,te.Z)(!0))+this.timeManager.getServerTimeOffset(),message:e.message,media:e.media,entities:e.entities};this.appUsersManager.hasUser(a)||this.appUsersManager.saveApiUsers([{_:"user",id:a,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([i],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=n,this.onUpdateNewMessage({_:"updateNewMessage",message:i,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,a=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),s=e.messages.map((e=>(0,pe.Z)(e))),n=this.getHistoryMessagesStorage(a),i=s.filter((e=>!n.has(e)));(i.length?Promise.all(i.map((e=>this.reloadMessages(a,e)))):Promise.resolve()).finally((()=>{var t;const i=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(i)for(const e of s)n.get(e).pFlags.pinned=!0;else for(const e of s)delete n.get(e).pFlags.pinned;delete this.pinnedMessages[a],this.appStateManager.getState().then((e=>{delete e.hiddenPinnedMessages[a],this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:a,mids:s,pinned:i})}))}))},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:a}=e;if("notifyPeer"===t._){const e=this.appPeersManager.getPeerId(t.peer),s=this.getDialogOnly(e);s&&(s.notify_settings=a,this.rootScope.dispatchEvent("dialog_notify_settings",s),this.dialogsStorage.setDialogToState(s))}},this.onUpdateNewScheduledMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=this.scheduledMessagesStorage[a];if(!s)return;const n=(0,pe.Z)(t.id),i=this.getMessageFromStorage(s,n);this.saveMessages([t],{storage:s,isScheduled:!0});const r=this.getMessageFromStorage(s,n);i?(this.handleEditedMessage(i,r,s),this.rootScope.dispatchEvent("message_edit",{storageKey:s.key,peerId:a,mid:t.mid,message:t})):this.checkPendingMessage(t)||this.rootScope.dispatchEvent("scheduled_new",t)},this.onUpdateDeleteScheduledMessages=e=>{const t=this.appPeersManager.getPeerId(e.peer),a=this.scheduledMessagesStorage[t];if(a){const s=e.messages.map((e=>(0,pe.Z)(e)));this.handleDeletedMessages(t,a,s),this.rootScope.dispatchEvent("scheduled_delete",{peerId:t,mids:s})}},this.onUpdateMessageExtendedMedia=e=>{var t;const a=this.appPeersManager.getPeerId(e.peer),s=(0,pe.Z)(e.msg_id),n=this.getHistoryMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s),r=i.media;"messageExtendedMedia"!==(null===(t=r.extended_media)||void 0===t?void 0:t._)&&(r.extended_media=e.extended_media,this.onUpdateEditMessage({_:"updateEditMessage",message:i,pts:0,pts_count:0}))},this.batchUpdateViews=e=>{const t=[],a=this.getMessagesFromMap(e);for(const[e]of a)t.push({peerId:e.peerId,mid:e.mid,views:e.views});return t},this.batchUpdateReactions=e=>{var t,a,s;const n=[],i=this.getMessagesFromMap(e);for(const[e,r]of i){const i=null!==(a=null===(t=e.reactions)||void 0===t?void 0:t.results)&&void 0!==a?a:[],o=null!==(s=null==r?void 0:r.results)&&void 0!==s?s:[],p=i.filter((t=>{const a=o.find((e=>(0,Yt.Z)(e.reaction,t.reaction)));return e.pFlags.out&&(!a||t.count>a.count)||void 0!==t.chosen_order&&(!a||void 0===a.chosen_order)}));n.push({message:e,changedResults:p})}return n}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateMessageReactions:this.onUpdateMessageReactions,updateReadChannelDiscussionInbox:this.onUpdateReadHistory,updateReadChannelDiscussionOutbox:this.onUpdateReadHistory,updateReadHistoryInbox:this.onUpdateReadHistory,updateReadHistoryOutbox:this.onUpdateReadHistory,updateReadChannelInbox:this.onUpdateReadHistory,updateReadChannelOutbox:this.onUpdateReadHistory,updateChannelReadMessagesContents:this.onUpdateReadMessagesContents,updateReadMessagesContents:this.onUpdateReadMessagesContents,updateChannelAvailableMessages:this.onUpdateChannelAvailableMessages,updateDeleteMessages:this.onUpdateDeleteMessages,updateDeleteChannelMessages:this.onUpdateDeleteMessages,updateChannel:this.onUpdateChannel,updateChannelReload:this.onUpdateChannelReload,updateChannelMessageViews:this.onUpdateChannelMessageViews,updateServiceNotification:this.onUpdateServiceNotification,updatePinnedMessages:this.onUpdatePinnedMessages,updatePinnedChannelMessages:this.onUpdatePinnedMessages,updateNotifySettings:this.onUpdateNotifySettings,updateNewScheduledMessage:this.onUpdateNewScheduledMessage,updateDeleteScheduledMessages:this.onUpdateDeleteScheduledMessages,updateMessageExtendedMedia:this.onUpdateMessageExtendedMedia}),this.rootScope.addEventListener("notify_peer_type_settings",(({key:e,settings:t})=>{let a;a="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>this.appPeersManager.isBroadcast(e.peerId):e=>this.appPeersManager.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(a).forEach((e=>{this.rootScope.dispatchEvent("dialog_notify_settings",e)}))})),this.rootScope.addEventListener("webpage_updated",(({id:e,msgs:t})=>{t.forEach((({peerId:t,mid:a,isScheduled:s})=>{const n=s?this.getScheduledMessagesStorage(t):this.getHistoryMessagesStorage(t),i=this.getMessageFromStorage(n,a);i&&(i.media={_:"messageMediaWebPage",webpage:this.appWebPagesManager.getCachedWebPage(e)},this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:t,mid:a,message:i}))}))})),this.rootScope.addEventListener("draft_updated",(({peerId:e,threadId:t,draft:a})=>{if(t)return;const s=this.getDialogOnly(e);if(s){if(!t){s.draft=a;let t=!1;a||(0,oe.Z)(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog(s)):(this.dialogsStorage.dropDialog(e),t=!0),this.rootScope.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a})}}else this.reloadConversation(e)})),this.rootScope.addEventListener("poll_update",(({poll:e})=>{const t=this.appPollsManager.pollToMessages[e.id];if(t)for(const e of t){const[t,a]=e.split("_"),s=this.getMessageByPeer(t.toPeerId(),+a);s&&this.setDialogToStateIfMessageIsTop(s)}})),this.batchUpdatesDebounced=(0,Nt.Z)((()=>{for(const e in this.batchUpdates){const t=this.batchUpdates[e];delete this.batchUpdates[e];const a=t.callback(t.batch);!a||a instanceof Array&&!a.length||rootScope.dispatchEvent(e,a)}}),33,!1,!0),this.appStateManager.getState().then((e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)}))}getInputEntities(e){const t=(0,_e.Z)(e);return t.forEach((e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=this.appUsersManager.getUserInput(e.user_id))})),t}invokeAfterMessageIsSent(e,t,a){var s,n;const i=null!==(s=this.tempFinalizeCallbacks[e])&&void 0!==s?s:this.tempFinalizeCallbacks[e]={},r=null!==(n=i[t])&&void 0!==n?n:i[t]={deferred:(0,v.Z)()};return r.callback=a,r.deferred}editMessage(e,t,a={}){const{mid:s,peerId:n}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(s,"edit",(e=>this.editMessage(e,t,a)));const i=a.entities||[];t&&(t=(0,ke.Z)(t,i));const r=a.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return this.apiManager.invokeApi("messages.editMessage",{peer:this.appPeersManager.getInputPeerById(n),id:e.id,message:t,media:a.newMedia,entities:i.length?this.getInputEntities(i):void 0,no_webpage:a.noWebPage,schedule_date:r}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0}))}sendText(e,t,a={}){var s,n;return Xt(this,void 0,void 0,(function*(){if(!t.trim())return;null!==(s=a.entities)&&void 0!==s||(a.entities=[]),a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId);const i=(yield this.apiManager.getConfig()).message_length_max,r=Ot(t,i);t=r[0],r.length>1&&("webPage"!==(null===(n=a.webPage)||void 0===n?void 0:n._)||t.includes(a.webPage.url)||delete a.webPage),e=this.appPeersManager.getPeerMigratedTo(e)||e;const o=a.entities;a.viaBotId||(t=(0,ke.Z)(t,o));let p=this.getInputEntities(o);p.length||(p=void 0);const d=this.generateOutgoingMessage(e,a);d.entities=o,d.message=t;const f=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0,c=this.appPeersManager.isChannel(e);a.webPage&&(d.media={_:"messageMediaWebPage",webpage:a.webPage});const l=e=>{this.onMessagesSendError([d],e),this.rootScope.dispatchEvent("messages_pending")};d.send=()=>{l();const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const n=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let i;return i=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:d.random_id,reply_to_msg_id:f||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,send_as:n},s):this.apiManager.invokeApiAfter("messages.sendMessage",{no_webpage:a.noWebPage,peer:this.appPeersManager.getInputPeerById(e),message:t,random_id:d.random_id,reply_to_msg_id:f||void 0,entities:p,clear_draft:a.clearDraft,schedule_date:a.scheduleDate||void 0,silent:a.silent,send_as:n,update_stickersets_order:ta},s),this.pendingAfterMsgs[e]=s,i.then((e=>{if("updateShortSentMessage"===e._){const t=d.promise;delete d.promise;const s=(0,_e.Z)(d);ge(d,["promise"]),d.promise=t,s.date=e.date,s.id=e.id,s.media=e.media,s.entities=e.entities,this.wrapMessageEntities(s),e.pFlags.out&&(s.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:d.random_id,id:s.id},{_:a.scheduleDate?"updateNewScheduledMessage":c?"updateNewChannelMessage":"updateNewMessage",message:s,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)}));this.apiUpdatesManager.processUpdateMessage(e),d.promise.resolve()}),(e=>{throw l(e),d.promise.reject(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(d,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0});const m=[d.promise];for(let t=1;t=0){r="audio",p="audio."+("ogg"===d.split("/")[1]?"ogg":"mp3"),_="sendMessageUploadAudioAction",a.isVoiceMessage&&(r="voice",s.pFlags.media_unread=!0);const e={_:"documentAttributeAudio",pFlags:{voice:a.isVoiceMessage},waveform:a.waveform,duration:a.duration||0};g.push(e)}else if(a.isMedia)if(h){r="photo",p="photo."+d.split("/")[1],_="sendMessageUploadPhotoAction";const e={_:"photoSize",w:a.width,h:a.height,type:o.Pt,location:null,size:t.size};u={_:"photo",id:""+s.id,sizes:[e],w:a.width,h:a.height};const n=this.thumbsStorage.getCacheContext(u,e.type);n.downloaded=t.size,n.url=a.objectURL||"",u=this.appPhotosManager.savePhoto(u)}else if(i().VIDEO_MIME_TYPES_SUPPORTED.has(d)){r="video",p="video.mp4",_="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:a.isRoundMessage,supports_streaming:!0},duration:a.duration,w:a.width,h:a.height};g.push(e),a.noSound&&t.size>10240&&t.size<10485760&&g.push({_:"documentAttributeAnimated"})}else r="document",p="document."+d.split("/")[1],_="sendMessageUploadDocumentAction";else r="document",p="document."+d.split("/")[1],_="sendMessageUploadDocumentAction";if(g.push({_:"documentAttributeFilename",file_name:f||p}),-1!==["document","video","audio","voice"].indexOf(r)&&!c){const e=[];if(y={_:"document",id:""+s.id,duration:a.duration,attributes:g,w:a.width,h:a.height,thumbs:e,mime_type:d,size:t.size},a.objectURL){const e=this.thumbsStorage.getCacheContext(y);e.downloaded=t.size,e.url=a.objectURL}let n;if(h)g.push({_:"documentAttributeImageSize",w:a.width,h:a.height}),n={_:"photoSize",w:a.width,h:a.height,type:o.Pt,size:t.size};else if("video"===r&&a.thumb){n={_:"photoSize",w:a.thumb.size.width,h:a.thumb.size.height,type:"local-thumb",size:a.thumb.blob.size};const e=this.thumbsStorage.getCacheContext(y,n.type);e.downloaded=n.size,e.url=a.thumb.url}n&&e.push(n),y=this.appDocsManager.saveDoc(y)}this.log("sendFile",r,p,t.type,a);const b=(0,v.Z)(),P=c?void 0:{_:u?"messageMediaPhoto":"messageMediaDocument",pFlags:{},photo:u,document:y};P&&(ge(P,["promise"]),P.promise=b),s.entities=m,s.message=l,s.media=c?{_:"messageMediaDocument",pFlags:{},document:t}:P;const M=c?void 0:(0,Ht.Z)(t);s.uploadingFileName=M,M&&(this.uploadFilePromises[M]=b);const S=e=>{this.onMessagesSendError([s],e),this.rootScope.dispatchEvent("messages_pending")};let I=!1,C=null;s.send=()=>{if(c){const e={_:"inputMediaDocument",id:$t(t)};b.resolve(e)}else if(t instanceof File||t instanceof Blob){const n=()=>{var n;let i;return I&&!s.error||(I=!1,C=this.apiFileManager.upload({file:t,fileName:M}),C.catch((t=>{I||(this.log("cancelling upload",P),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"}),b.reject(t))})),C.addNotifyListener((t=>{const a=Math.max(1,Math.floor(100*t.done/t.total));_&&this.setTyping(e,{_,progress:0|a}),b.notifyAll(t)})),b.notifyAll({done:0,total:t.size})),"video"===r&&a.objectURL&&(null===(n=a.thumb)||void 0===n?void 0:n.blob)&&(i=this.apiFileManager.upload({file:a.thumb.blob})),C&&C.then((e=>Xt(this,void 0,void 0,(function*(){let t;if(e.name=p,I=!0,t="photo"===r?{_:"inputMediaUploadedPhoto",file:e}:{_:"inputMediaUploadedDocument",file:e,mime_type:d,pFlags:{force_file:"sendMessageUploadDocumentAction"===_||void 0},attributes:g},i)try{const e=yield i;t.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}b.resolve(t)}))),(e=>{throw S(e),e})),b};a.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return b},this.beforeMessageSending(s,{isGroupedItem:a.isGroupedItem,isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,processAfter:a.processAfter}),a.isGroupedItem||(b.then((t=>(this.setTyping(e,{_:"sendMessageCancelAction"}),this.apiManager.invokeApi("messages.sendMedia",{background:a.background,peer:this.appPeersManager.getInputPeerById(e),media:t,message:l,random_id:s.random_id,reply_to_msg_id:n,schedule_date:a.scheduleDate,silent:a.silent,entities:m,clear_draft:a.clearDraft,send_as:a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if("photo"===r&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,r="document",void s.send();throw S(e),e}))))),b.then(s.promise.resolve,s.promise.reject));const w={message:s};return ge(w,["promise"]),w.promise=b,w}sendAlbum(e,t,a={}){return Xt(this,void 0,void 0,(function*(){if(a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId),1===t.length)return this.sendFile(e,t[0],Object.assign(Object.assign({},a),a.sendFileDetails[0]));e=this.appPeersManager.getPeerMigratedTo(e)||e;const s=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0;let n=a.caption||"",i=a.entities||[];n&&(n=(0,ke.Z)(n,i)),this.log("sendAlbum",t,a);const r=""+ ++this.groupedTempId,o=[],p=e=>{o.push(e)},d=t.map(((t,o)=>{const d=a.sendFileDetails[o],f=Object.assign({isGroupedItem:!0,isMedia:a.isMedia,scheduleDate:a.scheduleDate,silent:a.silent,replyToMsgId:s,threadId:a.threadId,sendAsPeerId:a.sendAsPeerId,groupId:r,processAfter:p},d);return 0===o&&(f.caption=n,f.entities=i),this.sendFile(e,t,f).message}));a.clearDraft&&o.push((()=>{this.appDraftsManager.clearDraft(e,a.threadId)})),o.forEach((e=>{e()}));const f=(e,t)=>{this.onMessagesSendError([e],t),this.rootScope.dispatchEvent("messages_pending")},c=this.appPeersManager.getInputPeerById(e),l=t=>{this.setTyping(e,{_:"sendMessageCancelAction"});const n=(0,v.Z)();return this.sendSmthLazyLoadQueue.push({load:()=>this.apiManager.invokeApi("messages.sendMultiMedia",{peer:c,multi_media:t,reply_to_msg_id:s,schedule_date:a.scheduleDate,silent:a.silent,clear_draft:a.clearDraft,send_as:a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0,update_stickersets_order:ta}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),n.resolve()}),(e=>{d.forEach((t=>f(t,e))),n.reject(e)}))}),n},m=d.map((e=>e.send().then((e=>this.apiManager.invokeApi("messages.uploadMedia",{peer:c,media:e}))).then((t=>{let a;"messageMediaPhoto"===t._?a=Dt(this.appPhotosManager.savePhoto(t.photo)):"messageMediaDocument"===t._&&(a=Et(this.appDocsManager.saveDoc(t.document)));const s={_:"inputSingleMedia",media:a,random_id:e.random_id,message:n,entities:i};return n&&(n="",i=[]),s})).catch((t=>{throw this.log.error("sendAlbum upload item error:",t,e),f(e,t),t}))));return Promise.all(m).then((e=>l(e.filter(Boolean))))}))}sendContact(e,t){return this.sendOther(e,this.appUsersManager.getContactMediaInput(t))}sendOther(e,t,a={}){var s;e=this.appPeersManager.getPeerMigratedTo(e)||e;const n=this.generateOutgoingMessage(e,a),i=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+n.id;t.poll.id=e,this.appPollsManager.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:a,results:s}=this.appPollsManager.getPoll(e);r={_:"messageMediaPoll",poll:a,results:s};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:this.appPhotosManager.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:this.appDocsManager.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(s=t.user_id)&&void 0!==s?s:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:a.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:a.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t.messageMedia}n.media=r;const o=e=>{this.onMessagesSendError([n],e),this.rootScope.dispatchEvent("messages_pending")};return n.send=()=>{const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const r=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let p;return p=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:n.random_id,reply_to_msg_id:i||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r},s):this.apiManager.invokeApiAfter("messages.sendMedia",{peer:this.appPeersManager.getInputPeerById(e),media:t,random_id:n.random_id,reply_to_msg_id:i||void 0,message:"",clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r,update_stickersets_order:ta},s),this.pendingAfterMsgs[e]=s,p.then((e=>{e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)})),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw o(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(n,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0}),n.promise}beforeMessageSending(e,t={}){const a=e.id,s=this.getMessagePeer(e),n=t.isScheduled?this.getScheduledMessagesStorage(s):this.getHistoryMessagesStorage(s);e.storageKey=n.key;const i=[];if(t.isScheduled)this.saveMessages([e],{storage:n,isScheduled:!0,isOutgoing:!0}),i.push((()=>{this.rootScope.dispatchEvent("scheduled_new",e)}));else{const r=[this.getHistoryStorage(s),t.threadId?this.getHistoryStorage(s,t.threadId):void 0];for(const e of r)e&&e.history.unshift(a);this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),i.push((()=>{this.rootScope.dispatchEvent("history_append",{storageKey:n.key,message:e})}))}const r=this.pendingByRandomId[e.random_id]={peerId:s,tempId:a,threadId:t.threadId,storage:n,sequential:t.sequential};return this.pendingTopMsgs[s]=a,!t.isGroupedItem&&e.send&&i.push((()=>{t.clearDraft&&this.appDraftsManager.clearDraft(s,t.threadId),e.send()})),i.length&&(t.processAfter||ea)((()=>{for(const e of i)e()})),r}generateOutgoingMessage(e,t){let a;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const s=this.appPeersManager.isBroadcast(e);if(s&&this.appPeersManager.getPeer(e).pFlags.signatures){const e=this.appUsersManager.getSelf();a=e.first_name+(e.last_name?" "+e.last_name:"")}const n={_:"message",id:this.generateTempMessageId(e),from_id:t.sendAsPeerId?this.appPeersManager.getOutputPeer(t.sendAsPeerId):this.generateFromId(e),peer_id:this.appPeersManager.getOutputPeer(e),post_author:a,pFlags:this.generateFlags(e),date:t.scheduleDate||(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),message:"",grouped_id:t.groupId,random_id:(0,Ee.a)(),reply_to:this.generateReplyHeader(t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0};return ge(n,["send","promise"]),void 0===t.groupId&&(n.promise=(0,v.Z)()),n}generateReplyHeader(e,t){const a={_:"messageReplyHeader",reply_to_msg_id:e||t};return t&&a.reply_to_msg_id!==t&&(a.reply_to_top_id=t),a}generateReplies(e){let t;if(this.appPeersManager.isBroadcast(e)){const a=this.appProfileManager.getCachedFullChat(e.toChatId());(null==a?void 0:a.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:a.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return this.appPeersManager.isAnyChat(e)&&(this.appPeersManager.isBroadcast(e)||this.isAnonymousSending(e))?void 0:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==this.appUsersManager.getSelf().id&&(t.out=!0,this.appPeersManager.isChannel(e)||this.appUsersManager.isBot(e)||(t.unread=!0)),this.appPeersManager.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const a=this.appUsersManager.getSelf().id.toPeerId(),s=t.fromId;if(s===a&&t.peerId===a&&!t.fwd_from)return;const n={_:"messageFwdHeader",flags:0,date:t.date};let i=!1;if(t.fwd_from)n.from_id=t.fwd_from.from_id,n.from_name=t.fwd_from.from_name,n.post_author=t.fwd_from.post_author;else{if(n.post_author=t.post_author,s.isUser()){const e=this.appProfileManager.getCachedFullUser(s.toUserId());(null==e?void 0:e.private_forward_name)&&(n.from_name=e.private_forward_name,i=!0)}i||(n.from_id=this.appPeersManager.getOutputPeer(s))}return this.appPeersManager.isBroadcast(t.peerId)&&(t.post_author&&(n.post_author=t.post_author),n.channel_post=t.id),e!==a||i||(n.saved_from_msg_id=t.id,n.saved_from_peer=this.appPeersManager.getOutputPeer(t.peerId)),n}generateFakeAvatarMessage(e,t){const a=Number.MAX_SAFE_INTEGER,s={_:"messageService",pFlags:{},action:{_:"messageActionChannelEditPhoto",photo:t},id:a,peer_id:this.appPeersManager.getOutputPeer(e),mid:a,peerId:e,date:t.date,fromId:e};return this.getHistoryMessagesStorage(e).set(a,s),s}getUploadPromise(e){return this.uploadFilePromises[e]}isAnonymousSending(e){var t,a;return e.isAnyChat()&&(null===(a=null===(t=this.appPeersManager.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===a?void 0:a.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){t&&(t.top_message=e.mid,this.getHistoryStorage(e.peerId).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t))}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:a,tempId:s,storage:n}=t,i=this.getHistoryStorage(a);return this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:[s],pts:void 0,pts_count:void 0}),i.history.delete(s),delete this.pendingByRandomId[e],n.delete(s),!0}return!1}fillConversations(){return Xt(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(ue);){const t=yield this.getTopMessages(100,ue);if(!e()||t.isEnd)break}}))}getConversations(e="",t,a,s=0,n){return this.dialogsStorage.getDialogs(e,t,a,s,n)}getReadMaxIdIfUnread(e,t){var a,s,n;const i=this.getHistoryStorage(e,t);if(t){const t=this.getHistoryStorage(e),n=Math.max(null!==(a=t.readMaxId)&&void 0!==a?a:0,i.readMaxId),r=this.getMessageByPeer(e,i.maxId);return!(null===(s=null==r?void 0:r.pFlags)||void 0===s?void 0:s.out)&&n{if(!n()||"messages.dialogsNotModified"===r._)return null;d.ZP&&this.log("messages.getDialogs result:",r.dialogs,Object.assign({},r.dialogs[0])),a||t===ue||this.dialogsStorage.resetPinnedOrder(t),a||this.appDraftsManager.addMissedDialogs(),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages);let p=!!a,f=!1;const c=new Map,l=t===ue?o.J$:t,m=t===ue;if((0,ne.Z)(r.dialogs,(e=>{void 0===e.folder_id&&(e.folder_id=l),this.dialogsStorage.saveDialog(e,void 0,!0,m),p||this.appPeersManager.isChannel(e.peerId||this.appPeersManager.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),p=!0),void 0!==e.peerId&&(s&&(0,ce.Z)(e)>s&&(this.scheduleHandleNewDialogs(e.peerId,e),f=!0),(0,oe.Z)(e.read_inbox_max_id)||(0,oe.Z)(e.read_outbox_max_id)||(c.set(e.peerId,e),this.log.error("noIdsDialogs",e,i)))})),c.size){const e=[...c.keys()],t=e.map((e=>this.reloadConversation(e)));Promise.all(t).then((()=>{this.rootScope.dispatchEvent("dialogs_multiupdate",c);for(let t=0;t=g||!r.dialogs.length;y&&this.dialogsStorage.setDialogsLoaded(t,!0),f?this.scheduleHandleNewDialogs():this.rootScope.dispatchEvent("dialogs_multiupdate",new Map);const _=r.dialogs,v=100===e?_:_.slice(0,e);return{isEnd:y&&v[v.length-1]===_[_.length-1],count:g,dialogs:v}}))}forwardMessages(e,t,a,s={}){return Xt(this,void 0,void 0,(function*(){delete s.replyToMsgId,delete s.threadId,e=this.appPeersManager.getPeerMigratedTo(e)||e;for(let n=0,i=(a=a.slice().sort(((e,t)=>e-t))).length;n{var i,p,d,f;const c=this.getMessageByPeer(t,n),l=this.generateOutgoingMessage(e,s);o.push(l.id);const m=["entities","media"];s.dropAuthor||(l.fwd_from=this.generateForwardHeader(e,c),m.push("views","forwards"),(null===(i=l.fwd_from)||void 0===i?void 0:i.from_name)&&e===this.appPeersManager.peerId&&delete l.from_id),s.dropCaptions&&c.media||m.push("message");const g=null===(p=c.reply_to)||void 0===p?void 0:p.reply_to_msg_id,h=a.indexOf(g);if(g&&-1!==h){const e=o[h];l.reply_to={_:"messageReplyHeader",reply_to_msg_id:e}}m.forEach((e=>{l[e]=(0,_e.Z)(c[e])}));const u=null===(d=l.media)||void 0===d?void 0:d.document;return u&&(["round","voice"].includes(u.type)&&(l.pFlags.media_unread=!0),u.sticker&&!this.rootScope.premium&&(0,Qt.Z)(u)&&(l.media.pFlags.nopremium=!0)),c.grouped_id&&(null!==(f=r[c.grouped_id])&&void 0!==f?f:r[c.grouped_id]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(l),l}));for(const e in r){const t=r[e];t.messages.length>1&&t.messages.forEach((e=>{e.grouped_id=t.tempId}))}p.forEach((e=>{this.beforeMessageSending(e,{isScheduled:!!s.scheduleDate||void 0,sequential:!0})}));const d={};this.pendingAfterMsgs[e]&&(d.afterMessageId=this.pendingAfterMsgs[e].messageId);const f=this.apiManager.invokeApiAfter("messages.forwardMessages",{from_peer:this.appPeersManager.getInputPeerById(t),id:a.map((e=>(0,oe.Z)(e))),random_id:p.map((e=>e.random_id)),to_peer:this.appPeersManager.getInputPeerById(e),with_my_score:s.withMyScore,silent:s.silent,schedule_date:s.scheduleDate,drop_author:s.dropAuthor,drop_media_captions:s.dropCaptions,send_as:s.sendAsPeerId?this.appPeersManager.getInputPeerById(s.sendAsPeerId):void 0},d).then((e=>{this.log("forwardMessages updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw this.onMessagesSendError(p,e),e})).finally((()=>{this.pendingAfterMsgs[e]===d&&delete this.pendingAfterMsgs[e]}));this.pendingAfterMsgs[e]=d;const c=[f];return i.length&&c.push(this.forwardMessages(e,t,i,s)),Promise.all(c).then(Wt.Z)}))}generateEmptyMessage(e){}onMessagesSendError(e,t){e.forEach((e=>{if(e.error!==t)if(t){e.error=t,this.rootScope.dispatchEvent("message_error",{storageKey:e.storageKey,tempId:e.mid,error:t});const a=this.getDialogOnly(e.peerId);a&&this.rootScope.dispatchEvent("dialog_unread",{peerId:e.peerId,dialog:a})}else delete e.error}))}getMessagesStorageByKey(e){const t=e.split("_"),a=+t[0];return"scheduled"===t[1]?this.getScheduledMessagesStorage(a):this.getHistoryMessagesStorage(a)}getMessageFromStorage(e,t){return"string"==typeof e&&(e=this.getMessagesStorageByKey(e)),e&&e.get(t)}createMessageStorage(e,t){const a=new Map;return a.peerId=e,a.type=t,a.key=`${e}_${t}`,a}getHistoryMessagesStorage(e){var t;return null!==(t=this.messagesStorageByPeerId[e])&&void 0!==t?t:this.messagesStorageByPeerId[e]=this.createMessageStorage(e,"history")}getMessagesStorage(e){return"object"==typeof e?e:this.getMessagesStorageByKey(e)}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(this.appPeersManager.isChannel(t.toPeerId()))continue;const a=this.messagesStorageByPeerId[t].get(e);if(a)return a}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getHistoryMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&this.appPeersManager.getPeerId(e.peer_id)||o.NM}getDialogByPeerId(e){return this.dialogsStorage.getDialog(e)}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}cantForwardDeleteMids(e,t){const a=this.getMessagesStorage(e);let s=!t.length,n=!t.length;for(const e of t){const t=this.getMessageFromStorage(a,e);if(s||(s=!this.canForward(t)),n||(n=!this.canDeleteMessage(t)),s&&n)break}return{cantForward:s,cantDelete:n}}reloadConversation(e){let t;if(void 0!==e){const a=this.appPeersManager.getPeerId(e);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=(0,v.Z)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:this.appPeersManager.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=(0,b.Z)(0).then((()=>{const e=[],t={};for(const[a,{inputDialogPeer:s,promise:n}]of this.reloadConversationsPeers)e.push(s),t[a]=n;return this.reloadConversationsPeers.clear(),this.apiManager.invokeApi("messages.getPeerDialogs",{peers:e}).then((e=>{this.dialogsStorage.applyDialogs(e),e.dialogs.forEach((e=>{const a=e.peerId;a&&(t[a].resolve(e),delete t[a])}))}),(e=>{})).then((()=>{(()=>{for(const e in t)t[e].resolve(void 0)})(),this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()}))}))),t||this.reloadConversationsPromise}doFlushHistory(e,t,a){return this.apiManager.invokeApiSingle("messages.deleteHistory",{just_clear:t,revoke:a,peer:e,max_id:0}).then((s=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:s.pts,pts_count:s.pts_count}}),!s.offset||this.doFlushHistory(e,t,a))))}flushHistory(e,t,a){return Xt(this,void 0,void 0,(function*(){if(this.appPeersManager.isChannel(e)){const t=this.getHistory(e,0,1),a=yield t,s=e.toChatId(),n=a.history[0]||0;return this.apiManager.invokeApiSingle("channels.deleteHistory",{channel:this.appChatsManager.getChannelInput(s),max_id:(0,oe.Z)(n)}).then((e=>(e&&this.apiUpdatesManager.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e)))}return this.doFlushHistory(this.appPeersManager.getInputPeerById(e),t,a).then((()=>{if(this.flushStoragesByPeerId(e),t)this.rootScope.dispatchEvent("dialog_flush",{peerId:e,dialog:this.getDialogOnly(e)});else{delete this.notificationsToHandle[e],delete this.typings[e];const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0)),this.dialogsStorage.dropDialogOnDeletion(e)}}))}))}flushStoragesByPeerId(e){[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pinnedMessages,this.pendingAfterMsgs,this.pendingTopMsgs].forEach((t=>{delete t[e]}));const t=this.needSingleMessages.get(e);if(t){for(const[e,a]of t)a.resolve(this.generateEmptyMessage(e));t.clear()}[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach((t=>{const a=t[e];a&&a.clear()}))}hidePinnedMessages(e){return Promise.all([this.appStateManager.getState(),this.getPinnedMessage(e)]).then((([t,a])=>{t.hiddenPinnedMessages[e]=a.maxId,this.rootScope.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:a.maxId})}))}getPinnedMessage(e){var t;const a=null!==(t=this.pinnedMessages[e])&&void 0!==t?t:this.pinnedMessages[e]={};return a.promise?a.promise:a.maxId?Promise.resolve(a):a.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1}).then((e=>{var t;return a.count=e.count,a.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,a})).finally((()=>{delete a.promise}))}getPinnedMessagesCount(e){var t;return null===(t=this.pinnedMessages[e])||void 0===t?void 0:t.count}getPinnedMessagesMaxId(e){var t;return null===(t=this.pinnedMessages[e])||void 0===t?void 0:t.maxId}updatePinnedMessage(e,t,a,s,n){return this.apiManager.invokeApi("messages.updatePinnedMessage",{peer:this.appPeersManager.getInputPeerById(e),unpin:a,silent:s,pm_oneside:n,id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}unpinAllMessages(e){return this.apiManager.invokeApiSingle("messages.unpinAllMessages",{peer:this.appPeersManager.getInputPeerById(e)}).then((t=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),t.offset?this.unpinAllMessages(e):(this.getHistoryMessagesStorage(e).forEach((e=>{e.pFlags.pinned&&delete e.pFlags.pinned})),this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[e],!0))))}getAlbumText(e){const t=this.groupedMessagesStorage[e];return(0,Jt.Z)(Array.from(t.values()))}getGroupsFirstMessage(e){if(!(null==e?void 0:e.grouped_id))return e;const t=this.groupedMessagesStorage[e.grouped_id];let a=Number.MAX_SAFE_INTEGER;for(const[e,s]of t)s.midthis.getMessageFromStorage(a,e)))}getMidsByMessage(e){return e?e.grouped_id?this.getMidsByAlbum(e.grouped_id):[e.mid]:[]}filterMessages(e,t){const a=[];if(e.grouped_id){const s=this.groupedMessagesStorage[e.grouped_id];for(const[e,n]of s)t(n)&&a.push(n)}else t(e)&&a.push(e);return a}generateTempMessageId(e){const t=this.getDialogOnly(e);return this.appMessagesIdsManager.generateTempMessageId((null==t?void 0:t.top_message)||0)}saveMessage(e,t={}){var a,s,n;if(!e||"messageEmpty"===e._)return;null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={});const i=this.getMessagePeer(e),r=t.storage||this.getHistoryMessagesStorage(i),p="peerChannel"===e.peer_id._,d=p&&this.appChatsManager.isBroadcast(i.toChatId()),f="message"===e._;t.isOutgoing&&(e.pFlags.is_outgoing=!0);const c=(0,pe.Z)(e.id);e.mid=c,f&&(t.isScheduled&&(e.pFlags.is_scheduled=!0),e.grouped_id&&(null!==(s=this.groupedMessagesStorage[e.grouped_id])&&void 0!==s?s:this.groupedMessagesStorage[e.grouped_id]=this.createMessageStorage(i,"grouped")).set(c,e),e.via_bot_id&&(e.viaBotId=e.via_bot_id));const l=this.getDialogOnly(i);l&&c&&c>l[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0),e.reply_to&&(e.reply_to.reply_to_msg_id&&(e.reply_to.reply_to_msg_id=e.reply_to_mid=(0,pe.Z)(e.reply_to.reply_to_msg_id)),e.reply_to.reply_to_top_id&&(e.reply_to.reply_to_top_id=(0,pe.Z)(e.reply_to.reply_to_top_id)));const m=f&&e.replies;m&&(m.max_id&&(m.max_id=(0,pe.Z)(m.max_id)),m.read_max_id&&(m.read_max_id=(0,pe.Z)(m.read_max_id)));const g=!!i;g||(e.date-=this.timeManager.getServerTimeOffset());const h=this.appPeersManager.peerId,u=f&&e.fwd_from;if(e.peerId=i,e.fromId=i===h?u?u.from_id?this.appPeersManager.getPeerId(u.from_id):o.NM:h:e.pFlags.post||!e.from_id?i:this.appPeersManager.getPeerId(e.from_id),u){u.saved_from_msg_id&&(u.saved_from_msg_id=(0,pe.Z)(u.saved_from_msg_id)),u.channel_post&&(u.channel_post=(0,pe.Z)(u.channel_post));const t=u.saved_from_peer||u.from_id,a=u.saved_from_msg_id||u.channel_post;if(t&&a){const s=this.appPeersManager.getPeerId(t),n=(0,pe.Z)(a);e.savedFrom=s+"_"+n}e.fwdFromId=this.appPeersManager.getPeerId(u.from_id),g||(u.date-=this.timeManager.getServerTimeOffset())}const y={type:"message",peerId:i,messageId:c};let _=!1;const v=f&&e.media;if(v)switch(v._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":v.ttl_seconds?_=!0:v.photo=this.appPhotosManager.savePhoto(v.photo,y),v.photo||delete e.media;break;case"messageMediaPoll":{const t=this.appPollsManager.savePoll(v.poll,v.results,e);v.poll=t.poll,v.results=t.results;break}case"messageMediaDocument":if(v.ttl_seconds)_=!0;else{const e=v.document;v.document=this.appDocsManager.saveDoc(e,y),v.document||"documentEmpty"===e._||(_=!0)}break;case"messageMediaWebPage":{const e=this.appWebPagesManager.getMessageKeyForPendingWebPage(i,c,t.isScheduled);v.webpage=this.appWebPagesManager.saveWebPage(v.webpage,e,y);break}case"messageMediaInvoice":{v.photo=this.appWebDocsManager.saveWebDocument(v.photo);const e=v.extended_media;if("messageExtendedMedia"===(null==e?void 0:e._)){const t=e.media;t.photo=this.appPhotosManager.savePhoto(t.photo,y),t.document=this.appDocsManager.saveDoc(t.document,y)}break}case"messageMediaUnsupported":_=!0}if(f&&_&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities),!f&&e.action){const t=e.action,a=e.fromId===this.appUsersManager.getSelf().id?"You":"";let s,r;switch(t.photo&&(t.photo=this.appPhotosManager.savePhoto(t.photo,y)),t.document&&(t.document=this.appDocsManager.saveDoc(t.photo,y)),t._){case"messageActionChatEditPhoto":(null===(n=t.photo)||void 0===n?void 0:n.video_sizes)?t._=d?"messageActionChannelEditVideo":"messageActionChatEditVideo":d&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;this.appGroupCallsManager.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",d||(e+="_by"+a),t.type=e;break}case"messageActionChatEditTitle":d&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":d&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=p?"messageActionChatJoined"+a:"messageActionChatReturn"+a)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+a);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),r=i;break;case"messageActionChatMigrateTo":s=i,r=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&&r&&!this.migratedFromTo[s]&&!this.migratedToFrom[r]&&this.migrateChecks(s,r)}return f&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),r.set(c,e),e}saveMessages(e,t={}){return e.saved||(e.saved=!0,e.forEach(((e,a,s)=>{s[a]=this.saveMessage(e,t)}))),e}getFirstMessageToEdit(e,t){return Xt(this,void 0,void 0,(function*(){const a=this.getHistoryStorage(e,t).history.slice;if(a.isEnd(se.D.Bottom)&&a.length){let t;const s=this.appPeersManager.peerId;for(const n of a){const a=this.getMessageByPeer(e,n);if((s===e?a.fromId===s:a.pFlags.out)&&(yield this.canEditMessage(a,"text"))){t=a;break}}return t}}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=(0,St.Z)(e.message,t);const a=(0,jt.Z)(e.message);e.totalEntities=(0,qt.Z)(t,a)}reportMessages(e,t,a,s){return this.apiManager.invokeApiSingle("messages.report",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e))),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=(0,Ee.a)();return this.apiManager.invokeApi("messages.startBot",{bot:this.appUsersManager.getUserInput(e),peer:this.appPeersManager.getInputPeerById(s),random_id:t,start_param:a}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}const n="/start";if(t){let a;return a=this.appChatsManager.isChannel(t)?this.appChatsManager.inviteToChannel(t,[e]):this.appChatsManager.addChatUser(t,e,0),a.catch((e=>{if("USER_ALREADY_PARTICIPANT"!=(null==e?void 0:e.type))throw e;e.handled=!0})).then((()=>{const t=this.appUsersManager.getUser(e);return this.sendText(s,n+"@"+t.username)}))}return this.sendText(s,n)}editPeerFolders(e,t){this.apiManager.invokeApi("folders.editPeerFolders",{folder_peers:e.map((e=>({_:"inputFolderPeer",peer:this.appPeersManager.getInputPeerById(e),folder_id:t})))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getFilter(e){return this.filtersStorage.getFilter(e)}toggleDialogPin(e,t){var a;return Xt(this,void 0,void 0,(function*(){if(t>1)return this.filtersStorage.toggleDialogPin(e,t);const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!(null===(a=s.pFlags)||void 0===a?void 0:a.pinned)||void 0;if(n){const e=yield this.apiManager.getLimit(1===t?"folderPin":"pin");if(this.dialogsStorage.getPinnedOrders(t).length>=e)return Promise.reject((0,X.Z)("PINNED_DIALOGS_TOO_MUCH"))}return this.apiManager.invokeApi("messages.toggleDialogPin",{peer:this.appPeersManager.getInputDialogPeerById(e),pinned:n}).then((a=>{if(a){const a=n?{pinned:n}:{};this.apiUpdatesManager.saveUpdate({_:"updateDialogPinned",peer:this.appPeersManager.getDialogPeer(e),folder_id:t,pFlags:a})}}))}))}markDialogUnread(e,t){var a;const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!t&&!(null===(a=s.pFlags)||void 0===a?void 0:a.unread_mark)||void 0;return this.apiManager.invokeApi("messages.markDialogUnread",{peer:this.appPeersManager.getInputDialogPeerById(e),unread:n}).then((t=>{if(t){const t=n?{unread:n}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:this.appPeersManager.getDialogPeer(e),pFlags:t})}}))}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&this.appChatsManager.hasChat(t.toChatId())){const a=this.appChatsManager.getChat(e.toChatId());(null==a?void 0:a.migrated_to)&&a.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,this.rootScope.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){var a,s;if(null===(a=null==e?void 0:e.pFlags)||void 0===a?void 0:a.is_outgoing)return!1;const n=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&n.push("messageMediaPoll"),!(!e||"message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===n.indexOf(e.media._)||e.fromId&&this.appUsersManager.isBot(e.fromId)||"messageMediaDocument"===(null===(s=e.media)||void 0===s?void 0:s._)&&(e.media.document.sticker||"round"===e.media.document.type))}canEditMessage(e,t="text"){var a;return Xt(this,void 0,void 0,(function*(){return!(!e||!this.canMessageBeEdited(e,t)||this.getMessagePeer(e)!==this.appUsersManager.getSelf().id&&(!e.pFlags.out||"peerChannel"!==e.peer_id._&&e.date<(0,te.Z)(!0)-(yield this.apiManager.getConfig()).edit_time_limit&&"messageMediaPoll"!==(null===(a=e.media)||void 0===a?void 0:a._)))}))}canDeleteMessage(e){return e&&(e.peerId.isUser()||e.pFlags.out||"chat"===this.appChatsManager.getChat(e.peerId.toChatId())._||this.appChatsManager.hasRights(e.peerId.toChatId(),"delete_messages"))&&(!e.pFlags.is_outgoing||!!e.error)}getReplyKeyboard(e){return this.getHistoryStorage(e).replyMarkup}mergeReplyKeyboard(e,t){var a,s;if(!t)return!1;const n=t.reply_markup;if(!n&&!(null===(a=t.pFlags)||void 0===a?void 0:a.out)&&!t.action)return!1;if("replyInlineMarkup"===(null==n?void 0:n._))return!1;const i=e.replyMarkup;if(n)return!(i&&i.mid>=t.mid||n.pFlags.selective||(e.maxOutId&&t.midi.mid||t.pFlags.is_outgoing)&&t.message)return i.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return(0,be.Z)(t),!("messageActionChatDeleteUser"!==(null===(s=t.action)||void 0===s?void 0:s._)||!(i?t.action.user_id===i.fromId:this.appUsersManager.isBot(t.action.user_id))||(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},0))}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,a=!0){return this.appPeersManager.isRestricted(e)?Promise.resolve(t.map((e=>({_:"messages.searchCounter",pFlags:{},filter:e,count:0})))):(a?this.apiManager.invokeApiCacheable:this.apiManager.invokeApi).bind(this.apiManager)("messages.getSearchCounters",{peer:this.appPeersManager.getInputPeerById(e),filters:t})}filterMessagesByInputFilterFromStorage(e,t,a,s){const n=this.getMessagesStorage(a);return(0,Gt.Z)(e,t.map((e=>n.get(e))),s)}getSearch({peerId:e,query:t,inputFilter:a,maxId:s,limit:n,nextRate:i,backLimit:r,threadId:o,folderId:p,minDate:f,maxDate:c}){if(this.appPeersManager.isRestricted(e))return Promise.resolve({count:0,offset_id_offset:0,next_rate:void 0,history:[]});t||(t=""),a||(a={_:"inputMessagesFilterEmpty"}),void 0===n&&(n=20),i||(i=0),r||(r=0),f=f?f/1e3|0:0,c=c?c/1e3|0:0;let l=[];r&&(n+=r);let m;if(!e||r||s||t||1===n||o||(m=this.getHistoryStorage(e),l=this.filterMessagesByInputFilterFromStorage(a._,m.history.slice,this.getHistoryMessagesStorage(e),n)),l.length){if(!(l.length{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),d.ZP&&this.log("getSearch result:",a,e);const t=e.count||l.length+e.messages.length;return e.messages.forEach((e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=this.appChatsManager.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}l.push(e)})),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:l}}))}subscribeRepliesThread(e,t){const a=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===a)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const a=(0,oe.Z)(Math.max(...this.getMidsByMessage(e))),s={_:"messageService",pFlags:{is_single:!0},id:this.appMessagesIdsManager.generateTempMessageId(a),date:e.date,from_id:{_:"peerUser",user_id:o.NM},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.id)};this.saveMessages([s],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=s.mid}getThreadServiceMessageId(e,t){return this.threadsServiceMessagesIdsStorage[e+"_"+t]}getDiscussionMessage(e,t){return this.apiManager.invokeApiSingle("messages.getDiscussionMessage",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((a=>{var s;this.appChatsManager.saveApiChats(a.chats),this.appUsersManager.saveApiUsers(a.users),this.saveMessages(a.messages);const n=this.getMessageWithReplies(a.messages[0]),i=n.peerId+"_"+n.mid;this.generateThreadServiceStartMessage(n);const r=this.getHistoryStorage(n.peerId,n.mid);return a.max_id=r.maxId=(0,pe.Z)(a.max_id)||0,a.read_inbox_max_id=r.readMaxId=(0,pe.Z)(null!==(s=a.read_inbox_max_id)&&void 0!==s?s:n.mid),a.read_outbox_max_id=r.readOutboxMaxId=(0,pe.Z)(a.read_outbox_max_id)||0,this.threadsToReplies[i]=e+"_"+t,n}))}handleNewMessage(e){this.rootScope.dispatchEvent("history_multiappend",e)}scheduleHandleNewDialogs(e,t){return void 0!==e&&this.newDialogsToHandle.set(e,t),this.newDialogsHandlePromise?this.newDialogsHandlePromise:this.newDialogsHandlePromise=(0,b.Z)(0).then((()=>{this.newDialogsHandlePromise=void 0,this.handleNewDialogs()}))}deleteMessages(e,t,a){var s,n;return Xt(this,void 0,void 0,(function*(){let i;const r=yield this.apiManager.getConfig(),o=t.splice(r.forwarded_count_max,t.length-r.forwarded_count_max),p=t.map((e=>(0,oe.Z)(e)));if(e.isAnyChat()&&this.appPeersManager.isChannel(e)){const a=e.toChatId(),r=this.appChatsManager.getChat(a);if(!r.pFlags.creator&&!(null===(n=null===(s=r.admin_rights)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.delete_messages)&&!(t=t.filter((t=>!!this.getMessageByPeer(e,t).pFlags.out))).length)return;i=this.apiManager.invokeApi("channels.deleteMessages",{channel:this.appChatsManager.getChannelInput(a),id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:a,messages:t,pts:e.pts,pts_count:e.pts_count})}))}else i=this.apiManager.invokeApi("messages.deleteMessages",{revoke:a,id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})}));const d=[i];return o.length&&d.push(this.deleteMessages(e,o,a)),Promise.all(d).then(Wt.Z)}))}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)){if(!s&&!a){const t=this.getDialogOnly(e);t&&this.isDialogUnread(t)&&(s=!0)}if(!s)return this.log("readHistory: isn't unread"),Promise.resolve()}const n=this.getHistoryStorage(e,a);if(n.triedToReadMaxId>=t)return Promise.resolve();let i;return a?(n.readPromise||(i=this.apiManager.invokeApi("messages.readDiscussion",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(a),read_max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:a,read_max_id:t})):this.appPeersManager.isChannel(e)?(n.readPromise||(i=this.apiManager.invokeApi("channels.readHistory",{channel:this.appChatsManager.getChannelInput(e.toChatId()),max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(n.readPromise||(i=this.apiManager.invokeApi("messages.readHistory",{peer:this.appPeersManager.getInputPeerById(e),max_id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})}))),this.apiUpdatesManager.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:this.appPeersManager.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),this.rootScope.dispatchEvent("notification_reset",this.appPeersManager.getPeerString(e)),n.readPromise?n.readPromise:(n.triedToReadMaxId=t,i.finally((()=>{delete n.readPromise;const{readMaxId:s}=n;this.log("readHistory: promise finally",t,s),s>t&&this.readHistory(e,s,a,!0)})),n.readPromise=i)}readAllHistory(e,t,a=!1){const s=this.getHistoryStorage(e,t);s.maxId&&this.readHistory(e,s.maxId,t,a)}fixDialogUnreadMentionsIfNoMessage(e){const t=this.getDialogOnly(e);(null==t?void 0:t.unread_mentions_count)&&this.reloadConversation(e)}modifyCachedMentions(e,t,a){const s=this.unreadMentions[e];s&&(a?s.first.isEnd(se.D.Top)&&s.insertSlice([t]):s.delete(t))}fixUnreadMentionsCountIfNeeded(e,t){const a=this.getDialogOnly(e);!t.length&&(null==a?void 0:a.unread_mentions_count)&&this.reloadConversation(e)}goToNextMention(e){var t;const a=this.goToNextMentionPromises[e];if(a)return a;const s=null!==(t=this.unreadMentions[e])&&void 0!==t?t:this.unreadMentions[e]=new se.Z,n=s.length,i=s.first.isEnd(se.D.Top);if(!n&&i)return this.fixUnreadMentionsCountIfNeeded(e,s),Promise.resolve();let r=Promise.resolve();return!i&&n<25&&(r=this.loadNextMentions(e)),this.goToNextMentionPromises[e]=r.then((()=>{const t=s.last,a=t&&t[t.length-1];if(a)return s.delete(a),a;this.fixUnreadMentionsCountIfNeeded(e,s)})).finally((()=>{delete this.goToNextMentionPromises[e]}))}loadNextMentions(e){const t=this.unreadMentions[e],a=t.first[0]||1;return this.getUnreadMentions(e,a,-50,50).then((e=>{this.mergeHistoryResult(t,e,1===a?0:a,50,-50)}))}getUnreadMentions(e,t,a,s,n=0,i=0){return this.apiManager.invokeApiSingle("messages.getUnreadMentions",{peer:this.appPeersManager.getInputPeerById(e),offset_id:(0,oe.Z)(t),add_offset:a,limit:s,max_id:(0,oe.Z)(n),min_id:(0,oe.Z)(i)}).then((e=>((0,be.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),e)))}readMessages(e,t){if(!t.length)return Promise.resolve();let a,s;if(t=t.map((e=>(0,oe.Z)(e))),e.isAnyChat()&&this.appPeersManager.isChannel(e)){const n=e.toChatId();s={_:"updateChannelReadMessagesContents",channel_id:n,messages:t},a=this.apiManager.invokeApi("channels.readMessageContents",{channel:this.appChatsManager.getChannelInput(n),id:t})}else s={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},a=this.apiManager.invokeApi("messages.readMessageContents",{id:t}).then((e=>{s.pts=e.pts,s.pts_count=e.pts_count,this.apiUpdatesManager.processLocalUpdate(s)}));return this.apiUpdatesManager.processLocalUpdate(s),a}getHistoryStorage(e,t){var a,s;return t?(this.threadsStorage[e]||(this.threadsStorage[e]={}),null!==(a=this.threadsStorage[e][t])&&void 0!==a?a:this.threadsStorage[e][t]={count:null,history:new se.Z}):null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={count:null,history:new se.Z}}getHistoryStorageTransferable(e,t){const a=this.getHistoryStorage(e,t),{count:s,history:n,maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}=a;return{count:s,history:void 0,historySerialized:n.toJSON(),maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}}getNotifyPeerSettings(e){return Promise.all([this.appNotificationsManager.getNotifyPeerTypeSettings(),this.appNotificationsManager.getNotifySettings(this.appPeersManager.getInputNotifyPeerById(e,!0))]).then((([t,a])=>({muted:this.appNotificationsManager.isPeerLocalMuted(e,!0),peerTypeNotifySettings:a})))}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let a="";if((null==e?void 0:e.reply_to)&&(null===(t=e.peerId)||void 0===t?void 0:t.isAnyChat())){const t=e.reply_to.reply_to_top_id||e.reply_to.reply_to_msg_id;a=e.peerId+"_"+t}return a}updateMessage(e,t,a){return this.reloadMessages(e,t,!0).then((()=>{const s=this.getMessageByPeer(e,t);if(s)return a&&this.rootScope.dispatchEvent(a,s),s}))}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let a;if(t){const s=this.pendingByRandomId[t];(a=this.finalizePendingMessage(t,e))&&this.rootScope.dispatchEvent("history_update",{storageKey:s.storage.key,message:e,sequential:s.sequential}),delete this.pendingByMessageId[e.mid]}return a}mutePeer(e,t){const a={_:"inputPeerNotifySettings"};return a.mute_until=t,this.appNotificationsManager.updateNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)},a)}togglePeerMute(e,t){return void 0===t&&(t=!this.appNotificationsManager.isPeerLocalMuted(e,!1)),this.mutePeer(e,t?o.rU:0)}findPeerIdByMids(e){for(let t=e.length-1;t>=0;--t){const a=e[t],s=this.getMessageById(a);if(s)return s.peerId}}canSendToPeer(e,t,a="send_messages"){if(this.appPeersManager.isRestricted(e))return!1;if(e.isAnyChat()){const s=this.appChatsManager.getChat(e.toChatId());return this.appChatsManager.hasRights(e.toChatId(),a,void 0,!!t)&&(!s.pFlags.left||!!t)}return this.appUsersManager.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(a){const{peerId:s,tempId:n,threadId:i,storage:r}=a;[this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)}));const o=this.getMessageFromStorage(r,n);return o&&(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),this.rootScope.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,n,t),o}}finalizePendingMessageCallbacks(e,t,a){const s=this.tempFinalizeCallbacks[t];if(void 0!==s){for(const e in s){const{deferred:t,callback:n}=s[e];n(a).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(a.media){(0,be.Z)(a);const{photo:e,document:s}=a.media;if(e){const a=this.appPhotosManager.getPhoto(""+t);if(a){const t=e.sizes[e.sizes.length-1],s=this.thumbsStorage.getCacheContext(e,t.type),n=this.thumbsStorage.getCacheContext(a,o.Pt);Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=(0,Zt.Z)(e,i);(0,gt.P)(r.location)}}else if(s){const e=this.appDocsManager.getDoc(""+t);if(e){const t=this.thumbsStorage.getCacheContext(e);if(e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type&&t.url){const e=this.thumbsStorage.getCacheContext(s);Object.assign(e,t),n=s,(0,gt.P)((0,mt.Z)(n,undefined),{fileName:n.file_name})}}}else a.media.poll&&(delete this.appPollsManager.polls[t],delete this.appPollsManager.results[t])}var n;const i=this.getMessageFromStorage(e,t);e.delete(t),!i.reply_markup&&a.reply_markup&&setTimeout((()=>{this.getMessageFromStorage(e,a.mid)&&this.rootScope.dispatchEvent("message_edit",{storageKey:e.key,peerId:a.peerId,mid:a.mid,message:a})}),0),this.handleReleasingMessage(i,e),this.rootScope.dispatchEvent("message_sent",{storageKey:e.key,tempId:t,tempMessage:i,mid:a.mid,message:a})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,this.appStateManager.pushToState("maxSeenMsgId",e),this.apiManager.invokeApi("messages.receivedMessages",{max_id:(0,oe.Z)(e)})}getMessageReactionsListAndReadParticipants(e,t,a,s,n,i){var r,o;return Xt(this,void 0,void 0,(function*(){const p={reactions:[],count:0,next_offset:void 0},d=yield this.canViewMessageReadParticipants(e);return d&&void 0===t?t=100:void 0===t&&(t=50),Promise.all([!d||a||n?[]:this.getMessageReadParticipants(e.peerId,e.mid).catch((()=>[])),(null===(o=null===(r=e.reactions)||void 0===r?void 0:r.recent_reactions)||void 0===o?void 0:o.length)&&!i?this.appReactionsManager.getMessageReactionsList(e.peerId,e.mid,t,a,s).catch((e=>p)):p]).then((([e,t])=>{const a=e.map((e=>e.toPeerId())),s=a.slice();(0,ne.Z)(s,((e,a,s)=>{t.reactions.some((t=>this.appPeersManager.getPeerId(t.peer_id)===e))&&s.splice(a,1)}));let n=t.reactions.map((e=>({peerId:this.appPeersManager.getPeerId(e.peer_id),reaction:e.reaction})));return n=n.concat(s.map((e=>({peerId:e})))),{reactions:t.reactions,reactionsCount:t.count,readParticipants:a,combined:n,nextOffset:t.next_offset}}))}))}getMessageReadParticipants(e,t){return this.apiManager.invokeApiSingle("messages.getMessageReadParticipants",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>e.map((e=>e.toUserId()))))}canViewMessageReadParticipants(e){return Xt(this,void 0,void 0,(function*(){if("message"!==(null==e?void 0:e._)||e.pFlags.is_outgoing||!e.pFlags.out||!this.appPeersManager.isAnyGroup(e.peerId))return!1;const t=this.appChatsManager.getChat(e.peerId.toChatId()),a=yield this.apiManager.getAppConfig();return t.participants_count<=a.chat_read_mark_size_threshold&&(0,te.Z)(!0)-e.date(0,oe.Z)(e))),increment:!0}).then((a=>{const s=new Array(t.length),n=e.toChatId();for(let e=0,i=t.length;e{const{chatPeerIds:t}=e.state;return t[t.length-1]===a}));n||(s.sort(((e,t)=>e.state.idleStartTime-t.state.idleStartTime)),n=s[0].state.idleStartTime?s[s.length-1]:s[0]),f.Z.getInstance().invokeVoid("notificationBuild",Object.assign({message:e},t),n.source)}getScheduledMessagesStorage(e){var t;return null!==(t=this.scheduledMessagesStorage[e])&&void 0!==t?t:this.scheduledMessagesStorage[e]=this.createMessageStorage(e,"scheduled")}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return;const t=this.getScheduledMessagesStorage(e);return t.size?[...t.keys()]:this.apiManager.invokeApiSingle("messages.getScheduledHistory",{peer:this.appPeersManager.getInputPeerById(e),hash:""}).then((t=>{if("messages.messagesNotModified"!==t._){this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats);const a=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:a,isScheduled:!0}),[...a.keys()]}return[]}))}sendScheduledMessages(e,t){return this.apiManager.invokeApi("messages.sendScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}deleteScheduledMessages(e,t){return this.apiManager.invokeApi("messages.deleteScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getMessageWithReplies(e){return this.filterMessages(e,(e=>!!e.replies))[0]}getMessageWithCommentReplies(e){if(e.peerId!==o.hj){const t=null==(e=this.getMessageWithReplies(e))?void 0:e.replies;if(!t||!t.pFlags.comments||t.channel_id.toChatId()===o.IA)return}return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&!this.appChatsManager.isInChat(e.toChatId())}getNewHistory(e,t){var a;return Xt(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const s=this.getHistoryStorage(e,t),n=s.history.slice;if(!n.isEnd(se.D.Bottom))return;delete s.maxId,n.unsetEnd(se.D.Bottom);const i=yield this.getHistory(e,null!==(a=n[0])&&void 0!==a?a:1,0,50,t);for(let t=0,a=i.history.length;t{const e=i.history.sliceMe(t,r,a),s=(null==e?void 0:e.slice)||i.history.constructSlice();return{count:i.count,history:Array.from(s),isEnd:s.getEnds(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||i.count}})):{count:i.count,history:Array.from(o.slice),isEnd:o.slice.getEnds(),offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,a){const{offset_id_offset:s,messages:n}=e,i=e.count||n.length,r=s||0,o=a<0?t+a:t;return{count:i,offsetIdOffset:r,isTopEnd:r>=i-o||ie.mid));if(a&&(0,oe.Z)(a)&&!c.includes(a)&&pc[e]);++e);c.splice(e,0,a)}const l=e.insertSlice(c)||e.slice;return d&&l.setEnd(se.D.Top),f&&l.setEnd(se.D.Bottom),Object.assign({slice:l,mids:c,messages:i},r)}fillHistoryStorage(e,t,a,s,n,i){const r=n.maxId;return this.requestHistory(e,t,a,s,void 0,i).then((i=>{const{count:o,isBottomEnd:p,slice:d,messages:f}=this.mergeHistoryResult(n.history,i,t,a,s);n.count=o;for(let t=0,a=f.length;t{d.ZP&&this.log("requestHistory result:",e,r,t,a,s),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages),this.appPeersManager.isChannel(e)&&this.apiUpdatesManager.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,p=r.count;o&&!r.messages[o-1]&&(r.messages.splice(o-1,1),o--,p--);const f=this.getHistoryStorage(e,i),c=r.messages[o-1];if(o&&c.grouped_id){const t=f.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr))}return r}),(t=>{if("CHANNEL_PRIVATE"===t.type){let t=this.appChatsManager.getChat(e.toChatId());t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t}))}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=(0,b.Z)(0).then((()=>{const e=[];for(const[t,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map((e=>({_:"inputMessageID",id:(0,oe.Z)(e)})));let i;i=t.isAnyChat()&&this.appPeersManager.isChannel(t)?this.apiManager.invokeApiSingle("channels.getMessages",{channel:this.appChatsManager.getChannelInput(t.toChatId()),id:n}):this.apiManager.invokeApiSingle("messages.getMessages",{id:n});const r=i.then((e=>{(0,be.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=this.saveMessages(e.messages);for(let e=0;e{this.rootScope.dispatchEvent("messages_downloaded",{peerId:t,mids:s})}));e.push(r)}return this.needSingleMessages.clear(),Promise.all(e).then(Wt.Z,Wt.Z).then((()=>{this.fetchSingleMessagesPromise=null,this.needSingleMessages.size&&this.fetchSingleMessages()}))}))}reloadMessages(e,t,a){if(Array.isArray(t))return Promise.all(t.map((t=>this.reloadMessages(e,t,a))));const s=this.getMessageByPeer(e,t);if(s&&!a)return this.rootScope.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(s);{let a=this.needSingleMessages.get(e);a||this.needSingleMessages.set(e,a=new Map);let s=a.get(t);return s||(s=(0,v.Z)(),a.set(t,s),this.fetchSingleMessages(),s)}}getExtendedMedia(e,t){let a=this.extendedMedia.get(e);a||this.extendedMedia.set(e,a=new Map);const s=(0,v.Z)(),n=[],i=t.map((t=>{let i=a.get(t);return i||(a.set(t,i=s),n.push(t),i.then((()=>{a.delete(t),a.size||this.extendedMedia.get(e)!==a||this.extendedMedia.delete(e)}))),i}));return n.length?this.apiManager.invokeApi("messages.getExtendedMedia",{peer:this.appPeersManager.getInputPeerById(e),id:n.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),s.resolve()})):s.resolve(),Promise.all(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.reloadMessages(t,e.reply_to_mid).then((t=>{if(t||delete(e=this.getMessageByPeer(e.peerId,e.mid)).reply_to_mid,"messageService"===e._){const t=e.peerId;this.rootScope.dispatchEvent("message_edit",{storageKey:`${t}_history`,peerId:t,mid:e.mid,message:e}),this.isMessageIsTopMessage(e)&&this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,this.getDialogOnly(t)]]))}return t}))}setTyping(e,t,a){var s;let n=this.typings[e];return e&&this.canSendToPeer(e)&&e!==this.appPeersManager.peerId&&(a||(null===(s=null==n?void 0:n.action)||void 0===s?void 0:s._)!==t._)?((null==n?void 0:n.timeout)&&clearTimeout(n.timeout),n=this.typings[e]={action:t},this.apiManager.invokeApi("messages.setTyping",{peer:this.appPeersManager.getInputPeerById(e),action:t}).finally((()=>{n===this.typings[e]&&(n.timeout=R.Z.setTimeout((()=>{delete this.typings[e]}),6e3))}))):Promise.resolve(!1)}handleReleasingMessage(e,t){const a=e.media;if(a){const s=a.webpage||a,n=s.photo||s.document;if((null==n?void 0:n.file_reference)&&this.referenceDatabase.deleteContext(n.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in a&&a.webpage){const s=this.getScheduledMessagesStorage(e.peerId)===t,n=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,s);this.appWebPagesManager.deleteWebPageFromPending(a.webpage,n)}a.poll&&this.appPollsManager.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,a){const s={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const n of a){const a=this.getMessageFromStorage(t,n);if(!a){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(a,t),this.updateMessageRepliesIfNeeded(a),a.pFlags.out||a.pFlags.is_outgoing||!a.pFlags.unread||(++s.unread,this.rootScope.dispatchEvent("notification_cancel","msg"+n),a.pFlags.mentioned&&(++s.unreadMentions,this.modifyCachedMentions(e,n,!1))),++s.count,s.msgs.add(n),a.deleted=!0;const i=a.grouped_id;if(i){const e=this.groupedMessagesStorage[i];e&&(e.delete(n),s.albums||(s.albums={}),(s.albums[i]||(s.albums[i]=new Set)).add(n),e.size||(delete s.albums,delete this.groupedMessagesStorage[i]))}t.delete(n)}if(s.albums)for(const e in s.albums)this.dispatchAlbumEdit(e,t,[...s.albums[e]]);return s}handleEditedMessage(e,t,a){var s;if("message"===e._){if(null===(s=e.media)||void 0===s?void 0:s.webpage){const t=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);this.appWebPagesManager.deleteWebPageFromPending(e.media.webpage,t)}const t=e.grouped_id;t&&this.dispatchAlbumEdit(t,a,[])}}dispatchAlbumEdit(e,t,a){const s=this.getMidsByAlbum(e).map((e=>this.getMessageFromStorage(t,e)));this.rootScope.dispatchEvent("album_edit",{peerId:s[0].peerId,groupId:e,deletedMids:a||[],messages:s})}getDialogUnreadCount(e){return e.unread_count||+!!e.pFlags.unread_mark}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return"message"===(null==e?void 0:e._)&&!e.pFlags.noforwards&&!this.appPeersManager.noForwards(e.peerId)}pushBatchUpdate(e,t,a,s){let n=this.batchUpdates[e];n||(n=this.batchUpdates[e]={callback:t,batch:new Map}),n.batch.has(a)||(n.batch.set(a,s?s():void 0),this.batchUpdatesDebounced())}getMessagesFromMap(e){const t=new Map;for(const[a,s]of e){const[e,n]=a.split("_"),i=this.getMessageByPeer(e.toPeerId(),+n);i&&t.set(i,s)}return t}saveDefaultSendAs(e,t){return this.appProfileManager.getCachedFullChat(e.toChatId()).default_send_as=this.appPeersManager.getOutputPeer(t),this.apiManager.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(e),send_as:this.appPeersManager.getInputPeerById(t)})}}var sa=a(6724);function na(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}class ia extends G{constructor(){super(...arguments),this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=(0,te.Z)(!0);let t=o.rU;for(const a in this.peerSettings.notifyPeer){const s=this.peerSettings.notifyPeer[a];if(s instanceof Promise)continue;const n=s.mute_until;n&&(n<=e?(s.mute_until=0,this.apiUpdatesManager.saveUpdate({_:"updateNotifySettings",peer:{_:"notifyPeer",peer:this.appPeersManager.getOutputPeer(a.toPeerId())},notify_settings:s})):n{const t="notifyPeer"===e.peer._&&this.appPeersManager.getPeerId(e.peer.peer),a="notifyPeer"!==e.peer._?e.peer._:void 0;this.savePeerSettings({key:a,peerId:t,settings:e.notify_settings}),this.rootScope.dispatchEvent("notify_settings",e)}}),this.appStateManager.getState().then((e=>{if(e.notifySettings)for(const t in e.notifySettings)(0,be.Z)(t),this.savePeerSettings({key:t,settings:e.notifySettings[t]})}))}getNotifySettings(e){let t,a=na(e._),s=this.peerSettings[a];return"inputNotifyPeer"===e._&&(t=a=this.appPeersManager.getPeerId(e.peer),s=s[a]),s||((s||this.peerSettings)[a]=this.apiManager.invokeApi("account.getNotifySettings",{peer:e}).then((e=>(this.savePeerSettings({key:a,peerId:t,settings:e}),e))))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map((e=>this.getNotifySettings({_:e})));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return this.apiManager.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then((a=>{a&&this.apiUpdatesManager.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:na(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})}))}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=this.apiManager.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){this.apiManager.invokeApi("account.setContactSignUpNotification",{silent:e}).then((t=>{this.notifyContactsSignUp=Promise.resolve(!e)}))}savePeerSettings({key:e,peerId:t,settings:a}){let s;t&&(e=t,s=this.peerSettings.notifyPeer),(s||this.peerSettings)[e]=a,t?this.checkMuteUntilThrottled():(this.rootScope.dispatchEvent("notify_peer_type_settings",{key:e,settings:a}),this.appStateManager.getState().then((t=>{const s=t.notifySettings;s[e]=a,this.appStateManager.pushToState("notifySettings",s)})))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>(0,te.Z)())}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then((e=>this.isMuted(e)))}getPeerLocalSettings(e,t=!0){const a={_:"peerNotifySettings"},s=this.peerSettings.notifyPeer[e];if(!s||s instanceof Promise||Object.assign(a,s),t){const t=na(this.appPeersManager.getInputNotifyPeerById(e,!0)._),s=this.peerSettings[t];if(s&&!(s instanceof Promise))for(const e in s)void 0===a[e]&&(a[e]=s[e])}return a}isPeerLocalMuted(e,t=!0){if(e===this.appPeersManager.peerId)return!1;const a=this.getPeerLocalSettings(e,t);return this.isMuted(a)}}var ra=a(617),oa=a(7361);class pa extends G{get peerId(){return this.appUsersManager.userId.toPeerId()}canPinMessage(e){return e.isUser()||this.appChatsManager.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){if(this.isRestricted(e))return;const t=e.isUser()?this.appUsersManager.getUserPhoto(e.toUserId()):this.appChatsManager.getChatPhoto(e.toChatId());return"chatPhotoEmpty"!==t._&&"userProfilePhotoEmpty"!==t._?t:void 0}getPeerMigratedTo(e){if(e.isUser())return!1;const t=this.appChatsManager.getChat(e.toChatId());return!!(t&&t.migrated_to&&t.pFlags.deactivated)&&(0,le.Z)(t.migrated_to)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return this.appChatsManager.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?this.appUsersManager.getUserString(e.toUserId()):this.appChatsManager.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeer(e).username||""}getPeer(e){return e.isUser()?this.appUsersManager.getUser(e.toUserId()):this.appChatsManager.getChat(e.toChatId())}getPeerId(e){return(0,le.Z)(e)||(0,fe.Z)(e)&&"inputPeerSelf"===e._&&this.peerId||o.NM}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&this.appChatsManager.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&this.appChatsManager.isMegagroup(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!this.appChatsManager.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&this.appUsersManager.isBot(e.toUserId())}isContact(e){return e.isUser()&&this.appUsersManager.isContact(e.toUserId())}isUser(e){return(0,ra.Z)(e)}isAnyChat(e){return(0,oa.Z)(e)}isRestricted(e){return e.isUser()?this.appUsersManager.isRestricted(e.toUserId()):this.appChatsManager.isRestricted(e.toChatId())}getRestrictionReasonText(e){const t=this.getPeer(e),a=t.restriction_reason?Be(t.restriction_reason):void 0;return a?a.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById(e,t){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return this.appChatsManager.getInputPeer(t)}const t=e.toUserId();return this.appUsersManager.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:(0,fe.Z)(e)?e:this.getInputPeerById(e)}}getPeerSearchText(e){let t;return t=this.isUser(e)?"%pu "+this.appUsersManager.getUserSearchText(e.toUserId()):"%pg "+(this.appChatsManager.getChat(e.toChatId()).title||""),t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===this.peerId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;return!e.isUser()&&!!(null===(t=this.appChatsManager.getChatTyped(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}}class da extends G{constructor(){super(...arguments),this.photos={}}savePhoto(e,t){var a;if(!e||"photoEmpty"===e._)return;const s=this.photos[e.id];if(e.file_reference&&(ct("file_reference",s,e),this.referenceDatabase.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){e.sizes.sort(((e,t)=>(e.size||(e.sizes?1/0:0))-(t.size||(t.sizes?1/0:0))));const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return s?Object.assign(s,e):this.photos[e.id]=e}getUserPhotos(e,t="0",a=20){const s=this.appUsersManager.getUserInput(e);return this.apiManager.invokeApiCacheable("photos.getUserPhotos",{user_id:s,offset:0,limit:a,max_id:t},{cacheSeconds:60}).then((a=>{this.appUsersManager.saveApiUsers(a.users);const s=a.photos.map(((t,s)=>(a.photos[s]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id)));if("0"!==t&&t){const e=s.indexOf(t);-1!==e&&s.splice(e,1)}return{count:a.count||s.length,photos:s}}))}getPhoto(e){return(0,fe.Z)(e)?e:this.photos[e]}}class fa extends G{constructor(){super(...arguments),this.polls={},this.results={},this.pollToMessages={},this.log=(0,S.kg)("POLLS",S.v9.Error)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let a=e.results;const s=this.savePoll(t,a);t=s.poll,a=s.results,this.rootScope.dispatchEvent("poll_update",{poll:t,results:a})}})}savePoll(e,t,a){a&&this.updatePollToMessage(a,!0);const s=e.id;return this.polls[s]?(e=Object.assign(this.polls[s],e),t=this.saveResults(e,t)):(this.polls[s]=e,e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var a;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(a=null==t?void 0:t.results)||void 0===a?void 0:a.length)&&t.results.forEach(((t,a)=>{var s;(null===(s=t.pFlags)||void 0===s?void 0:s.chosen)&&e.chosenIndexes.push(a)}))),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,a,s){return a?(s||(s=[]),a=(0,ke.Z)(a,s)):a=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:a,solution_entities:a?s:void 0}}updatePollToMessage(e,t){const{id:a}=e.media.poll;let s=this.pollToMessages[a];if(!t&&!s)return;s||(s=this.pollToMessages[a]=new Set);const n=e.peerId+"_"+e.mid;t?s.add(n):s.delete(n),t||s.size||(delete this.polls[a],delete this.results[a],delete this.pollToMessages[a])}sendVote(e,t){const a=e.media.poll,s=t.map((e=>a.answers[e].option)),n=e.mid,i=e.peerId,r=this.appPeersManager.getInputPeerById(i);return e.pFlags.is_outgoing?this.appMessagesManager.invokeAfterMessageIsSent(n,"sendVote",(e=>(this.log("invoke sendVote callback"),this.sendVote(e,t)))):this.apiManager.invokeApi("messages.sendVote",{peer:r,msg_id:(0,oe.Z)(e.mid),options:s}).then((e=>{this.log("sendVote updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}))}getResults(e){const t=this.appPeersManager.getInputPeerById(e.peerId);return this.apiManager.invokeApi("messages.getPollResults",{peer:t,msg_id:(0,oe.Z)(e.mid)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),this.log("getResults updates:",e)}))}getVotes(e,t,a,s=20){return this.apiManager.invokeApi("messages.getPollVotes",{peer:this.appPeersManager.getInputPeerById(e.peerId),id:(0,oe.Z)(e.mid),option:t,offset:a,limit:s}).then((e=>(this.log("getPollVotes messages:",e),this.appUsersManager.saveApiUsers(e.users),e)))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const a=(0,_e.Z)(t);return a.pFlags.closed=!0,this.appMessagesManager.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(a)}).then((()=>{}),(e=>{this.log.error("stopPoll error:",e)}))}}class ca extends G{constructor(){super(...arguments),this.privacy={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,this.rootScope.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return this.apiManager.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then((a=>(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),this.apiUpdatesManager.processLocalUpdate({_:"updatePrivacy",key:{_:na(e)},rules:t.map((e=>{const t={};return Object.assign(t,e),t._=na(t._),t}))}),a.rules)))}getPrivacy(e){const t=na(e),a=this.privacy[t];return a?Promise.resolve(a):this.privacy[t]=this.apiManager.invokeApi("account.getPrivacy",{key:{_:e}}).then((e=>(this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.privacy[t]=e.rules)))}getGlobalPrivacySettings(){return this.apiManager.invokeApi("account.getGlobalPrivacySettings")}setGlobalPrivacySettings(e){return this.apiManager.invokeApi("account.setGlobalPrivacySettings",{settings:e})}}var la=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const ma=18e4;class ga extends G{constructor(){super(...arguments),this.usersFull={},this.chatsFull={},this.fullExpiration={},this.onUpdateUserTyping=e=>{var t;const a=e.user_id?e.user_id.toPeerId():this.appPeersManager.getPeerId(e.from_id);if(this.appPeersManager.peerId===a||"speakingInGroupCallAction"===e.action._)return;const s=this.appPeersManager.getPeerId(e),n=null!==(t=this.typingsInPeer[s])&&void 0!==t?t:this.typingsInPeer[s]=[];let i=n.find((e=>e.userId===a));const r=()=>{delete i.timeout;const e=n.indexOf(i);-1!==e&&n.splice(e,1),this.rootScope.dispatchEvent("peer_typings",{peerId:s,typings:n}),n.length||delete this.typingsInPeer[s]};if(i&&void 0!==i.timeout&&clearTimeout(i.timeout),"sendMessageCancelAction"===e.action._){if(!i)return;return void r()}i||(i={userId:a},n.push(i)),i.action=e.action;const o=this.appUsersManager.hasUser(a);o?this.appUsersManager.forceUserOnline(a):"updateChatUserTyping"===e._&&e.chat_id&&this.appChatsManager.hasChat(e.chat_id)&&!this.appChatsManager.isChannel(e.chat_id)&&Promise.resolve(this.getChatFull(e.chat_id)).then((()=>{void 0!==i.timeout&&this.appUsersManager.hasUser(a)&&this.rootScope.dispatchEvent("peer_typings",{peerId:s,typings:n})})),i.timeout=R.Z.setTimeout(r,6e3),o&&this.rootScope.dispatchEvent("peer_typings",{peerId:s,typings:n})},this.onUpdatePeerBlocked=e=>{const t=this.appPeersManager.getPeerId(e.peer_id);if(this.appPeersManager.isUser(t)){const a=t.toUserId(),s=this.usersFull[a];s&&(e.blocked?s.pFlags.blocked=!0:delete s.pFlags.blocked),this.rootScope.dispatchEvent("user_full_update",a)}this.rootScope.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,a=this.chatsFull[e];void 0!==a&&(a.participants=t,this.rootScope.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,a=s.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,n=s.length;t{var t,a;const s=this.chatsFull[e],n=this.appChatsManager.getChat(e);if(!s||!n)return;let i=!1;!!s.call!=!!(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)&&(i=!0);const{photo:r}=n;if(r){const e="chatPhotoEmpty"!==r._;(e!==!(!s.chat_photo||"photoEmpty"===s.chat_photo._)||e&&r.photo_id!==(null===(a=s.chat_photo)||void 0===a?void 0:a.id))&&(i=!0)}i&&this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("channel_update",(e=>{this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("chat_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!0))})),this.rootScope.addEventListener("user_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!1))})),this.rootScope.addEventListener("invalidate_participants",(e=>{this.invalidateChannelParticipants(e)})),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_user,s=e.toPeerId(!1);a.profile_photo&&(a.profile_photo=this.appPhotosManager.savePhoto(a.profile_photo,{type:"profilePhoto",peerId:s}));const n=a.bot_info;if(n){const t={type:"userFull",userId:e};n.description_document=this.appDocsManager.saveDoc(n.description_document,t),n.description_photo=this.appPhotosManager.savePhoto(n.description_photo,t)}return this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.usersFull[e]=a,this.fullExpiration[s]=Date.now()+ma,this.rootScope.dispatchEvent("user_full_update",e),a}})}getProfileByPeerId(e,t){return this.appPeersManager.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return la(this,void 0,void 0,(function*(){const t=yield this.getProfileByPeerId(e);switch(t._){case"userFull":return t.profile_photo;case"channelFull":case"chatFull":return t.chat_photo}}))}getChatFull(e,t){if(this.appChatsManager.isChannel(e))return this.getChannelFull(e,t);const a=e.toPeerId(!0),s=this.chatsFull[e];if(s&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ma,this.rootScope.dispatchEvent("chat_full_update",e),s}})}getChatInviteLink(e,t){return la(this,void 0,void 0,(function*(){const a=yield this.getChatFull(e);return!t&&a.exported_invite&&"chatInviteExported"==a.exported_invite._?a.exported_invite.link:this.apiManager.invokeApi("messages.exportChatInvite",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0))}).then((t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link)))}))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},a=200,s=0){if("channelParticipantsRecent"===t._){const t=this.appChatsManager.getChat(e);if(t&&t.pFlags&&t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights)return Promise.reject()}return this.apiManager.invokeApiCacheable("channels.getParticipants",{channel:this.appChatsManager.getChannelInput(e),filter:t,offset:s,limit:a,hash:"0"},{cacheSeconds:60}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getChannelParticipant(e,t){return this.apiManager.invokeApiSingle("channels.getParticipant",{channel:this.appChatsManager.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e.participant)))}getChannelFull(e,t){const a=e.toPeerId(!0);return void 0!==this.chatsFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ma,this.rootScope.dispatchEvent("chat_full_update",e),s},processError:t=>{if("CHANNEL_PRIVATE"===t.type){const t=this.appChatsManager.getChat(e);this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:[{_:"channelForbidden",id:e,access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}],users:[]})}throw t}})}getMentions(e,t,a){const s=e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new ae.Z({ignoreCase:!0}),s=new Map;e.forEach((e=>{a.indexObject(e.id,this.appUsersManager.getUserSearchText(e.id)),s.set(e.id,e.rating)}));const n=Array.from(a.search(t));return n.sort(((e,t)=>s.get(t)-s.get(e))),n};let n;return n=this.appChatsManager.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:(0,oe.Z)(a)},50,0).then((e=>e.participants.map((e=>(0,Oe.Z)(e))))):e?Promise.resolve(this.getChatFull(e)).then((e=>e.participants.participants.map((e=>e.user_id.toPeerId())))):Promise.resolve([]),Promise.all([this.appUsersManager.getTopPeers("bots_inline").catch((()=>[])),n]).then((e=>{const t=e[0].concat(e[1].map((e=>({id:e,rating:0}))));return s(t)}))}invalidateChannelParticipants(e){this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e)),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){if(e.isUser()){const t=e.toUserId();delete this.usersFull[t],this.rootScope.dispatchEvent("user_full_update",t)}else{const t=e.toChatId();delete this.chatsFull[t],this.rootScope.dispatchEvent("chat_full_update",t)}}updateProfile(e,t,a){return this.apiManager.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:a}).then((e=>{if(this.appUsersManager.saveApiUser(e),void 0!==a){const t=e.id.toPeerId(),s=this.usersFull[e.id];s&&(s.about=a),this.rootScope.dispatchEvent("peer_bio_edit",t)}return this.getProfile(e.id,!0)}))}uploadProfilePhoto(e){return this.apiManager.invokeApi("photos.uploadProfilePhoto",{file:e}).then((e=>{const t=e.photo;if(!e.users.length){const a=t.sizes.find((e=>"photoStrippedSize"===e._));e.users.push(Object.assign(Object.assign({},this.appUsersManager.getSelf()),{photo:{_:"userProfilePhoto",dc_id:t.dc_id,photo_id:t.id,stripped_thumb:null==a?void 0:a.bytes,pFlags:{}}}))}this.appUsersManager.saveApiUsers(e.users);const a=this.appPeersManager.peerId;this.appPhotosManager.savePhoto(e.photo,{type:"profilePhoto",peerId:a});const s=a.toUserId();this.apiUpdatesManager.processLocalUpdate({_:"updateUserPhoto",user_id:s,date:(0,te.Z)(!0),photo:this.appUsersManager.getUser(s).photo,previous:!0})}))}deletePhotos(e){return this.apiManager.invokeApiSingle("photos.deletePhotos",{id:e.map((e=>At(this.appPhotosManager.getPhoto(e))))}).then((e=>{}))}verifyParticipantForOnlineCount(e){const t=this.appUsersManager.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce(((e,t)=>e+ +this.verifyParticipantForOnlineCount(t)),0)}getOnlines(e){var t;return la(this,void 0,void 0,(function*(){if(this.appChatsManager.isBroadcast(e))return 1;const a=yield this.getChatFull(e);if(this.appChatsManager.isMegagroup(e)){if(a.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const s=yield this.apiManager.invokeApiCacheable("messages.getOnlines",{peer:this.appChatsManager.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=s.onlines)&&void 0!==t?t:1}const s=a.participants;return(null==s?void 0:s.participants)?this.reduceParticipantsForOnlineCount(s.participants):1}))}getPeerTypings(e){return this.typingsInPeer[e]}}function ha(e,t){return e.some((e=>e instanceof Promise))?Promise.all(e).then(t):t(e)}var ua=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const ya=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],_a={type:"reactions"};class va extends G{after(){this.rootScope.addEventListener("language_change",(()=>{this.availableReactions=void 0,this.getAvailableReactions()})),this.sendReactionPromises=new Map,this.lastSendingTimes=new Map,this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{Promise.resolve(this.getAvailableReactions()).then((e=>ua(this,void 0,void 0,(function*(){for(const t of e)yield Promise.all([t.around_animation&&this.apiFileManager.downloadMedia({media:t.around_animation}),t.static_icon&&this.apiFileManager.downloadMedia({media:t.static_icon}),t.appear_animation&&this.apiFileManager.downloadMedia({media:t.appear_animation}),t.center_icon&&this.apiFileManager.downloadMedia({media:t.center_icon})]),yield(0,b.Z)(1e3)}))))}),7500)}))}getAvailableReactions(){return this.availableReactions?this.availableReactions:this.apiManager.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{(0,be.Z)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of ya)e[t]&&(e[t]=this.appDocsManager.saveDoc(e[t],_a));return t},params:{hash:0}})}getActiveAvailableReactions(){return(0,j.Z)(this.getAvailableReactions(),(e=>e.filter((e=>!e.pFlags.inactive))))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();return e.isUser()?this.unshiftQuickReaction(t):ha([t,this.appProfileManager.getChatFull(e.toChatId()),this.getQuickReaction()],(([e,t,a])=>{var s;const n=null!==(s=t.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};let i=[];return"chatReactionsAll"===n._?i=e:"chatReactionsSome"===n._&&(i=n.reactions.map((t=>e.find((e=>e.reaction===t.emoticon)))).filter(Boolean)),this.unshiftQuickReactionInner(i,a)}))}unshiftQuickReactionInner(e,t){if(t&&"reactionEmoji"!==t._&&"availableReaction"!==t._)return e;const a=t.emoticon||t.reaction,s=(0,ve.Z)(e,(e=>e.reaction===a));return s&&e.unshift(s),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return ha([e,t],(([e,t])=>this.unshiftQuickReactionInner(e,t)))}getAvailableReactionsByMessage(e){var t;if(!e)return[];const a=(null===(t=e.fwd_from)||void 0===t?void 0:t.channel_post)&&this.appPeersManager.isMegagroup(e.peerId)&&e.fwdFromId||e.peerId;return this.getAvailableReactionsForPeer(a)}isReactionActive(e){return!!this.availableReactions&&!!this.availableReactions.find((t=>t.reaction===e))}getQuickReaction(){return ha([this.apiManager.getConfig(),this.getAvailableReactions()],(([e,t])=>{const a=e.reactions_default;return"reactionEmoji"===(null==a?void 0:a._)?t.find((e=>e.reaction===a.emoticon)):a}))}getReactionCached(e){return this.availableReactions.find((t=>t.reaction===e))}getReaction(e){return(0,j.Z)(this.getAvailableReactions(),(()=>this.getReactionCached(e)))}getMessagesReactions(e,t){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map((e=>(0,oe.Z)(e))),peer:this.appPeersManager.getInputPeerById(e)},processResult:e=>{this.apiUpdatesManager.processUpdateMessage(e)}})}getMessageReactionsList(e,t,a,s,n){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessageReactionsList",params:{peer:this.appPeersManager.getInputPeerById(e),id:(0,oe.Z)(t),limit:a,reaction:s,offset:n},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),e)})}setDefaultReaction(e){return this.apiManager.invokeApi("messages.setDefaultReaction",{reaction:e}).then((t=>ua(this,void 0,void 0,(function*(){if(t){const t=yield this.apiManager.getConfig();t&&(t.reactions_default=e),this.rootScope.dispatchEvent("quick_reaction",e)}return t}))))}sendReaction(e,t,a){var s,n;return ua(this,void 0,void 0,(function*(){"availableReaction"===t._&&(t={_:"reactionEmoji",emoticon:t.reaction});const i=yield this.apiManager.getLimit("reactions"),r=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(r))return;this.lastSendingTimes.set(r,Date.now()),setTimeout((()=>{this.lastSendingTimes.delete(r)}),333);const{peerId:o,mid:p}=e,d=this.appPeersManager.peerId,f=e=>{--e.count,delete e.chosen_order,(0,Yt.Z)(t,e.reaction)&&(t=void 0),e.count||(0,M.Z)(l.results,e),l.recent_reactions&&(0,ve.Z)(l.recent_reactions,(t=>(0,Yt.Z)(t.reaction,e.reaction)&&this.appPeersManager.getPeerId(t.peer_id)===d)),l.results.length||(l=void 0)},c=(null===(n=null===(s=e.reactions)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.can_see_list)||!this.appPeersManager.isBroadcast(e.peerId)||e.peerId.isUser();e.reactions||(e.reactions={_:"messageReactions",results:[],recent_reactions:c?[]:void 0,pFlags:{can_see_list:c||void 0}});let l=a?e.reactions:(0,_e.Z)(e.reactions);const m=l.results.filter((e=>void 0!==e.chosen_order));m.sort(((e,t)=>t.chosen_order-e.chosen_order));const g=[],h=m.findIndex((e=>(0,Yt.Z)(e.reaction,t)));-1!==h&&g.push(...m.splice(h,1)),g.push(...m.splice(i-+(-1===h))),g.forEach((e=>{m.forEach((t=>{t.chosen_order>e.chosen_order&&--t.chosen_order})),f(e)}));const u=m.length;if(m.forEach(((e,t)=>{e.chosen_order=u-1-t})),t){l||(l={_:"messageReactions",results:[],pFlags:{}},c&&(l.pFlags.can_see_list=!0));let e=l.results.findIndex((e=>(0,Yt.Z)(e.reaction,t))),a=-1!==e&&l.results[e];if(a||(a={_:"reactionCount",count:0,reaction:t},e=l.results.push(a)-1),++a.count,a.chosen_order=m.length?m[0].chosen_order+1:0,m.unshift(a),!l.recent_reactions&&c&&(l.recent_reactions=[]),l.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:this.appPeersManager.getOutputPeer(d)};this.appPeersManager.isMegagroup(o),l.recent_reactions.unshift(e),l.recent_reactions=l.recent_reactions.slice(0,3)}}const y=this.availableReactions;if(l&&(null==y?void 0:y.length)){const e=new Map;y.forEach(((t,a)=>{e.set(t.reaction,a)})),l.results.sort(((t,a)=>{var s,n;const i=t.reaction.document_id||t.reaction.emoticon,r=a.reaction.document_id||a.reaction.emoticon;return a.count-t.count||(null!==(s=e.get(i))&&void 0!==s?s:0)-(null!==(n=e.get(r))&&void 0!==n?n:0)}))}if(a)return e.reactions=l,this.rootScope.dispatchEvent("messages_reactions",[{message:e,changedResults:[]}]),Promise.resolve();this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:l,local:!0});const _=[o,p].join("-"),v=(0,oe.Z)(p),b=this.apiManager.invokeApi("messages.sendReaction",{peer:this.appPeersManager.getInputPeerById(o),msg_id:v,reaction:m.map((e=>e.reaction))}).then((e=>{(0,be.Z)(e);const t=e.updates.findIndex((e=>"updateEditMessage"===e._||"updateEditChannelMessage"===e._));if(-1!==t){const a=e.updates[t];e.updates[t]={_:"updateMessageReactions",msg_id:v,peer:this.appPeersManager.getOutputPeer(o),reactions:a.message.reactions,pts:a.pts,pts_count:a.pts_count}}this.apiUpdatesManager.processUpdateMessage(e)})).catch((t=>{var a;"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(_)===b&&this.sendReaction(e,null===(a=m[0])||void 0===a?void 0:a.reaction,!0)})).finally((()=>{this.sendReactionPromises.get(_)===b&&this.sendReactionPromises.delete(_)}));return this.sendReactionPromises.set(_,b),b}))}}var ba=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Pa="emoji",Ma="emojiAnimations",Sa=new Set([Pa,Ma]);class Ia extends G{constructor(){super(...arguments),this.storage=new W.Z(H.Z,"stickerSets"),this.processAllStickersResult=e=>((0,be.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e)}after(){this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.names={},this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{this.getAnimatedEmojiStickerSet()}),1e3),this.getGreetingStickersPromise||void 0!==this.getGreetingStickersTimeout||(this.getGreetingStickersTimeout=R.Z.setTimeout((()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)}),5e3))})),this.rootScope.addEventListener("app_config",(()=>this.onStickersUpdated("faved",!0))),this.apiUpdatesManager.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),this.rootScope.dispatchEvent("stickers_installed",t.set)},updateRecentStickers:()=>this.onStickersUpdated("recent",!0),updateFavedStickers:()=>this.onStickersUpdated("faved",!0),updateMoveStickerSetToTop:e=>{this.rootScope.dispatchEvent("stickers_top",e.stickerset)}})}onStickersUpdated(e,t){return ba(this,void 0,void 0,(function*(){const a=yield"faved"===e?this.getFavedStickersStickers(t):this.getRecentStickersStickers(t);this.rootScope.dispatchEvent("stickers_updated",{type:e,stickers:a})}))}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then((e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort(((e,t)=>Math.random()-Math.random()))}))),this.getGreetingStickersPromise.then((()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),this.apiFileManager.downloadMedia({media:this.greetingStickers[0]}),t}))}saveStickers(e){(0,ne.Z)(e,((t,a)=>{(t=this.appDocsManager.saveDoc(t))?e[a]=t:e.splice(a,1)}))}canUseStickerSetCache(e,t){var a;return e&&(null===(a=e.documents)||void 0===a?void 0:a.length)&&(Date.now()-e.refreshTime<36e5||t)}getStickerSet(e,t={}){let{id:a}=e;if(e.access_hash||(e=this.names[a]||e,a=e.id),this.getStickerSetPromises[a])return this.getStickerSetPromises[a];if(!t.overwrite){const e=this.storage.getFromCache(a);if(this.canUseStickerSetCache(e,t.useCache))return e}const s=this.getStickerSetPromises[a]=new Promise((n=>ba(this,void 0,void 0,(function*(){if(!t.overwrite){const e=yield this.storage.get(a);if(this.canUseStickerSetCache(e,t.useCache))return this.saveStickers(e.documents),n(e),void(this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a])}try{const s=yield this.apiManager.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),i=t.saveById?a:s.set.id;this.saveStickerSet(s,i),n(s)}catch(e){n(null)}this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a]}))));return s}getAnimatedEmojiStickerSet(){return Promise.all([this.getStickerSet({id:Pa},{saveById:!0}),this.getStickerSet({id:Ma},{saveById:!0}),this.getAnimatedEmojiSounds()]).then((([e,t])=>({emoji:e,animations:t})))}getAnimatedEmojiSounds(e){if(this.getAnimatedEmojiSoundsPromise&&!e)return this.getAnimatedEmojiSoundsPromise;const t=this.getAnimatedEmojiSoundsPromise=Promise.all([this.apiManager.getAppConfig(e),this.apiManager.getConfig()]).then((([e,a])=>{if(this.getAnimatedEmojiSoundsPromise===t)for(const t in e.emojies_sounds){const s=e.emojies_sounds[t],n=atob(s.file_reference_base64.replace(/-/g,"+").replace(/_/g,"/")),i=new Uint8Array(n.length);for(let e=0,t=i.length;e((0,be.Z)(e),this.recentStickers=e.stickers,this.saveStickers(e.stickers),e),overwrite:e})}))}getRecentStickersStickers(e){if(e)this.recentStickers=void 0;else if(this.recentStickers)return this.recentStickers;return this.getRecentStickers(e).then((()=>this.recentStickers))}saveRecentSticker(e,t,a){const s=this.appDocsManager.getDoc(e);if((0,ve.Z)(this.recentStickers,(t=>t.id===e)),!t){this.recentStickers.unshift(s);const e=(0,St.Z)(s.stickerEmojiRaw);for(const t in this.getStickersByEmoticonsPromises)this.getStickersByEmoticonsPromises[t].then((a=>{const n=(0,ve.Z)(a,(e=>e.id===s.id));n?a.unshift(n):t.includes(e)&&a.unshift(s)}))}return this.rootScope.dispatchEvent("sticker_updated",{type:"recent",faved:!t,document:s}),t&&this.onStickersUpdated("recent",!1),this.apiManager.invokeApi("messages.saveRecentSticker",{id:$t(s),unsave:t,attached:a})}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const a=t?Ma:Pa,s=this.storage.getFromCache(a);if(!(null==s?void 0:s.documents))return;t&&["🧡","💛","💚","💙","💜","🖤","🤍","🤎"].includes(e)&&(e="❤️"),e=this.cleanEmoji(e);const n=s.packs.find((t=>t.emoticon===e));return n?this.appDocsManager.getDoc(n.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e){const t=this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e)));return Promise.all([t,this.preloadAnimatedEmojiStickerAnimation(e)]).then((([e,t])=>({doc:e,animation:null==t?void 0:t.doc,sound:null==t?void 0:t.sound})))}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e,!0))).then((t=>{if(!t)return;const a=this.getAnimatedEmojiSoundDocument(e);return Promise.all([this.preloadSticker(t.id),a?this.preloadSticker(a.id):void 0]).then((()=>({doc:t,sound:a})))}))}preloadSticker(e,t){var a;const s=this.appDocsManager.getDoc(e);return this.apiFileManager.downloadMedia({media:s,thumb:t?null===(a=s.video_thumbs)||void 0===a?void 0:a[0]:void 0})}saveStickerSet(e,t){const a={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents,keywords:e.keywords};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),s.set.short_name&&(this.names[s.set.short_name]=this.getStickerSetInput(a.set)),this.saveStickers(e.documents);const n=s.set.installed_date||Sa.has(t);s.refreshTime=Date.now(),this.storage.set({[t]:s},!n)}getStickerSetThumbDownloadOptions(e){var t;const a=e.thumbs.find((e=>"photoSize"===e._)),s=e.thumb_dc_id,n=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:s,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:a.size,mimeType:n?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return e.id===Pa?{_:"inputStickerSetAnimatedEmoji"}:e.id===Ma?{_:"inputStickerSetAnimatedEmojiAnimations"}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return ba(this,void 0,void 0,(function*(){return(yield this.apiManager.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>((0,be.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)})).sets}))}getPromoPremiumStickers(){return this.getStickersByEmoticon("⭐️⭐️",!1)}getPremiumStickers(){return this.getStickersByEmoticon("📂⭐️",!1)}getFavedStickers(e){return this.apiManager.invokeApiHashable({method:"messages.getFavedStickers",processResult:e=>((0,be.Z)(e),this.saveStickers(e.stickers),this.favedStickers=e.stickers,e),overwrite:e})}getFavedStickersStickers(e){if(e)this.favedStickers=void 0;else if(this.favedStickers)return this.favedStickers;return this.getFavedStickers(e).then((()=>this.favedStickers))}getFavedStickersLimit(){return this.apiManager.getLimit("favedStickers")}faveSticker(e,t){return ba(this,void 0,void 0,(function*(){this.favedStickers||(yield this.getFavedStickersStickers());const a=yield this.getFavedStickersLimit(),s=this.appDocsManager.getDoc(e);return(0,ve.Z)(this.favedStickers,(e=>e.id===s.id)),t||(this.favedStickers.unshift(s),this.favedStickers.splice(a,this.favedStickers.length-a)),this.rootScope.dispatchEvent("sticker_updated",{type:"faved",faved:!t,document:s}),this.apiManager.invokeApi("messages.faveSticker",{id:$t(s),unfave:t}).then((()=>{t&&this.onStickersUpdated("faved",!0)}))}))}toggleStickerSet(e){return ba(this,void 0,void 0,(function*(){if((e=this.storage.getFromCache(e.id).set).installed_date){if(yield this.apiManager.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,this.rootScope.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else if(yield this.apiManager.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,this.rootScope.dispatchEvent("stickers_installed",e),!0;return!1}))}toggleStickerSets(e){return Promise.all(e.map((e=>this.toggleStickerSet(e))))}searchStickerSets(e,t=!0){return ba(this,void 0,void 0,(function*(){const a=t?1:0,s=yield this.apiManager.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:a,exclude_featured:t||void 0,q:e},processResult:e=>((0,be.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)}),n=[],r=this.storage.getCache();for(const t in r){const{set:a}=r[t];a.title.toLowerCase().includes(e.toLowerCase())&&!s.sets.find((e=>e.set.id===a.id))&&n.push({_:"stickerSetCovered",set:a,cover:null})}return s.sets.concat(n)}))}getAllStickers(){return this.apiManager.invokeApiHashable({method:"messages.getAllStickers",processResult:this.processAllStickersResult})}getEmojiStickers(){return this.apiManager.invokeApiHashable({method:"messages.getEmojiStickers",processResult:this.processAllStickersResult})}preloadStickerSets(){return this.getAllStickers().then((e=>Promise.all(e.sets.map((e=>this.getStickerSet(e,{useCache:!0}))))))}getStickersByEmoticon(e,t=!0){return e=(0,St.Z)(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([this.apiManager.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e},processResult:e=>e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then((([t,a,s])=>{const n=t.stickers.map((e=>this.appDocsManager.saveDoc(e))),r=[],o=[],p=t=>{for(const a of t)if((0,St.Z)(a.emoticon).includes(e))for(const e of a.documents){const t=this.appDocsManager.getDoc(e);(t.animated?r:o).push(t)}};if(s){p(s.packs);const e=s.stickers;[r,o].forEach((t=>{t.sort(((t,a)=>e.indexOf(t)-e.indexOf(a)))}))}for(const e of a)p(e.packs);const d=[...new Set(r.concat(o,n))];return(0,ne.Z)(d,((e,t,a)=>{(3===e.sticker&&!i().IS_WEBM_SUPPORTED||!this.rootScope.premium&&(0,Qt.Z)(e))&&a.splice(t,1)})),d}))}clearRecentStickers(){return this.recentStickers&&(this.recentStickers.length=0,this.onStickersUpdated("recent",!1)),this.apiManager.invokeApi("messages.clearRecentStickers")}}var Ca=a(467);function wa(e){return e&&e.toLowerCase()||""}var ka=a(8493);class Aa extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.users={},this.usernames={};else for(const e in this.users){if(!e)continue;const t=e.toPeerId();if(!this.peersStorage.isPeerNeeded(t)){const t=this.users[e];t.username&&delete this.usernames[wa(t.username)],this.storage.delete(e),delete this.users[e]}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1},this.updateUsersStatuses=()=>{const e=(0,te.Z)(!0);for(const t in this.users){const a=this.users[t];this.updateUserStatus(a,e)}}}after(){return this.clear(!0),setInterval(this.updateUsersStatuses,6e4),this.rootScope.addEventListener("state_synchronized",this.updateUsersStatuses),this.apiUpdatesManager.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,a=this.users[t];a&&(a.status=e.status,a.status&&("expires"in a.status&&(a.status.expires-=this.timeManager.getServerTimeOffset()),"was_online"in a.status&&(a.status.was_online-=this.timeManager.getServerTimeOffset())),this.rootScope.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(a))},updateUserPhoto:e=>{var t,a;const s=e.user_id,n=this.users[s];if(n){if((null===(t=n.photo)||void 0===t?void 0:t.photo_id)===(null===(a=e.photo)||void 0===a?void 0:a.photo_id))return;this.forceUserOnline(s,e.date),"userProfilePhotoEmpty"===e.photo._?delete n.photo:n.photo=re(n.photo,e.photo),this.setUserToStateIfNeeded(n),this.rootScope.dispatchEvent("user_update",s),this.rootScope.dispatchEvent("avatar_update",s.toPeerId())}else console.warn("No user by id:",s)},updateUserName:e=>{const t=e.user_id,a=this.users[t];a&&(this.forceUserOnline(t),this.saveApiUser(Object.assign(Object.assign({},a),{first_name:e.first_name,last_name:e.last_name,username:e.username}),!0))}}),this.rootScope.addEventListener("language_change",(e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))})),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("users")]).then((([e,{results:t,storage:a}])=>{if(this.storage=a,t.length)for(let a=0,s=t.length;a{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)}))}))}get userId(){return this.rootScope.myId.toUserId()}onContactsModified(e){e&&this.appStateManager.pushToState("contactsListCachedTime",(0,te.Z)(!0))}pushRecentSearch(e){return this.appStateManager.getState().then((t=>{const a=t.recentSearch||[];if(a[0]!==e){(0,M.Z)(a,e),a.unshift(e),a.length>20&&(a.length=20),this.appStateManager.pushToState("recentSearch",a);for(const e of a)this.peersStorage.requestPeer(e,"recentSearch")}}))}clearRecentSearch(){return this.appStateManager.getState().then((e=>{const t=e.recentSearch||[];for(const e of t)this.peersStorage.releasePeer(e,"recentSearch");t.length=0,this.appStateManager.pushToState("recentSearch",t)}))}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=(0,v.Z)();return this.apiManager.invokeApi("contacts.getContacts").then((e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach((e=>{this.pushContact(e.user_id)})),this.onContactsModified(!0),this.contactsFillPromise=t),t.resolve(this.contactsList)}),(()=>{this.updatedContactsList=!1})),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase();const t=this.usernames[e];return t?this.users[t]:this.apiManager.invokeApi("contacts.resolveUsername",{username:e}).then((e=>this.processResolvedPeer(e)))}processResolvedPeer(e){return this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appPeersManager.getPeer((0,le.Z)(e.peer))}resolvePhone(e){return this.apiManager.invokeApi("contacts.resolvePhone",{phone:e}).then((e=>this.processResolvedPeer(e)))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),this.peersStorage.requestPeer(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),this.peersStorage.releasePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];return t?[t.first_name,t.last_name,t.phone,t.username,t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" "):""}getContacts(e,t=!1,a="name"){return this.fillContacts().promise.then((s=>{let n=[...s];if(e){const t=this.contactsIndex.search(e);n=[...n].filter((e=>t.has(e)))}"name"===a?n.sort(((e,t)=>{const a=(this.users[e]||{}).sortName||"",s=(this.users[t]||{}).sortName||"";return a.localeCompare(s)})):"online"===a&&n.sort(((e,t)=>{const a=this.getUserStatusForSort(this.getUser(e).status);return this.getUserStatusForSort(this.getUser(t).status)-a}));const i=this.userId;return(0,M.Z)(n,i),t&&this.testSelfSearch(e)&&n.unshift(i),n}))}getContactsPeerIds(e,t,a,s){return this.getContacts(e,t,a).then((e=>{const t=e.map((e=>e.toPeerId(!1)));return s?t.slice(0,s):t}))}toggleBlock(e,t){return this.apiManager.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:this.appPeersManager.getInputPeerById(e)}).then((a=>(a&&this.apiUpdatesManager.processLocalUpdate({_:"updatePeerBlocked",peer_id:this.appPeersManager.getOutputPeer(e),blocked:t}),a)))}testSelfSearch(e){const t=this.getSelf(),a=this.createSearchIndex();return a.indexObject(t.id,this.getUserSearchText(t.id)),a.search(e).has(t.id)}createSearchIndex(){return new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiUser(e,t))))}setUserNameToCache(e,t){if(!t||t.username!==e.username){if(null==t?void 0:t.username){const e=wa(t.username);delete this.usernames[e]}if(e.username){const t=wa(e.username);this.usernames[t]=e.id}}}saveApiUser(e,t){var a,s;if("userEmpty"===e._)return;const n=e.id,i=this.users[n];if(void 0===e.pFlags&&(e.pFlags={}),!e.pFlags.min||void 0===i){if(this.setUserNameToCache(e,i),i&&void 0!==i.sortName&&i.first_name===e.first_name&&i.last_name===e.last_name)e.sortName=i.sortName;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":(0,Ca.ZP)(t,!1)}if(e.status&&(e.status.expires&&(e.status.expires-=this.timeManager.getServerTimeOffset()),e.status.was_online&&(e.status.was_online-=this.timeManager.getServerTimeOffset())),void 0===i)this.users[n]=e;else{const t=e.first_name!==i.first_name||e.last_name!==i.last_name||e.username!==i.username,r=(null===(a=i.photo)||void 0===a?void 0:a.photo_id)!==(null===(s=e.photo)||void 0===s?void 0:s.photo_id),o=i.pFlags.premium!==e.pFlags.premium||i.pFlags.verified!==e.pFlags.verified||i.pFlags.scam!==e.pFlags.scam||i.pFlags.fake!==e.pFlags.fake,p=!!i.pFlags.contact,d=!!e.pFlags.contact;re(i,e),this.rootScope.dispatchEvent("user_update",n),p!==d&&this.onContactUpdated(n,d,p),r&&this.rootScope.dispatchEvent("avatar_update",e.id.toPeerId()),(t||o)&&this.rootScope.dispatchEvent("peer_title_edit",e.id.toPeerId())}this.checkPremium(e),this.setUserToStateIfNeeded(e)}}checkPremium(e){if(e.pFlags.self){const t=!!e.pFlags.premium;this.rootScope.premium!==t&&this.rootScope.dispatchEvent("premium_toggle",t)}}setUserToStateIfNeeded(e){this.peersStorage.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e&&(e=this.getUser(e).status),e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return(0,fe.Z)(e)?e:this.users[e]||{_:"userEmpty",id:e,pFlags:{deleted:!0},access_hash:""}}getSelf(){return this.getUser(this.userId)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e!==this.userId}hasUser(e,t){const a=this.users[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}getUserPhoto(e){const t=this.getUser(e);return t&&t.photo||{_:"userProfilePhotoEmpty"}}getUserString(e){const t=this.getUser(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}getUserInput(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash}}getUserInputPeer(e){return{_:"inputPeerUser",user_id:e,access_hash:this.getUser(e).access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=(0,te.Z)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(this.apiUpdatesManager.updatesState.syncLoading)return;const s=this.getUser(e);!(null==s?void 0:s.status)||"userStatusOnline"===s.status._||"userStatusEmpty"===s.status._||s.pFlags.support||s.pFlags.deleted||(s.status={_:"userStatusOnline",expires:a+60},this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s))}importContact(e,t,a){return this.importContacts([{first_name:e,last_name:t,phones:[a]}]).then((e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]}))}importContacts(e){const t=[];for(let a=0;a(this.saveApiUsers(e.users),e.imported.map((e=>(this.onContactUpdated(e.user_id,!0),e.user_id))))))}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=this.appStateManager.getState().then((t=>{const a=t.topPeersCache[e];return a&&a.cachedTime+864e5>Date.now()&&a.peers?a.peers:this.apiManager.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then((a=>{let s=[];return"contacts.topPeers"===a._&&(this.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.categories.length&&(s=a.categories[0].peers.map((e=>{const t=(0,le.Z)(e.peer);return this.peersStorage.requestPeer(t,"topPeer"),{id:t,rating:e.rating}})))),t.topPeersCache[e]={peers:s,cachedTime:Date.now()},this.appStateManager.pushToState("topPeersCache",t.topPeersCache),s}))}))}getBlocked(e=0,t=0){return this.apiManager.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map((e=>e.id.toPeerId())).concat(e.chats.map((e=>e.id.toPeerId(!0))))})))}getLocated(e,t,a,s=!1,n=0){const i={_:"inputGeoPoint",lat:e,long:t,accuracy_radius:a};return this.apiManager.invokeApi("contacts.getLocated",{geo_point:i,background:s}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e)))}searchContacts(e,t=20){const a=(0,jt.Z)(e);if(a.length&&a[0].length===e.trim().length&&"messageEntityUrl"===a[0]._)try{const t=new URL((0,He.Z)(e).url).pathname.slice(1);t&&(e=t)}catch(e){}return this.apiManager.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{my_results:(0,we.Z)(e.my_results.map((e=>(0,le.Z)(e)))),results:e.results.map((e=>(0,le.Z)(e)))})))}onContactUpdated(e,t,a=this.isContact(e)){t!==a&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),this.rootScope.dispatchEvent("contacts_update",e))}updateUsername(e){return this.apiManager.invokeApi("account.updateUsername",{username:e}).then((e=>{this.saveApiUser(e)}))}setUserStatus(e,t){if(this.isBot(e))return;const a=this.users[e];if(a){const s=t?{_:"userStatusOffline",was_online:(0,te.Z)(!0)}:{_:"userStatusOnline",expires:(0,te.Z)(!0)+50};a.status=s,this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(a)}}updateMyOnlineStatus(e){return this.setUserStatus(this.getSelf().id,e),this.apiManager.invokeApiSingle("account.updateStatus",{offline:e})}addContact(e,t,a,s,n){return this.apiManager.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:a,phone:s,add_phone_privacy_exception:n}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)}))}deleteContacts(e){return this.apiManager.invokeApi("contacts.deleteContacts",{id:e.map((e=>this.getUserInput(e)))}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),e.forEach((e=>{this.onContactUpdated(e,!1)}))}))}isRestricted(e){const t=this.getUser(e),a=t.restriction_reason;return!!(t.pFlags.restricted&&a&&Ve(a))}checkUsername(e){return this.apiManager.invokeApi("account.checkUsername",{username:e})}canSendToUser(e){return(0,ka.Z)(this.getUser(e))}}const Da=new Set(["photo","video","gif","document"]);class Ua extends G{constructor(){super(...arguments),this.webpages={},this.pendingWebPages={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,a){var s,n;if("webPageNotModified"===e._)return;const{id:i}=e,r=this.webpages[i],o=r&&r._===e._&&r.hash==r.hash;if("webPage"===e._){"photo"===(null===(s=e.photo)||void 0===s?void 0:s._)?e.photo=this.appPhotosManager.savePhoto(e.photo,a):delete e.photo,"document"===(null===(n=e.document)||void 0===n?void 0:n._)?e.document=this.appDocsManager.saveDoc(e.document,a):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name,i=e.title||e.author||t||"";t&&i===t&&delete e.site_name,Da.has(e.type)||e.description||!e.photo||(e.type="photo")}let p=this.pendingWebPages[i];if(t&&(p||(p=this.pendingWebPages[i]=new Set),p.add(t)),void 0===r?this.webpages[i]=e:re(r,e),!t&&void 0!==p&&o){const e=[];p.forEach((t=>{const[a,s,n]=t.split("_");e.push({peerId:a.toPeerId(),mid:+s,isScheduled:!!n})})),this.rootScope.dispatchEvent("webpage_updated",{id:i,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,a){return e+"_"+t+(a?"_s":"")}deleteWebPageFromPending(e,t){const a=e.id;if(!a)return;const s=this.pendingWebPages[a];s&&s.has(t)&&(s.delete(t),s.size||delete this.pendingWebPages[a])}getCachedWebPage(e){return this.webpages[e]}getWebPage(e){return this.apiManager.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.saveWebPage(e),params:{url:e}})}}var Ea=a(5936),Ra=a(3019);function Ta(e){return(0,Ra.Z)(e,"readAsArrayBuffer")}var Fa=a(1243),xa=a(7086);function Ba(e){return encodeURIComponent(e).replace(/['()]/g,escape).replace(/\*/g,"%2A")}class Va{constructor(e,t){this.serviceMessagePort=e,this.downloadId=t,this.serviceMessagePort=qs()}write(e,t){return a=this,s=void 0,i=function*(){return this.serviceMessagePort.invoke("downloadChunk",{id:this.downloadId,chunk:e})},new((n=void 0)||(n=Promise))((function(e,t){function r(e){try{p(i.next(e))}catch(e){t(e)}}function o(e){try{p(i.throw(e))}catch(e){t(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(a,s||[])).next())}));var a,s,n,i}finalize(e){return this.serviceMessagePort.invoke("downloadFinalize",this.downloadId).then((()=>{}))}}class La{getFile(e){return Promise.reject((0,X.Z)("NO_ENTRY_FOUND"))}prepareWriting({fileName:e,downloadId:t,size:a}){const s=Object.assign({"Content-Type":"application/octet-stream; charset=utf-8","Content-Disposition":"attachment; filename*=UTF-8''"+Ba(e)},a?{"Content-Length":a}:{}),n=qs(),i=n.invoke("download",{headers:s,id:t}),r=(0,v.Z)();return r.cancel=()=>{r.reject((0,X.Z)("DOWNLOAD_CANCELED"))},r.catch((()=>{qs().invoke("downloadCancel",t)})),i.then(r.resolve,r.reject),{deferred:r,getWriter:()=>new Va(n,t)}}}var Oa=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Na=131072,Za=new Set(["DOWNLOAD_CANCELED","UPLOAD_CANCELED","UNKNOWN","NO_NEW_CONTEXT"]);class qa extends G{constructor(){super(...arguments),this.cacheStorage=new Ea.Z("cachedFiles"),this.downloadStorage=new La,this.downloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.refreshReferencePromises={},this.log=(0,S.kg)("AFM",S.v9.Error|S.v9.Log),this.tempId=0,this.queueId=0,this.debug=P.Z.debug,this.maxUploadParts=4e3,this.maxDownloadParts=8e3,this.uncompressTGS=(e,t)=>this.cryptoWorker.invokeCrypto("gzipUncompress",e.slice().buffer,!1),this.uncompressTGV=(e,t)=>{const a=e.slice().buffer;return i().IS_FIREFOX?this.cryptoWorker.invokeCrypto("gzipUncompress",a,!0).then((e=>function(e){const t=e.indexOf("/,` width="${n}" height="${i}">`).replace(/[^\x00-\x7F]/g,"")}(e))).then((e=>(new TextEncoder).encode(e))):this.cryptoWorker.invokeCrypto("gzipUncompress",a,!1)},this.convertWebp=(e,t)=>f.Z.getInstance().invoke("convertWebp",{fileName:t,bytes:e}),this.convertOpus=(e,t)=>f.Z.getInstance().invoke("convertOpus",{fileName:t,bytes:e})}after(){setInterval((()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}}),18e5),this.rootScope.addEventListener("config",(e=>{this.webFileDcId=e.webfile_dc_id})),this.rootScope.addEventListener("app_config",(e=>{this.maxUploadParts=this.rootScope.premium?e.upload_max_fileparts_premium:e.upload_max_fileparts_default,this.maxDownloadParts=e.upload_max_fileparts_premium}))}downloadRequest(e,t,a,s,n=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise(((e,r)=>{i.push({id:t,queueId:n,cb:a,deferred:{resolve:e,reject:r},activeDelta:s})}));return setTimeout((()=>{this.downloadCheck(e)}),0),r}downloadCheck(e){const t=this.downloadPulls[e],a=this.rootScope.premium?224:36;if(this.downloadActives[e]>=a||!(null==t?void 0:t.length))return!1;const s=(0,ve.Z)(t,(e=>0===e.queueId))||(0,ve.Z)(t,(e=>e.queueId===this.queueId))||t.shift(),n=s.activeDelta||1;this.downloadActives[e]+=n;const i=s.cb();i.then((()=>{this.downloadActives[e]-=n,this.downloadCheck(e)}),(t=>{(null==t?void 0:t.type)&&Za.has(t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=n,this.downloadCheck(e)})).finally((()=>{i.then(s.deferred.resolve,s.deferred.reject)}))}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=[this.downloadPromises[e],this.uploadPromises[e]].filter(Boolean);let a=!1;for(let e=0,s=t.length;eOa(this,void 0,void 0,(function*(){return null==r||r(),this.apiManager.invokeApi("upload.getWebFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0})}))),this.getDelta(s),i)}requestFilePart(e,t,a,s,n=0,i=0,r){return this.downloadRequest(e,n,(()=>Oa(this,void 0,void 0,(function*(){null==r||r();const n=()=>Oa(this,void 0,void 0,(function*(){var i;null==r||r();const o=null===(i=t.file_reference)||void 0===i?void 0:i.slice();return this.apiManager.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch((e=>{if(null==r||r(),"FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t,o).then(n);throw e}))}));(0,be.Z)(t);const i=t.file_reference;if(i&&!t.checkedReference){t.checkedReference=!0;const e=E(i);if(this.refreshReferencePromises[e])return this.refreshReference(t,i).then(n)}return n()}))),this.getDelta(s),i)}getDelta(e){return e/Na}getLimitPart(e,t){if(!e)return 524288;let a=Na;const s=t?this.maxUploadParts:this.maxDownloadParts,n=t?524288:1048576;for(;e/a>s&&a{a===E(t)&&e.reject((0,X.Z)("REFERENCE_IS_NOT_REFRESHED")),e.resolve(t)}),e.reject)}return s.deferred.then((t=>{e.file_reference=t}))}isDownloading(e){return!!this.downloadPromises[e]}getDownload(e){return this.downloadPromises[e]}getUpload(e){return this.uploadPromises[e]}getConvertMethod(e){let t;return"application/x-tgwallpattern"===e?(t=this.uncompressTGV,e="image/svg+xml"):"image/webp"!==e||i().IS_WEBP_SUPPORTED?"application/x-tgsticker"===e?(t=this.uncompressTGS,e="application/json"):"audio/ogg"!==e||i().IS_OPUS_SUPPORTED||(t=this.convertOpus,e="audio/wav"):(t=this.convertWebp,e="image/png"),{mimeType:e,process:t}}allocateDeferredPromises(e,t,a){const s=[];let n,i=e,r=Promise.resolve();do{n=(0,v.Z)(),s.push({offset:i,writePromise:r,writeDeferred:n}),r=n,i+=a}while(i{if(!(null==e?void 0:e.error))for(const a of M)e&&e!==a||(a.error=t,a.deferred.reject(t))},y=this.tempId++,_=e.limitPart||this.getLimitPart(s,!1);let v,b,P=m.getFile.bind(m);const M=[],S=s||_,I=(e,t)=>{const{deferred:a}=e,s=u.bind(null,e);a.cancel=()=>a.reject((0,X.Z)("DOWNLOAD_CANCELED")),a.catch((t=>{var a,n;s(t),null===(n=null===(a=e.writer)||void 0===a?void 0:a.truncate)||void 0===n||n.call(a)})).finally((()=>{this.downloadPromises[t]===a&&delete this.downloadPromises[t],delete e.writer})),this.downloadPromises[t]=a,M.push(e)};if(m&&(!g||S<=o.Iw)&&(v=m.prepareWriting(l,S,e.mimeType),I(v,l)),g){let t=e.fileName;if(!t){t=l;const a=yt[e.mimeType];a&&(t+="."+a)}b=g.prepareWriting({fileName:t,downloadId:r,size:S}),I(b,c),v&&b.deferred.catch((e=>v.deferred.reject(e)))}h=null!==(a=null==b?void 0:b.deferred)&&void 0!==a?a:v.deferred,g&&f&&(P=g.getFile.bind(g)),P(l).then((e=>Oa(this,void 0,void 0,(function*(){if(C(),b){const t=b.writer=b.getWriter();C();const a=yield function(e){return Ta(e).then((e=>new Uint8Array(e)))}(e);C(),yield t.write(a),C(),b.deferred.resolve(yield t.finalize())}v&&v.deferred.resolve(e)})))).catch((t=>Oa(this,void 0,void 0,(function*(){if(e.onlyCache)return void u(null,t);M.forEach((e=>{e.writer=e.getWriter()}));const a="inputWebFileLocation"===i._,r=(a?this.requestWebFilePart:this.requestFilePart).bind(this);a&&void 0===this.webFileDcId&&(yield this.apiManager.getConfig(),C());const p=this.allocateDeferredPromises(0,s,_),d={done:0,offset:0,total:s,fileName:c},m=()=>{try{C(),d.done=h,this.rootScope.dispatchEvent("download_progress",d)}catch(e){}},g=(0,sa.Z)(m,50,!0);let h=0;const v=()=>Oa(this,void 0,void 0,(function*(){const{offset:t,writePromise:a,writeDeferred:d}=p.shift();try{C();performance.now();const u=yield r(n,i,t,_,y,e.queueId,C),b=(performance.now(),u.bytes);p.length&&v();const P=b.byteLength;this.debug&&this.log("downloadFile requestFilePart result:",c,u);const S=t+_>=s||!P;if(P){h+=P,S?m():g();performance.now();yield a,C(),performance.now(),performance.now(),yield Promise.all(M.map((({writer:e})=>null==e?void 0:e.write(b,t)))),C()}if(S&&(!s||h{var t;return null===(t=null==e?void 0:e.trim)||void 0===t?void 0:t.call(e,h)})),S&&f){const e=M.filter((({writer:e})=>(null==e?void 0:e.getParts)&&e.replaceParts)).map((({writer:e})=>Oa(this,void 0,void 0,(function*(){const t=e.getParts(),a=yield f(t,l);e.replaceParts(a)}))));yield Promise.all(e),C()}if(d.resolve(),S){const e=h<=o.Iw;M.forEach((t=>{const{deferred:a,writer:s}=t;if(a.isFulfilled||a.isRejected||!s)return;const n=s.finalize(e);a.resolve(n)}))}}catch(e){u(null,e)}}));for(let e=0,t=Math.min(1/0,p.length);e{if(M.reduce(((e,t)=>e+ +!!t.error),0)===M.length)throw M[0].error};return h}downloadMedia(e){let{media:t,thumb:a}=e;const s="photo"===t._;if(s&&!a)return Promise.reject("preloadPhoto photoEmpty!");const n="document"===t._;n?t=this.appDocsManager.getDoc(t.id):s&&(t=this.appPhotosManager.getPhoto(t.id));const{fileName:i,downloadOptions:r}=(0,Fa.Z)(e);let o=this.getDownload(i);return o||(o=this.download(r),n&&!a&&(this.rootScope.dispatchEvent("document_downloading",t.id),o.catch(Wt.Z).finally((()=>{this.rootScope.dispatchEvent("document_downloaded",t.id)})))),o}downloadMediaURL(e){const{media:t,thumb:a}=e;let s=this.thumbsStorage.getCacheContext(t,null==a?void 0:a.type);return(!a||s.downloaded>=("size"in a?a.size:0))&&s.url?Promise.resolve(s.url):this.downloadMedia(e).then((e=>{if(!s.downloaded||s.downloaded=10485760,n=this.getLimitPart(a,!0),i=this.getDelta(n),r=Math.ceil(a/n),o=(0,Ee.a)(),p={_:s?"inputFileBig":"inputFile",id:o,parts:r,name:t,md5_checksum:""},d=(0,v.Z)();if(r>this.maxUploadParts)return d.reject((0,X.Z)("FILE_TOO_BIG")),d;let f=!1,c=!1,l=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),d.reject(e),f=!0,l=Wt.Z};const m=s?"upload.saveBigFilePart":"upload.saveFilePart",g=this.tempId++,h=this,u=function*(){let u=0,y=0;for(let v=0;vOa(this,void 0,void 0,(function*(){_();const i=e.slice(v,v+n),g=yield Ta(i);return _(),h.debug&&h.log("Upload file part, isBig:",s,b,g.byteLength,new Uint8Array(g).length,new Uint8Array(g).slice().length),h.apiManager.invokeApi(m,{file_id:o,file_part:b,file_total_parts:r,bytes:g},{fileUpload:!0}).then((()=>{if(f)return;++y;const e={done:y*n,offset:v,total:a,fileName:t};d.notify(e),y>=r&&(d.resolve(p),c=!0)}),l)}))),i).catch(l)}}(),y=()=>{if(f)return;const e=u.next();e.done||f||e.value.then(y)};for(let e=0,t=Math.min(1/0,r);e{if(f)throw(0,X.Z)("UPLOAD_CANCELED")};return d.cancel=()=>{f||c||(f=!0,l((0,X.Z)("UPLOAD_CANCELED")))},d.notify=e=>{this.rootScope.dispatchEvent("download_progress",e)},d.finally((()=>{this.uploadPromises[t]===d&&delete this.uploadPromises[t]})),this.uploadPromises[t]=d}}var ja=a(7487),Ga=a(6666),Ha=a(3306);class Wa extends G{constructor(){super(),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.afterMessageIdTemp=0}setUser(e){return this.setUserAuth(e.id)}invokeApiAfter(e,t={},a={}){let s=a;return s.prepareTempMessageId=""+ ++this.afterMessageIdTemp,s=Object.assign({},a),a.messageId=s.prepareTempMessageId,this.invokeApi(e,t,s)}invokeApiHashable(e){var t,a;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{params:s,options:n,method:i,overwrite:r}=e,o=JSON.stringify(s);let p;return this.hashes[i]&&(p=this.hashes[i][o],p&&(r?(delete this.hashes[i][o],p=void 0):s.hash=p.hash)),this.invokeApiSingleProcess({method:i,processResult:t=>{if(t._.includes("NotModified"))return p.result;if(t.hash){const e=t.hash;this.hashes[i]||(this.hashes[i]={}),this.hashes[i][o]={hash:e,result:t}}return e.processResult?e.processResult(t):t},params:s,options:n})}invokeApiSingle(e,t={},a={}){const s=e+"-"+JSON.stringify(t),n=this.apiPromisesSingle;return n[s]?n[s]:n[s]=this.invokeApi(e,t,a).finally((()=>{delete n[s]}))}invokeApiSingleProcess(e){var t,a,s;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{method:n,processResult:i,processError:r,params:o,options:p}=e,d=this.apiPromisesSingleProcess,f=p.cacheKey||JSON.stringify(o),c=null!==(s=d[n])&&void 0!==s?s:d[n]=new Map,l=c.get(f);if(l)return l;const m=()=>{const e=c.get(f);return e===h?void 0:e},g=this.invokeApi(n,o,p).then((e=>m()||i(e)),(e=>{const t=m();if(t)return t;if(!r)throw e;return r(e)})),h=g.finally((()=>{c.get(f)===h&&(c.delete(f),c.size||delete d[n])}));return c.set(f,h),h}invokeApiCacheable(e,t={},a={}){var s;const n=null!==(s=this.apiPromisesCacheable[e])&&void 0!==s?s:this.apiPromisesCacheable[e]={},i=JSON.stringify(t),r=n[i];if(r&&(!a.override||!r.fulfilled))return r.promise;let o;a.override&&(r&&r.timeout&&(clearTimeout(r.timeout),delete r.timeout),delete a.override),a.cacheSeconds&&(o=R.Z.setTimeout((()=>{delete n[i]}),1e3*a.cacheSeconds),delete a.cacheSeconds);const p=this.invokeApi(e,t,a);return n[i]={timestamp:Date.now(),fulfilled:!1,timeout:o,promise:p,params:t},p}clearCache(e,t){const a=this.apiPromisesCacheable[e];if(a)for(const e in a){const s=a[e];try{t(s.params)&&(s.timeout&&clearTimeout(s.timeout),delete a[e])}catch(e){}}}getConfig(e){return this.config&&!e?this.config:this.invokeApiSingleProcess({method:"help.getConfig",params:{},processResult:e=>(this.config=e,this.rootScope.dispatchEvent("config",e),e),options:{overwrite:e}})}getAppConfig(e){return this.appConfig&&!e?this.appConfig:this.invokeApiSingleProcess({method:"help.getAppConfig",params:{},processResult:e=>{var t,a;return this.appConfig=e,a=null!==(t=e.ignore_restriction_reasons)&&void 0!==t?t:[],xe.clear(),a.forEach((e=>{xe.add(e)})),this.rootScope.dispatchEvent("app_config",e),e},options:{overwrite:e}})}getLimit(e,t){return(0,j.Z)(this.getAppConfig(),(a=>(null!=t||(t=this.rootScope.premium),a[{pin:["dialogs_pinned_limit_default","dialogs_pinned_limit_premium"],folderPin:["dialogs_folder_pinned_limit_default","dialogs_folder_pinned_limit_premium"],folders:["dialog_filters_limit_default","dialog_filters_limit_premium"],favedStickers:["stickers_faved_limit_default","stickers_faved_limit_premium"],reactions:["reactions_user_max_default","reactions_user_max_premium"],bio:["about_length_limit_default","about_length_limit_premium"]}[e][t?1:0]])))}}var za=a(8453),Ka=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Ja extends Wa{constructor(){super(),this.log=(0,S.kg)("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=P.Z.transport,Z.addEventListener("transport",(e=>{this.changeTransportType(e)}))}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateConfig:()=>{this.getConfig(!0),this.getAppConfig(!0)}}),this.rootScope.addEventListener("user_auth",(()=>{this.config&&this.apiUpdatesManager.processLocalUpdate({_:"updateConfig"})})),this.rootScope.addEventListener("premium_toggle",(e=>{this.iterateNetworkers((({networker:t,connectionType:a,dcId:s,transportType:n})=>{if("client"===a||"websocket"!==n)return;const i=t.transport;if(i){if(i.connection){const t=V(s,a,e);i.changeUrl(t)}}else this.log.error("wow what, no transport?",t)}))}))}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const s in a){const n=a[s];for(const a in n)n[a].forEach(((n,i,r)=>{e({networker:n,dcId:+a,connectionType:s,transportType:t,index:i,array:r})}))}}}chooseServer(e,t,a){return this.dcConfigurator.chooseServer(e,t,a,"client"===t,this.rootScope.premium)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],s=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=s,this.transportType=e;for(const a in this.gettingNetworkers){const s=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const n=a.replace(t,e);this.gettingNetworkers[n]=s,this.log("changed networker getKey from",a,"to",n)}this.iterateNetworkers((e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);this.changeNetworkerTransport(e.networker,a)}))}getBaseDcId(){return Ka(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield ja.Z.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(_.Z.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ka(this,void 0,void 0,(function*(){if("string"!=typeof e&&"number"!=typeof e||(e={dcID:0,date:Date.now()/1e3|0,id:e.toPeerId(!1)}),this.rootScope.dispatchEvent("user_auth",e),!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}ja.Z.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then((e=>{this.setOnDrainIfNeeded(e)})),this.baseDcId=e,ja.Z.set({dc:this.baseDcId})}logOut(){return Ka(this,void 0,void 0,(function*(){if(this.loggingOut)return;this.loggingOut=!0;const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map((e=>ja.Z.get(e)))),a=[];for(let e=0;eKa(this,void 0,void 0,(function*(){this.baseDcId=void 0,yield(0,za.Z)(!1,!0),Ga.C.closeDatabases(),this.rootScope.dispatchEvent("logging_out")}));return setTimeout(s,1e3),Promise.all(a).catch((e=>{e.handled=!0})).finally(s)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",n=this.getTransportType(a);this.cachedNetworkers[n]||(this.cachedNetworkers[n]={client:{},download:{},upload:{}});const i=this.cachedNetworkers[n][a];e in i||(i[e]=[]);const r=i[e],o="client"===a||"https"===n?1:this.rootScope.premium?6:3;if(r.length>=o){let e=o-1,t=!1;for(;e>=0;--e)if(r[e].isOnline){t=!0;break}const a=r.splice(t?e:o-1,1)[0];return r.unshift(a),Promise.resolve(a)}let p=this.generateNetworkerGetKey(e,n,a);if(this.gettingNetworkers[p])return this.gettingNetworkers[p];const d=`dc${e}_auth_key`,f=`dc${e}_server_salt`;let c=this.chooseServer(e,a,n);return this.gettingNetworkers[p]=Promise.all([d,f].map((e=>ja.Z.get(e)))).then((([i,o])=>Ka(this,void 0,void 0,(function*(){let l,m;if(i&&512===i.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=(0,Ha.Z)(i),n=(yield s.Z.invokeCrypto("sha1",a)).slice(-8),r=(0,Ha.Z)(o);l=this.networkerFactory.getNetworker(e,a,n,r,t)}else try{const a=yield this.authorizer.auth(e);ja.Z.set({[d]:E(a.authKey),[f]:E(a.serverSalt)}),l=this.networkerFactory.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){m=e}const g=this.getTransportType(a);if(g!==n&&(p=this.generateNetworkerGetKey(e,g,a),c.destroy(),L.removeTransport(this.dcConfigurator.chosenServers,c),l&&(c=this.chooseServer(e,a,g)),this.log("transport has been changed during authorization from",n,"to",g)),delete this.gettingNetworkers[p],m)throw this.log("get networker error",m,m.stack),m;return this.changeNetworkerTransport(l,c),r.unshift(l),this.setOnDrainIfNeeded(l),l}))))}getNetworkerVoid(e){return this.getNetworker(e).then(Wt.Z,Wt.Z)}changeNetworkerTransport(e,t){const a=e.transport;a&&L.removeTransport(this.dcConfigurator.chosenServers,a),e.changeTransport(t)}onNetworkerDrain(e){this.log("networker drain",e.dcId),e.onDrain=void 0,this.changeNetworkerTransport(e),e.destroy(),this.networkerFactory.removeNetworker(e),L.removeTransport(this.cachedNetworkers,e)}setOnDrainIfNeeded(e){e.onDrain||(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then((t=>e.dcId!==t))).then((t=>{e.onDrain||t&&(e.onDrain=()=>this.onNetworkerDrain(e),e.setDrainTimeout())}))}setUpdatesProcessor(e){this.updatesProcessor=e,this.networkerFactory.setUpdatesProcessor(e)}invokeApi(e,t={},a={}){const s=(0,v.Z)();let n,i,{afterMessageId:r,prepareTempMessageId:o}=a;if(o&&s.then((()=>{delete this.afterMessageTempIds[o]})),d.GO){const n=Date.now(),r=R.Z.setInterval((()=>{i&&i.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-n)/1e3)}),5e3);s.catch(Wt.Z).finally((()=>{clearInterval(r)}))}const p=(new Error).stack||"empty stack",f=()=>{if(r){const e=this.afterMessageTempIds[r];e&&(a.afterMessageId=e.messageId)}const p=i.wrapApiCall(e,t,a);return o&&(this.afterMessageTempIds[o]={messageId:a.messageId,promise:s}),p.catch((s=>{var i;if("FILE_REFERENCE_EXPIRED"!==s.type&&this.log.error("Error",s.code,s.type,this.baseDcId,n,e,t),401===s.code&&this.baseDcId===n)throw"SESSION_PASSWORD_NEEDED"!==s.type&&(ja.Z.delete("dc"),ja.Z.delete("user_auth")),s;if(401===s.code&&this.baseDcId&&n!==this.baseDcId){if(void 0===this.cachedExportPromise[n]){const e=new Promise(((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:n},{noErrorBox:!0}).then((a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:n,noErrorBox:!0}).then(e,t)}),t)}));this.cachedExportPromise[n]=e}return this.cachedExportPromise[n].then((()=>f()))}if(303!==s.code){if(400===s.code&&0===s.type.indexOf("FILE_MIGRATE")){const i=+s.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId=i,this.invokeApi(e,t,a);throw s}if(400===s.code&&"CONNECTION_NOT_INITED"===s.type)return this.networkerFactory.unsetConnectionInited(),f();if(a.rawError||420!==s.code){if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(s.type)){const e=this.afterMessageTempIds[r];return r=void 0,delete a.afterMessageId,e?e.promise.then((()=>f())):f()}if(a.rawError||500!==s.code){if("UNKNOWN"===s.type||"MTPROTO_CLUSTER_INVALID"===s.type)return(0,b.Z)(1e3).then((()=>f()));throw s}{const e=Date.now();if(a.stopTime&&e>=a.stopTime)throw s;return a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,(0,b.Z)(1e3*a.waitTime).then((()=>f()))}}{const e=+s.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(null!==(i=a.floodMaxTimeout)&&void 0!==i?i:60)&&!a.prepareTempMessageId)throw s;return(0,b.Z)(1e3*e).then((()=>f()))}}{const i=+s.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId?a.dcId=i:this.setBaseDcId(i),this.invokeApi(e,t,a)}}))};let c;return c=(n=a.dcId||this.baseDcId)?this.getNetworker(n,a):this.getBaseDcId().then((e=>this.getNetworker(n=e,a))),c.then((e=>{i=e;const t=f();return i.attachPromise(s,a),t})).then(s.resolve).catch((t=>Ka(this,void 0,void 0,(function*(){if(t?(0,fe.Z)(t)||(t={message:t}):t={type:"ERROR_EMPTY"},(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors)throw t;throw 406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=p||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout((()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)}),100)),t})))).catch(s.reject),s}}class Qa{constructor(){this.neededPeers=new Map,this.singlePeerMap=new Map,this._constructor(!1)}after(){this.rootScope.addEventListener("user_auth",(()=>{this.requestPeer(this.appPeersManager.peerId,"self")}))}requestPeer(e,t){let a=this.neededPeers.get(e);a&&a.has(t)||(a||(a=new Set,this.neededPeers.set(e,a)),a.add(t),this.dispatchEvent("peerNeeded",e))}releasePeer(e,t){const a=this.neededPeers.get(e);a&&(a.delete(t),a.size||(this.neededPeers.delete(e),this.dispatchEvent("peerUnneeded",e)))}requestPeersForKey(e,t){Array.isArray(e)&&(e=new Set(e));let a=this.singlePeerMap.get(t);if(a){for(const s of a)e.has(s)||(this.releasePeer(s,t),a.delete(s));if(!a.size&&!e.size)return void this.singlePeerMap.delete(t)}if(e.size){a||(a=new Set,this.singlePeerMap.set(t,a));for(const s of e)a.has(s)||(this.requestPeer(s,t),a.add(s))}}isPeerNeeded(e){return this.neededPeers.has(e)}}Ae(Qa,[p.Z,G]);const $a=Qa,Ya=o.Pt;class Xa{constructor(){this.thumbsCache={}}getKey(e){var t;return e._+(null!==(t=e.id)&&void 0!==t?t:e.url)}getCacheContext(e,t=Ya){var a,s,n,i;const r=null!==(a=(n=this.thumbsCache)[i=this.getKey(e)])&&void 0!==a?a:n[i]={};return null!==(s=r[t])&&void 0!==s?s:r[t]={downloaded:0,url:"",type:t}}setCacheContextURL(e,t=Ya,a,s=0){const n=this.getCacheContext(e,t);return n.url=a,n.downloaded=s,n}deleteCacheContext(e,t=Ya){const a=this.thumbsCache[this.getKey(e)];a&&delete a[t]}}const es={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:-908914376,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?ChatReactions"}],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:-994968513,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:"voice_messages_forbidden",type:"flags.20?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"},{name:"premium_gifts",type:"flags.19?Vector"}],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:"this_port_only",type:"flags.5?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:589653676,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:"force_try_ipv6",type:"flags.14?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"},{name:"reactions_default",type:"flags.15?Reaction"}],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:-1476358952,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{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:"nopremium",type:"flags.3?true"},{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:-1881881384,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:"long"},{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:-1787080453,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"},{name:"login_email_pattern",type:"flags.6?string"}],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:768691932,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:"emojis",type:"flags.7?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:"thumb_document_id",type:"flags.8?long"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:1846886166,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:1570352622,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:"premium",type:"flags.28?true"},{name:"attach_menu_enabled",type:"flags.29?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"},{name:"emoji_status",type:"flags.30?EmojiStatus"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:-1892676777,predicate:"botInfo",params:[{name:"flags",type:"#"},{name:"user_id",type:"flags.0?long"},{name:"description",type:"flags.1?string"},{name:"description_photo",type:"flags.4?Photo"},{name:"description_document",type:"flags.5?Document"},{name:"commands",type:"flags.2?Vector"},{name:"menu_button",type:"flags.3?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:-231385849,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?ChatReactions"}],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:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Update"},{id:834816008,predicate:"updateStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"}],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:-1103615738,predicate:"messages.featuredStickers",params:[{name:"flags",type:"#"},{name:"premium",type:"flags.0?true"},{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:1048946971,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:"recurring",type:"flags.9?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"},{name:"recurring_terms_url",type:"flags.9?string"}],type:"Invoice"},{id:-1900697899,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"},{name:"extended_media",type:"flags.2?InputMedia"}],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:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{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:-156940077,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"},{name:"extended_media",type:"flags.4?MessageExtendedMedia"}],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:-1776926890,predicate:"messageActionPaymentSent",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"invoice_slug",type:"flags.0?string"}],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:-1610250415,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:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.5?WebDocument"},{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:"additional_methods",type:"flags.6?Vector"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?Vector"},{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:-1665063993,predicate:"phoneConnection",params:[{name:"flags",type:"#"},{name:"tcp",type:"flags.0?true"},{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"},{name:"forums",type:"flags.17?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:-207944868,predicate:"fileHash",params:[{name:"offset",type:"long"},{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:2097791614,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{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:-1896171181,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:"long"},{name:"file_size_max",type:"long"},{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:"recommended",type:"flags.5?true"},{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:-191450938,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:-1546531968,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen_order",type:"flags.0?int"},{name:"reaction",type:"Reaction"},{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:"premium",type:"flags.2?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:-1102180616,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"ChatReactions"},{name:"new_value",type:"ChatReactions"}],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:-1319698788,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:"Reaction"}],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:-928371502,predicate:"attachMenuBot",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"has_settings",type:"flags.1?true"},{name:"bot_id",type:"long"},{name:"short_name",type:"string"},{name:"peer_types",type:"Vector"},{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"},{id:2104224014,predicate:"attachMenuPeerTypeSameBotPM",params:[],type:"AttachMenuPeerType"},{id:-1020528102,predicate:"attachMenuPeerTypeBotPM",params:[],type:"AttachMenuPeerType"},{id:-247016673,predicate:"attachMenuPeerTypePM",params:[],type:"AttachMenuPeerType"},{id:84480319,predicate:"attachMenuPeerTypeChat",params:[],type:"AttachMenuPeerType"},{id:2080104188,predicate:"attachMenuPeerTypeBroadcast",params:[],type:"AttachMenuPeerType"},{id:-317687113,predicate:"chatInvitePublicJoinRequests",params:[],type:"ExportedChatInvite"},{id:-977967015,predicate:"inputInvoiceMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"InputInvoice"},{id:-1020867857,predicate:"inputInvoiceSlug",params:[{name:"slug",type:"string"}],type:"InputInvoice"},{id:-1362048039,predicate:"payments.exportedInvoice",params:[{name:"url",type:"string"}],type:"payments.ExportedInvoice"},{id:8703322,predicate:"updateTranscribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"Update"},{id:-1821037486,predicate:"messages.transcribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"messages.TranscribedAudio"},{id:909284270,predicate:"dialogFilterDefault",params:[],type:"DialogFilter"},{id:1395946908,predicate:"help.premiumPromo",params:[{name:"status_text",type:"string"},{name:"status_entities",type:"Vector"},{name:"video_sections",type:"Vector"},{name:"videos",type:"Vector"},{name:"period_options",type:"Vector"},{name:"users",type:"Vector"}],type:"help.PremiumPromo"},{id:-925956616,predicate:"messageEntityCustomEmoji",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"document_id",type:"long"}],type:"MessageEntity"},{id:-48981863,predicate:"documentAttributeCustomEmoji",params:[{name:"flags",type:"#"},{name:"free",type:"flags.0?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"}],type:"DocumentAttribute"},{id:1087454222,predicate:"stickerSetFullCovered",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"StickerSetCovered"},{id:-1502273946,predicate:"inputStorePaymentPremiumSubscription",params:[{name:"flags",type:"#"},{name:"restore",type:"flags.0?true"}],type:"InputStorePaymentPurpose"},{id:1634697192,predicate:"inputStorePaymentGiftPremium",params:[{name:"user_id",type:"InputUser"},{name:"currency",type:"string"},{name:"amount",type:"long"}],type:"InputStorePaymentPurpose"},{id:-1415514682,predicate:"messageActionGiftPremium",params:[{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"months",type:"int"}],type:"MessageAction"},{id:1958953753,predicate:"premiumGiftOption",params:[{name:"flags",type:"#"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumGiftOption"},{id:-930399486,predicate:"inputStickerSetPremiumGifts",params:[],type:"InputStickerSet"},{id:-78886548,predicate:"updateReadFeaturedEmojiStickers",params:[],type:"Update"},{id:-1360618136,predicate:"inputPrivacyKeyVoiceMessages",params:[],type:"InputPrivacyKey"},{id:110621716,predicate:"privacyKeyVoiceMessages",params:[],type:"PrivacyKey"},{id:-1996951013,predicate:"paymentFormMethod",params:[{name:"url",type:"string"},{name:"title",type:"string"}],type:"PaymentFormMethod"},{id:-193992412,predicate:"inputWebFileAudioAlbumThumbLocation",params:[{name:"flags",type:"#"},{name:"small",type:"flags.2?true"},{name:"document",type:"flags.0?InputDocument"},{name:"title",type:"flags.1?string"},{name:"performer",type:"flags.1?string"}],type:"InputWebFileLocation"},{id:769727150,predicate:"emojiStatusEmpty",params:[],type:"EmojiStatus"},{id:-1835310691,predicate:"emojiStatus",params:[{name:"document_id",type:"long"}],type:"EmojiStatus"},{id:-97474361,predicate:"emojiStatusUntil",params:[{name:"document_id",type:"long"},{name:"until",type:"int"}],type:"EmojiStatus"},{id:674706841,predicate:"updateUserEmojiStatus",params:[{name:"user_id",type:"long"},{name:"emoji_status",type:"EmojiStatus"}],type:"Update"},{id:821314523,predicate:"updateRecentEmojiStatuses",params:[],type:"Update"},{id:-796072379,predicate:"account.emojiStatusesNotModified",params:[],type:"account.EmojiStatuses"},{id:-1866176559,predicate:"account.emojiStatuses",params:[{name:"hash",type:"long"},{name:"statuses",type:"Vector"}],type:"account.EmojiStatuses"},{id:2046153753,predicate:"reactionEmpty",params:[],type:"Reaction"},{id:455247544,predicate:"reactionEmoji",params:[{name:"emoticon",type:"string"}],type:"Reaction"},{id:-1992950669,predicate:"reactionCustomEmoji",params:[{name:"document_id",type:"long"}],type:"Reaction"},{id:-352570692,predicate:"chatReactionsNone",params:[],type:"ChatReactions"},{id:1385335754,predicate:"chatReactionsAll",params:[{name:"flags",type:"#"},{name:"allow_custom",type:"flags.0?true"}],type:"ChatReactions"},{id:1713193015,predicate:"chatReactionsSome",params:[{name:"reactions",type:"Vector"}],type:"ChatReactions"},{id:-1334846497,predicate:"messages.reactionsNotModified",params:[],type:"messages.Reactions"},{id:-352454890,predicate:"messages.reactions",params:[{name:"hash",type:"long"},{name:"reactions",type:"Vector"}],type:"messages.Reactions"},{id:1870160884,predicate:"updateRecentReactions",params:[],type:"Update"},{id:-2030252155,predicate:"updateMoveStickerSetToTop",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"stickerset",type:"long"}],type:"Update"},{id:1511364673,predicate:"auth.sentCodeTypeEmailCode",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"},{name:"email_pattern",type:"string"},{name:"length",type:"int"},{name:"next_phone_login_date",type:"flags.2?int"}],type:"auth.SentCodeType"},{id:-1521934870,predicate:"auth.sentCodeTypeSetUpEmailRequired",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"}],type:"auth.SentCodeType"},{id:1128644211,predicate:"emailVerifyPurposeLoginSetup",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"EmailVerifyPurpose"},{id:1383932651,predicate:"emailVerifyPurposeLoginChange",params:[],type:"EmailVerifyPurpose"},{id:-1141565819,predicate:"emailVerifyPurposePassport",params:[],type:"EmailVerifyPurpose"},{id:-1842457175,predicate:"emailVerificationCode",params:[{name:"code",type:"string"}],type:"EmailVerification"},{id:-611279166,predicate:"emailVerificationGoogle",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:-1764723459,predicate:"emailVerificationApple",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:731303195,predicate:"account.emailVerified",params:[{name:"email",type:"string"}],type:"account.EmailVerified"},{id:-507835039,predicate:"account.emailVerifiedLogin",params:[{name:"email",type:"string"},{name:"sent_code",type:"auth.SentCode"}],type:"account.EmailVerified"},{id:-1225711938,predicate:"premiumSubscriptionOption",params:[{name:"flags",type:"#"},{name:"current",type:"flags.1?true"},{name:"can_purchase_upgrade",type:"flags.2?true"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumSubscriptionOption"},{id:80008398,predicate:"inputStickerSetEmojiGenericAnimations",params:[],type:"InputStickerSet"},{id:701560302,predicate:"inputStickerSetEmojiDefaultStatuses",params:[],type:"InputStickerSet"},{id:-1206095820,predicate:"sendAsPeer",params:[{name:"flags",type:"#"},{name:"premium_required",type:"flags.0?true"},{name:"peer",type:"Peer"}],type:"SendAsPeer"},{id:-1386050360,predicate:"messageExtendedMediaPreview",params:[{name:"flags",type:"#"},{name:"w",type:"flags.0?int"},{name:"h",type:"flags.0?int"},{name:"thumb",type:"flags.1?PhotoSize"},{name:"video_duration",type:"flags.2?int"}],type:"MessageExtendedMedia"},{id:-297296796,predicate:"messageExtendedMedia",params:[{name:"media",type:"MessageMedia"}],type:"MessageExtendedMedia"},{id:1517529484,predicate:"updateMessageExtendedMedia",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"extended_media",type:"MessageExtendedMedia"}],type:"Update"},{id:-50416996,predicate:"stickerKeyword",params:[{name:"document_id",type:"long"},{name:"keyword",type:"Vector"}],type:"StickerKeyword"}],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:-1923962543,method:"auth.signIn",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"flags.0?string"},{name:"email_verification",type:"flags.1?EmailVerification"}],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:"update_stickersets_order",type:"flags.15?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:"update_stickersets_order",type:"flags.15?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:-1101843010,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:"long"},{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:-1564422284,method:"account.deleteAccount",params:[{name:"flags",type:"#"},{name:"reason",type:"string"},{name:"password",type:"flags.0?InputCheckPasswordSRP"}],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:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:-1309538785,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"long"},{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:"emojis",type:"flags.1?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:924093883,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"invoice",type:"InputInvoice"},{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:-1228345045,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"invoice",type:"InputInvoice"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:755192367,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"invoice",type:"InputInvoice"},{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:962554330,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"},{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:-1847836879,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"}],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:"update_stickersets_order",type:"flags.15?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:-1856595926,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"long"}],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:-1730136133,method:"account.sendVerifyEmailCode",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:53322959,method:"account.verifyEmail",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"verification",type:"EmailVerification"}],type:"account.EmailVerified"},{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:-1896617296,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?long"}],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:-754091820,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"add_to_recent",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?Vector"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1176190792,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?Reaction"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:-21928079,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"ChatReactions"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:1330094102,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"Reaction"}],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:-58219204,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:"platform",type:"string"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"WebViewResult"},{id:-362824498,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"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Bool"},{id:698084494,method:"messages.requestSimpleWebView",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"url",type:"string"},{name:"theme_params",type:"flags.0?DataJSON"},{name:"platform",type:"string"}],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"},{id:1092913030,method:"phone.saveCallLog",params:[{name:"peer",type:"InputPhoneCall"},{name:"file",type:"InputFile"}],type:"Bool"},{id:-456419968,method:"channels.toggleJoinToSend",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1277789622,method:"channels.toggleJoinRequest",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:261206117,method:"payments.exportInvoice",params:[{name:"invoice_media",type:"InputMedia"}],type:"payments.ExportedInvoice"},{id:647928393,method:"messages.transcribeAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.TranscribedAudio"},{id:2132608815,method:"messages.rateTranscribedAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"good",type:"Bool"}],type:"Bool"},{id:-2131921795,method:"payments.assignAppStoreTransaction",params:[{name:"receipt",type:"bytes"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-537046829,method:"payments.assignPlayMarketTransaction",params:[{name:"receipt",type:"DataJSON"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-1614700874,method:"payments.canPurchasePremium",params:[{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Bool"},{id:-1206152236,method:"help.getPremiumPromo",params:[],type:"help.PremiumPromo"},{id:-643100844,method:"messages.getCustomEmojiDocuments",params:[{name:"document_id",type:"Vector"}],type:"Vector"},{id:-67329649,method:"messages.getEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:248473398,method:"messages.getFeaturedEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-70001045,method:"account.updateEmojiStatus",params:[{name:"emoji_status",type:"EmojiStatus"}],type:"Bool"},{id:-696962170,method:"account.getDefaultEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:257392901,method:"account.getRecentEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:404757166,method:"account.clearRecentEmojiStatuses",params:[],type:"Bool"},{id:1063567478,method:"messages.reportReaction",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction_peer",type:"InputPeer"}],type:"Bool"},{id:-1149164102,method:"messages.getTopReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:960896434,method:"messages.getRecentReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:-1644236876,method:"messages.clearRecentReactions",params:[],type:"Bool"},{id:-2064119788,method:"messages.getExtendedMedia",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:767062953,method:"auth.importWebTokenAuthorization",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"web_auth_token",type:"string"}],type:"auth.Authorization"}]},layer:147};var ts=a(745),as=a.n(ts),ss=a(4736),ns=a.n(ss);function is(e){return e>>>0}function rs(e,t){return e=is(e),t=is(t),ns()(e).shiftLeft(32).add(ns()(t))}const os=ns()(Number.MAX_SAFE_INTEGER),ps=ns()(ns()[2]).pow(64),ds=ps.divide(ns()[2]);function fs(e,t=256){return ns().fromArray(e instanceof Uint8Array?[...e]:e,t)}const cs=+es.API.constructors.find((e=>"boolFalse"===e.predicate)).id,ls=+es.API.constructors.find((e=>"boolTrue"===e.predicate)).id,ms=+es.API.constructors.find((e=>"vector"===e.predicate)).id,gs=+es.MTProto.constructors.find((e=>"gzip_packed"===e.predicate)).id;class hs{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(ls,(t||"")+":bool"):this.writeInt(cs,(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);const a=(s=ns()(e)).isNegative()?ps.add(s):s;var s;const{quotient:n,remainder:i}=a.divmod(4294967296),r=n.toJSNumber(),o=i.toJSNumber();this.writeInt(o,(t||"")+":long[low]"),this.writeInt(r,(t||"")+":long[high]")}storeDouble(e,t){const a=new ArrayBuffer(8),s=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(s[0],(t||"")+":double[low]"),this.writeInt(s[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const s=a.length;s<=253?this.byteView[this.offset++]=s:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&s,this.byteView[this.offset++]=(65280&s)>>8,this.byteView[this.offset++]=(16711680&s)>>16);for(let e=0;e>>",E(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const s=e.length;if(t%32||8*s!==t){const n=new Error("Invalid bits: "+t+", "+s);throw console.error(n,e,a),n}this.debug&&console.log(">>>",E(e),(a||"")+":int"+t),this.checkLength(s),this.byteView.set(e,this.offset),this.offset+=s}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",E(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?es.MTProto:es.API).methods.find((t=>t.method===e));if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const s=t.pFlags||t,n={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),n=e[0].split(".");if(!(t[n[0]]&1<<+n[1])){if(!("true"===e[1]?s[i.name]:void 0!==t[i.name]))continue;t[n[0]]|=1<<+n[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,n[i.name]=r)}for(const e in n)this.intView[n[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(ms,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const s=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===n));if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+n+" found");n===t&&(i=!0),i||this.writeInt(r.id,a+"["+n+"][id]");const o=e.pFlags,p={};for(const t of r.params){let s=t.type;if(-1!==s.indexOf("?")){const a=s.split("?"),n=a[0].split(".");if(!(e[n[0]]&1<<+n[1])){if(!("true"===a[1]?o&&o[t.name]:void 0!==e[t.name]))continue;e[n[0]]|=1<<+n[1]}s=a[1]}const i=this.storeObject(e[t.name],s,a+"["+n+"]["+t.name+"]");"#"===s&&(e[t.name]=e[t.name]||0,p[t.name]=i)}for(const t in p)this.intView[p[t]]=e[t];return r.type}}class us{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),E(this.byteView.slice(this.offset-16,this.offset+16))),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),s=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),s[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]");let a=rs(this.readInt((e||"")+":long[high]"),t);var s;return this.mtproto||(a=(s=a).greater(ds)?s.minus(ps):s),!this.mtproto&&os.greaterOrEquals(a.abs())?a.toJSNumber():a.toString(10)}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===ls||t!==cs&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,s="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView.slice(this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const n=e.substr(7,e.length-8);for(let e=0;ee.type===t)),!s)throw new Error("Constructor not found for type: "+e)}else{const r=this.readInt(t+"[id]");if(r===gs){const a=(i=this.fetchBytes(t+"[packed_string]"),as().inflate(i,void 0));return new us(a).fetchObject(e,t)}if(r===ms)return this.fetchVector(e,t);let o=a.constructorsIndex;if(!o){a.constructorsIndex=o={};for(let e=0,t=a.constructors.length;e0&&r{var e;if(this.pingDelayDisconnectDeferred||!this.transport||!this.transport.connected)return;const t=this.pingDelayDisconnectDeferred=(0,v.Z)(),a=this.delays,s=this.delays.pingMaxTime,n=Math.min(null!==(e=this.lastPingTime)&&void 0!==e?e:0,s),i=Math.round(a.disconnectDelayMin+n/s*(a.disconnectDelayMax-a.disconnectDelayMin)),r=1e3*i,o=this.lastPingStartTime=Date.now(),p=this.lastPingDelayDisconnectId=(0,Ee.a)(),d={notContentRelated:!0};this.wrapMtpCall("ping_delay_disconnect",{ping_id:p,disconnect_delay:i},d);const f=this.log.bindPrefix("sendPingDelayDisconnect");this.debug&&f.debug(`ping, timeout=${r}, lastPingTime=${this.lastPingTime}, msgId=${d.messageId}, pingId=${p}`);const c=R.Z.setTimeout(t.reject,r);t.then((e=>{clearTimeout(c);const t=Date.now()-o;if(this.lastPingTime=t/1e3,this.debug&&f.debug(`pong, reason='${e}', time=${n}, msgId=${d.messageId}`),t>r)throw void 0;return(0,b.Z)(Math.max(0,this.delays.pingInterval-t))})).catch((()=>{clearTimeout(c);const e=this.transport;this.pingDelayDisconnectDeferred===t&&(null==e?void 0:e.connection)&&(f.error("catch, closing connection",this.lastPingTime,d.messageId),e.connection.close())})).finally((()=>{this.pingDelayDisconnectDeferred===t&&(this.pingDelayDisconnectDeferred=void 0,this.sendPingDelayDisconnect())}))},this.checkLongPoll=()=>{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()}))},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new hs({mtproto:!0}),a=(0,Ee.a)();t.storeMethod("ping",{ping_id:a});const s={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(U.Q.Connecting),this.sendEncryptedRequest(s).then((()=>{this.toggleOffline(!1)}),(()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=R.Z.setTimeout((()=>this.checkConnection("from failed checkConnection request")),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)}))},this.authKeyUint8=(0,bs.Z)(this.authKey),this.serverSalt=(0,bs.Z)(i),this.isFileUpload=!!r.fileUpload,this.isFileDownload=!!r.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload,this.delays=this.isFileNetworker?Ms.file:Ms.client;const o=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+a+o,this.log=(0,S.kg)(this.name+(o?"":"-C")+"-"+Cs++,S.v9.Log|S.v9.Error|S.v9.Warn),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=w(new Uint8Array(8))}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&(0,ne.Z)(t.inner,((e,a)=>{const s=this.updateSentMessage(e);s?t.inner[a]=s.msg_id:t.inner.splice(a,1)})),t.msg_id=this.timeManager.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const s=new hs({mtproto:!0});s.storeMethod(e,t);const n=this.timeManager.generateId(),i=this.generateSeqNo(),r={msg_id:n,seq_no:i,body:s.getBytes(!0)};return P.Z.debug&&this.log("MT call",e,t,n,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new hs({mtproto:!0});a.storeObject(e,"Object");const s=this.timeManager.generateId(),n=this.generateSeqNo(t.notContentRelated),i={msg_id:s,seq_no:n,body:a.getBytes(!0)};return P.Z.debug&&this.log("MT message",e,s,n),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const s=new hs(a);if(!this.connectionInited){const e=es.API.methods.find((e=>"invokeWithLayer"===e.method));if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(es.layer,"layer");const t=es.API.methods.find((e=>"initConnection"===e.method));if(!t)throw new Error("no initConnection!");s.storeInt(+t.id,"initConnection"),s.storeInt(0,"flags"),s.storeInt(_.Z.id,"api_id"),s.storeString(i().USER_AGENT||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(_.Z.version+(_.Z.isMainDomain?" "+_.Z.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(_.Z.langPack,"lang_pack"),s.storeString(this.networkerFactory.language,"lang_code")}if(a.afterMessageId){if(void 0===Is){const e=es.API.methods.find((e=>"invokeAfterMsg"===e.method));Is=e?+e.id:0}Is?(s.storeInt(Is,"invokeAfterMsg"),s.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=s.storeMethod(e,t);const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:s.getBytes(!0),isAPI:!0};return P.Z.debug?this.log("Api call",e,n,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(n,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),this.connectionInited=!1,void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.log("change transport",e,t),this.clearPingDelayDisconnect(),this.transport=e,e&&(e.networker=this,e instanceof I&&(this.longPollInterval=R.Z.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connection&&e.connected&&this.setConnectionStatus(U.Q.Connected),this.resend())}destroy(){this.log("destroy")}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}clearPingDelayDisconnect(){const e=this.pingDelayDisconnectDeferred;this.pingDelayDisconnectDeferred=void 0,this.lastPingDelayDisconnectId=void 0,e&&e.reject()}sendLongPoll(){this.sendingLongPoll||(this.sendingLongPoll=!0,this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then((()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)}),(e=>{this.log("Long-poll failed",e)})).finally((()=>{this.sendingLongPoll=void 0})))}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(U.Q.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=R.Z.setTimeout((()=>this.checkConnection("from toggleOfline")),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(U.Q.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?U.Q.Closed:U.Q.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then((e=>(this.toggleOffline(!1),this.parseResponse(e).then((e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))))),(e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1))).then((e=>{const t=this.sentMessages;a.forEach((a=>{const s=t[a];if(s){const n=s.deferred;delete t[a],delete this.pendingMessages[a],e?n.resolve():n.reject()}}))}))}pushMessage(e,t){let a;return t.notContentRelated&&!t.noResponse||(a=(0,v.Z)()),this.sentMessages[e.msg_id]=Object.assign(e,t,a?{deferred:a}:void 0),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),(0,fe.Z)(t)&&(t.messageId=e.msg_id),a}attachPromise(e,t){const a=setTimeout((()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime{clearTimeout(a),this.setConnectionStatus(U.Q.Connected),--this.activeRequests,this.setDrainTimeout()})),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=R.Z.setTimeout((()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()}),1e4))}setConnectionStatus(e,t){var a;const s=e===U.Q.Connected,n=this.status!==e;this.isOnline=s,this.status=e,n&&(this.networkerFactory.onConnectionStatusChange&&this.networkerFactory.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest(),(null===(a=this.transport)||void 0===a?void 0:a.connection)&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect()))}pushResend(e,t=100){const a=t?Date.now()+t:0,s=this.sentMessages[e];if(s.container)for(const e of s.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;s.acked&&this.log.error("pushResend: acked message?",s),this.debug&&this.log.debug("pushResend:",e,s,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return Ps(this,void 0,void 0,(function*(){const a=t?0:8,n=(0,ys.Z)(this.authKeyUint8.subarray(88+a,88+a+32),e),i=yield s.Z.invokeCrypto("sha256",n);return new Uint8Array(i).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),i=new Uint8Array(52),r=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),r.push(s.Z.invokeCrypto("sha256",n)),i.set(this.authKeyUint8.subarray(40+a,40+a+36),0),i.set(e,36),r.push(s.Z.invokeCrypto("sha256",i)),Promise.all(r).then((e=>{const t=new Uint8Array(32),a=new Uint8Array(32),s=new Uint8Array(e[0]),n=new Uint8Array(e[1]);return t.set(s.subarray(0,8)),t.set(n.subarray(8,24),8),t.set(s.subarray(24,32),24),a.set(n.subarray(0,8)),a.set(s.subarray(8,24),8),a.set(n.subarray(24,32),24),[t,a]}))}isStopped(){return this.networkerFactory.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}const e=this.pendingResendReq.length;if(e){const t=Object.assign({},Ss),a=this.pendingResendReq.splice(0,e);this.wrapMtpMessage({_:"msg_resend_req",msg_ids:a},t),this.log("resend: resending requests",t.messageId,a)}let t;const a=[];let s=0,n=!1,i=!1,r=!1;const o=Object.keys(this.pendingMessages).map((e=>ns()(e))).sort(((e,t)=>e.compare(t))).map((e=>e.toString(10)));for(const e of o){const o=this.sentMessages[e];if(o&&o.body){const e=o.body.length+32;if(s+e>655360&&(this.log.warn("lengthOverflow",o,a),r=!0,t))break;a.push(o),s+=e,o.isAPI?n=!0:o.longPoll&&(i=!0),t=o}delete this.pendingMessages[e]}if(this.transport instanceof I&&n&&!i){const e=new hs({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),a.push({msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!a.length)return;const p=a.filter((e=>e.noResponse)).map((e=>e.msg_id));if(a.length>1){const e=this.generateContainerMessage(s,a);t=e.messageWithBody,this.sentMessages[t.msg_id]=e.message}else this.sentMessages[t.msg_id]=t;this.pendingAcks=[];const d=this.sendEncryptedRequest(t);this.transport instanceof I&&this.handleSentEncryptedRequestHTTP(d,t,p),this.transport instanceof I||this.cleanupSent(),r&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new hs({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const s=[];t.forEach(((e,t)=>{s.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")}));const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:s};return P.Z.debug&&this.log.warn("Container",s,n.msg_id,n.seq_no),{message:n,messageWithBody:Object.assign({body:a.getBytes(!0)},n)}}getEncryptedMessage(e){return Ps(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield s.Z.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then((e=>s.Z.invokeCrypto("aes-decrypt",t,e[0],e[1])))}getEncryptedOutput(e){const t=new hs({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),s=16-t.getOffset()%16+16*(1+(0,Ee.d)(8)%5),n=w(new Uint8Array(s)),i=(0,ys.Z)(a,n);return this.getEncryptedMessage(i).then((e=>{const t=new hs({startMaxLength:e.bytes.length+256});return t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data"),t.getBytes(!0)}))}sendEncryptedRequest(e){return Ps(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 I))return a;const s={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then((e=>{if(!(null==e?void 0:e.byteLength))throw s;return e}),(e=>{throw e.message||e.type||(e=Object.assign(s,{type:"NETWORK_BAD_REQUEST",originalError:e})),e}))}))}parseResponse(e){this.lastResponseTime=Date.now();const t=new us(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!(0,vs.Z)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+E(a));const s=t.fetchIntBytes(128,!0,"msg_key"),n=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,n).then((e=>this.getMsgKey(e,!1).then((t=>{if(!(0,vs.Z)(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new us(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!((0,vs.Z)(n,this.sessionId)||this.prevSessionId&&(0,vs.Z)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+E(n));const r=a.fetchInt("seq_no"),o=e.byteLength,p=a.fetchInt("message_data[length]");let d=a.getOffset();if(p%4||p>o-d)throw new Error("[MT] Invalid body length: "+p);const f=a.fetchRawBytes(p,!0,"message_data");d=a.getOffset();const c=o-d;if(c<12||c>1024)throw new Error("[MT] Invalid padding length: "+c);return a=new us(f,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const s=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==s+e.bytes&&a.setOffset(s+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const s=this.sentMessages[e.req_msg_id],n=s&&s.resultType||"Object";e.req_msg_id&&!s||(e.result=a.fetchObject(n,t+"[result]"))}}}),{response:a.fetchObject("","INPUT"),messageId:i,sessionId:n,seqNo:r}}))))}applyServerSalt(e){const t=(a=e,_s((s=ns()(a),new Uint8Array(s.toArray(256).value)).reverse(),8,!0,!1,!1));var a,s;ja.Z.set({["dc"+this.dcId+"_server_salt"]:E(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof I&&(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 I&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=R.Z.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof I&&(t=3e4),this.scheduleRequest(t)}reqResend(e){this.debug&&this.log.debug("Req resend",e),this.pendingResendReq.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;const t=this.sentMessages;return Object.keys(t).forEach((a=>{const s=t[a];if(s.notContentRelated&&void 0===this.pendingMessages[a])delete t[a];else if(s.container){for(const a of s.inner)if(void 0!==t[a])return void(e=!0);delete t[a]}else e=!0})),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){const e=this.sentMessages;for(const t in e){const a=e[t];(a.body||a.container)&&this.pushResend(t)}this.transport.connection&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect())}applyServerTime(e){const t=ns()(e).shiftRight(32).toJSNumber();return this.log("applying server time",t),this.timeManager.applyServerTime(t)}processMessage(e,t,a){if("messageEmpty"!==e._)if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(this.debug&&this.log.debug("process message",e,t),this.pingDelayDisconnectDeferred&&this.pingDelayDisconnectDeferred.resolve("any message"),e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=this.applyServerTime(t);(17===e.error_code||a)&&(this.log("Update session"),this.updateSession());const s=this.updateSentMessage(e.bad_msg_id);s&&this.pushResend(s.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),ja.Z.get("dc").then((t=>{t===this.dcId&&!this.isFileNetworker&&this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}));break;case"msgs_ack":this.debug&&this.log("got acks",e.msg_ids);for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(-1!==this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResend(e.answer_msg_id);break;case"msgs_state_info":{this.ackMessage(e.answer_msg_id);const t=[[this.lastResendReq,this.pendingResendReq]];for(const[a,s]of t)if((null==a?void 0:a.reqMsgId)===e.req_msg_id&&s.length)for(const e of a.msgIds){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}break}case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,s=this.sentMessages[a];if(this.debug&&this.log("Rpc response",e.result,s),this.processMessageAck(a),s){const t=s.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),s.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.ping_id;if(this.lastPingDelayDisconnectId===t){const e=this.pingDelayDisconnectDeferred;e?e.resolve("pong"):this.log("ping deferred deleted",t)}break}default:this.ackMessage(t),null!==this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}else this.log.warn("processMessage: messageEmpty",e,t)}}class ks extends G{constructor(){super(...arguments),this.networkers=[],this.language=navigator.language||_.Z.langPackCode,this.updatesProcessor=null,this.akStopped=!1}onConnectionStatusChange(e){this.rootScope.dispatchEvent("connection_status_change",e)}removeNetworker(e){(0,M.Z)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new ws(this,this.timeManager,e,t,a,s,n);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter((e=>e.isStopped()));this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}unsetConnectionInited(){for(const e of this.networkers)e.connectionInited=!1}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}}const As=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,P.Z.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map((e=>{const t=new hs;t.storeBytes((0,Ha.Z)(e.modulus),"n"),t.storeBytes((0,Ha.Z)(e.exponent),"e");const a=t.getBuffer();return s.Z.invokeCrypto("sha1",a).then((t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[E(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}}))}))).then((()=>{this.prepared=!0,this.preparePromise=null}))}select(e){return t=this,a=void 0,n=function*(){yield this.prepare();for(let t=0;t{if(d.ZP&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw o;try{const t=new us(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const s=t.fetchLong("msg_id");"0"===s&&this.log.error("msg_id === 0",s);const n=t.fetchInt("msg_len");return n||this.log.error("no msg_len",n),t}catch(e){throw this.log.error("mtpSendPlainRequest: deserialization went bad",e),Object.assign(o,{originalError:e})}}),(e=>{throw e.message||e.type||(e=Object.assign(o,{originalError:e})),e}))}sendReqPQ(e){return Us(this,void 0,void 0,(function*(){const t=new hs({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),d.ZP&&this.log("Send req_pq",E(e.nonce));try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));As.prepare(),a=yield s}catch(e){throw this.log.error("req_pq error",e.message),e}const n=a.fetchObject("ResPQ");if("resPQ"!==n._)throw new Error("[MT] resPQ response invalid: "+n._);if(!(0,vs.Z)(e.nonce,n.nonce))throw this.log.error(e.nonce,n.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=n.server_nonce,e.pq=n.pq,e.fingerprints=n.server_public_key_fingerprints,d.ZP&&this.log("Got ResPQ",E(e.serverNonce),E(e.pq),e.fingerprints);const i=yield As.select(e.fingerprints);if(!i)throw new Error("[MT] No public key found");e.publicKey=i,d.ZP&&this.log("PQ factorization start",e.pq);try{var r=yield s.Z.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=r[0],e.q=r[1],d.ZP&&this.log("PQ factorization done",r),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Us(this,void 0,void 0,(function*(){e.newNonce=w(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 hs({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const n=a.getBytes(!0);if(n.length>144)throw"DH_params: data is more than 144 bytes!";const i=_s(n,192,!1,!0,!1),r=i.slice().reverse(),o=yield(()=>Us(this,void 0,void 0,(function*(){for(;;){const t=w(new Uint8Array(32)),a=r.concat(yield s.Z.invokeCrypto("sha256",t.concat(i)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const n=yield s.Z.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),o=Ds(t,yield s.Z.invokeCrypto("sha256",n)).concat(n),p=fs(o),d=ns()(e.publicKey.modulus,16);if(-1===p.compare(d))return o}})))(),p=_s(yield s.Z.invokeCrypto("rsa-encrypt",o,e.publicKey),256,!0,!0,!0),f={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:p},c=new hs({mtproto:!0});c.storeMethod("req_DH_params",f);const l=c.getBytes(!0);let m;d.ZP&&this.log("Send req_DH_params",f);try{m=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const g=m.fetchObject("Server_DH_Params","RESPONSE");if(d.ZP&&this.log("Sent req_DH_params, response:",g),"server_DH_params_fail"!==g._&&"server_DH_params_ok"!==g._)throw new Error("[MT] Server_DH_Params response invalid: "+g._);if(!(0,vs.Z)(e.nonce,g.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!(0,vs.Z)(e.serverNonce,g.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===g._){const t=(yield s.Z.invokeCrypto("sha1",e.newNonce)).slice(-16);if(!(0,vs.Z)(t,g.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,g.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Us(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.serverNonce))).concat((yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield s.Z.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),i=a.slice(20),r=new us(i,{mtproto:!0}),o=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==o._)throw new Error("[MT] server_DH_inner_data response invalid: "+o);if(!(0,vs.Z)(e.nonce,o.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!(0,vs.Z)(e.serverNonce,o.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");d.ZP&&this.log("Done decrypting answer"),e.g=o.g,e.dhPrime=o.dh_prime,e.gA=o.g_a,e.serverTime=o.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const p=r.getOffset();if(!(0,vs.Z)(n,yield s.Z.invokeCrypto("sha1",i.slice(0,p))))throw new Error("[MT] server_DH_inner_data SHA1 mismatch");this.timeManager.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){d.ZP&&this.log("Verifying DH params",e,t,a);const s=E(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");d.ZP&&this.log("dhPrime cmp OK");const n=fs(a),i=ns()(s,16);if(n.compare(ns().one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(n.compare(i.subtract(ns().one))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");d.ZP&&this.log("1 < gA < dhPrime-1 OK");const r=ns()(2).pow(1984);if(n.compare(r)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(n.compare(i.subtract(r))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return d.ZP&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Us(this,void 0,void 0,(function*(){const t=(0,Ha.Z)(e.g.toString(16));e.b=w(new Uint8Array(256));try{var a=yield s.Z.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new hs({mtproto:!0});n.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const i=(yield s.Z.invokeCrypto("sha1",n.getBuffer())).concat(n.getBytes(!0)),r=yield s.Z.invokeCrypto("aes-encrypt",i,e.tmpAesKey,e.tmpAesIv),o=new hs({mtproto:!0});let p;o.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:r}),d.ZP&&this.log("Send set_client_DH_params");try{p=yield this.sendPlainRequest(e.dcId,o.getBytes(!0))}catch(e){throw e}const f=p.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==f._&&"dh_gen_retry"!==f._&&"dh_gen_fail"!==f._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+f._);if(!(0,vs.Z)(e.nonce,f.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!(0,vs.Z)(e.serverNonce,f.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield s.Z.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield s.Z.invokeCrypto("sha1",c),m=l.slice(0,8),g=l.slice(-8);switch(d.ZP&&this.log("Got Set_client_DH_params_answer",f._,c),f._){case"dh_gen_ok":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([1],m))).slice(-16);if(!(0,vs.Z)(t,f.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,f),new Error("new_nonce_hash1 mismatch");const a=Ds(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return d.ZP&&this.log("Auth successfull!",g,c,a),e.authKeyId=g,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([2],m))).slice(-16);if(!(0,vs.Z)(t,f.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e)}case"dh_gen_fail":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([3],m))).slice(-16);if(!(0,vs.Z)(t,f.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=Z.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)=>Us(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:w(new Uint8Array(16))},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)})))),this.cached[e]=t)}}class Rs extends G{after(){this.lastMessageId=[0,0],this.timeOffset=0,ja.Z.get("server_time_offset").then((e=>{e&&(this.timeOffset=e)}))}getServerTimeOffset(){return this.timeOffset}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|(0,Ee.d)(16)<<3|4];return(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t,rs(t[0],t[1]).toString(10)}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),s=Math.abs(this.timeOffset-a)>10;return this.lastMessageId=[0,0],this.timeOffset!==a&&(ja.Z.set({server_time_offset:a}),this.timeOffset=a),s}}class Ts{saveWebDocument(e){if(!e)return;const t=e.attributes.find((e=>"documentAttributeImageSize"===e._));return t&&(e.w=t.w,e.h=t.h),e}}class Fs extends G{getInputInvoiceBySlug(e){return{_:"inputInvoiceSlug",slug:e}}getInputInvoiceByPeerId(e,t){return{_:"inputInvoiceMessage",peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}}getPaymentForm(e){return this.apiManager.invokeApi("payments.getPaymentForm",{invoice:e}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getPaymentReceipt(e,t){return this.apiManager.invokeApi("payments.getPaymentReceipt",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}validateRequestedInfo(e,t,a){return this.apiManager.invokeApi("payments.validateRequestedInfo",{save:a,invoice:e,info:t})}sendPaymentForm(e,t,a,s,n,i){return this.apiManager.invokeApi("payments.sendPaymentForm",{form_id:t,invoice:e,requested_info_id:a,shipping_option_id:s,credentials:n,tip_amount:i||void 0}).then((e=>("payments.paymentResult"===e._&&this.apiUpdatesManager.processUpdateMessage(e.updates),e)))}clearSavedInfo(e,t){return this.apiManager.invokeApi("payments.clearSavedInfo",{info:e,credentials:t})}}const xs=new class{constructor(){this.cryptoWorkersURLs=[],this.cryptoPortsAttached=0,this.cryptoPortPromise=(0,v.Z)(),this.cryptoPortPromise.then((()=>{this.cryptoPortPromise=void 0}))}start(){const e=f.Z.getInstance();e.addEventListener("manager",(({name:e,method:t,args:a})=>(0,j.Z)(this.getManagers(),(s=>{const n=s[e];return n[t].apply(n,a)})))),e.addEventListener("cryptoPort",((e,t,a)=>{var n;const i=a.ports[0];this.cryptoPortsAttached>=this.cryptoWorkersURLs.length?i.close():(++this.cryptoPortsAttached,s.Z.attachPort(i),null===(n=this.cryptoPortPromise)||void 0===n||n.resolve())})),e.addEventListener("createProxyWorkerURLs",(({originalUrl:e,blob:t})=>{let a=this.cryptoWorkersURLs.length;a||(this.cryptoWorkersURLs.push(e),++a);const s=_.Z.cryptoWorkers;if(a===s)return this.cryptoWorkersURLs;const n=new Array(s-a).fill(void 0).map((()=>URL.createObjectURL(t)));return this.cryptoWorkersURLs.push(...n),this.cryptoWorkersURLs}))}createManagers(){return e=this,t=void 0,n=function*(){const e=new Q;yield Promise.all([e.loadStorages(),this.cryptoPortPromise]);const t=yield function(e,t){const a={appPeersManager:new pa,appChatsManager:new Ne,appDocsManager:new vt,appPhotosManager:new da,appPollsManager:new fa,appUsersManager:new Aa,appWebPagesManager:new Ua,appDraftsManager:new Pt,appProfileManager:new ga,appNotificationsManager:new ia,apiUpdatesManager:new De,appAvatarsManager:new Ue,appGroupCallsManager:new kt,appCallsManager:new Te,appReactionsManager:new va,appMessagesManager:new aa,appMessagesIdsManager:new Ft,appPrivacyManager:new ca,appInlineBotsManager:new Rt,appStickersManager:new Ia,referenceDatabase:new ee,appEmojiManager:new Ct,filtersStorage:new Ce,dialogsStorage:new ye,apiManager:new Ja,cryptoWorker:s.Z,passwordManager:new $,apiFileManager:new qa,peersStorage:new $a,thumbsStorage:new Xa,networkerFactory:new ks,rootScope:new l,authorizer:new Es,dcConfigurator:new L,timeManager:new Rs,appStoragesManager:e,appStateManager:y,appWebDocsManager:new Ts,appPaymentsManager:new Fs};for(const e in a){const t=a[e];t&&(t.setManagers&&(t.setManagers(a),delete t.setManagers),R.Z[e]=t)}const n=[];let i=Object.keys(a);i.unshift("appUsersManager","appChatsManager","appNotificationsManager","appMessagesManager","dialogsStorage"),i=(0,we.Z)(i);for(const e of i){const t=a[e];if(null==t?void 0:t.after){const e=t.after();n.push(e)}}return t&&a.apiManager.setUserAuth(t),Promise.all(n).then((()=>a))}(e,y.userId);return this.managers=t},new((a=void 0)||(a=Promise))((function(s,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((n=n.apply(e,t||[])).next())}));var e,t,a,n}getManagers(){var e;return null!==(e=this.managers)&&void 0!==e?e:this.managers=this.createManagers()}};d.GO&&(d.GO.appManagersManager=xs);const Bs=xs;var Vs=a(3655);let Ls,Os,Ns=!0;function Zs(){return Ns}function qs(){return Ns?Ls:void 0}const js=(0,S.kg)("MTPROTO"),Gs=new f.Z;Gs.addMultipleEventsListeners({environment:e=>{r(e),Z.waitForWebSocket()},crypto:({method:e,args:t})=>s.Z.invokeCrypto(e,...t),state:({state:e,resetStorages:t,pushedKeys:a,newVersion:s,oldVersion:n,userId:i})=>{js("got state",e,a),y.userId=i,y.newVersion=s,y.oldVersion=n,Object.keys(e).forEach((t=>{y.pushToState(t,e[t],!0,!a.includes(t))})),q.resolve(t)},toggleStorages:({enabled:e,clearWrite:t})=>(0,za.Z)(e,t),event:(e,t)=>{js("will redirect event",e,t),Gs.invokeExceptSource("event",e,t)},serviceWorkerOnline:e=>{Ns=e},serviceWorkerPort:(e,t,a)=>{Ls?(Ls.detachPort(Os),Os=void 0):(Ls=new Vs.Z,Ls.addMultipleEventsListeners({requestFilePart:e=>(0,j.Z)(Bs.getManagers(),(t=>{const{docId:a,dcId:s,offset:n,limit:i}=e;return t.appDocsManager.requestDocPart(a,s,n,i)}))})),(Os=a.ports[0])&&Ls.attachPort(Os)},createObjectURL:e=>URL.createObjectURL(e)}),js("MTProto start"),Bs.start(),Bs.getManagers(),Kt.start(),function(e,t,a){const s=(a,s)=>{e.attachListenPort(a),s&&e.attachSendPort(s),null==t||t(a)};e.setOnPortDisconnect((e=>{Kt.deleteTab(e)})),"undefined"!=typeof SharedWorkerGlobalScope?R.Z.addEventListener("connect",(e=>s(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?s(R.Z,null):s(R.Z,R.Z)}(Gs,(e=>{Kt.addTab(e)}))},1507:(e,t,a)=>{a.d(t,{DZ:()=>l,Gu:()=>m,IA:()=>i,Iw:()=>p,J$:()=>f,NM:()=>s,Pt:()=>d,Zi:()=>c,hj:()=>n,rU:()=>o,yF:()=>r});const s=0,n=1271266957,i=777,r=777e3,o=2147483647,p=20971520,d="",f=0,c=1,l=new Set([f,c]),m=Math.max(...Array.from(l))+1},2423:(e,t,a)=>{a.d(t,{$2:()=>d,E:()=>f,QB:()=>c,SC:()=>l,bu:()=>p,it:()=>o,kO:()=>g,tY:()=>m});var s=a(1229);const n="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",i="["+n+"0-9]",r="((?:https?|ftp)://|mailto:)?",o=r+"(?:"+i+"{1,64}(?::"+i+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+i+"["+n+"·0-9-]{0,64}(?:\\."+i+"["+n+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+n+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",p=(new RegExp("^"+r.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),d=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+o+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#[0-9_a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),f=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,c=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,l={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},m=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in l)m.add(l[e]);const g=/^\+\d+$/},671:(e,t,a)=>{function s(e){return function(e){const t=[];let a=0,s=0,n=0;for(;n55296&&a<=56319?s=a:t.push(a.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}(r(e)).join("-")}a.d(t,{N0:()=>s});const n=/\uFE0F/g,i=String.fromCharCode(8205),r=e=>e.indexOf(i)<0?e.replace(n,""):e}},o={};function p(e){var t=o[e];if(void 0!==t)return t.exports;var a=o[e]={id:e,loaded:!1,exports:{}};return r[e].call(a.exports,a,a.exports,p),a.loaded=!0,a.exports}p.m=r,p.x=()=>{var e=p.O(void 0,[699,211,51,437,570],(()=>p(4098)));return p.O(e)},e=[],p.O=(t,a,s,n)=>{if(!a){var i=1/0;for(f=0;f=n)&&Object.keys(p.O).every((e=>p.O[e](a[o])))?a.splice(o--,1):(r=!1,n0&&e[f-1][2]>n;f--)e[f]=e[f-1];e[f]=[a,s,n]},p.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return p.d(t,{a:t}),t},p.d=(e,t)=>{for(var a in t)p.o(t,a)&&!p.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},p.f={},p.e=e=>Promise.all(Object.keys(p.f).reduce(((t,a)=>(p.f[a](e,t),t)),[])),p.u=e=>437===e?"437.77e92ccb32c21ff43a10.bundle.js":570===e?"570.d4798b741257c891cc8b.bundle.js":({211:"npm.big-integer",699:"npm.pako"}[e]||e)+"."+{8:"0544e00385e42a07883b",51:"015549e15aab2a59d3a0",104:"d9383d4cf03fc631a3a9",211:"a70c90f1bcf51a3f9932",301:"a3f22008d452affb1ae4",642:"d6b90b5bc53545046507",699:"f16d6f756c34f3914132"}[e]+".chunk.js",p.miniCssF=e=>{},p.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),p.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),p.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},p.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;p.g.importScripts&&(e=p.g.location+"");var t=p.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var a=t.getElementsByTagName("script");a.length&&(e=a[a.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),p.p=e})(),t=p.u,a=p.e,s=new Map,n=new Map,p.u=function(e){return t(e)+(s.has(e)?"?"+s.get(e):"")},p.e=function(e){return a(e).catch((function(a){var i=n.has(e)?n.get(e):999999;if(i<1){var r=t(e);throw a.message="Loading chunk "+e+" failed after 999999 retries.\n("+r+")",a.request=r,a}return new Promise((function(t){setTimeout((function(){var a=Date.now();s.set(e,a),n.set(e,i-1),t(p.e(e))}),3e3)}))}))},(()=>{var e={678:1};p.f.i=(t,a)=>{e[t]||importScripts(p.p+p.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],a=t.push.bind(t);t.push=t=>{var[s,n,i]=t;for(var r in n)p.o(n,r)&&(p.m[r]=n[r]);for(i&&i(p);s.length;)e[s.pop()]=1;a(t)}})(),i=p.x,p.x=()=>Promise.all([699,211,51,437,570].map(p.e,p)).then(i),p.x()})(); -//# sourceMappingURL=mtproto.worker.b6bdf87282369207cefc.chunk.js.map \ No newline at end of file diff --git a/public/mtproto.worker.b6bdf87282369207cefc.chunk.js.map b/public/mtproto.worker.b6bdf87282369207cefc.chunk.js.map deleted file mode 100644 index 7447536c..00000000 --- a/public/mtproto.worker.b6bdf87282369207cefc.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"mtproto.worker.b6bdf87282369207cefc.chunk.js","mappings":"uBAAIA,ECEIC,EACAC,EACAC,EACAC,ECLJC,E,mCCQG,MAAMC,EAAyE,CAAC,GAAK,CAAC,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,GAAI,GAAG,CAAC,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,IAAK,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,OAAO,MAAO,OAAO,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/environment/utils.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/appManagers/appStateManager.ts","webpack://tweb/./src/helpers/object/setDeepProperty.ts","webpack://tweb/./src/lib/mtproto/transports/http.ts","webpack://tweb/./src/lib/mtproto/transports/websocket.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/lib/mtproto/transports/obfuscation.ts","webpack://tweb/./src/lib/mtproto/transports/abridged.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/lib/mtproto/transports/tcpObfuscated.ts","webpack://tweb/./src/lib/mtproto/dcConfigurator.ts","webpack://tweb/./src/lib/mtproto/transports/controller.ts","webpack://tweb/./src/lib/appManagers/utils/storages/resetStoragesPromise.ts","webpack://tweb/./src/lib/appManagers/manager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/loadStorages.ts","webpack://tweb/./src/lib/appManagers/appStoragesManager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/createStorages.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/lib/mtproto/referenceDatabase.ts","webpack://tweb/./src/helpers/object/safeReplaceObject.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getPeerIdsFromMessage.ts","webpack://tweb/./src/helpers/object/defineNotNumerableProperties.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/setDialogIndex.ts","webpack://tweb/./src/lib/storages/dialogs.ts","webpack://tweb/./src/lib/storages/filters.ts","webpack://tweb/./src/helpers/applyMixins.ts","webpack://tweb/./src/lib/appManagers/apiUpdatesManager.ts","webpack://tweb/./src/lib/appManagers/appAvatarsManager.ts","webpack://tweb/./src/lib/appManagers/appCallsManager.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.ts","webpack://tweb/./src/environment/mimeTypeMap.ts","webpack://tweb/./src/lib/appManagers/appDocsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentURL.ts","webpack://tweb/./src/lib/appManagers/appDraftsManager.ts","webpack://tweb/./src/lib/appManagers/appEmojiManager.ts","webpack://tweb/./src/lib/appManagers/appGroupCallsManager.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoInput.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoMediaInput.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentMediaInput.ts","webpack://tweb/./src/lib/appManagers/appInlineBotsManager.ts","webpack://tweb/./src/lib/appManagers/appMessagesIdsManager.ts","webpack://tweb/./src/helpers/middleware.ts","webpack://tweb/./src/helpers/string/splitStringByLength.ts","webpack://tweb/./src/lib/appManagers/appTabsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInput.ts","webpack://tweb/./src/lib/appManagers/appMessagesManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileName.ts","webpack://tweb/./src/helpers/string/convertInputKeyToKey.ts","webpack://tweb/./src/lib/appManagers/appNotificationsManager.ts","webpack://tweb/./src/lib/appManagers/appPeersManager.ts","webpack://tweb/./src/lib/appManagers/appPhotosManager.ts","webpack://tweb/./src/lib/appManagers/appPollsManager.ts","webpack://tweb/./src/lib/appManagers/appPrivacyManager.ts","webpack://tweb/./src/lib/appManagers/appProfileManager.ts","webpack://tweb/./src/helpers/callbackifyAll.ts","webpack://tweb/./src/lib/appManagers/appReactionsManager.ts","webpack://tweb/./src/lib/appManagers/appStickersManager.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/string/fileNameRFC.ts","webpack://tweb/./src/lib/files/downloadWriter.ts","webpack://tweb/./src/lib/files/downloadStorage.ts","webpack://tweb/./src/lib/mtproto/apiFileManager.ts","webpack://tweb/./src/helpers/fixFirefoxSvg.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/lib/mtproto/api_methods.ts","webpack://tweb/./src/lib/mtproto/apiManager.ts","webpack://tweb/./src/lib/storages/peers.ts","webpack://tweb/./src/lib/storages/thumbs.ts","webpack://tweb/./src/lib/mtproto/schema.ts","webpack://tweb/./src/helpers/number/intToUint.ts","webpack://tweb/./src/helpers/long/ulongFromInts.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/lib/mtproto/tl_utils.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/lib/mtproto/networker.ts","webpack://tweb/./src/helpers/long/sortLongsArray.ts","webpack://tweb/./src/helpers/long/longToBytes.ts","webpack://tweb/./src/lib/mtproto/networkerFactory.ts","webpack://tweb/./src/lib/mtproto/rsaKeysManager.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/mtproto/authorizer.ts","webpack://tweb/./src/lib/mtproto/timeManager.ts","webpack://tweb/./src/lib/appManagers/appWebDocsManager.ts","webpack://tweb/./src/lib/appManagers/appPaymentsManager.ts","webpack://tweb/./src/lib/appManagers/appManagersManager.ts","webpack://tweb/./src/lib/appManagers/createManagers.ts","webpack://tweb/./src/lib/mtproto/mtproto.worker.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,51,437,570].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[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 as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'й': 'q',\n 'ц': 'w',\n 'у': 'e',\n 'к': 'r',\n 'е': 't',\n 'н': 'y',\n 'г': 'u',\n 'ш': 'i',\n 'щ': 'o',\n 'з': 'p',\n 'х': '[',\n 'ъ': ']',\n 'ф': 'a',\n 'ы': 's',\n 'в': 'd',\n 'а': 'f',\n 'п': 'g',\n 'р': 'h',\n 'о': 'j',\n 'л': 'k',\n 'д': 'l',\n 'ж': ';',\n 'э': '\\'',\n 'я': 'z',\n 'ч': 'x',\n 'с': 'c',\n 'м': 'v',\n 'и': 'b',\n 'т': 'n',\n 'ь': 'm',\n 'б': ',',\n 'ю': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n const originalText = text;\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\r\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string,\r\n downloadId: 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 + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n // console.log('getFileURL', location);\r\n // const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return /* '/' + */type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Database} from '../../config/databases';\r\nimport Modes from '../../config/modes';\r\nimport makeError from '../../helpers/makeError';\r\nimport safeAssign from '../../helpers/object/safeAssign';\r\nimport {logger} from '../logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string,\r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n\r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n\r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n\r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n\r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n\r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n\r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n // return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n\r\n reader.onerror = reject;\r\n });\r\n\r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n\r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n // return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode,\r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\r\n log?: string,\r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n\r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n\r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","import type ENVIRONMENT from '.';\n\nlet environment: typeof ENVIRONMENT;\nexport function getEnvironment() {\n return environment;\n}\n\nexport function setEnvironment(env: typeof environment) {\n return environment = env;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {AppMessagesManager, Dialog, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\nimport {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 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\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': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle', (isPremium) => {\n this.premium = isPremium;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {State} from '../../config/state';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\nexport class AppStateManager {\n private state: State = {} as any;\n private storage = stateStorage;\n\n // ! for mtproto worker use only\n public newVersion: string;\n public oldVersion: string;\n public userId: UserId;\n\n public getState() {\n return Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n\n const first = key.split('.')[0] as keyof State;\n if(first === 'settings') {\n rootScope.dispatchEvent('settings_updated', {key, value, settings: this.state.settings});\n }\n\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true, onlyLocal?: boolean) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value, onlyLocal);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key], onlyLocal?: boolean) {\n MTProtoMessagePort.getInstance().invokeVoid('mirror', {name: 'state', key, value});\n\n this.storage.set({\n [key]: value\n }, onlyLocal);\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\nconst appStateManager = new AppStateManager();\nexport default appStateManager;\n","import getDeepProperty from './getDeepProperty';\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../../helpers/schedulers/pause';\nimport {DcId} from '../../../types';\nimport {logger, LogTypes} from '../../logger';\nimport type MTPNetworker from '../networker';\nimport MTTransport from './transport';\nimport Modes from '../../../config/modes';\n\n \nimport transportController from './controller';\n// import networkStats from '../networkStats';\n \n\nexport default class HTTP implements MTTransport {\n public networker: MTPNetworker;\n private log: ReturnType;\n\n private pending: Array<{\n resolve: (body: Uint8Array) => void,\n reject: any,\n body: Uint8Array\n }> = [];\n private releasing: boolean;\n\n public connected: boolean;\n private destroyed: boolean;\n private debug: boolean;\n\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\n this.debug = Modes.debug && false;\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connected = false;\n }\n\n public _send(body: Uint8Array, mode?: RequestMode) {\n const length = body.length;\n this.debug && this.log.debug('-> body length to send:', length);\n\n // networkStats.addSent(this.dcId, length);\n return fetch(this.url, {method: 'POST', body, mode}).then((response) => {\n if(response.status !== 200 && !mode) {\n response.arrayBuffer().then((buffer) => {\n this.log.error('not 200',\n new TextDecoder('utf-8').decode(new Uint8Array(buffer)));\n });\n\n throw response;\n }\n\n this.setConnected(true);\n\n // * test resending by dropping random request\n // if(Math.random() > .5) {\n // throw 'asd';\n // }\n\n return response.arrayBuffer().then((buffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n return new Uint8Array(buffer);\n });\n }, (err) => {\n this.setConnected(false);\n throw err;\n });\n }\n\n private setConnected(connected: boolean) {\n if(this.connected === connected || this.destroyed) {\n return;\n }\n\n this.connected = connected;\n\n \n transportController.setTransportValue('https', connected);\n \n }\n\n public destroy() {\n this.setConnected(false);\n this.destroyed = true;\n this.pending.forEach((pending) => pending.reject());\n this.pending.length = 0;\n }\n\n public send(body: Uint8Array) {\n if(this.networker) {\n return this._send(body);\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending() {\n if(this.releasing) return;\n\n this.releasing = true;\n // this.log('-> messages to send:', this.pending.length);\n for(let i = 0; i < this.pending.length; ++i) {\n const pending = this.pending[i];\n const {body, resolve} = pending;\n\n try {\n const result = await this._send(body);\n resolve(result);\n this.pending.splice(i, 1);\n } catch(err) {\n this.log.error('Send plain request error:', err);\n await pause(5000);\n }\n\n --i;\n }\n\n this.releasing = false;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {logger, LogTypes} from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport {MTConnection} from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n\r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n\r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = (e?: CloseEvent) => {\r\n this.log('closed', e/* , this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import aesjs from 'aes-js';\r\nimport randomize from '../../../helpers/array/randomize';\r\nimport cryptoMessagePort from '../../crypto/cryptoMessagePort';\r\nimport {Codec} from './codec';\r\n\r\n/*\r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n private id: number;\r\n private idPromise: Promise;\r\n private process: (data: Uint8Array, operation: 'encrypt' | 'decrypt') => ReturnType;\r\n\r\n // private cryptoEncKey: CryptoKey;\r\n // private cryptoDecKey: CryptoKey;\r\n // private cryptoKey: CryptoKey;\r\n\r\n // private encIv: Uint8Array;\r\n // private decIv: Uint8Array;\r\n\r\n // private decIvCounter: Counter;\r\n\r\n public async init(codec: Codec) {\r\n if(this.idPromise !== undefined) {\r\n this.release();\r\n }\r\n\r\n const initPayload = new Uint8Array(64);\r\n randomize(initPayload);\r\n\r\n while(true) {\r\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\r\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n // initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n randomize(initPayload);\r\n }\r\n\r\n // //////////////////////initPayload.subarray(60, 62).hex = dcId;\r\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = /* this.decIv = */reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n const idPromise = this.idPromise = cryptoMessagePort.invokeCrypto('aes-ctr-prepare', {\r\n encKey,\r\n encIv,\r\n decKey,\r\n decIv\r\n });\r\n\r\n this.process = async(data, operation) => {\r\n await idPromise;\r\n return this._process(data, operation);\r\n };\r\n\r\n this.id = await idPromise;\r\n\r\n this.process = this._process;\r\n\r\n // this.decIvCounter = new Counter(this.decIv);\r\n /* const key = this.cryptoEncKey = await subtle.importKey(\r\n 'raw',\r\n encKey,\r\n {name: 'AES-CTR'},\r\n false,\r\n ['encrypt']\r\n ); */\r\n\r\n // this.cryptoDecKey = await subtle.importKey(\r\n // 'raw',\r\n // decKey,\r\n // {name: 'AES-CTR'},\r\n // false,\r\n // ['encrypt']\r\n // );\r\n\r\n // this.cryptoKey = await subtle.importKey(\r\n // 'raw',\r\n // encKey,\r\n // {name: 'AES-CTR'},\r\n // false,\r\n // ['encrypt', 'decrypt']\r\n // );\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = await this.encode(initPayload.slice());\r\n\r\n // console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n\r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n\r\n return res;\r\n } */\r\n\r\n private _process = (data: Uint8Array, operation: 'encrypt' | 'decrypt') => {\r\n return cryptoMessagePort.invokeCryptoNew({\r\n method: 'aes-ctr-process',\r\n args: [{id: this.id, data, operation}],\r\n transfer: [data.buffer]\r\n }) as Promise;\r\n };\r\n\r\n public encode(payload: Uint8Array) {\r\n /* return subtle.encrypt({\r\n name: 'AES-CTR',\r\n counter: this.encIv,\r\n length: 64\r\n },\r\n this.cryptoEncKey,\r\n payload\r\n ); */\r\n return this.process(payload, 'encrypt');\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.process(payload, 'decrypt');\r\n }\r\n\r\n public async release() {\r\n const idPromise = this.idPromise;\r\n if(idPromise === undefined) {\r\n return;\r\n }\r\n\r\n this.id = undefined;\r\n this.idPromise = undefined;\r\n\r\n const id = await idPromise;\r\n cryptoMessagePort.invokeCrypto('aes-ctr-destroy', id);\r\n }\r\n\r\n public destroy() {\r\n this.release();\r\n }\r\n\r\n // public encode(payload: Uint8Array) {\r\n // let res = this.encNew.encrypt(payload);\r\n // let bytes = new Uint8Array(bytesFromWordss(res));\r\n\r\n // return bytes;\r\n // }\r\n\r\n // public async decode(payload: Uint8Array) {\r\n // const counter = this.decIvCounter.counter.slice();\r\n // this.decIvCounter.increment();\r\n\r\n // const n: ArrayBuffer = await subtle.encrypt({\r\n // name: 'AES-CTR',\r\n // counter: counter,\r\n // length: 64\r\n // },\r\n // this.cryptoDecKey,\r\n // payload\r\n // );\r\n\r\n // const decoded = this.decNew.update(payload);\r\n\r\n // console.log('decode', bytesToHex(decoded), 'new', n, bytesToHex(new Uint8Array(n)));\r\n\r\n // return decoded;\r\n // }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { bytesFromHex, addPadding } from \"../../bin_utils\";\r\nimport {Codec} from './codec';\r\n\r\nclass AbridgedPacketCodec implements Codec {\r\n public tag = 0xef;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n public encodePacket(data: Uint8Array) {\r\n const len = data.byteLength >> 2;\r\n let header: Uint8Array;\r\n if(len < 127) {\r\n header = new Uint8Array([len]);\r\n } else { // Length: payload length, divided by four, and encoded as 3 length bytes (little endian)\r\n // header = new Uint8Array([0x7f, ...addPadding(bytesFromHex(len.toString(16)).reverse(), 3, true)/* .reverse() */]);\r\n header = new Uint8Array([0x7f, len & 0xFF, (len >> 8) & 0xFF, (len >> 16) & 0xFF]);\r\n // console.log('got nobody cause im braindead', header, len);\r\n }\r\n\r\n return header.concat(data);\r\n // return new Uint8Array([...header, ...data]);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n let length = data[0];\r\n if(length >= 127) { // 0x7f\r\n length = data[1] | (data[2] << 8) | (data[3] << 16);\r\n\r\n return data.slice(4, length << 2 + 1); // need +1\r\n }\r\n\r\n return data.slice(1, length << 2 + 1); // need +1\r\n }\r\n}\r\n\r\nexport default new AbridgedPacketCodec();\r\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../../config/modes';\nimport {logger, LogTypes} from '../../logger';\nimport MTPNetworker from '../networker';\nimport Obfuscation from './obfuscation';\nimport MTTransport, {MTConnection, MTConnectionConstructable} from './transport';\n// import intermediatePacketCodec from './intermediate';\nimport abridgedPacketCodec from './abridged';\n// import paddedIntermediatePacketCodec from './padded';\nimport {ConnectionStatus} from '../connectionStatus';\n\n \nimport transportController from './controller';\nimport bytesToHex from '../../../helpers/bytes/bytesToHex';\n// import networkStats from '../networkStats';\nimport ctx from '../../../environment/ctx';\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = abridgedPacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n private releasingPending: boolean;\n\n // private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(\n private Connection: MTConnectionConstructable,\n private dcId: number,\n private url: string,\n private logSuffix: string,\n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connect();\n }\n\n private onOpen = async() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = await this.obfuscation.init(this.codec);\n if(!this.connected) {\n return;\n }\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n }/* else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n } */\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = async(buffer: ArrayBuffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n\n let data = await this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n // this.pending = this.pending.filter((p) => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then((response) => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n // this.releasePending();\n }).catch((err) => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n // this.dd();\n return;\n }\n\n // console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', bytesToHex(data));\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n\n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n\n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = ctx.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n\n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n if(this.obfuscation) {\n this.obfuscation.destroy();\n }\n\n this.pending.forEach((pending) => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n public changeUrl(url: string) {\n if(this.url === url) {\n return;\n }\n\n this.url = url;\n this.forceReconnect();\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n // this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n // this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = /* this.connected ? this.encodeBody(body) : */undefined;\n\n // return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending(/* tt = false */) {\n if(!this.connected || this.releasingPending) {\n // this.connect();\n return;\n }\n\n this.releasingPending = true;\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n // this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n let sent = false;\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n if(!pending) {\n break;\n }\n\n const {body, bodySent} = pending;\n if(body && !bodySent) {\n // this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n // if(!encoded) {\n // encoded = pending.encoded = this.encodeBody(body);\n // }\n\n const encoded = pending.encoded ??= await this.encodeBody(body);\n if(!this.connected) {\n break;\n }\n\n // networkStats.addSent(this.dcId, encoded.byteLength);\n this.connection.send(encoded);\n\n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n sent = true;\n // delete pending.body;\n }\n }\n\n this.releasingPending = undefined;\n\n if(this.pending.length && sent) {\n this.releasePending();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport MTTransport, {MTConnectionConstructable} from './transports/transport';\nimport Modes from '../../config/modes';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\n\n \nimport HTTP from './transports/http';\n \n\n \nimport Socket from './transports/websocket';\nimport TcpObfuscated from './transports/tcpObfuscated';\nimport {IS_WEB_WORKER} from '../../helpers/context';\nimport {DcId} from '../../types';\nimport {getEnvironment} from '../../environment/utils';\n\n \n \n \n\n \n\nexport type TransportType = 'websocket' | 'https' | 'http';\nexport type ConnectionType = 'client' | 'download' | 'upload';\ntype Servers = {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTTransport[]\n }\n }\n};\n\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\nconst PREMIUM_SUFFIX = '_premium';\n\nexport function getTelegramConnectionSuffix(connectionType: ConnectionType) {\n return connectionType === 'client' ? '' : '-1';\n}\n\n \nexport function constructTelegramWebSocketUrl(dcId: DcId, connectionType: ConnectionType, premium?: boolean) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const path = connectionType !== 'client' ? 'apiws' + TEST_SUFFIX + (premium ? PREMIUM_SUFFIX : '') : ('apiws' + TEST_SUFFIX);\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\n\n return chosenServer;\n}\n \n\nexport class DcConfigurator {\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n\n private dcOptions = Modes.test ?\n [\n {id: 1, host: '149.154.175.10', port: 80},\n {id: 2, host: '149.154.167.40', port: 80},\n {id: 3, host: '149.154.175.117', port: 80}\n ] :\n [\n {id: 1, host: '149.154.175.50', port: 80},\n {id: 2, host: '149.154.167.50', port: 80},\n {id: 3, host: '149.154.175.100', port: 80},\n {id: 4, host: '149.154.167.91', port: 80},\n {id: 5, host: '149.154.171.5', port: 80}\n ];\n\n public chosenServers: Servers = {} as any;\n\n \n private transportSocket = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n const chosenServer = constructTelegramWebSocketUrl(dcId, connectionType, premium);\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\n\n let oooohLetMeLive: MTConnectionConstructable;\n \n oooohLetMeLive = Socket;\n \n \n \n\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\n };\n \n\n \n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n let chosenServer: string;\n if(Modes.ssl || !Modes.http) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const subdomain = this.sslSubdomains[dcId - 1] + suffix;\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n } else {\n for(const dcOption of this.dcOptions) {\n if(dcOption.id === dcId) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n }\n\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n return new HTTP(dcId, chosenServer, logSuffix);\n };\n \n\n public chooseServer(\n dcId: DcId,\n connectionType: ConnectionType = 'client',\n transportType: TransportType = Modes.transport,\n reuse = true,\n premium?: boolean\n ) {\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\n connectionType = 'client';\n } */\n\n if(!this.chosenServers.hasOwnProperty(transportType)) {\n this.chosenServers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const servers = this.chosenServers[transportType][connectionType];\n\n if(!(dcId in servers)) {\n servers[dcId] = [];\n }\n\n const transports = servers[dcId];\n\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\n let transport: MTTransport;\n\n \n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, premium);\n \n \n \n \n \n\n if(!transport) {\n console.error('No chosenServer!', dcId);\n return null;\n }\n\n if(reuse) {\n transports.push(transport);\n }\n\n return transport;\n }\n\n return transports[0];\n }\n\n public static removeTransport(obj: any, transport: T) {\n for(const transportType in obj) {\n // @ts-ignore\n for(const connectionType in obj[transportType]) {\n // @ts-ignore\n for(const dcId in obj[transportType][connectionType]) {\n // @ts-ignore\n const transports: T[] = obj[transportType][connectionType][dcId];\n indexOfAndSplice(transports, transport);\n }\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../config/app';\nimport deferredPromise from '../../../helpers/cancellablePromise';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport pause from '../../../helpers/schedulers/pause';\nimport {TransportType, DcConfigurator} from '../dcConfigurator';\nimport type HTTP from './http';\nimport type TcpObfuscated from './tcpObfuscated';\nimport MTTransport from './transport';\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n private dcConfigurator: DcConfigurator;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n // setTimeout(() => {\n // this.waitForWebSocket();\n // }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const dcConfigurator = this.dcConfigurator ??= new DcConfigurator();\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => {\n if(websocketPromise.isFulfilled || websocketPromise.isRejected) {\n return;\n }\n\n if(socket.connection) {\n socket.connection.close();\n }\n\n websocketPromise.resolve(false);\n }, timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n\n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport deferredPromise, {CancellablePromise} from '../../../../helpers/cancellablePromise';\r\nimport type {StoragesResults} from './loadStorages';\r\n\r\nconst RESET_STORAGES_PROMISE: CancellablePromise> = deferredPromise();\r\nexport default RESET_STORAGES_PROMISE;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {CryptoMessagePort} from '../crypto/cryptoMessagePort';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport type {ApiManager} from '../mtproto/apiManager';\nimport type {Authorizer} from '../mtproto/authorizer';\nimport type {DcConfigurator} from '../mtproto/dcConfigurator';\nimport type {NetworkerFactory} from '../mtproto/networkerFactory';\nimport type {PasswordManager} from '../mtproto/passwordManager';\nimport type {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport type {TimeManager} from '../mtproto/timeManager';\nimport type {RootScope} from '../rootScope';\nimport type DialogsStorage from '../storages/dialogs';\nimport type FiltersStorage from '../storages/filters';\nimport type PeersStorage from '../storages/peers';\nimport type ThumbsStorage from '../storages/thumbs';\nimport type {ApiUpdatesManager} from './apiUpdatesManager';\nimport type {AppAvatarsManager} from './appAvatarsManager';\nimport type {AppCallsManager} from './appCallsManager';\nimport type {AppChatsManager} from './appChatsManager';\nimport type {AppDocsManager} from './appDocsManager';\nimport type {AppDraftsManager} from './appDraftsManager';\nimport type {AppEmojiManager} from './appEmojiManager';\nimport type {AppGroupCallsManager} from './appGroupCallsManager';\nimport type {AppInlineBotsManager} from './appInlineBotsManager';\nimport type {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {AppNotificationsManager} from './appNotificationsManager';\nimport type AppPaymentsManager from './appPaymentsManager';\nimport type {AppPeersManager} from './appPeersManager';\nimport type {AppPhotosManager} from './appPhotosManager';\nimport type {AppPollsManager} from './appPollsManager';\nimport type {AppPrivacyManager} from './appPrivacyManager';\nimport type {AppProfileManager} from './appProfileManager';\nimport type {AppReactionsManager} from './appReactionsManager';\nimport type {AppStateManager} from './appStateManager';\nimport type {AppStickersManager} from './appStickersManager';\nimport type {AppStoragesManager} from './appStoragesManager';\nimport type {AppUsersManager} from './appUsersManager';\nimport type AppWebDocsManager from './appWebDocsManager';\nimport type {AppWebPagesManager} from './appWebPagesManager';\nimport type {AppManagers} from './managers';\n\nexport class AppManager {\n protected appPeersManager: AppPeersManager;\n protected appChatsManager: AppChatsManager;\n protected appDocsManager: AppDocsManager;\n protected appPhotosManager: AppPhotosManager;\n protected appPollsManager: AppPollsManager;\n protected appUsersManager: AppUsersManager;\n protected appWebPagesManager: AppWebPagesManager;\n protected appDraftsManager: AppDraftsManager;\n protected appProfileManager: AppProfileManager;\n protected appNotificationsManager: AppNotificationsManager;\n protected apiUpdatesManager: ApiUpdatesManager;\n protected appAvatarsManager: AppAvatarsManager;\n protected appGroupCallsManager: AppGroupCallsManager;\n protected appCallsManager: AppCallsManager;\n protected appReactionsManager: AppReactionsManager;\n protected appMessagesManager: AppMessagesManager;\n protected appMessagesIdsManager: AppMessagesIdsManager;\n protected appPrivacyManager: AppPrivacyManager;\n protected appInlineBotsManager: AppInlineBotsManager;\n protected appStickersManager: AppStickersManager;\n protected referenceDatabase: ReferenceDatabase;\n protected appEmojiManager: AppEmojiManager;\n protected dialogsStorage: DialogsStorage;\n protected filtersStorage: FiltersStorage;\n protected apiManager: ApiManager;\n // protected apiManager: ApiManagerProxy;\n protected passwordManager: PasswordManager;\n protected cryptoWorker: CryptoMessagePort;\n protected apiFileManager: ApiFileManager;\n protected peersStorage: PeersStorage;\n protected thumbsStorage: ThumbsStorage;\n protected networkerFactory: NetworkerFactory;\n protected rootScope: RootScope;\n protected authorizer: Authorizer;\n protected dcConfigurator: DcConfigurator;\n protected timeManager: TimeManager;\n protected appStoragesManager: AppStoragesManager;\n protected appStateManager: AppStateManager;\n protected appWebDocsManager: AppWebDocsManager;\n protected appPaymentsManager: AppPaymentsManager;\n\n public clear: (init?: boolean) => void;\n\n public setManagers(managers: AppManagers) {\n Object.assign(this, managers);\n // this.after();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type{Chat} from '../../../../layer';\r\nimport type{Dialog} from '../../appMessagesManager';\r\nimport type{User} from '../../appUsersManager';\r\nimport type {StoragesStorages} from './createStorages';\r\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\r\nimport {Awaited} from '../../../../types';\r\nimport {logger} from '../../../logger';\r\nimport RESET_STORAGES_PROMISE from './resetStoragesPromise';\r\n\r\nexport type StoragesResults = Awaited>;\r\n\r\nasync function loadStoragesInner(storages: StoragesStorages) {\r\n const recordPromise = recordPromiseBound(logger('STORAGES-LOADER'));\r\n const storagesKeys = Object.keys(storages) as Array;\r\n const storagesPromises: Promise[] = storagesKeys.map((key) => {\r\n const promise = storages[key].getAll();\r\n return recordPromise(promise, 'storage ' + (key as any as string));\r\n });\r\n\r\n const storagesResults: {\r\n users: User[],\r\n chats: Chat[],\r\n dialogs: Dialog[]\r\n } = {} as any;\r\n const arr = await Promise.all(storagesPromises);\r\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\r\n storagesResults[storagesKeys[i]] = arr[i] as any;\r\n }\r\n\r\n arr.splice(0, storagesKeys.length);\r\n\r\n const resetStorages = await RESET_STORAGES_PROMISE;\r\n if(resetStorages.size) {\r\n for(const key of resetStorages) {\r\n storagesResults[key].length = 0;\r\n }\r\n\r\n resetStorages.clear();\r\n }\r\n\r\n return storagesResults;\r\n}\r\n\r\nlet promise: ReturnType;\r\nexport default function loadStorages(storages: StoragesStorages) {\r\n return promise ??= loadStoragesInner(storages);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger} from '../logger';\nimport {AppManager} from './manager';\nimport createStorages from './utils/storages/createStorages';\nimport loadStorages from './utils/storages/loadStorages';\n\nexport class AppStoragesManager extends AppManager {\n private storages: ReturnType;\n\n // private loadPromise: CancellablePromise;\n\n private log: ReturnType;\n\n constructor() {\n super();\n\n this.log = logger('STORAGES');\n this.storages = createStorages();\n // this.loadPromise = deferredPromise();\n }\n\n public loadStorages() {\n return loadStorages(this.storages);\n // loadStorages(this.storages).then((storagesResults) => {\n // this.loadPromise.resolve(storagesResults);\n // });\n\n // return this.loadPromise;\n }\n\n // public setStoragesResults(storagesResults: StoragesResults) {\n // this.loadPromise.resolve(storagesResults);\n // }\n\n public async loadStorage(name: T) {\n return this.loadStorages().then((storagesResults) => {\n return {\n storage: this.storages[name],\n results: storagesResults[name]\n };\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Chat} from '../../../../layer';\r\nimport type {Dialog} from '../../appMessagesManager';\r\nimport type {User} from '../../appUsersManager';\r\nimport DATABASE_STATE from '../../../../config/databases/state';\r\nimport AppStorage from '../../../storage';\r\n\r\nexport type StoragesStorages = {\r\n users: AppStorage, typeof DATABASE_STATE>,\r\n chats: AppStorage, typeof DATABASE_STATE>,\r\n dialogs: AppStorage, typeof DATABASE_STATE>\r\n};\r\n\r\nexport default function createStorages() {\r\n const names: (keyof StoragesStorages)[] = ['users', 'chats', 'dialogs'];\r\n const storages: StoragesStorages = {} as any;\r\n for(const name of names) {\r\n // @ts-ignore\r\n storages[name] = new AppStorage(DATABASE_STATE, name);\r\n }\r\n\r\n return storages;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\r\nimport randomize from '../../helpers/array/randomize';\r\nimport {AppManager} from '../appManagers/manager';\r\n\r\nexport class PasswordManager extends AppManager {\r\n public getState(): Promise {\r\n return this.apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n // state = Object.assign({}, state);\r\n // state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then((state) => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n\r\n if(settings.currentPassword) {\r\n currentHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n\r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n randomize(salt1);\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n\r\n if(settings.newPassword) {\r\n newHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n\r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n\r\n return this.apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public getInputCheckPassword(password: string, state: AccountPassword) {\r\n return this.cryptoWorker.invokeCrypto('computeSRP', password, state, false) as Promise;\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return this.getInputCheckPassword(password, state).then((inputCheckPassword) => {\r\n // console.log('SRP', inputCheckPassword);\r\n return this.apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then((auth) => {\r\n if(auth._ === 'auth.authorization') {\r\n this.apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return this.apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return this.apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return this.apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Photo} from '../../layer';\nimport {logger} from '../logger';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {AppManager} from '../appManagers/manager';\nimport makeError from '../../helpers/makeError';\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions | ReferenceContext.referenceContextUserFull | ReferenceContext.referenceContextCustomEmoji;\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 export type referenceContextUserFull = {\n type: 'userFull',\n userId: UserId\n };\n\n export type referenceContextCustomEmoji = {\n type: 'customEmoji',\n docId: DocId\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n// type ReferenceBytes = Uint8Array;\n\nexport class ReferenceDatabase extends AppManager {\n private contexts: Map = new Map();\n // private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise;\n\n // constructor() {\n // super();\n\n // apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n // const originalPayload = task.payload;\n\n // assumeType(task);\n // task.originalPayload = originalPayload;\n\n // this.refreshReference(originalPayload).then((bytes) => {\n // task.payload = bytes;\n // }, (err) => {\n // task.error = err;\n // }).then(() => apiManager.postMessage(task));\n // });\n // }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n\n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = this.appMessagesManager.reloadMessages(context.peerId, context.messageId, true);\n break;\n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || this.appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n case 'userFull': {\n promise = Promise.resolve(this.appProfileManager.getProfile(context.userId, true));\n break;\n }\n\n case 'customEmoji': {\n promise = this.appEmojiManager.getCustomEmojiDocuments([context.docId]);\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 makeError('NO_NEW_CONTEXT');\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n","export default function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key)) {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n // if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n // }\n }\n\n return wasObject;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageAction, MessageMedia} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getPeerIdsFromMessage(message: Message.message | Message.messageService) {\n const peerIds: number[] = [\n message.fromId,\n message.viaBotId,\n (message as Message.message).fwdFromId\n ];\n\n const media = (message as Message.message).media;\n if(media) {\n const contactUserId = (media as MessageMedia.messageMediaContact).user_id;\n if(contactUserId !== undefined) {\n peerIds.push(contactUserId.toPeerId());\n }\n\n const results = (media as MessageMedia.messageMediaPoll).results;\n const recentVoters = results?.recent_voters;\n if(recentVoters?.length) {\n peerIds.push(...recentVoters.map((userId) => userId.toPeerId()));\n }\n }\n\n const recentReactions = ((message as Message.message).reactions)?.recent_reactions;\n if(recentReactions?.length) {\n peerIds.push(...recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n const action = (message as Message.messageService).action;\n if(action) {\n const userIds: UserId[] = [\n ...((action as MessageAction.messageActionChatAddUser).users || []),\n (action as MessageAction.messageActionChatDeleteUser).user_id,\n (action as MessageAction.messageActionChatJoinedByLink).inviter_id\n ];\n peerIds.push(...userIds.filter(Boolean).map((userId) => userId.toPeerId()));\n\n const chatIds: ChatId[] = [\n (action as MessageAction.messageActionChatMigrateTo).channel_id,\n (action as MessageAction.messageActionChannelMigrateFrom).chat_id\n ];\n peerIds.push(...chatIds.filter(Boolean).map((chatId) => chatId.toPeerId(true)));\n }\n\n const recentRepliers = ((message as Message.message).replies)?.recent_repliers;\n if(recentRepliers?.length) {\n peerIds.push(...recentRepliers.map((reply) => getPeerId(reply)));\n }\n\n return new Set(peerIds.filter(Boolean));\n}\n","export default function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\n // const perf = performance.now();\n const props = {writable: true, configurable: true};\n const out: {[name in keyof T]?: typeof props} = {};\n names.forEach((name) => {\n if(!obj.hasOwnProperty(name)) {\n out[name] = props;\n }\n });\n Object.defineProperties(obj, out);\n // console.log('defineNotNumerableProperties time:', performance.now() - perf);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Dialog} from '../../appMessagesManager';\nimport type getDialogIndexKey from './getDialogIndexKey';\n\nexport default function setDialogIndex(\n dialog: Dialog,\n indexKey: ReturnType,\n index: number\n) {\n return dialog[indexKey] = index;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {Chat, DialogPeer, Message, MessageAction, MessageMedia, MessagesPeerDialogs, Update} from '../../layer';\nimport type {Dialog, MyMessage} from '../appManagers/appMessagesManager';\nimport tsNow from '../../helpers/tsNow';\nimport SearchIndex from '../searchIndex';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport {MyDialogFilter} from './filters';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport {NoneToVoidFunction} from '../../types';\nimport ctx from '../../environment/ctx';\nimport AppStorage from '../storage';\nimport type DATABASE_STATE from '../../config/databases/state';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../appManagers/utils/messageId/generateMessageId';\nimport {AppManager} from '../appManagers/manager';\nimport getDialogIndexKey from '../appManagers/utils/dialogs/getDialogIndexKey';\nimport isObject from '../../helpers/object/isObject';\nimport getDialogIndex from '../appManagers/utils/dialogs/getDialogIndex';\nimport getPeerIdsFromMessage from '../appManagers/utils/messages/getPeerIdsFromMessage';\nimport {AppStoragesManager} from '../appManagers/appStoragesManager';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport setDialogIndex from '../appManagers/utils/dialogs/setDialogIndex';\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: Dialog[],\n id: number,\n unreadMessagesCount: number,\n unreadPeerIds: Set,\n unreadUnmutedPeerIds: Set,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: REAL_FOLDER_ID = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage extends AppManager {\n private storage: AppStoragesManager['storages']['dialogs'];\n\n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder} = {};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n protected after() {\n this.clear(true);\n\n this.rootScope.addEventListener('language_change', () => {\n const peerId = this.appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n this.rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n // const indexKeys: ReturnType[] = [];\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n\n // indexKeys.push(this.getDialogIndexKey(+filterId));\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n // for(const indexKey of indexKeys) {\n // delete dialog[indexKey];\n // }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n this.rootScope.addEventListener('filter_update', onFilterUpdate);\n this.rootScope.addEventListener('filter_new', onFilterUpdate);\n\n this.rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n this.rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.processDialogForFilters(dialog);\n this.prepareDialogUnreadCountModifying(dialog)();\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('dialogs')\n ]).then(([state, {results: dialogs, storage}]) => {\n this.storage = storage;\n this.dialogs = this.storage.getCache();\n\n for(const folderId of REAL_FOLDERS) {\n const order = state.pinnedOrders[folderId];\n if(!order) {\n continue;\n }\n\n const _order = this.pinnedOrders[folderId];\n _order.splice(0, _order.length, ...order);\n }\n\n if(dialogs.length) {\n AppStorage.freezeSaving(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n\n if(dialogs.length) {\n this.appDraftsManager.addMissedDialogs();\n }\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(!dialog) {\n continue;\n }\n\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 21; ++i) {\n const indexKey: ReturnType = `index_${i}` as any;\n delete dialog[indexKey];\n }\n // delete dialog.indexes;\n\n this.saveDialog(dialog, undefined, true);\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!message) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[FOLDER_ID_ALL] = loaded;\n this.allDialogsLoaded[FOLDER_ID_ARCHIVE] = loaded;\n } else {\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(Array.from(REAL_FOLDERS).every((folderId) => this.allDialogsLoaded[folderId])) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.storage.clear();\n\n this.setDialogsLoaded(FOLDER_ID_ALL, false);\n this.setDialogsLoaded(FOLDER_ID_ARCHIVE, false);\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\n\n for(const folderId of REAL_FOLDERS) {\n this.resetPinnedOrder(folderId);\n }\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n this.pinnedOrders = {};\n for(const folderId of REAL_FOLDERS) {\n this.pinnedOrders[folderId] = [];\n }\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].length = 0;\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(...Array.from(REAL_FOLDERS).sort((a, b) => a - b));\n }\n\n return offsetDate;\n }\n\n private generateFolder(id: number) {\n const folder: Folder = {\n dialogs: [],\n id,\n unreadMessagesCount: 0,\n unreadPeerIds: new Set(),\n unreadUnmutedPeerIds: new Set()\n };\n\n defineNotNumerableProperties(folder, ['dispatchUnreadTimeout']);\n\n return folder;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ??= this.generateFolder(id);\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n return skipMigrated ? folder.dialogs.filter((dialog) => dialog.migratedTo === undefined) : folder.dialogs;\n }\n\n public getNextDialog(currentPeerId: PeerId, next: boolean, filterId: number) {\n const folder = this.getFolderDialogs(filterId, true);\n let dialog: Dialog;\n if(!currentPeerId) {\n if(next) {\n dialog = folder[0];\n }\n } else {\n const idx = folder.findIndex((dialog) => dialog.peerId === currentPeerId);\n if(idx !== -1) {\n const nextIndex = next ? idx + 1 : idx - 1;\n dialog = folder[nextIndex];\n }\n }\n\n return dialog;\n }\n\n public getDialogIndexKeyByFilterId(filterId: number) {\n if(REAL_FOLDERS.has(filterId)) return getDialogIndexKey(filterId as REAL_FOLDER_ID);\n const filter = this.filtersStorage.getFilter(filterId);\n return getDialogIndexKey(filter.localId);\n }\n\n public isPeerUnmuted(peerId: PeerId) {\n return !this.appNotificationsManager.isPeerLocalMuted(peerId, true);\n }\n\n public getFolderUnreadCount(filterId: number) {\n const folder = this.getFolder(filterId);\n return {unreadUnmutedCount: folder.unreadUnmutedPeerIds.size, unreadCount: folder.unreadPeerIds.size};\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n const arrays = Array.from(REAL_FOLDERS).map((folderId) => this.getFolderDialogs(folderId, skipMigrated));\n return [].concat(...arrays) as typeof arrays[0];\n }\n\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType, filter: MyDialogFilter) {\n let index: number;\n\n const isRealFolder = REAL_FOLDERS.has(filter.id);\n /* if(isRealFolder) {\n // index = getDialogIndex(dialog, indexKey);\n index = this.generateIndexForDialog(dialog, true);\n } else */if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinnedPeerIds.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned || isRealFolder) {\n index = this.generateIndexForDialog(dialog, true, undefined, !isRealFolder);\n } else {\n index = getDialogIndex(dialog) ?? this.generateIndexForDialog(dialog, true);\n }\n }\n\n // if(!dialog.hasOwnProperty(indexKey)) {\n // defineNotNumerableProperties(dialog, [indexKey]);\n // }\n\n return setDialogIndex(dialog, indexKey, index);\n }\n\n public getDialog(peerId: PeerId, folderId?: number, skipMigrated = true): [Dialog, number] | [] {\n const folders: Dialog[][] = [];\n\n if(folderId === undefined) {\n folders.push(...Array.from(REAL_FOLDERS).map((folderId) => this.getFolder(folderId).dialogs));\n } else {\n folders.push(this.getFolderDialogs(folderId, false));\n }\n\n for(const folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(dialog.peerId === peerId) {\n return [dialog, i - skipped];\n } else if(skipMigrated && dialog.migratedTo !== undefined) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n public getDialogIndex(peerId: PeerId | Dialog, indexKey: ReturnType) {\n const dialog = isObject(peerId) ? peerId : this.getDialogOnly(peerId);\n return getDialogIndex(dialog, indexKey);\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n if(date === undefined) {\n date = tsNow(true) + this.timeManager.getServerTimeOffset();\n }\n\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\n }\n\n public processDialogForFilters(dialog: Dialog) {\n // let perf = performance.now();\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\n const folder = this.getFolder(filter.id);\n const dialogs = folder.dialogs;\n\n const wasIndex = dialogs.findIndex((d) => d.peerId === dialog.peerId);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = this.getDialogIndex(wasDialog, indexKey);\n\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return false;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, (dialog) => this.getDialogIndex(dialog, indexKey), -1);\n }\n\n return true;\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog) {\n const callbacks: NoneToVoidFunction[] = [\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\n ];\n\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog));\n }\n }\n\n return () => callbacks.forEach((callback) => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const wasUnmuted = this.isPeerUnmuted(dialog.peerId);\n\n if(toggle !== undefined) {\n const addMessagesCount = toggle ? wasUnreadCount : -wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!wasUnreadCount, wasUnreadCount && wasUnmuted, dialog);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const newUnmuted = this.isPeerUnmuted(dialog.peerId);\n\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!newUnreadCount, newUnreadCount && newUnmuted, dialog);\n };\n }\n\n public modifyFolderUnreadCount(\n folderId: number,\n addMessagesCount: number,\n toggleDialog: boolean,\n toggleUnmuted: boolean,\n dialog: Dialog\n ) {\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n\n const {peerId} = dialog;\n if(toggleDialog) {\n folder.unreadPeerIds.add(peerId);\n } else {\n folder.unreadPeerIds.delete(peerId);\n }\n\n if(toggleUnmuted) {\n folder.unreadUnmutedPeerIds.add(peerId);\n } else {\n folder.unreadUnmutedPeerIds.delete(peerId);\n }\n\n if(folder.dispatchUnreadTimeout === undefined) {\n folder.dispatchUnreadTimeout = ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n const _folder = {...folder};\n delete _folder.dialogs;\n this.rootScope.dispatchEvent('folder_unread', _folder);\n }, 0);\n }\n }\n\n public generateIndexForDialog(\n dialog: Dialog,\n justReturn?: boolean,\n message?: MyMessage,\n noPinnedOrderUpdate?: boolean\n ) {\n if(!justReturn) {\n return;\n }\n\n let topDate = 0, isPinned: boolean;\n if(dialog.pFlags.pinned && !noPinnedOrderUpdate) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n if(!message) {\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n\n topDate = (message as Message.message)?.date || topDate;\n\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n\n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n if(!topDate) {\n topDate = tsNow(true);\n }\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n const indexKey = getDialogIndexKey(dialog.folder_id);\n setDialogIndex(dialog, indexKey, index);\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog) {\n const order = this.pinnedOrders[dialog.folder_id];\n\n let pinnedIndex = order.indexOf(dialog.peerId);\n if(pinnedIndex === -1) {\n order.unshift(dialog.peerId);\n pinnedIndex = 0;\n this.savePinnedOrders();\n }\n\n return this.generateDialogPinnedDateByIndex(order.length - 1 - pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog) {\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getHistoryMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(message && !message.pFlags.is_outgoing/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n\n const peerIds = getPeerIdsFromMessage(message);\n this.peersStorage.requestPeersForKey(peerIds, `topMessage_${peerId}`);\n\n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.peersStorage.requestPeer(peerId, 'dialog');\n\n /* for(let id in this.filtersStorage.filters) {\n const filter = this.filtersStorage.filters[id];\n\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n\n }\n } */\n }\n\n public pushDialog(dialog: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const {folder_id, peerId} = dialog;\n\n this.dialogs[peerId] = dialog;\n\n offsetDate ??= this.getDialogOffsetDate(dialog);\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.dropDialog(peerId, true);\n return;\n }\n\n this.dialogsOffsetDate[folder_id] = offsetDate;\n }\n }\n\n this.setDialogToState(dialog);\n\n // if(pos === -1) {\n // this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n // }\n\n // const indexKey = getDialogIndexKey(folder_id);\n // /* const newPos = */insertInDescendSortedArray(dialogs, dialog, (dialog) => getDialogIndex(dialog, indexKey), -1);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialogFromFolders(peerId: PeerId) {\n const foundDialog = this.getDialog(peerId, undefined, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\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\n return foundDialog;\n }\n\n public dropDialog(peerId: PeerId, keepLocal?: boolean): ReturnType {\n const dialog = this.getDialogOnly(peerId);\n const foundDialog = this.dropDialogFromFolders(peerId);\n if(dialog) {\n if(!keepLocal) {\n delete this.dialogs[peerId];\n }\n\n this.clearDialogFromState(dialog, keepLocal);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\n const peerId = dialog.peerId;\n this.peersStorage.requestPeersForKey([], `topMessage_${peerId}`);\n this.peersStorage.releasePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId) {\n const dropped = this.dropDialog(peerId);\n if(dropped.length) {\n this.rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId) {\n this.dropDialogWithEvent(peerId);\n this.rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n dialogsResult.dialogs.splice(idx, 1);\n }\n });\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.appMessagesManager.saveMessages(dialogsResult.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: Map = new Map();\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMid = dialog.top_message;\n\n const topPendingMid = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMid) {\n const topPendingMessage = this.appMessagesManager.getMessageByPeer(peerId, topPendingMid) as MyMessage;\n const topMessage = this.appMessagesManager.getMessageByPeer(peerId, topMid) as MyMessage;\n if(!topMid || (topPendingMessage && (!topMessage || topPendingMessage?.date > topMessage?.date))) {\n dialog.top_message = topMid = topPendingMid;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMid;\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(topMid || dialog.draft?._ === 'draftMessage') {\n if(this.saveDialog(dialog)) {\n updatedDialogs.set(peerId, dialog);\n }\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(updatedDialogs.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n private getDialogOffsetDate(dialog: Dialog) {\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n return message?.date || 0;\n }\n\n public canSaveDialogByPeerId(peerId: PeerId) {\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(\n chat._ === 'channelForbidden' ||\n // || chat._ === 'chatForbidden'\n (chat as Chat.chat).pFlags.left\n // || (chat as any).pFlags.kicked\n ) {\n return false;\n }\n }\n\n return true;\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 ?? FOLDER_ID_ALL, 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 false;\n }\n\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n\n if(!this.canSaveDialogByPeerId(peerId)) {\n return false;\n }\n\n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n\n const wasDialogBefore = this.getDialogOnly(peerId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = generateMessageId(dialog.top_message);// dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(!channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = 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 === getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft(peerId, 0, dialog.draft);\n dialog.peerId = peerId;\n // dialog.indexes ??= {} as any;\n\n // if(dialog.peerId === -) {\n // debugger;\n // }\n\n // Because we saved message without dialog present\n if(message && message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: dialog.notify_settings\n });\n\n if(channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n if(wasDialogBefore) {\n // fix unread count\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(wasDialogBefore);\n safeReplaceObject(wasDialogBefore, dialog);\n releaseUnreadCount();\n }\n\n this.pushDialog(dialog, message?.date, ignoreOffsetDate, saveGlobalOffset);\n\n return true;\n }\n\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId: number = 0, skipMigrated = false): {\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n } | Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }> {\n if(!REAL_FOLDERS.has(folderId)) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.filtersStorage.reloadMissingPeerIds(folderId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n return Promise.all(promises).then(() => {\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n });\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId: REAL_FOLDER_ID = !REAL_FOLDERS.has(folderId) || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId as REAL_FOLDER_ID;\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n\n const indexKey = this.getDialogIndexKeyByFilterId(folderId);\n\n if(query) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = folderId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === folderId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => this.getDialogIndex(d2, indexKey) - this.getDialogIndex(d1, indexKey));\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n };\n }\n\n return this.appMessagesManager.getTopMessages(limit, realFolderId).then((result) => {\n // const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n // this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n // this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = 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 as REAL_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 ?? FOLDER_ID_ALL;\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 ?? FOLDER_ID_ALL;\n\n const handleOrder = (order: PeerId[]) => {\n this.resetPinnedOrder(folderId);\n this.pinnedOrders[folderId].push(...order);\n this.savePinnedOrders();\n order.reverse(); // index must be higher\n order.forEach((peerId) => {\n newPinned[peerId] = true;\n\n const dialog = this.getDialogOnly(peerId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n\n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n\n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n const peerId = dialog.peerId;\n if(!newPinned[peerId]) {\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\n }\n }\n };\n\n // this.log('updatePinnedDialogs', update);\n const newPinned: {[peerId: PeerId]: true} = {};\n if(!update.order) {\n this.apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n handleOrder(dialogsResult.dialogs.map((d) => d.peerId));\n\n /* dialogsResult.dialogs.forEach((dialog) => {\n newPinned[dialog.peerId] = true;\n });\n\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\n const peerId = dialog.peerId;\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\n this.newDialogsToHandle[peerId] = {reload: true};\n this.scheduleHandleNewDialogs();\n }\n }); */\n });\n\n return;\n }\n\n // this.log('before order:', this.dialogsStorage[0].map((d) => d.peerId));\n\n handleOrder(update.order.map((peer) => 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 {Dialog} from '../appManagers/appMessagesManager';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport copy from '../../helpers/object/copy';\nimport {AppManager} from '../appManagers/manager';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS, REAL_FOLDER_ID, START_LOCAL_ID} from '../mtproto/mtproto_config';\nimport makeError from '../../helpers/makeError';\n\nexport type MyDialogFilter = DialogFilter.dialogFilter;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'],\n ['exclude_peers', 'excludePeerIds'],\n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\nconst PREPENDED_FILTERS = REAL_FOLDERS.size;\n\nconst LOCAL_FILTER: MyDialogFilter = {\n _: 'dialogFilter',\n pFlags: {},\n flags: 0,\n id: 0,\n title: '',\n exclude_peers: [],\n include_peers: [],\n pinned_peers: [],\n excludePeerIds: [],\n includePeerIds: [],\n pinnedPeerIds: []\n};\n\nexport default class FiltersStorage extends AppManager {\n private filters: {[filterId: string]: MyDialogFilter};\n private filtersArr: Array;\n private localFilters: {[filterId: string]: MyDialogFilter};\n private localId: number;\n private reloadedPeerIds: Set;\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: this.onUpdateDialogFilters,\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach((arr) => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n\n this.rootScope.addEventListener('premium_toggle', () => {\n this.onUpdateDialogFilters({_: 'updateDialogFilters'});\n });\n\n return this.appStateManager.getState().then((state) => {\n const filtersArr = this.prependFilters(state.filtersArr);\n filtersArr.map((filter) => {\n this.saveDialogFilter(filter, false, true);\n });\n });\n }\n\n /**\n * ! use it only with saving\n */\n private prependFilters(filters: DialogFilter[]) {\n filters = filters.slice();\n\n const allChatsFilter = this.localFilters[FOLDER_ID_ALL];\n const archiveFilter = this.localFilters[FOLDER_ID_ARCHIVE];\n\n const allChatsFilterIndex = filters.findIndex((filter) => filter._ === 'dialogFilterDefault' || filter.id === FOLDER_ID_ALL);\n if(allChatsFilterIndex !== -1) filters[allChatsFilterIndex] = allChatsFilter;\n else filters.unshift(allChatsFilter);\n\n findAndSplice(filters, (filter) => (filter as MyDialogFilter).id === FOLDER_ID_ARCHIVE);\n filters.splice(/* 1 */filters[0] === allChatsFilter ? 1 : 0, 0, archiveFilter);\n\n this.localId = START_LOCAL_ID;\n filters.forEach((filter) => {\n delete filter.localId;\n });\n\n return filters;\n }\n\n private generateLocalFilter(id: REAL_FOLDER_ID) {\n const filter: MyDialogFilter = {...copy(LOCAL_FILTER), id};\n if(id === FOLDER_ID_ALL) {\n filter.pFlags.exclude_archived = true;\n } else if(id === FOLDER_ID_ARCHIVE) {\n filter.pFlags.exclude_unarchived = true;\n }\n\n if(REAL_FOLDERS.has(id)) {\n filter.pinnedPeerIds = this.dialogsStorage.getPinnedOrders(id);\n }\n\n return filter;\n }\n\n // private getLocalFilter(id: number) {\n // return this.filters[id] ??= this.generateLocalFilter(id);\n // }\n\n public clear = (init?: boolean) => {\n if(!init) {\n // safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n this.clearFilters();\n } else {\n this.filters = {};\n this.filtersArr = [];\n this.reloadedPeerIds = new Set();\n\n this.localFilters = {};\n for(const filterId of REAL_FOLDERS) {\n this.localFilters[filterId] = this.generateLocalFilter(filterId as REAL_FOLDER_ID);\n }\n }\n\n this.localId = START_LOCAL_ID;\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 findAndSplice(this.filtersArr, (filter) => (filter as DialogFilter.dialogFilter).id === update.id);\n }\n\n this.pushToState();\n };\n\n private onUpdateDialogFilters = (update: Update.updateDialogFilters) => {\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 private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n // console.log('updateDialogFilterOrder', update);\n\n const order = update.order.slice();\n if(!order.includes(FOLDER_ID_ARCHIVE)) {\n order.splice(order[0] === FOLDER_ID_ALL ? 1 : 0, 0, FOLDER_ID_ARCHIVE);\n }\n\n this.localId = START_LOCAL_ID;\n order.forEach((filterId) => {\n const filter = this.filters[filterId];\n delete filter.localId;\n this.setLocalId(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', order);\n\n this.pushToState();\n };\n\n private pushToState() {\n this.appStateManager.pushToState('filtersArr', this.filtersArr);\n }\n\n public testDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n if(REAL_FOLDERS.has(filter.id)) {\n return dialog.folder_id === filter.id && this.dialogsStorage.canSaveDialogByPeerId(dialog.peerId);\n }\n\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && dialog.folder_id === FOLDER_ID_ARCHIVE) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted(peerId) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n\n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n\n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public getFilters() {\n return this.filters;\n }\n\n public clearFilters() {\n const filters = this.getFilters();\n for(const filterId in filters) { // delete filters\n if(REAL_FOLDERS.has(+filterId)) {\n continue;\n }\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: +filterId\n });\n }\n }\n\n public async toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n\n if(!wasPinned) {\n if(filter.pinned_peers.length >= (await this.apiManager.getConfig()).pinned_infolder_count_max) {\n return Promise.reject(makeError('PINNED_DIALOGS_TOO_MUCH'));\n }\n\n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n\n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map((i) => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return this.apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n // console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.localId;\n f.push(filter);\n }\n\n filter.localId = START_LOCAL_ID;\n\n const order = f.sort((a, b) => a.localId - b.localId).map((filter) => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n // private spliceMissingPeerIds(filterId: number, type: ArgumentTypes[1], missingPeerIds: PeerId[]) {\n // const filter = this.getFilter(filterId);\n // const peers = filter && filter[type];\n // if(!peers?.length) {\n // return;\n // }\n\n // let spliced = false;\n // missingPeerIds.forEach((peerId) => {\n // const inputPeer = findAndSplice(peers, (inputPeer) => getPeerId(inputPeer) === peerId);\n // if(inputPeer) {\n // spliced = true;\n // }\n // });\n\n // if(spliced) {\n // this.onUpdateDialogFilter({\n // _: 'updateDialogFilter',\n // id: filterId,\n // filter\n // });\n // }\n // }\n\n public reloadMissingPeerIds(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\n const filter = this.getFilter(filterId);\n const peers = filter && filter[type];\n if(!peers?.length) {\n return;\n }\n\n // const missingPeerIds: PeerId[] = [];\n const reloadDialogs = peers.filter((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const isAlreadyReloaded = this.reloadedPeerIds.has(peerId);\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n // if(isAlreadyReloaded && !dialog) {\n // missingPeerIds.push(peerId);\n // }\n\n const reload = !isAlreadyReloaded && !dialog;\n return reload;\n });\n\n if(!reloadDialogs.length) {\n // if(missingPeerIds.length) {\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n // }\n\n return;\n }\n\n const reloadPromises = reloadDialogs.map((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer)\n .then((dialog) => {\n this.reloadedPeerIds.add(peerId);\n\n return dialog ? undefined : peerId;\n });\n\n return promise;\n });\n\n const reloadPromise = Promise.all(reloadPromises).then((missingPeerIds) => {\n missingPeerIds = missingPeerIds.filter(Boolean);\n if(!missingPeerIds.length) {\n return;\n }\n\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n });\n\n return reloadPromise;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length > PREPENDED_FILTERS && !overwrite) {\n return keys.map((filterId) => this.filters[filterId]).sort((a, b) => a.localId - b.localId);\n }\n\n const filters = await this.apiManager.invokeApiSingle('messages.getDialogFilters');\n const prepended = this.prependFilters(filters);\n return prepended.map((filter) => this.saveDialogFilter(filter, overwrite)).filter(Boolean);\n }\n\n public getSuggestedDialogsFilters() {\n return this.apiManager.invokeApi('messages.getSuggestedDialogFilters');\n }\n\n public saveDialogFilter(filter: DialogFilter, update = true, silent?: boolean) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n if(filter._ === 'dialogFilterDefault') {\n filter = this.localFilters[FOLDER_ID_ALL];\n }\n\n assumeType(filter);\n if(!REAL_FOLDERS.has(filter.id)) {\n convertment.forEach(([from, to]) => {\n assumeType(filter);\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\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.setLocalId(filter);\n\n if(!silent) {\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 return filter;\n }\n\n private setLocalId(filter: MyDialogFilter) {\n if(filter.localId !== undefined) {\n if(filter.localId >= this.localId) {\n this.localId = filter.localId + 1;\n }\n } else {\n filter.localId = this.localId++ as MyDialogFilter['localId'];\n findAndSplice(this.filtersArr, (_filter) => _filter.id === filter.id);\n this.filtersArr.push(filter);\n this.pushToState();\n }\n }\n\n public async isFilterIdAvailable(filterId: number) {\n if(REAL_FOLDERS.has(filterId)) {\n return true;\n }\n\n const limit = await this.apiManager.getLimit('folders');\n const isFolderAvailable = this.filtersArr.filter((filter) => !REAL_FOLDERS.has(filter.id)).slice(0, limit).some((filter) => filter.id === filterId);\n\n return isFolderAvailable;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function applyMixins(derivedCtor: any, constructors: any[]) {\r\n // const callbacks: Array<(...args: any[]) => any> = [];\r\n\r\n constructors.forEach((baseCtor) => {\r\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\r\n const value: PropertyDescriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null);\r\n /* if(name === '_constructor') {\r\n callbacks.push(value.value);\r\n return;\r\n } else */if(name === 'constructor') {\r\n return;\r\n }\r\n\r\n Object.defineProperty(\r\n derivedCtor.prototype,\r\n name,\r\n value\r\n );\r\n });\r\n });\r\n\r\n // if(callbacks.length) {\r\n // function c(...args: any[]): any {\r\n // callbacks.forEach((cb, idx) => {\r\n // // @ts-ignore\r\n // cb.apply(this, args[idx] || []);\r\n // });\r\n // };\r\n\r\n // Object.defineProperty(derivedCtor.prototype, 'superConstructor', {\r\n // configurable: true,\r\n // enumerable: true,\r\n // value: c,\r\n // writable: true\r\n // });\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport DEBUG from '../../config/debug';\nimport {ConstructorDeclMap, Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport App from '../../config/app';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport {AppManager} from './manager';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport ctx from '../../environment/ctx';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport applyMixins from '../../helpers/applyMixins';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: true,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nclass ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n constructor() {\n this._constructor(false);\n }\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n this.appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n\n if(!this.popPendingSeqUpdate() &&\n state.syncPending &&\n state.syncPending.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n\n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n\n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n\n if(!goodPts) {\n return false;\n }\n\n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n\n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n\n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n clearTimeout(curState.syncPending.timeout);\n curState.syncPending = null;\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n\n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start\n // ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n\n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n\n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n\n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? this.appPeersManager.peerId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id ?\n (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true) :\n ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || this.appPeersManager.peerId);\n\n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: this.appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: this.appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n\n case 'updatesCombined':\n case 'updates':\n this.appUsersManager.saveApiUsers(updateMessage.users, options.override);\n this.appChatsManager.saveApiChats(updateMessage.chats, options.override);\n\n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n\n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n\n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n const wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n\n if(updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = null;\n }\n\n const promise = this.apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts,\n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date,\n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n this.rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n\n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n\n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + this.timeManager.getServerTimeOffset();\n delete updatesState.seq;\n\n this.channelStates = {};\n\n this.log.warn('getDifference:', differenceResult._);\n this.onDifferenceTooLong();\n }\n\n // this.log('apply diff', updatesState.seq, updatesState.pts)\n\n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n\n return promise;\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n if(channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = null;\n }\n\n const log = this.debug ? this.log.bindPrefix('getChannelDifference-' + channelId) : undefined;\n // this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = this.apiManager.invokeApi('updates.getChannelDifference', {\n channel: this.appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 30\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n log?.debug('diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n\n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n // log?.debug('apply channel empty diff', differenceResult);\n return;\n }\n\n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n // log?.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n log?.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n\n 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 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 log?.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private onDifferenceTooLong() {\n this.appUsersManager.clear();\n this.appChatsManager.clear();\n this.appMessagesManager.clear();\n\n this.rootScope.dispatchEvent('state_cleared');\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n this.rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n this.rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n\n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n if(!(channelId in this.channelStates)) {\n this.channelStates[channelId] = {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n\n return true;\n }\n\n return false;\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = this.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 = this.appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !this.appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !this.appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !this.appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && this.appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !this.appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n\n let popPts: boolean;\n let popSeq: boolean;\n\n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && this.appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n\n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n\n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\n\n if(curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\n }\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n\n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n\n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n\n this.saveUpdate(update);\n\n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n // this.debug && this.log('saveUpdate', update);\n this.dispatchEvent(update._, update as any);\n }\n\n public attach(langCode?: string) {\n if(this.attached) return;\n\n // return;\n\n this.log('attach');\n\n this.attached = true;\n\n this.appStateManager.getState().then(({updates: state}) => {\n const newVersion = this.appStateManager.newVersion/* || '1.6.0' */;\n\n // rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n this.apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n // setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n // rootScope.broadcast('state_synchronized');\n // }, 1000);\n\n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n // state.date = 1628623682;\n // state.pts = 2007500;\n // state.seq = 503;\n\n Object.assign(this.updatesState, state);\n\n this.log('will get difference', Object.assign({}, state));\n\n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n this.apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(async() => {\n const strs: Record = {\n en: 'was updated to version',\n ru: 'обновлён до версии'\n };\n\n const getChangelog = (lang: string) => {\n fetch(`changelogs/${lang}_${newVersion.split(' ')[0]}.md`)\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n const langStr = strs[lang] || strs.en;\n const pre = `**Telegram Web${App.suffix} ${langStr} ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n\n this.processLocalUpdate(update);\n });\n };\n\n const languages = filterUnique([langCode, 'en']);\n for(const language of languages) {\n try {\n await getChangelog(language);\n break;\n } catch(err) {\n\n }\n }\n });\n }\n });\n }\n}\n\ninterface ApiUpdatesManager extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n}>, AppManager {}\napplyMixins(ApiUpdatesManager, [EventListenerBase, AppManager]);\n\nexport {ApiUpdatesManager};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {UserProfilePhoto, ChatPhoto, InputFileLocation} from '../../layer';\nimport {DownloadOptions} from '../mtproto/apiFileManager';\nimport {AppManager} from './manager';\n\nexport type PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager extends AppManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n protected after() {\n this.rootScope.addEventListener('avatar_update', (peerId) => {\n this.removeFromAvatarsCache(peerId);\n });\n }\n\n public isAvatarCached(peerId: PeerId, size?: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId];\n if(size === undefined) {\n return !!saved;\n }\n\n return !!(saved && saved[size] && !(saved[size] instanceof Promise));\n }\n\n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n let saved = this.savedAvatarURLs[peerId];\n if(!saved || !saved[size]) {\n if(!saved) {\n saved = this.savedAvatarURLs[peerId] = {};\n }\n\n // console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation',\n pFlags: {},\n peer: this.appPeersManager.getInputPeerById(peerId),\n photo_id: photo.photo_id\n };\n\n const downloadOptions: DownloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n downloadOptions.limitPart = 512 * 1024;\n }\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = this.apiFileManager.download(downloadOptions);\n return saved[size] = promise.then((blob) => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else {\n return saved[size];\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getEnvironment} from '../../environment/utils';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall} from '../../layer';\nimport {AppManager} from './manager';\n\nexport type CallId = PhoneCall['id'];\n\nexport type MyPhoneCall = Exclude;\n\nexport class AppCallsManager extends AppManager {\n private calls: Map;\n\n protected after() {\n this.calls = new Map();\n\n if(!getEnvironment().IS_CALL_SUPPORTED) {\n return;\n }\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePhoneCall: (update) => {\n this.saveCall(update.phone_call);\n },\n\n updatePhoneCallSignalingData: (update) => {\n this.rootScope.dispatchEvent('call_signaling', {callId: update.phone_call_id, data: update.data});\n }\n });\n }\n\n public computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n return this.cryptoWorker.invokeCrypto('compute-dh-key', g_b, a, p);\n }\n\n public saveCall(call: PhoneCall) {\n const isDiscarded = call._ === 'phoneCallDiscarded';\n const oldCall = this.calls.get(call.id);\n if(oldCall) {\n // if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n // }\n\n if(isDiscarded) {\n this.calls.delete(call.id);\n }\n\n call = oldCall;\n } else if(!isDiscarded) {\n this.calls.set(call.id, call as any);\n }\n\n this.rootScope.dispatchEvent('call_update', call);\n\n return call;\n }\n\n public getCall(callId: CallId) {\n return this.calls.get(callId);\n }\n\n public getCallInput(id: CallId): InputPhoneCall {\n const call = this.getCall(id);\n return {\n _: 'inputPhoneCall',\n id: call.id,\n access_hash: call.access_hash\n };\n }\n\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\n this.appUsersManager.saveApiUsers(phonePhoneCall.users);\n return this.saveCall(phonePhoneCall.phone_call);\n }\n\n public generateDh() {\n return this.apiManager.invokeApi('messages.getDhConfig', {\n version: 0,\n random_length: 256\n }).then((dhConfig) => {\n return this.cryptoWorker.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\n });\n }\n\n // private verifyProtocolCompatibility(protocol: PhoneCallProtocol) {\n // const my = getCallProtocol();\n // const myVersion = my.library_versions[0];\n // return !protocol.library_versions.find((version) => {\n // return compareVersion(myVersion, version) > 0;\n // });\n // }\n\n public async requestCall(userId: UserId, protocol: PhoneCallProtocol, g_a_hash: Uint8Array, video?: boolean) {\n const phonePhoneCall = await this.apiManager.invokeApi('phone.requestCall', {\n user_id: this.appUsersManager.getUserInput(userId),\n protocol: protocol,\n video: video,\n random_id: nextRandomUint(32),\n g_a_hash: g_a_hash\n });\n\n return this.savePhonePhoneCall(phonePhoneCall);\n }\n\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\n if(!this.getCall(callId)) {\n return;\n }\n\n const updates = await this.apiManager.invokeApi('phone.discardCall', {\n video,\n peer: this.getCallInput(callId),\n duration,\n reason: {\n _: reason\n },\n connection_id: '0'\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport deepEqual from '../../helpers/object/deepEqual';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatInvite, ChatPhoto, ChatReactions, InputChannel, InputChatPhoto, InputFile, InputPeer, MessagesSponsoredMessages, SponsoredMessage, Update, Updates} from '../../layer';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {AppManager} from './manager';\nimport hasRights from './utils/chats/hasRights';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport {AppStoragesManager} from './appStoragesManager';\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager extends AppManager {\n private storage: AppStoragesManager['storages']['chats'];\n\n private chats: {[id: ChatId]: Chat.channel | Chat.chat | any};\n // private usernames: any;\n // private channelAccess: any;\n // private megagroups: {[id: number]: true};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n this.apiManager.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = this.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 this.rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('chats')\n ]).then(([state, {results: chats, storage}]) => {\n this.storage = storage;\n\n if(chats.length) {\n for(let i = 0, length = chats.length; i < length; ++i) {\n const chat = chats[i];\n if(chat) {\n this.chats[chat.id] = chat;\n }\n }\n }\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!this.peersStorage.isPeerNeeded(chatId.toPeerId(true))) {\n /* const chat = this.chats[chatId];\n if(chat.username) {\n delete this.usernames[cleanUsername(chat.username)];\n } */\n\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n };\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach((chat) => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n\n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat: Exclude = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n (chat as Chat.chat).pFlags ??= {};\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n const peerId = chat.id.toPeerId(true);\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 const changedPhoto = oldPhotoId !== newPhotoId;\n\n const changedTitle = oldChat.title !== chat.title;\n\n const changedAnyBadge = (oldChat as Chat.channel).pFlags.verified !== (chat as Chat.channel).pFlags.verified ||\n (oldChat as Chat.channel).pFlags.scam !== (chat as Chat.channel).pFlags.scam ||\n (oldChat as Chat.channel).pFlags.fake !== (chat as Chat.channel).pFlags.fake;\n\n safeReplaceObject(oldChat, chat);\n this.rootScope.dispatchEvent('chat_update', chat.id);\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', peerId);\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', peerId);\n }\n }\n\n if(this.peersStorage.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\n }\n\n public getChatTyped(id: ChatId): Chat {\n return this.getChat(id);\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id\n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread\n * @returns\n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n return hasRights(this.getChat(id), action, rights, isThread);\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat: Chat.chat = this.getChat(id);\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n\n return this.apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.megagroup;\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channelForbidden' ||\n chat._ === 'chatForbidden' ||\n chat._ === 'chatEmpty' ||\n (chat as Chat.chat).pFlags.left ||\n // || (chat as any).pFlags.kicked\n (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty' || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getInputPeer(id: ChatId) {\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !chat.pFlags.min);\n }\n\n public getChatPhoto(id: ChatId) {\n const chat: Chat.chat = this.getChat(id);\n\n return chat && chat.photo || {\n _: 'chatPhotoEmpty'\n };\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise {\n return this.apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map((u) => this.appUsersManager.getUserInput(u));\n\n return this.apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return this.apiManager.invokeApi('messages.createChat', {\n users: userIds.map((u) => this.appUsersManager.getUserInput(u)),\n title\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: any) => {\n // console.log('onChatUpdated', chatId, updates);\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n if(updates?.updates?.length && this.isChannel(chatId)) {\n this.rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return this.apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return this.apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, this.appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n // return this.leaveChat(id).then(() => {\n return this.apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n // });\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return this.apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find((u) => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string) {\n return this.apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n }).then((bool) => {\n if(bool) {\n const chat: Chat.channel = this.getChat(id);\n chat.username = username;\n }\n\n return bool;\n });\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then((updates: any) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then((updates: any) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return this.apiManager.invokeApi('messages.editChatAbout', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n about\n }).then((bool) => {\n if(bool) {\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : getParticipantPeerId(participant);\n return this.apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: this.appUsersManager.getSelf().id,\n peer: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n\n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return this.apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then((channelId) => {\n return this.apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n });\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: ChatReactions) {\n const chatFull = this.appProfileManager.getCachedFullChat(id);\n if(chatFull) {\n chatFull.available_reactions = reactions;\n }\n\n return this.apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public isRestricted(chatId: ChatId) {\n const chat: Chat.channel = this.getChat(chatId);\n const restrictionReasons = chat.restriction_reason;\n\n return !!(chat.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\n }\n\n public getSendAs(channelId: ChatId) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getSendAs',\n params: {\n peer: this.getChannelInputPeer(channelId)\n },\n processResult: (sendAsPeers) => {\n this.appUsersManager.saveApiUsers(sendAsPeers.users);\n this.saveApiChats(sendAsPeers.chats);\n\n return sendAsPeers.peers;\n }\n });\n }\n\n public importChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.importChatInvite', {hash})\n .then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n const chat = (updates as Updates.updates).chats[0];\n return chat.id;\n });\n }\n\n public checkUsername(chatId: ChatId, username: string) {\n return this.apiManager.invokeApi('channels.checkUsername', {\n channel: this.getChannelInput(chatId),\n username\n });\n }\n\n public getSponsoredMessage(chatId: ChatId) {\n // const s: MessagesSponsoredMessages.messagesSponsoredMessages = {\n // '_': 'messages.sponsoredMessages',\n // 'messages': [\n // {\n // '_': 'sponsoredMessage',\n // 'pFlags': {},\n // 'flags': 9,\n // 'random_id': new Uint8Array([\n // 80,\n // 5,\n // 249,\n // 174,\n // 44,\n // 73,\n // 173,\n // 14,\n // 246,\n // 81,\n // 187,\n // 182,\n // 223,\n // 5,\n // 4,\n // 128\n // ]),\n // 'from_id': {\n // '_': 'peerUser',\n // 'user_id': 983000232\n // },\n // 'start_param': 'GreatMinds',\n // 'message': 'This is a long sponsored message. In fact, it has the maximum length allowed on the platform – 160 characters 😬😬. It\\'s promoting a bot with a start parameter.' + chatId\n // }\n // ],\n // 'chats': [],\n // 'users': [\n // {\n // '_': 'user',\n // 'pFlags': {\n // 'bot': true,\n // 'verified': true,\n // 'apply_min_photo': true\n // },\n // 'flags': 34226219,\n // 'id': 983000232,\n // 'access_hash': '-294959558742535650',\n // 'first_name': 'Quiz Bot',\n // 'username': 'QuizBot',\n // 'photo': {\n // '_': 'userProfilePhoto',\n // 'pFlags': {},\n // 'flags': 2,\n // 'photo_id': '4221953848856651689',\n // 'stripped_thumb': new Uint8Array([\n // 1,\n // 8,\n // 8,\n // 155,\n // 247,\n // 95,\n // 103,\n // 255,\n // 0,\n // 110,\n // 138,\n // 40,\n // 174,\n // 132,\n // 142,\n // 6,\n // 238,\n // 127\n // ]),\n // 'dc_id': 2\n // },\n // 'bot_info_version': 11,\n // 'bot_inline_placeholder': 'Search a quiz...',\n // 'sortName': 'quiz bot'\n // }\n // ]\n // };\n\n // const promise = Promise.resolve(s);\n const promise = this.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\n channel: this.getChannelInput(chatId)\n }, {cacheSeconds: 300});\n\n return promise.then((sponsoredMessages) => {\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\n\n const sponsoredMessage = sponsoredMessages.messages.shift();\n sponsoredMessages.messages.push(sponsoredMessage);\n\n return sponsoredMessages;\n });\n }\n\n public viewSponsoredMessage(chatId: ChatId, randomId: SponsoredMessage['random_id']) {\n return this.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\n channel: this.getChannelInput(chatId),\n random_id: randomId\n });\n }\n\n public checkChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.checkChatInvite', {\n hash: hash\n }).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n return chatInvite;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n '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 export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\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\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\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 }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\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 const 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 return 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 const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport I18n, {i18n} from '../lib/langPack';\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true,\r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\r\n joiner + date.getFullYear() +\r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp('20[0-9]{1,2}');\r\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\r\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\r\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if('today'.indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if('yesterday'.indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if(k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if(k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n\r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n\r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n\r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key\n * @param wasObject\n * @param newObject\n */\nexport 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","export const EXTENSION_MIME_TYPE_MAP: {[ext in MTFileExtension]: MTMimeType} = {\n pdf: 'application/pdf',\n tgv: 'application/x-tgwallpattern',\n tgs: 'application/x-tgsticker',\n json: 'application/json',\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n ogg: 'audio/ogg',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n svg: 'image/svg+xml'\n};\n\nexport const MIME_TYPE_EXTENSION_MAP: {[mimeType in MTMimeType]?: MTFileExtension} = {};\n\nfor(const ext in EXTENSION_MIME_TYPE_MAP) {\n MIME_TYPE_EXTENSION_MAP[EXTENSION_MIME_TYPE_MAP[ext as MTFileExtension]] = ext as MTFileExtension;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {AccountWallPapers, Document, DocumentAttribute, MessagesSavedGifs, PhotoSize, WallPaper} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {getFullDate} from '../../helpers/date';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport assumeType from '../../helpers/assumeType';\nimport {getEnvironment} from '../../environment/utils';\nimport {isServiceWorkerOnline} from '../mtproto/mtproto.worker';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getDocumentInputFileLocation from './utils/docs/getDocumentInputFileLocation';\nimport getDocumentURL from './utils/docs/getDocumentURL';\nimport type {ThumbCache} from '../storages/thumbs';\nimport makeError from '../../helpers/makeError';\nimport {EXTENSION_MIME_TYPE_MAP} from '../../environment/mimeTypeMap';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\ntype WallPaperId = WallPaper.wallPaper['id'];\n\nlet uploadWallPaperTempId = 0;\n\nexport class AppDocsManager extends AppManager {\n private docs: {[docId: DocId]: MyDocument};\n\n private stickerCachedThumbs: {[docId: DocId]: {[toneIndex: number]: {url: string, w: number, h: number}}};\n\n private uploadingWallPapers: {[id: WallPaperId]: {cacheContext: ThumbCache, file: File}};\n\n protected after() {\n this.docs = {};\n this.stickerCachedThumbs = {};\n this.uploadingWallPapers = {};\n\n MTProtoMessagePort.getInstance().addEventListener('serviceWorkerOnline', (online) => {\n if(!online) {\n this.onServiceWorkerFail();\n }\n });\n }\n\n private onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n this.thumbsStorage.deleteCacheContext(doc);\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(!doc || doc._ === 'documentEmpty') {\n return;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n this.referenceDatabase.saveContext(doc.file_reference, context);\n }\n\n // console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name',\n // 'file', 'duration', 'downloaded', 'url', 'audioTitle',\n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw',\n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n for(let i = 0, length = doc.attributes.length; i < length; ++i) {\n const attribute = doc.attributes[i];\n switch(attribute._) {\n case 'documentAttributeFilename':\n doc.file_name = wrapPlainText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\n\n case 'documentAttributeVideo':\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n // apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n\n case 'documentAttributeCustomEmoji':\n case 'documentAttributeSticker':\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || getEnvironment().IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n } else if(doc.mime_type === 'video/webm') {\n if(!getEnvironment().IS_WEBM_SUPPORTED) {\n break;\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 const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeFilename') as DocumentAttribute.documentAttributeFilename;\n const ext = attribute && attribute.file_name.split('.').pop();\n const date = getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n doc.file_name = `${doc.type}_${date}${ext ? '.' + ext : ''}`;\n }\n\n if(isServiceWorkerOnline()) {\n if((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n\n const cacheContext = this.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url) {\n this.thumbsStorage.setCacheContextURL(doc, undefined, getDocumentURL(doc), 0);\n }\n }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n\n if(!doc.file_name) {\n doc.file_name = '';\n }\n\n if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n\n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean) {\n return this.apiFileManager.downloadMedia({\n media: doc,\n queueId,\n onlyCache\n });\n }\n\n public getLottieCachedThumb(docId: DocId, toneIndex: number) {\n const cached = this.stickerCachedThumbs[docId];\n return cached && cached[toneIndex];\n }\n\n public saveLottiePreview(docId: DocId, blob: Blob, width: number, height: number, toneIndex: number) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const cached = this.stickerCachedThumbs[doc.id] ??= {};\n\n const thumb = cached[toneIndex];\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n cached[toneIndex] = {\n url: URL.createObjectURL(blob),\n w: width,\n h: height\n };\n }\n\n public saveWebPConvertedStrippedThumb(docId: DocId, bytes: Uint8Array) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const thumb = doc.thumbs && doc.thumbs.find((thumb) => thumb._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n doc.pFlags.stickerThumbConverted = true;\n thumb.bytes = bytes;\n }\n\n public getWallPapers() {\n return this.apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\n const wallPapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\n wallPapers.forEach((wallPaper) => {\n wallPaper.document = this.saveDoc(wallPaper.document);\n });\n\n return wallPapers;\n });\n }\n\n public prepareWallPaperUpload(file: File) {\n const id = 'wallpaper-upload-' + ++uploadWallPaperTempId;\n\n const thumb = {\n _: 'photoSize',\n h: 0,\n w: 0,\n location: {} as any,\n size: file.size,\n type: THUMB_TYPE_FULL\n } as PhotoSize.photoSize;\n let document: MyDocument = {\n _: 'document',\n access_hash: '',\n attributes: [],\n dc_id: 0,\n file_reference: [],\n id,\n mime_type: file.type as MTMimeType,\n size: file.size,\n date: Date.now() / 1000,\n pFlags: {},\n thumbs: [thumb],\n file_name: file.name\n };\n\n document = this.saveDoc(document);\n\n const cacheContext = this.thumbsStorage.setCacheContextURL(document, undefined, URL.createObjectURL(file), file.size);\n\n const wallpaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n access_hash: '',\n document: document,\n id,\n slug: id,\n pFlags: {}\n };\n\n this.uploadingWallPapers[id] = {\n cacheContext,\n file\n };\n\n return wallpaper;\n }\n\n public uploadWallPaper(id: WallPaperId) {\n const {cacheContext, file} = this.uploadingWallPapers[id];\n delete this.uploadingWallPapers[id];\n\n const upload = this.apiFileManager.upload({file, fileName: file.name});\n return upload.then((inputFile) => {\n return this.apiManager.invokeApi('account.uploadWallPaper', {\n file: inputFile,\n mime_type: file.type,\n settings: {\n _: 'wallPaperSettings'\n\n }\n }).then((wallPaper) => {\n assumeType(wallPaper);\n wallPaper.document = this.saveDoc(wallPaper.document);\n this.thumbsStorage.setCacheContextURL(wallPaper.document, undefined, cacheContext.url, cacheContext.downloaded);\n\n return wallPaper;\n });\n });\n }\n\n public getGifs() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getSavedGifs',\n processResult: (res) => {\n assumeType(res);\n return res.gifs.map((doc) => this.saveDoc(doc));\n }\n });\n }\n\n public requestDocPart(docId: DocId, dcId: number, offset: number, limit: number) {\n const doc = this.getDoc(docId);\n if(!doc) return Promise.reject(makeError('NO_DOC'));\n return this.apiFileManager.requestFilePart(dcId, getDocumentInputFileLocation(doc), offset, limit);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {FileURLType, getFileURL} from '../../../../helpers/fileName';\r\nimport {Document, PhotoSize} from '../../../../layer';\r\nimport getDocumentDownloadOptions from './getDocumentDownloadOptions';\r\n\r\nexport default function getDocumentURL(doc: Document.document, download = false, thumb?: PhotoSize.photoSize) {\r\n let type: FileURLType;\r\n if(download) {\r\n type = 'download';\r\n } else if(thumb) {\r\n type = 'thumb';\r\n } else if(doc.supportsStreaming) {\r\n type = 'stream';\r\n } else {\r\n type = 'document';\r\n }\r\n\r\n return getFileURL(type, getDocumentDownloadOptions(doc, thumb));\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {MessageEntity, DraftMessage, MessagesSaveDraft} from '../../layer';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport stateStorage from '../stateStorage';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport {AppManager} from './manager';\r\nimport generateMessageId from './utils/messageId/generateMessageId';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\nimport draftsAreEqual from './utils/drafts/draftsAreEqual';\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager extends AppManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise;\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerId = this.appPeersManager.getPeerId(update.peer);\r\n this.saveDraft(peerId, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n\r\n /* return */stateStorage.get('drafts').then((drafts) => {\r\n this.drafts = drafts || {};\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n this.appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n private getAllDrafts() {\r\n return this.getAllDraftPromise ??= this.apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = this.apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n });\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n this.rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n private isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n\r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n\r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(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 const params: MessagesSaveDraft = {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n assumeType(localDraft);\r\n const message = localDraft.message;\r\n const entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = this.appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + this.timeManager.getServerTimeOffset();\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return this.apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return this.apiManager.invokeApi('messages.clearAllDrafts').then((bool) => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n this.rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n const emptyDraft: DraftMessage.draftMessageEmpty = {\r\n _: 'draftMessageEmpty'\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, emptyDraft, {notify: true, force: true});\r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true});\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport isObject from '../../helpers/object/isObject';\nimport validateInitObject from '../../helpers/object/validateInitObject';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport SearchIndex from '../searchIndex';\nimport stateStorage from '../stateStorage';\nimport {AppManager} from './manager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\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 = 32;\n\ntype EmojiType = 'native' | 'custom';\n\nexport class AppEmojiManager extends AppManager {\n private static POPULAR_EMOJI = ['😂', '😘', '❤️', '😍', '😊', '😁', '👍', '☺️', '😔', '😄', '😭', '💋', '😒', '😳', '😜', '🙈', '😉', '😃', '😢', '😝', '😱', '😡', '😏', '😞', '😅', '😚', '🙊', '😌', '😀', '😋', '😆', '👌', '😐', '😕'];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: {native?: string[], custom?: DocId[]} = {};\n private getRecentEmojisPromises: {native?: Promise, custom?: Promise} = {};\n\n private getCustomEmojiDocumentsPromise: Promise;\n private getCustomEmojiDocumentPromises: Map> = new Map();\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then((popEmojis) => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then((recentEmojis) => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return this.apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n\n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(this.networkerFactory.language !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(this.networkerFactory.language));\n }\n\n if(!this.recent.native) {\n promises.push(this.getRecentEmojis('native'));\n }\n\n return Promise.all(promises);\n }\n\n private indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n\n // const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.native.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(type: 'custom'): Promise;\n public getRecentEmojis(type: 'native'): Promise;\n public getRecentEmojis(type: T): Promise {\n const promises = this.getRecentEmojisPromises;\n return promises[type] ??= this.appStateManager.getState().then((state) => {\n let recent: string[] | DocId[] = [];\n if(type === 'native') {\n const {recentEmoji} = state;\n recent = Array.isArray(recentEmoji) && recentEmoji.length ? recentEmoji : AppEmojiManager.POPULAR_EMOJI;\n } else {\n const {recentCustomEmoji} = state;\n recent = Array.isArray(recentCustomEmoji) && recentCustomEmoji.length ? recentCustomEmoji : [];\n }\n\n return this.recent[type] = recent as any;\n }) as any;\n }\n\n public pushRecentEmoji(emoji: AppEmoji) {\n const type: EmojiType = emoji.docId ? 'custom' : 'native';\n emoji.emoji = fixEmoji(emoji.emoji);\n // @ts-ignore\n this.getRecentEmojis(type).then((recent) => {\n const i = emoji.docId || emoji.emoji;\n indexOfAndSplice(recent, i);\n recent.unshift(i);\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n\n this.appStateManager.pushToState(type === 'custom' ? 'recentCustomEmoji' : 'recentEmoji', recent);\n this.rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n\n public getCustomEmojiDocuments(docIds: DocId[]) {\n if(!docIds.length) return Promise.resolve([] as MyDocument[]);\n return this.apiManager.invokeApi('messages.getCustomEmojiDocuments', {document_id: docIds}).then((documents) => {\n return documents.map((doc) => {\n return this.appDocsManager.saveDoc(doc, {\n type: 'customEmoji',\n docId: doc.id\n });\n });\n });\n }\n\n public getCachedCustomEmojiDocuments(docIds: DocId[]) {\n return docIds.map((docId) => this.appDocsManager.getDoc(docId));\n }\n\n private setDebouncedGetCustomEmojiDocuments() {\n if(this.getCustomEmojiDocumentsPromise || !this.getCustomEmojiDocumentPromises.size) {\n return;\n }\n\n this.getCustomEmojiDocumentsPromise = pause(0).then(() => {\n const allIds = [...this.getCustomEmojiDocumentPromises.keys()];\n const promises: Promise[] = [];\n do {\n const ids = allIds.splice(0, 100);\n const promise = this.getCustomEmojiDocuments(ids).then((docs) => {\n docs.forEach((doc, idx) => {\n const docId = ids[idx];\n const deferred = this.getCustomEmojiDocumentPromises.get(docId);\n this.getCustomEmojiDocumentPromises.delete(docId);\n deferred.resolve(doc);\n });\n });\n\n promises.push(promise);\n } while(allIds.length);\n\n return Promise.all(promises);\n }).finally(() => {\n this.getCustomEmojiDocumentsPromise = undefined;\n this.setDebouncedGetCustomEmojiDocuments();\n });\n }\n\n public getCustomEmojiDocument(id: DocId) {\n let promise = this.getCustomEmojiDocumentPromises.get(id);\n if(promise) {\n return promise;\n }\n\n const doc = this.appDocsManager.getDoc(id);\n if(doc) {\n return doc;\n }\n\n promise = deferredPromise();\n this.getCustomEmojiDocumentPromises.set(id, promise);\n\n this.setDebouncedGetCustomEmojiDocuments();\n\n return promise;\n }\n\n public getCustomEmojis() {\n return this.appStickersManager.getEmojiStickers();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport type GroupCallConnectionInstance from '../calls/groupCallConnectionInstance';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {DataJSON, GroupCall, GroupCallParticipant, GroupCallParticipantVideoSourceGroup, InputGroupCall, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport class AppGroupCallsManager extends AppManager {\n private log: ReturnType;\n\n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n\n // private doNotDispatchParticipantUpdate: PeerId;\n\n protected after() {\n this.log = logger('GROUP-CALLS');\n\n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n\n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n\n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n this.rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n this.participants.delete(groupCall.id);\n }\n });\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n\n if(modified) {\n this.rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n\n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant || true/* && this.doNotDispatchParticipantUpdate !== peerId */) {\n this.rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach((p) => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n this.saveApiParticipant(groupCallId, participant);\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : getPeerId(participant.peer);\n const updates = await this.apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: this.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? this.appPeersManager.getInputPeerSelf() : this.appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n\n // do not replace with peerId because it can be null\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = getPeerId(participant.peer);\n this.apiUpdatesManager.processUpdateMessage(updates);\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n\n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n this.appUsersManager.saveApiUsers(groupCall.users);\n this.appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n\n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n\n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n this.rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await this.apiManager.invokeApi('phone.createGroupCall', {\n peer: this.appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n\n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n // public generateSelfParticipant(): GroupCallParticipant {\n // const mainSources = this.currentGroupCall.connections.main.sources;\n // const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n // return {\n // _: 'groupCallParticipant',\n // pFlags: {\n // can_self_unmute: true,\n // self: true\n // },\n // source: mainSources.audio.source,\n // video: this.generateSelfVideo(mainSources.video),\n // presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n // date: tsNow(true),\n // peer: this.appPeersManager.getOutputPeer(rootScope.myId)\n // };\n // }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants',\n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n\n this.appChatsManager.saveApiChats(groupCallParticipants.chats);\n this.appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n\n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public hangUp(id: GroupCallId, discard?: boolean | number) {\n const groupCallInput = this.getGroupCallInput(id);\n let promise: Promise;\n if(typeof(discard) === 'boolean' && discard) {\n promise = this.apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(typeof(discard) === 'number') {\n promise = this.apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: discard\n });\n } else {\n promise = this.apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n return promise.then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public async joinGroupCall(groupCallId: GroupCallId, params: DataJSON, options: GroupCallConnectionInstance['options']) {\n const groupCallInput = this.getGroupCallInput(groupCallId);\n let promise: Promise;\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n return update;\n }\n\n public leaveGroupCallPresentation(groupCallId: GroupCallId) {\n return this.apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: this.getGroupCallInput(groupCallId)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputPhoto} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputMedia} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\nimport getPhotoInput from './getPhotoInput';\n\nexport default function getPhotoMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: getPhotoInput(photo),\n ttl_seconds: 0\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {Document, InputMedia} from '../../../../layer';\r\n\r\nexport default function getMediaInput(doc: Document.document): InputMedia.inputMediaDocument {\r\n return {\r\n _: 'inputMediaDocument',\r\n id: {\r\n _: 'inputDocument',\r\n id: doc.id,\r\n access_hash: doc.access_hash,\r\n file_reference: doc.file_reference\r\n },\r\n ttl_seconds: 0\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDocument} from './appDocsManager';\r\nimport type {MyPhoto} from './appPhotosManager';\r\nimport type {MyTopPeer} from './appUsersManager';\r\nimport {BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessageMedia, MessagesBotResults, ReplyMarkup} from '../../layer';\r\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\r\nimport {AppManager} from './manager';\r\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\nimport generateQId from './utils/inlineBots/generateQId';\r\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\r\nimport {AppMessagesManager} from './appMessagesManager';\r\n\r\nexport class AppInlineBotsManager extends AppManager {\r\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\r\n private setHash: {\r\n [botId: UserId]: {\r\n peerId: PeerId,\r\n time: number\r\n }\r\n } = {};\r\n\r\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\r\n return geo._ === 'geoPoint' ? {\r\n _: 'inputGeoPoint',\r\n lat: geo.lat,\r\n long: geo.long,\r\n accuracy_radius: geo.accuracy_radius\r\n } : {\r\n _: 'inputGeoPointEmpty'\r\n };\r\n }\r\n\r\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\r\n return this.apiManager.invokeApi('messages.getInlineBotResults', {\r\n bot: this.appUsersManager.getUserInput(botId),\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n query,\r\n geo_point: geo ? this.getGeoInput(geo) : undefined,\r\n offset\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((botResults) => {\r\n const queryId = botResults.query_id;\r\n\r\n /* if(botResults.switch_pm) {\r\n botResults.switch_pm.rText = wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\r\n } */\r\n\r\n botResults.results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult') {\r\n if(result.document) {\r\n result.document = this.appDocsManager.saveDoc(result.document);\r\n }\r\n\r\n if(result.photo) {\r\n result.photo = this.appPhotosManager.savePhoto(result.photo);\r\n }\r\n }\r\n\r\n this.inlineResults[generateQId(queryId, result.id)] = result;\r\n });\r\n\r\n return botResults;\r\n });\r\n }\r\n\r\n private pushPopularBot(botId: BotId) {\r\n this.appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\r\n const botPeerId = botId.toPeerId();\r\n const index = topPeers.findIndex((topPeer) => topPeer.id === botPeerId);\r\n let topPeer: MyTopPeer;\r\n if(index !== -1) {\r\n topPeer = topPeers[index];\r\n } else {\r\n topPeer = {\r\n id: botPeerId,\r\n rating: 0\r\n };\r\n }\r\n\r\n ++topPeer.rating;\r\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\r\n\r\n this.appStateManager.setKeyValueToStorage('topPeersCache');\r\n\r\n // rootScope.$broadcast('inline_bots_popular')\r\n });\r\n }\r\n\r\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\r\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\r\n return this.appMessagesManager.startBot(botId, undefined, startParam);\r\n }\r\n\r\n /*\r\n function resolveInlineMention (username) {\r\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\r\n if (peerId.isUser()) {\r\n var bot = AppUsersManager.getUser(peerId)\r\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\r\n var resolvedBot = {\r\n username: username,\r\n id: peerId,\r\n placeholder: bot.bot_inline_placeholder\r\n }\r\n if (bot.pFlags.bot_inline_geo &&\r\n GeoLocationManager.isAvailable()) {\r\n return checkGeoLocationAccess(peerId).then(function () {\r\n return GeoLocationManager.getPosition().then(function (coords) {\r\n resolvedBot.geo = coords\r\n return qSync.when(resolvedBot)\r\n })\r\n })['catch'](function () {\r\n return qSync.when(resolvedBot)\r\n })\r\n }\r\n return qSync.when(resolvedBot)\r\n }\r\n }\r\n return $q.reject()\r\n }, function (error) {\r\n error.handled = true\r\n return $q.reject(error)\r\n })\r\n }\r\n\r\n function regroupWrappedResults (results, rowW, rowH) {\r\n if (!results ||\r\n !results[0] ||\r\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\r\n return\r\n }\r\n var ratios = []\r\n angular.forEach(results, function (result) {\r\n var w\r\n var h, doc\r\n var photo\r\n if (result._ === 'botInlineMediaResult') {\r\n if (doc = result.document) {\r\n w = result.document.w\r\n h = result.document.h\r\n }\r\n else if (photo = result.photo) {\r\n var photoSize = (photo.sizes || [])[0]\r\n w = photoSize && photoSize.w\r\n h = photoSize && photoSize.h\r\n }\r\n }else {\r\n w = result.w\r\n h = result.h\r\n }\r\n if (!w || !h) {\r\n w = h = 1\r\n }\r\n ratios.push(w / h)\r\n })\r\n\r\n var rows = []\r\n var curCnt = 0\r\n var curW = 0\r\n angular.forEach(ratios, function (ratio) {\r\n var w = ratio * rowH\r\n curW += w\r\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\r\n curCnt++\r\n } else {\r\n rows.push(curCnt)\r\n curCnt = 1\r\n curW = w\r\n }\r\n })\r\n if (curCnt) {\r\n rows.push(curCnt)\r\n }\r\n\r\n var i = 0\r\n var thumbs = []\r\n var lastRowI = rows.length - 1\r\n angular.forEach(rows, function (rowCnt, rowI) {\r\n var lastRow = rowI === lastRowI\r\n var curRatios = ratios.slice(i, i + rowCnt)\r\n var sumRatios = 0\r\n angular.forEach(curRatios, function (ratio) {\r\n sumRatios += ratio\r\n })\r\n angular.forEach(curRatios, function (ratio, j) {\r\n var thumbH = rowH\r\n var thumbW = rowW * ratio / sumRatios\r\n var realW = thumbH * ratio\r\n if (lastRow && thumbW > realW) {\r\n thumbW = realW\r\n }\r\n var result = results[i + j]\r\n result.thumbW = Math.floor(thumbW) - 2\r\n result.thumbH = Math.floor(thumbH) - 2\r\n })\r\n\r\n i += rowCnt\r\n })\r\n } */\r\n\r\n public async checkSwitchReturn(botId: BotId) {\r\n const bot = this.appUsersManager.getUser(botId);\r\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\r\n return;\r\n }\r\n\r\n const peerData = this.setHash[botId];\r\n if(peerData) {\r\n delete this.setHash[botId];\r\n if((Date.now() - peerData.time) < 3600e3) {\r\n return peerData.peerId;\r\n }\r\n }\r\n }\r\n\r\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\r\n this.appDraftsManager.setDraft(peerId, threadId, '@' + this.appUsersManager.getUser(botId).username + ' ' + query);\r\n }\r\n\r\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\r\n return this.apiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n msg_id: getServerMessageId(mid),\r\n data: button.data\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true});\r\n }\r\n\r\n /* function gameButtonClick (id) {\r\n var message = AppMessagesManager.getMessage(id)\r\n var peerId = AppMessagesManager.getMessagePeer(message)\r\n\r\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: AppPeersManager.getInputPeerByID(peerId),\r\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\r\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\r\n if (typeof callbackAnswer.message === 'string' &&\r\n callbackAnswer.message.length) {\r\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\r\n }\r\n else if (typeof callbackAnswer.url === 'string') {\r\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\r\n }\r\n })\r\n } */\r\n\r\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: Partial<{\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n replyMarkup: ReplyMarkup,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n clearDraft: true,\r\n scheduleDate: number,\r\n silent: true,\r\n sendAsPeerId: PeerId,\r\n geoPoint: GeoPoint\r\n }> = {}) {\r\n const inlineResult = this.inlineResults[queryAndResultIds];\r\n if(!inlineResult) {\r\n return;\r\n }\r\n\r\n this.pushPopularBot(botId);\r\n const splitted = queryAndResultIds.split('_');\r\n const queryID = splitted.shift();\r\n const resultID = splitted.join('_');\r\n options.viaBotId = botId;\r\n options.queryId = queryID;\r\n options.resultId = resultID;\r\n if(inlineResult.send_message.reply_markup) {\r\n options.replyMarkup = inlineResult.send_message.reply_markup;\r\n }\r\n\r\n if(inlineResult.send_message._ === 'botInlineMessageText') {\r\n options.entities = inlineResult.send_message.entities;\r\n this.appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\r\n } else {\r\n let caption = '';\r\n let inputMedia: Parameters[1], messageMedia: MessageMedia;\r\n const sendMessage = inlineResult.send_message;\r\n switch(sendMessage._) {\r\n case 'botInlineMessageMediaAuto': {\r\n caption = sendMessage.message;\r\n\r\n if(inlineResult._ === 'botInlineMediaResult') {\r\n const {document, photo} = inlineResult;\r\n if(document) {\r\n inputMedia = getDocumentMediaInput(document as MyDocument);\r\n } else {\r\n inputMedia = getPhotoMediaInput(photo as MyPhoto);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaGeo': {\r\n inputMedia = {\r\n _: 'inputMediaGeoPoint',\r\n geo_point: this.getGeoInput(sendMessage.geo)\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaVenue': {\r\n inputMedia = {\r\n _: 'inputMediaVenue',\r\n geo_point: this.getGeoInput(sendMessage.geo),\r\n title: sendMessage.title,\r\n address: sendMessage.address,\r\n provider: sendMessage.provider,\r\n venue_id: sendMessage.venue_id,\r\n venue_type: sendMessage.venue_type\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaContact': {\r\n inputMedia = {\r\n _: 'inputMediaContact',\r\n phone_number: sendMessage.phone_number,\r\n first_name: sendMessage.first_name,\r\n last_name: sendMessage.last_name,\r\n vcard: sendMessage.vcard\r\n };\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaInvoice': {\r\n // const photo = sendMessage.photo;\r\n // inputMedia = {\r\n // _: 'inputMediaInvoice',\r\n // description: sendMessage.description,\r\n // title: sendMessage.title,\r\n // photo: photo && {\r\n // _: 'inputWebDocument',\r\n // attributes: photo.attributes,\r\n // mime_type: photo.mime_type,\r\n // size: photo.size,\r\n // url: photo.url\r\n // },\r\n // invoice: undefined,\r\n // payload: undefined,\r\n // provider: undefined,\r\n // provider_data: undefined,\r\n // start_param: undefined\r\n // };\r\n\r\n messageMedia = {\r\n _: 'messageMediaInvoice',\r\n title: sendMessage.title,\r\n description: sendMessage.description,\r\n photo: sendMessage.photo,\r\n currency: sendMessage.currency,\r\n total_amount: sendMessage.total_amount,\r\n pFlags: {\r\n shipping_address_requested: sendMessage.pFlags.shipping_address_requested,\r\n test: sendMessage.pFlags.test\r\n },\r\n start_param: undefined\r\n };\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(!inputMedia && messageMedia) {\r\n inputMedia = {\r\n _: 'messageMediaPending',\r\n messageMedia\r\n };\r\n }\r\n\r\n this.appMessagesManager.sendOther(peerId, inputMedia, options);\r\n }\r\n }\r\n\r\n /* function checkGeoLocationAccess (botID) {\r\n var key = 'bot_access_geo' + botID\r\n return Storage.get(key).then(function (geoAccess) {\r\n if (geoAccess && geoAccess.granted) {\r\n return true\r\n }\r\n return ErrorService.confirm({\r\n type: 'BOT_ACCESS_GEO_INLINE'\r\n }).then(function () {\r\n var setHash = {}\r\n setHash[key] = {granted: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return true\r\n }, function () {\r\n var setHash = {}\r\n setHash[key] = {denied: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return $q.reject()\r\n })\r\n })\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MESSAGE_ID_INCREMENT} from './utils/messageId';\r\nimport generateMessageId from './utils/messageId/generateMessageId';\r\n\r\nexport class AppMessagesIdsManager {\r\n private tempNum = 0;\r\n\r\n public generateTempMessageId(messageId: number) {\r\n const num = ++this.tempNum;\r\n return generateMessageId(messageId) + (num & (MESSAGE_ID_INCREMENT - 1));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport indexOfAndSplice from './array/indexOfAndSplice';\r\nimport makeError from './makeError';\r\n\r\nexport type Middleware = {\r\n (): boolean;\r\n create(): MiddlewareHelper;\r\n onClean: (callback: VoidFunction) => void;\r\n onDestroy: (callback: VoidFunction) => void;\r\n};\r\n\r\nconst createDetails = (): {\r\n cleaned?: boolean,\r\n inner: MiddlewareHelper[],\r\n onCleanCallbacks: VoidFunction[]\r\n} => ({\r\n cleaned: false,\r\n inner: [],\r\n onCleanCallbacks: []\r\n});\r\n\r\nconst MIDDLEWARE_ERROR = makeError('MIDDLEWARE');\r\n\r\n// * onClean == cancel promises, etc\r\n// * onDestroy == destructor\r\nexport class MiddlewareHelper {\r\n private details = createDetails();\r\n private onDestroyCallbacks: VoidFunction[] = [];\r\n private parent: MiddlewareHelper;\r\n private destroyed: boolean;\r\n\r\n public clean() {\r\n const details = this.details;\r\n details.cleaned = true;\r\n details.inner.splice(0, details.inner.length).forEach((helper) => helper.destroy());\r\n details.onCleanCallbacks.splice(0, details.onCleanCallbacks.length).forEach((callback) => callback());\r\n this.details = createDetails();\r\n }\r\n\r\n public destroy() {\r\n this.destroyed = true;\r\n this.clean();\r\n this.onDestroyCallbacks.splice(0, this.onDestroyCallbacks.length).forEach((callback) => callback());\r\n\r\n if(this.parent) {\r\n indexOfAndSplice(this.parent.details.inner, this);\r\n this.parent = undefined;\r\n }\r\n }\r\n\r\n public get(additionalCallback?: () => boolean) {\r\n const details = this.details;\r\n\r\n const middleware: Middleware = () => {\r\n return !details.cleaned && (!additionalCallback || additionalCallback());\r\n };\r\n\r\n middleware.create = () => {\r\n if(!middleware()) throw MIDDLEWARE_ERROR;\r\n const helper = new MiddlewareHelper();\r\n helper.parent = this;\r\n details.inner.push(helper);\r\n return helper;\r\n };\r\n\r\n middleware.onClean = (callback) => {\r\n if(!middleware()) return callback();\r\n details.onCleanCallbacks.push(callback);\r\n };\r\n\r\n middleware.onDestroy = this.onDestroy;\r\n\r\n return middleware;\r\n }\r\n\r\n public onDestroy = (callback: VoidFunction) => {\r\n if(this.destroyed) return callback();\r\n this.onDestroyCallbacks.push(callback);\r\n };\r\n}\r\n\r\n// * will change .cleaned and new instance will be created\r\nexport function getMiddleware() {\r\n return new MiddlewareHelper();\r\n}\r\n","export default function splitStringByLength(str: string, maxLength: number) {\n if(str.length < maxLength) return [str];\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\n const delimiter = ' ';// '\\n';\n const out: string[] = [];\n\n const cut = (end?: number) => {\n let part = str.slice(lastSliceStartIndex, end);\n const _arrayIndex = arrayIndex++;\n if(part.length > maxLength) {\n const overflowPart = part.slice(maxLength);\n const splitted = splitStringByLength(overflowPart, maxLength);\n splitted.forEach((part) => {\n out[arrayIndex++] = part;\n });\n\n part = part.slice(0, maxLength);\n }\n\n lastSliceStartIndex = end;\n length = 0;\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\n };\n\n let lastIndex = 0;\n do {\n let index = str.indexOf(delimiter, lastIndex);\n if(index === -1) {\n if(lastIndex !== (str.length - 1)) {\n cut();\n }\n\n break;\n }\n\n index += delimiter.length;\n\n const partLength = index - lastIndex;\n if((length + partLength) > maxLength) {\n cut(length);\n }\n\n lastIndex = index;\n length += partLength;\n } while(true);\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {TabState} from '../mtproto/mtprotoworker';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\ntype Tab = {\n source: MessageEventSource,\n state: TabState\n};\n\nexport class AppTabsManager {\n private tabs: Map;\n\n constructor() {\n this.tabs = new Map();\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('tabState', (state, source) => {\n const tab = this.tabs.get(source);\n tab.state = state;\n });\n }\n\n public getTabs() {\n return [...this.tabs.values()].filter((tab) => !!tab.state);\n }\n\n public addTab(source: MessageEventSource) {\n const tab: Tab = {\n source,\n state: undefined\n };\n\n this.tabs.set(source, tab);\n }\n\n public deleteTab(source: MessageEventSource) {\n this.tabs.delete(source);\n }\n}\n\nconst appTabsManager = new AppTabsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appTabsManager = appTabsManager);\nexport default appTabsManager;\n","import {InputDocument} from '../../../../layer';\nimport type {MyDocument} from '../../appDocsManager';\n\nexport default function getDocumentInput(doc: MyDocument): InputDocument {\n return {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LazyLoadQueueBase from '../../components/lazyLoadQueueBase';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport tsNow from '../../helpers/tsNow';\nimport {randomLong} from '../../helpers/random';\nimport {Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer, MessageReactions, Document, InputFile, Reaction} from '../../layer';\nimport {ArgumentTypes, InvokeApiOptions} from '../../types';\nimport {logger, LogTypes} from '../logger';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {GLOBAL_FOLDER_ID} from '../storages/dialogs';\nimport {ChatRights} from './appChatsManager';\nimport {MyDocument} from './appDocsManager';\nimport {MyPhoto} from './appPhotosManager';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport DEBUG from '../../config/debug';\nimport SlicedArray, {Slice, SliceEnd} from '../../helpers/slicedArray';\nimport {FOLDER_ID_ALL, MUTE_UNTIL, NULL_PEER_ID, REAL_FOLDER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID, THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n// import telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {getMiddleware} from '../../helpers/middleware';\nimport assumeType from '../../helpers/assumeType';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport splitStringByLength from '../../helpers/string/splitStringByLength';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {AppManager} from './manager';\nimport type {MediaSize} from '../../helpers/mediaSize';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport mergeEntities from '../richTextProcessor/mergeEntities';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport filterMessagesByInputFilter from './utils/messages/filterMessagesByInputFilter';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\nimport getDocumentInputFileName from './utils/docs/getDocumentInputFileName';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport type {Progress} from './appDownloadManager';\nimport noop from '../../helpers/noop';\nimport appTabsManager from './appTabsManager';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getAlbumText from './utils/messages/getAlbumText';\nimport pause from '../../helpers/schedulers/pause';\nimport makeError from '../../helpers/makeError';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\n\n// console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: number[],\n isEnd: ReturnType['getEnds']>,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty'\n | 'inputMessagesFilterPhotos'\n | 'inputMessagesFilterPhotoVideo'\n | 'inputMessagesFilterVideo'\n | 'inputMessagesFilterDocument'\n | 'inputMessagesFilterVoice'\n | 'inputMessagesFilterRoundVoice'\n | 'inputMessagesFilterRoundVideo'\n | 'inputMessagesFilterMusic'\n | 'inputMessagesFilterUrl'\n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map & {peerId: PeerId, type: MessagesStorageType, key: MessagesStorageKey};\nexport type MessagesStorageType = 'scheduled' | 'history' | 'grouped';\nexport type MessagesStorageKey = `${PeerId}_${MessagesStorageType}`;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\ntype MapValueType = A extends Map ? V : never;\n\nexport type BatchUpdates = {\n 'messages_reactions': AppMessagesManager['batchUpdateReactions'],\n 'messages_views': AppMessagesManager['batchUpdateViews']\n};\n\ntype PendingMessageDetails = {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage,\n sequential?: boolean\n};\n\nconst processAfter = (cb: () => void) => {\n // setTimeout(cb, 0);\n cb();\n};\n\nconst UPDATE_STICKERSET_ORDER = true;\n\nexport class AppMessagesManager extends AppManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n private groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n private pinnedMessages: {[peerId: PeerId]: PinnedStorage};\n\n private threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: PendingMessageDetails\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise,\n callback: (message: MyMessage) => Promise\n }>\n }\n } = {};\n\n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise = null;\n private extendedMedia: Map>> = new Map();\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: Map = new Map();\n public newUpdatesAfterReloadToHandle: {[peerId: PeerId]: Set} = {};\n\n private notificationsHandlePromise = 0;\n private notificationsToHandle: {[peerId: PeerId]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n private groupedTempId = 0;\n\n private typings: {[peerId: PeerId]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[peerId: PeerId]: SlicedArray} = {};\n private goToNextMentionPromises: {[peerId: PeerId]: Promise} = {};\n\n private batchUpdates: {\n [k in keyof BatchUpdates]?: {\n callback: BatchUpdates[k],\n batch: ArgumentTypes[0]\n }\n } = {};\n private batchUpdatesDebounced: () => Promise;\n\n private uploadFilePromises: {[fileName: string]: CancellablePromise};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateMessageReactions: this.onUpdateMessageReactions,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages,\n\n updateMessageExtendedMedia: this.onUpdateMessageExtendedMedia\n });\n\n // ! Invalidate notify settings, can optimize though\n this.rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: Dialog) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => this.appPeersManager.isBroadcast(dialog.peerId);\n else filterFunc = (dialog) => this.appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach((dialog) => {\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n this.rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage',\n webpage: this.appWebPagesManager.getCachedWebPage(id)\n };\n\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n });\n });\n\n this.rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n if(threadId) return;\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n if(!threadId) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog(dialog);\n }\n\n this.rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft\n });\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n this.rootScope.addEventListener('poll_update', ({poll}) => {\n const set = this.appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n }\n });\n\n this.batchUpdatesDebounced = debounce(() => {\n for(const event in this.batchUpdates) {\n const details = this.batchUpdates[event as keyof BatchUpdates];\n delete this.batchUpdates[event as keyof BatchUpdates];\n\n // @ts-ignore\n const result = details.callback(details.batch);\n if(result && (!(result instanceof Array) || result.length)) {\n // @ts-ignore\n rootScope.dispatchEvent(event as keyof BatchUpdates, result);\n }\n }\n }, 33, false, true);\n\n return this.appStateManager.getState().then((state) => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear = (init?: boolean) => {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n this.uploadFilePromises = {};\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear(init);\n this.filtersStorage && this.filtersStorage.clear(init);\n };\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = this.appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: MyMessage) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {});\n const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise()});\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n // this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n const entities = options.entities || [];\n if(text) {\n text = parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return this.apiManager.invokeApi('messages.editMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n\n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public async sendText(peerId: PeerId, text: string, options: Partial<{\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n scheduleDate: number,\n silent: true,\n sendAsPeerId: PeerId,\n }> = {}): Promise {\n if(!text.trim()) {\n return;\n }\n\n options.entities ??= [];\n\n // this.checkSendOptions(options);\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const config = await this.apiManager.getConfig();\n const MAX_LENGTH = config.message_length_max;\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n if(splitted.length > 1) {\n if(options.webPage?._ === 'webPage' && !text.includes(options.webPage.url)) {\n delete options.webPage;\n }\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n const entities = options.entities;\n if(!options.viaBotId) {\n text = parseMarkdown(text, entities);\n // entities = mergeEntities(entities, parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = this.appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError();\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent,\n send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }, sentRequestOptions);\n }\n\n /* function is(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n // this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n // this.log('sendText sent', message.mid);\n // if(is(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n // assumeType(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n defineNotNumerableProperties(message, ['promise']);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n message.promise.resolve();\n }, (error: ApiError) => {\n toggleError(error);\n message.promise.reject(error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n const promises: ReturnType[] = [message.promise];\n for(let i = 1; i < splitted.length; ++i) {\n promises.push(this.sendText(peerId, splitted[i], options));\n }\n\n return Promise.all(promises).then(noop);\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: boolean,\n silent: boolean,\n clearDraft: boolean,\n scheduleDate: number,\n noSound: boolean,\n\n waveform: Uint8Array,\n\n // ! only for internal use\n processAfter?: typeof processAfter\n }> = {}) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = getEnvironment().IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n const 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: THUMB_TYPE_FULL,\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n const cacheContext = this.thumbsStorage.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n photo = this.appPhotosManager.savePhoto(photo);\n } else if(getEnvironment().VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage,\n supports_streaming: true\n },\n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound &&\n file.size > (10 * 1024) &&\n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n if(options.objectURL) {\n const cacheContext = this.thumbsStorage.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL;\n }\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: THUMB_TYPE_FULL,\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = this.thumbsStorage.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n\n document = this.appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const sentDeferred = deferredPromise();\n // sentDeferred.cancel = () => {\n // const error = new Error('Download canceled');\n // error.name = 'AbortError';\n // sentDeferred.reject(error);\n\n // if(uploadPromise?.cancel) {\n // uploadPromise.cancel();\n // }\n // };\n\n const media: MessageMedia = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n // preloader,\n photo,\n document\n };\n\n if(media) {\n defineNotNumerableProperties(media as any, ['promise']);\n (media as any).promise = sentDeferred;\n }\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file\n } as MessageMedia.messageMediaDocument : media;\n\n const uploadingFileName = !isDocument ? getFileNameForUpload(file) : undefined;\n message.uploadingFileName = uploadingFileName;\n\n if(uploadingFileName) {\n this.uploadFilePromises[uploadingFileName] = sentDeferred;\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: getDocumentInput(file)\n };\n\n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n\n uploadPromise = this.apiFileManager.upload({file, fileName: uploadingFileName});\n uploadPromise.catch((err) => {\n if(!uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n sentDeferred.reject(err);\n }\n });\n\n uploadPromise.addNotifyListener((progress: Progress) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0});\n }\n sentDeferred.notifyAll(progress);\n });\n\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL && options.thumb?.blob) {\n thumbUploadPromise = this.apiFileManager.upload({file: options.thumb.blob});\n }\n\n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto',\n file: inputFile\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument',\n file: inputFile,\n mime_type: fileType,\n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : undefined\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n\n sentDeferred.resolve(inputMedia);\n }, (error: ApiError) => {\n toggleError(error);\n throw error;\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 processAfter: options.processAfter\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then((inputMedia) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n return this.apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\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(error);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n const ret: {\n message: typeof message,\n promise: typeof sentDeferred\n } = {\n message\n } as any;\n\n defineNotNumerableProperties(ret, ['promise']);\n ret.promise = sentDeferred;\n\n return ret;\n }\n\n public async sendAlbum(peerId: PeerId, files: File[], options: Partial<{\n isMedia: true,\n entities: MessageEntity[],\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n caption: string,\n sendFileDetails: Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumbBlob: Blob,\n thumbURL: string\n }>[],\n silent: true,\n clearDraft: true,\n scheduleDate: number\n }> = {}) {\n // this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', files, options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const callbacks: Array<() => void> = [];\n const processAfter = (cb: () => void) => {\n callbacks.push(cb);\n };\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 processAfter,\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 callbacks.push(() => {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n });\n }\n\n callbacks.forEach((callback) => {\n callback();\n });\n\n // * test pending\n // return;\n\n const toggleError = (message: Message.message, error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return this.apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error: ApiError) => {\n messages.forEach((message) => toggleError(message, error));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return this.apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then((messageMedia) => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = this.appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = getPhotoMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = this.appDocsManager.saveDoc(messageMedia.document);\n inputMedia = getDocumentMediaInput(doc);\n }\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: ApiError) => {\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, err);\n throw err;\n });\n });\n\n return Promise.all(promises).then((inputs) => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, this.appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(peerId: PeerId, inputMedia: InputMedia | {_: 'messageMediaPending', messageMedia: MessageMedia}, options: Partial<{\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n scheduleDate: number,\n silent: true,\n geoPoint: GeoPoint,\n sendAsPeerId: PeerId,\n }> = {}) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n this.appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = this.appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: this.appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = this.appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n\n case 'messageMediaPending': {\n media = (inputMedia as any).messageMedia;\n break;\n }\n }\n\n message.media = media;\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia as 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 update_stickersets_order: UPDATE_STICKERSET_ORDER\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n toggleError(error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n return message.promise;\n }\n\n /* 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: boolean,\n isScheduled: boolean,\n threadId: number,\n clearDraft: boolean,\n sequential: boolean,\n processAfter?: (cb: () => void) => void\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n message.storageKey = storage.key;\n const callbacks: Array<() => void> = [];\n if(options.isScheduled) {\n // if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n callbacks.push(() => {\n this.rootScope.dispatchEvent('scheduled_new', message);\n });\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 this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n callbacks.push(() => {\n this.rootScope.dispatchEvent('history_append', {storageKey: storage.key, message});\n });\n }\n\n const pending: PendingMessageDetails = this.pendingByRandomId[message.random_id] = {\n peerId,\n tempId: messageId,\n threadId: options.threadId,\n storage,\n sequential: options.sequential\n };\n\n this.pendingTopMsgs[peerId] = messageId;\n\n if(!options.isGroupedItem && message.send) {\n callbacks.push(() => {\n if(options.clearDraft) {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n });\n }\n\n if(callbacks.length) {\n (options.processAfter || processAfter)(() => {\n for(const callback of callbacks) {\n callback();\n }\n });\n }\n\n return pending;\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: Partial<{\n scheduleDate: number,\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = this.appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = this.appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: options.sendAsPeerId ? this.appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor,\n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + this.timeManager.getServerTimeOffset()),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true\n };\n\n defineNotNumerableProperties(message, ['send', 'promise']);\n if(options.groupId === undefined) {\n message.promise = deferredPromise();\n }\n\n return message;\n }\n\n private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {\n const header = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId\n } as MessageReplyHeader;\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(this.appPeersManager.isBroadcast(peerId)) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(this.appPeersManager.isAnyChat(peerId) && (this.appPeersManager.isBroadcast(peerId) || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = this.appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!this.appPeersManager.isChannel(peerId) && !this.appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(this.appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = this.appUsersManager.getSelf().id.toPeerId();\n const fromId = originalMessage.fromId;\n if(fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n let isUserHidden = false;\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.post_author = originalMessage.post_author;\n\n if(fromId.isUser()) {\n const userFull = this.appProfileManager.getCachedFullUser(fromId.toUserId());\n if(userFull?.private_forward_name) {\n fwdHeader.from_name = userFull.private_forward_name;\n isUserHidden = true;\n }\n }\n\n if(!isUserHidden) {\n fwdHeader.from_id = this.appPeersManager.getOutputPeer(fromId);\n }\n }\n\n if(this.appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n\n if(peerId === myId && !isUserHidden) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = this.appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message: Message.messageService = {\n _: 'messageService',\n pFlags: {},\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n id: maxId,\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n };\n\n this.getHistoryMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public getUploadPromise(uploadFileName: string) {\n return this.uploadFilePromises[uploadFileName];\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n return peerId.isAnyChat() && this.appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\n if(dialog) {\n dialog.top_message = message.mid;\n\n const historyStorage = this.getHistoryStorage(message.peerId);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n\n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = getPeerId(dialog.peer);\n const mid = generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n\n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach((dialog) => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n\n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n }\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages(limit: number, folderId: REAL_FOLDER_ID, offsetDate?: number) {\n // const dialogs = this.dialogsStorage.getFolder(folderId);\n const offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n if(offsetDate === undefined) {\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n }\n\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += this.timeManager.getServerTimeOffset();\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n const params: MessagesGetDialogs = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n };\n\n return this.apiManager.invokeApiSingle('messages.getDialogs', params, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n }).then((dialogsResult) => {\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\n }\n\n // can reset pinned order here\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!offsetDate) {\n // telegramMeWebManager.setAuthorized(true);\n this.appDraftsManager.addMissedDialogs();\n }\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: Map = new Map();\n const setFolderId: REAL_FOLDER_ID = folderId === GLOBAL_FOLDER_ID ? FOLDER_ID_ALL : folderId;\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\n forEachReverse((dialogsResult.dialogs as Dialog[]), (dialog) => {\n // const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(dialog.folder_id === undefined) {\n dialog.folder_id = setFolderId;\n }\n\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\n\n if(!maxSeenIdIncremented &&\n !this.appPeersManager.isChannel(dialog.peerId || this.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(offsetIndex && getDialogIndex(dialog) > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!getServerMessageId(dialog.read_inbox_max_id) && !getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs.set(dialog.peerId, dialog);\n\n this.log.error('noIdsDialogs', dialog, params);\n }\n });\n\n if(noIdsDialogs.size) {\n // setTimeout(() => { // test bad situation\n const peerIds = [...noIdsDialogs.keys()];\n const promises = peerIds.map((peerId) => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n this.rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n\n for(let i = 0; i < peerIds.length; ++i) {\n const peerId = peerIds[i];\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog: this.getDialogOnly(peerId)\n });\n }\n });\n // }, 10e3);\n }\n\n const count = (dialogsResult as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n if(getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */\n !count ||\n dialogsLength >= count ||\n !dialogsResult.dialogs.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map());\n }\n\n const dialogs = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1],\n count,\n dialogs: slicedDialogs\n };\n });\n }\n\n public async forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\n withMyScore: true,\n silent: true,\n scheduleDate: number,\n dropAuthor: boolean,\n dropCaptions: boolean,\n sendAsPeerId: PeerId,\n replyToMsgId?: number, // will be ignored\n threadId?: number // will be ignored\n }> = {}) {\n delete options.replyToMsgId;\n delete options.threadId;\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n --length;\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMids: number[] = [];\n const newMessages = mids.map((mid) => {\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n newMids.push(message.id);\n\n const keys: Array = [\n 'entities',\n 'media'\n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n\n if(message.fwd_from?.from_name && peerId === this.appPeersManager.peerId) {\n delete message.from_id;\n }\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n const replyToMid = originalMessage.reply_to?.reply_to_msg_id;\n const replyToMessageIdx = mids.indexOf(replyToMid);\n if(replyToMid && replyToMessageIdx !== -1) {\n const newReplyToMid = newMids[replyToMessageIdx];\n message.reply_to = {\n _: 'messageReplyHeader',\n reply_to_msg_id: newReplyToMid\n };\n\n /* this.invokeAfterMessageIsSent(newReplyToMid, 'reply', async(originalMessage) => {\n message.reply_to.reply_to_msg_id = originalMessage.mid;\n }); */\n }\n\n keys.forEach((key) => {\n // @ts-ignore\n message[key] = copy(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 if(document.sticker && !this.rootScope.premium) {\n const effectThumb = getStickerEffectThumb(document);\n if(effectThumb) {\n (message.media as MessageMedia.messageMediaDocument).pFlags.nopremium = true;\n }\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ?? (groups[originalMessage.grouped_id] = {tempId: '' + ++this.groupedTempId, messages: []});\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach((message) => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach((message) => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n sequential: true\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */this.apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: this.appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n random_id: newMessages.map((message) => message.random_id),\n to_peer: this.appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n this.onMessagesSendError(newMessages, error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.forwardMessages(peerId, fromPeerId, overflowMids, options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public generateEmptyMessage(mid: number): Message.message | Message.messageService {\n return undefined;\n // return {\n // _: 'messageEmpty',\n // id: getServerMessageId(mid),\n // mid,\n // deleted: true,\n // pFlags: {}\n // };\n }\n\n private onMessagesSendError(messages: Message.message[], error?: ApiError) {\n messages.forEach((message) => {\n if(message.error === error) {\n return;\n }\n\n if(error) {\n message.error = error;\n this.rootScope.dispatchEvent('message_error', {storageKey: message.storageKey, tempId: message.mid, error});\n\n const dialog = this.getDialogOnly(message.peerId);\n if(dialog) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId: message.peerId, dialog});\n }\n } else {\n delete message.error;\n }\n });\n }\n\n public getMessagesStorageByKey(key: MessagesStorageKey) {\n const s = key.split('_');\n const peerId: PeerId = +s[0];\n const type: MessagesStorageType = s[1] as any;\n return type === 'scheduled' ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n }\n\n public getMessageFromStorage(storage: MessagesStorage | MessagesStorageKey, mid: number) {\n if(typeof(storage) === 'string') {\n storage = this.getMessagesStorageByKey(storage);\n }\n\n return storage && storage.get(mid)/* || this.generateEmptyMessage(mid) */;\n }\n\n private createMessageStorage(peerId: PeerId, type: MessagesStorageType) {\n const storage: MessagesStorage = new Map() as any;\n storage.peerId = peerId;\n storage.type = type;\n storage.key = `${peerId}_${type}`;\n\n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num,\n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getHistoryMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ?? (this.messagesStorageByPeerId[peerId] = this.createMessageStorage(peerId, 'history'));\n }\n\n public getMessagesStorage(key: MessagesStorageKey | MessagesStorage): MessagesStorage {\n if(typeof(key) === 'object') {\n return key;\n } else {\n return this.getMessagesStorageByKey(key);\n }\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(this.appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getHistoryMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && this.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 cantForwardDeleteMids(storageKey: MessagesStorageKey, mids: number[]) {\n const storage = this.getMessagesStorage(storageKey);\n let cantForward = !mids.length, cantDelete = !mids.length;\n for(const mid of mids) {\n const message = this.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.canForward(message);\n }\n\n if(!cantDelete) {\n cantDelete = !this.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n return {cantForward, cantDelete};\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = this.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: this.appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = pause(0).then(() => {\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 return this.apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n\n // fullfillLeft();\n // resolve();\n }, (err) => {\n // fullfillLeft();\n // resolve();\n // reject(err);\n }).then(() => {\n fullfillLeft();\n\n this.reloadConversationsPromise = null;\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise {\n return this.apiManager.invokeApiSingle('messages.deleteHistory', {\n just_clear,\n revoke,\n peer,\n max_id: 0\n }).then((affectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peer, just_clear, revoke);\n });\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\n if(this.appPeersManager.isChannel(peerId)) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = await promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return this.apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: this.appChatsManager.getChannelInput(channelId),\n max_id: getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(this.appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\n this.flushStoragesByPeerId(peerId);\n\n if(justClear) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog: this.getDialogOnly(peerId)});\n } else {\n delete this.notificationsToHandle[peerId];\n delete this.typings[peerId];\n\n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n });\n }\n\n private flushStoragesByPeerId(peerId: PeerId) {\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 needSingleMessages = this.needSingleMessages.get(peerId);\n if(needSingleMessages) {\n for(const [mid, promise] of needSingleMessages) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n\n needSingleMessages.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\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n this.appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n this.rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessage(peerId: PeerId) {\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1\n }).then((result) => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public getPinnedMessagesCount(peerId: PeerId) {\n return this.pinnedMessages[peerId]?.count;\n }\n\n public getPinnedMessagesMaxId(peerId: PeerId) {\n return this.pinnedMessages[peerId]?.maxId;\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return this.apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: getServerMessageId(mid)\n }).then((updates) => {\n // this.log('pinned updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return this.apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId)\n }).then((affectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getHistoryMessagesStorage(peerId);\n storage.forEach((message) => {\n if((message as Message.message).pFlags.pinned) {\n delete (message as Message.message).pFlags.pinned;\n }\n });\n\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[peerId];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n return getAlbumText(Array.from(group.values()) as Message.message[]);\n }\n\n public getGroupsFirstMessage(message: Message.message) {\n if(!message?.grouped_id) return message;\n\n const storage = this.groupedMessagesStorage[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return this.getMessageFromStorage(storage, minMid) as Message.message;\n }\n\n public getMidsByAlbum(groupedId: string, sort: 'asc' | 'desc' = 'asc') {\n return getObjectKeysAndSort(this.groupedMessagesStorage[groupedId], sort);\n }\n\n public getMessagesByAlbum(groupedId: string) {\n const mids = this.getMidsByAlbum(groupedId, 'asc');\n const storage = this.groupedMessagesStorage[groupedId];\n return mids.map((mid) => this.getMessageFromStorage(storage, mid) as Message.message);\n }\n\n public getMidsByMessage(message: Message) {\n if(!message) return [];\n else if((message as Message.message).grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: MyMessage, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if((message as Message.message).grouped_id) {\n const storage = this.groupedMessagesStorage[(message as Message.message).grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return this.appMessagesIdsManager.generateTempMessageId(dialog?.top_message || 0);\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n // isNew: boolean, // * new - from update\n }> = {}) {\n if(!message || message._ === 'messageEmpty') {\n return;\n }\n\n message.pFlags ??= {};\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getHistoryMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && this.appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n\n const mid = generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ?? (this.groupedMessagesStorage[message.grouped_id] = this.createMessageStorage(peerId, 'grouped'));\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out ?\n 'read_outbox_max_id' :\n 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n if(message.reply_to) {\n if(message.reply_to.reply_to_msg_id) {\n message.reply_to.reply_to_msg_id = message.reply_to_mid = generateMessageId(message.reply_to.reply_to_msg_id);\n }\n\n if(message.reply_to.reply_to_top_id) {\n message.reply_to.reply_to_top_id = generateMessageId(message.reply_to.reply_to_top_id);\n }\n }\n\n const replies = isMessage && message.replies;\n if(replies) {\n if(replies.max_id) replies.max_id = generateMessageId(replies.max_id);\n if(replies.read_max_id) replies.read_max_id = generateMessageId(replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= this.timeManager.getServerTimeOffset();\n }\n\n // storage.generateIndex(message);\n const myId = this.appPeersManager.peerId;\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? this.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 : this.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 = generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = this.appPeersManager.getPeerId(peer);\n const savedFromMid = generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = this.appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= this.timeManager.getServerTimeOffset();\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find((entity) => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n let unsupported = false;\n const media = isMessage && message.media;\n if(media) {\n switch(media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n media.photo = this.appPhotosManager.savePhoto(media.photo, mediaContext);\n }\n\n if(!(media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n\n break;\n }\n\n case 'messageMediaPoll': {\n const result = this.appPollsManager.savePoll(media.poll, media.results, message);\n media.poll = result.poll;\n media.results = result.results;\n break;\n }\n\n case 'messageMediaDocument': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = media.document;\n media.document = this.appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!media.document && originalDoc._ !== 'documentEmpty') {\n unsupported = true;\n }\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n media.webpage = this.appWebPagesManager.saveWebPage(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 media.photo = this.appWebDocsManager.saveWebDocument(media.photo);\n const extendedMedia = media.extended_media;\n if(extendedMedia?._ === 'messageExtendedMedia') {\n const extendedMediaMedia = extendedMedia.media;\n (extendedMediaMedia as MessageMedia.messageMediaPhoto).photo = this.appPhotosManager.savePhoto((extendedMediaMedia as MessageMedia.messageMediaPhoto).photo, mediaContext);\n (extendedMediaMedia as MessageMedia.messageMediaDocument).document = this.appDocsManager.saveDoc((extendedMediaMedia as MessageMedia.messageMediaDocument).document, mediaContext);\n }\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n }\n\n // if(isMessage && !unsupported && message.entities) {\n // unsupported = message.entities.some((entity) => entity._ === 'messageEntityCustomEmoji');\n // }\n\n if(isMessage && unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n const suffix = message.fromId === this.appUsersManager.getSelf().id ? 'You' : '';\n let migrateFrom: PeerId, migrateTo: PeerId;\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = this.appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = this.appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n // case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n\n case 'messageActionGroupCall': {\n // assumeType(action);\n\n this.appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n // apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type =\n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed' ?\n 'missed' :\n 'cancelled'\n )\n );\n break;\n }\n\n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message);\n }\n\n storage.set(mid, message);\n\n return message;\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n // isNew: boolean, // * new - from update\n }> = {}): (Message.message | Message.messageService)[] {\n if((messages as any).saved) return messages;\n (messages as any).saved = true;\n messages.forEach((message, idx, arr) => {\n arr[idx] = this.saveMessage(message, options);\n });\n\n return messages;\n }\n\n public async getFirstMessageToEdit(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMessage: Message.message | Message.messageService;\n const myPeerId = this.appPeersManager.peerId;\n for(const mid of slice) {\n const message = this.getMessageByPeer(peerId, mid);\n const good = myPeerId === peerId ? message.fromId === myPeerId : message.pFlags.out;\n\n if(good) {\n if(await this.canEditMessage(message, 'text')) {\n goodMessage = message;\n break;\n }\n\n // * this check will allow editing only last message\n // break;\n }\n }\n\n return goodMessage;\n }\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = fixEmoji(message.message, apiEntities);\n\n const myEntities = parseEntities(message.message);\n message.totalEntities = mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return this.apiManager.invokeApiSingle('messages.report', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return this.apiManager.invokeApi('messages.startBot', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error: ApiError) => {\n if(error?.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n const bot = this.appUsersManager.getUser(botId);\n return this.sendText(peerId, str + '@' + bot.username);\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n this.apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map((peerId) => {\n return {\n _: 'inputFolderPeer',\n peer: this.appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then((updates) => {\n // this.log('editPeerFolders updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public getFilter(filterId: number) {\n return this.filtersStorage.getFilter(filterId);\n }\n\n public async toggleDialogPin(peerId: PeerId, filterId?: number) {\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = await this.apiManager.getLimit(filterId === 1 ? 'folderPin' : 'pin');\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n return Promise.reject(makeError('PINNED_DIALOGS_TOO_MUCH'));\n }\n }\n\n return this.apiManager.invokeApi('messages.toggleDialogPin', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then((bool) => {\n if(bool) {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n this.apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: this.appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n }\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return this.apiManager.invokeApi('messages.markDialogUnread', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then((bool) => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: this.appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n this.appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat: Chat.chat = this.appChatsManager.getChat(migrateFrom.toChatId());\n if(fromChat?.migrated_to && (fromChat.migrated_to as InputChannel.inputChannel).channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n this.rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n }\n }\n }\n\n private canMessageBeEdited(message: Message, kind: 'text' | 'poll') {\n if((message as Message.message)?.pFlags?.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(!message ||\n message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && this.appUsersManager.isBot(message.fromId)) {\n return false;\n }\n\n if(message.media?._ === 'messageMediaDocument' &&\n ((message.media.document as Document.document).sticker || (message.media.document as Document.document).type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public async canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === this.appUsersManager.getSelf().id) {\n return true;\n }\n\n if(!message.pFlags.out || (\n message.peer_id._ !== 'peerChannel' &&\n message.date < (tsNow(true) - (await this.apiManager.getConfig()).edit_time_limit) &&\n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() ||\n message.pFlags.out ||\n this.appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' ||\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && (!message.pFlags.is_outgoing || !!message.error);\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n if(!message) {\n return false;\n }\n\n const 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 = this.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 this.appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(peerId: PeerId, filters: MessagesFilter[], canCache = true): Promise {\n if(this.appPeersManager.isRestricted(peerId)) {\n return Promise.resolve(filters.map((filter) => {\n return {\n _: 'messages.searchCounter',\n pFlags: {},\n filter: filter,\n count: 0\n };\n }));\n }\n\n const func = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n return func('messages.getSearchCounters', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n filters\n });\n }\n\n public filterMessagesByInputFilterFromStorage(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage | MessagesStorageKey, limit: number) {\n const _storage = this.getMessagesStorage(storage);\n return filterMessagesByInputFilter(inputFilter, history.map((mid) => _storage.get(mid)), limit);\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(this.appPeersManager.isRestricted(peerId)/* || true */) {\n return Promise.resolve({\n count: 0,\n offset_id_offset: 0,\n next_rate: undefined,\n history: []\n });\n }\n\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n // this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n // const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ?\n this.getSearchStorage(peerId, inputFilter._) as any :\n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilterFromStorage(inputFilter._, storage.history.slice, this.getHistoryMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: getServerMessageId(threadId) || 0\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n // var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n const offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n // offsetDate = offsetMessage.date + timeManager.getServerTimeOffset();\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n this.appUsersManager.saveApiUsers(searchResult.users);\n this.appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter((mid) => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: this.appMessagesIdsManager.generateTempMessageId(maxMessageId),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n }\n\n public getThreadServiceMessageId(peerId: PeerId, threadId: number) {\n return this.threadsServiceMessagesIdsStorage[peerId + '_' + threadId];\n }\n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((result) => {\n this.appChatsManager.saveApiChats(result.chats);\n this.appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.getMessageWithReplies(result.messages[0] as Message.message);\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n\n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n result.max_id = historyStorage.maxId = generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = generateMessageId(result.read_outbox_max_id) || 0;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(message: MyMessage) {\n this.rootScope.dispatchEvent('history_multiappend', message);\n }\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const map = this.newDialogsToHandle;\n for(const [peerId, dialog] of map) {\n let good = false;\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n } else if(this.dialogsStorage.getDialogOnly(peerId)) { // * dialog can be already dropped\n this.dialogsStorage.pushDialog(dialog);\n if(!this.appPeersManager.isChannel(peerId)) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n\n good = true;\n }\n\n if(!good) {\n map.delete(peerId);\n }\n }\n\n // this.log('after order:', this.dialogsStorage[0].map((d) => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n this.rootScope.dispatchEvent('dialogs_multiupdate', map);\n this.newDialogsToHandle.clear();\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\n if(peerId !== undefined) {\n this.newDialogsToHandle.set(peerId, dialog);\n }\n\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\n return this.newDialogsHandlePromise = pause(0).then(() => {\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n });\n }\n\n public async deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n const localMessageIds = mids.map((mid) => getServerMessageId(mid));\n\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = this.apiManager.invokeApi('channels.deleteMessages', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = this.apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.deleteMessages(peerId, overflowMids, revoke));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n if(!this.getReadMaxIdIfUnread(peerId, threadId)) {\n if(!force && !threadId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog && this.isDialogUnread(dialog)) {\n force = true;\n }\n }\n\n if(!force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readDiscussion', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(threadId),\n read_max_id: getServerMessageId(maxId)\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(this.appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('channels.readHistory', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: getServerMessageId(maxId)\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: getServerMessageId(maxId)\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n this.rootScope.dispatchEvent('notification_reset', this.appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\n const slicedArray = this.unreadMentions[peerId];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray) {\n const dialog = this.getDialogOnly(peerId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then((messages) => {\n console.log(messages);\n }); */\n\n const promise = this.goToNextMentionPromises[peerId];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ?? (this.unreadMentions[peerId] = new SlicedArray());\n const length = slicedArray.length;\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\n if(!length && isTopEnd) {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId);\n }\n\n return this.goToNextMentionPromises[peerId] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n return mid;\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[peerId];\n });\n }\n\n public loadNextMentions(peerId: PeerId) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit).then((messages) => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\n return this.apiManager.invokeApiSingle('messages.getUnreadMentions', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: getServerMessageId(maxId),\n min_id: getServerMessageId(minId)\n }).then((messagesMessages) => {\n assumeType>(messagesMessages);\n this.appUsersManager.saveApiUsers(messagesMessages.users);\n this.appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map((mid) => getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = this.apiManager.invokeApi('channels.readMessageContents', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = this.apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n this.apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n // threadId = this.getLocalMessageId(threadId);\n if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\n }\n\n return this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {count: null, history: new SlicedArray()});\n }\n\n public getHistoryStorageTransferable(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const {\n count,\n history,\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n } = historyStorage;\n\n return {\n count,\n history: undefined as HistoryStorage,\n historySerialized: history.toJSON(),\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n };\n }\n\n private getNotifyPeerSettings(peerId: PeerId) {\n return Promise.all([\n this.appNotificationsManager.getNotifyPeerTypeSettings(),\n this.appNotificationsManager.getNotifySettings(this.appPeersManager.getInputNotifyPeerById(peerId, true))\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: this.appNotificationsManager.isPeerLocalMuted(peerId, true),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n ctx.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n\n // var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n // const timeout = 1000;\n\n for(const _peerId in this.notificationsToHandle) {\n const peerId = _peerId.toPeerId();\n // if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n // continue;\n // }\n\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if((muted && !topMessage.pFlags.mentioned) || !topMessage.pFlags.unread) {\n return;\n }\n\n // setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n // }, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n // this.log('AMM updateMessageID:', update, pendingData);\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n const mid = generateMessageId(update.id);\n const message = this.getMessageFromStorage(storage, mid);\n if(message) {\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach((storage) => {\n storage.history.delete(tempId);\n });\n\n this.finalizePendingMessageCallbacks(storage, tempId, message);\n } else {\n this.pendingByMessageId[mid] = randomId;\n }\n }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getHistoryMessagesStorage(peerId);\n const dialog = this.getDialogOnly(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: this.createMessageStorage(peerId, 'history')});\n\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n this.onUpdateNewMessage(update);\n }\n\n if(message._ === 'messageService' && message.action._ === 'messageActionPaymentSent' && message.reply_to) {\n this.rootScope.dispatchEvent('payment_sent', {\n peerId: message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId,\n mid: message.reply_to_mid,\n receiptMessage: message\n });\n }\n\n if(!dialog && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = new Set());\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n (update as any).ignoreExisting = true;\n set.add(update);\n this.scheduleHandleNewDialogs(peerId);\n }\n\n return;\n }\n\n /* if(update._ === 'updateNewChannelMessage') {\n const chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n return;\n }\n } */\n\n this.saveMessages([message], {storage});\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n /* if((message as Message.message).grouped_id) {\n this.log('updateNewMessage', message);\n } */\n\n const pendingMessage = this.checkPendingMessage(message);\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if(!isLocalThreadUpdate) {\n this.updateMessageRepliesIfNeeded(message);\n }\n\n // * so message can exist if reloadConversation came back earlier with mid\n const ignoreExisting: boolean = (update as any).ignoreExisting;\n const isExisting = !!historyStorage.history.findSlice(message.mid);\n if(isExisting) {\n if(!ignoreExisting) {\n return false;\n }\n } else {\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\n const firstSlice = historyStorage.history.first;\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\n let i = 0;\n for(const length = firstSlice.length; i < length; ++i) {\n if(message.mid > firstSlice[i]) {\n break;\n }\n }\n\n firstSlice.splice(i, 0, message.mid);\n } else {\n historyStorage.history.unshift(message.mid);\n }\n\n if(historyStorage.count !== null) {\n historyStorage.count++;\n }\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n this.appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(this.appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId)\n };\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n }\n\n // commented to render the message if it's been sent faster than history_append came to main thread\n // if(!pendingMessage) {\n this.handleNewMessage(message);\n // }\n\n if(isLocalThreadUpdate) {\n return;\n }\n\n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n if(dialog) {\n if(inboxUnread && message.mid > dialog.top_message) {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n ++dialog.unread_count;\n if(message.pFlags.mentioned) {\n ++dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, true);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\n const notifyPeer = peerId;\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if(notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n }\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n if(!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = ctx.setTimeout(this.handleNotifications, 0);\n }\n }\n };\n\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\n const {peer, msg_id, reactions} = update;\n const mid = generateMessageId(msg_id);\n const peerId = this.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 this.appPeersManager.getPeerId(recentReaction.peer_id) !== this.appPeersManager.peerId && (\n !previousRecentReactions ||\n previousRecentReactions.length <= recentReactions.length\n ) && (\n !previousRecentReactions ||\n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\n )\n ) {\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n if(/* muted || */!peerTypeNotifySettings.show_previews) return;\n this.notifyAboutMessage(message, {\n peerReaction: recentReaction,\n peerTypeNotifySettings\n });\n });\n }\n }\n\n const key = message.peerId + '_' + message.mid;\n this.pushBatchUpdate('messages_reactions', this.batchUpdateReactions, key, () => copy(message.reactions));\n\n message.reactions = reactions;\n\n if(!update.local) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n // this.log('updateDialogUnreadMark', update);\n const peerId = this.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 this.dialogsStorage.setDialogToState(dialog);\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, dialog]]));\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = generateMessageId(message.id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n\n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage, storage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog && dialog.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog});\n }\n } else {\n let dispatchEditEvent = true;\n // no sense in dispatching message_edit since only reactions have changed\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\n const newReactions = (newMessage as Message.message).reactions;\n (newMessage as Message.message).reactions = oldMessage.reactions;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: this.appPeersManager.getOutputPeer(peerId),\n msg_id: message.id,\n reactions: newReactions\n });\n\n dispatchEditEvent = false;\n }\n\n dispatchEditEvent && this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n\n if(isTopMessage) {\n this.dialogsStorage.setDialogToState(dialog);\n }\n\n if((isTopMessage || (message as Message.message).grouped_id) && dialog) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, dialog]]));\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox\n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox\n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const storage = this.getHistoryMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n // this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n this.appUsersManager.forceUserOnline(peerId);\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n\n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n if(!message.pFlags.unread) {\n break;\n }\n\n if(threadId) {\n const replyTo = message.reply_to;\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\n continue;\n }\n }\n\n // this.log.warn('read', messageId, message.pFlags.unread, message)\n if(message.pFlags.unread) {\n delete message.pFlags.unread;\n if(!foundAffected) {\n foundAffected = true;\n }\n\n if(!message.pFlags.out && !threadId && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n }\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(!threadId && foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n if(releaseUnreadCount) {\n releaseUnreadCount();\n }\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n this.dialogsStorage.setDialogToState(foundDialog);\n }\n\n if(foundAffected) {\n this.rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n this.rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid) as Message.message);\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const mids = (update as Update.updateReadMessagesContents).messages.map((id) => generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(mids);\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(message) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n\n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n }\n }\n\n this.rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = generateMessageId(update.available_min_id);\n const messages = history.filter((mid) => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n // const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map((id) => generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(messages);\n\n if(!peerId) {\n return;\n }\n\n this.apiManager.clearCache('messages.getSearchCounters', (params) => {\n return this.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.getHistoryMessagesStorage(peerId), messages);\n\n const threadsStorages = Array.from(threadKeys).map((threadKey) => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorage = this.getHistoryStorage(peerId);\n [historyStorage].concat(threadsStorages).forEach((historyStorage) => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n\n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n this.rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const foundDialog = this.getDialogOnly(peerId);\n if(foundDialog) {\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n\n if(historyUpdated.unread) {\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n foundDialog.unread_mentions_count = !foundDialog.unread_count ? 0 : Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n }\n\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, foundDialog);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n\n const needDialog = this.appChatsManager.isInChat(channelId);\n\n const canViewHistory = !!channel.username || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n\n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n this.rootScope.dispatchEvent('history_forbidden', peerId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n\n this.rootScope.dispatchEvent('channel_update', channelId);\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n this.flushStoragesByPeerId(peerId);\n this.reloadConversation(peerId).then(() => {\n this.rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n\n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.channel_id.toPeerId(true);\n const mid = generateMessageId(update.id);\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(message?.views !== undefined && message.views < views) {\n message.views = views;\n this.pushBatchUpdate('messages_views', this.batchUpdateViews, message.peerId + '_' + message.mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n // this.log('updateServiceNotification', update);\n if(update.pFlags?.popup) {\n this.rootScope.dispatchEvent('service_notification', update);\n return;\n }\n\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: this.appPeersManager.getOutputPeer(fromId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + this.timeManager.getServerTimeOffset(),\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!this.appUsersManager.hasUser(fromId)) {\n this.appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : this.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) => generateMessageId(id));\n\n const storage = this.getHistoryMessagesStorage(peerId);\n const missingMessages = messages.filter((mid) => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map((mid) => this.reloadMessages(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n // storage.history.push(mid);\n const message = storage.get(mid) as Message.message;\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n // storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n // storage.history.findAndSplice((_mid) => _mid === mid);\n const message = storage.get(mid) as Message.message;\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n\n delete this.pinnedMessages[peerId];\n this.appStateManager.getState().then((state) => {\n delete state.hiddenPinnedMessages[peerId];\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n if(peer._ === 'notifyPeer') {\n const peerId = this.appPeersManager.getPeerId((peer as NotifyPeer.notifyPeer).peer);\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialog.notify_settings = notify_settings;\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(!storage) {\n return;\n }\n\n const mid = generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(oldMessage) {\n this.handleEditedMessage(oldMessage, newMessage, storage);\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId, mid: message.mid, message});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n this.rootScope.dispatchEvent('scheduled_new', message as Message.message);\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map((id) => generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n this.rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n private onUpdateMessageExtendedMedia = (update: Update.updateMessageExtendedMedia) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n const mid = generateMessageId(update.msg_id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n const messageMedia = message.media as MessageMedia.messageMediaInvoice;\n if(messageMedia.extended_media?._ === 'messageExtendedMedia') {\n return;\n }\n\n messageMedia.extended_media = update.extended_media;\n this.onUpdateEditMessage({\n _: 'updateEditMessage',\n message,\n pts: 0,\n pts_count: 0\n });\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage?.reply_to && threadMessage.peerId?.isAnyChat()) {\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.reloadMessages(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(!message) {\n return;\n }\n\n if(broadcastEventName) {\n this.rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n\n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n this.rootScope.dispatchEvent('history_update', {storageKey: pendingData.storage.key, message, sequential: pendingData.sequential});\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(peerId: PeerId, muteUntil: number) {\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n return this.appNotificationsManager.updateNotifySettings({\n _: 'inputNotifyPeer',\n peer: this.appPeersManager.getInputPeerById(peerId)\n }, settings);\n }\n\n public togglePeerMute(peerId: PeerId, mute?: boolean) {\n if(mute === undefined) {\n mute = !this.appNotificationsManager.isPeerLocalMuted(peerId, false);\n }\n\n return this.mutePeer(peerId, mute ? MUTE_UNTIL : 0);\n }\n\n private findPeerIdByMids(mids: number[]) {\n for(let length = mids.length, i = length - 1; i >= 0; --i) {\n const mid = mids[i];\n const message = this.getMessageById(mid);\n if(message) {\n return message.peerId;\n }\n }\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(this.appPeersManager.isRestricted(peerId)) {\n return false;\n }\n\n if(peerId.isAnyChat()) {\n // const isChannel = appPeersManager.isChannel(peerId);\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\n const hasRights = /* isChannel && */this.appChatsManager.hasRights(peerId.toChatId(), action, undefined, !!threadId);\n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return this.appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n // this.log('pdata', randomID, pendingData)\n\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach((storage) => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(tempMessage) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n this.rootScope.dispatchEvent('messages_pending');\n\n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n // this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n // this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = this.appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = this.thumbsStorage.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = this.thumbsStorage.getCacheContext(photo, THUMB_TYPE_FULL);\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const oldDoc = this.appDocsManager.getDoc('' + tempId);\n if(oldDoc) {\n const oldCacheContext = this.thumbsStorage.getCacheContext(oldDoc);\n if(\n /* doc._ !== 'documentEmpty' && */\n oldDoc.type &&\n oldDoc.type !== 'sticker' &&\n oldDoc.mime_type !== 'image/gif' &&\n oldCacheContext.url\n ) {\n const cacheContext = this.thumbsStorage.getCacheContext(newDoc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = getDocumentInputFileName(newDoc);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete this.appPollsManager.polls[tempId];\n delete this.appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n\n if(!(tempMessage as Message.message).reply_markup && (message as Message.message).reply_markup) {\n setTimeout(() => { // TODO: refactor it to normal buttons adding\n if(!this.getMessageFromStorage(storage, message.mid)) {\n return;\n }\n\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId: message.peerId, mid: message.mid, message});\n }, 0);\n }\n\n this.handleReleasingMessage(tempMessage, storage);\n\n this.rootScope.dispatchEvent('message_sent', {storageKey: storage.key, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n this.appStateManager.pushToState('maxSeenMsgId', maxId);\n\n this.apiManager.invokeApi('messages.receivedMessages', {\n max_id: getServerMessageId(maxId)\n });\n }\n\n public async getMessageReactionsListAndReadParticipants(\n message: Message.message,\n limit?: number,\n reaction?: Reaction,\n offset?: string,\n skipReadParticipants?: boolean,\n skipReactionsList?: boolean\n ) {\n const emptyMessageReactionsList = {\n reactions: [] as MessagePeerReaction[],\n count: 0,\n next_offset: undefined as string\n };\n\n const canViewMessageReadParticipants = await this.canViewMessageReadParticipants(message);\n if(canViewMessageReadParticipants && limit === undefined) {\n limit = 100;\n } else if(limit === undefined) {\n limit = 50;\n }\n\n return Promise.all([\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\n\n message.reactions?.recent_reactions?.length && !skipReactionsList ? this.appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch((err) => emptyMessageReactionsList) : emptyMessageReactionsList\n ]).then(([userIds, messageReactionsList]) => {\n const readParticipantsPeerIds = userIds.map((userId) => userId.toPeerId());\n\n const filteredReadParticipants = readParticipantsPeerIds.slice();\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\n if(messageReactionsList.reactions.some((reaction) => this.appPeersManager.getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: Reaction}[] = messageReactionsList.reactions.map((reaction) => ({peerId: this.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 this.apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((userIds) => { // ! convert long to number\n return userIds.map((userId) => userId.toUserId());\n });\n }\n\n public async canViewMessageReadParticipants(message: Message) {\n if(\n message?._ !== 'message' ||\n message.pFlags.is_outgoing ||\n !message.pFlags.out ||\n !this.appPeersManager.isAnyGroup(message.peerId)\n ) {\n return false;\n }\n\n const chat: Chat.chat | Chat.channel = this.appChatsManager.getChat(message.peerId.toChatId());\n const appConfig = await this.apiManager.getAppConfig();\n return chat.participants_count <= appConfig.chat_read_mark_size_threshold &&\n (tsNow(true) - message.date) < appConfig.chat_read_mark_expire_period;\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return this.apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n increment: true\n }).then((views) => {\n const updates: Update[] = new Array(mids.length);\n const channelId = peerId.toChatId();\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: channelId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerReaction: MessagePeerReaction,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n\n if(this.appPeersManager.isRestricted(peerId)) {\n return;\n }\n\n const tabs = appTabsManager.getTabs();\n let tab = tabs.find((tab) => {\n const {chatPeerIds} = tab.state;\n return chatPeerIds[chatPeerIds.length - 1] === peerId;\n });\n\n if(!tab) {\n tabs.sort((a, b) => a.state.idleStartTime - b.state.idleStartTime);\n tab = !tabs[0].state.idleStartTime ? tabs[0] : tabs[tabs.length - 1];\n }\n\n const port = MTProtoMessagePort.getInstance();\n port.invokeVoid('notificationBuild', {\n message,\n ...options\n }, tab.source);\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ?? (this.scheduledMessagesStorage[peerId] = this.createMessageStorage(peerId, 'scheduled'));\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId) {\n if(!this.canSendToPeer(peerId)) return;\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return [...storage.keys()];\n }\n\n return this.apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then((historyResult) => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n\n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n return this.filterMessages(message, (message) => !!(message as Message.message).replies)[0] as any;\n }\n\n public getMessageWithCommentReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.getMessageWithReplies(message);\n const replies = message?.replies;\n if(!(replies && replies.pFlags.comments && replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && !this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n const historyResult = await this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(this.getMessageByPeer(peerId, historyResult.history[i]));\n }\n\n return {isBottomEnd: historyStorage.history.slice.isEnd(SliceEnd.Bottom)};\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: false): Promise | HistoryResult;\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: true): HistoryResult;\n public getHistory(peerId: PeerId, maxId: number = 0, limit?: number, backLimit?: number, threadId?: number/* , onlyCache?: boolean */): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(this.appPeersManager.isRestricted(peerId)) {\n const first = historyStorage.history.first;\n first.setEnd(SliceEnd.Both);\n\n const slice = first.slice(0, 0);\n slice.setEnd(SliceEnd.Both);\n\n return {\n count: 0,\n history: Array.from(slice),\n isEnd: slice.getEnds(),\n offsetIdOffset: 0\n };\n }\n\n let offset = 0;\n /*\n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map((message) => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: Array.from(haveSlice.slice),\n isEnd: haveSlice.slice.getEnds(),\n offsetIdOffset: haveSlice.offsetIdOffset\n };\n }\n\n // if(onlyCache) {\n // return;\n // }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n const f = slice?.slice || historyStorage.history.constructSlice();\n return {\n count: historyStorage.count,\n history: Array.from(f),\n isEnd: f.getEnds(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(slicedArray: SlicedArray,\n historyResult: Parameters[0],\n offset_id: number,\n limit: number,\n add_offset: number) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually.\n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n\n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n const wasMaxId = historyStorage.maxId;\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n const newMaxId = slice[0];\n\n if(historyStorage.maxId === wasMaxId) {\n const first = historyStorage.history.first;\n if(first !== slice) {\n historyStorage.history.deleteSlice(first);\n }\n\n if(historyStorage.maxId !== newMaxId) {\n historyStorage.maxId = slice[0]; // ! WARNING\n\n this.reloadConversation(peerId); // when top_message is deleted but cached\n }\n }\n }\n\n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n // console.trace('requestHistory', peerId, maxId, limit, offset);\n\n // rootScope.broadcast('history_request');\n\n const options: any = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n options.msg_id = getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = this.apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if(this.appPeersManager.isChannel(peerId)) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && !historyResult.messages[length - 1]) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = this.appChatsManager.getChat(peerId.toChatId());\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = pause(0).then(() => {\n const requestPromises: Promise[] = [];\n\n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: getServerMessageId(mid)\n };\n });\n\n let promise: Promise;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n promise = this.apiManager.invokeApiSingle('channels.getMessages', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = this.apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then((getMessagesResult) => {\n assumeType>(getMessagesResult);\n\n this.appUsersManager.saveApiUsers(getMessagesResult.users);\n this.appChatsManager.saveApiChats(getMessagesResult.chats);\n const messages = this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < messages.length; ++i) {\n const message = messages[i];\n if(!message) {\n continue;\n }\n\n const mid = generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(message);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n\n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n return Promise.all(requestPromises).then(noop, noop).then(() => {\n this.fetchSingleMessagesPromise = null;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n });\n });\n }\n\n public reloadMessages(peerId: PeerId, mid: number, overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number[], overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number | number[], overwrite?: boolean): Promise {\n if(Array.isArray(mid)) {\n return Promise.all(mid.map((mid) => {\n return this.reloadMessages(peerId, mid, overwrite);\n }));\n }\n\n const message = this.getMessageByPeer(peerId, mid);\n if(message && !overwrite) {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public getExtendedMedia(peerId: PeerId, mids: number[]) {\n let map = this.extendedMedia.get(peerId);\n if(!map) {\n this.extendedMedia.set(peerId, map = new Map());\n }\n\n const deferred = deferredPromise();\n const toRequest: number[] = [];\n const promises = mids.map((mid) => {\n let promise = map.get(mid);\n if(!promise) {\n map.set(mid, promise = deferred);\n toRequest.push(mid);\n\n promise.then(() => {\n map.delete(mid);\n if(!map.size && this.extendedMedia.get(peerId) === map) {\n this.extendedMedia.delete(peerId);\n }\n });\n }\n\n return promise;\n });\n\n if(!toRequest.length) {\n deferred.resolve();\n } else {\n this.apiManager.invokeApi('messages.getExtendedMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: toRequest.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n });\n }\n\n return Promise.all(promises);\n }\n\n public fetchMessageReplyTo(message: MyMessage) {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.reloadMessages(replyToPeerId, message.reply_to_mid).then((originalMessage) => {\n if(!originalMessage) { // ! break the infinite loop\n message = this.getMessageByPeer(message.peerId, message.mid); // message can come from other thread\n delete message.reply_to_mid; // ! WARNING!\n }\n\n if(message._ === 'messageService') {\n const peerId = message.peerId;\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: `${peerId}_history`,\n peerId: peerId,\n mid: message.mid,\n message\n });\n\n if(this.isMessageIsTopMessage(message)) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, this.getDialogOnly(peerId)]]));\n }\n }\n\n return originalMessage;\n });\n }\n\n public setTyping(peerId: PeerId, action: SendMessageAction, force?: boolean): Promise {\n let typing = this.typings[peerId];\n if(\n !peerId ||\n !this.canSendToPeer(peerId) ||\n peerId === this.appPeersManager.peerId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[peerId] = {\n action\n };\n\n return this.apiManager.invokeApi('messages.setTyping', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n action\n }).finally(() => {\n if(typing === this.typings[peerId]) {\n typing.timeout = ctx.setTimeout(() => {\n delete this.typings[peerId];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n this.referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n this.appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n this.appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number,\n unread: number,\n unreadMentions: number,\n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0,\n unread: 0,\n unreadMentions: 0,\n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(!message) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n }\n\n if(history.albums) {\n for(const groupedId in history.albums) {\n this.dispatchAlbumEdit(groupedId, storage, [...history.albums[groupedId]]);\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n\n private handleEditedMessage(oldMessage: Message, newMessage: Message, storage: MessagesStorage) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n this.appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n\n const groupedId = oldMessage.grouped_id;\n if(groupedId) {\n this.dispatchAlbumEdit(groupedId, storage, []);\n }\n }\n }\n\n private dispatchAlbumEdit(groupedId: string, storage: MessagesStorage, deletedMids?: number[]) {\n const mids = this.getMidsByAlbum(groupedId);\n const messages = mids.map((mid) => this.getMessageFromStorage(storage, mid)) as Message.message[];\n this.rootScope.dispatchEvent('album_edit', {peerId: messages[0].peerId, groupId: groupedId, deletedMids: deletedMids || [], messages});\n }\n\n public getDialogUnreadCount(dialog: Dialog) {\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return message?._ === 'message' && !(message as Message.message).pFlags.noforwards && !this.appPeersManager.noForwards(message.peerId);\n }\n\n private pushBatchUpdate(\n event: E,\n callback: C,\n key: string,\n getElementCallback?: () => MapValueType[0]>\n ) {\n let details = this.batchUpdates[event];\n if(!details) {\n // @ts-ignore\n details = this.batchUpdates[event] = {\n callback,\n batch: new Map()\n };\n }\n\n if(!details.batch.has(key)) {\n // @ts-ignore\n details.batch.set(key, getElementCallback ? getElementCallback() : undefined);\n this.batchUpdatesDebounced();\n }\n }\n\n private getMessagesFromMap>(map: T) {\n const newMap: Map> = new Map();\n for(const [key, value] of map) {\n const [peerIdStr, mid] = key.split('_');\n const message = this.getMessageByPeer(peerIdStr.toPeerId(), +mid) as Message.message;\n if(!message) {\n continue;\n }\n\n newMap.set(message, value);\n }\n\n return newMap;\n }\n\n private batchUpdateViews = (batch: Map) => {\n const toDispatch: {peerId: PeerId, mid: number, views: number}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message] of map) {\n toDispatch.push({\n peerId: message.peerId,\n mid: message.mid,\n views: message.views\n })\n }\n\n return toDispatch;\n };\n\n private batchUpdateReactions = (batch: Map) => {\n const toDispatch: {message: Message.message, changedResults: ReactionCount.reactionCount[]}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message, previousReactions] of map) {\n const results = message.reactions?.results ?? [];\n const previousResults = previousReactions?.results ?? [];\n const changedResults = results.filter((reactionCount) => {\n const previousReactionCount = previousResults.find((_reactionCount) => reactionsEqual(_reactionCount.reaction, reactionCount.reaction));\n return (\n message.pFlags.out && (\n !previousReactionCount ||\n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.chosen_order !== undefined && (\n !previousReactionCount ||\n previousReactionCount.chosen_order === undefined\n )\n );\n });\n\n toDispatch.push({message, changedResults});\n }\n\n return toDispatch;\n };\n\n public saveDefaultSendAs(peerId: PeerId, sendAsPeerId: PeerId) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\n return this.apiManager.invokeApi('messages.saveDefaultSendAs', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\r\nimport {Document} from '../../../../layer';\r\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\r\n\r\nexport default function getDocumentInputFileName(doc: Document.document, thumbSize?: string) {\r\n return getFileNameByLocation(getDocumentInputFileLocation(doc, thumbSize), {fileName: doc.file_name});\r\n}\r\n","export default function convertInputKeyToKey(inputKey: string) {\n const str = inputKey.replace('input', '');\n return (str[0].toLowerCase() + str.slice(1)) as T;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport tsNow from '../../helpers/tsNow';\r\nimport {InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update} from '../../layer';\r\nimport {MUTE_UNTIL} from '../mtproto/mtproto_config';\r\nimport throttle from '../../helpers/schedulers/throttle';\r\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\r\nimport {AppManager} from './manager';\r\nimport ctx from '../../environment/ctx';\r\nimport assumeType from '../../helpers/assumeType';\r\n\r\ntype ImSadAboutIt = Promise | PeerNotifySettings;\r\nexport class AppNotificationsManager extends AppManager {\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n // private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n\r\n private getNotifyPeerTypePromise: Promise;\r\n\r\n private checkMuteUntilTimeout: number;\r\n private checkMuteUntilThrottled: () => void;\r\n\r\n private notifyContactsSignUp: Promise;\r\n\r\n protected after() {\r\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && this.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 this.rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n\r\n return this.appStateManager.getState().then((state) => {\r\n if(state.notifySettings) {\r\n for(const key in state.notifySettings) {\r\n assumeType>(key);\r\n this.savePeerSettings({\r\n key,\r\n settings: state.notifySettings[key]\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = this.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] = this.apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then((settings) => {\r\n this.savePeerSettings({\r\n key,\r\n peerId,\r\n settings\r\n });\r\n\r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n // this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return this.apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then((value) => {\r\n if(value) {\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings',\r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n },\r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings'\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // public getNotifyExceptions() {\r\n // apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n // .then((updates) => {\r\n // apiUpdatesManager.processUpdateMessage(updates);\r\n // });\r\n // }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = this.apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n this.apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then((value) => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private checkMuteUntil = () => {\r\n if(this.checkMuteUntilTimeout !== undefined) {\r\n clearTimeout(this.checkMuteUntilTimeout);\r\n this.checkMuteUntilTimeout = undefined;\r\n }\r\n\r\n const timestamp = tsNow(true);\r\n let closestMuteUntil = MUTE_UNTIL;\r\n for(const peerId in this.peerSettings.notifyPeer) {\r\n const peerNotifySettings = this.peerSettings.notifyPeer[peerId];\r\n if(peerNotifySettings instanceof Promise) {\r\n continue;\r\n }\r\n\r\n const muteUntil = peerNotifySettings.mute_until;\r\n if(!muteUntil) {\r\n continue;\r\n }\r\n\r\n if(muteUntil <= timestamp) {\r\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\r\n peerNotifySettings.mute_until = 0;\r\n\r\n this.apiUpdatesManager.saveUpdate({\r\n _: 'updateNotifySettings',\r\n peer: {\r\n _: 'notifyPeer',\r\n peer: this.appPeersManager.getOutputPeer(peerId.toPeerId())\r\n },\r\n notify_settings: peerNotifySettings\r\n });\r\n } else if(muteUntil < closestMuteUntil) {\r\n closestMuteUntil = muteUntil;\r\n }\r\n }\r\n\r\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\r\n this.checkMuteUntilTimeout = ctx.setTimeout(this.checkMuteUntil, timeout);\r\n };\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude,\r\n peerId?: PeerId,\r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n\r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n this.rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n this.appStateManager.getState().then((state) => {\r\n const notifySettings = state.notifySettings;\r\n notifySettings[key] = settings;\r\n this.appStateManager.pushToState('notifySettings', notifySettings);\r\n });\r\n } else {\r\n this.checkMuteUntilThrottled();\r\n }\r\n\r\n // rootScope.broadcast('notify_settings', {peerId: peerId});\r\n }\r\n\r\n public isMuted(peerNotifySettings: PeerNotifySettings) {\r\n return peerNotifySettings._ === 'peerNotifySettings' &&\r\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\r\n }\r\n\r\n private getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: this.appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n private getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n // if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = this.appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(const i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === this.appPeersManager.peerId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto} from '../../layer';\r\nimport type {LangPackKey} from '../langPack';\r\nimport {getRestrictionReason} from '../../helpers/restrictions';\r\nimport isObject from '../../helpers/object/isObject';\r\nimport {AppManager} from './manager';\r\nimport getPeerId from './utils/peers/getPeerId';\r\nimport isUser from './utils/peers/isUser';\r\nimport isAnyChat from './utils/peers/isAnyChat';\r\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager extends AppManager {\r\n public get peerId() {\r\n return this.appUsersManager.userId.toPeerId();\r\n }\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n if(this.isRestricted(peerId)) {\r\n return;\r\n }\r\n\r\n const photo = peerId.isUser() ?\r\n this.appUsersManager.getUserPhoto(peerId.toUserId()) :\r\n this.appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : undefined;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return getPeerId(chat.migrated_to as InputChannel.inputChannel);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(this.appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return this.appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return this.appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser() ?\r\n this.appUsersManager.getUser(peerId.toUserId()) :\r\n this.appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getPeerId(peerId: Parameters[0]) {\r\n return getPeerId(peerId) || (isObject(peerId) && peerId._ === 'inputPeerSelf' && this.peerId) || NULL_PEER_ID;\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return isUser(peerId);\r\n }\r\n\r\n public isAnyChat(peerId: PeerId) {\r\n return isAnyChat(peerId);\r\n }\r\n\r\n public isRestricted(peerId: PeerId) {\r\n return peerId.isUser() ? this.appUsersManager.isRestricted(peerId.toUserId()) : this.appChatsManager.isRestricted(peerId.toChatId());\r\n }\r\n\r\n public getRestrictionReasonText(peerId: PeerId) {\r\n const peer: Chat.channel | User.user = this.getPeer(peerId);\r\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\r\n if(reason) {\r\n return reason.text;\r\n } else {\r\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\r\n }\r\n }\r\n\r\n /* public getInputPeer(peerString: string): InputPeer {\r\n var firstChar = peerString.charAt(0);\r\n var peerParams = peerString.substr(1).split('_');\r\n let id = +peerParams[0];\r\n\r\n if(firstChar === 'u') {\r\n //appUsersManager.saveUserAccess(id, peerParams[1]);\r\n\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: id,\r\n access_hash: peerParams[1]\r\n };\r\n } else if(firstChar === 'c' || firstChar === 's') {\r\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\r\n if(firstChar === 's') {\r\n appChatsManager.saveIsMegagroup(id);\r\n }\r\n\r\n return {\r\n _: 'inputPeerChannel',\r\n channel_id: id,\r\n access_hash: peerParams[1] || '0'\r\n };\r\n } else {\r\n return {\r\n _: 'inputPeerChat',\r\n chat_id: id\r\n };\r\n }\r\n } */\r\n\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\r\n if(ignorePeerId) {\r\n if(peerId.isUser()) {\r\n return {_: 'inputNotifyUsers'};\r\n } else {\r\n if(this.isBroadcast(peerId)) {\r\n return {_: 'inputNotifyBroadcasts'};\r\n } else {\r\n return {_: 'inputNotifyChats'};\r\n }\r\n }\r\n } else {\r\n return {\r\n _: 'inputNotifyPeer',\r\n peer: this.getInputPeerById(peerId)\r\n };\r\n }\r\n }\r\n\r\n public getInputPeerById(peerId: PeerId): InputPeer {\r\n if(!peerId) {\r\n return {_: 'inputPeerEmpty'};\r\n }\r\n\r\n if(!peerId.isUser()) {\r\n const chatId = peerId.toChatId();\r\n return this.appChatsManager.getInputPeer(chatId);\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return this.appUsersManager.getUserInputPeer(userId);\r\n }\r\n\r\n /**\r\n * ! use it only in safe places like requests\r\n */\r\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\r\n return {_: 'inputPeerSelf'};\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = this.appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === this.peerId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): Extract {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n\r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n\r\n public noForwards(peerId: PeerId) {\r\n if(peerId.isUser()) return false;\r\n else {\r\n const chat = this.appChatsManager.getChatTyped(peerId.toChatId());\r\n return !!(chat as Chat.chat).pFlags?.noforwards;\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Photo, PhotoSize, PhotosPhotos} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n// let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager extends AppManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(!photo || photo._ === 'photoEmpty') return;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n this.referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n // * sometimes photoStrippedSize can be the last item\n photo.sizes.sort((a, b) => {\n return ((a as PhotoSize.photoSize).size || ((a as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0)) - ((b as PhotoSize.photoSize).size || ((b as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0));\n });\n\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n\n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = this.appUsersManager.getUserInput(userId);\n return this.apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n this.appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n\n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n\n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport copy from '../../helpers/object/copy';\r\nimport {InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults} from '../../layer';\r\nimport {logger, LogTypes} from '../logger';\r\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\r\nimport {AppManager} from './manager';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\n\r\ntype PollId = Poll['id'];\r\n\r\nexport class AppPollsManager extends AppManager {\r\n public polls: {[id: PollId]: Poll} = {};\r\n public results: {[id: PollId]: PollResults} = {};\r\n public pollToMessages: {[id: PollId]: Set} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n\r\n this.rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: PollId): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId],\r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n\r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: Message.message, optionIds: number[]): Promise {\r\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\r\n\r\n const options: Uint8Array[] = optionIds.map((index) => {\r\n return poll.answers[index].option;\r\n });\r\n\r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return this.appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message as Message.message, optionIds);\r\n });\r\n }\r\n\r\n return this.apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: getServerMessageId(message.mid),\r\n options\r\n }).then((updates) => {\r\n this.log('sendVote updates:', updates);\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: Message.message) {\r\n const inputPeer = this.appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return this.apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: getServerMessageId(message.mid)\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: Message.message, option?: Uint8Array, offset?: string, limit = 20) {\r\n return this.apiManager.invokeApi('messages.getPollVotes', {\r\n peer: this.appPeersManager.getInputPeerById(message.peerId),\r\n id: getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n this.appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: Message.message) {\r\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\r\n\r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return this.appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n // console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {InputPrivacyKey, InputPrivacyRule, PrivacyRule, PrivacyKey, GlobalPrivacySettings} from '../../layer';\r\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\r\nimport {AppManager} from './manager';\r\n\r\nexport class AppPrivacyManager extends AppManager {\r\n private privacy: Partial<{\r\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\r\n }> = {};\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updatePrivacy: (update) => {\r\n const key = update.key._;\r\n this.privacy[key] = update.rules;\r\n this.rootScope.dispatchEvent('privacy_update', update);\r\n }\r\n });\r\n }\r\n\r\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\r\n return this.apiManager.invokeApi('account.setPrivacy', {\r\n key: {\r\n _: inputKey\r\n },\r\n rules\r\n }).then((privacyRules) => {\r\n this.appUsersManager.saveApiUsers(privacyRules.users);\r\n this.appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePrivacy',\r\n key: {\r\n _: convertInputKeyToKey(inputKey)\r\n },\r\n rules: rules.map((inputRule) => {\r\n const rule: PrivacyRule = {} as any;\r\n Object.assign(rule, inputRule);\r\n rule._ = convertInputKeyToKey(rule._) as any;\r\n return rule;\r\n })\r\n });\r\n\r\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\r\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\r\n const rules = this.privacy[privacyKey];\r\n if(rules) {\r\n return Promise.resolve(rules);\r\n }\r\n\r\n return this.privacy[privacyKey] = this.apiManager.invokeApi('account.getPrivacy', {\r\n key: {\r\n _: inputKey\r\n }\r\n }).then((privacyRules) => {\r\n this.appUsersManager.saveApiUsers(privacyRules.users);\r\n this.appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return this.privacy[privacyKey] = privacyRules.rules;\r\n });\r\n }\r\n\r\n public getGlobalPrivacySettings() {\r\n return this.apiManager.invokeApi('account.getGlobalPrivacySettings');\r\n }\r\n\r\n public setGlobalPrivacySettings(settings: GlobalPrivacySettings) {\r\n return this.apiManager.invokeApi('account.setGlobalPrivacySettings', {settings});\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {MyTopPeer} from './appUsersManager';\nimport tsNow from '../../helpers/tsNow';\nimport {ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize, Updates} from '../../layer';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport getPhotoInput from './utils/photos/getPhotoInput';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport ctx from '../../environment/ctx';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nconst PEER_FULL_TTL = 3 * 60e3;\n\nexport class AppProfileManager extends AppManager {\n // private botInfos: any = {};\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\n private chatsFull: {[id: ChatId]: ChatFull} = {};\n private fullExpiration: {[peerId: PeerId]: number} = {};\n private typingsInPeer: {[peerId: PeerId]: UserTyping[]};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = this.appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = !!(fullChat.chat_photo && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\n if(\n hasChatPhoto !== hasFullChatPhoto || (\n hasChatPhoto &&\n photo.photo_id !== fullChat.chat_photo?.id\n )\n ) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n this.rootScope.addEventListener('channel_update', (chatId) => {\n this.refreshFullPeer(chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('chat_full_update', (chatId) => {\n this.rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('user_full_update', (userId) => {\n this.rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n this.rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true) {\n if(this.usersFull[id] && !override && Date.now() < this.fullExpiration[id.toPeerId()]) {\n return this.usersFull[id];\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser',\n params: {\n id: this.appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n this.appChatsManager.saveApiChats(usersUserFull.chats, true);\n this.appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = this.appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n const botInfo = userFull.bot_info;\n if(botInfo) {\n const referenceContext: ReferenceContext = {type: 'userFull', userId: id};\n botInfo.description_document = this.appDocsManager.saveDoc(botInfo.description_document, referenceContext);\n botInfo.description_photo = this.appPhotosManager.savePhoto(botInfo.description_photo, referenceContext);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n // appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n this.rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true) {\n if(this.appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public async getFullPhoto(peerId: PeerId) {\n const profile = await this.getProfileByPeerId(peerId);\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true) {\n if(this.appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const peerId = id.toPeerId(true);\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override && Date.now() < this.fullExpiration[peerId]) {\n const chat: Chat.chat = this.appChatsManager.getChat(id);\n if(\n chat.pFlags.left ||\n chat.pFlags.deactivated ||\n chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version\n ) {\n return fullChat as ChatFull;\n }\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat',\n params: {\n chat_id: id\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const chatFull = result.full_chat as ChatFull.chatFull;\n if(chatFull && chatFull.chat_photo && chatFull.chat_photo.id) {\n chatFull.chat_photo = this.appPhotosManager.savePhoto(chatFull.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n if(chatFull.call) {\n this.appGroupCallsManager.saveGroupCall(chatFull.call, id);\n }\n\n // appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: chatFull.notify_settings\n });\n\n this.chatsFull[id] = chatFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return chatFull;\n }\n });\n }\n\n public async getChatInviteLink(id: ChatId, force?: boolean) {\n const chatFull = await this.getChatFull(id);\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n\n return this.apiManager.invokeApi('messages.exportChatInvite', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = this.appChatsManager.getChat(id);\n if(chat &&\n chat.pFlags && (\n // chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return this.apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: this.appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then((result) => {\n this.appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex((p) => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return this.apiManager.invokeApiSingle('channels.getParticipant', {\n channel: this.appChatsManager.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId)\n }).then((channelParticipant) => {\n this.appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true) {\n const peerId = id.toPeerId(true);\n if(this.chatsFull[id] !== undefined && !override && Date.now() < this.fullExpiration[peerId]) {\n return this.chatsFull[id] as ChatFull.channelFull;\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel',\n params: {\n channel: this.appChatsManager.getChannelInput(id)\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = this.appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n // appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n\n if(fullChannel.call) {\n this.appGroupCallsManager.saveGroupCall(fullChannel.call, id);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n },\n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n const channel: Chat.channel | Chat.channelForbidden = this.appChatsManager.getChat(id);\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [{\n _: 'channelForbidden',\n id,\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n }],\n users: []\n } as Updates.updates);\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n\n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach((peer) => {\n index.indexObject(peer.id, this.appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: getServerMessageId(threadId)\n }, 50, 0).then((cP) => {\n return cP.participants.map((p) => getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = Promise.resolve(this.getChatFull(chatId)).then((chatFull) => {\n return ((chatFull as ChatFull.chatFull).participants as ChatParticipants.chatParticipants).participants.map((p) => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n this.appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]),\n promise\n ]).then((results) => {\n const peers = results[0].concat(results[1].map((peerId) => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n private invalidateChannelParticipants(id: ChatId) {\n this.apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) {\n const userId = peerId.toUserId();\n delete this.usersFull[userId];\n this.rootScope.dispatchEvent('user_full_update', userId);\n } else {\n const chatId = peerId.toChatId();\n delete this.chatsFull[chatId];\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name?: string, last_name?: string, about?: string) {\n return this.apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then((user) => {\n this.appUsersManager.saveApiUser(user);\n\n if(about !== undefined) {\n const peerId = user.id.toPeerId();\n const userFull = this.usersFull[user.id];\n if(userFull) {\n userFull.about = about;\n }\n\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return this.getProfile(user.id, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return this.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n // ! sometimes can have no user in users\n const photo = updateResult.photo as Photo.photo;\n if(!updateResult.users.length) {\n const strippedThumb = photo.sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n updateResult.users.push({\n ...this.appUsersManager.getSelf(),\n photo: {\n _: 'userProfilePhoto',\n dc_id: photo.dc_id,\n photo_id: photo.id,\n stripped_thumb: strippedThumb?.bytes,\n pFlags: {\n\n }\n }\n });\n }\n this.appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = this.appPeersManager.peerId;\n this.appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateUserPhoto',\n user_id: userId,\n date: tsNow(true),\n photo: this.appUsersManager.getUser(userId).photo,\n previous: true\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return this.apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map((photoId) => {\n const photo = this.appPhotosManager.getPhoto(photoId);\n return getPhotoInput(photo);\n })\n }).then((deletedList) => {\n\n });\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = this.appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(this.appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n\n const chatInfo = await this.getChatFull(id);\n if(this.appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await this.apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: this.appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ?\n (update as Update.updateUserTyping).user_id.toPeerId() :\n this.appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(this.appPeersManager.peerId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n\n const peerId = this.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 this.rootScope.dispatchEvent('peer_typings', {peerId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[peerId];\n }\n };\n\n if(typing && typing.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n // console.log('updateChatUserTyping', update, typings);\n\n typing.action = update.action;\n\n const hasUser = this.appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && this.appChatsManager.hasChat(update.chat_id) && !this.appChatsManager.isChannel(update.chat_id)) {\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\n if(typing.timeout !== undefined && this.appUsersManager.hasUser(fromId)) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n });\n }\n }\n\n // return;\n } else {\n this.appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = ctx.setTimeout(cancelAction, 6000);\n if(hasUser) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = this.appPeersManager.getPeerId(update.peer_id);\n if(this.appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n this.rootScope.dispatchEvent('user_full_update', userId);\n }\n\n this.rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId) {\n return this.typingsInPeer[peerId];\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Awaited} from '../types';\n\nexport default function callbackifyAll(\n values: T,\n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): Promise> | R {\n if(values.some((value) => value instanceof Promise)) {\n return Promise.all(values).then(callback as any);\n } else {\n return callback(values as any);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport callbackifyAll from '../../helpers/callbackifyAll';\nimport copy from '../../helpers/object/copy';\nimport pause from '../../helpers/schedulers/pause';\nimport {AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Reaction, ReactionCount, Update, Updates} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\n\nconst SAVE_DOC_KEYS = [\n 'static_icon' as const,\n 'appear_animation' as const,\n 'select_animation' as const,\n 'activate_animation' as const,\n 'effect_animation' as const,\n 'around_animation' as const,\n 'center_icon' as const\n];\n\nconst REFERENCE_CONTEXT: ReferenceContext = {\n type: 'reactions'\n};\n\nexport class AppReactionsManager extends AppManager {\n private availableReactions: AvailableReaction[];\n private sendReactionPromises: Map>;\n private lastSendingTimes: Map;\n\n protected after() {\n this.rootScope.addEventListener('language_change', () => {\n this.availableReactions = undefined;\n this.getAvailableReactions();\n });\n\n this.sendReactionPromises = new Map();\n this.lastSendingTimes = new Map();\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\n for(const availableReaction of availableReactions) {\n await Promise.all([\n availableReaction.around_animation && this.apiFileManager.downloadMedia({media: availableReaction.around_animation}),\n availableReaction.static_icon && this.apiFileManager.downloadMedia({media: availableReaction.static_icon}),\n availableReaction.appear_animation && this.apiFileManager.downloadMedia({media: availableReaction.appear_animation}),\n availableReaction.center_icon && this.apiFileManager.downloadMedia({media: availableReaction.center_icon})\n ]);\n\n await pause(1000);\n }\n });\n }, 7.5e3);\n });\n }\n\n public getAvailableReactions() {\n if(this.availableReactions) return this.availableReactions;\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAvailableReactions',\n processResult: (messagesAvailableReactions) => {\n assumeType(messagesAvailableReactions);\n\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\n for(const reaction of availableReactions) {\n for(const key of SAVE_DOC_KEYS) {\n if(!reaction[key]) {\n continue;\n }\n\n reaction[key] = this.appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\n }\n }\n\n return availableReactions;\n },\n params: {\n hash: 0\n }\n });\n }\n\n public getActiveAvailableReactions() {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive);\n });\n }\n\n public getAvailableReactionsForPeer(peerId: PeerId) {\n const activeAvailableReactions = this.getActiveAvailableReactions();\n if(peerId.isUser()) {\n return this.unshiftQuickReaction(activeAvailableReactions);\n }\n\n const chatFull = this.appProfileManager.getChatFull(peerId.toChatId());\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n\n let filteredChatAvailableReactions: AvailableReaction[] = [];\n if(chatAvailableReactions._ === 'chatReactionsAll') {\n filteredChatAvailableReactions = activeAvailableReactions;\n } else if(chatAvailableReactions._ === 'chatReactionsSome') {\n filteredChatAvailableReactions = chatAvailableReactions.reactions.map((reaction) => {\n return activeAvailableReactions.find((availableReaction) => availableReaction.reaction === (reaction as Reaction.reactionEmoji).emoticon);\n }).filter(Boolean);\n }\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction[], quickReaction: Reaction | AvailableReaction) {\n if(quickReaction && quickReaction._ !== 'reactionEmoji' && quickReaction._ !== 'availableReaction') return availableReactions;\n const emoticon = (quickReaction as Reaction.reactionEmoji).emoticon || (quickReaction as AvailableReaction).reaction;\n const availableReaction = findAndSplice(availableReactions, (availableReaction) => availableReaction.reaction === emoticon);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction[] | PromiseLike,\n quickReaction: ReturnType = this.getQuickReaction()\n ) {\n return callbackifyAll([\n availableReactions,\n quickReaction\n ], ([availableReactions, quickReaction]) => {\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\n });\n }\n\n public getAvailableReactionsByMessage(message: Message.message) {\n if(!message) return [];\n const peerId = (message.fwd_from?.channel_post && this.appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\n return this.getAvailableReactionsForPeer(peerId);\n }\n\n public isReactionActive(reaction: string) {\n if(!this.availableReactions) return false;\n return !!this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getQuickReaction() {\n return callbackifyAll([\n this.apiManager.getConfig(),\n this.getAvailableReactions()\n ], ([config, availableReactions]) => {\n const reaction = config.reactions_default;\n if(reaction?._ === 'reactionEmoji') {\n return availableReactions.find((availableReaction) => availableReaction.reaction === reaction.emoticon);\n }\n\n return reaction as Reaction.reactionCustomEmoji;\n });\n }\n\n public getReactionCached(reaction: string) {\n return this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), () => {\n return this.getReactionCached(reaction);\n });\n }\n\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessagesReactions',\n params: {\n id: mids.map((mid) => getServerMessageId(mid)),\n peer: this.appPeersManager.getInputPeerById(peerId)\n },\n processResult: (updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\n // return update.reactions;\n }\n });\n }\n\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: Reaction, offset?: string) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessageReactionsList',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: getServerMessageId(mid),\n limit,\n reaction,\n offset\n },\n processResult: (messageReactionsList) => {\n this.appUsersManager.saveApiUsers(messageReactionsList.users);\n return messageReactionsList;\n }\n });\n }\n\n public setDefaultReaction(reaction: Reaction) {\n return this.apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(async(value) => {\n if(value) {\n const appConfig = await this.apiManager.getConfig();\n if(appConfig) {\n appConfig.reactions_default = reaction;\n }/* else { // if no config or loading it - overwrite\n this.apiManager.getAppConfig(true);\n } */\n\n this.rootScope.dispatchEvent('quick_reaction', reaction);\n }\n\n return value;\n });\n }\n\n public async sendReaction(message: Message.message, reaction?: Reaction | AvailableReaction, onlyLocal?: boolean) {\n if(reaction._ === 'availableReaction') {\n reaction = {\n _: 'reactionEmoji',\n emoticon: reaction.reaction\n };\n }\n\n const limit = await this.apiManager.getLimit('reactions');\n\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\n if(lastSendingTime) {\n return;\n } else {\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\n setTimeout(() => {\n this.lastSendingTimes.delete(lastSendingTimeKey);\n }, 333);\n }\n\n const {peerId, mid} = message;\n const myPeerId = this.appPeersManager.peerId;\n\n const unsetReactionCount = (reactionCount: ReactionCount) => {\n --reactionCount.count;\n delete reactionCount.chosen_order;\n\n if(reactionsEqual(reaction as Reaction, reactionCount.reaction)) {\n reaction = undefined as Reaction;\n }\n\n if(!reactionCount.count) {\n indexOfAndSplice(reactions.results, reactionCount);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n findAndSplice(reactions.recent_reactions, (recentReaction) => reactionsEqual(recentReaction.reaction, reactionCount.reaction) && this.appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n };\n\n const canSeeList = message.reactions?.pFlags?.can_see_list || !this.appPeersManager.isBroadcast(message.peerId) || message.peerId.isUser();\n if(!message.reactions) {\n message.reactions = {\n _: 'messageReactions',\n results: [],\n recent_reactions: canSeeList ? [] : undefined,\n pFlags: {\n can_see_list: canSeeList || undefined\n }\n };\n }\n\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n const chosenReactions = reactions.results.filter((reactionCount) => reactionCount.chosen_order !== undefined);\n chosenReactions.sort((a, b) => b.chosen_order - a.chosen_order);\n const unsetReactions: ReactionCount[] = [];\n const chosenReactionIdx = chosenReactions.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n if(chosenReactionIdx !== -1) unsetReactions.push(...chosenReactions.splice(chosenReactionIdx, 1));\n unsetReactions.push(...chosenReactions.splice(limit - +(chosenReactionIdx === -1)));\n unsetReactions.forEach((reactionCount) => {\n chosenReactions.forEach((chosenReactionCount) => {\n if(chosenReactionCount.chosen_order > reactionCount.chosen_order) {\n --chosenReactionCount.chosen_order;\n }\n });\n\n unsetReactionCount(reactionCount);\n });\n\n const chosenReactionsLength = chosenReactions.length;\n chosenReactions.forEach((reactionCount, idx) => {\n reactionCount.chosen_order = chosenReactionsLength - 1 - idx;\n });\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(canSeeList) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.chosen_order = chosenReactions.length ? chosenReactions[0].chosen_order + 1 : 0;\n chosenReactions.unshift(reactionCount);\n\n if(!reactions.recent_reactions && canSeeList) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const peerReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: this.appPeersManager.getOutputPeer(myPeerId)\n };\n\n if(!this.appPeersManager.isMegagroup(peerId) && false) {\n reactions.recent_reactions.push(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(peerReaction);\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 const id1 = (a.reaction as Reaction.reactionCustomEmoji).document_id || (a.reaction as Reaction.reactionEmoji).emoticon;\n const id2 = (b.reaction as Reaction.reactionCustomEmoji).document_id || (b.reaction as Reaction.reactionEmoji).emoticon;\n return (b.count - a.count) || ((indexes.get(id1) ?? 0) - (indexes.get(id2) ?? 0));\n });\n }\n\n if(onlyLocal) {\n message.reactions = reactions;\n this.rootScope.dispatchEvent('messages_reactions', [{message, changedResults: []}]);\n return Promise.resolve();\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: message.peer_id,\n msg_id: message.id,\n reactions: reactions,\n local: true\n });\n\n const promiseKey = [peerId, mid].join('-');\n const msgId = getServerMessageId(mid);\n const promise = this.apiManager.invokeApi('messages.sendReaction', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: msgId,\n reaction: chosenReactions.map((reactionCount) => reactionCount.reaction)\n }).then((updates) => {\n assumeType(updates);\n\n const editMessageUpdateIdx = updates.updates.findIndex((update) => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\n if(editMessageUpdateIdx !== -1) {\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\n updates.updates[editMessageUpdateIdx] = {\n _: 'updateMessageReactions',\n msg_id: msgId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n reactions: (editMessageUpdate.message as Message.message).reactions,\n pts: editMessageUpdate.pts,\n pts_count: editMessageUpdate.pts_count\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }).catch((err) => {\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReaction(message, chosenReactions[0]?.reaction, true);\n }\n }).finally(() => {\n if(this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReactionPromises.delete(promiseKey);\n }\n });\n\n this.sendReactionPromises.set(promiseKey, promise);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport type {DownloadOptions} from '../mtproto/apiFileManager';\nimport {Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFavedStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered, Update} from '../../layer';\nimport {Modify} from '../../types';\nimport AppStorage from '../storage';\nimport DATABASE_STATE from '../../config/databases/state';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport {AppManager} from './manager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\n\nconst CACHE_TIME = 3600e3;\n\nconst EMOJI_SET_LOCAL_ID = 'emoji';\nconst EMOJI_ANIMATIONS_SET_LOCAL_ID = 'emojiAnimations';\nconst LOCAL_IDS_SET = new Set([\n EMOJI_SET_LOCAL_ID,\n EMOJI_ANIMATIONS_SET_LOCAL_ID\n]);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager extends AppManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise};\n\n private greetingStickers: MyDocument[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n\n private favedStickers: MyDocument[];\n private recentStickers: MyDocument[];\n\n private names: Record;\n\n protected after() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {};\n this.sounds = {};\n this.names = {};\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n this.getAnimatedEmojiStickerSet();\n // this.getFavedStickersStickers();\n }, 1000);\n\n if(!this.getGreetingStickersPromise && this.getGreetingStickersTimeout === undefined) {\n this.getGreetingStickersTimeout = ctx.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n });\n\n this.rootScope.addEventListener('app_config', () => this.onStickersUpdated('faved', true));\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n this.rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n },\n\n updateRecentStickers: () => this.onStickersUpdated('recent', true),\n\n updateFavedStickers: () => this.onStickersUpdated('faved', true),\n\n updateMoveStickerSetToTop: (update) => {\n this.rootScope.dispatchEvent('stickers_top', update.stickerset);\n }\n });\n }\n\n private async onStickersUpdated(type: 'faved' | 'recent', overwrite: boolean) {\n const stickers = await (type === 'faved' ? this.getFavedStickersStickers(overwrite) : this.getRecentStickersStickers(overwrite));\n this.rootScope.dispatchEvent('stickers_updated', {\n type,\n stickers\n });\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then((docs) => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n\n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n this.apiFileManager.downloadMedia({media: this.greetingStickers[0]}); // preload next sticker\n\n return doc;\n });\n }\n\n private saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = this.appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n private canUseStickerSetCache(set: MyMessagesStickerSet, useCache?: boolean) {\n return set && set.documents?.length && ((Date.now() - set.refreshTime) < CACHE_TIME || useCache);\n }\n\n public getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise | MyMessagesStickerSet {\n let {id} = set;\n if(!set.access_hash) {\n set = this.names[id] || set;\n id = set.id;\n }\n\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n if(!params.overwrite) {\n const cachedSet = this.storage.getFromCache(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n return cachedSet;\n }\n }\n\n const promise = this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n const cachedSet = await this.storage.get(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n\n return;\n }\n }\n\n try {\n const stickerSet = await this.apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n\n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n\n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n });\n\n return promise;\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getStickerSet({id: EMOJI_SET_LOCAL_ID}, {saveById: true}),\n this.getStickerSet({id: EMOJI_ANIMATIONS_SET_LOCAL_ID}, {saveById: true}),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n const promise = this.getAnimatedEmojiSoundsPromise = Promise.all([\n this.apiManager.getAppConfig(overwrite),\n this.apiManager.getConfig()\n ]).then(([appConfig, config]) => {\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\n return;\n }\n\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n\n const doc = this.appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg'\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n\n return promise;\n }\n\n public async getRecentStickers(overwrite?: boolean): Promise> {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.recentStickers = res.stickers as MyDocument[];\n this.saveStickers(res.stickers);\n return res;\n },\n overwrite\n });\n\n return res;\n }\n\n public getRecentStickersStickers(overwrite?: boolean) {\n if(overwrite) this.recentStickers = undefined;\n else if(this.recentStickers) return this.recentStickers;\n return this.getRecentStickers(overwrite).then(() => this.recentStickers);\n }\n\n public saveRecentSticker(docId: DocId, unsave?: boolean, attached?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n\n findAndSplice(this.recentStickers, (_doc) => _doc.id === docId);\n if(!unsave) {\n this.recentStickers.unshift(doc);\n\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then((stickers) => {\n const _doc = findAndSplice(stickers, (_doc) => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'recent', faved: !unsave, document: doc});\n\n if(unsave) {\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.saveRecentSticker', {\n id: getDocumentInput(doc),\n unsave,\n attached\n });\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const id = isAnimation ? EMOJI_ANIMATIONS_SET_LOCAL_ID : EMOJI_SET_LOCAL_ID;\n const stickerSet = this.storage.getFromCache(id);\n // const stickerSet = await this.getStickerSet({id});\n if(!stickerSet?.documents) return;\n\n if(isAnimation) {\n if(['🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎'].includes(emoji)) {\n emoji = '❤️';\n }\n }\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find((p) => p.emoticon === emoji);\n return pack ? this.appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji);\n });\n\n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]).then(([doc, a]) => {\n return {\n doc: doc,\n animation: a?.doc,\n sound: a?.sound\n };\n });\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji, true);\n }).then((doc) => {\n if(!doc) {\n return;\n }\n\n const sound = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n this.preloadSticker(doc.id),\n sound ? this.preloadSticker(sound.id) : undefined\n ]).then(() => {\n return {doc, sound};\n });\n });\n }\n\n public preloadSticker(docId: DocId, isPremiumEffect?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n return this.apiFileManager.downloadMedia({media: doc, thumb: isPremiumEffect ? doc.video_thumbs?.[0] : undefined});\n }\n\n private saveStickerSet(res: Omit, id: DocId) {\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[],\n keywords: res.keywords\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 if(stickerSet.set.short_name) {\n this.names[stickerSet.set.short_name] = this.getStickerSetInput(newSet.set) as any;\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): DownloadOptions {\n const thumb = stickerSet.thumbs.find((thumb) => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(set.id === EMOJI_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmoji'\n };\n } else if(set.id === EMOJI_ANIMATIONS_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmojiAnimations'\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public getPromoPremiumStickers() {\n return this.getStickersByEmoticon('⭐️⭐️', false);\n }\n\n public getPremiumStickers() {\n return this.getStickersByEmoticon('📂⭐️', false);\n }\n\n public getFavedStickers(overwrite?: boolean) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getFavedStickers',\n processResult: (favedStickers) => {\n assumeType(favedStickers);\n this.saveStickers(favedStickers.stickers);\n this.favedStickers = favedStickers.stickers as MyDocument[];\n return favedStickers;\n },\n overwrite\n });\n }\n\n public getFavedStickersStickers(overwrite?: boolean) {\n if(overwrite) this.favedStickers = undefined;\n else if(this.favedStickers) return this.favedStickers;\n return this.getFavedStickers(overwrite).then(() => this.favedStickers);\n }\n\n public getFavedStickersLimit() {\n return this.apiManager.getLimit('favedStickers');\n }\n\n public async faveSticker(docId: DocId, unfave?: boolean) {\n if(!this.favedStickers) {\n await this.getFavedStickersStickers();\n }\n\n const limit = await this.getFavedStickersLimit();\n\n const doc = this.appDocsManager.getDoc(docId);\n findAndSplice(this.favedStickers, (_doc) => _doc.id === doc.id);\n\n if(!unfave) {\n this.favedStickers.unshift(doc);\n const spliced = this.favedStickers.splice(limit, this.favedStickers.length - limit);\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'faved', faved: !unfave, document: doc});\n\n return this.apiManager.invokeApi('messages.faveSticker', {\n id: getDocumentInput(doc),\n unfave\n }).then(() => {\n if(unfave) {\n this.onStickersUpdated('faved', true);\n }\n });\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n set = this.storage.getFromCache(set.id).set;\n\n if(set.installed_date) {\n const res = await this.apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n this.rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await this.apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n this.rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public toggleStickerSets(sets: StickerSet.stickerSet[]) {\n return Promise.all(sets.map((set) => this.toggleStickerSet(set)));\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets',\n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(const 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 private processAllStickersResult = (allStickers: MessagesAllStickers) => {\n assumeType(allStickers);\n\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\n if(stickerSet.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return allStickers;\n };\n\n public getAllStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getAllStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public getEmojiStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getEmojiStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then((allStickers) => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map((set) => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n this.apiManager.invokeApiHashable({\n method: 'messages.getStickers',\n params: {\n emoticon\n },\n processResult: (stickers) => stickers\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map((sticker) => this.appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n // console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = this.appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter((doc) => !doc.animated) */;\n\n forEachReverse(stickers, (sticker, idx, arr) => {\n if((sticker.sticker === 3 && !getEnvironment().IS_WEBM_SUPPORTED) ||\n (!this.rootScope.premium && getStickerEffectThumb(sticker))) {\n arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public clearRecentStickers() {\n if(this.recentStickers) {\n this.recentStickers.length = 0;\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.clearRecentStickers');\n }\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport filterUnique from '../../helpers/array/filterUnique';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cleanSearchText from '../../helpers/cleanSearchText';\nimport cleanUsername from '../../helpers/cleanUsername';\nimport tsNow from '../../helpers/tsNow';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {Chat, ContactsResolvedPeer, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus} from '../../layer';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport canSendToUser from './utils/users/canSendToUser';\nimport {AppStoragesManager} from './appStoragesManager';\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager extends AppManager {\n private storage: AppStoragesManager['storages']['users'];\n\n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: UserId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n\n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n protected after() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n this.rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= this.timeManager.getServerTimeOffset();\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } // ////else console.warn('No user by id:', userId);\n },\n\n updateUserPhoto: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto)?.photo_id) {\n return;\n }\n\n this.forceUserOnline(userId, update.date);\n\n if(update.photo._ === 'userProfilePhotoEmpty') {\n delete user.photo;\n } else {\n user.photo = safeReplaceObject(user.photo, update.photo);\n }\n\n this.setUserToStateIfNeeded(user);\n\n this.rootScope.dispatchEvent('user_update', userId);\n this.rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n } else console.warn('No user by id:', userId);\n },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n\n this.saveApiUser({\n ...user,\n first_name: update.first_name,\n last_name: update.last_name,\n username: update.username\n }, true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n this.rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('users')\n ]).then(([state, {results: users, storage}]) => {\n this.storage = storage;\n\n if(users.length) {\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(user) {\n this.users[user.id] = user;\n this.setUserNameToCache(user);\n\n this.checkPremium(user);\n\n if(state.contactsListCachedTime && (user.pFlags.contact || user.pFlags.mutual_contact)) {\n this.pushContact(user.id);\n\n if(!this.contactsFillPromise) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n }\n }\n }\n\n // const contactsList = state.contactsList;\n // if(Array.isArray(contactsList)) {\n // contactsList.forEach((userId) => {\n // this.pushContact(userId);\n // });\n\n // if(contactsList.length) {\n // this.contactsFillPromise = deferredPromise();\n // this.contactsFillPromise.resolve(this.contactsList);\n // }\n // }\n\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n this.peersStorage.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!this.peersStorage.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n if(user.username) {\n delete this.usernames[cleanUsername(user.username)];\n }\n\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n\n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n };\n\n public get userId() {\n return this.rootScope.myId.toUserId();\n }\n\n private onContactsModified(fromServer?: boolean) {\n // const contactsList = [...this.contactsList];\n // this.appStateManager.pushToState('contactsList', contactsList);\n\n if(fromServer) {\n this.appStateManager.pushToState('contactsListCachedTime', tsNow(true));\n }\n }\n\n public pushRecentSearch(peerId: PeerId) {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n\n this.appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n this.peersStorage.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }\n\n public clearRecentSearch() {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n this.peersStorage.releasePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n this.appStateManager.pushToState('recentSearch', recentSearch);\n });\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n this.apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n\n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified(true);\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise || (this.contactsFillPromise = promise)\n };\n }\n\n public resolveUsername(username: string): Promise | Chat | User {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n const userId = this.usernames[username];\n if(userId) {\n return this.users[userId];\n }\n\n return this.apiManager.invokeApi('contacts.resolveUsername', {username}).then((resolvedPeer) => {\n return this.processResolvedPeer(resolvedPeer);\n });\n }\n\n private processResolvedPeer(resolvedPeer: ContactsResolvedPeer.contactsResolvedPeer) {\n this.saveApiUsers(resolvedPeer.users);\n this.appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return this.appPeersManager.getPeer(getPeerId(resolvedPeer.peer)) as Chat | User;\n }\n\n public resolvePhone(phone: string) {\n return this.apiManager.invokeApi('contacts.resolvePhone', {phone}).then((resolvedPeer) => {\n return this.processResolvedPeer(resolvedPeer) as User;\n });\n }\n\n private pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n this.peersStorage.requestPeer(id.toPeerId(), 'contact');\n }\n\n private popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n this.peersStorage.releasePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n user.username,\n // user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then((_contactsList) => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter((id) => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = this.getUserStatusForSort(this.getUser(userId1).status);\n const status2 = this.getUserStatusForSort(this.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = this.userId;\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0],\n includeSaved?: Parameters[1],\n sortBy?: Parameters[2],\n limit?: number\n ) {\n return this.getContacts(query, includeSaved, sortBy).then((userIds) => {\n const peerIds = userIds.map((userId) => userId.toPeerId(false));\n if(limit) {\n return peerIds.slice(0, limit);\n }\n\n return peerIds;\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return this.apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: this.appPeersManager.getInputPeerById(peerId)\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n private setUserNameToCache(user: MTUser.user, oldUser?: MTUser.user) {\n if(!oldUser || oldUser.username !== user.username) {\n if(oldUser?.username) {\n const oldSearchUsername = cleanUsername(oldUser.username);\n delete this.usernames[oldSearchUsername];\n }\n\n if(user.username) {\n const searchUsername = cleanUsername(user.username);\n this.usernames[searchUsername] = user.id;\n }\n }\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(user._ === 'userEmpty') return;\n\n const userId = user.id;\n const oldUser = this.users[userId];\n\n // ! commented block can affect performance !\n // if(oldUser && !override) {\n // console.log('saveApiUser same');\n // return;\n // }\n\n if(user.pFlags === undefined) {\n user.pFlags = {};\n }\n\n if(user.pFlags.min && oldUser !== undefined) {\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\n\n this.setUserNameToCache(user, oldUser);\n\n if(!oldUser ||\n oldUser.sortName === undefined ||\n oldUser.first_name !== user.first_name ||\n oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false);\n } else {\n user.sortName = oldUser.sortName;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= this.timeManager.getServerTimeOffset();\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n // user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n const changedTitle = user.first_name !== oldUser.first_name ||\n user.last_name !== oldUser.last_name ||\n user.username !== oldUser.username;\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const changedPhoto = oldPhotoId !== newPhotoId;\n\n const changedAnyBadge = oldUser.pFlags.premium !== user.pFlags.premium ||\n oldUser.pFlags.verified !== user.pFlags.verified ||\n oldUser.pFlags.scam !== user.pFlags.scam ||\n oldUser.pFlags.fake !== user.pFlags.fake;\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n\n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n this.rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', user.id.toPeerId());\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\n }\n }\n\n this.checkPremium(user);\n this.setUserToStateIfNeeded(user);\n }\n\n private checkPremium(user: User) {\n if(user.pFlags.self) {\n const isPremium = !!user.pFlags.premium;\n if(this.rootScope.premium !== isPremium) {\n this.rootScope.dispatchEvent('premium_toggle', isPremium);\n }\n }\n }\n\n private setUserToStateIfNeeded(user: User) {\n if(this.peersStorage.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n status = this.getUser(status).status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id] || {_: 'userEmpty', id, pFlags: {deleted: true}, access_hash: ''} as any as User;\n }\n\n public getSelf() {\n return this.getUser(this.userId);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n\n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id !== this.userId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public getUserPhoto(id: UserId) {\n const user = this.getUser(id);\n\n return user && user.photo || {\n _: 'userProfilePhotoEmpty'\n };\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n // ! do not use it, there are places that don't support it. need explicit peer id\n // if(user.pFlags?.self) {\n // return {_: 'inputPeerSelf'};\n // }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n private updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n private updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n this.rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(this.apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user?.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then((userIds) => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return this.apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = this.appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return this.apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n // console.log(result);\n this.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = getPeerId(topPeer.peer);\n this.peersStorage.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n\n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n this.appStateManager.pushToState('topPeersCache', state.topPeersCache);\n\n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return this.apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then((contactsBlocked) => {\n this.saveApiUsers(contactsBlocked.users);\n this.appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map((u) => u.id.toPeerId()).concat(contactsBlocked.chats.map((c) => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number,\n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return this.apiManager.invokeApi('contacts.getLocated', {\n geo_point,\n background\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then((results) => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map((p) => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map((p) => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n // handle 't.me/username' as 'username'\n const entities = parseEntities(query);\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\n try {\n const url = new URL(wrapUrl(query).url);\n const path = url.pathname.slice(1);\n if(path) {\n query = path;\n }\n } catch(err) {}\n }\n\n return this.apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then((peers) => {\n this.saveApiUsers(peers.users);\n this.appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map((p) => getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map((p) => getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n this.rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return this.apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public updateMyOnlineStatus(offline: boolean) {\n this.setUserStatus(this.getSelf().id, offline);\n return this.apiManager.invokeApiSingle('account.updateStatus', {offline});\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, showPhone?: true) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return this.apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: showPhone\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return this.apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map((userId) => this.getUserInput(userId))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach((userId) => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n\n public isRestricted(userId: UserId) {\n const user: MTUser.user = this.getUser(userId);\n const restrictionReasons = user.restriction_reason;\n\n return !!(user.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\n }\n\n public checkUsername(username: string) {\n return this.apiManager.invokeApi('account.checkUsername', {username});\n }\n\n public canSendToUser(userId: UserId) {\n return canSendToUser(this.getUser(userId));\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\r\nimport {WebPage} from '../../layer';\r\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\r\nimport {AppManager} from './manager';\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager extends AppManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set\r\n } = {};\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n\r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage &&\r\n oldWebPage._ === apiWebPage._ &&\r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = this.appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n\r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = this.appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n\r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n const shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n // delete apiWebPage.description\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n\r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n\r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n\r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(),\r\n mid: +mid,\r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n this.rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getCachedWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n\r\n public getWebPage(url: string) {\r\n return this.apiManager.invokeApiHashable({\r\n method: 'messages.getWebPage',\r\n processResult: (webPage) => {\r\n return this.saveWebPage(webPage);\r\n },\r\n params: {\r\n url\r\n }\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","export default function fileNameRFC(fileName: string) {\n // Make filename RFC5987 compatible\n return encodeURIComponent(fileName).replace(/['()]/g, escape).replace(/\\*/g, '%2A');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport StreamWriter from './streamWriter';\n\nexport default class DownloadWriter implements StreamWriter {\n constructor(\n private serviceMessagePort: ServiceMessagePort,\n private downloadId: string\n ) {\n this.serviceMessagePort = getServiceMessagePort();\n }\n\n public async write(part: Uint8Array, offset?: number) {\n return this.serviceMessagePort.invoke('downloadChunk', {\n id: this.downloadId,\n chunk: part\n });\n }\n\n public finalize(saveToStorage?: boolean): Promise {\n return this.serviceMessagePort.invoke('downloadFinalize', this.downloadId).then(() => 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 makeError from '../../helpers/makeError';\nimport fileNameRFC from '../../helpers/string/fileNameRFC';\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport DownloadWriter from './downloadWriter';\nimport FileStorage from './fileStorage';\n\nexport default class DownloadStorage implements FileStorage {\n public getFile(fileName: string): Promise {\n return Promise.reject(makeError('NO_ENTRY_FOUND'));\n }\n\n public prepareWriting({fileName, downloadId, size}: {\n fileName: string,\n downloadId: string,\n size: number\n }) {\n const headers = {\n 'Content-Type': 'application/octet-stream; charset=utf-8',\n 'Content-Disposition': 'attachment; filename*=UTF-8\\'\\'' + fileNameRFC(fileName),\n ...(size ? {'Content-Length': size} : {})\n };\n\n const serviceMessagePort = getServiceMessagePort();\n const promise = serviceMessagePort.invoke('download', {\n headers,\n id: downloadId\n });\n\n const deferred = deferredPromise();\n deferred.cancel = () => {\n deferred.reject(makeError('DOWNLOAD_CANCELED'));\n };\n\n deferred.catch(() => {\n getServiceMessagePort().invoke('downloadCancel', downloadId);\n });\n\n promise.then(deferred.resolve, deferred.reject);\n\n return {\n deferred,\n getWriter: () => {\n return new DownloadWriter(serviceMessagePort, downloadId);\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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {ReferenceBytes} from './referenceDatabase';\r\nimport Modes from '../../config/modes';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport {randomLong} from '../../helpers/random';\r\nimport {Document, InputFile, InputFileLocation, InputWebFileLocation, Photo, PhotoSize, UploadFile, UploadWebFile, VideoSize, WebDocument} from '../../layer';\r\nimport {DcId} from '../../types';\r\nimport CacheStorageController from '../files/cacheStorage';\r\nimport {logger, LogTypes} from '../logger';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport noop from '../../helpers/noop';\r\nimport readBlobAsArrayBuffer from '../../helpers/blob/readBlobAsArrayBuffer';\r\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\r\nimport findAndSplice from '../../helpers/array/findAndSplice';\r\nimport fixFirefoxSvg from '../../helpers/fixFirefoxSvg';\r\nimport {AppManager} from '../appManagers/manager';\r\nimport {getEnvironment} from '../../environment/utils';\r\nimport MTProtoMessagePort from './mtprotoMessagePort';\r\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\r\nimport type {Progress} from '../appManagers/appDownloadManager';\r\nimport getDownloadMediaDetails from '../appManagers/utils/download/getDownloadMediaDetails';\r\n// import networkStats from './networkStats';\r\nimport getDownloadFileNameFromOptions from '../appManagers/utils/download/getDownloadFileNameFromOptions';\r\nimport StreamWriter from '../files/streamWriter';\r\nimport FileStorage from '../files/fileStorage';\r\nimport {MAX_FILE_SAVE_SIZE} from './mtproto_config';\r\nimport throttle from '../../helpers/schedulers/throttle';\r\nimport makeError from '../../helpers/makeError';\r\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\r\nimport DownloadStorage from '../files/downloadStorage';\r\nimport copy from '../../helpers/object/copy';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport {MIME_TYPE_EXTENSION_MAP} from '../../environment/mimeTypeMap';\r\nimport {getServiceMessagePort} from './mtproto.worker';\r\n\r\ntype Delayed = {\r\n offset: number,\r\n writePromise: CancellablePromise,\r\n writeDeferred: CancellablePromise\r\n};\r\n\r\nexport type DownloadOptions = {\r\n dcId: DcId,\r\n location: InputFileLocation | InputWebFileLocation,\r\n size?: number,\r\n fileName?: string,\r\n mimeType?: MTMimeType,\r\n limitPart?: number,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n downloadId?: string\r\n // getFileMethod: Parameters[1]\r\n};\r\n\r\nexport type DownloadMediaOptions = {\r\n media: Photo.photo | Document.document | WebDocument,\r\n thumb?: PhotoSize | VideoSize,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n downloadId?: string\r\n};\r\n\r\ntype DownloadPromise = CancellablePromise;\r\n\r\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\r\n\r\n// export interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\r\n// type: 'refreshReference',\r\n// payload: ReferenceBytes,\r\n// };\r\n\r\n// export interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\r\n// type: 'refreshReference',\r\n// payload: ReferenceBytes,\r\n// originalPayload: ReferenceBytes\r\n// };\r\n\r\nconst MAX_DOWNLOAD_FILE_PART_SIZE = 1 * 1024 * 1024;\r\nconst MAX_UPLOAD_FILE_PART_SIZE = 512 * 1024;\r\nconst MIN_PART_SIZE = 128 * 1024;\r\nconst AVG_PART_SIZE = 512 * 1024;\r\n\r\nconst REGULAR_DOWNLOAD_DELTA = (9 * 512 * 1024) / MIN_PART_SIZE;\r\n// const PREMIUM_DOWNLOAD_DELTA = REGULAR_DOWNLOAD_DELTA * 2;\r\nconst PREMIUM_DOWNLOAD_DELTA = (56 * 512 * 1024) / MIN_PART_SIZE;\r\n\r\nconst IGNORE_ERRORS: Set = new Set([\r\n 'DOWNLOAD_CANCELED',\r\n 'UPLOAD_CANCELED',\r\n 'UNKNOWN',\r\n 'NO_NEW_CONTEXT'\r\n]);\r\n\r\nexport class ApiFileManager extends AppManager {\r\n private cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloadStorage = new DownloadStorage();\r\n\r\n private downloadPromises: {\r\n [fileName: string]: DownloadPromise\r\n } = {};\r\n\r\n // private downloadToDiscPromises: {\r\n // [fileName: string]: DownloadPromise\r\n // } = {};\r\n\r\n private uploadPromises: {\r\n [fileName: string]: CancellablePromise\r\n } = {};\r\n\r\n private downloadPulls: {\r\n [dcId: string]: Array<{\r\n id: number,\r\n queueId: number,\r\n cb: () => Promise,\r\n deferred: {\r\n resolve: (...args: any[]) => void,\r\n reject: (...args: any[]) => void\r\n },\r\n activeDelta: number\r\n }>\r\n } = {};\r\n private downloadActives: {[dcId: string]: number} = {};\r\n\r\n public refreshReferencePromises: {\r\n [referenceHex: string]: {\r\n deferred: CancellablePromise,\r\n timeout?: number\r\n }\r\n } = {};\r\n\r\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\r\n private tempId = 0;\r\n private queueId = 0;\r\n private debug = Modes.debug;\r\n\r\n private maxUploadParts = 4000;\r\n private maxDownloadParts = 8000;\r\n private webFileDcId: DcId;\r\n\r\n protected after() {\r\n setInterval(() => { // clear old promises\r\n for(const hex in this.refreshReferencePromises) {\r\n const {deferred} = this.refreshReferencePromises[hex];\r\n if(deferred.isFulfilled || deferred.isRejected) {\r\n delete this.refreshReferencePromises[hex];\r\n }\r\n }\r\n }, 1800e3);\r\n\r\n this.rootScope.addEventListener('config', (config) => {\r\n this.webFileDcId = config.webfile_dc_id;\r\n });\r\n\r\n this.rootScope.addEventListener('app_config', (appConfig) => {\r\n this.maxUploadParts = this.rootScope.premium ? appConfig.upload_max_fileparts_premium : appConfig.upload_max_fileparts_default;\r\n this.maxDownloadParts = appConfig.upload_max_fileparts_premium;\r\n });\r\n }\r\n\r\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\r\n if(this.downloadPulls[dcId] === undefined) {\r\n this.downloadPulls[dcId] = [];\r\n this.downloadActives[dcId] = 0;\r\n }\r\n\r\n const downloadPull = this.downloadPulls[dcId];\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\r\n });\r\n\r\n setTimeout(() => {\r\n this.downloadCheck(dcId);\r\n }, 0);\r\n\r\n return promise;\r\n }\r\n\r\n private downloadCheck(dcId: string | number) {\r\n const downloadPull = this.downloadPulls[dcId];\r\n const downloadLimit = /* dcId === 'upload' ? 24 : */(this.rootScope.premium ? PREMIUM_DOWNLOAD_DELTA : REGULAR_DOWNLOAD_DELTA);\r\n // const downloadLimit = Infinity;\r\n\r\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull?.length) {\r\n return false;\r\n }\r\n\r\n // const data = downloadPull.shift();\r\n const data = findAndSplice(downloadPull, (d) => d.queueId === 0) || findAndSplice(downloadPull, (d) => d.queueId === this.queueId) || downloadPull.shift();\r\n const activeDelta = data.activeDelta || 1;\r\n\r\n this.downloadActives[dcId] += activeDelta;\r\n\r\n const promise = data.cb();\r\n // const networkPromise = networkStats.waitForChunk(dcId as DcId, activeDelta * MIN_PART_SIZE);\r\n /* Promise.race([\r\n promise\r\n // networkPromise\r\n ]) */promise.then(() => {\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n // networkPromise.resolve();\r\n }, (error: ApiError) => {\r\n if(!error?.type || !IGNORE_ERRORS.has(error.type)) {\r\n this.log.error('downloadCheck error:', error);\r\n }\r\n\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n // networkPromise.reject(error);\r\n }).finally(() => {\r\n promise.then(data.deferred.resolve, data.deferred.reject);\r\n });\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n // this.log.error('setQueueId', queueId);\r\n this.queueId = queueId;\r\n }\r\n\r\n private getFileStorage() {\r\n return this.cacheStorage;\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n const promises = [this.downloadPromises[fileName], this.uploadPromises[fileName]].filter(Boolean);\r\n let canceled = false;\r\n for(let i = 0, length = promises.length; i < length; ++i) {\r\n const promise = promises[i];\r\n if(promise && !promise.isRejected && !promise.isFulfilled) {\r\n promise.cancel();\r\n canceled = true;\r\n }\r\n }\r\n\r\n return canceled;\r\n }\r\n\r\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel?.();\r\n\r\n return this.apiManager.invokeApi('upload.getWebFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n });\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n public requestFilePart(\r\n dcId: DcId,\r\n location: InputFileLocation,\r\n offset: number,\r\n limit: number,\r\n id = 0,\r\n queueId = 0,\r\n checkCancel?: () => void\r\n ) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel?.();\r\n\r\n const invoke = async(): Promise => {\r\n checkCancel?.(); // do not remove async, because checkCancel will throw an error\r\n\r\n // * IMPORTANT: reference can be changed in previous request\r\n const reference = (location as InputFileLocation.inputDocumentFileLocation).file_reference?.slice();\r\n\r\n const promise = // pause(offset > (100 * 1024 * 1024) ? 10000000 : 0).then(() =>\r\n this.apiManager.invokeApi('upload.getFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n }) as Promise/* ) */;\r\n\r\n return promise.catch((err: ApiError) => {\r\n checkCancel?.();\r\n\r\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\r\n return this.refreshReference(location as InputFileLocation.inputDocumentFileLocation, reference).then(invoke);\r\n }\r\n\r\n throw err;\r\n });\r\n };\r\n\r\n assumeType(location);\r\n const reference = location.file_reference;\r\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\r\n location.checkedReference = true;\r\n const hex = bytesToHex(reference);\r\n if(this.refreshReferencePromises[hex]) {\r\n return this.refreshReference(location, reference).then(invoke);\r\n }\r\n }\r\n\r\n return invoke();\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n /* private convertBlobToBytes(blob: Blob) {\r\n return blob.arrayBuffer().then((buffer) => new Uint8Array(buffer));\r\n } */\r\n\r\n private getDelta(bytes: number) {\r\n return bytes / MIN_PART_SIZE;\r\n }\r\n\r\n private getLimitPart(size: number, isUpload: boolean): number {\r\n if(!size) { // * sometimes size can be 0 (e.g. avatars, webDocuments)\r\n return AVG_PART_SIZE;\r\n }\r\n\r\n // return 1 * 1024 * 1024;\r\n\r\n let bytes = MIN_PART_SIZE;\r\n\r\n const maxParts = isUpload ? this.maxUploadParts : this.maxDownloadParts;\r\n const maxPartSize = isUpload ? MAX_UPLOAD_FILE_PART_SIZE : MAX_DOWNLOAD_FILE_PART_SIZE;\r\n // usually it will stick to 512Kb size if the file is too big\r\n while((size / bytes) > maxParts && bytes < maxPartSize) {\r\n bytes *= 2;\r\n }\r\n /* if(size < 1e6 || !size) bytes = 512;\r\n else if(size < 3e6) bytes = 256;\r\n else bytes = 128; */\r\n\r\n return bytes;\r\n }\r\n\r\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\r\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise;\r\n };\r\n\r\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\r\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n const buffer = bytes.slice().buffer;\r\n if(getEnvironment().IS_FIREFOX) {\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\r\n return fixFirefoxSvg(text as string);\r\n }).then((text) => {\r\n const textEncoder = new TextEncoder();\r\n return textEncoder.encode(text);\r\n });\r\n }\r\n\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise;\r\n };\r\n\r\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\r\n const instance = MTProtoMessagePort.getInstance();\r\n return instance.invoke('convertWebp', {fileName, bytes});\r\n };\r\n\r\n private convertOpus = (bytes: Uint8Array, fileName: string) => {\r\n const instance = MTProtoMessagePort.getInstance();\r\n return instance.invoke('convertOpus', {fileName, bytes});\r\n };\r\n\r\n private refreshReference(\r\n inputFileLocation: InputFileLocation.inputDocumentFileLocation,\r\n reference: typeof inputFileLocation['file_reference'],\r\n hex = bytesToHex(reference)\r\n ) {\r\n let r = this.refreshReferencePromises[hex];\r\n if(!r) {\r\n const deferred = deferredPromise();\r\n\r\n r = this.refreshReferencePromises[hex] = {\r\n deferred\r\n\r\n // ! I don't remember what it was for...\r\n // timeout: ctx.setTimeout(() => {\r\n // this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\r\n // deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\r\n // }, 60000)\r\n };\r\n\r\n // deferred.catch(noop).finally(() => {\r\n // clearTimeout(r.timeout);\r\n // });\r\n\r\n this.referenceDatabase.refreshReference(reference).then((reference) => {\r\n if(hex === bytesToHex(reference)) {\r\n deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\r\n }\r\n\r\n deferred.resolve(reference);\r\n }, deferred.reject);\r\n }\r\n\r\n // have to replace file_reference in any way, because location can be different everytime if it's stream\r\n return r.deferred.then((reference) => {\r\n inputFileLocation.file_reference = reference;\r\n });\r\n }\r\n\r\n public isDownloading(fileName: string) {\r\n return !!this.downloadPromises[fileName];\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloadPromises[fileName];\r\n }\r\n\r\n public getUpload(fileName: string) {\r\n return this.uploadPromises[fileName];\r\n }\r\n\r\n private getConvertMethod(mimeType: MTMimeType) {\r\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\r\n if(mimeType === 'application/x-tgwallpattern') {\r\n process = this.uncompressTGV;\r\n mimeType = 'image/svg+xml';\r\n } else if(mimeType === 'image/webp' && !getEnvironment().IS_WEBP_SUPPORTED) {\r\n process = this.convertWebp;\r\n mimeType = 'image/png';\r\n } else if(mimeType === 'application/x-tgsticker') {\r\n process = this.uncompressTGS;\r\n mimeType = 'application/json';\r\n } else if(mimeType === 'audio/ogg' && !getEnvironment().IS_OPUS_SUPPORTED) {\r\n process = this.convertOpus;\r\n mimeType = 'audio/wav';\r\n }\r\n\r\n return {mimeType, process};\r\n }\r\n\r\n private allocateDeferredPromises(startOffset: number, size: number, limitPart: number) {\r\n const delayed: Delayed[] = [];\r\n let offset = startOffset;\r\n let writePromise: CancellablePromise = Promise.resolve(),\r\n writeDeferred: CancellablePromise;\r\n do {\r\n writeDeferred = deferredPromise();\r\n delayed.push({offset, writePromise, writeDeferred});\r\n writePromise = writeDeferred;\r\n offset += limitPart;\r\n } while(offset < size);\r\n\r\n return delayed;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadPromise {\r\n const size = options.size ?? 0;\r\n const {dcId, location} = options;\r\n let {downloadId} = options;\r\n if(downloadId && !getServiceMessagePort()) {\r\n this.log.error('download fallback to blob', options);\r\n downloadId = undefined;\r\n }\r\n\r\n const originalMimeType = options.mimeType;\r\n const convertMethod = this.getConvertMethod(originalMimeType);\r\n const {process} = convertMethod;\r\n options.mimeType = convertMethod.mimeType || 'image/jpeg';\r\n\r\n const fileName = getDownloadFileNameFromOptions(options);\r\n const cacheFileName = downloadId ? getDownloadFileNameFromOptions({...copy(options), downloadId: undefined}) : fileName;\r\n const cacheStorage: FileStorage = this.getFileStorage();\r\n const downloadStorage: FileStorage = downloadId ? this.downloadStorage : undefined;\r\n let deferred: DownloadPromise = downloadId ? undefined : this.downloadPromises[fileName];\r\n\r\n this.debug && this.log('downloadFile', fileName, options);\r\n\r\n if(deferred) {\r\n return deferred;\r\n }\r\n\r\n // if(deferred) {\r\n // if(size) {\r\n // return deferred.then(async(blob) => {\r\n // if(blob instanceof Blob && blob.size < size) {\r\n // this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\r\n\r\n // try {\r\n // await this.delete(fileName);\r\n // } finally {\r\n // return this.download(options);\r\n // }\r\n // } else {\r\n // return blob;\r\n // }\r\n // });\r\n // } else {\r\n // return deferred;\r\n // }\r\n // }\r\n\r\n const errorHandler = (item: typeof cachePrepared, error: ApiError) => {\r\n if(item?.error) {\r\n return;\r\n }\r\n\r\n for(const p of prepared) {\r\n if(item && item !== p) {\r\n continue;\r\n }\r\n\r\n p.error = error;\r\n p.deferred.reject(error);\r\n }\r\n };\r\n\r\n const id = this.tempId++;\r\n const limitPart = options.limitPart || this.getLimitPart(size, false);\r\n\r\n let getFile: FileStorage['getFile'] = cacheStorage.getFile.bind(cacheStorage);\r\n\r\n let cachePrepared: ReturnType & {writer?: StreamWriter, error?: ApiError},\r\n downloadPrepared: typeof cachePrepared;\r\n const prepared: (typeof cachePrepared)[] = [];\r\n const possibleSize = size || limitPart;\r\n\r\n const getErrorsCount = () => prepared.reduce((acc, item) => acc + +!!item.error, 0);\r\n\r\n const attach = (item: typeof cachePrepared, fileName: string) => {\r\n const {deferred} = item;\r\n const _errorHandler = errorHandler.bind(null, item);\r\n\r\n deferred.cancel = () => deferred.reject(makeError('DOWNLOAD_CANCELED'));\r\n deferred.catch((error) => {\r\n _errorHandler(error);\r\n item.writer?.truncate?.();\r\n }).finally(() => {\r\n if(this.downloadPromises[fileName] === deferred) {\r\n delete this.downloadPromises[fileName];\r\n }\r\n\r\n delete item.writer;\r\n // indexOfAndSplice(prepared, item);\r\n });\r\n\r\n this.downloadPromises[fileName] = deferred;\r\n\r\n prepared.push(item);\r\n };\r\n\r\n if(cacheStorage && (!downloadStorage || possibleSize <= MAX_FILE_SAVE_SIZE)) {\r\n cachePrepared = cacheStorage.prepareWriting(cacheFileName, possibleSize, options.mimeType)\r\n attach(cachePrepared, cacheFileName);\r\n }\r\n\r\n if(downloadStorage) {\r\n let downloadFileName = options.fileName; // it's doc file_name\r\n if(!downloadFileName) {\r\n downloadFileName = cacheFileName;\r\n const ext = MIME_TYPE_EXTENSION_MAP[options.mimeType];\r\n if(ext) {\r\n downloadFileName += '.' + ext;\r\n }\r\n }\r\n\r\n downloadPrepared = downloadStorage.prepareWriting({\r\n fileName: downloadFileName,\r\n downloadId,\r\n size: possibleSize\r\n });\r\n attach(downloadPrepared, fileName);\r\n\r\n if(cachePrepared) { // cancel cache too\r\n downloadPrepared.deferred.catch((err) => cachePrepared.deferred.reject(err));\r\n }\r\n\r\n // this.downloadToDiscPromises[cacheFileName] = deferred;\r\n // deferred.catch(noop).finally(() => {\r\n // if(this.downloadToDiscPromises[cacheFileName] === deferred) {\r\n // delete this.downloadToDiscPromises[cacheFileName];\r\n // }\r\n // });\r\n }\r\n\r\n deferred = downloadPrepared?.deferred ?? cachePrepared.deferred;\r\n\r\n if(downloadStorage && process) { // then have to load file again\r\n getFile = downloadStorage.getFile.bind(downloadStorage);\r\n }\r\n\r\n getFile(cacheFileName).then(async(blob: Blob) => {\r\n checkCancel();\r\n\r\n // if(blob.size < size) {\r\n // if(!options.onlyCache) {\r\n // await this.delete(cacheFileName);\r\n // checkCancel();\r\n // }\r\n\r\n // throw makeError('NO_ENTRY_FOUND');\r\n // }\r\n\r\n if(downloadPrepared) {\r\n const writer = downloadPrepared.writer = downloadPrepared.getWriter();\r\n checkCancel();\r\n\r\n const arr = await readBlobAsUint8Array(blob);\r\n checkCancel();\r\n await writer.write(arr);\r\n checkCancel();\r\n\r\n downloadPrepared.deferred.resolve(await writer.finalize());\r\n }\r\n\r\n if(cachePrepared) {\r\n cachePrepared.deferred.resolve(blob);\r\n }\r\n }).catch(async(err: ApiError) => {\r\n if(options.onlyCache) {\r\n errorHandler(null, err);\r\n return;\r\n }\r\n\r\n prepared.forEach((p) => {\r\n p.writer = p.getWriter();\r\n });\r\n\r\n const maxRequests = Infinity;\r\n\r\n const isWebFile = location._ === 'inputWebFileLocation';\r\n const requestPart = (isWebFile ? this.requestWebFilePart : this.requestFilePart).bind(this);\r\n\r\n if(isWebFile && this.webFileDcId === undefined) {\r\n await this.apiManager.getConfig();\r\n checkCancel();\r\n }\r\n\r\n const delayed = this.allocateDeferredPromises(0, size, limitPart);\r\n\r\n const progress: Progress = {done: 0, offset: 0, total: size, fileName};\r\n const dispatchProgress = () => {\r\n try {\r\n checkCancel();\r\n progress.done = done;\r\n this.rootScope.dispatchEvent('download_progress', progress);\r\n } catch(err) {}\r\n };\r\n\r\n const throttledDispatchProgress = throttle(dispatchProgress, 50, true);\r\n\r\n let done = 0;\r\n const superpuper = async() => {\r\n const {offset, writePromise, writeDeferred} = delayed.shift();\r\n try {\r\n checkCancel();\r\n\r\n const requestPerf = performance.now();\r\n const result = await requestPart(dcId, location as any, offset, limitPart, id, options.queueId, checkCancel);\r\n const requestTime = performance.now() - requestPerf;\r\n\r\n const bytes = result.bytes;\r\n\r\n if(delayed.length) {\r\n superpuper();\r\n }\r\n\r\n const byteLength = bytes.byteLength;\r\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\r\n const isFinal = (offset + limitPart) >= size || !byteLength;\r\n if(byteLength) {\r\n done += byteLength;\r\n\r\n if(isFinal) {\r\n dispatchProgress();\r\n } else {\r\n throttledDispatchProgress();\r\n }\r\n\r\n const writeQueuePerf = performance.now();\r\n await writePromise;\r\n checkCancel();\r\n const writeQueueTime = performance.now() - writeQueuePerf;\r\n\r\n const perf = performance.now();\r\n await Promise.all(prepared.map(({writer}) => writer?.write(bytes, offset)));\r\n checkCancel();\r\n // downloadId && this.log('write time', performance.now() - perf, 'request time', requestTime, 'queue time', writeQueueTime);\r\n }\r\n\r\n if(isFinal) {\r\n if(!size || done < size) {\r\n prepared.forEach(({writer}) => writer?.trim?.(done));\r\n }\r\n }\r\n\r\n if(isFinal && process) {\r\n const promises = prepared\r\n .filter(({writer}) => writer?.getParts && writer.replaceParts)\r\n .map(async({writer}) => {\r\n const bytes = writer.getParts();\r\n const processedResult = await process(bytes, cacheFileName);\r\n writer.replaceParts(processedResult);\r\n });\r\n\r\n await Promise.all(promises);\r\n checkCancel();\r\n }\r\n\r\n writeDeferred.resolve();\r\n\r\n if(isFinal) {\r\n const saveToStorage = done <= MAX_FILE_SAVE_SIZE;\r\n prepared.forEach((item) => {\r\n const {deferred, writer} = item;\r\n if(deferred.isFulfilled || deferred.isRejected || !writer) {\r\n return;\r\n }\r\n\r\n const result = writer.finalize(saveToStorage);\r\n deferred.resolve(result);\r\n });\r\n }\r\n } catch(err) {\r\n errorHandler(null, err as ApiError);\r\n }\r\n };\r\n\r\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\r\n superpuper();\r\n }\r\n }).catch(noop);\r\n\r\n const checkCancel = () => {\r\n if(getErrorsCount() === prepared.length) {\r\n throw prepared[0].error;\r\n }\r\n };\r\n\r\n return deferred;\r\n }\r\n\r\n public downloadMedia(options: DownloadMediaOptions): DownloadPromise {\r\n let {media, thumb} = options;\r\n const isPhoto = media._ === 'photo';\r\n if(isPhoto && !thumb) {\r\n return Promise.reject('preloadPhoto photoEmpty!');\r\n }\r\n\r\n // get original instance with correct file_reference instead of using copies\r\n const isDocument = media._ === 'document';\r\n // const isWebDocument = media._ === 'webDocument';\r\n if(isDocument) media = this.appDocsManager.getDoc((media as Document.document).id);\r\n else if(isPhoto) media = this.appPhotosManager.getPhoto((media as Photo.photo).id);\r\n\r\n const {fileName, downloadOptions} = getDownloadMediaDetails(options);\r\n\r\n let promise = this.getDownload(fileName);\r\n if(!promise) {\r\n promise = this.download(downloadOptions);\r\n\r\n if(isDocument && !thumb) {\r\n this.rootScope.dispatchEvent('document_downloading', (media as Document.document).id);\r\n promise.catch(noop).finally(() => {\r\n this.rootScope.dispatchEvent('document_downloaded', (media as Document.document).id);\r\n });\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public downloadMediaURL(options: DownloadMediaOptions): Promise {\r\n const {media, thumb} = options;\r\n\r\n let cacheContext = this.thumbsStorage.getCacheContext(media as any, thumb?.type);\r\n if((thumb ? (cacheContext.downloaded >= ('size' in thumb ? thumb.size : 0)) : true) && cacheContext.url) {\r\n return Promise.resolve(cacheContext.url);\r\n }\r\n\r\n return this.downloadMedia(options).then((blob) => {\r\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\r\n const url = URL.createObjectURL(blob);\r\n cacheContext = this.thumbsStorage.setCacheContextURL(media as any, cacheContext.type, url, blob.size);\r\n }\r\n\r\n return cacheContext.url;\r\n });\r\n }\r\n\r\n public downloadMediaVoid(options: DownloadMediaOptions) {\r\n return this.downloadMedia(options).then(noop);\r\n }\r\n\r\n private delete(fileName: string) {\r\n delete this.downloadPromises[fileName];\r\n return this.getFileStorage().delete(fileName);\r\n }\r\n\r\n public upload({file, fileName}: {file: Blob | File, fileName?: string}) {\r\n fileName ||= getFileNameForUpload(file);\r\n\r\n const fileSize = file.size;\r\n const isBigFile = fileSize >= 10485760;\r\n const partSize = this.getLimitPart(fileSize, true);\r\n const activeDelta = this.getDelta(partSize);\r\n const totalParts = Math.ceil(fileSize / partSize);\r\n const fileId = randomLong();\r\n const resultInputFile: InputFile = {\r\n _: isBigFile ? 'inputFileBig' : 'inputFile',\r\n id: fileId as any,\r\n parts: totalParts,\r\n name: fileName,\r\n md5_checksum: ''\r\n };\r\n\r\n const deferred = deferredPromise();\r\n if(totalParts > this.maxUploadParts) {\r\n deferred.reject(makeError('FILE_TOO_BIG'));\r\n return deferred;\r\n }\r\n\r\n let canceled = false, resolved = false;\r\n let errorHandler = (error: ApiError) => {\r\n if(error?.type !== 'UPLOAD_CANCELED') {\r\n this.log.error('Up Error', error);\r\n }\r\n\r\n deferred.reject(error);\r\n canceled = true;\r\n errorHandler = noop;\r\n };\r\n\r\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\r\n const id = this.tempId++;\r\n\r\n const self = this;\r\n function* generator() {\r\n let _part = 0, doneParts = 0;\r\n for(let offset = 0; offset < fileSize; offset += partSize) {\r\n const part = _part++; // 0, 1\r\n yield self.downloadRequest('upload', id, async() => {\r\n checkCancel();\r\n\r\n const blob = file.slice(offset, offset + partSize);\r\n const buffer = await readBlobAsArrayBuffer(blob);\r\n checkCancel();\r\n\r\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\r\n\r\n return self.apiManager.invokeApi(method, {\r\n file_id: fileId,\r\n file_part: part,\r\n file_total_parts: totalParts,\r\n bytes: buffer\r\n } as any, {\r\n fileUpload: true\r\n }).then(() => {\r\n if(canceled) {\r\n return;\r\n }\r\n\r\n ++doneParts;\r\n const progress: Progress = {done: doneParts * partSize, offset, total: fileSize, fileName};\r\n deferred.notify(progress);\r\n\r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, errorHandler);\r\n }, activeDelta).catch(errorHandler);\r\n }\r\n }\r\n\r\n const it = generator();\r\n const process = () => {\r\n if(canceled) return;\r\n const r = it.next();\r\n if(r.done || canceled) return;\r\n (r.value as Promise).then(process);\r\n };\r\n\r\n const maxRequests = Infinity;\r\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\r\n process();\r\n }\r\n\r\n const checkCancel = () => {\r\n if(canceled) {\r\n throw makeError('UPLOAD_CANCELED');\r\n }\r\n };\r\n\r\n deferred.cancel = () => {\r\n if(!canceled && !resolved) {\r\n canceled = true;\r\n errorHandler(makeError('UPLOAD_CANCELED'));\r\n }\r\n };\r\n\r\n deferred.notify = (progress: Progress) => {\r\n this.rootScope.dispatchEvent('download_progress', progress);\r\n };\r\n\r\n deferred.finally(() => {\r\n if(this.uploadPromises[fileName] === deferred) {\r\n delete this.uploadPromises[fileName];\r\n }\r\n });\r\n\r\n return this.uploadPromises[fileName] = deferred;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function fixFirefoxSvg(text: string) {\n const svgIndex = text.indexOf('/, ` width=\"${width}\" height=\"${height}\">`).replace(/[^\\x00-\\x7F]/g, '');\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../../environment/ctx';\nimport callbackify from '../../helpers/callbackify';\nimport {ignoreRestrictionReasons} from '../../helpers/restrictions';\nimport {Config, MethodDeclMap, User} from '../../layer';\nimport {InvokeApiOptions} from '../../types';\nimport {AppManager} from '../appManagers/manager';\nimport {MTAppConfig} from './appConfig';\nimport {UserAuth} from './mtproto_config';\nimport {MTMessage} from './networker';\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport type ApiLimitType = 'pin' | 'folderPin' | 'folders' | 'favedStickers' | 'reactions' | 'bio';\n\nexport default abstract class ApiManagerMethods extends AppManager {\n private afterMessageIdTemp: number;\n private hashes: {[method: string]: HashOptions} = {};\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n protected config: Config;\n protected appConfig: MTAppConfig;\n\n constructor() {\n super();\n this.afterMessageIdTemp = 0;\n }\n\n abstract setUserAuth(userAuth: UserAuth | UserId): Promise;\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n abstract invokeApi(method: T, params?: MethodDeclMap[T]['req'], options?: InvokeApiOptions): Promise;\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n\n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n // console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(o: {\n method: T,\n processResult?: (response: MethodDeclMap[T]['res']) => R,\n processError?: (error: ApiError) => any,\n params?: Omit,\n options?: InvokeApiOptions & {cacheKey?: string},\n overwrite?: boolean\n }) {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n // console.log('will invokeApi:', method, params, options);\n\n const {params, options, method, overwrite} = 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 if(overwrite) {\n delete this.hashes[method][queryJSON];\n cached = undefined;\n } else {\n (params as any).hash = cached.hash;\n }\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, overwrite?: boolean}\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 getNewPromise = () => {\n const promise = map.get(cacheKey);\n return promise === p ? undefined : promise;\n }\n\n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise> = originalPromise.then((result) => {\n return getNewPromise() || processResult(result);\n }, (error) => {\n const promise = getNewPromise();\n if(promise) {\n return promise;\n }\n\n if(!processError) {\n throw error;\n }\n\n return processError(error);\n });\n\n const p = newPromise.finally(() => {\n if(map.get(cacheKey) !== p) {\n return;\n }\n\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = ctx.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n\n delete cache[queryJSON];\n }\n } catch(err) {\n // this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n public getConfig(overwrite?: boolean) {\n if(this.config && !overwrite) {\n return this.config;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getConfig',\n params: {},\n processResult: (config) => {\n this.config = config;\n this.rootScope.dispatchEvent('config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(this.appConfig && !overwrite) {\n return this.appConfig;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getAppConfig',\n params: {},\n processResult: (config: MTAppConfig) => {\n this.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n this.rootScope.dispatchEvent('app_config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getLimit(type: ApiLimitType, isPremium?: boolean) {\n return callbackify(this.getAppConfig(), (appConfig) => {\n const map: {[type in ApiLimitType]: [keyof MTAppConfig, keyof MTAppConfig]} = {\n pin: ['dialogs_pinned_limit_default', 'dialogs_pinned_limit_premium'],\n folderPin: ['dialogs_folder_pinned_limit_default', 'dialogs_folder_pinned_limit_premium'],\n folders: ['dialog_filters_limit_default', 'dialog_filters_limit_premium'],\n favedStickers: ['stickers_faved_limit_default', 'stickers_faved_limit_premium'],\n reactions: ['reactions_user_max_default', 'reactions_user_max_premium'],\n bio: ['about_length_limit_default', 'about_length_limit_premium']\n };\n\n isPremium ??= this.rootScope.premium;\n\n const key = map[type][isPremium ? 1 : 0];\n return appConfig[key] as number;\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\n \nimport transportController from './transports/controller';\nimport MTTransport from './transports/transport';\n \n\nimport type {UserAuth} from './mtproto_config';\nimport type {DcAuthKey, DcId, DcServerSalt, InvokeApiOptions} from '../../types';\nimport type {MethodDeclMap} from '../../layer';\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport sessionStorage from '../sessionStorage';\nimport MTPNetworker, {MTMessage} from './networker';\nimport {ConnectionType, constructTelegramWebSocketUrl, DcConfigurator, TransportType} from './dcConfigurator';\nimport {logger} from '../logger';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IDB} from '../files/idb';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport ctx from '../../environment/ctx';\nimport noop from '../../helpers/noop';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport pause from '../../helpers/schedulers/pause';\nimport ApiManagerMethods from './api_methods';\nimport {getEnvironment} from '../../environment/utils';\nimport toggleStorages from '../../helpers/toggleStorages';\n\n/* class RotatableArray {\n public array: Array = [];\n private lastIndex = -1;\n\n public get() {\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\n return this.array[this.lastIndex];\n }\n} */\n\nconst PREMIUM_FILE_NETWORKERS_COUNT = 6;\nconst REGULAR_FILE_NETWORKERS_COUNT = 3;\n\nexport class ApiManager extends ApiManagerMethods {\n private cachedNetworkers: {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTPNetworker[]\n }\n }\n };\n\n private cachedExportPromise: {[x: number]: Promise};\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\n private baseDcId: DcId;\n\n // public telegramMeNotified = false;\n\n private log: ReturnType;\n\n private afterMessageTempIds: {\n [tempId: string]: {\n messageId: string,\n promise: Promise\n }\n };\n\n private transportType: TransportType;\n\n private updatesProcessor: (obj: any) => void;\n\n private loggingOut: boolean;\n\n constructor() {\n super();\n this.log = logger('API');\n\n this.cachedNetworkers = {} as any;\n this.cachedExportPromise = {};\n this.gettingNetworkers = {};\n this.baseDcId = 0;\n this.afterMessageTempIds = {};\n\n this.transportType = Modes.transport;\n\n \n transportController.addEventListener('transport', (transportType) => {\n this.changeTransportType(transportType);\n });\n \n }\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateConfig: () => {\n this.getConfig(true);\n this.getAppConfig(true);\n }\n });\n\n this.rootScope.addEventListener('user_auth', () => {\n if(this.config) { // refresh configs if had a config during authorization\n this.apiUpdatesManager.processLocalUpdate({_: 'updateConfig'});\n }\n });\n\n this.rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.iterateNetworkers(({networker, connectionType, dcId, transportType}) => {\n if(connectionType === 'client' || transportType !== 'websocket') {\n return;\n }\n\n const transport = networker.transport;\n if(!transport) {\n this.log.error('wow what, no transport?', networker);\n return;\n }\n\n if((transport as TcpObfuscated).connection) {\n const url = constructTelegramWebSocketUrl(dcId, connectionType, isPremium);\n (transport as TcpObfuscated).changeUrl(url);\n }\n });\n });\n }\n\n // private lol = false;\n\n // constructor() {\n // MtpSingleInstanceService.start();\n\n /* AppStorage.get('dc').then((dcId) => {\n if(dcId) {\n this.baseDcId = dcId;\n }\n }); */\n // }\n\n /* public telegramMeNotify(newValue: boolean) {\n if(this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n } */\n\n private getTransportType(connectionType: ConnectionType) {\n \n \n \n \n \n // @ts-ignore\n const transportType: TransportType = this.transportType;\n \n\n return transportType;\n }\n\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\n for(const transportType in this.cachedNetworkers) {\n const connections = this.cachedNetworkers[transportType as TransportType];\n for(const connectionType in connections) {\n const dcs = connections[connectionType as ConnectionType];\n for(const dcId in dcs) {\n const networkers = dcs[dcId as any as DcId];\n networkers.forEach((networker, idx, arr) => {\n callback({\n networker,\n dcId: +dcId as DcId,\n connectionType: connectionType as ConnectionType,\n transportType: transportType as TransportType,\n index: idx,\n array: arr\n });\n });\n }\n }\n }\n }\n\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\n return this.dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client', this.rootScope.premium);\n }\n\n public changeTransportType(transportType: TransportType) {\n const oldTransportType = this.transportType;\n if(oldTransportType === transportType) {\n return;\n }\n\n this.log('changing transport from', oldTransportType, 'to', transportType);\n\n const oldObject = this.cachedNetworkers[oldTransportType];\n const newObject = this.cachedNetworkers[transportType];\n this.cachedNetworkers[transportType] = oldObject;\n this.cachedNetworkers[oldTransportType] = newObject;\n\n this.transportType = transportType;\n\n for(const oldGetKey in this.gettingNetworkers) {\n const promise = this.gettingNetworkers[oldGetKey];\n delete this.gettingNetworkers[oldGetKey];\n\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\n this.gettingNetworkers[newGetKey] = promise;\n\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\n }\n\n this.iterateNetworkers((info) => {\n const transportType = this.getTransportType(info.connectionType);\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\n this.changeNetworkerTransport(info.networker, transport);\n });\n }\n\n public async getBaseDcId() {\n if(this.baseDcId) {\n return this.baseDcId;\n }\n\n const baseDcId = await sessionStorage.get('dc');\n if(!this.baseDcId) {\n if(!baseDcId) {\n this.setBaseDcId(App.baseDcId);\n } else {\n this.baseDcId = baseDcId;\n }\n }\n\n return this.baseDcId;\n }\n\n public async setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n\n this.rootScope.dispatchEvent('user_auth', userAuth);\n\n if(!userAuth.dcID) {\n const baseDcId = await this.getBaseDcId();\n userAuth.dcID = baseDcId;\n }\n\n sessionStorage.set({\n user_auth: userAuth\n });\n\n // this.telegramMeNotify(true);\n }\n\n public setBaseDcId(dcId: DcId) {\n const wasDcId = this.baseDcId;\n if(wasDcId) { // if migrated set ondrain\n this.getNetworker(wasDcId).then((networker) => {\n this.setOnDrainIfNeeded(networker);\n });\n }\n\n this.baseDcId = dcId;\n\n sessionStorage.set({\n dc: this.baseDcId\n });\n }\n\n public async logOut() {\n if(this.loggingOut) {\n return;\n }\n\n this.loggingOut = true;\n const storageKeys: Array = [];\n\n const prefix = 'dc';\n for(let dcId = 1; dcId <= 5; dcId++) {\n storageKeys.push(prefix + dcId + '_auth_key' as any);\n }\n\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\n const storageResult = await Promise.all(storageKeys.map((key) => sessionStorage.get(key)));\n\n const logoutPromises: Promise[] = [];\n for(let i = 0; i < storageResult.length; i++) {\n if(storageResult[i]) {\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\n }\n }\n\n const clear = async() => {\n this.baseDcId = undefined;\n // this.telegramMeNotify(false);\n await toggleStorages(false, true);\n IDB.closeDatabases();\n this.rootScope.dispatchEvent('logging_out');\n };\n\n setTimeout(clear, 1e3);\n\n // return;\n\n return Promise.all(logoutPromises).catch((error) => {\n error.handled = true;\n }).finally(clear)/* .then(() => {\n location.pathname = '/';\n }) */;\n }\n\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\n return [dcId, transportType, connectionType].join('-');\n }\n\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\n // const connectionType: ConnectionType = 'client';\n\n const transportType = this.getTransportType(connectionType);\n if(!this.cachedNetworkers[transportType]) {\n this.cachedNetworkers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const cache = this.cachedNetworkers[transportType][connectionType];\n if(!(dcId in cache)) {\n cache[dcId] = [];\n }\n\n const networkers = cache[dcId];\n // @ts-ignore\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (this.rootScope.premium ? PREMIUM_FILE_NETWORKERS_COUNT : REGULAR_FILE_NETWORKERS_COUNT);\n if(networkers.length >= maxNetworkers) {\n let i = maxNetworkers - 1, found = false;\n for(; i >= 0; --i) {\n if(networkers[i].isOnline) {\n found = true;\n break;\n }\n }\n\n const networker = networkers.splice(found ? i : maxNetworkers - 1, 1)[0];\n networkers.unshift(networker);\n return Promise.resolve(networker);\n }\n\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\n if(this.gettingNetworkers[getKey]) {\n return this.gettingNetworkers[getKey];\n }\n\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\n\n let transport = this.chooseServer(dcId, connectionType, transportType);\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map((key) => sessionStorage.get(key)))\n .then(async([authKeyHex, serverSaltHex]) => {\n let networker: MTPNetworker, error: any;\n if(authKeyHex && authKeyHex.length === 512) {\n if(!serverSaltHex || serverSaltHex.length !== 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n\n const authKey = bytesFromHex(authKeyHex);\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\n const serverSalt = bytesFromHex(serverSaltHex);\n\n networker = this.networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\n } else {\n try { // if no saved state\n const auth = await this.authorizer.auth(dcId);\n\n sessionStorage.set({\n [ak]: bytesToHex(auth.authKey),\n [ss]: bytesToHex(auth.serverSalt)\n });\n\n networker = this.networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\n } catch(_error) {\n error = _error;\n }\n }\n\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\n const newTransportType = this.getTransportType(connectionType);\n if(newTransportType !== transportType) {\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\n transport.destroy();\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, transport);\n\n if(networker) {\n transport = this.chooseServer(dcId, connectionType, newTransportType);\n }\n\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\n }\n\n /* networker.onConnectionStatusChange = (online) => {\n console.log('status:', online);\n }; */\n\n delete this.gettingNetworkers[getKey];\n\n if(error) {\n this.log('get networker error', error, (error as Error).stack);\n throw error;\n }\n\n this.changeNetworkerTransport(networker, transport);\n networkers.unshift(networker);\n this.setOnDrainIfNeeded(networker);\n return networker;\n });\n }\n\n public getNetworkerVoid(dcId: DcId) {\n return this.getNetworker(dcId).then(noop, noop);\n }\n\n private changeNetworkerTransport(networker: MTPNetworker, transport?: MTTransport) {\n const oldTransport = networker.transport;\n if(oldTransport) {\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, oldTransport);\n }\n\n networker.changeTransport(transport);\n }\n\n private onNetworkerDrain(networker: MTPNetworker) {\n this.log('networker drain', networker.dcId);\n networker.onDrain = undefined;\n this.changeNetworkerTransport(networker);\n networker.destroy();\n this.networkerFactory.removeNetworker(networker);\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\n }\n\n public setOnDrainIfNeeded(networker: MTPNetworker) {\n if(networker.onDrain) {\n return;\n }\n\n const checkPromise: Promise = networker.isFileNetworker ?\n Promise.resolve(true) :\n this.getBaseDcId().then((baseDcId) => networker.dcId !== baseDcId);\n checkPromise.then((canRelease) => {\n if(networker.onDrain) {\n return;\n }\n\n if(canRelease) {\n networker.onDrain = () => this.onNetworkerDrain(networker);\n networker.setDrainTimeout();\n }\n });\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n this.networkerFactory.setUpdatesProcessor(callback);\n }\n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\n // /////this.log('Invoke api', method, params, options);\n\n /* if(!this.lol) {\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\n this.lol = true;\n } */\n\n const deferred = deferredPromise();\n\n let {afterMessageId, prepareTempMessageId} = options;\n if(prepareTempMessageId) {\n deferred.then(() => {\n delete this.afterMessageTempIds[prepareTempMessageId];\n });\n }\n\n if(MOUNT_CLASS_TO) {\n const startTime = Date.now();\n const interval = ctx.setInterval(() => {\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\n }\n // this.cachedUploadNetworkers[2].requestMessageStatus();\n }, 5e3);\n\n deferred.catch(noop).finally(() => {\n clearInterval(interval);\n });\n }\n\n const rejectPromise = async(error: ApiError) => {\n if(!error) {\n error = {type: 'ERROR_EMPTY'};\n } else if(!isObject(error)) {\n error = {message: error};\n }\n\n if((error.code === 401 && error.type === 'SESSION_REVOKED') ||\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\n this.logOut();\n }\n\n if(options.ignoreErrors) {\n throw error;\n }\n\n if(error.code === 406) {\n error.handled = true;\n }\n\n if(!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(() => {\n if(!error.handled) {\n if(error.code === 401) {\n this.logOut();\n } else {\n // ErrorService.show({error: error}); // WARNING\n }\n\n error.handled = true;\n }\n }, 100);\n }\n\n throw error;\n };\n\n let dcId: DcId;\n\n let cachedNetworker: MTPNetworker;\n const stack = (new Error()).stack || 'empty stack';\n const performRequest = (): Promise => {\n if(afterMessageId) {\n const after = this.afterMessageTempIds[afterMessageId];\n if(after) {\n options.afterMessageId = after.messageId;\n }\n }\n\n const promise = cachedNetworker.wrapApiCall(method, params, options);\n\n if(prepareTempMessageId) {\n this.afterMessageTempIds[prepareTempMessageId] = {\n messageId: (options as MTMessage).messageId,\n promise: deferred\n };\n }\n\n return promise.catch((error: ApiError) => {\n // if(!options.ignoreErrors) {\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\n }\n\n if(error.code === 401 && this.baseDcId === dcId) {\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\n sessionStorage.delete('dc')\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\n // this.telegramMeNotify(false);\n }\n\n throw error;\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\n if(this.cachedExportPromise[dcId] === undefined) {\n const promise = new Promise((exportResolve, exportReject) => {\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\n this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\n }, exportReject);\n });\n\n this.cachedExportPromise[dcId] = promise;\n }\n\n return this.cachedExportPromise[dcId].then(() => performRequest());\n } else if(error.code === 303) {\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n if(options.dcId) {\n options.dcId = newDcId;\n } else {\n this.setBaseDcId(newDcId);\n }\n\n return this.invokeApi(method, params, options);\n }\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n options.dcId = newDcId;\n return this.invokeApi(method, params, options);\n } else {\n throw error;\n }\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\n this.networkerFactory.unsetConnectionInited();\n return performRequest();\n } else if(!options.rawError && error.code === 420) {\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\n\n if(waitTime > (options.floodMaxTimeout ?? 60) && !options.prepareTempMessageId) {\n throw error;\n }\n\n return pause(waitTime/* (waitTime + 5) */ * 1000).then(() => performRequest());\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\n const after = this.afterMessageTempIds[afterMessageId];\n\n afterMessageId = undefined;\n delete options.afterMessageId;\n\n if(after) return after.promise.then(() => performRequest());\n else return performRequest();\n } else if(!options.rawError && error.code === 500) {\n const now = Date.now();\n if(options.stopTime) {\n if(now >= options.stopTime) {\n throw error;\n }\n }\n\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n return pause(options.waitTime * 1000).then(() => performRequest());\n } else if(error.type === 'UNKNOWN' || error.type === 'MTPROTO_CLUSTER_INVALID') { // cluster invalid - request from regular user to premium endpoint\n return pause(1000).then(() => performRequest());\n } else {\n throw error;\n }\n });\n }\n\n let p: Promise;\n if(dcId = (options.dcId || this.baseDcId)) {\n p = this.getNetworker(dcId, options);\n } else {\n p = this.getBaseDcId().then((baseDcId) => this.getNetworker(dcId = baseDcId, options));\n }\n\n p.then((networker) => {\n cachedNetworker = networker;\n const promise = performRequest();\n cachedNetworker.attachPromise(deferred, options as MTMessage);\n return promise;\n })\n .then(deferred.resolve)\n .catch(rejectPromise)\n .catch(deferred.reject);\n\n return deferred;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport applyMixins from '../../helpers/applyMixins';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AppManager} from '../appManagers/manager';\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\ntype PeersStorageKey = `${StatePeerType}_${string | PeerId}` | StatePeerType;\n\nclass PeersStorage {\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map> = new Map();\n\n constructor() {\n this._constructor(false);\n }\n\n protected after() {\n this.rootScope.addEventListener('user_auth', () => {\n this.requestPeer(this.appPeersManager.peerId, 'self');\n });\n }\n\n public requestPeer(peerId: PeerId, key: PeersStorageKey) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(key)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(key);\n\n this.dispatchEvent('peerNeeded', peerId);\n }\n\n public releasePeer(peerId: PeerId, key: PeersStorageKey) {\n const set = this.neededPeers.get(peerId);\n if(!set) {\n return;\n }\n\n set.delete(key);\n\n if(!set.size) {\n this.neededPeers.delete(peerId);\n this.dispatchEvent('peerUnneeded', peerId);\n }\n }\n\n public requestPeersForKey(peerIds: Set | number[], key: PeersStorageKey) {\n if(Array.isArray(peerIds)) {\n peerIds = new Set(peerIds);\n }\n\n let set = this.singlePeerMap.get(key);\n if(set) {\n for(const peerId of set) {\n if(peerIds.has(peerId)) {\n continue;\n }\n\n this.releasePeer(peerId, key);\n set.delete(peerId);\n }\n\n if(!set.size && !peerIds.size) {\n this.singlePeerMap.delete(key);\n return;\n }\n }\n\n if(peerIds.size) {\n if(!set) {\n set = new Set();\n this.singlePeerMap.set(key, set);\n }\n\n for(const peerId of peerIds) {\n if(set.has(peerId)) {\n continue;\n }\n\n this.requestPeer(peerId, key);\n set.add(peerId);\n }\n }\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n}\n\ninterface PeersStorage extends EventListenerBase<{\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void,\n}>, AppManager {}\napplyMixins(PeersStorage, [EventListenerBase, AppManager]);\n\nexport default PeersStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebDocument} from '../../layer';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport type {MyPhoto} from '../appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type ThumbCache = {\n downloaded: number,\n url: string,\n type: string\n};\n\nexport type ThumbsCache = {\n [key: string]: {\n [size: string]: ThumbCache\n }\n};\n\nconst thumbFullSize = THUMB_TYPE_FULL;\n\nexport type ThumbStorageMedia = MyPhoto | MyDocument | WebDocument;\n\nexport default class ThumbsStorage {\n private thumbsCache: ThumbsCache = {};\n\n private getKey(media: ThumbStorageMedia) {\n return media._ + ((media as MyPhoto).id ?? (media as WebDocument).url);\n }\n\n public getCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize): ThumbCache {\n /* if(media._ === 'photo' && thumbSize !== 'i') {\n thumbSize = thumbFullSize;\n } */\n\n const cache = this.thumbsCache[this.getKey(media)] ??= {};\n return cache[thumbSize] ??= {downloaded: 0, url: '', type: thumbSize};\n }\n\n public setCacheContextURL(media: ThumbStorageMedia, thumbSize: string = thumbFullSize, url: string, downloaded: number = 0) {\n const cacheContext = this.getCacheContext(media, thumbSize);\n cacheContext.url = url;\n cacheContext.downloaded = downloaded;\n return cacheContext;\n }\n\n public deleteCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize) {\n const cache = this.thumbsCache[this.getKey(media)];\n if(cache) {\n delete cache[thumbSize];\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\n// eslint-disable-next-line quotes, comma-spacing\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-908914376,\"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?ChatReactions\"}],\"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\":-994968513,\"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\":\"voice_messages_forbidden\",\"type\":\"flags.20?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\"},{\"name\":\"premium_gifts\",\"type\":\"flags.19?Vector\"}],\"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\":\"this_port_only\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":589653676,\"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\":\"force_try_ipv6\",\"type\":\"flags.14?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\"},{\"name\":\"reactions_default\",\"type\":\"flags.15?Reaction\"}],\"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\":-1476358952,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"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\":\"nopremium\",\"type\":\"flags.3?true\"},{\"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\":-1881881384,\"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\":\"long\"},{\"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\":-1787080453,\"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\"},{\"name\":\"login_email_pattern\",\"type\":\"flags.6?string\"}],\"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\":768691932,\"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\":\"emojis\",\"type\":\"flags.7?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\":\"thumb_document_id\",\"type\":\"flags.8?long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":1846886166,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":1570352622,\"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\":\"premium\",\"type\":\"flags.28?true\"},{\"name\":\"attach_menu_enabled\",\"type\":\"flags.29?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\"},{\"name\":\"emoji_status\",\"type\":\"flags.30?EmojiStatus\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":-1892676777,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"flags.0?long\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"description_photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"description_document\",\"type\":\"flags.5?Document\"},{\"name\":\"commands\",\"type\":\"flags.2?Vector\"},{\"name\":\"menu_button\",\"type\":\"flags.3?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\":-231385849,\"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?ChatReactions\"}],\"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\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":834816008,\"predicate\":\"updateStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"}],\"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\":-1103615738,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium\",\"type\":\"flags.0?true\"},{\"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\":1048946971,\"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\":\"recurring\",\"type\":\"flags.9?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\"},{\"name\":\"recurring_terms_url\",\"type\":\"flags.9?string\"}],\"type\":\"Invoice\"},{\"id\":-1900697899,\"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\"},{\"name\":\"extended_media\",\"type\":\"flags.2?InputMedia\"}],\"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\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"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\":-156940077,\"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\"},{\"name\":\"extended_media\",\"type\":\"flags.4?MessageExtendedMedia\"}],\"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\":-1776926890,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"invoice_slug\",\"type\":\"flags.0?string\"}],\"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\":-1610250415,\"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\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.5?WebDocument\"},{\"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\":\"additional_methods\",\"type\":\"flags.6?Vector\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?Vector\"},{\"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\":-1665063993,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tcp\",\"type\":\"flags.0?true\"},{\"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\"},{\"name\":\"forums\",\"type\":\"flags.17?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\":-207944868,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"long\"},{\"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\":2097791614,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"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\":-1896171181,\"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\":\"long\"},{\"name\":\"file_size_max\",\"type\":\"long\"},{\"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\":\"recommended\",\"type\":\"flags.5?true\"},{\"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\":-191450938,\"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\":-1546531968,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen_order\",\"type\":\"flags.0?int\"},{\"name\":\"reaction\",\"type\":\"Reaction\"},{\"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\":\"premium\",\"type\":\"flags.2?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\":-1102180616,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChatReactions\"},{\"name\":\"new_value\",\"type\":\"ChatReactions\"}],\"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\":-1319698788,\"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\":\"Reaction\"}],\"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\":-928371502,\"predicate\":\"attachMenuBot\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"has_settings\",\"type\":\"flags.1?true\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"peer_types\",\"type\":\"Vector\"},{\"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\"},{\"id\":2104224014,\"predicate\":\"attachMenuPeerTypeSameBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-1020528102,\"predicate\":\"attachMenuPeerTypeBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-247016673,\"predicate\":\"attachMenuPeerTypePM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":84480319,\"predicate\":\"attachMenuPeerTypeChat\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":2080104188,\"predicate\":\"attachMenuPeerTypeBroadcast\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-317687113,\"predicate\":\"chatInvitePublicJoinRequests\",\"params\":[],\"type\":\"ExportedChatInvite\"},{\"id\":-977967015,\"predicate\":\"inputInvoiceMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"InputInvoice\"},{\"id\":-1020867857,\"predicate\":\"inputInvoiceSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputInvoice\"},{\"id\":-1362048039,\"predicate\":\"payments.exportedInvoice\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":8703322,\"predicate\":\"updateTranscribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1821037486,\"predicate\":\"messages.transcribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":909284270,\"predicate\":\"dialogFilterDefault\",\"params\":[],\"type\":\"DialogFilter\"},{\"id\":1395946908,\"predicate\":\"help.premiumPromo\",\"params\":[{\"name\":\"status_text\",\"type\":\"string\"},{\"name\":\"status_entities\",\"type\":\"Vector\"},{\"name\":\"video_sections\",\"type\":\"Vector\"},{\"name\":\"videos\",\"type\":\"Vector\"},{\"name\":\"period_options\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.PremiumPromo\"},{\"id\":-925956616,\"predicate\":\"messageEntityCustomEmoji\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":-48981863,\"predicate\":\"documentAttributeCustomEmoji\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"free\",\"type\":\"flags.0?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"DocumentAttribute\"},{\"id\":1087454222,\"predicate\":\"stickerSetFullCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1502273946,\"predicate\":\"inputStorePaymentPremiumSubscription\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"restore\",\"type\":\"flags.0?true\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":1634697192,\"predicate\":\"inputStorePaymentGiftPremium\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":-1415514682,\"predicate\":\"messageActionGiftPremium\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"months\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1958953753,\"predicate\":\"premiumGiftOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumGiftOption\"},{\"id\":-930399486,\"predicate\":\"inputStickerSetPremiumGifts\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-78886548,\"predicate\":\"updateReadFeaturedEmojiStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1360618136,\"predicate\":\"inputPrivacyKeyVoiceMessages\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":110621716,\"predicate\":\"privacyKeyVoiceMessages\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1996951013,\"predicate\":\"paymentFormMethod\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentFormMethod\"},{\"id\":-193992412,\"predicate\":\"inputWebFileAudioAlbumThumbLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"small\",\"type\":\"flags.2?true\"},{\"name\":\"document\",\"type\":\"flags.0?InputDocument\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"}],\"type\":\"InputWebFileLocation\"},{\"id\":769727150,\"predicate\":\"emojiStatusEmpty\",\"params\":[],\"type\":\"EmojiStatus\"},{\"id\":-1835310691,\"predicate\":\"emojiStatus\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"EmojiStatus\"},{\"id\":-97474361,\"predicate\":\"emojiStatusUntil\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"until\",\"type\":\"int\"}],\"type\":\"EmojiStatus\"},{\"id\":674706841,\"predicate\":\"updateUserEmojiStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Update\"},{\"id\":821314523,\"predicate\":\"updateRecentEmojiStatuses\",\"params\":[],\"type\":\"Update\"},{\"id\":-796072379,\"predicate\":\"account.emojiStatusesNotModified\",\"params\":[],\"type\":\"account.EmojiStatuses\"},{\"id\":-1866176559,\"predicate\":\"account.emojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"statuses\",\"type\":\"Vector\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":2046153753,\"predicate\":\"reactionEmpty\",\"params\":[],\"type\":\"Reaction\"},{\"id\":455247544,\"predicate\":\"reactionEmoji\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Reaction\"},{\"id\":-1992950669,\"predicate\":\"reactionCustomEmoji\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Reaction\"},{\"id\":-352570692,\"predicate\":\"chatReactionsNone\",\"params\":[],\"type\":\"ChatReactions\"},{\"id\":1385335754,\"predicate\":\"chatReactionsAll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_custom\",\"type\":\"flags.0?true\"}],\"type\":\"ChatReactions\"},{\"id\":1713193015,\"predicate\":\"chatReactionsSome\",\"params\":[{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"ChatReactions\"},{\"id\":-1334846497,\"predicate\":\"messages.reactionsNotModified\",\"params\":[],\"type\":\"messages.Reactions\"},{\"id\":-352454890,\"predicate\":\"messages.reactions\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.Reactions\"},{\"id\":1870160884,\"predicate\":\"updateRecentReactions\",\"params\":[],\"type\":\"Update\"},{\"id\":-2030252155,\"predicate\":\"updateMoveStickerSetToTop\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"stickerset\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1511364673,\"predicate\":\"auth.sentCodeTypeEmailCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"},{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"next_phone_login_date\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1521934870,\"predicate\":\"auth.sentCodeTypeSetUpEmailRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1128644211,\"predicate\":\"emailVerifyPurposeLoginSetup\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"EmailVerifyPurpose\"},{\"id\":1383932651,\"predicate\":\"emailVerifyPurposeLoginChange\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1141565819,\"predicate\":\"emailVerifyPurposePassport\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1842457175,\"predicate\":\"emailVerificationCode\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-611279166,\"predicate\":\"emailVerificationGoogle\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-1764723459,\"predicate\":\"emailVerificationApple\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":731303195,\"predicate\":\"account.emailVerified\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.EmailVerified\"},{\"id\":-507835039,\"predicate\":\"account.emailVerifiedLogin\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"sent_code\",\"type\":\"auth.SentCode\"}],\"type\":\"account.EmailVerified\"},{\"id\":-1225711938,\"predicate\":\"premiumSubscriptionOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.1?true\"},{\"name\":\"can_purchase_upgrade\",\"type\":\"flags.2?true\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumSubscriptionOption\"},{\"id\":80008398,\"predicate\":\"inputStickerSetEmojiGenericAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":701560302,\"predicate\":\"inputStickerSetEmojiDefaultStatuses\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1206095820,\"predicate\":\"sendAsPeer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium_required\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"SendAsPeer\"},{\"id\":-1386050360,\"predicate\":\"messageExtendedMediaPreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"w\",\"type\":\"flags.0?int\"},{\"name\":\"h\",\"type\":\"flags.0?int\"},{\"name\":\"thumb\",\"type\":\"flags.1?PhotoSize\"},{\"name\":\"video_duration\",\"type\":\"flags.2?int\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":-297296796,\"predicate\":\"messageExtendedMedia\",\"params\":[{\"name\":\"media\",\"type\":\"MessageMedia\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":1517529484,\"predicate\":\"updateMessageExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"extended_media\",\"type\":\"MessageExtendedMedia\"}],\"type\":\"Update\"},{\"id\":-50416996,\"predicate\":\"stickerKeyword\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"keyword\",\"type\":\"Vector\"}],\"type\":\"StickerKeyword\"}],\"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\":-1923962543,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"flags.0?string\"},{\"name\":\"email_verification\",\"type\":\"flags.1?EmailVerification\"}],\"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\":\"update_stickersets_order\",\"type\":\"flags.15?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\":\"update_stickersets_order\",\"type\":\"flags.15?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\":-1101843010,\"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\":\"long\"},{\"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\":-1564422284,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"flags.0?InputCheckPasswordSRP\"}],\"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\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1309538785,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"long\"},{\"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\":\"emojis\",\"type\":\"flags.1?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\":924093883,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"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\":-1228345045,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":755192367,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"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\":962554330,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"},{\"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\":-1847836879,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"}],\"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\":\"update_stickersets_order\",\"type\":\"flags.15?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\":-1856595926,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"}],\"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\":-1730136133,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":53322959,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"verification\",\"type\":\"EmailVerification\"}],\"type\":\"account.EmailVerified\"},{\"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\":-1896617296,\"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?long\"}],\"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\":-754091820,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"add_to_recent\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Vector\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1176190792,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Reaction\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-21928079,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"ChatReactions\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":1330094102,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"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\":-58219204,\"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\":\"platform\",\"type\":\"string\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"WebViewResult\"},{\"id\":-362824498,\"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\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Bool\"},{\"id\":698084494,\"method\":\"messages.requestSimpleWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"}],\"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\"},{\"id\":1092913030,\"method\":\"phone.saveCallLog\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"Bool\"},{\"id\":-456419968,\"method\":\"channels.toggleJoinToSend\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1277789622,\"method\":\"channels.toggleJoinRequest\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":261206117,\"method\":\"payments.exportInvoice\",\"params\":[{\"name\":\"invoice_media\",\"type\":\"InputMedia\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":647928393,\"method\":\"messages.transcribeAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":2132608815,\"method\":\"messages.rateTranscribedAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"good\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-2131921795,\"method\":\"payments.assignAppStoreTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"bytes\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-537046829,\"method\":\"payments.assignPlayMarketTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"DataJSON\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-1614700874,\"method\":\"payments.canPurchasePremium\",\"params\":[{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Bool\"},{\"id\":-1206152236,\"method\":\"help.getPremiumPromo\",\"params\":[],\"type\":\"help.PremiumPromo\"},{\"id\":-643100844,\"method\":\"messages.getCustomEmojiDocuments\",\"params\":[{\"name\":\"document_id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-67329649,\"method\":\"messages.getEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":248473398,\"method\":\"messages.getFeaturedEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-70001045,\"method\":\"account.updateEmojiStatus\",\"params\":[{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Bool\"},{\"id\":-696962170,\"method\":\"account.getDefaultEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":257392901,\"method\":\"account.getRecentEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":404757166,\"method\":\"account.clearRecentEmojiStatuses\",\"params\":[],\"type\":\"Bool\"},{\"id\":1063567478,\"method\":\"messages.reportReaction\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction_peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1149164102,\"method\":\"messages.getTopReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":960896434,\"method\":\"messages.getRecentReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":-1644236876,\"method\":\"messages.clearRecentReactions\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2064119788,\"method\":\"messages.getExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":767062953,\"method\":\"auth.importWebTokenAuthorization\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"web_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"}]},\"layer\":147} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\n};\r\n","export default function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n","import bigInt from 'big-integer';\nimport intToUint from '../number/intToUint';\n\nexport default function ulongFromInts(high: number, low: number) {\n high = intToUint(high), low = intToUint(low);\n return bigInt(high).shiftLeft(32).add(bigInt(low));\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Schema, {MTProtoConstructor} from './schema';\nimport {JSONValue} from '../../layer';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bigInt from 'big-integer';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {safeBigInt} from '../../helpers/bigInt/bigIntConstants';\nimport {bigIntToSigned, bigIntToUnsigned} from '../../helpers/bigInt/bigIntConversion';\n\nconst boolFalse = +Schema.API.constructors.find((c) => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find((c) => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find((c) => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find((c) => c.predicate === 'gzip_packed').id;\n\n// * using slice to have a new buffer, otherwise the buffer will be copied to main thread\nconst sliceMethod: 'slice' | 'subarray' = 'slice'; // subarray\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;// Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n // let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n // console.log('perf uint8', performance.now() - perf);\n\n // perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n // console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n\n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n\n resultArray.set(this.byteView.subarray(0, this.offset));\n\n return resultArray;\n }\n\n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; i++) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n\n // console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n // const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n\n this.createBuffer();\n\n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32),\n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n\n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n\n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n\n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n\n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n\n const _bigInt = bigIntToUnsigned(bigInt(sLong as string));\n const {quotient, remainder} = _bigInt.divmod(0x100000000);\n const high = quotient.toJSNumber();\n const low = remainder.toJSNumber();\n\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\n }\n\n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n\n doubleView[0] = f;\n\n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n\n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n\n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n\n this.checkLength(sUTF8.length + 8);\n\n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n\n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n\n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n\n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n\n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n\n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n\n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n\n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n\n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n\n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n\n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n\n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find((m) => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n\n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n // console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n // console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n // console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n\n // console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(const paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n\n public storeObject(obj: any, type: string, field?: string) {\n // console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n\n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if(type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if(type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n\n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find((c) => c.predicate === predicate);\n\n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n\n if(predicate === type) {\n isBare = true;\n }\n\n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n // console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n // console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n // console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n // console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n // console.log('storeObject', param, type);\n\n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(const paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n\n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug =\n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n // buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n // console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n /* public setMtproto(mtproto: boolean) {\n this.mtproto = mtproto;\n } */\n\n private readInt(field: string) {\n // if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n\n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n\n this.debug &&/* || field.includes('[dialog][read_outbox_max_id]') */\n console.log('<<<', i.toString(16), i, field,\n this.byteView.slice(this.offset - 16, this.offset + 16),\n bytesToHex(this.byteView.slice(this.offset - 16, this.offset + 16)));\n\n this.offset += 4;\n\n return i;\n }\n\n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n\n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n\n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n\n return doubleView[0];\n }\n\n // ! it should've been signed\n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n\n let ulong = ulongFromInts(iHigh, iLow);\n if(/* !unsigned && */!this.mtproto) { // make it signed\n ulong = bigIntToSigned(ulong);\n }\n\n if(!this.mtproto) {\n if(safeBigInt.greaterOrEquals(ulong.abs())) {\n // @ts-ignore\n return ulong.toJSNumber();\n }\n }\n\n // @ts-ignore\n return ulong.toString(10);\n }\n\n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n\n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n\n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n\n let sUTF8 = '';\n for(let i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n\n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n\n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch(e) {\n s = sUTF8;\n }\n\n this.debug && console.log('<<<', s, (field || '') + ':string');\n\n return s;\n }\n\n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n\n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n\n const bytes = this.byteView[sliceMethod](this.offset, this.offset + len);\n this.offset += len;\n\n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n\n return bytes;\n }\n\n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n\n const len = bits / 8;\n if(typed) {\n const result = this.byteView[sliceMethod](this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n\n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n\n return bytes;\n }\n\n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n\n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView[sliceMethod](this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n\n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n\n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n\n return result;\n }\n\n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n\n field = field || type || 'Object';\n\n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n\n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find((c) => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find((c) => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n\n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n\n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n\n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n\n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n\n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n\n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n\n const predicate = constructorData.predicate;\n\n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = (type.indexOf('?') !== -1);\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n // console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n // console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\n\n type = condType[1];\n }\n\n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n\n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n\n result[param.name] = value;\n }\n }\n }\n\n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n\n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n\n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport {TLDeserialization, TLSerialization};\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default function addPadding(\n bytes: T,\n blockSize: number = 16,\n zeroes?: boolean,\n blockSizeAsTotalLength = false,\n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n // //console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport {NetworkerFactory} from './networkerFactory';\nimport {logger, LogTypes} from '../logger';\nimport {InvokeApiOptions} from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\nimport {nextRandomUint, randomLong} from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport bigInt from 'big-integer';\nimport {ConnectionStatus} from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\nimport randomize from '../../helpers/array/randomize';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {getEnvironment} from '../../environment/utils';\nimport {TimeManager} from './timeManager';\n\n// console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n\n notContentRelated: true, // ACK\n noSchedule: true,\n // withResult: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: CancellablePromise,\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst DRAIN_TIMEOUT = 10000;\nconst delays: {\n [k in 'client' | 'file']: {\n disconnectDelayMin: number,\n disconnectDelayMax: number,\n pingInterval: number,\n pingMaxTime: number,\n connectionTimeout: number\n }\n} = {\n client: {\n disconnectDelayMin: 7,\n disconnectDelayMax: 20,\n pingInterval: 2000,\n pingMaxTime: 5,\n connectionTimeout: 5000\n },\n file: {\n disconnectDelayMin: 10,\n disconnectDelayMax: 24,\n pingInterval: 3000,\n pingMaxTime: 7,\n connectionTimeout: 7500\n }\n};\nconst RESEND_OPTIONS: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true\n};\nlet invokeAfterMsgConstructor: number;\nlet networkerTempId = 0;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResendReq: MTLong[] = [];\n // private pendingResendAnsReq: MTLong[] = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n\n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n reqMsgId: MTLong,\n msgIds: MTPNetworker['pendingResendReq']\n };\n // private lastResendAnsReq: MTPNetworker['lastResendReq'];\n\n private name: string;\n private log: ReturnType;\n\n public isOnline = false;\n private status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n \n private pingDelayDisconnectDeferred: CancellablePromise;\n private pingPromise: Promise;\n // private pingInterval: number;\n private lastPingTime: number;\n private lastPingStartTime: number;\n private lastPingDelayDisconnectId: string;\n \n // public onConnectionStatusChange: (online: boolean) => void;\n\n // private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n private delays: typeof delays[keyof typeof delays];\n // private getNewTimeOffset: boolean;\n\n constructor(\n private networkerFactory: NetworkerFactory,\n private timeManager: TimeManager,\n public dcId: number,\n private authKey: Uint8Array,\n private authKeyId: Uint8Array,\n serverSalt: Uint8Array,\n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n this.delays = this.isFileNetworker ? delays.file : delays.client;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n // this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name + (suffix ? '' : '-C') + '-' + networkerTempId++, LogTypes.Log/* | LogTypes.Debug */ | LogTypes.Error | LogTypes.Warn);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = randomize(new Uint8Array(8));\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n\n sentMessage.msg_id = this.timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n\n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n\n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n\n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n\n serializer.storeMethod(method, params);\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n\n if(!this.connectionInited) { // this will call once for each new session\n // /////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find((m) => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n\n const initConnection = Schema.API.methods.find((m) => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n\n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(getEnvironment().USER_AGENT || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(this.networkerFactory.language, 'lang_code');\n // serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n\n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find((m) => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n\n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n\n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n\n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n\n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n\n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.log('change transport', transport, oldTransport);\n\n \n this.clearPingDelayDisconnect();\n\n // if(this.pingInterval !== undefined) {\n // clearInterval(this.pingInterval);\n // this.pingInterval = undefined;\n // }\n\n // this.clearPing();\n \n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n \n // * handle outcoming dead socket, server will close the connection\n if((transport as TcpObfuscated).connection) {\n // this.sendPingDelayDisconnect();\n\n if(transport.connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n // this.pingInterval = ctx.setInterval(this.sendPing, PING_INTERVAL);\n // this.sendPing();\n }\n \n\n this.resend();\n }\n\n public destroy() {\n this.log('destroy');\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n /* private clearPing() {\n if(this.pingPromise) {\n this.pingPromise = undefined;\n }\n\n this.lastPingTime = undefined;\n }\n\n private sendPing = () => {\n // return;\n\n // if(!(this.transport as TcpObfuscated).connected) {\n // this.clearPing();\n // return;\n // }\n\n if(this.pingPromise) {\n return;\n }\n\n const startTime = Date.now();\n this.log('sendPing: ping', startTime);\n const promise = this.pingPromise = this.wrapMtpCall('ping', {\n ping_id: randomLong()\n }, {\n notContentRelated: true\n }).then(() => {\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.log('sendPing: pong', elapsedTime);\n\n setTimeout(() => {\n if(this.pingPromise !== promise) {\n return;\n }\n\n this.pingPromise = undefined;\n this.sendPing();\n }, Math.max(0, PING_INTERVAL - elapsedTime));\n });\n }; */\n\n private clearPingDelayDisconnect() {\n const deferred = this.pingDelayDisconnectDeferred;\n this.pingDelayDisconnectDeferred = undefined;\n this.lastPingDelayDisconnectId = undefined;\n\n if(deferred) {\n deferred.reject();\n }\n }\n\n private sendPingDelayDisconnect = () => {\n // return;\n\n if(this.pingDelayDisconnectDeferred || !this.transport || !this.transport.connected) return;\n\n /* if(!this.isOnline) {\n if((this.transport as TcpObfuscated).connected) {\n (this.transport as TcpObfuscated).connection.close();\n }\n\n return;\n } */\n\n const deferred = this.pingDelayDisconnectDeferred = deferredPromise();\n const delays = this.delays;\n const pingMaxTime = this.delays.pingMaxTime;\n const lastPingTime = Math.min(this.lastPingTime ?? 0, pingMaxTime);\n const disconnectDelay = Math.round(delays.disconnectDelayMin + lastPingTime / pingMaxTime * (delays.disconnectDelayMax - delays.disconnectDelayMin));\n const timeoutTime = disconnectDelay * 1000;\n const startTime = this.lastPingStartTime = Date.now();\n const pingId = this.lastPingDelayDisconnectId = randomLong();\n const options: MTMessageOptions = {notContentRelated: true};\n this.wrapMtpCall('ping_delay_disconnect', {\n ping_id: pingId,\n disconnect_delay: disconnectDelay\n }, options);\n\n const log = this.log.bindPrefix('sendPingDelayDisconnect');\n this.debug && log.debug(`ping, timeout=${timeoutTime}, lastPingTime=${this.lastPingTime}, msgId=${options.messageId}, pingId=${pingId}`);\n const rejectTimeout = ctx.setTimeout(deferred.reject, timeoutTime);\n\n const onResolved = (reason: string) => {\n clearTimeout(rejectTimeout);\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.debug && log.debug(`pong, reason='${reason}', time=${lastPingTime}, msgId=${options.messageId}`);\n if(elapsedTime > timeoutTime) {\n throw undefined;\n } else {\n return pause(Math.max(0, this.delays.pingInterval - elapsedTime/* timeoutTime - elapsedTime - PING_INTERVAL */));\n }\n };\n\n const onTimeout = () => {\n clearTimeout(rejectTimeout);\n const transport = this.transport as TcpObfuscated;\n if(this.pingDelayDisconnectDeferred !== deferred || !transport?.connection) {\n return;\n }\n\n log.error('catch, closing connection', this.lastPingTime, options.messageId);\n transport.connection.close();\n };\n\n const onFinally = () => {\n if(this.pingDelayDisconnectDeferred !== deferred) {\n return;\n }\n\n this.pingDelayDisconnectDeferred = undefined;\n this.sendPingDelayDisconnect();\n };\n\n deferred\n .then(onResolved)\n .catch(onTimeout)\n .finally(onFinally);\n };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n // this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n // this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n // console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n\n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n // notContentRelated: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n\n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n\n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n\n const pingMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n\n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n\n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n\n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n\n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n\n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n const sentMessages = this.sentMessages;\n noResponseMsgs.forEach((msgId) => {\n const sentMessage = sentMessages[msgId];\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n delete sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n let promise: CancellablePromise;\n if(!options.notContentRelated || options.noResponse) {\n promise = deferredPromise();\n }\n\n this.sentMessages[message.msg_id] = Object.assign(\n message,\n options,\n promise ? {deferred: promise} : undefined\n );\n\n // this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n\n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n\n return promise;\n }\n\n public attachPromise(promise: Promise, message: MTMessage) {\n const canIncrement = true;\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < this.delays.connectionTimeout) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then((bytes) => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, this.delays.connectionTimeout);\n\n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n if(canIncrement) {\n --this.activeRequests;\n this.setDrainTimeout();\n }\n });\n\n if(canIncrement) {\n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(this.networkerFactory.onConnectionStatusChange) {\n this.networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n if((this.transport as TcpObfuscated)?.connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n\n // this.getNewTimeOffset = true;\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n\n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n\n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n\n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2aText));\n\n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n\n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n\n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n\n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return this.networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n\n const pendingResendReqLength = this.pendingResendReq.length;\n if(pendingResendReqLength) {\n const options: MTMessageOptions = {...RESEND_OPTIONS};\n const msgIds = this.pendingResendReq.splice(0, pendingResendReqLength);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: msgIds\n }, options);\n\n this.log('resend: resending requests', options.messageId, msgIds);\n /* this.lastResendReq = {\n reqMsgId: options.messageId,\n msgIds: msgIds\n }; */\n\n // this.pendingResendReq.length = 0;\n }\n\n // if(this.pendingResendAnsReq.length) {\n // const options: MTMessageOptions = {...RESEND_OPTIONS};\n // const msgIds = this.pendingResendAnsReq.slice();\n // this.wrapMtpMessage({\n // _: 'msg_resend_ans_req',\n // msg_ids: msgIds\n // }, options);\n\n // this.log('resend: requesting answers', options.messageId, msgIds);\n // this.lastResendAnsReq = {\n // reqMsgId: options.messageId,\n // msgIds: msgIds\n // };\n\n // // this.pendingResendAnsReq.length = 0;\n // }\n\n let outMessage: MTMessage;\n const messages: typeof outMessage[] = [];\n\n // const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n // const value = this.pendingMessages[messageId];\n\n // if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n // }\n }\n\n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n\n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n\n \n const noResponseMsgs: Array = messages.filter((message) => message.noResponse).map((message) => message.msg_id);\n \n\n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n\n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n\n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n\n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message)\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n\n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n\n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */randomize(new Uint8Array(paddingLength))/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n // (message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n\n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private async sendEncryptedRequest(message: MTMessage) {\n const requestData = await this.getEncryptedOutput(message);\n\n if(!this.transport) {\n this.log.error('trying to send something when offline', this.transport, this);\n }\n\n this.debug && this.log.debug('sending:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport ? this.transport.send(requestData) as any : Promise.reject({});\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n\n \n \n \n\n \n if(!(this.transport instanceof HTTP)) return promise;\n \n\n const baseError: ApiError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n // @ts-ignore\n transport: this.transport\n };\n\n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n\n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n // const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n\n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + bytesToHex(authKeyId));\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n\n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n\n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n\n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n\n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n // this.updateSession();\n // this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n\n const seqNo = deserializer.fetchInt('seq_no');\n\n const totalLength = dataWithPadding.byteLength;\n\n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n\n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n\n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n\n // let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true,\n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n\n const offset = deserializer.getOffset();\n\n // self.log('mt_message!!!!!', result, field);\n\n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n\n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n\n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n\n // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n // this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n\n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n\n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой)\n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n // this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n\n // this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n\n // const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n // this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n // this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = ctx.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n\n private reqResend(msgId: MTLong/* , isAnswer?: boolean */) {\n if(this.debug) {\n this.log.debug('Req resend', msgId/* , isAnswer */);\n }\n\n // (isAnswer ? this.pendingResendAnsReq : this.pendingResendReq).push(msgId);\n this.pendingResendReq.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n const sentMessages = this.sentMessages;\n // this.log('clean start', this.dcId/*, sentMessages*/)\n Object.keys(sentMessages).forEach((msgId) => {\n const message = sentMessages[msgId];\n\n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n\n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n // delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}): ApiError {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n\n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] as any || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n const sentMessages = this.sentMessages;\n for(const id in sentMessages) {\n const msg = sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n\n if((this.transport as TcpObfuscated).connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then((res) => {\n this.log('status', res);\n });\n } */\n\n private applyServerTime(messageId: string) {\n const serverTime = bigInt(messageId).shiftRight(32).toJSNumber();\n this.log('applying server time', serverTime);\n return this.timeManager.applyServerTime(serverTime);\n }\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n if(this.debug) {\n this.log.debug('process message', message, messageId);\n }\n\n if(this.pingDelayDisconnectDeferred) {\n this.pingDelayDisconnectDeferred.resolve('any message');\n }\n\n // let changedTimeOffset: boolean;\n // if(this.getNewTimeOffset) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // this.getNewTimeOffset = undefined;\n // }\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n\n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n\n this.ackMessage(messageId);\n\n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n\n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n // if(changedTimeOffset === undefined) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // }\n\n const changedTimeOffset = this.applyServerTime(messageId);\n if(message.error_code === 17 || changedTimeOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n // this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n\n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n\n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n // this.updateSession();\n\n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && this.networkerFactory.updatesProcessor) {\n this.networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n\n case 'msgs_ack': {\n this.debug && this.log('got acks', message.msg_ids);\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n\n case 'msg_detailed_info': {\n const sentMessage = this.sentMessages[message.msg_id];\n if(!sentMessage) {\n this.ackMessage(message.answer_msg_id);\n break;\n }/* else if(sentMessage.acked) {\n this.reqResend(message.answer_msg_id, true);\n }\n\n break; */\n }\n\n case 'msg_new_detailed_info': {\n if(this.pendingAcks.indexOf(message.answer_msg_id) !== -1) {\n break;\n }\n\n this.reqResend(message.answer_msg_id);\n break;\n }\n\n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n const arr = [\n [this.lastResendReq, this.pendingResendReq] as const\n // [this.lastResendAnsReq, this.pendingResendAnsReq] as const\n ];\n\n for(const [lastResend, pendingResend] of arr) {\n if(lastResend?.reqMsgId === message.req_msg_id && pendingResend.length) {\n for(const badMsgId of lastResend.msgIds) {\n const pos = pendingResend.indexOf(badMsgId);\n if(pos !== -1) {\n pendingResend.splice(pos, 1);\n }\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n\n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(this.debug) {\n this.log('Rpc response', message.result, sentMessage);\n }\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n }\n }\n\n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n /* const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n } */\n const pingId = message.ping_id;\n if(this.lastPingDelayDisconnectId === pingId) {\n const deferred = this.pingDelayDisconnectDeferred;\n if(deferred) {\n deferred.resolve('pong');\n } else {\n this.log('ping deferred deleted', pingId);\n }\n }\n\n break;\n }\n\n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n\n if(this.networkerFactory.updatesProcessor !== null) {\n this.networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","import bigInt from 'big-integer';\n\nexport default function sortLongsArray(arr: string[]) {\n return arr.map((long) => {\n return bigInt(long);\n }).sort((a, b) => {\n return a.compare(b);\n }).map((bigInt) => {\n return bigInt.toString(10);\n });\n}\n","import addPadding from '../bytes/addPadding';\nimport bigInt from 'big-integer';\nimport {bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function longToBytes(sLong: string) {\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n // console.log('longToBytes', bytes, bigIntBytes);\n\n return bytes;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {ConnectionStatusChange} from './connectionStatus';\r\nimport MTPNetworker from './networker';\r\nimport {InvokeApiOptions} from '../../types';\r\nimport App from '../../config/app';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport {AppManager} from '../appManagers/manager';\r\n\r\nexport class NetworkerFactory extends AppManager {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n // public onConnectionStatusChange: (status: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n\r\n public onConnectionStatusChange(status: ConnectionStatusChange) {\r\n this.rootScope.dispatchEvent('connection_status_change', status);\r\n // ({type: 'connectionStatusChange', payload: status});\r\n }\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n // console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(this, this.timeManager, dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter((networker) => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n\r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public unsetConnectionInited() {\r\n for(const networker of this.networkers) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {TLSerialization} from './tl_utils';\r\nimport cryptoWorker from '../crypto/cryptoMessagePort';\r\nimport Modes from '../../config/modes';\r\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\r\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\r\nimport bigInt from 'big-integer';\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n *\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via\r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map((keyParsed) => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return cryptoWorker.invokeCrypto('sha1', buffer).then((bytes) => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n\r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n // console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n // console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\n \n\nimport {TLSerialization, TLDeserialization} from './tl_utils';\nimport {TransportType} from './dcConfigurator';\nimport rsaKeysManager from './rsaKeysManager';\n\nimport CryptoWorker from '../crypto/cryptoMessagePort';\n\nimport {logger, LogTypes} from '../logger';\nimport DEBUG from '../../config/debug';\nimport {Awaited, DcId} from '../../types';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n\n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n\n // good\n p?: Uint8Array,\n q?: Uint8Array,\n\n newNonce?: Uint8Array,\n\n retry?: number,\n\n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n\n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n\n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer extends AppManager {\n private cached: {\n [dcId: DcId]: Promise\n };\n\n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n\n protected after() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n\n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n\n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(this.timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n\n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = this.dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n\n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n\n const promise = transport.send(resultArray) as any as Promise;\n return promise.then((result) => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n\n if(!result || !result.byteLength) {\n throw baseError;\n }\n\n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n\n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n\n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n\n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n\n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n\n throw error;\n });\n }\n\n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n\n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', bytesToHex(auth.nonce));\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n\n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n\n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n\n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n\n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n\n auth.publicKey = publicKey;\n\n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n\n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n\n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n\n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n\n return this.sendReqDhParams(auth);\n }\n\n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = randomize(new Uint8Array(32));\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n\n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = randomize(new Uint8Array(32));\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n\n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n\n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n\n const requestBytes = request.getBytes(true);\n\n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n\n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n\n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n\n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n\n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n\n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n\n throw new Error('[MT] server_DH_params_fail');\n }\n\n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n\n // console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n\n return this.sendSetClientDhParams(auth);\n }\n\n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n\n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n\n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n\n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n\n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n\n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n\n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n\n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n\n const offset = deserializer.getOffset();\n\n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n\n this.timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n\n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n\n const gABigInt = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n\n const twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n\n return true;\n }\n\n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n\n auth.b = randomize(new Uint8Array(256));\n // MTProto.secureRandom.nextBytes(auth.b);\n\n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n\n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n\n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n\n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n\n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n\n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n\n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n\n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n\n const authKeyHash = await CryptoWorker.invokeCrypto('sha1', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n\n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n\n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n\n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n\n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n\n return auth;\n }\n\n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n\n return this.sendSetClientDhParams(auth);\n }\n\n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n\n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n\n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId,\n nonce: randomize(new Uint8Array(16))\n };\n\n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport {nextRandomUint} from '../../helpers/random';\nimport {WorkerTaskVoidTemplate} from '../../types';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {AppManager} from '../appManagers/manager';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager extends AppManager {\n private lastMessageId: [number, number];\n private timeOffset: number;\n\n /* private midnightNoOffset: number;\n private midnightOffseted: Date;\n\n private midnightOffset: number; */\n\n /* private timeParams: {\n midnightOffset: number,\n serverTimeOffset: number\n }; */\n\n protected after() {\n this.lastMessageId = [0, 0];\n this.timeOffset = 0;\n\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n\n\n // * migrated from ServerTimeManager\n /* const timestampNow = tsNow(true);\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\n this.midnightOffseted = new Date();\n this.midnightOffseted.setHours(0, 0, 0, 0);\n\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\n\n /* this.timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n }; */\n }\n\n public getServerTimeOffset() {\n return this.timeOffset;\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = ulongFromInts(messageId[0], messageId[1]).toString(10);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n this.lastMessageId = [0, 0];\n\n if(this.timeOffset !== newTimeOffset) {\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.timeOffset = newTimeOffset;\n }\n\n // console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n return changed;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DocumentAttribute, WebDocument} from '../../layer';\n\nexport default class AppWebDocsManager {\n public saveWebDocument(webDocument: WebDocument) {\n if(!webDocument) {\n return;\n }\n\n const attribute: DocumentAttribute.documentAttributeImageSize = webDocument.attributes.find((attribute) => attribute._ === 'documentAttributeImageSize') as any;\n if(attribute) {\n webDocument.w = attribute.w;\n webDocument.h = attribute.h;\n }\n\n return webDocument;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputInvoice, InputPaymentCredentials, PaymentRequestedInfo, PaymentsPaymentForm} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppPaymentsManager extends AppManager {\n public getInputInvoiceBySlug(slug: string): InputInvoice.inputInvoiceSlug {\n return {\n _: 'inputInvoiceSlug',\n slug\n };\n }\n\n public getInputInvoiceByPeerId(peerId: PeerId, mid: number): InputInvoice.inputInvoiceMessage {\n return {\n _: 'inputInvoiceMessage',\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n };\n }\n\n public getPaymentForm(invoice: InputInvoice) {\n return this.apiManager.invokeApi('payments.getPaymentForm', {\n invoice\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public getPaymentReceipt(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApi('payments.getPaymentReceipt', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public validateRequestedInfo(invoice: InputInvoice, info: PaymentRequestedInfo, save?: boolean) {\n return this.apiManager.invokeApi('payments.validateRequestedInfo', {\n save,\n invoice,\n info\n });\n }\n\n public sendPaymentForm(\n invoice: InputInvoice,\n formId: PaymentsPaymentForm['form_id'],\n requestedInfoId: string,\n shippingOptionId: string,\n credentials: InputPaymentCredentials,\n tipAmount?: number\n ) {\n return this.apiManager.invokeApi('payments.sendPaymentForm', {\n form_id: formId,\n invoice,\n requested_info_id: requestedInfoId,\n shipping_option_id: shippingOptionId,\n credentials,\n tip_amount: tipAmount || undefined\n }).then((result) => {\n if(result._ === 'payments.paymentResult') {\n this.apiUpdatesManager.processUpdateMessage(result.updates);\n }\n\n return result;\n });\n }\n\n public clearSavedInfo(info?: boolean, credentials?: boolean) {\n return this.apiManager.invokeApi('payments.clearSavedInfo', {\n info,\n credentials\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 App from '../../config/app';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\r\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\r\nimport appStateManager from './appStateManager';\r\nimport {AppStoragesManager} from './appStoragesManager';\r\nimport createManagers from './createManagers';\r\n\r\ntype Managers = Awaited>;\r\n\r\nexport class AppManagersManager {\r\n private managers: Managers | Promise;\r\n private cryptoWorkersURLs: string[];\r\n private cryptoPortsAttached: number;\r\n private cryptoPortPromise: CancellablePromise;\r\n\r\n constructor() {\r\n this.cryptoWorkersURLs = [];\r\n this.cryptoPortsAttached = 0;\r\n this.cryptoPortPromise = deferredPromise();\r\n this.cryptoPortPromise.then(() => {\r\n this.cryptoPortPromise = undefined;\r\n });\r\n }\r\n\r\n public start() {\r\n const port = MTProtoMessagePort.getInstance();\r\n\r\n port.addEventListener('manager', ({name, method, args}) => {\r\n return callbackify(this.getManagers(), (managers) => {\r\n // @ts-ignore\r\n const manager = managers[name];\r\n return manager[method].apply(manager, args);\r\n });\r\n });\r\n\r\n port.addEventListener('cryptoPort', (payload, source, event) => {\r\n const port = event.ports[0];\r\n if(this.cryptoPortsAttached >= this.cryptoWorkersURLs.length) {\r\n port.close();\r\n return;\r\n }\r\n\r\n ++this.cryptoPortsAttached;\r\n cryptoMessagePort.attachPort(port);\r\n this.cryptoPortPromise?.resolve();\r\n });\r\n\r\n port.addEventListener('createProxyWorkerURLs', ({originalUrl, blob}) => {\r\n let length = this.cryptoWorkersURLs.length;\r\n if(!length) {\r\n this.cryptoWorkersURLs.push(originalUrl);\r\n ++length;\r\n }\r\n\r\n const maxLength = App.cryptoWorkers;\r\n if(length === maxLength) {\r\n return this.cryptoWorkersURLs;\r\n }\r\n\r\n const newURLs = new Array(maxLength - length).fill(undefined).map(() => URL.createObjectURL(blob));\r\n this.cryptoWorkersURLs.push(...newURLs);\r\n return this.cryptoWorkersURLs;\r\n });\r\n }\r\n\r\n public async createManagers() {\r\n const appStoragesManager = new AppStoragesManager();\r\n\r\n await Promise.all([\r\n // new Promise(() => {}),\r\n appStoragesManager.loadStorages(),\r\n this.cryptoPortPromise\r\n ]);\r\n\r\n const managers = await createManagers(appStoragesManager, appStateManager.userId);\r\n return this.managers = managers;\r\n }\r\n\r\n public getManagers() {\r\n return this.managers ??= this.createManagers();\r\n }\r\n}\r\n\r\nconst appManagersManager = new AppManagersManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appManagersManager = appManagersManager);\r\nexport default appManagersManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PasswordManager} from '../mtproto/passwordManager';\nimport {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport DialogsStorage from '../storages/dialogs';\nimport FiltersStorage from '../storages/filters';\nimport {ApiUpdatesManager} from './apiUpdatesManager';\nimport {AppAvatarsManager} from './appAvatarsManager';\nimport {AppCallsManager} from './appCallsManager';\nimport {AppChatsManager} from './appChatsManager';\nimport {AppDocsManager} from './appDocsManager';\nimport {AppDraftsManager} from './appDraftsManager';\nimport {AppEmojiManager} from './appEmojiManager';\nimport {AppGroupCallsManager} from './appGroupCallsManager';\nimport {AppInlineBotsManager} from './appInlineBotsManager';\nimport {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport {AppMessagesManager} from './appMessagesManager';\nimport {AppNotificationsManager} from './appNotificationsManager';\nimport {AppPeersManager} from './appPeersManager';\nimport {AppPhotosManager} from './appPhotosManager';\nimport {AppPollsManager} from './appPollsManager';\nimport {AppPrivacyManager} from './appPrivacyManager';\nimport {AppProfileManager} from './appProfileManager';\nimport {AppReactionsManager} from './appReactionsManager';\nimport {AppStickersManager} from './appStickersManager';\nimport {AppUsersManager} from './appUsersManager';\nimport {AppWebPagesManager} from './appWebPagesManager';\nimport {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ApiManager} from '../mtproto/apiManager';\nimport ctx from '../../environment/ctx';\nimport PeersStorage from '../storages/peers';\nimport ThumbsStorage from '../storages/thumbs';\nimport {NetworkerFactory} from '../mtproto/networkerFactory';\nimport {RootScope} from '../rootScope';\nimport {Authorizer} from '../mtproto/authorizer';\nimport {DcConfigurator} from '../mtproto/dcConfigurator';\nimport {TimeManager} from '../mtproto/timeManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport appStateManager from './appStateManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport AppWebDocsManager from './appWebDocsManager';\nimport AppPaymentsManager from './appPaymentsManager';\n\nexport default function createManagers(appStoragesManager: AppStoragesManager, userId: UserId) {\n const managers = {\n appPeersManager: new AppPeersManager,\n appChatsManager: new AppChatsManager,\n appDocsManager: new AppDocsManager,\n appPhotosManager: new AppPhotosManager,\n appPollsManager: new AppPollsManager,\n appUsersManager: new AppUsersManager,\n appWebPagesManager: new AppWebPagesManager,\n appDraftsManager: new AppDraftsManager,\n appProfileManager: new AppProfileManager,\n appNotificationsManager: new AppNotificationsManager,\n apiUpdatesManager: new ApiUpdatesManager,\n appAvatarsManager: new AppAvatarsManager,\n appGroupCallsManager: new AppGroupCallsManager,\n appCallsManager: new AppCallsManager,\n appReactionsManager: new AppReactionsManager,\n appMessagesManager: new AppMessagesManager,\n appMessagesIdsManager: new AppMessagesIdsManager,\n appPrivacyManager: new AppPrivacyManager,\n appInlineBotsManager: new AppInlineBotsManager,\n appStickersManager: new AppStickersManager,\n referenceDatabase: new ReferenceDatabase,\n appEmojiManager: new AppEmojiManager,\n filtersStorage: new FiltersStorage,\n dialogsStorage: new DialogsStorage,\n apiManager: new ApiManager,\n cryptoWorker: cryptoMessagePort,\n passwordManager: new PasswordManager,\n apiFileManager: new ApiFileManager,\n peersStorage: new PeersStorage,\n thumbsStorage: new ThumbsStorage,\n networkerFactory: new NetworkerFactory,\n rootScope: new RootScope,\n authorizer: new Authorizer,\n dcConfigurator: new DcConfigurator,\n timeManager: new TimeManager,\n appStoragesManager: appStoragesManager,\n appStateManager: appStateManager,\n appWebDocsManager: new AppWebDocsManager,\n appPaymentsManager: new AppPaymentsManager\n };\n\n type T = typeof managers;\n\n for(const name in managers) {\n const manager = managers[name as keyof T];\n if(!manager) {\n continue;\n }\n\n if((manager as AppMessagesManager).setManagers) {\n (manager as AppMessagesManager).setManagers(managers as any);\n delete (manager as AppMessagesManager).setManagers;\n }\n\n // @ts-ignore\n ctx[name] = manager;\n }\n\n const promises: Array void) | void> | void>[] = [];\n let names = Object.keys(managers) as (keyof T)[];\n names.unshift('appUsersManager', 'appChatsManager', 'appNotificationsManager', 'appMessagesManager', 'dialogsStorage');\n names = filterUnique(names);\n for(const name of names) {\n const manager = managers[name];\n if((manager as any)?.after) {\n // console.log('injecting after', name);\n const result = (manager as any).after();\n promises.push(result);\n\n // if(result instanceof Promise) {\n // result.then(() => {\n // console.log('injected after', name);\n // });\n // }\n }\n }\n\n if(userId) {\n managers.apiManager.setUserAuth(userId);\n }\n\n return Promise.all(promises).then(() => managers);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// just to include\nimport '../polyfill';\nimport '../../helpers/peerIdPolyfill';\n\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport {setEnvironment} from '../../environment/utils';\nimport appStateManager from '../appManagers/appStateManager';\nimport transportController from './transports/controller';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport RESET_STORAGES_PROMISE from '../appManagers/utils/storages/resetStoragesPromise';\nimport appManagersManager from '../appManagers/appManagersManager';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {logger} from '../logger';\nimport {State} from '../../config/state';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport appTabsManager from '../appManagers/appTabsManager';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport callbackify from '../../helpers/callbackify';\n\nlet _isServiceWorkerOnline = true;\nexport function isServiceWorkerOnline() {\n return _isServiceWorkerOnline;\n}\n\nlet serviceMessagePort: ServiceMessagePort, _serviceMessagePort: MessagePort;\nexport function getServiceMessagePort() {\n return _isServiceWorkerOnline ? serviceMessagePort : undefined;\n}\n\nconst log = logger('MTPROTO');\n// let haveState = false;\n\nconst port = new MTProtoMessagePort();\nport.addMultipleEventsListeners({\n environment: (environment) => {\n setEnvironment(environment);\n\n transportController.waitForWebSocket();\n },\n\n crypto: ({method, args}) => {\n return cryptoWorker.invokeCrypto(method as any, ...args as any);\n },\n\n state: ({state, resetStorages, pushedKeys, newVersion, oldVersion, userId}) => {\n // if(haveState) {\n // return;\n // }\n\n log('got state', state, pushedKeys);\n\n appStateManager.userId = userId;\n appStateManager.newVersion = newVersion;\n appStateManager.oldVersion = oldVersion;\n\n (Object.keys(state) as any as (keyof State)[]).forEach((key) => {\n appStateManager.pushToState(key, state[key], true, !pushedKeys.includes(key));\n });\n\n RESET_STORAGES_PROMISE.resolve(resetStorages);\n // haveState = true;\n },\n\n toggleStorages: ({enabled, clearWrite}) => {\n return toggleStorages(enabled, clearWrite);\n },\n\n event: (payload, source) => {\n log('will redirect event', payload, source);\n port.invokeExceptSource('event', payload, source);\n },\n\n serviceWorkerOnline: (online) => {\n _isServiceWorkerOnline = online;\n },\n\n serviceWorkerPort: (payload, source, event) => {\n if(serviceMessagePort) {\n serviceMessagePort.detachPort(_serviceMessagePort);\n _serviceMessagePort = undefined;\n } else {\n serviceMessagePort = new ServiceMessagePort();\n serviceMessagePort.addMultipleEventsListeners({\n requestFilePart: (payload) => {\n return callbackify(appManagersManager.getManagers(), (managers) => {\n const {docId, dcId, offset, limit} = payload;\n return managers.appDocsManager.requestDocPart(docId, dcId, offset, limit);\n });\n }\n });\n }\n\n // * port can be undefined in the future\n if(_serviceMessagePort = event.ports[0]) {\n serviceMessagePort.attachPort(_serviceMessagePort);\n }\n },\n\n createObjectURL: (blob) => {\n return URL.createObjectURL(blob);\n }\n\n // socketProxy: (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n\n // const socketProxied = socketsProxied.get(id);\n // if(socketTask.type === 'message') {\n // socketProxied.dispatchEvent('message', socketTask.payload);\n // } else if(socketTask.type === 'open') {\n // socketProxied.dispatchEvent('open');\n // } else if(socketTask.type === 'close') {\n // socketProxied.dispatchEvent('close');\n // socketsProxied.delete(id);\n // }\n // },\n});\n\nlog('MTProto start');\n\nappManagersManager.start();\nappManagersManager.getManagers();\nappTabsManager.start();\n\n// let sentHello = false;\nlistenMessagePort(port, (source) => {\n appTabsManager.addTab(source);\n\n // port.invokeVoid('hello', undefined, source);\n // if(!sentHello) {\n // port.invokeVoid('hello', undefined, source);\n // sentHello = true;\n // }\n}, (source) => {\n appTabsManager.deleteTab(source);\n});\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\r\nimport ctx from '../environment/ctx';\r\n\r\nexport default function listenMessagePort(\r\n messagePort: SuperMessagePort,\r\n onConnect?: (source: MessageEventSource) => void,\r\n onDisconnect?: (source: MessageEventSource) => void\r\n) {\r\n const attachPort = (listenPort: any, sendPort: any) => {\r\n messagePort.attachListenPort(listenPort);\r\n sendPort && messagePort.attachSendPort(sendPort);\r\n onConnect?.(listenPort);\r\n };\r\n\r\n messagePort.setOnPortDisconnect(onDisconnect);\r\n\r\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\r\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\r\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\r\n attachPort(ctx, null);\r\n } else {\r\n attachPort(ctx, ctx);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDialogFilter} from '../storages/filters';\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\nexport type REAL_FOLDER_ID = 0 | 1;\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\r\nexport const THUMB_TYPE_FULL = '';\r\n\r\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\r\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\r\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\r\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* 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","// 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 const 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}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,51,437,570], () => (__webpack_require__(4098)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 437) return \"437.77e92ccb32c21ff43a10.bundle.js\";\n\tif (chunkId === 570) return \"570.d4798b741257c891cc8b.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + ({\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] || chunkId) + \".\" + {\"8\":\"0544e00385e42a07883b\",\"51\":\"015549e15aab2a59d3a0\",\"104\":\"d9383d4cf03fc631a3a9\",\"211\":\"a70c90f1bcf51a3f9932\",\"301\":\"a3f22008d452affb1ae4\",\"642\":\"d6b90b5bc53545046507\",\"699\":\"f16d6f756c34f3914132\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t678: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","oldGetScript","oldLoadScript","queryMap","countMap","next","EmojiVersions","Emoji","version","Object","assign","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","badCharsRe","trimRe","C2L","cleanSearchText","text","latinize","processSearchText","clearBadChars","ignoreCase","options","hasTag","includeTag","charAt","originalText","replace","clearBadCharsAndTrim","ch","latinizeCh","latinizeString","fixCyrillic","FILENAME_JOINER","getFileNameByLocation","location","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","downloadId","getFileURL","type","encodeURIComponent","JSON","stringify","IDB","constructor","db","this","name","storageIsAvailable","log","openDatabase","INSTANCES","push","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","request","indexedDB","open","Promise","reject","message","finished","setTimeout","onerror","resolve","onsuccess","event","result","calledNew","onclose","e","onabort","transaction","target","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","forEach","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","concat","getObjectStore","map","clear","save","value","idx","put","get","mode","callback","perf","performance","now","then","onError","clearTimeout","timeout","onComplete","results","requests","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","i","getAll","environment","getEnvironment","setEnvironment","env","RootScope","super","myId","connectionStatus","premium","addEventListener","toPeerId","isPremium","status","dispatchEvent","args","invokeVoid","settings","getConnectionStatus","getPremium","dispatchEventSingle","state","stateStorage","getState","setByKey","key","object","splitted","split","getDeepProperty","slice","pop","setDeepProperty","first","pushToState","direct","onlyLocal","setKeyValueToStorage","set","HTTP","dcId","logSuffix","pending","debug","logTypes","Log","logger","connected","_send","body","fetch","method","response","arrayBuffer","buffer","TextDecoder","decode","Uint8Array","setConnected","err","destroyed","destroy","send","networker","promise","releasePending","releasing","splice","pause","Socket","handleOpen","handleError","handleClose","removeListeners","handleMessage","data","byteLength","ws","connect","removeEventListener","undefined","WebSocket","binaryType","randomize","arr","crypto","Error","getRandomValues","Obfuscation","_process","operation","cryptoMessagePort","transfer","init","codec","idPromise","release","initPayload","val","val2","reversedPayload","reverse","encKey","encIv","decKey","decIv","process","obfuscateTag","encrypted","encode","payload","tag","encodePacket","len","header","readPacket","bytesToHex","bytes","toString","TcpObfuscated","Connection","retryTimeout","abridged","obfuscation","autoReconnect","onOpen","connection","setConnectionStatus","cleanupSent","resend","onMessage","parseResponse","processMessage","messageId","sessionId","catch","shift","onClose","needTimeout","retryAt","time","Date","diff","lastCloseTime","isNaN","reconnectTimeout","ctx","reconnect","bodySent","forceReconnect","setAutoReconnect","once","enable","changeUrl","encodeBody","toEncode","encoded","releasingPending","sent","TEST_SUFFIX","getTelegramConnectionSuffix","connectionType","constructTelegramWebSocketUrl","suffix","path","DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","chosenServer","oooohLetMeLive","transportHTTP","dcOption","chooseServer","transportType","reuse","hasOwnProperty","client","download","upload","servers","transports","transport","obj","indexOfAndSplice","MTTransportController","opened","Map","waitForWebSocket","pingTransports","dcConfigurator","https","websocket","httpPromise","websocketPromise","socket","isFulfilled","isRejected","isHttpAvailable","isWebSocketAvailable","all","pinging","setTransportValue","setTransportOpened","setTransportClosed","AppManager","setManagers","managers","loadStorages","storages","recordPromise","storagesKeys","keys","storagesPromises","storagesResults","resetStorages","size","loadStoragesInner","AppStoragesManager","names","createStorages","loadStorage","PasswordManager","apiManager","invokeApi","updateSettings","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","cryptoWorker","invokeCrypto","newAlgo","new_algo","salt1","newPassword","hashes","new_password_hash","getInputCheckPassword","check","inputCheckPassword","auth","setUser","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","ReferenceDatabase","contexts","links","saveContext","reference","context","getContexts","Set","_context","deepEqual","add","getReferenceByLink","getContext","values","deleteContext","refreshReference","c","appMessagesManager","reloadMessages","peerId","refreshEmojiesSoundsPromise","appStickersManager","getAnimatedEmojiSounds","appProfileManager","getProfile","userId","appEmojiManager","getCustomEmojiDocuments","docId","hex","newHex","newContext","makeError","safeReplaceObject","wasObject","newObject","getPeerIdsFromMessage","peerIds","fromId","viaBotId","fwdFromId","media","contactUserId","user_id","recentVoters","recent_voters","recentReactions","recent_reactions","reaction","getPeerId","peer_id","action","userIds","users","inviter_id","chatIds","channel_id","chat_id","chatId","recentRepliers","recent_repliers","reply","defineNotNumerableProperties","props","writable","configurable","out","defineProperties","setDialogIndex","dialog","indexKey","GLOBAL_FOLDER_ID","DialogsStorage","folders","allDialogsLoaded","pinnedOrders","folderId","setDialogsLoaded","resetPinnedOrder","savePinnedOrders","dialogsOffsetDate","dialogsNum","dialogsIndex","cachedResults","query","count","dialogs","onUpdateFolderPeers","update","folder_peers","folderPeer","folder_id","peer","appPeersManager","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","getDialogOnly","onUpdatePinnedDialogs","handleOrder","order","newPinned","getFolderDialogs","dialogsResult","applyDialogs","d","after","rootScope","appUsersManager","getSelf","peerText","getPeerSearchText","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","getDialogIndexKeyByFilterId","prepareDialogUnreadCountModifying","chat","appChatsManager","getChat","dropDialogOnDeletion","apiUpdatesManager","addMultipleEventsListeners","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","appStateManager","appStoragesManager","getCache","_order","setDialogsFromState","bind","appDraftsManager","addMissedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","getMessageByPeer","reloadConversation","isDialogsLoaded","loaded","every","getPinnedOrders","getOffsetDate","offsetDate","Math","min","sort","a","b","generateFolder","folder","unreadMessagesCount","unreadPeerIds","unreadUnmutedPeerIds","getFolder","skipMigrated","migratedTo","getNextDialog","currentPeerId","findIndex","getDialogIndexKey","filtersStorage","getFilter","localId","isPeerUnmuted","appNotificationsManager","isPeerLocalMuted","getFolderUnreadCount","unreadUnmutedCount","unreadCount","arrays","setDialogIndexInFilter","isRealFolder","testDialogForFilter","pinnedIndex","pinnedPeerIds","generateDialogIndex","generateDialogPinnedDateByIndex","getDialogIndex","getDialog","skipped","isObject","date","isPinned","tsNow","timeManager","getServerTimeOffset","filters","getFilters","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","insertInDescendSortedArray","callbacks","toggle","wasUnreadCount","getDialogUnreadCount","wasUnmuted","newUnreadCount","newUnmuted","addMessagesCount","modifyFolderUnreadCount","toggleDialog","toggleUnmuted","max","dispatchUnreadTimeout","_folder","justReturn","noPinnedOrderUpdate","topDate","generateDialogPinnedDate","channelId","isChannel","toChatId","channel","draft","unshift","setDialogToState","pts","historyStorage","getHistoryStorage","messagesStorage","getHistoryMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","peersStorage","requestPeersForKey","isAnyChat","newPts","getChannelState","requestPeer","ignoreOffsetDate","saveGlobalOffset","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","dropDialogFromFolders","foundDialog","wasPinned","keepLocal","clearDialogFromState","releasePeer","dropDialogWithEvent","dropped","forEachReverse","saveApiUsers","saveApiChats","chats","messages","updatedDialogs","topMid","topPendingMid","pendingTopMsgs","topPendingMessage","maxId","updates","newUpdatesAfterReloadToHandle","saveUpdate","canSaveDialogByPeerId","wasDialogBefore","generateMessageId","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","deleted","isOutgoing","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","notify_settings","addChannelState","releaseUnreadCount","dialogsStorage","getDialogs","offsetIndex","limit","promises","fillContactsResult","fillContacts","cached","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","has","d1","d2","offset","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","PREPENDED_FILTERS","LOCAL_FILTER","flags","title","exclude_peers","include_peers","pinned_peers","excludePeerIds","includePeerIds","FiltersStorage","filtersArr","reloadedPeerIds","localFilters","generateLocalFilter","clearFilters","onUpdateDialogFilter","saveDialogFilter","findAndSplice","onUpdateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","onUpdateDialogFilterOrder","includes","setLocalId","updateDialogFilter","updateDialogFilters","updateDialogFilterOrder","prependFilters","allChatsFilter","archiveFilter","allChatsFilterIndex","exclude_archived","exclude_unarchived","exclude_read","isDialogUnread","exclude_muted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","toUserId","isBot","bots","non_contacts","isContact","contacts","testDialogForFilterId","toggleDialogPin","getConfig","pinned_infolder_count_max","getInputPeerById","createDialogFilter","prepend","remove","getOutputDialogFilter","bool","f","filterIncludedPinnedPeers","peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","invokeApiSingle","getSuggestedDialogsFilters","silent","assumeType","to","oldFilter","_filter","isFilterIdAvailable","getLimit","some","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","getOwnPropertyDescriptor","defineProperty","ApiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","processUpdateMessage","updateMessage","processOpts","seq","seqStart","seq_start","forceGetDifference","processUpdate","toId","fwd_from","reply_to","entities","pts_count","override","_constructor","setProxy","self","Proxy","saveUpdatesState","us","popPendingSeqUpdate","nextSeq","pendingUpdatesData","seqAwaiting","ptsAwaiting","popPendingPtsUpdate","curState","curPts","goodPts","goodIndex","getDifference","processLocalUpdate","wasSyncing","pts_total_limit","qts","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","onDifferenceTooLong","justAName","getChannelDifference","channelState","bindPrefix","getChannelInput","final","lastPtsUpdateTime","fwdHeader","reason","hasUser","post","hasChat","isUser","popPts","popSeq","attach","langCode","noErrorBox","stateResult","setUpdatesProcessor","strs","en","ru","getChangelog","lang","res","ok","langStr","parseMarkdown","inbox_date","languages","filterUnique","language","AppAvatarsManager","savedAvatarURLs","removeFromAvatarsCache","isAvatarCached","saved","loadAvatar","photo","peerPhotoFileLocation","downloadOptions","dc_id","limitPart","apiFileManager","blob","URL","createObjectURL","AppCallsManager","calls","IS_CALL_SUPPORTED","updatePhoneCall","saveCall","phone_call","updatePhoneCallSignalingData","callId","phone_call_id","computeKey","g_b","p","call","isDiscarded","oldCall","getCall","getCallInput","access_hash","savePhonePhoneCall","phonePhoneCall","generateDh","random_length","dhConfig","requestCall","protocol","g_a_hash","video","getUserInput","random_id","discardCall","duration","connection_id","platforms","ignore","getRestrictionReason","reasons","isRestricted","AppChatsManager","isPeerNeeded","onChatUpdated","updateChannelParticipant","clearCache","updateChatDefaultBannedRights","default_banned_rights","getFromCache","apiChats","saveApiChat","oldChat","participants_count","changedPhoto","changedTitle","changedAnyBadge","verified","scam","fake","getChatTyped","hasRights","rights","isThread","editChatDefaultBannedRights","banned_rights","until_date","isMegagroup","megagroup","isInChat","good","getInputPeer","getChannelInputPeer","getChatInputPeer","allowMin","getChatPhoto","getChatString","createChannel","inviteToChannel","input","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","editPhoto","inputFile","inputChatPhoto","file","editTitle","editAbout","about","editBanned","participant","getParticipantPeerId","timestamp","actor_id","prev_participant","new_participant","kicked_by","clearChannelParticipantBannedRights","kickFromChannel","view_messages","kickFromChat","resolveChannel","messagesChats","togglePreHistoryHidden","enabled","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","chatFull","getCachedFullChat","available_reactions","restrictionReasons","restriction_reason","restricted","getSendAs","invokeApiSingleProcess","processResult","sendAsPeers","importChatInvite","hash","checkUsername","getSponsoredMessage","invokeApiCacheable","cacheSeconds","sponsoredMessages","sponsoredMessage","viewSponsoredMessage","randomId","checkChatInvite","chatInvite","I18n","pluralRules","cacheLangPackPromise","setLangCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","timeFormat","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","langSign","countries","strings","formatLocalStrings","default","saveLangPack","from_version","lang_code","local","loadLangPack","web","requestedServerLanguage","lang_pack","polyfillPromise","pushTo","v","langPack","appVersion","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","document","querySelectorAll","element","weakMap","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","createElement","append","lastIndexOf","matchUrlProtocol","wrappedUrl","wrapUrl","href","onclick","setAttribute","DocumentFragment","firstChild","textContent","arg","pushNextArgument","plain","select","item","Node","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","_Intl","window","WeakMap","IntlElementBase","classList","property","IntlElement","safeAssign","formatted","dataset","compareAndUpdate","json","DateTimeFormat","hours","getHours","getMinutes","capitalizeFirstLetter","i18n","i18n_","_i18n","months","days","getWeekNumber","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","today","year","day","month","weekday","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","createForMonthYear","dates","selectedYear","currentYear","setFullYear","minDate","setMonth","maxDate","formatterMonthYear","createForDayMonth","validDateForMonth","formatterDayMonth","formatterYearMax","formatWeekLong","getDay","q","safeReplaceArrayInObject","trim","dayOfWeek","setDate","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","g3","parseInt","k1","EXTENSION_MIME_TYPE_MAP","pdf","tgv","tgs","wav","mp3","ogg","jpeg","jpg","png","gif","webp","mp4","webm","mov","svg","MIME_TYPE_EXTENSION_MAP","uploadWallPaperTempId","AppDocsManager","onServiceWorkerFail","docs","doc","supportsStreaming","thumbsStorage","deleteCacheContext","stickerCachedThumbs","uploadingWallPapers","online","saveDoc","oldDoc","file_reference","referenceDatabase","attributes","attribute","file_name","wrapPlainText","voice","mime_type","w","h","round_message","alt","stickerEmojiRaw","stickerSetInput","thumbs","IS_WEBP_SUPPORTED","sticker","IS_WEBM_SUPPORTED","animated","mappedMimeType","joiner","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","getFullDate","isServiceWorkerOnline","getCacheContext","setCacheContextURL","thumb","getDocumentDownloadOptions","getDocumentURL","getDoc","downloadDoc","queueId","onlyCache","downloadMedia","getLottieCachedThumb","toneIndex","saveLottiePreview","width","height","saveWebPConvertedStrippedThumb","stickerThumbConverted","getWallPapers","invokeApiHashable","accountWallpapers","wallPapers","wallpapers","wallPaper","prepareWallPaperUpload","cacheContext","wallpaper","slug","uploadWallPaper","fileName","downloaded","getGifs","gifs","requestDocPart","requestFilePart","getDocumentInputFileLocation","AppDraftsManager","drafts","updateDraftMessage","threadId","notify","getKey","getDraft","getAllDrafts","getAllDraftPromise","apiDraft","processApiDraft","force","isEmptyDraft","reply_to_msg_id","syncDraft","localDraft","saveOnServer","serverDraft","draftsAreEqual","draftObj","getInputEntities","no_webpage","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","EMOJI_LANG_PACK","keywords","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","recent","getRecentEmojisPromises","getCustomEmojiDocumentPromises","getEmojiKeywords","storageKey","pack","validateInitObject","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","networkerFactory","native","getRecentEmojis","indexEmojis","searchEmojis","emojis","reduce","acc","POPULAR_EMOJI","recentEmoji","recentCustomEmoji","pushRecentEmoji","emoji","fixEmoji","docIds","document_id","documents","appDocsManager","getCachedCustomEmojiDocuments","setDebouncedGetCustomEmojiDocuments","getCustomEmojiDocumentsPromise","allIds","ids","getCustomEmojiDocument","getCustomEmojis","getEmojiStickers","AppGroupCallsManager","groupCalls","participants","nextOffsets","updateGroupCall","saveGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","getCachedParticipants","prepareToSavingNextOffset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","saveApiParticipant","skipCounterUpdating","oldParticipant","hasLeft","muted","can_self_unmute","getGroupCall","modified","just_joined","apiParticipants","editParticipant","getGroupCallInput","getInputPeerSelf","volume","raise_hand","raiseHand","video_paused","videoPaused","video_stopped","videoStopped","presentation_paused","presentationPaused","getGroupCallFull","participants_next_offset","shouldUpdate","createGroupCall","scheduleDate","schedule_date","getGroupCallParticipants","sources","groupCallParticipants","next_offset","hangUp","discard","groupCallInput","source","join_as","joinGroupCall","isMuted","joinVideo","leaveGroupCallPresentation","getPhotoInput","getPhotoMediaInput","ttl_seconds","getMediaInput","AppInlineBotsManager","inlineResults","setHash","getGeoInput","geo","lat","long","accuracy_radius","getInlineResults","botId","bot","geo_point","stopTime","botResults","queryId","query_id","appPhotosManager","savePhoto","generateQId","pushPopularBot","getTopPeers","topPeers","botPeerId","topPeer","rating","switchToPM","fromPeerId","startParam","startBot","checkSwitchReturn","getUser","bot_inline_placeholder","peerData","switchInlineQuery","callbackButtonClick","button","msg_id","sendInlineResult","queryAndResultIds","inlineResult","queryID","resultID","resultId","send_message","reply_markup","replyMarkup","sendText","inputMedia","messageMedia","caption","sendMessage","geoPoint","address","provider","venue_id","venue_type","phone_number","first_name","last_name","vcard","description","currency","total_amount","shipping_address_requested","start_param","sendOther","AppMessagesIdsManager","tempNum","num","MIDDLEWARE_ERROR","MiddlewareHelper","details","cleaned","inner","onCleanCallbacks","onDestroyCallbacks","onDestroy","clean","helper","parent","additionalCallback","middleware","onClean","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","partLength","appTabsManager","tabs","start","getTabs","tab","addTab","deleteTab","getDocumentInput","processAfter","cb","UPDATE_STICKERSET_ORDER","AppMessagesManager","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","fetchSingleMessagesPromise","extendedMedia","maxSeenId","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","uploadFilePromises","messagesStorageByPeerId","groupedMessagesStorage","scheduledMessagesStorage","historiesStorage","threadsStorage","searchesStorage","pinnedMessages","threadsServiceMessagesIdsStorage","threadsToReplies","handleNewDialogs","newMaxSeenId","incrementMaxSeenId","handleNotifications","_peerId","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","pendingData","tempId","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","createMessageStorage","threadKey","getThreadKey","reply_to_peer_id","reply_to_mid","receiptMessage","ignoreExisting","checkPendingMessage","updateMessageRepliesIfNeeded","findSlice","firstSlice","forceUserOnline","top_msg_id","handleNewMessage","inboxUnread","modifyCachedMentions","setDialogTopMessage","notifyPeer","onUpdateMessageReactions","recentReaction","previousReactions","previousRecentReactions","show_previews","peerReaction","pushBatchUpdate","batchUpdateReactions","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","dispatchEditEvent","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","replyTo","reply_to_top_id","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","findPeerIdByMids","media_unread","fixDialogUnreadMentionsIfNoMessage","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","onUpdateChannelReload","flushStoragesByPeerId","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","phone","onUpdatePinnedMessages","missingMessages","werePinned","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","isScheduled","onUpdateDeleteScheduledMessages","onUpdateMessageExtendedMedia","extended_media","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","reactionsEqual","chosen_order","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","updateMessageExtendedMedia","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getCachedWebPage","drop","poll","appPollsManager","pollToMessages","batchUpdatesDebounced","debounce","maxSeenMsgId","sendEntites","entity","invokeAfterMessageIsSent","callbackName","finalize","editMessage","is_scheduled","newMedia","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","webPage","getPeerMigratedTo","generateOutgoingMessage","toggleError","onMessagesSendError","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","clear_draft","send_as","update_stickersets_order","wrapMessageEntities","beforeMessageSending","sequential","noop","sendFile","attachType","apiFileName","fileType","File","isDocument","Blob","isPhoto","IMAGE_MIME_TYPES_SUPPORTED","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","objectURL","VIDEO_MIME_TYPES_SUPPORTED","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","uploadingFileName","getFileNameForUpload","uploaded","uploadPromise","load","thumbUploadPromise","cancelPendingMessage","setTyping","addNotifyListener","progress","percents","floor","done","total","notifyAll","force_file","isGroupedItem","background","ret","sendAlbum","files","sendFileDetails","groupId","o","invoke","multiMedia","multi_media","inputSingleMedia","inputs","sendContact","contactPeerId","getContactMediaInput","pollId","savePoll","total_voters","getPoll","getPhoto","postAuthor","getPeer","signatures","generateFromId","post_author","generateFlags","generateReplyHeader","via_bot_id","replies","generateReplies","replyToTopId","channelFull","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","originalMessage","isUserHidden","from_name","userFull","getCachedFullUser","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","generateFakeAvatarMessage","Number","MAX_SAFE_INTEGER","getUploadPromise","uploadFileName","admin_rights","anonymous","fillConversations","getConversations","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","folderDialogs","dialogsLength","slicedDialogs","forwardMessages","config","overflowMids","forwarded_count_max","dropCaptions","dropAuthor","newMids","newMessages","replyToMid","replyToMessageIdx","newReplyToMid","getStickerEffectThumb","nopremium","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","getMessagesStorageByKey","s","getMessagesStorage","getMessageById","getDialogByPeerId","cantForwardDeleteMids","cantForward","cantDelete","canForward","canDeleteMessage","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","fullfillLeft","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","ss","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","getPinnedMessagesCount","getPinnedMessagesMaxId","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","getGroupsFirstMessage","minMid","getMidsByAlbum","groupedId","getMessagesByAlbum","getMidsByMessage","filterMessages","verify","appMessagesIdsManager","saveMessage","isMessage","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","mediaContext","unsupported","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","appWebDocsManager","saveWebDocument","extendedMediaMedia","totalEntities","migrateFrom","migrateTo","video_sizes","appGroupCallsManager","migrateChecks","getFirstMessageToEdit","goodMessage","myPeerId","canEditMessage","apiEntities","myEntities","parseEntities","mergeEntities","reportMessages","editPeerFolders","getDialogPeer","markDialogUnread","read","fromChat","canMessageBeEdited","kind","goodMedias","edit_time_limit","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","getSearchStorage","getSearchCounters","canCache","func","filterMessagesByInputFilterFromStorage","_storage","filterMessagesByInputFilter","nextRate","backLimit","offset_id_offset","next_rate","foundMsgs","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","subscribeRepliesThread","getDiscussionMessage","generateThreadServiceStartMessage","maxMessageId","serviceStartMessage","is_single","getThreadServiceMessageId","getMessageWithReplies","newDialogsHandlePromise","deleteMessages","localMessageIds","creator","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","getPeerString","readAllHistory","slicedArray","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","getHistoryStorageTransferable","historySerialized","toJSON","getNotifyPeerTypeSettings","getNotifySettings","getInputNotifyPeerById","isMessageIsTopMessage","threadMessage","broadcastEventName","pendingMessage","finalizePendingMessage","mutePeer","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","canSendToUser","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","thumbSize","polls","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","readPeerId","reactionsCount","readParticipants","appConfig","getAppConfig","chat_read_mark_size_threshold","chat_read_mark_expire_period","incrementMessageViews","increment","chatPeerIds","idleStartTime","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithCommentReplies","isFetchIntervalNeeded","getNewHistory","unsetEnd","isBottomEnd","getEnds","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","isHistoryResultEnd","topWasMeantToLoad","wasMaxId","requestHistory","newMaxId","deleteSlice","oldestMessage","foundSlice","_historyResult","fetchSingleMessages","requestPromises","getMessagesResult","getExtendedMedia","toRequest","fetchMessageReplyTo","replyToPeerId","typing","smth","deleteWebPageFromPending","updatePollToMessage","groupedStorage","albums","dispatchAlbumEdit","deletedMids","noforwards","noForwards","getElementCallback","newMap","peerIdStr","saveDefaultSendAs","default_send_as","convertInputKeyToKey","inputKey","AppNotificationsManager","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","checkMuteUntilThrottled","throttle","notifySettings","getNotifyPeerTypePromise","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","getPeerMuted","getPeerLocalSettings","respectType","n","typeNotifySettings","AppPeersManager","canPinMessage","getPeerPhoto","getUserPhoto","getUserString","getPeerUsername","getRestrictionReasonText","ignorePeerId","getUserInputPeer","getUserSearchText","getDialogType","getDeleteButtonText","AppPhotosManager","photos","oldPhoto","Infinity","getUserPhotos","inputUser","photosResult","photoIds","photoId","AppPollsManager","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","chosen","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","closed","newPoll","AppPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","privacyRules","inputRule","rule","getPrivacy","privacyKey","getGlobalPrivacySettings","setGlobalPrivacySettings","PEER_FULL_TTL","AppProfileManager","usersFull","chatsFull","fullExpiration","onUpdateUserTyping","typingsInPeer","t","cancelAction","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","updateChatParticipantAdd","_participants","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","usersUserFull","full_user","profile_photo","botInfo","bot_info","referenceContext","description_document","description_photo","getProfileByPeerId","getCachedProfileByPeerId","getFullPhoto","profile","getChannelFull","full_chat","getChatInviteLink","exported_invite","link","exportedInvite","getChannelParticipants","broadcast","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","processUserIds","ratingMap","cP","updateProfile","saveApiUser","uploadProfilePhoto","updateResult","strippedThumb","stripped_thumb","previous","deletePhotos","deletedList","verifyParticipantForOnlineCount","reduceParticipantsForOnlineCount","getOnlines","chatInfo","channelParticipants","onlines","getPeerTypings","callbackifyAll","SAVE_DOC_KEYS","REFERENCE_CONTEXT","AppReactionsManager","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","getActiveAvailableReactions","callbackify","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","chatAvailableReactions","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsByMessage","isReactionActive","reactions_default","getReactionCached","getReaction","getMessagesReactions","setDefaultReaction","sendReaction","lastSendingTimeKey","unsetReactionCount","canSeeList","can_see_list","chosenReactions","unsetReactions","chosenReactionIdx","chosenReactionCount","chosenReactionsLength","reactionCountIdx","id1","id2","promiseKey","editMessageUpdateIdx","editMessageUpdate","EMOJI_SET_LOCAL_ID","EMOJI_ANIMATIONS_SET_LOCAL_ID","LOCAL_IDS_SET","AppStickersManager","processAllStickersResult","allStickers","sets","stickerSet","videos","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","getGreetingStickersPromise","getGreetingStickersTimeout","getGreetingSticker","onStickersUpdated","updateNewStickerSet","saveStickerSet","updateRecentStickers","updateFavedStickers","updateMoveStickerSetToTop","stickers","getFavedStickersStickers","getRecentStickersStickers","justPreload","getStickersByEmoticon","greetingStickers","random","saveStickers","canUseStickerSetCache","useCache","refreshTime","getStickerSet","cachedSet","getStickerSetInput","saveById","animations","getAnimatedEmojiSoundsPromise","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","getRecentStickers","recentStickers","saveRecentSticker","unsave","_doc","docEmoticon","faved","cleanEmoji","getAnimatedEmojiSticker","isAnimation","packs","getAnimatedEmojiSoundDocument","preloadAnimatedEmojiSticker","preloadEmojiPromise","preloadAnimatedEmojiStickerAnimation","animation","preloadSticker","isPremiumEffect","video_thumbs","newSet","setToCache","needSave","installed_date","getStickerSetThumbDownloadOptions","thumb_dc_id","isAnimated","mimeType","getFeaturedStickers","covered","getPromoPremiumStickers","getPremiumStickers","getFavedStickers","favedStickers","getFavedStickersLimit","faveSticker","unfave","toggleStickerSet","archived","toggleStickerSets","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cache","cover","getAllStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","clearRecentStickers","cleanUsername","AppUsersManager","usernames","getTopPeersPromises","contactsIndex","createSearchIndex","contactsFillPromise","contactsList","updatedContactsList","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","expires","was_online","setUserToStateIfNeeded","updateUserPhoto","updateUserName","setUserNameToCache","checkPremium","contactsListCachedTime","contact","mutual_contact","pushContact","recentSearch","onContactsModified","fromServer","pushRecentSearch","clearRecentSearch","resolveUsername","resolvedPeer","processResolvedPeer","resolvePhone","popContact","getContacts","includeSaved","sortBy","_contactsList","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","testSelfSearch","getContactsPeerIds","toggleBlock","block","apiUsers","oldUser","oldSearchUsername","searchUsername","fullName","wasContact","newContact","onContactUpdated","isUserOnlineVisible","isRegularUser","support","isNonContactUser","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","categories","getBlocked","contactsBlocked","getLocated","self_expires","searchContacts","pathname","my_results","curIsContact","setUserStatus","offline","updateMyOnlineStatus","addContact","showPhone","add_phone_privacy_exception","deleteContacts","photoTypeSet","AppWebPagesManager","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","pendingSet","getWebPage","readBlobAsArrayBuffer","readBlobAs","fileNameRFC","escape","DownloadWriter","serviceMessagePort","getServiceMessagePort","write","chunk","saveToStorage","DownloadStorage","getFile","prepareWriting","headers","cancel","getWriter","MIN_PART_SIZE","IGNORE_ERRORS","ApiFileManager","cacheStorage","downloadStorage","downloadPromises","uploadPromises","downloadPulls","downloadActives","refreshReferencePromises","maxUploadParts","maxDownloadParts","uncompressTGS","uncompressTGV","svgIndex","__","fixFirefoxSvg","TextEncoder","convertWebp","convertOpus","webFileDcId","webfile_dc_id","upload_max_fileparts_premium","upload_max_fileparts_default","downloadRequest","activeDelta","downloadPull","downloadCheck","downloadLimit","setQueueId","getFileStorage","cancelDownload","canceled","requestWebFilePart","checkCancel","fileDownload","getDelta","checkedReference","getLimitPart","isUpload","maxParts","maxPartSize","inputFileLocation","isDownloading","getDownload","getUpload","getConvertMethod","IS_OPUS_SUPPORTED","allocateDeferredPromises","startOffset","delayed","writeDeferred","writePromise","originalMimeType","convertMethod","getDownloadFileNameFromOptions","cacheFileName","errorHandler","prepared","cachePrepared","downloadPrepared","possibleSize","_errorHandler","writer","truncate","downloadFileName","readBlobAsUint8Array","isWebFile","requestPart","dispatchProgress","throttledDispatchProgress","superpuper","isFinal","getParts","replaceParts","processedResult","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","fileSize","isBigFile","partSize","totalParts","fileId","resultInputFile","parts","md5_checksum","resolved","it","_part","doneParts","file_id","file_part","file_total_parts","fileUpload","generator","ApiManagerMethods","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","afterMessageIdTemp","setUserAuth","prepareTempMessageId","queryJSON","cacheKey","oldPromise","getNewPromise","newPromise","ignore_restriction_reasons","pin","folderPin","bio","ApiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","baseDcId","afterMessageTempIds","changeTransportType","updateConfig","iterateNetworkers","getTransportType","connections","dcs","array","oldTransportType","oldObject","oldGetKey","newGetKey","info","changeNetworkerTransport","getBaseDcId","sessionStorage","setBaseDcId","userAuth","dcID","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","dc","logOut","loggingOut","storageKeys","storageResult","logoutPromises","ignoreErrors","toggleStorages","generateNetworkerGetKey","networkers","maxNetworkers","found","isOnline","ak","authKeyHex","serverSaltHex","authKey","bytesFromHex","authKeyId","serverSalt","authorizer","_error","newTransportType","removeTransport","stack","getNetworkerVoid","oldTransport","changeTransport","onNetworkerDrain","onDrain","removeNetworker","isFileNetworker","canRelease","setDrainTimeout","updatesProcessor","cachedNetworker","startTime","interval","isStopped","clearInterval","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","unsetConnectionInited","rawError","waitTime","floodMaxTimeout","attachPromise","originalError","PeersStorage","neededPeers","singlePeerMap","thumbFullSize","ThumbsStorage","thumbsCache","intToUint","ulongFromInts","high","low","shiftLeft","safeBigInt","ulongBigInt","pow","longBigInt","divide","bigIntFromBytes","base","boolFalse","predicate","boolTrue","vector","gzipPacked","TLSerialization","mtproto","startMaxLength","createBuffer","ArrayBuffer","intView","Int32Array","byteView","getArray","resultBuffer","resultInt32","subarray","getBuffer","getBytes","typed","resultArray","getOffset","checkLength","needBytes","previousBuffer","previousArray","writeInt","field","storeInt","storeBool","storeLongP","iHigh","iLow","storeLong","sLong","storeIntBytes","_bigInt","bigInt","isNegative","quotient","remainder","divmod","toJSNumber","storeDouble","Float64Array","storeString","sUTF8","unescape","storeBytes","bits","storeRawBytes","storeMethod","methodName","methodData","methods","m","flagsOffsets","param","condType","fieldBit","storeObject","paramName","substr","itemType","schema","isBare","constructorData","TLDeserialization","readInt","fetchInt","fetchDouble","doubleView","fetchLong","ulong","greater","minus","greaterOrEquals","abs","fetchBool","fetchObject","fetchString","String","fromCharCode","decodeURIComponent","fetchBytes","fetchIntBytes","fetchRawBytes","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","setOffset","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","bufferConcats","delays","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","networkerTempId","MTPNetworker","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResendReq","nextReq","checkConnectionPeriod","lastResponseTime","activeRequests","sendPingDelayDisconnect","pingDelayDisconnectDeferred","lastPingTime","disconnectDelay","round","timeoutTime","lastPingStartTime","pingId","lastPingDelayDisconnectId","wrapMtpCall","ping_id","disconnect_delay","rejectTimeout","elapsedTime","checkLongPoll","isClean","longPollPending","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingMessage","generateId","seq_no","generateSeqNo","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","convertToUint8Array","isFileUpload","isFileDownload","updateSession","seqNo","prevSessionId","updateSentMessage","sentMessageId","sentMessage","container","innerSentMessageId","innerSentMessage","pushMessage","wrapMtpMessage","connectionInited","invokeWithLayer","initConnection","resultType","isAPI","nextReqTimeout","longPollInterval","clearPingDelayDisconnect","forceReconnectTimeout","sendingLongPoll","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","handleSentEncryptedRequestHTTP","noResponseMsgs","sqrt","pushResend","shouldResolve","onDrainTimeout","willChange","onConnectionStatusChange","innerMsgId","acked","getMsgKey","dataWithPadding","x","msgKeyLargePlain","msgKeyLarge","getAesKeyIv","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","performScheduledRequest","ackMsgIds","msg_ids","pendingResendReqLength","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","compare","messageByteLength","generateContainerMessage","messageWithBody","innerMessages","getEncryptedMessage","keyIv","getDecryptedMessage","encryptedData","getEncryptedOutput","dataBuffer","paddingLength","encryptedResult","requestData","baseError","responseBuffer","deserializer","bytesCmp","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","mt_rpc_result","req_msg_id","applyServerSalt","newServerSalt","toArray","ackMessage","reqResend","notEmpty","processMessageAck","error_message","error_code","msg","applyServerTime","serverTime","shiftRight","innerMessage","new_server_salt","bad_msg_id","changedTimeOffset","badMessage","first_msg_id","server_salt","answer_msg_id","lastResendReq","lastResend","pendingResend","reqMsgId","badMsgId","pos","NetworkerFactory","startAll","stoppedNetworkers","stopAll","setLanguage","testPublicKeysHex","modulus","exponent","publisKeysHex","publicKeysParsed","preparePromise","prepare","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","fingerprintHex","fill","foundKey","fingerprint","bytesXor","bytes1","bytes2","Authorizer","sendPlainRequest","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","sendReqPQ","nonce","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","publicKey","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","newNonceHash","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","localTime","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","g","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","subtract","twoPow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","_try","TimeManager","lastMessageId","timeOffset","timeTicks","newTimeOffset","changed","server_time_offset","AppWebDocsManager","webDocument","AppPaymentsManager","getInputInvoiceBySlug","getInputInvoiceByPeerId","getPaymentForm","invoice","paymentForm","getPaymentReceipt","validateRequestedInfo","sendPaymentForm","formId","requestedInfoId","shippingOptionId","credentials","tipAmount","form_id","requested_info_id","shipping_option_id","tip_amount","clearSavedInfo","appManagersManager","cryptoWorkersURLs","cryptoPortsAttached","cryptoPortPromise","getManagers","manager","apply","ports","originalUrl","newURLs","createManagers","appAvatarsManager","appCallsManager","appPrivacyManager","appInlineBotsManager","passwordManager","appPaymentsManager","_serviceMessagePort","_isServiceWorkerOnline","pushedKeys","clearWrite","invokeExceptSource","serviceWorkerOnline","serviceWorkerPort","detachPort","attachPort","messagePort","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","START_LOCAL_ID","ALPHA_CHARS_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","encodeEmoji","emojiText","unicodeSurrogates","points","char","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","getter","__esModule","definition","enumerable","chunkId","miniCssF","globalThis","Function","prop","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","src","scripts","getElementsByTagName","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/report.html b/public/report.html index 9f0ad842..df5fee52 100644 --- a/public/report.html +++ b/public/report.html @@ -3,7 +3,7 @@ - tweb [13 Dec 2022 at 19:22] + tweb [6 Jan 2023 at 23:36] diff --git a/public/sw.c12b91543b047629a922.chunk.js b/public/sw.241e2211cf9f9c1af243.chunk.js similarity index 99% rename from public/sw.c12b91543b047629a922.chunk.js rename to public/sw.241e2211cf9f9c1af243.chunk.js index 7d6346f2..188ee1dc 100644 --- a/public/sw.c12b91543b047629a922.chunk.js +++ b/public/sw.241e2211cf9f9c1af243.chunk.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e,t,n,o,r,i,s={4762:(e,t,n)=>{n.d(t,{IS_FIREFOX:()=>s,IS_SAFARI:()=>i});var o=n(6761);const r=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&o.Z.MSStream,!!("safari"in o.Z)||!(!r||!(/\b(iPad|iPhone|iPod)\b/.test(r)||r.match("Safari")&&!r.match("Chrome")))),s=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)},1352:(e,t,n)=>{n.d(t,{FK:()=>s,N5:()=>r,SU:()=>o,kC:()=>i});const o="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!o,i=r||o,s=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),a=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},c=(e,...t)=>{s().then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{a(e,...t)}))}))};o&&c.bind(null,!1),o&&c.bind(null,!0)},5003:(e,t,n)=>{n.d(t,{kg:()=>f,v9:()=>o});var o,r=n(410),i=n(4762),s=n(1352),a=n(5289);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(o||(o={}));const c=[o.None,o.Error,o.Warn,o.Log,o.Debug],l=!(i.IS_SAFARI||i.IS_FIREFOX),u="",h="",d=[["debug",o.Debug],["info",o.Log],["warn",o.Warn],["error",o.Error],["assert",o.Error],["trace",o.Log],["group",o.Log],["groupCollapsed",o.Log],["groupEnd",o.Log]];function f(e,t=o.Log|o.Warn|o.Error,n=!1,i=""){let g;r.ZP||n||(t=o.Error),l?i||(s.SU?i=u:s.N5&&(i=h)):i="";const p=i;i=i?`%s ${i}%s`:"%s";const m=function(...n){return t&o.Log&&console.log(i,(0,a.Z)(),e,...n)};return d.forEach((([n,o])=>{m[n]=function(...r){return t&o&&console[n](i,(0,a.Z)(),e,...r)}})),m.setPrefix=function(t){g=t,e="["+t+"]"},m.setPrefix(e),m.setLevel=function(e){t=c.slice(0,e+1).reduce(((e,t)=>e|t),0)},m.bindPrefix=function(e){return f(`${g}] [${e}`,t,n,p)},m}},1901:(e,t,n)=>{n.d(t,{Vp:()=>J,cM:()=>V,j6:()=>H});var o=n(5003);function r(e){return new Promise((t=>{setTimeout(t,e)}))}const i=self,s="cachedAssets";function a(e){return e.ok&&200===e.status}function c(e){return Promise.race([e,r(1e4).then((()=>Promise.reject()))])}function l(){}function u(){const e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach((e=>e(...t)))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise(((n,o)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,n(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,o(...e))}}));return t.catch(l).finally((()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=l)})),Object.assign(t,e),t}var h=n(6761),d=n(1267);function f(e,t=""){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","audio/wav","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);return new Blob(e,{type:n})}class g{constructor(e,t,n){this.mimeType=e,this.size=t,this.saveFileCallback=n,this.bytes=new Uint8Array(t)}write(e,t){return n=this,o=void 0,i=function*(){const n=t+e.byteLength;if(n>this.bytes.byteLength){const e=new Uint8Array(n);e.set(this.bytes,0),this.bytes=e}this.bytes.set(e,t)},new((r=void 0)||(r=Promise))((function(e,t){function s(e){try{c(i.next(e))}catch(e){t(e)}}function a(e){try{c(i.throw(e))}catch(e){t(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(s,a)}c((i=i.apply(n,o||[])).next())}));var n,o,r,i}truncate(){this.bytes=new Uint8Array}trim(e){this.bytes=this.bytes.slice(0,e)}finalize(e=!0){const t=f(this.bytes,this.mimeType);return e&&this.saveFileCallback&&this.saveFileCallback(t),t}getParts(){return this.bytes}replaceParts(e){this.bytes=e}}var p=n(5471);class m{constructor(e){this.dbName=e,this.useStorage=!0,d.Z.test&&(this.dbName+="_test"),m.STORAGES.length&&(this.useStorage=m.STORAGES[0].useStorage),this.openDatabase(),m.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(0,p.Z)("NO_ENTRY_FOUND");return e[t]()}))}saveFile(e,t){t instanceof Blob||(t=f(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then((()=>t))}timeoutOperation(e){return this.useStorage?new Promise(((t,n)=>{return o=this,r=void 0,s=function*(){let o=!1;const r=setTimeout((()=>{n(),o=!0}),15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const r=yield e(n);if(o)return;t(r)}catch(e){n(e)}clearTimeout(r)},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s})):Promise.reject((0,p.Z)("STORAGE_OFFLINE"))}prepareWriting(e,t,n){return{deferred:u(),getWriter:()=>new g(n,t,(t=>this.saveFile(e,t).catch((()=>t))))}}static toggleStorage(e,t){return Promise.all(this.STORAGES.map((n=>{if(n.useStorage=e,t)return e?void 0:n.deleteAll()})))}}m.STORAGES=[];const v=new Map,w=new m("cachedStreamChunks"),b="Time-Cached";setInterval((()=>w.timeoutOperation((e=>e.keys().then((t=>{const n=new Map,o=Date.now()/1e3|0;for(const e of t){const t=e.url.match(/\/(\d+?)\?/);t&&!n.has(t[1])&&n.set(t[1],e)}const r=[];for(const[t,i]of n){const n=e.match(i).then((n=>{if(+n.headers.get(b)+86400<=o)return V("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})}));r.push(n)}return Promise.all(r)}))))),18e5),setInterval((()=>{const e=J();for(const[t,n]of v)if(t!==e){for(const e in n)n[e].reject();v.delete(t)}}),12e4);const y=new Map;class S{constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{y.delete(this.id)},this.id=S.getId(e),y.set(this.id,this),this.limitPart=e.size>78643200?A:P,this.destroyDebounced=function(e,t,n=!0,o=!0){let r,i,s,a,c=!1;const u=t=>{const n=s,o=a;try{n(e.apply(null,t))}catch(e){console.error("debounce error",e),o(e)}},d=(...e)=>{i||(i=new Promise(((e,t)=>(s=e,a=t)))),r?(clearTimeout(r),c=!0,a(),i=new Promise(((e,t)=>(s=e,a=t)))):n&&(u(e),c=!1);const d=h.Z.setTimeout((()=>{!o||n&&!c||u(e),r===d&&(r=i=s=a=void 0,c=!1)}),t);return r=d,i.catch(l),i};return d.clearTimeout=()=>{r&&(h.Z.clearTimeout(r),a(),r=i=s=a=void 0,c=!1)},d.isDebounced=()=>!!r,d}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return o=this,r=void 0,s=function*(){const o={docId:this.id,dcId:this.info.dcId,offset:e,limit:t},r=JSON.stringify(o),i=J();let s=v.get(i);s||v.set(i,s={});let a=s[r];if(a)return a.then((e=>e.bytes));this.loadedOffsets.add(e),a=s[r]=u(),H.invoke("requestFilePart",o,void 0,i).then(a.resolve,a.reject).finally((()=>{s[r]===a&&(delete s[r],Object.keys(s).length||v.delete(i))}));const c=a.then((e=>e.bytes));return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s}requestFilePartFromCache(e,t,n){const o=this.getChunkKey(e,t);return w.getFile(o).then((e=>n?new Uint8Array:function(e){return function(e){return function(e,t){return new Promise((t=>{const n=new FileReader;n.addEventListener("loadend",(e=>{t(e.target.result)})),n.readAsArrayBuffer(e)}))}(e)}(e).then((e=>new Uint8Array(e)))}(e)),(e=>{e.type}))}requestFilePart(e,t,n){return this.requestFilePartFromCache(e,t,n).then((o=>o||this.requestFilePartFromWorker(e,t,n)))}saveChunkToCache(e,t,n){return e.then((e=>{const o=this.getChunkKey(t,n),r=new Response(e,{headers:{"Content-Length":""+e.length,"Content-Type":"application/octet-stream",[b]:""+(Date.now()/1e3|0)}});return w.save(o,r)}))}preloadChunk(e){this.loadedOffsets.has(e)||(this.loadedOffsets.add(e),this.requestFilePart(e,this.limitPart,!0))}preloadChunks(e,t){if(t>this.info.size&&(t=this.info.size),e)for(;e{n===i&&o===i+r||(e=e.slice(n-i,o-i+1));const t={"Accept-Ranges":"bytes","Content-Range":`bytes ${n}-${n+e.byteLength-1}/${this.info.size||"*"}`,"Content-Length":`${e.byteLength}`};return this.info.mimeType&&(t["Content-Type"]=this.info.mimeType),new Response(e,{status:206,statusText:"Partial Content",headers:t})}))}getChunkKey(e,t){return this.id+"?offset="+e+"&limit="+t}static get(e){var t;return null!==(t=y.get(this.getId(e)))&&void 0!==t?t:new S(e)}static getId(e){return e.location.id}}const P=524288,A=1048576;function k(e,t=2048){return e-e%t}var O=n(4762);function C(e,t){const n=Object.keys,o=typeof e;return e&&t&&"object"===o&&o===typeof t?n(e).length===n(t).length&&n(e).every((n=>C(e[n],t[n]))):e===t}class T{constructor(e){!function(e,t){if(t)for(const n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),d.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,o.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),T.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const o=Array.from(e.indexNames);for(const t of o)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let o=!1;return setTimeout((()=>{o||n.onerror((0,p.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,r)=>{n.onsuccess=t=>{o=!0;const i=n.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},i.onclose=e=>{this.log.error("closed:",e),!s&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(s=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},n.onerror=e=>{o=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},n.onupgradeneeded=e=>{o=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,r=n.result;this.stores.forEach((e=>{if(r.objectStoreNames.contains(e.name)){const o=n.transaction.objectStore(e.name);t(o,e)}else((e,n)=>{const o=e.createObjectStore(n.name);t(o,n)})(r,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new T(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}T.INSTANCES=[];class j{constructor(e,t){this.storeName=t,this.log=(0,o.kg)(["IDB",e.name,t].join("-")),this.idb=T.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,o)=>n.put(t[o],e)))),"",n)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,n,o=this.storeName){let r;return n&&(r=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((i=>new Promise(((s,a)=>{const c=i.transaction([o],e),l=()=>{clearTimeout(d),a(c.error)},u=()=>{clearTimeout(d),n&&this.log(n+": end",performance.now()-r);const e=p.map((e=>e.result));s(g?e:e[0])};c.onerror=l;const h="readwrite"===e;h&&(c.oncomplete=()=>u());const d=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),f=t(c.objectStore(o)),g=Array.isArray(f),p=g?f:[].concat(f);if(h)return;const m=p.length;let v=m;const w=()=>{c.error||--v||u()};for(let e=0;ee.getAll()),"",e)}}var E=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const x=self,I=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/",_=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new j(e,t)}get(e){return E(this,void 0,void 0,(function*(){if(void 0!==this.cache[e])return this.cache[e];let t;try{t=yield this.storage.get(e)}catch(e){}if(void 0!==this.cache[e])return this.cache[e];if(void 0===t){const n=this.defaults[e];t="function"==typeof n?n():n}return this.cache[e]=t}))}set(e,t){var n;return E(this,void 0,void 0,(function*(){if(!C(null!==(n=this.cache[e])&&void 0!==n?n:this.defaults[e],t)){this.cache[e]=t;try{this.storage.save(e,t)}catch(e){}}}))}}({name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]},"session",{push_mute_until:0,push_lang:{push_message_nopreview:"You have a new message",push_action_mute1d:"Mute for 24H",push_action_settings:"Settings"},push_settings:{}});x.addEventListener("push",(e=>{const t=e.data.json();V("push",t);let n=!1;const o=Promise.all([_.get("push_mute_until"),x.clients.matchAll({type:"window"})]).then((e=>{const[o,r]=e;if(V("matched clients",r),n=r.length>0,n)throw"Supress notification because some instance is alive";const i=Date.now();if(L()&&o&&i{V(e)}));const r=o.then((()=>Promise.all([_.get("push_settings"),_.get("push_lang")]))).then((e=>function(e,t,n){const o="assets/img/logo_filled_rounded.png";let r,i=e.title||"Telegram",s=e.description||"";e.custom&&(r=e.custom.channel_id?""+-e.custom.channel_id:e.custom.chat_id?""+-e.custom.chat_id:e.custom.from_id||""),e.custom.peerId=""+r;let a="peer"+r;t&&t.nopreview&&(i="Telegram",s=n.push_message_nopreview,a="unknown_peer"),V("show notify",i,s,o,e);const c=[{action:"mute1d",title:n.push_action_mute1d}];return x.registration.showNotification(i,{body:s,icon:o,tag:a,data:e,actions:c}).then((e=>{var t;(null==e?void 0:e.notification)&&(t=e.notification,N.has(t)||(N.add(t),t.onclose=D))})).catch((e=>{V.error("Show notification promise",e)}))}(t,e[0],e[1]))),i=r.catch((()=>(V("Closing all notifications on push",n),L()||n?R():x.registration.showNotification("Telegram",{tag:"unknown_peer"}).then((()=>{if(n)return R();setTimeout((()=>R()),n?0:100)})).catch((e=>{V.error("Show notification error",e)})))));e.waitUntil(i)})),x.addEventListener("notificationclick",(e=>{const t=e.notification;V("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&L())return V("[SW] mute for 1d"),void _.set("push_mute_until",Date.now()+864e5);const o=t.data;if(!o)return;const r=x.clients.matchAll({type:"window"}).then((e=>{o.action=n,F=o;for(let t=0;tx.clients.openWindow(e.baseUrl||I)))})).catch((e=>{V.error("Clients.matchAll error",e)}));e.waitUntil(r)})),x.addEventListener("notificationclose",D);const N=new Set;let F;function D(e){var t;t=e.notification,N.delete(t)}function R(){for(const e of N)try{e.close()}catch(e){}let e;return e="getNotifications"in x.registration?x.registration.getNotifications({}).then((e=>{for(let t=0,n=e.length;t{V.error("Offline register SW error",e)})):Promise.resolve(),N.clear(),e}function L(){return O.IS_FIREFOX}var W=n(153),M=n(410);class q extends W.Z{constructor(){super("SERVICE"),M.GO&&(M.GO.serviceMessagePort=this)}}var U=n(1352);const Z=new Map,G=(0,p.Z)("UNKNOWN");self.downloadMap=Z;const z={download:e=>{const{id:t}=e;if(Z.has(t))return Promise.reject(G);const n=new CountQueuingStrategy({highWaterMark:1}),o=u();let r;o.then((()=>{setTimeout((()=>{Z.delete(t)}),5e3)}),(()=>{Z.delete(t)}));const i=new ReadableStream({start:e=>{r=e},cancel:e=>{o.reject(G)}},n),s=Object.assign(Object.assign({},e),{readableStream:i,promise:o,controller:r});return Z.set(t,s),o.catch((()=>{throw G}))},downloadChunk:({id:e,chunk:t})=>{const n=Z.get(e);return n?n.controller.enqueue(t):Promise.reject()},downloadFinalize:e=>{const t=Z.get(e);return t?(t.promise.resolve(),t.controller.close()):Promise.reject()},downloadCancel:e=>{const t=Z.get(e);if(t)return t.promise.reject(),t.controller.error()}};function $(e,t){const n=r(100).then((()=>{const e=Z.get(t);if(!e||e.used)return;e.used=!0;const n=e.readableStream;return new Response(n,{headers:e.headers})}));e.respondWith(n)}function B(){if(Z.size)for(const[e,t]of Z)t.controller.error()}const V=(0,o.kg)("SW",o.v9.Error|o.v9.Debug|o.v9.Log|o.v9.Warn,!0),K=self;let X;const J=()=>X,Y=e=>{V("window connected",e.id,"windows before",te.size),"none"!==e.frameType?(V("windows",Array.from(te)),H.invokeVoid("hello",void 0,e),(e=>{te.size||X||(V("sending message port for mtproto"),(e=>{const t=new MessageChannel;H.attachPort(X=t.port1),H.invokeVoid("port",void 0,e,[t.port2])})(e))})(e),te.set(e.id,e)):V.warn("maybe a bugged Safari starting window",e.id)},H=new q;H.addMultipleEventsListeners({notificationsClear:R,toggleStorages:({enabled:e,clearWrite:t})=>{m.toggleStorage(e,t)},pushPing:(e,t)=>{!function(e,t){F&&t&&(H.invokeVoid("pushClick",F,t),F=void 0),e.lang&&_.set("push_lang",e.lang),e.settings&&_.set("push_settings",e.settings)}(e,t)},hello:(e,t)=>{Y(t)}});const{onDownloadFetch:Q,onClosedWindows:ee}=function(e){return e.addMultipleEventsListeners(z),{onDownloadFetch:$,onClosedWindows:B}}(H);(0,U.FK)().then((e=>{V(`got ${e.length} windows from the start`),e.forEach((e=>{Y(e)}))}));const te=new Map;self.connectedWindows=te,function(e,t,n){const o=(t,n)=>{e.attachListenPort(t),n&&e.attachSendPort(n)};e.setOnPortDisconnect((e=>{V("something has disconnected",e),e instanceof WindowClient&&te.has(e.id)?(te.delete(e.id),V("window disconnected, left",te.size),te.size||(V.warn("no windows left"),X&&(H.detachPort(X),X=void 0),ee())):V.warn("it is not a window")})),"undefined"!=typeof SharedWorkerGlobalScope?h.Z.addEventListener("connect",(e=>o(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?o(h.Z,null):o(h.Z,h.Z)}(H);const ne=e=>{if(!O.IS_SAFARI&&0===e.request.url.indexOf(location.origin+"/")&&e.request.url.match(/\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\?.*)?$/))return e.respondWith(function(e){return t=this,n=void 0,r=function*(){try{const t=yield c(i.caches.open(s)),n=yield c(t.match(e.request,{ignoreVary:!0}));if(n&&a(n))return n;const o={Vary:"*"};let r=yield fetch(e.request,{headers:o});if(a(r))t.put(e.request,r.clone());else if(304===r.status){const n=e.request.url.replace(/\?.+$/,"")+"?"+(1e5*Math.random()|0);r=yield fetch(n,{headers:o}),a(r)&&t.put(e.request,r.clone())}return r}catch(t){return fetch(e.request)}},new((o=void 0)||(o=Promise))((function(e,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(s,a)}c((r=r.apply(t,n||[])).next())}));var t,n,o,r}(e));try{const[t,n]=e.request.url.split("/").slice(-2);switch(t){case"stream":!function(e,t){const n=function(e){if(!e)return[0,0];const[,t]=e.split("="),n=t.split(", "),[o,r]=n[0].split("-");return[+o,+r||0]}(e.request.headers.get("Range")),o=JSON.parse(decodeURIComponent(t)),r=S.get(o);e.respondWith(Promise.race([(45e3,new Promise((e=>{setTimeout((()=>{e(new Response("",{status:408,statusText:"Request timed out."}))}),45e3)}))),r.requestRange(n)]))}(e,n);break;case"download":Q(e,n);break;case"ping":e.respondWith(new Response("pong"))}}catch(t){V.error("fetch error",t),e.respondWith(new Response("",{status:500,statusText:"Internal Server Error",headers:{"Cache-Control":"no-cache"}}))}},oe=()=>{K.onfetch=ne};K.addEventListener("install",(e=>{V("installing"),e.waitUntil(K.skipWaiting().then((()=>V("skipped waiting"))))})),K.addEventListener("activate",(e=>{V("activating",K),e.waitUntil(K.caches.delete(s).then((()=>V("cleared assets cache")))),e.waitUntil(K.clients.claim().then((()=>V("claimed clients"))))})),K.onoffline=K.ononline=oe,oe()}},a={};function c(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={exports:{}};return s[e](n,n.exports,c),n.exports}c.m=s,c.x=()=>{var e=c.O(void 0,[437],(()=>c(1901)));return c.O(e)},e=[],c.O=(t,n,o,r)=>{if(!n){var i=1/0;for(u=0;u=r)&&Object.keys(c.O).every((e=>c.O[e](n[a])))?n.splice(a--,1):(s=!1,r0&&e[u-1][2]>r;u--)e[u]=e[u-1];e[u]=[n,o,r]},c.d=(e,t)=>{for(var n in t)c.o(t,n)&&!c.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce(((t,n)=>(c.f[n](e,t),t)),[])),c.u=e=>e+".77e92ccb32c21ff43a10.bundle.js",c.miniCssF=e=>{},c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;c.g.importScripts&&(e=c.g.location+"");var t=c.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),c.p=e})(),t=c.u,n=c.e,o=new Map,r=new Map,c.u=function(e){return t(e)+(o.has(e)?"?"+o.get(e):"")},c.e=function(e){return n(e).catch((function(n){var i=r.has(e)?r.get(e):999999;if(i<1){var s=t(e);throw n.message="Loading chunk "+e+" failed after 999999 retries.\n("+s+")",n.request=s,n}return new Promise((function(t){setTimeout((function(){var n=Date.now();o.set(e,n),r.set(e,i-1),t(c.e(e))}),3e3)}))}))},(()=>{var e={670:1};c.f.i=(t,n)=>{e[t]||importScripts(c.p+c.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[o,r,i]=t;for(var s in r)c.o(r,s)&&(c.m[s]=r[s]);for(i&&i(c);o.length;)e[o.pop()]=1;n(t)}})(),i=c.x,c.x=()=>c.e(437).then(i),c.x()})(); -//# sourceMappingURL=sw.c12b91543b047629a922.chunk.js.map \ No newline at end of file +(()=>{"use strict";var e,t,n,o,r,i,s={4762:(e,t,n)=>{n.d(t,{IS_FIREFOX:()=>s,IS_SAFARI:()=>i});var o=n(6761);const r=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&o.Z.MSStream,!!("safari"in o.Z)||!(!r||!(/\b(iPad|iPhone|iPod)\b/.test(r)||r.match("Safari")&&!r.match("Chrome")))),s=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)},1352:(e,t,n)=>{n.d(t,{FK:()=>s,N5:()=>r,SU:()=>o,kC:()=>i});const o="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!o,i=r||o,s=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),a=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},c=(e,...t)=>{s().then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{a(e,...t)}))}))};o&&c.bind(null,!1),o&&c.bind(null,!0)},5003:(e,t,n)=>{n.d(t,{kg:()=>f,v9:()=>o});var o,r=n(410),i=n(4762),s=n(1352),a=n(5289);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(o||(o={}));const c=[o.None,o.Error,o.Warn,o.Log,o.Debug],l=!(i.IS_SAFARI||i.IS_FIREFOX),u="",h="",d=[["debug",o.Debug],["info",o.Log],["warn",o.Warn],["error",o.Error],["assert",o.Error],["trace",o.Log],["group",o.Log],["groupCollapsed",o.Log],["groupEnd",o.Log]];function f(e,t=o.Log|o.Warn|o.Error,n=!1,i=""){let g;r.ZP||n||(t=o.Error),l?i||(s.SU?i=u:s.N5&&(i=h)):i="";const p=i;i=i?`%s ${i}%s`:"%s";const m=function(...n){return t&o.Log&&console.log(i,(0,a.Z)(),e,...n)};return d.forEach((([n,o])=>{m[n]=function(...r){return t&o&&console[n](i,(0,a.Z)(),e,...r)}})),m.setPrefix=function(t){g=t,e="["+t+"]"},m.setPrefix(e),m.setLevel=function(e){t=c.slice(0,e+1).reduce(((e,t)=>e|t),0)},m.bindPrefix=function(e){return f(`${g}] [${e}`,t,n,p)},m}},1901:(e,t,n)=>{n.d(t,{Vp:()=>J,cM:()=>V,j6:()=>H});var o=n(5003);function r(e){return new Promise((t=>{setTimeout(t,e)}))}const i=self,s="cachedAssets";function a(e){return e.ok&&200===e.status}function c(e){return Promise.race([e,r(1e4).then((()=>Promise.reject()))])}function l(){}function u(){const e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach((e=>e(...t)))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise(((n,o)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,n(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,o(...e))}}));return t.catch(l).finally((()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=l)})),Object.assign(t,e),t}var h=n(6761),d=n(1267);function f(e,t=""){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","audio/wav","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);return new Blob(e,{type:n})}class g{constructor(e,t,n){this.mimeType=e,this.size=t,this.saveFileCallback=n,this.bytes=new Uint8Array(t)}write(e,t){return n=this,o=void 0,i=function*(){const n=t+e.byteLength;if(n>this.bytes.byteLength){const e=new Uint8Array(n);e.set(this.bytes,0),this.bytes=e}this.bytes.set(e,t)},new((r=void 0)||(r=Promise))((function(e,t){function s(e){try{c(i.next(e))}catch(e){t(e)}}function a(e){try{c(i.throw(e))}catch(e){t(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(s,a)}c((i=i.apply(n,o||[])).next())}));var n,o,r,i}truncate(){this.bytes=new Uint8Array}trim(e){this.bytes=this.bytes.slice(0,e)}finalize(e=!0){const t=f(this.bytes,this.mimeType);return e&&this.saveFileCallback&&this.saveFileCallback(t),t}getParts(){return this.bytes}replaceParts(e){this.bytes=e}}var p=n(5471);class m{constructor(e){this.dbName=e,this.useStorage=!0,d.Z.test&&(this.dbName+="_test"),m.STORAGES.length&&(this.useStorage=m.STORAGES[0].useStorage),this.openDatabase(),m.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(0,p.Z)("NO_ENTRY_FOUND");return e[t]()}))}saveFile(e,t){t instanceof Blob||(t=f(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then((()=>t))}timeoutOperation(e){return this.useStorage?new Promise(((t,n)=>{return o=this,r=void 0,s=function*(){let o=!1;const r=setTimeout((()=>{n(),o=!0}),15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const r=yield e(n);if(o)return;t(r)}catch(e){n(e)}clearTimeout(r)},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s})):Promise.reject((0,p.Z)("STORAGE_OFFLINE"))}prepareWriting(e,t,n){return{deferred:u(),getWriter:()=>new g(n,t,(t=>this.saveFile(e,t).catch((()=>t))))}}static toggleStorage(e,t){return Promise.all(this.STORAGES.map((n=>{if(n.useStorage=e,t)return e?void 0:n.deleteAll()})))}}m.STORAGES=[];const v=new Map,w=new m("cachedStreamChunks"),b="Time-Cached";setInterval((()=>w.timeoutOperation((e=>e.keys().then((t=>{const n=new Map,o=Date.now()/1e3|0;for(const e of t){const t=e.url.match(/\/(\d+?)\?/);t&&!n.has(t[1])&&n.set(t[1],e)}const r=[];for(const[t,i]of n){const n=e.match(i).then((n=>{if(+n.headers.get(b)+86400<=o)return V("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})}));r.push(n)}return Promise.all(r)}))))),18e5),setInterval((()=>{const e=J();for(const[t,n]of v)if(t!==e){for(const e in n)n[e].reject();v.delete(t)}}),12e4);const y=new Map;class S{constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{y.delete(this.id)},this.id=S.getId(e),y.set(this.id,this),this.limitPart=e.size>78643200?A:P,this.destroyDebounced=function(e,t,n=!0,o=!0){let r,i,s,a,c=!1;const u=t=>{const n=s,o=a;try{n(e.apply(null,t))}catch(e){console.error("debounce error",e),o(e)}},d=(...e)=>{i||(i=new Promise(((e,t)=>(s=e,a=t)))),r?(clearTimeout(r),c=!0,a(),i=new Promise(((e,t)=>(s=e,a=t)))):n&&(u(e),c=!1);const d=h.Z.setTimeout((()=>{!o||n&&!c||u(e),r===d&&(r=i=s=a=void 0,c=!1)}),t);return r=d,i.catch(l),i};return d.clearTimeout=()=>{r&&(h.Z.clearTimeout(r),a(),r=i=s=a=void 0,c=!1)},d.isDebounced=()=>!!r,d}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return o=this,r=void 0,s=function*(){const o={docId:this.id,dcId:this.info.dcId,offset:e,limit:t},r=JSON.stringify(o),i=J();let s=v.get(i);s||v.set(i,s={});let a=s[r];if(a)return a.then((e=>e.bytes));this.loadedOffsets.add(e),a=s[r]=u(),H.invoke("requestFilePart",o,void 0,i).then(a.resolve,a.reject).finally((()=>{s[r]===a&&(delete s[r],Object.keys(s).length||v.delete(i))}));const c=a.then((e=>e.bytes));return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s}requestFilePartFromCache(e,t,n){const o=this.getChunkKey(e,t);return w.getFile(o).then((e=>n?new Uint8Array:function(e){return function(e){return function(e,t){return new Promise((t=>{const n=new FileReader;n.addEventListener("loadend",(e=>{t(e.target.result)})),n.readAsArrayBuffer(e)}))}(e)}(e).then((e=>new Uint8Array(e)))}(e)),(e=>{e.type}))}requestFilePart(e,t,n){return this.requestFilePartFromCache(e,t,n).then((o=>o||this.requestFilePartFromWorker(e,t,n)))}saveChunkToCache(e,t,n){return e.then((e=>{const o=this.getChunkKey(t,n),r=new Response(e,{headers:{"Content-Length":""+e.length,"Content-Type":"application/octet-stream",[b]:""+(Date.now()/1e3|0)}});return w.save(o,r)}))}preloadChunk(e){this.loadedOffsets.has(e)||(this.loadedOffsets.add(e),this.requestFilePart(e,this.limitPart,!0))}preloadChunks(e,t){if(t>this.info.size&&(t=this.info.size),e)for(;e{n===i&&o===i+r||(e=e.slice(n-i,o-i+1));const t={"Accept-Ranges":"bytes","Content-Range":`bytes ${n}-${n+e.byteLength-1}/${this.info.size||"*"}`,"Content-Length":`${e.byteLength}`};return this.info.mimeType&&(t["Content-Type"]=this.info.mimeType),new Response(e,{status:206,statusText:"Partial Content",headers:t})}))}getChunkKey(e,t){return this.id+"?offset="+e+"&limit="+t}static get(e){var t;return null!==(t=y.get(this.getId(e)))&&void 0!==t?t:new S(e)}static getId(e){return e.location.id}}const P=524288,A=1048576;function k(e,t=2048){return e-e%t}var O=n(4762);function C(e,t){const n=Object.keys,o=typeof e;return e&&t&&"object"===o&&o===typeof t?n(e).length===n(t).length&&n(e).every((n=>C(e[n],t[n]))):e===t}class T{constructor(e){!function(e,t){if(t)for(const n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),d.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,o.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),T.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const o=Array.from(e.indexNames);for(const t of o)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let o=!1;return setTimeout((()=>{o||n.onerror((0,p.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,r)=>{n.onsuccess=t=>{o=!0;const i=n.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},i.onclose=e=>{this.log.error("closed:",e),!s&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(s=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},n.onerror=e=>{o=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},n.onupgradeneeded=e=>{o=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,r=n.result;this.stores.forEach((e=>{if(r.objectStoreNames.contains(e.name)){const o=n.transaction.objectStore(e.name);t(o,e)}else((e,n)=>{const o=e.createObjectStore(n.name);t(o,n)})(r,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new T(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}T.INSTANCES=[];class j{constructor(e,t){this.storeName=t,this.log=(0,o.kg)(["IDB",e.name,t].join("-")),this.idb=T.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,o)=>n.put(t[o],e)))),"",n)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,n,o=this.storeName){let r;return n&&(r=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((i=>new Promise(((s,a)=>{const c=i.transaction([o],e),l=()=>{clearTimeout(d),a(c.error)},u=()=>{clearTimeout(d),n&&this.log(n+": end",performance.now()-r);const e=p.map((e=>e.result));s(g?e:e[0])};c.onerror=l;const h="readwrite"===e;h&&(c.oncomplete=()=>u());const d=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),f=t(c.objectStore(o)),g=Array.isArray(f),p=g?f:[].concat(f);if(h)return;const m=p.length;let v=m;const w=()=>{c.error||--v||u()};for(let e=0;ee.getAll()),"",e)}}var E=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const x=self,I=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/",_=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new j(e,t)}get(e){return E(this,void 0,void 0,(function*(){if(void 0!==this.cache[e])return this.cache[e];let t;try{t=yield this.storage.get(e)}catch(e){}if(void 0!==this.cache[e])return this.cache[e];if(void 0===t){const n=this.defaults[e];t="function"==typeof n?n():n}return this.cache[e]=t}))}set(e,t){var n;return E(this,void 0,void 0,(function*(){if(!C(null!==(n=this.cache[e])&&void 0!==n?n:this.defaults[e],t)){this.cache[e]=t;try{this.storage.save(e,t)}catch(e){}}}))}}({name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]},"session",{push_mute_until:0,push_lang:{push_message_nopreview:"You have a new message",push_action_mute1d:"Mute for 24H",push_action_settings:"Settings"},push_settings:{}});x.addEventListener("push",(e=>{const t=e.data.json();V("push",t);let n=!1;const o=Promise.all([_.get("push_mute_until"),x.clients.matchAll({type:"window"})]).then((e=>{const[o,r]=e;if(V("matched clients",r),n=r.length>0,n)throw"Supress notification because some instance is alive";const i=Date.now();if(L()&&o&&i{V(e)}));const r=o.then((()=>Promise.all([_.get("push_settings"),_.get("push_lang")]))).then((e=>function(e,t,n){const o="assets/img/logo_filled_rounded.png";let r,i=e.title||"Telegram",s=e.description||"";e.custom&&(r=e.custom.channel_id?""+-e.custom.channel_id:e.custom.chat_id?""+-e.custom.chat_id:e.custom.from_id||""),e.custom.peerId=""+r;let a="peer"+r;t&&t.nopreview&&(i="Telegram",s=n.push_message_nopreview,a="unknown_peer"),V("show notify",i,s,o,e);const c=[{action:"mute1d",title:n.push_action_mute1d}];return x.registration.showNotification(i,{body:s,icon:o,tag:a,data:e,actions:c}).then((e=>{var t;(null==e?void 0:e.notification)&&(t=e.notification,N.has(t)||(N.add(t),t.onclose=D))})).catch((e=>{V.error("Show notification promise",e)}))}(t,e[0],e[1]))),i=r.catch((()=>(V("Closing all notifications on push",n),L()||n?R():x.registration.showNotification("Telegram",{tag:"unknown_peer"}).then((()=>{if(n)return R();setTimeout((()=>R()),n?0:100)})).catch((e=>{V.error("Show notification error",e)})))));e.waitUntil(i)})),x.addEventListener("notificationclick",(e=>{const t=e.notification;V("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&L())return V("[SW] mute for 1d"),void _.set("push_mute_until",Date.now()+864e5);const o=t.data;if(!o)return;const r=x.clients.matchAll({type:"window"}).then((e=>{o.action=n,F=o;for(let t=0;tx.clients.openWindow(e.baseUrl||I)))})).catch((e=>{V.error("Clients.matchAll error",e)}));e.waitUntil(r)})),x.addEventListener("notificationclose",D);const N=new Set;let F;function D(e){var t;t=e.notification,N.delete(t)}function R(){for(const e of N)try{e.close()}catch(e){}let e;return e="getNotifications"in x.registration?x.registration.getNotifications({}).then((e=>{for(let t=0,n=e.length;t{V.error("Offline register SW error",e)})):Promise.resolve(),N.clear(),e}function L(){return O.IS_FIREFOX}var W=n(153),M=n(410);class q extends W.Z{constructor(){super("SERVICE"),M.GO&&(M.GO.serviceMessagePort=this)}}var U=n(1352);const Z=new Map,G=(0,p.Z)("UNKNOWN");self.downloadMap=Z;const z={download:e=>{const{id:t}=e;if(Z.has(t))return Promise.reject(G);const n=new CountQueuingStrategy({highWaterMark:1}),o=u();let r;o.then((()=>{setTimeout((()=>{Z.delete(t)}),5e3)}),(()=>{Z.delete(t)}));const i=new ReadableStream({start:e=>{r=e},cancel:e=>{o.reject(G)}},n),s=Object.assign(Object.assign({},e),{readableStream:i,promise:o,controller:r});return Z.set(t,s),o.catch((()=>{throw G}))},downloadChunk:({id:e,chunk:t})=>{const n=Z.get(e);return n?n.controller.enqueue(t):Promise.reject()},downloadFinalize:e=>{const t=Z.get(e);return t?(t.promise.resolve(),t.controller.close()):Promise.reject()},downloadCancel:e=>{const t=Z.get(e);if(t)return t.promise.reject(),t.controller.error()}};function $(e,t){const n=r(100).then((()=>{const e=Z.get(t);if(!e||e.used)return;e.used=!0;const n=e.readableStream;return new Response(n,{headers:e.headers})}));e.respondWith(n)}function B(){if(Z.size)for(const[e,t]of Z)t.controller.error()}const V=(0,o.kg)("SW",o.v9.Error|o.v9.Debug|o.v9.Log|o.v9.Warn,!0),K=self;let X;const J=()=>X,Y=e=>{V("window connected",e.id,"windows before",te.size),"none"!==e.frameType?(V("windows",Array.from(te)),H.invokeVoid("hello",void 0,e),(e=>{te.size||X||(V("sending message port for mtproto"),(e=>{const t=new MessageChannel;H.attachPort(X=t.port1),H.invokeVoid("port",void 0,e,[t.port2])})(e))})(e),te.set(e.id,e)):V.warn("maybe a bugged Safari starting window",e.id)},H=new q;H.addMultipleEventsListeners({notificationsClear:R,toggleStorages:({enabled:e,clearWrite:t})=>{m.toggleStorage(e,t)},pushPing:(e,t)=>{!function(e,t){F&&t&&(H.invokeVoid("pushClick",F,t),F=void 0),e.lang&&_.set("push_lang",e.lang),e.settings&&_.set("push_settings",e.settings)}(e,t)},hello:(e,t)=>{Y(t)}});const{onDownloadFetch:Q,onClosedWindows:ee}=function(e){return e.addMultipleEventsListeners(z),{onDownloadFetch:$,onClosedWindows:B}}(H);(0,U.FK)().then((e=>{V(`got ${e.length} windows from the start`),e.forEach((e=>{Y(e)}))}));const te=new Map;self.connectedWindows=te,function(e,t,n){const o=(t,n)=>{e.attachListenPort(t),n&&e.attachSendPort(n)};e.setOnPortDisconnect((e=>{V("something has disconnected",e),e instanceof WindowClient&&te.has(e.id)?(te.delete(e.id),V("window disconnected, left",te.size),te.size||(V.warn("no windows left"),X&&(H.detachPort(X),X=void 0),ee())):V.warn("it is not a window")})),"undefined"!=typeof SharedWorkerGlobalScope?h.Z.addEventListener("connect",(e=>o(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?o(h.Z,null):o(h.Z,h.Z)}(H);const ne=e=>{if(!O.IS_SAFARI&&0===e.request.url.indexOf(location.origin+"/")&&e.request.url.match(/\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\?.*)?$/))return e.respondWith(function(e){return t=this,n=void 0,r=function*(){try{const t=yield c(i.caches.open(s)),n=yield c(t.match(e.request,{ignoreVary:!0}));if(n&&a(n))return n;const o={Vary:"*"};let r=yield fetch(e.request,{headers:o});if(a(r))t.put(e.request,r.clone());else if(304===r.status){const n=e.request.url.replace(/\?.+$/,"")+"?"+(1e5*Math.random()|0);r=yield fetch(n,{headers:o}),a(r)&&t.put(e.request,r.clone())}return r}catch(t){return fetch(e.request)}},new((o=void 0)||(o=Promise))((function(e,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(s,a)}c((r=r.apply(t,n||[])).next())}));var t,n,o,r}(e));try{const[t,n]=e.request.url.split("/").slice(-2);switch(t){case"stream":!function(e,t){const n=function(e){if(!e)return[0,0];const[,t]=e.split("="),n=t.split(", "),[o,r]=n[0].split("-");return[+o,+r||0]}(e.request.headers.get("Range")),o=JSON.parse(decodeURIComponent(t)),r=S.get(o);e.respondWith(Promise.race([(45e3,new Promise((e=>{setTimeout((()=>{e(new Response("",{status:408,statusText:"Request timed out."}))}),45e3)}))),r.requestRange(n)]))}(e,n);break;case"download":Q(e,n);break;case"ping":e.respondWith(new Response("pong"))}}catch(t){V.error("fetch error",t),e.respondWith(new Response("",{status:500,statusText:"Internal Server Error",headers:{"Cache-Control":"no-cache"}}))}},oe=()=>{K.onfetch=ne};K.addEventListener("install",(e=>{V("installing"),e.waitUntil(K.skipWaiting().then((()=>V("skipped waiting"))))})),K.addEventListener("activate",(e=>{V("activating",K),e.waitUntil(K.caches.delete(s).then((()=>V("cleared assets cache")))),e.waitUntil(K.clients.claim().then((()=>V("claimed clients"))))})),K.onoffline=K.ononline=oe,oe()}},a={};function c(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={exports:{}};return s[e](n,n.exports,c),n.exports}c.m=s,c.x=()=>{var e=c.O(void 0,[437],(()=>c(1901)));return c.O(e)},e=[],c.O=(t,n,o,r)=>{if(!n){var i=1/0;for(u=0;u=r)&&Object.keys(c.O).every((e=>c.O[e](n[a])))?n.splice(a--,1):(s=!1,r0&&e[u-1][2]>r;u--)e[u]=e[u-1];e[u]=[n,o,r]},c.d=(e,t)=>{for(var n in t)c.o(t,n)&&!c.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce(((t,n)=>(c.f[n](e,t),t)),[])),c.u=e=>e+".a80d805671a4b222696d.bundle.js",c.miniCssF=e=>{},c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;c.g.importScripts&&(e=c.g.location+"");var t=c.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),c.p=e})(),t=c.u,n=c.e,o=new Map,r=new Map,c.u=function(e){return t(e)+(o.has(e)?"?"+o.get(e):"")},c.e=function(e){return n(e).catch((function(n){var i=r.has(e)?r.get(e):999999;if(i<1){var s=t(e);throw n.message="Loading chunk "+e+" failed after 999999 retries.\n("+s+")",n.request=s,n}return new Promise((function(t){setTimeout((function(){var n=Date.now();o.set(e,n),r.set(e,i-1),t(c.e(e))}),3e3)}))}))},(()=>{var e={670:1};c.f.i=(t,n)=>{e[t]||importScripts(c.p+c.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[o,r,i]=t;for(var s in r)c.o(r,s)&&(c.m[s]=r[s]);for(i&&i(c);o.length;)e[o.pop()]=1;n(t)}})(),i=c.x,c.x=()=>c.e(437).then(i),c.x()})(); +//# sourceMappingURL=sw.241e2211cf9f9c1af243.chunk.js.map \ No newline at end of file diff --git a/public/sw.241e2211cf9f9c1af243.chunk.js.map b/public/sw.241e2211cf9f9c1af243.chunk.js.map new file mode 100644 index 00000000..1df29d08 --- /dev/null +++ b/public/sw.241e2211cf9f9c1af243.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sw.241e2211cf9f9c1af243.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/lib/serviceWorker/cache.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/serviceWorker/stream.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/lib/serviceWorker/push.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/download.ts","webpack://tweb/./src/lib/serviceWorker/index.service.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/timeout.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(437).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\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;\n","/*\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// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const 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","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../helpers/schedulers/pause';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\n\nfunction isCorrectResponse(response: Response) {\n return response.ok && response.status === 200;\n}\n\nfunction timeoutRace>(promise: T) {\n return Promise.race([\n promise,\n pause(10000).then(() => Promise.reject())\n ]);\n}\n\nexport async function requestCache(event: FetchEvent) {\n try {\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\n\n if(file && isCorrectResponse(file)) {\n return file;\n }\n\n const headers: HeadersInit = {'Vary': '*'};\n let response = await fetch(event.request, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n } else if(response.status === 304) { // possible fix for 304 in Safari\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\n response = await fetch(url, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n }\n }\n\n return response;\n } catch(err) {\n return fetch(event.request);\n }\n}\n","export default function noop() {}\n","/*\n * 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 './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\n}\n","/*\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 const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\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 readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {InputFileLocation} from '../../layer';\nimport CacheStorageController from '../files/cacheStorage';\nimport {DownloadOptions, MyUploadFile} from '../mtproto/apiFileManager';\nimport {getMtprotoMessagePort, log, serviceMessagePort} from './index.service';\nimport {ServiceRequestFilePartTaskPayload} from './serviceMessagePort';\nimport timeout from './timeout';\n\nconst deferredPromises: Map}> = new Map();\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\nconst CHUNK_TTL = 86400;\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\nconst USE_CACHE = true;\n\nconst clearOldChunks = () => {\n return cacheStorage.timeoutOperation((cache) => {\n return cache.keys().then((requests) => {\n const filtered: Map = new Map();\n const timestamp = Date.now() / 1000 | 0;\n for(const request of requests) {\n const match = request.url.match(/\\/(\\d+?)\\?/);\n if(match && !filtered.has(match[1])) {\n filtered.set(match[1], request);\n }\n }\n\n const promises: Promise[] = [];\n for(const [id, request] of filtered) {\n const promise = cache.match(request).then((response) => {\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\n log('will delete stream chunk:', id);\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\n }\n });\n\n promises.push(promise);\n }\n\n return Promise.all(promises);\n });\n });\n};\n\nsetInterval(clearOldChunks, 1800e3);\nsetInterval(() => {\n const mtprotoMessagePort = getMtprotoMessagePort();\n for(const [messagePort, promises] of deferredPromises) {\n if(messagePort !== mtprotoMessagePort) {\n for(const taskId in promises) {\n const promise = promises[taskId];\n promise.reject();\n }\n\n deferredPromises.delete(messagePort);\n }\n }\n}, 120e3);\n\ntype StreamRange = [number, number];\ntype StreamId = DocId;\nconst streams: Map = new Map();\nclass Stream {\n private destroyDebounced: () => void;\n private id: StreamId;\n private limitPart: number;\n private loadedOffsets: Set = new Set();\n\n constructor(private info: DownloadOptions) {\n this.id = Stream.getId(info);\n streams.set(this.id, this);\n\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\n }\n\n private destroy = () => {\n streams.delete(this.id);\n };\n\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\n const payload: ServiceRequestFilePartTaskPayload = {\n docId: this.id,\n dcId: this.info.dcId,\n offset: alignedOffset,\n limit\n };\n\n const taskId = JSON.stringify(payload);\n\n const mtprotoMessagePort = getMtprotoMessagePort();\n let promises = deferredPromises.get(mtprotoMessagePort);\n if(!promises) {\n deferredPromises.set(mtprotoMessagePort, promises = {});\n }\n\n let deferred = promises[taskId];\n if(deferred) {\n return deferred.then((uploadFile) => uploadFile.bytes);\n }\n\n this.loadedOffsets.add(alignedOffset);\n\n deferred = promises[taskId] = deferredPromise();\n\n serviceMessagePort.invoke('requestFilePart', payload, undefined, mtprotoMessagePort)\n .then(deferred.resolve, deferred.reject).finally(() => {\n if(promises[taskId] === deferred) {\n delete promises[taskId];\n\n if(!Object.keys(promises).length) {\n deferredPromises.delete(mtprotoMessagePort);\n }\n }\n });\n\n const bytesPromise = deferred.then((uploadFile) => uploadFile.bytes);\n\n if(USE_CACHE) {\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\n }\n\n return bytesPromise;\n }\n\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\n if(!USE_CACHE) {\n return Promise.resolve();\n }\n\n const key = this.getChunkKey(alignedOffset, limit);\n return cacheStorage.getFile(key).then((blob: Blob) => {\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\n }, (error: ApiError) => {\n if(error.type === 'NO_ENTRY_FOUND') {\n return;\n }\n });\n }\n\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then((bytes) => {\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\n });\n }\n\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\n return deferred.then((bytes) => {\n const key = this.getChunkKey(alignedOffset, limit);\n const response = new Response(bytes, {\n headers: {\n 'Content-Length': '' + bytes.length,\n 'Content-Type': 'application/octet-stream',\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\n }\n });\n\n return cacheStorage.save(key, response);\n });\n }\n\n private preloadChunk(offset: number) {\n if(this.loadedOffsets.has(offset)) {\n return;\n }\n\n this.loadedOffsets.add(offset);\n this.requestFilePart(offset, this.limitPart, true);\n }\n\n private preloadChunks(offset: number, end: number) {\n if(end > this.info.size) {\n end = this.info.size;\n }\n\n if(!offset) { // load last chunk for bounds\n this.preloadChunk(alignOffset(offset, this.limitPart));\n } else { // don't preload next chunks before the start\n for(; offset < end; offset += this.limitPart) {\n this.preloadChunk(offset);\n }\n }\n }\n\n public requestRange(range: StreamRange) {\n this.destroyDebounced();\n\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\n if(possibleResponse) {\n return possibleResponse;\n }\n\n let [offset, end] = range;\n\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\n //end = info.size - 1;\n //offset = info.size - 1 - limitPart;\n offset = info.size - (info.size % limitPart);\n } */\n\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\n const alignedOffset = alignOffset(offset, limit);\n\n if(!end) {\n end = Math.min(offset + limit, this.info.size - 1);\n }\n\n return this.requestFilePart(alignedOffset, limit).then((ab) => {\n // log.debug('[stream] requestFilePart result:', result);\n\n // if(isSafari) {\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\n }\n\n const headers: Record = {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\n 'Content-Length': `${ab.byteLength}`\n };\n\n if(this.info.mimeType) {\n headers['Content-Type'] = this.info.mimeType;\n }\n\n // simulate slow connection\n // setTimeout(() => {\n return new Response(ab, {\n status: 206,\n statusText: 'Partial Content',\n headers\n });\n // }, 2.5e3);\n });\n }\n\n private getChunkKey(alignedOffset: number, limit: number) {\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\n }\n\n public static get(info: DownloadOptions) {\n return streams.get(this.getId(info)) ?? new Stream(info);\n }\n\n private static getId(info: DownloadOptions) {\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\n }\n}\n\nexport default function onStreamFetch(event: FetchEvent, params: string) {\n const range = parseRange(event.request.headers.get('Range'));\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\n const stream = Stream.get(info);\n\n // log.debug('[stream]', url, offset, end);\n\n event.respondWith(Promise.race([\n timeout(45 * 1000),\n stream.requestRange(range)\n ]));\n}\n\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\n if(range[0] === 0 && range[1] === 1) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes 0-1/${size || '*'}`,\n 'Content-Length': '2',\n 'Content-Type': mimeType || 'video/mp4'\n }\n });\n }\n\n return null;\n}\n\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\n\nfunction parseRange(header: string): StreamRange {\n if(!header) return [0, 0];\n const [, chunks] = header.split('=');\n const ranges = chunks.split(', ');\n const [offset, end] = ranges[0].split('-');\n\n return [+offset, +end || 0];\n}\n\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\n return offset - (offset % base);\n}\n\nfunction alignLimit(limit: number) {\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\n}\n","// * Jolly Cobra's schedulers\n\nimport ctx from '../../environment/ctx';\nimport {AnyFunction, Awaited} from '../../types';\nimport noop from '../noop';\n\nexport type DebounceReturnType = {\n (...args: Parameters): Promise>>;\n clearTimeout(): void;\n isDebounced(): boolean;\n};\n\nexport default function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true\n): DebounceReturnType {\n let waitingTimeout: number;\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\n let hadNewCall = false;\n\n const invoke = (args: Parameters) => {\n const _resolve = resolve, _reject = reject;\n try {\n const result = fn.apply(null, args);\n _resolve(result);\n } catch(err) {\n console.error('debounce error', err);\n // @ts-ignore\n _reject(err);\n }\n };\n\n const debounce = (...args: Parameters) => {\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n\n if(waitingTimeout) {\n clearTimeout(waitingTimeout);\n hadNewCall = true;\n reject();\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n } else if(shouldRunFirst) {\n invoke(args);\n hadNewCall = false;\n }\n\n const _waitingTimeout = ctx.setTimeout(() => {\n // will run if should run last or first but with new call\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\n invoke(args);\n }\n\n // if debounce was called during invoking\n if(waitingTimeout === _waitingTimeout) {\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n }, ms);\n\n waitingTimeout = _waitingTimeout;\n waitingPromise.catch(noop);\n return waitingPromise;\n };\n\n debounce.clearTimeout = () => {\n if(waitingTimeout) {\n ctx.clearTimeout(waitingTimeout);\n reject();\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n };\n\n debounce.isDebounced = () => !!waitingTimeout;\n\n return debounce;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","/*\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 {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const 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","/*\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 {Database} from '../../config/databases';\nimport DATABASE_STATE from '../../config/databases/state';\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport IDBStorage from '../files/idb';\nimport {log, serviceMessagePort} from './index.service';\nimport {ServicePushPingTaskPayload} from './serviceMessagePort';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\n\nexport type PushNotificationObject = {\n loc_key: string,\n loc_args: string[],\n // user_id: number, // should be number\n custom: {\n channel_id?: string, // should be number\n chat_id?: string, // should be number\n from_id?: string, // should be number\n msg_id: string,\n peerId?: string // should be number\n },\n sound?: string,\n random_id: number,\n badge?: string, // should be number\n description: string,\n mute: string, // should be number\n title: string,\n\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\n};\n\nclass SomethingGetter, Storage extends Record> {\n private cache: Partial = {};\n private storage: IDBStorage;\n\n constructor(\n db: T,\n storeName: typeof db['stores'][number]['name'],\n private defaults: {\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\n }\n ) {\n this.storage = new IDBStorage(db, storeName);\n }\n\n public async get(key: T) {\n if(this.cache[key] !== undefined) {\n return this.cache[key];\n }\n\n let value: Storage[T];\n try {\n value = await this.storage.get(key as string);\n } catch(err) {\n\n }\n\n if(this.cache[key] !== undefined) {\n return this.cache[key];\n }\n\n if(value === undefined) {\n const callback = this.defaults[key];\n value = typeof(callback) === 'function' ? callback() : callback;\n }\n\n return this.cache[key] = value;\n }\n\n public async set(key: T, value: Storage[T]) {\n const cached = this.cache[key] ?? this.defaults[key];\n if(deepEqual(cached, value)) {\n return;\n }\n\n this.cache[key] = value;\n\n try {\n this.storage.save(key as string, value);\n } catch(err) {\n\n }\n }\n}\n\ntype PushStorage = {\n push_mute_until: number,\n push_lang: Partial\n push_settings: Partial\n};\n\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', {\n push_mute_until: 0,\n push_lang: {\n push_message_nopreview: 'You have a new message',\n push_action_mute1d: 'Mute for 24H',\n push_action_settings: 'Settings'\n },\n push_settings: {}\n});\n\nctx.addEventListener('push', (event) => {\n const obj: PushNotificationObject = event.data.json();\n log('push', obj);\n\n let hasActiveWindows = false;\n const checksPromise = Promise.all([\n getter.get('push_mute_until'),\n ctx.clients.matchAll({type: 'window'})\n ]).then((result) => {\n const [muteUntil, clientList] = result;\n\n log('matched clients', clientList);\n hasActiveWindows = clientList.length > 0;\n if(hasActiveWindows) {\n throw 'Supress notification because some instance is alive';\n }\n\n const nowTime = Date.now();\n if(userInvisibleIsSupported() &&\n muteUntil &&\n nowTime < muteUntil) {\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\n }\n\n if(!obj.badge) {\n throw 'No badge?';\n }\n });\n\n checksPromise.catch((reason) => {\n log(reason);\n });\n\n const notificationPromise = checksPromise.then(() => {\n return Promise.all([getter.get('push_settings'), getter.get('push_lang')])\n }).then((result) => {\n return fireNotification(obj, result[0], result[1]);\n });\n\n const closePromise = notificationPromise.catch(() => {\n log('Closing all notifications on push', hasActiveWindows);\n if(userInvisibleIsSupported() || hasActiveWindows) {\n return closeAllNotifications();\n }\n\n return ctx.registration.showNotification('Telegram', {\n tag: 'unknown_peer'\n }).then(() => {\n if(hasActiveWindows) {\n return closeAllNotifications();\n }\n\n setTimeout(() => closeAllNotifications(), hasActiveWindows ? 0 : 100);\n }).catch((error) => {\n log.error('Show notification error', error);\n });\n });\n\n event.waitUntil(closePromise);\n});\n\nctx.addEventListener('notificationclick', (event) => {\n const notification = event.notification;\n log('On notification click: ', notification.tag);\n notification.close();\n\n const action = event.action as PushNotificationObject['action'];\n if(action === 'mute1d' && userInvisibleIsSupported()) {\n log('[SW] mute for 1d');\n getter.set('push_mute_until', Date.now() + 86400e3);\n return;\n }\n\n const data: PushNotificationObject = notification.data;\n if(!data) {\n return;\n }\n\n const promise = ctx.clients.matchAll({\n type: 'window'\n }).then((clientList) => {\n data.action = action;\n pendingNotification = data;\n for(let i = 0; i < clientList.length; i++) {\n const client = clientList[i];\n if('focus' in client) {\n client.focus();\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, client);\n pendingNotification = undefined;\n return;\n }\n }\n\n if(ctx.clients.openWindow) {\n return getter.get('push_settings').then((settings) => {\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\n });\n }\n }).catch((error) => {\n log.error('Clients.matchAll error', error);\n })\n\n event.waitUntil(promise);\n});\n\nctx.addEventListener('notificationclose', onCloseNotification);\n\nconst notifications: Set = new Set();\nlet pendingNotification: PushNotificationObject;\nfunction pushToNotifications(notification: Notification) {\n if(!notifications.has(notification)) {\n notifications.add(notification);\n // @ts-ignore\n notification.onclose = onCloseNotification;\n }\n}\n\nfunction onCloseNotification(event: NotificationEvent) {\n removeFromNotifications(event.notification)\n}\n\nfunction removeFromNotifications(notification: Notification) {\n notifications.delete(notification);\n}\n\nexport function closeAllNotifications() {\n for(const notification of notifications) {\n try {\n notification.close();\n } catch(e) {}\n }\n\n let promise: Promise;\n if('getNotifications' in ctx.registration) {\n promise = ctx.registration.getNotifications({}).then((notifications) => {\n for(let i = 0, len = notifications.length; i < len; ++i) {\n try {\n notifications[i].close();\n } catch(e) {}\n }\n }).catch((error) => {\n log.error('Offline register SW error', error);\n });\n } else {\n promise = Promise.resolve();\n }\n\n notifications.clear();\n\n return promise;\n}\n\nfunction userInvisibleIsSupported() {\n return IS_FIREFOX;\n}\n\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\n const icon = 'assets/img/logo_filled_rounded.png';\n let title = obj.title || 'Telegram';\n let body = obj.description || '';\n let peerId: string;\n\n if(obj.custom) {\n if(obj.custom.channel_id) {\n peerId = '' + -obj.custom.channel_id;\n } else if(obj.custom.chat_id) {\n peerId = '' + -obj.custom.chat_id;\n } else {\n peerId = obj.custom.from_id || '';\n }\n }\n\n obj.custom.peerId = '' + peerId;\n let tag = 'peer' + peerId;\n\n if(settings && settings.nopreview) {\n title = 'Telegram';\n body = lang.push_message_nopreview;\n tag = 'unknown_peer';\n }\n\n log('show notify', title, body, icon, obj);\n\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\n action: 'mute1d',\n title: lang.push_action_mute1d\n }/* , {\n action: 'push_settings',\n title: lang.push_action_settings || 'Settings'\n } */];\n\n const notificationPromise = ctx.registration.showNotification(title, {\n body,\n icon,\n tag,\n data: obj,\n actions\n });\n\n return notificationPromise.then((event) => {\n // @ts-ignore\n if(event?.notification) {\n // @ts-ignore\n pushToNotifications(event.notification);\n }\n }).catch((error) => {\n log.error('Show notification promise', error);\n });\n}\n\nexport function onPing(payload: ServicePushPingTaskPayload, source?: MessageEventSource) {\n if(pendingNotification && source) {\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, source);\n pendingNotification = undefined;\n }\n\n if(payload.lang) {\n getter.set('push_lang', payload.lang);\n }\n\n if(payload.settings) {\n getter.set('push_settings', payload.settings);\n }\n}\n","/*\n * 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 {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_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 type {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\n }\n}\n","/*\n * 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 {ServiceDownloadTaskPayload} from './serviceMessagePort';\nimport type ServiceMessagePort from './serviceMessagePort';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport pause from '../../helpers/schedulers/pause';\n\ntype DownloadType = Uint8Array;\ntype DownloadItem = ServiceDownloadTaskPayload & {\n // transformStream: TransformStream,\n readableStream: ReadableStream,\n // writableStream: WritableStream,\n // writer: WritableStreamDefaultWriter,\n // controller: TransformStreamDefaultController,\n controller: ReadableStreamController,\n promise: CancellablePromise,\n // downloadPromise: Promise,\n used?: boolean\n};\nconst downloadMap: Map = new Map();\nconst DOWNLOAD_ERROR = makeError('UNKNOWN');\nconst DOWNLOAD_TEST = false;\n\n(self as any).downloadMap = downloadMap;\n\ntype A = Parameters['addMultipleEventsListeners']>[0];\n\nconst events: A = {\n download: (payload) => {\n const {id} = payload;\n if(downloadMap.has(id)) {\n return Promise.reject(DOWNLOAD_ERROR);\n }\n\n // const y = (20 * 1024 * 1024) / payload.limitPart;\n // const strategy = new ByteLengthQueuingStrategy({highWaterMark: y});\n // let controller: TransformStreamDefaultController;\n const strategy = new CountQueuingStrategy({highWaterMark: 1});\n // const transformStream = new TransformStream(/* {\n // start: (_controller) => controller = _controller,\n // }, */undefined, strategy, strategy);\n\n // const {readable, writable} = transformStream;\n // const writer = writable.getWriter();\n\n const promise = deferredPromise();\n promise.then(() => {\n setTimeout(() => {\n downloadMap.delete(id);\n }, 5e3);\n }, () => {\n downloadMap.delete(id);\n });\n\n // writer.closed.then(promise.resolve, promise.reject);\n\n let controller: ReadableStreamController;\n const readable = new ReadableStream({\n start: (_controller) => {\n controller = _controller;\n },\n\n cancel: (reason) => {\n promise.reject(DOWNLOAD_ERROR);\n }\n }, strategy);\n\n // writer.closed.catch(noop).finally(() => {\n // log.error('closed writer');\n // onEnd();\n // });\n\n // const downloadPromise = writer.closed.catch(() => {throw DOWNLOAD_ERROR;});\n const item: DownloadItem = {\n ...payload,\n // transformStream,\n readableStream: readable,\n // writableStream: writable,\n // writer,\n // downloadPromise,\n promise,\n controller\n };\n\n downloadMap.set(id, item);\n\n // return downloadPromise;\n return promise.catch(() => {throw DOWNLOAD_ERROR});\n },\n\n downloadChunk: ({id, chunk}) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n // return item.controller.enqueue(chunk);\n // return item.writer.write(chunk);\n return item.controller.enqueue(chunk);\n },\n\n downloadFinalize: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n item.promise.resolve();\n // return item.controller.terminate();\n // return item.writer.close();\n return item.controller.close();\n },\n\n downloadCancel: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return;\n }\n\n item.promise.reject();\n // return item.controller.error();\n // return item.writer.abort();\n return item.controller.error();\n }\n};\n\nexport default function handleDownload(serviceMessagePort: ServiceMessagePort) {\n serviceMessagePort.addMultipleEventsListeners(events);\n\n return {\n onDownloadFetch,\n onClosedWindows: cancelAllDownloads\n };\n}\n\nfunction onDownloadFetch(event: FetchEvent, params: string) {\n const promise = pause(100).then(() => {\n const item = downloadMap.get(params);\n if(!item || (item.used && !DOWNLOAD_TEST)) {\n return;\n }\n\n item.used = true;\n const stream = item.readableStream;\n const response = new Response(stream, {headers: item.headers});\n return response;\n });\n\n event.respondWith(promise);\n}\n\nfunction cancelAllDownloads() {\n if(downloadMap.size) {\n for(const [id, item] of downloadMap) {\n // item.writer.abort().catch(noop);\n item.controller.error();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n \n \n \n\nimport {logger, LogTypes} from '../logger';\nimport {CACHE_ASSETS_NAME, requestCache} from './cache';\nimport onStreamFetch from './stream';\nimport {closeAllNotifications, onPing} from './push';\nimport CacheStorageController from '../files/cacheStorage';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport ServiceMessagePort from './serviceMessagePort';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {getWindowClients} from '../../helpers/context';\nimport {MessageSendPort} from '../mtproto/superMessagePort';\nimport handleDownload from './download';\n\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn, true);\nconst ctx = self as any as ServiceWorkerGlobalScope;\n\n \nlet _mtprotoMessagePort: MessagePort;\nexport const getMtprotoMessagePort = () => _mtprotoMessagePort;\n\nconst sendMessagePort = (source: MessageSendPort) => {\n const channel = new MessageChannel();\n serviceMessagePort.attachPort(_mtprotoMessagePort = channel.port1);\n serviceMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n};\n\nconst sendMessagePortIfNeeded = (source: MessageSendPort) => {\n if(!connectedWindows.size && !_mtprotoMessagePort) {\n log('sending message port for mtproto');\n sendMessagePort(source);\n }\n};\n\nconst onWindowConnected = (source: WindowClient) => {\n log('window connected', source.id, 'windows before', connectedWindows.size);\n\n if(source.frameType === 'none') {\n log.warn('maybe a bugged Safari starting window', source.id);\n return;\n }\n\n log('windows', Array.from(connectedWindows));\n serviceMessagePort.invokeVoid('hello', undefined, source);\n sendMessagePortIfNeeded(source);\n connectedWindows.set(source.id, source);\n};\n\nexport const serviceMessagePort = new ServiceMessagePort();\nserviceMessagePort.addMultipleEventsListeners({\n notificationsClear: closeAllNotifications,\n\n toggleStorages: ({enabled, clearWrite}) => {\n CacheStorageController.toggleStorage(enabled, clearWrite);\n },\n\n pushPing: (payload, source) => {\n onPing(payload, source);\n },\n\n hello: (payload, source) => {\n onWindowConnected(source as any as WindowClient);\n }\n});\n\nconst {\n onDownloadFetch,\n onClosedWindows: onDownloadClosedWindows\n} = handleDownload(serviceMessagePort);\n\n// * service worker can be killed, so won't get 'hello' event\ngetWindowClients().then((windowClients) => {\n log(`got ${windowClients.length} windows from the start`);\n windowClients.forEach((windowClient) => {\n onWindowConnected(windowClient);\n });\n});\n\nconst connectedWindows: Map = new Map();\n(self as any).connectedWindows = connectedWindows;\nlistenMessagePort(serviceMessagePort, undefined, (source) => {\n log('something has disconnected', source);\n const isWindowClient = source instanceof WindowClient;\n if(!isWindowClient || !connectedWindows.has(source.id)) {\n log.warn('it is not a window');\n return;\n }\n\n connectedWindows.delete(source.id);\n log('window disconnected, left', connectedWindows.size);\n if(!connectedWindows.size) {\n log.warn('no windows left');\n\n if(_mtprotoMessagePort) {\n serviceMessagePort.detachPort(_mtprotoMessagePort);\n _mtprotoMessagePort = undefined;\n }\n\n onDownloadClosedWindows();\n }\n});\n \n\nconst onFetch = (event: FetchEvent): void => {\n \n if(\n !IS_SAFARI &&\n event.request.url.indexOf(location.origin + '/') === 0 &&\n event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)\n ) {\n return event.respondWith(requestCache(event));\n }\n \n\n try {\n // const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\n const [scope, params] = event.request.url.split('/').slice(-2);\n\n // log.debug('[fetch]:', event);\n\n switch(scope) {\n case 'stream': {\n onStreamFetch(event, params);\n break;\n }\n\n case 'download': {\n onDownloadFetch(event, params);\n break;\n }\n\n case 'ping': {\n event.respondWith(new Response('pong'));\n break;\n }\n }\n } catch(err) {\n log.error('fetch error', err);\n event.respondWith(new Response('', {\n status: 500,\n statusText: 'Internal Server Error',\n headers: {'Cache-Control': 'no-cache'}\n }));\n }\n};\n\nconst onChangeState = () => {\n ctx.onfetch = onFetch;\n};\n\nctx.addEventListener('install', (event) => {\n log('installing');\n event.waitUntil(ctx.skipWaiting().then(() => log('skipped waiting'))); // Activate worker immediately\n});\n\nctx.addEventListener('activate', (event) => {\n log('activating', ctx);\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME).then(() => log('cleared assets cache')));\n event.waitUntil(ctx.clients.claim().then(() => log('claimed clients')));\n});\n\n// ctx.onerror = (error) => {\n// log.error('error:', error);\n// };\n\n// ctx.onunhandledrejection = (error) => {\n// log.error('onunhandledrejection:', error);\n// };\n\nctx.onoffline = ctx.ononline = onChangeState;\n\nonChangeState();\n","/*\n * 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 SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","export default function timeout(delay: number): Promise {\n return new Promise(((resolve) => {\n setTimeout(() => {\n resolve(new Response('', {\n status: 408,\n statusText: 'Request timed out.'\n }));\n }, delay);\n }));\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [437], () => (__webpack_require__(1901)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + \"a80d805671a4b222696d\" + \".bundle.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t670: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","oldGetScript","oldLoadScript","queryMap","countMap","next","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","getWindowClients","clients","matchAll","includeUncontrolled","type","postMessage","listener","args","err","console","error","notifyServiceWorker","all","then","listeners","length","slice","forEach","bind","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","pause","ms","Promise","resolve","setTimeout","ctx","CACHE_ASSETS_NAME","isCorrectResponse","response","ok","status","timeoutRace","promise","race","reject","noop","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","callback","addNotifyListener","push","value","catch","finally","cancel","Object","assign","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","blobSafeMimeType","Blob","MemoryWriter","constructor","size","saveFileCallback","this","bytes","Uint8Array","write","part","offset","endOffset","byteLength","newBytes","set","truncate","trim","finalize","saveToStorage","blob","getParts","replaceParts","parts","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","save","put","getFile","fileName","makeError","saveFile","Response","headers","rejected","timeout","undefined","res","clearTimeout","prepareWriting","fileSize","getWriter","static","enabled","clearWrite","map","storage","deferredPromises","Map","cacheStorage","CHUNK_CACHED_TIME_HEADER","setInterval","keys","requests","filtered","timestamp","Date","now","request","url","has","promises","id","ignoreSearch","ignoreVary","mtprotoMessagePort","getMtprotoMessagePort","messagePort","taskId","streams","Stream","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","_resolve","_reject","apply","debounce","_waitingTimeout","isDebounced","requestFilePartFromWorker","alignedOffset","limit","fromPreload","payload","docId","dcId","JSON","stringify","uploadFile","add","serviceMessagePort","bytesPromise","saveChunkToCache","preloadChunks","requestFilePartFromCache","key","getChunkKey","reader","FileReader","addEventListener","e","target","result","readBlobAs","readBlobAsArrayBuffer","buffer","readBlobAsUint8Array","requestFilePart","preloadChunk","end","alignOffset","requestRange","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","location","base","deepEqual","x","y","tx","every","IDB","db","object","fromObject","i","safeAssign","name","storageIsAvailable","join","INSTANCES","isAvailable","createNew","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","indexedDB","version","message","finished","onerror","onsuccess","event","calledNew","onclose","onabort","transaction","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","find","instance","preserve","IDBStorage","storeName","idb","create","concat","getObjectStore","clear","idx","mode","perf","performance","onError","onComplete","results","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","defaultBaseUrl","protocol","hostname","pathname","split","getter","defaults","push_mute_until","push_lang","push_message_nopreview","push_action_mute1d","push_action_settings","push_settings","obj","data","json","hasActiveWindows","checksPromise","muteUntil","clientList","nowTime","userInvisibleIsSupported","badge","reason","notificationPromise","settings","lang","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","actions","action","registration","showNotification","notification","notifications","onCloseNotification","fireNotification","closePromise","closeAllNotifications","waitUntil","pendingNotification","client","focus","invokeVoid","openWindow","baseUrl","getNotifications","len","ServiceMessagePort","super","downloadMap","DOWNLOAD_ERROR","events","download","strategy","CountQueuingStrategy","highWaterMark","controller","readable","ReadableStream","start","_controller","item","readableStream","downloadChunk","chunk","enqueue","downloadFinalize","downloadCancel","onDownloadFetch","params","used","stream","respondWith","cancelAllDownloads","_mtprotoMessagePort","onWindowConnected","source","connectedWindows","frameType","channel","MessageChannel","attachPort","port1","port2","sendMessagePort","sendMessagePortIfNeeded","addMultipleEventsListeners","notificationsClear","toggleStorages","toggleStorage","pushPing","onPing","hello","onClosedWindows","onDownloadClosedWindows","handleDownload","windowClients","windowClient","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","WindowClient","detachPort","listenMessagePort","onFetch","origin","file","fetch","clone","replace","random","requestCache","scope","header","chunks","ranges","parseRange","parse","decodeURIComponent","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onoffline","ononline","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","splice","d","definition","o","defineProperty","enumerable","f","chunkId","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","call","scriptUrl","importScripts","document","currentScript","src","scripts","getElementsByTagName","p","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime","pop"],"sourceRoot":""} \ No newline at end of file diff --git a/public/sw.c12b91543b047629a922.chunk.js.map b/public/sw.c12b91543b047629a922.chunk.js.map deleted file mode 100644 index 080d2153..00000000 --- a/public/sw.c12b91543b047629a922.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sw.c12b91543b047629a922.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/lib/serviceWorker/cache.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/serviceWorker/stream.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/lib/serviceWorker/push.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/download.ts","webpack://tweb/./src/lib/serviceWorker/index.service.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/timeout.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(437).then(next);\n};","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\r\n * https://github.com/morethanwords/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\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\r\n\r\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\r\n try {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n } catch(err) {\r\n console.error('[worker] postMessage error:', err, args);\r\n }\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n getWindowClients().then((listeners) => {\r\n if(!listeners.length) {\r\n // console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach((listener) => {\r\n postMessage(listener, ...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const 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","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 pause from '../../helpers/schedulers/pause';\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\r\n\r\nfunction isCorrectResponse(response: Response) {\r\n return response.ok && response.status === 200;\r\n}\r\n\r\nfunction timeoutRace>(promise: T) {\r\n return Promise.race([\r\n promise,\r\n pause(10000).then(() => Promise.reject())\r\n ]);\r\n}\r\n\r\nexport async function requestCache(event: FetchEvent) {\r\n try {\r\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\r\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\r\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\r\n\r\n if(file && isCorrectResponse(file)) {\r\n return file;\r\n }\r\n\r\n const headers: HeadersInit = {'Vary': '*'};\r\n let response = await fetch(event.request, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n } else if(response.status === 304) { // possible fix for 304 in Safari\r\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\r\n response = await fetch(url, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n }\r\n }\r\n\r\n return response;\r\n } catch(err) {\r\n return fetch(event.request);\r\n }\r\n}\r\n","export default function 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\nimport noop from './noop';\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: (reason?: any) => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport default function deferredPromise() {\r\n const 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 const deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n\r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n\r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n\r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = noop;\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * 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 const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\nimport StreamWriter from './streamWriter';\r\n\r\nexport default class MemoryWriter implements StreamWriter {\r\n private bytes: Uint8Array;\r\n\r\n constructor(\r\n private mimeType: string,\r\n private size: number,\r\n private saveFileCallback?: (blob: Blob) => Promise\r\n ) {\r\n this.bytes = new Uint8Array(size);\r\n }\r\n\r\n public async write(part: Uint8Array, offset: number) {\r\n // sometimes file size can be bigger than the prov\r\n const endOffset = offset + part.byteLength;\r\n if(endOffset > this.bytes.byteLength) {\r\n const newBytes = new Uint8Array(endOffset);\r\n newBytes.set(this.bytes, 0);\r\n this.bytes = newBytes;\r\n }\r\n\r\n this.bytes.set(part, offset);\r\n };\r\n\r\n public truncate() {\r\n this.bytes = new Uint8Array();\r\n }\r\n\r\n public trim(size: number) {\r\n this.bytes = this.bytes.slice(0, size);\r\n }\r\n\r\n public finalize(saveToStorage = true) {\r\n const blob = blobConstruct(this.bytes, this.mimeType);\r\n\r\n if(saveToStorage && this.saveFileCallback) {\r\n this.saveFileCallback(blob);\r\n }\r\n\r\n return blob;\r\n }\r\n\r\n public getParts() {\r\n return this.bytes;\r\n }\r\n\r\n public replaceParts(parts: Uint8Array) {\r\n this.bytes = parts;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 MemoryWriter from './memoryWriter';\r\nimport FileManager from './memoryWriter';\r\nimport FileStorage from './fileStorage';\r\nimport makeError from '../../helpers/makeError';\r\nimport deferredPromise from '../../helpers/cancellablePromise';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController implements FileStorage {\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 makeError('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(makeError('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 prepareWriting(fileName: string, fileSize: number, mimeType: string) {\r\n return {\r\n deferred: deferredPromise(),\r\n getWriter: () => {\r\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return writer;\r\n }\r\n };\r\n }\r\n\r\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return Promise.all(this.STORAGES.map((storage) => {\r\n storage.useStorage = enabled;\r\n\r\n if(!clearWrite) {\r\n return;\r\n }\r\n\r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport {InputFileLocation} from '../../layer';\r\nimport CacheStorageController from '../files/cacheStorage';\r\nimport {DownloadOptions, MyUploadFile} from '../mtproto/apiFileManager';\r\nimport {getMtprotoMessagePort, log, serviceMessagePort} from './index.service';\r\nimport {ServiceRequestFilePartTaskPayload} from './serviceMessagePort';\r\nimport timeout from './timeout';\r\n\r\nconst deferredPromises: Map}> = new Map();\r\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\r\nconst CHUNK_TTL = 86400;\r\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\r\nconst USE_CACHE = true;\r\n\r\nconst clearOldChunks = () => {\r\n return cacheStorage.timeoutOperation((cache) => {\r\n return cache.keys().then((requests) => {\r\n const filtered: Map = new Map();\r\n const timestamp = Date.now() / 1000 | 0;\r\n for(const request of requests) {\r\n const match = request.url.match(/\\/(\\d+?)\\?/);\r\n if(match && !filtered.has(match[1])) {\r\n filtered.set(match[1], request);\r\n }\r\n }\r\n\r\n const promises: Promise[] = [];\r\n for(const [id, request] of filtered) {\r\n const promise = cache.match(request).then((response) => {\r\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\r\n log('will delete stream chunk:', id);\r\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\r\n }\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n return Promise.all(promises);\r\n });\r\n });\r\n};\r\n\r\nsetInterval(clearOldChunks, 1800e3);\r\nsetInterval(() => {\r\n const mtprotoMessagePort = getMtprotoMessagePort();\r\n for(const [messagePort, promises] of deferredPromises) {\r\n if(messagePort !== mtprotoMessagePort) {\r\n for(const taskId in promises) {\r\n const promise = promises[taskId];\r\n promise.reject();\r\n }\r\n\r\n deferredPromises.delete(messagePort);\r\n }\r\n }\r\n}, 120e3);\r\n\r\ntype StreamRange = [number, number];\r\ntype StreamId = DocId;\r\nconst streams: Map = new Map();\r\nclass Stream {\r\n private destroyDebounced: () => void;\r\n private id: StreamId;\r\n private limitPart: number;\r\n private loadedOffsets: Set = new Set();\r\n\r\n constructor(private info: DownloadOptions) {\r\n this.id = Stream.getId(info);\r\n streams.set(this.id, this);\r\n\r\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\r\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\r\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\r\n }\r\n\r\n private destroy = () => {\r\n streams.delete(this.id);\r\n };\r\n\r\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\r\n const payload: ServiceRequestFilePartTaskPayload = {\r\n docId: this.id,\r\n dcId: this.info.dcId,\r\n offset: alignedOffset,\r\n limit\r\n };\r\n\r\n const taskId = JSON.stringify(payload);\r\n\r\n const mtprotoMessagePort = getMtprotoMessagePort();\r\n let promises = deferredPromises.get(mtprotoMessagePort);\r\n if(!promises) {\r\n deferredPromises.set(mtprotoMessagePort, promises = {});\r\n }\r\n\r\n let deferred = promises[taskId];\r\n if(deferred) {\r\n return deferred.then((uploadFile) => uploadFile.bytes);\r\n }\r\n\r\n this.loadedOffsets.add(alignedOffset);\r\n\r\n deferred = promises[taskId] = deferredPromise();\r\n\r\n serviceMessagePort.invoke('requestFilePart', payload, undefined, mtprotoMessagePort)\r\n .then(deferred.resolve, deferred.reject).finally(() => {\r\n if(promises[taskId] === deferred) {\r\n delete promises[taskId];\r\n\r\n if(!Object.keys(promises).length) {\r\n deferredPromises.delete(mtprotoMessagePort);\r\n }\r\n }\r\n });\r\n\r\n const bytesPromise = deferred.then((uploadFile) => uploadFile.bytes);\r\n\r\n if(USE_CACHE) {\r\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\r\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\r\n }\r\n\r\n return bytesPromise;\r\n }\r\n\r\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n if(!USE_CACHE) {\r\n return Promise.resolve();\r\n }\r\n\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n return cacheStorage.getFile(key).then((blob: Blob) => {\r\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\r\n }, (error: ApiError) => {\r\n if(error.type === 'NO_ENTRY_FOUND') {\r\n return;\r\n }\r\n });\r\n }\r\n\r\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then((bytes) => {\r\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\r\n });\r\n }\r\n\r\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\r\n return deferred.then((bytes) => {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n const response = new Response(bytes, {\r\n headers: {\r\n 'Content-Length': '' + bytes.length,\r\n 'Content-Type': 'application/octet-stream',\r\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\r\n }\r\n });\r\n\r\n return cacheStorage.save(key, response);\r\n });\r\n }\r\n\r\n private preloadChunk(offset: number) {\r\n if(this.loadedOffsets.has(offset)) {\r\n return;\r\n }\r\n\r\n this.loadedOffsets.add(offset);\r\n this.requestFilePart(offset, this.limitPart, true);\r\n }\r\n\r\n private preloadChunks(offset: number, end: number) {\r\n if(end > this.info.size) {\r\n end = this.info.size;\r\n }\r\n\r\n if(!offset) { // load last chunk for bounds\r\n this.preloadChunk(alignOffset(offset, this.limitPart));\r\n } else { // don't preload next chunks before the start\r\n for(; offset < end; offset += this.limitPart) {\r\n this.preloadChunk(offset);\r\n }\r\n }\r\n }\r\n\r\n public requestRange(range: StreamRange) {\r\n this.destroyDebounced();\r\n\r\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\r\n if(possibleResponse) {\r\n return possibleResponse;\r\n }\r\n\r\n let [offset, end] = range;\r\n\r\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\r\n //end = info.size - 1;\r\n //offset = info.size - 1 - limitPart;\r\n offset = info.size - (info.size % limitPart);\r\n } */\r\n\r\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\r\n const alignedOffset = alignOffset(offset, limit);\r\n\r\n if(!end) {\r\n end = Math.min(offset + limit, this.info.size - 1);\r\n }\r\n\r\n return this.requestFilePart(alignedOffset, limit).then((ab) => {\r\n // log.debug('[stream] requestFilePart result:', result);\r\n\r\n // if(isSafari) {\r\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\r\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\r\n }\r\n\r\n const headers: Record = {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\r\n 'Content-Length': `${ab.byteLength}`\r\n };\r\n\r\n if(this.info.mimeType) {\r\n headers['Content-Type'] = this.info.mimeType;\r\n }\r\n\r\n // simulate slow connection\r\n // setTimeout(() => {\r\n return new Response(ab, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers\r\n });\r\n // }, 2.5e3);\r\n });\r\n }\r\n\r\n private getChunkKey(alignedOffset: number, limit: number) {\r\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\r\n }\r\n\r\n public static get(info: DownloadOptions) {\r\n return streams.get(this.getId(info)) ?? new Stream(info);\r\n }\r\n\r\n private static getId(info: DownloadOptions) {\r\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\r\n }\r\n}\r\n\r\nexport default function onStreamFetch(event: FetchEvent, params: string) {\r\n const range = parseRange(event.request.headers.get('Range'));\r\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\r\n const stream = Stream.get(info);\r\n\r\n // log.debug('[stream]', url, offset, end);\r\n\r\n event.respondWith(Promise.race([\r\n timeout(45 * 1000),\r\n stream.requestRange(range)\r\n ]));\r\n}\r\n\r\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\r\n if(range[0] === 0 && range[1] === 1) {\r\n return new Response(new Uint8Array(2).buffer, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers: {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes 0-1/${size || '*'}`,\r\n 'Content-Length': '2',\r\n 'Content-Type': mimeType || 'video/mp4'\r\n }\r\n });\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\r\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\r\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\r\n\r\nfunction parseRange(header: string): StreamRange {\r\n if(!header) return [0, 0];\r\n const [, chunks] = header.split('=');\r\n const ranges = chunks.split(', ');\r\n const [offset, end] = ranges[0].split('-');\r\n\r\n return [+offset, +end || 0];\r\n}\r\n\r\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\r\n return offset - (offset % base);\r\n}\r\n\r\nfunction alignLimit(limit: number) {\r\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport ctx from '../../environment/ctx';\r\nimport {AnyFunction, Awaited} from '../../types';\r\nimport noop from '../noop';\r\n\r\nexport type DebounceReturnType = {\r\n (...args: Parameters): Promise>>;\r\n clearTimeout(): void;\r\n isDebounced(): boolean;\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 debounce.isDebounced = () => !!waitingTimeout;\r\n\r\n return debounce;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Database} from '../../config/databases';\r\nimport Modes from '../../config/modes';\r\nimport makeError from '../../helpers/makeError';\r\nimport safeAssign from '../../helpers/object/safeAssign';\r\nimport {logger} from '../logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string,\r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n\r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n\r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n\r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n\r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n\r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n\r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n // return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n\r\n reader.onerror = reject;\r\n });\r\n\r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n\r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n // return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode,\r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\r\n log?: string,\r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n\r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n\r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Database} from '../../config/databases';\r\nimport DATABASE_STATE from '../../config/databases/state';\r\nimport {IS_FIREFOX} from '../../environment/userAgent';\r\nimport deepEqual from '../../helpers/object/deepEqual';\r\nimport IDBStorage from '../files/idb';\r\nimport {log, serviceMessagePort} from './index.service';\r\nimport {ServicePushPingTaskPayload} from './serviceMessagePort';\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\r\n\r\nexport type PushNotificationObject = {\r\n loc_key: string,\r\n loc_args: string[],\r\n // user_id: number, // should be number\r\n custom: {\r\n channel_id?: string, // should be number\r\n chat_id?: string, // should be number\r\n from_id?: string, // should be number\r\n msg_id: string,\r\n peerId?: string // should be number\r\n },\r\n sound?: string,\r\n random_id: number,\r\n badge?: string, // should be number\r\n description: string,\r\n mute: string, // should be number\r\n title: string,\r\n\r\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\r\n};\r\n\r\nclass SomethingGetter, Storage extends Record> {\r\n private cache: Partial = {};\r\n private storage: IDBStorage;\r\n\r\n constructor(\r\n db: T,\r\n storeName: typeof db['stores'][number]['name'],\r\n private defaults: {\r\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\r\n }\r\n ) {\r\n this.storage = new IDBStorage(db, storeName);\r\n }\r\n\r\n public async get(key: T) {\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n let value: Storage[T];\r\n try {\r\n value = await this.storage.get(key as string);\r\n } catch(err) {\r\n\r\n }\r\n\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n if(value === undefined) {\r\n const callback = this.defaults[key];\r\n value = typeof(callback) === 'function' ? callback() : callback;\r\n }\r\n\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async set(key: T, value: Storage[T]) {\r\n const cached = this.cache[key] ?? this.defaults[key];\r\n if(deepEqual(cached, value)) {\r\n return;\r\n }\r\n\r\n this.cache[key] = value;\r\n\r\n try {\r\n this.storage.save(key as string, value);\r\n } catch(err) {\r\n\r\n }\r\n }\r\n}\r\n\r\ntype PushStorage = {\r\n push_mute_until: number,\r\n push_lang: Partial\r\n push_settings: Partial\r\n};\r\n\r\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', {\r\n push_mute_until: 0,\r\n push_lang: {\r\n push_message_nopreview: 'You have a new message',\r\n push_action_mute1d: 'Mute for 24H',\r\n push_action_settings: 'Settings'\r\n },\r\n push_settings: {}\r\n});\r\n\r\nctx.addEventListener('push', (event) => {\r\n const obj: PushNotificationObject = event.data.json();\r\n log('push', obj);\r\n\r\n let hasActiveWindows = false;\r\n const checksPromise = Promise.all([\r\n getter.get('push_mute_until'),\r\n ctx.clients.matchAll({type: 'window'})\r\n ]).then((result) => {\r\n const [muteUntil, clientList] = result;\r\n\r\n log('matched clients', clientList);\r\n hasActiveWindows = clientList.length > 0;\r\n if(hasActiveWindows) {\r\n throw 'Supress notification because some instance is alive';\r\n }\r\n\r\n const nowTime = Date.now();\r\n if(userInvisibleIsSupported() &&\r\n muteUntil &&\r\n nowTime < muteUntil) {\r\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\r\n }\r\n\r\n if(!obj.badge) {\r\n throw 'No badge?';\r\n }\r\n });\r\n\r\n checksPromise.catch((reason) => {\r\n log(reason);\r\n });\r\n\r\n const notificationPromise = checksPromise.then(() => {\r\n return Promise.all([getter.get('push_settings'), getter.get('push_lang')])\r\n }).then((result) => {\r\n return fireNotification(obj, result[0], result[1]);\r\n });\r\n\r\n const closePromise = notificationPromise.catch(() => {\r\n log('Closing all notifications on push', hasActiveWindows);\r\n if(userInvisibleIsSupported() || hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n return ctx.registration.showNotification('Telegram', {\r\n tag: 'unknown_peer'\r\n }).then(() => {\r\n if(hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n setTimeout(() => closeAllNotifications(), hasActiveWindows ? 0 : 100);\r\n }).catch((error) => {\r\n log.error('Show notification error', error);\r\n });\r\n });\r\n\r\n event.waitUntil(closePromise);\r\n});\r\n\r\nctx.addEventListener('notificationclick', (event) => {\r\n const notification = event.notification;\r\n log('On notification click: ', notification.tag);\r\n notification.close();\r\n\r\n const action = event.action as PushNotificationObject['action'];\r\n if(action === 'mute1d' && userInvisibleIsSupported()) {\r\n log('[SW] mute for 1d');\r\n getter.set('push_mute_until', Date.now() + 86400e3);\r\n return;\r\n }\r\n\r\n const data: PushNotificationObject = notification.data;\r\n if(!data) {\r\n return;\r\n }\r\n\r\n const promise = ctx.clients.matchAll({\r\n type: 'window'\r\n }).then((clientList) => {\r\n data.action = action;\r\n pendingNotification = data;\r\n for(let i = 0; i < clientList.length; i++) {\r\n const client = clientList[i];\r\n if('focus' in client) {\r\n client.focus();\r\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, client);\r\n pendingNotification = undefined;\r\n return;\r\n }\r\n }\r\n\r\n if(ctx.clients.openWindow) {\r\n return getter.get('push_settings').then((settings) => {\r\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\r\n });\r\n }\r\n }).catch((error) => {\r\n log.error('Clients.matchAll error', error);\r\n })\r\n\r\n event.waitUntil(promise);\r\n});\r\n\r\nctx.addEventListener('notificationclose', onCloseNotification);\r\n\r\nconst notifications: Set = new Set();\r\nlet pendingNotification: PushNotificationObject;\r\nfunction pushToNotifications(notification: Notification) {\r\n if(!notifications.has(notification)) {\r\n notifications.add(notification);\r\n // @ts-ignore\r\n notification.onclose = onCloseNotification;\r\n }\r\n}\r\n\r\nfunction onCloseNotification(event: NotificationEvent) {\r\n removeFromNotifications(event.notification)\r\n}\r\n\r\nfunction removeFromNotifications(notification: Notification) {\r\n notifications.delete(notification);\r\n}\r\n\r\nexport function closeAllNotifications() {\r\n for(const notification of notifications) {\r\n try {\r\n notification.close();\r\n } catch(e) {}\r\n }\r\n\r\n let promise: Promise;\r\n if('getNotifications' in ctx.registration) {\r\n promise = ctx.registration.getNotifications({}).then((notifications) => {\r\n for(let i = 0, len = notifications.length; i < len; ++i) {\r\n try {\r\n notifications[i].close();\r\n } catch(e) {}\r\n }\r\n }).catch((error) => {\r\n log.error('Offline register SW error', error);\r\n });\r\n } else {\r\n promise = Promise.resolve();\r\n }\r\n\r\n notifications.clear();\r\n\r\n return promise;\r\n}\r\n\r\nfunction userInvisibleIsSupported() {\r\n return IS_FIREFOX;\r\n}\r\n\r\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\r\n const icon = 'assets/img/logo_filled_rounded.png';\r\n let title = obj.title || 'Telegram';\r\n let body = obj.description || '';\r\n let peerId: string;\r\n\r\n if(obj.custom) {\r\n if(obj.custom.channel_id) {\r\n peerId = '' + -obj.custom.channel_id;\r\n } else if(obj.custom.chat_id) {\r\n peerId = '' + -obj.custom.chat_id;\r\n } else {\r\n peerId = obj.custom.from_id || '';\r\n }\r\n }\r\n\r\n obj.custom.peerId = '' + peerId;\r\n let tag = 'peer' + peerId;\r\n\r\n if(settings && settings.nopreview) {\r\n title = 'Telegram';\r\n body = lang.push_message_nopreview;\r\n tag = 'unknown_peer';\r\n }\r\n\r\n log('show notify', title, body, icon, obj);\r\n\r\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\r\n action: 'mute1d',\r\n title: lang.push_action_mute1d\r\n }/* , {\r\n action: 'push_settings',\r\n title: lang.push_action_settings || 'Settings'\r\n } */];\r\n\r\n const notificationPromise = ctx.registration.showNotification(title, {\r\n body,\r\n icon,\r\n tag,\r\n data: obj,\r\n actions\r\n });\r\n\r\n return notificationPromise.then((event) => {\r\n // @ts-ignore\r\n if(event?.notification) {\r\n // @ts-ignore\r\n pushToNotifications(event.notification);\r\n }\r\n }).catch((error) => {\r\n log.error('Show notification promise', error);\r\n });\r\n}\r\n\r\nexport function onPing(payload: ServicePushPingTaskPayload, source?: MessageEventSource) {\r\n if(pendingNotification && source) {\r\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, source);\r\n pendingNotification = undefined;\r\n }\r\n\r\n if(payload.lang) {\r\n getter.set('push_lang', payload.lang);\r\n }\r\n\r\n if(payload.settings) {\r\n getter.set('push_settings', payload.settings);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Database} from '.';\r\nimport type {IDBIndex} from '../../lib/files/idb';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n // indexes: [\r\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\r\n // const name = `index_${idx}`;\r\n // const index: IDBIndex = {\r\n // indexName: name,\r\n // keyPath: name,\r\n // objectParameters: {}\r\n // };\r\n\r\n // return index\r\n // })\r\n // ]\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\n }\n}\n","/*\n * 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 {ServiceDownloadTaskPayload} from './serviceMessagePort';\nimport type ServiceMessagePort from './serviceMessagePort';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport pause from '../../helpers/schedulers/pause';\n\ntype DownloadType = Uint8Array;\ntype DownloadItem = ServiceDownloadTaskPayload & {\n // transformStream: TransformStream,\n readableStream: ReadableStream,\n // writableStream: WritableStream,\n // writer: WritableStreamDefaultWriter,\n // controller: TransformStreamDefaultController,\n controller: ReadableStreamController,\n promise: CancellablePromise,\n // downloadPromise: Promise,\n used?: boolean\n};\nconst downloadMap: Map = new Map();\nconst DOWNLOAD_ERROR = makeError('UNKNOWN');\nconst DOWNLOAD_TEST = false;\n\n(self as any).downloadMap = downloadMap;\n\ntype A = Parameters['addMultipleEventsListeners']>[0];\n\nconst events: A = {\n download: (payload) => {\n const {id} = payload;\n if(downloadMap.has(id)) {\n return Promise.reject(DOWNLOAD_ERROR);\n }\n\n // const y = (20 * 1024 * 1024) / payload.limitPart;\n // const strategy = new ByteLengthQueuingStrategy({highWaterMark: y});\n // let controller: TransformStreamDefaultController;\n const strategy = new CountQueuingStrategy({highWaterMark: 1});\n // const transformStream = new TransformStream(/* {\n // start: (_controller) => controller = _controller,\n // }, */undefined, strategy, strategy);\n\n // const {readable, writable} = transformStream;\n // const writer = writable.getWriter();\n\n const promise = deferredPromise();\n promise.then(() => {\n setTimeout(() => {\n downloadMap.delete(id);\n }, 5e3);\n }, () => {\n downloadMap.delete(id);\n });\n\n // writer.closed.then(promise.resolve, promise.reject);\n\n let controller: ReadableStreamController;\n const readable = new ReadableStream({\n start: (_controller) => {\n controller = _controller;\n },\n\n cancel: (reason) => {\n promise.reject(DOWNLOAD_ERROR);\n }\n }, strategy);\n\n // writer.closed.catch(noop).finally(() => {\n // log.error('closed writer');\n // onEnd();\n // });\n\n // const downloadPromise = writer.closed.catch(() => {throw DOWNLOAD_ERROR;});\n const item: DownloadItem = {\n ...payload,\n // transformStream,\n readableStream: readable,\n // writableStream: writable,\n // writer,\n // downloadPromise,\n promise,\n controller\n };\n\n downloadMap.set(id, item);\n\n // return downloadPromise;\n return promise.catch(() => {throw DOWNLOAD_ERROR});\n },\n\n downloadChunk: ({id, chunk}) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n // return item.controller.enqueue(chunk);\n // return item.writer.write(chunk);\n return item.controller.enqueue(chunk);\n },\n\n downloadFinalize: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n item.promise.resolve();\n // return item.controller.terminate();\n // return item.writer.close();\n return item.controller.close();\n },\n\n downloadCancel: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return;\n }\n\n item.promise.reject();\n // return item.controller.error();\n // return item.writer.abort();\n return item.controller.error();\n }\n};\n\nexport default function handleDownload(serviceMessagePort: ServiceMessagePort) {\n serviceMessagePort.addMultipleEventsListeners(events);\n\n return {\n onDownloadFetch,\n onClosedWindows: cancelAllDownloads\n };\n}\n\nfunction onDownloadFetch(event: FetchEvent, params: string) {\n const promise = pause(100).then(() => {\n const item = downloadMap.get(params);\n if(!item || (item.used && !DOWNLOAD_TEST)) {\n return;\n }\n\n item.used = true;\n const stream = item.readableStream;\n const response = new Response(stream, {headers: item.headers});\n return response;\n });\n\n event.respondWith(promise);\n}\n\nfunction cancelAllDownloads() {\n if(downloadMap.size) {\n for(const [id, item] of downloadMap) {\n // item.writer.abort().catch(noop);\n item.controller.error();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n \n \n \n\nimport {logger, LogTypes} from '../logger';\nimport {CACHE_ASSETS_NAME, requestCache} from './cache';\nimport onStreamFetch from './stream';\nimport {closeAllNotifications, onPing} from './push';\nimport CacheStorageController from '../files/cacheStorage';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport ServiceMessagePort from './serviceMessagePort';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {getWindowClients} from '../../helpers/context';\nimport {MessageSendPort} from '../mtproto/superMessagePort';\nimport handleDownload from './download';\n\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn, true);\nconst ctx = self as any as ServiceWorkerGlobalScope;\n\n \nlet _mtprotoMessagePort: MessagePort;\nexport const getMtprotoMessagePort = () => _mtprotoMessagePort;\n\nconst sendMessagePort = (source: MessageSendPort) => {\n const channel = new MessageChannel();\n serviceMessagePort.attachPort(_mtprotoMessagePort = channel.port1);\n serviceMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n};\n\nconst sendMessagePortIfNeeded = (source: MessageSendPort) => {\n if(!connectedWindows.size && !_mtprotoMessagePort) {\n log('sending message port for mtproto');\n sendMessagePort(source);\n }\n};\n\nconst onWindowConnected = (source: WindowClient) => {\n log('window connected', source.id, 'windows before', connectedWindows.size);\n\n if(source.frameType === 'none') {\n log.warn('maybe a bugged Safari starting window', source.id);\n return;\n }\n\n log('windows', Array.from(connectedWindows));\n serviceMessagePort.invokeVoid('hello', undefined, source);\n sendMessagePortIfNeeded(source);\n connectedWindows.set(source.id, source);\n};\n\nexport const serviceMessagePort = new ServiceMessagePort();\nserviceMessagePort.addMultipleEventsListeners({\n notificationsClear: closeAllNotifications,\n\n toggleStorages: ({enabled, clearWrite}) => {\n CacheStorageController.toggleStorage(enabled, clearWrite);\n },\n\n pushPing: (payload, source) => {\n onPing(payload, source);\n },\n\n hello: (payload, source) => {\n onWindowConnected(source as any as WindowClient);\n }\n});\n\nconst {\n onDownloadFetch,\n onClosedWindows: onDownloadClosedWindows\n} = handleDownload(serviceMessagePort);\n\n// * service worker can be killed, so won't get 'hello' event\ngetWindowClients().then((windowClients) => {\n log(`got ${windowClients.length} windows from the start`);\n windowClients.forEach((windowClient) => {\n onWindowConnected(windowClient);\n });\n});\n\nconst connectedWindows: Map = new Map();\n(self as any).connectedWindows = connectedWindows;\nlistenMessagePort(serviceMessagePort, undefined, (source) => {\n log('something has disconnected', source);\n const isWindowClient = source instanceof WindowClient;\n if(!isWindowClient || !connectedWindows.has(source.id)) {\n log.warn('it is not a window');\n return;\n }\n\n connectedWindows.delete(source.id);\n log('window disconnected, left', connectedWindows.size);\n if(!connectedWindows.size) {\n log.warn('no windows left');\n\n if(_mtprotoMessagePort) {\n serviceMessagePort.detachPort(_mtprotoMessagePort);\n _mtprotoMessagePort = undefined;\n }\n\n onDownloadClosedWindows();\n }\n});\n \n\nconst onFetch = (event: FetchEvent): void => {\n \n if(\n !IS_SAFARI &&\n event.request.url.indexOf(location.origin + '/') === 0 &&\n event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)\n ) {\n return event.respondWith(requestCache(event));\n }\n \n\n try {\n // const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\n const [scope, params] = event.request.url.split('/').slice(-2);\n\n // log.debug('[fetch]:', event);\n\n switch(scope) {\n case 'stream': {\n onStreamFetch(event, params);\n break;\n }\n\n case 'download': {\n onDownloadFetch(event, params);\n break;\n }\n\n case 'ping': {\n event.respondWith(new Response('pong'));\n break;\n }\n }\n } catch(err) {\n log.error('fetch error', err);\n event.respondWith(new Response('', {\n status: 500,\n statusText: 'Internal Server Error',\n headers: {'Cache-Control': 'no-cache'}\n }));\n }\n};\n\nconst onChangeState = () => {\n ctx.onfetch = onFetch;\n};\n\nctx.addEventListener('install', (event) => {\n log('installing');\n event.waitUntil(ctx.skipWaiting().then(() => log('skipped waiting'))); // Activate worker immediately\n});\n\nctx.addEventListener('activate', (event) => {\n log('activating', ctx);\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME).then(() => log('cleared assets cache')));\n event.waitUntil(ctx.clients.claim().then(() => log('claimed clients')));\n});\n\n// ctx.onerror = (error) => {\n// log.error('error:', error);\n// };\n\n// ctx.onunhandledrejection = (error) => {\n// log.error('onunhandledrejection:', error);\n// };\n\nctx.onoffline = ctx.ononline = onChangeState;\n\nonChangeState();\n","/*\r\n * https://github.com/morethanwords/tweb\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 SuperMessagePort from '../lib/mtproto/superMessagePort';\r\nimport ctx from '../environment/ctx';\r\n\r\nexport default function listenMessagePort(\r\n messagePort: SuperMessagePort,\r\n onConnect?: (source: MessageEventSource) => void,\r\n onDisconnect?: (source: MessageEventSource) => void\r\n) {\r\n const attachPort = (listenPort: any, sendPort: any) => {\r\n messagePort.attachListenPort(listenPort);\r\n sendPort && messagePort.attachSendPort(sendPort);\r\n onConnect?.(listenPort);\r\n };\r\n\r\n messagePort.setOnPortDisconnect(onDisconnect);\r\n\r\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\r\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\r\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\r\n attachPort(ctx, null);\r\n } else {\r\n attachPort(ctx, ctx);\r\n }\r\n}\r\n","export default function timeout(delay: number): Promise {\r\n return new Promise(((resolve) => {\r\n setTimeout(() => {\r\n resolve(new Response('', {\r\n status: 408,\r\n statusText: 'Request timed out.'\r\n }));\r\n }, delay);\r\n }));\r\n}\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [437], () => (__webpack_require__(1901)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + \"77e92ccb32c21ff43a10\" + \".bundle.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t670: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","oldGetScript","oldLoadScript","queryMap","countMap","next","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","getWindowClients","clients","matchAll","includeUncontrolled","type","postMessage","listener","args","err","console","error","notifyServiceWorker","all","then","listeners","length","slice","forEach","bind","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","pause","ms","Promise","resolve","setTimeout","ctx","CACHE_ASSETS_NAME","isCorrectResponse","response","ok","status","timeoutRace","promise","race","reject","noop","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","callback","addNotifyListener","push","value","catch","finally","cancel","Object","assign","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","blobSafeMimeType","Blob","MemoryWriter","constructor","size","saveFileCallback","this","bytes","Uint8Array","write","part","offset","endOffset","byteLength","newBytes","set","truncate","trim","finalize","saveToStorage","blob","getParts","replaceParts","parts","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","save","put","getFile","fileName","makeError","saveFile","Response","headers","rejected","timeout","undefined","res","clearTimeout","prepareWriting","fileSize","getWriter","static","enabled","clearWrite","map","storage","deferredPromises","Map","cacheStorage","CHUNK_CACHED_TIME_HEADER","setInterval","keys","requests","filtered","timestamp","Date","now","request","url","has","promises","id","ignoreSearch","ignoreVary","mtprotoMessagePort","getMtprotoMessagePort","messagePort","taskId","streams","Stream","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","_resolve","_reject","apply","debounce","_waitingTimeout","isDebounced","requestFilePartFromWorker","alignedOffset","limit","fromPreload","payload","docId","dcId","JSON","stringify","uploadFile","add","serviceMessagePort","bytesPromise","saveChunkToCache","preloadChunks","requestFilePartFromCache","key","getChunkKey","reader","FileReader","addEventListener","e","target","result","readBlobAs","readBlobAsArrayBuffer","buffer","readBlobAsUint8Array","requestFilePart","preloadChunk","end","alignOffset","requestRange","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","location","base","deepEqual","x","y","tx","every","IDB","db","object","fromObject","i","safeAssign","name","storageIsAvailable","join","INSTANCES","isAvailable","createNew","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","indexedDB","version","message","finished","onerror","onsuccess","event","calledNew","onclose","onabort","transaction","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","find","instance","preserve","IDBStorage","storeName","idb","create","concat","getObjectStore","clear","idx","mode","perf","performance","onError","onComplete","results","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","defaultBaseUrl","protocol","hostname","pathname","split","getter","defaults","push_mute_until","push_lang","push_message_nopreview","push_action_mute1d","push_action_settings","push_settings","obj","data","json","hasActiveWindows","checksPromise","muteUntil","clientList","nowTime","userInvisibleIsSupported","badge","reason","notificationPromise","settings","lang","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","actions","action","registration","showNotification","notification","notifications","onCloseNotification","fireNotification","closePromise","closeAllNotifications","waitUntil","pendingNotification","client","focus","invokeVoid","openWindow","baseUrl","getNotifications","len","ServiceMessagePort","super","downloadMap","DOWNLOAD_ERROR","events","download","strategy","CountQueuingStrategy","highWaterMark","controller","readable","ReadableStream","start","_controller","item","readableStream","downloadChunk","chunk","enqueue","downloadFinalize","downloadCancel","onDownloadFetch","params","used","stream","respondWith","cancelAllDownloads","_mtprotoMessagePort","onWindowConnected","source","connectedWindows","frameType","channel","MessageChannel","attachPort","port1","port2","sendMessagePort","sendMessagePortIfNeeded","addMultipleEventsListeners","notificationsClear","toggleStorages","toggleStorage","pushPing","onPing","hello","onClosedWindows","onDownloadClosedWindows","handleDownload","windowClients","windowClient","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","WindowClient","detachPort","listenMessagePort","onFetch","origin","file","fetch","clone","replace","random","requestCache","scope","header","chunks","ranges","parseRange","parse","decodeURIComponent","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onoffline","ononline","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","splice","d","definition","o","defineProperty","enumerable","f","chunkId","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","call","scriptUrl","importScripts","document","currentScript","src","scripts","getElementsByTagName","p","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime","pop"],"sourceRoot":""} \ No newline at end of file diff --git a/public/version b/public/version index 5edabee4..fd06f139 100644 --- a/public/version +++ b/public/version @@ -1 +1 @@ -1.6.2 (272) \ No newline at end of file +1.7.0 (273) \ No newline at end of file